@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.
- package/dist/d0-data-viz/BarChart.test.js +53 -0
- package/dist/d0-data-viz/CheckpointBar.test.js +83 -0
- package/dist/d0-data-viz/CheckpointPill.svelte +1 -1
- package/dist/d0-data-viz/CheckpointPill.test.js +78 -0
- package/dist/d0-data-viz/ConnectionHealth.test.js +70 -0
- package/dist/d0-data-viz/MetricCard.test.js +57 -0
- package/dist/d0-data-viz/SparkLine.test.js +47 -0
- package/dist/d0-data-viz/StorageMap.test.js +63 -0
- package/dist/d0-data-viz/Timeline.test.js +62 -0
- package/dist/d0-data-viz/WorldLineTimeline.test.js +99 -0
- package/dist/d0-data-viz/checkpoint-types.js +1 -1
- package/dist/d0-data-viz/storage-map-types.d.ts.map +1 -1
- package/dist/d0-data-viz/storage-map-types.js +6 -3
- package/dist/d0-data-viz/theme-integration.js +1 -1
- package/dist/demos/AmbientPrimitivesDemo.svelte +103 -0
- package/dist/demos/AmbientPrimitivesDemo.svelte.d.ts +5 -0
- package/dist/demos/AmbientPrimitivesDemo.svelte.d.ts.map +1 -0
- package/dist/demos/NodepadBlocksShowcase.svelte +2 -1
- package/dist/demos/NodepadBlocksShowcase.svelte.d.ts.map +1 -1
- package/dist/demos/index.d.ts +1 -0
- package/dist/demos/index.d.ts.map +1 -1
- package/dist/demos/index.js +1 -0
- package/dist/editor/CodeEditor.svelte +83 -26
- package/dist/editor/CodeEditor.svelte.d.ts +0 -1
- package/dist/editor/CodeEditor.svelte.d.ts.map +1 -1
- package/dist/editor/ExternalChangeDialog.svelte +117 -0
- package/dist/editor/ExternalChangeDialog.svelte.d.ts +13 -0
- package/dist/editor/ExternalChangeDialog.svelte.d.ts.map +1 -0
- package/dist/editor/MarkdownEditor.svelte +104 -617
- package/dist/editor/MarkdownEditor.svelte.d.ts +1 -1
- package/dist/editor/MarkdownEditor.svelte.d.ts.map +1 -1
- package/dist/editor/codemirror-config.d.ts +36 -0
- package/dist/editor/codemirror-config.d.ts.map +1 -0
- package/dist/editor/codemirror-config.js +87 -0
- package/dist/editor/components/CorrectionTooltip.svelte +180 -159
- package/dist/editor/components/CorrectionTooltip.svelte.d.ts +7 -23
- package/dist/editor/components/CorrectionTooltip.svelte.d.ts.map +1 -1
- package/dist/editor/extensions/autocomplete.d.ts +2 -2
- package/dist/editor/extensions/autocomplete.d.ts.map +1 -1
- package/dist/editor/extensions/autocomplete.test.js +121 -0
- package/dist/editor/extensions/spellcheck.d.ts +21 -3
- package/dist/editor/extensions/spellcheck.d.ts.map +1 -1
- package/dist/editor/extensions/spellcheck.js +51 -9
- package/dist/editor/extensions/spellcheck.test.js +168 -0
- package/dist/editor/extensions/types.d.ts +2 -1
- package/dist/editor/extensions/types.d.ts.map +1 -1
- package/dist/editor/index.d.ts +2 -1
- package/dist/editor/index.d.ts.map +1 -1
- package/dist/editor/index.js +1 -0
- package/dist/editor/markdown-preview.d.ts +9 -0
- package/dist/editor/markdown-preview.d.ts.map +1 -0
- package/dist/editor/markdown-preview.js +19 -0
- package/dist/editor/markdown-preview.test.js +38 -0
- package/dist/editor/useCodeMirror.d.ts +23 -0
- package/dist/editor/useCodeMirror.d.ts.map +1 -0
- package/dist/editor/useCodeMirror.js +40 -0
- package/dist/editor/useFilePersistence.d.ts +32 -0
- package/dist/editor/useFilePersistence.d.ts.map +1 -0
- package/dist/editor/useFilePersistence.js +117 -0
- package/dist/fabric/ai/ChatPanel.svelte +61 -62
- package/dist/fabric/ai/ChatPanel.svelte.d.ts.map +1 -1
- package/dist/fabric/ai/ResearchPanel.svelte +31 -24
- package/dist/fabric/data/FileTree.svelte +195 -0
- package/dist/fabric/data/FileTree.svelte.d.ts +19 -0
- package/dist/fabric/data/FileTree.svelte.d.ts.map +1 -0
- package/dist/fabric/data/FileTree.test.js +127 -0
- package/dist/fabric/data/index.d.ts +5 -9
- package/dist/fabric/data/index.d.ts.map +1 -1
- package/dist/fabric/data/index.js +4 -1
- package/dist/fabric/index.d.ts +1 -0
- package/dist/fabric/index.d.ts.map +1 -1
- package/dist/fabric/index.js +2 -0
- package/dist/fabric/input/KeyboardShortcuts.svelte +23 -21
- package/dist/fabric/layout/CollapsiblePanel.svelte +8 -10
- package/dist/fabric/navigation/ActivityRail.svelte +3 -5
- package/dist/fabric/navigation/ActivityRail.svelte.d.ts.map +1 -1
- package/dist/g0-generative/components/Text.svelte +38 -0
- package/dist/g0-generative/components/Text.svelte.d.ts +9 -0
- package/dist/g0-generative/components/Text.svelte.d.ts.map +1 -0
- package/dist/g0-generative/index.d.ts +1 -0
- package/dist/g0-generative/index.d.ts.map +1 -1
- package/dist/g0-generative/index.js +1 -0
- package/dist/g0-generative/library/ComponentLibrary.d.ts +4 -0
- package/dist/g0-generative/library/ComponentLibrary.d.ts.map +1 -1
- package/dist/g0-generative/library/ComponentLibrary.js +10 -0
- package/dist/g0-generative/library/ComponentLibrary.test.js +135 -0
- package/dist/g0-generative/renderer/OpenUIRenderer.svelte +16 -56
- package/dist/g0-generative/renderer/OpenUIRenderer.svelte.d.ts.map +1 -1
- package/dist/g0-generative/renderer/OpenUIRenderer.test.js +143 -0
- package/dist/g0-geo/SovereignMap.svelte +13 -13
- package/dist/g0-geo/SovereignMap.svelte.d.ts.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/l0-layout/block-writer/BlockContent.svelte +23 -22
- package/dist/l0-layout/block-writer/BlockContent.svelte.d.ts.map +1 -1
- package/dist/l0-layout/block-writer/BlockContent.test.js +47 -0
- package/dist/l0-layout/block-writer/markdown.js +11 -11
- package/dist/l0-layout/block-writer/markdown.test.js +81 -0
- package/dist/l0-layout/card/StackedCard.svelte +87 -0
- package/dist/l0-layout/card/StackedCard.svelte.d.ts +9 -0
- package/dist/l0-layout/card/StackedCard.svelte.d.ts.map +1 -0
- package/dist/l0-layout/card/StackedCard.test.js +29 -0
- package/dist/l0-layout/index.d.ts +1 -0
- package/dist/l0-layout/index.d.ts.map +1 -1
- package/dist/l0-layout/index.js +1 -0
- package/dist/l0-layout/kanban/KanbanBoard.svelte +1 -1
- package/dist/l0-layout/kanban/KanbanColumn.svelte +1 -1
- package/dist/n1-flow-canvas/FlowCanvas.svelte +50 -6
- package/dist/n1-flow-canvas/FlowCanvas.svelte.d.ts.map +1 -1
- package/dist/n1-flow-canvas/index.d.ts +2 -0
- package/dist/n1-flow-canvas/index.d.ts.map +1 -1
- package/dist/n1-flow-canvas/index.js +1 -0
- package/dist/n1-flow-canvas/pipeline-adapter.d.ts +37 -0
- package/dist/n1-flow-canvas/pipeline-adapter.d.ts.map +1 -0
- package/dist/n1-flow-canvas/pipeline-adapter.js +160 -0
- package/dist/n2-manifold-disk/ManifoldDisk.svelte +62 -35
- package/dist/n2-manifold-disk/ManifoldDisk.svelte.d.ts.map +1 -1
- package/dist/n4-adaptive-manifold/AdaptiveManifold.svelte +23 -19
- package/dist/n4-adaptive-manifold/AdaptiveManifold.svelte.d.ts.map +1 -1
- package/dist/n4-adaptive-manifold/types.d.ts +3 -0
- package/dist/n4-adaptive-manifold/types.d.ts.map +1 -1
- package/dist/p0-primitives/ThemeProvider.svelte +28 -7
- package/dist/p0-primitives/ThemeProvider.svelte.d.ts +5 -0
- package/dist/p0-primitives/ThemeProvider.svelte.d.ts.map +1 -1
- package/dist/p0-primitives/canvas-theme.d.ts +21 -1
- package/dist/p0-primitives/canvas-theme.d.ts.map +1 -1
- package/dist/p0-primitives/canvas-theme.js +78 -23
- package/dist/p0-primitives/debug.d.ts +6 -0
- package/dist/p0-primitives/debug.d.ts.map +1 -0
- package/dist/p0-primitives/debug.js +21 -0
- package/dist/p0-primitives/theme.d.ts.map +1 -1
- package/dist/p0-primitives/theme.js +11 -31
- package/dist/p0-primitives/tokens/ambient.css +76 -0
- package/dist/p0-primitives/tokens/tokens.css +124 -29
- package/dist/p0-primitives/utils/index.d.ts +2 -0
- package/dist/p0-primitives/utils/index.d.ts.map +1 -1
- package/dist/p0-primitives/utils/index.js +1 -0
- package/dist/p0-primitives/utils/reveal.d.ts +15 -0
- package/dist/p0-primitives/utils/reveal.d.ts.map +1 -0
- package/dist/p0-primitives/utils/reveal.js +29 -0
- package/dist/p0-primitives/utils/reveal.test.js +95 -0
- package/dist/s0-state/SyncStatus.svelte +1 -1
- package/dist/s0-state/index.d.ts +2 -1
- package/dist/s0-state/index.d.ts.map +1 -1
- package/dist/s0-state/index.js +2 -0
- package/dist/s0-state/modal-stack-store.svelte.d.ts +3 -3
- package/dist/s0-state/modal-stack-store.svelte.js +2 -2
- package/dist/spatial/ForceSimulation.svelte.js +1 -1
- package/dist/spatial/ParticleAssembleMark.svelte +285 -0
- package/dist/spatial/ParticleAssembleMark.svelte.d.ts +24 -0
- package/dist/spatial/ParticleAssembleMark.svelte.d.ts.map +1 -0
- package/dist/spatial/ZoneTiler.test.js +90 -0
- package/dist/spatial/index.js +1 -0
- package/dist/spatial/particle-assemble-math.d.ts +22 -0
- package/dist/spatial/particle-assemble-math.d.ts.map +1 -0
- package/dist/spatial/particle-assemble-math.js +26 -0
- package/dist/spatial/particle-assemble-math.test.js +56 -0
- package/dist/t0-transport/substrate.svelte.d.ts.map +1 -1
- package/dist/t0-transport/substrate.svelte.js +10 -4
- package/dist/u0-primitives/LockIndicator.svelte +16 -14
- package/dist/u0-primitives/VerticalToolbar.svelte +24 -21
- package/dist/u0-primitives/accordion/Accordion.svelte +8 -7
- package/dist/u0-primitives/animated-icon/AnimatedIcon.svelte +3 -3
- package/dist/u0-primitives/animated-icon/AnimatedIcon.test.js +82 -0
- package/dist/u0-primitives/avatar/Avatar.svelte +14 -14
- package/dist/u0-primitives/avatar/Avatar.test.js +81 -0
- package/dist/u0-primitives/badge/Badge.svelte +6 -4
- package/dist/u0-primitives/badge/ValidityBadge.svelte +4 -27
- package/dist/u0-primitives/button/Button.svelte +15 -12
- package/dist/u0-primitives/card/Card.svelte +37 -15
- package/dist/u0-primitives/card/Card.test.js +86 -0
- package/dist/u0-primitives/command-palette/CommandPalette.svelte +48 -43
- package/dist/u0-primitives/command-palette/CommandPalette.test.js +202 -0
- package/dist/u0-primitives/dropdown/Dropdown.svelte +20 -25
- package/dist/u0-primitives/grant-badge/GrantStatusBadge.svelte +2 -2
- package/dist/u0-primitives/index.d.ts +6 -0
- package/dist/u0-primitives/index.d.ts.map +1 -1
- package/dist/u0-primitives/index.js +8 -0
- package/dist/u0-primitives/input/Input.svelte +77 -24
- package/dist/u0-primitives/input/Input.svelte.d.ts +2 -10
- package/dist/u0-primitives/input/Input.svelte.d.ts.map +1 -1
- package/dist/u0-primitives/input/Input.test.js +81 -1
- package/dist/u0-primitives/live-dot/LiveDot.svelte +56 -0
- package/dist/u0-primitives/live-dot/LiveDot.svelte.d.ts +11 -0
- package/dist/u0-primitives/live-dot/LiveDot.svelte.d.ts.map +1 -0
- package/dist/u0-primitives/live-dot/LiveDot.test.js +41 -0
- package/dist/u0-primitives/live-dot/index.d.ts +3 -0
- package/dist/u0-primitives/live-dot/index.d.ts.map +1 -0
- package/dist/u0-primitives/live-dot/index.js +1 -0
- package/dist/u0-primitives/modal/Modal.svelte +22 -19
- package/dist/u0-primitives/modal/Modal.test.js +1 -1
- package/dist/u0-primitives/spinner/Spinner.svelte +11 -79
- package/dist/u0-primitives/spinner/Spinner.svelte.d.ts.map +1 -1
- package/dist/u0-primitives/steps/Steps.svelte +18 -19
- package/dist/u0-primitives/surface-state/SurfaceState.svelte +7 -7
- package/dist/u0-primitives/tabs/Tabs.svelte +13 -11
- package/dist/u0-primitives/theme-swatch-group/ThemeSwatchGroup.svelte +94 -0
- package/dist/u0-primitives/theme-swatch-group/ThemeSwatchGroup.svelte.d.ts +16 -0
- package/dist/u0-primitives/theme-swatch-group/ThemeSwatchGroup.svelte.d.ts.map +1 -0
- package/dist/u0-primitives/theme-swatch-group/ThemeSwatchGroup.test.js +48 -0
- package/dist/u0-primitives/theme-swatch-group/index.d.ts +3 -0
- package/dist/u0-primitives/theme-swatch-group/index.d.ts.map +1 -0
- package/dist/u0-primitives/theme-swatch-group/index.js +1 -0
- package/dist/u0-primitives/toggle/Toggle.svelte +10 -11
- package/dist/u0-primitives/tooltip/Tooltip.svelte +9 -9
- package/dist/u0-primitives/web-components/button-component.d.ts +5 -1
- package/dist/u0-primitives/web-components/button-component.d.ts.map +1 -1
- package/dist/u0-primitives/web-components/button-component.js +72 -33
- package/dist/u0-primitives/web-components/index.d.ts +3 -0
- package/dist/u0-primitives/web-components/index.d.ts.map +1 -0
- package/dist/u0-primitives/web-components/index.js +2 -0
- package/dist/u0-primitives/web-components/input-component.d.ts +5 -1
- package/dist/u0-primitives/web-components/input-component.d.ts.map +1 -1
- package/dist/u0-primitives/web-components/input-component.js +56 -39
- package/dist/u0-primitives/web-components/web-components.test.js +96 -0
- package/dist/u0-primitives/window-frame/WindowFrame.svelte +87 -0
- package/dist/u0-primitives/window-frame/WindowFrame.svelte.d.ts +10 -0
- package/dist/u0-primitives/window-frame/WindowFrame.svelte.d.ts.map +1 -0
- package/dist/u0-primitives/window-frame/WindowFrame.test.js +31 -0
- package/dist/u0-primitives/window-frame/index.d.ts +3 -0
- package/dist/u0-primitives/window-frame/index.d.ts.map +1 -0
- package/dist/u0-primitives/window-frame/index.js +1 -0
- package/dist/x0-enchanted-blocks/components/NodepadBlock.svelte +11 -2
- package/dist/x0-enchanted-blocks/components/NodepadBlock.svelte.d.ts.map +1 -1
- package/package.json +44 -28
- package/src/p0-primitives/tokens/ambient.css +76 -0
- package/src/p0-primitives/tokens/tokens.css +124 -29
- package/src/p0-primitives/tokens/tokens.json +42 -24
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
14
|
import { tick, untrack } from 'svelte';
|
|
15
|
-
import { modalStackStore } from '
|
|
15
|
+
import { modalStackStore } from '@stephen-netu/design-system/s0-state';
|
|
16
16
|
|
|
17
17
|
export interface Props {
|
|
18
18
|
/** Controls modal visibility */
|
|
@@ -258,8 +258,8 @@
|
|
|
258
258
|
.modal-dialog {
|
|
259
259
|
position: relative;
|
|
260
260
|
background: var(--color-bg-panel-elevated);
|
|
261
|
-
border: var(--border-width-
|
|
262
|
-
border-radius:
|
|
261
|
+
border: var(--border-width-default) solid var(--border-default);
|
|
262
|
+
border-radius: 0;
|
|
263
263
|
width: 90%;
|
|
264
264
|
max-width: 37.5rem;
|
|
265
265
|
max-height: 80vh;
|
|
@@ -267,9 +267,9 @@
|
|
|
267
267
|
flex-direction: column;
|
|
268
268
|
z-index: 1;
|
|
269
269
|
outline: none;
|
|
270
|
-
box-shadow:
|
|
271
|
-
transform: translateY(
|
|
272
|
-
transition: transform var(--transition-
|
|
270
|
+
box-shadow: none;
|
|
271
|
+
transform: translateY(0.5rem);
|
|
272
|
+
transition: transform var(--transition-fast) linear, opacity var(--transition-fast) linear;
|
|
273
273
|
opacity: 0;
|
|
274
274
|
}
|
|
275
275
|
|
|
@@ -279,27 +279,30 @@
|
|
|
279
279
|
}
|
|
280
280
|
|
|
281
281
|
.modal-dialog:focus {
|
|
282
|
-
|
|
282
|
+
outline: var(--border-width-default) solid var(--color-accent);
|
|
283
|
+
outline-offset: 2px;
|
|
283
284
|
}
|
|
284
285
|
|
|
285
286
|
.modal-header {
|
|
286
287
|
display: flex;
|
|
287
288
|
justify-content: space-between;
|
|
288
289
|
align-items: center;
|
|
289
|
-
padding: var(--
|
|
290
|
+
padding: var(--ui-pad-y) var(--ui-pad-x);
|
|
290
291
|
border-bottom: var(--border-width-thin) solid var(--border-default);
|
|
291
292
|
flex-shrink: 0;
|
|
292
293
|
}
|
|
293
294
|
|
|
294
295
|
.modal-title {
|
|
295
296
|
margin: 0;
|
|
296
|
-
font-size: var(--
|
|
297
|
-
|
|
297
|
+
font-size: var(--ui-label);
|
|
298
|
+
letter-spacing: 0.1em;
|
|
299
|
+
text-transform: uppercase;
|
|
300
|
+
color: var(--color-text-secondary);
|
|
298
301
|
display: flex;
|
|
299
302
|
align-items: center;
|
|
300
303
|
gap: var(--space-3);
|
|
301
304
|
font-weight: 600;
|
|
302
|
-
font-family: var(--font-
|
|
305
|
+
font-family: var(--font-mono);
|
|
303
306
|
}
|
|
304
307
|
|
|
305
308
|
.modal-header-actions {
|
|
@@ -310,19 +313,18 @@
|
|
|
310
313
|
|
|
311
314
|
.modal-close-btn {
|
|
312
315
|
background: none;
|
|
313
|
-
border:
|
|
316
|
+
border: 1px solid transparent;
|
|
314
317
|
color: var(--color-text-secondary);
|
|
315
318
|
cursor: pointer;
|
|
316
|
-
padding:
|
|
319
|
+
padding: 3px;
|
|
317
320
|
display: flex;
|
|
318
321
|
align-items: center;
|
|
319
|
-
border-
|
|
320
|
-
transition: all var(--transition-fast);
|
|
322
|
+
transition: color var(--transition-fast) linear, border-color var(--transition-fast) linear;
|
|
321
323
|
}
|
|
322
324
|
|
|
323
325
|
.modal-close-btn:hover {
|
|
324
326
|
color: var(--color-text-primary);
|
|
325
|
-
|
|
327
|
+
border-color: var(--border-default);
|
|
326
328
|
}
|
|
327
329
|
|
|
328
330
|
.modal-close-btn:focus-visible {
|
|
@@ -332,17 +334,18 @@
|
|
|
332
334
|
|
|
333
335
|
.modal-content {
|
|
334
336
|
overflow-y: auto;
|
|
335
|
-
padding: var(--
|
|
337
|
+
padding: var(--ui-pad-x);
|
|
336
338
|
flex: 1;
|
|
337
339
|
min-height: 0;
|
|
340
|
+
font-size: var(--ui-font);
|
|
338
341
|
}
|
|
339
342
|
|
|
340
343
|
.modal-footer {
|
|
341
344
|
display: flex;
|
|
342
345
|
align-items: center;
|
|
343
346
|
justify-content: flex-end;
|
|
344
|
-
gap: var(--
|
|
345
|
-
padding: var(--
|
|
347
|
+
gap: var(--ui-pad-y);
|
|
348
|
+
padding: var(--ui-pad-y) var(--ui-pad-x);
|
|
346
349
|
border-top: var(--border-width-thin) solid var(--border-default);
|
|
347
350
|
flex-shrink: 0;
|
|
348
351
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { describe, it, expect, vi, afterEach, beforeEach } from 'vitest';
|
|
2
2
|
import { render, fireEvent, cleanup } from '@testing-library/svelte';
|
|
3
3
|
import Modal from './Modal.svelte';
|
|
4
|
-
import { modalStackStore } from '
|
|
4
|
+
import { modalStackStore } from '@stephen-netu/design-system/s0-state';
|
|
5
5
|
beforeEach(() => {
|
|
6
6
|
modalStackStore.closeAll();
|
|
7
7
|
});
|
|
@@ -14,11 +14,6 @@
|
|
|
14
14
|
|
|
15
15
|
<div class="ds-spinner-wrapper size-{size} color-{color} {className}" role="status" aria-label="Loading">
|
|
16
16
|
<div class="ds-spinner-ring"></div>
|
|
17
|
-
<div class="ds-spinner-core"></div>
|
|
18
|
-
<!-- Floating magical dust particles -->
|
|
19
|
-
<div class="ds-spinner-particle p1"></div>
|
|
20
|
-
<div class="ds-spinner-particle p2"></div>
|
|
21
|
-
<div class="ds-spinner-particle p3"></div>
|
|
22
17
|
</div>
|
|
23
18
|
|
|
24
19
|
<style>
|
|
@@ -29,69 +24,19 @@
|
|
|
29
24
|
justify-content: center;
|
|
30
25
|
}
|
|
31
26
|
|
|
32
|
-
/*
|
|
27
|
+
/* Mechanical ring — linear, no spring, no glow, no particles.
|
|
28
|
+
Identity comes from the accent edge alone. */
|
|
33
29
|
.ds-spinner-ring {
|
|
34
30
|
position: absolute;
|
|
35
31
|
inset: 0;
|
|
36
|
-
border
|
|
37
|
-
border: 2px solid transparent;
|
|
32
|
+
border: 2px solid var(--border-default);
|
|
38
33
|
border-top-color: currentColor;
|
|
39
34
|
border-right-color: currentColor;
|
|
40
|
-
|
|
41
|
-
animation: ds-spin 1s cubic-bezier(0.68, -0.55, 0.265, 1.55) infinite;
|
|
35
|
+
animation: ds-spin 0.7s linear infinite;
|
|
42
36
|
}
|
|
43
37
|
|
|
44
|
-
/* Inner Core */
|
|
45
|
-
.ds-spinner-core {
|
|
46
|
-
position: absolute;
|
|
47
|
-
inset: 20%;
|
|
48
|
-
border-radius: var(--radius-full);
|
|
49
|
-
background: currentColor;
|
|
50
|
-
opacity: 0.3;
|
|
51
|
-
filter: blur(4px);
|
|
52
|
-
animation: ds-pulse-core 2s ease-in-out infinite alternate;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/* Magical Dust Particles */
|
|
56
|
-
.ds-spinner-particle {
|
|
57
|
-
position: absolute;
|
|
58
|
-
width: 3px;
|
|
59
|
-
height: 3px;
|
|
60
|
-
border-radius: var(--radius-full);
|
|
61
|
-
background: currentColor;
|
|
62
|
-
opacity: 0;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
.p1 { animation: ds-particle-drift-1 2s ease-out infinite; top: 10%; left: 10%; }
|
|
66
|
-
.p2 { animation: ds-particle-drift-2 2.5s ease-out infinite 0.5s; bottom: 10%; right: 10%; }
|
|
67
|
-
.p3 { animation: ds-particle-drift-3 1.8s ease-out infinite 1s; top: 10%; right: 20%; }
|
|
68
|
-
|
|
69
38
|
@keyframes ds-spin {
|
|
70
|
-
|
|
71
|
-
100% { transform: rotate(360deg); }
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
@keyframes ds-pulse-core {
|
|
75
|
-
0% { transform: scale(0.8); opacity: 0.2; }
|
|
76
|
-
100% { transform: scale(1.2); opacity: 0.5; }
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
@keyframes ds-particle-drift-1 {
|
|
80
|
-
0% { transform: translate(0, 0) scale(0); opacity: 0; }
|
|
81
|
-
50% { transform: translate(-10px, -15px) scale(1); opacity: 0.8; }
|
|
82
|
-
100% { transform: translate(-20px, -30px) scale(0); opacity: 0; }
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
@keyframes ds-particle-drift-2 {
|
|
86
|
-
0% { transform: translate(0, 0) scale(0); opacity: 0; }
|
|
87
|
-
50% { transform: translate(15px, 10px) scale(1.2); opacity: 0.6; }
|
|
88
|
-
100% { transform: translate(30px, 20px) scale(0); opacity: 0; }
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
@keyframes ds-particle-drift-3 {
|
|
92
|
-
0% { transform: translate(0, 0) scale(0); opacity: 0; }
|
|
93
|
-
50% { transform: translate(10px, -20px) scale(0.8); opacity: 0.9; }
|
|
94
|
-
100% { transform: translate(20px, -40px) scale(0); opacity: 0; }
|
|
39
|
+
to { transform: rotate(360deg); }
|
|
95
40
|
}
|
|
96
41
|
|
|
97
42
|
/* --- Sizes --- */
|
|
@@ -102,28 +47,15 @@
|
|
|
102
47
|
.size-xl { width: 4.5rem; height: 4.5rem; }
|
|
103
48
|
.size-xl .ds-spinner-ring { border-width: 4px; }
|
|
104
49
|
|
|
105
|
-
/*
|
|
106
|
-
.color-accent {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
.color-muted {
|
|
112
|
-
color: var(--color-text-muted);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
.color-white {
|
|
116
|
-
color: var(--color-text-primary);
|
|
117
|
-
filter: drop-shadow(0 0 4px rgba(255,255,255,0.4));
|
|
118
|
-
}
|
|
50
|
+
/* Colors — no glow/drop-shadow; depth from the 2-tone border only */
|
|
51
|
+
.color-accent { color: var(--color-accent); }
|
|
52
|
+
.color-muted { color: var(--color-text-muted); }
|
|
53
|
+
.color-white { color: var(--color-text-primary); }
|
|
119
54
|
|
|
120
|
-
/* Reduced motion */
|
|
55
|
+
/* Reduced motion — slow the ring to a near-stop */
|
|
121
56
|
@media (prefers-reduced-motion: reduce) {
|
|
122
57
|
.ds-spinner-ring {
|
|
123
|
-
animation: ds-spin
|
|
124
|
-
}
|
|
125
|
-
.ds-spinner-core, .ds-spinner-particle {
|
|
126
|
-
display: none;
|
|
58
|
+
animation: ds-spin 3s linear infinite;
|
|
127
59
|
}
|
|
128
60
|
}
|
|
129
61
|
</style>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Spinner.svelte.d.ts","sourceRoot":"","sources":["../../../src/u0-primitives/spinner/Spinner.svelte.ts"],"names":[],"mappings":"AAGE,MAAM,WAAW,KAAK;IACpB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IACjC,KAAK,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;
|
|
1
|
+
{"version":3,"file":"Spinner.svelte.d.ts","sourceRoot":"","sources":["../../../src/u0-primitives/spinner/Spinner.svelte.ts"],"names":[],"mappings":"AAGE,MAAM,WAAW,KAAK;IACpB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IACjC,KAAK,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAmBH,QAAA,MAAM,OAAO,2CAAwC,CAAC;AACtD,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC;AAC1C,eAAe,OAAO,CAAC"}
|
|
@@ -104,26 +104,30 @@
|
|
|
104
104
|
gap: var(--space-3, 0.75rem);
|
|
105
105
|
}
|
|
106
106
|
|
|
107
|
+
/* Square step indicator — mechanical numbering, not progress pills */
|
|
107
108
|
.step-circle {
|
|
108
109
|
display: flex;
|
|
109
110
|
align-items: center;
|
|
110
111
|
justify-content: center;
|
|
111
|
-
border-radius:
|
|
112
|
-
|
|
113
|
-
|
|
112
|
+
border-radius: 0;
|
|
113
|
+
border: 1px solid var(--border-default);
|
|
114
|
+
background: var(--color-bg-panel);
|
|
115
|
+
color: var(--color-text-secondary);
|
|
114
116
|
flex-shrink: 0;
|
|
117
|
+
font-family: var(--font-mono);
|
|
115
118
|
font-weight: 600;
|
|
116
119
|
}
|
|
117
120
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
121
|
+
.step-circle.completed {
|
|
122
|
+
background: color-mix(in srgb, var(--color-success) 15%, transparent);
|
|
123
|
+
border-color: var(--color-success);
|
|
124
|
+
color: var(--color-success);
|
|
125
|
+
}
|
|
122
126
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
+
.step-circle.active {
|
|
128
|
+
border-color: var(--color-accent);
|
|
129
|
+
color: var(--color-accent);
|
|
130
|
+
background: var(--color-accent-subtle);
|
|
127
131
|
}
|
|
128
132
|
|
|
129
133
|
.step-content {
|
|
@@ -143,18 +147,13 @@
|
|
|
143
147
|
}
|
|
144
148
|
|
|
145
149
|
.connector-line {
|
|
146
|
-
background: var(--
|
|
150
|
+
background: var(--border-default);
|
|
147
151
|
flex-shrink: 0;
|
|
148
152
|
}
|
|
149
153
|
|
|
150
|
-
.connector-line.first
|
|
151
|
-
border-top-left-radius: var(--radius-sm, 0.125rem);
|
|
152
|
-
border-top-right-radius: var(--radius-sm, 0.125rem);
|
|
153
|
-
}
|
|
154
|
-
|
|
154
|
+
.connector-line.first,
|
|
155
155
|
.connector-line.last {
|
|
156
|
-
border-
|
|
157
|
-
border-bottom-right-radius: var(--radius-sm, 0.125rem);
|
|
156
|
+
border-radius: 0;
|
|
158
157
|
}
|
|
159
158
|
|
|
160
159
|
/* Responsive adjustments */
|
|
@@ -99,7 +99,6 @@
|
|
|
99
99
|
min-height: 14rem;
|
|
100
100
|
padding: var(--space-6);
|
|
101
101
|
border: 1px solid var(--border-subtle);
|
|
102
|
-
border-radius: var(--radius-lg);
|
|
103
102
|
background: var(--color-bg-panel-elevated);
|
|
104
103
|
color: var(--color-text-primary);
|
|
105
104
|
text-align: center;
|
|
@@ -109,11 +108,10 @@
|
|
|
109
108
|
display: inline-flex;
|
|
110
109
|
align-items: center;
|
|
111
110
|
justify-content: center;
|
|
112
|
-
width:
|
|
113
|
-
height:
|
|
111
|
+
width: 2.5rem;
|
|
112
|
+
height: 2.5rem;
|
|
114
113
|
flex-shrink: 0;
|
|
115
114
|
border: 1px solid var(--border-default);
|
|
116
|
-
border-radius: var(--radius-full);
|
|
117
115
|
background: var(--color-bg-app);
|
|
118
116
|
}
|
|
119
117
|
|
|
@@ -152,10 +150,12 @@
|
|
|
152
150
|
|
|
153
151
|
.ds-surface-state__title {
|
|
154
152
|
margin: 0;
|
|
155
|
-
font-
|
|
153
|
+
font-family: var(--font-mono);
|
|
154
|
+
font-size: var(--ui-font);
|
|
156
155
|
font-weight: 600;
|
|
157
|
-
letter-spacing: 0.
|
|
158
|
-
|
|
156
|
+
letter-spacing: 0.06em;
|
|
157
|
+
text-transform: uppercase;
|
|
158
|
+
color: var(--color-text-secondary);
|
|
159
159
|
}
|
|
160
160
|
|
|
161
161
|
.ds-surface-state__message {
|
|
@@ -151,15 +151,18 @@
|
|
|
151
151
|
align-items: center;
|
|
152
152
|
justify-content: center;
|
|
153
153
|
gap: var(--space-2);
|
|
154
|
-
padding: var(--
|
|
154
|
+
padding: var(--ui-pad-y) var(--ui-pad-x);
|
|
155
|
+
height: var(--ui-control-h);
|
|
155
156
|
background: transparent;
|
|
156
157
|
border: none;
|
|
157
158
|
color: var(--color-text-secondary);
|
|
158
|
-
font-family: var(--font-
|
|
159
|
-
font-size: var(--
|
|
160
|
-
font-weight:
|
|
159
|
+
font-family: var(--font-mono);
|
|
160
|
+
font-size: var(--ui-label);
|
|
161
|
+
font-weight: 600;
|
|
162
|
+
letter-spacing: 0.08em;
|
|
163
|
+
text-transform: uppercase;
|
|
161
164
|
cursor: pointer;
|
|
162
|
-
transition: color var(--transition-fast), background var(--transition-fast);
|
|
165
|
+
transition: color var(--transition-fast) linear, background var(--transition-fast) linear;
|
|
163
166
|
white-space: nowrap;
|
|
164
167
|
z-index: 1;
|
|
165
168
|
}
|
|
@@ -197,6 +200,7 @@
|
|
|
197
200
|
height: 1.1em;
|
|
198
201
|
}
|
|
199
202
|
|
|
203
|
+
/* Active indicator: crisp 2px live edge, no bounce, no glow */
|
|
200
204
|
.ds-tab::after {
|
|
201
205
|
content: '';
|
|
202
206
|
position: absolute;
|
|
@@ -206,9 +210,8 @@
|
|
|
206
210
|
height: 2px;
|
|
207
211
|
background: var(--color-accent);
|
|
208
212
|
transform: scaleX(0);
|
|
209
|
-
transition: transform var(--transition-
|
|
210
|
-
transform-origin:
|
|
211
|
-
box-shadow: 0 -1px 4px var(--color-accent-glow);
|
|
213
|
+
transition: transform var(--transition-fast) linear;
|
|
214
|
+
transform-origin: left;
|
|
212
215
|
}
|
|
213
216
|
|
|
214
217
|
.ds-tab.is-active::after {
|
|
@@ -218,8 +221,7 @@
|
|
|
218
221
|
.ds-tab:focus-visible::before {
|
|
219
222
|
content: '';
|
|
220
223
|
position: absolute;
|
|
221
|
-
inset:
|
|
222
|
-
border
|
|
223
|
-
border: 2px solid var(--color-accent-subtle);
|
|
224
|
+
inset: 2px;
|
|
225
|
+
border: 1.5px solid var(--color-accent);
|
|
224
226
|
}
|
|
225
227
|
</style>
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
export interface Swatch {
|
|
3
|
+
hex: string;
|
|
4
|
+
label: string;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export interface Props {
|
|
8
|
+
swatches: Swatch[];
|
|
9
|
+
value?: string;
|
|
10
|
+
size?: 'sm' | 'md' | 'lg';
|
|
11
|
+
class?: string;
|
|
12
|
+
'aria-label'?: string;
|
|
13
|
+
onSelect?: (hex: string) => void;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
let {
|
|
17
|
+
swatches,
|
|
18
|
+
value = $bindable(''),
|
|
19
|
+
size = 'md',
|
|
20
|
+
class: className = '',
|
|
21
|
+
'aria-label': ariaLabel = 'Accent color',
|
|
22
|
+
onSelect
|
|
23
|
+
}: Props = $props();
|
|
24
|
+
|
|
25
|
+
function select(hex: string) {
|
|
26
|
+
value = hex;
|
|
27
|
+
onSelect?.(hex);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function handleKeydown(e: KeyboardEvent, hex: string) {
|
|
31
|
+
if (e.key === 'Enter' || e.key === ' ') {
|
|
32
|
+
e.preventDefault();
|
|
33
|
+
select(hex);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
</script>
|
|
37
|
+
|
|
38
|
+
<div class="ds-theme-swatch-group size-{size} {className}" role="radiogroup" aria-label={ariaLabel}>
|
|
39
|
+
{#each swatches as swatch (swatch.hex)}
|
|
40
|
+
<button
|
|
41
|
+
type="button"
|
|
42
|
+
class="ds-theme-swatch"
|
|
43
|
+
class:is-active={value === swatch.hex}
|
|
44
|
+
style="--swatch-hex: {swatch.hex}; --swatch-hex-2: color-mix(in oklab, {swatch.hex}, #fff 26%);"
|
|
45
|
+
role="radio"
|
|
46
|
+
aria-checked={value === swatch.hex}
|
|
47
|
+
aria-label={swatch.label}
|
|
48
|
+
title={swatch.label}
|
|
49
|
+
onclick={() => select(swatch.hex)}
|
|
50
|
+
onkeydown={(e) => handleKeydown(e, swatch.hex)}
|
|
51
|
+
></button>
|
|
52
|
+
{/each}
|
|
53
|
+
</div>
|
|
54
|
+
|
|
55
|
+
<style>
|
|
56
|
+
.ds-theme-swatch-group {
|
|
57
|
+
display: inline-flex;
|
|
58
|
+
align-items: center;
|
|
59
|
+
gap: 0.5rem;
|
|
60
|
+
padding: 0.25rem 0.5rem;
|
|
61
|
+
border: var(--border-width-thin) solid var(--border-default);
|
|
62
|
+
border-radius: var(--radius-full);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.ds-theme-swatch {
|
|
66
|
+
padding: 0;
|
|
67
|
+
border: 2px solid transparent;
|
|
68
|
+
border-radius: var(--radius-full);
|
|
69
|
+
background: linear-gradient(135deg, var(--swatch-hex) 0%, var(--swatch-hex-2) 100%);
|
|
70
|
+
cursor: pointer;
|
|
71
|
+
transition: transform var(--transition-fast), border-color var(--transition-fast);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.size-sm .ds-theme-swatch { width: 0.875rem; height: 0.875rem; }
|
|
75
|
+
.size-md .ds-theme-swatch { width: 1.125rem; height: 1.125rem; }
|
|
76
|
+
.size-lg .ds-theme-swatch { width: 1.375rem; height: 1.375rem; }
|
|
77
|
+
|
|
78
|
+
.ds-theme-swatch:hover {
|
|
79
|
+
transform: scale(1.12);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.ds-theme-swatch.is-active {
|
|
83
|
+
border-color: var(--color-text-primary);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.ds-theme-swatch:focus-visible {
|
|
87
|
+
outline: 2px solid var(--color-accent);
|
|
88
|
+
outline-offset: 2px;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
@media (prefers-reduced-motion: reduce) {
|
|
92
|
+
.ds-theme-swatch { transition: none; }
|
|
93
|
+
}
|
|
94
|
+
</style>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface Swatch {
|
|
2
|
+
hex: string;
|
|
3
|
+
label: string;
|
|
4
|
+
}
|
|
5
|
+
export interface Props {
|
|
6
|
+
swatches: Swatch[];
|
|
7
|
+
value?: string;
|
|
8
|
+
size?: 'sm' | 'md' | 'lg';
|
|
9
|
+
class?: string;
|
|
10
|
+
'aria-label'?: string;
|
|
11
|
+
onSelect?: (hex: string) => void;
|
|
12
|
+
}
|
|
13
|
+
declare const ThemeSwatchGroup: import("svelte").Component<Props, {}, "value">;
|
|
14
|
+
type ThemeSwatchGroup = ReturnType<typeof ThemeSwatchGroup>;
|
|
15
|
+
export default ThemeSwatchGroup;
|
|
16
|
+
//# sourceMappingURL=ThemeSwatchGroup.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ThemeSwatchGroup.svelte.d.ts","sourceRoot":"","sources":["../../../src/u0-primitives/theme-swatch-group/ThemeSwatchGroup.svelte.ts"],"names":[],"mappings":"AAGE,MAAM,WAAW,MAAM;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,KAAK;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAqCH,QAAA,MAAM,gBAAgB,gDAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { afterEach, describe, it, expect, vi } from 'vitest';
|
|
2
|
+
import { cleanup, render, screen, fireEvent } from '@testing-library/svelte';
|
|
3
|
+
import ThemeSwatchGroup from './ThemeSwatchGroup.svelte';
|
|
4
|
+
const swatches = [
|
|
5
|
+
{ hex: '#b87333', label: 'Brass' },
|
|
6
|
+
{ hex: '#4fa8a2', label: 'Teal' },
|
|
7
|
+
{ hex: '#c14a4a', label: 'Crimson' }
|
|
8
|
+
];
|
|
9
|
+
describe('ThemeSwatchGroup', () => {
|
|
10
|
+
afterEach(() => cleanup());
|
|
11
|
+
it('renders a radiogroup with one radio per swatch', () => {
|
|
12
|
+
render(ThemeSwatchGroup, { swatches });
|
|
13
|
+
expect(screen.getByRole('radiogroup')).toBeDefined();
|
|
14
|
+
expect(screen.getAllByRole('radio')).toHaveLength(3);
|
|
15
|
+
});
|
|
16
|
+
it('marks the swatch matching value as checked', () => {
|
|
17
|
+
render(ThemeSwatchGroup, { swatches, value: '#4fa8a2' });
|
|
18
|
+
const radios = screen.getAllByRole('radio');
|
|
19
|
+
expect(radios[1].getAttribute('aria-checked')).toBe('true');
|
|
20
|
+
expect(radios[0].getAttribute('aria-checked')).toBe('false');
|
|
21
|
+
});
|
|
22
|
+
it('calls onSelect with the clicked swatch hex', async () => {
|
|
23
|
+
const onSelect = vi.fn();
|
|
24
|
+
render(ThemeSwatchGroup, { swatches, onSelect });
|
|
25
|
+
const radios = screen.getAllByRole('radio');
|
|
26
|
+
await fireEvent.click(radios[2]);
|
|
27
|
+
expect(onSelect).toHaveBeenCalledWith('#c14a4a');
|
|
28
|
+
});
|
|
29
|
+
it('selects on Enter and Space keydown', async () => {
|
|
30
|
+
const onSelect = vi.fn();
|
|
31
|
+
render(ThemeSwatchGroup, { swatches, onSelect });
|
|
32
|
+
const radios = screen.getAllByRole('radio');
|
|
33
|
+
await fireEvent.keyDown(radios[0], { key: 'Enter' });
|
|
34
|
+
expect(onSelect).toHaveBeenCalledWith('#b87333');
|
|
35
|
+
await fireEvent.keyDown(radios[1], { key: ' ' });
|
|
36
|
+
expect(onSelect).toHaveBeenCalledWith('#4fa8a2');
|
|
37
|
+
});
|
|
38
|
+
it('uses each swatch label as its aria-label', () => {
|
|
39
|
+
render(ThemeSwatchGroup, { swatches });
|
|
40
|
+
expect(screen.getByLabelText('Brass')).toBeDefined();
|
|
41
|
+
expect(screen.getByLabelText('Teal')).toBeDefined();
|
|
42
|
+
expect(screen.getByLabelText('Crimson')).toBeDefined();
|
|
43
|
+
});
|
|
44
|
+
it('applies size class', () => {
|
|
45
|
+
const { container } = render(ThemeSwatchGroup, { swatches, size: 'lg' });
|
|
46
|
+
expect(container.querySelector('.size-lg')).not.toBeNull();
|
|
47
|
+
});
|
|
48
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/u0-primitives/theme-swatch-group/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACxE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as ThemeSwatchGroup } from './ThemeSwatchGroup.svelte';
|
|
@@ -67,13 +67,13 @@
|
|
|
67
67
|
opacity: 0.5;
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
+
/* Track: square (not pill) — mechanical, not soft */
|
|
70
71
|
.ds-toggle-track {
|
|
71
72
|
position: relative;
|
|
72
73
|
background: var(--color-bg-panel-elevated);
|
|
73
74
|
border: 1px solid var(--border-default);
|
|
74
|
-
border-radius:
|
|
75
|
-
transition:
|
|
76
|
-
box-shadow: var(--shadow-inner);
|
|
75
|
+
border-radius: 0;
|
|
76
|
+
transition: border-color var(--transition-fast) linear, background var(--transition-fast) linear;
|
|
77
77
|
}
|
|
78
78
|
|
|
79
79
|
/* Track Focus */
|
|
@@ -87,20 +87,19 @@
|
|
|
87
87
|
top: 2px;
|
|
88
88
|
left: 2px;
|
|
89
89
|
background: var(--color-text-secondary);
|
|
90
|
-
border-radius:
|
|
91
|
-
transition:
|
|
92
|
-
box-shadow: var(--shadow-sm);
|
|
90
|
+
border-radius: 0;
|
|
91
|
+
transition: transform var(--transition-fast) linear, background var(--transition-fast) linear;
|
|
93
92
|
}
|
|
94
93
|
|
|
95
|
-
/* Checked
|
|
94
|
+
/* Checked: accent border + filled thumb — accent as a live edge/fill on a
|
|
95
|
+
control is acceptable here because the thumb IS the state indicator */
|
|
96
96
|
.ds-toggle-track.is-checked {
|
|
97
|
-
background: var(--color-accent);
|
|
98
|
-
border-color: var(--color-accent
|
|
99
|
-
box-shadow: inset 0 1px 2px rgba(0,0,0,0.3), 0 0 8px var(--color-accent-subtle);
|
|
97
|
+
background: var(--color-accent-subtle);
|
|
98
|
+
border-color: var(--color-accent);
|
|
100
99
|
}
|
|
101
100
|
|
|
102
101
|
.ds-toggle-track.is-checked .ds-toggle-thumb {
|
|
103
|
-
background: var(--color-
|
|
102
|
+
background: var(--color-accent);
|
|
104
103
|
}
|
|
105
104
|
|
|
106
105
|
/* Label */
|
|
@@ -99,19 +99,19 @@
|
|
|
99
99
|
max-width: 250px;
|
|
100
100
|
background: var(--color-bg-panel-elevated);
|
|
101
101
|
border: 1px solid var(--border-default);
|
|
102
|
-
box-shadow:
|
|
103
|
-
border-radius:
|
|
104
|
-
animation: ds-fade-in var(--transition-fast)
|
|
105
|
-
pointer-events: none;
|
|
102
|
+
box-shadow: none;
|
|
103
|
+
border-radius: 0;
|
|
104
|
+
animation: ds-fade-in var(--transition-fast) linear;
|
|
105
|
+
pointer-events: none;
|
|
106
106
|
}
|
|
107
107
|
|
|
108
108
|
.ds-tooltip-inner {
|
|
109
|
-
padding: var(--
|
|
109
|
+
padding: var(--ui-pad-y) var(--ui-pad-x);
|
|
110
110
|
color: var(--color-text-primary);
|
|
111
|
-
font-family: var(--font-
|
|
112
|
-
font-size: var(--
|
|
113
|
-
line-height:
|
|
114
|
-
text-align:
|
|
111
|
+
font-family: var(--font-mono);
|
|
112
|
+
font-size: var(--ui-label);
|
|
113
|
+
line-height: var(--ui-leading);
|
|
114
|
+
text-align: left;
|
|
115
115
|
}
|
|
116
116
|
|
|
117
117
|
/* Arrow Base */
|