slexkit 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (221) hide show
  1. package/AGENTS.slexkit.md +29 -0
  2. package/CHANGELOG.md +90 -0
  3. package/LICENSE +21 -0
  4. package/README.md +165 -0
  5. package/README.zh-CN.md +165 -0
  6. package/dist/ai/llms-authoring.txt +44 -0
  7. package/dist/ai/llms-components.txt +669 -0
  8. package/dist/ai/llms-full.txt +6586 -0
  9. package/dist/ai/llms-runtime.txt +1475 -0
  10. package/dist/ai/llms-toolhost.txt +295 -0
  11. package/dist/ai/llms.txt +69 -0
  12. package/dist/ai/slexkit-ai-manifest.json +2922 -0
  13. package/dist/base.css +621 -0
  14. package/dist/chunks/accordion-5f0nvjjm.js +376 -0
  15. package/dist/chunks/accordion-830dw78f.js +221 -0
  16. package/dist/chunks/accordion-cfjyxw93.js +630 -0
  17. package/dist/chunks/accordion-cw5r75jm.js +424 -0
  18. package/dist/chunks/accordion-ehnhpeca.js +492 -0
  19. package/dist/chunks/accordion-hzyrngd6.js +2377 -0
  20. package/dist/chunks/accordion-nw12ytps.js +6823 -0
  21. package/dist/components/accordion.js +163 -0
  22. package/dist/components/badge.js +80 -0
  23. package/dist/components/button.css +114 -0
  24. package/dist/components/button.js +16 -0
  25. package/dist/components/callout.js +154 -0
  26. package/dist/components/card.js +95 -0
  27. package/dist/components/checkbox.js +114 -0
  28. package/dist/components/choice.css +165 -0
  29. package/dist/components/code-block.js +264 -0
  30. package/dist/components/collapsible.js +111 -0
  31. package/dist/components/column.js +49 -0
  32. package/dist/components/content.css +474 -0
  33. package/dist/components/disclosure.css +162 -0
  34. package/dist/components/display.css +259 -0
  35. package/dist/components/divider.js +98 -0
  36. package/dist/components/feedback.css +219 -0
  37. package/dist/components/grid.js +67 -0
  38. package/dist/components/index.js +13364 -0
  39. package/dist/components/input.css +1247 -0
  40. package/dist/components/input.js +384 -0
  41. package/dist/components/link.js +77 -0
  42. package/dist/components/progress.js +111 -0
  43. package/dist/components/radio-group.js +189 -0
  44. package/dist/components/row.js +200 -0
  45. package/dist/components/section.js +161 -0
  46. package/dist/components/select.css +260 -0
  47. package/dist/components/select.js +16 -0
  48. package/dist/components/slider.css +125 -0
  49. package/dist/components/slider.js +175 -0
  50. package/dist/components/specs.js +1090 -0
  51. package/dist/components/stat.js +178 -0
  52. package/dist/components/submit.css +9 -0
  53. package/dist/components/submit.js +77 -0
  54. package/dist/components/switch.css +114 -0
  55. package/dist/components/switch.js +114 -0
  56. package/dist/components/table.js +157 -0
  57. package/dist/components/tabs.css +192 -0
  58. package/dist/components/tabs.js +17 -0
  59. package/dist/components/text-input.css +245 -0
  60. package/dist/components/text.js +50 -0
  61. package/dist/components/toast.js +240 -0
  62. package/dist/components/tooling.css +1009 -0
  63. package/dist/components/tooling.js +48951 -0
  64. package/dist/runtime.cjs +3728 -0
  65. package/dist/runtime.js +3686 -0
  66. package/dist/slexkit.cjs +18539 -0
  67. package/dist/slexkit.css +4776 -0
  68. package/dist/slexkit.js +18497 -0
  69. package/dist/tooling.js +59141 -0
  70. package/dist/types/components/accordion.d.ts +2 -0
  71. package/dist/types/components/badge.d.ts +2 -0
  72. package/dist/types/components/button.d.ts +2 -0
  73. package/dist/types/components/callout.d.ts +2 -0
  74. package/dist/types/components/card.d.ts +2 -0
  75. package/dist/types/components/checkbox.d.ts +2 -0
  76. package/dist/types/components/code-block.d.ts +2 -0
  77. package/dist/types/components/collapsible.d.ts +2 -0
  78. package/dist/types/components/column.d.ts +2 -0
  79. package/dist/types/components/divider.d.ts +2 -0
  80. package/dist/types/components/entries/accordion.d.ts +3 -0
  81. package/dist/types/components/entries/badge.d.ts +3 -0
  82. package/dist/types/components/entries/button.d.ts +3 -0
  83. package/dist/types/components/entries/callout.d.ts +3 -0
  84. package/dist/types/components/entries/card.d.ts +3 -0
  85. package/dist/types/components/entries/checkbox.d.ts +3 -0
  86. package/dist/types/components/entries/code-block.d.ts +3 -0
  87. package/dist/types/components/entries/collapsible.d.ts +3 -0
  88. package/dist/types/components/entries/column.d.ts +3 -0
  89. package/dist/types/components/entries/divider.d.ts +3 -0
  90. package/dist/types/components/entries/grid.d.ts +3 -0
  91. package/dist/types/components/entries/input.d.ts +3 -0
  92. package/dist/types/components/entries/link.d.ts +3 -0
  93. package/dist/types/components/entries/progress.d.ts +3 -0
  94. package/dist/types/components/entries/radio-group.d.ts +3 -0
  95. package/dist/types/components/entries/row.d.ts +3 -0
  96. package/dist/types/components/entries/section.d.ts +3 -0
  97. package/dist/types/components/entries/select.d.ts +3 -0
  98. package/dist/types/components/entries/slider.d.ts +3 -0
  99. package/dist/types/components/entries/specs.d.ts +1 -0
  100. package/dist/types/components/entries/stat.d.ts +3 -0
  101. package/dist/types/components/entries/submit.d.ts +3 -0
  102. package/dist/types/components/entries/switch.d.ts +3 -0
  103. package/dist/types/components/entries/table.d.ts +3 -0
  104. package/dist/types/components/entries/tabs.d.ts +3 -0
  105. package/dist/types/components/entries/text.d.ts +3 -0
  106. package/dist/types/components/entries/toast.d.ts +3 -0
  107. package/dist/types/components/entries/tooling.d.ts +1 -0
  108. package/dist/types/components/grid.d.ts +2 -0
  109. package/dist/types/components/index.d.ts +6 -0
  110. package/dist/types/components/input.d.ts +2 -0
  111. package/dist/types/components/link.d.ts +2 -0
  112. package/dist/types/components/progress.d.ts +2 -0
  113. package/dist/types/components/radio-group.d.ts +2 -0
  114. package/dist/types/components/row.d.ts +2 -0
  115. package/dist/types/components/section.d.ts +2 -0
  116. package/dist/types/components/select.d.ts +2 -0
  117. package/dist/types/components/slider.d.ts +2 -0
  118. package/dist/types/components/spec-helpers.d.ts +23 -0
  119. package/dist/types/components/spec-registry.d.ts +12 -0
  120. package/dist/types/components/spec-schema.d.ts +74 -0
  121. package/dist/types/components/specs.d.ts +2 -0
  122. package/dist/types/components/stat.d.ts +2 -0
  123. package/dist/types/components/submit.d.ts +2 -0
  124. package/dist/types/components/svelte/adapter.d.ts +3 -0
  125. package/dist/types/components/svelte/bindProps.d.ts +2 -0
  126. package/dist/types/components/svelte/helpers.d.ts +33 -0
  127. package/dist/types/components/svelte/layout/balancedTiles.d.ts +14 -0
  128. package/dist/types/components/svelte/types.d.ts +12 -0
  129. package/dist/types/components/switch.d.ts +2 -0
  130. package/dist/types/components/table.d.ts +2 -0
  131. package/dist/types/components/tabs.d.ts +2 -0
  132. package/dist/types/components/text.d.ts +2 -0
  133. package/dist/types/components/toast.d.ts +2 -0
  134. package/dist/types/components/tooling.d.ts +2 -0
  135. package/dist/types/components-svelte.d.ts +5 -0
  136. package/dist/types/engine/component-scope.d.ts +14 -0
  137. package/dist/types/engine/component-state.d.ts +9 -0
  138. package/dist/types/engine/diagnostics.d.ts +24 -0
  139. package/dist/types/engine/engineering.d.ts +11 -0
  140. package/dist/types/engine/eval.d.ts +5 -0
  141. package/dist/types/engine/index.d.ts +26 -0
  142. package/dist/types/engine/markdown-runtime.d.ts +33 -0
  143. package/dist/types/engine/merge.d.ts +1 -0
  144. package/dist/types/engine/reactive.d.ts +11 -0
  145. package/dist/types/engine/registry.d.ts +4 -0
  146. package/dist/types/engine/renderer.d.ts +6 -0
  147. package/dist/types/engine/sandbox-runner.d.ts +2 -0
  148. package/dist/types/engine/secure-runtime.d.ts +214 -0
  149. package/dist/types/engine/store.d.ts +12 -0
  150. package/dist/types/engine/types.d.ts +58 -0
  151. package/dist/types/icons/manager.d.ts +17 -0
  152. package/dist/types/icons/phosphor.d.ts +45 -0
  153. package/dist/types/index.d.ts +61 -0
  154. package/dist/types/runtime.d.ts +32 -0
  155. package/dist/types/toolhost/index.d.ts +78 -0
  156. package/dist/types/tooling-umd.d.ts +47 -0
  157. package/dist/types/version.d.ts +8 -0
  158. package/dist/umd/slexkit.tooling.umd.js +66553 -0
  159. package/dist/umd/slexkit.umd.js +18552 -0
  160. package/package.json +136 -0
  161. package/scripts/cli.mjs +47 -0
  162. package/skills/slexkit/SKILL.md +27 -0
  163. package/skills/slexkit-author/SKILL.md +50 -0
  164. package/skills/slexkit-host-integration/SKILL.md +33 -0
  165. package/skills/slexkit-secure-runtime/SKILL.md +31 -0
  166. package/skills/slexkit-toolhost/SKILL.md +38 -0
  167. package/skills/slexkit-update/SKILL.md +23 -0
  168. package/src/components/svelte/InlineIcon.svelte +66 -0
  169. package/src/components/svelte/adapter.ts +76 -0
  170. package/src/components/svelte/bindProps.ts +9 -0
  171. package/src/components/svelte/content/Badge.svelte +19 -0
  172. package/src/components/svelte/content/Callout.svelte +57 -0
  173. package/src/components/svelte/content/CodeBlock.svelte +130 -0
  174. package/src/components/svelte/content/Divider.svelte +21 -0
  175. package/src/components/svelte/content/Link.svelte +21 -0
  176. package/src/components/svelte/content/Section.svelte +24 -0
  177. package/src/components/svelte/content/Table.svelte +44 -0
  178. package/src/components/svelte/disclosure/Accordion.svelte +100 -0
  179. package/src/components/svelte/disclosure/Collapsible.svelte +45 -0
  180. package/src/components/svelte/display/Stat.svelte +102 -0
  181. package/src/components/svelte/display/Text.svelte +11 -0
  182. package/src/components/svelte/feedback/Progress.svelte +34 -0
  183. package/src/components/svelte/feedback/Toast.svelte +105 -0
  184. package/src/components/svelte/helpers.ts +148 -0
  185. package/src/components/svelte/input/Button.svelte +78 -0
  186. package/src/components/svelte/input/Checkbox.svelte +52 -0
  187. package/src/components/svelte/input/Input.svelte +202 -0
  188. package/src/components/svelte/input/RadioGroup.svelte +71 -0
  189. package/src/components/svelte/input/Select.svelte +220 -0
  190. package/src/components/svelte/input/Slider.svelte +96 -0
  191. package/src/components/svelte/input/Submit.svelte +32 -0
  192. package/src/components/svelte/input/Switch.svelte +53 -0
  193. package/src/components/svelte/input/Tabs.svelte +188 -0
  194. package/src/components/svelte/layout/Card.svelte +17 -0
  195. package/src/components/svelte/layout/Column.svelte +15 -0
  196. package/src/components/svelte/layout/Grid.svelte +26 -0
  197. package/src/components/svelte/layout/Row.svelte +105 -0
  198. package/src/components/svelte/layout/balancedTiles.ts +85 -0
  199. package/src/components/svelte/tooling/CodeMirror.svelte +91 -0
  200. package/src/components/svelte/tooling/Playground.svelte +765 -0
  201. package/src/components/svelte/tooling/PlaygroundMarkdown.svelte +26 -0
  202. package/src/components/svelte/tooling/PlaygroundSlexCode.svelte +76 -0
  203. package/src/components/svelte/types.ts +17 -0
  204. package/src/styles/animation.css +98 -0
  205. package/src/styles/components/button.css +114 -0
  206. package/src/styles/components/choice.css +165 -0
  207. package/src/styles/components/select.css +260 -0
  208. package/src/styles/components/slider.css +125 -0
  209. package/src/styles/components/submit.css +9 -0
  210. package/src/styles/components/switch.css +114 -0
  211. package/src/styles/components/tabs.css +192 -0
  212. package/src/styles/components/text-input.css +245 -0
  213. package/src/styles/content.css +474 -0
  214. package/src/styles/disclosure.css +162 -0
  215. package/src/styles/display.css +259 -0
  216. package/src/styles/entry.css +34 -0
  217. package/src/styles/feedback.css +219 -0
  218. package/src/styles/input.css +8 -0
  219. package/src/styles/layout.css +365 -0
  220. package/src/styles/theme.css +31 -0
  221. package/src/styles/tooling.css +1009 -0
@@ -0,0 +1,105 @@
1
+ <script lang="ts">
2
+ import { bindPropStore } from "../bindProps";
3
+ import { renderChildren, text } from "../helpers";
4
+ import type { PropValues, SvelteComponentProps } from "../types";
5
+ import { chooseBalancedColumns, createBalancedTileLayout } from "./balancedTiles";
6
+
7
+ let { props, ctx }: SvelteComponentProps = $props();
8
+ let p = $state<PropValues>({});
9
+ $effect(() => bindPropStore(props, (next) => (p = next)));
10
+
11
+ type RowRenderOptions = {
12
+ disabled: boolean;
13
+ };
14
+
15
+ function tileKind(children: Element[]): "stat" | "card" | null {
16
+ if (children.length < 2) return null;
17
+ if (children.every((child) => child.classList.contains("slex-stat"))) return "stat";
18
+ if (children.every((child) => child.classList.contains("slex-card"))) return "card";
19
+ return null;
20
+ }
21
+
22
+ function numericStyle(value: string, fallback: number): number {
23
+ const n = Number.parseFloat(value);
24
+ return Number.isFinite(n) ? n : fallback;
25
+ }
26
+
27
+ function renderBalancedChildren(node: HTMLElement, options: RowRenderOptions) {
28
+ const children = renderChildren(node, ctx);
29
+ let current = options;
30
+ let pending = false;
31
+
32
+ const reset = () => {
33
+ node.classList.remove("slex-row--balanced-tiles");
34
+ node.removeAttribute("data-tile-kind");
35
+ node.style.removeProperty("--slex-balanced-cols");
36
+ node.style.removeProperty("--slex-balanced-tracks");
37
+ for (const child of Array.from(node.children)) {
38
+ if (child instanceof HTMLElement) child.style.removeProperty("grid-column");
39
+ }
40
+ };
41
+
42
+ const rebalance = () => {
43
+ pending = false;
44
+ reset();
45
+ if (current.disabled) return;
46
+
47
+ const directChildren = Array.from(node.children);
48
+ const kind = tileKind(directChildren);
49
+ if (!kind) return;
50
+
51
+ const styles = getComputedStyle(node);
52
+ const gap = numericStyle(styles.columnGap || styles.gap, 16);
53
+ const targetTileWidth = numericStyle(styles.getPropertyValue("--slex-balanced-tile-width"), 136);
54
+ const width = node.getBoundingClientRect().width || node.clientWidth;
55
+ const columns = chooseBalancedColumns({
56
+ itemCount: directChildren.length,
57
+ containerWidth: width,
58
+ targetTileWidth,
59
+ gap,
60
+ });
61
+
62
+ const layout = createBalancedTileLayout(directChildren.length, columns);
63
+ node.classList.add("slex-row--balanced-tiles");
64
+ node.dataset.tileKind = kind;
65
+ node.style.setProperty("--slex-balanced-cols", String(layout.columns));
66
+ node.style.setProperty("--slex-balanced-tracks", String(layout.tracks));
67
+ directChildren.forEach((child, index) => {
68
+ if (child instanceof HTMLElement) child.style.gridColumn = `span ${layout.spans[index]}`;
69
+ });
70
+ };
71
+
72
+ const schedule = () => {
73
+ if (pending) return;
74
+ pending = true;
75
+ queueMicrotask(rebalance);
76
+ };
77
+
78
+ const resizeObserver = new ResizeObserver(schedule);
79
+ resizeObserver.observe(node);
80
+ const mutationObserver = new MutationObserver(schedule);
81
+ mutationObserver.observe(node, { childList: true });
82
+ schedule();
83
+
84
+ return {
85
+ update(next: RowRenderOptions) {
86
+ current = next;
87
+ schedule();
88
+ },
89
+ destroy() {
90
+ resizeObserver.disconnect();
91
+ mutationObserver.disconnect();
92
+ children.destroy();
93
+ },
94
+ };
95
+ }
96
+ </script>
97
+
98
+ <div
99
+ class={`slex-row${p.class ? ` ${text(p.class)}` : ""}`}
100
+ id={p.id ? text(p.id) : undefined}
101
+ style:align-items={text(p.align)}
102
+ style:justify-content={text(p.justify)}
103
+ style:gap={text(p.gap)}
104
+ use:renderBalancedChildren={{ disabled: !!(p.align || p.justify) }}
105
+ ></div>
@@ -0,0 +1,85 @@
1
+ type BalancedColumnsInput = {
2
+ itemCount: number;
3
+ containerWidth: number;
4
+ targetTileWidth?: number;
5
+ gap?: number;
6
+ };
7
+
8
+ type BalancedTileLayout = {
9
+ columns: number;
10
+ tracks: number;
11
+ spans: number[];
12
+ };
13
+
14
+ export function chooseBalancedColumns({
15
+ itemCount,
16
+ containerWidth,
17
+ targetTileWidth = 136,
18
+ gap = 16,
19
+ }: BalancedColumnsInput): number {
20
+ if (!Number.isFinite(itemCount) || itemCount <= 1) return Math.max(1, Math.floor(itemCount || 1));
21
+
22
+ const usableWidth = Number.isFinite(containerWidth) && containerWidth > 0 ? containerWidth : Infinity;
23
+ const target = Math.max(80, targetTileWidth);
24
+ const spacing = Math.max(0, gap);
25
+ const maxFit = Number.isFinite(usableWidth)
26
+ ? Math.max(1, Math.min(itemCount, Math.floor((usableWidth + spacing) / (target + spacing))))
27
+ : itemCount;
28
+
29
+ if (maxFit >= itemCount) return itemCount;
30
+
31
+ let bestColumns = 1;
32
+ let bestScore = Number.POSITIVE_INFINITY;
33
+
34
+ for (let columns = 1; columns <= maxFit; columns += 1) {
35
+ const rows = Math.ceil(itemCount / columns);
36
+ const lastRowCount = itemCount - columns * (rows - 1);
37
+ const orphanPenalty = rows > 1 && lastRowCount === 1 ? 100 : 0;
38
+ const balancePenalty = rows > 1 ? ((columns - lastRowCount) / columns) * 10 : 0;
39
+ const rowPenalty = rows;
40
+ const widthPenalty = (maxFit - columns) * 0.05;
41
+ const score = orphanPenalty + balancePenalty + rowPenalty + widthPenalty;
42
+
43
+ if (score < bestScore) {
44
+ bestScore = score;
45
+ bestColumns = columns;
46
+ }
47
+ }
48
+
49
+ return bestColumns;
50
+ }
51
+
52
+ export function createBalancedTileLayout(itemCount: number, columns: number): BalancedTileLayout {
53
+ const count = Math.max(0, Math.floor(itemCount));
54
+ const safeColumns = Math.max(1, Math.min(count || 1, Math.floor(columns)));
55
+ const rows = Math.ceil(count / safeColumns);
56
+ const lastRowCount = count - safeColumns * (rows - 1);
57
+ const hasPartialLastRow = rows > 1 && lastRowCount > 0 && lastRowCount < safeColumns;
58
+ const tracks = hasPartialLastRow ? lcm(safeColumns, lastRowCount) : safeColumns;
59
+ const fullRowSpan = Math.max(1, tracks / safeColumns);
60
+ const lastRowSpan = hasPartialLastRow ? Math.max(1, tracks / lastRowCount) : fullRowSpan;
61
+
62
+ return {
63
+ columns: safeColumns,
64
+ tracks,
65
+ spans: Array.from({ length: count }, (_, index) => {
66
+ const isLastPartialRow = hasPartialLastRow && Math.floor(index / safeColumns) === rows - 1;
67
+ return isLastPartialRow ? lastRowSpan : fullRowSpan;
68
+ }),
69
+ };
70
+ }
71
+
72
+ function gcd(a: number, b: number): number {
73
+ let x = Math.abs(Math.floor(a));
74
+ let y = Math.abs(Math.floor(b));
75
+ while (y > 0) {
76
+ const next = x % y;
77
+ x = y;
78
+ y = next;
79
+ }
80
+ return x || 1;
81
+ }
82
+
83
+ function lcm(a: number, b: number): number {
84
+ return Math.max(1, Math.abs(Math.floor((a * b) / gcd(a, b))));
85
+ }
@@ -0,0 +1,91 @@
1
+ <script lang="ts">
2
+ import { onDestroy, onMount } from "svelte";
3
+ import { Compartment } from "@codemirror/state";
4
+ import { EditorView, type ViewUpdate } from "@codemirror/view";
5
+ import type { Extension, Transaction } from "@codemirror/state";
6
+
7
+ type Props = {
8
+ doc?: string;
9
+ extensions?: Extension;
10
+ class?: string;
11
+ onChange?: (value: string, view: EditorView, transactions: readonly Transaction[]) => void;
12
+ onEditorView?: (view: EditorView) => void;
13
+ };
14
+
15
+ let {
16
+ doc = "",
17
+ extensions = [],
18
+ class: className = "",
19
+ onChange,
20
+ onEditorView,
21
+ }: Props = $props();
22
+
23
+ let dom: HTMLDivElement;
24
+ let view: EditorView | null = null;
25
+ let lastDoc = doc;
26
+ let measureFrame = 0;
27
+ const extensionsCompartment = new Compartment();
28
+
29
+ function scheduleMeasure() {
30
+ if (!view || measureFrame) return;
31
+ measureFrame = window.requestAnimationFrame(() => {
32
+ measureFrame = 0;
33
+ view?.requestMeasure();
34
+ });
35
+ }
36
+
37
+ onMount(() => {
38
+ view = new EditorView({
39
+ doc,
40
+ parent: dom,
41
+ extensions: [
42
+ extensionsCompartment.of(extensions),
43
+ EditorView.updateListener.of((update: ViewUpdate) => {
44
+ if (!update.docChanged || !view) return;
45
+ lastDoc = update.state.doc.toString();
46
+ onChange?.(lastDoc, view, update.transactions);
47
+ }),
48
+ ],
49
+ });
50
+ onEditorView?.(view);
51
+ const resizeObserver = new ResizeObserver(scheduleMeasure);
52
+ resizeObserver.observe(dom);
53
+ scheduleMeasure();
54
+
55
+ return () => {
56
+ resizeObserver.disconnect();
57
+ if (measureFrame) {
58
+ window.cancelAnimationFrame(measureFrame);
59
+ measureFrame = 0;
60
+ }
61
+ };
62
+ });
63
+
64
+ $effect(() => {
65
+ if (!view) return;
66
+ view.dispatch({
67
+ effects: extensionsCompartment.reconfigure(extensions),
68
+ });
69
+ scheduleMeasure();
70
+ });
71
+
72
+ $effect(() => {
73
+ if (!view || doc === lastDoc) return;
74
+ lastDoc = doc;
75
+ view.dispatch({
76
+ changes: {
77
+ from: 0,
78
+ to: view.state.doc.length,
79
+ insert: doc,
80
+ },
81
+ });
82
+ scheduleMeasure();
83
+ });
84
+
85
+ onDestroy(() => {
86
+ view?.destroy();
87
+ view = null;
88
+ });
89
+ </script>
90
+
91
+ <div class={`codemirror ${className}`} bind:this={dom}></div>