@joshuan/design-system 0.0.0-stage → 0.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.
package/README.md CHANGED
@@ -1,3 +1,35 @@
1
- # Temporary Holding Version
1
+ # @joshuan/design-system
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Shared UI foundations for Legere and Rent Manager, built for Ant Design 6 and React 19.
4
+ The source contract and extraction audit are in `docs/design-system.md` at the repository root.
5
+
6
+ ```tsx
7
+ import { createAppTheme } from '@joshuan/design-system/antd';
8
+ import { PageHeader, useSystemAppearance } from '@joshuan/design-system/react';
9
+ import '@joshuan/design-system/styles.css';
10
+
11
+ // Inside your provider; locale, account preference and hydration policy remain local.
12
+ const { dark, reducedMotion } = useSystemAppearance();
13
+ const theme = createAppTheme({ dark, reducedMotion, accent: 'green' });
14
+ // Pass theme to Ant Design ConfigProvider. Render its App below it for CSS variables.
15
+ // Use accent: 'blue' for Rent Manager.
16
+ ```
17
+
18
+ `PageHeader` receives title, description, back, actions and meta as React nodes. It renders one h1.
19
+ Pass a host Link as `back`; the package never owns routing or translations. Import the stylesheet
20
+ once in the root layout. Self-host IBM Plex Sans and Mono as `--font-sans` and `--font-mono`.
21
+ Root exports contain palettes, font declarations and dimensions; they have no React side effects.
22
+ `/react` preserves its client boundary. Components and Ant Design are peers, never bundled copies.
23
+
24
+ `NavigationFrame` supplies the same 240/64 px collapsible sidebar and 280 px phone drawer to
25
+ both products. It starts compact between 768 and 1023 px, uses the drawer below 768 px, and keeps
26
+ an explicit desktop collapse choice during client navigation. Supply `pathname`, localized
27
+ `labels`, product `navigation(collapsed)` content and a `brand` home link containing
28
+ `<AppBrand name={name} mark={mark} />`. Links, route changes, Escape and leaving the phone
29
+ breakpoint close the drawer. Routes, account controls and menu expansion remain host-owned.
30
+ The same AppBrand belongs in public authentication headers, always inside a home link.
31
+
32
+ Build with `npm run build --workspace @joshuan/design-system`. The build generates CSS dimensions
33
+ from the same source as TypeScript. Pack with `npm pack --workspace @joshuan/design-system`.
34
+ Do not copy styles or themes into applications. Product-specific viewer and apartment layouts stay
35
+ in the applications. Changes to colours, headings or dimensions require both consumer visual suites.
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createAppTheme = createAppTheme;
4
+ const antd_1 = require("antd");
5
+ const palette_js_1 = require("./palette.js");
6
+ const index_js_1 = require("./index.js");
7
+ function createAppTheme({ dark, accent, reducedMotion = false, }) {
8
+ const c = (0, palette_js_1.paletteFor)(dark, accent);
9
+ return {
10
+ algorithm: dark ? antd_1.theme.darkAlgorithm : antd_1.theme.defaultAlgorithm,
11
+ cssVar: { prefix: 'ant' },
12
+ token: {
13
+ colorPrimary: c.primary,
14
+ colorPrimaryHover: c.primaryHover,
15
+ colorPrimaryActive: c.primaryActive,
16
+ colorPrimaryText: c.primary,
17
+ colorPrimaryTextHover: c.primaryHover,
18
+ colorPrimaryTextActive: c.primaryActive,
19
+ colorLink: c.primary,
20
+ colorLinkHover: c.primaryHover,
21
+ colorLinkActive: c.primaryActive,
22
+ colorInfo: c.info,
23
+ colorSuccess: c.success,
24
+ colorWarning: c.warning,
25
+ colorError: c.error,
26
+ colorErrorText: c.error,
27
+ colorErrorHover: dark ? '#F2ABB0' : '#9F3240',
28
+ colorErrorActive: dark ? '#DA7F87' : '#852936',
29
+ colorErrorTextHover: dark ? '#F2ABB0' : '#9F3240',
30
+ colorErrorTextActive: dark ? '#DA7F87' : '#852936',
31
+ colorSuccessText: c.success,
32
+ colorWarningText: c.warning,
33
+ colorInfoText: c.info,
34
+ colorBgBase: dark ? c.page : c.surface,
35
+ colorFillAlter: dark ? c.surfaceRaised : c.page,
36
+ motion: !reducedMotion,
37
+ // The default palette generator makes pale surfaces muddy when the seed is a dark,
38
+ // accessible accent. Keep light feedback surfaces quiet and their text readable.
39
+ ...(!dark && {
40
+ colorPrimaryBg: accent === 'green' ? '#EAF4F0' : '#ECF2FD',
41
+ colorPrimaryBgHover: accent === 'green' ? '#DCEEE6' : '#DCE7FA',
42
+ colorPrimaryBorder: accent === 'green' ? '#AFCFC4' : '#B5C9EF',
43
+ colorPrimaryBorderHover: accent === 'green' ? '#87B8A8' : '#86A7E0',
44
+ colorInfoBg: accent === 'green' ? '#F2F9F6' : '#F2F6FD',
45
+ colorInfoBgHover: accent === 'green' ? '#E3F1EB' : '#E3EBFA',
46
+ colorInfoBorder: accent === 'green' ? '#B7D8CD' : '#B5C9EF',
47
+ colorSuccessBg: '#F1F9F3',
48
+ colorSuccessBgHover: '#E0EFE4',
49
+ colorSuccessBorder: '#BFDDC7',
50
+ colorWarningBg: '#FCF8EE',
51
+ colorWarningBgHover: '#F7EDD4',
52
+ colorWarningBorder: '#E7D6AE',
53
+ colorErrorBg: '#FDF5F6',
54
+ colorErrorBgHover: '#F6E1E5',
55
+ colorErrorBorder: '#ECC5CC',
56
+ }),
57
+ colorBgLayout: c.page,
58
+ colorBgContainer: c.surface,
59
+ colorBgElevated: c.surfaceRaised,
60
+ colorBorder: c.borderStrong,
61
+ colorBorderSecondary: c.border,
62
+ colorText: c.text,
63
+ colorTextSecondary: c.textSecondary,
64
+ colorTextDescription: c.textSecondary,
65
+ colorTextDisabled: c.textSecondary,
66
+ colorTextPlaceholder: c.textSecondary,
67
+ fontFamily: index_js_1.FONT_SANS,
68
+ fontFamilyCode: index_js_1.FONT_MONO,
69
+ fontSize: 14,
70
+ lineHeight: 1.5,
71
+ borderRadius: 6,
72
+ borderRadiusLG: 8,
73
+ borderRadiusSM: 4,
74
+ controlHeight: index_js_1.dimensions.control,
75
+ controlHeightSM: index_js_1.dimensions.controlSmall,
76
+ controlHeightLG: index_js_1.dimensions.touchTarget,
77
+ colorTextLightSolid: dark ? c.page : c.surface,
78
+ fontSizeHeading1: index_js_1.dimensions.pageTitle,
79
+ fontSizeHeading2: 22,
80
+ fontSizeHeading3: 18,
81
+ fontSizeHeading4: 16,
82
+ fontSizeHeading5: 14,
83
+ wireframe: false,
84
+ // Depth is an interaction, not a default: nothing floats at rest.
85
+ boxShadow: dark
86
+ ? '0 1px 2px rgba(0, 0, 0, 0.5), 0 8px 24px -12px rgba(0, 0, 0, 0.7)'
87
+ : '0 1px 2px rgba(24, 45, 54, 0.06), 0 12px 32px -16px rgba(24, 45, 54, 0.20)',
88
+ boxShadowSecondary: dark
89
+ ? '0 6px 20px -8px rgba(0, 0, 0, 0.7)'
90
+ : '0 6px 20px -10px rgba(24, 45, 54, 0.16)',
91
+ motionDurationMid: `${index_js_1.dimensions.motion}ms`,
92
+ },
93
+ components: {
94
+ Layout: {
95
+ bodyBg: c.page,
96
+ siderBg: c.surface,
97
+ },
98
+ Menu: {
99
+ itemBg: 'transparent',
100
+ subMenuItemBg: 'transparent',
101
+ itemSelectedBg: `${c.primary}${dark ? '1F' : '14'}`,
102
+ itemSelectedColor: c.primary,
103
+ itemHoverBg: dark ? 'rgba(231, 239, 242, 0.05)' : 'rgba(36, 50, 59, 0.04)',
104
+ itemHeight: index_js_1.dimensions.control,
105
+ itemMarginInline: 8,
106
+ itemBorderRadius: 6,
107
+ iconSize: 16,
108
+ },
109
+ Card: {
110
+ colorBorderSecondary: c.border,
111
+ bodyPadding: 20,
112
+ headerHeight: 48,
113
+ headerFontSize: 16,
114
+ },
115
+ Table: {
116
+ headerBg: c.page,
117
+ headerColor: c.textSecondary,
118
+ borderColor: c.border,
119
+ cellPaddingBlock: 12,
120
+ cellPaddingInline: 16,
121
+ cellPaddingBlockSM: 10,
122
+ cellPaddingInlineSM: 12,
123
+ rowHoverBg: `${c.primary}09`,
124
+ },
125
+ Tag: { borderRadiusSM: 4, defaultBg: c.page },
126
+ Button: {
127
+ fontWeight: 500,
128
+ primaryShadow: 'none',
129
+ defaultShadow: 'none',
130
+ dangerShadow: 'none',
131
+ primaryColor: dark ? c.page : c.surface,
132
+ dangerColor: dark ? c.page : c.surface,
133
+ },
134
+ Input: {
135
+ activeShadow: `0 0 0 3px ${c.primary}26`,
136
+ },
137
+ Statistic: { contentFontSize: 26 },
138
+ Segmented: { itemSelectedBg: c.surfaceRaised },
139
+ Tooltip: {
140
+ colorBgSpotlight: dark ? c.surfaceRaised : c.text,
141
+ colorTextLightSolid: dark ? c.text : c.surface,
142
+ },
143
+ Form: { itemMarginBottom: 20, verticalLabelPadding: '0 0 6px', labelColor: c.text },
144
+ Descriptions: { labelColor: c.textSecondary },
145
+ Tabs: { horizontalItemPadding: '12px 0', horizontalItemGutter: 24, titleFontSize: 14 },
146
+ Modal: { borderRadiusLG: 12, titleFontSize: 18 },
147
+ Drawer: { footerPaddingBlock: 16, footerPaddingInline: 20 },
148
+ DatePicker: { cellWidth: 32, cellHeight: 32 },
149
+ },
150
+ };
151
+ }
152
+ //# sourceMappingURL=antd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"antd.js","sourceRoot":"","sources":["../../src/antd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FONT_MONO = exports.FONT_SANS = exports.dimensions = exports.paletteFor = void 0;
4
+ var palette_js_1 = require("./palette.js");
5
+ Object.defineProperty(exports, "paletteFor", { enumerable: true, get: function () { return palette_js_1.paletteFor; } });
6
+ exports.dimensions = {
7
+ sidebar: 240,
8
+ sidebarCollapsed: 64,
9
+ navigationDrawer: 280,
10
+ formDialog: 640,
11
+ gutter: 24,
12
+ gutterTablet: 16,
13
+ gutterPhone: 12,
14
+ pageTitle: 24,
15
+ pageTitlePhone: 20,
16
+ control: 40,
17
+ controlSmall: 32,
18
+ touchTarget: 44,
19
+ motion: 140,
20
+ };
21
+ exports.FONT_SANS = 'var(--font-sans, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif)';
22
+ exports.FONT_MONO = 'var(--font-mono, ui-monospace, monospace)';
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,2CAAqE;AAA5D,wGAAA,UAAU,OAAA;AACN,QAAA,UAAU,GAAG;IACxB,OAAO,EAAE,GAAG;IACZ,gBAAgB,EAAE,EAAE;IACpB,gBAAgB,EAAE,GAAG;IACrB,UAAU,EAAE,GAAG;IACf,MAAM,EAAE,EAAE;IACV,YAAY,EAAE,EAAE;IAChB,WAAW,EAAE,EAAE;IACf,SAAS,EAAE,EAAE;IACb,cAAc,EAAE,EAAE;IAClB,OAAO,EAAE,EAAE;IACX,YAAY,EAAE,EAAE;IAChB,WAAW,EAAE,EAAE;IACf,MAAM,EAAE,GAAG;CACH,CAAC;AAEE,QAAA,SAAS,GACpB,6EAA6E,CAAC;AACnE,QAAA,SAAS,GAAG,2CAA2C,CAAC"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.serverSnapshot = void 0;
4
+ exports.mediaStore = mediaStore;
5
+ function mediaStore(query) {
6
+ return {
7
+ subscribe(listener) {
8
+ if (typeof window === 'undefined' || typeof window.matchMedia !== 'function')
9
+ return () => { };
10
+ const media = window.matchMedia(query);
11
+ media.addEventListener('change', listener);
12
+ return () => media.removeEventListener('change', listener);
13
+ },
14
+ snapshot() {
15
+ return typeof window !== 'undefined' && typeof window.matchMedia === 'function'
16
+ ? window.matchMedia(query).matches
17
+ : false;
18
+ },
19
+ };
20
+ }
21
+ const serverSnapshot = () => false;
22
+ exports.serverSnapshot = serverSnapshot;
23
+ //# sourceMappingURL=media.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.js","sourceRoot":"","sources":["../../src/media.ts"],"names":[],"mappings":";;;AAAA,gCAcC;AAdD,SAAgB,UAAU,CAAC,KAAa;IACtC,OAAO;QACL,SAAS,CAAa,QAAoB;YACxC,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,UAAU;gBAAE,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;YAC9F,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACvC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC3C,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC7D,CAAC;QACD,QAAQ;YACN,OAAO,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,UAAU;gBAC7E,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,OAAO;gBAClC,CAAC,CAAC,KAAK,CAAC;QACZ,CAAC;KACF,CAAC;AACJ,CAAC;AAEM,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC;AAA7B,QAAA,cAAc,kBAAe"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ 'use client';
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.AppBrand = AppBrand;
5
+ exports.NavigationFrame = NavigationFrame;
6
+ const jsx_runtime_1 = require("react/jsx-runtime");
7
+ const react_1 = require("react");
8
+ const antd_1 = require("antd");
9
+ const index_js_1 = require("./index.js");
10
+ const media_js_1 = require("./media.js");
11
+ const phone = (0, media_js_1.mediaStore)('(max-width: 767px)');
12
+ const tablet = (0, media_js_1.mediaStore)('(max-width: 1023px)');
13
+ function AppBrand({ name, mark }) {
14
+ return ((0, jsx_runtime_1.jsxs)("span", { className: "jui-brand", children: [(0, jsx_runtime_1.jsx)("span", { className: "jui-brand-mark", "aria-hidden": "true", children: mark }), (0, jsx_runtime_1.jsx)("span", { className: "jui-brand-name", children: name })] }));
15
+ }
16
+ function NavigationIcon({ kind }) {
17
+ const path = {
18
+ open: 'M3 5h18M3 12h18M3 19h18',
19
+ close: 'm6 6 12 12M6 18 18 6',
20
+ collapse: 'm14 6-6 6 6 6',
21
+ expand: 'm10 6 6 6-6 6',
22
+ }[kind];
23
+ return ((0, jsx_runtime_1.jsx)("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.7", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: (0, jsx_runtime_1.jsx)("path", { d: path }) }));
24
+ }
25
+ /** Shared navigation mechanics; menus, user controls and routes remain in the applications. */
26
+ function NavigationFrame({ brand, pathname, navigation, children, mobileActions, labels, }) {
27
+ const mobile = (0, react_1.useSyncExternalStore)(phone.subscribe, phone.snapshot, media_js_1.serverSnapshot);
28
+ const narrow = (0, react_1.useSyncExternalStore)(tablet.subscribe, tablet.snapshot, media_js_1.serverSnapshot);
29
+ const [preference, setPreference] = (0, react_1.useState)(null);
30
+ const collapsed = preference ?? narrow;
31
+ const [openedAt, setOpenedAt] = (0, react_1.useState)(null);
32
+ const open = mobile && openedAt === pathname;
33
+ if (openedAt !== null && (openedAt !== pathname || !mobile))
34
+ setOpenedAt(null);
35
+ const id = (0, react_1.useId)();
36
+ const { token } = antd_1.theme.useToken();
37
+ const close = () => setOpenedAt(null);
38
+ const content = (compact) => ((0, jsx_runtime_1.jsxs)("nav", { id: id, "aria-label": labels.navigation, className: "jui-navigation", "data-collapsed": compact, onClick: (event) => {
39
+ if (event.target instanceof Element && event.target.closest('a[href]'))
40
+ close();
41
+ }, children: [(0, jsx_runtime_1.jsxs)("div", { className: "jui-navigation-brand", children: [brand, mobile && ((0, jsx_runtime_1.jsx)(antd_1.Button, { type: "text", "aria-label": labels.close, onClick: close, icon: (0, jsx_runtime_1.jsx)(NavigationIcon, { kind: "close" }) }))] }), (0, jsx_runtime_1.jsx)("div", { className: "jui-navigation-body", children: navigation(compact) }), !mobile && ((0, jsx_runtime_1.jsx)(antd_1.Button, { type: "text", className: "jui-navigation-toggle", "aria-label": compact ? labels.expand : labels.collapse, "aria-expanded": !compact, "aria-controls": id, onClick: () => setPreference(!compact), icon: (0, jsx_runtime_1.jsx)(NavigationIcon, { kind: compact ? 'expand' : 'collapse' }) }))] }));
42
+ return ((0, jsx_runtime_1.jsxs)(antd_1.Layout, { className: "jui-shell", children: [mobile ? ((0, jsx_runtime_1.jsx)(antd_1.Drawer, { className: "jui-navigation-drawer", placement: "left", size: index_js_1.dimensions.navigationDrawer, open: open, onClose: close, closable: false, title: null, destroyOnHidden: true, "aria-label": labels.navigation, styles: { body: { padding: 0 } }, children: content(false) })) : ((0, jsx_runtime_1.jsx)(antd_1.Layout.Sider, { className: "jui-sidebar", width: index_js_1.dimensions.sidebar, collapsedWidth: index_js_1.dimensions.sidebarCollapsed, collapsed: collapsed, trigger: null, style: {
43
+ position: 'sticky',
44
+ top: 0,
45
+ height: '100dvh',
46
+ background: token.colorBgContainer,
47
+ borderInlineEnd: `1px solid ${token.colorBorderSecondary}`,
48
+ }, children: content(collapsed) })), (0, jsx_runtime_1.jsxs)(antd_1.Layout, { className: "jui-shell-main", children: [mobile && ((0, jsx_runtime_1.jsxs)("div", { className: "jui-mobile-bar", children: [(0, jsx_runtime_1.jsx)(antd_1.Button, { type: "text", "aria-label": labels.open, "aria-expanded": open, "aria-controls": id, onClick: () => setOpenedAt(pathname), icon: (0, jsx_runtime_1.jsx)(NavigationIcon, { kind: "open" }) }), brand, mobileActions] })), children] })] }));
49
+ }
50
+ //# sourceMappingURL=navigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation.js","sourceRoot":"","sources":["../../src/navigation.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"type":"commonjs"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.paletteFor = paletteFor;
4
+ const LIGHT = {
5
+ page: '#F5F7F8',
6
+ surface: '#FFFFFF',
7
+ surfaceRaised: '#FFFFFF',
8
+ border: '#DEE5E8',
9
+ borderStrong: '#BCC9CF',
10
+ text: '#24323B',
11
+ textSecondary: '#5F7079',
12
+ primary: '#247463',
13
+ primaryHover: '#1E6657',
14
+ primaryActive: '#195A4D',
15
+ accent: '#936719',
16
+ success: '#34764A',
17
+ warning: '#936719',
18
+ error: '#B43F4D',
19
+ info: '#247463',
20
+ };
21
+ const DARK = {
22
+ page: '#121A1E',
23
+ surface: '#1A252B',
24
+ surfaceRaised: '#223139',
25
+ border: '#30434B',
26
+ borderStrong: '#58707B',
27
+ text: '#E7EFF2',
28
+ textSecondary: '#A2B3BA',
29
+ primary: '#73C4AF',
30
+ primaryHover: '#94D7C5',
31
+ primaryActive: '#56A68F',
32
+ accent: '#E0B56C',
33
+ success: '#88C89E',
34
+ warning: '#E0B56C',
35
+ error: '#FF9C9C',
36
+ info: '#73C4AF',
37
+ };
38
+ function paletteFor(dark, accent = 'green') {
39
+ const neutral = dark ? DARK : LIGHT;
40
+ if (accent === 'green')
41
+ return { ...neutral };
42
+ return {
43
+ ...neutral,
44
+ primary: dark ? '#82ADFF' : '#245FC8',
45
+ primaryHover: dark ? '#ADCAFF' : '#1D54B5',
46
+ primaryActive: dark ? '#6A98EC' : '#164DA9',
47
+ info: dark ? '#82ADFF' : '#245FC8',
48
+ };
49
+ }
50
+ //# sourceMappingURL=palette.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"palette.js","sourceRoot":"","sources":["../../src/palette.ts"],"names":[],"mappings":";;AAwDA,gCAUC;AAhDD,MAAM,KAAK,GAAY;IACrB,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,SAAS;IAClB,aAAa,EAAE,SAAS;IACxB,MAAM,EAAE,SAAS;IACjB,YAAY,EAAE,SAAS;IACvB,IAAI,EAAE,SAAS;IACf,aAAa,EAAE,SAAS;IACxB,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,SAAS;IACvB,aAAa,EAAE,SAAS;IACxB,MAAM,EAAE,SAAS;IACjB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,SAAS;CAChB,CAAC;AAEF,MAAM,IAAI,GAAY;IACpB,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,SAAS;IAClB,aAAa,EAAE,SAAS;IACxB,MAAM,EAAE,SAAS;IACjB,YAAY,EAAE,SAAS;IACvB,IAAI,EAAE,SAAS;IACf,aAAa,EAAE,SAAS;IACxB,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,SAAS;IACvB,aAAa,EAAE,SAAS;IACxB,MAAM,EAAE,SAAS;IACjB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,SAAS;CAChB,CAAC;AAIF,SAAgB,UAAU,CAAC,IAAa,EAAE,SAAiB,OAAO;IAChE,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;IACpC,IAAI,MAAM,KAAK,OAAO;QAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;IAC9C,OAAO;QACL,GAAG,OAAO;QACV,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QACrC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QAC1C,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QAC3C,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;KACnC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ 'use client';
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.NavigationFrame = exports.AppBrand = void 0;
5
+ exports.PageHeader = PageHeader;
6
+ exports.useSystemAppearance = useSystemAppearance;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const react_1 = require("react");
9
+ const media_js_1 = require("./media.js");
10
+ var navigation_js_1 = require("./navigation.js");
11
+ Object.defineProperty(exports, "AppBrand", { enumerable: true, get: function () { return navigation_js_1.AppBrand; } });
12
+ Object.defineProperty(exports, "NavigationFrame", { enumerable: true, get: function () { return navigation_js_1.NavigationFrame; } });
13
+ /** Routing, translation and authorisation belong to the host application. */
14
+ function PageHeader({ title, description, back, actions, meta, className, }) {
15
+ return ((0, jsx_runtime_1.jsxs)("header", { className: `jui-page-header${className ? ` ${className}` : ''}`, children: [back != null && (0, jsx_runtime_1.jsx)("div", { className: "jui-page-back", children: back }), (0, jsx_runtime_1.jsxs)("div", { className: "jui-page-heading", children: [(0, jsx_runtime_1.jsxs)("div", { className: "jui-page-copy", children: [(0, jsx_runtime_1.jsx)("h1", { className: "jui-page-title", children: title }), description != null && (0, jsx_runtime_1.jsx)("div", { className: "jui-page-description", children: description }), meta != null && (0, jsx_runtime_1.jsx)("div", { className: "jui-page-meta", children: meta })] }), actions != null && (0, jsx_runtime_1.jsx)("div", { className: "jui-page-actions", children: actions })] })] }));
16
+ }
17
+ const colorScheme = (0, media_js_1.mediaStore)('(prefers-color-scheme: dark)');
18
+ const motion = (0, media_js_1.mediaStore)('(prefers-reduced-motion: reduce)');
19
+ /** SSR starts in light mode; hydration and later OS changes use the live preference. */
20
+ function useSystemAppearance() {
21
+ const dark = (0, react_1.useSyncExternalStore)(colorScheme.subscribe, colorScheme.snapshot, media_js_1.serverSnapshot);
22
+ const reducedMotion = (0, react_1.useSyncExternalStore)(motion.subscribe, motion.snapshot, media_js_1.serverSnapshot);
23
+ return { dark, reducedMotion };
24
+ }
25
+ //# sourceMappingURL=react.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.js","sourceRoot":"","sources":["../../src/react.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;;AAgBb,gCAqBC;AAMD,kDAIC;;AA7CD,iCAA6D;AAC7D,yCAAwD;AACxD,iDAAuF;AAA9E,yGAAA,QAAQ,OAAA;AAAE,gHAAA,eAAe,OAAA;AAWlC,6EAA6E;AAC7E,SAAgB,UAAU,CAAC,EACzB,KAAK,EACL,WAAW,EACX,IAAI,EACJ,OAAO,EACP,IAAI,EACJ,SAAS,GACO;IAChB,OAAO,CACL,oCAAQ,SAAS,EAAE,kBAAkB,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,aACpE,IAAI,IAAI,IAAI,IAAI,gCAAK,SAAS,EAAC,eAAe,YAAE,IAAI,GAAO,EAC5D,iCAAK,SAAS,EAAC,kBAAkB,aAC/B,iCAAK,SAAS,EAAC,eAAe,aAC5B,+BAAI,SAAS,EAAC,gBAAgB,YAAE,KAAK,GAAM,EAC1C,WAAW,IAAI,IAAI,IAAI,gCAAK,SAAS,EAAC,sBAAsB,YAAE,WAAW,GAAO,EAChF,IAAI,IAAI,IAAI,IAAI,gCAAK,SAAS,EAAC,eAAe,YAAE,IAAI,GAAO,IACxD,EACL,OAAO,IAAI,IAAI,IAAI,gCAAK,SAAS,EAAC,kBAAkB,YAAE,OAAO,GAAO,IACjE,IACC,CACV,CAAC;AACJ,CAAC;AAED,MAAM,WAAW,GAAG,IAAA,qBAAU,EAAC,8BAA8B,CAAC,CAAC;AAC/D,MAAM,MAAM,GAAG,IAAA,qBAAU,EAAC,kCAAkC,CAAC,CAAC;AAE9D,wFAAwF;AACxF,SAAgB,mBAAmB;IACjC,MAAM,IAAI,GAAG,IAAA,4BAAoB,EAAC,WAAW,CAAC,SAAS,EAAE,WAAW,CAAC,QAAQ,EAAE,yBAAc,CAAC,CAAC;IAC/F,MAAM,aAAa,GAAG,IAAA,4BAAoB,EAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,yBAAc,CAAC,CAAC;IAC9F,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;AACjC,CAAC"}
@@ -0,0 +1,149 @@
1
+ import { theme as antdTheme } from 'antd';
2
+ import { paletteFor } from './palette.js';
3
+ import { dimensions, FONT_SANS, FONT_MONO } from './index.js';
4
+ export function createAppTheme({ dark, accent, reducedMotion = false, }) {
5
+ const c = paletteFor(dark, accent);
6
+ return {
7
+ algorithm: dark ? antdTheme.darkAlgorithm : antdTheme.defaultAlgorithm,
8
+ cssVar: { prefix: 'ant' },
9
+ token: {
10
+ colorPrimary: c.primary,
11
+ colorPrimaryHover: c.primaryHover,
12
+ colorPrimaryActive: c.primaryActive,
13
+ colorPrimaryText: c.primary,
14
+ colorPrimaryTextHover: c.primaryHover,
15
+ colorPrimaryTextActive: c.primaryActive,
16
+ colorLink: c.primary,
17
+ colorLinkHover: c.primaryHover,
18
+ colorLinkActive: c.primaryActive,
19
+ colorInfo: c.info,
20
+ colorSuccess: c.success,
21
+ colorWarning: c.warning,
22
+ colorError: c.error,
23
+ colorErrorText: c.error,
24
+ colorErrorHover: dark ? '#F2ABB0' : '#9F3240',
25
+ colorErrorActive: dark ? '#DA7F87' : '#852936',
26
+ colorErrorTextHover: dark ? '#F2ABB0' : '#9F3240',
27
+ colorErrorTextActive: dark ? '#DA7F87' : '#852936',
28
+ colorSuccessText: c.success,
29
+ colorWarningText: c.warning,
30
+ colorInfoText: c.info,
31
+ colorBgBase: dark ? c.page : c.surface,
32
+ colorFillAlter: dark ? c.surfaceRaised : c.page,
33
+ motion: !reducedMotion,
34
+ // The default palette generator makes pale surfaces muddy when the seed is a dark,
35
+ // accessible accent. Keep light feedback surfaces quiet and their text readable.
36
+ ...(!dark && {
37
+ colorPrimaryBg: accent === 'green' ? '#EAF4F0' : '#ECF2FD',
38
+ colorPrimaryBgHover: accent === 'green' ? '#DCEEE6' : '#DCE7FA',
39
+ colorPrimaryBorder: accent === 'green' ? '#AFCFC4' : '#B5C9EF',
40
+ colorPrimaryBorderHover: accent === 'green' ? '#87B8A8' : '#86A7E0',
41
+ colorInfoBg: accent === 'green' ? '#F2F9F6' : '#F2F6FD',
42
+ colorInfoBgHover: accent === 'green' ? '#E3F1EB' : '#E3EBFA',
43
+ colorInfoBorder: accent === 'green' ? '#B7D8CD' : '#B5C9EF',
44
+ colorSuccessBg: '#F1F9F3',
45
+ colorSuccessBgHover: '#E0EFE4',
46
+ colorSuccessBorder: '#BFDDC7',
47
+ colorWarningBg: '#FCF8EE',
48
+ colorWarningBgHover: '#F7EDD4',
49
+ colorWarningBorder: '#E7D6AE',
50
+ colorErrorBg: '#FDF5F6',
51
+ colorErrorBgHover: '#F6E1E5',
52
+ colorErrorBorder: '#ECC5CC',
53
+ }),
54
+ colorBgLayout: c.page,
55
+ colorBgContainer: c.surface,
56
+ colorBgElevated: c.surfaceRaised,
57
+ colorBorder: c.borderStrong,
58
+ colorBorderSecondary: c.border,
59
+ colorText: c.text,
60
+ colorTextSecondary: c.textSecondary,
61
+ colorTextDescription: c.textSecondary,
62
+ colorTextDisabled: c.textSecondary,
63
+ colorTextPlaceholder: c.textSecondary,
64
+ fontFamily: FONT_SANS,
65
+ fontFamilyCode: FONT_MONO,
66
+ fontSize: 14,
67
+ lineHeight: 1.5,
68
+ borderRadius: 6,
69
+ borderRadiusLG: 8,
70
+ borderRadiusSM: 4,
71
+ controlHeight: dimensions.control,
72
+ controlHeightSM: dimensions.controlSmall,
73
+ controlHeightLG: dimensions.touchTarget,
74
+ colorTextLightSolid: dark ? c.page : c.surface,
75
+ fontSizeHeading1: dimensions.pageTitle,
76
+ fontSizeHeading2: 22,
77
+ fontSizeHeading3: 18,
78
+ fontSizeHeading4: 16,
79
+ fontSizeHeading5: 14,
80
+ wireframe: false,
81
+ // Depth is an interaction, not a default: nothing floats at rest.
82
+ boxShadow: dark
83
+ ? '0 1px 2px rgba(0, 0, 0, 0.5), 0 8px 24px -12px rgba(0, 0, 0, 0.7)'
84
+ : '0 1px 2px rgba(24, 45, 54, 0.06), 0 12px 32px -16px rgba(24, 45, 54, 0.20)',
85
+ boxShadowSecondary: dark
86
+ ? '0 6px 20px -8px rgba(0, 0, 0, 0.7)'
87
+ : '0 6px 20px -10px rgba(24, 45, 54, 0.16)',
88
+ motionDurationMid: `${dimensions.motion}ms`,
89
+ },
90
+ components: {
91
+ Layout: {
92
+ bodyBg: c.page,
93
+ siderBg: c.surface,
94
+ },
95
+ Menu: {
96
+ itemBg: 'transparent',
97
+ subMenuItemBg: 'transparent',
98
+ itemSelectedBg: `${c.primary}${dark ? '1F' : '14'}`,
99
+ itemSelectedColor: c.primary,
100
+ itemHoverBg: dark ? 'rgba(231, 239, 242, 0.05)' : 'rgba(36, 50, 59, 0.04)',
101
+ itemHeight: dimensions.control,
102
+ itemMarginInline: 8,
103
+ itemBorderRadius: 6,
104
+ iconSize: 16,
105
+ },
106
+ Card: {
107
+ colorBorderSecondary: c.border,
108
+ bodyPadding: 20,
109
+ headerHeight: 48,
110
+ headerFontSize: 16,
111
+ },
112
+ Table: {
113
+ headerBg: c.page,
114
+ headerColor: c.textSecondary,
115
+ borderColor: c.border,
116
+ cellPaddingBlock: 12,
117
+ cellPaddingInline: 16,
118
+ cellPaddingBlockSM: 10,
119
+ cellPaddingInlineSM: 12,
120
+ rowHoverBg: `${c.primary}09`,
121
+ },
122
+ Tag: { borderRadiusSM: 4, defaultBg: c.page },
123
+ Button: {
124
+ fontWeight: 500,
125
+ primaryShadow: 'none',
126
+ defaultShadow: 'none',
127
+ dangerShadow: 'none',
128
+ primaryColor: dark ? c.page : c.surface,
129
+ dangerColor: dark ? c.page : c.surface,
130
+ },
131
+ Input: {
132
+ activeShadow: `0 0 0 3px ${c.primary}26`,
133
+ },
134
+ Statistic: { contentFontSize: 26 },
135
+ Segmented: { itemSelectedBg: c.surfaceRaised },
136
+ Tooltip: {
137
+ colorBgSpotlight: dark ? c.surfaceRaised : c.text,
138
+ colorTextLightSolid: dark ? c.text : c.surface,
139
+ },
140
+ Form: { itemMarginBottom: 20, verticalLabelPadding: '0 0 6px', labelColor: c.text },
141
+ Descriptions: { labelColor: c.textSecondary },
142
+ Tabs: { horizontalItemPadding: '12px 0', horizontalItemGutter: 24, titleFontSize: 14 },
143
+ Modal: { borderRadiusLG: 12, titleFontSize: 18 },
144
+ Drawer: { footerPaddingBlock: 16, footerPaddingInline: 20 },
145
+ DatePicker: { cellWidth: 32, cellHeight: 32 },
146
+ },
147
+ };
148
+ }
149
+ //# sourceMappingURL=antd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"antd.js","sourceRoot":"","sources":["../../src/antd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export { paletteFor } from './palette.js';
2
+ export const dimensions = {
3
+ sidebar: 240,
4
+ sidebarCollapsed: 64,
5
+ navigationDrawer: 280,
6
+ formDialog: 640,
7
+ gutter: 24,
8
+ gutterTablet: 16,
9
+ gutterPhone: 12,
10
+ pageTitle: 24,
11
+ pageTitlePhone: 20,
12
+ control: 40,
13
+ controlSmall: 32,
14
+ touchTarget: 44,
15
+ motion: 140,
16
+ };
17
+ export const FONT_SANS = 'var(--font-sans, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif)';
18
+ export const FONT_MONO = 'var(--font-mono, ui-monospace, monospace)';
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAA6B,MAAM,cAAc,CAAC;AACrE,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,OAAO,EAAE,GAAG;IACZ,gBAAgB,EAAE,EAAE;IACpB,gBAAgB,EAAE,GAAG;IACrB,UAAU,EAAE,GAAG;IACf,MAAM,EAAE,EAAE;IACV,YAAY,EAAE,EAAE;IAChB,WAAW,EAAE,EAAE;IACf,SAAS,EAAE,EAAE;IACb,cAAc,EAAE,EAAE;IAClB,OAAO,EAAE,EAAE;IACX,YAAY,EAAE,EAAE;IAChB,WAAW,EAAE,EAAE;IACf,MAAM,EAAE,GAAG;CACH,CAAC;AAEX,MAAM,CAAC,MAAM,SAAS,GACpB,6EAA6E,CAAC;AAChF,MAAM,CAAC,MAAM,SAAS,GAAG,2CAA2C,CAAC"}
@@ -0,0 +1,18 @@
1
+ export function mediaStore(query) {
2
+ return {
3
+ subscribe(listener) {
4
+ if (typeof window === 'undefined' || typeof window.matchMedia !== 'function')
5
+ return () => { };
6
+ const media = window.matchMedia(query);
7
+ media.addEventListener('change', listener);
8
+ return () => media.removeEventListener('change', listener);
9
+ },
10
+ snapshot() {
11
+ return typeof window !== 'undefined' && typeof window.matchMedia === 'function'
12
+ ? window.matchMedia(query).matches
13
+ : false;
14
+ },
15
+ };
16
+ }
17
+ export const serverSnapshot = () => false;
18
+ //# sourceMappingURL=media.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.js","sourceRoot":"","sources":["../../src/media.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,OAAO;QACL,SAAS,CAAa,QAAoB;YACxC,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,UAAU;gBAAE,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;YAC9F,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACvC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC3C,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC7D,CAAC;QACD,QAAQ;YACN,OAAO,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,UAAU;gBAC7E,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,OAAO;gBAClC,CAAC,CAAC,KAAK,CAAC;QACZ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC"}
@@ -0,0 +1,46 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useId, useState, useSyncExternalStore } from 'react';
4
+ import { Button, Drawer, Layout, theme } from 'antd';
5
+ import { dimensions } from './index.js';
6
+ import { mediaStore, serverSnapshot } from './media.js';
7
+ const phone = mediaStore('(max-width: 767px)');
8
+ const tablet = mediaStore('(max-width: 1023px)');
9
+ export function AppBrand({ name, mark }) {
10
+ return (_jsxs("span", { className: "jui-brand", children: [_jsx("span", { className: "jui-brand-mark", "aria-hidden": "true", children: mark }), _jsx("span", { className: "jui-brand-name", children: name })] }));
11
+ }
12
+ function NavigationIcon({ kind }) {
13
+ const path = {
14
+ open: 'M3 5h18M3 12h18M3 19h18',
15
+ close: 'm6 6 12 12M6 18 18 6',
16
+ collapse: 'm14 6-6 6 6 6',
17
+ expand: 'm10 6 6 6-6 6',
18
+ }[kind];
19
+ return (_jsx("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.7", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: _jsx("path", { d: path }) }));
20
+ }
21
+ /** Shared navigation mechanics; menus, user controls and routes remain in the applications. */
22
+ export function NavigationFrame({ brand, pathname, navigation, children, mobileActions, labels, }) {
23
+ const mobile = useSyncExternalStore(phone.subscribe, phone.snapshot, serverSnapshot);
24
+ const narrow = useSyncExternalStore(tablet.subscribe, tablet.snapshot, serverSnapshot);
25
+ const [preference, setPreference] = useState(null);
26
+ const collapsed = preference ?? narrow;
27
+ const [openedAt, setOpenedAt] = useState(null);
28
+ const open = mobile && openedAt === pathname;
29
+ if (openedAt !== null && (openedAt !== pathname || !mobile))
30
+ setOpenedAt(null);
31
+ const id = useId();
32
+ const { token } = theme.useToken();
33
+ const close = () => setOpenedAt(null);
34
+ const content = (compact) => (_jsxs("nav", { id: id, "aria-label": labels.navigation, className: "jui-navigation", "data-collapsed": compact, onClick: (event) => {
35
+ if (event.target instanceof Element && event.target.closest('a[href]'))
36
+ close();
37
+ }, children: [_jsxs("div", { className: "jui-navigation-brand", children: [brand, mobile && (_jsx(Button, { type: "text", "aria-label": labels.close, onClick: close, icon: _jsx(NavigationIcon, { kind: "close" }) }))] }), _jsx("div", { className: "jui-navigation-body", children: navigation(compact) }), !mobile && (_jsx(Button, { type: "text", className: "jui-navigation-toggle", "aria-label": compact ? labels.expand : labels.collapse, "aria-expanded": !compact, "aria-controls": id, onClick: () => setPreference(!compact), icon: _jsx(NavigationIcon, { kind: compact ? 'expand' : 'collapse' }) }))] }));
38
+ return (_jsxs(Layout, { className: "jui-shell", children: [mobile ? (_jsx(Drawer, { className: "jui-navigation-drawer", placement: "left", size: dimensions.navigationDrawer, open: open, onClose: close, closable: false, title: null, destroyOnHidden: true, "aria-label": labels.navigation, styles: { body: { padding: 0 } }, children: content(false) })) : (_jsx(Layout.Sider, { className: "jui-sidebar", width: dimensions.sidebar, collapsedWidth: dimensions.sidebarCollapsed, collapsed: collapsed, trigger: null, style: {
39
+ position: 'sticky',
40
+ top: 0,
41
+ height: '100dvh',
42
+ background: token.colorBgContainer,
43
+ borderInlineEnd: `1px solid ${token.colorBorderSecondary}`,
44
+ }, children: content(collapsed) })), _jsxs(Layout, { className: "jui-shell-main", children: [mobile && (_jsxs("div", { className: "jui-mobile-bar", children: [_jsx(Button, { type: "text", "aria-label": labels.open, "aria-expanded": open, "aria-controls": id, onClick: () => setOpenedAt(pathname), icon: _jsx(NavigationIcon, { kind: "open" }) }), brand, mobileActions] })), children] })] }));
45
+ }
46
+ //# sourceMappingURL=navigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation.js","sourceRoot":"","sources":["../../src/navigation.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ const LIGHT = {
2
+ page: '#F5F7F8',
3
+ surface: '#FFFFFF',
4
+ surfaceRaised: '#FFFFFF',
5
+ border: '#DEE5E8',
6
+ borderStrong: '#BCC9CF',
7
+ text: '#24323B',
8
+ textSecondary: '#5F7079',
9
+ primary: '#247463',
10
+ primaryHover: '#1E6657',
11
+ primaryActive: '#195A4D',
12
+ accent: '#936719',
13
+ success: '#34764A',
14
+ warning: '#936719',
15
+ error: '#B43F4D',
16
+ info: '#247463',
17
+ };
18
+ const DARK = {
19
+ page: '#121A1E',
20
+ surface: '#1A252B',
21
+ surfaceRaised: '#223139',
22
+ border: '#30434B',
23
+ borderStrong: '#58707B',
24
+ text: '#E7EFF2',
25
+ textSecondary: '#A2B3BA',
26
+ primary: '#73C4AF',
27
+ primaryHover: '#94D7C5',
28
+ primaryActive: '#56A68F',
29
+ accent: '#E0B56C',
30
+ success: '#88C89E',
31
+ warning: '#E0B56C',
32
+ error: '#FF9C9C',
33
+ info: '#73C4AF',
34
+ };
35
+ export function paletteFor(dark, accent = 'green') {
36
+ const neutral = dark ? DARK : LIGHT;
37
+ if (accent === 'green')
38
+ return { ...neutral };
39
+ return {
40
+ ...neutral,
41
+ primary: dark ? '#82ADFF' : '#245FC8',
42
+ primaryHover: dark ? '#ADCAFF' : '#1D54B5',
43
+ primaryActive: dark ? '#6A98EC' : '#164DA9',
44
+ info: dark ? '#82ADFF' : '#245FC8',
45
+ };
46
+ }
47
+ //# sourceMappingURL=palette.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"palette.js","sourceRoot":"","sources":["../../src/palette.ts"],"names":[],"mappings":"AAkBA,MAAM,KAAK,GAAY;IACrB,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,SAAS;IAClB,aAAa,EAAE,SAAS;IACxB,MAAM,EAAE,SAAS;IACjB,YAAY,EAAE,SAAS;IACvB,IAAI,EAAE,SAAS;IACf,aAAa,EAAE,SAAS;IACxB,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,SAAS;IACvB,aAAa,EAAE,SAAS;IACxB,MAAM,EAAE,SAAS;IACjB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,SAAS;CAChB,CAAC;AAEF,MAAM,IAAI,GAAY;IACpB,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,SAAS;IAClB,aAAa,EAAE,SAAS;IACxB,MAAM,EAAE,SAAS;IACjB,YAAY,EAAE,SAAS;IACvB,IAAI,EAAE,SAAS;IACf,aAAa,EAAE,SAAS;IACxB,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,SAAS;IACvB,aAAa,EAAE,SAAS;IACxB,MAAM,EAAE,SAAS;IACjB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,SAAS;CAChB,CAAC;AAIF,MAAM,UAAU,UAAU,CAAC,IAAa,EAAE,SAAiB,OAAO;IAChE,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;IACpC,IAAI,MAAM,KAAK,OAAO;QAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;IAC9C,OAAO;QACL,GAAG,OAAO;QACV,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QACrC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QAC1C,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QAC3C,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;KACnC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useSyncExternalStore } from 'react';
4
+ import { mediaStore, serverSnapshot } from './media.js';
5
+ export { AppBrand, NavigationFrame } from './navigation.js';
6
+ /** Routing, translation and authorisation belong to the host application. */
7
+ export function PageHeader({ title, description, back, actions, meta, className, }) {
8
+ return (_jsxs("header", { className: `jui-page-header${className ? ` ${className}` : ''}`, children: [back != null && _jsx("div", { className: "jui-page-back", children: back }), _jsxs("div", { className: "jui-page-heading", children: [_jsxs("div", { className: "jui-page-copy", children: [_jsx("h1", { className: "jui-page-title", children: title }), description != null && _jsx("div", { className: "jui-page-description", children: description }), meta != null && _jsx("div", { className: "jui-page-meta", children: meta })] }), actions != null && _jsx("div", { className: "jui-page-actions", children: actions })] })] }));
9
+ }
10
+ const colorScheme = mediaStore('(prefers-color-scheme: dark)');
11
+ const motion = mediaStore('(prefers-reduced-motion: reduce)');
12
+ /** SSR starts in light mode; hydration and later OS changes use the live preference. */
13
+ export function useSystemAppearance() {
14
+ const dark = useSyncExternalStore(colorScheme.subscribe, colorScheme.snapshot, serverSnapshot);
15
+ const reducedMotion = useSyncExternalStore(motion.subscribe, motion.snapshot, serverSnapshot);
16
+ return { dark, reducedMotion };
17
+ }
18
+ //# sourceMappingURL=react.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.js","sourceRoot":"","sources":["../../src/react.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,oBAAoB,EAAkB,MAAM,OAAO,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,eAAe,EAA6B,MAAM,iBAAiB,CAAC;AAWvF,6EAA6E;AAC7E,MAAM,UAAU,UAAU,CAAC,EACzB,KAAK,EACL,WAAW,EACX,IAAI,EACJ,OAAO,EACP,IAAI,EACJ,SAAS,GACO;IAChB,OAAO,CACL,kBAAQ,SAAS,EAAE,kBAAkB,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,aACpE,IAAI,IAAI,IAAI,IAAI,cAAK,SAAS,EAAC,eAAe,YAAE,IAAI,GAAO,EAC5D,eAAK,SAAS,EAAC,kBAAkB,aAC/B,eAAK,SAAS,EAAC,eAAe,aAC5B,aAAI,SAAS,EAAC,gBAAgB,YAAE,KAAK,GAAM,EAC1C,WAAW,IAAI,IAAI,IAAI,cAAK,SAAS,EAAC,sBAAsB,YAAE,WAAW,GAAO,EAChF,IAAI,IAAI,IAAI,IAAI,cAAK,SAAS,EAAC,eAAe,YAAE,IAAI,GAAO,IACxD,EACL,OAAO,IAAI,IAAI,IAAI,cAAK,SAAS,EAAC,kBAAkB,YAAE,OAAO,GAAO,IACjE,IACC,CACV,CAAC;AACJ,CAAC;AAED,MAAM,WAAW,GAAG,UAAU,CAAC,8BAA8B,CAAC,CAAC;AAC/D,MAAM,MAAM,GAAG,UAAU,CAAC,kCAAkC,CAAC,CAAC;AAE9D,wFAAwF;AACxF,MAAM,UAAU,mBAAmB;IACjC,MAAM,IAAI,GAAG,oBAAoB,CAAC,WAAW,CAAC,SAAS,EAAE,WAAW,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAC/F,MAAM,aAAa,GAAG,oBAAoB,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAC9F,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;AACjC,CAAC"}
@@ -0,0 +1,209 @@
1
+ :root {
2
+ --jui-sidebar: 240px;
3
+ --jui-sidebar-collapsed: 64px;
4
+ --jui-navigation-drawer: 280px;
5
+ --jui-form-dialog: 640px;
6
+ --jui-gutter: 24px;
7
+ --jui-gutter-tablet: 16px;
8
+ --jui-gutter-phone: 12px;
9
+ --jui-page-title: 24px;
10
+ --jui-page-title-phone: 20px;
11
+ --jui-control: 40px;
12
+ --jui-control-small: 32px;
13
+ --jui-touch-target: 44px;
14
+ --jui-motion: 140ms;
15
+ }
16
+
17
+ /* Palette values come from ConfigProvider, including nested themes and overlays. */
18
+ .jui-page-header {
19
+ min-width: 0;
20
+ }
21
+ .jui-page-heading {
22
+ display: flex;
23
+ flex-wrap: wrap;
24
+ align-items: flex-start;
25
+ justify-content: space-between;
26
+ gap: 12px 24px;
27
+ }
28
+ .jui-page-copy {
29
+ min-width: 0;
30
+ flex: 1 1 200px;
31
+ }
32
+ .jui-page-title {
33
+ margin: 0;
34
+ font-family: var(--font-sans, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif);
35
+ font-size: var(--jui-page-title);
36
+ font-weight: 600;
37
+ line-height: 1.3;
38
+ letter-spacing: -0.015em;
39
+ color: var(--ant-color-text);
40
+ overflow-wrap: anywhere;
41
+ }
42
+ .jui-page-description {
43
+ margin-top: 6px;
44
+ max-width: 72ch;
45
+ color: var(--ant-color-text-secondary);
46
+ }
47
+ .jui-page-meta {
48
+ margin-top: 12px;
49
+ }
50
+ .jui-page-back {
51
+ margin-bottom: 16px;
52
+ }
53
+ .jui-page-back a {
54
+ display: inline-flex;
55
+ align-items: center;
56
+ gap: 8px;
57
+ min-height: 32px;
58
+ font-size: 13px;
59
+ }
60
+ .jui-page-actions {
61
+ display: flex;
62
+ flex-wrap: wrap;
63
+ align-items: center;
64
+ gap: 8px;
65
+ min-width: 0;
66
+ max-width: 100%;
67
+ }
68
+ .jui-page-actions > * {
69
+ max-width: 100%;
70
+ }
71
+ .jui-page-header :focus-visible {
72
+ outline: 2px solid var(--ant-color-primary);
73
+ outline-offset: 2px;
74
+ }
75
+ @media (max-width: 767.98px) {
76
+ .jui-page-title {
77
+ font-size: var(--jui-page-title-phone);
78
+ }
79
+ }
80
+ @media (max-width: 479.98px) {
81
+ .jui-page-heading {
82
+ flex-direction: column;
83
+ }
84
+ .jui-page-copy {
85
+ flex-basis: auto;
86
+ }
87
+ }
88
+ @media (pointer: coarse) {
89
+ .jui-page-actions .ant-btn,
90
+ .jui-page-back a {
91
+ min-height: var(--jui-touch-target);
92
+ }
93
+ }
94
+
95
+ /* One navigation frame for both applications; only its content is product-specific. */
96
+ .jui-shell.ant-layout {
97
+ min-height: 100dvh;
98
+ flex-direction: row;
99
+ }
100
+ .jui-shell-main {
101
+ min-width: 0;
102
+ }
103
+ .jui-sidebar .ant-layout-sider-children,
104
+ .jui-navigation {
105
+ height: 100%;
106
+ display: flex;
107
+ flex-direction: column;
108
+ overflow: hidden;
109
+ }
110
+ .jui-navigation-body {
111
+ display: flex;
112
+ flex-direction: column;
113
+ flex: 1;
114
+ min-height: 0;
115
+ }
116
+ .jui-navigation-brand {
117
+ box-sizing: border-box;
118
+ display: flex;
119
+ align-items: center;
120
+ justify-content: space-between;
121
+ flex-shrink: 0;
122
+ min-height: 64px;
123
+ padding: 8px 16px;
124
+ margin-bottom: 8px;
125
+ border-bottom: 1px solid var(--ant-color-border-secondary);
126
+ }
127
+ .jui-navigation-brand > a,
128
+ .jui-mobile-bar > a {
129
+ display: flex;
130
+ align-items: center;
131
+ min-width: 0;
132
+ min-height: var(--jui-touch-target);
133
+ color: var(--ant-color-text);
134
+ text-decoration: none;
135
+ }
136
+ .jui-brand {
137
+ color: var(--ant-color-text);
138
+ display: inline-flex;
139
+ align-items: center;
140
+ gap: 10px;
141
+ min-width: 0;
142
+ font-size: 18px;
143
+ font-weight: 600;
144
+ letter-spacing: -0.02em;
145
+ white-space: nowrap;
146
+ }
147
+ .jui-brand-mark {
148
+ display: flex;
149
+ align-items: center;
150
+ justify-content: center;
151
+ width: 28px;
152
+ height: 28px;
153
+ flex-shrink: 0;
154
+ }
155
+ .jui-brand-mark > svg {
156
+ width: 100%;
157
+ height: 100%;
158
+ }
159
+ .jui-navigation[data-collapsed='true'] .jui-brand-name {
160
+ display: none;
161
+ }
162
+ .jui-navigation[data-collapsed='true'] .jui-navigation-brand {
163
+ padding-inline: 0;
164
+ justify-content: center;
165
+ }
166
+ .jui-navigation[data-collapsed='true'] .jui-navigation-brand > a {
167
+ width: var(--jui-touch-target);
168
+ justify-content: center;
169
+ }
170
+ .jui-navigation > .jui-navigation-toggle.ant-btn {
171
+ flex-shrink: 0;
172
+ width: 100%;
173
+ height: var(--jui-touch-target);
174
+ margin-top: 8px;
175
+ border-radius: 0;
176
+ border-top: 1px solid var(--ant-color-border-secondary);
177
+ color: var(--ant-color-text-secondary);
178
+ }
179
+ .jui-mobile-bar {
180
+ box-sizing: border-box;
181
+ position: sticky;
182
+ top: 0;
183
+ z-index: 100;
184
+ display: flex;
185
+ align-items: center;
186
+ gap: 8px;
187
+ min-height: 64px;
188
+ padding: 8px;
189
+ background: var(--ant-color-bg-container);
190
+ border-bottom: 1px solid var(--ant-color-border-secondary);
191
+ }
192
+ .jui-mobile-bar > a {
193
+ flex: 1;
194
+ }
195
+ .jui-mobile-bar .ant-btn.ant-btn-icon-only,
196
+ .jui-navigation-brand .ant-btn.ant-btn-icon-only {
197
+ flex-shrink: 0;
198
+ width: var(--jui-touch-target);
199
+ height: var(--jui-touch-target);
200
+ }
201
+ :is(.jui-navigation-brand, .jui-mobile-bar) a:focus-visible {
202
+ outline: 2px solid var(--ant-color-primary);
203
+ outline-offset: 2px;
204
+ border-radius: 4px;
205
+ }
206
+
207
+ .jui-navigation .ant-menu-root {
208
+ border-inline-end: 0;
209
+ }
@@ -0,0 +1,8 @@
1
+ import { type ThemeConfig } from 'antd';
2
+ import { type Accent } from './palette.js';
3
+ export declare function createAppTheme({ dark, accent, reducedMotion, }: {
4
+ dark: boolean;
5
+ accent: Accent;
6
+ reducedMotion?: boolean;
7
+ }): ThemeConfig;
8
+ //# sourceMappingURL=antd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"antd.d.ts","sourceRoot":"","sources":["../../src/antd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,WAAW,EAAE,MAAM,MAAM,CAAC;AAC5D,OAAO,EAAc,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAGvD,wBAAgB,cAAc,CAAC,EAC7B,IAAI,EACJ,MAAM,EACN,aAAqB,GACtB,EAAE;IACD,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,GAAG,WAAW,CAuJd"}
@@ -0,0 +1,19 @@
1
+ export { paletteFor, type Palette, type Accent } from './palette.js';
2
+ export declare const dimensions: {
3
+ readonly sidebar: 240;
4
+ readonly sidebarCollapsed: 64;
5
+ readonly navigationDrawer: 280;
6
+ readonly formDialog: 640;
7
+ readonly gutter: 24;
8
+ readonly gutterTablet: 16;
9
+ readonly gutterPhone: 12;
10
+ readonly pageTitle: 24;
11
+ readonly pageTitlePhone: 20;
12
+ readonly control: 40;
13
+ readonly controlSmall: 32;
14
+ readonly touchTarget: 44;
15
+ readonly motion: 140;
16
+ };
17
+ export declare const FONT_SANS = "var(--font-sans, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif)";
18
+ export declare const FONT_MONO = "var(--font-mono, ui-monospace, monospace)";
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AACrE,eAAO,MAAM,UAAU;;;;;;;;;;;;;;CAcb,CAAC;AAEX,eAAO,MAAM,SAAS,kFACyD,CAAC;AAChF,eAAO,MAAM,SAAS,8CAA8C,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare function mediaStore(query: string): {
2
+ subscribe(this: void, listener: () => void): () => void;
3
+ snapshot(this: void): boolean;
4
+ };
5
+ export declare const serverSnapshot: () => boolean;
6
+ //# sourceMappingURL=media.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../src/media.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM;oBAEpB,IAAI,YAAY,MAAM,IAAI,GAAG,MAAM,IAAI;mBAMxC,IAAI,GAAG,OAAO;EAMhC;AAED,eAAO,MAAM,cAAc,eAAc,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { type ReactNode } from 'react';
2
+ export declare function AppBrand({ name, mark }: {
3
+ name: string;
4
+ mark: ReactNode;
5
+ }): import("react").JSX.Element;
6
+ export interface NavigationFrameProps {
7
+ /** A host-owned home link containing AppBrand. */
8
+ brand: ReactNode;
9
+ pathname: string;
10
+ navigation: (collapsed: boolean) => ReactNode;
11
+ children: ReactNode;
12
+ mobileActions?: ReactNode;
13
+ labels: {
14
+ navigation: string;
15
+ open: string;
16
+ close: string;
17
+ collapse: string;
18
+ expand: string;
19
+ };
20
+ }
21
+ /** Shared navigation mechanics; menus, user controls and routes remain in the applications. */
22
+ export declare function NavigationFrame({ brand, pathname, navigation, children, mobileActions, labels, }: NavigationFrameProps): import("react").JSX.Element;
23
+ //# sourceMappingURL=navigation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../src/navigation.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAyC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAQ9E,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,CAAA;CAAE,+BASzE;AA0BD,MAAM,WAAW,oBAAoB;IACnC,kDAAkD;IAClD,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,SAAS,CAAC;IAC9C,QAAQ,EAAE,SAAS,CAAC;IACpB,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/F;AAED,+FAA+F;AAC/F,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,aAAa,EACb,MAAM,GACP,EAAE,oBAAoB,+BAsGtB"}
@@ -0,0 +1,20 @@
1
+ export type Palette = {
2
+ page: string;
3
+ surface: string;
4
+ surfaceRaised: string;
5
+ border: string;
6
+ borderStrong: string;
7
+ text: string;
8
+ textSecondary: string;
9
+ primary: string;
10
+ primaryHover: string;
11
+ primaryActive: string;
12
+ accent: string;
13
+ success: string;
14
+ warning: string;
15
+ error: string;
16
+ info: string;
17
+ };
18
+ export type Accent = 'green' | 'blue';
19
+ export declare function paletteFor(dark: boolean, accent?: Accent): Palette;
20
+ //# sourceMappingURL=palette.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"palette.d.ts","sourceRoot":"","sources":["../../src/palette.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAsCF,MAAM,MAAM,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAEtC,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,GAAE,MAAgB,GAAG,OAAO,CAU3E"}
@@ -0,0 +1,18 @@
1
+ import { type ReactNode } from 'react';
2
+ export { AppBrand, NavigationFrame, type NavigationFrameProps } from './navigation.js';
3
+ export interface PageHeaderProps {
4
+ title: ReactNode;
5
+ description?: ReactNode;
6
+ back?: ReactNode;
7
+ actions?: ReactNode;
8
+ meta?: ReactNode;
9
+ className?: string;
10
+ }
11
+ /** Routing, translation and authorisation belong to the host application. */
12
+ export declare function PageHeader({ title, description, back, actions, meta, className, }: PageHeaderProps): import("react").JSX.Element;
13
+ /** SSR starts in light mode; hydration and later OS changes use the live preference. */
14
+ export declare function useSystemAppearance(): {
15
+ dark: boolean;
16
+ reducedMotion: boolean;
17
+ };
18
+ //# sourceMappingURL=react.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../src/react.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAwB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE7D,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEvF,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,6EAA6E;AAC7E,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,WAAW,EACX,IAAI,EACJ,OAAO,EACP,IAAI,EACJ,SAAS,GACV,EAAE,eAAe,+BAcjB;AAKD,wFAAwF;AACxF,wBAAgB,mBAAmB;;;EAIlC"}
package/package.json CHANGED
@@ -1,6 +1,75 @@
1
1
  {
2
2
  "name": "@joshuan/design-system",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.2.0",
4
+ "description": "Shared design for the Joshuan applications: Ant Design theme, page layout and appearance",
5
+ "type": "module",
6
+ "types": "./dist/types/index.d.ts",
7
+ "main": "./dist/cjs/index.js",
8
+ "module": "./dist/esm/index.js",
9
+ "sideEffects": [
10
+ "**/*.css"
11
+ ],
12
+ "engines": {
13
+ "node": ">=24"
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "README.md"
18
+ ],
19
+ "exports": {
20
+ ".": {
21
+ "types": "./dist/types/index.d.ts",
22
+ "import": "./dist/esm/index.js",
23
+ "require": "./dist/cjs/index.js"
24
+ },
25
+ "./antd": {
26
+ "types": "./dist/types/antd.d.ts",
27
+ "import": "./dist/esm/antd.js",
28
+ "require": "./dist/cjs/antd.js"
29
+ },
30
+ "./react": {
31
+ "types": "./dist/types/react.d.ts",
32
+ "import": "./dist/esm/react.js",
33
+ "require": "./dist/cjs/react.js"
34
+ },
35
+ "./styles.css": "./dist/styles.css"
36
+ },
37
+ "typesVersions": {
38
+ "*": {
39
+ "antd": [
40
+ "dist/types/antd.d.ts"
41
+ ],
42
+ "react": [
43
+ "dist/types/react.d.ts"
44
+ ],
45
+ "*": [
46
+ "dist/types/index.d.ts"
47
+ ]
48
+ }
49
+ },
50
+ "scripts": {
51
+ "build": "node ../../scripts/clean-dist.mjs && tsc -p tsconfig.esm.json && tsc -p tsconfig.cjs.json && node ../../scripts/mark-cjs.mjs && node build-css.mjs",
52
+ "typecheck": "tsc --noEmit -p tsconfig.esm.json"
53
+ },
54
+ "peerDependencies": {
55
+ "antd": "^6.5.0",
56
+ "react": "^19.2.0",
57
+ "react-dom": "^19.2.0"
58
+ },
59
+ "devDependencies": {
60
+ "antd": "6.5.0",
61
+ "react": "19.2.7",
62
+ "react-dom": "19.2.7",
63
+ "@types/react": "19.2.17",
64
+ "@types/react-dom": "19.2.3"
65
+ },
66
+ "publishConfig": {
67
+ "access": "public"
68
+ },
69
+ "repository": {
70
+ "type": "git",
71
+ "url": "git+https://github.com/joshuan/js-lib.git",
72
+ "directory": "packages/design-system"
73
+ },
74
+ "license": "UNLICENSED"
75
+ }