@machinemetrics/mm-react-components 1.4.0 → 1.4.2-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 (66) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/agent-docs/agent-documentation-reference.md +18 -4
  3. package/agent-docs/tickets-pattern.md +78 -0
  4. package/dist/components/ui/date-picker.d.ts +8 -1
  5. package/dist/components/ui/date-picker.d.ts.map +1 -1
  6. package/dist/components/ui/kanban/KanbanBoard.d.ts +8 -0
  7. package/dist/components/ui/kanban/KanbanBoard.d.ts.map +1 -0
  8. package/dist/components/ui/kanban/KanbanCard.d.ts +8 -0
  9. package/dist/components/ui/kanban/KanbanCard.d.ts.map +1 -0
  10. package/dist/components/ui/kanban/KanbanCardOverlay.d.ts +8 -0
  11. package/dist/components/ui/kanban/KanbanCardOverlay.d.ts.map +1 -0
  12. package/dist/components/ui/kanban/KanbanColumn.d.ts +8 -0
  13. package/dist/components/ui/kanban/KanbanColumn.d.ts.map +1 -0
  14. package/dist/components/ui/kanban/KanbanContext.d.ts +28 -0
  15. package/dist/components/ui/kanban/KanbanContext.d.ts.map +1 -0
  16. package/dist/components/ui/kanban/dragEndUtils.d.ts +26 -0
  17. package/dist/components/ui/kanban/dragEndUtils.d.ts.map +1 -0
  18. package/dist/components/ui/kanban/index.d.ts +9 -0
  19. package/dist/components/ui/kanban/index.d.ts.map +1 -0
  20. package/dist/components/ui/kanban/types.d.ts +58 -0
  21. package/dist/components/ui/kanban/types.d.ts.map +1 -0
  22. package/dist/components/ui/select.d.ts +8 -0
  23. package/dist/components/ui/select.d.ts.map +1 -1
  24. package/dist/components/ui/sheet-banner.d.ts +1 -1
  25. package/dist/components/ui/sheet-banner.d.ts.map +1 -1
  26. package/dist/components/ui/tickets/TicketActivitySection.d.ts +20 -0
  27. package/dist/components/ui/tickets/TicketActivitySection.d.ts.map +1 -0
  28. package/dist/components/ui/tickets/TicketDates.d.ts +20 -0
  29. package/dist/components/ui/tickets/TicketDates.d.ts.map +1 -0
  30. package/dist/components/ui/tickets/TicketDetailLayout.d.ts +32 -0
  31. package/dist/components/ui/tickets/TicketDetailLayout.d.ts.map +1 -0
  32. package/dist/components/ui/tickets/TicketDetails.d.ts +34 -0
  33. package/dist/components/ui/tickets/TicketDetails.d.ts.map +1 -0
  34. package/dist/components/ui/tickets/TicketDetailsSidebar.d.ts +21 -0
  35. package/dist/components/ui/tickets/TicketDetailsSidebar.d.ts.map +1 -0
  36. package/dist/components/ui/tickets/TicketFieldControl.d.ts +32 -0
  37. package/dist/components/ui/tickets/TicketFieldControl.d.ts.map +1 -0
  38. package/dist/components/ui/tickets/TicketForm.d.ts +22 -0
  39. package/dist/components/ui/tickets/TicketForm.d.ts.map +1 -0
  40. package/dist/components/ui/tickets/TicketLabels.d.ts +57 -0
  41. package/dist/components/ui/tickets/TicketLabels.d.ts.map +1 -0
  42. package/dist/components/ui/tickets/TicketTypes.d.ts +67 -0
  43. package/dist/components/ui/tickets/TicketTypes.d.ts.map +1 -0
  44. package/dist/components/ui/tickets/TicketUserSelect.d.ts +17 -0
  45. package/dist/components/ui/tickets/TicketUserSelect.d.ts.map +1 -0
  46. package/dist/components/ui/tickets/UserDisplay.d.ts +21 -0
  47. package/dist/components/ui/tickets/UserDisplay.d.ts.map +1 -0
  48. package/dist/components/ui/tickets/UserFieldValue.d.ts +24 -0
  49. package/dist/components/ui/tickets/UserFieldValue.d.ts.map +1 -0
  50. package/dist/components/ui/tickets/index.d.ts +12 -0
  51. package/dist/components/ui/tickets/index.d.ts.map +1 -0
  52. package/dist/index.d.ts +4 -0
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/lib/mm-react-components.css +1 -1
  55. package/dist/mm-react-components.es.js +886 -807
  56. package/dist/mm-react-components.es.js.map +1 -1
  57. package/dist/mm-react-components.umd.js +1 -1
  58. package/dist/mm-react-components.umd.js.map +1 -1
  59. package/dist/preview/KanbanPreview.d.ts +2 -0
  60. package/dist/preview/KanbanPreview.d.ts.map +1 -0
  61. package/dist/preview/SelectPreview.d.ts.map +1 -1
  62. package/dist/preview/SheetBannerPreview.d.ts.map +1 -1
  63. package/dist/preview/TicketsPreview.d.ts +2 -0
  64. package/dist/preview/TicketsPreview.d.ts.map +1 -0
  65. package/dist/themes/carbide.css +21 -0
  66. package/package.json +1 -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
@@ -96,11 +96,11 @@ This directory contains comprehensive documentation and tools for AI agents work
96
96
 
97
97
  ### Advanced Components
98
98
 
99
- | Component | Exports | Description |
100
- | ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
99
+ | Component | Exports | Description |
100
+ | ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
101
101
  | **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
102
  | **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 |
103
+ | **FileIcon** | `FileIcon`, `FileIconGlyph`, `inferFileIconKind`, `getExtensionFromFileName`, `formatFileIconExtensionLabel` (+ types) | File glyph + label from extension inference or overrides |
104
104
  | **FileThumbnail** | `FileThumbnail` (+ types); `FileThumbnailBadgeConfig` | Button wrapping `Thumbnail` + `FileIcon` and optional badge |
105
105
  | **FileGrid** | `FileGrid` (+ types) | Icon grid bound to a TanStack `Table` (same `controller` as `DataTable`) |
106
106
  | **HeroMetricCard** | `HeroMetricCard`, `HeroMetricCardItem` (+ types) | Metrics dashboard card with trends |
@@ -108,6 +108,8 @@ This directory contains comprehensive documentation and tools for AI agents work
108
108
  | **DatePicker** | `DatePicker` | Single date selection with label and placeholder |
109
109
  | **DateRangePicker** | `DateRangePicker` | Date range selection |
110
110
  | **Dropzone** | `Dropzone`, `DropzoneContent`, `DropzoneEmptyState` | File upload drag-drop |
111
+ | **Kanban** | `KanbanBoard`, `KanbanColumn`, `KanbanCard`, `KanbanCardOverlay`, `normalizeToKanbanColumn`, `dataToKanbanItems` (+ types) | Drag-and-drop Kanban board; compound API; same columns/data as DataTable |
112
+ | **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
113
  | **Chart** | `ChartContainer`, `ChartTooltip`, `ChartTooltipContent`, `ChartLegend`, `ChartLegendContent`, `ChartStyle` (+ `ChartConfig` type) | Recharts integration |
112
114
 
113
115
  ### Interactive Elements
@@ -126,12 +128,24 @@ This directory contains comprehensive documentation and tools for AI agents work
126
128
  | `cn` | Class name utility for merging Tailwind classes |
127
129
  | **Theme Utils** | `activateCarbideTheme`, `deactivateCarbideTheme`, `toggleCarbideTheme`, `isCarbideThemeActive`, `activateDarkMode`, `deactivateDarkMode`, `toggleDarkMode`, `isDarkModeActive` |
128
130
 
129
- ### Total: 44+ Components
131
+ ### Total: 46+ Components
130
132
 
131
133
  All components follow shadcn/ui patterns with Carbide theme integration for industrial/manufacturing contexts.
132
134
 
133
135
  ## Component Usage Guides
134
136
 
137
+ ### Table + Kanban from same columns and data
138
+
139
+ Use the same column definitions and data for both DataTable and Kanban:
140
+
141
+ - **Columns**: Pass table column objects directly to `KanbanColumn` via `column={col}` (accepts `{ id, title? }` or `{ id, header? }`).
142
+ - **Items**: `const items = dataToKanbanItems(data, { columnIdKey: 'status', titleKey: 'name' });` then filter by column when rendering cards.
143
+ - **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.
144
+
145
+ ### Ticket form and detail sheet
146
+
147
+ 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)**.
148
+
135
149
  ### Scrolling content: Card vs ScrollArea
136
150
 
137
151
  **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.
@@ -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)
@@ -35,6 +35,13 @@ export interface DatePickerProps {
35
35
  * Initial month to display when no date is selected (e.g. for stable visual tests).
36
36
  */
37
37
  readonly defaultMonth?: Date;
38
+ /**
39
+ * Classes merged onto the trigger button (e.g. compact width for toolbars).
40
+ */
41
+ readonly triggerClassName?: string;
42
+ /** For form validation (e.g. ticket form field errors). */
43
+ readonly 'aria-invalid'?: boolean;
44
+ readonly 'aria-describedby'?: string;
38
45
  }
39
- export declare function DatePicker({ label, placeholder, value, onValueChange, disabled, className, id, showDropdowns, defaultMonth, }: DatePickerProps): import("react/jsx-runtime").JSX.Element;
46
+ export declare function DatePicker({ label, placeholder, value, onValueChange, disabled, className, id, showDropdowns, defaultMonth, triggerClassName, 'aria-invalid': ariaInvalid, 'aria-describedby': ariaDescribedBy, }: DatePickerProps): import("react/jsx-runtime").JSX.Element;
40
47
  //# sourceMappingURL=date-picker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"date-picker.d.ts","sourceRoot":"","sources":["../../../src/components/ui/date-picker.tsx"],"names":[],"mappings":"AAcA,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;;OAEG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B;;OAEG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC;IACtB;;OAEG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,KAAK,IAAI,CAAC;IAC1D;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B;;OAEG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC;;OAEG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC;CAC9B;AAED,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,WAA2B,EAC3B,KAAK,EACL,aAAa,EACb,QAAgB,EAChB,SAAS,EACT,EAAE,EACF,aAAqB,EACrB,YAAY,GACb,EAAE,eAAe,2CAgDjB"}
1
+ {"version":3,"file":"date-picker.d.ts","sourceRoot":"","sources":["../../../src/components/ui/date-picker.tsx"],"names":[],"mappings":"AAeA,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;;OAEG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B;;OAEG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC;IACtB;;OAEG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,KAAK,IAAI,CAAC;IAC1D;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B;;OAEG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC;;OAEG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC;IAC7B;;OAEG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,2DAA2D;IAC3D,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CACtC;AAED,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,WAA2B,EAC3B,KAAK,EACL,aAAa,EACb,QAAgB,EAChB,SAAS,EACT,EAAE,EACF,aAAqB,EACrB,YAAY,EACZ,gBAAgB,EAChB,cAAc,EAAE,WAAW,EAC3B,kBAAkB,EAAE,eAAe,GACpC,EAAE,eAAe,2CA4DjB"}
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ import type { KanbanBoardProps } from './types';
3
+ /**
4
+ * Kanban board with drag-and-drop. Wrap columns and cards; provide onMove
5
+ * to persist moves between columns. Uses @dnd-kit for drag-and-drop.
6
+ */
7
+ export declare function KanbanBoard(props: Readonly<KanbanBoardProps>): React.ReactElement;
8
+ //# sourceMappingURL=KanbanBoard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KanbanBoard.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/kanban/KanbanBoard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAgBxC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AA0EhD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAAG,KAAK,CAAC,YAAY,CAMjF"}
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ import type { KanbanCardProps } from './types';
3
+ /**
4
+ * A sortable card in a column. Registers its content for the default drag overlay.
5
+ * Pass item and children; the card is draggable within and across columns.
6
+ */
7
+ export declare function KanbanCard({ item, children, }: Readonly<KanbanCardProps>): React.ReactElement;
8
+ //# sourceMappingURL=KanbanCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KanbanCard.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/kanban/KanbanCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAC;AAMzC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C;;;GAGG;AACH,wBAAgB,UAAU,CAAC,EACzB,IAAI,EACJ,QAAQ,GACT,EAAE,QAAQ,CAAC,eAAe,CAAC,GAAG,KAAK,CAAC,YAAY,CAsChD"}
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ import type { KanbanCardOverlayProps } from './types';
3
+ /**
4
+ * Default drag overlay. Renders card content (from registered preview or children)
5
+ * or falls back to item.title. Use the same styling as KanbanCard for consistency.
6
+ */
7
+ export declare function KanbanCardOverlay({ item, children, }: Readonly<KanbanCardOverlayProps>): React.ReactElement;
8
+ //# sourceMappingURL=KanbanCardOverlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KanbanCardOverlay.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/kanban/KanbanCardOverlay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAEtD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,IAAI,EACJ,QAAQ,GACT,EAAE,QAAQ,CAAC,sBAAsB,CAAC,GAAG,KAAK,CAAC,YAAY,CAevD"}
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ import { type KanbanColumnProps } from './types';
3
+ /**
4
+ * A single Kanban column: header (SheetBanner) and sortable card list.
5
+ * Border color uses --kanban-column-border (primary when drag-over, border otherwise).
6
+ */
7
+ export declare function KanbanColumn({ column, children, }: Readonly<KanbanColumnProps>): React.ReactElement;
8
+ //# sourceMappingURL=KanbanColumn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KanbanColumn.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/kanban/KanbanColumn.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAC;AAUzC,OAAO,EAEL,KAAK,iBAAiB,EAEvB,MAAM,SAAS,CAAC;AA0BjB;;;GAGG;AACH,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,QAAQ,GACT,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GAAG,KAAK,CAAC,YAAY,CAqElD"}
@@ -0,0 +1,28 @@
1
+ import React, { type ReactNode } from 'react';
2
+ import type { KanbanItem } from './types';
3
+ type RegisterColumn = (id: string) => void;
4
+ type UnregisterColumn = (id: string) => void;
5
+ type RegisterCard = (id: string, item: KanbanItem, previewContent?: ReactNode) => void;
6
+ type UnregisterCard = (id: string) => void;
7
+ type GetItem = (id: string) => KanbanItem | undefined;
8
+ type GetPreviewContent = (id: string) => ReactNode | undefined;
9
+ type GetColumnIds = () => string[];
10
+ type GetAllItems = () => KanbanItem[];
11
+ interface KanbanContextValue {
12
+ registerColumn: RegisterColumn;
13
+ unregisterColumn: UnregisterColumn;
14
+ registerCard: RegisterCard;
15
+ unregisterCard: UnregisterCard;
16
+ getItem: GetItem;
17
+ getPreviewContent: GetPreviewContent;
18
+ getColumnIds: GetColumnIds;
19
+ getAllItems: GetAllItems;
20
+ }
21
+ /** Provides registration and lookup for columns, cards, and drag preview content. */
22
+ export declare function KanbanContextProvider({ children, }: Readonly<{
23
+ children: ReactNode;
24
+ }>): React.ReactElement;
25
+ /** Hook to access Kanban registration and item/preview lookup. Must be used within KanbanBoard. */
26
+ export declare function useKanbanContext(): KanbanContextValue;
27
+ export {};
28
+ //# sourceMappingURL=KanbanContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KanbanContext.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/kanban/KanbanContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAKZ,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,KAAK,cAAc,GAAG,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;AAC3C,KAAK,gBAAgB,GAAG,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;AAC7C,KAAK,YAAY,GAAG,CAClB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,UAAU,EAChB,cAAc,CAAC,EAAE,SAAS,KACvB,IAAI,CAAC;AACV,KAAK,cAAc,GAAG,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;AAC3C,KAAK,OAAO,GAAG,CAAC,EAAE,EAAE,MAAM,KAAK,UAAU,GAAG,SAAS,CAAC;AACtD,KAAK,iBAAiB,GAAG,CAAC,EAAE,EAAE,MAAM,KAAK,SAAS,GAAG,SAAS,CAAC;AAC/D,KAAK,YAAY,GAAG,MAAM,MAAM,EAAE,CAAC;AACnC,KAAK,WAAW,GAAG,MAAM,UAAU,EAAE,CAAC;AAEtC,UAAU,kBAAkB;IAC1B,cAAc,EAAE,cAAc,CAAC;IAC/B,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,YAAY,EAAE,YAAY,CAAC;IAC3B,cAAc,EAAE,cAAc,CAAC;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,EAAE,WAAW,CAAC;CAC1B;AAID,qFAAqF;AACrF,wBAAgB,qBAAqB,CAAC,EACpC,QAAQ,GACT,EAAE,QAAQ,CAAC;IACV,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC,GAAG,KAAK,CAAC,YAAY,CA0DtB;AAED,mGAAmG;AACnG,wBAAgB,gBAAgB,IAAI,kBAAkB,CAMrD"}
@@ -0,0 +1,26 @@
1
+ import type { KanbanItem } from './types';
2
+ /**
3
+ * Minimal drag end payload (compatible with DragEndEvent from @dnd-kit/core).
4
+ */
5
+ export interface DragEndPayload {
6
+ active: {
7
+ id: string | number;
8
+ };
9
+ over: {
10
+ id: string | number;
11
+ } | null;
12
+ }
13
+ /**
14
+ * Result of computing a valid move from a drag end event.
15
+ */
16
+ export interface KanbanMoveResult {
17
+ itemId: string;
18
+ fromColumnId: string;
19
+ toColumnId: string;
20
+ }
21
+ /**
22
+ * Computes a move from a drag end event and current items.
23
+ * Returns null if the move is invalid (no over target, item not found, or same column).
24
+ */
25
+ export declare function computeMoveFromDragEnd(event: DragEndPayload, items: KanbanItem[], columnIds: string[]): KanbanMoveResult | null;
26
+ //# sourceMappingURL=dragEndUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dragEndUtils.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/kanban/dragEndUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IAChC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,UAAU,EAAE,EACnB,SAAS,EAAE,MAAM,EAAE,GAClB,gBAAgB,GAAG,IAAI,CAqBzB"}
@@ -0,0 +1,9 @@
1
+ export { KanbanBoard } from './KanbanBoard';
2
+ export { KanbanColumn } from './KanbanColumn';
3
+ export { KanbanCard } from './KanbanCard';
4
+ export { KanbanCardOverlay } from './KanbanCardOverlay';
5
+ export { normalizeToKanbanColumn, dataToKanbanItems } from './types';
6
+ export { computeMoveFromDragEnd } from './dragEndUtils';
7
+ export type { KanbanMoveResult } from './dragEndUtils';
8
+ export type { KanbanBoardProps, KanbanColumnProps, KanbanCardProps, KanbanCardOverlayProps, KanbanColumnDef, KanbanColumnInput, KanbanItem, } from './types';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/kanban/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,YAAY,EACV,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,sBAAsB,EACtB,eAAe,EACf,iBAAiB,EACjB,UAAU,GACX,MAAM,SAAS,CAAC"}
@@ -0,0 +1,58 @@
1
+ import type { ReactNode } from 'react';
2
+ /**
3
+ * Column definition for the Kanban board (normalized shape: id + title).
4
+ */
5
+ export interface KanbanColumnDef {
6
+ id: string;
7
+ title: string;
8
+ }
9
+ /**
10
+ * Table-compatible column shape. Use the same object as DataTable columns;
11
+ * KanbanColumn normalizes id + header/title internally.
12
+ */
13
+ export interface KanbanColumnInput {
14
+ id: string;
15
+ title?: string;
16
+ header?: string | ReactNode;
17
+ }
18
+ /**
19
+ * Item (card) definition. Must have id, columnId, and title.
20
+ */
21
+ export interface KanbanItem {
22
+ id: string;
23
+ columnId: string;
24
+ title: string;
25
+ }
26
+ /**
27
+ * Normalize a table-column-like object to KanbanColumn.
28
+ * Use when you need an explicit KanbanColumn; KanbanColumn component accepts
29
+ * KanbanColumnInput directly and normalizes internally.
30
+ */
31
+ export declare function normalizeToKanbanColumn(col: KanbanColumnInput): KanbanColumnDef;
32
+ /**
33
+ * Map table data rows to KanbanItem[] using a column key and optional title key.
34
+ * Use the same data array as your DataTable; one call gives items for the board.
35
+ */
36
+ export declare function dataToKanbanItems<T>(data: T[], options: {
37
+ columnIdKey: keyof T;
38
+ titleKey?: keyof T;
39
+ }): KanbanItem[];
40
+ export interface KanbanBoardProps {
41
+ children: ReactNode;
42
+ onMove?: (itemId: string, fromColumnId: string, toColumnId: string) => void;
43
+ renderDragPreview?: (item: KanbanItem) => ReactNode;
44
+ }
45
+ export interface KanbanColumnProps {
46
+ column: KanbanColumnDef | KanbanColumnInput;
47
+ children: ReactNode;
48
+ }
49
+ export interface KanbanCardProps {
50
+ item: KanbanItem;
51
+ children: ReactNode;
52
+ }
53
+ /** Props for the default drag overlay. Optional children override the default title-only content. */
54
+ export interface KanbanCardOverlayProps {
55
+ item: KanbanItem;
56
+ children?: ReactNode;
57
+ }
58
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/kanban/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,iBAAiB,GACrB,eAAe,CAQjB;AAeD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EACjC,IAAI,EAAE,CAAC,EAAE,EACT,OAAO,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAA;CAAE,GACpD,UAAU,EAAE,CAiBd;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5E,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,SAAS,CAAC;CACrD;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,eAAe,GAAG,iBAAiB,CAAC;IAC5C,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,qGAAqG;AACrG,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB"}
@@ -3,6 +3,14 @@ import * as SelectPrimitive from '@radix-ui/react-select';
3
3
  export { Select, SelectContent, SelectGroup, SelectLabel, SelectScrollUpButton, SelectScrollDownButton, SelectSeparator, SelectValue, } from '@/components/shadcn/select';
4
4
  declare const SelectTrigger: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectTriggerProps & React.RefAttributes<HTMLButtonElement> & {
5
5
  size?: "sm" | "default";
6
+ } & {
7
+ /**
8
+ * `ghost` renders a transparent, borderless trigger for inline/row contexts
9
+ * (e.g. table row controls) where the filled input chrome is too heavy.
10
+ * Hover/focus affordances still apply — colors come from `carbide.css` per
11
+ * `data-variant`, matching the Badge/Button pattern.
12
+ */
13
+ variant?: "default" | "ghost";
6
14
  }, "ref"> & React.RefAttributes<HTMLButtonElement>>;
7
15
  declare const SelectItem: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectItemProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
8
16
  export { SelectTrigger, SelectItem };
@@ -1 +1 @@
1
- {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../../src/components/ui/select.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAC;AAM1D,OAAO,EACL,MAAM,EACN,aAAa,EACb,WAAW,EACX,WAAW,EACX,oBAAoB,EACpB,sBAAsB,EACtB,eAAe,EACf,WAAW,GACZ,MAAM,4BAA4B,CAAC;AASpC,QAAA,MAAM,aAAa;;mDAwBjB,CAAC;AAGH,QAAA,MAAM,UAAU,2JAsBd,CAAC;AAEH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../../src/components/ui/select.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAC;AAM1D,OAAO,EACL,MAAM,EACN,aAAa,EACb,WAAW,EACX,WAAW,EACX,oBAAoB,EACpB,sBAAsB,EACtB,eAAe,EACf,WAAW,GACZ,MAAM,4BAA4B,CAAC;AASpC,QAAA,MAAM,aAAa;;;IAGf;;;;;OAKG;cACO,SAAS,GAAG,OAAO;mDA0B/B,CAAC;AAGH,QAAA,MAAM,UAAU,2JAsBd,CAAC;AAEH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
2
  export interface SheetBannerProps {
3
- variant: 'shared' | 'company';
3
+ variant: 'shared' | 'company' | 'neutral';
4
4
  icon: React.ReactNode;
5
5
  text: string;
6
6
  additionalText?: string | null;
@@ -1 +1 @@
1
- {"version":3,"file":"sheet-banner.d.ts","sourceRoot":"","sources":["../../../src/components/ui/sheet-banner.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC9B,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,WAAW,yFA2BvB,CAAC"}
1
+ {"version":3,"file":"sheet-banner.d.ts","sourceRoot":"","sources":["../../../src/components/ui/sheet-banner.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;IAC1C,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,WAAW,yFA6BvB,CAAC"}
@@ -0,0 +1,20 @@
1
+ import React from 'react';
2
+ import type { TicketDetailsLabels } from './TicketLabels';
3
+ import type { Comment, TicketSystemEvent } from './TicketTypes';
4
+ import type { TicketUserSelectComponent } from './TicketUserSelect';
5
+ export interface TicketActivitySectionProps {
6
+ comments: Comment[];
7
+ systemEvents?: TicketSystemEvent[];
8
+ /** Resets the comment draft when the ticket id changes. */
9
+ ticketId: string | undefined;
10
+ getDisplayName: (uid: string) => string;
11
+ usersLoading: boolean;
12
+ userSelectComponent: TicketUserSelectComponent;
13
+ onPostComment: (payload: {
14
+ authorUserId: string;
15
+ body: string;
16
+ }) => void;
17
+ labels: Required<TicketDetailsLabels>;
18
+ }
19
+ export declare function TicketActivitySection({ comments, systemEvents, ticketId, getDisplayName, usersLoading, userSelectComponent: UserSelect, onPostComment, labels, }: Readonly<TicketActivitySectionProps>): React.ReactElement;
20
+ //# sourceMappingURL=TicketActivitySection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TicketActivitySection.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/tickets/TicketActivitySection.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoD,MAAM,OAAO,CAAC;AAMzE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AA6DpE,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,YAAY,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACnC,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACxC,YAAY,EAAE,OAAO,CAAC;IACtB,mBAAmB,EAAE,yBAAyB,CAAC;IAC/C,aAAa,EAAE,CAAC,OAAO,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACzE,MAAM,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAC;CACvC;AAED,wBAAgB,qBAAqB,CAAC,EACpC,QAAQ,EACR,YAAY,EACZ,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,mBAAmB,EAAE,UAAU,EAC/B,aAAa,EACb,MAAM,GACP,EAAE,QAAQ,CAAC,0BAA0B,CAAC,GAAG,KAAK,CAAC,YAAY,CA2J3D"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Parse `YYYY-MM-DD` as a local calendar date (avoids UTC shift from `Date` string parsing).
3
+ */
4
+ export declare function parseTicketDateString(iso: string): Date | undefined;
5
+ /** Format a local `Date` as `YYYY-MM-DD` for ticket field storage. */
6
+ export declare function formatTicketDateString(d: Date): string;
7
+ /**
8
+ * Format an ISO date string for display (e.g. "Mar 1, 2024, 2:00 PM").
9
+ */
10
+ export declare function formatCreationDate(createdAt: string): string;
11
+ /**
12
+ * Read-only display for `updatedDate` and similar: `YYYY-MM-DD` (local) or parseable ISO datetimes.
13
+ */
14
+ export declare function formatTicketTimestampDisplay(raw: string): string;
15
+ /**
16
+ * Format relative time from createdAt to now (e.g. "2 days ago").
17
+ * Accepts optional now for tests.
18
+ */
19
+ export declare function formatRelativeTime(createdAt: string, now?: Date): string;
20
+ //# sourceMappingURL=TicketDates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TicketDates.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/tickets/TicketDates.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAenE;AAED,sEAAsE;AACtE,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAKtD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAK5D;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAYhE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,GAAG,GAAE,IAAiB,GACrB,MAAM,CAaR"}
@@ -0,0 +1,32 @@
1
+ import type { TicketFieldDefinition } from './TicketTypes';
2
+ /** Converts a field key to a short display label (e.g. "submittedBy" → "Submitted By"). */
3
+ export declare function fieldKeyToHeader(key: string): string;
4
+ /** Merge form + ticket definitions (form wins on key), non-hidden, exclude comment, sorted by order. */
5
+ export declare function getMergedDetailFields(form: TicketFieldDefinition[], ticket: TicketFieldDefinition[]): TicketFieldDefinition[];
6
+ export interface PartitionDetailFieldsResult {
7
+ /** Status, priority, due — header metadata row. */
8
+ headerFields: TicketFieldDefinition[];
9
+ /** Description only (title is handled separately in the shell). */
10
+ mainColumnFields: TicketFieldDefinition[];
11
+ /** Owner, submitter, assignee, etc. */
12
+ sidebarPeopleFields: TicketFieldDefinition[];
13
+ /** Created, updated, age, etc. (excludes due — that lives in `headerFields`). */
14
+ sidebarDateFields: TicketFieldDefinition[];
15
+ /** Remaining fields for the right-rail “Custom fields” block. */
16
+ sidebarCustomFields: TicketFieldDefinition[];
17
+ /**
18
+ * Backward-compatible flat list: people, then dates, then custom (each group sorted by `order`).
19
+ * Does not include header fields or description/title.
20
+ */
21
+ sidebarFields: TicketFieldDefinition[];
22
+ /** @deprecated Use `mainColumnFields` — description fields only. */
23
+ mainTopFields: TicketFieldDefinition[];
24
+ /** @deprecated Use `sidebarCustomFields` — same entries; previously rendered in the main column. */
25
+ otherMainFields: TicketFieldDefinition[];
26
+ }
27
+ /**
28
+ * Partitions merged detail field definitions for the narrative + metadata ticket layout.
29
+ * Title and comment types are omitted from all buckets (title shell + activity are separate).
30
+ */
31
+ export declare function partitionDetailFields(fields: TicketFieldDefinition[]): PartitionDetailFieldsResult;
32
+ //# sourceMappingURL=TicketDetailLayout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TicketDetailLayout.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/tickets/TicketDetailLayout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAiD3D,2FAA2F;AAC3F,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAKpD;AAED,wGAAwG;AACxG,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,qBAAqB,EAAE,EAC7B,MAAM,EAAE,qBAAqB,EAAE,GAC9B,qBAAqB,EAAE,CASzB;AAED,MAAM,WAAW,2BAA2B;IAC1C,mDAAmD;IACnD,YAAY,EAAE,qBAAqB,EAAE,CAAC;IACtC,mEAAmE;IACnE,gBAAgB,EAAE,qBAAqB,EAAE,CAAC;IAC1C,uCAAuC;IACvC,mBAAmB,EAAE,qBAAqB,EAAE,CAAC;IAC7C,iFAAiF;IACjF,iBAAiB,EAAE,qBAAqB,EAAE,CAAC;IAC3C,iEAAiE;IACjE,mBAAmB,EAAE,qBAAqB,EAAE,CAAC;IAC7C;;;OAGG;IACH,aAAa,EAAE,qBAAqB,EAAE,CAAC;IACvC,oEAAoE;IACpE,aAAa,EAAE,qBAAqB,EAAE,CAAC;IACvC,oGAAoG;IACpG,eAAe,EAAE,qBAAqB,EAAE,CAAC;CAC1C;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,qBAAqB,EAAE,GAC9B,2BAA2B,CA0C7B"}
@@ -0,0 +1,34 @@
1
+ import React from 'react';
2
+ import { type TicketDetailsLabels } from './TicketLabels';
3
+ import type { Comment, Ticket, TicketFieldDefinition, TicketSystemEvent } from './TicketTypes';
4
+ import type { TicketUserSelectComponent } from './TicketUserSelect';
5
+ export interface TicketDetailsProps {
6
+ ticket?: Ticket | null;
7
+ ticketFieldDefinitions?: TicketFieldDefinition[];
8
+ formFieldDefinitions?: TicketFieldDefinition[];
9
+ allowEditing?: boolean;
10
+ getDisplayName: (uid: string) => string;
11
+ usersLoading?: boolean;
12
+ /**
13
+ * Called whenever a field value changes; host persists (e.g. updateTicket).
14
+ * Receives the full next values map for all editable detail fields. Derived
15
+ * read-only fields (`creationDate`, `ticketAge`) are display-only and never
16
+ * included in the payload.
17
+ */
18
+ onValuesChange: (nextValues: Record<string, string>) => void;
19
+ userSelectComponent: TicketUserSelectComponent;
20
+ comments: Comment[];
21
+ /** Timeline entries shown under Activity → Updates. */
22
+ systemEvents?: TicketSystemEvent[];
23
+ onPostComment: (payload: {
24
+ authorUserId: string;
25
+ body: string;
26
+ }) => void;
27
+ /** When set, shows a back control in the header. */
28
+ onBack?: () => void;
29
+ /** When set, shows "Add field" in the custom-fields section. */
30
+ onAddCustomField?: () => void;
31
+ labels?: TicketDetailsLabels;
32
+ }
33
+ export declare function TicketDetails({ ticket, ticketFieldDefinitions, formFieldDefinitions, allowEditing, getDisplayName, usersLoading, onValuesChange, userSelectComponent, comments, systemEvents, onPostComment, onBack, onAddCustomField, labels: labelsProp, }: Readonly<TicketDetailsProps>): React.ReactElement;
34
+ //# sourceMappingURL=TicketDetails.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TicketDetails.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/tickets/TicketDetails.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoD,MAAM,OAAO,CAAC;AAKzE,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,gBAAgB,CAAC;AAQxB,OAAO,KAAK,EACV,OAAO,EACP,MAAM,EACN,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAKpE,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,sBAAsB,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACjD,oBAAoB,CAAC,EAAE,qBAAqB,EAAE,CAAC;IAC/C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACxC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;;OAKG;IACH,cAAc,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;IAC7D,mBAAmB,EAAE,yBAAyB,CAAC;IAC/C,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,uDAAuD;IACvD,YAAY,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACnC,aAAa,EAAE,CAAC,OAAO,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACzE,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,MAAM,CAAC,EAAE,mBAAmB,CAAC;CAC9B;AAED,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,sBAA2B,EAC3B,oBAAyB,EACzB,YAAmB,EACnB,cAAc,EACd,YAAoB,EACpB,cAAc,EACd,mBAAmB,EACnB,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,MAAM,EACN,gBAAgB,EAChB,MAAM,EAAE,UAAU,GACnB,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GAAG,KAAK,CAAC,YAAY,CAgPnD"}
@@ -0,0 +1,21 @@
1
+ import React from 'react';
2
+ import type { TicketDetailsLabels } from './TicketLabels';
3
+ import type { TicketFieldDefinition } from './TicketTypes';
4
+ import type { TicketUserSelectComponent } from './TicketUserSelect';
5
+ export interface TicketDetailsSidebarProps {
6
+ sidebarPeopleFields: TicketFieldDefinition[];
7
+ sidebarDateFields: TicketFieldDefinition[];
8
+ sidebarCustomFields: TicketFieldDefinition[];
9
+ values: Record<string, string>;
10
+ allowEditing: boolean;
11
+ getDisplayName: (uid: string) => string;
12
+ usersLoading: boolean;
13
+ userSelectComponent: TicketUserSelectComponent;
14
+ onFieldChange: (key: string, value: string) => void;
15
+ onAddCustomField?: () => void;
16
+ labels: Required<TicketDetailsLabels>;
17
+ /** Resets the custom-fields expand state when the ticket changes. */
18
+ ticketId: string | undefined;
19
+ }
20
+ export declare function TicketDetailsSidebar({ sidebarPeopleFields, sidebarDateFields, sidebarCustomFields, values, allowEditing, getDisplayName, usersLoading, userSelectComponent, onFieldChange, onAddCustomField, labels, ticketId, }: Readonly<TicketDetailsSidebarProps>): React.ReactElement;
21
+ //# sourceMappingURL=TicketDetailsSidebar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TicketDetailsSidebar.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/tickets/TicketDetailsSidebar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAI5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AA0CpE,MAAM,WAAW,yBAAyB;IACxC,mBAAmB,EAAE,qBAAqB,EAAE,CAAC;IAC7C,iBAAiB,EAAE,qBAAqB,EAAE,CAAC;IAC3C,mBAAmB,EAAE,qBAAqB,EAAE,CAAC;IAC7C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,YAAY,EAAE,OAAO,CAAC;IACtB,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACxC,YAAY,EAAE,OAAO,CAAC;IACtB,mBAAmB,EAAE,yBAAyB,CAAC;IAC/C,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,MAAM,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IACtC,qEAAqE;IACrE,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAED,wBAAgB,oBAAoB,CAAC,EACnC,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,MAAM,EACN,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAChB,MAAM,EACN,QAAQ,GACT,EAAE,QAAQ,CAAC,yBAAyB,CAAC,GAAG,KAAK,CAAC,YAAY,CA2I1D"}