@motion-proto/live-tokens 0.87.1 → 0.89.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 (28) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/package.json +1 -1
  3. package/src/demo/TestingLoops.svelte +100 -0
  4. package/src/demo/evalResults.ts +62 -0
  5. package/src/editor/component-editor/ImageEditor.svelte +25 -14
  6. package/src/editor/skill-atlas/SkillAtlas.svelte +44 -65
  7. package/src/live-tokens/data/themes/autumn.json +4 -0
  8. package/src/live-tokens/data/themes/halloween.json +4 -0
  9. package/src/live-tokens/data/themes/midnight-study.json +4 -0
  10. package/src/live-tokens/data/themes/ocean.json +4 -0
  11. package/src/live-tokens/data/themes/royal-velvet.json +4 -0
  12. package/src/live-tokens/data/themes/sketchy.json +4 -0
  13. package/src/live-tokens/data/themes/spring-meadow.json +4 -0
  14. package/src/live-tokens/data/themes/sunset.json +4 -0
  15. package/src/system/components/Image.svelte +18 -4
  16. package/src/testing-js/{chunk-FTLASW2R.js → chunk-7VSUGI2C.js} +15 -12
  17. package/src/testing-js/chunk-7VSUGI2C.js.map +1 -0
  18. package/src/testing-js/{chunk-NXRFTTVL.js → chunk-YFNMYU54.js} +2 -2
  19. package/src/testing-js/component-behavior.contract.js +1 -1
  20. package/src/testing-js/component-editor.contract.js +1 -1
  21. package/src/testing-js/component-render.contract.js +1 -1
  22. package/src/testing-js/index.js +2 -2
  23. package/src/testing-js/page-compliance.contract.js +1 -1
  24. package/src/testing-js/vitest.js +2 -2
  25. package/src/editor/skill-atlas/SkillValue.svelte +0 -202
  26. package/src/editor/skill-atlas/evalResults.ts +0 -46
  27. package/src/testing-js/chunk-FTLASW2R.js.map +0 -1
  28. /package/src/testing-js/{chunk-NXRFTTVL.js.map → chunk-YFNMYU54.js.map} +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,45 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.89.1 — Publish gate stops its dev server
4
+
5
+ ### Fixed
6
+
7
+ - **The component gate stops the dev server it starts.** It launched
8
+ `npx vite`, and stopping npx left vite running, still writing into the
9
+ gate's temp folder while cleanup removed it. Cleanup failed with ENOTEMPTY,
10
+ and 0.89.0 never reached npm. The gate now runs vite directly and waits for
11
+ it to exit.
12
+
13
+ ## 0.89.0 — Bare images
14
+
15
+ ### Added
16
+
17
+ - **`Image` takes `variant="bare"`.** A bare image shows the picture with no
18
+ border and no shadow, for art that carries its own edge: cut-out art,
19
+ screenshots with their own frame, photos that bleed into a section. It has
20
+ its own `--image-bare-*` tokens (radius, border, border width, shadow),
21
+ editable under the Bare tab in the editor. They default to no radius, a
22
+ transparent zero-width border, and no shadow. The shipped themes carry them.
23
+
24
+ ### Changed (breaking)
25
+
26
+ - **`Image`'s height prop is `size`.** `variant` now picks the frame style
27
+ (`default` or `bare`), and `size` takes the heights `variant` used to:
28
+ `default`, `banner`, `medium`, `compact`. Rewrite `<Image variant="banner">`
29
+ as `<Image size="banner">`. `check-page` reports each old use as an
30
+ `unknown-prop-value` finding.
31
+
32
+ ## 0.88.0 — Eval results on the testing page
33
+
34
+ ### Changed
35
+
36
+ - **The testing page reports the eval results.** A new Measured value
37
+ chapter tabulates the pick-component eval across four arms: with and
38
+ without the skills, and with and without the CLI. It gives the requirements
39
+ each arm got right, with its turns, time, and cost. The Skill Atlas loses
40
+ its Measured value tab, and a `#measured-value` link to the atlas now opens
41
+ the chapter.
42
+
3
43
  ## 0.87.1 — Floating parts stay above the page in sketch mode
4
44
 
5
45
  ### Fixed
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@motion-proto/live-tokens",
3
- "version": "0.87.1",
3
+ "version": "0.89.1",
4
4
  "type": "module",
5
5
  "description": "Design token editor with live CSS variable editing. Svelte 5 + Vite 8.",
6
6
  "keywords": [
@@ -1,10 +1,12 @@
1
1
  <script lang="ts">
2
+ import { onMount } from 'svelte';
2
3
  import CollapsibleSection from '../system/components/CollapsibleSection.svelte';
3
4
  import Panel from '../system/components/Panel.svelte';
4
5
  import Table from '../system/components/Table.svelte';
5
6
  import Card from '../system/components/Card.svelte';
6
7
  import { portal } from '../system/internal/portal';
7
8
  import { navigate } from '../editor/core/routing/router';
9
+ import { pickComponentEval as result } from './evalResults';
8
10
 
9
11
  let { homeHref = '/demo' }: { homeHref?: string } = $props();
10
12
 
@@ -14,6 +16,7 @@
14
16
  { id: 'test-runs', title: 'Testing pages and components' },
15
17
  { id: 'walkthrough', title: 'Build and check a page' },
16
18
  { id: 'reference', title: 'Rule reference' },
19
+ { id: 'measured-value', title: 'Measured value' },
17
20
  ];
18
21
 
19
22
  // Closed by default: open, the fixed panel covers the full-width figures.
@@ -21,6 +24,12 @@
21
24
 
22
25
  let openRules = $state<Record<string, boolean>>({});
23
26
 
27
+ // The router loads this page lazily, after the browser's own jump to a hash has passed.
28
+ onMount(() => {
29
+ const id = window.location.hash.slice(1);
30
+ if (id) document.getElementById(id)?.scrollIntoView({ block: 'start' });
31
+ });
32
+
24
33
  function jump(event: MouseEvent, id: string) {
25
34
  event.preventDefault();
26
35
  contentsOpen = false;
@@ -344,6 +353,63 @@
344
353
  </div>
345
354
  </section>
346
355
 
356
+ <section class="chapter" id="measured-value" aria-labelledby="measured-value-title">
357
+ <div class="chapter-body">
358
+ <h2 id="measured-value-title">Measured value</h2>
359
+ <p>An eval asked an agent to choose a component for {result.requirements} requirements. It ran in four arms of {result.runsPerArm} runs each: with and without the skills, and with and without the CLI. The arms chose the same components, with one miss among 144 answers, and differ in turns, time, and cost.</p>
360
+ <div class="eval-results">
361
+ <Table>
362
+ <table aria-label="Eval arms">
363
+ <thead>
364
+ <tr>
365
+ <th scope="col">Skills</th>
366
+ <th scope="col">CLI</th>
367
+ <th scope="col">Requirements right</th>
368
+ <th scope="col">Turns</th>
369
+ <th scope="col">Seconds</th>
370
+ <th scope="col">Cost</th>
371
+ </tr>
372
+ </thead>
373
+ <tbody>
374
+ {#each result.arms as arm (`${arm.skills}-${arm.cli}`)}
375
+ <tr>
376
+ <td>{arm.skills ? 'Yes' : 'No'}</td>
377
+ <td>{arm.cli ? 'Yes' : 'No'}</td>
378
+ <td>{arm.rowsRight}</td>
379
+ <td>{arm.turns}</td>
380
+ <td>{arm.seconds}</td>
381
+ <td>{arm.cost}</td>
382
+ </tr>
383
+ {/each}
384
+ </tbody>
385
+ </table>
386
+ </Table>
387
+ </div>
388
+ <ul class="eval-summary">
389
+ <li><strong>Turns:</strong> the skill saves turns only through the CLI command. Without the CLI, the skill arm takes as many turns as the agent with neither.</li>
390
+ <li><strong>Time and cost:</strong> the skills and the CLI each save time on their own, and together the run costs less than half as much as with neither.</li>
391
+ <li><strong>Accuracy:</strong> every arm scores about the same. The choices come from the entries in the component files.</li>
392
+ <li><strong>Change since 2026-09-20:</strong> in that run, no agent without the skills found the CLI; this time 2 of 3 did, so that arm varies from run to run.</li>
393
+ </ul>
394
+ <div class="text-columns">
395
+ <div>
396
+ <h3>Method</h3>
397
+ <ul>
398
+ <li>Cases <code>{result.cases[0]}</code> and <code>{result.cases[1]}</code>, run on {result.date} at package {result.packageVersion}.</li>
399
+ <li>Ten requirements with one right component, and two that nothing shipped fits.</li>
400
+ <li>The second case seeds the same project without the package’s <code>bin</code> folder, so the command the skill names fails. The skills are unchanged.</li>
401
+ <li>The runner adds the arm without skills to each case.</li>
402
+ <li>Each requirement has its own pattern grader, so a failure names its row.</li>
403
+ </ul>
404
+ </div>
405
+ <div>
406
+ <h3>Limits</h3>
407
+ <p>Three runs per arm is a small sample. The twelve requirements each have a clear answer in the entries. A harder case, where two components both fit, has not been measured.</p>
408
+ </div>
409
+ </div>
410
+ </div>
411
+ </section>
412
+
347
413
  <!-- NOTES, open questions for this page:
348
414
  - "Review by eye" (walkthrough step 7) and Figure 2's "Read the page yourself".
349
415
  Leaning toward removing both. The create-page skill says "Open the page at
@@ -438,6 +504,11 @@
438
504
  grid-column: 2 / -2;
439
505
  }
440
506
 
507
+ .chapter-body > .eval-results {
508
+ grid-column: 2 / -2;
509
+ margin-block: var(--space-12) var(--space-40);
510
+ }
511
+
441
512
  .chapter-body > .reference-groups {
442
513
  grid-column: 2 / 11;
443
514
  }
@@ -475,6 +546,35 @@
475
546
  margin: var(--space-0) var(--space-0) var(--space-24);
476
547
  }
477
548
 
549
+ .text-columns h3 {
550
+ font-family: var(--heading-sm-font-family);
551
+ font-size: var(--heading-sm-font-size);
552
+ font-weight: var(--heading-sm-font-weight);
553
+ line-height: var(--heading-sm-line-height);
554
+ letter-spacing: var(--heading-sm-letter-spacing);
555
+ margin: var(--space-0) var(--space-0) var(--space-12);
556
+ }
557
+
558
+ .eval-summary {
559
+ margin: var(--space-0) var(--space-0) var(--space-40);
560
+ padding-left: var(--space-24);
561
+ color: var(--text-secondary);
562
+ }
563
+
564
+ .eval-summary li + li {
565
+ margin-top: var(--space-12);
566
+ }
567
+
568
+ .text-columns ul {
569
+ margin: var(--space-0);
570
+ padding-left: var(--space-24);
571
+ color: var(--text-secondary);
572
+ }
573
+
574
+ .text-columns li + li {
575
+ margin-top: var(--space-8);
576
+ }
577
+
478
578
  p,
479
579
  li,
480
580
  figcaption {
@@ -0,0 +1,62 @@
1
+ /** One arm of an eval: the same case run with or without the skills, and with or without the CLI. */
2
+ export interface EvalArm {
3
+ skills: boolean;
4
+ cli: boolean;
5
+ rowsRight: string;
6
+ turns: string;
7
+ seconds: string;
8
+ cost: string;
9
+ }
10
+
11
+ export interface EvalResult {
12
+ cases: string[];
13
+ date: string;
14
+ packageVersion: string;
15
+ runsPerArm: number;
16
+ requirements: number;
17
+ arms: EvalArm[];
18
+ }
19
+
20
+ // Recorded by hand from `npm run eval` in the live-tokens repository. The
21
+ // evals do not ship, so the page cannot read a result file at runtime.
22
+ export const pickComponentEval: EvalResult = {
23
+ cases: ['outcome-pick-component', 'outcome-pick-component-no-cli'],
24
+ date: '2026-09-22',
25
+ packageVersion: '0.87.1',
26
+ runsPerArm: 3,
27
+ requirements: 12,
28
+ arms: [
29
+ {
30
+ skills: true,
31
+ cli: true,
32
+ rowsRight: '12 of 12 in all 3 runs',
33
+ turns: '9 to 10',
34
+ seconds: '46 to 76',
35
+ cost: '$0.41 to $0.46',
36
+ },
37
+ {
38
+ skills: false,
39
+ cli: true,
40
+ rowsRight: '12 of 12 in all 3 runs; 2 of 3 found the CLI on their own',
41
+ turns: '15 to 17',
42
+ seconds: '65 to 102',
43
+ cost: '$0.63 to $0.74',
44
+ },
45
+ {
46
+ skills: true,
47
+ cli: false,
48
+ rowsRight: '12 of 12 in all 3 runs',
49
+ turns: '14 to 20',
50
+ seconds: '66 to 84',
51
+ cost: '$0.73 to $0.91',
52
+ },
53
+ {
54
+ skills: false,
55
+ cli: false,
56
+ rowsRight: '11 of 12 in one run, which missed requirement 12',
57
+ turns: '17 to 20',
58
+ seconds: '113 to 169',
59
+ cost: '$1.02 to $1.14',
60
+ },
61
+ ],
62
+ };
@@ -3,18 +3,25 @@
3
3
 
4
4
  export const component = 'image';
5
5
 
6
- // Single object: image frame.
7
- const states: Record<string, Token[]> = {
8
- image: [
9
- { label: 'border color', groupKey: 'border', variable: '--image-default-border' },
10
- { label: 'border width', groupKey: 'width', variable: '--image-default-border-width' },
11
- { label: 'corner radius', groupKey: 'radius', variable: '--image-default-radius' },
12
- { label: 'image shadow', groupKey: 'shadow', variable: '--image-default-shadow' },
13
- { label: 'zoom amount', groupKey: 'scale', variable: '--image-zoom-scale' },
14
- ],
15
- };
6
+ const variants = ['default', 'bare'] as const;
7
+ type Variant = typeof variants[number];
16
8
 
17
- export const allTokens: Token[] = Object.values(states).flat();
9
+ function frameTokens(v: Variant): Token[] {
10
+ return [
11
+ { label: 'border color', groupKey: 'border', variable: `--image-${v}-border` },
12
+ { label: 'border width', groupKey: 'width', variable: `--image-${v}-border-width` },
13
+ { label: 'corner radius', groupKey: 'radius', variable: `--image-${v}-radius` },
14
+ { label: 'image shadow', groupKey: 'shadow', variable: `--image-${v}-shadow` },
15
+ ];
16
+ }
17
+ const zoomScale: Token = { label: 'zoom amount', groupKey: 'scale', variable: '--image-zoom-scale' };
18
+ function variantStates(v: Variant): Record<string, Token[]> {
19
+ return { [v]: v === 'default' ? [...frameTokens(v), zoomScale] : frameTokens(v) };
20
+ }
21
+
22
+ export const allTokens: Token[] = variants.flatMap((v) => Object.values(variantStates(v)).flat());
23
+
24
+ const variantOptions = variants.map((v) => ({ value: v, label: v.charAt(0).toUpperCase() + v.slice(1) }));
18
25
 
19
26
  // Global zoom defaults. `none` = off; `scale(...)` = on. `--image-zoom-enabled` scales the
20
27
  // content within the masked frame (overflow scaling); `--image-grow-enabled` scales the whole
@@ -42,6 +49,7 @@
42
49
  import Image from '../../system/components/Image.svelte';
43
50
  import VariantGroup from './scaffolding/VariantGroup.svelte';
44
51
  import ComponentEditorBase from './scaffolding/ComponentEditorBase.svelte';
52
+ import { buildSiblings } from './scaffolding/siblings';
45
53
  import demoImageUrl from '../../system/assets/offering.webp';
46
54
  import { editorState, setComponentAlias } from '../core/store/editorStore';
47
55
 
@@ -66,8 +74,8 @@
66
74
  const setOverflowScaling = (checked: boolean) => applyZoom(useZoom, checked);
67
75
  </script>
68
76
 
69
- <ComponentEditorBase {component} title="Image" description="Framed image with rounded corners, border, and shadow." tokens={allTokens}>
70
- <VariantGroup name="image" title="Image" {states} {component}>
77
+ <ComponentEditorBase {component} title="Image" description="Picture in the page flow. Default frames it with rounded corners, a border, and a shadow. Bare shows the picture alone." tokens={allTokens} variants={variantOptions}>
78
+ <VariantGroup name="default" title="Default" states={variantStates('default')} {component} siblings={buildSiblings(variants, 'default', variantStates)}>
71
79
  {#snippet stateActions()}
72
80
  <label class="zoom-enable">
73
81
  <input type="checkbox" checked={useZoom} onchange={(e) => setUseZoom(e.currentTarget.checked)} />
@@ -78,7 +86,7 @@
78
86
  <span>Overflow scaling (mask zoom to frame)</span>
79
87
  </label>
80
88
  {/snippet}
81
- <Image src={demoImageUrl} alt="Demo" variant="banner" zoom={useZoom ? undefined : false} {overflowScaling} forceHover={useZoom} />
89
+ <Image src={demoImageUrl} alt="Demo" size="banner" zoom={useZoom ? undefined : false} {overflowScaling} forceHover={useZoom} />
82
90
  <p class="zoom-help">
83
91
  Use zoom on hover: every image scales on hover (a page can still force it per image with the
84
92
  <code>zoom</code> prop). Overflow scaling on (default): the content zooms inside the fixed frame,
@@ -86,6 +94,9 @@
86
94
  <code>overflowScaling</code>.
87
95
  </p>
88
96
  </VariantGroup>
97
+ <VariantGroup name="bare" title="Bare" states={variantStates('bare')} {component} siblings={buildSiblings(variants, 'bare', variantStates)}>
98
+ <Image src={demoImageUrl} alt="Demo" variant="bare" size="banner" />
99
+ </VariantGroup>
89
100
  </ComponentEditorBase>
90
101
 
91
102
  <style>
@@ -1,9 +1,8 @@
1
1
  <script lang="ts">
2
2
  import { onMount, tick } from 'svelte';
3
- import { navigate } from '../core/routing/router';
3
+ import { navigate, route } from '../core/routing/router';
4
4
  import Button from '../../system/components/Button.svelte';
5
5
  import TabBar from '../../system/components/TabBar.svelte';
6
- import SkillValue from './SkillValue.svelte';
7
6
  import SourcePane from './SourcePane.svelte';
8
7
  import TreeCanvas from './TreeCanvas.svelte';
9
8
  import { linkHash, linkTargets, resolveLink } from './atlasLink';
@@ -13,35 +12,23 @@
13
12
 
14
13
  // `#set-type` opens that skill and `#set-type/write-the-font-pairing/voice`
15
14
  // also selects that block, so a link can hand someone one step of one tree.
16
- const VALUE_TAB = 'measured-value';
17
15
  const firstSkill = Object.keys(skillTrees)[0];
18
16
 
19
- function isValueHash(hash: string) {
20
- return hash === `#${VALUE_TAB}`;
21
- }
22
-
23
17
  const linked = resolveLink(window.location.hash, skillTrees);
24
- let active = $state(
25
- isValueHash(window.location.hash) ? VALUE_TAB : (linked?.skill ?? firstSkill),
26
- );
18
+ let active = $state(linked?.skill ?? firstSkill);
27
19
  let selection: Selection | null = $state(linked?.target ?? null);
28
20
  /** Which of the skill's documents the source pane shows. */
29
21
  let doc: string = $state(SKILL_DOC);
30
22
 
31
- // The value tab has no tree; the panes it hides keep reading a real skill.
32
- let skill = $derived(active === VALUE_TAB ? firstSkill : active);
33
- let tree = $derived(skillTrees[skill]);
34
- let docs = $derived(skillDocs[skill]);
23
+ let tree = $derived(skillTrees[active]);
24
+ let docs = $derived(skillDocs[active]);
35
25
  let lines = $derived(docs[doc] ?? docs[SKILL_DOC]);
36
26
  let siblings = $derived(Object.keys(docs).filter((name) => name !== SKILL_DOC));
37
27
 
38
- let tabs = $derived([
39
- ...Object.entries(skillTrees).map(([id, t]) => ({
40
- id,
41
- label: `${t.title}\n${skillDocs[id][SKILL_DOC].length} lines`,
42
- })),
43
- { id: VALUE_TAB, label: 'Measured value\n1 eval' },
44
- ]);
28
+ const tabs = Object.entries(skillTrees).map(([id, t]) => ({
29
+ id,
30
+ label: `${t.title}\n${skillDocs[id][SKILL_DOC].length} lines`,
31
+ }));
45
32
 
46
33
  let docTabs = $derived(
47
34
  Object.keys(docs).map((name) => ({
@@ -65,10 +52,6 @@
65
52
  }
66
53
 
67
54
  function shareSelection() {
68
- if (active === VALUE_TAB) {
69
- history.replaceState(null, '', `${window.location.pathname}#${VALUE_TAB}`);
70
- return;
71
- }
72
55
  const target = linkTargets(tree).find((t) => t.key === selection?.key) ?? null;
73
56
  history.replaceState(null, '', `${window.location.pathname}${linkHash(active, target)}`);
74
57
  }
@@ -111,10 +94,10 @@
111
94
  }
112
95
 
113
96
  function openLink(hash: string) {
114
- if (isValueHash(hash)) {
115
- active = VALUE_TAB;
116
- selection = null;
117
- doc = SKILL_DOC;
97
+ // The eval report moved to the testing page; replace, so Back skips the old link.
98
+ if (hash === '#measured-value') {
99
+ history.replaceState(null, '', '/testing-loops#measured-value');
100
+ route.set('/testing-loops');
118
101
  return;
119
102
  }
120
103
  const link = resolveLink(hash, skillTrees);
@@ -157,42 +140,38 @@
157
140
  <TabBar {tabs} value={active} onchange={changeTab} />
158
141
  </div>
159
142
 
160
- {#if active === VALUE_TAB}
161
- <SkillValue />
162
- {:else}
163
- <div class="split">
164
- <section class="pane" aria-label="{tree.id} decision tree">
165
- <div class="pane-head">
166
- <span class="pane-title">{tree.id}</span>
167
- <span class="pane-note">{tree.nodes.length} steps</span>
168
- </div>
169
- <div class="pane-body" bind:this={treePane}>
170
- <h2 class="tagline">{tree.tagline}</h2>
171
-
172
- <TreeCanvas {tree} selected={selection?.key ?? null} onselect={selectTarget} onopen={openDoc} />
173
- </div>
174
- </section>
175
-
176
- <section class="pane pane-source" aria-label="{tree.id} source">
177
- <div class="pane-head">
178
- <span class="pane-title">{tree.id}/{doc}</span>
179
- <span class="pane-note">{lines.length} lines</span>
180
- </div>
181
- <div class="doc-tabs">
182
- <TabBar tabs={docTabs} value={doc} onchange={openDoc} />
183
- </div>
184
- <div class="pane-body" bind:this={sourcePane}>
185
- <SourcePane
186
- {lines}
187
- {siblings}
188
- highlight={doc === SKILL_DOC ? (selection?.lines ?? null) : null}
189
- onpick={selectFromLine}
190
- onopen={openDoc}
191
- />
192
- </div>
193
- </section>
194
- </div>
195
- {/if}
143
+ <div class="split">
144
+ <section class="pane" aria-label="{tree.id} decision tree">
145
+ <div class="pane-head">
146
+ <span class="pane-title">{tree.id}</span>
147
+ <span class="pane-note">{tree.nodes.length} steps</span>
148
+ </div>
149
+ <div class="pane-body" bind:this={treePane}>
150
+ <h2 class="tagline">{tree.tagline}</h2>
151
+
152
+ <TreeCanvas {tree} selected={selection?.key ?? null} onselect={selectTarget} onopen={openDoc} />
153
+ </div>
154
+ </section>
155
+
156
+ <section class="pane pane-source" aria-label="{tree.id} source">
157
+ <div class="pane-head">
158
+ <span class="pane-title">{tree.id}/{doc}</span>
159
+ <span class="pane-note">{lines.length} lines</span>
160
+ </div>
161
+ <div class="doc-tabs">
162
+ <TabBar tabs={docTabs} value={doc} onchange={openDoc} />
163
+ </div>
164
+ <div class="pane-body" bind:this={sourcePane}>
165
+ <SourcePane
166
+ {lines}
167
+ {siblings}
168
+ highlight={doc === SKILL_DOC ? (selection?.lines ?? null) : null}
169
+ onpick={selectFromLine}
170
+ onopen={openDoc}
171
+ />
172
+ </div>
173
+ </section>
174
+ </div>
196
175
  </div>
197
176
 
198
177
  <style>
@@ -3128,6 +3128,10 @@
3128
3128
  "--image-default-border": "--border-neutral",
3129
3129
  "--image-default-border-width": "--border-width-1",
3130
3130
  "--image-default-shadow": "--shadow-md",
3131
+ "--image-bare-radius": "--radius-none",
3132
+ "--image-bare-border": "--color-transparent",
3133
+ "--image-bare-border-width": "--border-width-0",
3134
+ "--image-bare-shadow": "--shadow-none",
3131
3135
  "--image-zoom-scale": "--scale-sm"
3132
3136
  }
3133
3137
  },
@@ -3167,6 +3167,10 @@
3167
3167
  "--image-default-border": "--border-neutral",
3168
3168
  "--image-default-border-width": "--border-width-3",
3169
3169
  "--image-default-shadow": "--shadow-md",
3170
+ "--image-bare-radius": "--radius-none",
3171
+ "--image-bare-border": "--color-transparent",
3172
+ "--image-bare-border-width": "--border-width-0",
3173
+ "--image-bare-shadow": "--shadow-none",
3170
3174
  "--image-zoom-scale": "--scale-sm"
3171
3175
  }
3172
3176
  },
@@ -3185,6 +3185,10 @@
3185
3185
  "--image-default-border": "--border-neutral",
3186
3186
  "--image-default-border-width": "--border-width-1",
3187
3187
  "--image-default-shadow": "--shadow-md",
3188
+ "--image-bare-radius": "--radius-none",
3189
+ "--image-bare-border": "--color-transparent",
3190
+ "--image-bare-border-width": "--border-width-0",
3191
+ "--image-bare-shadow": "--shadow-none",
3188
3192
  "--image-zoom-scale": "--scale-sm"
3189
3193
  }
3190
3194
  },
@@ -3127,6 +3127,10 @@
3127
3127
  "--image-default-border": "--border-neutral",
3128
3128
  "--image-default-border-width": "--border-width-1",
3129
3129
  "--image-default-shadow": "--shadow-md",
3130
+ "--image-bare-radius": "--radius-none",
3131
+ "--image-bare-border": "--color-transparent",
3132
+ "--image-bare-border-width": "--border-width-0",
3133
+ "--image-bare-shadow": "--shadow-none",
3130
3134
  "--image-zoom-scale": "--scale-sm"
3131
3135
  }
3132
3136
  },
@@ -3158,6 +3158,10 @@
3158
3158
  "--image-default-border": "--border-neutral",
3159
3159
  "--image-default-border-width": "--border-width-2",
3160
3160
  "--image-default-shadow": "--shadow-md",
3161
+ "--image-bare-radius": "--radius-none",
3162
+ "--image-bare-border": "--color-transparent",
3163
+ "--image-bare-border-width": "--border-width-0",
3164
+ "--image-bare-shadow": "--shadow-none",
3161
3165
  "--image-zoom-scale": "--scale-sm"
3162
3166
  }
3163
3167
  },
@@ -3141,6 +3141,10 @@
3141
3141
  "--image-default-border": "--border-neutral",
3142
3142
  "--image-default-border-width": "--border-width-1",
3143
3143
  "--image-default-shadow": "--shadow-md",
3144
+ "--image-bare-radius": "--radius-none",
3145
+ "--image-bare-border": "--color-transparent",
3146
+ "--image-bare-border-width": "--border-width-0",
3147
+ "--image-bare-shadow": "--shadow-none",
3144
3148
  "--image-zoom-scale": "--scale-sm"
3145
3149
  }
3146
3150
  },
@@ -3114,6 +3114,10 @@
3114
3114
  "--image-default-border": "--border-neutral",
3115
3115
  "--image-default-border-width": "--border-width-1",
3116
3116
  "--image-default-shadow": "--shadow-md",
3117
+ "--image-bare-radius": "--radius-none",
3118
+ "--image-bare-border": "--color-transparent",
3119
+ "--image-bare-border-width": "--border-width-0",
3120
+ "--image-bare-shadow": "--shadow-none",
3117
3121
  "--image-zoom-scale": "--scale-sm"
3118
3122
  }
3119
3123
  },
@@ -3166,6 +3166,10 @@
3166
3166
  "--image-default-border": "--border-neutral",
3167
3167
  "--image-default-border-width": "--border-width-1",
3168
3168
  "--image-default-shadow": "--shadow-md",
3169
+ "--image-bare-radius": "--radius-none",
3170
+ "--image-bare-border": "--color-transparent",
3171
+ "--image-bare-border-width": "--border-width-0",
3172
+ "--image-bare-shadow": "--shadow-none",
3169
3173
  "--image-zoom-scale": "--scale-sm"
3170
3174
  }
3171
3175
  },