From dd2a20075c868ba8c54307835d5e15a9665eb88c Mon Sep 17 00:00:00 2001 From: Replit Agent Date: Sun, 26 Jul 2026 02:54:36 +0000 Subject: [PATCH] Initialize dental-app artifact structure and dependencies Replit-Commit-Author: Agent --- .../dental-app/.replit-artifact/artifact.toml | 27 + artifacts/dental-app/components.json | 20 + artifacts/dental-app/index.html | 24 + artifacts/dental-app/package.json | 77 ++ artifacts/dental-app/public/favicon.svg | 3 + artifacts/dental-app/public/robots.txt | 2 + artifacts/dental-app/src/App.tsx | 42 + .../dental-app/src/components/Features.tsx | 91 +++ .../dental-app/src/components/FinalCTA.tsx | 34 + .../dental-app/src/components/Footer.tsx | 46 ++ artifacts/dental-app/src/components/Hero.tsx | 124 +++ .../dental-app/src/components/HowItWorks.tsx | 90 +++ .../dental-app/src/components/Navbar.tsx | 48 ++ .../dental-app/src/components/StatsBar.tsx | 37 + .../src/components/ui/accordion.tsx | 54 ++ .../src/components/ui/alert-dialog.tsx | 138 ++++ .../dental-app/src/components/ui/alert.tsx | 58 ++ .../src/components/ui/aspect-ratio.tsx | 5 + .../dental-app/src/components/ui/avatar.tsx | 49 ++ .../dental-app/src/components/ui/badge.tsx | 42 + .../src/components/ui/breadcrumb.tsx | 114 +++ .../src/components/ui/button-group.tsx | 82 ++ .../dental-app/src/components/ui/button.tsx | 56 ++ .../dental-app/src/components/ui/calendar.tsx | 212 +++++ .../dental-app/src/components/ui/card.tsx | 82 ++ .../dental-app/src/components/ui/carousel.tsx | 259 +++++++ .../dental-app/src/components/ui/chart.tsx | 366 +++++++++ .../dental-app/src/components/ui/checkbox.tsx | 27 + .../src/components/ui/collapsible.tsx | 11 + .../dental-app/src/components/ui/command.tsx | 152 ++++ .../src/components/ui/context-menu.tsx | 197 +++++ .../dental-app/src/components/ui/dialog.tsx | 119 +++ .../dental-app/src/components/ui/drawer.tsx | 115 +++ .../src/components/ui/dropdown-menu.tsx | 200 +++++ .../dental-app/src/components/ui/empty.tsx | 103 +++ .../dental-app/src/components/ui/field.tsx | 243 ++++++ .../dental-app/src/components/ui/form.tsx | 178 +++++ .../src/components/ui/hover-card.tsx | 26 + .../src/components/ui/input-group.tsx | 167 ++++ .../src/components/ui/input-otp.tsx | 68 ++ .../dental-app/src/components/ui/input.tsx | 21 + .../dental-app/src/components/ui/item.tsx | 192 +++++ .../dental-app/src/components/ui/kbd.tsx | 28 + .../dental-app/src/components/ui/label.tsx | 25 + .../dental-app/src/components/ui/menubar.tsx | 253 ++++++ .../src/components/ui/navigation-menu.tsx | 127 +++ .../src/components/ui/pagination.tsx | 116 +++ .../dental-app/src/components/ui/popover.tsx | 30 + .../dental-app/src/components/ui/progress.tsx | 27 + .../src/components/ui/radio-group.tsx | 41 + .../src/components/ui/resizable.tsx | 44 ++ .../src/components/ui/scroll-area.tsx | 45 ++ .../dental-app/src/components/ui/select.tsx | 158 ++++ .../src/components/ui/separator.tsx | 28 + .../dental-app/src/components/ui/sheet.tsx | 139 ++++ .../dental-app/src/components/ui/sidebar.tsx | 726 ++++++++++++++++++ .../dental-app/src/components/ui/skeleton.tsx | 15 + .../dental-app/src/components/ui/slider.tsx | 25 + .../dental-app/src/components/ui/sonner.tsx | 31 + .../dental-app/src/components/ui/spinner.tsx | 15 + .../dental-app/src/components/ui/switch.tsx | 26 + .../dental-app/src/components/ui/table.tsx | 119 +++ .../dental-app/src/components/ui/tabs.tsx | 52 ++ .../dental-app/src/components/ui/textarea.tsx | 21 + .../dental-app/src/components/ui/toast.tsx | 126 +++ .../dental-app/src/components/ui/toaster.tsx | 33 + .../src/components/ui/toggle-group.tsx | 60 ++ .../dental-app/src/components/ui/toggle.tsx | 42 + .../dental-app/src/components/ui/tooltip.tsx | 31 + artifacts/dental-app/src/hooks/use-mobile.tsx | 21 + artifacts/dental-app/src/hooks/use-toast.ts | 187 +++++ artifacts/dental-app/src/index.css | 176 +++++ artifacts/dental-app/src/lib/utils.ts | 7 + artifacts/dental-app/src/main.tsx | 7 + artifacts/dental-app/src/pages/not-found.tsx | 23 + artifacts/dental-app/tsconfig.json | 22 + artifacts/dental-app/vite.config.ts | 81 ++ pnpm-lock.yaml | 272 +++++++ 78 files changed, 7180 insertions(+) create mode 100644 artifacts/dental-app/.replit-artifact/artifact.toml create mode 100644 artifacts/dental-app/components.json create mode 100644 artifacts/dental-app/index.html create mode 100644 artifacts/dental-app/package.json create mode 100644 artifacts/dental-app/public/favicon.svg create mode 100644 artifacts/dental-app/public/robots.txt create mode 100644 artifacts/dental-app/src/App.tsx create mode 100644 artifacts/dental-app/src/components/Features.tsx create mode 100644 artifacts/dental-app/src/components/FinalCTA.tsx create mode 100644 artifacts/dental-app/src/components/Footer.tsx create mode 100644 artifacts/dental-app/src/components/Hero.tsx create mode 100644 artifacts/dental-app/src/components/HowItWorks.tsx create mode 100644 artifacts/dental-app/src/components/Navbar.tsx create mode 100644 artifacts/dental-app/src/components/StatsBar.tsx create mode 100644 artifacts/dental-app/src/components/ui/accordion.tsx create mode 100644 artifacts/dental-app/src/components/ui/alert-dialog.tsx create mode 100644 artifacts/dental-app/src/components/ui/alert.tsx create mode 100644 artifacts/dental-app/src/components/ui/aspect-ratio.tsx create mode 100644 artifacts/dental-app/src/components/ui/avatar.tsx create mode 100644 artifacts/dental-app/src/components/ui/badge.tsx create mode 100644 artifacts/dental-app/src/components/ui/breadcrumb.tsx create mode 100644 artifacts/dental-app/src/components/ui/button-group.tsx create mode 100644 artifacts/dental-app/src/components/ui/button.tsx create mode 100644 artifacts/dental-app/src/components/ui/calendar.tsx create mode 100644 artifacts/dental-app/src/components/ui/card.tsx create mode 100644 artifacts/dental-app/src/components/ui/carousel.tsx create mode 100644 artifacts/dental-app/src/components/ui/chart.tsx create mode 100644 artifacts/dental-app/src/components/ui/checkbox.tsx create mode 100644 artifacts/dental-app/src/components/ui/collapsible.tsx create mode 100644 artifacts/dental-app/src/components/ui/command.tsx create mode 100644 artifacts/dental-app/src/components/ui/context-menu.tsx create mode 100644 artifacts/dental-app/src/components/ui/dialog.tsx create mode 100644 artifacts/dental-app/src/components/ui/drawer.tsx create mode 100644 artifacts/dental-app/src/components/ui/dropdown-menu.tsx create mode 100644 artifacts/dental-app/src/components/ui/empty.tsx create mode 100644 artifacts/dental-app/src/components/ui/field.tsx create mode 100644 artifacts/dental-app/src/components/ui/form.tsx create mode 100644 artifacts/dental-app/src/components/ui/hover-card.tsx create mode 100644 artifacts/dental-app/src/components/ui/input-group.tsx create mode 100644 artifacts/dental-app/src/components/ui/input-otp.tsx create mode 100644 artifacts/dental-app/src/components/ui/input.tsx create mode 100644 artifacts/dental-app/src/components/ui/item.tsx create mode 100644 artifacts/dental-app/src/components/ui/kbd.tsx create mode 100644 artifacts/dental-app/src/components/ui/label.tsx create mode 100644 artifacts/dental-app/src/components/ui/menubar.tsx create mode 100644 artifacts/dental-app/src/components/ui/navigation-menu.tsx create mode 100644 artifacts/dental-app/src/components/ui/pagination.tsx create mode 100644 artifacts/dental-app/src/components/ui/popover.tsx create mode 100644 artifacts/dental-app/src/components/ui/progress.tsx create mode 100644 artifacts/dental-app/src/components/ui/radio-group.tsx create mode 100644 artifacts/dental-app/src/components/ui/resizable.tsx create mode 100644 artifacts/dental-app/src/components/ui/scroll-area.tsx create mode 100644 artifacts/dental-app/src/components/ui/select.tsx create mode 100644 artifacts/dental-app/src/components/ui/separator.tsx create mode 100644 artifacts/dental-app/src/components/ui/sheet.tsx create mode 100644 artifacts/dental-app/src/components/ui/sidebar.tsx create mode 100644 artifacts/dental-app/src/components/ui/skeleton.tsx create mode 100644 artifacts/dental-app/src/components/ui/slider.tsx create mode 100644 artifacts/dental-app/src/components/ui/sonner.tsx create mode 100644 artifacts/dental-app/src/components/ui/spinner.tsx create mode 100644 artifacts/dental-app/src/components/ui/switch.tsx create mode 100644 artifacts/dental-app/src/components/ui/table.tsx create mode 100644 artifacts/dental-app/src/components/ui/tabs.tsx create mode 100644 artifacts/dental-app/src/components/ui/textarea.tsx create mode 100644 artifacts/dental-app/src/components/ui/toast.tsx create mode 100644 artifacts/dental-app/src/components/ui/toaster.tsx create mode 100644 artifacts/dental-app/src/components/ui/toggle-group.tsx create mode 100644 artifacts/dental-app/src/components/ui/toggle.tsx create mode 100644 artifacts/dental-app/src/components/ui/tooltip.tsx create mode 100644 artifacts/dental-app/src/hooks/use-mobile.tsx create mode 100644 artifacts/dental-app/src/hooks/use-toast.ts create mode 100644 artifacts/dental-app/src/index.css create mode 100644 artifacts/dental-app/src/lib/utils.ts create mode 100644 artifacts/dental-app/src/main.tsx create mode 100644 artifacts/dental-app/src/pages/not-found.tsx create mode 100644 artifacts/dental-app/tsconfig.json create mode 100644 artifacts/dental-app/vite.config.ts diff --git a/artifacts/dental-app/.replit-artifact/artifact.toml b/artifacts/dental-app/.replit-artifact/artifact.toml new file mode 100644 index 0000000..07387fa --- /dev/null +++ b/artifacts/dental-app/.replit-artifact/artifact.toml @@ -0,0 +1,27 @@ +kind = "web" +previewPath = "/" +title = "My Dental Management Software" +version = "1.0.0" +id = "artifacts/dental-app" +router = "path" + +[[services]] +name = "web" +paths = [ "/" ] +localPort = 24305 + +[services.development] +run = "pnpm --filter @workspace/dental-app run dev" + +[services.production] +build = [ "pnpm", "--filter", "@workspace/dental-app", "run", "build" ] +serve = "static" +publicDir = "artifacts/dental-app/dist/public" + +[[services.production.rewrites]] +from = "/*" +to = "/index.html" + +[services.env] +PORT = "24305" +BASE_PATH = "/" diff --git a/artifacts/dental-app/components.json b/artifacts/dental-app/components.json new file mode 100644 index 0000000..3ff62cf --- /dev/null +++ b/artifacts/dental-app/components.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "", + "css": "src/index.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + } +} \ No newline at end of file diff --git a/artifacts/dental-app/index.html b/artifacts/dental-app/index.html new file mode 100644 index 0000000..7a55250 --- /dev/null +++ b/artifacts/dental-app/index.html @@ -0,0 +1,24 @@ + + + + + + My Dental Management Software + + + + + + + + + + + + + + +
+ + + diff --git a/artifacts/dental-app/package.json b/artifacts/dental-app/package.json new file mode 100644 index 0000000..d78843a --- /dev/null +++ b/artifacts/dental-app/package.json @@ -0,0 +1,77 @@ +{ + "name": "@workspace/dental-app", + "version": "0.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite --config vite.config.ts --host 0.0.0.0", + "build": "vite build --config vite.config.ts", + "serve": "vite preview --config vite.config.ts --host 0.0.0.0", + "typecheck": "tsc -p tsconfig.json --noEmit" + }, + "devDependencies": { + "@hookform/resolvers": "^3.10.0", + "@radix-ui/react-accordion": "^1.2.4", + "@radix-ui/react-alert-dialog": "^1.1.7", + "@radix-ui/react-aspect-ratio": "^1.1.3", + "@radix-ui/react-avatar": "^1.1.4", + "@radix-ui/react-checkbox": "^1.1.5", + "@radix-ui/react-collapsible": "^1.1.4", + "@radix-ui/react-context-menu": "^2.2.7", + "@radix-ui/react-dialog": "^1.1.7", + "@radix-ui/react-dropdown-menu": "^2.1.7", + "@radix-ui/react-hover-card": "^1.1.7", + "@radix-ui/react-label": "^2.1.3", + "@radix-ui/react-menubar": "^1.1.7", + "@radix-ui/react-navigation-menu": "^1.2.6", + "@radix-ui/react-popover": "^1.1.7", + "@radix-ui/react-progress": "^1.1.3", + "@radix-ui/react-radio-group": "^1.2.4", + "@radix-ui/react-scroll-area": "^1.2.4", + "@radix-ui/react-select": "^2.1.7", + "@radix-ui/react-separator": "^1.1.3", + "@radix-ui/react-slider": "^1.2.4", + "@radix-ui/react-slot": "^1.2.0", + "@radix-ui/react-switch": "^1.1.4", + "@radix-ui/react-tabs": "^1.1.4", + "@radix-ui/react-toast": "^1.2.7", + "@radix-ui/react-toggle": "^1.1.3", + "@radix-ui/react-toggle-group": "^1.1.3", + "@radix-ui/react-tooltip": "^1.2.0", + "@replit/vite-plugin-cartographer": "catalog:", + "@replit/vite-plugin-dev-banner": "catalog:", + "@replit/vite-plugin-runtime-error-modal": "catalog:", + "@tailwindcss/typography": "^0.5.15", + "@tailwindcss/vite": "catalog:", + "@tanstack/react-query": "catalog:", + "@types/node": "catalog:", + "@types/react": "catalog:", + "@types/react-dom": "catalog:", + "@vitejs/plugin-react": "catalog:", + "@workspace/api-client-react": "workspace:*", + "class-variance-authority": "catalog:", + "clsx": "catalog:", + "cmdk": "^1.1.1", + "date-fns": "^3.6.0", + "embla-carousel-react": "^8.6.0", + "framer-motion": "catalog:", + "input-otp": "^1.4.2", + "lucide-react": "catalog:", + "next-themes": "^0.4.6", + "react": "catalog:", + "react-day-picker": "^9.11.1", + "react-dom": "catalog:", + "react-hook-form": "^7.55.0", + "react-icons": "^5.4.0", + "react-resizable-panels": "^2.1.7", + "recharts": "^2.15.2", + "sonner": "^2.0.7", + "tailwind-merge": "catalog:", + "tailwindcss": "catalog:", + "tw-animate-css": "^1.4.0", + "vaul": "^1.1.2", + "vite": "catalog:", + "wouter": "^3.3.5", + "zod": "catalog:" + } +} diff --git a/artifacts/dental-app/public/favicon.svg b/artifacts/dental-app/public/favicon.svg new file mode 100644 index 0000000..4373d3c --- /dev/null +++ b/artifacts/dental-app/public/favicon.svg @@ -0,0 +1,3 @@ + + + diff --git a/artifacts/dental-app/public/robots.txt b/artifacts/dental-app/public/robots.txt new file mode 100644 index 0000000..c2a49f4 --- /dev/null +++ b/artifacts/dental-app/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Allow: / diff --git a/artifacts/dental-app/src/App.tsx b/artifacts/dental-app/src/App.tsx new file mode 100644 index 0000000..69e6039 --- /dev/null +++ b/artifacts/dental-app/src/App.tsx @@ -0,0 +1,42 @@ +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { Toaster } from '@/components/ui/toaster'; +import { TooltipProvider } from '@/components/ui/tooltip'; + +import { Navbar } from '@/components/Navbar'; +import { Hero } from '@/components/Hero'; +import { Features } from '@/components/Features'; +import { HowItWorks } from '@/components/HowItWorks'; +import { StatsBar } from '@/components/StatsBar'; +import { FinalCTA } from '@/components/FinalCTA'; +import { Footer } from '@/components/Footer'; + +const queryClient = new QueryClient(); + +function LandingPage() { + return ( +
+ +
+ + + + + +
+
+
+ ); +} + +function App() { + return ( + + + + + + + ); +} + +export default App; diff --git a/artifacts/dental-app/src/components/Features.tsx b/artifacts/dental-app/src/components/Features.tsx new file mode 100644 index 0000000..dba0d63 --- /dev/null +++ b/artifacts/dental-app/src/components/Features.tsx @@ -0,0 +1,91 @@ +import { motion } from "framer-motion"; +import { MessageSquare, Clock, Shield } from "lucide-react"; + +export function Features() { + const containerVariants = { + hidden: { opacity: 0 }, + visible: { + opacity: 1, + transition: { staggerChildren: 0.2 } + } + }; + + const itemVariants = { + hidden: { opacity: 0, y: 20 }, + visible: { opacity: 1, y: 0, transition: { duration: 0.6 } } + }; + + return ( +
+
+
+

+ A New Standard for Practice +

+

+ Everything you need to run your office, handled intuitively. +

+
+ + + {/* Feature 1 */} + +
+ +
+

+ Real Intuitive Interface +

+

+ Chat with our AI agent to check eligibility and claims using your own words. No clicking around. Increase your work efficiency more than 10 times. +

+
+ + {/* Feature 2 */} + +
+ +
+

+ 24/7 Patient Connection +

+

+ After-hours messaging and calling handled automatically by AI, in your way. Never miss any patient inquiry. +

+
+ + {/* Feature 3 */} + +
+ +
+

+ Your Data, Your Control +

+

+ All patient data lives on your local computers. Automatic local and remote backup — always secure, always yours. +

+
+
+
+
+ ); +} diff --git a/artifacts/dental-app/src/components/FinalCTA.tsx b/artifacts/dental-app/src/components/FinalCTA.tsx new file mode 100644 index 0000000..16cf861 --- /dev/null +++ b/artifacts/dental-app/src/components/FinalCTA.tsx @@ -0,0 +1,34 @@ +import { motion } from "framer-motion"; +import { Button } from "@/components/ui/button"; + +export function FinalCTA() { + return ( +
+ {/* Decorative circle */} +
+ +
+ +

+ Ready to Transform Your Practice? +

+

+ Join dental offices discovering smarter administration. +

+ +
+
+
+ ); +} diff --git a/artifacts/dental-app/src/components/Footer.tsx b/artifacts/dental-app/src/components/Footer.tsx new file mode 100644 index 0000000..d98b9b2 --- /dev/null +++ b/artifacts/dental-app/src/components/Footer.tsx @@ -0,0 +1,46 @@ +export function Footer() { + return ( + + ); +} diff --git a/artifacts/dental-app/src/components/Hero.tsx b/artifacts/dental-app/src/components/Hero.tsx new file mode 100644 index 0000000..f2df58d --- /dev/null +++ b/artifacts/dental-app/src/components/Hero.tsx @@ -0,0 +1,124 @@ +import { motion } from "framer-motion"; +import { Button } from "@/components/ui/button"; + +export function Hero() { + return ( +
+ {/* Decorative background shapes */} +
+
+ +
+ + + Chat and Go. + + + + No CDT Code Search. No Paying for Third Parties. + + + + Complete your administrative tasks by using your natural language — just type what you need, and our AI reads it, gathers the required data, and gets it done automatically. + + + + + + + + + {/* Mock UI preview */} + +
+
+
+
+
+
my-dental-software.app
+
+
+
+
+
+
+
+ Check if John Smith is eligible for a crown +
+
+
+
+ Done. + John Smith (DOB: 10/12/1985) is eligible for D2740 (Crown - porcelain/ceramic) through Delta Dental. Copay is 20%. Remaining annual maximum: $1,250. +
+
+
+
+
+
+
+

Patient Summary

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+ ); +} diff --git a/artifacts/dental-app/src/components/HowItWorks.tsx b/artifacts/dental-app/src/components/HowItWorks.tsx new file mode 100644 index 0000000..fd0f055 --- /dev/null +++ b/artifacts/dental-app/src/components/HowItWorks.tsx @@ -0,0 +1,90 @@ +import { motion } from "framer-motion"; + +export function HowItWorks() { + const steps = [ + { + num: "01", + title: "Type your task in plain English", + desc: '"Check if John Smith is eligible for a crown"' + }, + { + num: "02", + title: "Our AI reads it", + desc: "Looks up the data, and handles the task automatically" + }, + { + num: "03", + title: "Get results instantly", + desc: "No CDT code lookup, no third-party logins" + } + ]; + + return ( +
+
+
+ + +

+ How It Works +

+

+ Forget endless menus and nested screens. We built a system that understands what you want to do. +

+ +
+ {steps.map((step, idx) => ( +
+
+ {step.num} +
+
+

{step.title}

+

{step.desc}

+
+
+ ))} +
+
+ + +
+
+
+ {/* Chat Mockup */} +
+ Can you pull up today's schedule and highlight any cancellations? +
+
+
+ Assistant + You have 12 appointments today. One cancellation at 2:00 PM (Jane Doe - Cleaning). I've already texted the waitlist. +
+
+ Great, file the claim for Michael's extraction yesterday. +
+
+
+ Assistant + Claim filed for Michael (D7140) to MetLife. Sent at 9:14 AM. +
+
+
+ + +
+
+
+ ); +} diff --git a/artifacts/dental-app/src/components/Navbar.tsx b/artifacts/dental-app/src/components/Navbar.tsx new file mode 100644 index 0000000..151a300 --- /dev/null +++ b/artifacts/dental-app/src/components/Navbar.tsx @@ -0,0 +1,48 @@ +import { Button } from "@/components/ui/button"; + +export function Navbar() { + const scrollTo = (id: string) => { + const el = document.getElementById(id); + if (el) { + el.scrollIntoView({ behavior: 'smooth' }); + } + }; + + return ( + + ); +} diff --git a/artifacts/dental-app/src/components/StatsBar.tsx b/artifacts/dental-app/src/components/StatsBar.tsx new file mode 100644 index 0000000..ee9e683 --- /dev/null +++ b/artifacts/dental-app/src/components/StatsBar.tsx @@ -0,0 +1,37 @@ +import { motion } from "framer-motion"; + +export function StatsBar() { + const stats = [ + { value: "10x", label: "Work Efficiency" }, + { value: "24/7", label: "Patient Coverage" }, + { value: "100%", label: "Local Data Control" }, + { value: "Zero", label: "CDT Code Lookups" } + ]; + + return ( +
+
+
+ {stats.map((stat, idx) => ( + +
+ {stat.value} +
+
+ {stat.label} +
+
+ ))} +
+
+
+ ); +} diff --git a/artifacts/dental-app/src/components/ui/accordion.tsx b/artifacts/dental-app/src/components/ui/accordion.tsx new file mode 100644 index 0000000..5ad3b62 --- /dev/null +++ b/artifacts/dental-app/src/components/ui/accordion.tsx @@ -0,0 +1,54 @@ +import * as React from 'react'; +import * as AccordionPrimitive from '@radix-ui/react-accordion'; +import { cn } from '@/lib/utils'; +import { ChevronDown } from 'lucide-react'; + +const Accordion = AccordionPrimitive.Root; + +const AccordionItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AccordionItem.displayName = 'AccordionItem'; + +const AccordionTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + svg]:rotate-180', + className, + )} + {...props} + > + {children} + + + +)); +AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName; + +const AccordionContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + +
{children}
+
+)); +AccordionContent.displayName = AccordionPrimitive.Content.displayName; + +export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }; diff --git a/artifacts/dental-app/src/components/ui/alert-dialog.tsx b/artifacts/dental-app/src/components/ui/alert-dialog.tsx new file mode 100644 index 0000000..82985dc --- /dev/null +++ b/artifacts/dental-app/src/components/ui/alert-dialog.tsx @@ -0,0 +1,138 @@ +import * as React from 'react'; +import * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog'; +import { buttonVariants } from '@/components/ui/button'; +import { cn } from '@/lib/utils'; + +const AlertDialog = AlertDialogPrimitive.Root; + +const AlertDialogTrigger = AlertDialogPrimitive.Trigger; + +const AlertDialogPortal = AlertDialogPrimitive.Portal; + +const AlertDialogOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName; + +const AlertDialogContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + + +)); +AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName; + +const AlertDialogHeader = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+); +AlertDialogHeader.displayName = 'AlertDialogHeader'; + +const AlertDialogFooter = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+); +AlertDialogFooter.displayName = 'AlertDialogFooter'; + +const AlertDialogTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName; + +const AlertDialogDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AlertDialogDescription.displayName = + AlertDialogPrimitive.Description.displayName; + +const AlertDialogAction = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName; + +const AlertDialogCancel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName; + +export { + AlertDialog, + AlertDialogPortal, + AlertDialogOverlay, + AlertDialogTrigger, + AlertDialogContent, + AlertDialogHeader, + AlertDialogFooter, + AlertDialogTitle, + AlertDialogDescription, + AlertDialogAction, + AlertDialogCancel, +}; diff --git a/artifacts/dental-app/src/components/ui/alert.tsx b/artifacts/dental-app/src/components/ui/alert.tsx new file mode 100644 index 0000000..8bdb5e1 --- /dev/null +++ b/artifacts/dental-app/src/components/ui/alert.tsx @@ -0,0 +1,58 @@ +import * as React from 'react'; +import { cn } from '@/lib/utils'; +import { cva, type VariantProps } from 'class-variance-authority'; + +const alertVariants = cva( + 'relative w-full rounded-lg border px-4 py-3 text-sm [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7', + { + variants: { + variant: { + default: 'bg-background text-foreground', + destructive: + 'border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive', + }, + }, + defaultVariants: { + variant: 'default', + }, + }, +); + +const Alert = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes & VariantProps +>(({ className, variant, ...props }, ref) => ( +
+)); +Alert.displayName = 'Alert'; + +const AlertTitle = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)); +AlertTitle.displayName = 'AlertTitle'; + +const AlertDescription = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)); +AlertDescription.displayName = 'AlertDescription'; + +export { Alert, AlertTitle, AlertDescription }; diff --git a/artifacts/dental-app/src/components/ui/aspect-ratio.tsx b/artifacts/dental-app/src/components/ui/aspect-ratio.tsx new file mode 100644 index 0000000..5dfdf1e --- /dev/null +++ b/artifacts/dental-app/src/components/ui/aspect-ratio.tsx @@ -0,0 +1,5 @@ +import * as AspectRatioPrimitive from '@radix-ui/react-aspect-ratio'; + +const AspectRatio = AspectRatioPrimitive.Root; + +export { AspectRatio }; diff --git a/artifacts/dental-app/src/components/ui/avatar.tsx b/artifacts/dental-app/src/components/ui/avatar.tsx new file mode 100644 index 0000000..e1cde8e --- /dev/null +++ b/artifacts/dental-app/src/components/ui/avatar.tsx @@ -0,0 +1,49 @@ +'use client'; + +import * as React from 'react'; +import * as AvatarPrimitive from '@radix-ui/react-avatar'; +import { cn } from '@/lib/utils'; + +const Avatar = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +Avatar.displayName = AvatarPrimitive.Root.displayName; + +const AvatarImage = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AvatarImage.displayName = AvatarPrimitive.Image.displayName; + +const AvatarFallback = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName; + +export { Avatar, AvatarImage, AvatarFallback }; diff --git a/artifacts/dental-app/src/components/ui/badge.tsx b/artifacts/dental-app/src/components/ui/badge.tsx new file mode 100644 index 0000000..4cd8053 --- /dev/null +++ b/artifacts/dental-app/src/components/ui/badge.tsx @@ -0,0 +1,42 @@ +import * as React from 'react'; +import { cn } from '@/lib/utils'; +import { cva, type VariantProps } from 'class-variance-authority'; + +const badgeVariants = cva( + // @replit + // Whitespace-nowrap: Badges should never wrap. + 'whitespace-nowrap inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2' + + ' hover-elevate ', + { + variants: { + variant: { + default: + // @replit shadow-xs instead of shadow, no hover because we use hover-elevate + 'border-transparent bg-primary text-primary-foreground shadow-xs', + secondary: + // @replit no hover because we use hover-elevate + 'border-transparent bg-secondary text-secondary-foreground', + destructive: + // @replit shadow-xs instead of shadow, no hover because we use hover-elevate + 'border-transparent bg-destructive text-destructive-foreground shadow-xs', + // @replit shadow-xs" - use badge outline variable + outline: 'text-foreground border [border-color:var(--badge-outline)]', + }, + }, + defaultVariants: { + variant: 'default', + }, + }, +); + +export interface BadgeProps + extends React.HTMLAttributes, + VariantProps {} + +function Badge({ className, variant, ...props }: BadgeProps) { + return ( +
+ ); +} + +export { Badge, badgeVariants }; diff --git a/artifacts/dental-app/src/components/ui/breadcrumb.tsx b/artifacts/dental-app/src/components/ui/breadcrumb.tsx new file mode 100644 index 0000000..2e43292 --- /dev/null +++ b/artifacts/dental-app/src/components/ui/breadcrumb.tsx @@ -0,0 +1,114 @@ +import * as React from 'react'; +import { Slot } from '@radix-ui/react-slot'; +import { cn } from '@/lib/utils'; +import { ChevronRight, MoreHorizontal } from 'lucide-react'; + +const Breadcrumb = React.forwardRef< + HTMLElement, + React.ComponentPropsWithoutRef<'nav'> & { + separator?: React.ReactNode; + } +>(({ ...props }, ref) =>