@machinemetrics/mm-react-components 1.4.1 → 1.5.0-0

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 (205) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +27 -0
  3. package/agent-docs/agent-documentation-reference.md +106 -13
  4. package/agent-docs/ai-agent-guide.md +2 -0
  5. package/agent-docs/ai-agent-init-guide.md +1 -1
  6. package/agent-docs/component-mapping-reference.md +3 -1
  7. package/agent-docs/cursor-skill-mm-carbide.md +1 -1
  8. package/agent-docs/lovable.md +1 -0
  9. package/agent-docs/tickets-pattern.md +78 -0
  10. package/dist/README.md +27 -0
  11. package/dist/components/ui/accordion.d.ts +9 -2
  12. package/dist/components/ui/accordion.d.ts.map +1 -1
  13. package/dist/components/ui/alert-dialog.d.ts +11 -2
  14. package/dist/components/ui/alert-dialog.d.ts.map +1 -1
  15. package/dist/components/ui/alert.d.ts +4 -3
  16. package/dist/components/ui/alert.d.ts.map +1 -1
  17. package/dist/components/ui/avatar.d.ts +5 -1
  18. package/dist/components/ui/avatar.d.ts.map +1 -1
  19. package/dist/components/ui/breadcrumb.d.ts +9 -1
  20. package/dist/components/ui/breadcrumb.d.ts.map +1 -1
  21. package/dist/components/ui/button.d.ts +7 -1
  22. package/dist/components/ui/button.d.ts.map +1 -1
  23. package/dist/components/ui/card.d.ts +25 -3
  24. package/dist/components/ui/card.d.ts.map +1 -1
  25. package/dist/components/ui/collapsible.d.ts +22 -1
  26. package/dist/components/ui/collapsible.d.ts.map +1 -1
  27. package/dist/components/ui/command.d.ts +3 -0
  28. package/dist/components/ui/command.d.ts.map +1 -1
  29. package/dist/components/ui/data-table/pagination.d.ts.map +1 -1
  30. package/dist/components/ui/data-table/toolbar/DataTableToolbar.d.ts.map +1 -1
  31. package/dist/components/ui/data-table/toolbar/filters/FilterControl.d.ts +14 -0
  32. package/dist/components/ui/data-table/toolbar/filters/FilterControl.d.ts.map +1 -0
  33. package/dist/components/ui/data-table/toolbar/filters/FilterMenu.d.ts.map +1 -1
  34. package/dist/components/ui/data-table/toolbar/filters/InlineFilterMenu.d.ts +13 -0
  35. package/dist/components/ui/data-table/toolbar/filters/InlineFilterMenu.d.ts.map +1 -0
  36. package/dist/components/ui/data-table/toolbar/filters/index.d.ts +2 -0
  37. package/dist/components/ui/data-table/toolbar/filters/index.d.ts.map +1 -1
  38. package/dist/components/ui/date-picker.d.ts +8 -1
  39. package/dist/components/ui/date-picker.d.ts.map +1 -1
  40. package/dist/components/ui/date-range-picker/get-range-calendar-selected.d.ts +8 -0
  41. package/dist/components/ui/date-range-picker/get-range-calendar-selected.d.ts.map +1 -0
  42. package/dist/components/ui/date-range-picker/hooks/use-date-range-picker-state.d.ts +38 -0
  43. package/dist/components/ui/date-range-picker/hooks/use-date-range-picker-state.d.ts.map +1 -0
  44. package/dist/components/ui/date-range-picker/index.d.ts +9 -0
  45. package/dist/components/ui/date-range-picker/index.d.ts.map +1 -0
  46. package/dist/components/ui/date-range-picker/parts/company-day-settings-row.d.ts +7 -0
  47. package/dist/components/ui/date-range-picker/parts/company-day-settings-row.d.ts.map +1 -0
  48. package/dist/components/ui/date-range-picker/parts/custom-hours-selects.d.ts +8 -0
  49. package/dist/components/ui/date-range-picker/parts/custom-hours-selects.d.ts.map +1 -0
  50. package/dist/components/ui/date-range-picker/parts/date-range-picker-cancel-apply-buttons.d.ts +10 -0
  51. package/dist/components/ui/date-range-picker/parts/date-range-picker-cancel-apply-buttons.d.ts.map +1 -0
  52. package/dist/components/ui/date-range-picker/parts/date-range-picker-clear-button.d.ts +5 -0
  53. package/dist/components/ui/date-range-picker/parts/date-range-picker-clear-button.d.ts.map +1 -0
  54. package/dist/components/ui/date-range-picker/parts/date-range-picker-trigger.d.ts +24 -0
  55. package/dist/components/ui/date-range-picker/parts/date-range-picker-trigger.d.ts.map +1 -0
  56. package/dist/components/ui/date-range-picker/parts/dual-month-range-calendars.d.ts +15 -0
  57. package/dist/components/ui/date-range-picker/parts/dual-month-range-calendars.d.ts.map +1 -0
  58. package/dist/components/ui/date-range-picker/parts/full-variant-header.d.ts +2 -0
  59. package/dist/components/ui/date-range-picker/parts/full-variant-header.d.ts.map +1 -0
  60. package/dist/components/ui/date-range-picker/parts/preset-sidebar.d.ts +9 -0
  61. package/dist/components/ui/date-range-picker/parts/preset-sidebar.d.ts.map +1 -0
  62. package/dist/components/ui/date-range-picker/parts/range-calendar.d.ts +16 -0
  63. package/dist/components/ui/date-range-picker/parts/range-calendar.d.ts.map +1 -0
  64. package/dist/components/ui/date-range-picker/presets.d.ts +34 -0
  65. package/dist/components/ui/date-range-picker/presets.d.ts.map +1 -0
  66. package/dist/components/ui/date-range-picker/types.d.ts +29 -0
  67. package/dist/components/ui/date-range-picker/types.d.ts.map +1 -0
  68. package/dist/components/ui/date-range-picker/utils.d.ts +24 -0
  69. package/dist/components/ui/date-range-picker/utils.d.ts.map +1 -0
  70. package/dist/components/ui/date-range-picker/variants/full.d.ts +11 -0
  71. package/dist/components/ui/date-range-picker/variants/full.d.ts.map +1 -0
  72. package/dist/components/ui/date-range-picker/variants/simple.d.ts +9 -0
  73. package/dist/components/ui/date-range-picker/variants/simple.d.ts.map +1 -0
  74. package/dist/components/ui/date-range-picker.d.ts +2 -8
  75. package/dist/components/ui/date-range-picker.d.ts.map +1 -1
  76. package/dist/components/ui/dialog.d.ts +12 -2
  77. package/dist/components/ui/dialog.d.ts.map +1 -1
  78. package/dist/components/ui/drawer.d.ts +16 -2
  79. package/dist/components/ui/drawer.d.ts.map +1 -1
  80. package/dist/components/ui/form.d.ts +19 -1
  81. package/dist/components/ui/form.d.ts.map +1 -1
  82. package/dist/components/ui/kanban/KanbanBoard.d.ts +8 -0
  83. package/dist/components/ui/kanban/KanbanBoard.d.ts.map +1 -0
  84. package/dist/components/ui/kanban/KanbanCard.d.ts +8 -0
  85. package/dist/components/ui/kanban/KanbanCard.d.ts.map +1 -0
  86. package/dist/components/ui/kanban/KanbanCardOverlay.d.ts +8 -0
  87. package/dist/components/ui/kanban/KanbanCardOverlay.d.ts.map +1 -0
  88. package/dist/components/ui/kanban/KanbanColumn.d.ts +8 -0
  89. package/dist/components/ui/kanban/KanbanColumn.d.ts.map +1 -0
  90. package/dist/components/ui/kanban/KanbanContext.d.ts +28 -0
  91. package/dist/components/ui/kanban/KanbanContext.d.ts.map +1 -0
  92. package/dist/components/ui/kanban/dragEndUtils.d.ts +26 -0
  93. package/dist/components/ui/kanban/dragEndUtils.d.ts.map +1 -0
  94. package/dist/components/ui/kanban/index.d.ts +9 -0
  95. package/dist/components/ui/kanban/index.d.ts.map +1 -0
  96. package/dist/components/ui/kanban/types.d.ts +58 -0
  97. package/dist/components/ui/kanban/types.d.ts.map +1 -0
  98. package/dist/components/ui/pagination.d.ts +21 -0
  99. package/dist/components/ui/pagination.d.ts.map +1 -1
  100. package/dist/components/ui/popover.d.ts +11 -2
  101. package/dist/components/ui/popover.d.ts.map +1 -1
  102. package/dist/components/ui/select.d.ts +10 -2
  103. package/dist/components/ui/select.d.ts.map +1 -1
  104. package/dist/components/ui/sheet-banner.d.ts +1 -1
  105. package/dist/components/ui/sheet-banner.d.ts.map +1 -1
  106. package/dist/components/ui/sonner.d.ts +4 -1
  107. package/dist/components/ui/sonner.d.ts.map +1 -1
  108. package/dist/components/ui/status/index.d.ts +7 -0
  109. package/dist/components/ui/status/index.d.ts.map +1 -0
  110. package/dist/components/ui/status/status-badge.d.ts +17 -0
  111. package/dist/components/ui/status/status-badge.d.ts.map +1 -0
  112. package/dist/components/ui/status/status-intent.d.ts +21 -0
  113. package/dist/components/ui/status/status-intent.d.ts.map +1 -0
  114. package/dist/components/ui/status/status-progress.d.ts +20 -0
  115. package/dist/components/ui/status/status-progress.d.ts.map +1 -0
  116. package/dist/components/ui/table.d.ts +8 -2
  117. package/dist/components/ui/table.d.ts.map +1 -1
  118. package/dist/components/ui/tabs/index.d.ts +6 -0
  119. package/dist/components/ui/tabs/index.d.ts.map +1 -0
  120. package/dist/components/ui/tabs/scroll-tabs-row.d.ts +6 -0
  121. package/dist/components/ui/tabs/scroll-tabs-row.d.ts.map +1 -0
  122. package/dist/components/ui/tabs/tabs-constants.d.ts +11 -0
  123. package/dist/components/ui/tabs/tabs-constants.d.ts.map +1 -0
  124. package/dist/components/ui/tabs/tabs-content.d.ts +5 -0
  125. package/dist/components/ui/tabs/tabs-content.d.ts.map +1 -0
  126. package/dist/components/ui/tabs/tabs-context.d.ts +9 -0
  127. package/dist/components/ui/tabs/tabs-context.d.ts.map +1 -0
  128. package/dist/components/ui/tabs/tabs-list-underline.d.ts +7 -0
  129. package/dist/components/ui/tabs/tabs-list-underline.d.ts.map +1 -0
  130. package/dist/components/ui/tabs/tabs-list.d.ts +8 -0
  131. package/dist/components/ui/tabs/tabs-list.d.ts.map +1 -0
  132. package/dist/components/ui/tabs/tabs-trigger.d.ts +7 -0
  133. package/dist/components/ui/tabs/tabs-trigger.d.ts.map +1 -0
  134. package/dist/components/ui/tabs/tabs-variants.d.ts +7 -0
  135. package/dist/components/ui/tabs/tabs-variants.d.ts.map +1 -0
  136. package/dist/components/ui/tabs/tabs.d.ts +15 -0
  137. package/dist/components/ui/tabs/tabs.d.ts.map +1 -0
  138. package/dist/components/ui/tabs/use-tabs-underline-scroll.d.ts +15 -0
  139. package/dist/components/ui/tabs/use-tabs-underline-scroll.d.ts.map +1 -0
  140. package/dist/components/ui/tabs.d.ts +5 -26
  141. package/dist/components/ui/tabs.d.ts.map +1 -1
  142. package/dist/components/ui/tickets/TicketActivitySection.d.ts +20 -0
  143. package/dist/components/ui/tickets/TicketActivitySection.d.ts.map +1 -0
  144. package/dist/components/ui/tickets/TicketDates.d.ts +20 -0
  145. package/dist/components/ui/tickets/TicketDates.d.ts.map +1 -0
  146. package/dist/components/ui/tickets/TicketDetailLayout.d.ts +32 -0
  147. package/dist/components/ui/tickets/TicketDetailLayout.d.ts.map +1 -0
  148. package/dist/components/ui/tickets/TicketDetails.d.ts +34 -0
  149. package/dist/components/ui/tickets/TicketDetails.d.ts.map +1 -0
  150. package/dist/components/ui/tickets/TicketDetailsSidebar.d.ts +21 -0
  151. package/dist/components/ui/tickets/TicketDetailsSidebar.d.ts.map +1 -0
  152. package/dist/components/ui/tickets/TicketFieldControl.d.ts +32 -0
  153. package/dist/components/ui/tickets/TicketFieldControl.d.ts.map +1 -0
  154. package/dist/components/ui/tickets/TicketForm.d.ts +22 -0
  155. package/dist/components/ui/tickets/TicketForm.d.ts.map +1 -0
  156. package/dist/components/ui/tickets/TicketLabels.d.ts +57 -0
  157. package/dist/components/ui/tickets/TicketLabels.d.ts.map +1 -0
  158. package/dist/components/ui/tickets/TicketTypes.d.ts +67 -0
  159. package/dist/components/ui/tickets/TicketTypes.d.ts.map +1 -0
  160. package/dist/components/ui/tickets/TicketUserSelect.d.ts +17 -0
  161. package/dist/components/ui/tickets/TicketUserSelect.d.ts.map +1 -0
  162. package/dist/components/ui/tickets/UserDisplay.d.ts +21 -0
  163. package/dist/components/ui/tickets/UserDisplay.d.ts.map +1 -0
  164. package/dist/components/ui/tickets/UserFieldValue.d.ts +24 -0
  165. package/dist/components/ui/tickets/UserFieldValue.d.ts.map +1 -0
  166. package/dist/components/ui/tickets/index.d.ts +12 -0
  167. package/dist/components/ui/tickets/index.d.ts.map +1 -0
  168. package/dist/components/ui/toggle-group.d.ts +6 -0
  169. package/dist/components/ui/toggle-group.d.ts.map +1 -1
  170. package/dist/components/ui/tooltip.d.ts +6 -1
  171. package/dist/components/ui/tooltip.d.ts.map +1 -1
  172. package/dist/cursor-skill/mm-carbide/SKILL.md +16 -4
  173. package/dist/cursor-skill/mm-carbide/reference.md +15 -3
  174. package/dist/docs/GETTING_STARTED.md +26 -0
  175. package/dist/index.d.ts +20 -3
  176. package/dist/index.d.ts.map +1 -1
  177. package/dist/lib/mm-react-components.css +1 -1
  178. package/dist/lib/normalize-host-color-mode.d.ts +6 -0
  179. package/dist/lib/normalize-host-color-mode.d.ts.map +1 -0
  180. package/dist/lib/theme-root.d.ts +18 -0
  181. package/dist/lib/theme-root.d.ts.map +1 -0
  182. package/dist/lib/use-host-theme.d.ts +15 -0
  183. package/dist/lib/use-host-theme.d.ts.map +1 -0
  184. package/dist/lib/with-display-name.d.ts +2 -0
  185. package/dist/lib/with-display-name.d.ts.map +1 -0
  186. package/dist/mm-react-components.es.js +971 -816
  187. package/dist/mm-react-components.es.js.map +1 -1
  188. package/dist/mm-react-components.umd.js +1 -1
  189. package/dist/mm-react-components.umd.js.map +1 -1
  190. package/dist/preview/AccordionPreview.d.ts.map +1 -1
  191. package/dist/preview/BreadcrumbPreview.d.ts.map +1 -1
  192. package/dist/preview/ButtonPreview.d.ts.map +1 -1
  193. package/dist/preview/CardPreview.d.ts.map +1 -1
  194. package/dist/preview/CollapsiblePreview.d.ts.map +1 -1
  195. package/dist/preview/DataTableLimitationsPreview.d.ts.map +1 -1
  196. package/dist/preview/DateRangePickerPreview.d.ts.map +1 -1
  197. package/dist/preview/KanbanPreview.d.ts +2 -0
  198. package/dist/preview/KanbanPreview.d.ts.map +1 -0
  199. package/dist/preview/SheetBannerPreview.d.ts.map +1 -1
  200. package/dist/preview/StatusPreview.d.ts +2 -0
  201. package/dist/preview/StatusPreview.d.ts.map +1 -0
  202. package/dist/preview/TicketsPreview.d.ts +2 -0
  203. package/dist/preview/TicketsPreview.d.ts.map +1 -0
  204. package/dist/themes/carbide.css +217 -1
  205. package/package.json +5 -1
package/CHANGELOG.md CHANGED
@@ -96,6 +96,37 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
96
96
 
97
97
  - Preview app: `CodePreview` route remains hash-only for tests; sidebar exclusions updated. Preview build trims `esbuild.keepNames` where snippet naming no longer requires it.
98
98
 
99
+ ## [Unreleased]
100
+
101
+ ### Changed
102
+
103
+ - **TicketDetails:** Two-column **narrative + metadata** layout: header includes ticket id, title, and **status / priority / due** (keys `status`, `priority`, `dueDate`, `due`); main column is **description** then **Activity** with **All / Comments / Updates** tabs; right rail is **Details** (people), **Dates**, and **Custom fields** with optional **Show more** and sticky positioning on large viewports. Optional `onBack` and `onAddCustomField`. `data-slot` hooks for Carbide theming.
104
+ - **`partitionDetailFields`:** Now returns `headerFields`, `mainColumnFields`, `sidebarPeopleFields`, `sidebarDateFields`, `sidebarCustomFields`, and composed `sidebarFields` (people → dates → custom). `assignee` key maps to the people rail. **Breaking for consumers** that assumed `status` / `priority` / `dueDate` lived only in `sidebarFields` or that `otherMainFields` rendered in the main column — those fields are repositioned in the default `TicketDetails` shell (see `PartitionDetailFieldsResult`).
105
+
106
+ ### Added
107
+
108
+ - **`TicketSystemEvent`** and optional `TicketDetails` prop **`systemEvents`** for the Updates timeline and All-tab merge.
109
+ - **`TicketFieldControl`:** optional **`layout="inline"`** for compact header controls; **`date`** fields use the Carbide **`DatePicker`** (not native `<input type="date">`).
110
+ - **`DatePicker`:** optional **`triggerClassName`** for trigger button styling; optional **`aria-invalid`** / **`aria-describedby`** on the trigger; **controlled `month`** resets when the popover opens so the calendar shows the **selected date’s month** (or `defaultMonth` / today when empty).
111
+ - **`TicketForm`:** **`date`** fields use **`DatePicker`** (not native `<input type="date">`).
112
+ - **`parseTicketDateString`** / **`formatTicketDateString`** exported from the tickets module for host apps.
113
+ - **`TicketFieldType` `updatedDate`:** Read-only timestamp for “last updated” (and similar). Renders as styled text in **`TicketForm`** and **`TicketDetails`** — never an `<input>`. Use **`formatTicketTimestampDisplay`** for custom UIs; value is typically ISO or `YYYY-MM-DD` on the ticket payload.
114
+ - **`TicketDetailsLabels`:** strings for activity tabs, sidebar section titles, back button, show more/less, add field, and comment body label.
115
+
116
+ ## [1.3.0] - 2026-03-19
117
+
118
+ ### Changed
119
+
120
+ - **TicketDetails** (formerly `TicketDetailSheet`): Renders **detail content only** (no outer `Sheet`), same presentation-only model as `TicketForm`. No `open` / `onClose` / `onOpen`; the host controls visibility and chrome (e.g. `Sheet` + `SheetContent` with its own close). Renamed exports: `TicketDetails`, `TicketDetailsProps`, `TicketDetailsLabels`, `defaultTicketDetailsLabels`, `mergeTicketDetailsLabels`. Removed `closeAriaLabel` from detail labels (library no longer renders a close control).
121
+ - **Tickets module file names:** Renamed to PascalCase under `src/components/ui/tickets/` (`TicketTypes.ts`, `TicketLabels.ts`, `UserFieldValue.ts`, `TicketUserSelect.tsx`, `TicketDates.ts`, `TicketDetailLayout.ts`) for consistency with other feature folders.
122
+
123
+ ### Added
124
+
125
+ - **Ticket pattern components:** `TicketForm`, `TicketDetails`, `TicketFieldControl`, and `UserDisplay` for schema-driven ticket create/edit and detail UI. Host apps inject `userSelectComponent` and own persistence (`onSubmit`, `onCancel`, `onValuesChange`, `onPostComment`). Optional `labels` props override default copy.
126
+ - **Ticket utilities and types:** Exported `Ticket`, `TicketFieldDefinition`, `Comment`, and helpers (`fieldKeyToHeader`, `getMergedDetailFields`, `partitionDetailFields`, `formatCreationDate`, `formatRelativeTime`, user-field JSON helpers).
127
+ - **Docs:** `src/components/ui/tickets/README.md`, `agent-docs/tickets-pattern.md`, and agent-documentation-reference table entry.
128
+ - **Kanban:** Compound `KanbanBoard`, `KanbanColumn`, `KanbanCard`, and `KanbanCardOverlay` with `@dnd-kit` drag-and-drop. Helpers `dataToKanbanItems`, `normalizeToKanbanColumn`, and `computeMoveFromDragEnd` map table-shaped data to board items and derive moves from drag-end events. Column chrome uses `SheetBanner`; README, preview, Playwright visual tests, and agent-documentation-reference updates.
129
+
99
130
  ---
100
131
 
101
132
  ## [1.2.3] - 2026-03-23
package/README.md CHANGED
@@ -186,6 +186,33 @@ document.documentElement.classList.add('carbide');
186
186
  - You want to minimize bundle size
187
187
  - You're using our components with your own Tailwind config
188
188
 
189
+ #### Embedded apps: `ThemeRoot` and `useHostTheme`
190
+
191
+ For apps hosted inside the MachineMetrics shell (or any host that passes a light/dark value), wrap the tree once and sync the host value—no `next-themes` setup boilerplate.
192
+
193
+ `ThemeRoot` wraps your React tree (e.g. inside `#root`). It does **not** replace `<html>` in `index.html`; it still toggles `light` / `dark` on `document.documentElement`. Keep `class="carbide"` on `<html>` and import Carbide CSS as usual.
194
+
195
+ ```tsx
196
+ // index.tsx
197
+ import { ThemeRoot } from '@machinemetrics/mm-react-components';
198
+
199
+ <ThemeRoot>
200
+ <App />
201
+ </ThemeRoot>
202
+ ```
203
+
204
+ ```tsx
205
+ // App.tsx — pass the host color mode (example: mm-react-tools)
206
+ import { useHostTheme } from '@machinemetrics/mm-react-components';
207
+ import { useMMAppParams } from '@machinemetrics/mm-react-tools';
208
+
209
+ useHostTheme(useMMAppParams().colorMode);
210
+ ```
211
+
212
+ If you need `useTheme()` elsewhere (e.g. markdown styling), import it from **`@machinemetrics/mm-react-components`** so it uses the same context as `ThemeRoot`—not from the `next-themes` package directly.
213
+
214
+ Optional: pass any `ThemeProvider` prop to `ThemeRoot` to override defaults (e.g. `storageKey` for standalone persistence).
215
+
189
216
  #### Option 3: Use Theme Utilities
190
217
 
191
218
  ```tsx
@@ -54,14 +54,16 @@ This directory contains comprehensive documentation and tools for AI agents work
54
54
 
55
55
  ### Layout & Navigation
56
56
 
57
- | Component | Exports | Description |
58
- | -------------- | --------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
59
- | **Card** | `Card`, `CardHeader`, `CardTitle`, `CardDescription`, `CardContent`, `CardFooter` | Content container with sections (no built-in scroll) |
60
- | **ScrollArea** | `ScrollArea`, `ScrollBar` | Scrollable region; **must have constrained height** (e.g. `h-[300px]`, `max-h-[50vh]`, or `flex-1 min-h-0` in flex layout) or it won’t scroll |
61
- | **Separator** | `Separator` | Visual divider |
62
- | **Tabs** | `Tabs`, `TabsList`, `TabsTrigger`, `TabsContent` | Tabbed interface |
63
- | **Breadcrumb** | `Breadcrumb`, `BreadcrumbList`, `BreadcrumbItem`, `BreadcrumbLink`, `BreadcrumbPage`, `BreadcrumbSeparator`, `BreadcrumbEllipsis` | Navigation breadcrumbs |
64
- | **PageHeader** | `PageHeader` (+ types) | Application page header with actions/tabs |
57
+ | Component | Exports | Description |
58
+ | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
59
+ | **ResizablePanelGroup** | `ResizablePanelGroup`, `ResizablePanel`, `ResizableHandle` | Split layouts with drag-to-resize; use for workspaces, dashboards, IDE-like UIs |
60
+ | **Sidebar** | `Sidebar`, `SidebarProvider`, `SidebarInset`, `SidebarHeader`, `SidebarContent`, `SidebarMenu`, `SidebarMenuItem`, `SidebarMenuButton`, `SidebarTrigger`, etc. | Navigation panel; collapsible to icons; use for app nav, not generic content |
61
+ | **Card** | `Card`, `CardHeader`, `CardTitle`, `CardDescription`, `CardContent`, `CardFooter` | Discrete content blocks (summary, form section, metric); **not** for structural layout or panels (no built-in scroll) |
62
+ | **ScrollArea** | `ScrollArea`, `ScrollBar` | Scrollable region; **must have constrained height** (e.g. `h-[300px]`, `max-h-[50vh]`, or `flex-1 min-h-0` in flex layout) or it won’t scroll |
63
+ | **Separator** | `Separator` | Visual divider |
64
+ | **Tabs** | `Tabs`, `TabsList`, `TabsTrigger`, `TabsContent` | Tabbed interface |
65
+ | **Breadcrumb** | `Breadcrumb`, `BreadcrumbList`, `BreadcrumbItem`, `BreadcrumbLink`, `BreadcrumbPage`, `BreadcrumbSeparator`, `BreadcrumbEllipsis` | Navigation breadcrumbs |
66
+ | **PageHeader** | `PageHeader` (+ types) | Application page header with actions/tabs |
65
67
 
66
68
  ### Overlays & Modals
67
69
 
@@ -96,18 +98,20 @@ This directory contains comprehensive documentation and tools for AI agents work
96
98
 
97
99
  ### Advanced Components
98
100
 
99
- | Component | Exports | Description |
100
- | ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
101
+ | Component | Exports | Description |
102
+ | ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
101
103
  | **DataTable** | `DataTable`, `DataTablePagination`, `ResponsiveTable`, `TABLE_TOKENS`, column creators, `useTableController`, `UseTableControllerReturn`, toolbar, CSV export (+ types); optional **`controller`** prop to share state with `FileGrid` | Full-featured data table with sorting, filtering, pagination (client-side & server-side) |
102
104
  | **Thumbnail** | `Thumbnail` (+ types) | Bordered thumbnail shell with optional footer (`data-slot` for Carbide) |
103
- | **FileIcon** | `FileIcon`, `FileIconGlyph`, `inferFileIconKind`, `getExtensionFromFileName`, `formatFileIconExtensionLabel` (+ types) | File glyph + label from extension inference or overrides |
105
+ | **FileIcon** | `FileIcon`, `FileIconGlyph`, `inferFileIconKind`, `getExtensionFromFileName`, `formatFileIconExtensionLabel` (+ types) | File glyph + label from extension inference or overrides |
104
106
  | **FileThumbnail** | `FileThumbnail` (+ types); `FileThumbnailBadgeConfig` | Button wrapping `Thumbnail` + `FileIcon` and optional badge |
105
107
  | **FileGrid** | `FileGrid` (+ types) | Icon grid bound to a TanStack `Table` (same `controller` as `DataTable`) |
106
108
  | **HeroMetricCard** | `HeroMetricCard`, `HeroMetricCardItem` (+ types) | Metrics dashboard card with trends |
107
109
  | **Calendar** | `Calendar` | Date picker calendar |
108
110
  | **DatePicker** | `DatePicker` | Single date selection with label and placeholder |
109
- | **DateRangePicker** | `DateRangePicker` | Date range selection |
111
+ | **DateRangePicker** | `DateRangePicker`, `DATE_RANGE_PRESETS`, `findMatchingPreset`, `PRESET_IDS`, `resolvePresets` (+ types); full variant: `presetIds`, `presetLabels` | Date range selection; `variant="full"` for presets sidebar + dual-month calendar |
110
112
  | **Dropzone** | `Dropzone`, `DropzoneContent`, `DropzoneEmptyState` | File upload drag-drop |
113
+ | **Kanban** | `KanbanBoard`, `KanbanColumn`, `KanbanCard`, `KanbanCardOverlay`, `normalizeToKanbanColumn`, `dataToKanbanItems` (+ types) | Drag-and-drop Kanban board; compound API; same columns/data as DataTable |
114
+ | **Tickets** | `TicketForm`, `TicketDetails`, `TicketFieldControl`, `UserDisplay`, field helpers (`formatTicketTimestampDisplay`, …), `TicketSystemEvent`, `PartitionDetailFieldsResult` (+ `TicketUserSelectComponent`) | Schema-driven ticket form and detail UI; **`data-slot`** on form/details/field wrapper (see tickets README); optional `systemEvents` / `onBack` / `onAddCustomField` |
111
115
  | **Chart** | `ChartContainer`, `ChartTooltip`, `ChartTooltipContent`, `ChartLegend`, `ChartLegendContent`, `ChartStyle` (+ `ChartConfig` type) | Recharts integration |
112
116
 
113
117
  ### Interactive Elements
@@ -126,12 +130,36 @@ This directory contains comprehensive documentation and tools for AI agents work
126
130
  | `cn` | Class name utility for merging Tailwind classes |
127
131
  | **Theme Utils** | `activateCarbideTheme`, `deactivateCarbideTheme`, `toggleCarbideTheme`, `isCarbideThemeActive`, `activateDarkMode`, `deactivateDarkMode`, `toggleDarkMode`, `isDarkModeActive` |
128
132
 
129
- ### Total: 44+ Components
133
+ ### Total: 46+ Components
130
134
 
131
135
  All components follow shadcn/ui patterns with Carbide theme integration for industrial/manufacturing contexts.
132
136
 
133
137
  ## Component Usage Guides
134
138
 
139
+ ### Table + Kanban from same columns and data
140
+
141
+ Use the same column definitions and data for both DataTable and Kanban:
142
+
143
+ - **Columns**: Pass table column objects directly to `KanbanColumn` via `column={col}` (accepts `{ id, title? }` or `{ id, header? }`).
144
+ - **Items**: `const items = dataToKanbanItems(data, { columnIdKey: 'status', titleKey: 'name' });` then filter by column when rendering cards.
145
+ - **Compound API**: `<KanbanBoard onMove={...}><KanbanColumn column={col}>…<KanbanCard item={item}>…</KanbanCard>…</KanbanColumn></KanbanBoard>`. Card content is children of `KanbanCard`. Optional `renderDragPreview(item)` for custom drag overlay.
146
+
147
+ ### Ticket form and detail sheet
148
+
149
+ Schema-driven ticket UI (`TicketForm`, `TicketDetails`, `TicketFieldControl`) — inject a user picker (`TicketUserSelectComponent`), pass `onSubmit` / `onCancel`, and wire `onValuesChange` + `comments` / `onPostComment` / optional `systemEvents`. `TicketDetails` has no open/close API; mount it wherever needed (header metadata, Activity tabs, sticky sidebar). See **[tickets-pattern.md](./tickets-pattern.md)**.
150
+ ### Layout and panel-like UI: don’t use Card for every section
151
+
152
+ Use the right component for the job instead of wrapping everything in Card:
153
+
154
+ | Need | Use | Notes |
155
+ |------|-----|--------|
156
+ | **Split workspace / dashboard / IDE-like layout** | **ResizablePanelGroup** | Horizontal or vertical split; drag-to-resize; keyboard accessible. Best for admin panels, SaaS tools, file-explorer style UIs. On mobile, use CSS to stack panels vertically. |
157
+ | **Navigation panel (app nav, links, structural sidebar)** | **Sidebar** | Composable, themeable, collapsible to icons. Use for application layout with nav links and groups, not for arbitrary “panel” content. |
158
+ | **Temporary or slide-out panel (settings, details, filters)** | **Sheet** | Slides in from any side (left, right, top, bottom). Use for settings, notifications, detail views, form overlays. See Overlays & Modals table. |
159
+ | **Discrete content block (summary box, metric, form section)** | **Card** | Card is for **content** with sections (header, body, footer), not for structural layout. Do not use Card as the main wrapper for full-page sections, side panels, or workspace areas. |
160
+
161
+ **Best practice for full app layout:** Combine Sidebar for navigation and ResizablePanelGroup (or a main content area) for the main workspace. Use Sheet for overlay panels; use Card only for distinct content blocks within a panel or page.
162
+
135
163
  ### Scrolling content: Card vs ScrollArea
136
164
 
137
165
  **There is no "Panel" component.** For a panel-like or card-like region where content may be longer than the visible area, use **ScrollArea** around the scrollable content. **Card** is a structural container (border, padding, sections) and does not add scrolling.
@@ -234,6 +262,71 @@ The `DataTable` component supports both client-side and server-side pagination.
234
262
  4. The component automatically handles edge cases (empty data, partial last page, etc.)
235
263
  5. See component README at `src/components/ui/data-table/README.md` for detailed examples
236
264
 
265
+ ### DateRangePicker: date ranges, presets, and helpers
266
+
267
+ Use **`DateRangePicker`** when the user needs a **start/end date range** (filters, reports, scheduling). Use **`DatePicker`** for a **single date**. Both are in `@machinemetrics/mm-react-components`.
268
+
269
+ **Imports (typical):**
270
+
271
+ ```tsx
272
+ import {
273
+ DateRangePicker,
274
+ PRESET_IDS,
275
+ // Optional — programmatic preset matching / same subset as the picker:
276
+ DATE_RANGE_PRESETS,
277
+ findMatchingPreset,
278
+ resolvePresets,
279
+ } from '@machinemetrics/mm-react-components';
280
+ ```
281
+
282
+ **Value shape:** Controlled with `value` and `onValueChange`. Type is `[string | null, string | null] | null | undefined` — dates are **`yyyy-MM-dd`** strings (ISO date only), e.g. `['2026-03-01', '2026-03-15']`. `allowSingleDate` allows one-day selections.
283
+
284
+ **Variants:**
285
+
286
+ | Variant | Prop | What you get |
287
+ | ------- | ---- | -------------- |
288
+ | **Simple** (default) | omit or `variant="simple"` | Single-calendar popover; Clear / Cancel / Apply (Clear reverts draft to last committed `value` without closing). |
289
+ | **Full** | `variant="full"` | Presets sidebar, dual-month calendar, company start time + optional custom hours, footer with summary and same Clear/Cancel/Apply behavior. |
290
+
291
+ **Full variant — presets:** The sidebar lists built-in quick ranges (Today, Yesterday, Last 7/30/90 days, week/month/year rollups, week/month/quarter/year-to-date, Custom). Full list and behavior: **`src/components/ui/date-range-picker/README.md`** in the repo (or browse package source after install).
292
+
293
+ **Customizing presets (full variant only):**
294
+
295
+ - **`presetIds`** — Pass a **subset and order** of presets using **`PRESET_IDS`** constants (not raw strings in app code, so IDs stay typed and consistent):
296
+
297
+ ```tsx
298
+ presetIds={[
299
+ PRESET_IDS.TODAY,
300
+ PRESET_IDS.LAST_7_DAYS,
301
+ PRESET_IDS.MONTH_TO_DATE,
302
+ PRESET_IDS.CUSTOM,
303
+ ]}
304
+ ```
305
+
306
+ Omit `presetIds` for all defaults. Use `presetIds={[]}` to hide every preset row.
307
+
308
+ - **`presetLabels`** — Override labels (i18n or wording), keyed by **`PresetId`** / `PRESET_IDS`:
309
+
310
+ ```tsx
311
+ presetLabels={{ [PRESET_IDS.MONTH_TO_DATE]: 'This month' }}
312
+ ```
313
+
314
+ **Programmatic use (outside the picker):**
315
+
316
+ - **`DATE_RANGE_PRESETS`** — Array of preset definitions (`id`, label, `getRange()`).
317
+ - **`resolvePresets(presetIds?)`** — Resolves which preset objects to use (same logic as the full picker). Pass the **same `presetIds` array** as the picker so “which preset is active” matches the UI.
318
+ - **`findMatchingPreset(start, end, now, presets?)`** — Given two dates and an optional resolved preset list, returns which **preset id** matches the range (or `undefined`).
319
+
320
+ Use these when syncing URL/query params, highlighting an active filter, or validating that a range matches a named preset.
321
+
322
+ **Related:** `Calendar` for bare calendars; `DatePicker` for single date with label. Carbide styles apply with the usual **`carbide`** wrapper and library **`/styles`** import.
323
+
324
+ **Important notes for AI agents:**
325
+
326
+ 1. Prefer **`PRESET_IDS.*`** in source code for `presetIds` / `presetLabels` keys — do not hardcode string literals like `'month-to-date'` unless you are sure of the id contract.
327
+ 2. Full variant may need horizontal space (dual months); avoid squeezing inside tiny columns without testing.
328
+ 3. Detailed props table and Copy/paste examples: package **README** at `src/components/ui/date-range-picker/README.md`.
329
+
237
330
  ## Directory Structure
238
331
 
239
332
  ```
@@ -186,6 +186,8 @@ The migration configuration is located at `scripts/chakra-to-shadcn-migrator/cha
186
186
 
187
187
  ### Card Components
188
188
 
189
+ Use Card for **discrete content blocks** (summary, metric, form section), not for panel or layout structure. For panel-like UI use **ResizablePanelGroup**, **Sidebar**, or **Sheet** (see agent-documentation-reference.md).
190
+
189
191
  ```tsx
190
192
  // Chakra UI
191
193
  <Card>
@@ -129,7 +129,7 @@ function MyComponent() {
129
129
  }
130
130
  ```
131
131
 
132
- **Done!** Components are ready to use.
132
+ **Done!** Components are ready to use. (This example uses Card for a single content block; for panel layouts or split UIs use ResizablePanelGroup, Sidebar, or Sheet—see agent-documentation-reference.md.)
133
133
 
134
134
  ## Project Structure After Setup (zero-config)
135
135
 
@@ -82,7 +82,7 @@ This reference provides detailed mappings between Chakra UI components and Machi
82
82
  | Chakra UI | MachineMetrics | Import | Notes |
83
83
  | --------- | -------------- | ------------------------------------- | ------------------ |
84
84
  | `Table` | `Table` | `@machinemetrics/mm-react-components` | Direct replacement |
85
- | `Card` | `Card` | `@machinemetrics/mm-react-components` | New component |
85
+ | `Card` | `Card` | `@machinemetrics/mm-react-components` | Use for discrete content blocks; for panel/split layout use ResizablePanelGroup, Sidebar, or Sheet (see agent-documentation-reference.md). |
86
86
  | `Avatar` | `Avatar` | `@machinemetrics/mm-react-components` | New component |
87
87
  | `Tooltip` | `Tooltip` | `@machinemetrics/mm-react-components` | Direct replacement |
88
88
  | `Popover` | `Popover` | `@machinemetrics/mm-react-components` | Direct replacement |
@@ -216,6 +216,8 @@ This reference provides detailed mappings between Chakra UI components and Machi
216
216
 
217
217
  ### Card Structure
218
218
 
219
+ Use Card for **discrete content blocks** (e.g. summary box, metric card, form section). Do not use Card for structural layout or panel-like UI—prefer **ResizablePanelGroup** (split workspaces), **Sidebar** (nav panels), or **Sheet** (slide-out panels). See agent-documentation-reference.md “Layout and panel-like UI.”
220
+
219
221
  ```tsx
220
222
  // Chakra UI Structure
221
223
  <Card>
@@ -63,7 +63,7 @@ The skill triggers when the user asks to create or generate a UI, widget, screen
63
63
 
64
64
  ## Contents
65
65
 
66
- - **SKILL.md** — Main instructions: components (only library exports, compound components, `cn()`, `data-slot`); **theme and styling** (CSS variables only, variants, layout, `.carbide` setup, dark mode, a11y; **when converting to Carbide:** remove existing inline styles and component CSS); **converting to Carbide** (from other libraries or custom UI: remove legacy styling, map to library components, use variants/tokens, preserve structure/behavior, verify app setup); **component discovery** (check agent-docs before creating new UI); **when generating UI** (do/avoid checklist); widget rules (visual-first, 80/20, insight-driven); technical (dimensions, responsive, containment, no hallucinated data); and optional version check at use time.
66
+ - **SKILL.md** — Main instructions: components (only library exports, compound components, `cn()` where the app uses Tailwind, `data-slot`); **showcase / copy-paste** (styles-only path: no Tailwind utilities in snippets; use component props and theme tokens; `displayName` for readable CodePreview); **theme and styling** (CSS variables only, variants, layout, `.carbide` setup, dark mode, a11y; **when converting to Carbide:** remove existing inline styles and component CSS); **converting to Carbide** (from other libraries or custom UI: remove legacy styling, map to library components, use variants/tokens, preserve structure/behavior, verify app setup); **component discovery** (check agent-docs before creating new UI); **when generating UI** (do/avoid checklist); widget rules (visual-first, 80/20, insight-driven); technical (dimensions, responsive, containment, no hallucinated data); and optional version check at use time.
67
67
  - **reference.md** — **Styling and conventions** (tokens, variants, layout, setup); **component discovery** (agent-docs index); key exports and patterns (PageHeader, DataTable, Form, ChartContainer, etc.); short widget rules summary (when to use charts vs metrics, accessibility).
68
68
  - **Package agent-docs:** **`style-color-reference.md`** — short overview; **authoritative** token names/values are in **`themes/carbide`** (`carbide.css`). Precompiled `/styles` is library-scoped CSS, not a full generic utility set.
69
69
 
@@ -93,5 +93,6 @@ When the package is **not installed**, use this document and recommend installin
93
93
  **Overlays:** Dialog, Sheet, Drawer, AlertDialog, Popover, Tooltip, DropdownMenu, Select.
94
94
  **Forms:** Form, FormField, FormItem, FormLabel, FormControl; Input, SearchInput, Textarea, Label, Checkbox, Switch, RadioGroup, Select, Slider, DatePicker, DateRangePicker.
95
95
  **Data:** DataTable (DataTablePagination, ResponsiveTable, DataTableToolbar, createColumnDescriptor, createTextColumn, createNumericColumn, createBadgeColumn, createDateColumn), Table, ChartContainer, ChartTooltip, ChartLegend, Progress, Skeleton, Badge (prefer semantic variants: `neutral`, `info`, `success`, `critical`, `warning`, `attention`, `production`, `setup`; use `custom` + `className` only when needed), Avatar, HeroMetricCard.
96
+ **Date ranges:** Use **`DateRangePicker`** for start/end filters or reporting (`value` / `onValueChange` as `[yyyy-MM-dd, yyyy-MM-dd]`). Default variant = simple popover; use **`variant="full"`** for presets + dual calendar + settings. Import **`PRESET_IDS`** for **`presetIds`** (subset/order) and **`presetLabels`** (e.g. `[PRESET_IDS.MONTH_TO_DATE]: 'This month'`). Helpers: **`resolvePresets`**, **`findMatchingPreset`**, **`DATE_RANGE_PRESETS`**. See **`agent-documentation-reference.md`** section *DateRangePicker* and the package README under `date-range-picker`.
96
97
  **Actions/feedback:** Button, buttonVariants, Toaster, toast, Alert, Spinner, SpinnerCarbide.
97
98
  **Other:** Accordion, Collapsible, Separator, Dropzone, cn. Theme: activateCarbideTheme, toggleDarkMode, etc.
@@ -0,0 +1,78 @@
1
+ # Ticket pattern (`TicketForm`, `TicketDetails`)
2
+
3
+ Carbide-composed UI for configurable work-item fields: form, per-field control, and **detail body** (header with id + title + status/priority/due, main column for description + activity, sticky metadata rail). Same idea as `TicketForm` — **presentation only**: no overlay, open state, or routing inside the library. Your app chooses where it mounts (page, `Sheet`, drawer) and owns visibility.
4
+
5
+ ## Quick start
6
+
7
+ ```tsx
8
+ import {
9
+ TicketForm,
10
+ TicketDetails,
11
+ UserDisplay,
12
+ fieldKeyToHeader,
13
+ Sheet,
14
+ SheetContent,
15
+ } from '@machinemetrics/mm-react-components';
16
+ import { MyUserSelect } from './MyUserSelect';
17
+
18
+ <TicketForm
19
+ fieldDefinitions={defs}
20
+ onSubmit={(values) => saveTicket(values)}
21
+ onCancel={() => navigate(-1)}
22
+ getDisplayName={(id) => ...}
23
+ getCurrentUser={() => api.getMe()}
24
+ userSelectComponent={MyUserSelect}
25
+ />;
26
+
27
+ <Sheet open={open} onOpenChange={setOpen}>
28
+ <SheetContent side="right" className="p-0 flex flex-col ...">
29
+ <TicketDetails
30
+ ticket={ticket}
31
+ ticketFieldDefinitions={ticketDefs}
32
+ formFieldDefinitions={formDefs}
33
+ getDisplayName={(id) => ...}
34
+ usersLoading={loading}
35
+ onValuesChange={(next) => updateTicket(ticket.id, next)}
36
+ userSelectComponent={MyUserSelect}
37
+ comments={comments}
38
+ systemEvents={systemEvents}
39
+ onPostComment={({ authorUserId, body }) => addComment(...)}
40
+ onBack={() => setOpen(false)}
41
+ onAddCustomField={() => openAddFieldFlow()}
42
+ />
43
+ </SheetContent>
44
+ </Sheet>;
45
+ ```
46
+
47
+ ## Types
48
+
49
+ Use exported `TicketFieldDefinition`, `Ticket`, `Comment`, `TicketSystemEvent`, and `TicketConfig` for shared shapes between host and UI.
50
+
51
+ For **read-only timestamps** (e.g. last updated), use **`type: 'updatedDate'`** on the field — not `text` or `date`. The UI shows a muted read-only line; the host still passes the raw value (typically ISO) on the ticket. Use **`formatTicketTimestampDisplay`** if you render the value elsewhere.
52
+
53
+ ## Layout helpers
54
+
55
+ `partitionDetailFields` returns `headerFields`, `mainColumnFields`, `sidebarPeopleFields`, `sidebarDateFields`, `sidebarCustomFields`, plus `sidebarFields` (flattened rail list), `mainTopFields` (same as main column / description), and `otherMainFields` (same as custom — legacy names). Use these if you build a custom shell instead of `TicketDetails`.
56
+
57
+ ## Activity
58
+
59
+ - **Comments** — existing `Comment[]` and `onPostComment`.
60
+ - **System events** — optional `TicketSystemEvent[]` (`id`, `createdAt`, `message`) for the **Updates** tab; merged chronologically with comments under **All**.
61
+
62
+ ## Copy / i18n
63
+
64
+ Pass `labels` (see `TicketFormLabels`, `TicketDetailsLabels`, `TicketFieldControlLabels`) or use `mergeTicketFormLabels` / `mergeTicketDetailsLabels` defaults.
65
+
66
+ ## Theming
67
+
68
+ Carbide hooks use `data-slot` on ticket surfaces:
69
+
70
+ - **`TicketForm`:** `ticket-form` (root form), `ticket-form-readonly-field` (e.g. `updatedDate`, `currentUser` rows).
71
+ - **`TicketDetails`:** `ticket-details`, `ticket-details-header`, `ticket-details-main`, `ticket-details-activity`, `ticket-details-sidebar`.
72
+ - **`TicketFieldControl`:** `ticket-field-control` wraps each field; primitives inside still expose their own slots (`input`, `date-picker`, etc.).
73
+
74
+ See [src/components/ui/tickets/README.md](../src/components/ui/tickets/README.md) for the full table.
75
+
76
+ ## See also
77
+
78
+ - [src/components/ui/tickets/README.md](../src/components/ui/tickets/README.md) (source tree; also shipped in repo)
package/dist/README.md CHANGED
@@ -186,6 +186,33 @@ document.documentElement.classList.add('carbide');
186
186
  - You want to minimize bundle size
187
187
  - You're using our components with your own Tailwind config
188
188
 
189
+ #### Embedded apps: `ThemeRoot` and `useHostTheme`
190
+
191
+ For apps hosted inside the MachineMetrics shell (or any host that passes a light/dark value), wrap the tree once and sync the host value—no `next-themes` setup boilerplate.
192
+
193
+ `ThemeRoot` wraps your React tree (e.g. inside `#root`). It does **not** replace `<html>` in `index.html`; it still toggles `light` / `dark` on `document.documentElement`. Keep `class="carbide"` on `<html>` and import Carbide CSS as usual.
194
+
195
+ ```tsx
196
+ // index.tsx
197
+ import { ThemeRoot } from '@machinemetrics/mm-react-components';
198
+
199
+ <ThemeRoot>
200
+ <App />
201
+ </ThemeRoot>
202
+ ```
203
+
204
+ ```tsx
205
+ // App.tsx — pass the host color mode (example: mm-react-tools)
206
+ import { useHostTheme } from '@machinemetrics/mm-react-components';
207
+ import { useMMAppParams } from '@machinemetrics/mm-react-tools';
208
+
209
+ useHostTheme(useMMAppParams().colorMode);
210
+ ```
211
+
212
+ If you need `useTheme()` elsewhere (e.g. markdown styling), import it from **`@machinemetrics/mm-react-components`** so it uses the same context as `ThemeRoot`—not from the `next-themes` package directly.
213
+
214
+ Optional: pass any `ThemeProvider` prop to `ThemeRoot` to override defaults (e.g. `storageKey` for standalone persistence).
215
+
189
216
  #### Option 3: Use Theme Utilities
190
217
 
191
218
  ```tsx
@@ -1,9 +1,16 @@
1
1
  import * as React from 'react';
2
2
  import * as AccordionPrimitive from '@radix-ui/react-accordion';
3
- export { Accordion, AccordionContent } from '@/components/shadcn/accordion';
3
+ export { AccordionContent } from '@/components/shadcn/accordion';
4
+ export type AccordionProps = React.ComponentProps<typeof AccordionPrimitive.Root> & {
5
+ /**
6
+ * `inset` draws a rounded, bordered surface so accordion reads as one block inside a card.
7
+ */
8
+ variant?: 'default' | 'inset';
9
+ };
10
+ declare function Accordion({ variant, className, ...props }: AccordionProps): import("react/jsx-runtime").JSX.Element;
4
11
  declare const AccordionItem: React.ForwardRefExoticComponent<Omit<AccordionPrimitive.AccordionItemProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
5
12
  declare const AccordionTrigger: React.ForwardRefExoticComponent<Omit<AccordionPrimitive.AccordionTriggerProps & React.RefAttributes<HTMLButtonElement> & {
6
13
  indicatorClassName?: string;
7
14
  }, "ref"> & React.RefAttributes<HTMLButtonElement>>;
8
- export { AccordionItem, AccordionTrigger };
15
+ export { Accordion, AccordionItem, AccordionTrigger };
9
16
  //# sourceMappingURL=accordion.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"accordion.d.ts","sourceRoot":"","sources":["../../../src/components/ui/accordion.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,kBAAkB,MAAM,2BAA2B,CAAC;AAMhE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAS5E,QAAA,MAAM,aAAa,iKAYjB,CAAC;AAGH,QAAA,MAAM,gBAAgB;yBAGG,MAAM;mDA2B7B,CAAC;AAEH,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,CAAC"}
1
+ {"version":3,"file":"accordion.d.ts","sourceRoot":"","sources":["../../../src/components/ui/accordion.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,kBAAkB,MAAM,2BAA2B,CAAC;AAMhE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAQjE,MAAM,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc,CAC/C,OAAO,kBAAkB,CAAC,IAAI,CAC/B,GAAG;IACF;;OAEG;IACH,OAAO,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;CAC/B,CAAC;AAEF,iBAAS,SAAS,CAAC,EAAE,OAAmB,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,2CAa9E;AAGD,QAAA,MAAM,aAAa,iKAYjB,CAAC;AAGH,QAAA,MAAM,gBAAgB;yBAGG,MAAM;mDA2B7B,CAAC;AAEH,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,CAAC"}
@@ -1,10 +1,19 @@
1
1
  import * as React from 'react';
2
2
  import * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog';
3
- export { AlertDialog, AlertDialogTrigger, AlertDialogHeader, AlertDialogFooter, AlertDialogTitle, AlertDialogPortal, } from '@/components/shadcn/alert-dialog';
3
+ import { AlertDialog as BaseAlertDialog, AlertDialogTrigger as BaseAlertDialogTrigger, AlertDialogHeader as BaseAlertDialogHeader, AlertDialogFooter as BaseAlertDialogFooter, AlertDialogTitle as BaseAlertDialogTitle, AlertDialogPortal as BaseAlertDialogPortal } from '@/components/shadcn/alert-dialog';
4
+ declare const AlertDialog: typeof BaseAlertDialog;
5
+ declare const AlertDialogTrigger: typeof BaseAlertDialogTrigger;
6
+ declare const AlertDialogHeader: typeof BaseAlertDialogHeader;
7
+ declare const AlertDialogFooter: typeof BaseAlertDialogFooter;
8
+ declare const AlertDialogTitle: typeof BaseAlertDialogTitle;
9
+ declare const AlertDialogPortal: typeof BaseAlertDialogPortal;
4
10
  declare const AlertDialogOverlay: React.ForwardRefExoticComponent<Omit<AlertDialogPrimitive.AlertDialogOverlayProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
5
11
  declare function AlertDialogContent({ className, ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Content>): import("react/jsx-runtime").JSX.Element;
12
+ declare namespace AlertDialogContent {
13
+ var displayName: string;
14
+ }
6
15
  declare const AlertDialogAction: React.ForwardRefExoticComponent<Omit<AlertDialogPrimitive.AlertDialogActionProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
7
16
  declare const AlertDialogCancel: React.ForwardRefExoticComponent<Omit<AlertDialogPrimitive.AlertDialogCancelProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
8
17
  declare const AlertDialogDescription: React.ForwardRefExoticComponent<Omit<AlertDialogPrimitive.AlertDialogDescriptionProps & React.RefAttributes<HTMLParagraphElement>, "ref"> & React.RefAttributes<HTMLParagraphElement>>;
9
- export { AlertDialogOverlay, AlertDialogContent, AlertDialogAction, AlertDialogCancel, AlertDialogDescription, };
18
+ export { AlertDialog, AlertDialogTrigger, AlertDialogHeader, AlertDialogFooter, AlertDialogTitle, AlertDialogPortal, AlertDialogOverlay, AlertDialogContent, AlertDialogAction, AlertDialogCancel, AlertDialogDescription, };
10
19
  //# sourceMappingURL=alert-dialog.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"alert-dialog.d.ts","sourceRoot":"","sources":["../../../src/components/ui/alert-dialog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,oBAAoB,MAAM,8BAA8B,CAAC;AAerE,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,kCAAkC,CAAC;AAG1C,QAAA,MAAM,kBAAkB,wKAetB,CAAC;AAGH,iBAAS,kBAAkB,CAAC,EAC1B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,OAAO,CAAC,2CAc3D;AAGD,QAAA,MAAM,iBAAiB,6KAWrB,CAAC;AAEH,QAAA,MAAM,iBAAiB,6KAWrB,CAAC;AAGH,QAAA,MAAM,sBAAsB,wLAY1B,CAAC;AAEH,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,sBAAsB,GACvB,CAAC"}
1
+ {"version":3,"file":"alert-dialog.d.ts","sourceRoot":"","sources":["../../../src/components/ui/alert-dialog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,oBAAoB,MAAM,8BAA8B,CAAC;AAOrE,OAAO,EACL,WAAW,IAAI,eAAe,EAC9B,kBAAkB,IAAI,sBAAsB,EAC5C,iBAAiB,IAAI,qBAAqB,EAC1C,iBAAiB,IAAI,qBAAqB,EAC1C,gBAAgB,IAAI,oBAAoB,EACxC,iBAAiB,IAAI,qBAAqB,EAK3C,MAAM,kCAAkC,CAAC;AAE1C,QAAA,MAAM,WAAW,wBAAkD,CAAC;AACpE,QAAA,MAAM,kBAAkB,+BAGvB,CAAC;AACF,QAAA,MAAM,iBAAiB,8BAGtB,CAAC;AACF,QAAA,MAAM,iBAAiB,8BAGtB,CAAC;AACF,QAAA,MAAM,gBAAgB,6BAGrB,CAAC;AACF,QAAA,MAAM,iBAAiB,8BAGtB,CAAC;AAGF,QAAA,MAAM,kBAAkB,wKAetB,CAAC;AAGH,iBAAS,kBAAkB,CAAC,EAC1B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,OAAO,CAAC,2CAc3D;kBAjBQ,kBAAkB;;;AAoB3B,QAAA,MAAM,iBAAiB,6KAWrB,CAAC;AAEH,QAAA,MAAM,iBAAiB,6KAWrB,CAAC;AAGH,QAAA,MAAM,sBAAsB,wLAY1B,CAAC;AAQH,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,sBAAsB,GACvB,CAAC"}
@@ -1,11 +1,12 @@
1
1
  import * as React from 'react';
2
2
  import { type VariantProps } from 'class-variance-authority';
3
- export { AlertTitle, AlertDescription } from '@/components/shadcn/alert';
4
- import { Alert as BaseAlert } from '@/components/shadcn/alert';
3
+ import { Alert as BaseAlert, AlertTitle as BaseAlertTitle, AlertDescription as BaseAlertDescription } from '@/components/shadcn/alert';
4
+ declare const AlertTitle: typeof BaseAlertTitle;
5
+ declare const AlertDescription: typeof BaseAlertDescription;
5
6
  declare const alertVariants: (props?: ({
6
7
  variant?: "default" | "destructive" | "success" | "warning" | null | undefined;
7
8
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
8
9
  type AlertProps = Omit<React.ComponentProps<typeof BaseAlert>, 'variant'> & VariantProps<typeof alertVariants>;
9
10
  declare const Alert: React.ForwardRefExoticComponent<Omit<AlertProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
10
- export { Alert, alertVariants };
11
+ export { Alert, alertVariants, AlertTitle, AlertDescription };
11
12
  //# sourceMappingURL=alert.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"alert.d.ts","sourceRoot":"","sources":["../../../src/components/ui/alert.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAKlE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAGzE,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAI/D,QAAA,MAAM,aAAa;;8EAiBlB,CAAC;AAGF,KAAK,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,SAAS,CAAC,EAAE,SAAS,CAAC,GACvE,YAAY,CAAC,OAAO,aAAa,CAAC,CAAC;AAErC,QAAA,MAAM,KAAK,gGAeT,CAAC;AAEH,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"alert.d.ts","sourceRoot":"","sources":["../../../src/components/ui/alert.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAKlE,OAAO,EACL,KAAK,IAAI,SAAS,EAClB,UAAU,IAAI,cAAc,EAC5B,gBAAgB,IAAI,oBAAoB,EACzC,MAAM,2BAA2B,CAAC;AAEnC,QAAA,MAAM,UAAU,uBAAgD,CAAC;AACjE,QAAA,MAAM,gBAAgB,6BAGrB,CAAC;AAIF,QAAA,MAAM,aAAa;;8EAiBlB,CAAC;AAGF,KAAK,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,SAAS,CAAC,EAAE,SAAS,CAAC,GACvE,YAAY,CAAC,OAAO,aAAa,CAAC,CAAC;AAErC,QAAA,MAAM,KAAK,gGAeT,CAAC;AAEH,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC"}
@@ -1,2 +1,6 @@
1
- export { Avatar, AvatarImage, AvatarFallback, } from '@/components/shadcn/avatar';
1
+ import { Avatar as BaseAvatar, AvatarImage as BaseAvatarImage, AvatarFallback as BaseAvatarFallback } from '@/components/shadcn/avatar';
2
+ declare const Avatar: typeof BaseAvatar;
3
+ declare const AvatarImage: typeof BaseAvatarImage;
4
+ declare const AvatarFallback: typeof BaseAvatarFallback;
5
+ export { Avatar, AvatarImage, AvatarFallback };
2
6
  //# sourceMappingURL=avatar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"avatar.d.ts","sourceRoot":"","sources":["../../../src/components/ui/avatar.tsx"],"names":[],"mappings":"AACA,OAAO,EACL,MAAM,EACN,WAAW,EACX,cAAc,GACf,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"avatar.d.ts","sourceRoot":"","sources":["../../../src/components/ui/avatar.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,IAAI,UAAU,EACpB,WAAW,IAAI,eAAe,EAC9B,cAAc,IAAI,kBAAkB,EACrC,MAAM,4BAA4B,CAAC;AAGpC,QAAA,MAAM,MAAM,mBAAwC,CAAC;AACrD,QAAA,MAAM,WAAW,wBAAkD,CAAC;AACpE,QAAA,MAAM,cAAc,2BAAwD,CAAC;AAE7E,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC"}
@@ -1,2 +1,10 @@
1
- export { Breadcrumb, BreadcrumbList, BreadcrumbItem, BreadcrumbLink, BreadcrumbPage, BreadcrumbSeparator, BreadcrumbEllipsis, } from '@/components/shadcn/breadcrumb';
1
+ import { Breadcrumb as BaseBreadcrumb, BreadcrumbList as BaseBreadcrumbList, BreadcrumbItem as BaseBreadcrumbItem, BreadcrumbLink as BaseBreadcrumbLink, BreadcrumbPage as BaseBreadcrumbPage, BreadcrumbSeparator as BaseBreadcrumbSeparator, BreadcrumbEllipsis as BaseBreadcrumbEllipsis } from '@/components/shadcn/breadcrumb';
2
+ declare const Breadcrumb: typeof BaseBreadcrumb;
3
+ declare const BreadcrumbList: typeof BaseBreadcrumbList;
4
+ declare const BreadcrumbItem: typeof BaseBreadcrumbItem;
5
+ declare const BreadcrumbLink: typeof BaseBreadcrumbLink;
6
+ declare const BreadcrumbPage: typeof BaseBreadcrumbPage;
7
+ declare const BreadcrumbSeparator: typeof BaseBreadcrumbSeparator;
8
+ declare const BreadcrumbEllipsis: typeof BaseBreadcrumbEllipsis;
9
+ export { Breadcrumb, BreadcrumbList, BreadcrumbItem, BreadcrumbLink, BreadcrumbPage, BreadcrumbSeparator, BreadcrumbEllipsis, };
2
10
  //# sourceMappingURL=breadcrumb.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"breadcrumb.d.ts","sourceRoot":"","sources":["../../../src/components/ui/breadcrumb.tsx"],"names":[],"mappings":"AACA,OAAO,EACL,UAAU,EACV,cAAc,EACd,cAAc,EACd,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,gCAAgC,CAAC"}
1
+ {"version":3,"file":"breadcrumb.d.ts","sourceRoot":"","sources":["../../../src/components/ui/breadcrumb.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,IAAI,cAAc,EAC5B,cAAc,IAAI,kBAAkB,EACpC,cAAc,IAAI,kBAAkB,EACpC,cAAc,IAAI,kBAAkB,EACpC,cAAc,IAAI,kBAAkB,EACpC,mBAAmB,IAAI,uBAAuB,EAC9C,kBAAkB,IAAI,sBAAsB,EAC7C,MAAM,gCAAgC,CAAC;AAGxC,QAAA,MAAM,UAAU,uBAAgD,CAAC;AACjE,QAAA,MAAM,cAAc,2BAAwD,CAAC;AAC7E,QAAA,MAAM,cAAc,2BAAwD,CAAC;AAC7E,QAAA,MAAM,cAAc,2BAAwD,CAAC;AAC7E,QAAA,MAAM,cAAc,2BAAwD,CAAC;AAC7E,QAAA,MAAM,mBAAmB,gCAGxB,CAAC;AACF,QAAA,MAAM,kBAAkB,+BAGvB,CAAC;AAEF,OAAO,EACL,UAAU,EACV,cAAc,EACd,cAAc,EACd,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,kBAAkB,GACnB,CAAC"}
@@ -1,6 +1,12 @@
1
1
  import * as React from 'react';
2
+ import type { VariantProps } from 'class-variance-authority';
2
3
  export { buttonVariants } from '@/components/shadcn/button';
3
- declare const Button: React.ForwardRefExoticComponent<Omit<React.ClassAttributes<HTMLButtonElement> & React.ButtonHTMLAttributes<HTMLButtonElement> & import("class-variance-authority").VariantProps<(props?: ({
4
+ /**
5
+ * App-level Button: same visuals as {@link @/components/shadcn/button}, but uses `forwardRef`
6
+ * so Radix triggers (`PopoverTrigger`, `DropdownMenuTrigger`, etc.) can merge refs with `asChild`.
7
+ * Do not add `forwardRef` under `shadcn/` — that layer is CLI-managed; customize here instead.
8
+ */
9
+ declare const Button: React.ForwardRefExoticComponent<Omit<React.ClassAttributes<HTMLButtonElement> & React.ButtonHTMLAttributes<HTMLButtonElement> & VariantProps<(props?: ({
4
10
  variant?: "default" | "destructive" | "outline" | "secondary" | "ghost" | "link" | null | undefined;
5
11
  size?: "default" | "sm" | "lg" | "icon" | "icon-sm" | "icon-lg" | null | undefined;
6
12
  } & import("class-variance-authority/types").ClassProp) | undefined) => string> & {
@@ -1 +1 @@
1
- {"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../../src/components/ui/button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAG5D,QAAA,MAAM,MAAM;;;;;mDAiBV,CAAC;AAEH,OAAO,EAAE,MAAM,EAAE,CAAC"}
1
+ {"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../../src/components/ui/button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAM7D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D;;;;GAIG;AACH,QAAA,MAAM,MAAM;;;;cAII,OAAO;mDAwBrB,CAAC;AAEH,OAAO,EAAE,MAAM,EAAE,CAAC"}
@@ -1,5 +1,27 @@
1
1
  import * as React from 'react';
2
- export { CardHeader, CardFooter, CardTitle, CardAction, CardDescription, CardContent, } from '@/components/shadcn/card';
3
- declare const Card: React.ForwardRefExoticComponent<Omit<React.ClassAttributes<HTMLDivElement> & React.HTMLAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
4
- export { Card };
2
+ import { Card as BaseCard, CardHeader as BaseCardHeader, CardFooter as BaseCardFooter, CardContent as BaseCardContent } from '@/components/shadcn/card';
3
+ export { CardTitle, CardAction, CardDescription, } from '@/components/shadcn/card';
4
+ export type CardSectionTone = 'default' | 'muted';
5
+ export type CardProps = React.ComponentProps<typeof BaseCard> & {
6
+ /**
7
+ * `sectioned` stacks sections edge-to-edge (no card `gap` or vertical padding) so header and
8
+ * footer meet the inner top and bottom; `overflow-hidden` clips children to the card radius.
9
+ * Inset spacing for the first and last section uses `[&>*:first|last-child]` on the card.
10
+ */
11
+ variant?: 'default' | 'sectioned';
12
+ };
13
+ declare const Card: React.ForwardRefExoticComponent<Omit<CardProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
14
+ type CardHeaderProps = React.ComponentProps<typeof BaseCardHeader> & {
15
+ tone?: CardSectionTone;
16
+ };
17
+ declare function CardHeader({ className, tone, ...props }: CardHeaderProps): import("react/jsx-runtime").JSX.Element;
18
+ type CardContentProps = React.ComponentProps<typeof BaseCardContent> & {
19
+ tone?: CardSectionTone;
20
+ };
21
+ declare function CardContent({ className, tone, ...props }: CardContentProps): import("react/jsx-runtime").JSX.Element;
22
+ type CardFooterProps = React.ComponentProps<typeof BaseCardFooter> & {
23
+ tone?: CardSectionTone;
24
+ };
25
+ declare function CardFooter({ className, tone, ...props }: CardFooterProps): import("react/jsx-runtime").JSX.Element;
26
+ export { Card, CardHeader, CardContent, CardFooter };
5
27
  //# sourceMappingURL=card.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"card.d.ts","sourceRoot":"","sources":["../../../src/components/ui/card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,OAAO,EACL,UAAU,EACV,UAAU,EACV,SAAS,EACT,UAAU,EACV,eAAe,EACf,WAAW,GACZ,MAAM,0BAA0B,CAAC;AAGlC,QAAA,MAAM,IAAI,kKAKR,CAAC;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC"}
1
+ {"version":3,"file":"card.d.ts","sourceRoot":"","sources":["../../../src/components/ui/card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,EACL,IAAI,IAAI,QAAQ,EAChB,UAAU,IAAI,cAAc,EAC5B,UAAU,IAAI,cAAc,EAC5B,WAAW,IAAI,eAAe,EAC/B,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,SAAS,EACT,UAAU,EACV,eAAe,GAChB,MAAM,0BAA0B,CAAC;AAElC,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,OAAO,CAAC;AAElD,MAAM,MAAM,SAAS,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,QAAQ,CAAC,GAAG;IAC9D;;;;OAIG;IACH,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC;CACnC,CAAC;AAEF,QAAA,MAAM,IAAI,+FAeT,CAAC;AAEF,KAAK,eAAe,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,cAAc,CAAC,GAAG;IACnE,IAAI,CAAC,EAAE,eAAe,CAAC;CACxB,CAAC;AAEF,iBAAS,UAAU,CAAC,EAClB,SAAS,EACT,IAAgB,EAChB,GAAG,KAAK,EACT,EAAE,eAAe,2CAYjB;AAED,KAAK,gBAAgB,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,GAAG;IACrE,IAAI,CAAC,EAAE,eAAe,CAAC;CACxB,CAAC;AAEF,iBAAS,WAAW,CAAC,EACnB,SAAS,EACT,IAAgB,EAChB,GAAG,KAAK,EACT,EAAE,gBAAgB,2CAYlB;AAED,KAAK,eAAe,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,cAAc,CAAC,GAAG;IACnE,IAAI,CAAC,EAAE,eAAe,CAAC;CACxB,CAAC;AAEF,iBAAS,UAAU,CAAC,EAClB,SAAS,EACT,IAAgB,EAChB,GAAG,KAAK,EACT,EAAE,eAAe,2CAYjB;AAED,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC"}