@motion-proto/live-tokens 0.96.0 → 0.98.2
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/.claude/skills/live-tokens-check-compliance/SKILL.md +5 -0
- package/.claude/skills/live-tokens-create-component/SKILL.md +4 -3
- package/.claude/skills/live-tokens-create-component/references/contract-tests.md +71 -11
- package/CHANGELOG.md +309 -0
- package/README.md +2 -2
- package/bin/check-component.mjs +8 -0
- package/bin/check-page.mjs +6 -0
- package/bin/cli.mjs +36 -6
- package/bin/contractRunner.mjs +142 -17
- package/bin/lib/findings.mjs +20 -4
- package/bin/rules/a11y.mjs +53 -0
- package/bin/set-colors.mjs +1 -0
- package/bin/setup-claude.mjs +2 -2
- package/dist-plugin/{chunk-A4TBP4MM.js → chunk-SLICH4IH.js} +2 -2
- package/dist-plugin/index.cjs +148 -3
- package/dist-plugin/index.js +250 -105
- package/dist-plugin/setColors/index.cjs +7 -1
- package/dist-plugin/setColors/index.d.cts +9 -4
- package/dist-plugin/setColors/index.d.ts +9 -4
- package/dist-plugin/setColors/index.js +8 -2
- package/dist-plugin/setGeometry/index.d.cts +1 -1
- package/dist-plugin/setGeometry/index.d.ts +1 -1
- package/dist-plugin/setType/index.d.cts +1 -1
- package/dist-plugin/setType/index.d.ts +1 -1
- package/dist-plugin/{themeTypes-B8_Idrp4.d.cts → themeTypes-BaTQUyac.d.cts} +10 -1
- package/dist-plugin/{themeTypes-B8_Idrp4.d.ts → themeTypes-BaTQUyac.d.ts} +10 -1
- package/package.json +49 -2
- package/src/demo/LabeledSelect.svelte +1 -1
- package/src/editor/bootstrap.ts +3 -1
- package/src/editor/component-editor/BadgeEditor.svelte +13 -0
- package/src/editor/component-editor/ButtonEditor.svelte +33 -2
- package/src/editor/component-editor/CalloutEditor.svelte +13 -0
- package/src/editor/component-editor/CardEditor.svelte +12 -2
- package/src/editor/component-editor/CodeSnippetEditor.svelte +11 -1
- package/src/editor/component-editor/CollapsibleSectionEditor.svelte +18 -1
- package/src/editor/component-editor/CornerBadgeEditor.svelte +13 -0
- package/src/editor/component-editor/DialogEditor.svelte +15 -0
- package/src/editor/component-editor/IconButtonEditor.svelte +29 -1
- package/src/editor/component-editor/ImageEditor.svelte +20 -9
- package/src/editor/component-editor/ImageLightboxEditor.svelte +44 -0
- package/src/editor/component-editor/InlineEditActionsEditor.svelte +13 -1
- package/src/editor/component-editor/InputEditor.svelte +23 -0
- package/src/editor/component-editor/MenuSelectEditor.svelte +27 -1
- package/src/editor/component-editor/NotificationEditor.svelte +15 -0
- package/src/editor/component-editor/PanelEditor.svelte +1 -1
- package/src/editor/component-editor/ProgressBarEditor.svelte +13 -0
- package/src/editor/component-editor/RadioButtonEditor.svelte +20 -1
- package/src/editor/component-editor/SectionDividerEditor.svelte +41 -13
- package/src/editor/component-editor/SegmentedControlEditor.svelte +29 -1
- package/src/editor/component-editor/SideNavigationEditor.svelte +40 -1
- package/src/editor/component-editor/SlidePagerEditor.svelte +20 -0
- package/src/editor/component-editor/SliderEditor.svelte +33 -0
- package/src/editor/component-editor/TabBarEditor.svelte +23 -2
- package/src/editor/component-editor/TableEditor.svelte +14 -0
- package/src/editor/component-editor/ToggleEditor.svelte +17 -0
- package/src/editor/component-editor/TooltipEditor.svelte +11 -2
- package/src/editor/component-editor/VideoFrameEditor.svelte +8 -0
- package/src/editor/component-editor/VideoLightboxEditor.svelte +10 -0
- package/src/editor/component-editor/registration.ts +2 -1
- package/src/editor/component-editor/registry.ts +69 -27
- package/src/editor/component-editor/scaffolding/DemoHeader.svelte +2 -0
- package/src/editor/component-editor/scaffolding/StateBlock.svelte +19 -8
- package/src/editor/component-editor/scaffolding/TokenLayout.svelte +3 -0
- package/src/editor/component-editor/scaffolding/VariantGroup.svelte +70 -10
- package/src/editor/component-editor/scaffolding/editorContext.ts +7 -0
- package/src/editor/core/a11y/a11yReport.ts +101 -0
- package/src/editor/core/a11y/a11yReportTypes.ts +69 -0
- package/src/editor/core/a11y/contrastFailures.ts +22 -0
- package/src/editor/core/components/contrastPairRegistry.ts +18 -0
- package/src/editor/core/palettes/contrast.ts +44 -0
- package/src/editor/core/palettes/contrastPairs.ts +79 -0
- package/src/editor/core/palettes/resolveColor.ts +77 -0
- package/src/editor/core/store/editorPersistence.ts +9 -1
- package/src/editor/core/store/editorRenderer.ts +2 -0
- package/src/editor/core/store/editorStore.ts +29 -0
- package/src/editor/core/store/editorTypes.ts +9 -0
- package/src/editor/core/store/editorViewStore.ts +2 -2
- package/src/editor/core/store/unsavedEdits.ts +10 -0
- package/src/editor/core/themes/buildColors.ts +16 -5
- package/src/editor/core/themes/liveStateStream.ts +7 -1
- package/src/editor/core/themes/parsers/gradient.ts +5 -2
- package/src/editor/core/themes/slices/customColors.ts +226 -0
- package/src/editor/core/themes/themeTypes.ts +10 -0
- package/src/editor/docs/chapters.ts +1 -0
- package/src/editor/docs/content/accessibility.md +362 -0
- package/src/editor/docs/content/editing-tokens.md +56 -1
- package/src/editor/docs/content.generated.ts +2 -1
- package/src/editor/pages/ComponentEditorPage.svelte +10 -1
- package/src/editor/pages/EditorShell.svelte +97 -10
- package/src/editor/skill-atlas/skillSources.generated.ts +3 -3
- package/src/editor/skill-atlas/trees/check-compliance.ts +3 -3
- package/src/editor/skill-atlas/trees/create-component.ts +12 -12
- package/src/editor/ui/CustomColorReplaceStep.svelte +118 -0
- package/src/editor/ui/EditorViewSwitcher.svelte +15 -2
- package/src/editor/ui/GradientEditor.svelte +9 -1
- package/src/editor/ui/ThemePanel.svelte +4 -4
- package/src/editor/ui/UIContrastReadout.svelte +186 -0
- package/src/editor/ui/UIInfoPopover.svelte +16 -2
- package/src/editor/ui/UIPaletteSelector.svelte +347 -15
- package/src/editor/ui/UITokenSelector.svelte +33 -14
- package/src/editor/ui/VariablesTab.svelte +3 -0
- package/src/editor/ui/a11y/A11yComponentIssues.svelte +103 -0
- package/src/editor/ui/a11y/A11yFindingRow.svelte +57 -0
- package/src/editor/ui/a11y/A11yIssueRow.svelte +121 -0
- package/src/editor/ui/a11y/A11yOverview.svelte +242 -0
- package/src/editor/ui/a11y/A11yPanel.svelte +128 -0
- package/src/editor/ui/a11y/A11yPropertyMark.svelte +84 -0
- package/src/editor/ui/a11y/A11yRailMark.svelte +34 -0
- package/src/editor/ui/a11y/AccessibilityTab.svelte +334 -0
- package/src/editor/ui/a11y/a11yView.ts +218 -0
- package/src/editor/ui/anchorToTrigger.ts +63 -0
- package/src/editor/ui/contrastReadout.ts +45 -0
- package/src/editor/ui/sections/CustomColorsSection.svelte +254 -0
- package/src/live-tokens/data/themes/autumn.json +20 -20
- package/src/live-tokens/data/themes/halloween.json +20 -20
- package/src/live-tokens/data/themes/midnight-study.json +20 -20
- package/src/live-tokens/data/themes/ocean.json +20 -20
- package/src/live-tokens/data/themes/royal-velvet.json +20 -20
- package/src/live-tokens/data/themes/sketchy.json +20 -20
- package/src/live-tokens/data/themes/spring-meadow.json +20 -20
- package/src/live-tokens/data/themes/sunset.json +20 -20
- package/src/system/components/Badge.svelte +3 -3
- package/src/system/components/Button.svelte +9 -3
- package/src/system/components/CodeSnippet.svelte +8 -1
- package/src/system/components/CornerBadge.svelte +3 -3
- package/src/system/components/Dialog.svelte +43 -14
- package/src/system/components/IconButton.svelte +1 -1
- package/src/system/components/Image.svelte +7 -0
- package/src/system/components/ImageLightbox.svelte +26 -26
- package/src/system/components/Input.svelte +8 -1
- package/src/system/components/MenuSelect.svelte +30 -2
- package/src/system/components/Notification.svelte +1 -1
- package/src/system/components/ProgressBar.svelte +6 -0
- package/src/system/components/RadioButton.svelte +36 -3
- package/src/system/components/SegmentedControl.svelte +36 -2
- package/src/system/components/SlidePager.svelte +2 -2
- package/src/system/components/Slider.svelte +13 -9
- package/src/system/components/TabBar.svelte +33 -3
- package/src/system/components/Toggle.svelte +2 -2
- package/src/system/components/VideoFrame.svelte +1 -1
- package/src/system/components/VideoLightbox.svelte +2 -2
- package/src/system/internal/focusTrap.ts +35 -0
- package/src/testing-js/__aria__/badge.yml +40 -0
- package/src/testing-js/__aria__/button.yml +88 -0
- package/src/testing-js/__aria__/callout.yml +12 -0
- package/src/testing-js/__aria__/card.yml +8 -0
- package/src/testing-js/__aria__/codesnippet.yml +21 -0
- package/src/testing-js/__aria__/collapsiblesection.yml +23 -0
- package/src/testing-js/__aria__/cornerbadge.yml +24 -0
- package/src/testing-js/__aria__/dialog.yml +42 -0
- package/src/testing-js/__aria__/iconbutton.yml +57 -0
- package/src/testing-js/__aria__/image.yml +10 -0
- package/src/testing-js/__aria__/imagelightbox.yml +50 -0
- package/src/testing-js/__aria__/inlineeditactions.yml +16 -0
- package/src/testing-js/__aria__/input.yml +61 -0
- package/src/testing-js/__aria__/menuselect.yml +30 -0
- package/src/testing-js/__aria__/notification.yml +30 -0
- package/src/testing-js/__aria__/panel.yml +2 -0
- package/src/testing-js/__aria__/progressbar.yml +2 -0
- package/src/testing-js/__aria__/radiobutton.yml +20 -0
- package/src/testing-js/__aria__/sectiondivider.yml +9 -0
- package/src/testing-js/__aria__/segmentedcontrol.yml +35 -0
- package/src/testing-js/__aria__/sidenavigation.yml +304 -0
- package/src/testing-js/__aria__/slidepager.yml +72 -0
- package/src/testing-js/__aria__/slider.yml +28 -0
- package/src/testing-js/__aria__/tabbar.yml +35 -0
- package/src/testing-js/__aria__/table.yml +144 -0
- package/src/testing-js/__aria__/toggle.yml +12 -0
- package/src/testing-js/__aria__/tooltip.yml +2 -0
- package/src/testing-js/__aria__/videoframe.yml +6 -0
- package/src/testing-js/__aria__/videolightbox.yml +12 -0
- package/src/testing-js/{chunk-WIZ6W7UT.js → chunk-3WCLMOM7.js} +2 -2
- package/src/testing-js/{chunk-SHBYZUPD.js → chunk-5HNZHIHG.js} +211 -14
- package/src/testing-js/chunk-5HNZHIHG.js.map +1 -0
- package/src/testing-js/{chunk-NB3NZRBM.js → chunk-7CM5D7PF.js} +5 -1
- package/src/testing-js/chunk-7CM5D7PF.js.map +1 -0
- package/src/testing-js/chunk-EWSGE27V.js +168 -0
- package/src/testing-js/chunk-EWSGE27V.js.map +1 -0
- package/src/testing-js/{chunk-GKO27NGN.js → chunk-R54I7YL6.js} +2 -2
- package/src/testing-js/{chunk-X6KHEVIG.js → chunk-RWH46IU5.js} +97 -29
- package/src/testing-js/chunk-RWH46IU5.js.map +1 -0
- package/src/testing-js/chunk-SHLPDNAQ.js +658 -0
- package/src/testing-js/chunk-SHLPDNAQ.js.map +1 -0
- package/src/testing-js/{chunk-3UKGXCDL.js → chunk-YVVR3GJZ.js} +1 -1
- package/src/testing-js/chunk-YVVR3GJZ.js.map +1 -0
- package/src/testing-js/component-a11y.contract.js +283 -0
- package/src/testing-js/component-a11y.contract.js.map +1 -0
- package/src/testing-js/component-alias.contract.js +2 -2
- package/src/testing-js/component-behavior.contract.js +2 -2
- package/src/testing-js/component-editor.contract.js +6 -5
- package/src/testing-js/component-editor.contract.js.map +1 -1
- package/src/testing-js/component-render.contract.js +10 -6
- package/src/testing-js/component-render.contract.js.map +1 -1
- package/src/testing-js/index.d.ts +44 -16
- package/src/testing-js/index.js +9 -9
- package/src/testing-js/page-compliance.contract.js +163 -18
- package/src/testing-js/page-compliance.contract.js.map +1 -1
- package/src/testing-js/vitest.js +3 -3
- package/template/package.json +9 -0
- package/src/editor/ui/keepInViewport.ts +0 -84
- package/src/testing-js/chunk-3UKGXCDL.js.map +0 -1
- package/src/testing-js/chunk-NB3NZRBM.js.map +0 -1
- package/src/testing-js/chunk-SHBYZUPD.js.map +0 -1
- package/src/testing-js/chunk-X6KHEVIG.js.map +0 -1
- /package/src/testing-js/{chunk-WIZ6W7UT.js.map → chunk-3WCLMOM7.js.map} +0 -0
- /package/src/testing-js/{chunk-GKO27NGN.js.map → chunk-R54I7YL6.js.map} +0 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<script module lang="ts">
|
|
2
2
|
import { buildTypeGroupColorTokens } from './scaffolding/buildTypeGroupTokens';
|
|
3
3
|
import type { Token, TypeGroupConfig, IntrinsicSpec } from './scaffolding/types';
|
|
4
|
+
import type { ContrastPair } from '../core/palettes/contrastPairs';
|
|
4
5
|
|
|
5
6
|
export const component = 'sidenavigation';
|
|
6
7
|
|
|
@@ -271,6 +272,43 @@
|
|
|
271
272
|
default: { default: 'var(--color-transparent)' },
|
|
272
273
|
},
|
|
273
274
|
];
|
|
275
|
+
|
|
276
|
+
// Every part sits on the panel, and a hover rule lays the tint over its
|
|
277
|
+
// surface. The section header's own CollapsibleSection surface belongs to
|
|
278
|
+
// that component and stays out of the stack.
|
|
279
|
+
const panel = '--sidenavigation-panel-surface';
|
|
280
|
+
const tint = '--sidenavigation-hover-tint-enabled';
|
|
281
|
+
const partStack = (part: string, s: string): string[] =>
|
|
282
|
+
s === 'hover' ? [tint, `--sidenavigation-${part}-hover-surface`] : [`--sidenavigation-${part}-${s}-surface`];
|
|
283
|
+
const textPairs = (groups: TypeGroupConfig[], backdrop: string[]): ContrastPair[] =>
|
|
284
|
+
groups.map((g) => ({ foreground: g.colorVariable, backdrop, role: 'text', fontSize: g.sizeVariable, fontWeight: g.weightVariable }));
|
|
285
|
+
|
|
286
|
+
// The toggle sits on the title, which a pointer on the toggle also hovers.
|
|
287
|
+
const toggleContrastPairs: ContrastPair[] = [
|
|
288
|
+
...STATEFUL_STATES.map((title): ContrastPair => ({
|
|
289
|
+
foreground: '--sidenavigation-toggle-default-icon',
|
|
290
|
+
backdrop: ['--sidenavigation-toggle-default-surface', ...partStack('title', title), panel],
|
|
291
|
+
role: 'non-text',
|
|
292
|
+
context: `title ${title}`,
|
|
293
|
+
})),
|
|
294
|
+
...(['hover', 'selected'] as const).map((title): ContrastPair => ({
|
|
295
|
+
foreground: '--sidenavigation-toggle-hover-icon',
|
|
296
|
+
backdrop: [...partStack('toggle', 'hover'), ...partStack('title', title), panel],
|
|
297
|
+
role: 'non-text',
|
|
298
|
+
context: `title ${title}`,
|
|
299
|
+
})),
|
|
300
|
+
];
|
|
301
|
+
|
|
302
|
+
export const contrastPairs: ContrastPair[] = [
|
|
303
|
+
...STATEFUL_STATES.flatMap((s): ContrastPair[] => [
|
|
304
|
+
...textPairs(titleStateTypeGroups(s), ['--sidenavigation-title-label-surface', ...partStack('title', s), panel]),
|
|
305
|
+
...textPairs(sectionStateTypeGroups(s), [...partStack('section', s), panel]),
|
|
306
|
+
...textPairs(itemStateTypeGroups(s), [...partStack('item', s), panel]),
|
|
307
|
+
...textPairs(footerStateTypeGroups(s), [...partStack('footer', s), panel]),
|
|
308
|
+
{ foreground: `--sidenavigation-footer-${s}-icon`, backdrop: [...partStack('footer', s), panel], role: 'non-text' },
|
|
309
|
+
]),
|
|
310
|
+
...toggleContrastPairs,
|
|
311
|
+
];
|
|
274
312
|
</script>
|
|
275
313
|
|
|
276
314
|
<script lang="ts">
|
|
@@ -280,6 +318,7 @@
|
|
|
280
318
|
import { editorState, setComponentAlias, clearComponentAlias } from '../core/store/editorStore';
|
|
281
319
|
import { computeLinkedBlock, withLinkedDisabled } from './scaffolding/linkedBlock';
|
|
282
320
|
import Toggle from '../ui/Toggle.svelte';
|
|
321
|
+
import A11yPropertyMark from '../ui/a11y/A11yPropertyMark.svelte';
|
|
283
322
|
import UIPaletteSelector from '../ui/UIPaletteSelector.svelte';
|
|
284
323
|
|
|
285
324
|
// One switch. Turning the tint on also stands each hover surface down to its
|
|
@@ -384,7 +423,7 @@
|
|
|
384
423
|
{#snippet extraPropertyRows(stateName)}
|
|
385
424
|
{#if stateName.endsWith(' / Hover')}
|
|
386
425
|
<div class="property-row" data-token-variables="--sidenavigation-hover-tint-enabled">
|
|
387
|
-
<span class="property-label">tint layer
|
|
426
|
+
<span class="property-label">tint layer<A11yPropertyMark variables={['--sidenavigation-hover-tint-enabled']} /></span>
|
|
388
427
|
<Toggle checked={tintOn} onchange={setTintOn} />
|
|
389
428
|
</div>
|
|
390
429
|
{#if tintOn}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
<script module lang="ts">
|
|
2
2
|
import type { Token } from './scaffolding/types';
|
|
3
|
+
import type { ContrastPair } from '../core/palettes/contrastPairs';
|
|
3
4
|
|
|
4
5
|
export const component = 'slidepager';
|
|
5
6
|
|
|
@@ -46,6 +47,25 @@
|
|
|
46
47
|
};
|
|
47
48
|
|
|
48
49
|
export const allTokens: Token[] = Object.values(states).flat();
|
|
50
|
+
|
|
51
|
+
// The bar sits on the page inline and on the scrim when zoomed.
|
|
52
|
+
const scrim = '--slidepager-scrim-surface';
|
|
53
|
+
function controlContrastPairs(foreground: string, surface: string, inactive: boolean): ContrastPair[] {
|
|
54
|
+
const flag = inactive ? { inactive } : {};
|
|
55
|
+
return [
|
|
56
|
+
{ foreground, backdrop: [surface], role: 'non-text', context: 'inline', ...flag },
|
|
57
|
+
{ foreground, backdrop: [surface, scrim], role: 'non-text', context: 'zoomed', ...flag },
|
|
58
|
+
];
|
|
59
|
+
}
|
|
60
|
+
const counter = { foreground: '--slidepager-counter-text', role: 'text', fontSize: '--slidepager-counter-font-size', fontWeight: '--slidepager-counter-font-weight' } as const;
|
|
61
|
+
|
|
62
|
+
export const contrastPairs: ContrastPair[] = [
|
|
63
|
+
...controlContrastPairs('--slidepager-control-icon', '--slidepager-control-surface', false),
|
|
64
|
+
...controlContrastPairs('--slidepager-control-hover-icon', '--slidepager-control-hover-surface', false),
|
|
65
|
+
...controlContrastPairs('--slidepager-control-disabled-icon', '--slidepager-control-disabled-surface', true),
|
|
66
|
+
{ ...counter, backdrop: [], context: 'inline' },
|
|
67
|
+
{ ...counter, backdrop: [scrim], context: 'zoomed' },
|
|
68
|
+
];
|
|
49
69
|
</script>
|
|
50
70
|
|
|
51
71
|
<script lang="ts">
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<script module lang="ts">
|
|
2
2
|
import { buildTypeGroupColorTokens } from './scaffolding/buildTypeGroupTokens';
|
|
3
3
|
import type { Token, TypeGroupConfig } from './scaffolding/types';
|
|
4
|
+
import type { ContrastPair } from '../core/palettes/contrastPairs';
|
|
4
5
|
import { sliderVariants } from '../../system/components/Slider.svelte';
|
|
5
6
|
|
|
6
7
|
export const component = 'slider';
|
|
@@ -109,6 +110,38 @@
|
|
|
109
110
|
]);
|
|
110
111
|
|
|
111
112
|
const variantOptions = variants.map((v) => ({ value: v, label: v.charAt(0).toUpperCase() + v.slice(1) }));
|
|
113
|
+
|
|
114
|
+
// The fill paints on the track, and the thumb straddles the fill and the track.
|
|
115
|
+
function variantContrastPairs(v: Variant): ContrastPair[] {
|
|
116
|
+
const thumbPairs = (thumb: string, fill: string, track: string, inactive: boolean): ContrastPair[] => {
|
|
117
|
+
const flag = inactive ? { inactive } : {};
|
|
118
|
+
return [
|
|
119
|
+
{ foreground: thumb, backdrop: [fill, track], role: 'non-text', context: 'fill', ...flag },
|
|
120
|
+
{ foreground: thumb, backdrop: [track], role: 'non-text', context: 'track', ...flag },
|
|
121
|
+
];
|
|
122
|
+
};
|
|
123
|
+
const track = `--slider-${v}-track-surface`;
|
|
124
|
+
const disabledTrack = `--slider-${v}-disabled-track-surface`;
|
|
125
|
+
return [
|
|
126
|
+
{ foreground: `--slider-${v}-fill`, backdrop: [track], role: 'non-text' },
|
|
127
|
+
...thumbPairs(`--slider-${v}-thumb-surface`, `--slider-${v}-fill`, track, false),
|
|
128
|
+
...thumbPairs(`--slider-${v}-hover-thumb-surface`, `--slider-${v}-fill`, track, false),
|
|
129
|
+
{ foreground: `--slider-${v}-disabled-fill`, backdrop: [disabledTrack], role: 'non-text', inactive: true },
|
|
130
|
+
...thumbPairs(`--slider-${v}-disabled-thumb-surface`, `--slider-${v}-disabled-fill`, disabledTrack, true),
|
|
131
|
+
];
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Both variants share the label and value, which sit on no surface.
|
|
135
|
+
export const contrastPairs: ContrastPair[] = [
|
|
136
|
+
...typeGroups.default.map((g): ContrastPair => ({
|
|
137
|
+
foreground: g.colorVariable,
|
|
138
|
+
backdrop: [],
|
|
139
|
+
role: 'text',
|
|
140
|
+
fontSize: g.sizeVariable,
|
|
141
|
+
fontWeight: g.weightVariable,
|
|
142
|
+
})),
|
|
143
|
+
...variants.flatMap(variantContrastPairs),
|
|
144
|
+
];
|
|
112
145
|
</script>
|
|
113
146
|
|
|
114
147
|
<script lang="ts">
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<script module lang="ts">
|
|
2
2
|
import { buildTypeGroupColorTokens } from './scaffolding/buildTypeGroupTokens';
|
|
3
3
|
import type { Token, TypeGroupConfig, IntrinsicSpec } from './scaffolding/types';
|
|
4
|
+
import type { ContrastPair } from '../core/palettes/contrastPairs';
|
|
4
5
|
|
|
5
6
|
export const component = 'tabbar';
|
|
6
7
|
|
|
@@ -93,6 +94,25 @@
|
|
|
93
94
|
default: { default: 'var(--color-transparent)' },
|
|
94
95
|
},
|
|
95
96
|
];
|
|
97
|
+
|
|
98
|
+
// The bottom indicator paints over its own tab's surface.
|
|
99
|
+
function tabContrastPairs(s: TabState): ContrastPair[] {
|
|
100
|
+
const backdrop = s === 'hover' ? ['--tabbar-hover-tint-enabled', '--tabbar-hover-surface'] : [`--tabbar-${s}-surface`];
|
|
101
|
+
const inactive = s === 'disabled' ? { inactive: true } : {};
|
|
102
|
+
return [
|
|
103
|
+
...tabStateTypeGroups(s).map((g): ContrastPair => ({
|
|
104
|
+
foreground: g.colorVariable,
|
|
105
|
+
backdrop,
|
|
106
|
+
role: 'text',
|
|
107
|
+
fontSize: g.sizeVariable,
|
|
108
|
+
fontWeight: g.weightVariable,
|
|
109
|
+
...inactive,
|
|
110
|
+
})),
|
|
111
|
+
{ foreground: `--tabbar-${s}-border`, backdrop, role: 'non-text', ...inactive },
|
|
112
|
+
];
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export const contrastPairs: ContrastPair[] = tabStateNames.flatMap(tabContrastPairs);
|
|
96
116
|
</script>
|
|
97
117
|
|
|
98
118
|
<script lang="ts">
|
|
@@ -102,6 +122,7 @@
|
|
|
102
122
|
import { editorState, setComponentAlias, clearComponentAlias } from '../core/store/editorStore';
|
|
103
123
|
import { computeLinkedBlock, withLinkedDisabled } from './scaffolding/linkedBlock';
|
|
104
124
|
import Toggle from '../ui/Toggle.svelte';
|
|
125
|
+
import A11yPropertyMark from '../ui/a11y/A11yPropertyMark.svelte';
|
|
105
126
|
import UIPaletteSelector from '../ui/UIPaletteSelector.svelte';
|
|
106
127
|
|
|
107
128
|
// One switch. Turning the tint on also stands each hover surface down to its
|
|
@@ -163,7 +184,7 @@
|
|
|
163
184
|
{#snippet extraPropertyRows(stateName)}
|
|
164
185
|
{#if stateName === 'hover tab'}
|
|
165
186
|
<div class="property-row" data-token-variables="--tabbar-hover-tint-enabled">
|
|
166
|
-
<span class="property-label">tint layer
|
|
187
|
+
<span class="property-label">tint layer<A11yPropertyMark variables={['--tabbar-hover-tint-enabled']} /></span>
|
|
167
188
|
<Toggle checked={tintOn} onchange={setTintOn} />
|
|
168
189
|
</div>
|
|
169
190
|
{#if tintOn}
|
|
@@ -177,7 +198,7 @@
|
|
|
177
198
|
{#snippet children({ activeState })}
|
|
178
199
|
{@const forceClass = activeState === 'hover tab' ? 'force-hover' : ''}
|
|
179
200
|
<TabBar tabs={demoTabs} value={selectedDemoTab} class={forceClass} onchange={(id) => (selectedDemoTab = id)} />
|
|
180
|
-
<div class="tab-content-demo">
|
|
201
|
+
<div class="tab-content-demo" data-preview-demo>
|
|
181
202
|
<p style="margin: 0;">placeholder tab content</p>
|
|
182
203
|
</div>
|
|
183
204
|
{/snippet}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<script module lang="ts">
|
|
2
2
|
import { buildTypeGroupColorTokens, buildTypeGroupFontTokens } from './scaffolding/buildTypeGroupTokens';
|
|
3
3
|
import type { Token, TypeGroupConfig } from './scaffolding/types';
|
|
4
|
+
import type { ContrastPair } from '../core/palettes/contrastPairs';
|
|
4
5
|
|
|
5
6
|
export const component = 'table';
|
|
6
7
|
|
|
@@ -72,6 +73,19 @@
|
|
|
72
73
|
...buildTypeGroupColorTokens(typeGroups, derivation),
|
|
73
74
|
...buildTypeGroupFontTokens(typeGroups, derivation),
|
|
74
75
|
];
|
|
76
|
+
|
|
77
|
+
// Every cell sits on the wrapper. Even rows lay the stripe over the row surface.
|
|
78
|
+
const wrapper = '--table-default-surface';
|
|
79
|
+
const textPair = (state: string, backdrop: string[]): ContrastPair => {
|
|
80
|
+
const g = typeGroups[state][0];
|
|
81
|
+
return { foreground: g.colorVariable, backdrop, role: 'text', fontSize: g.sizeVariable, fontWeight: g.weightVariable };
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
export const contrastPairs: ContrastPair[] = [
|
|
85
|
+
textPair('header', ['--table-default-header-surface', wrapper]),
|
|
86
|
+
{ ...textPair('cell', ['--table-default-row-surface', wrapper]), context: 'odd rows' },
|
|
87
|
+
{ ...textPair('cell', ['--table-default-row-stripe-surface', '--table-default-row-surface', wrapper]), context: 'even rows' },
|
|
88
|
+
];
|
|
75
89
|
</script>
|
|
76
90
|
|
|
77
91
|
<script lang="ts">
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
<script module lang="ts">
|
|
2
2
|
import type { Token } from './scaffolding/types';
|
|
3
|
+
import type { ContrastPair } from '../core/palettes/contrastPairs';
|
|
3
4
|
|
|
4
5
|
export const component = 'toggle';
|
|
5
6
|
|
|
@@ -44,6 +45,22 @@
|
|
|
44
45
|
};
|
|
45
46
|
|
|
46
47
|
export const allTokens: Token[] = Object.values(states).flat();
|
|
48
|
+
|
|
49
|
+
const label = { role: 'text', fontSize: '--toggle-label-font-size', fontWeight: '--toggle-label-font-weight' } as const;
|
|
50
|
+
// Each state's thumb paints on its own state's track.
|
|
51
|
+
const thumbOnTrack: [thumb: string, track: string][] = [
|
|
52
|
+
['--toggle-thumb-surface', '--toggle-track-surface'],
|
|
53
|
+
['--toggle-hover-thumb-surface', '--toggle-hover-track-surface'],
|
|
54
|
+
['--toggle-on-thumb-surface', '--toggle-on-track-surface'],
|
|
55
|
+
['--toggle-on-hover-thumb-surface', '--toggle-on-hover-track-surface'],
|
|
56
|
+
];
|
|
57
|
+
|
|
58
|
+
export const contrastPairs: ContrastPair[] = [
|
|
59
|
+
{ foreground: '--toggle-label', backdrop: [], ...label },
|
|
60
|
+
{ foreground: '--toggle-disabled-label', backdrop: [], ...label, inactive: true },
|
|
61
|
+
...thumbOnTrack.map(([thumb, track]): ContrastPair => ({ foreground: thumb, backdrop: [track], role: 'non-text' })),
|
|
62
|
+
{ foreground: '--toggle-disabled-thumb-surface', backdrop: ['--toggle-disabled-track-surface'], role: 'non-text', inactive: true },
|
|
63
|
+
];
|
|
47
64
|
</script>
|
|
48
65
|
|
|
49
66
|
<script lang="ts">
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<script module lang="ts">
|
|
2
2
|
import { buildTypeGroupColorTokens } from './scaffolding/buildTypeGroupTokens';
|
|
3
3
|
import type { Token, TypeGroupConfig } from './scaffolding/types';
|
|
4
|
+
import type { ContrastPair } from '../core/palettes/contrastPairs';
|
|
4
5
|
|
|
5
6
|
export const component = 'tooltip';
|
|
6
7
|
|
|
@@ -38,6 +39,14 @@
|
|
|
38
39
|
...buildTypeGroupColorTokens(typeGroups, { component }),
|
|
39
40
|
...typeGroupTokens,
|
|
40
41
|
];
|
|
42
|
+
|
|
43
|
+
export const contrastPairs: ContrastPair[] = typeGroups.tooltip.map((g) => ({
|
|
44
|
+
foreground: g.colorVariable,
|
|
45
|
+
backdrop: ['--tooltip-surface'],
|
|
46
|
+
role: 'text',
|
|
47
|
+
fontSize: g.sizeVariable,
|
|
48
|
+
fontWeight: g.weightVariable,
|
|
49
|
+
}));
|
|
41
50
|
</script>
|
|
42
51
|
|
|
43
52
|
<script lang="ts">
|
|
@@ -58,10 +67,10 @@
|
|
|
58
67
|
>
|
|
59
68
|
<div class="tooltip-demo-row">
|
|
60
69
|
<Tooltip text={hintText} open>
|
|
61
|
-
<span class="tooltip-demo-target">Helpful Hint</span>
|
|
70
|
+
<span class="tooltip-demo-target" data-preview-demo>Helpful Hint</span>
|
|
62
71
|
</Tooltip>
|
|
63
72
|
<Tooltip text={hintText} position="bottom">
|
|
64
|
-
<span class="tooltip-demo-target">Hover me</span>
|
|
73
|
+
<span class="tooltip-demo-target" data-preview-demo>Hover me</span>
|
|
65
74
|
</Tooltip>
|
|
66
75
|
</div>
|
|
67
76
|
</VariantGroup>
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
<script module lang="ts">
|
|
2
2
|
import type { Token } from './scaffolding/types';
|
|
3
|
+
import type { ContrastPair } from '../core/palettes/contrastPairs';
|
|
3
4
|
|
|
4
5
|
export const component = 'videoframe';
|
|
5
6
|
|
|
@@ -27,6 +28,13 @@
|
|
|
27
28
|
};
|
|
28
29
|
|
|
29
30
|
export const allTokens: Token[] = Object.values(states).flat();
|
|
31
|
+
|
|
32
|
+
// The badge sits over the footage, which sits on the clip and the frame.
|
|
33
|
+
const frameStack = ['--videoframe-clip-surface', '--videoframe-frame-surface'];
|
|
34
|
+
export const contrastPairs: ContrastPair[] = [
|
|
35
|
+
{ foreground: '--videoframe-badge-default-icon', backdrop: ['--videoframe-badge-default-surface', ...frameStack], role: 'non-text' },
|
|
36
|
+
{ foreground: '--videoframe-badge-hover-icon', backdrop: ['--videoframe-badge-hover-surface', ...frameStack], role: 'non-text' },
|
|
37
|
+
];
|
|
30
38
|
</script>
|
|
31
39
|
|
|
32
40
|
<script lang="ts">
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
<script module lang="ts">
|
|
2
2
|
import type { Token } from './scaffolding/types';
|
|
3
|
+
import type { ContrastPair } from '../core/palettes/contrastPairs';
|
|
3
4
|
|
|
4
5
|
export const component = 'videolightbox';
|
|
5
6
|
|
|
@@ -37,6 +38,15 @@
|
|
|
37
38
|
};
|
|
38
39
|
|
|
39
40
|
export const allTokens: Token[] = Object.values(states).flat();
|
|
41
|
+
|
|
42
|
+
// The badge sits over the poster on the tile, and the close button on the scrim.
|
|
43
|
+
const scrim = '--videolightbox-scrim-surface';
|
|
44
|
+
export const contrastPairs: ContrastPair[] = [
|
|
45
|
+
{ foreground: '--videolightbox-badge-default-icon', backdrop: ['--videolightbox-badge-default-surface', '--videolightbox-tile-surface'], role: 'non-text' },
|
|
46
|
+
{ foreground: '--videolightbox-badge-hover-icon', backdrop: ['--videolightbox-badge-hover-surface', '--videolightbox-tile-surface'], role: 'non-text' },
|
|
47
|
+
{ foreground: '--videolightbox-chrome-icon', backdrop: ['--videolightbox-chrome-surface', scrim], role: 'non-text', context: 'default' },
|
|
48
|
+
{ foreground: '--videolightbox-chrome-icon', backdrop: ['--videolightbox-chrome-hover-surface', scrim], role: 'non-text', context: 'hover' },
|
|
49
|
+
];
|
|
40
50
|
</script>
|
|
41
51
|
|
|
42
52
|
<script lang="ts">
|
|
@@ -21,7 +21,8 @@ let sink: Sink | null = null;
|
|
|
21
21
|
* the rest of the session).
|
|
22
22
|
*
|
|
23
23
|
* Side effect: registers the schema with the editor store so reset-to-default
|
|
24
|
-
* and sibling-group resolution work for the new component
|
|
24
|
+
* and sibling-group resolution work for the new component, and registers its
|
|
25
|
+
* contrast pairs, which replace a built-in's pairs on an id collision.
|
|
25
26
|
*/
|
|
26
27
|
export function registerComponent(entry: RegisterComponentEntry): void {
|
|
27
28
|
if (sink) sink(entry);
|