mythik-react 0.1.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/LICENSE +201 -0
- package/NOTICE +4 -0
- package/README.md +83 -0
- package/dist/MythikApp.d.ts +61 -0
- package/dist/MythikApp.d.ts.map +1 -0
- package/dist/MythikApp.js +381 -0
- package/dist/MythikApp.js.map +1 -0
- package/dist/MythikRenderer.d.ts +31 -0
- package/dist/MythikRenderer.d.ts.map +1 -0
- package/dist/MythikRenderer.js +900 -0
- package/dist/MythikRenderer.js.map +1 -0
- package/dist/animation/index.d.ts +7 -0
- package/dist/animation/index.d.ts.map +1 -0
- package/dist/animation/index.js +5 -0
- package/dist/animation/index.js.map +1 -0
- package/dist/animation/stylesheet-singleton.d.ts +12 -0
- package/dist/animation/stylesheet-singleton.d.ts.map +1 -0
- package/dist/animation/stylesheet-singleton.js +107 -0
- package/dist/animation/stylesheet-singleton.js.map +1 -0
- package/dist/animation/useElementAnimations.d.ts +30 -0
- package/dist/animation/useElementAnimations.d.ts.map +1 -0
- package/dist/animation/useElementAnimations.js +254 -0
- package/dist/animation/useElementAnimations.js.map +1 -0
- package/dist/animation/usePrefersReducedMotion.d.ts +2 -0
- package/dist/animation/usePrefersReducedMotion.d.ts.map +1 -0
- package/dist/animation/usePrefersReducedMotion.js +29 -0
- package/dist/animation/usePrefersReducedMotion.js.map +1 -0
- package/dist/animation/useShapeAnimations.d.ts +21 -0
- package/dist/animation/useShapeAnimations.d.ts.map +1 -0
- package/dist/animation/useShapeAnimations.js +119 -0
- package/dist/animation/useShapeAnimations.js.map +1 -0
- package/dist/app-context.d.ts +15 -0
- package/dist/app-context.d.ts.map +1 -0
- package/dist/app-context.js +9 -0
- package/dist/app-context.js.map +1 -0
- package/dist/background/BackgroundLayer.d.ts +7 -0
- package/dist/background/BackgroundLayer.d.ts.map +1 -0
- package/dist/background/BackgroundLayer.js +50 -0
- package/dist/background/BackgroundLayer.js.map +1 -0
- package/dist/background/BackgroundStack.d.ts +19 -0
- package/dist/background/BackgroundStack.d.ts.map +1 -0
- package/dist/background/BackgroundStack.js +59 -0
- package/dist/background/BackgroundStack.js.map +1 -0
- package/dist/background/BlobLayer.d.ts +12 -0
- package/dist/background/BlobLayer.d.ts.map +1 -0
- package/dist/background/BlobLayer.js +60 -0
- package/dist/background/BlobLayer.js.map +1 -0
- package/dist/background/index.d.ts +3 -0
- package/dist/background/index.d.ts.map +1 -0
- package/dist/background/index.js +3 -0
- package/dist/background/index.js.map +1 -0
- package/dist/css-hover.d.ts +15 -0
- package/dist/css-hover.d.ts.map +1 -0
- package/dist/css-hover.js +51 -0
- package/dist/css-hover.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/primitives/accordion.d.ts +12 -0
- package/dist/primitives/accordion.d.ts.map +1 -0
- package/dist/primitives/accordion.js +25 -0
- package/dist/primitives/accordion.js.map +1 -0
- package/dist/primitives/area-chart.d.ts +14 -0
- package/dist/primitives/area-chart.d.ts.map +1 -0
- package/dist/primitives/area-chart.js +18 -0
- package/dist/primitives/area-chart.js.map +1 -0
- package/dist/primitives/audio-player.d.ts +9 -0
- package/dist/primitives/audio-player.d.ts.map +1 -0
- package/dist/primitives/audio-player.js +5 -0
- package/dist/primitives/audio-player.js.map +1 -0
- package/dist/primitives/bar-chart.d.ts +14 -0
- package/dist/primitives/bar-chart.d.ts.map +1 -0
- package/dist/primitives/bar-chart.js +22 -0
- package/dist/primitives/bar-chart.js.map +1 -0
- package/dist/primitives/box.d.ts +21 -0
- package/dist/primitives/box.d.ts.map +1 -0
- package/dist/primitives/box.js +54 -0
- package/dist/primitives/box.js.map +1 -0
- package/dist/primitives/button.d.ts +14 -0
- package/dist/primitives/button.d.ts.map +1 -0
- package/dist/primitives/button.js +28 -0
- package/dist/primitives/button.js.map +1 -0
- package/dist/primitives/camera.d.ts +15 -0
- package/dist/primitives/camera.d.ts.map +1 -0
- package/dist/primitives/camera.js +25 -0
- package/dist/primitives/camera.js.map +1 -0
- package/dist/primitives/checkbox.d.ts +12 -0
- package/dist/primitives/checkbox.d.ts.map +1 -0
- package/dist/primitives/checkbox.js +24 -0
- package/dist/primitives/checkbox.js.map +1 -0
- package/dist/primitives/divider.d.ts +9 -0
- package/dist/primitives/divider.d.ts.map +1 -0
- package/dist/primitives/divider.js +10 -0
- package/dist/primitives/divider.js.map +1 -0
- package/dist/primitives/drawer.d.ts +21 -0
- package/dist/primitives/drawer.d.ts.map +1 -0
- package/dist/primitives/drawer.js +38 -0
- package/dist/primitives/drawer.js.map +1 -0
- package/dist/primitives/file-upload.d.ts +27 -0
- package/dist/primitives/file-upload.d.ts.map +1 -0
- package/dist/primitives/file-upload.js +225 -0
- package/dist/primitives/file-upload.js.map +1 -0
- package/dist/primitives/grid.d.ts +13 -0
- package/dist/primitives/grid.d.ts.map +1 -0
- package/dist/primitives/grid.js +13 -0
- package/dist/primitives/grid.js.map +1 -0
- package/dist/primitives/icon.d.ts +22 -0
- package/dist/primitives/icon.d.ts.map +1 -0
- package/dist/primitives/icon.js +52 -0
- package/dist/primitives/icon.js.map +1 -0
- package/dist/primitives/image.d.ts +13 -0
- package/dist/primitives/image.d.ts.map +1 -0
- package/dist/primitives/image.js +38 -0
- package/dist/primitives/image.js.map +1 -0
- package/dist/primitives/index.d.ts +57 -0
- package/dist/primitives/index.d.ts.map +1 -0
- package/dist/primitives/index.js +106 -0
- package/dist/primitives/index.js.map +1 -0
- package/dist/primitives/input.d.ts +32 -0
- package/dist/primitives/input.d.ts.map +1 -0
- package/dist/primitives/input.js +192 -0
- package/dist/primitives/input.js.map +1 -0
- package/dist/primitives/kanban-board.d.ts +13 -0
- package/dist/primitives/kanban-board.d.ts.map +1 -0
- package/dist/primitives/kanban-board.js +5 -0
- package/dist/primitives/kanban-board.js.map +1 -0
- package/dist/primitives/line-chart.d.ts +14 -0
- package/dist/primitives/line-chart.d.ts.map +1 -0
- package/dist/primitives/line-chart.js +17 -0
- package/dist/primitives/line-chart.js.map +1 -0
- package/dist/primitives/list.d.ts +13 -0
- package/dist/primitives/list.d.ts.map +1 -0
- package/dist/primitives/list.js +10 -0
- package/dist/primitives/list.js.map +1 -0
- package/dist/primitives/modal.d.ts +20 -0
- package/dist/primitives/modal.d.ts.map +1 -0
- package/dist/primitives/modal.js +60 -0
- package/dist/primitives/modal.js.map +1 -0
- package/dist/primitives/pie-chart.d.ts +15 -0
- package/dist/primitives/pie-chart.d.ts.map +1 -0
- package/dist/primitives/pie-chart.js +36 -0
- package/dist/primitives/pie-chart.js.map +1 -0
- package/dist/primitives/screen-outlet.d.ts +9 -0
- package/dist/primitives/screen-outlet.d.ts.map +1 -0
- package/dist/primitives/screen-outlet.js +92 -0
- package/dist/primitives/screen-outlet.js.map +1 -0
- package/dist/primitives/screen.d.ts +9 -0
- package/dist/primitives/screen.d.ts.map +1 -0
- package/dist/primitives/screen.js +10 -0
- package/dist/primitives/screen.js.map +1 -0
- package/dist/primitives/scroll.d.ts +11 -0
- package/dist/primitives/scroll.d.ts.map +1 -0
- package/dist/primitives/scroll.js +10 -0
- package/dist/primitives/scroll.js.map +1 -0
- package/dist/primitives/select.d.ts +19 -0
- package/dist/primitives/select.d.ts.map +1 -0
- package/dist/primitives/select.js +109 -0
- package/dist/primitives/select.js.map +1 -0
- package/dist/primitives/signature.d.ts +13 -0
- package/dist/primitives/signature.d.ts.map +1 -0
- package/dist/primitives/signature.js +45 -0
- package/dist/primitives/signature.js.map +1 -0
- package/dist/primitives/skeleton.d.ts +14 -0
- package/dist/primitives/skeleton.d.ts.map +1 -0
- package/dist/primitives/skeleton.js +41 -0
- package/dist/primitives/skeleton.js.map +1 -0
- package/dist/primitives/slider.d.ts +15 -0
- package/dist/primitives/slider.d.ts.map +1 -0
- package/dist/primitives/slider.js +7 -0
- package/dist/primitives/slider.js.map +1 -0
- package/dist/primitives/spacer.d.ts +9 -0
- package/dist/primitives/spacer.d.ts.map +1 -0
- package/dist/primitives/spacer.js +9 -0
- package/dist/primitives/spacer.js.map +1 -0
- package/dist/primitives/spatial-map-editing.d.ts +472 -0
- package/dist/primitives/spatial-map-editing.d.ts.map +1 -0
- package/dist/primitives/spatial-map-editing.js +886 -0
- package/dist/primitives/spatial-map-editing.js.map +1 -0
- package/dist/primitives/spatial-map.d.ts +1073 -0
- package/dist/primitives/spatial-map.d.ts.map +1 -0
- package/dist/primitives/spatial-map.js +1705 -0
- package/dist/primitives/spatial-map.js.map +1 -0
- package/dist/primitives/stack.d.ts +13 -0
- package/dist/primitives/stack.d.ts.map +1 -0
- package/dist/primitives/stack.js +12 -0
- package/dist/primitives/stack.js.map +1 -0
- package/dist/primitives/table.d.ts +115 -0
- package/dist/primitives/table.d.ts.map +1 -0
- package/dist/primitives/table.js +498 -0
- package/dist/primitives/table.js.map +1 -0
- package/dist/primitives/tabs.d.ts +17 -0
- package/dist/primitives/tabs.d.ts.map +1 -0
- package/dist/primitives/tabs.js +13 -0
- package/dist/primitives/tabs.js.map +1 -0
- package/dist/primitives/text.d.ts +11 -0
- package/dist/primitives/text.d.ts.map +1 -0
- package/dist/primitives/text.js +69 -0
- package/dist/primitives/text.js.map +1 -0
- package/dist/primitives/textarea.d.ts +15 -0
- package/dist/primitives/textarea.d.ts.map +1 -0
- package/dist/primitives/textarea.js +23 -0
- package/dist/primitives/textarea.js.map +1 -0
- package/dist/primitives/toast-container.d.ts +15 -0
- package/dist/primitives/toast-container.d.ts.map +1 -0
- package/dist/primitives/toast-container.js +160 -0
- package/dist/primitives/toast-container.js.map +1 -0
- package/dist/primitives/toggle.d.ts +12 -0
- package/dist/primitives/toggle.d.ts.map +1 -0
- package/dist/primitives/toggle.js +18 -0
- package/dist/primitives/toggle.js.map +1 -0
- package/dist/primitives/touchable.d.ts +10 -0
- package/dist/primitives/touchable.d.ts.map +1 -0
- package/dist/primitives/touchable.js +6 -0
- package/dist/primitives/touchable.js.map +1 -0
- package/dist/primitives/use-design-tokens.d.ts +127 -0
- package/dist/primitives/use-design-tokens.d.ts.map +1 -0
- package/dist/primitives/use-design-tokens.js +251 -0
- package/dist/primitives/use-design-tokens.js.map +1 -0
- package/dist/primitives/use-theme.d.ts +11 -0
- package/dist/primitives/use-theme.d.ts.map +1 -0
- package/dist/primitives/use-theme.js +17 -0
- package/dist/primitives/use-theme.js.map +1 -0
- package/dist/primitives/wizard.d.ts +11 -0
- package/dist/primitives/wizard.d.ts.map +1 -0
- package/dist/primitives/wizard.js +15 -0
- package/dist/primitives/wizard.js.map +1 -0
- package/dist/runtime/context-dispatcher.d.ts +3 -0
- package/dist/runtime/context-dispatcher.d.ts.map +1 -0
- package/dist/runtime/context-dispatcher.js +11 -0
- package/dist/runtime/context-dispatcher.js.map +1 -0
- package/dist/runtime/row-dispatcher.d.ts +19 -0
- package/dist/runtime/row-dispatcher.d.ts.map +1 -0
- package/dist/runtime/row-dispatcher.js +25 -0
- package/dist/runtime/row-dispatcher.js.map +1 -0
- package/dist/types.d.ts +10 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/use-device-context.d.ts +8 -0
- package/dist/use-device-context.d.ts.map +1 -0
- package/dist/use-device-context.js +54 -0
- package/dist/use-device-context.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { CSSProperties } from 'react';
|
|
2
|
+
interface ValidationCheck {
|
|
3
|
+
type: string;
|
|
4
|
+
message?: string;
|
|
5
|
+
args?: Record<string, unknown>;
|
|
6
|
+
}
|
|
7
|
+
interface InputProps {
|
|
8
|
+
value?: string | number;
|
|
9
|
+
type?: 'text' | 'number' | 'email' | 'password' | 'phone' | 'url' | 'date' | 'color';
|
|
10
|
+
placeholder?: string;
|
|
11
|
+
label?: string;
|
|
12
|
+
disabled?: boolean;
|
|
13
|
+
readOnly?: boolean;
|
|
14
|
+
required?: boolean;
|
|
15
|
+
format?: 'phone' | 'currency' | 'none';
|
|
16
|
+
/** Options for currency/number formatting. */
|
|
17
|
+
formatOptions?: {
|
|
18
|
+
locale?: string;
|
|
19
|
+
currency?: string;
|
|
20
|
+
};
|
|
21
|
+
/** Select all text on focus. Default: true when format is set, false otherwise. */
|
|
22
|
+
selectOnFocus?: boolean;
|
|
23
|
+
checks?: ValidationCheck[];
|
|
24
|
+
validateOn?: 'change' | 'blur' | 'submit';
|
|
25
|
+
style?: CSSProperties;
|
|
26
|
+
_tokens?: Record<string, unknown>;
|
|
27
|
+
onChange?: (value: string) => void;
|
|
28
|
+
onSubmit?: () => void;
|
|
29
|
+
}
|
|
30
|
+
export declare function Input({ value, type, placeholder, label, disabled, readOnly, required, format, formatOptions, selectOnFocus, checks, validateOn, style, _tokens, onChange, onSubmit }: InputProps): import("react/jsx-runtime").JSX.Element;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../src/primitives/input.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAI3C,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,UAAU,UAAU;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;IACrF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC;IACvC,8CAA8C;IAC9C,aAAa,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACvD,mFAAmF;IACnF,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;IAC3B,UAAU,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC1C,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAkFD,wBAAgB,KAAK,CAAC,EAAE,KAAU,EAAE,IAAa,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,EAAE,UAAmB,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,UAAU,2CAsIvN"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { resolveLabelStyle } from 'mythik';
|
|
4
|
+
import { useDesignTokens } from './use-design-tokens.js';
|
|
5
|
+
function formatDisplay(raw, format, options) {
|
|
6
|
+
const str = String(raw);
|
|
7
|
+
if (!format || format === 'none')
|
|
8
|
+
return str;
|
|
9
|
+
if (format === 'phone') {
|
|
10
|
+
const digits = str.replace(/\D/g, '');
|
|
11
|
+
if (digits.length === 10)
|
|
12
|
+
return `(${digits.slice(0, 3)}) ${digits.slice(3, 6)}-${digits.slice(6)}`;
|
|
13
|
+
if (digits.length === 7)
|
|
14
|
+
return `${digits.slice(0, 3)}-${digits.slice(3)}`;
|
|
15
|
+
return str;
|
|
16
|
+
}
|
|
17
|
+
if (format === 'currency') {
|
|
18
|
+
const num = Number(str);
|
|
19
|
+
if (Number.isNaN(num))
|
|
20
|
+
return str;
|
|
21
|
+
return new Intl.NumberFormat(options?.locale ?? 'en-US', {
|
|
22
|
+
style: 'currency',
|
|
23
|
+
currency: options?.currency ?? 'USD',
|
|
24
|
+
}).format(num);
|
|
25
|
+
}
|
|
26
|
+
return str;
|
|
27
|
+
}
|
|
28
|
+
/** Simple heuristic: if a hex/rgb color has low brightness, it's dark */
|
|
29
|
+
function looksLikeDark(color) {
|
|
30
|
+
if (color.startsWith('#')) {
|
|
31
|
+
const hex = color.slice(1);
|
|
32
|
+
const r = parseInt(hex.slice(0, 2), 16);
|
|
33
|
+
const g = parseInt(hex.slice(2, 4), 16);
|
|
34
|
+
const b = parseInt(hex.slice(4, 6), 16);
|
|
35
|
+
return (r * 299 + g * 587 + b * 114) / 1000 < 128;
|
|
36
|
+
}
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
function stripFormat(formatted, format) {
|
|
40
|
+
if (!format || format === 'none')
|
|
41
|
+
return formatted;
|
|
42
|
+
if (format === 'phone')
|
|
43
|
+
return formatted.replace(/\D/g, '');
|
|
44
|
+
if (format === 'currency')
|
|
45
|
+
return formatted.replace(/[^0-9.\-]/g, '').replace(/(\..*)\./g, '$1').replace(/(?!^)-/g, '');
|
|
46
|
+
return formatted;
|
|
47
|
+
}
|
|
48
|
+
/** Format currency while typing — allows incomplete decimals like "$1,234." */
|
|
49
|
+
function liveFormatCurrency(raw) {
|
|
50
|
+
if (!raw)
|
|
51
|
+
return '';
|
|
52
|
+
const negative = raw.startsWith('-');
|
|
53
|
+
const clean = raw.replace(/^-/, '');
|
|
54
|
+
const [intPart, decPart] = clean.split('.');
|
|
55
|
+
const digits = intPart.replace(/^0+(?=\d)/, '') || '0';
|
|
56
|
+
const withCommas = digits.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
|
|
57
|
+
const formatted = decPart !== undefined ? `${withCommas}.${decPart}` : withCommas;
|
|
58
|
+
return `${negative ? '-' : ''}$${formatted}`;
|
|
59
|
+
}
|
|
60
|
+
const BUILTIN_VALIDATORS = {
|
|
61
|
+
required: (v) => (!v || !v.trim()) ? 'This field is required' : null,
|
|
62
|
+
email: (v) => v && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v) ? 'Invalid email' : null,
|
|
63
|
+
minLength: (v, args) => v && v.length < (args?.min ?? 0) ? `Minimum ${args?.min} characters` : null,
|
|
64
|
+
maxLength: (v, args) => v && v.length > (args?.max ?? Infinity) ? `Maximum ${args?.max} characters` : null,
|
|
65
|
+
numeric: (v) => v && isNaN(Number(v)) ? 'Must be a number' : null,
|
|
66
|
+
min: (v, args) => v && Number(v) < (args?.min ?? -Infinity) ? `Minimum value is ${args?.min}` : null,
|
|
67
|
+
max: (v, args) => v && Number(v) > (args?.max ?? Infinity) ? `Maximum value is ${args?.max}` : null,
|
|
68
|
+
pattern: (v, args) => v && args?.pattern && !new RegExp(args.pattern).test(v) ? 'Invalid format' : null,
|
|
69
|
+
url: (v) => v && !/^https?:\/\/.+/.test(v) ? 'Invalid URL' : null,
|
|
70
|
+
};
|
|
71
|
+
function runChecks(value, checks, required) {
|
|
72
|
+
const errors = [];
|
|
73
|
+
if (required && (!value || !value.trim())) {
|
|
74
|
+
errors.push('This field is required');
|
|
75
|
+
}
|
|
76
|
+
if (checks) {
|
|
77
|
+
for (const check of checks) {
|
|
78
|
+
const validator = BUILTIN_VALIDATORS[check.type];
|
|
79
|
+
if (validator) {
|
|
80
|
+
const error = validator(value, check.args);
|
|
81
|
+
if (error)
|
|
82
|
+
errors.push(check.message ?? error);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return errors;
|
|
87
|
+
}
|
|
88
|
+
export function Input({ value = '', type = 'text', placeholder, label, disabled, readOnly, required, format, formatOptions, selectOnFocus, checks, validateOn = 'blur', style, _tokens, onChange, onSubmit }) {
|
|
89
|
+
const t = useDesignTokens(_tokens);
|
|
90
|
+
const color = style?.color ?? 'inherit';
|
|
91
|
+
const inputId = React.useId();
|
|
92
|
+
// Detect dark mode for native date/time picker icon visibility
|
|
93
|
+
const isDark = t.colors.surface ? looksLikeDark(t.colors.surface) : false;
|
|
94
|
+
const inputRef = React.useRef(null);
|
|
95
|
+
const cursorRef = React.useRef(null);
|
|
96
|
+
const [focused, setFocused] = React.useState(false);
|
|
97
|
+
const [touched, setTouched] = React.useState(false);
|
|
98
|
+
const [errors, setErrors] = React.useState([]);
|
|
99
|
+
// For currency: local editing state (null = not editing, string = raw text while typing)
|
|
100
|
+
const [rawText, setRawText] = React.useState(null);
|
|
101
|
+
// Restore cursor position after React re-renders the controlled input
|
|
102
|
+
React.useLayoutEffect(() => {
|
|
103
|
+
if (cursorRef.current !== null && inputRef.current && document.activeElement === inputRef.current) {
|
|
104
|
+
inputRef.current.setSelectionRange(cursorRef.current, cursorRef.current);
|
|
105
|
+
cursorRef.current = null;
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
const hasChecks = !!checks?.length || !!required;
|
|
109
|
+
// Display value logic:
|
|
110
|
+
// - currency editing: liveFormat the raw text (preserves incomplete decimals)
|
|
111
|
+
// - currency not editing: full Intl format
|
|
112
|
+
// - other formats: formatDisplay
|
|
113
|
+
// - no format: raw string
|
|
114
|
+
let displayValue;
|
|
115
|
+
if (format === 'currency') {
|
|
116
|
+
if (rawText !== null) {
|
|
117
|
+
displayValue = liveFormatCurrency(rawText);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
const num = Number(value);
|
|
121
|
+
displayValue = (value === '' || value === undefined || value === null || (num === 0 && String(value) === ''))
|
|
122
|
+
? '' : formatDisplay(value, format, formatOptions);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
displayValue = format ? formatDisplay(value, format, formatOptions) : String(value);
|
|
127
|
+
}
|
|
128
|
+
function validate(val) {
|
|
129
|
+
if (!hasChecks)
|
|
130
|
+
return;
|
|
131
|
+
const errs = runChecks(val, checks, required);
|
|
132
|
+
setErrors(errs);
|
|
133
|
+
}
|
|
134
|
+
function handleChange(e) {
|
|
135
|
+
// Save cursor position before state update triggers re-render
|
|
136
|
+
cursorRef.current = e.target.selectionStart;
|
|
137
|
+
if (format === 'currency') {
|
|
138
|
+
const raw = stripFormat(e.target.value, format);
|
|
139
|
+
setRawText(raw);
|
|
140
|
+
const parsed = parseFloat(raw);
|
|
141
|
+
onChange?.(isNaN(parsed) ? '0' : String(parsed));
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
const raw = format ? stripFormat(e.target.value, format) : e.target.value;
|
|
145
|
+
onChange?.(raw);
|
|
146
|
+
}
|
|
147
|
+
if (touched && validateOn === 'change')
|
|
148
|
+
validate(stripFormat(e.target.value, format));
|
|
149
|
+
}
|
|
150
|
+
function handleFocus(e) {
|
|
151
|
+
setFocused(true);
|
|
152
|
+
if (format === 'currency') {
|
|
153
|
+
// Enter edit mode: set rawText to current numeric value
|
|
154
|
+
const num = Number(value);
|
|
155
|
+
setRawText(num === 0 ? '' : String(num));
|
|
156
|
+
}
|
|
157
|
+
// Select all on focus: default true when format is set, false otherwise
|
|
158
|
+
const shouldSelect = selectOnFocus ?? !!format;
|
|
159
|
+
if (shouldSelect) {
|
|
160
|
+
requestAnimationFrame(() => inputRef.current?.select());
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
function handleBlur() {
|
|
164
|
+
setFocused(false);
|
|
165
|
+
setRawText(null); // Exit edit mode — display switches to full Intl format
|
|
166
|
+
setTouched(true);
|
|
167
|
+
if (validateOn === 'blur' || validateOn === 'change')
|
|
168
|
+
validate(String(value));
|
|
169
|
+
}
|
|
170
|
+
const hasError = touched && errors.length > 0;
|
|
171
|
+
return (_jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: t.spacing.unit, minWidth: 0 }, children: [label && (_jsxs("label", { htmlFor: inputId, style: { fontSize: t.typography.scale.sm.fontSize, fontWeight: t.typography.weight.medium, fontFamily: t.typography.fontFamily.base, color, ...resolveLabelStyle(t.identity.labelStyle, t.colors.accent) }, children: [label, required && _jsx("span", { style: { color: t.colors.error, marginLeft: 2 }, children: "*" })] })), _jsx("input", { id: inputId, ref: inputRef, type: type, inputMode: format === 'currency' ? 'decimal' : undefined, value: displayValue, placeholder: placeholder, disabled: disabled, readOnly: readOnly, onFocus: handleFocus, onBlur: handleBlur, onChange: handleChange, onKeyDown: onSubmit ? (e) => { if (e.key === 'Enter') {
|
|
172
|
+
e.preventDefault();
|
|
173
|
+
onSubmit();
|
|
174
|
+
} } : undefined, style: {
|
|
175
|
+
padding: `${t.spacing.scale.sm}px ${t.spacing.scale.sm + t.spacing.unit}px`,
|
|
176
|
+
borderRadius: t.radius(t.shape.radius.md),
|
|
177
|
+
fontSize: t.typography.scale.sm.fontSize,
|
|
178
|
+
fontFamily: t.typography.fontFamily.base,
|
|
179
|
+
color,
|
|
180
|
+
width: '100%',
|
|
181
|
+
minWidth: 0,
|
|
182
|
+
boxSizing: 'border-box',
|
|
183
|
+
outline: 'none',
|
|
184
|
+
transition: `border-color ${t.motion.duration.fast}ms ${t.motion.easing.default}, box-shadow ${t.motion.duration.fast}ms ${t.motion.easing.default}`,
|
|
185
|
+
colorScheme: isDark ? 'dark' : 'light',
|
|
186
|
+
...t.surface.input,
|
|
187
|
+
...(focused ? t.surface.inputFocus : {}),
|
|
188
|
+
...(hasError ? { borderColor: t.colors.error } : {}),
|
|
189
|
+
...style,
|
|
190
|
+
} }), hasError && (_jsx("span", { style: { fontSize: t.typography.scale.xs.fontSize, color: t.colors.error, marginTop: t.spacing.unit }, children: errors[0] }))] }));
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/primitives/input.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { CSSProperties, ReactNode } from 'react';
|
|
2
|
+
interface KanbanColumn {
|
|
3
|
+
id: string;
|
|
4
|
+
title: string;
|
|
5
|
+
}
|
|
6
|
+
interface KanbanBoardProps {
|
|
7
|
+
columns?: KanbanColumn[];
|
|
8
|
+
style?: CSSProperties;
|
|
9
|
+
children?: ReactNode;
|
|
10
|
+
}
|
|
11
|
+
export declare function KanbanBoard({ columns, style, children }: KanbanBoardProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=kanban-board.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kanban-board.d.ts","sourceRoot":"","sources":["../../src/primitives/kanban-board.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEtD,UAAU,YAAY;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,gBAAgB;IACxB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,wBAAgB,WAAW,CAAC,EAAE,OAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,gBAAgB,2CAW9E"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
export function KanbanBoard({ columns = [], style, children }) {
|
|
3
|
+
return (_jsx("div", { role: "region", "aria-label": "Kanban board", style: { display: 'flex', gap: 16, overflowX: 'auto', ...style }, children: columns.map((col) => (_jsxs("div", { style: { flex: '0 0 280px', backgroundColor: '#f9fafb', borderRadius: 8, padding: 12 }, children: [_jsx("h3", { style: { margin: '0 0 12px', fontSize: 14, fontWeight: 600, color: '#374151' }, children: col.title }), children] }, col.id))) }));
|
|
4
|
+
}
|
|
5
|
+
//# sourceMappingURL=kanban-board.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kanban-board.js","sourceRoot":"","sources":["../../src/primitives/kanban-board.tsx"],"names":[],"mappings":";AAaA,MAAM,UAAU,WAAW,CAAC,EAAE,OAAO,GAAG,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAoB;IAC7E,OAAO,CACL,cAAK,IAAI,EAAC,QAAQ,gBAAY,cAAc,EAAC,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,YAC1G,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CACpB,eAAkB,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,aACtG,aAAI,KAAK,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,YAAG,GAAG,CAAC,KAAK,GAAM,EACnG,QAAQ,KAFD,GAAG,CAAC,EAAE,CAGV,CACP,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { CSSProperties } from 'react';
|
|
2
|
+
interface LineChartDataPoint {
|
|
3
|
+
label: string;
|
|
4
|
+
value: number;
|
|
5
|
+
}
|
|
6
|
+
interface LineChartProps {
|
|
7
|
+
data?: LineChartDataPoint[];
|
|
8
|
+
height?: number;
|
|
9
|
+
color?: string;
|
|
10
|
+
style?: CSSProperties;
|
|
11
|
+
}
|
|
12
|
+
export declare function LineChart({ data, height, color, style }: LineChartProps): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=line-chart.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"line-chart.d.ts","sourceRoot":"","sources":["../../src/primitives/line-chart.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,UAAU,kBAAkB;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,cAAc;IACtB,IAAI,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAED,wBAAgB,SAAS,CAAC,EAAE,IAAS,EAAE,MAAY,EAAE,KAAiB,EAAE,KAAK,EAAE,EAAE,cAAc,2CAyB9F"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
export function LineChart({ data = [], height = 200, color = '#3b82f6', style }) {
|
|
3
|
+
if (data.length === 0)
|
|
4
|
+
return _jsx("div", { style: { height, ...style } });
|
|
5
|
+
const maxValue = Math.max(...data.map((d) => d.value), 1);
|
|
6
|
+
const minValue = Math.min(...data.map((d) => d.value), 0);
|
|
7
|
+
const range = maxValue - minValue || 1;
|
|
8
|
+
const width = 100;
|
|
9
|
+
const stepX = data.length > 1 ? width / (data.length - 1) : width;
|
|
10
|
+
const points = data.map((d, i) => {
|
|
11
|
+
const x = i * stepX;
|
|
12
|
+
const y = height - ((d.value - minValue) / range) * height;
|
|
13
|
+
return `${x},${y}`;
|
|
14
|
+
}).join(' ');
|
|
15
|
+
return (_jsxs("div", { role: "img", "aria-label": "Line chart", style: { height, position: 'relative', ...style }, children: [_jsx("svg", { viewBox: `0 0 ${width} ${height}`, preserveAspectRatio: "none", style: { width: '100%', height: '100%' }, children: _jsx("polyline", { points: points, fill: "none", stroke: color, strokeWidth: "2", vectorEffect: "non-scaling-stroke" }) }), _jsx("div", { style: { display: 'flex', justifyContent: 'space-between', fontSize: 10, color: '#6b7280', marginTop: 4 }, children: data.map((d, i) => _jsx("span", { children: d.label }, i)) })] }));
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=line-chart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"line-chart.js","sourceRoot":"","sources":["../../src/primitives/line-chart.tsx"],"names":[],"mappings":";AAcA,MAAM,UAAU,SAAS,CAAC,EAAE,IAAI,GAAG,EAAE,EAAE,MAAM,GAAG,GAAG,EAAE,KAAK,GAAG,SAAS,EAAE,KAAK,EAAkB;IAC7F,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,cAAK,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,GAAI,CAAC;IAEnE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,QAAQ,GAAG,QAAQ,IAAI,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,GAAG,CAAC;IAClB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAElE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC/B,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACpB,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,QAAQ,CAAC,GAAG,KAAK,CAAC,GAAG,MAAM,CAAC;QAC3D,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEb,OAAO,CACL,eAAK,IAAI,EAAC,KAAK,gBAAY,YAAY,EAAC,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,KAAK,EAAE,aACvF,cAAK,OAAO,EAAE,OAAO,KAAK,IAAI,MAAM,EAAE,EAAE,mBAAmB,EAAC,MAAM,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YACzG,mBAAU,MAAM,EAAE,MAAM,EAAE,IAAI,EAAC,MAAM,EAAC,MAAM,EAAE,KAAK,EAAE,WAAW,EAAC,GAAG,EAAC,YAAY,EAAC,oBAAoB,GAAG,GACrG,EACN,cAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,YAC3G,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,yBAAe,CAAC,CAAC,KAAK,IAAX,CAAC,CAAkB,CAAC,GAC/C,IACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { CSSProperties, ReactNode } from 'react';
|
|
2
|
+
interface ListProps {
|
|
3
|
+
style?: CSSProperties;
|
|
4
|
+
children?: ReactNode;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* List primitive — renders children in a vertical list.
|
|
8
|
+
* Repeat/iteration is handled by the engine (repeat config),
|
|
9
|
+
* so this component just wraps the rendered children.
|
|
10
|
+
*/
|
|
11
|
+
export declare function List({ style, children }: ListProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/primitives/list.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEtD,UAAU,SAAS;IACjB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,SAAS,2CAMlD"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* List primitive — renders children in a vertical list.
|
|
4
|
+
* Repeat/iteration is handled by the engine (repeat config),
|
|
5
|
+
* so this component just wraps the rendered children.
|
|
6
|
+
*/
|
|
7
|
+
export function List({ style, children }) {
|
|
8
|
+
return (_jsx("div", { role: "list", style: { display: 'flex', flexDirection: 'column', ...style }, children: children }));
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/primitives/list.tsx"],"names":[],"mappings":";AAOA;;;;GAIG;AACH,MAAM,UAAU,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAa;IACjD,OAAO,CACL,cAAK,IAAI,EAAC,MAAM,EAAC,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,YAC3E,QAAQ,GACL,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { CSSProperties, ReactNode } from 'react';
|
|
2
|
+
import type { TargetAndTransition, Transition } from 'motion/react';
|
|
3
|
+
interface MotionConfig {
|
|
4
|
+
initial?: TargetAndTransition;
|
|
5
|
+
animate?: TargetAndTransition;
|
|
6
|
+
exit?: TargetAndTransition;
|
|
7
|
+
transition?: Transition;
|
|
8
|
+
}
|
|
9
|
+
interface ModalProps {
|
|
10
|
+
visible?: boolean;
|
|
11
|
+
title?: string;
|
|
12
|
+
style?: CSSProperties;
|
|
13
|
+
_tokens?: Record<string, unknown>;
|
|
14
|
+
_motion?: MotionConfig;
|
|
15
|
+
children?: ReactNode;
|
|
16
|
+
onClose?: () => void;
|
|
17
|
+
}
|
|
18
|
+
export declare function Modal({ visible, title, style, _tokens, _motion, children, onClose }: ModalProps): import("react/jsx-runtime").JSX.Element | null;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=modal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modal.d.ts","sourceRoot":"","sources":["../../src/primitives/modal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGtD,OAAO,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAGpE,UAAU,YAAY;IACpB,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,IAAI,CAAC,EAAE,mBAAmB,CAAC;IAC3B,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,UAAU,UAAU;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,wBAAgB,KAAK,CAAC,EAAE,OAAc,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,UAAU,kDAoGtG"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { createPortal } from 'react-dom';
|
|
3
|
+
import { motion } from 'motion/react';
|
|
4
|
+
import { useDesignTokens } from './use-design-tokens.js';
|
|
5
|
+
export function Modal({ visible = true, title, style, _tokens, _motion, children, onClose }) {
|
|
6
|
+
if (!visible)
|
|
7
|
+
return null;
|
|
8
|
+
const t = useDesignTokens(_tokens);
|
|
9
|
+
const hasMotion = !!_motion;
|
|
10
|
+
const backdropTransition = _motion?.transition
|
|
11
|
+
? { duration: _motion.transition.duration ?? 0.25 }
|
|
12
|
+
: { duration: 0.25 };
|
|
13
|
+
// Portal to document.body so `position: fixed` escapes any ancestor that
|
|
14
|
+
// creates a containing block (transform, filter, perspective, etc.) — most
|
|
15
|
+
// commonly CSS mount animations with `fill-mode: both` leave a final
|
|
16
|
+
// transform that traps fixed positioning inside the spec tree.
|
|
17
|
+
const tree = (_jsxs("div", { role: "dialog", "aria-modal": "true", style: {
|
|
18
|
+
position: 'fixed',
|
|
19
|
+
inset: 0,
|
|
20
|
+
display: 'flex',
|
|
21
|
+
alignItems: 'center',
|
|
22
|
+
justifyContent: 'center',
|
|
23
|
+
zIndex: 1000,
|
|
24
|
+
padding: t.spacing.scale.lg,
|
|
25
|
+
}, children: [hasMotion ? (_jsx(motion.div, { initial: { opacity: 0 }, animate: { opacity: 1 }, transition: backdropTransition, style: {
|
|
26
|
+
position: 'fixed',
|
|
27
|
+
inset: 0,
|
|
28
|
+
backgroundColor: `rgba(0,0,0,${t.opacity.backdrop})`,
|
|
29
|
+
}, onClick: onClose, "aria-hidden": "true" })) : (_jsx("div", { style: {
|
|
30
|
+
position: 'fixed',
|
|
31
|
+
inset: 0,
|
|
32
|
+
backgroundColor: `rgba(0,0,0,${t.opacity.backdrop})`,
|
|
33
|
+
}, onClick: onClose, "aria-hidden": "true" })), hasMotion ? (_jsxs(motion.div, { initial: _motion.initial, animate: _motion.animate, transition: _motion.transition, style: {
|
|
34
|
+
position: 'relative',
|
|
35
|
+
color: t.colors.text,
|
|
36
|
+
borderRadius: t.radius(t.shape.radius.xl),
|
|
37
|
+
padding: t.spacing.scale.lg + t.spacing.unit,
|
|
38
|
+
width: '100%',
|
|
39
|
+
maxWidth: 600,
|
|
40
|
+
maxHeight: 'calc(100vh - 48px)',
|
|
41
|
+
overflowY: 'auto',
|
|
42
|
+
...t.surface.modal,
|
|
43
|
+
...style,
|
|
44
|
+
}, children: [title && (_jsx("h2", { style: { margin: 0, marginBottom: t.spacing.scale.md, fontSize: t.typography.scale.lg.fontSize, fontWeight: t.typography.weight.bold, fontFamily: t.typography.fontFamily.heading, color: t.colors.text }, children: title })), children] })) : (_jsxs("div", { style: {
|
|
45
|
+
position: 'relative',
|
|
46
|
+
color: t.colors.text,
|
|
47
|
+
borderRadius: t.radius(t.shape.radius.xl),
|
|
48
|
+
padding: t.spacing.scale.lg + t.spacing.unit,
|
|
49
|
+
width: '100%',
|
|
50
|
+
maxWidth: 600,
|
|
51
|
+
maxHeight: 'calc(100vh - 48px)',
|
|
52
|
+
overflowY: 'auto',
|
|
53
|
+
...t.surface.modal,
|
|
54
|
+
...style,
|
|
55
|
+
}, children: [title && (_jsx("h2", { style: { margin: 0, marginBottom: t.spacing.scale.md, fontSize: t.typography.scale.lg.fontSize, fontWeight: t.typography.weight.bold, fontFamily: t.typography.fontFamily.heading, color: t.colors.text }, children: title })), children] }))] }));
|
|
56
|
+
if (typeof document === 'undefined')
|
|
57
|
+
return tree;
|
|
58
|
+
return createPortal(tree, document.body);
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=modal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modal.js","sourceRoot":"","sources":["../../src/primitives/modal.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAmBzD,MAAM,UAAU,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAc;IACrG,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,MAAM,CAAC,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAEnC,MAAM,SAAS,GAAG,CAAC,CAAC,OAAO,CAAC;IAC5B,MAAM,kBAAkB,GAAG,OAAO,EAAE,UAAU;QAC5C,CAAC,CAAC,EAAE,QAAQ,EAAG,OAAO,CAAC,UAAU,CAAC,QAAmB,IAAI,IAAI,EAAE;QAC/D,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAEvB,yEAAyE;IACzE,2EAA2E;IAC3E,qEAAqE;IACrE,+DAA+D;IAC/D,MAAM,IAAI,GAAG,CACX,eACE,IAAI,EAAC,QAAQ,gBACF,MAAM,EACjB,KAAK,EAAE;YACL,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,MAAM;YACf,UAAU,EAAE,QAAQ;YACpB,cAAc,EAAE,QAAQ;YACxB,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;SAC5B,aAEA,SAAS,CAAC,CAAC,CAAC,CACX,KAAC,MAAM,CAAC,GAAG,IACT,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EACvB,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EACvB,UAAU,EAAE,kBAAkB,EAC9B,KAAK,EAAE;oBACL,QAAQ,EAAE,OAAO;oBACjB,KAAK,EAAE,CAAC;oBACR,eAAe,EAAE,cAAc,CAAC,CAAC,OAAO,CAAC,QAAQ,GAAG;iBACrD,EACD,OAAO,EAAE,OAAO,iBACJ,MAAM,GAClB,CACH,CAAC,CAAC,CAAC,CACF,cACE,KAAK,EAAE;oBACL,QAAQ,EAAE,OAAO;oBACjB,KAAK,EAAE,CAAC;oBACR,eAAe,EAAE,cAAc,CAAC,CAAC,OAAO,CAAC,QAAQ,GAAG;iBACrD,EACD,OAAO,EAAE,OAAO,iBACJ,MAAM,GAClB,CACH,EACA,SAAS,CAAC,CAAC,CAAC,CACX,MAAC,MAAM,CAAC,GAAG,IACT,OAAO,EAAE,OAAQ,CAAC,OAAO,EACzB,OAAO,EAAE,OAAQ,CAAC,OAAO,EACzB,UAAU,EAAE,OAAQ,CAAC,UAAU,EAC/B,KAAK,EAAE;oBACL,QAAQ,EAAE,UAAU;oBACpB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI;oBACpB,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;oBACzC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI;oBAC5C,KAAK,EAAE,MAAM;oBACb,QAAQ,EAAE,GAAG;oBACb,SAAS,EAAE,oBAAoB;oBAC/B,SAAS,EAAE,MAAe;oBAC1B,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK;oBAClB,GAAG,KAAK;iBACT,aAEA,KAAK,IAAI,CACR,aAAI,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,YAAG,KAAK,GAAM,CAC5N,EACA,QAAQ,IACE,CACd,CAAC,CAAC,CAAC,CACF,eACE,KAAK,EAAE;oBACL,QAAQ,EAAE,UAAU;oBACpB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI;oBACpB,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;oBACzC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI;oBAC5C,KAAK,EAAE,MAAM;oBACb,QAAQ,EAAE,GAAG;oBACb,SAAS,EAAE,oBAAoB;oBAC/B,SAAS,EAAE,MAAM;oBACjB,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK;oBAClB,GAAG,KAAK;iBACT,aAEA,KAAK,IAAI,CACR,aAAI,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,YAAG,KAAK,GAAM,CAC5N,EACA,QAAQ,IACL,CACP,IACG,CACP,CAAC;IAEF,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IACjD,OAAO,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { CSSProperties } from 'react';
|
|
2
|
+
interface PieChartSegment {
|
|
3
|
+
label: string;
|
|
4
|
+
value: number;
|
|
5
|
+
color?: string;
|
|
6
|
+
}
|
|
7
|
+
interface PieChartProps {
|
|
8
|
+
data?: PieChartSegment[];
|
|
9
|
+
size?: number;
|
|
10
|
+
donut?: boolean;
|
|
11
|
+
style?: CSSProperties;
|
|
12
|
+
}
|
|
13
|
+
export declare function PieChart({ data, size, donut, style }: PieChartProps): import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=pie-chart.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pie-chart.d.ts","sourceRoot":"","sources":["../../src/primitives/pie-chart.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,UAAU,eAAe;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,eAAe,EAAE,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAID,wBAAgB,QAAQ,CAAC,EAAE,IAAS,EAAE,IAAU,EAAE,KAAa,EAAE,KAAK,EAAE,EAAE,aAAa,2CA+CtF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
const DEFAULT_COLORS = ['#3b82f6', '#ef4444', '#10b981', '#f59e0b', '#8b5cf6', '#ec4899', '#06b6d4', '#84cc16'];
|
|
3
|
+
export function PieChart({ data = [], size = 200, donut = false, style }) {
|
|
4
|
+
const total = data.reduce((sum, d) => sum + d.value, 0) || 1;
|
|
5
|
+
const r = size / 2;
|
|
6
|
+
const cx = r;
|
|
7
|
+
const cy = r;
|
|
8
|
+
const outerR = r - 2;
|
|
9
|
+
const innerR = donut ? outerR * 0.6 : 0;
|
|
10
|
+
let cumulativeAngle = -Math.PI / 2;
|
|
11
|
+
const segments = data.map((seg, i) => {
|
|
12
|
+
const angle = (seg.value / total) * 2 * Math.PI;
|
|
13
|
+
const startAngle = cumulativeAngle;
|
|
14
|
+
const endAngle = cumulativeAngle + angle;
|
|
15
|
+
cumulativeAngle = endAngle;
|
|
16
|
+
const x1 = cx + outerR * Math.cos(startAngle);
|
|
17
|
+
const y1 = cy + outerR * Math.sin(startAngle);
|
|
18
|
+
const x2 = cx + outerR * Math.cos(endAngle);
|
|
19
|
+
const y2 = cy + outerR * Math.sin(endAngle);
|
|
20
|
+
const largeArc = angle > Math.PI ? 1 : 0;
|
|
21
|
+
let d;
|
|
22
|
+
if (donut) {
|
|
23
|
+
const ix1 = cx + innerR * Math.cos(startAngle);
|
|
24
|
+
const iy1 = cy + innerR * Math.sin(startAngle);
|
|
25
|
+
const ix2 = cx + innerR * Math.cos(endAngle);
|
|
26
|
+
const iy2 = cy + innerR * Math.sin(endAngle);
|
|
27
|
+
d = `M ${x1} ${y1} A ${outerR} ${outerR} 0 ${largeArc} 1 ${x2} ${y2} L ${ix2} ${iy2} A ${innerR} ${innerR} 0 ${largeArc} 0 ${ix1} ${iy1} Z`;
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
d = `M ${cx} ${cy} L ${x1} ${y1} A ${outerR} ${outerR} 0 ${largeArc} 1 ${x2} ${y2} Z`;
|
|
31
|
+
}
|
|
32
|
+
return (_jsx("path", { d: d, fill: seg.color ?? DEFAULT_COLORS[i % DEFAULT_COLORS.length], children: _jsx("title", { children: `${seg.label}: ${seg.value}` }) }, i));
|
|
33
|
+
});
|
|
34
|
+
return (_jsx("div", { role: "img", "aria-label": "Pie chart", style: { width: size, height: size, ...style }, children: _jsx("svg", { viewBox: `0 0 ${size} ${size}`, style: { width: '100%', height: '100%' }, children: segments }) }));
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=pie-chart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pie-chart.js","sourceRoot":"","sources":["../../src/primitives/pie-chart.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { CSSProperties } from 'react';
|
|
3
|
+
interface ScreenOutletProps {
|
|
4
|
+
style?: CSSProperties;
|
|
5
|
+
_tokens?: Record<string, unknown>;
|
|
6
|
+
}
|
|
7
|
+
export declare function ScreenOutlet({ style }: ScreenOutletProps): React.ReactElement;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=screen-outlet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screen-outlet.d.ts","sourceRoot":"","sources":["../../src/primitives/screen-outlet.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAW3C,UAAU,iBAAiB;IACzB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,EAAE,iBAAiB,GAAG,KAAK,CAAC,YAAY,CAoG7E"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { createActionDispatcher } from 'mythik';
|
|
3
|
+
import { useAppContext } from '../app-context.js';
|
|
4
|
+
import { MythikRenderer } from '../MythikRenderer.js';
|
|
5
|
+
export function ScreenOutlet({ style }) {
|
|
6
|
+
const { appEngine, svc, fetcher, onSpecRuntimeMount } = useAppContext();
|
|
7
|
+
const [screenState, setScreenState] = React.useState({ status: 'loading' });
|
|
8
|
+
React.useEffect(() => {
|
|
9
|
+
let cancelled = false;
|
|
10
|
+
const loadScreen = async () => {
|
|
11
|
+
const screenId = svc.store.get('/navigation/currentScreen');
|
|
12
|
+
if (!screenId)
|
|
13
|
+
return;
|
|
14
|
+
// Skip if already showing this screen
|
|
15
|
+
if (screenState.status === 'ready' && screenState.screenId === screenId)
|
|
16
|
+
return;
|
|
17
|
+
setScreenState({ status: 'loading' });
|
|
18
|
+
try {
|
|
19
|
+
const spec = await appEngine.getScreenSpec(screenId);
|
|
20
|
+
if (!cancelled) {
|
|
21
|
+
setScreenState({ status: 'ready', spec, screenId });
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
if (!cancelled) {
|
|
26
|
+
setScreenState({
|
|
27
|
+
status: 'error',
|
|
28
|
+
message: err instanceof Error ? err.message : 'Failed to load screen',
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
loadScreen();
|
|
34
|
+
const unsub = svc.store.subscribePath('/navigation/currentScreen', () => {
|
|
35
|
+
loadScreen();
|
|
36
|
+
});
|
|
37
|
+
return () => {
|
|
38
|
+
cancelled = true;
|
|
39
|
+
unsub();
|
|
40
|
+
};
|
|
41
|
+
}, [svc, appEngine]); // DON'T depend on screenState — would cause loops
|
|
42
|
+
// Execute initialActions when a new screen loads
|
|
43
|
+
const executedScreenRef = React.useRef('');
|
|
44
|
+
React.useEffect(() => {
|
|
45
|
+
if (screenState.status !== 'ready')
|
|
46
|
+
return;
|
|
47
|
+
if (executedScreenRef.current === screenState.screenId)
|
|
48
|
+
return;
|
|
49
|
+
executedScreenRef.current = screenState.screenId;
|
|
50
|
+
const spec = screenState.spec;
|
|
51
|
+
if (!spec.initialActions || spec.initialActions.length === 0)
|
|
52
|
+
return;
|
|
53
|
+
const dispatcher = createActionDispatcher({
|
|
54
|
+
store: svc.store,
|
|
55
|
+
customActions: svc.plugins.getActions(),
|
|
56
|
+
urlGuard: svc.security?.urlGuard,
|
|
57
|
+
stateGuard: svc.security?.stateGuard,
|
|
58
|
+
rateLimiter: svc.security?.rateLimiter,
|
|
59
|
+
fetcher,
|
|
60
|
+
});
|
|
61
|
+
(async () => {
|
|
62
|
+
for (const binding of spec.initialActions) {
|
|
63
|
+
try {
|
|
64
|
+
if (!('action' in binding))
|
|
65
|
+
continue; // Skip transaction bindings
|
|
66
|
+
await dispatcher.dispatch(binding, (expr) => svc.resolver.resolve(expr));
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
const authActions = ['login', 'logout', 'refreshSession'];
|
|
70
|
+
const actionName = 'action' in binding ? binding.action : '';
|
|
71
|
+
if (!authActions.includes(actionName) || process.env.NODE_ENV !== 'production') {
|
|
72
|
+
console.error(`Screen initialAction failed:`, err);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
})();
|
|
77
|
+
}, [screenState, svc]);
|
|
78
|
+
if (screenState.status === 'loading') {
|
|
79
|
+
return React.createElement('div', {
|
|
80
|
+
style: { display: 'flex', alignItems: 'center', justifyContent: 'center', padding: 40, flex: 1, ...style },
|
|
81
|
+
}, React.createElement('div', {
|
|
82
|
+
style: { width: 32, height: 32, border: '3px solid #E2E8F0', borderTopColor: '#1E40AF', borderRadius: '50%', animation: 'spin 0.8s linear infinite' },
|
|
83
|
+
}));
|
|
84
|
+
}
|
|
85
|
+
if (screenState.status === 'error') {
|
|
86
|
+
return React.createElement('div', {
|
|
87
|
+
style: { display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', padding: 40, gap: 8, flex: 1, ...style },
|
|
88
|
+
}, React.createElement('div', { style: { color: '#DC2626', fontSize: 16, fontWeight: 600 } }, 'Error'), React.createElement('div', { style: { color: '#64748B', fontSize: 14 } }, screenState.message));
|
|
89
|
+
}
|
|
90
|
+
return React.createElement('div', { style: { flex: 1, ...style } }, React.createElement(MythikRenderer, { spec: screenState.spec, instance: svc, fetcher, onSpecRuntimeMount }));
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=screen-outlet.js.map
|