@0001-labs/design-system-1 0.3.0 → 0.3.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.
Files changed (91) hide show
  1. package/DS1/0-face/constraint-panel.ts +27 -6
  2. package/DS1/0-face/constraint-site.ts +3 -2
  3. package/DS1/0-face/constraints.ts +27 -0
  4. package/DS1/0-face/define.ts +1 -1
  5. package/DS1/0-face/fault-lines.ts +159 -0
  6. package/DS1/0-face/generated/toast-assets.ts +1 -1
  7. package/DS1/1-root/card.css +2 -2
  8. package/DS1/1-root/cjk.css +1 -1
  9. package/DS1/1-root/component-tokens.css +12 -0
  10. package/DS1/1-root/context.css +1 -1
  11. package/DS1/1-root/controls.css +8 -8
  12. package/DS1/1-root/document.css +2 -2
  13. package/DS1/1-root/empty.css +2 -2
  14. package/DS1/1-root/figures.css +2 -2
  15. package/DS1/1-root/fonts/Inter-LICENSE.md +91 -2
  16. package/DS1/1-root/fonts.css +5 -4
  17. package/DS1/1-root/footer.css +2 -2
  18. package/DS1/1-root/header.css +5 -4
  19. package/DS1/1-root/inter-arrows.css +11 -0
  20. package/DS1/1-root/notice.css +2 -2
  21. package/DS1/1-root/one.css +5 -4
  22. package/DS1/1-root/progress.css +3 -3
  23. package/DS1/1-root/prose.css +5 -5
  24. package/DS1/1-root/row.css +1 -1
  25. package/DS1/1-root/table.css +1 -1
  26. package/DS1/1-root/text.css +5 -5
  27. package/DS1/2-core/chart/chart.css +1 -1
  28. package/DS1/2-core/ds-avatar.ts +47 -8
  29. package/DS1/2-core/styles/ds-activity.css +1 -1
  30. package/DS1/2-core/styles/ds-avatar.css +1 -1
  31. package/DS1/2-core/styles/ds-badge.css +1 -1
  32. package/DS1/2-core/styles/ds-button-host.css +3 -2
  33. package/DS1/2-core/styles/ds-button-split.css +1 -1
  34. package/DS1/2-core/styles/ds-button.css +5 -4
  35. package/DS1/2-core/styles/ds-composer.css +1 -1
  36. package/DS1/2-core/styles/ds-image.css +1 -1
  37. package/DS1/2-core/styles/ds-input.css +3 -3
  38. package/DS1/2-core/styles/ds-number.css +1 -1
  39. package/DS1/2-core/styles/ds-radio.css +1 -1
  40. package/DS1/2-core/styles/ds-tag.css +3 -2
  41. package/DS1/2-core/styles/ds-text.css +5 -5
  42. package/DS1/2-core/styles/ds-toast.css +1 -1
  43. package/DS1/2-core/styles/ds-token.css +1 -1
  44. package/DS1/2-core/styles/ds-tooltip.css +1 -1
  45. package/DS1/3-unit/context-trigger.ts +29 -2
  46. package/DS1/3-unit/ds-form.ts +2 -1
  47. package/DS1/3-unit/ds-table.ts +2 -1
  48. package/DS1/3-unit/styles/ds-calendar.css +4 -4
  49. package/DS1/3-unit/styles/ds-list.css +1 -1
  50. package/DS1/3-unit/styles/ds-matrix.css +2 -2
  51. package/DS1/3-unit/styles/ds-menu.css +1 -1
  52. package/DS1/3-unit/styles/ds-select.css +1 -1
  53. package/DS1/3-unit/styles/ds-sidebar.css +1 -1
  54. package/DS1/3-unit/styles/ds-table-of-contents.css +1 -1
  55. package/DS1/3-unit/styles/ds-token-field.css +1 -1
  56. package/DS1/4-page/ds-container.ts +2 -1
  57. package/DS1/4-page/styles/ds-overlay.css +1 -1
  58. package/DS1/4-page/styles/ds-page.css +1 -1
  59. package/DS1/4-page/styles/ds-panel.css +1 -1
  60. package/dist/0-face/constraint-panel.d.ts.map +1 -1
  61. package/dist/0-face/constraint-panel.js +28 -6
  62. package/dist/0-face/constraint-site.d.ts +1 -0
  63. package/dist/0-face/constraint-site.d.ts.map +1 -1
  64. package/dist/0-face/constraint-site.js +3 -2
  65. package/dist/0-face/constraints.d.ts.map +1 -1
  66. package/dist/0-face/constraints.js +27 -0
  67. package/dist/0-face/define.js +1 -1
  68. package/dist/0-face/fault-lines.d.ts +20 -0
  69. package/dist/0-face/fault-lines.d.ts.map +1 -0
  70. package/dist/0-face/fault-lines.js +172 -0
  71. package/dist/0-face/generated/toast-assets.d.ts.map +1 -1
  72. package/dist/0-face/generated/toast-assets.js +1 -1
  73. package/dist/2-core/ds-avatar.d.ts +5 -0
  74. package/dist/2-core/ds-avatar.d.ts.map +1 -1
  75. package/dist/2-core/ds-avatar.js +53 -9
  76. package/dist/3-unit/context-trigger.d.ts.map +1 -1
  77. package/dist/3-unit/context-trigger.js +32 -2
  78. package/dist/3-unit/ds-form.d.ts.map +1 -1
  79. package/dist/3-unit/ds-form.js +2 -1
  80. package/dist/3-unit/ds-table.d.ts.map +1 -1
  81. package/dist/3-unit/ds-table.js +2 -1
  82. package/dist/4-page/ds-container.d.ts.map +1 -1
  83. package/dist/4-page/ds-container.js +2 -1
  84. package/dist/design-system-1.bundle.js +406 -66
  85. package/dist/design-system-1.bundle.js.map +1 -1
  86. package/dist/design-system-1.bundle.min.js +3388 -3136
  87. package/dist/design-system-1.bundle.min.js.map +1 -1
  88. package/dist/design-system-1.css +1 -1
  89. package/dist/feedback.js +1 -1
  90. package/dist/feedback.js.map +1 -1
  91. package/package.json +6 -4
@@ -0,0 +1,172 @@
1
+ const tolerance = 1;
2
+ const near = (a, b) => Math.abs(a - b) <= tolerance;
3
+ const style = (el) => el.ownerDocument.defaultView.getComputedStyle(el);
4
+ const visible = (el) => {
5
+ const box = el.getBoundingClientRect();
6
+ return box.width > 0 && box.height > 0 && style(el).visibility !== 'hidden' && style(el).display !== 'none';
7
+ };
8
+ /** Walk each open shadow tree once; slotted children already occur in the light tree. */
9
+ function elements(root) {
10
+ return Array.from(root.querySelectorAll('*')).flatMap(el => [el, ...(el.shadowRoot ? elements(el.shadowRoot) : [])]);
11
+ }
12
+ /** Related grids opt in by name; unlabelled card grids are candidates for human review. */
13
+ export function faultLineGrids(root) {
14
+ return elements(root).flatMap(element => {
15
+ const family = element.getAttribute('data-ds-fault-lines');
16
+ if (family === 'off' || !visible(element))
17
+ return [];
18
+ const children = Array.from(element.children).filter(visible);
19
+ if (!children.length)
20
+ return [];
21
+ if (family === null && (!/grid/.test(style(element).display) || children.length < 2 ||
22
+ !children.every(child => child.matches('ds-card, .ds-card, ds-button, button'))))
23
+ return [];
24
+ const axis = element.getAttribute('data-ds-fault-axis') === 'y' ? 'y' : 'x';
25
+ const boxes = children.map(child => child.getBoundingClientRect());
26
+ const crossStart = (box) => axis === 'x' ? box.top : box.left;
27
+ const crossEnd = (box) => axis === 'x' ? box.bottom : box.right;
28
+ const start = (box) => axis === 'x' ? box.left : box.top;
29
+ const end = (box) => axis === 'x' ? box.right : box.bottom;
30
+ const bands = [];
31
+ for (const box of boxes.sort((a, b) => crossStart(a) - crossStart(b))) {
32
+ const band = bands.find(row => near(crossStart(row[0]), crossStart(box)));
33
+ if (band)
34
+ band.push(box);
35
+ else
36
+ bands.push([box]);
37
+ }
38
+ // The fullest band defines the tracks; an incomplete final row is valid.
39
+ const band = [...bands].sort((a, b) => b.length - a.length)[0].sort((a, b) => start(a) - start(b));
40
+ const lines = band.flatMap(box => [start(box), end(box)]);
41
+ const gaps = band.slice(1).map((box, index) => start(box) - end(band[index]));
42
+ const crossGaps = bands.slice(1).map((row, index) => Math.min(...row.map(crossStart)) - Math.max(...bands[index].map(crossEnd)));
43
+ const internalDrift = bands.some(row => row.length === band.length && row.slice().sort((a, b) => start(a) - start(b)).some((box, index) => !near(start(box), lines[index * 2]) || !near(end(box), lines[index * 2 + 1]))) || crossGaps.some(gap => !near(gap, crossGaps[0]));
44
+ return [{ element, family, axis, lines, gaps, crossGap: crossGaps[0], internalDrift, start: lines[0], end: lines[lines.length - 1] }];
45
+ });
46
+ }
47
+ function referenceFor(grids, i) {
48
+ const current = grids[i];
49
+ return grids.slice(0, i).find(other => {
50
+ if (other.axis !== current.axis || other.lines.length !== current.lines.length)
51
+ return false;
52
+ if (current.family !== null || other.family !== null)
53
+ return current.family !== null && current.family === other.family;
54
+ return near(current.start, other.start) && near(current.end, other.end);
55
+ });
56
+ }
57
+ /** Fault lines compare rendered tracks across separate sections, in the current viewport. */
58
+ export function inspectFaultLines(root) {
59
+ const grids = faultLineGrids(root);
60
+ const findings = [];
61
+ for (let i = 0; i < grids.length; i++) {
62
+ const current = grids[i];
63
+ if (current.internalDrift)
64
+ findings.push({ element: current.element, ...(current.family === null ? { review: true } : {}), message: `Fault lines at ${current.element.ownerDocument.documentElement.clientWidth}px: tracks or repeated gaps drift inside ${current.family || 'this card grid'}. Align its complete rows and repeated spacing.` });
65
+ const reference = referenceFor(grids, i);
66
+ if (!reference)
67
+ continue;
68
+ const drift = current.lines.map((line, index) => Math.abs(line - reference.lines[index]));
69
+ const gapDrift = current.gaps.some((gap, index) => !near(gap, reference.gaps[index]));
70
+ const rowDrift = current.crossGap !== undefined && reference.crossGap !== undefined && !near(current.crossGap, reference.crossGap);
71
+ if (!drift.some(value => value > tolerance) && !gapDrift && !rowDrift)
72
+ continue;
73
+ const width = current.element.ownerDocument.documentElement.clientWidth;
74
+ const review = current.family === null;
75
+ findings.push({ element: current.element, ...(review ? { review: true } : {}), message: `Fault lines at ${width}px: ${current.family || 'these card grids'} ${review ? 'may be related but have' : 'have'} misaligned ${current.axis === 'x' ? 'column' : 'row'} edges or unequal gaps (edge drift ${Math.round(Math.max(...drift))}px; gaps ${current.gaps.map(Math.round).join('/')}px versus ${reference.gaps.map(Math.round).join('/')}px${rowDrift ? `; cross-axis gap ${Math.round(current.crossGap)}px versus ${Math.round(reference.crossGap)}px` : ''}). ${review ? 'Name the related groups with data-ds-fault-lines to enforce alignment, or mark an intentional exception off.' : 'Use the same tracks and gap for this family at this viewport.'}` });
76
+ }
77
+ return findings;
78
+ }
79
+ /** The same rendered geometry as the checker, painted without affecting layout or hit testing. */
80
+ export function paintFaultLines(root, layer) {
81
+ const doc = layer.ownerDocument;
82
+ const width = doc.documentElement.clientWidth;
83
+ const height = doc.defaultView.innerHeight;
84
+ layer.setAttribute('viewBox', `0 0 ${width} ${height}`);
85
+ layer.setAttribute('width', String(width));
86
+ layer.setAttribute('height', String(height));
87
+ layer.setAttribute('aria-hidden', 'true');
88
+ layer.style.cssText = 'position:fixed;inset:0;pointer-events:none;overflow:hidden;z-index:2147483644';
89
+ layer.replaceChildren();
90
+ const grids = faultLineGrids(root);
91
+ const failed = new Set(inspectFaultLines(root).map(finding => finding.element));
92
+ const drawn = new Set();
93
+ const referenceInk = '#087ba8';
94
+ const faultInk = '#de0331';
95
+ function mark(tag, attributes, title) {
96
+ const node = doc.createElementNS('http://www.w3.org/2000/svg', tag);
97
+ for (const [key, value] of Object.entries(attributes))
98
+ node.setAttribute(key, String(value));
99
+ if (title) {
100
+ const tip = doc.createElementNS(node.namespaceURI, 'title');
101
+ tip.textContent = title;
102
+ node.appendChild(tip);
103
+ }
104
+ layer.appendChild(node);
105
+ return node;
106
+ }
107
+ for (let index = 0; index < grids.length; index++) {
108
+ const grid = grids[index];
109
+ const reference = referenceFor(grids, index) ?? grid;
110
+ for (const edge of reference.lines) {
111
+ const key = `${grid.axis}:${edge}`;
112
+ if (drawn.has(key))
113
+ continue;
114
+ drawn.add(key);
115
+ mark('line', { 'data-fault-reference': '', x1: grid.axis === 'x' ? edge : 0, y1: grid.axis === 'y' ? edge : 0,
116
+ x2: grid.axis === 'x' ? edge : width, y2: grid.axis === 'y' ? edge : height,
117
+ stroke: referenceInk, 'stroke-width': 1, 'stroke-dasharray': '4 4' }, 'Reference edge');
118
+ }
119
+ const broken = failed.has(grid.element);
120
+ if (!broken)
121
+ continue;
122
+ // Draw each actual child so drift inside a later row is visible too.
123
+ for (const child of Array.from(grid.element.children).filter(visible)) {
124
+ const box = child.getBoundingClientRect();
125
+ const edges = grid.axis === 'x' ? [box.left, box.right] : [box.top, box.bottom];
126
+ for (const edge of edges) {
127
+ if (reference.lines.some(expected => near(edge, expected)))
128
+ continue;
129
+ mark('line', { 'data-fault-actual': '', x1: grid.axis === 'x' ? edge : box.left, y1: grid.axis === 'y' ? edge : box.top,
130
+ x2: grid.axis === 'x' ? edge : box.right, y2: grid.axis === 'y' ? edge : box.bottom,
131
+ stroke: faultInk, 'stroke-width': 2 }, 'Actual edge differs from the dashed reference');
132
+ }
133
+ }
134
+ // Row spacing can drift even when every column edge still aligns.
135
+ const rows = [];
136
+ for (const child of Array.from(grid.element.children).filter(visible)) {
137
+ const box = child.getBoundingClientRect();
138
+ const start = grid.axis === 'x' ? box.top : box.left;
139
+ const row = rows.find(row => near(grid.axis === 'x' ? row[0].top : row[0].left, start));
140
+ if (row)
141
+ row.push(box);
142
+ else
143
+ rows.push([box]);
144
+ }
145
+ rows.sort((a, b) => grid.axis === 'x' ? a[0].top - b[0].top : a[0].left - b[0].left);
146
+ const bounds = grid.element.getBoundingClientRect();
147
+ const crossGap = reference.crossGap ?? grid.crossGap;
148
+ if (crossGap !== undefined)
149
+ for (let row = 1; row < rows.length; row++) {
150
+ const previousEnd = Math.max(...rows[row - 1].map(box => grid.axis === 'x' ? box.bottom : box.right));
151
+ const actual = Math.min(...rows[row].map(box => grid.axis === 'x' ? box.top : box.left));
152
+ const expected = previousEnd + crossGap;
153
+ if (near(actual, expected))
154
+ continue;
155
+ for (const [edge, kind] of [[expected, 'reference'], [actual, 'actual']]) {
156
+ mark('line', { [`data-fault-${kind}`]: '', x1: grid.axis === 'x' ? bounds.left : edge, y1: grid.axis === 'x' ? edge : bounds.top,
157
+ x2: grid.axis === 'x' ? bounds.right : edge, y2: grid.axis === 'x' ? edge : bounds.bottom,
158
+ stroke: kind === 'reference' ? referenceInk : faultInk, 'stroke-width': kind === 'reference' ? 1 : 2,
159
+ 'stroke-dasharray': kind === 'reference' ? '4 4' : '' }, `Row gap ${Math.round(actual - previousEnd)}px; reference ${Math.round(crossGap)}px`);
160
+ }
161
+ }
162
+ const box = grid.element.getBoundingClientRect();
163
+ const label = mark('text', { 'data-fault-gap': '', x: Math.max(4, box.left), y: Math.max(16, Math.min(height - 4, box.top + 16)),
164
+ fill: faultInk, stroke: 'var(--ds-background-color, white)', 'stroke-width': 3, 'paint-order': 'stroke',
165
+ 'font-family': 'var(--ds-typeface-regular, sans-serif)', 'font-size': 12 });
166
+ const gaps = grid.gaps.map(gap => Math.round(gap)).join('/');
167
+ const expected = reference.gaps.map(gap => Math.round(gap)).join('/');
168
+ label.textContent = `Gap ${gaps || '—'}px · reference ${expected || '—'}px` +
169
+ (grid.crossGap !== undefined && reference.crossGap !== undefined && !near(grid.crossGap, reference.crossGap)
170
+ ? ` · row gap ${Math.round(grid.crossGap)}px / ${Math.round(reference.crossGap)}px` : '');
171
+ }
172
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"toast-assets.d.ts","sourceRoot":"","sources":["../../../DS1/0-face/generated/toast-assets.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,iEAAiE;AACjE,eAAO,MAAM,WAAW,EAAE,MAAq0N,CAAC;AAEh2N,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,OAAO,GAAG,eAAe,GAAG,SAAS,CAAC;AAE5E,qFAAqF;AACrF,eAAO,MAAM,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAK9D,CAAC"}
1
+ {"version":3,"file":"toast-assets.d.ts","sourceRoot":"","sources":["../../../DS1/0-face/generated/toast-assets.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,iEAAiE;AACjE,eAAO,MAAM,WAAW,EAAE,MAAu1N,CAAC;AAEl3N,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,OAAO,GAAG,eAAe,GAAG,SAAS,CAAC;AAE5E,qFAAqF;AACrF,eAAO,MAAM,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAK9D,CAAC"}
@@ -4,7 +4,7 @@
4
4
  * files and run `vp run generate:toast-assets`.
5
5
  */
6
6
  /** The toast's stylesheet, the same one `<ds-toast>` imports. */
7
- export const toastStyles = "[data-ds-shape=\"square\"], :host([data-ds-shape=\"square\"]){--ds-corner-size: 0px;--ds-corner-shape: round;--ds-button-inset: 0.5px}[data-ds-shape=\"rounded\"], :host([data-ds-shape=\"rounded\"]){--ds-corner-size: 4px;--ds-corner-shape: round;--ds-button-inset: 2.5px}[data-ds-shape=\"circular\"], :host([data-ds-shape=\"circular\"]){--ds-corner-size: 999px;--ds-corner-shape: round;--ds-button-inset: 5px}@supports (corner-shape: squircle){[data-ds-shape=\"rounded\"], :host([data-ds-shape=\"rounded\"]){--ds-corner-size: 8px;--ds-corner-shape: squircle}}:root, :host, :where([data-ds-surface]){--ds-unit: calc(var(--ds-1, 20px) * var(--ds-sf, 1));--ds-control-height: calc(var(--ds-control-size, var(--ds-08, 16px)) * var(--ds-sf, 1));--ds-row-height: calc(var(--ds-row-size, var(--ds-1, 20px)) * var(--ds-sf, 1));--ds-type-size-default: calc(var(--ds-text-size, 14px) * var(--ds-sf, 1));--ds-type-size-small: calc(var(--ds-small-text-size, 10px) * var(--ds-sf, 1));--ds-type-size-heading: calc(var(--ds-heading-text-size, 13px) * var(--ds-sf, 1));--ds-type-size-display: calc(var(--ds-display-text-size, 20px) * var(--ds-sf, 1));--ds-type-lineheight-default: calc(var(--ds-text-leading, 16px) * var(--ds-sf, 1));--ds-type-letterspacing-default: calc(var(--ds-text-tracking, -0.3px) * var(--ds-sf, 1));--ds-radius: calc(var(--ds-corner-size, 4px) * var(--ds-sf, 1));--ds-radius-card: calc(var(--ds-card-corner-size, 4px) * var(--ds-sf, 1))}:host{--ds-toast-width: calc(16 * var(--ds-unit));--ds-toast-offset: var(--ds-unit);--ds-toast-gap: calc(var(--ds-unit) - var(--ds-control-height));--ds-toast-background: var(--ds-tooltip-background, light-dark(var(--ds-black, #2a2a2a), var(--ds-white, #ffffff)));--ds-toast-color: var(--ds-tooltip-color, light-dark(var(--ds-white, #ffffff), var(--ds-black, #2a2a2a)));display: contents}section{display: contents}ol{--lift: -1;position: fixed;z-index: 2147483000;inset: auto;overflow: visible;border: 0;background: transparent;color: inherit;box-sizing: border-box;width: min(var(--ds-toast-width), calc(100% - 2 * var(--ds-toast-offset)));height: calc(var(--height) + var(--gaps) * var(--ds-toast-gap));margin: 0;padding: 0;list-style: none;outline: none;pointer-events: none}ol[data-y=\"top\"]{--lift: 1;top: calc(var(--ds-toast-offset) + env(safe-area-inset-top, 0px))}ol[data-y=\"bottom\"]{bottom: calc(var(--ds-toast-offset) + env(safe-area-inset-bottom, 0px))}ol[data-x=\"left\"]{left: var(--ds-toast-offset)}ol[data-x=\"right\"]{right: var(--ds-toast-offset)}ol[data-x=\"center\"]{left: 50%;transform: translateX(-50%)}:host([contained]) ol{position: absolute;z-index: var(--ds-toast-z-index, 60)}:host([contained]) ol[data-y=\"top\"]{top: var(--ds-toast-offset)}:host([contained]) ol[data-y=\"bottom\"]{bottom: var(--ds-toast-offset)}.toast{--swipe: 0px;position: absolute;left: 0;right: 0;box-sizing: border-box;width: max-content;max-width: 100%;overflow: hidden;border-radius: var(--ds-radius);background: var(--ds-toast-background);color: var(--ds-toast-color);font-family: var(--ds-typeface-regular);font-feature-settings: var(--ds-font-features);font-size: var(--ds-type-size-default);line-height: var(--ds-control-height);letter-spacing: var(--ds-type-letterspacing-default);outline: none;touch-action: none;user-select: none;pointer-events: auto;opacity: 0;transition: transform 400ms ease, opacity 400ms ease}ol[data-y=\"bottom\"] .toast{bottom: 0}ol[data-y=\"top\"] .toast{top: 0}ol[data-x=\"center\"] .toast{margin-inline: auto}ol[data-x=\"left\"] .toast{margin-right: auto}ol[data-x=\"right\"] .toast{margin-left: auto}.toast:focus-visible{outline: 2px solid var(--ds-focus-ring);outline-offset: 1px}.toast[data-mounted=\"false\"]{transform: translateY(calc(var(--lift) * -100%))}.toast[data-mounted=\"true\"]{opacity: 1}ol[data-expanded=\"false\"] .toast[data-mounted=\"true\"]{transform: translateY(calc(var(--lift) * var(--index) * var(--ds-toast-gap) + var(--swipe))) scale(calc(1 - var(--index) * 0.05))}ol[data-expanded=\"false\"] .toast[data-front=\"false\"]{height: var(--front-height)}ol[data-expanded=\"false\"] .toast[data-front=\"false\"] .body{opacity: 0}ol[data-expanded=\"true\"] .toast[data-mounted=\"true\"]{transform: translateY(calc(var(--lift) * (var(--offset) + var(--index) * var(--ds-toast-gap)) + var(--swipe)))}.toast[data-visible=\"false\"]{opacity: 0;pointer-events: none}.toast[data-swiping=\"true\"]{transition: none}.toast[data-removed=\"true\"]{opacity: 0;pointer-events: none}.toast[data-removed=\"true\"][data-front=\"true\"]{transform: translateY(calc(var(--lift) * -100%))}.toast[data-swipe-out=\"true\"]{transform: translateY(calc(var(--swipe) + var(--lift) * -100%))}.body{display: flex;align-items: flex-start;gap: calc(4px * var(--ds-sf));box-sizing: border-box;min-height: var(--ds-control-height);padding-inline: calc(4px * var(--ds-sf));transition: opacity 400ms ease}.icon{display: inline-flex;flex: 0 0 auto;align-items: center;justify-content: center;width: var(--ds-control-height);height: var(--ds-control-height);--ds-icon-color: currentColor}.icon:first-child{margin-left: calc(-4px * var(--ds-sf))}.icon > svg, .close > svg{width: calc(14px * var(--ds-sf));height: calc(14px * var(--ds-sf))}.content{flex: 1 1 auto;min-width: 0}.title, .description{white-space: normal;overflow-wrap: anywhere}.description{opacity: 0.7}.button{flex: 0 0 auto;margin: 0 0 0 calc(4px * var(--ds-sf));padding: 0;border: 0;background: none;color: inherit;font: inherit;letter-spacing: inherit;text-decoration: underline;text-underline-offset: 2px;cursor: pointer}a.button{display: inline-block}.button.cancel{opacity: 0.7}.button:focus-visible, .close:focus-visible{outline: 1px solid currentColor;outline-offset: 1px;border-radius: 1px}.close{display: inline-flex;flex: 0 0 auto;align-items: center;justify-content: center;width: var(--ds-control-height);height: var(--ds-control-height);margin: 0 calc(-4px * var(--ds-sf)) 0 0;padding: 0;border: 0;background: none;color: inherit;cursor: pointer;--ds-icon-color: currentColor}.spinner{width: calc(10px * var(--ds-sf));height: calc(10px * var(--ds-sf));box-sizing: border-box;border: 1px solid color-mix(in srgb, currentColor 25%, transparent);border-top-color: currentColor;border-radius: 50%;animation: ds-toast-spin 720ms linear infinite}@keyframes ds-toast-spin{to{transform: rotate(360deg)}}:host([rich-colors]) .toast[data-type=\"success\"]{--ds-toast-background: var(--ds-apple-green)}:host([rich-colors]) .toast[data-type=\"info\"]{--ds-toast-background: var(--ds-zenith-blue)}:host([rich-colors]) .toast[data-type=\"warning\"]{--ds-toast-background: var(--ds-orange)}:host([rich-colors]) .toast[data-type=\"error\"]{--ds-toast-background: var(--ds-tuned-red)}:host([rich-colors]) .toast:is([data-type=\"success\"], [data-type=\"info\"], [data-type=\"warning\"], [data-type=\"error\"]){--ds-toast-color: var(--ds-black)}@media (prefers-reduced-motion: reduce){.toast, .body{transition: none}.spinner{animation: none}}";
7
+ export const toastStyles = "[data-ds-shape=\"square\"], :host([data-ds-shape=\"square\"]){--ds-corner-size: 0px;--ds-corner-shape: round;--ds-button-inset: 0.5px}[data-ds-shape=\"rounded\"], :host([data-ds-shape=\"rounded\"]){--ds-corner-size: 4px;--ds-corner-shape: round;--ds-button-inset: 2.5px}[data-ds-shape=\"circular\"], :host([data-ds-shape=\"circular\"]){--ds-corner-size: 999px;--ds-corner-shape: round;--ds-button-inset: 5px}@supports (corner-shape: squircle){[data-ds-shape=\"rounded\"], :host([data-ds-shape=\"rounded\"]){--ds-corner-size: 8px;--ds-corner-shape: squircle}}:root, :host, :where([data-ds-surface]){--ds-unit: calc(var(--ds-1, 20px) * var(--ds-sf, 1));--ds-control-height: calc(var(--ds-control-size, var(--ds-08, 16px)) * var(--ds-sf, 1));--ds-row-height: calc(var(--ds-row-size, var(--ds-1, 20px)) * var(--ds-sf, 1));--ds-type-size-default: calc(var(--ds-text-size, 14px) * var(--ds-sf, 1));--ds-type-size-small: calc(var(--ds-small-text-size, 10px) * var(--ds-sf, 1));--ds-type-size-heading: calc(var(--ds-heading-text-size, 13px) * var(--ds-sf, 1));--ds-type-size-display: calc(var(--ds-display-text-size, 20px) * var(--ds-sf, 1));--ds-type-lineheight-default: calc(var(--ds-text-leading, 16px) * var(--ds-sf, 1));--ds-type-letterspacing-default: calc(var(--ds-text-tracking, -0.3px) * var(--ds-sf, 1));--ds-radius: calc(var(--ds-corner-size, 4px) * var(--ds-sf, 1));--ds-radius-card: calc(var(--ds-card-corner-size, 4px) * var(--ds-sf, 1))}:host{--ds-toast-width: calc(16 * var(--ds-unit));--ds-toast-offset: var(--ds-unit);--ds-toast-gap: calc(var(--ds-unit) - var(--ds-control-height));--ds-toast-background: var(--ds-tooltip-background, light-dark(var(--ds-black, #2a2a2a), var(--ds-white, #ffffff)));--ds-toast-color: var(--ds-tooltip-color, light-dark(var(--ds-white, #ffffff), var(--ds-black, #2a2a2a)));display: contents}section{display: contents}ol{--lift: -1;position: fixed;z-index: 2147483000;inset: auto;overflow: visible;border: 0;background: transparent;color: inherit;box-sizing: border-box;width: min(var(--ds-toast-width), calc(100% - 2 * var(--ds-toast-offset)));height: calc(var(--height) + var(--gaps) * var(--ds-toast-gap));margin: 0;padding: 0;list-style: none;outline: none;pointer-events: none}ol[data-y=\"top\"]{--lift: 1;top: calc(var(--ds-toast-offset) + env(safe-area-inset-top, 0px))}ol[data-y=\"bottom\"]{bottom: calc(var(--ds-toast-offset) + env(safe-area-inset-bottom, 0px))}ol[data-x=\"left\"]{left: var(--ds-toast-offset)}ol[data-x=\"right\"]{right: var(--ds-toast-offset)}ol[data-x=\"center\"]{left: 50%;transform: translateX(-50%)}:host([contained]) ol{position: absolute;z-index: var(--ds-toast-z-index, 60)}:host([contained]) ol[data-y=\"top\"]{top: var(--ds-toast-offset)}:host([contained]) ol[data-y=\"bottom\"]{bottom: var(--ds-toast-offset)}.toast{--swipe: 0px;position: absolute;left: 0;right: 0;box-sizing: border-box;width: max-content;max-width: 100%;overflow: hidden;border-radius: var(--ds-radius);background: var(--ds-toast-background);color: var(--ds-toast-color);font-family: \"Inter Arrows\", var(--ds-typeface-regular);font-feature-settings: var(--ds-font-features);font-size: var(--ds-type-size-default);line-height: var(--ds-control-height);letter-spacing: var(--ds-type-letterspacing-default);outline: none;touch-action: none;user-select: none;pointer-events: auto;opacity: 0;transition: transform 400ms ease, opacity 400ms ease}ol[data-y=\"bottom\"] .toast{bottom: 0}ol[data-y=\"top\"] .toast{top: 0}ol[data-x=\"center\"] .toast{margin-inline: auto}ol[data-x=\"left\"] .toast{margin-right: auto}ol[data-x=\"right\"] .toast{margin-left: auto}.toast:focus-visible{outline: 2px solid var(--ds-focus-ring);outline-offset: 1px}.toast[data-mounted=\"false\"]{transform: translateY(calc(var(--lift) * -100%))}.toast[data-mounted=\"true\"]{opacity: 1}ol[data-expanded=\"false\"] .toast[data-mounted=\"true\"]{transform: translateY(calc(var(--lift) * var(--index) * var(--ds-toast-gap) + var(--swipe))) scale(calc(1 - var(--index) * 0.05))}ol[data-expanded=\"false\"] .toast[data-front=\"false\"]{height: var(--front-height)}ol[data-expanded=\"false\"] .toast[data-front=\"false\"] .body{opacity: 0}ol[data-expanded=\"true\"] .toast[data-mounted=\"true\"]{transform: translateY(calc(var(--lift) * (var(--offset) + var(--index) * var(--ds-toast-gap)) + var(--swipe)))}.toast[data-visible=\"false\"]{opacity: 0;pointer-events: none}.toast[data-swiping=\"true\"]{transition: none}.toast[data-removed=\"true\"]{opacity: 0;pointer-events: none}.toast[data-removed=\"true\"][data-front=\"true\"]{transform: translateY(calc(var(--lift) * -100%))}.toast[data-swipe-out=\"true\"]{transform: translateY(calc(var(--swipe) + var(--lift) * -100%))}.body{display: flex;align-items: flex-start;gap: calc(4px * var(--ds-sf));box-sizing: border-box;min-height: var(--ds-control-height);padding-inline: calc(4px * var(--ds-sf));transition: opacity 400ms ease}.icon{display: inline-flex;flex: 0 0 auto;align-items: center;justify-content: center;width: var(--ds-control-height);height: var(--ds-control-height);--ds-icon-color: currentColor}.icon:first-child{margin-left: calc(-4px * var(--ds-sf))}.icon > svg, .close > svg{width: calc(14px * var(--ds-sf));height: calc(14px * var(--ds-sf))}.content{flex: 1 1 auto;min-width: 0}.title, .description{white-space: normal;overflow-wrap: anywhere}.description{opacity: 0.7}.button{flex: 0 0 auto;margin: 0 0 0 calc(4px * var(--ds-sf));padding: 0;border: 0;background: none;color: inherit;font: inherit;letter-spacing: inherit;text-decoration: underline;text-underline-offset: 2px;cursor: pointer}a.button{display: inline-block}.button.cancel{opacity: 0.7}.button:focus-visible, .close:focus-visible{outline: 1px solid currentColor;outline-offset: 1px;border-radius: 1px}.close{display: inline-flex;flex: 0 0 auto;align-items: center;justify-content: center;width: var(--ds-control-height);height: var(--ds-control-height);margin: 0 calc(-4px * var(--ds-sf)) 0 0;padding: 0;border: 0;background: none;color: inherit;cursor: pointer;--ds-icon-color: currentColor}.spinner{width: calc(10px * var(--ds-sf));height: calc(10px * var(--ds-sf));box-sizing: border-box;border: 1px solid color-mix(in srgb, currentColor 25%, transparent);border-top-color: currentColor;border-radius: 50%;animation: ds-toast-spin 720ms linear infinite}@keyframes ds-toast-spin{to{transform: rotate(360deg)}}:host([rich-colors]) .toast[data-type=\"success\"]{--ds-toast-background: var(--ds-apple-green)}:host([rich-colors]) .toast[data-type=\"info\"]{--ds-toast-background: var(--ds-zenith-blue)}:host([rich-colors]) .toast[data-type=\"warning\"]{--ds-toast-background: var(--ds-orange)}:host([rich-colors]) .toast[data-type=\"error\"]{--ds-toast-background: var(--ds-tuned-red)}:host([rich-colors]) .toast:is([data-type=\"success\"], [data-type=\"info\"], [data-type=\"warning\"], [data-type=\"error\"]){--ds-toast-color: var(--ds-black)}@media (prefers-reduced-motion: reduce){.toast, .body{transition: none}.spinner{animation: none}}";
8
8
  /** The icons the page toaster draws: the toast types' own and the close button's. */
9
9
  export const toastIcons = {
10
10
  "check": "<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M6.68649 11.884L12.443 6.13601L11.736 5.42715L6.68835 10.4827L4.26399 8.0501L3.55696 8.74525L6.68649 11.884Z\" fill=\"currentColor\"/>\n</svg>\n",
@@ -90,6 +90,11 @@ export declare class Avatar extends LitElement {
90
90
  private failed;
91
91
  static styles: import("lit").CSSResult;
92
92
  constructor();
93
+ private inkObserver?;
94
+ private inkFrame;
95
+ private readonly queueInk;
96
+ connectedCallback(): void;
97
+ disconnectedCallback(): void;
93
98
  protected willUpdate(changed: PropertyValues<this>): void;
94
99
  /** A fill named by a variable (`var(--brand-highlight)`) gets its ink once the browser has resolved it. */
95
100
  protected updated(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"ds-avatar.d.ts","sourceRoot":"","sources":["../../DS1/2-core/ds-avatar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAA4B,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAmBhF,mFAAmF;AACnF,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAK3D;AAED,6GAA6G;AAC7G,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAM9D;AAED;;;;;;;GAOG;AACH,qBAAa,MAAO,SAAQ,UAAU;IACpC,MAAM,CAAC,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAiBf;IACM,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,OAAO,CAAC;IACtB,kEAAkE;IAC1D,KAAK,EAAE,OAAO,GAAG,QAAQ,CAAC;IAClC,2EAA2E;IACnE,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;IAC/C,GAAG,EAAE,OAAO,GAAG,SAAS,CAAC;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACvB,QAAgB,MAAM,CAAU;IAChC,QAAgB,MAAM,CAAU;IAChC,MAAM,CAAC,MAAM,0BAAqB;;IAclC,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC;IAOlD,2GAA2G;IAC3G,SAAS,CAAC,OAAO;IAIjB;oEACgE;IAChE,OAAO,CAAC,UAAU;IAUlB,MAAM;CAoDP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,WAAW,EAAE,MAAM,CAAC;KACrB;CACF"}
1
+ {"version":3,"file":"ds-avatar.d.ts","sourceRoot":"","sources":["../../DS1/2-core/ds-avatar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAA4B,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAsBhF,mFAAmF;AACnF,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAK3D;AAED,6GAA6G;AAC7G,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAM9D;AAED;;;;;;;GAOG;AACH,qBAAa,MAAO,SAAQ,UAAU;IACpC,MAAM,CAAC,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAiBf;IACM,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,OAAO,CAAC;IACtB,kEAAkE;IAC1D,KAAK,EAAE,OAAO,GAAG,QAAQ,CAAC;IAClC,2EAA2E;IACnE,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;IAC/C,GAAG,EAAE,OAAO,GAAG,SAAS,CAAC;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACvB,QAAgB,MAAM,CAAU;IAChC,QAAgB,MAAM,CAAU;IAChC,MAAM,CAAC,MAAM,0BAAqB;;IAclC,OAAO,CAAC,WAAW,CAAC,CAAmB;IACvC,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAGvB;IACF,iBAAiB;IAUjB,oBAAoB;IAMpB,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC;IAOlD,2GAA2G;IAC3G,SAAS,CAAC,OAAO;IAIjB;oEACgE;IAChE,OAAO,CAAC,UAAU;IAwBlB,MAAM;CAoDP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,WAAW,EAAE,MAAM,CAAC;KACrB;CACF"}
@@ -1,6 +1,7 @@
1
1
  import { LitElement, html, nothing, unsafeCSS } from "lit";
2
2
  import { styleMap } from "lit/directives/style-map.js";
3
3
  import { keyed } from "lit/directives/keyed.js";
4
+ import { contrastRatio, colorReader, composite } from "../0-face/text-contrast";
4
5
  import { define } from "../0-face/define";
5
6
  import { provideIcons } from "./ds-icon";
6
7
  import { avatarIcon } from "./generated/icon-avatar";
@@ -10,9 +11,13 @@ import styles from "./styles/ds-avatar.css?inline";
10
11
  provideIcons({ avatar: avatarIcon });
11
12
  /** The ink that reads on a fill: black on a light one, white on a dark one. */
12
13
  const inkOn = (rgb) => {
13
- const linear = rgb.map((n) => (n <= 0.04045 ? n / 12.92 : ((n + 0.055) / 1.055) ** 2.4));
14
- const luminance = linear[0] * 0.2126 + linear[1] * 0.7152 + linear[2] * 0.0722;
15
- return luminance > 0.22 ? "var(--ds-black)" : "var(--ds-white)";
14
+ const fill = [...rgb, 1];
15
+ const white = [1, 1, 1, 1], black = [42 / 255, 42 / 255, 42 / 255, 1];
16
+ if (contrastRatio(black, fill) >= 4.5)
17
+ return "var(--ds-black)";
18
+ if (contrastRatio(white, fill) >= 4.5)
19
+ return "var(--ds-white)";
20
+ return "black";
16
21
  };
17
22
  /** Saved identity colours are hex; their ink must stay legible in either theme. */
18
23
  export function avatarInk(color) {
@@ -43,6 +48,12 @@ export function inkOnResolved(fill) {
43
48
  export class Avatar extends LitElement {
44
49
  constructor() {
45
50
  super();
51
+ this.inkFrame = 0;
52
+ this.queueInk = () => {
53
+ const view = this.ownerDocument.defaultView;
54
+ if (!this.inkFrame)
55
+ this.inkFrame = view.requestAnimationFrame(() => { this.inkFrame = 0; this.resolveInk(); });
56
+ };
46
57
  this.label = "";
47
58
  this.initial = "?";
48
59
  this.src = "";
@@ -54,6 +65,24 @@ export class Avatar extends LitElement {
54
65
  this.fit = "cover";
55
66
  this.logo = this.mask = this.outlined = this.pending = this.plain = this.loaded = this.failed = false;
56
67
  }
68
+ connectedCallback() {
69
+ super.connectedCallback();
70
+ const view = this.ownerDocument.defaultView;
71
+ this.inkObserver = new view.MutationObserver(this.queueInk);
72
+ // Observe only the painted ancestors, never our own shadow's ink writes.
73
+ for (let parent = this; parent; parent = parent.parentElement ?? parent.getRootNode().host ?? null) {
74
+ this.inkObserver.observe(parent, { attributes: true, attributeFilter: ['class', 'style', 'data-theme'] });
75
+ }
76
+ view.addEventListener('load', this.queueInk, true);
77
+ }
78
+ disconnectedCallback() {
79
+ super.disconnectedCallback();
80
+ this.inkObserver?.disconnect();
81
+ const view = this.ownerDocument.defaultView;
82
+ view.cancelAnimationFrame(this.inkFrame);
83
+ this.inkFrame = 0;
84
+ view.removeEventListener('load', this.queueInk, true);
85
+ }
57
86
  willUpdate(changed) {
58
87
  if (changed.has("src")) {
59
88
  this.loaded = false;
@@ -63,7 +92,7 @@ export class Avatar extends LitElement {
63
92
  }
64
93
  /** A fill named by a variable (`var(--brand-highlight)`) gets its ink once the browser has resolved it. */
65
94
  updated() {
66
- if (this.ink || this.pending || this.plain || !this.color || avatarInk(this.color))
95
+ if (this.ink || this.pending || this.plain)
67
96
  return;
68
97
  this.resolveInk();
69
98
  }
@@ -73,13 +102,28 @@ export class Avatar extends LitElement {
73
102
  const frame = this.renderRoot.querySelector(".frame");
74
103
  if (!frame || !this.isConnected)
75
104
  return;
76
- const ink = inkOnResolved(getComputedStyle(frame).backgroundColor);
77
- if (ink) {
78
- frame.style.color = ink;
105
+ if (this.ink || this.pending || this.plain)
106
+ return;
107
+ const view = this.ownerDocument.defaultView;
108
+ const read = colorReader(this.ownerDocument);
109
+ let fill = read(view.getComputedStyle(frame).backgroundColor);
110
+ if (fill && fill[3] > 0) {
111
+ for (let parent = this; parent && fill[3] < 1; parent = parent.parentElement ?? parent.getRootNode().host ?? null) {
112
+ const background = read(view.getComputedStyle(parent).backgroundColor);
113
+ if (background)
114
+ fill = composite(fill, background);
115
+ }
116
+ if (fill[3] < 1)
117
+ return;
118
+ const tokens = view.getComputedStyle(this);
119
+ const black = read(tokens.getPropertyValue('--ds-black').trim()), white = read(tokens.getPropertyValue('--ds-white').trim());
120
+ const ink = black && contrastRatio(black, fill) >= 4.5 ? 'var(--ds-black)' : white && contrastRatio(white, fill) >= 4.5 ? 'var(--ds-white)' : contrastRatio([0, 0, 0, 1], fill) >= 4.5 ? 'black' : 'white';
121
+ if (frame.style.color !== ink)
122
+ frame.style.color = ink;
79
123
  return;
80
124
  }
81
125
  if (tries < 60)
82
- requestAnimationFrame(() => this.resolveInk(tries + 1));
126
+ this.ownerDocument.defaultView.requestAnimationFrame(() => this.resolveInk(tries + 1));
83
127
  if (tries === 0 && this.ownerDocument.readyState !== "complete") {
84
128
  this.ownerDocument.defaultView?.addEventListener("load", () => this.resolveInk(60), { once: true });
85
129
  }
@@ -96,7 +140,7 @@ export class Avatar extends LitElement {
96
140
  >`;
97
141
  return html `<span
98
142
  class="frame"
99
- style=${styleMap({ backgroundColor: !this.pending && !this.plain ? this.color || undefined : undefined, color: !this.pending ? this.ink || avatarInk(this.color) : undefined })}
143
+ style=${styleMap({ backgroundColor: !this.pending && !this.plain ? this.color || undefined : undefined, color: !this.pending ? this.ink || (!this.plain ? avatarInk(this.color) : undefined) : undefined })}
100
144
  role=${this.label ? "img" : nothing}
101
145
  aria-label=${this.label || nothing}
102
146
  aria-hidden=${this.label ? nothing : "true"}
@@ -1 +1 @@
1
- {"version":3,"file":"context-trigger.d.ts","sourceRoot":"","sources":["../../DS1/3-unit/context-trigger.ts"],"names":[],"mappings":"AAAA,OAAO,8BAA8B,CAAC;AAEtC,yGAAyG;AACzG,eAAO,MAAM,UAAU,MAAM,CAAC;AAE9B,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,YAAY,GAAG,aAAa,CAAC;AACvE,MAAM,MAAM,YAAY,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AACpD,KAAK,OAAO,GAAG;IACb,wEAAwE;IACxE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,WAAW,GAAG,IAAI,CAAC;IACxD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,iFAAiF;IACjF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF;gFACgF;AAChF,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,cAAc,KAAK,IAAI,GAAG,KAAK,EACxF,EAAE,OAAuB,EAAE,KAAY,EAAE,SAAiB,EAAE,IAAW,EAAE,GAAE,OAAY;;;EAqFxF"}
1
+ {"version":3,"file":"context-trigger.d.ts","sourceRoot":"","sources":["../../DS1/3-unit/context-trigger.ts"],"names":[],"mappings":"AAAA,OAAO,8BAA8B,CAAC;AAEtC,yGAAyG;AACzG,eAAO,MAAM,UAAU,MAAM,CAAC;AAE9B,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,YAAY,GAAG,aAAa,CAAC;AACvE,MAAM,MAAM,YAAY,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AACpD,KAAK,OAAO,GAAG;IACb,wEAAwE;IACxE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,WAAW,GAAG,IAAI,CAAC;IACxD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,iFAAiF;IACjF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF;gFACgF;AAChF,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,cAAc,KAAK,IAAI,GAAG,KAAK,EACxF,EAAE,OAAuB,EAAE,KAAY,EAAE,SAAiB,EAAE,IAAW,EAAE,GAAE,OAAY;;;EAgHxF"}
@@ -12,6 +12,7 @@ export function bindContextMenuTrigger(trigger, open, { resolve = () => trigger,
12
12
  let suppressed = null;
13
13
  let release;
14
14
  let disposed = false;
15
+ let mousePress;
15
16
  if (aria)
16
17
  trigger.setAttribute("aria-haspopup", "menu");
17
18
  if (selection)
@@ -38,6 +39,7 @@ export function bindContextMenuTrigger(trigger, open, { resolve = () => trigger,
38
39
  release = setTimeout(clearSuppression, 1000);
39
40
  };
40
41
  const cancel = () => {
42
+ mousePress = undefined;
41
43
  clearTimeout(timer);
42
44
  timer = undefined;
43
45
  point = undefined;
@@ -52,7 +54,28 @@ export function bindContextMenuTrigger(trigger, open, { resolve = () => trigger,
52
54
  const context = (event) => {
53
55
  if (event.defaultPrevented)
54
56
  return;
55
- const control = resolve(event);
57
+ // Settling a transform on pointerdown can move another row beneath the
58
+ // pointer before Chromium hit-tests contextmenu. Keep the initiating row.
59
+ const pressed = mousePress;
60
+ mousePress = undefined;
61
+ const followsPress = pressed && event.button === 2 && Math.hypot(event.clientX - pressed.event.clientX, event.clientY - pressed.event.clientY) <= 10;
62
+ // Native events lose their composed path after dispatch. Delegated and
63
+ // shadow-root controls still need the original path and unretargeted target.
64
+ const gesture = followsPress ? new Proxy(pressed.event, {
65
+ get(target, key) {
66
+ if (key === "composedPath")
67
+ return () => pressed.path;
68
+ if (key === "target")
69
+ return pressed.target;
70
+ const value = Reflect.get(target, key, target);
71
+ return typeof value === "function" ? value.bind(target) : value;
72
+ },
73
+ }) : event;
74
+ // Adopted controls retain their creating realm’s prototype; ownerDocument
75
+ // alone cannot choose an instanceof constructor. Containment stays authoritative.
76
+ if (gesture !== event && (typeof gesture.target?.nodeType !== "number" || !trigger.contains(gesture.target)))
77
+ return;
78
+ const control = resolve(gesture);
56
79
  if (!control || !enabled(control))
57
80
  return;
58
81
  cancel();
@@ -60,7 +83,7 @@ export function bindContextMenuTrigger(trigger, open, { resolve = () => trigger,
60
83
  event.preventDefault();
61
84
  return;
62
85
  }
63
- if (open({ x: event.clientX, y: event.clientY }, control, event) === false)
86
+ if (open({ x: event.clientX, y: event.clientY }, control, gesture) === false)
64
87
  return;
65
88
  event.preventDefault();
66
89
  if (selection && event.button === 0)
@@ -107,6 +130,11 @@ export function bindContextMenuTrigger(trigger, open, { resolve = () => trigger,
107
130
  arm(control);
108
131
  }, LONG_PRESS);
109
132
  };
133
+ const rememberMouse = (event) => {
134
+ mousePress = !event.defaultPrevented && event.pointerType === "mouse" && event.button === 2 ? { event, path: event.composedPath(), target: event.target } : undefined;
135
+ };
136
+ trigger.addEventListener("pointerdown", rememberMouse, true);
137
+ trigger.addEventListener("pointercancel", cancel, true);
110
138
  trigger.addEventListener("contextmenu", context);
111
139
  trigger.addEventListener("keydown", key);
112
140
  trigger.addEventListener("pointerdown", press);
@@ -119,6 +147,8 @@ export function bindContextMenuTrigger(trigger, open, { resolve = () => trigger,
119
147
  trigger.removeEventListener("contextmenu", context);
120
148
  trigger.removeEventListener("keydown", key);
121
149
  trigger.removeEventListener("pointerdown", press);
150
+ trigger.removeEventListener("pointerdown", rememberMouse, true);
151
+ trigger.removeEventListener("pointercancel", cancel, true);
122
152
  if (aria) {
123
153
  if (previousAria === null)
124
154
  trigger.removeAttribute("aria-haspopup");
@@ -1 +1 @@
1
- {"version":3,"file":"ds-form.d.ts","sourceRoot":"","sources":["../../DS1/3-unit/ds-form.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAE5C,MAAM,WAAW,QAAQ;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;CACjD;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;CACnC;AAKD,qBAAa,IAAK,SAAQ,UAAU;IAClC,MAAM,CAAC,UAAU;;;;;;;;;;;;;;;;;;;;;MAOf;IAEM,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,IAAI,GAAG,KAAK,CAAC;IAC3B,aAAa,EAAE,OAAO,CAAC;;IAY/B,MAAM,CAAC,MAAM,0BAyBX;IAEF;;OAEG;IACH,WAAW,IAAI,QAAQ;IAYvB,OAAO,CAAC,gBAAgB;IA8BxB;;OAEG;IACH,QAAQ,IAAI,oBAAoB;IAoBhC,OAAO,CAAC,gBAAgB;IAmCxB;;OAEG;IACH,KAAK,IAAI,IAAI;IAWb,OAAO,CAAC,aAAa;IA0BrB;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAyD7B,OAAO,CAAC,aAAa;IAMrB,iBAAiB,IAAI,IAAI;IAMzB,oBAAoB,IAAI,IAAI;IAM5B;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB,CAcxB;IAEF,OAAO,CAAC,cAAc,CAQpB;IAEF,MAAM;CAcP;AAID,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,SAAS,EAAE,IAAI,CAAC;KACjB;CACF"}
1
+ {"version":3,"file":"ds-form.d.ts","sourceRoot":"","sources":["../../DS1/3-unit/ds-form.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAE5C,MAAM,WAAW,QAAQ;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;CACjD;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;CACnC;AAKD,qBAAa,IAAK,SAAQ,UAAU;IAClC,MAAM,CAAC,UAAU;;;;;;;;;;;;;;;;;;;;;MAOf;IAEM,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,IAAI,GAAG,KAAK,CAAC;IAC3B,aAAa,EAAE,OAAO,CAAC;;IAY/B,MAAM,CAAC,MAAM,0BAyBX;IAEF;;OAEG;IACH,WAAW,IAAI,QAAQ;IAYvB,OAAO,CAAC,gBAAgB;IA8BxB;;OAEG;IACH,QAAQ,IAAI,oBAAoB;IAoBhC,OAAO,CAAC,gBAAgB;IAmCxB;;OAEG;IACH,KAAK,IAAI,IAAI;IAWb,OAAO,CAAC,aAAa;IA0BrB;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAyD7B,OAAO,CAAC,aAAa;IAMrB,iBAAiB,IAAI,IAAI;IAMzB,oBAAoB,IAAI,IAAI;IAM5B;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB,CAcxB;IAEF,OAAO,CAAC,cAAc,CAQpB;IAEF,MAAM;CAcP;AAID,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,SAAS,EAAE,IAAI,CAAC;KACjB;CACF"}
@@ -1,3 +1,4 @@
1
+ import { define } from "../0-face/define";
1
2
  // ds-form.ts
2
3
  // Form component for handling form submissions and validation
3
4
  import { LitElement, html, css } from "lit";
@@ -279,4 +280,4 @@ Form.styles = css `
279
280
  pointer-events: none;
280
281
  }
281
282
  `;
282
- customElements.define("ds-form", Form);
283
+ define("ds-form", Form);
@@ -1 +1 @@
1
- {"version":3,"file":"ds-table.d.ts","sourceRoot":"","sources":["../../DS1/3-unit/ds-table.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ds-table.d.ts","sourceRoot":"","sources":["../../DS1/3-unit/ds-table.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { define } from "../0-face/define";
1
2
  // ds-table.ts
2
3
  // A data table: rows one square high on hairlines, drawn from data with the
3
4
  // same rules as a native `<table class="ds-table">` (1-root/table.css). With
@@ -468,4 +469,4 @@ function text(value) {
468
469
  return "";
469
470
  return typeof value === "number" ? value.toLocaleString() : String(value);
470
471
  }
471
- customElements.define("ds-table", DsTable);
472
+ define("ds-table", DsTable);
@@ -1 +1 @@
1
- {"version":3,"file":"ds-container.d.ts","sourceRoot":"","sources":["../../DS1/4-page/ds-container.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAmB,MAAM,KAAK,CAAC;AAGlD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,UAAU,GAAG,IAAI,CAAC;KAC5D;IACD,IAAI,cAAc,EAAE,qBAAqB,CAAC;CAC3C;AAED,qBAAa,SAAU,SAAQ,UAAU;IACvC,MAAM,CAAC,MAAM,0BAAqB;IAElC,MAAM;CAGP;AAID,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,cAAc,EAAE,SAAS,CAAC;KAC3B;CACF"}
1
+ {"version":3,"file":"ds-container.d.ts","sourceRoot":"","sources":["../../DS1/4-page/ds-container.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAmB,MAAM,KAAK,CAAC;AAGlD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,UAAU,GAAG,IAAI,CAAC;KAC5D;IACD,IAAI,cAAc,EAAE,qBAAqB,CAAC;CAC3C;AAED,qBAAa,SAAU,SAAQ,UAAU;IACvC,MAAM,CAAC,MAAM,0BAAqB;IAElC,MAAM;CAGP;AAID,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,cAAc,EAAE,SAAS,CAAC;KAC3B;CACF"}
@@ -1,3 +1,4 @@
1
+ import { define } from "../0-face/define";
1
2
  // ds-container.ts
2
3
  // Container component with responsive width constraints
3
4
  import { LitElement, html, unsafeCSS } from "lit";
@@ -8,4 +9,4 @@ export class Container extends LitElement {
8
9
  }
9
10
  }
10
11
  Container.styles = unsafeCSS(styles);
11
- customElements.define("ds-container", Container);
12
+ define("ds-container", Container);