From ad427365c9650978a6bc2503cff296dd4bbde77e Mon Sep 17 00:00:00 2001 From: Giancarlo Buomprisco Date: Fri, 22 Aug 2025 06:35:44 +0700 Subject: [PATCH] Storybook (#328) * feat(docs): add interactive examples and API references for Button, Card, and LoadingFallback components - Updated dependencies - Set `retries` to a fixed value of 3 for consistent test retries across environments. - Increased `timeout` from 60 seconds to 120 seconds to allow more time for tests to complete. - Reduced `expect` timeout from 10 seconds to 5 seconds for quicker feedback on assertions. --- .cursor/rules/ui.mdc | 114 +- .../components/alert-dialog-story.tsx | 937 ++++++++++++ .../app/components/components/alert-story.tsx | 656 ++++++++ .../app/components/components/badge-story.tsx | 430 ++++++ .../bordered-navigation-menu-story.tsx | 498 ++++++ .../components/breadcrumb-story.tsx | 619 ++++++++ .../components/components/button-story.tsx | 501 ++++++ .../components/components/calendar-story.tsx | 634 ++++++++ .../components/card-button-story.tsx | 482 ++++++ .../app/components/components/card-story.tsx | 619 ++++++++ .../app/components/components/chart-story.tsx | 688 +++++++++ .../components/components/checkbox-story.tsx | 1355 +++++++++++++++++ .../app/components/components/code-card.tsx | 60 + .../components/components/command-story.tsx | 1072 +++++++++++++ .../components/components/control-panel.tsx | 33 + .../components/cookie-banner-story.tsx | 505 ++++++ .../components/data-table-story.tsx | 1108 ++++++++++++++ .../components/components/dialog-story.tsx | 917 +++++++++++ .../components/components/docs-content.tsx | 30 + .../app/components/components/docs-header.tsx | 58 + .../components/components/docs-provider.tsx | 95 ++ .../components/components/docs-sidebar.tsx | 271 ++++ .../components/dropdown-menu-story.tsx | 1101 ++++++++++++++ .../components/empty-state-story.tsx | 633 ++++++++ .../components/file-uploader-story.tsx | 598 ++++++++ .../app/components/components/form-story.tsx | 1156 ++++++++++++++ .../components/components/heading-story.tsx | 552 +++++++ .../components/components/input-otp-story.tsx | 813 ++++++++++ .../app/components/components/input-story.tsx | 784 ++++++++++ .../components/loading-fallback.tsx | 20 + .../components/loading-overlay-story.tsx | 315 ++++ .../components/components/preview-card.tsx | 42 + .../components/components/progress-story.tsx | 897 +++++++++++ .../components/radio-group-story.tsx | 854 +++++++++++ .../components/components/select-story.tsx | 841 ++++++++++ .../components/simple-data-table-story.tsx | 490 ++++++ .../components/components/skeleton-story.tsx | 646 ++++++++ .../components/components/sonner-story.tsx | 1114 ++++++++++++++ .../components/components/spinner-story.tsx | 292 ++++ .../components/components/stepper-story.tsx | 439 ++++++ .../components/components/story-layout.tsx | 135 ++ .../components/components/story-select.tsx | 165 ++ .../components/components/switch-story.tsx | 859 +++++++++++ .../app/components/components/tabs-story.tsx | 1327 ++++++++++++++++ .../components/components/textarea-story.tsx | 964 ++++++++++++ .../components/components/tooltip-story.tsx | 933 ++++++++++++ .../app/components/lib/components-data.tsx | 975 ++++++++++++ .../app/components/lib/story-utils.ts | 155 ++ apps/dev-tool/app/components/page.tsx | 32 + apps/dev-tool/app/page.tsx | 2 +- apps/dev-tool/components/app-sidebar.tsx | 6 + apps/dev-tool/components/root-providers.tsx | 12 +- apps/dev-tool/lib/i18n/i18n.resolver.ts | 31 + apps/dev-tool/lib/i18n/i18n.server.ts | 10 + apps/dev-tool/lib/i18n/i18n.settings.ts | 52 + apps/dev-tool/lib/i18n/with-i18n.tsx | 13 + apps/dev-tool/package.json | 11 +- apps/e2e/package.json | 2 +- apps/e2e/playwright.config.ts | 15 +- apps/e2e/tests/admin/admin.spec.ts | 37 +- .../site-header-account-section.tsx | 10 +- apps/web/next.config.mjs | 1 + apps/web/package.json | 8 +- package.json | 2 +- packages/analytics/src/server.ts | 2 +- packages/billing/gateway/package.json | 4 +- packages/billing/lemon-squeezy/package.json | 2 +- packages/billing/stripe/package.json | 2 +- packages/email-templates/package.json | 2 +- packages/features/accounts/package.json | 4 +- packages/features/admin/package.json | 2 +- .../src/components/admin-account-page.tsx | 6 +- .../src/components/admin-accounts-table.tsx | 16 +- .../components/admin-delete-user-dialog.tsx | 9 +- packages/features/auth/package.json | 4 +- packages/features/notifications/package.json | 2 +- packages/features/team-accounts/package.json | 4 +- packages/i18n/package.json | 6 +- packages/mailers/nodemailer/package.json | 2 +- packages/next/package.json | 2 +- packages/supabase/package.json | 2 +- packages/ui/package.json | 6 +- packages/ui/src/makerkit/data-table.tsx | 894 ++++++++++- packages/ui/src/shadcn/slider.tsx | 29 + packages/ui/src/shadcn/table.tsx | 20 +- pnpm-lock.yaml | 483 +++--- tooling/eslint/package.json | 4 +- 87 files changed, 30102 insertions(+), 431 deletions(-) create mode 100644 apps/dev-tool/app/components/components/alert-dialog-story.tsx create mode 100644 apps/dev-tool/app/components/components/alert-story.tsx create mode 100644 apps/dev-tool/app/components/components/badge-story.tsx create mode 100644 apps/dev-tool/app/components/components/bordered-navigation-menu-story.tsx create mode 100644 apps/dev-tool/app/components/components/breadcrumb-story.tsx create mode 100644 apps/dev-tool/app/components/components/button-story.tsx create mode 100644 apps/dev-tool/app/components/components/calendar-story.tsx create mode 100644 apps/dev-tool/app/components/components/card-button-story.tsx create mode 100644 apps/dev-tool/app/components/components/card-story.tsx create mode 100644 apps/dev-tool/app/components/components/chart-story.tsx create mode 100644 apps/dev-tool/app/components/components/checkbox-story.tsx create mode 100644 apps/dev-tool/app/components/components/code-card.tsx create mode 100644 apps/dev-tool/app/components/components/command-story.tsx create mode 100644 apps/dev-tool/app/components/components/control-panel.tsx create mode 100644 apps/dev-tool/app/components/components/cookie-banner-story.tsx create mode 100644 apps/dev-tool/app/components/components/data-table-story.tsx create mode 100644 apps/dev-tool/app/components/components/dialog-story.tsx create mode 100644 apps/dev-tool/app/components/components/docs-content.tsx create mode 100644 apps/dev-tool/app/components/components/docs-header.tsx create mode 100644 apps/dev-tool/app/components/components/docs-provider.tsx create mode 100644 apps/dev-tool/app/components/components/docs-sidebar.tsx create mode 100644 apps/dev-tool/app/components/components/dropdown-menu-story.tsx create mode 100644 apps/dev-tool/app/components/components/empty-state-story.tsx create mode 100644 apps/dev-tool/app/components/components/file-uploader-story.tsx create mode 100644 apps/dev-tool/app/components/components/form-story.tsx create mode 100644 apps/dev-tool/app/components/components/heading-story.tsx create mode 100644 apps/dev-tool/app/components/components/input-otp-story.tsx create mode 100644 apps/dev-tool/app/components/components/input-story.tsx create mode 100644 apps/dev-tool/app/components/components/loading-fallback.tsx create mode 100644 apps/dev-tool/app/components/components/loading-overlay-story.tsx create mode 100644 apps/dev-tool/app/components/components/preview-card.tsx create mode 100644 apps/dev-tool/app/components/components/progress-story.tsx create mode 100644 apps/dev-tool/app/components/components/radio-group-story.tsx create mode 100644 apps/dev-tool/app/components/components/select-story.tsx create mode 100644 apps/dev-tool/app/components/components/simple-data-table-story.tsx create mode 100644 apps/dev-tool/app/components/components/skeleton-story.tsx create mode 100644 apps/dev-tool/app/components/components/sonner-story.tsx create mode 100644 apps/dev-tool/app/components/components/spinner-story.tsx create mode 100644 apps/dev-tool/app/components/components/stepper-story.tsx create mode 100644 apps/dev-tool/app/components/components/story-layout.tsx create mode 100644 apps/dev-tool/app/components/components/story-select.tsx create mode 100644 apps/dev-tool/app/components/components/switch-story.tsx create mode 100644 apps/dev-tool/app/components/components/tabs-story.tsx create mode 100644 apps/dev-tool/app/components/components/textarea-story.tsx create mode 100644 apps/dev-tool/app/components/components/tooltip-story.tsx create mode 100644 apps/dev-tool/app/components/lib/components-data.tsx create mode 100644 apps/dev-tool/app/components/lib/story-utils.ts create mode 100644 apps/dev-tool/app/components/page.tsx create mode 100644 apps/dev-tool/lib/i18n/i18n.resolver.ts create mode 100644 apps/dev-tool/lib/i18n/i18n.server.ts create mode 100644 apps/dev-tool/lib/i18n/i18n.settings.ts create mode 100644 apps/dev-tool/lib/i18n/with-i18n.tsx create mode 100644 packages/ui/src/shadcn/slider.tsx diff --git a/.cursor/rules/ui.mdc b/.cursor/rules/ui.mdc index 4bc01c8bc..352b5c2e8 100644 --- a/.cursor/rules/ui.mdc +++ b/.cursor/rules/ui.mdc @@ -3,16 +3,19 @@ description: UI Components API reference and guidelines globs: **/*.tsx alwaysApply: false --- + # UI Components - Reusable UI components are defined in the "packages/ui" package named "@kit/ui". - By exporting the component from the "exports" field, we can import it using the "@kit/ui/{component-name}" format. ## Styling + - Styling is done using Tailwind CSS. We use the "cn" function from the "@kit/ui/utils" package to generate class names. - Avoid fixes classes such as "bg-gray-500". Instead, use Shadcn classes such as "bg-background", "text-secondary-foreground", "text-muted-foreground", etc. Makerkit leverages two sets of UI components: + 1. **Shadcn UI Components**: Base components from the Shadcn UI library 2. **Makerkit-specific Components**: Custom components built on top of Shadcn UI @@ -22,86 +25,87 @@ Makerkit leverages two sets of UI components: // Import Shadcn UI components import { Button } from '@kit/ui/button'; import { Card } from '@kit/ui/card'; -import { toast } from '@kit/ui/sonner'; - // Import Makerkit-specific components import { If } from '@kit/ui/if'; -import { Trans } from '@kit/ui/trans'; import { ProfileAvatar } from '@kit/ui/profile-avatar'; +import { toast } from '@kit/ui/sonner'; +import { Trans } from '@kit/ui/trans'; ``` ## Core Shadcn UI Components -| Component | Description | Import Path | -|-----------|-------------|-------------| -| `Accordion` | Expandable/collapsible content sections | `@kit/ui/accordion` [accordion.tsx](mdc:packages/ui/src/shadcn/accordion.tsx) | -| `AlertDialog` | Modal dialog for important actions | `@kit/ui/alert-dialog` [alert-dialog.tsx](mdc:packages/ui/src/shadcn/alert-dialog.tsx) | -| `Alert` | Status/notification messages | `@kit/ui/alert` [alert.tsx](mdc:packages/ui/src/shadcn/alert.tsx) | -| `Avatar` | User profile images with fallback | `@kit/ui/avatar` [avatar.tsx](mdc:packages/ui/src/shadcn/avatar.tsx) | -| `Badge` | Small status indicators | `@kit/ui/badge` [badge.tsx](mdc:packages/ui/src/shadcn/badge.tsx) | -| `Breadcrumb` | Navigation path indicators | `@kit/ui/breadcrumb` [breadcrumb.tsx](mdc:packages/ui/src/shadcn/breadcrumb.tsx) | -| `Button` | Clickable action elements | `@kit/ui/button` [button.tsx](mdc:packages/ui/src/shadcn/button.tsx) | -| `Calendar` | Date picker and date display | `@kit/ui/calendar` [calendar.tsx](mdc:packages/ui/src/shadcn/calendar.tsx) | -| `Card` | Container for grouped content | `@kit/ui/card` [card.tsx](mdc:packages/ui/src/shadcn/card.tsx) | -| `Checkbox` | Selection input | `@kit/ui/checkbox` [checkbox.tsx](mdc:packages/ui/src/shadcn/checkbox.tsx) | -| `Command` | Command palette interface | `@kit/ui/command` [command.tsx](mdc:packages/ui/src/shadcn/command.tsx) | -| `DataTable` | Table | `@kit/ui/data-table` [data-table.tsx](mdc:packages/ui/src/shadcn/data-table.tsx) | -| `Dialog` | Modal window for focused interactions | `@kit/ui/dialog` [dialog.tsx](mdc:packages/ui/src/shadcn/dialog.tsx) | -| `DropdownMenu` | Menu triggered by a button | `@kit/ui/dropdown-menu` [dropdown-menu.tsx](mdc:packages/ui/src/shadcn/dropdown-menu.tsx) | -| `Form` | Form components with validation | `@kit/ui/form` [form.tsx](mdc:packages/ui/src/shadcn/form.tsx) | -| `Input` | Text input field | `@kit/ui/input` [input.tsx](mdc:packages/ui/src/shadcn/input.tsx) | -| `Input OTP` | OTP Text input field | `@kit/ui/input-otp` [input-otp.tsx](mdc:packages/ui/src/shadcn/input-otp.tsx) | -| `Label` | Text label for form elements | `@kit/ui/label` [label.tsx](mdc:packages/ui/src/shadcn/label.tsx) | -| `NavigationMenu` | Hierarchical navigation component | `@kit/ui/navigation-menu` [navigation-menu.tsx](mdc:packages/ui/src/shadcn/navigation-menu.tsx) | -| `Popover` | Floating content triggered by interaction | `@kit/ui/popover` [popover.tsx](mdc:packages/ui/src/shadcn/popover.tsx) | -| `RadioGroup` | Radio button selection group | `@kit/ui/radio-group` [radio-group.tsx](mdc:packages/ui/src/shadcn/radio-group.tsx) | -| `ScrollArea` | Customizable scrollable area | `@kit/ui/scroll-area` [scroll-area.tsx](mdc:packages/ui/src/shadcn/scroll-area.tsx) | -| `Select` | Dropdown selection menu | `@kit/ui/select` [select.tsx](mdc:packages/ui/src/shadcn/select.tsx) | -| `Separator` | Visual divider between content | `@kit/ui/separator` [separator.tsx](mdc:packages/ui/src/shadcn/separator.tsx) | -| `Sheet` | Sliding panel from screen edge | `@kit/ui/sheet` [sheet.tsx](mdc:packages/ui/src/shadcn/sheet.tsx) | -| `Sidebar` | Advanced sidebar navigation | `@kit/ui/shadcn-sidebar` [sidebar.tsx](mdc:packages/ui/src/shadcn/sidebar.tsx) | -| `Skeleton` | Loading placeholder | `@kit/ui/skeleton` [skeleton.tsx](mdc:packages/ui/src/shadcn/skeleton.tsx) | -| `Switch` | Toggle control | `@kit/ui/switch` [switch.tsx](mdc:packages/ui/src/shadcn/switch.tsx) | -| `Toast` | Toaster | `@kit/ui/sonner` [sonner.tsx](mdc:packages/ui/src/shadcn/sonner.tsx) | -| `Tabs` | Tab-based navigation | `@kit/ui/tabs` [tabs.tsx](mdc:packages/ui/src/shadcn/tabs.tsx) | -| `Textarea` | Multi-line text input | `@kit/ui/textarea` [textarea.tsx](mdc:packages/ui/src/shadcn/textarea.tsx) | -| `Tooltip` | Contextual information on hover | `@kit/ui/tooltip` [tooltip.tsx](mdc:packages/ui/src/shadcn/tooltip.tsx) | +| Component | Description | Import Path | +| ---------------- | ----------------------------------------- | ----------------------------------------------------------------------------------------------- | +| `Accordion` | Expandable/collapsible content sections | `@kit/ui/accordion` [accordion.tsx](mdc:packages/ui/src/shadcn/accordion.tsx) | +| `AlertDialog` | Modal dialog for important actions | `@kit/ui/alert-dialog` [alert-dialog.tsx](mdc:packages/ui/src/shadcn/alert-dialog.tsx) | +| `Alert` | Status/notification messages | `@kit/ui/alert` [alert.tsx](mdc:packages/ui/src/shadcn/alert.tsx) | +| `Avatar` | User profile images with fallback | `@kit/ui/avatar` [avatar.tsx](mdc:packages/ui/src/shadcn/avatar.tsx) | +| `Badge` | Small status indicators | `@kit/ui/badge` [badge.tsx](mdc:packages/ui/src/shadcn/badge.tsx) | +| `Breadcrumb` | Navigation path indicators | `@kit/ui/breadcrumb` [breadcrumb.tsx](mdc:packages/ui/src/shadcn/breadcrumb.tsx) | +| `Button` | Clickable action elements | `@kit/ui/button` [button.tsx](mdc:packages/ui/src/shadcn/button.tsx) | +| `Calendar` | Date picker and date display | `@kit/ui/calendar` [calendar.tsx](mdc:packages/ui/src/shadcn/calendar.tsx) | +| `Card` | Container for grouped content | `@kit/ui/card` [card.tsx](mdc:packages/ui/src/shadcn/card.tsx) | +| `Checkbox` | Selection input | `@kit/ui/checkbox` [checkbox.tsx](mdc:packages/ui/src/shadcn/checkbox.tsx) | +| `Command` | Command palette interface | `@kit/ui/command` [command.tsx](mdc:packages/ui/src/shadcn/command.tsx) | +| `DataTable` | Table | `@kit/ui/data-table` [data-table.tsx](mdc:packages/ui/src/shadcn/data-table.tsx) | +| `Dialog` | Modal window for focused interactions | `@kit/ui/dialog` [dialog.tsx](mdc:packages/ui/src/shadcn/dialog.tsx) | +| `DropdownMenu` | Menu triggered by a button | `@kit/ui/dropdown-menu` [dropdown-menu.tsx](mdc:packages/ui/src/shadcn/dropdown-menu.tsx) | +| `Form` | Form components with validation | `@kit/ui/form` [form.tsx](mdc:packages/ui/src/shadcn/form.tsx) | +| `Input` | Text input field | `@kit/ui/input` [input.tsx](mdc:packages/ui/src/shadcn/input.tsx) | +| `Input OTP` | OTP Text input field | `@kit/ui/input-otp` [input-otp.tsx](mdc:packages/ui/src/shadcn/input-otp.tsx) | +| `Label` | Text label for form elements | `@kit/ui/label` [label.tsx](mdc:packages/ui/src/shadcn/label.tsx) | +| `NavigationMenu` | Hierarchical navigation component | `@kit/ui/navigation-menu` [navigation-menu.tsx](mdc:packages/ui/src/shadcn/navigation-menu.tsx) | +| `Popover` | Floating content triggered by interaction | `@kit/ui/popover` [popover.tsx](mdc:packages/ui/src/shadcn/popover.tsx) | +| `RadioGroup` | Radio button selection group | `@kit/ui/radio-group` [radio-group.tsx](mdc:packages/ui/src/shadcn/radio-group.tsx) | +| `ScrollArea` | Customizable scrollable area | `@kit/ui/scroll-area` [scroll-area.tsx](mdc:packages/ui/src/shadcn/scroll-area.tsx) | +| `Select` | Dropdown selection menu | `@kit/ui/select` [select.tsx](mdc:packages/ui/src/shadcn/select.tsx) | +| `Separator` | Visual divider between content | `@kit/ui/separator` [separator.tsx](mdc:packages/ui/src/shadcn/separator.tsx) | +| `Sheet` | Sliding panel from screen edge | `@kit/ui/sheet` [sheet.tsx](mdc:packages/ui/src/shadcn/sheet.tsx) | +| `Sidebar` | Advanced sidebar navigation | `@kit/ui/shadcn-sidebar` [sidebar.tsx](mdc:packages/ui/src/shadcn/sidebar.tsx) | +| `Skeleton` | Loading placeholder | `@kit/ui/skeleton` [skeleton.tsx](mdc:packages/ui/src/shadcn/skeleton.tsx) | +| `Switch` | Toggle control | `@kit/ui/switch` [switch.tsx](mdc:packages/ui/src/shadcn/switch.tsx) | +| `Toast` | Toaster | `@kit/ui/sonner` [sonner.tsx](mdc:packages/ui/src/shadcn/sonner.tsx) | +| `Tabs` | Tab-based navigation | `@kit/ui/tabs` [tabs.tsx](mdc:packages/ui/src/shadcn/tabs.tsx) | +| `Textarea` | Multi-line text input | `@kit/ui/textarea` [textarea.tsx](mdc:packages/ui/src/shadcn/textarea.tsx) | +| `Tooltip` | Contextual information on hover | `@kit/ui/tooltip` [tooltip.tsx](mdc:packages/ui/src/shadcn/tooltip.tsx) | ## Makerkit-specific Components -| Component | Description | Import Path | -|-----------|-------------|-------------| -| `If` | Conditional rendering component | `@kit/ui/if` [if.tsx](mdc:packages/ui/src/makerkit/if.tsx) | -| `Trans` | Internationalization text component | `@kit/ui/trans` [trans.tsx](mdc:packages/ui/src/makerkit/trans.tsx) | -| `Page` | Page layout with navigation | `@kit/ui/page` [page.tsx](mdc:packages/ui/src/makerkit/page.tsx) | -| `GlobalLoader` | Full-page loading indicator | `@kit/ui/global-loader` [global-loader.tsx](mdc:packages/ui/src/makerkit/global-loader.tsx) | -| `ImageUploader` | Image upload component | `@kit/ui/image-uploader` [image-uploader.tsx](mdc:packages/ui/src/makerkit/image-uploader.tsx) | -| `ProfileAvatar` | User avatar with fallback | `@kit/ui/profile-avatar` [profile-avatar.tsx](mdc:packages/ui/src/makerkit/profile-avatar.tsx) | -| `DataTable` (Enhanced) | Extended data table with pagination | `@kit/ui/enhanced-data-table` [data-table.tsx](mdc:packages/ui/src/makerkit/data-table.tsx) | -| `Stepper` | Multi-step process indicator | `@kit/ui/stepper` [stepper.tsx](mdc:packages/ui/src/makerkit/stepper.tsx) | -| `CookieBanner` | GDPR-compliant cookie notice | `@kit/ui/cookie-banner` [cookie-banner.tsx](mdc:packages/ui/src/makerkit/cookie-banner.tsx) | -| `CardButton` | Card-styled button | `@kit/ui/card-button` [card-button.tsx](mdc:packages/ui/src/makerkit/card-button.tsx) | -| `MultiStepForm` | Form with multiple steps | `@kit/ui/multi-step-form` [multi-step-form.tsx](mdc:packages/ui/src/makerkit/multi-step-form.tsx) | -| `EmptyState` | Empty data placeholder | `@kit/ui/empty-state` [empty-state.tsx](mdc:packages/ui/src/makerkit/empty-state.tsx) | -| `AppBreadcrumbs` | Application path breadcrumbs | `@kit/ui/app-breadcrumbs` [app-breadcrumbs.tsx](mdc:packages/ui/src/makerkit/app-breadcrumbs.tsx) | +| Component | Description | Import Path | +| ---------------------- | ----------------------------------- | ------------------------------------------------------------------------------------------------- | +| `If` | Conditional rendering component | `@kit/ui/if` [if.tsx](mdc:packages/ui/src/makerkit/if.tsx) | +| `Trans` | Internationalization text component | `@kit/ui/trans` [trans.tsx](mdc:packages/ui/src/makerkit/trans.tsx) | +| `Page` | Page layout with navigation | `@kit/ui/page` [page.tsx](mdc:packages/ui/src/makerkit/page.tsx) | +| `GlobalLoader` | Full-page loading indicator | `@kit/ui/global-loader` [global-loader.tsx](mdc:packages/ui/src/makerkit/global-loader.tsx) | +| `ImageUploader` | Image upload component | `@kit/ui/image-uploader` [image-uploader.tsx](mdc:packages/ui/src/makerkit/image-uploader.tsx) | +| `ProfileAvatar` | User avatar with fallback | `@kit/ui/profile-avatar` [profile-avatar.tsx](mdc:packages/ui/src/makerkit/profile-avatar.tsx) | +| `DataTable` (Enhanced) | Extended data table with pagination | `@kit/ui/enhanced-data-table` [data-table.tsx](mdc:packages/ui/src/makerkit/data-table.tsx) | +| `Stepper` | Multi-step process indicator | `@kit/ui/stepper` [stepper.tsx](mdc:packages/ui/src/makerkit/stepper.tsx) | +| `CookieBanner` | GDPR-compliant cookie notice | `@kit/ui/cookie-banner` [cookie-banner.tsx](mdc:packages/ui/src/makerkit/cookie-banner.tsx) | +| `CardButton` | Card-styled button | `@kit/ui/card-button` [card-button.tsx](mdc:packages/ui/src/makerkit/card-button.tsx) | +| `MultiStepForm` | Form with multiple steps | `@kit/ui/multi-step-form` [multi-step-form.tsx](mdc:packages/ui/src/makerkit/multi-step-form.tsx) | +| `EmptyState` | Empty data placeholder | `@kit/ui/empty-state` [empty-state.tsx](mdc:packages/ui/src/makerkit/empty-state.tsx) | +| `AppBreadcrumbs` | Application path breadcrumbs | `@kit/ui/app-breadcrumbs` [app-breadcrumbs.tsx](mdc:packages/ui/src/makerkit/app-breadcrumbs.tsx) | ## Marketing Components Import all marketing components with: + ```tsx import { - Hero, - HeroTitle, GradientText, // etc. + Hero, + HeroTitle, } from '@kit/ui/marketing'; ``` Key marketing components: + - `Hero` - Hero sections [hero.tsx](mdc:packages/ui/src/makerkit/marketing/hero.tsx) - `SecondaryHero` [secondary-hero.tsx](mdc:packages/ui/src/makerkit/marketing/secondary-hero.tsx) - `FeatureCard`, `FeatureGrid` - Feature showcases [feature-card.tsx](mdc:packages/ui/src/makerkit/marketing/feature-card.tsx) - `Footer` - Page Footer [footer.tsx](mdc:packages/ui/src/makerkit/marketing/footer.tsx) - `Header` - Page Header [header.tsx](mdc:packages/ui/src/makerkit/marketing/header.tsx) - `NewsletterSignup` - Email collection [newsletter-signup-container.tsx](mdc:packages/ui/src/makerkit/marketing/newsletter-signup-container.tsx) -- `ComingSoon` - Coming soon page template [coming-soon.tsx](mdc:packages/ui/src/makerkit/marketing/coming-soon.tsx) \ No newline at end of file +- `ComingSoon` - Coming soon page template [coming-soon.tsx](mdc:packages/ui/src/makerkit/marketing/coming-soon.tsx) diff --git a/apps/dev-tool/app/components/components/alert-dialog-story.tsx b/apps/dev-tool/app/components/components/alert-dialog-story.tsx new file mode 100644 index 000000000..cd9c378d5 --- /dev/null +++ b/apps/dev-tool/app/components/components/alert-dialog-story.tsx @@ -0,0 +1,937 @@ +'use client'; + +import { useState } from 'react'; + +import { + AlertTriangle, + Archive, + Ban, + Download, + LogOut, + RefreshCw, + Share, + Trash2, + UserX, + X, +} from 'lucide-react'; + +import { + AlertDialog, + AlertDialogAction, + AlertDialogCancel, + AlertDialogContent, + AlertDialogDescription, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogTitle, + AlertDialogTrigger, +} from '@kit/ui/alert-dialog'; +import { Button } from '@kit/ui/button'; +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from '@kit/ui/card'; +import { Input } from '@kit/ui/input'; +import { Label } from '@kit/ui/label'; +import { Separator } from '@kit/ui/separator'; +import { Switch } from '@kit/ui/switch'; +import { Textarea } from '@kit/ui/textarea'; + +import { useStoryControls } from '../lib/story-utils'; +import { ComponentStoryLayout } from './story-layout'; +import { SimpleStorySelect } from './story-select'; + +interface AlertDialogControls { + title: string; + description: string; + triggerText: string; + triggerVariant: + | 'default' + | 'destructive' + | 'outline' + | 'secondary' + | 'ghost' + | 'link'; + actionText: string; + actionVariant: 'default' | 'destructive'; + cancelText: string; + withIcon: boolean; + severity: 'info' | 'warning' | 'error' | 'success'; +} + +const triggerVariantOptions = [ + { value: 'destructive', label: 'Destructive', description: 'Danger button' }, + { value: 'outline', label: 'Outline', description: 'Outlined button' }, + { value: 'default', label: 'Default', description: 'Primary button' }, + { value: 'secondary', label: 'Secondary', description: 'Secondary style' }, + { value: 'ghost', label: 'Ghost', description: 'Minimal button' }, +] as const; + +const actionVariantOptions = [ + { + value: 'destructive', + label: 'Destructive', + description: 'For dangerous actions', + }, + { value: 'default', label: 'Default', description: 'For normal actions' }, +] as const; + +const severityOptions = [ + { value: 'info', label: 'Info', description: 'General information' }, + { value: 'warning', label: 'Warning', description: 'Caution required' }, + { value: 'error', label: 'Error', description: 'Destructive action' }, + { value: 'success', label: 'Success', description: 'Positive action' }, +] as const; + +const iconOptions = [ + { value: 'trash', icon: Trash2, label: 'Trash' }, + { value: 'alert', icon: AlertTriangle, label: 'Alert Triangle' }, + { value: 'logout', icon: LogOut, label: 'Log Out' }, + { value: 'userx', icon: UserX, label: 'User X' }, + { value: 'x', icon: X, label: 'X' }, + { value: 'ban', icon: Ban, label: 'Ban' }, + { value: 'archive', icon: Archive, label: 'Archive' }, + { value: 'download', icon: Download, label: 'Download' }, +]; + +export function AlertDialogStory() { + const { controls, updateControl } = useStoryControls({ + title: 'Are you absolutely sure?', + description: + 'This action cannot be undone. This will permanently delete your account and remove your data from our servers.', + triggerText: 'Delete Account', + triggerVariant: 'destructive', + actionText: 'Yes, delete account', + actionVariant: 'destructive', + cancelText: 'Cancel', + withIcon: true, + severity: 'error', + }); + + const [selectedIcon, setSelectedIcon] = useState('trash'); + + const selectedIconData = iconOptions.find( + (opt) => opt.value === selectedIcon, + ); + const IconComponent = selectedIconData?.icon || AlertTriangle; + + const generateCode = () => { + let code = `\n`; + code += ` \n`; + code += ` \n`; + code += ` \n`; + code += ` \n`; + code += ` \n`; + + if (controls.withIcon) { + code += `
\n`; + code += `
\n`; + const iconName = selectedIconData?.icon.name || 'AlertTriangle'; + code += ` <${iconName} className="h-5 w-5" />\n`; + code += `
\n`; + code += ` ${controls.title}\n`; + code += `
\n`; + } else { + code += ` ${controls.title}\n`; + } + + if (controls.description) { + code += ` \n`; + code += ` ${controls.description}\n`; + code += ` \n`; + } + + code += `
\n`; + code += ` \n`; + code += ` ${controls.cancelText}\n`; + + if (controls.actionVariant === 'destructive') { + code += ` \n`; + } else { + code += ` \n`; + } + + code += ` ${controls.actionText}\n`; + code += ` \n`; + code += ` \n`; + code += `
\n`; + code += `
`; + + return code; + }; + + const getSeverityIconStyles = (severity: string) => { + switch (severity) { + case 'error': + return 'flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-destructive/15 text-destructive'; + case 'warning': + return 'flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-yellow-100 text-yellow-600 dark:bg-yellow-900/30 dark:text-yellow-500'; + case 'success': + return 'flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-green-100 text-green-600 dark:bg-green-900/30 dark:text-green-500'; + default: + return 'flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-blue-100 text-blue-600 dark:bg-blue-900/30 dark:text-blue-500'; + } + }; + + const renderPreview = () => { + return ( + + + + + + + {controls.withIcon ? ( +
+
+ +
+ {controls.title} +
+ ) : ( + {controls.title} + )} + {controls.description && ( + + {controls.description} + + )} +
+ + {controls.cancelText} + + {controls.actionText} + + +
+
+ ); + }; + + const renderControls = () => ( + <> +
+ + updateControl('severity', value)} + options={severityOptions} + /> +
+ +
+ + updateControl('triggerVariant', value)} + options={triggerVariantOptions} + /> +
+ +
+ + updateControl('actionVariant', value)} + options={actionVariantOptions} + /> +
+ + + +
+ + updateControl('triggerText', e.target.value)} + placeholder="Button text" + /> +
+ +
+ + updateControl('title', e.target.value)} + placeholder="Alert dialog title" + /> +
+ +
+ +