@xemahq/ui-kernel 0.11.0 → 0.11.2

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 (237) hide show
  1. package/dist/ui/chrome/page-shell.d.ts +1 -1
  2. package/dist/ui/chrome/page-shell.d.ts.map +1 -1
  3. package/dist/ui/chrome/page-shell.js +9 -4
  4. package/dist/ui/chrome/page-shell.js.map +1 -1
  5. package/package.json +6 -4
  6. package/src/index.ts +0 -17
  7. package/src/lib/biome-host/agent-validation.ts +0 -239
  8. package/src/lib/biome-host/biome-builders.ts +0 -112
  9. package/src/lib/biome-host/biome-mode.ts +0 -6
  10. package/src/lib/biome-host/biome-navigation.ts +0 -37
  11. package/src/lib/biome-host/biome-registry.ts +0 -299
  12. package/src/lib/biome-host/biome-scope-hooks.ts +0 -41
  13. package/src/lib/biome-host/biome-scope.tsx +0 -52
  14. package/src/lib/biome-host/biome-scoped-query.ts +0 -134
  15. package/src/lib/biome-host/create-biome-orval-config.ts +0 -82
  16. package/src/lib/biome-host/define-web-biome.spec.ts +0 -221
  17. package/src/lib/biome-host/define-web-biome.ts +0 -222
  18. package/src/lib/biome-host/errors.ts +0 -220
  19. package/src/lib/biome-host/frontend-biome.ts +0 -256
  20. package/src/lib/biome-host/host-bridge.ts +0 -281
  21. package/src/lib/biome-host/host-sources.ts +0 -54
  22. package/src/lib/biome-host/i18n-hooks.ts +0 -51
  23. package/src/lib/biome-host/i18n-port.test.ts +0 -50
  24. package/src/lib/biome-host/i18n-port.ts +0 -96
  25. package/src/lib/biome-host/index.ts +0 -35
  26. package/src/lib/biome-host/realtime-hooks.ts +0 -75
  27. package/src/lib/biome-host/realtime-port.ts +0 -115
  28. package/src/lib/biome-host/session-contributions.ts +0 -296
  29. package/src/lib/biome-host/use-mutation-with-error-toast.ts +0 -90
  30. package/src/lib/biome-host/use-page-state.ts +0 -248
  31. package/src/lib/capabilities/capability-context.ts +0 -25
  32. package/src/lib/capabilities/capability-provider.tsx +0 -73
  33. package/src/lib/capabilities/index.ts +0 -17
  34. package/src/lib/capabilities/types.ts +0 -69
  35. package/src/lib/capabilities/use-capability.ts +0 -79
  36. package/src/lib/contribution-registry/contribution-registry.spec.ts +0 -141
  37. package/src/lib/contribution-registry/contribution-registry.ts +0 -204
  38. package/src/lib/contribution-registry/index.ts +0 -9
  39. package/src/lib/contribution-registry/renderable-registry.ts +0 -142
  40. package/src/lib/system-bus/capability-invoke.ts +0 -92
  41. package/src/lib/system-bus/deeplink.ts +0 -210
  42. package/src/lib/system-bus/enums.ts +0 -86
  43. package/src/lib/system-bus/host-ports.ts +0 -93
  44. package/src/lib/system-bus/index.ts +0 -16
  45. package/src/lib/system-bus/intent-registry.ts +0 -109
  46. package/src/lib/system-bus/intents.ts +0 -113
  47. package/src/lib/system-bus/palette.ts +0 -78
  48. package/src/lib/system-bus/system-bus-builder.ts +0 -159
  49. package/src/lib/system-bus/system-bus.ts +0 -37
  50. package/src/lib/system-bus/windows.ts +0 -51
  51. package/src/offline/id.ts +0 -16
  52. package/src/offline/index.ts +0 -54
  53. package/src/offline/mutation.ts +0 -75
  54. package/src/offline/offline-status-badge.tsx +0 -51
  55. package/src/offline/online-controller.ts +0 -105
  56. package/src/offline/outbox.test.ts +0 -172
  57. package/src/offline/outbox.ts +0 -348
  58. package/src/offline/react-hooks.ts +0 -40
  59. package/src/offline/react.tsx +0 -32
  60. package/src/offline/storage.ts +0 -112
  61. package/src/offline/types.ts +0 -77
  62. package/src/org-db/components/DbResultTable.tsx +0 -176
  63. package/src/org-db/index.ts +0 -1
  64. package/src/pdf/index.ts +0 -11
  65. package/src/registry/index.ts +0 -9
  66. package/src/registry/lib/agent-validation-host.ts +0 -36
  67. package/src/registry/lib/biome-slot.tsx +0 -50
  68. package/src/registry/lib/biomes-enabled-context.ts +0 -20
  69. package/src/registry/lib/extension-points.ts +0 -134
  70. package/src/registry/lib/primitives/SessionEventCard.tsx +0 -164
  71. package/src/registry/lib/primitives/SessionEventTimeline.tsx +0 -95
  72. package/src/registry/lib/primitives/SessionMutationBar.tsx +0 -76
  73. package/src/registry/lib/primitives/SessionTabbedDrawer.tsx +0 -165
  74. package/src/registry/lib/primitives/index.ts +0 -18
  75. package/src/registry/lib/session-context-builder.ts +0 -84
  76. package/src/registry/lib/session-context-provider.tsx +0 -33
  77. package/src/registry/lib/session-context.ts +0 -21
  78. package/src/registry/lib/session-selectors.ts +0 -272
  79. package/src/session/comments/CommentRail.tsx +0 -164
  80. package/src/session/index.ts +0 -3
  81. package/src/session/lib/cn.ts +0 -11
  82. package/src/session/shell/SessionWorkspaceShell.tsx +0 -147
  83. package/src/session-kit/approvals/ApprovalButton.tsx +0 -89
  84. package/src/session-kit/approvals/ApprovalCard.tsx +0 -341
  85. package/src/session-kit/approvals/ApprovalsCenter.tsx +0 -336
  86. package/src/session-kit/approvals/CapabilityApprovalStickyBar.tsx +0 -118
  87. package/src/session-kit/approvals/Obligation.tsx +0 -111
  88. package/src/session-kit/approvals/ScopedBody.tsx +0 -392
  89. package/src/session-kit/approvals/approval-icons.ts +0 -31
  90. package/src/session-kit/approvals/approval-model.ts +0 -204
  91. package/src/session-kit/approvals/index.ts +0 -22
  92. package/src/session-kit/approvals/obligation-display.ts +0 -100
  93. package/src/session-kit/approvals/risk-accent.ts +0 -47
  94. package/src/session-kit/approvals/scope-icons.ts +0 -19
  95. package/src/session-kit/combobox/Combobox.tsx +0 -358
  96. package/src/session-kit/combobox/use-click-outside.ts +0 -21
  97. package/src/session-kit/display/ContextHeader.tsx +0 -148
  98. package/src/session-kit/display/FileDiffCard.tsx +0 -140
  99. package/src/session-kit/display/MD.tsx +0 -162
  100. package/src/session-kit/display/MessageTurn.tsx +0 -157
  101. package/src/session-kit/display/ThinkingPanel.tsx +0 -81
  102. package/src/session-kit/display/TodoChecklist.tsx +0 -120
  103. package/src/session-kit/display/TokenMeter.tsx +0 -89
  104. package/src/session-kit/display/ToolStrip.tsx +0 -278
  105. package/src/session-kit/display/TypingDots.tsx +0 -24
  106. package/src/session-kit/index.ts +0 -44
  107. package/src/session-kit/lib/enums.ts +0 -66
  108. package/src/session-kit/lib/portal-accent.ts +0 -30
  109. package/src/session-kit/lib/status-dot.ts +0 -68
  110. package/src/session-kit/primitives/Avatar.tsx +0 -44
  111. package/src/session-kit/primitives/PortalGlyph.tsx +0 -51
  112. package/src/session-kit/primitives/RiskPill.tsx +0 -95
  113. package/src/session-kit/primitives/ScopeDot.tsx +0 -47
  114. package/src/session-kit/primitives/Segmented.tsx +0 -71
  115. package/src/ui/branding/app-branding-context.ts +0 -20
  116. package/src/ui/branding/app-branding-provider.tsx +0 -123
  117. package/src/ui/branding/sanitize.ts +0 -89
  118. package/src/ui/breakpoints.ts +0 -14
  119. package/src/ui/capture/document-preview.tsx +0 -166
  120. package/src/ui/capture/field-spec-to-zod.test.ts +0 -81
  121. package/src/ui/capture/field-spec-to-zod.ts +0 -174
  122. package/src/ui/capture/field-spec-validate.ts +0 -236
  123. package/src/ui/capture/field-spec.test.ts +0 -49
  124. package/src/ui/capture/field-spec.ts +0 -274
  125. package/src/ui/capture/index.ts +0 -51
  126. package/src/ui/capture/schema-field-input.tsx +0 -620
  127. package/src/ui/capture/schema-form.tsx +0 -149
  128. package/src/ui/capture/submit-values.test.ts +0 -70
  129. package/src/ui/capture/submit-values.ts +0 -63
  130. package/src/ui/capture/use-prefill.ts +0 -186
  131. package/src/ui/capture/use-schema-validation.ts +0 -145
  132. package/src/ui/capture/use-wizard.ts +0 -180
  133. package/src/ui/capture/value-format.ts +0 -32
  134. package/src/ui/capture/wizard.tsx +0 -105
  135. package/src/ui/charts/bar-chart.tsx +0 -139
  136. package/src/ui/charts/chart-frame.tsx +0 -125
  137. package/src/ui/charts/chart-types.ts +0 -52
  138. package/src/ui/charts/chart-utils.ts +0 -190
  139. package/src/ui/charts/charts.test.tsx +0 -204
  140. package/src/ui/charts/donut-chart.tsx +0 -129
  141. package/src/ui/charts/index.ts +0 -27
  142. package/src/ui/charts/line-chart.tsx +0 -202
  143. package/src/ui/charts/sparkline.tsx +0 -109
  144. package/src/ui/chrome/AsyncBoundary.tsx +0 -74
  145. package/src/ui/chrome/EmptyState.tsx +0 -257
  146. package/src/ui/chrome/ErrorCard.tsx +0 -63
  147. package/src/ui/chrome/LoadingState.tsx +0 -61
  148. package/src/ui/chrome/PageHeader.tsx +0 -137
  149. package/src/ui/chrome/RecordCardList.tsx +0 -98
  150. package/src/ui/chrome/StateCard.tsx +0 -150
  151. package/src/ui/chrome/confirm-delete-dialog.tsx +0 -59
  152. package/src/ui/chrome/page-shell.tsx +0 -189
  153. package/src/ui/chrome/scope-badge.tsx +0 -40
  154. package/src/ui/chrome/status-badge.tsx +0 -79
  155. package/src/ui/cn.ts +0 -32
  156. package/src/ui/design-tokens.ts +0 -372
  157. package/src/ui/hooks/use-debounced-value.ts +0 -16
  158. package/src/ui/hooks/use-is-mobile.ts +0 -28
  159. package/src/ui/index.ts +0 -110
  160. package/src/ui/pdf/pdf-preview.tsx +0 -122
  161. package/src/ui/primitives/alert-dialog.tsx +0 -104
  162. package/src/ui/primitives/async-combobox.tsx +0 -182
  163. package/src/ui/primitives/badge-variants.ts +0 -21
  164. package/src/ui/primitives/badge.tsx +0 -25
  165. package/src/ui/primitives/button-variants.ts +0 -31
  166. package/src/ui/primitives/button.tsx +0 -29
  167. package/src/ui/primitives/card.tsx +0 -43
  168. package/src/ui/primitives/checkbox.tsx +0 -26
  169. package/src/ui/primitives/collapsible.tsx +0 -9
  170. package/src/ui/primitives/dialog.tsx +0 -103
  171. package/src/ui/primitives/dropdown-menu.tsx +0 -179
  172. package/src/ui/primitives/form-stepper.tsx +0 -94
  173. package/src/ui/primitives/form-stepper.types.ts +0 -15
  174. package/src/ui/primitives/input.tsx +0 -22
  175. package/src/ui/primitives/label.tsx +0 -17
  176. package/src/ui/primitives/overflow-tabs.tsx +0 -331
  177. package/src/ui/primitives/popover.tsx +0 -33
  178. package/src/ui/primitives/preview-device-frame.tsx +0 -213
  179. package/src/ui/primitives/radio-group.tsx +0 -36
  180. package/src/ui/primitives/resizable.tsx +0 -67
  181. package/src/ui/primitives/scroll-area.tsx +0 -38
  182. package/src/ui/primitives/select.tsx +0 -143
  183. package/src/ui/primitives/separator.tsx +0 -20
  184. package/src/ui/primitives/sheet.tsx +0 -107
  185. package/src/ui/primitives/skeleton.tsx +0 -99
  186. package/src/ui/primitives/switch.tsx +0 -27
  187. package/src/ui/primitives/table.tsx +0 -72
  188. package/src/ui/primitives/tabs.tsx +0 -53
  189. package/src/ui/primitives/tag-multi-select.tsx +0 -261
  190. package/src/ui/primitives/textarea.tsx +0 -21
  191. package/src/ui/primitives/tooltip.tsx +0 -30
  192. package/src/ui/primitives/url-preview-chrome.tsx +0 -103
  193. package/src/vista/GenericCatalogueSurface.tsx +0 -179
  194. package/src/vista/SurfaceFallbackCard.tsx +0 -109
  195. package/src/vista/VistaPanel.tsx +0 -163
  196. package/src/vista/form-payload.spec.ts +0 -139
  197. package/src/vista/html/CustomUiFrame.spec.tsx +0 -127
  198. package/src/vista/html/CustomUiFrame.tsx +0 -206
  199. package/src/vista/html/custom-ui-frame-bridge.spec.ts +0 -191
  200. package/src/vista/html/custom-ui-frame-bridge.ts +0 -98
  201. package/src/vista/html/custom-ui-frame-contract.ts +0 -88
  202. package/src/vista/html/custom-ui-intents.spec.ts +0 -135
  203. package/src/vista/html/custom-ui-intents.ts +0 -155
  204. package/src/vista/html/custom-ui-srcdoc.spec.ts +0 -151
  205. package/src/vista/html/custom-ui-srcdoc.ts +0 -193
  206. package/src/vista/html/index.ts +0 -13
  207. package/src/vista/index.ts +0 -52
  208. package/src/vista/surface-catalogue.spec.ts +0 -140
  209. package/src/vista/surface-catalogue.ts +0 -90
  210. package/src/vista/surface-icons.ts +0 -57
  211. package/src/vista/surface-registry.ts +0 -56
  212. package/src/vista/surfaces/ChartSurface.tsx +0 -34
  213. package/src/vista/surfaces/FilesSurface.tsx +0 -202
  214. package/src/vista/surfaces/FormSurface.tsx +0 -380
  215. package/src/vista/surfaces/HtmlSurface.tsx +0 -43
  216. package/src/vista/surfaces/TableSurface.tsx +0 -100
  217. package/src/vista/surfaces/UrlSurface.tsx +0 -40
  218. package/src/vista/surfaces/blob-surfaces.tsx +0 -139
  219. package/src/vista/surfaces/elicitation-transport.spec.ts +0 -369
  220. package/src/vista/surfaces/elicitation-transport.ts +0 -367
  221. package/src/vista/surfaces/file-surface-utils.ts +0 -69
  222. package/src/vista/surfaces/index.ts +0 -24
  223. package/src/vista/surfaces/register-surfaces.tsx +0 -139
  224. package/src/vista/surfaces/text-surfaces.tsx +0 -132
  225. package/src/vista/use-vista-tabs.ts +0 -196
  226. package/src/vista/vista-code-renderer-context.ts +0 -16
  227. package/src/vista/vista-code-renderer.tsx +0 -35
  228. package/src/vista/vista-file-context.ts +0 -14
  229. package/src/vista/vista-file-source.tsx +0 -141
  230. package/src/vista/vista-form-context.ts +0 -20
  231. package/src/vista/vista-form-host.tsx +0 -48
  232. package/src/vista/vista-model.ts +0 -137
  233. package/src/vista/vista-open-context.tsx +0 -27
  234. package/src/vista/vista-open-state.ts +0 -11
  235. package/src/vista/vista-payloads.ts +0 -635
  236. package/src/vista/vista-tabs-manifest.ts +0 -138
  237. package/src/vista/vista-tools.ts +0 -232
@@ -1,189 +0,0 @@
1
- import { FileQuestion, type LucideIcon } from 'lucide-react';
2
- import { type ReactNode } from 'react';
3
-
4
- import EmptyState from './EmptyState';
5
- import { useHostBridge, type PageBackTarget } from '../../lib/biome-host';
6
- import { Tabs, TabsList, TabsTrigger } from '../primitives/tabs';
7
-
8
- interface TabDef {
9
- value: string;
10
- label: string | ReactNode;
11
- count?: number;
12
- indicator?: boolean;
13
- }
14
-
15
- interface PageShellProps {
16
- icon: LucideIcon;
17
- title: string;
18
- description?: string;
19
- children?: ReactNode;
20
- actions?: ReactNode;
21
- tabs?: TabDef[];
22
- activeTab?: string;
23
- onTabChange?: (value: string) => void;
24
- maxWidth?: string;
25
- embedded?: boolean;
26
- /** Mono caption rendered before the title in the topbar (parent context). */
27
- eyebrow?: string;
28
- /**
29
- * Leftmost icon-only back affordance on the topbar. Pages with a parent
30
- * context MUST set this and MUST NOT render their own in-body back button.
31
- */
32
- backTo?: PageBackTarget;
33
- /**
34
- * Optional right-aligned topbar action cluster. Use for primary CTAs
35
- * (1-3 small buttons). Heavier in-page chrome (filter rows, search
36
- * inputs) should keep using the `actions` slot which renders inside the
37
- * page body.
38
- */
39
- topbarActions?: ReactNode;
40
- }
41
-
42
- /**
43
- * Full-page shell — registers the topbar page-meta (via the HostBridge
44
- * page-meta store) and renders an optional tab strip + action row above the
45
- * scrollable content canvas. Host-framework-agnostic: reaches the page-meta
46
- * store through the kernel `HostBridge` singleton, never a host import.
47
- */
48
- export default function PageShell({
49
- icon: _Icon,
50
- title,
51
- description,
52
- children,
53
- actions,
54
- tabs,
55
- activeTab,
56
- onTabChange,
57
- maxWidth,
58
- embedded,
59
- eyebrow,
60
- backTo,
61
- topbarActions,
62
- }: Readonly<PageShellProps>) {
63
- // Single source of truth for the topbar title. Pages that bypass
64
- // PageShell call the page-meta hook directly; PageShell wraps the same
65
- // hook so consumers don't need to register meta twice.
66
- useHostBridge().pageMeta.usePageMeta({
67
- title,
68
- description,
69
- eyebrow,
70
- backTo,
71
- topbarActions,
72
- });
73
- if (embedded) {
74
- // Embedded mode: the host page already provides the title + tabs +
75
- // context, so we render ONLY the child content + any sub-tab strip +
76
- // actions inline. This eliminates the legacy duplicate icon-and-title
77
- // row that previously stole vertical space.
78
- return (
79
- <div className="flex h-full min-h-0 flex-col bg-paper">
80
- {(tabs && tabs.length > 0) || actions ? (
81
- <div className="shrink-0 border-b border-rule bg-paper-elev/40">
82
- <div className="flex items-center gap-3 px-4 py-2 lg:px-6">
83
- {tabs && tabs.length > 0 && (
84
- <Tabs
85
- value={activeTab}
86
- onValueChange={onTabChange}
87
- className="flex-1 min-w-0"
88
- >
89
- <div className="overflow-x-auto">
90
- <TabsList className="h-7 bg-transparent p-0 gap-0">
91
- {tabs.map((tab) => (
92
- <TabsTrigger
93
- key={tab.value}
94
- value={tab.value}
95
- className="rounded-none border-b-2 border-transparent px-2 py-1 text-body-2 font-medium text-ink-3 transition-colors data-[state=active]:border-primary data-[state=active]:text-ink data-[state=active]:bg-transparent data-[state=active]:shadow-none"
96
- >
97
- {tab.label}
98
- {tab.count !== undefined && (
99
- <span className="ml-1.5 text-caption tabular-nums opacity-70">
100
- {tab.count}
101
- </span>
102
- )}
103
- {tab.indicator && (
104
- <span className="ml-1.5 inline-block h-1.5 w-1.5 rounded-full bg-warning" />
105
- )}
106
- </TabsTrigger>
107
- ))}
108
- </TabsList>
109
- </div>
110
- </Tabs>
111
- )}
112
- {!tabs && <div className="flex-1" />}
113
- {actions && (
114
- <div className="flex items-center gap-2 shrink-0">
115
- {actions}
116
- </div>
117
- )}
118
- </div>
119
- </div>
120
- ) : null}
121
- <div className="flex-1 overflow-auto min-h-0">
122
- <div className="flex h-full min-h-0 flex-col px-4 pb-4 pt-3 lg:px-6">
123
- {children}
124
- </div>
125
- </div>
126
- </div>
127
- );
128
- }
129
-
130
- return (
131
- <div className={`flex h-full min-h-0 flex-col ${maxWidth ?? ''}`}>
132
- {/* Compact toolbar: tabs + actions on the same row */}
133
- {(tabs || actions) && (
134
- <div className="shrink-0 border-b border-border/50 px-4 sm:px-5 lg:px-8">
135
- <div className="flex min-h-[34px] flex-col gap-2 py-1.5 sm:flex-row sm:items-center sm:gap-3 sm:py-0">
136
- {tabs && tabs.length > 0 && (
137
- <Tabs
138
- value={activeTab}
139
- onValueChange={onTabChange}
140
- className="flex-1 min-w-0"
141
- >
142
- <div className="overflow-x-auto">
143
- <TabsList className="h-7 bg-transparent p-0 gap-0">
144
- {tabs.map((tab) => (
145
- <TabsTrigger
146
- key={tab.value}
147
- value={tab.value}
148
- className="whitespace-nowrap rounded-none border-b-2 border-transparent px-2.5 py-1.5 text-caption font-medium text-ink-3/90 transition-colors data-[state=active]:border-primary data-[state=active]:bg-transparent data-[state=active]:text-ink data-[state=active]:shadow-none hover:text-ink"
149
- >
150
- {tab.label}
151
- {tab.count !== undefined && (
152
- <span className="ml-1.5 text-caption tabular-nums opacity-60">
153
- {tab.count}
154
- </span>
155
- )}
156
- {tab.indicator && (
157
- <span className="ml-1.5 inline-block h-1.5 w-1.5 rounded-full bg-warning" />
158
- )}
159
- </TabsTrigger>
160
- ))}
161
- </TabsList>
162
- </div>
163
- </Tabs>
164
- )}
165
- {!tabs && <div className="flex-1" />}
166
- {actions && (
167
- <div className="flex w-full flex-wrap items-center gap-2 sm:w-auto sm:shrink-0 sm:justify-end">
168
- {actions}
169
- </div>
170
- )}
171
- </div>
172
- </div>
173
- )}
174
-
175
- {/* Content area — full height. Padding sized to match other editorial
176
- surfaces (PageHeader-rooted pages use the same `px-4 sm:px-6 py-5`
177
- rhythm). */}
178
- <div className="flex min-h-0 flex-1 flex-col overflow-auto px-4 pb-5 pt-4 sm:px-6 sm:pb-6 sm:pt-5">
179
- {children || (
180
- <EmptyState
181
- icon={FileQuestion}
182
- title="Nothing to show yet"
183
- description="This page has no content to display. Check back once the workspace has data."
184
- />
185
- )}
186
- </div>
187
- </div>
188
- );
189
- }
@@ -1,40 +0,0 @@
1
- import { cn } from '../cn';
2
- import { TONE_STYLES, type Tone } from '../design-tokens';
3
-
4
- export interface ScopeBadgeProps {
5
- /** Short label shown inside the chip. e.g. "system", "org", "override". */
6
- label: string;
7
- /** Visual tone — drives bg/text/border via design tokens. */
8
- tone?: Tone;
9
- /** Optional tooltip text. */
10
- hint?: string;
11
- className?: string;
12
- }
13
-
14
- /**
15
- * Compact uppercase chip for closed-enum scope/source pills (workflow
16
- * source, trigger scope, etc.). Distinct from `<StatusBadge>` which
17
- * carries process-state semantics (running/succeeded/failed/…).
18
- *
19
- * Always renders at the smallest size (`text-[10px]`) because it sits
20
- * inline next to other content on dense list rows.
21
- */
22
- export default function ScopeBadge({
23
- label,
24
- tone = 'neutral',
25
- hint,
26
- className,
27
- }: ScopeBadgeProps) {
28
- return (
29
- <span
30
- className={cn(
31
- 'inline-flex shrink-0 items-center rounded-sm border px-1.5 py-0 text-[10px] font-medium uppercase tracking-wide',
32
- TONE_STYLES[tone],
33
- className,
34
- )}
35
- title={hint}
36
- >
37
- {label}
38
- </span>
39
- );
40
- }
@@ -1,79 +0,0 @@
1
- import { cn } from '../cn';
2
- import { getStatusStyle } from '../design-tokens';
3
- import { Badge } from '../primitives/badge';
4
-
5
- import type { ReactNode } from 'react';
6
-
7
- export type StatusBadgeSize = 'xs' | 'sm' | 'md';
8
-
9
- export interface StatusBadgeProps {
10
- status: string;
11
- className?: string;
12
- dot?: boolean;
13
- size?: StatusBadgeSize;
14
- /** Override the rendered label. Falls back to a capitalized version of `status`. */
15
- children?: ReactNode;
16
- }
17
-
18
- interface SizeTokens {
19
- badge: string;
20
- dot: string;
21
- gap: string;
22
- }
23
-
24
- const SIZE_TOKENS: Record<StatusBadgeSize, SizeTokens> = {
25
- xs: {
26
- badge: 'h-[18px] px-1.5 py-0 text-[10px] font-medium',
27
- dot: 'h-1 w-1',
28
- gap: 'gap-1',
29
- },
30
- sm: {
31
- badge: 'h-5 px-2 py-0 text-caption font-medium',
32
- dot: 'h-1.5 w-1.5',
33
- gap: 'gap-1.5',
34
- },
35
- md: {
36
- badge: 'px-2.5 py-0.5 text-body-1',
37
- dot: 'h-1.5 w-1.5',
38
- gap: 'gap-1.5',
39
- },
40
- };
41
-
42
- /**
43
- * Semantic status badge that reads from the design token system.
44
- * Use across all pages for consistent status display.
45
- *
46
- * Size guidance:
47
- * - `xs` — dense list rows (Sessions, Brainstorming)
48
- * - `sm` — default list rows (Workflow Runs, Schedules, Triggers, dashboards)
49
- * - `md` — detail-page headers + hero surfaces
50
- */
51
- export default function StatusBadge({
52
- status,
53
- className,
54
- dot,
55
- size = 'sm',
56
- children,
57
- }: StatusBadgeProps) {
58
- const style = getStatusStyle(status);
59
- const sz = SIZE_TOKENS[size];
60
- return (
61
- <Badge
62
- variant="outline"
63
- className={cn(
64
- 'inline-flex items-center rounded-full',
65
- sz.badge,
66
- sz.gap,
67
- style.badge,
68
- className,
69
- )}
70
- >
71
- {dot && (
72
- <span className={cn('shrink-0 rounded-full', sz.dot, style.dot)} />
73
- )}
74
- {children ?? (
75
- <span className="capitalize">{status.replace(/_/g, ' ')}</span>
76
- )}
77
- </Badge>
78
- );
79
- }
package/src/ui/cn.ts DELETED
@@ -1,32 +0,0 @@
1
- import { clsx, type ClassValue } from 'clsx';
2
- import { extendTailwindMerge } from 'tailwind-merge';
3
-
4
- // The Xema design system defines a custom typography scale in the host
5
- // Tailwind config (`fontSize` keys: caption / body-1 / body-2 / subtitle /
6
- // title / display). tailwind-merge doesn't know these keys, so it
7
- // misclassifies `text-body-1`, `text-caption`, … as text-*color* utilities
8
- // and silently strips a real `text-*` colour when both land on one element
9
- // via cn(). Registering them in the `font-size` group keeps conflict
10
- // resolution correct.
11
- //
12
- // This is the SAME config the host shell ships in `@/lib/utils`. The shared
13
- // primitives moved into this package MUST merge classes identically, so the
14
- // config is duplicated here (one trivial block) rather than imported from the
15
- // host — this package stays host-framework-agnostic.
16
- const twMerge = extendTailwindMerge({
17
- extend: {
18
- classGroups: {
19
- 'font-size': [
20
- { text: ['caption', 'body-1', 'body-2', 'subtitle', 'title', 'display'] },
21
- ],
22
- },
23
- },
24
- });
25
-
26
- /**
27
- * Tailwind-aware class merge used by every shared UI primitive. Identical in
28
- * behaviour to the host shell's `cn` (including the custom typography scale).
29
- */
30
- export function cn(...inputs: ClassValue[]): string {
31
- return twMerge(clsx(inputs));
32
- }