impact-nova 1.7.50 → 1.7.51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/dist/components/ui/ag-grid-react/index.js +1 -1
  2. package/dist/components/ui/choice-card/choice-card.d.ts +45 -0
  3. package/dist/components/ui/choice-card/choice-card.js +282 -0
  4. package/dist/components/ui/choice-card/index.d.ts +1 -0
  5. package/dist/components/ui/choice-card/index.js +12 -0
  6. package/dist/components/ui/data-table/data-table-saved-views.js +53 -53
  7. package/dist/components/ui/nested-list/components/NestedListContent.d.ts +2 -1
  8. package/dist/components/ui/nested-list/components/NestedListContent.js +46 -46
  9. package/dist/components/ui/nested-list/components/SortableItem.d.ts +1 -0
  10. package/dist/components/ui/nested-list/components/SortableItem.js +72 -70
  11. package/dist/components/ui/nested-list/nested-list.js +166 -152
  12. package/dist/components/ui/sheet.js +6 -6
  13. package/dist/components/ui/wizard/index.d.ts +1 -0
  14. package/dist/components/ui/wizard/index.js +17 -0
  15. package/dist/components/ui/wizard/wizard.d.ts +53 -0
  16. package/dist/components/ui/wizard/wizard.js +312 -0
  17. package/dist/impact-nova.css +1 -1
  18. package/dist/index.d.ts +2 -2
  19. package/dist/index.js +339 -336
  20. package/dist/llms/rules/real-world-patterns.js +1 -1
  21. package/package.json +11 -11
  22. package/dist/components/ui/create-item-flow/create-item-flow.d.ts +0 -46
  23. package/dist/components/ui/create-item-flow/create-item-flow.js +0 -231
  24. package/dist/components/ui/create-item-flow/index.d.ts +0 -1
  25. package/dist/components/ui/create-item-flow/index.js +0 -16
  26. package/dist/components/ui/report-card/index.d.ts +0 -1
  27. package/dist/components/ui/report-card/index.js +0 -10
  28. package/dist/components/ui/report-card/report-card.d.ts +0 -19
  29. package/dist/components/ui/report-card/report-card.js +0 -146
@@ -1 +1 @@
1
- export default "# Impact Nova — Real-World Patterns (from production apps)\n\nPatterns observed in apps that use Impact Nova extensively (e.g. filter UIs, data tables, sheets, empty states).\n\n---\n\n## 1. Subpath imports (tree-shaking)\n\nPrefer **subpath imports** when you need only a few exports; use the barrel `impact-nova` when you need many from the same area.\n\n| Use case | Import |\n|----------|--------|\n| Button only | `import { Button } from 'impact-nova/button';` |\n| Sheet (side panel) | `import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetBody, SheetFooter } from 'impact-nova/sheet';` |\n| Filter panel | `import { FilterPanel, FilterPanelSidebar } from 'impact-nova/filter-panel';` and `FilterPanelBody`, `FilterPanelFooter` |\n| Filter strip | `import { FilterStrip } from 'impact-nova/filter-strip';` |\n| Empty state | `import { EmptyContainer, EmptyContainerImage, EmptyContainerTitle, EmptyContainerDescription, EmptyContainerAction } from 'impact-nova/empty-container';` |\n| Accordion | `import { Accordion, AccordionItem, AccordionTrigger, AccordionContent } from 'impact-nova/accordion';` |\n| Date pickers | `import { DateRangePicker } from 'impact-nova/date-picker';` or `WeekRangePicker`, `MonthRangePicker` |\n| Select | `import { Select } from 'impact-nova/select';` |\n| Alert | `import { Alert, AlertTitle, AlertDescription, AlertIcon } from 'impact-nova/alert';` |\n| Tooltip | `import { Tooltip, TooltipTrigger, TooltipContent } from 'impact-nova/tooltip';` |\n| Icons | `import { Pin, Unpin, Chart, getIconComponent } from 'impact-nova/icons';` |\n| AG Grid cell renderers | `import { AG_GRID_CELL_COMPONENTS, LinkCellRenderer } from 'impact-nova/ag-grid-react/cell-renderers';` |\n| Prompt | `import { Prompt } from 'impact-nova/prompt';` |\n| Radio group | `import { RadioGroup, RadioGroupItem } from 'impact-nova/radio-group';` |\n| Button group | `import { ButtonGroup } from 'impact-nova/button-group';` |\n| Smart input | `import { SmartInput as InputWrapper } from 'impact-nova/smart-input';` |\n| Chips | `import { Chip } from 'impact-nova/chips';` |\n| Loader | `import { Loader } from 'impact-nova/loader';` |\n\n---\n\n## 2. Type-only imports\n\nUse type-only imports for types to avoid pulling runtime code:\n\n```ts\nimport type { Option, MultiValue, ActionMeta } from 'impact-nova/select';\nimport type { FilterSidebarItem } from 'impact-nova/filter-panel';\nimport type { FilterItem, SavedFilterItem } from 'impact-nova/filter-strip';\nimport type { NestedListItem } from 'impact-nova/nested-list';\nimport type { FileUploadProps } from 'impact-nova/file-upload';\nimport type { BackendColDef } from 'impact-nova';\n```\n\n---\n\n## 3. Compound patterns\n\n### Filter UI (panel + strip)\n\n- **FilterPanel** + **FilterPanelSidebar** for the sliding panel; **FilterPanelBody** and **FilterPanelFooter** for content and Apply/Cancel.\n- **FilterStrip** to show applied filters (chips/tags). Types: `FilterItem`, `SavedFilterItem` from `impact-nova/filter-strip`.\n- Config drives **FilterSidebarItem** (from `impact-nova/filter-panel`); form state often with react-hook-form.\n\n### Data table + AG Grid\n\n**Mandatory (no deviation):** For DataTable or any data table using AG Grid, refer **only** to AG Grid's official documentation, follow **only** AG Grid recommended patterns, and use **only** the AG Grid API for grid operations. See resource `impact-nova://ag-grid-rules` for full rules. If the user has **ag-mcp** installed, use it for AG Grid API/docs and collaborate with this MCP for Impact Nova integration.\n\n- **DataTable**, **DataTableContent**, **DataTableSheet**, **DataTableSheetContent**, **DataTableSheetHeader**, **DataTableColumnList**, **DataTableFormatOptions** from `impact-nova`.\n- Use **processBackendColumnDefs** from `impact-nova` when column defs come from the backend; type **BackendColDef**.\n- Cell renderers: **AG_GRID_CELL_COMPONENTS** or **LinkCellRenderer** from `impact-nova/ag-grid-react/cell-renderers`; extend/wrap as needed (e.g. PlanningLinkCellRenderer).\n\n### Sheet (side panel with form)\n\n- **Sheet**, **SheetContent**, **SheetHeader**, **SheetTitle**, **SheetBody**, **SheetFooter** from `impact-nova/sheet`.\n- Use for “Match With”, “Bulk Edit”, “View Management” panels. Pair with react-hook-form for form content.\n\n### Empty state\n\n- **EmptyContainer** wrapping **EmptyContainerImage**, **EmptyContainerTitle**, **EmptyContainerDescription**, **EmptyContainerAction** (e.g. a Button to “Select filter” or “Add item”).\n\n### Tabs + NestedList + Accordion (view management)\n\n- **Tabs**, **TabsList**, **TabsTrigger**, **TabsContent** for switching sections.\n- **NestedList** with **SelectionMode**; data shape **NestedListItem** from `impact-nova/nested-list`.\n- **Accordion**, **AccordionItem**, **AccordionTrigger**, **AccordionContent** for expandable blocks (e.g. Versions & Variance).\n\n### Chart (Highcharts)\n\n- Use **Chart** from `impact-nova` (or `impact-nova/chart` if available) as the wrapper.\n- For **series, options, and configuration** refer to **Highcharts documentation** ([highcharts.com/docs](https://www.highcharts.com/docs/)); use the Highcharts API for chart behavior. Impact Nova provides the React integration and styling; options/series follow Highcharts.\n- Install: `highcharts@^12`, `highcharts-react-official@^3`, optional `highcharts-border-radius@^0.0.4`.\n\n### Toast + Alert\n\n- **toast**, **Toaster**, **useToast** from `impact-nova`; wrap app with **Toaster**.\n- **Alert**, **AlertTitle**, **AlertDescription**, **AlertIcon** from `impact-nova/alert` for inline or toast-style messages.\n\n### Command Palette & keyboard shortcuts\n\nImplementation is **more involved** than other components. Use the dedicated guide: resource **`impact-nova://command-palette`**.\n\n- **Import:** `import { CommandPaletteProvider, CommandPalette, useShortcut, useGlobalShortcut, ShortcutSettings, ShortcutScopeProvider, Kbd, useCommandPalette, useBrowserShortcuts } from 'impact-nova/command-palette';`\n- **Minimal setup:** Wrap app with `CommandPaletteProvider`; render `<CommandPalette />` once inside it (⌘K overlay). Register commands with `useShortcut` (scoped: page/module/modal) or `useGlobalShortcut` (app-wide). Use correct `scope` for priority (modal > page > module > global).\n- **Multi-table:** When multiple DataTables share the same shortcut, wrap each in `ShortcutScopeProvider` with a unique `instance` so only the focused one responds.\n- **ShortcutSettings:** AG Grid–powered panel for user customisation; put inside a Sheet (e.g. Keyboard Shortcuts settings). For AG Grid behaviour follow `impact-nova://ag-grid-rules`.\n- **Kbd:** Use `<Kbd keybinding={{ key: 'k', meta: true }} />` to show shortcut in UI. **Button trigger:** `useCommandPalette().setOpen(true)`.\n\n---\n\n## 4. App setup\n\n- **CSS once at root**: `import 'impact-nova/dist/impact-nova.css';` (e.g. in App.tsx or main.tsx).\n- **AG Grid**: Set `LicenseManager.setLicenseKey(...)` if using enterprise.\n- **Vite**: Dedupe react/ag-grid when using impact-nova to avoid dual instances:\n\n```js\nresolve: {\n dedupe: ['react', 'react-dom', 'ag-grid-community', 'ag-grid-enterprise', 'ag-grid-react'],\n alias: {\n // If impact-nova/horizontal-scroller doesn't re-export default:\n 'impact-nova/horizontal-scroller': resolve(__dirname, 'node_modules/impact-nova/dist/components/ui/horizontal-scroller/horizontal-scroller.js'),\n },\n},\n```\n\n---\n\n## 5. Known workarounds\n\n- **HorizontalScroller**: Some builds expose it as default export from the component file; if the package entry is empty, add a Vite alias to `.../horizontal-scroller/horizontal-scroller.js` and a small `declare module 'impact-nova/horizontal-scroller'` (default export + props type) for TypeScript.\n- **Chart**: If the main export path doesn’t work, apps sometimes use `import { Chart as ImpactChart } from 'impact-nova/dist/components/ui/chart/chart';`. Prefer the public export when available.\n\n---\n\n## 6. Forms and options\n\n- **Select options**: Use type **Option** (or **SelectOption**) from `impact-nova/select` for `{ value, label }` (and optional fields). **MultiValue** for multi-select.\n- **react-hook-form**: Use Impact Nova form controls (SmartInput, Select, DateRangePicker, RadioGroup, ButtonGroup, Chips, etc.) as controlled components; pass `value`/`onChange` from the form library.\n- **Validation and errors**: Show validation errors with **Alert** or field-level messages; use the form library’s error state (e.g. `formState.errors`) and optional schema validation (e.g. Zod) with react-hook-form.\n\n---\n\n## 7. Breadcrumb and toolbar\n\n- **Breadcrumb** with **BreadcrumbList**, **BreadcrumbItem**, **BreadcrumbLink**, **BreadcrumbSeparator**, **BreadcrumbPage** for table/section context.\n- **DataTableToolbar** for table toolbars (view mode, view management, filters, Update/Cancel when editing).\n\nUse these patterns so the MCP and generated code stay close to how Impact Nova is used in real apps.\n\n---\n\n## 8. CreateItemFlow (multi-step creation wizard)\n\nUse **CreateItemFlow** for any multi-step creation or onboarding wizard. It provides a split-panel layout with a left sidebar and a right content area driven by a shared context.\n\n### Import\n\n```ts\nimport {\n CreateItemFlowRoot,\n CreateItemFlowCard,\n CreateItemFlowLeftPanel,\n CreateItemFlowTitle,\n CreateItemFlowDescription,\n CreateItemFlowImage,\n CreateItemFlowRightPanel,\n CreateItemFlowStepper,\n CreateItemFlowContentTitle,\n CreateItemFlowContentDescription,\n CreateItemFlowContent,\n CreateItemFlowStepContent,\n CreateItemFlowActions,\n} from 'impact-nova';\n```\n\n### Minimal multi-step example\n\n```tsx\nimport { useState } from 'react';\nimport {\n CreateItemFlowRoot, CreateItemFlowCard,\n CreateItemFlowLeftPanel, CreateItemFlowTitle, CreateItemFlowDescription, CreateItemFlowImage,\n CreateItemFlowRightPanel, CreateItemFlowStepper,\n CreateItemFlowContent, CreateItemFlowStepContent, CreateItemFlowContentTitle,\n CreateItemFlowActions,\n} from 'impact-nova';\n\nexport function CreateAlertFlow() {\n const [step, setStep] = useState(1);\n\n return (\n <CreateItemFlowRoot step={step} totalSteps={3} onStepChange={setStep}>\n <CreateItemFlowCard>\n <CreateItemFlowLeftPanel>\n <div>\n <CreateItemFlowTitle>Create Alert</CreateItemFlowTitle>\n <CreateItemFlowDescription>Configure your alert step by step.</CreateItemFlowDescription>\n </div>\n <CreateItemFlowImage />\n </CreateItemFlowLeftPanel>\n\n <CreateItemFlowRightPanel>\n <CreateItemFlowStepper />\n <CreateItemFlowContent>\n <CreateItemFlowStepContent forStep={1}>\n <CreateItemFlowContentTitle>Alert Details</CreateItemFlowContentTitle>\n {/* form fields */}\n </CreateItemFlowStepContent>\n <CreateItemFlowStepContent forStep={2}>\n <CreateItemFlowContentTitle>Configuration</CreateItemFlowContentTitle>\n </CreateItemFlowStepContent>\n <CreateItemFlowStepContent forStep={3}>\n <CreateItemFlowContentTitle>Review</CreateItemFlowContentTitle>\n </CreateItemFlowStepContent>\n </CreateItemFlowContent>\n <CreateItemFlowActions\n onCancel={() => {}}\n onSubmit={() => {}}\n />\n </CreateItemFlowRightPanel>\n </CreateItemFlowCard>\n </CreateItemFlowRoot>\n );\n}\n```\n\n### Key rules\n\n- **CreateItemFlowRoot** is the context provider — every other sub-component must be a descendant.\n- **CreateItemFlowActions** is smart: it auto-renders Cancel+Next (step 1), Back+Cancel+Next (middle), Back+Cancel+Submit (last). Pass `children` to fully override.\n- **CreateItemFlowStepContent** renders nothing when `forStep` doesn't match the current step — use one per step.\n- **CreateItemFlowImage** renders a default SVG illustration when neither `src` nor `children` are provided.\n- The left panel is hidden below the `lg` breakpoint.\n- Compose **Tabs**, **Select**, **Input**, etc. inside **CreateItemFlowContent** for rich step content.\n- For a single-step flow, set `totalSteps={1}` — the stepper is hidden and Submit appears directly.\n- To override action buttons entirely, pass children to `CreateItemFlowActions`:\n\n```tsx\n<CreateItemFlowActions>\n <Button variant=\"tertiary\">Save as Draft</Button>\n <div className=\"flex gap-3\">\n <Button variant=\"secondary\">Cancel</Button>\n <Button variant=\"default\">Publish</Button>\n </div>\n</CreateItemFlowActions>\n```\n";
1
+ export default "# Impact Nova — Real-World Patterns (from production apps)\n\nPatterns observed in apps that use Impact Nova extensively (e.g. filter UIs, data tables, sheets, empty states).\n\n---\n\n## 1. Subpath imports (tree-shaking)\n\nPrefer **subpath imports** when you need only a few exports; use the barrel `impact-nova` when you need many from the same area.\n\n| Use case | Import |\n|----------|--------|\n| Button only | `import { Button } from 'impact-nova/button';` |\n| Sheet (side panel) | `import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetBody, SheetFooter } from 'impact-nova/sheet';` |\n| Filter panel | `import { FilterPanel, FilterPanelSidebar } from 'impact-nova/filter-panel';` and `FilterPanelBody`, `FilterPanelFooter` |\n| Filter strip | `import { FilterStrip } from 'impact-nova/filter-strip';` |\n| Empty state | `import { EmptyContainer, EmptyContainerImage, EmptyContainerTitle, EmptyContainerDescription, EmptyContainerAction } from 'impact-nova/empty-container';` |\n| Accordion | `import { Accordion, AccordionItem, AccordionTrigger, AccordionContent } from 'impact-nova/accordion';` |\n| Date pickers | `import { DateRangePicker } from 'impact-nova/date-picker';` or `WeekRangePicker`, `MonthRangePicker` |\n| Select | `import { Select } from 'impact-nova/select';` |\n| Alert | `import { Alert, AlertTitle, AlertDescription, AlertIcon } from 'impact-nova/alert';` |\n| Tooltip | `import { Tooltip, TooltipTrigger, TooltipContent } from 'impact-nova/tooltip';` |\n| Icons | `import { Pin, Unpin, Chart, getIconComponent } from 'impact-nova/icons';` |\n| AG Grid cell renderers | `import { AG_GRID_CELL_COMPONENTS, LinkCellRenderer } from 'impact-nova/ag-grid-react/cell-renderers';` |\n| Prompt | `import { Prompt } from 'impact-nova/prompt';` |\n| Radio group | `import { RadioGroup, RadioGroupItem } from 'impact-nova/radio-group';` |\n| Button group | `import { ButtonGroup } from 'impact-nova/button-group';` |\n| Smart input | `import { SmartInput as InputWrapper } from 'impact-nova/smart-input';` |\n| Chips | `import { Chip } from 'impact-nova/chips';` |\n| Loader | `import { Loader } from 'impact-nova/loader';` |\n\n---\n\n## 2. Type-only imports\n\nUse type-only imports for types to avoid pulling runtime code:\n\n```ts\nimport type { Option, MultiValue, ActionMeta } from 'impact-nova/select';\nimport type { FilterSidebarItem } from 'impact-nova/filter-panel';\nimport type { FilterItem, SavedFilterItem } from 'impact-nova/filter-strip';\nimport type { NestedListItem } from 'impact-nova/nested-list';\nimport type { FileUploadProps } from 'impact-nova/file-upload';\nimport type { BackendColDef } from 'impact-nova';\n```\n\n---\n\n## 3. Compound patterns\n\n### Filter UI (panel + strip)\n\n- **FilterPanel** + **FilterPanelSidebar** for the sliding panel; **FilterPanelBody** and **FilterPanelFooter** for content and Apply/Cancel.\n- **FilterStrip** to show applied filters (chips/tags). Types: `FilterItem`, `SavedFilterItem` from `impact-nova/filter-strip`.\n- Config drives **FilterSidebarItem** (from `impact-nova/filter-panel`); form state often with react-hook-form.\n\n### Data table + AG Grid\n\n**Mandatory (no deviation):** For DataTable or any data table using AG Grid, refer **only** to AG Grid's official documentation, follow **only** AG Grid recommended patterns, and use **only** the AG Grid API for grid operations. See resource `impact-nova://ag-grid-rules` for full rules. If the user has **ag-mcp** installed, use it for AG Grid API/docs and collaborate with this MCP for Impact Nova integration.\n\n- **DataTable**, **DataTableContent**, **DataTableSheet**, **DataTableSheetContent**, **DataTableSheetHeader**, **DataTableColumnList**, **DataTableFormatOptions** from `impact-nova`.\n- Use **processBackendColumnDefs** from `impact-nova` when column defs come from the backend; type **BackendColDef**.\n- Cell renderers: **AG_GRID_CELL_COMPONENTS** or **LinkCellRenderer** from `impact-nova/ag-grid-react/cell-renderers`; extend/wrap as needed (e.g. PlanningLinkCellRenderer).\n\n### Sheet (side panel with form)\n\n- **Sheet**, **SheetContent**, **SheetHeader**, **SheetTitle**, **SheetBody**, **SheetFooter** from `impact-nova/sheet`.\n- Use for “Match With”, “Bulk Edit”, “View Management” panels. Pair with react-hook-form for form content.\n\n### Empty state\n\n- **EmptyContainer** wrapping **EmptyContainerImage**, **EmptyContainerTitle**, **EmptyContainerDescription**, **EmptyContainerAction** (e.g. a Button to “Select filter” or “Add item”).\n\n### Tabs + NestedList + Accordion (view management)\n\n- **Tabs**, **TabsList**, **TabsTrigger**, **TabsContent** for switching sections.\n- **NestedList** with **SelectionMode**; data shape **NestedListItem** from `impact-nova/nested-list`.\n- **Accordion**, **AccordionItem**, **AccordionTrigger**, **AccordionContent** for expandable blocks (e.g. Versions & Variance).\n\n### Chart (Highcharts)\n\n- Use **Chart** from `impact-nova` (or `impact-nova/chart` if available) as the wrapper.\n- For **series, options, and configuration** refer to **Highcharts documentation** ([highcharts.com/docs](https://www.highcharts.com/docs/)); use the Highcharts API for chart behavior. Impact Nova provides the React integration and styling; options/series follow Highcharts.\n- Install: `highcharts@^12`, `highcharts-react-official@^3`, optional `highcharts-border-radius@^0.0.4`.\n\n### Toast + Alert\n\n- **toast**, **Toaster**, **useToast** from `impact-nova`; wrap app with **Toaster**.\n- **Alert**, **AlertTitle**, **AlertDescription**, **AlertIcon** from `impact-nova/alert` for inline or toast-style messages.\n\n### Command Palette & keyboard shortcuts\n\nImplementation is **more involved** than other components. Use the dedicated guide: resource **`impact-nova://command-palette`**.\n\n- **Import:** `import { CommandPaletteProvider, CommandPalette, useShortcut, useGlobalShortcut, ShortcutSettings, ShortcutScopeProvider, Kbd, useCommandPalette, useBrowserShortcuts } from 'impact-nova/command-palette';`\n- **Minimal setup:** Wrap app with `CommandPaletteProvider`; render `<CommandPalette />` once inside it (⌘K overlay). Register commands with `useShortcut` (scoped: page/module/modal) or `useGlobalShortcut` (app-wide). Use correct `scope` for priority (modal > page > module > global).\n- **Multi-table:** When multiple DataTables share the same shortcut, wrap each in `ShortcutScopeProvider` with a unique `instance` so only the focused one responds.\n- **ShortcutSettings:** AG Grid–powered panel for user customisation; put inside a Sheet (e.g. Keyboard Shortcuts settings). For AG Grid behaviour follow `impact-nova://ag-grid-rules`.\n- **Kbd:** Use `<Kbd keybinding={{ key: 'k', meta: true }} />` to show shortcut in UI. **Button trigger:** `useCommandPalette().setOpen(true)`.\n\n---\n\n## 4. App setup\n\n- **CSS once at root**: `import 'impact-nova/dist/impact-nova.css';` (e.g. in App.tsx or main.tsx).\n- **AG Grid**: Set `LicenseManager.setLicenseKey(...)` if using enterprise.\n- **Vite**: Dedupe react/ag-grid when using impact-nova to avoid dual instances:\n\n```js\nresolve: {\n dedupe: ['react', 'react-dom', 'ag-grid-community', 'ag-grid-enterprise', 'ag-grid-react'],\n alias: {\n // If impact-nova/horizontal-scroller doesn't re-export default:\n 'impact-nova/horizontal-scroller': resolve(__dirname, 'node_modules/impact-nova/dist/components/ui/horizontal-scroller/horizontal-scroller.js'),\n },\n},\n```\n\n---\n\n## 5. Known workarounds\n\n- **HorizontalScroller**: Some builds expose it as default export from the component file; if the package entry is empty, add a Vite alias to `.../horizontal-scroller/horizontal-scroller.js` and a small `declare module 'impact-nova/horizontal-scroller'` (default export + props type) for TypeScript.\n- **Chart**: If the main export path doesn’t work, apps sometimes use `import { Chart as ImpactChart } from 'impact-nova/dist/components/ui/chart/chart';`. Prefer the public export when available.\n\n---\n\n## 6. Forms and options\n\n- **Select options**: Use type **Option** (or **SelectOption**) from `impact-nova/select` for `{ value, label }` (and optional fields). **MultiValue** for multi-select.\n- **react-hook-form**: Use Impact Nova form controls (SmartInput, Select, DateRangePicker, RadioGroup, ButtonGroup, Chips, etc.) as controlled components; pass `value`/`onChange` from the form library.\n- **Validation and errors**: Show validation errors with **Alert** or field-level messages; use the form library’s error state (e.g. `formState.errors`) and optional schema validation (e.g. Zod) with react-hook-form.\n\n---\n\n## 7. Breadcrumb and toolbar\n\n- **Breadcrumb** with **BreadcrumbList**, **BreadcrumbItem**, **BreadcrumbLink**, **BreadcrumbSeparator**, **BreadcrumbPage** for table/section context.\n- **DataTableToolbar** for table toolbars (view mode, view management, filters, Update/Cancel when editing).\n\nUse these patterns so the MCP and generated code stay close to how Impact Nova is used in real apps.\n\n---\n\n## 8. Wizard (multi-step flow)\n\nUse **Wizard** for any multi-step creation or onboarding flow. Radix-style controlled state (`value` / `onValueChange`), optional split-panel layout, and `useWizard()` for flexible footers.\n\n### Import\n\n```ts\nimport {\n WizardRoot,\n WizardLayout,\n WizardSidebar,\n WizardTitle,\n WizardDescription,\n WizardMedia,\n WizardBody,\n WizardProgress,\n WizardHeader,\n WizardContent,\n WizardStep,\n WizardFooter,\n useWizard,\n} from 'impact-nova/wizard';\n```\n\n### Minimal multi-step example\n\n```tsx\nimport { useState } from 'react';\nimport {\n WizardRoot, WizardLayout,\n WizardSidebar, WizardTitle, WizardDescription, WizardMedia,\n WizardBody, WizardProgress,\n WizardContent, WizardStep, WizardHeader,\n WizardFooter,\n} from 'impact-nova/wizard';\nimport { Button } from 'impact-nova/button';\n\nexport function CreateAlertFlow() {\n const [step, setStep] = useState(1);\n\n return (\n <WizardRoot value={step} totalSteps={3} onValueChange={setStep}>\n <WizardLayout>\n <WizardSidebar>\n <WizardTitle>Create Alert</WizardTitle>\n <WizardDescription>Configure your alert step by step.</WizardDescription>\n <WizardMedia />\n </WizardSidebar>\n\n <WizardBody>\n <WizardProgress />\n <WizardContent>\n <WizardStep value={1}>\n <WizardHeader>Alert Details</WizardHeader>\n </WizardStep>\n <WizardStep value={2}>\n <WizardHeader>Configuration</WizardHeader>\n </WizardStep>\n <WizardStep value={3}>\n <WizardHeader>Review</WizardHeader>\n </WizardStep>\n </WizardContent>\n <WizardFooter>\n <Button variant=\"secondary\">Cancel</Button>\n <Button variant=\"default\">Submit</Button>\n </WizardFooter>\n </WizardBody>\n </WizardLayout>\n </WizardRoot>\n );\n}\n```\n\n### Key rules\n\n- **WizardRoot** is the context provider — every other sub-component must be a descendant.\n- Use **useWizard()** for `goNext`, `goBack`, `isFirstStep`, `isLastStep` without prop drilling.\n- **WizardStep** renders nothing when `value` doesn't match the current step — use one per step.\n- **WizardMedia** renders a default SVG when neither `src` nor `children` are provided.\n- The sidebar is hidden below the `lg` breakpoint.\n- All sub-components except **WizardRoot** are optional — compose only what you need.\n- Compose **Tabs**, **Select**, **Input**, etc. inside **WizardContent** for rich step content.\n";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "impact-nova",
3
- "version": "1.7.50",
3
+ "version": "1.7.51",
4
4
  "description": "Enterprise-grade React design system built with React 19, Vite, Tailwind CSS, and Radix UI. Built-in internationalization (i18n) and comprehensive UI component library for scalable, accessible, and performant applications.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -348,13 +348,13 @@
348
348
  "types": "./dist/components/ui/command-palette/index.d.ts",
349
349
  "import": "./dist/components/ui/command-palette/index.js"
350
350
  },
351
- "./create-item-flow": {
352
- "types": "./dist/components/ui/create-item-flow/index.d.ts",
353
- "import": "./dist/components/ui/create-item-flow/index.js"
351
+ "./wizard": {
352
+ "types": "./dist/components/ui/wizard/index.d.ts",
353
+ "import": "./dist/components/ui/wizard/index.js"
354
354
  },
355
- "./report-card": {
356
- "types": "./dist/components/ui/report-card/index.d.ts",
357
- "import": "./dist/components/ui/report-card/index.js"
355
+ "./choice-card": {
356
+ "types": "./dist/components/ui/choice-card/index.d.ts",
357
+ "import": "./dist/components/ui/choice-card/index.js"
358
358
  },
359
359
  "./tailwind.config": {
360
360
  "types": "./tailwind.config.d.ts",
@@ -550,11 +550,11 @@
550
550
  "command-palette": [
551
551
  "dist/components/ui/command-palette/index.d.ts"
552
552
  ],
553
- "create-item-flow": [
554
- "dist/components/ui/create-item-flow/index.d.ts"
553
+ "wizard": [
554
+ "dist/components/ui/wizard/index.d.ts"
555
555
  ],
556
- "report-card": [
557
- "dist/components/ui/report-card/index.d.ts"
556
+ "choice-card": [
557
+ "dist/components/ui/choice-card/index.d.ts"
558
558
  ]
559
559
  }
560
560
  },
@@ -1,46 +0,0 @@
1
- import * as React from "react";
2
- export interface CreateItemFlowStep {
3
- /** Label shown under the stepper progress bar */
4
- label: string;
5
- /** Optional description for the step */
6
- description?: string;
7
- }
8
- export interface CreateItemFlowRootProps {
9
- /** Current active step (1-indexed) */
10
- step?: number;
11
- /** Total number of steps (auto-derived from steps[] if omitted) */
12
- totalSteps?: number;
13
- /** Step metadata for labels/descriptions */
14
- steps?: CreateItemFlowStep[];
15
- /** Callback when step changes */
16
- onStepChange?: (step: number) => void;
17
- children?: React.ReactNode;
18
- }
19
- declare const CreateItemFlowRoot: React.FC<CreateItemFlowRootProps>;
20
- declare const CreateItemFlowCard: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
21
- declare const CreateItemFlowLeftPanel: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
22
- declare const CreateItemFlowTitle: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLHeadingElement> & React.RefAttributes<HTMLHeadingElement>>;
23
- declare const CreateItemFlowDescription: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLParagraphElement> & React.RefAttributes<HTMLParagraphElement>>;
24
- export interface CreateItemFlowImageProps extends React.HTMLAttributes<HTMLDivElement> {
25
- /** Image source URL. If omitted, render children instead. */
26
- src?: string;
27
- /** Alt text for the image */
28
- alt?: string;
29
- }
30
- declare const CreateItemFlowImage: React.ForwardRefExoticComponent<CreateItemFlowImageProps & React.RefAttributes<HTMLDivElement>>;
31
- declare const CreateItemFlowRightPanel: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
32
- export interface CreateItemFlowStepperProps extends React.HTMLAttributes<HTMLDivElement> {
33
- /** Allow clicking on steps to navigate */
34
- clickable?: boolean;
35
- }
36
- declare const CreateItemFlowStepper: React.ForwardRefExoticComponent<CreateItemFlowStepperProps & React.RefAttributes<HTMLDivElement>>;
37
- declare const CreateItemFlowContentTitle: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLHeadingElement> & React.RefAttributes<HTMLHeadingElement>>;
38
- declare const CreateItemFlowContentDescription: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLParagraphElement> & React.RefAttributes<HTMLParagraphElement>>;
39
- declare const CreateItemFlowContent: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
40
- export interface CreateItemFlowStepContentProps extends React.HTMLAttributes<HTMLDivElement> {
41
- /** Which step this content belongs to (1-indexed) */
42
- forStep: number;
43
- }
44
- declare const CreateItemFlowStepContent: React.ForwardRefExoticComponent<CreateItemFlowStepContentProps & React.RefAttributes<HTMLDivElement>>;
45
- declare const CreateItemFlowFooter: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
46
- export { CreateItemFlowRoot, CreateItemFlowCard, CreateItemFlowLeftPanel, CreateItemFlowTitle, CreateItemFlowDescription, CreateItemFlowImage, CreateItemFlowRightPanel, CreateItemFlowStepper, CreateItemFlowContentTitle, CreateItemFlowContentDescription, CreateItemFlowContent, CreateItemFlowStepContent, CreateItemFlowFooter, };
@@ -1,231 +0,0 @@
1
- import { jsx as l } from "react/jsx-runtime";
2
- import * as r from "react";
3
- import { cn as n } from "../../../lib/utils.js";
4
- import C from "../../../icons/assets/createFlowImage.svg.js";
5
- const f = r.createContext(null), w = () => {
6
- const t = r.useContext(f);
7
- if (!t)
8
- throw new Error("CreateItemFlow.* components must be used within CreateItemFlowRoot");
9
- return t;
10
- }, u = ({
11
- step: t = 1,
12
- totalSteps: e,
13
- steps: o = [],
14
- onStepChange: a,
15
- children: m
16
- }) => {
17
- const s = e ?? o.length;
18
- return /* @__PURE__ */ l(f.Provider, { value: { step: t, totalSteps: s, steps: o, onStepChange: a }, children: m });
19
- };
20
- u.displayName = "CreateItemFlowRoot";
21
- const I = r.forwardRef(
22
- ({ className: t, children: e, ...o }, a) => /* @__PURE__ */ l(
23
- "div",
24
- {
25
- ref: a,
26
- className: n(
27
- "flex flex-row bg-canvas-elevated rounded-lg shadow-elevation-card overflow-hidden w-[83%] mx-auto min-w-0 flex-1",
28
- t
29
- ),
30
- ...o,
31
- children: e
32
- }
33
- )
34
- );
35
- I.displayName = "CreateItemFlowCard";
36
- const F = r.forwardRef(
37
- ({ className: t, children: e, ...o }, a) => /* @__PURE__ */ l(
38
- "div",
39
- {
40
- ref: a,
41
- className: n(
42
- "hidden lg:flex flex-col w-[300px] xl:w-[427px] shrink-0 bg-canvas-elevated border-r border-stroke-hairline pt-[100px]",
43
- t
44
- ),
45
- "data-slot": "left-panel",
46
- ...o,
47
- children: e
48
- }
49
- )
50
- );
51
- F.displayName = "CreateItemFlowLeftPanel";
52
- const N = r.forwardRef(
53
- ({ className: t, children: e, ...o }, a) => /* @__PURE__ */ l(
54
- "h1",
55
- {
56
- ref: a,
57
- className: n("font-manrope text-[24px] font-[800] leading-[36px] text-[#0D152C] mb-3 px-6 lg:px-10 xl:px-[64px]", t),
58
- ...o,
59
- children: e
60
- }
61
- )
62
- );
63
- N.displayName = "CreateItemFlowTitle";
64
- const g = r.forwardRef(
65
- ({ className: t, children: e, ...o }, a) => /* @__PURE__ */ l(
66
- "p",
67
- {
68
- ref: a,
69
- className: n("font-manrope text-[12px] font-[500] leading-[16px] text-[#7A8294] px-6 lg:px-10 xl:px-[64px]", t),
70
- ...o,
71
- children: e
72
- }
73
- )
74
- );
75
- g.displayName = "CreateItemFlowDescription";
76
- const h = r.forwardRef(
77
- ({ className: t, src: e, alt: o = "Create Item Flow", children: a, ...m }, s) => /* @__PURE__ */ l(
78
- "div",
79
- {
80
- ref: s,
81
- className: n(
82
- "mt-auto shrink-0 w-[200px] xl:w-[280px] h-[120px] xl:h-[166px] mx-auto xl:ml-[73px] xl:mr-[73px] mb-[100px]",
83
- t
84
- ),
85
- "data-slot": "left-panel-image",
86
- ...m,
87
- children: a || (e ? /* @__PURE__ */ l(
88
- "img",
89
- {
90
- src: e,
91
- alt: o,
92
- className: "w-full h-full object-contain"
93
- }
94
- ) : /* @__PURE__ */ l(
95
- C,
96
- {
97
- className: "w-full h-full",
98
- role: "img",
99
- "aria-label": o
100
- }
101
- ))
102
- }
103
- )
104
- );
105
- h.displayName = "CreateItemFlowImage";
106
- const v = r.forwardRef(
107
- ({ className: t, children: e, ...o }, a) => /* @__PURE__ */ l(
108
- "div",
109
- {
110
- ref: a,
111
- className: n(
112
- "flex flex-col flex-1 min-w-0 overflow-hidden pt-[50px] px-6 sm:px-10 md:px-16 lg:px-20 xl:px-[60px] 2xl:px-[190px] pb-[73px]",
113
- t
114
- ),
115
- "data-slot": "right-panel",
116
- ...o,
117
- children: e
118
- }
119
- )
120
- );
121
- v.displayName = "CreateItemFlowRightPanel";
122
- const y = r.forwardRef(
123
- ({ className: t, clickable: e = !0, ...o }, a) => {
124
- const { step: m, totalSteps: s, onStepChange: i } = w();
125
- return s <= 0 ? null : /* @__PURE__ */ l(
126
- "div",
127
- {
128
- ref: a,
129
- className: n("flex gap-2 mb-[42px] shrink-0", t),
130
- "data-slot": "stepper",
131
- role: "list",
132
- ...o,
133
- children: Array.from({ length: s }, (P, p) => {
134
- const d = p === m - 1, c = p < m - 1;
135
- return /* @__PURE__ */ l(
136
- "div",
137
- {
138
- role: "listitem",
139
- "aria-label": `Step ${p + 1} of ${s}`,
140
- "aria-current": d ? "step" : void 0,
141
- tabIndex: e && i ? 0 : void 0,
142
- onClick: () => e && i?.(p + 1),
143
- onKeyDown: e && i ? (x) => {
144
- (x.key === "Enter" || x.key === " ") && (x.preventDefault(), i(p + 1));
145
- } : void 0,
146
- className: n(
147
- "h-2 flex-1 max-w-[132px] rounded-[4px] transition-colors duration-300",
148
- d || c ? "bg-[#4259ee]" : "bg-[#e8eaf6]",
149
- e && i ? "cursor-pointer" : "cursor-default"
150
- )
151
- },
152
- p
153
- );
154
- })
155
- }
156
- );
157
- }
158
- );
159
- y.displayName = "CreateItemFlowStepper";
160
- const R = r.forwardRef(
161
- ({ className: t, children: e, ...o }, a) => /* @__PURE__ */ l(
162
- "h2",
163
- {
164
- ref: a,
165
- className: n("font-manrope text-[14px] font-[800] leading-[21px] text-[#0D152C]", t),
166
- ...o,
167
- children: e
168
- }
169
- )
170
- );
171
- R.displayName = "CreateItemFlowContentTitle";
172
- const b = r.forwardRef(
173
- ({ className: t, children: e, ...o }, a) => /* @__PURE__ */ l(
174
- "p",
175
- {
176
- ref: a,
177
- className: n("text-[14px] font-normal leading-relaxed text-content-muted", t),
178
- ...o,
179
- children: e
180
- }
181
- )
182
- );
183
- b.displayName = "CreateItemFlowContentDescription";
184
- const S = r.forwardRef(
185
- ({ className: t, children: e, ...o }, a) => /* @__PURE__ */ l(
186
- "div",
187
- {
188
- ref: a,
189
- className: n("flex-1 overflow-y-auto overflow-x-hidden min-h-0 p-0.5", t),
190
- "data-slot": "content",
191
- ...o,
192
- children: e
193
- }
194
- )
195
- );
196
- S.displayName = "CreateItemFlowContent";
197
- const D = r.forwardRef(
198
- ({ className: t, forStep: e, children: o, ...a }, m) => {
199
- const { step: s } = w();
200
- return s !== e ? null : /* @__PURE__ */ l("div", { ref: m, className: n(t), "data-step": e, ...a, children: o });
201
- }
202
- );
203
- D.displayName = "CreateItemFlowStepContent";
204
- const k = r.forwardRef(
205
- ({ className: t, children: e, ...o }, a) => /* @__PURE__ */ l(
206
- "div",
207
- {
208
- ref: a,
209
- className: n("flex items-center justify-between mt-auto shrink-0 pt-6 pb-[27px]", t),
210
- "data-slot": "footer",
211
- ...o,
212
- children: e
213
- }
214
- )
215
- );
216
- k.displayName = "CreateItemFlowFooter";
217
- export {
218
- I as CreateItemFlowCard,
219
- S as CreateItemFlowContent,
220
- b as CreateItemFlowContentDescription,
221
- R as CreateItemFlowContentTitle,
222
- g as CreateItemFlowDescription,
223
- k as CreateItemFlowFooter,
224
- h as CreateItemFlowImage,
225
- F as CreateItemFlowLeftPanel,
226
- v as CreateItemFlowRightPanel,
227
- u as CreateItemFlowRoot,
228
- D as CreateItemFlowStepContent,
229
- y as CreateItemFlowStepper,
230
- N as CreateItemFlowTitle
231
- };
@@ -1 +0,0 @@
1
- export { CreateItemFlowRoot, CreateItemFlowCard, CreateItemFlowLeftPanel, CreateItemFlowTitle, CreateItemFlowDescription, CreateItemFlowImage, CreateItemFlowRightPanel, CreateItemFlowStepper, CreateItemFlowContentTitle, CreateItemFlowContentDescription, CreateItemFlowContent, CreateItemFlowStepContent, CreateItemFlowFooter, type CreateItemFlowRootProps, type CreateItemFlowImageProps, type CreateItemFlowStep, type CreateItemFlowStepperProps, type CreateItemFlowStepContentProps, } from './create-item-flow';
@@ -1,16 +0,0 @@
1
- import { CreateItemFlowCard as o, CreateItemFlowContent as r, CreateItemFlowContentDescription as C, CreateItemFlowContentTitle as a, CreateItemFlowDescription as l, CreateItemFlowFooter as m, CreateItemFlowImage as F, CreateItemFlowLeftPanel as I, CreateItemFlowRightPanel as w, CreateItemFlowRoot as n, CreateItemFlowStepContent as i, CreateItemFlowStepper as p, CreateItemFlowTitle as c } from "./create-item-flow.js";
2
- export {
3
- o as CreateItemFlowCard,
4
- r as CreateItemFlowContent,
5
- C as CreateItemFlowContentDescription,
6
- a as CreateItemFlowContentTitle,
7
- l as CreateItemFlowDescription,
8
- m as CreateItemFlowFooter,
9
- F as CreateItemFlowImage,
10
- I as CreateItemFlowLeftPanel,
11
- w as CreateItemFlowRightPanel,
12
- n as CreateItemFlowRoot,
13
- i as CreateItemFlowStepContent,
14
- p as CreateItemFlowStepper,
15
- c as CreateItemFlowTitle
16
- };
@@ -1 +0,0 @@
1
- export { ReportCardRoot, ReportCardRadio, ReportCardContent, ReportCardIcon, ReportCardTitle, ReportCardTitleRow, ReportCardDescription, type ReportCardRootProps, type ReportCardContentProps, type ReportCardTitleRowProps, } from './report-card';
@@ -1,10 +0,0 @@
1
- import { ReportCardContent as t, ReportCardDescription as e, ReportCardIcon as R, ReportCardRadio as p, ReportCardRoot as a, ReportCardTitle as d, ReportCardTitleRow as C } from "./report-card.js";
2
- export {
3
- t as ReportCardContent,
4
- e as ReportCardDescription,
5
- R as ReportCardIcon,
6
- p as ReportCardRadio,
7
- a as ReportCardRoot,
8
- d as ReportCardTitle,
9
- C as ReportCardTitleRow
10
- };
@@ -1,19 +0,0 @@
1
- import * as React from "react";
2
- export interface ReportCardRootProps extends React.HTMLAttributes<HTMLDivElement> {
3
- /** Whether this card is currently selected */
4
- selected?: boolean;
5
- }
6
- declare const ReportCardRoot: React.ForwardRefExoticComponent<ReportCardRootProps & React.RefAttributes<HTMLDivElement>>;
7
- declare const ReportCardRadio: React.FC<{
8
- className?: string;
9
- }>;
10
- export type ReportCardContentProps = React.HTMLAttributes<HTMLDivElement>;
11
- declare const ReportCardContent: React.ForwardRefExoticComponent<ReportCardContentProps & React.RefAttributes<HTMLDivElement>>;
12
- declare const ReportCardIcon: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
13
- declare const ReportCardTitle: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLHeadingElement> & React.RefAttributes<HTMLHeadingElement>>;
14
- export interface ReportCardTitleRowProps extends React.HTMLAttributes<HTMLDivElement> {
15
- children?: React.ReactNode;
16
- }
17
- declare const ReportCardTitleRow: React.ForwardRefExoticComponent<ReportCardTitleRowProps & React.RefAttributes<HTMLDivElement>>;
18
- declare const ReportCardDescription: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLParagraphElement> & React.RefAttributes<HTMLParagraphElement>>;
19
- export { ReportCardRoot, ReportCardRadio, ReportCardContent, ReportCardIcon, ReportCardTitle, ReportCardTitleRow, ReportCardDescription, };
@@ -1,146 +0,0 @@
1
- import { jsx as a } from "react/jsx-runtime";
2
- import * as s from "react";
3
- import { cn as d } from "../../../lib/utils.js";
4
- const p = s.createContext({ selected: !1 }), x = "var(--Colors-Neutrals-Border-Subtle, #D9DDE7)", v = "var(--Colors-Primary-Surface-Default, #4259EE)", b = "linear-gradient(281deg, var(--Colors-Greys-50, #FAFAFA) 1.7%, var(--Colors-Greys-0, #FFF) 69.58%, var(--Colors-Greys-50, #FAFAFA) 97.56%)", g = "linear-gradient(281deg, var(--Colors-Blue_01-100, #ECEEFD) 1.7%, #FFF 48.25%, var(--Colors-Blue_01-100, #ECEEFD) 97.56%)", E = s.forwardRef(
5
- ({ className: r, selected: e = !1, children: o, style: t, onMouseEnter: f, onMouseLeave: m, ...u }, C) => {
6
- const [R, l] = s.useState(!1), c = e || R, n = c ? v : x;
7
- return /* @__PURE__ */ a(p.Provider, { value: { selected: e }, children: /* @__PURE__ */ a(
8
- "div",
9
- {
10
- ref: C,
11
- style: {
12
- width: "331px",
13
- height: "132px",
14
- padding: "12px",
15
- flexDirection: "column",
16
- alignItems: "flex-start",
17
- gap: "12px",
18
- borderRadius: "12px",
19
- borderTop: `1px solid ${n}`,
20
- borderRight: `1px solid ${n}`,
21
- borderBottom: `2px solid ${n}`,
22
- borderLeft: `4px solid ${n}`,
23
- background: c ? g : b,
24
- transition: "border-color 150ms ease, background 150ms ease",
25
- ...t
26
- },
27
- className: d(
28
- "relative flex cursor-pointer select-none",
29
- "outline-none focus:outline-none focus-visible:outline-none focus:ring-0 focus-visible:ring-0",
30
- r
31
- ),
32
- "data-component": "report-card",
33
- "data-selected": e || void 0,
34
- role: "option",
35
- "aria-selected": e,
36
- tabIndex: 0,
37
- onMouseEnter: (i) => {
38
- l(!0), f?.(i);
39
- },
40
- onMouseLeave: (i) => {
41
- l(!1), m?.(i);
42
- },
43
- ...u,
44
- children: o
45
- }
46
- ) });
47
- }
48
- );
49
- E.displayName = "ReportCardRoot";
50
- const D = ({ className: r }) => {
51
- const { selected: e } = s.useContext(p);
52
- return /* @__PURE__ */ a(
53
- "div",
54
- {
55
- className: d(
56
- "w-5 h-5 rounded-full border-2 flex items-center justify-center shrink-0 transition-colors",
57
- e ? "border-brand" : "border-[#C1C7D4]",
58
- r
59
- ),
60
- "aria-hidden": "true",
61
- children: e && /* @__PURE__ */ a("div", { className: "w-2.5 h-2.5 rounded-full bg-brand" })
62
- }
63
- );
64
- };
65
- D.displayName = "ReportCardRadio";
66
- const F = s.forwardRef(
67
- ({ className: r, children: e, ...o }, t) => /* @__PURE__ */ a(
68
- "div",
69
- {
70
- ref: t,
71
- className: d("flex flex-col items-start gap-2 w-full", r),
72
- "data-slot": "report-card-content",
73
- ...o,
74
- children: e
75
- }
76
- )
77
- );
78
- F.displayName = "ReportCardContent";
79
- const N = s.forwardRef(
80
- ({ className: r, children: e, ...o }, t) => /* @__PURE__ */ a(
81
- "div",
82
- {
83
- ref: t,
84
- className: d(
85
- "flex items-center justify-center shrink-0",
86
- r
87
- ),
88
- "data-slot": "report-card-icon",
89
- ...o,
90
- children: e
91
- }
92
- )
93
- );
94
- N.displayName = "ReportCardIcon";
95
- const w = s.forwardRef(
96
- ({ className: r, children: e, ...o }, t) => /* @__PURE__ */ a(
97
- "h3",
98
- {
99
- ref: t,
100
- className: d(
101
- "font-manrope text-[16px] font-medium leading-[125%] text-[#0D152C] capitalize",
102
- r
103
- ),
104
- ...o,
105
- children: e
106
- }
107
- )
108
- );
109
- w.displayName = "ReportCardTitle";
110
- const y = s.forwardRef(
111
- ({ className: r, children: e, ...o }, t) => /* @__PURE__ */ a(
112
- "div",
113
- {
114
- ref: t,
115
- className: d("flex items-center gap-1 w-full", r),
116
- "data-slot": "report-card-title-row",
117
- ...o,
118
- children: e
119
- }
120
- )
121
- );
122
- y.displayName = "ReportCardTitleRow";
123
- const h = s.forwardRef(
124
- ({ className: r, children: e, ...o }, t) => /* @__PURE__ */ a(
125
- "p",
126
- {
127
- ref: t,
128
- className: d(
129
- "font-manrope text-[12px] font-medium leading-[16px] text-[#60697D]",
130
- r
131
- ),
132
- ...o,
133
- children: e
134
- }
135
- )
136
- );
137
- h.displayName = "ReportCardDescription";
138
- export {
139
- F as ReportCardContent,
140
- h as ReportCardDescription,
141
- N as ReportCardIcon,
142
- D as ReportCardRadio,
143
- E as ReportCardRoot,
144
- w as ReportCardTitle,
145
- y as ReportCardTitleRow
146
- };