slexkit 0.3.1 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,24 @@
2
2
 
3
3
  All notable changes to SlexKit.
4
4
 
5
+ ## v0.3.3 - Obsidian input control hardening
6
+
7
+ ### Fixed
8
+ - Slider now renders its visual track outside the native range input while keeping the native input for interaction and accessibility, avoiding square thumb artifacts in Obsidian and other host themes.
9
+ - Input fields with trailing units now reset host input chrome with scoped selectors so unit add-ons stay aligned with the text field in Obsidian dark themes.
10
+
11
+ ## v0.3.2 - Host CSS isolation and repeated layout hardening
12
+
13
+ ### Changed
14
+ - `$for` rendering now uses comment anchors and direct child insertion instead of a wrapper element that depended on `display: contents`.
15
+ - Site-only mobile navigation CSS moved out of the runtime base stylesheet and into the documentation site shell.
16
+ - Component accessors now share one reactive effect across subscribers instead of creating duplicate subscriber fan-out work.
17
+
18
+ ### Fixed
19
+ - Obsidian and other Markdown hosts no longer need to rewrite `$for` wrapper CSS to avoid `display: contents`, preserving grid and row layouts for repeated items.
20
+ - Published runtime base CSS no longer leaks `#mobileNav` or `body[data-mobile-nav-open]` selectors into host pages.
21
+ - Custom renderers that return no element no longer leave invalid `$for` slots behind during diffing or cleanup.
22
+
5
23
  ## v0.3.1 - Host stability and control rendering hardening
6
24
 
7
25
  ### Added
package/README.md CHANGED
@@ -15,7 +15,7 @@
15
15
  <a href="README.zh-CN.md">简体中文</a>
16
16
  </p>
17
17
  <p>
18
- <img alt="version" src="https://img.shields.io/badge/version-0.3.1-18181b">
18
+ <img alt="version" src="https://img.shields.io/badge/version-0.3.3-18181b">
19
19
  <img alt="script" src="https://img.shields.io/badge/Slex-v0.1-18181b">
20
20
  <img alt="TypeScript" src="https://img.shields.io/badge/runtime-TypeScript-3178c6">
21
21
  <img alt="Svelte 5" src="https://img.shields.io/badge/components-Svelte_5-ff3e00">
package/README.zh-CN.md CHANGED
@@ -15,7 +15,7 @@
15
15
  <a href="README.md">English</a>
16
16
  </p>
17
17
  <p>
18
- <img alt="version" src="https://img.shields.io/badge/version-0.3.1-18181b">
18
+ <img alt="version" src="https://img.shields.io/badge/version-0.3.3-18181b">
19
19
  <img alt="script" src="https://img.shields.io/badge/Slex-v0.1-18181b">
20
20
  <img alt="TypeScript" src="https://img.shields.io/badge/runtime-TypeScript-3178c6">
21
21
  <img alt="Svelte 5" src="https://img.shields.io/badge/components-Svelte_5-ff3e00">
@@ -1,6 +1,6 @@
1
1
  # SlexKit Full LLM Documentation
2
2
 
3
- Version: 0.3.1
3
+ Version: 0.3.3
4
4
 
5
5
  This file concatenates SlexKit's canonical English Markdown docs. `slex` fences are preserved exactly.
6
6
 
@@ -27,7 +27,7 @@ Source: README.md
27
27
  <a href="README.zh-CN.md">简体中文</a>
28
28
  </p>
29
29
  <p>
30
- <img alt="version" src="https://img.shields.io/badge/version-0.3.1-18181b">
30
+ <img alt="version" src="https://img.shields.io/badge/version-0.3.3-18181b">
31
31
  <img alt="script" src="https://img.shields.io/badge/Slex-v0.1-18181b">
32
32
  <img alt="TypeScript" src="https://img.shields.io/badge/runtime-TypeScript-3178c6">
33
33
  <img alt="Svelte 5" src="https://img.shields.io/badge/components-Svelte_5-ff3e00">
@@ -1416,12 +1416,12 @@ Source: content/examples/multi-input-coordination/zh-CN.md
1416
1416
  "grid:params": {
1417
1417
  columns: 1, mdColumns: 2,
1418
1418
  "column:w": {
1419
- "input:width": { label: "宽度", "$value": "g.width", type: "number", unit: "px", onchange: "g.width = Number($event || 0)" },
1420
- "slider:width": { label: "宽度", "$value": "g.width", min: 20, max: 300, step: 5, unit: "px", onchange: "g.width = Number($event)" }
1419
+ "input:widthInput": { label: "宽度", "$value": "g.width", type: "number", unit: "px", onchange: "g.width = Number($event || 0)" },
1420
+ "slider:widthSlider": { label: "宽度", "$value": "g.width", min: 20, max: 300, step: 5, unit: "px", onchange: "g.width = Number($event)" }
1421
1421
  },
1422
1422
  "column:h": {
1423
- "input:height": { label: "高度", "$value": "g.height", type: "number", unit: "px", onchange: "g.height = Number($event || 0)" },
1424
- "slider:height": { label: "高度", "$value": "g.height", min: 20, max: 300, step: 5, unit: "px", onchange: "g.height = Number($event)" }
1423
+ "input:heightInput": { label: "高度", "$value": "g.height", type: "number", unit: "px", onchange: "g.height = Number($event || 0)" },
1424
+ "slider:heightSlider": { label: "高度", "$value": "g.height", min: 20, max: 300, step: 5, unit: "px", onchange: "g.height = Number($event)" }
1425
1425
  }
1426
1426
  },
1427
1427
  "grid:results": {
@@ -1556,8 +1556,8 @@ Source: content/examples/salary-calculator/zh-CN.md
1556
1556
  "grid:params": {
1557
1557
  columns: 1, mdColumns: 2,
1558
1558
  "column:baseField": {
1559
- "input:base": { label: "税前工资", "$value": "g.base", type: "number", unit: "元/月", onchange: "g.base = Number($event || 0)" },
1560
- "slider:base": { label: "税前工资", "$value": "g.base", min: 3000, max: 50000, step: 500, unit: "元", onchange: "g.base = Number($event)" }
1559
+ "input:baseInput": { label: "税前工资", "$value": "g.base", type: "number", unit: "元/月", onchange: "g.base = Number($event || 0)" },
1560
+ "slider:baseSlider": { label: "税前工资", "$value": "g.base", min: 3000, max: 50000, step: 500, unit: "元", onchange: "g.base = Number($event)" }
1561
1561
  },
1562
1562
  "column:cityField": {
1563
1563
  "select:city": {
@@ -1677,12 +1677,12 @@ Source: content/examples/project-cost-estimator/zh-CN.md
1677
1677
  "grid:params": {
1678
1678
  columns: 1, mdColumns: 2,
1679
1679
  "column:period": {
1680
- "input:months": { label: "开发周期", "$value": "g.months", type: "number", unit: "个月", onchange: "g.months = Number($event || 0)" },
1681
- "slider:months": { label: "开发周期", "$value": "g.months", min: 1, max: 24, step: 1, unit: "月", onchange: "g.months = Number($event)" }
1680
+ "input:monthsInput": { label: "开发周期", "$value": "g.months", type: "number", unit: "个月", onchange: "g.months = Number($event || 0)" },
1681
+ "slider:monthsSlider": { label: "开发周期", "$value": "g.months", min: 1, max: 24, step: 1, unit: "月", onchange: "g.months = Number($event)" }
1682
1682
  },
1683
1683
  "column:salaryField": {
1684
- "input:salary": { label: "人均月薪", "$value": "g.salary", type: "number", unit: "元", onchange: "g.salary = Number($event || 0)" },
1685
- "slider:salary": { label: "人均月薪", "$value": "g.salary", min: 8000, max: 50000, step: 1000, unit: "元", onchange: "g.salary = Number($event)" }
1684
+ "input:salaryInput": { label: "人均月薪", "$value": "g.salary", type: "number", unit: "元", onchange: "g.salary = Number($event || 0)" },
1685
+ "slider:salarySlider": { label: "人均月薪", "$value": "g.salary", min: 8000, max: 50000, step: 1000, unit: "元", onchange: "g.salary = Number($event)" }
1686
1686
  }
1687
1687
  },
1688
1688
  "grid:results": {
@@ -1780,13 +1780,13 @@ Source: content/examples/voltage-divider/zh-CN.md
1780
1780
  title: "分压器计算器",
1781
1781
  "grid:params": {
1782
1782
  columns: 1, mdColumns: 2,
1783
- "column:r1Field": { "input:r1": { label: "R1", "$value": "g.r1", type: "number", unit: "Ω", onchange: "g.r1 = Number($event || 0)" }, "slider:r1": { label: "R1", "$value": "g.r1", min: 100, max: 1000000, step: 100, unit: "Ω", onchange: "g.r1 = Number($event)" } },
1784
- "column:r2Field": { "input:r2": { label: "R2", "$value": "g.r2", type: "number", unit: "Ω", onchange: "g.r2 = Number($event || 0)" }, "slider:r2": { label: "R2", "$value": "g.r2", min: 100, max: 1000000, step: 100, unit: "Ω", onchange: "g.r2 = Number($event)" } }
1783
+ "column:r1Field": { "input:r1Input": { label: "R1", "$value": "std.units.si(g.r1, 'Ω', 1)", type: "engineering", unit: "Ω", placeholder: "10kΩ", onchange: "if ($event.valid && $event.number > 0) g.r1 = $event.number" }, "slider:r1Slider": { label: "R1", "$value": "g.r1", min: 100, max: 1000000, step: 100, unit: "Ω", onchange: "g.r1 = Number($event)" } },
1784
+ "column:r2Field": { "input:r2Input": { label: "R2", "$value": "std.units.si(g.r2, 'Ω', 1)", type: "engineering", unit: "Ω", placeholder: "10kΩ", onchange: "if ($event.valid && $event.number > 0) g.r2 = $event.number" }, "slider:r2Slider": { label: "R2", "$value": "g.r2", min: 100, max: 1000000, step: 100, unit: "Ω", onchange: "g.r2 = Number($event)" } }
1785
1785
  },
1786
1786
  "grid:params2": {
1787
1787
  columns: 1, mdColumns: 2,
1788
- "column:vinField": { "input:vin": { label: "输入电压 Vin", "$value": "g.vin", type: "number", unit: "V", onchange: "g.vin = Number($event || 0)" }, "slider:vin": { label: "Vin", "$value": "g.vin", min: 0.1, max: 48, step: 0.1, unit: "V", onchange: "g.vin = Number($event)" } },
1789
- "column:rlField": { "input:rl": { label: "负载电阻 RL", "$value": "g.rl", type: "number", unit: "Ω", onchange: "g.rl = Number($event || 0)" }, "slider:rl": { label: "RL", "$value": "g.rl", min: 1000, max: 10000000, step: 1000, unit: "Ω", onchange: "g.rl = Number($event)" } }
1788
+ "column:vinField": { "input:vinInput": { label: "输入电压 Vin", "$value": "std.units.si(g.vin, 'V', 1)", type: "engineering", unit: "V", placeholder: "5V", onchange: "if ($event.valid && $event.number > 0) g.vin = $event.number" }, "slider:vinSlider": { label: "Vin", "$value": "g.vin", min: 0.1, max: 48, step: 0.1, unit: "V", onchange: "g.vin = Number($event)" } },
1789
+ "column:rlField": { "input:rlInput": { label: "负载电阻 RL", "$value": "std.units.si(g.rl, 'Ω', 1)", type: "engineering", unit: "Ω", placeholder: "100kΩ", onchange: "if ($event.valid && $event.number > 0) g.rl = $event.number" }, "slider:rlSlider": { label: "RL", "$value": "g.rl", min: 1000, max: 10000000, step: 1000, unit: "Ω", onchange: "g.rl = Number($event)" } }
1790
1790
  },
1791
1791
  "formula:eq1": { "$tex": "'V_{out} = ' + g.vin.toFixed(1) + ' \\\\times \\\\frac{' + (g.r2/1000).toFixed(1) + '\\\\text{k}}{' + (g.r1/1000).toFixed(1) + '\\\\text{k} + ' + (g.r2/1000).toFixed(1) + '\\\\text{k}} = ' + g.vout().toFixed(3) + '\\\\text{ V}'" },
1792
1792
  "grid:results": {
@@ -1862,9 +1862,9 @@ $$|H(f)| = \frac{1}{\sqrt{1 + (f/f_c)^2}}$$
1862
1862
  title: "参数输入",
1863
1863
  "grid:inputs": {
1864
1864
  columns: 1, mdColumns: 2,
1865
- "column:rField": { "input:r": { label: "电阻 R", "$value": "g.r", type: "number", unit: "Ω", onchange: "g.r = Number($event || 0)" }, "slider:r": { label: "R", "$value": "g.r", min: 100, max: 100000, step: 100, unit: "Ω", onchange: "g.r = Number($event)" } },
1866
- "column:cField": { "input:c": { label: "电容 C", "$value": "g.c", type: "number", unit: "nF", onchange: "g.c = Number($event || 0)" }, "slider:c": { label: "C", "$value": "g.c", min: 1, max: 1000, step: 1, unit: "nF", onchange: "g.c = Number($event)" } },
1867
- "column:fField": { "input:f": { label: "输入频率 f", "$value": "g.f", type: "number", unit: "Hz", onchange: "g.f = Number($event || 0)" }, "slider:f": { label: "f", "$value": "g.f", min: 1, max: 100000, step: 1, unit: "Hz", onchange: "g.f = Number($event)" } }
1865
+ "column:rField": { "input:rInput": { label: "电阻 R", "$value": "std.units.si(g.r, 'Ω', 1)", type: "engineering", unit: "Ω", placeholder: "10kΩ", onchange: "if ($event.valid && $event.number > 0) g.r = $event.number" }, "slider:rSlider": { label: "R", "$value": "g.r", min: 100, max: 100000, step: 100, unit: "Ω", onchange: "g.r = Number($event)" } },
1866
+ "column:cField": { "input:cInput": { label: "电容 C", "$value": "g.c + 'nF'", type: "engineering", unit: "nF", placeholder: "100nF", onchange: "if ($event.valid && $event.number > 0) g.c = $event.unit ? $event.number * 1e9 : $event.number" }, "slider:cSlider": { label: "C", "$value": "g.c", min: 1, max: 1000, step: 1, unit: "nF", onchange: "g.c = Number($event)" } },
1867
+ "column:fField": { "input:fInput": { label: "输入频率 f", "$value": "std.units.si(g.f, 'Hz', 1)", type: "engineering", unit: "Hz", placeholder: "1kHz", onchange: "if ($event.valid && $event.number >= 0) g.f = $event.number" }, "slider:fSlider": { label: "f", "$value": "g.f", min: 1, max: 100000, step: 1, unit: "Hz", onchange: "g.f = Number($event)" } }
1868
1868
  },
1869
1869
  "stat:fc": { label: "截止频率", "$value": "g.cutoff().toFixed(1)", unit: "Hz" },
1870
1870
  "badge:regime": { "$label": "g.regimeLabel()", "$tone": "g.f < g.cutoff() * 0.1 ? 'success' : g.f > g.cutoff() * 10 ? 'danger' : 'warning'" }
@@ -2422,7 +2422,7 @@ URL: /zh-CN/examples/toolhost-demo
2422
2422
  Raw Markdown: /zh-CN/examples/toolhost-demo.md
2423
2423
  Source: content/examples/toolhost-demo/zh-CN.md
2424
2424
 
2425
- ## ToolHost 对话演示
2425
+ # ToolHost 对话演示
2426
2426
 
2427
2427
  AI 对话中需要收集用户信息时,会调用 **ToolHost** 弹出交互式表单卡片。用户填写并提交后,表单数据以结构化的 `ToolResult` 返回给 AI,AI 继续处理。
2428
2428
 
@@ -7574,6 +7574,24 @@ slexkitRenderMode: component
7574
7574
 
7575
7575
  All notable changes to SlexKit.
7576
7576
 
7577
+ ## v0.3.3 - Obsidian input control hardening
7578
+
7579
+ ### Fixed
7580
+ - Slider now renders its visual track outside the native range input while keeping the native input for interaction and accessibility, avoiding square thumb artifacts in Obsidian and other host themes.
7581
+ - Input fields with trailing units now reset host input chrome with scoped selectors so unit add-ons stay aligned with the text field in Obsidian dark themes.
7582
+
7583
+ ## v0.3.2 - Host CSS isolation and repeated layout hardening
7584
+
7585
+ ### Changed
7586
+ - `$for` rendering now uses comment anchors and direct child insertion instead of a wrapper element that depended on `display: contents`.
7587
+ - Site-only mobile navigation CSS moved out of the runtime base stylesheet and into the documentation site shell.
7588
+ - Component accessors now share one reactive effect across subscribers instead of creating duplicate subscriber fan-out work.
7589
+
7590
+ ### Fixed
7591
+ - Obsidian and other Markdown hosts no longer need to rewrite `$for` wrapper CSS to avoid `display: contents`, preserving grid and row layouts for repeated items.
7592
+ - Published runtime base CSS no longer leaks `#mobileNav` or `body[data-mobile-nav-open]` selectors into host pages.
7593
+ - Custom renderers that return no element no longer leave invalid `$for` slots behind during diffing or cleanup.
7594
+
7577
7595
  ## v0.3.1 - Host stability and control rendering hardening
7578
7596
 
7579
7597
  ### Added
@@ -7599,14 +7617,19 @@ All notable changes to SlexKit.
7599
7617
  - English translations for all 17 example pages
7600
7618
  - `toolhost-demo`: real `renderToolCall` API with chat-style conversation UI
7601
7619
  - Example rendering infrastructure: `site/routes/examples.js`, `site/pages/examples.slex.js`, `site/data/examples.js`
7620
+ - Content discovery: `site/data/content-discovery.js` with locale fallback and allowed-slug filtering
7621
+ - `site/data/content-discovery.js`: `discoverExampleMarkdown()` with per-locale discovery
7622
+ - SEO metadata for example pages
7623
+ - `examples/minimal-cdn/index.html`: zero-build CDN usage example
7602
7624
  - Formula component (`src/components/svelte/content/Formula.svelte`) with KaTeX rendering
7603
7625
  - `src/engine/capabilities.ts`: structured capability docs for AI agents
7604
- - `src/engine/validation.ts`: SPEC contract validation
7626
+ - `src/engine/validation.ts`: SPEC contract validation for component specs
7605
7627
  - `src/engine/stdlib.ts`: standard library with `math.clamp`, `math.safeDivide`, and other utilities
7606
7628
  - `src/engine/sandbox-runner.ts`: sandbox runner for secure runtime
7607
7629
  - Component state eval context shadowing test suite (`component-state-shadowing.test.ts`)
7608
7630
  - Collapsible and Callout double-rendering regression tests
7609
7631
  - Slider component name shadowing regression test
7632
+ - Tests for content, playground, select, tabs, slider, disclosure, feedback, policy-api
7610
7633
 
7611
7634
  ### Changed
7612
7635
  - Examples reduced from 64 to 17 high-quality examples, organized by user story
@@ -7616,6 +7639,7 @@ All notable changes to SlexKit.
7616
7639
  - Site UI: DocsShell, DocRail, router, shell improvements
7617
7640
  - Components: Input, Select, Tabs, Table, PlaygroundMarkdown refinements
7618
7641
  - CSS: theme-shadcn, text-input, docs-shell styling updates
7642
+ - MCP: enhanced with structured capability docs
7619
7643
 
7620
7644
  ### Fixed
7621
7645
  - Eval context shadowing: component names `g` and `api` no longer overwrite reserved context keys
@@ -7624,11 +7648,19 @@ All notable changes to SlexKit.
7624
7648
  - Salary calculator fallback numbers to match actual calculator output
7625
7649
  - Tabs-and-branching: title and length conversion mismatch
7626
7650
  - 4 pre-existing test failures (ai-docs, page-structure, theme, markdown-content)
7651
+ - Toolhost test: added setup import to fix `document is not defined`
7652
+ - Badge stretching in grid layout
7653
+ - Project-dashboard syntax error
7654
+ - Salary-calculator rate configuration
7627
7655
 
7628
7656
  ### Removed
7629
7657
  - 47 low-quality/duplicate examples (reduced from 64 to 17)
7630
7658
  - Dead "Fallback" copywriting from all example files
7659
+ - Post-slex explanatory text from example files
7631
7660
  - Unused `DialogShell.svelte` component
7661
+ - Orphaned `test-if` example directory
7662
+ - Agent-generated `docs/compose` planning files
7663
+ - Temporary `screenshot-*.png` files
7632
7664
 
7633
7665
  ## v0.2.0 - First public release
7634
7666
 
package/dist/ai/llms.txt CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
  SlexKit raw docs are Markdown (`.md`) with explicit `slex` fences. The interactive layer is the fenced `slex` source inside each Markdown page.
14
14
 
15
- Version: 0.3.1
15
+ Version: 0.3.3
16
16
 
17
17
  ## Table of Contents
18
18