@stephen-netu/design-system 0.2.2 → 0.5.1

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 (229) hide show
  1. package/dist/d0-data-viz/BarChart.test.js +53 -0
  2. package/dist/d0-data-viz/CheckpointBar.test.js +83 -0
  3. package/dist/d0-data-viz/CheckpointPill.svelte +1 -1
  4. package/dist/d0-data-viz/CheckpointPill.test.js +78 -0
  5. package/dist/d0-data-viz/ConnectionHealth.test.js +70 -0
  6. package/dist/d0-data-viz/MetricCard.test.js +57 -0
  7. package/dist/d0-data-viz/SparkLine.test.js +47 -0
  8. package/dist/d0-data-viz/StorageMap.test.js +63 -0
  9. package/dist/d0-data-viz/Timeline.test.js +62 -0
  10. package/dist/d0-data-viz/WorldLineTimeline.test.js +99 -0
  11. package/dist/d0-data-viz/checkpoint-types.js +1 -1
  12. package/dist/d0-data-viz/storage-map-types.d.ts.map +1 -1
  13. package/dist/d0-data-viz/storage-map-types.js +6 -3
  14. package/dist/d0-data-viz/theme-integration.js +1 -1
  15. package/dist/demos/AmbientPrimitivesDemo.svelte +103 -0
  16. package/dist/demos/AmbientPrimitivesDemo.svelte.d.ts +5 -0
  17. package/dist/demos/AmbientPrimitivesDemo.svelte.d.ts.map +1 -0
  18. package/dist/demos/NodepadBlocksShowcase.svelte +2 -1
  19. package/dist/demos/NodepadBlocksShowcase.svelte.d.ts.map +1 -1
  20. package/dist/demos/index.d.ts +1 -0
  21. package/dist/demos/index.d.ts.map +1 -1
  22. package/dist/demos/index.js +1 -0
  23. package/dist/editor/CodeEditor.svelte +83 -26
  24. package/dist/editor/CodeEditor.svelte.d.ts +0 -1
  25. package/dist/editor/CodeEditor.svelte.d.ts.map +1 -1
  26. package/dist/editor/ExternalChangeDialog.svelte +117 -0
  27. package/dist/editor/ExternalChangeDialog.svelte.d.ts +13 -0
  28. package/dist/editor/ExternalChangeDialog.svelte.d.ts.map +1 -0
  29. package/dist/editor/MarkdownEditor.svelte +104 -617
  30. package/dist/editor/MarkdownEditor.svelte.d.ts +1 -1
  31. package/dist/editor/MarkdownEditor.svelte.d.ts.map +1 -1
  32. package/dist/editor/codemirror-config.d.ts +36 -0
  33. package/dist/editor/codemirror-config.d.ts.map +1 -0
  34. package/dist/editor/codemirror-config.js +87 -0
  35. package/dist/editor/components/CorrectionTooltip.svelte +180 -159
  36. package/dist/editor/components/CorrectionTooltip.svelte.d.ts +7 -23
  37. package/dist/editor/components/CorrectionTooltip.svelte.d.ts.map +1 -1
  38. package/dist/editor/extensions/autocomplete.d.ts +2 -2
  39. package/dist/editor/extensions/autocomplete.d.ts.map +1 -1
  40. package/dist/editor/extensions/autocomplete.test.js +121 -0
  41. package/dist/editor/extensions/spellcheck.d.ts +21 -3
  42. package/dist/editor/extensions/spellcheck.d.ts.map +1 -1
  43. package/dist/editor/extensions/spellcheck.js +51 -9
  44. package/dist/editor/extensions/spellcheck.test.js +168 -0
  45. package/dist/editor/extensions/types.d.ts +2 -1
  46. package/dist/editor/extensions/types.d.ts.map +1 -1
  47. package/dist/editor/index.d.ts +2 -1
  48. package/dist/editor/index.d.ts.map +1 -1
  49. package/dist/editor/index.js +1 -0
  50. package/dist/editor/markdown-preview.d.ts +9 -0
  51. package/dist/editor/markdown-preview.d.ts.map +1 -0
  52. package/dist/editor/markdown-preview.js +19 -0
  53. package/dist/editor/markdown-preview.test.js +38 -0
  54. package/dist/editor/useCodeMirror.d.ts +23 -0
  55. package/dist/editor/useCodeMirror.d.ts.map +1 -0
  56. package/dist/editor/useCodeMirror.js +40 -0
  57. package/dist/editor/useFilePersistence.d.ts +32 -0
  58. package/dist/editor/useFilePersistence.d.ts.map +1 -0
  59. package/dist/editor/useFilePersistence.js +117 -0
  60. package/dist/fabric/ai/ChatPanel.svelte +61 -62
  61. package/dist/fabric/ai/ChatPanel.svelte.d.ts.map +1 -1
  62. package/dist/fabric/ai/ResearchPanel.svelte +31 -24
  63. package/dist/fabric/data/FileTree.svelte +195 -0
  64. package/dist/fabric/data/FileTree.svelte.d.ts +19 -0
  65. package/dist/fabric/data/FileTree.svelte.d.ts.map +1 -0
  66. package/dist/fabric/data/FileTree.test.js +127 -0
  67. package/dist/fabric/data/index.d.ts +5 -9
  68. package/dist/fabric/data/index.d.ts.map +1 -1
  69. package/dist/fabric/data/index.js +4 -1
  70. package/dist/fabric/index.d.ts +1 -0
  71. package/dist/fabric/index.d.ts.map +1 -1
  72. package/dist/fabric/index.js +2 -0
  73. package/dist/fabric/input/KeyboardShortcuts.svelte +23 -21
  74. package/dist/fabric/layout/CollapsiblePanel.svelte +8 -10
  75. package/dist/fabric/navigation/ActivityRail.svelte +3 -5
  76. package/dist/fabric/navigation/ActivityRail.svelte.d.ts.map +1 -1
  77. package/dist/g0-generative/components/Text.svelte +38 -0
  78. package/dist/g0-generative/components/Text.svelte.d.ts +9 -0
  79. package/dist/g0-generative/components/Text.svelte.d.ts.map +1 -0
  80. package/dist/g0-generative/index.d.ts +1 -0
  81. package/dist/g0-generative/index.d.ts.map +1 -1
  82. package/dist/g0-generative/index.js +1 -0
  83. package/dist/g0-generative/library/ComponentLibrary.d.ts +4 -0
  84. package/dist/g0-generative/library/ComponentLibrary.d.ts.map +1 -1
  85. package/dist/g0-generative/library/ComponentLibrary.js +10 -0
  86. package/dist/g0-generative/library/ComponentLibrary.test.js +135 -0
  87. package/dist/g0-generative/renderer/OpenUIRenderer.svelte +16 -56
  88. package/dist/g0-generative/renderer/OpenUIRenderer.svelte.d.ts.map +1 -1
  89. package/dist/g0-generative/renderer/OpenUIRenderer.test.js +143 -0
  90. package/dist/g0-geo/SovereignMap.svelte +13 -13
  91. package/dist/g0-geo/SovereignMap.svelte.d.ts.map +1 -1
  92. package/dist/index.d.ts +0 -1
  93. package/dist/index.d.ts.map +1 -1
  94. package/dist/index.js +3 -1
  95. package/dist/l0-layout/block-writer/BlockContent.svelte +23 -22
  96. package/dist/l0-layout/block-writer/BlockContent.svelte.d.ts.map +1 -1
  97. package/dist/l0-layout/block-writer/BlockContent.test.js +47 -0
  98. package/dist/l0-layout/block-writer/markdown.js +11 -11
  99. package/dist/l0-layout/block-writer/markdown.test.js +81 -0
  100. package/dist/l0-layout/card/StackedCard.svelte +87 -0
  101. package/dist/l0-layout/card/StackedCard.svelte.d.ts +9 -0
  102. package/dist/l0-layout/card/StackedCard.svelte.d.ts.map +1 -0
  103. package/dist/l0-layout/card/StackedCard.test.js +29 -0
  104. package/dist/l0-layout/index.d.ts +1 -0
  105. package/dist/l0-layout/index.d.ts.map +1 -1
  106. package/dist/l0-layout/index.js +1 -0
  107. package/dist/l0-layout/kanban/KanbanBoard.svelte +1 -1
  108. package/dist/l0-layout/kanban/KanbanColumn.svelte +1 -1
  109. package/dist/n1-flow-canvas/FlowCanvas.svelte +50 -6
  110. package/dist/n1-flow-canvas/FlowCanvas.svelte.d.ts.map +1 -1
  111. package/dist/n1-flow-canvas/index.d.ts +2 -0
  112. package/dist/n1-flow-canvas/index.d.ts.map +1 -1
  113. package/dist/n1-flow-canvas/index.js +1 -0
  114. package/dist/n1-flow-canvas/pipeline-adapter.d.ts +37 -0
  115. package/dist/n1-flow-canvas/pipeline-adapter.d.ts.map +1 -0
  116. package/dist/n1-flow-canvas/pipeline-adapter.js +160 -0
  117. package/dist/n2-manifold-disk/ManifoldDisk.svelte +62 -35
  118. package/dist/n2-manifold-disk/ManifoldDisk.svelte.d.ts.map +1 -1
  119. package/dist/n4-adaptive-manifold/AdaptiveManifold.svelte +23 -19
  120. package/dist/n4-adaptive-manifold/AdaptiveManifold.svelte.d.ts.map +1 -1
  121. package/dist/n4-adaptive-manifold/types.d.ts +3 -0
  122. package/dist/n4-adaptive-manifold/types.d.ts.map +1 -1
  123. package/dist/p0-primitives/ThemeProvider.svelte +28 -7
  124. package/dist/p0-primitives/ThemeProvider.svelte.d.ts +5 -0
  125. package/dist/p0-primitives/ThemeProvider.svelte.d.ts.map +1 -1
  126. package/dist/p0-primitives/canvas-theme.d.ts +21 -1
  127. package/dist/p0-primitives/canvas-theme.d.ts.map +1 -1
  128. package/dist/p0-primitives/canvas-theme.js +78 -23
  129. package/dist/p0-primitives/debug.d.ts +6 -0
  130. package/dist/p0-primitives/debug.d.ts.map +1 -0
  131. package/dist/p0-primitives/debug.js +21 -0
  132. package/dist/p0-primitives/theme.d.ts.map +1 -1
  133. package/dist/p0-primitives/theme.js +11 -31
  134. package/dist/p0-primitives/tokens/ambient.css +76 -0
  135. package/dist/p0-primitives/tokens/tokens.css +124 -29
  136. package/dist/p0-primitives/utils/index.d.ts +2 -0
  137. package/dist/p0-primitives/utils/index.d.ts.map +1 -1
  138. package/dist/p0-primitives/utils/index.js +1 -0
  139. package/dist/p0-primitives/utils/reveal.d.ts +15 -0
  140. package/dist/p0-primitives/utils/reveal.d.ts.map +1 -0
  141. package/dist/p0-primitives/utils/reveal.js +29 -0
  142. package/dist/p0-primitives/utils/reveal.test.js +95 -0
  143. package/dist/s0-state/SyncStatus.svelte +1 -1
  144. package/dist/s0-state/index.d.ts +2 -1
  145. package/dist/s0-state/index.d.ts.map +1 -1
  146. package/dist/s0-state/index.js +2 -0
  147. package/dist/s0-state/modal-stack-store.svelte.d.ts +3 -3
  148. package/dist/s0-state/modal-stack-store.svelte.js +2 -2
  149. package/dist/spatial/ForceSimulation.svelte.js +1 -1
  150. package/dist/spatial/ParticleAssembleMark.svelte +285 -0
  151. package/dist/spatial/ParticleAssembleMark.svelte.d.ts +24 -0
  152. package/dist/spatial/ParticleAssembleMark.svelte.d.ts.map +1 -0
  153. package/dist/spatial/ZoneTiler.test.js +90 -0
  154. package/dist/spatial/index.js +1 -0
  155. package/dist/spatial/particle-assemble-math.d.ts +22 -0
  156. package/dist/spatial/particle-assemble-math.d.ts.map +1 -0
  157. package/dist/spatial/particle-assemble-math.js +26 -0
  158. package/dist/spatial/particle-assemble-math.test.js +56 -0
  159. package/dist/t0-transport/substrate.svelte.d.ts.map +1 -1
  160. package/dist/t0-transport/substrate.svelte.js +10 -4
  161. package/dist/u0-primitives/LockIndicator.svelte +16 -14
  162. package/dist/u0-primitives/VerticalToolbar.svelte +24 -21
  163. package/dist/u0-primitives/accordion/Accordion.svelte +8 -7
  164. package/dist/u0-primitives/animated-icon/AnimatedIcon.svelte +3 -3
  165. package/dist/u0-primitives/animated-icon/AnimatedIcon.test.js +82 -0
  166. package/dist/u0-primitives/avatar/Avatar.svelte +14 -14
  167. package/dist/u0-primitives/avatar/Avatar.test.js +81 -0
  168. package/dist/u0-primitives/badge/Badge.svelte +6 -4
  169. package/dist/u0-primitives/badge/ValidityBadge.svelte +4 -27
  170. package/dist/u0-primitives/button/Button.svelte +15 -12
  171. package/dist/u0-primitives/card/Card.svelte +37 -15
  172. package/dist/u0-primitives/card/Card.test.js +86 -0
  173. package/dist/u0-primitives/command-palette/CommandPalette.svelte +48 -43
  174. package/dist/u0-primitives/command-palette/CommandPalette.test.js +202 -0
  175. package/dist/u0-primitives/dropdown/Dropdown.svelte +20 -25
  176. package/dist/u0-primitives/grant-badge/GrantStatusBadge.svelte +2 -2
  177. package/dist/u0-primitives/index.d.ts +6 -0
  178. package/dist/u0-primitives/index.d.ts.map +1 -1
  179. package/dist/u0-primitives/index.js +8 -0
  180. package/dist/u0-primitives/input/Input.svelte +77 -24
  181. package/dist/u0-primitives/input/Input.svelte.d.ts +2 -10
  182. package/dist/u0-primitives/input/Input.svelte.d.ts.map +1 -1
  183. package/dist/u0-primitives/input/Input.test.js +81 -1
  184. package/dist/u0-primitives/live-dot/LiveDot.svelte +56 -0
  185. package/dist/u0-primitives/live-dot/LiveDot.svelte.d.ts +11 -0
  186. package/dist/u0-primitives/live-dot/LiveDot.svelte.d.ts.map +1 -0
  187. package/dist/u0-primitives/live-dot/LiveDot.test.js +41 -0
  188. package/dist/u0-primitives/live-dot/index.d.ts +3 -0
  189. package/dist/u0-primitives/live-dot/index.d.ts.map +1 -0
  190. package/dist/u0-primitives/live-dot/index.js +1 -0
  191. package/dist/u0-primitives/modal/Modal.svelte +22 -19
  192. package/dist/u0-primitives/modal/Modal.test.js +1 -1
  193. package/dist/u0-primitives/spinner/Spinner.svelte +11 -79
  194. package/dist/u0-primitives/spinner/Spinner.svelte.d.ts.map +1 -1
  195. package/dist/u0-primitives/steps/Steps.svelte +18 -19
  196. package/dist/u0-primitives/surface-state/SurfaceState.svelte +7 -7
  197. package/dist/u0-primitives/tabs/Tabs.svelte +13 -11
  198. package/dist/u0-primitives/theme-swatch-group/ThemeSwatchGroup.svelte +94 -0
  199. package/dist/u0-primitives/theme-swatch-group/ThemeSwatchGroup.svelte.d.ts +16 -0
  200. package/dist/u0-primitives/theme-swatch-group/ThemeSwatchGroup.svelte.d.ts.map +1 -0
  201. package/dist/u0-primitives/theme-swatch-group/ThemeSwatchGroup.test.js +48 -0
  202. package/dist/u0-primitives/theme-swatch-group/index.d.ts +3 -0
  203. package/dist/u0-primitives/theme-swatch-group/index.d.ts.map +1 -0
  204. package/dist/u0-primitives/theme-swatch-group/index.js +1 -0
  205. package/dist/u0-primitives/toggle/Toggle.svelte +10 -11
  206. package/dist/u0-primitives/tooltip/Tooltip.svelte +9 -9
  207. package/dist/u0-primitives/web-components/button-component.d.ts +5 -1
  208. package/dist/u0-primitives/web-components/button-component.d.ts.map +1 -1
  209. package/dist/u0-primitives/web-components/button-component.js +72 -33
  210. package/dist/u0-primitives/web-components/index.d.ts +3 -0
  211. package/dist/u0-primitives/web-components/index.d.ts.map +1 -0
  212. package/dist/u0-primitives/web-components/index.js +2 -0
  213. package/dist/u0-primitives/web-components/input-component.d.ts +5 -1
  214. package/dist/u0-primitives/web-components/input-component.d.ts.map +1 -1
  215. package/dist/u0-primitives/web-components/input-component.js +56 -39
  216. package/dist/u0-primitives/web-components/web-components.test.js +96 -0
  217. package/dist/u0-primitives/window-frame/WindowFrame.svelte +87 -0
  218. package/dist/u0-primitives/window-frame/WindowFrame.svelte.d.ts +10 -0
  219. package/dist/u0-primitives/window-frame/WindowFrame.svelte.d.ts.map +1 -0
  220. package/dist/u0-primitives/window-frame/WindowFrame.test.js +31 -0
  221. package/dist/u0-primitives/window-frame/index.d.ts +3 -0
  222. package/dist/u0-primitives/window-frame/index.d.ts.map +1 -0
  223. package/dist/u0-primitives/window-frame/index.js +1 -0
  224. package/dist/x0-enchanted-blocks/components/NodepadBlock.svelte +11 -2
  225. package/dist/x0-enchanted-blocks/components/NodepadBlock.svelte.d.ts.map +1 -1
  226. package/package.json +44 -28
  227. package/src/p0-primitives/tokens/ambient.css +76 -0
  228. package/src/p0-primitives/tokens/tokens.css +124 -29
  229. package/src/p0-primitives/tokens/tokens.json +42 -24
@@ -1,12 +1,16 @@
1
+ import type { Props as ButtonProps } from '../button/Button.svelte';
1
2
  declare class KosButton extends HTMLElement {
2
3
  static observedAttributes: string[];
3
4
  private svelteRoot;
5
+ private svelteComponent;
4
6
  constructor();
5
7
  connectedCallback(): void;
6
8
  disconnectedCallback(): void;
7
9
  attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
8
- getComponentProps(): Record<string, unknown>;
10
+ getComponentProps(): ButtonProps;
9
11
  render(): void;
12
+ destroy(): void;
13
+ private ensureHostStyle;
10
14
  }
11
15
  export { KosButton };
12
16
  export default KosButton;
@@ -1 +1 @@
1
- {"version":3,"file":"button-component.d.ts","sourceRoot":"","sources":["../../../src/u0-primitives/web-components/button-component.ts"],"names":[],"mappings":"AAWA,cAAM,SAAU,SAAQ,WAAW;IACjC,MAAM,CAAC,kBAAkB,WAMvB;IAEF,OAAO,CAAC,UAAU,CAA4B;;IAO9C,iBAAiB;IAIjB,oBAAoB;IAOpB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAMvF,iBAAiB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAwB5C,MAAM;CA4BP;AAMD,OAAO,EAAE,SAAS,EAAE,CAAC;AACrB,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"button-component.d.ts","sourceRoot":"","sources":["../../../src/u0-primitives/web-components/button-component.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAWpE,cAAM,SAAU,SAAQ,WAAW;IACjC,MAAM,CAAC,kBAAkB,WAUvB;IAEF,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,eAAe,CAAwC;;IAO/D,iBAAiB;IAIjB,oBAAoB;IAIpB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAMvF,iBAAiB,IAAI,WAAW;IAyChC,MAAM;IAaN,OAAO;IAWP,OAAO,CAAC,eAAe;CAYxB;AAuBD,OAAO,EAAE,SAAS,EAAE,CAAC;AACrB,eAAe,SAAS,CAAC"}
@@ -1,22 +1,22 @@
1
- /**
2
- * KosButton Web Component
3
- *
4
- * Web Component wrapper for the KosButton Svelte component.
5
- * Enables usage of KosButton in vanilla JS, React, or other frameworks.
6
- *
7
- * @package @kos/design-system/u0-primitives
8
- */
9
- import { mount } from 'svelte';
1
+ import { createRawSnippet, mount, unmount } from 'svelte';
10
2
  import Button from '../button/Button.svelte';
3
+ const variants = ['primary', 'secondary', 'ghost', 'danger'];
4
+ const sizes = ['sm', 'md', 'lg'];
5
+ const types = ['button', 'submit', 'reset'];
11
6
  class KosButton extends HTMLElement {
12
7
  static observedAttributes = [
13
8
  'disabled',
14
9
  'loading',
15
10
  'variant',
16
11
  'size',
12
+ 'type',
13
+ 'class',
14
+ 'aria-label',
15
+ 'aria-expanded',
17
16
  'children'
18
17
  ];
19
18
  svelteRoot = null;
19
+ svelteComponent = null;
20
20
  constructor() {
21
21
  super();
22
22
  this.attachShadow({ mode: 'open' });
@@ -25,10 +25,7 @@ class KosButton extends HTMLElement {
25
25
  this.render();
26
26
  }
27
27
  disconnectedCallback() {
28
- if (this.svelteRoot) {
29
- this.svelteRoot.innerHTML = '';
30
- this.svelteRoot = null;
31
- }
28
+ this.destroy();
32
29
  }
33
30
  attributeChangedCallback(name, oldValue, newValue) {
34
31
  if (oldValue !== newValue) {
@@ -37,48 +34,90 @@ class KosButton extends HTMLElement {
37
34
  }
38
35
  getComponentProps() {
39
36
  const props = {};
37
+ const variant = this.getAttribute('variant');
38
+ const size = this.getAttribute('size');
39
+ const type = this.getAttribute('type');
40
+ const className = this.getAttribute('class');
41
+ const ariaLabel = this.getAttribute('aria-label');
42
+ const ariaExpanded = this.getAttribute('aria-expanded');
43
+ const children = this.getAttribute('children');
40
44
  if (this.hasAttribute('disabled')) {
41
45
  props.disabled = true;
42
46
  }
43
47
  if (this.hasAttribute('loading')) {
44
48
  props.loading = true;
45
49
  }
46
- if (this.hasAttribute('variant')) {
47
- props.variant = this.getAttribute('variant') ?? 'primary';
50
+ if (variant) {
51
+ props.variant = readOption(variant, variants, 'primary');
52
+ }
53
+ if (size) {
54
+ props.size = readOption(size, sizes, 'md');
55
+ }
56
+ if (type) {
57
+ props.type = readOption(type, types, 'button');
48
58
  }
49
- if (this.hasAttribute('size')) {
50
- props.size = this.getAttribute('size') ?? 'md';
59
+ if (className) {
60
+ props.class = className;
51
61
  }
52
- if (this.hasAttribute('children')) {
53
- props.children = this.getAttribute('children');
62
+ if (ariaLabel) {
63
+ props['aria-label'] = ariaLabel;
64
+ }
65
+ if (ariaExpanded !== null) {
66
+ props['aria-expanded'] = ariaExpanded !== 'false';
67
+ }
68
+ if (children !== null) {
69
+ props.children = createTextSnippet(children);
54
70
  }
55
71
  return props;
56
72
  }
57
73
  render() {
58
74
  if (!this.shadowRoot)
59
75
  return;
60
- if (this.svelteRoot) {
61
- this.svelteRoot.innerHTML = '';
62
- }
76
+ this.destroy();
63
77
  this.svelteRoot = document.createElement('div');
64
78
  this.shadowRoot.appendChild(this.svelteRoot);
65
- mount(Button, {
79
+ this.svelteComponent = mount(Button, {
66
80
  target: this.svelteRoot,
67
81
  props: this.getComponentProps()
68
82
  });
69
- if (!this.shadowRoot.querySelector('style')) {
70
- const style = document.createElement('style');
71
- style.textContent = `
72
- :host {
73
- display: inline-block;
74
- font-family: var(--font-sans, 'Outfit', system-ui, sans-serif);
75
- }
76
- ::slotted(*) {
83
+ this.ensureHostStyle();
84
+ }
85
+ destroy() {
86
+ if (this.svelteComponent) {
87
+ void unmount(this.svelteComponent);
88
+ this.svelteComponent = null;
77
89
  }
78
- `;
79
- this.shadowRoot.appendChild(style);
90
+ if (this.svelteRoot) {
91
+ this.svelteRoot.remove();
92
+ this.svelteRoot = null;
80
93
  }
81
94
  }
95
+ ensureHostStyle() {
96
+ if (!this.shadowRoot || this.shadowRoot.querySelector('style'))
97
+ return;
98
+ const style = document.createElement('style');
99
+ style.textContent = `
100
+ :host {
101
+ display: inline-block;
102
+ font-family: var(--font-sans, 'Outfit', system-ui, sans-serif);
103
+ }
104
+ `;
105
+ this.shadowRoot.appendChild(style);
106
+ }
107
+ }
108
+ function readOption(value, options, fallback) {
109
+ return options.includes(value) ? value : fallback;
110
+ }
111
+ function createTextSnippet(value) {
112
+ return createRawSnippet(() => ({
113
+ render: () => `<span>${escapeHtml(value)}</span>`
114
+ }));
115
+ }
116
+ function escapeHtml(value) {
117
+ return value
118
+ .replace(/&/g, '&amp;')
119
+ .replace(/</g, '&lt;')
120
+ .replace(/>/g, '&gt;');
82
121
  }
83
122
  if (!customElements.get('kos-button')) {
84
123
  customElements.define('kos-button', KosButton);
@@ -0,0 +1,3 @@
1
+ export { KosButton } from './button-component';
2
+ export { KosInput } from './input-component';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/u0-primitives/web-components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { KosButton } from './button-component';
2
+ export { KosInput } from './input-component';
@@ -1,12 +1,16 @@
1
+ import type { Props as InputProps } from '../input/Input.svelte';
1
2
  declare class KosInput extends HTMLElement {
2
3
  static observedAttributes: string[];
3
4
  private svelteRoot;
5
+ private svelteComponent;
4
6
  constructor();
5
7
  connectedCallback(): void;
6
8
  disconnectedCallback(): void;
7
9
  attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
8
- getComponentProps(): Record<string, unknown>;
10
+ getComponentProps(): InputProps;
9
11
  render(): void;
12
+ destroy(): void;
13
+ private ensureHostStyle;
10
14
  }
11
15
  export { KosInput };
12
16
  export default KosInput;
@@ -1 +1 @@
1
- {"version":3,"file":"input-component.d.ts","sourceRoot":"","sources":["../../../src/u0-primitives/web-components/input-component.ts"],"names":[],"mappings":"AAWA,cAAM,QAAS,SAAQ,WAAW;IAChC,MAAM,CAAC,kBAAkB,WAOvB;IAEF,OAAO,CAAC,UAAU,CAA4B;;IAO9C,iBAAiB;IAIjB,oBAAoB;IAOpB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAMvF,iBAAiB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IA0B5C,MAAM;CA4BP;AAMD,OAAO,EAAE,QAAQ,EAAE,CAAC;AACpB,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"input-component.d.ts","sourceRoot":"","sources":["../../../src/u0-primitives/web-components/input-component.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,IAAI,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAOjE,cAAM,QAAS,SAAQ,WAAW;IAChC,MAAM,CAAC,kBAAkB,WASvB;IAEF,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,eAAe,CAAwC;;IAO/D,iBAAiB;IAIjB,oBAAoB;IAIpB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAMvF,iBAAiB,IAAI,UAAU;IAqC/B,MAAM;IAaN,OAAO;IAWP,OAAO,CAAC,eAAe;CAYxB;AAUD,OAAO,EAAE,QAAQ,EAAE,CAAC;AACpB,eAAe,QAAQ,CAAC"}
@@ -1,23 +1,19 @@
1
- /**
2
- * KosInput Web Component
3
- *
4
- * Web Component wrapper for the KosInput Svelte component.
5
- * Enables usage of KosInput in vanilla JS, React, or other frameworks.
6
- *
7
- * @package @kos/design-system/u0-primitives
8
- */
9
- import { mount } from 'svelte';
1
+ import { mount, unmount } from 'svelte';
10
2
  import Input from '../input/Input.svelte';
3
+ const types = ['text', 'search', 'password', 'email', 'url'];
11
4
  class KosInput extends HTMLElement {
12
5
  static observedAttributes = [
13
6
  'type',
14
7
  'value',
15
8
  'placeholder',
16
9
  'disabled',
17
- 'readonly',
18
- 'required'
10
+ 'error',
11
+ 'class',
12
+ 'id',
13
+ 'name'
19
14
  ];
20
15
  svelteRoot = null;
16
+ svelteComponent = null;
21
17
  constructor() {
22
18
  super();
23
19
  this.attachShadow({ mode: 'open' });
@@ -26,10 +22,7 @@ class KosInput extends HTMLElement {
26
22
  this.render();
27
23
  }
28
24
  disconnectedCallback() {
29
- if (this.svelteRoot) {
30
- this.svelteRoot.innerHTML = '';
31
- this.svelteRoot = null;
32
- }
25
+ this.destroy();
33
26
  }
34
27
  attributeChangedCallback(name, oldValue, newValue) {
35
28
  if (oldValue !== newValue) {
@@ -38,51 +31,75 @@ class KosInput extends HTMLElement {
38
31
  }
39
32
  getComponentProps() {
40
33
  const props = {};
41
- if (this.hasAttribute('type')) {
42
- props.type = this.getAttribute('type') ?? 'text';
34
+ const type = this.getAttribute('type');
35
+ const value = this.getAttribute('value');
36
+ const placeholder = this.getAttribute('placeholder');
37
+ const className = this.getAttribute('class');
38
+ const id = this.getAttribute('id');
39
+ const name = this.getAttribute('name');
40
+ if (type) {
41
+ props.type = readOption(type, types, 'text');
43
42
  }
44
- if (this.hasAttribute('value')) {
45
- props.value = this.getAttribute('value') ?? '';
43
+ if (value !== null) {
44
+ props.value = value;
46
45
  }
47
- if (this.hasAttribute('placeholder')) {
48
- props.placeholder = this.getAttribute('placeholder') ?? '';
46
+ if (placeholder !== null) {
47
+ props.placeholder = placeholder;
49
48
  }
50
49
  if (this.hasAttribute('disabled')) {
51
50
  props.disabled = true;
52
51
  }
53
- if (this.hasAttribute('readonly')) {
54
- props.readonly = true;
52
+ if (this.hasAttribute('error')) {
53
+ props.error = true;
54
+ }
55
+ if (className) {
56
+ props.class = className;
55
57
  }
56
- if (this.hasAttribute('required')) {
57
- props.required = true;
58
+ if (id) {
59
+ props.id = id;
60
+ }
61
+ if (name) {
62
+ props.name = name;
58
63
  }
59
64
  return props;
60
65
  }
61
66
  render() {
62
67
  if (!this.shadowRoot)
63
68
  return;
64
- if (this.svelteRoot) {
65
- this.svelteRoot.innerHTML = '';
66
- }
69
+ this.destroy();
67
70
  this.svelteRoot = document.createElement('div');
68
71
  this.shadowRoot.appendChild(this.svelteRoot);
69
- mount(Input, {
72
+ this.svelteComponent = mount(Input, {
70
73
  target: this.svelteRoot,
71
74
  props: this.getComponentProps()
72
75
  });
73
- if (!this.shadowRoot.querySelector('style')) {
74
- const style = document.createElement('style');
75
- style.textContent = `
76
- :host {
77
- display: block;
78
- font-family: var(--font-sans, 'Outfit', system-ui, sans-serif);
79
- }
80
- ::slotted(*) {
76
+ this.ensureHostStyle();
77
+ }
78
+ destroy() {
79
+ if (this.svelteComponent) {
80
+ void unmount(this.svelteComponent);
81
+ this.svelteComponent = null;
81
82
  }
82
- `;
83
- this.shadowRoot.appendChild(style);
83
+ if (this.svelteRoot) {
84
+ this.svelteRoot.remove();
85
+ this.svelteRoot = null;
84
86
  }
85
87
  }
88
+ ensureHostStyle() {
89
+ if (!this.shadowRoot || this.shadowRoot.querySelector('style'))
90
+ return;
91
+ const style = document.createElement('style');
92
+ style.textContent = `
93
+ :host {
94
+ display: block;
95
+ font-family: var(--font-sans, 'Outfit', system-ui, sans-serif);
96
+ }
97
+ `;
98
+ this.shadowRoot.appendChild(style);
99
+ }
100
+ }
101
+ function readOption(value, options, fallback) {
102
+ return options.includes(value) ? value : fallback;
86
103
  }
87
104
  if (!customElements.get('kos-input')) {
88
105
  customElements.define('kos-input', KosInput);
@@ -0,0 +1,96 @@
1
+ import { afterEach, describe, expect, it } from 'vitest';
2
+ import { KosButton } from './button-component';
3
+ import { KosInput } from './input-component';
4
+ describe('u0-primitives/web-components', () => {
5
+ afterEach(() => {
6
+ document.body.innerHTML = '';
7
+ });
8
+ it('defines and renders the kos-button custom element', () => {
9
+ const element = createButton({
10
+ variant: 'danger',
11
+ size: 'lg',
12
+ type: 'submit',
13
+ class: 'custom-button',
14
+ 'aria-label': 'Submit form',
15
+ 'aria-expanded': 'true',
16
+ children: 'Save'
17
+ });
18
+ const button = element.shadowRoot?.querySelector('button');
19
+ expect(customElements.get('kos-button')).toBe(KosButton);
20
+ expect(button).not.toBeNull();
21
+ expect(button?.getAttribute('type')).toBe('submit');
22
+ expect(button?.getAttribute('aria-label')).toBe('Submit form');
23
+ expect(button?.getAttribute('aria-expanded')).toBe('true');
24
+ expect(button?.classList.contains('variant-danger')).toBe(true);
25
+ expect(button?.classList.contains('size-lg')).toBe(true);
26
+ expect(button?.classList.contains('custom-button')).toBe(true);
27
+ expect(button?.textContent?.trim()).toBe('Save');
28
+ });
29
+ it('updates the kos-button when attributes change', () => {
30
+ const element = createButton();
31
+ const button = element.shadowRoot?.querySelector('button');
32
+ expect(button?.hasAttribute('disabled')).toBe(false);
33
+ element.setAttribute('loading', '');
34
+ const updatedButton = element.shadowRoot?.querySelector('button');
35
+ expect(updatedButton?.hasAttribute('disabled')).toBe(true);
36
+ expect(updatedButton?.classList.contains('is-loading')).toBe(true);
37
+ });
38
+ it('falls back to safe button defaults for invalid attributes', () => {
39
+ const element = createButton({
40
+ variant: 'invalid',
41
+ size: 'invalid',
42
+ type: 'invalid'
43
+ });
44
+ const button = element.shadowRoot?.querySelector('button');
45
+ expect(button?.classList.contains('variant-primary')).toBe(true);
46
+ expect(button?.classList.contains('size-md')).toBe(true);
47
+ expect(button?.getAttribute('type')).toBe('button');
48
+ });
49
+ it('defines and renders the kos-input custom element', () => {
50
+ const element = createInput({
51
+ type: 'search',
52
+ value: 'needle',
53
+ placeholder: 'Search',
54
+ disabled: '',
55
+ error: '',
56
+ class: 'custom-input',
57
+ id: 'search-box',
58
+ name: 'q'
59
+ });
60
+ const input = element.shadowRoot?.querySelector('input');
61
+ expect(customElements.get('kos-input')).toBe(KosInput);
62
+ expect(input).not.toBeNull();
63
+ expect(input?.getAttribute('type')).toBe('search');
64
+ expect(input.value).toBe('needle');
65
+ expect(input?.getAttribute('placeholder')).toBe('Search');
66
+ expect(input?.getAttribute('id')).toBe('search-box');
67
+ expect(input?.getAttribute('name')).toBe('q');
68
+ expect(input?.hasAttribute('disabled')).toBe(true);
69
+ expect(input?.getAttribute('aria-invalid')).toBe('true');
70
+ expect(element.shadowRoot?.querySelector('.custom-input')).not.toBeNull();
71
+ });
72
+ it('updates the kos-input when attributes change', () => {
73
+ const element = createInput({ type: 'text' });
74
+ expect(element.shadowRoot?.querySelector('input')?.getAttribute('type')).toBe('text');
75
+ element.setAttribute('type', 'password');
76
+ const input = element.shadowRoot?.querySelector('input');
77
+ expect(input?.getAttribute('type')).toBe('password');
78
+ });
79
+ it('falls back to safe input defaults for invalid attributes', () => {
80
+ const element = createInput({ type: 'tel' });
81
+ const input = element.shadowRoot?.querySelector('input');
82
+ expect(input?.getAttribute('type')).toBe('text');
83
+ });
84
+ });
85
+ function createButton(attributes = {}) {
86
+ const element = document.createElement('kos-button');
87
+ Object.entries(attributes).forEach(([name, value]) => element.setAttribute(name, value));
88
+ document.body.appendChild(element);
89
+ return element;
90
+ }
91
+ function createInput(attributes) {
92
+ const element = document.createElement('kos-input');
93
+ Object.entries(attributes).forEach(([name, value]) => element.setAttribute(name, value));
94
+ document.body.appendChild(element);
95
+ return element;
96
+ }
@@ -0,0 +1,87 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+
4
+ export interface Props {
5
+ title?: string;
6
+ class?: string;
7
+ children?: Snippet;
8
+ }
9
+
10
+ let {
11
+ title = '',
12
+ class: className = '',
13
+ children
14
+ }: Props = $props();
15
+ </script>
16
+
17
+ <div class="ds-window-frame {className}">
18
+ <div class="ds-window-frame-header">
19
+ <div class="ds-window-frame-dots">
20
+ <span class="dot dot-close"></span>
21
+ <span class="dot dot-minimize"></span>
22
+ <span class="dot dot-expand"></span>
23
+ </div>
24
+ {#if title}
25
+ <span class="ds-window-frame-title">{title}</span>
26
+ {/if}
27
+ </div>
28
+
29
+ {#if children}
30
+ <div class="ds-window-frame-body">
31
+ {@render children()}
32
+ </div>
33
+ {/if}
34
+ </div>
35
+
36
+ <style>
37
+ .ds-window-frame {
38
+ display: flex;
39
+ flex-direction: column;
40
+ border: var(--border-width-thin) solid var(--border-default);
41
+ background: var(--color-card-bg);
42
+ overflow: hidden;
43
+ }
44
+
45
+ .ds-window-frame-header {
46
+ display: flex;
47
+ align-items: center;
48
+ gap: var(--ui-pad-x);
49
+ padding: var(--ui-pad-y) var(--ui-pad-x);
50
+ background: var(--color-bg-panel);
51
+ border-bottom: var(--border-width-thin) solid var(--border-default);
52
+ }
53
+
54
+ .ds-window-frame-dots {
55
+ display: flex;
56
+ gap: 6px;
57
+ flex-shrink: 0;
58
+ }
59
+
60
+ .dot {
61
+ width: 10px;
62
+ height: 10px;
63
+ border-radius: var(--radius-full);
64
+ }
65
+
66
+ .dot-close { background: var(--color-error); }
67
+ .dot-minimize { background: var(--color-warning); }
68
+ .dot-expand { background: var(--color-success); }
69
+
70
+ .ds-window-frame-title {
71
+ margin-left: auto;
72
+ font-family: var(--font-mono);
73
+ font-size: var(--text-2xs);
74
+ letter-spacing: 0.06em;
75
+ text-transform: uppercase;
76
+ color: var(--color-text-tertiary);
77
+ white-space: nowrap;
78
+ overflow: hidden;
79
+ text-overflow: ellipsis;
80
+ }
81
+
82
+ .ds-window-frame-body {
83
+ padding: var(--ui-pad-x);
84
+ font-family: var(--font-mono);
85
+ color: var(--color-text-secondary);
86
+ }
87
+ </style>
@@ -0,0 +1,10 @@
1
+ import type { Snippet } from 'svelte';
2
+ export interface Props {
3
+ title?: string;
4
+ class?: string;
5
+ children?: Snippet;
6
+ }
7
+ declare const WindowFrame: import("svelte").Component<Props, {}, "">;
8
+ type WindowFrame = ReturnType<typeof WindowFrame>;
9
+ export default WindowFrame;
10
+ //# sourceMappingURL=WindowFrame.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WindowFrame.svelte.d.ts","sourceRoot":"","sources":["../../../src/u0-primitives/window-frame/WindowFrame.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGpC,MAAM,WAAW,KAAK;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAmCH,QAAA,MAAM,WAAW,2CAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { afterEach, describe, it, expect } from 'vitest';
2
+ import { cleanup, render } from '@testing-library/svelte';
3
+ import { createRawSnippet } from 'svelte';
4
+ import WindowFrame from './WindowFrame.svelte';
5
+ const textSnippet = (text) => createRawSnippet(() => ({ render: () => `<span>${text}</span>` }));
6
+ describe('WindowFrame', () => {
7
+ afterEach(() => cleanup());
8
+ it('renders three chrome dots', () => {
9
+ const { container } = render(WindowFrame);
10
+ expect(container.querySelectorAll('.dot')).toHaveLength(3);
11
+ });
12
+ it('renders the title when provided', () => {
13
+ const { getByText } = render(WindowFrame, { title: 'PROPERTY SEARCH' });
14
+ expect(getByText('PROPERTY SEARCH')).toBeDefined();
15
+ });
16
+ it('omits the title element when not provided', () => {
17
+ const { container } = render(WindowFrame);
18
+ expect(container.querySelector('.ds-window-frame-title')).toBeNull();
19
+ });
20
+ it('renders slotted children in the body', () => {
21
+ const { container, getByText } = render(WindowFrame, {
22
+ children: textSnippet('Body content')
23
+ });
24
+ expect(container.querySelector('.ds-window-frame-body')).not.toBeNull();
25
+ expect(getByText('Body content')).toBeDefined();
26
+ });
27
+ it('omits the body element when no children given', () => {
28
+ const { container } = render(WindowFrame);
29
+ expect(container.querySelector('.ds-window-frame-body')).toBeNull();
30
+ });
31
+ });
@@ -0,0 +1,3 @@
1
+ export { default as WindowFrame } from './WindowFrame.svelte';
2
+ export type { Props } from './WindowFrame.svelte';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/u0-primitives/window-frame/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,YAAY,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1 @@
1
+ export { default as WindowFrame } from './WindowFrame.svelte';
@@ -85,10 +85,19 @@
85
85
  }
86
86
 
87
87
  function handleKeydown(e: KeyboardEvent) {
88
- // Tab inserts spaces
88
+ // Tab inserts two spaces via Selection/Range (no deprecated execCommand)
89
89
  if (e.key === 'Tab') {
90
90
  e.preventDefault();
91
- document.execCommand('insertText', false, ' ');
91
+ const sel = window.getSelection();
92
+ if (sel && sel.rangeCount > 0) {
93
+ const range = sel.getRangeAt(0);
94
+ range.deleteContents();
95
+ range.insertNode(document.createTextNode(' '));
96
+ range.collapse(false);
97
+ sel.removeAllRanges();
98
+ sel.addRange(range);
99
+ handleInput();
100
+ }
92
101
  }
93
102
  }
94
103
  </script>
@@ -1 +1 @@
1
- {"version":3,"file":"NodepadBlock.svelte.d.ts","sourceRoot":"","sources":["../../../src/x0-enchanted-blocks/components/NodepadBlock.svelte.ts"],"names":[],"mappings":"AAUA,OAAO,EACH,KAAK,SAAS,EACd,KAAK,kBAAkB,EAIxB,MAAM,wBAAwB,CAAC;AAGhC,UAAU,KAAK;IACb,KAAK,EAAE,kBAAkB,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;CAC1C;AAqHH,QAAA,MAAM,YAAY,2CAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"NodepadBlock.svelte.d.ts","sourceRoot":"","sources":["../../../src/x0-enchanted-blocks/components/NodepadBlock.svelte.ts"],"names":[],"mappings":"AAUA,OAAO,EACH,KAAK,SAAS,EACd,KAAK,kBAAkB,EAIxB,MAAM,wBAAwB,CAAC;AAGhC,UAAU,KAAK;IACb,KAAK,EAAE,kBAAkB,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;CAC1C;AA8HH,QAAA,MAAM,YAAY,2CAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}