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.
Files changed (244) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +4 -0
  3. package/README.md +83 -0
  4. package/dist/MythikApp.d.ts +61 -0
  5. package/dist/MythikApp.d.ts.map +1 -0
  6. package/dist/MythikApp.js +381 -0
  7. package/dist/MythikApp.js.map +1 -0
  8. package/dist/MythikRenderer.d.ts +31 -0
  9. package/dist/MythikRenderer.d.ts.map +1 -0
  10. package/dist/MythikRenderer.js +900 -0
  11. package/dist/MythikRenderer.js.map +1 -0
  12. package/dist/animation/index.d.ts +7 -0
  13. package/dist/animation/index.d.ts.map +1 -0
  14. package/dist/animation/index.js +5 -0
  15. package/dist/animation/index.js.map +1 -0
  16. package/dist/animation/stylesheet-singleton.d.ts +12 -0
  17. package/dist/animation/stylesheet-singleton.d.ts.map +1 -0
  18. package/dist/animation/stylesheet-singleton.js +107 -0
  19. package/dist/animation/stylesheet-singleton.js.map +1 -0
  20. package/dist/animation/useElementAnimations.d.ts +30 -0
  21. package/dist/animation/useElementAnimations.d.ts.map +1 -0
  22. package/dist/animation/useElementAnimations.js +254 -0
  23. package/dist/animation/useElementAnimations.js.map +1 -0
  24. package/dist/animation/usePrefersReducedMotion.d.ts +2 -0
  25. package/dist/animation/usePrefersReducedMotion.d.ts.map +1 -0
  26. package/dist/animation/usePrefersReducedMotion.js +29 -0
  27. package/dist/animation/usePrefersReducedMotion.js.map +1 -0
  28. package/dist/animation/useShapeAnimations.d.ts +21 -0
  29. package/dist/animation/useShapeAnimations.d.ts.map +1 -0
  30. package/dist/animation/useShapeAnimations.js +119 -0
  31. package/dist/animation/useShapeAnimations.js.map +1 -0
  32. package/dist/app-context.d.ts +15 -0
  33. package/dist/app-context.d.ts.map +1 -0
  34. package/dist/app-context.js +9 -0
  35. package/dist/app-context.js.map +1 -0
  36. package/dist/background/BackgroundLayer.d.ts +7 -0
  37. package/dist/background/BackgroundLayer.d.ts.map +1 -0
  38. package/dist/background/BackgroundLayer.js +50 -0
  39. package/dist/background/BackgroundLayer.js.map +1 -0
  40. package/dist/background/BackgroundStack.d.ts +19 -0
  41. package/dist/background/BackgroundStack.d.ts.map +1 -0
  42. package/dist/background/BackgroundStack.js +59 -0
  43. package/dist/background/BackgroundStack.js.map +1 -0
  44. package/dist/background/BlobLayer.d.ts +12 -0
  45. package/dist/background/BlobLayer.d.ts.map +1 -0
  46. package/dist/background/BlobLayer.js +60 -0
  47. package/dist/background/BlobLayer.js.map +1 -0
  48. package/dist/background/index.d.ts +3 -0
  49. package/dist/background/index.d.ts.map +1 -0
  50. package/dist/background/index.js +3 -0
  51. package/dist/background/index.js.map +1 -0
  52. package/dist/css-hover.d.ts +15 -0
  53. package/dist/css-hover.d.ts.map +1 -0
  54. package/dist/css-hover.js +51 -0
  55. package/dist/css-hover.js.map +1 -0
  56. package/dist/index.d.ts +10 -0
  57. package/dist/index.d.ts.map +1 -0
  58. package/dist/index.js +11 -0
  59. package/dist/index.js.map +1 -0
  60. package/dist/primitives/accordion.d.ts +12 -0
  61. package/dist/primitives/accordion.d.ts.map +1 -0
  62. package/dist/primitives/accordion.js +25 -0
  63. package/dist/primitives/accordion.js.map +1 -0
  64. package/dist/primitives/area-chart.d.ts +14 -0
  65. package/dist/primitives/area-chart.d.ts.map +1 -0
  66. package/dist/primitives/area-chart.js +18 -0
  67. package/dist/primitives/area-chart.js.map +1 -0
  68. package/dist/primitives/audio-player.d.ts +9 -0
  69. package/dist/primitives/audio-player.d.ts.map +1 -0
  70. package/dist/primitives/audio-player.js +5 -0
  71. package/dist/primitives/audio-player.js.map +1 -0
  72. package/dist/primitives/bar-chart.d.ts +14 -0
  73. package/dist/primitives/bar-chart.d.ts.map +1 -0
  74. package/dist/primitives/bar-chart.js +22 -0
  75. package/dist/primitives/bar-chart.js.map +1 -0
  76. package/dist/primitives/box.d.ts +21 -0
  77. package/dist/primitives/box.d.ts.map +1 -0
  78. package/dist/primitives/box.js +54 -0
  79. package/dist/primitives/box.js.map +1 -0
  80. package/dist/primitives/button.d.ts +14 -0
  81. package/dist/primitives/button.d.ts.map +1 -0
  82. package/dist/primitives/button.js +28 -0
  83. package/dist/primitives/button.js.map +1 -0
  84. package/dist/primitives/camera.d.ts +15 -0
  85. package/dist/primitives/camera.d.ts.map +1 -0
  86. package/dist/primitives/camera.js +25 -0
  87. package/dist/primitives/camera.js.map +1 -0
  88. package/dist/primitives/checkbox.d.ts +12 -0
  89. package/dist/primitives/checkbox.d.ts.map +1 -0
  90. package/dist/primitives/checkbox.js +24 -0
  91. package/dist/primitives/checkbox.js.map +1 -0
  92. package/dist/primitives/divider.d.ts +9 -0
  93. package/dist/primitives/divider.d.ts.map +1 -0
  94. package/dist/primitives/divider.js +10 -0
  95. package/dist/primitives/divider.js.map +1 -0
  96. package/dist/primitives/drawer.d.ts +21 -0
  97. package/dist/primitives/drawer.d.ts.map +1 -0
  98. package/dist/primitives/drawer.js +38 -0
  99. package/dist/primitives/drawer.js.map +1 -0
  100. package/dist/primitives/file-upload.d.ts +27 -0
  101. package/dist/primitives/file-upload.d.ts.map +1 -0
  102. package/dist/primitives/file-upload.js +225 -0
  103. package/dist/primitives/file-upload.js.map +1 -0
  104. package/dist/primitives/grid.d.ts +13 -0
  105. package/dist/primitives/grid.d.ts.map +1 -0
  106. package/dist/primitives/grid.js +13 -0
  107. package/dist/primitives/grid.js.map +1 -0
  108. package/dist/primitives/icon.d.ts +22 -0
  109. package/dist/primitives/icon.d.ts.map +1 -0
  110. package/dist/primitives/icon.js +52 -0
  111. package/dist/primitives/icon.js.map +1 -0
  112. package/dist/primitives/image.d.ts +13 -0
  113. package/dist/primitives/image.d.ts.map +1 -0
  114. package/dist/primitives/image.js +38 -0
  115. package/dist/primitives/image.js.map +1 -0
  116. package/dist/primitives/index.d.ts +57 -0
  117. package/dist/primitives/index.d.ts.map +1 -0
  118. package/dist/primitives/index.js +106 -0
  119. package/dist/primitives/index.js.map +1 -0
  120. package/dist/primitives/input.d.ts +32 -0
  121. package/dist/primitives/input.d.ts.map +1 -0
  122. package/dist/primitives/input.js +192 -0
  123. package/dist/primitives/input.js.map +1 -0
  124. package/dist/primitives/kanban-board.d.ts +13 -0
  125. package/dist/primitives/kanban-board.d.ts.map +1 -0
  126. package/dist/primitives/kanban-board.js +5 -0
  127. package/dist/primitives/kanban-board.js.map +1 -0
  128. package/dist/primitives/line-chart.d.ts +14 -0
  129. package/dist/primitives/line-chart.d.ts.map +1 -0
  130. package/dist/primitives/line-chart.js +17 -0
  131. package/dist/primitives/line-chart.js.map +1 -0
  132. package/dist/primitives/list.d.ts +13 -0
  133. package/dist/primitives/list.d.ts.map +1 -0
  134. package/dist/primitives/list.js +10 -0
  135. package/dist/primitives/list.js.map +1 -0
  136. package/dist/primitives/modal.d.ts +20 -0
  137. package/dist/primitives/modal.d.ts.map +1 -0
  138. package/dist/primitives/modal.js +60 -0
  139. package/dist/primitives/modal.js.map +1 -0
  140. package/dist/primitives/pie-chart.d.ts +15 -0
  141. package/dist/primitives/pie-chart.d.ts.map +1 -0
  142. package/dist/primitives/pie-chart.js +36 -0
  143. package/dist/primitives/pie-chart.js.map +1 -0
  144. package/dist/primitives/screen-outlet.d.ts +9 -0
  145. package/dist/primitives/screen-outlet.d.ts.map +1 -0
  146. package/dist/primitives/screen-outlet.js +92 -0
  147. package/dist/primitives/screen-outlet.js.map +1 -0
  148. package/dist/primitives/screen.d.ts +9 -0
  149. package/dist/primitives/screen.d.ts.map +1 -0
  150. package/dist/primitives/screen.js +10 -0
  151. package/dist/primitives/screen.js.map +1 -0
  152. package/dist/primitives/scroll.d.ts +11 -0
  153. package/dist/primitives/scroll.d.ts.map +1 -0
  154. package/dist/primitives/scroll.js +10 -0
  155. package/dist/primitives/scroll.js.map +1 -0
  156. package/dist/primitives/select.d.ts +19 -0
  157. package/dist/primitives/select.d.ts.map +1 -0
  158. package/dist/primitives/select.js +109 -0
  159. package/dist/primitives/select.js.map +1 -0
  160. package/dist/primitives/signature.d.ts +13 -0
  161. package/dist/primitives/signature.d.ts.map +1 -0
  162. package/dist/primitives/signature.js +45 -0
  163. package/dist/primitives/signature.js.map +1 -0
  164. package/dist/primitives/skeleton.d.ts +14 -0
  165. package/dist/primitives/skeleton.d.ts.map +1 -0
  166. package/dist/primitives/skeleton.js +41 -0
  167. package/dist/primitives/skeleton.js.map +1 -0
  168. package/dist/primitives/slider.d.ts +15 -0
  169. package/dist/primitives/slider.d.ts.map +1 -0
  170. package/dist/primitives/slider.js +7 -0
  171. package/dist/primitives/slider.js.map +1 -0
  172. package/dist/primitives/spacer.d.ts +9 -0
  173. package/dist/primitives/spacer.d.ts.map +1 -0
  174. package/dist/primitives/spacer.js +9 -0
  175. package/dist/primitives/spacer.js.map +1 -0
  176. package/dist/primitives/spatial-map-editing.d.ts +472 -0
  177. package/dist/primitives/spatial-map-editing.d.ts.map +1 -0
  178. package/dist/primitives/spatial-map-editing.js +886 -0
  179. package/dist/primitives/spatial-map-editing.js.map +1 -0
  180. package/dist/primitives/spatial-map.d.ts +1073 -0
  181. package/dist/primitives/spatial-map.d.ts.map +1 -0
  182. package/dist/primitives/spatial-map.js +1705 -0
  183. package/dist/primitives/spatial-map.js.map +1 -0
  184. package/dist/primitives/stack.d.ts +13 -0
  185. package/dist/primitives/stack.d.ts.map +1 -0
  186. package/dist/primitives/stack.js +12 -0
  187. package/dist/primitives/stack.js.map +1 -0
  188. package/dist/primitives/table.d.ts +115 -0
  189. package/dist/primitives/table.d.ts.map +1 -0
  190. package/dist/primitives/table.js +498 -0
  191. package/dist/primitives/table.js.map +1 -0
  192. package/dist/primitives/tabs.d.ts +17 -0
  193. package/dist/primitives/tabs.d.ts.map +1 -0
  194. package/dist/primitives/tabs.js +13 -0
  195. package/dist/primitives/tabs.js.map +1 -0
  196. package/dist/primitives/text.d.ts +11 -0
  197. package/dist/primitives/text.d.ts.map +1 -0
  198. package/dist/primitives/text.js +69 -0
  199. package/dist/primitives/text.js.map +1 -0
  200. package/dist/primitives/textarea.d.ts +15 -0
  201. package/dist/primitives/textarea.d.ts.map +1 -0
  202. package/dist/primitives/textarea.js +23 -0
  203. package/dist/primitives/textarea.js.map +1 -0
  204. package/dist/primitives/toast-container.d.ts +15 -0
  205. package/dist/primitives/toast-container.d.ts.map +1 -0
  206. package/dist/primitives/toast-container.js +160 -0
  207. package/dist/primitives/toast-container.js.map +1 -0
  208. package/dist/primitives/toggle.d.ts +12 -0
  209. package/dist/primitives/toggle.d.ts.map +1 -0
  210. package/dist/primitives/toggle.js +18 -0
  211. package/dist/primitives/toggle.js.map +1 -0
  212. package/dist/primitives/touchable.d.ts +10 -0
  213. package/dist/primitives/touchable.d.ts.map +1 -0
  214. package/dist/primitives/touchable.js +6 -0
  215. package/dist/primitives/touchable.js.map +1 -0
  216. package/dist/primitives/use-design-tokens.d.ts +127 -0
  217. package/dist/primitives/use-design-tokens.d.ts.map +1 -0
  218. package/dist/primitives/use-design-tokens.js +251 -0
  219. package/dist/primitives/use-design-tokens.js.map +1 -0
  220. package/dist/primitives/use-theme.d.ts +11 -0
  221. package/dist/primitives/use-theme.d.ts.map +1 -0
  222. package/dist/primitives/use-theme.js +17 -0
  223. package/dist/primitives/use-theme.js.map +1 -0
  224. package/dist/primitives/wizard.d.ts +11 -0
  225. package/dist/primitives/wizard.d.ts.map +1 -0
  226. package/dist/primitives/wizard.js +15 -0
  227. package/dist/primitives/wizard.js.map +1 -0
  228. package/dist/runtime/context-dispatcher.d.ts +3 -0
  229. package/dist/runtime/context-dispatcher.d.ts.map +1 -0
  230. package/dist/runtime/context-dispatcher.js +11 -0
  231. package/dist/runtime/context-dispatcher.js.map +1 -0
  232. package/dist/runtime/row-dispatcher.d.ts +19 -0
  233. package/dist/runtime/row-dispatcher.d.ts.map +1 -0
  234. package/dist/runtime/row-dispatcher.js +25 -0
  235. package/dist/runtime/row-dispatcher.js.map +1 -0
  236. package/dist/types.d.ts +10 -0
  237. package/dist/types.d.ts.map +1 -0
  238. package/dist/types.js +2 -0
  239. package/dist/types.js.map +1 -0
  240. package/dist/use-device-context.d.ts +8 -0
  241. package/dist/use-device-context.d.ts.map +1 -0
  242. package/dist/use-device-context.js +54 -0
  243. package/dist/use-device-context.js.map +1 -0
  244. 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":"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"}
@@ -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