@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.
- package/CHANGELOG.md +31 -0
- package/README.md +27 -0
- package/agent-docs/agent-documentation-reference.md +106 -13
- package/agent-docs/ai-agent-guide.md +2 -0
- package/agent-docs/ai-agent-init-guide.md +1 -1
- package/agent-docs/component-mapping-reference.md +3 -1
- package/agent-docs/cursor-skill-mm-carbide.md +1 -1
- package/agent-docs/lovable.md +1 -0
- package/agent-docs/tickets-pattern.md +78 -0
- package/dist/README.md +27 -0
- package/dist/components/ui/accordion.d.ts +9 -2
- package/dist/components/ui/accordion.d.ts.map +1 -1
- package/dist/components/ui/alert-dialog.d.ts +11 -2
- package/dist/components/ui/alert-dialog.d.ts.map +1 -1
- package/dist/components/ui/alert.d.ts +4 -3
- package/dist/components/ui/alert.d.ts.map +1 -1
- package/dist/components/ui/avatar.d.ts +5 -1
- package/dist/components/ui/avatar.d.ts.map +1 -1
- package/dist/components/ui/breadcrumb.d.ts +9 -1
- package/dist/components/ui/breadcrumb.d.ts.map +1 -1
- package/dist/components/ui/button.d.ts +7 -1
- package/dist/components/ui/button.d.ts.map +1 -1
- package/dist/components/ui/card.d.ts +25 -3
- package/dist/components/ui/card.d.ts.map +1 -1
- package/dist/components/ui/collapsible.d.ts +22 -1
- package/dist/components/ui/collapsible.d.ts.map +1 -1
- package/dist/components/ui/command.d.ts +3 -0
- package/dist/components/ui/command.d.ts.map +1 -1
- package/dist/components/ui/data-table/pagination.d.ts.map +1 -1
- package/dist/components/ui/data-table/toolbar/DataTableToolbar.d.ts.map +1 -1
- package/dist/components/ui/data-table/toolbar/filters/FilterControl.d.ts +14 -0
- package/dist/components/ui/data-table/toolbar/filters/FilterControl.d.ts.map +1 -0
- package/dist/components/ui/data-table/toolbar/filters/FilterMenu.d.ts.map +1 -1
- package/dist/components/ui/data-table/toolbar/filters/InlineFilterMenu.d.ts +13 -0
- package/dist/components/ui/data-table/toolbar/filters/InlineFilterMenu.d.ts.map +1 -0
- package/dist/components/ui/data-table/toolbar/filters/index.d.ts +2 -0
- package/dist/components/ui/data-table/toolbar/filters/index.d.ts.map +1 -1
- package/dist/components/ui/date-picker.d.ts +8 -1
- package/dist/components/ui/date-picker.d.ts.map +1 -1
- package/dist/components/ui/date-range-picker/get-range-calendar-selected.d.ts +8 -0
- package/dist/components/ui/date-range-picker/get-range-calendar-selected.d.ts.map +1 -0
- package/dist/components/ui/date-range-picker/hooks/use-date-range-picker-state.d.ts +38 -0
- package/dist/components/ui/date-range-picker/hooks/use-date-range-picker-state.d.ts.map +1 -0
- package/dist/components/ui/date-range-picker/index.d.ts +9 -0
- package/dist/components/ui/date-range-picker/index.d.ts.map +1 -0
- package/dist/components/ui/date-range-picker/parts/company-day-settings-row.d.ts +7 -0
- package/dist/components/ui/date-range-picker/parts/company-day-settings-row.d.ts.map +1 -0
- package/dist/components/ui/date-range-picker/parts/custom-hours-selects.d.ts +8 -0
- package/dist/components/ui/date-range-picker/parts/custom-hours-selects.d.ts.map +1 -0
- package/dist/components/ui/date-range-picker/parts/date-range-picker-cancel-apply-buttons.d.ts +10 -0
- package/dist/components/ui/date-range-picker/parts/date-range-picker-cancel-apply-buttons.d.ts.map +1 -0
- package/dist/components/ui/date-range-picker/parts/date-range-picker-clear-button.d.ts +5 -0
- package/dist/components/ui/date-range-picker/parts/date-range-picker-clear-button.d.ts.map +1 -0
- package/dist/components/ui/date-range-picker/parts/date-range-picker-trigger.d.ts +24 -0
- package/dist/components/ui/date-range-picker/parts/date-range-picker-trigger.d.ts.map +1 -0
- package/dist/components/ui/date-range-picker/parts/dual-month-range-calendars.d.ts +15 -0
- package/dist/components/ui/date-range-picker/parts/dual-month-range-calendars.d.ts.map +1 -0
- package/dist/components/ui/date-range-picker/parts/full-variant-header.d.ts +2 -0
- package/dist/components/ui/date-range-picker/parts/full-variant-header.d.ts.map +1 -0
- package/dist/components/ui/date-range-picker/parts/preset-sidebar.d.ts +9 -0
- package/dist/components/ui/date-range-picker/parts/preset-sidebar.d.ts.map +1 -0
- package/dist/components/ui/date-range-picker/parts/range-calendar.d.ts +16 -0
- package/dist/components/ui/date-range-picker/parts/range-calendar.d.ts.map +1 -0
- package/dist/components/ui/date-range-picker/presets.d.ts +34 -0
- package/dist/components/ui/date-range-picker/presets.d.ts.map +1 -0
- package/dist/components/ui/date-range-picker/types.d.ts +29 -0
- package/dist/components/ui/date-range-picker/types.d.ts.map +1 -0
- package/dist/components/ui/date-range-picker/utils.d.ts +24 -0
- package/dist/components/ui/date-range-picker/utils.d.ts.map +1 -0
- package/dist/components/ui/date-range-picker/variants/full.d.ts +11 -0
- package/dist/components/ui/date-range-picker/variants/full.d.ts.map +1 -0
- package/dist/components/ui/date-range-picker/variants/simple.d.ts +9 -0
- package/dist/components/ui/date-range-picker/variants/simple.d.ts.map +1 -0
- package/dist/components/ui/date-range-picker.d.ts +2 -8
- package/dist/components/ui/date-range-picker.d.ts.map +1 -1
- package/dist/components/ui/dialog.d.ts +12 -2
- package/dist/components/ui/dialog.d.ts.map +1 -1
- package/dist/components/ui/drawer.d.ts +16 -2
- package/dist/components/ui/drawer.d.ts.map +1 -1
- package/dist/components/ui/form.d.ts +19 -1
- package/dist/components/ui/form.d.ts.map +1 -1
- package/dist/components/ui/kanban/KanbanBoard.d.ts +8 -0
- package/dist/components/ui/kanban/KanbanBoard.d.ts.map +1 -0
- package/dist/components/ui/kanban/KanbanCard.d.ts +8 -0
- package/dist/components/ui/kanban/KanbanCard.d.ts.map +1 -0
- package/dist/components/ui/kanban/KanbanCardOverlay.d.ts +8 -0
- package/dist/components/ui/kanban/KanbanCardOverlay.d.ts.map +1 -0
- package/dist/components/ui/kanban/KanbanColumn.d.ts +8 -0
- package/dist/components/ui/kanban/KanbanColumn.d.ts.map +1 -0
- package/dist/components/ui/kanban/KanbanContext.d.ts +28 -0
- package/dist/components/ui/kanban/KanbanContext.d.ts.map +1 -0
- package/dist/components/ui/kanban/dragEndUtils.d.ts +26 -0
- package/dist/components/ui/kanban/dragEndUtils.d.ts.map +1 -0
- package/dist/components/ui/kanban/index.d.ts +9 -0
- package/dist/components/ui/kanban/index.d.ts.map +1 -0
- package/dist/components/ui/kanban/types.d.ts +58 -0
- package/dist/components/ui/kanban/types.d.ts.map +1 -0
- package/dist/components/ui/pagination.d.ts +21 -0
- package/dist/components/ui/pagination.d.ts.map +1 -1
- package/dist/components/ui/popover.d.ts +11 -2
- package/dist/components/ui/popover.d.ts.map +1 -1
- package/dist/components/ui/select.d.ts +10 -2
- package/dist/components/ui/select.d.ts.map +1 -1
- package/dist/components/ui/sheet-banner.d.ts +1 -1
- package/dist/components/ui/sheet-banner.d.ts.map +1 -1
- package/dist/components/ui/sonner.d.ts +4 -1
- package/dist/components/ui/sonner.d.ts.map +1 -1
- package/dist/components/ui/status/index.d.ts +7 -0
- package/dist/components/ui/status/index.d.ts.map +1 -0
- package/dist/components/ui/status/status-badge.d.ts +17 -0
- package/dist/components/ui/status/status-badge.d.ts.map +1 -0
- package/dist/components/ui/status/status-intent.d.ts +21 -0
- package/dist/components/ui/status/status-intent.d.ts.map +1 -0
- package/dist/components/ui/status/status-progress.d.ts +20 -0
- package/dist/components/ui/status/status-progress.d.ts.map +1 -0
- package/dist/components/ui/table.d.ts +8 -2
- package/dist/components/ui/table.d.ts.map +1 -1
- package/dist/components/ui/tabs/index.d.ts +6 -0
- package/dist/components/ui/tabs/index.d.ts.map +1 -0
- package/dist/components/ui/tabs/scroll-tabs-row.d.ts +6 -0
- package/dist/components/ui/tabs/scroll-tabs-row.d.ts.map +1 -0
- package/dist/components/ui/tabs/tabs-constants.d.ts +11 -0
- package/dist/components/ui/tabs/tabs-constants.d.ts.map +1 -0
- package/dist/components/ui/tabs/tabs-content.d.ts +5 -0
- package/dist/components/ui/tabs/tabs-content.d.ts.map +1 -0
- package/dist/components/ui/tabs/tabs-context.d.ts +9 -0
- package/dist/components/ui/tabs/tabs-context.d.ts.map +1 -0
- package/dist/components/ui/tabs/tabs-list-underline.d.ts +7 -0
- package/dist/components/ui/tabs/tabs-list-underline.d.ts.map +1 -0
- package/dist/components/ui/tabs/tabs-list.d.ts +8 -0
- package/dist/components/ui/tabs/tabs-list.d.ts.map +1 -0
- package/dist/components/ui/tabs/tabs-trigger.d.ts +7 -0
- package/dist/components/ui/tabs/tabs-trigger.d.ts.map +1 -0
- package/dist/components/ui/tabs/tabs-variants.d.ts +7 -0
- package/dist/components/ui/tabs/tabs-variants.d.ts.map +1 -0
- package/dist/components/ui/tabs/tabs.d.ts +15 -0
- package/dist/components/ui/tabs/tabs.d.ts.map +1 -0
- package/dist/components/ui/tabs/use-tabs-underline-scroll.d.ts +15 -0
- package/dist/components/ui/tabs/use-tabs-underline-scroll.d.ts.map +1 -0
- package/dist/components/ui/tabs.d.ts +5 -26
- package/dist/components/ui/tabs.d.ts.map +1 -1
- package/dist/components/ui/tickets/TicketActivitySection.d.ts +20 -0
- package/dist/components/ui/tickets/TicketActivitySection.d.ts.map +1 -0
- package/dist/components/ui/tickets/TicketDates.d.ts +20 -0
- package/dist/components/ui/tickets/TicketDates.d.ts.map +1 -0
- package/dist/components/ui/tickets/TicketDetailLayout.d.ts +32 -0
- package/dist/components/ui/tickets/TicketDetailLayout.d.ts.map +1 -0
- package/dist/components/ui/tickets/TicketDetails.d.ts +34 -0
- package/dist/components/ui/tickets/TicketDetails.d.ts.map +1 -0
- package/dist/components/ui/tickets/TicketDetailsSidebar.d.ts +21 -0
- package/dist/components/ui/tickets/TicketDetailsSidebar.d.ts.map +1 -0
- package/dist/components/ui/tickets/TicketFieldControl.d.ts +32 -0
- package/dist/components/ui/tickets/TicketFieldControl.d.ts.map +1 -0
- package/dist/components/ui/tickets/TicketForm.d.ts +22 -0
- package/dist/components/ui/tickets/TicketForm.d.ts.map +1 -0
- package/dist/components/ui/tickets/TicketLabels.d.ts +57 -0
- package/dist/components/ui/tickets/TicketLabels.d.ts.map +1 -0
- package/dist/components/ui/tickets/TicketTypes.d.ts +67 -0
- package/dist/components/ui/tickets/TicketTypes.d.ts.map +1 -0
- package/dist/components/ui/tickets/TicketUserSelect.d.ts +17 -0
- package/dist/components/ui/tickets/TicketUserSelect.d.ts.map +1 -0
- package/dist/components/ui/tickets/UserDisplay.d.ts +21 -0
- package/dist/components/ui/tickets/UserDisplay.d.ts.map +1 -0
- package/dist/components/ui/tickets/UserFieldValue.d.ts +24 -0
- package/dist/components/ui/tickets/UserFieldValue.d.ts.map +1 -0
- package/dist/components/ui/tickets/index.d.ts +12 -0
- package/dist/components/ui/tickets/index.d.ts.map +1 -0
- package/dist/components/ui/toggle-group.d.ts +6 -0
- package/dist/components/ui/toggle-group.d.ts.map +1 -1
- package/dist/components/ui/tooltip.d.ts +6 -1
- package/dist/components/ui/tooltip.d.ts.map +1 -1
- package/dist/cursor-skill/mm-carbide/SKILL.md +16 -4
- package/dist/cursor-skill/mm-carbide/reference.md +15 -3
- package/dist/docs/GETTING_STARTED.md +26 -0
- package/dist/index.d.ts +20 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/lib/mm-react-components.css +1 -1
- package/dist/lib/normalize-host-color-mode.d.ts +6 -0
- package/dist/lib/normalize-host-color-mode.d.ts.map +1 -0
- package/dist/lib/theme-root.d.ts +18 -0
- package/dist/lib/theme-root.d.ts.map +1 -0
- package/dist/lib/use-host-theme.d.ts +15 -0
- package/dist/lib/use-host-theme.d.ts.map +1 -0
- package/dist/lib/with-display-name.d.ts +2 -0
- package/dist/lib/with-display-name.d.ts.map +1 -0
- package/dist/mm-react-components.es.js +971 -816
- package/dist/mm-react-components.es.js.map +1 -1
- package/dist/mm-react-components.umd.js +1 -1
- package/dist/mm-react-components.umd.js.map +1 -1
- package/dist/preview/AccordionPreview.d.ts.map +1 -1
- package/dist/preview/BreadcrumbPreview.d.ts.map +1 -1
- package/dist/preview/ButtonPreview.d.ts.map +1 -1
- package/dist/preview/CardPreview.d.ts.map +1 -1
- package/dist/preview/CollapsiblePreview.d.ts.map +1 -1
- package/dist/preview/DataTableLimitationsPreview.d.ts.map +1 -1
- package/dist/preview/DateRangePickerPreview.d.ts.map +1 -1
- package/dist/preview/KanbanPreview.d.ts +2 -0
- package/dist/preview/KanbanPreview.d.ts.map +1 -0
- package/dist/preview/SheetBannerPreview.d.ts.map +1 -1
- package/dist/preview/StatusPreview.d.ts +2 -0
- package/dist/preview/StatusPreview.d.ts.map +1 -0
- package/dist/preview/TicketsPreview.d.ts +2 -0
- package/dist/preview/TicketsPreview.d.ts.map +1 -0
- package/dist/themes/carbide.css +217 -1
- 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
|
|
58
|
-
|
|
|
59
|
-
| **
|
|
60
|
-
| **
|
|
61
|
-
| **
|
|
62
|
-
| **
|
|
63
|
-
| **
|
|
64
|
-
| **
|
|
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)
|
|
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`
|
|
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:
|
|
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` |
|
|
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()
|
|
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
|
|
package/agent-docs/lovable.md
CHANGED
|
@@ -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 {
|
|
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,
|
|
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
|
-
|
|
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;
|
|
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
|
-
|
|
4
|
-
|
|
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,
|
|
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
|
-
|
|
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":"
|
|
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
|
-
|
|
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":"
|
|
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
|
-
|
|
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;
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
export
|
|
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;
|
|
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"}
|