@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.
- package/dist/ui/chrome/page-shell.d.ts +1 -1
- package/dist/ui/chrome/page-shell.d.ts.map +1 -1
- package/dist/ui/chrome/page-shell.js +9 -4
- package/dist/ui/chrome/page-shell.js.map +1 -1
- package/package.json +6 -4
- package/src/index.ts +0 -17
- package/src/lib/biome-host/agent-validation.ts +0 -239
- package/src/lib/biome-host/biome-builders.ts +0 -112
- package/src/lib/biome-host/biome-mode.ts +0 -6
- package/src/lib/biome-host/biome-navigation.ts +0 -37
- package/src/lib/biome-host/biome-registry.ts +0 -299
- package/src/lib/biome-host/biome-scope-hooks.ts +0 -41
- package/src/lib/biome-host/biome-scope.tsx +0 -52
- package/src/lib/biome-host/biome-scoped-query.ts +0 -134
- package/src/lib/biome-host/create-biome-orval-config.ts +0 -82
- package/src/lib/biome-host/define-web-biome.spec.ts +0 -221
- package/src/lib/biome-host/define-web-biome.ts +0 -222
- package/src/lib/biome-host/errors.ts +0 -220
- package/src/lib/biome-host/frontend-biome.ts +0 -256
- package/src/lib/biome-host/host-bridge.ts +0 -281
- package/src/lib/biome-host/host-sources.ts +0 -54
- package/src/lib/biome-host/i18n-hooks.ts +0 -51
- package/src/lib/biome-host/i18n-port.test.ts +0 -50
- package/src/lib/biome-host/i18n-port.ts +0 -96
- package/src/lib/biome-host/index.ts +0 -35
- package/src/lib/biome-host/realtime-hooks.ts +0 -75
- package/src/lib/biome-host/realtime-port.ts +0 -115
- package/src/lib/biome-host/session-contributions.ts +0 -296
- package/src/lib/biome-host/use-mutation-with-error-toast.ts +0 -90
- package/src/lib/biome-host/use-page-state.ts +0 -248
- package/src/lib/capabilities/capability-context.ts +0 -25
- package/src/lib/capabilities/capability-provider.tsx +0 -73
- package/src/lib/capabilities/index.ts +0 -17
- package/src/lib/capabilities/types.ts +0 -69
- package/src/lib/capabilities/use-capability.ts +0 -79
- package/src/lib/contribution-registry/contribution-registry.spec.ts +0 -141
- package/src/lib/contribution-registry/contribution-registry.ts +0 -204
- package/src/lib/contribution-registry/index.ts +0 -9
- package/src/lib/contribution-registry/renderable-registry.ts +0 -142
- package/src/lib/system-bus/capability-invoke.ts +0 -92
- package/src/lib/system-bus/deeplink.ts +0 -210
- package/src/lib/system-bus/enums.ts +0 -86
- package/src/lib/system-bus/host-ports.ts +0 -93
- package/src/lib/system-bus/index.ts +0 -16
- package/src/lib/system-bus/intent-registry.ts +0 -109
- package/src/lib/system-bus/intents.ts +0 -113
- package/src/lib/system-bus/palette.ts +0 -78
- package/src/lib/system-bus/system-bus-builder.ts +0 -159
- package/src/lib/system-bus/system-bus.ts +0 -37
- package/src/lib/system-bus/windows.ts +0 -51
- package/src/offline/id.ts +0 -16
- package/src/offline/index.ts +0 -54
- package/src/offline/mutation.ts +0 -75
- package/src/offline/offline-status-badge.tsx +0 -51
- package/src/offline/online-controller.ts +0 -105
- package/src/offline/outbox.test.ts +0 -172
- package/src/offline/outbox.ts +0 -348
- package/src/offline/react-hooks.ts +0 -40
- package/src/offline/react.tsx +0 -32
- package/src/offline/storage.ts +0 -112
- package/src/offline/types.ts +0 -77
- package/src/org-db/components/DbResultTable.tsx +0 -176
- package/src/org-db/index.ts +0 -1
- package/src/pdf/index.ts +0 -11
- package/src/registry/index.ts +0 -9
- package/src/registry/lib/agent-validation-host.ts +0 -36
- package/src/registry/lib/biome-slot.tsx +0 -50
- package/src/registry/lib/biomes-enabled-context.ts +0 -20
- package/src/registry/lib/extension-points.ts +0 -134
- package/src/registry/lib/primitives/SessionEventCard.tsx +0 -164
- package/src/registry/lib/primitives/SessionEventTimeline.tsx +0 -95
- package/src/registry/lib/primitives/SessionMutationBar.tsx +0 -76
- package/src/registry/lib/primitives/SessionTabbedDrawer.tsx +0 -165
- package/src/registry/lib/primitives/index.ts +0 -18
- package/src/registry/lib/session-context-builder.ts +0 -84
- package/src/registry/lib/session-context-provider.tsx +0 -33
- package/src/registry/lib/session-context.ts +0 -21
- package/src/registry/lib/session-selectors.ts +0 -272
- package/src/session/comments/CommentRail.tsx +0 -164
- package/src/session/index.ts +0 -3
- package/src/session/lib/cn.ts +0 -11
- package/src/session/shell/SessionWorkspaceShell.tsx +0 -147
- package/src/session-kit/approvals/ApprovalButton.tsx +0 -89
- package/src/session-kit/approvals/ApprovalCard.tsx +0 -341
- package/src/session-kit/approvals/ApprovalsCenter.tsx +0 -336
- package/src/session-kit/approvals/CapabilityApprovalStickyBar.tsx +0 -118
- package/src/session-kit/approvals/Obligation.tsx +0 -111
- package/src/session-kit/approvals/ScopedBody.tsx +0 -392
- package/src/session-kit/approvals/approval-icons.ts +0 -31
- package/src/session-kit/approvals/approval-model.ts +0 -204
- package/src/session-kit/approvals/index.ts +0 -22
- package/src/session-kit/approvals/obligation-display.ts +0 -100
- package/src/session-kit/approvals/risk-accent.ts +0 -47
- package/src/session-kit/approvals/scope-icons.ts +0 -19
- package/src/session-kit/combobox/Combobox.tsx +0 -358
- package/src/session-kit/combobox/use-click-outside.ts +0 -21
- package/src/session-kit/display/ContextHeader.tsx +0 -148
- package/src/session-kit/display/FileDiffCard.tsx +0 -140
- package/src/session-kit/display/MD.tsx +0 -162
- package/src/session-kit/display/MessageTurn.tsx +0 -157
- package/src/session-kit/display/ThinkingPanel.tsx +0 -81
- package/src/session-kit/display/TodoChecklist.tsx +0 -120
- package/src/session-kit/display/TokenMeter.tsx +0 -89
- package/src/session-kit/display/ToolStrip.tsx +0 -278
- package/src/session-kit/display/TypingDots.tsx +0 -24
- package/src/session-kit/index.ts +0 -44
- package/src/session-kit/lib/enums.ts +0 -66
- package/src/session-kit/lib/portal-accent.ts +0 -30
- package/src/session-kit/lib/status-dot.ts +0 -68
- package/src/session-kit/primitives/Avatar.tsx +0 -44
- package/src/session-kit/primitives/PortalGlyph.tsx +0 -51
- package/src/session-kit/primitives/RiskPill.tsx +0 -95
- package/src/session-kit/primitives/ScopeDot.tsx +0 -47
- package/src/session-kit/primitives/Segmented.tsx +0 -71
- package/src/ui/branding/app-branding-context.ts +0 -20
- package/src/ui/branding/app-branding-provider.tsx +0 -123
- package/src/ui/branding/sanitize.ts +0 -89
- package/src/ui/breakpoints.ts +0 -14
- package/src/ui/capture/document-preview.tsx +0 -166
- package/src/ui/capture/field-spec-to-zod.test.ts +0 -81
- package/src/ui/capture/field-spec-to-zod.ts +0 -174
- package/src/ui/capture/field-spec-validate.ts +0 -236
- package/src/ui/capture/field-spec.test.ts +0 -49
- package/src/ui/capture/field-spec.ts +0 -274
- package/src/ui/capture/index.ts +0 -51
- package/src/ui/capture/schema-field-input.tsx +0 -620
- package/src/ui/capture/schema-form.tsx +0 -149
- package/src/ui/capture/submit-values.test.ts +0 -70
- package/src/ui/capture/submit-values.ts +0 -63
- package/src/ui/capture/use-prefill.ts +0 -186
- package/src/ui/capture/use-schema-validation.ts +0 -145
- package/src/ui/capture/use-wizard.ts +0 -180
- package/src/ui/capture/value-format.ts +0 -32
- package/src/ui/capture/wizard.tsx +0 -105
- package/src/ui/charts/bar-chart.tsx +0 -139
- package/src/ui/charts/chart-frame.tsx +0 -125
- package/src/ui/charts/chart-types.ts +0 -52
- package/src/ui/charts/chart-utils.ts +0 -190
- package/src/ui/charts/charts.test.tsx +0 -204
- package/src/ui/charts/donut-chart.tsx +0 -129
- package/src/ui/charts/index.ts +0 -27
- package/src/ui/charts/line-chart.tsx +0 -202
- package/src/ui/charts/sparkline.tsx +0 -109
- package/src/ui/chrome/AsyncBoundary.tsx +0 -74
- package/src/ui/chrome/EmptyState.tsx +0 -257
- package/src/ui/chrome/ErrorCard.tsx +0 -63
- package/src/ui/chrome/LoadingState.tsx +0 -61
- package/src/ui/chrome/PageHeader.tsx +0 -137
- package/src/ui/chrome/RecordCardList.tsx +0 -98
- package/src/ui/chrome/StateCard.tsx +0 -150
- package/src/ui/chrome/confirm-delete-dialog.tsx +0 -59
- package/src/ui/chrome/page-shell.tsx +0 -189
- package/src/ui/chrome/scope-badge.tsx +0 -40
- package/src/ui/chrome/status-badge.tsx +0 -79
- package/src/ui/cn.ts +0 -32
- package/src/ui/design-tokens.ts +0 -372
- package/src/ui/hooks/use-debounced-value.ts +0 -16
- package/src/ui/hooks/use-is-mobile.ts +0 -28
- package/src/ui/index.ts +0 -110
- package/src/ui/pdf/pdf-preview.tsx +0 -122
- package/src/ui/primitives/alert-dialog.tsx +0 -104
- package/src/ui/primitives/async-combobox.tsx +0 -182
- package/src/ui/primitives/badge-variants.ts +0 -21
- package/src/ui/primitives/badge.tsx +0 -25
- package/src/ui/primitives/button-variants.ts +0 -31
- package/src/ui/primitives/button.tsx +0 -29
- package/src/ui/primitives/card.tsx +0 -43
- package/src/ui/primitives/checkbox.tsx +0 -26
- package/src/ui/primitives/collapsible.tsx +0 -9
- package/src/ui/primitives/dialog.tsx +0 -103
- package/src/ui/primitives/dropdown-menu.tsx +0 -179
- package/src/ui/primitives/form-stepper.tsx +0 -94
- package/src/ui/primitives/form-stepper.types.ts +0 -15
- package/src/ui/primitives/input.tsx +0 -22
- package/src/ui/primitives/label.tsx +0 -17
- package/src/ui/primitives/overflow-tabs.tsx +0 -331
- package/src/ui/primitives/popover.tsx +0 -33
- package/src/ui/primitives/preview-device-frame.tsx +0 -213
- package/src/ui/primitives/radio-group.tsx +0 -36
- package/src/ui/primitives/resizable.tsx +0 -67
- package/src/ui/primitives/scroll-area.tsx +0 -38
- package/src/ui/primitives/select.tsx +0 -143
- package/src/ui/primitives/separator.tsx +0 -20
- package/src/ui/primitives/sheet.tsx +0 -107
- package/src/ui/primitives/skeleton.tsx +0 -99
- package/src/ui/primitives/switch.tsx +0 -27
- package/src/ui/primitives/table.tsx +0 -72
- package/src/ui/primitives/tabs.tsx +0 -53
- package/src/ui/primitives/tag-multi-select.tsx +0 -261
- package/src/ui/primitives/textarea.tsx +0 -21
- package/src/ui/primitives/tooltip.tsx +0 -30
- package/src/ui/primitives/url-preview-chrome.tsx +0 -103
- package/src/vista/GenericCatalogueSurface.tsx +0 -179
- package/src/vista/SurfaceFallbackCard.tsx +0 -109
- package/src/vista/VistaPanel.tsx +0 -163
- package/src/vista/form-payload.spec.ts +0 -139
- package/src/vista/html/CustomUiFrame.spec.tsx +0 -127
- package/src/vista/html/CustomUiFrame.tsx +0 -206
- package/src/vista/html/custom-ui-frame-bridge.spec.ts +0 -191
- package/src/vista/html/custom-ui-frame-bridge.ts +0 -98
- package/src/vista/html/custom-ui-frame-contract.ts +0 -88
- package/src/vista/html/custom-ui-intents.spec.ts +0 -135
- package/src/vista/html/custom-ui-intents.ts +0 -155
- package/src/vista/html/custom-ui-srcdoc.spec.ts +0 -151
- package/src/vista/html/custom-ui-srcdoc.ts +0 -193
- package/src/vista/html/index.ts +0 -13
- package/src/vista/index.ts +0 -52
- package/src/vista/surface-catalogue.spec.ts +0 -140
- package/src/vista/surface-catalogue.ts +0 -90
- package/src/vista/surface-icons.ts +0 -57
- package/src/vista/surface-registry.ts +0 -56
- package/src/vista/surfaces/ChartSurface.tsx +0 -34
- package/src/vista/surfaces/FilesSurface.tsx +0 -202
- package/src/vista/surfaces/FormSurface.tsx +0 -380
- package/src/vista/surfaces/HtmlSurface.tsx +0 -43
- package/src/vista/surfaces/TableSurface.tsx +0 -100
- package/src/vista/surfaces/UrlSurface.tsx +0 -40
- package/src/vista/surfaces/blob-surfaces.tsx +0 -139
- package/src/vista/surfaces/elicitation-transport.spec.ts +0 -369
- package/src/vista/surfaces/elicitation-transport.ts +0 -367
- package/src/vista/surfaces/file-surface-utils.ts +0 -69
- package/src/vista/surfaces/index.ts +0 -24
- package/src/vista/surfaces/register-surfaces.tsx +0 -139
- package/src/vista/surfaces/text-surfaces.tsx +0 -132
- package/src/vista/use-vista-tabs.ts +0 -196
- package/src/vista/vista-code-renderer-context.ts +0 -16
- package/src/vista/vista-code-renderer.tsx +0 -35
- package/src/vista/vista-file-context.ts +0 -14
- package/src/vista/vista-file-source.tsx +0 -141
- package/src/vista/vista-form-context.ts +0 -20
- package/src/vista/vista-form-host.tsx +0 -48
- package/src/vista/vista-model.ts +0 -137
- package/src/vista/vista-open-context.tsx +0 -27
- package/src/vista/vista-open-state.ts +0 -11
- package/src/vista/vista-payloads.ts +0 -635
- package/src/vista/vista-tabs-manifest.ts +0 -138
- 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
|
-
}
|