@helixui/library 3.3.1-next.115 → 3.3.1-next.118
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/custom-elements.json +445 -276
- package/dist/components/hx-accordion/hx-accordion-item.d.ts +35 -0
- package/dist/components/hx-accordion/hx-accordion-item.d.ts.map +1 -1
- package/dist/components/hx-checkbox/hx-checkbox.d.ts +153 -1
- package/dist/components/hx-checkbox/hx-checkbox.d.ts.map +1 -1
- package/dist/components/hx-checkbox/hx-checkbox.styles.d.ts.map +1 -1
- package/dist/components/hx-checkbox/index.js +1 -1
- package/dist/components/hx-checkbox-group/hx-checkbox-group.d.ts +151 -2
- package/dist/components/hx-checkbox-group/hx-checkbox-group.d.ts.map +1 -1
- package/dist/components/hx-checkbox-group/index.js +1 -1
- package/dist/components/hx-color-picker/hx-color-picker.d.ts +163 -1
- package/dist/components/hx-color-picker/hx-color-picker.d.ts.map +1 -1
- package/dist/components/hx-color-picker/hx-color-picker.styles.d.ts.map +1 -1
- package/dist/components/hx-color-picker/index.js +1 -1
- package/dist/components/hx-combobox/hx-combobox.d.ts +311 -2
- package/dist/components/hx-combobox/hx-combobox.d.ts.map +1 -1
- package/dist/components/hx-combobox/index.js +1 -1
- package/dist/components/hx-date-picker/hx-date-picker.d.ts +182 -56
- package/dist/components/hx-date-picker/hx-date-picker.d.ts.map +1 -1
- package/dist/components/hx-date-picker/hx-date-picker.styles.d.ts.map +1 -1
- package/dist/components/hx-date-picker/index.js +1 -1
- package/dist/components/hx-dialog/hx-dialog.d.ts +240 -0
- package/dist/components/hx-dialog/hx-dialog.d.ts.map +1 -1
- package/dist/components/hx-dialog/index.js +1 -1
- package/dist/components/hx-dropdown/hx-dropdown.d.ts +80 -0
- package/dist/components/hx-dropdown/hx-dropdown.d.ts.map +1 -1
- package/dist/components/hx-dropdown/index.js +1 -1
- package/dist/components/hx-field/hx-field.d.ts +109 -0
- package/dist/components/hx-field/hx-field.d.ts.map +1 -1
- package/dist/components/hx-field/index.js +1 -1
- package/dist/components/hx-popover/hx-popover.d.ts +91 -0
- package/dist/components/hx-popover/hx-popover.d.ts.map +1 -1
- package/dist/components/hx-popover/index.js +1 -1
- package/dist/components/hx-radio-group/hx-radio-group.d.ts +152 -1
- package/dist/components/hx-radio-group/hx-radio-group.d.ts.map +1 -1
- package/dist/components/hx-radio-group/hx-radio.d.ts +14 -0
- package/dist/components/hx-radio-group/hx-radio.d.ts.map +1 -1
- package/dist/components/hx-radio-group/index.js +1 -1
- package/dist/components/hx-select/hx-select.d.ts +303 -2
- package/dist/components/hx-select/hx-select.d.ts.map +1 -1
- package/dist/components/hx-select/hx-select.styles.d.ts.map +1 -1
- package/dist/components/hx-select/index.js +1 -1
- package/dist/components/hx-side-nav/hx-nav-item.styles.d.ts.map +1 -1
- package/dist/components/hx-side-nav/index.js +1 -1
- package/dist/components/hx-switch/hx-switch.d.ts +78 -1
- package/dist/components/hx-switch/hx-switch.d.ts.map +1 -1
- package/dist/components/hx-switch/hx-switch.styles.d.ts.map +1 -1
- package/dist/components/hx-switch/index.js +1 -1
- package/dist/components/hx-toggle-button/hx-toggle-button.d.ts +110 -0
- package/dist/components/hx-toggle-button/hx-toggle-button.d.ts.map +1 -1
- package/dist/components/hx-toggle-button/hx-toggle-button.styles.d.ts.map +1 -1
- package/dist/components/hx-toggle-button/index.js +1 -1
- package/dist/components/hx-tooltip/hx-tooltip.d.ts +52 -0
- package/dist/components/hx-tooltip/hx-tooltip.d.ts.map +1 -1
- package/dist/components/hx-tooltip/index.js +1 -1
- package/dist/css/helix-all.css +98 -1
- package/dist/css/helix-forms.css +98 -1
- package/dist/css/hx-checkbox.css +18 -0
- package/dist/css/hx-color-picker.css +25 -0
- package/dist/css/hx-date-picker.css +2 -1
- package/dist/css/hx-select.css +19 -0
- package/dist/css/hx-switch.css +17 -0
- package/dist/css/hx-toggle-button.css +17 -0
- package/dist/css/index.css +1 -1
- package/dist/css/manifest.json +2 -1
- package/dist/index.js +15 -15
- package/dist/shared/aria-flatten-DY6v2vah.js +22 -0
- package/dist/shared/aria-flatten-DY6v2vah.js.map +1 -0
- package/dist/shared/aria-idref-Q0yiSR3p.js +104 -0
- package/dist/shared/aria-idref-Q0yiSR3p.js.map +1 -0
- package/dist/shared/hx-accordion-ZVzgDzTG.js.map +1 -1
- package/dist/shared/hx-checkbox-BdgoUeWi.js +696 -0
- package/dist/shared/hx-checkbox-BdgoUeWi.js.map +1 -0
- package/dist/shared/hx-checkbox-group-LWezHrvS.js +496 -0
- package/dist/shared/hx-checkbox-group-LWezHrvS.js.map +1 -0
- package/dist/shared/hx-color-picker-DVhZl88b.js +1221 -0
- package/dist/shared/hx-color-picker-DVhZl88b.js.map +1 -0
- package/dist/shared/hx-combobox-DvlezcDV.js +1359 -0
- package/dist/shared/hx-combobox-DvlezcDV.js.map +1 -0
- package/dist/shared/{hx-date-picker-2iRG1p74.js → hx-date-picker-N-0aG5XL.js} +542 -206
- package/dist/shared/hx-date-picker-N-0aG5XL.js.map +1 -0
- package/dist/shared/hx-dialog-DzB7VytW.js +717 -0
- package/dist/shared/hx-dialog-DzB7VytW.js.map +1 -0
- package/dist/shared/{hx-dropdown-LyaRc8Rf.js → hx-dropdown-DJWlF94E.js} +130 -77
- package/dist/shared/hx-dropdown-DJWlF94E.js.map +1 -0
- package/dist/shared/{hx-field-B3Qo8OLS.js → hx-field-zw0U1KVi.js} +99 -38
- package/dist/shared/hx-field-zw0U1KVi.js.map +1 -0
- package/dist/shared/{hx-nav-item-xqRPOCWX.js → hx-nav-item-CODtUlew.js} +13 -9
- package/dist/shared/{hx-nav-item-xqRPOCWX.js.map → hx-nav-item-CODtUlew.js.map} +1 -1
- package/dist/shared/{hx-popover-B-FP3-wW.js → hx-popover-CHxWY_cd.js} +123 -66
- package/dist/shared/hx-popover-CHxWY_cd.js.map +1 -0
- package/dist/shared/hx-radio-CeGzARNk.js +822 -0
- package/dist/shared/hx-radio-CeGzARNk.js.map +1 -0
- package/dist/shared/hx-select-DrcS-YRJ.js +1089 -0
- package/dist/shared/hx-select-DrcS-YRJ.js.map +1 -0
- package/dist/shared/hx-switch-BX_8uNUs.js +540 -0
- package/dist/shared/hx-switch-BX_8uNUs.js.map +1 -0
- package/dist/shared/{hx-toggle-button-iLiYrMbD.js → hx-toggle-button-Dcz9IlUm.js} +226 -65
- package/dist/shared/hx-toggle-button-Dcz9IlUm.js.map +1 -0
- package/dist/shared/{hx-tooltip-nYOv9OLu.js → hx-tooltip-DVqtKPCD.js} +68 -46
- package/dist/shared/hx-tooltip-DVqtKPCD.js.map +1 -0
- package/dist/utils/aria-flatten.d.ts +56 -0
- package/dist/utils/aria-flatten.d.ts.map +1 -0
- package/dist/utils/aria-idref.d.ts +127 -0
- package/dist/utils/aria-idref.d.ts.map +1 -0
- package/figma-inventory.json +64 -1
- package/package.json +2 -2
- package/dist/shared/hx-checkbox-D7xma9YH.js +0 -524
- package/dist/shared/hx-checkbox-D7xma9YH.js.map +0 -1
- package/dist/shared/hx-checkbox-group-C9n315Ju.js +0 -323
- package/dist/shared/hx-checkbox-group-C9n315Ju.js.map +0 -1
- package/dist/shared/hx-color-picker-uRc865FJ.js +0 -882
- package/dist/shared/hx-color-picker-uRc865FJ.js.map +0 -1
- package/dist/shared/hx-combobox-DDzqNKEW.js +0 -924
- package/dist/shared/hx-combobox-DDzqNKEW.js.map +0 -1
- package/dist/shared/hx-date-picker-2iRG1p74.js.map +0 -1
- package/dist/shared/hx-dialog-DRN_1-Y-.js +0 -514
- package/dist/shared/hx-dialog-DRN_1-Y-.js.map +0 -1
- package/dist/shared/hx-dropdown-LyaRc8Rf.js.map +0 -1
- package/dist/shared/hx-field-B3Qo8OLS.js.map +0 -1
- package/dist/shared/hx-popover-B-FP3-wW.js.map +0 -1
- package/dist/shared/hx-radio-CJvNU2yP.js +0 -621
- package/dist/shared/hx-radio-CJvNU2yP.js.map +0 -1
- package/dist/shared/hx-select-C8fEHQhC.js +0 -807
- package/dist/shared/hx-select-C8fEHQhC.js.map +0 -1
- package/dist/shared/hx-switch-BrZFaRue.js +0 -420
- package/dist/shared/hx-switch-BrZFaRue.js.map +0 -1
- package/dist/shared/hx-toggle-button-iLiYrMbD.js.map +0 -1
- package/dist/shared/hx-tooltip-nYOv9OLu.js.map +0 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { css as g, html as
|
|
2
|
-
import { property as d, state as
|
|
1
|
+
import { css as g, html as b } from "lit";
|
|
2
|
+
import { property as d, state as y, query as p, customElement as w } from "lit/decorators.js";
|
|
3
3
|
import { a as T } from "./forced-colors-CTEDFRGa.js";
|
|
4
4
|
import { H as D } from "./helix-element-BNEYeiys.js";
|
|
5
|
-
import { c as
|
|
6
|
-
const
|
|
5
|
+
import { c as S } from "./id-counter-DuX8vsui.js";
|
|
6
|
+
const C = g`
|
|
7
7
|
:host {
|
|
8
8
|
display: inline-block;
|
|
9
9
|
}
|
|
@@ -68,15 +68,15 @@ const E = g`
|
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
70
|
`;
|
|
71
|
-
var
|
|
72
|
-
for (var s =
|
|
73
|
-
(h = t[
|
|
74
|
-
return
|
|
71
|
+
var E = Object.defineProperty, O = Object.getOwnPropertyDescriptor, n = (t, e, i, o) => {
|
|
72
|
+
for (var s = o > 1 ? void 0 : o ? O(e, i) : e, l = t.length - 1, h; l >= 0; l--)
|
|
73
|
+
(h = t[l]) && (s = (o ? h(e, i, s) : h(s)) || s);
|
|
74
|
+
return o && s && E(e, i, s), s;
|
|
75
75
|
};
|
|
76
|
-
const
|
|
77
|
-
let
|
|
76
|
+
const $ = S("hx-tooltip");
|
|
77
|
+
let r = class extends D {
|
|
78
78
|
constructor() {
|
|
79
|
-
super(...arguments), this.placement = "top", this.showDelay = 300, this.hideDelay = 100, this._visible = !1, this._showTimer = null, this._hideTimer = null, this._tooltipId =
|
|
79
|
+
super(...arguments), this.placement = "top", this.showDelay = 300, this.hideDelay = 100, this._visible = !1, this._showTimer = null, this._hideTimer = null, this._tooltipId = $(), this._lightDomDescription = null, this._contentSlotTextObserver = null, this._handleKeydown = (t) => {
|
|
80
80
|
t instanceof KeyboardEvent && t.key === "Escape" && this._visible && (this._clearTimers(), this._hide());
|
|
81
81
|
};
|
|
82
82
|
}
|
|
@@ -85,8 +85,8 @@ let o = class extends D {
|
|
|
85
85
|
super.connectedCallback(), this.addEventListener("keydown", this._handleKeydown), this.hasUpdated && this._setupTriggerAria();
|
|
86
86
|
}
|
|
87
87
|
disconnectedCallback() {
|
|
88
|
-
var t;
|
|
89
|
-
super.disconnectedCallback(), this.removeEventListener("keydown", this._handleKeydown), this._clearTimers(), (t = this._lightDomDescription) == null || t.remove(), this._lightDomDescription = null;
|
|
88
|
+
var t, e;
|
|
89
|
+
super.disconnectedCallback(), this.removeEventListener("keydown", this._handleKeydown), this._clearTimers(), (t = this._lightDomDescription) == null || t.remove(), this._lightDomDescription = null, (e = this._contentSlotTextObserver) == null || e.disconnect(), this._contentSlotTextObserver = null;
|
|
90
90
|
}
|
|
91
91
|
firstUpdated() {
|
|
92
92
|
this._setupTriggerAria();
|
|
@@ -96,8 +96,30 @@ let o = class extends D {
|
|
|
96
96
|
_setupTriggerAria() {
|
|
97
97
|
const t = this._defaultSlot;
|
|
98
98
|
if (!t) return;
|
|
99
|
-
const e = t.assignedElements()[0], i = this._contentSlot,
|
|
100
|
-
!this._lightDomDescription && typeof document < "u" && (this._lightDomDescription = document.createElement("span"), this._lightDomDescription.id = this._tooltipId, this._lightDomDescription.style.cssText = "position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0", document.body.appendChild(this._lightDomDescription)), this._lightDomDescription && (this._lightDomDescription.textContent =
|
|
99
|
+
const e = t.assignedElements()[0], i = this._contentSlot, o = (i == null ? void 0 : i.assignedElements()) ?? [], s = o.map((l) => l.textContent).join(" ").trim();
|
|
100
|
+
!this._lightDomDescription && typeof document < "u" && (this._lightDomDescription = document.createElement("span"), this._lightDomDescription.id = this._tooltipId, this._lightDomDescription.style.cssText = "position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0", document.body.appendChild(this._lightDomDescription)), this._lightDomDescription && (this._lightDomDescription.textContent = s), e && e.setAttribute("aria-describedby", this._tooltipId), this._installContentSlotTextObserver(o);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* (Re-)installs the slotted-content text observer over the deduped union
|
|
104
|
+
* of assigned `content` slot elements. Disconnects any previous observer
|
|
105
|
+
* before re-attaching so observer count is bounded by component lifetime,
|
|
106
|
+
* not by `slotchange` event count.
|
|
107
|
+
* @internal
|
|
108
|
+
*/
|
|
109
|
+
_installContentSlotTextObserver(t) {
|
|
110
|
+
if (this._contentSlotTextObserver && (this._contentSlotTextObserver.disconnect(), this._contentSlotTextObserver = null), t.length === 0 || typeof MutationObserver > "u") return;
|
|
111
|
+
const e = new Set(t), i = new MutationObserver(() => {
|
|
112
|
+
if (!this._lightDomDescription) return;
|
|
113
|
+
const o = this._contentSlot, s = (o == null ? void 0 : o.assignedElements().map((l) => l.textContent).join(" ").trim()) ?? "";
|
|
114
|
+
this._lightDomDescription.textContent !== s && (this._lightDomDescription.textContent = s);
|
|
115
|
+
});
|
|
116
|
+
for (const o of e)
|
|
117
|
+
i.observe(o, {
|
|
118
|
+
characterData: !0,
|
|
119
|
+
subtree: !0,
|
|
120
|
+
childList: !0
|
|
121
|
+
});
|
|
122
|
+
this._contentSlotTextObserver = i;
|
|
101
123
|
}
|
|
102
124
|
// ─── Show/Hide ───
|
|
103
125
|
/** @internal */
|
|
@@ -129,24 +151,24 @@ let o = class extends D {
|
|
|
129
151
|
async _updatePosition() {
|
|
130
152
|
const t = this._triggerWrapper, e = this._tooltipEl, i = this._arrowEl;
|
|
131
153
|
if (!t || !e || !i) return;
|
|
132
|
-
const { computePosition:
|
|
154
|
+
const { computePosition: o, flip: s, shift: l, offset: h, arrow: c } = await import("@floating-ui/dom"), { x: m, y: u, placement: _, middlewareData: v } = await o(t, e, {
|
|
133
155
|
placement: this.placement,
|
|
134
156
|
strategy: "fixed",
|
|
135
|
-
middleware: [h(8), s(),
|
|
157
|
+
middleware: [h(8), s(), l({ padding: 8 }), c({ element: i })]
|
|
136
158
|
});
|
|
137
159
|
Object.assign(e.style, {
|
|
138
160
|
left: `${m}px`,
|
|
139
161
|
top: `${u}px`
|
|
140
162
|
});
|
|
141
|
-
const
|
|
163
|
+
const a = v.arrow, f = _.split("-")[0] ?? "top", x = {
|
|
142
164
|
top: "bottom",
|
|
143
165
|
right: "left",
|
|
144
166
|
bottom: "top",
|
|
145
167
|
left: "right"
|
|
146
|
-
}[
|
|
168
|
+
}[f] ?? "bottom";
|
|
147
169
|
Object.assign(i.style, {
|
|
148
|
-
left: (
|
|
149
|
-
top: (
|
|
170
|
+
left: (a == null ? void 0 : a.x) != null ? `${a.x}px` : "",
|
|
171
|
+
top: (a == null ? void 0 : a.y) != null ? `${a.y}px` : "",
|
|
150
172
|
right: "",
|
|
151
173
|
bottom: "",
|
|
152
174
|
[x]: `${-(i.offsetWidth / 2)}px`
|
|
@@ -165,7 +187,7 @@ let o = class extends D {
|
|
|
165
187
|
}
|
|
166
188
|
// ─── Render ───
|
|
167
189
|
render() {
|
|
168
|
-
return
|
|
190
|
+
return b`
|
|
169
191
|
<div
|
|
170
192
|
class="trigger-wrapper"
|
|
171
193
|
@mouseenter=${this._scheduleShow}
|
|
@@ -190,38 +212,38 @@ let o = class extends D {
|
|
|
190
212
|
`;
|
|
191
213
|
}
|
|
192
214
|
};
|
|
193
|
-
|
|
194
|
-
|
|
215
|
+
r.styles = [C, T];
|
|
216
|
+
n([
|
|
195
217
|
d({ type: String, reflect: !0 })
|
|
196
|
-
],
|
|
197
|
-
|
|
218
|
+
], r.prototype, "placement", 2);
|
|
219
|
+
n([
|
|
198
220
|
d({ type: Number, attribute: "show-delay" })
|
|
199
|
-
],
|
|
200
|
-
|
|
221
|
+
], r.prototype, "showDelay", 2);
|
|
222
|
+
n([
|
|
201
223
|
d({ type: Number, attribute: "hide-delay" })
|
|
202
|
-
],
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
],
|
|
206
|
-
|
|
224
|
+
], r.prototype, "hideDelay", 2);
|
|
225
|
+
n([
|
|
226
|
+
y()
|
|
227
|
+
], r.prototype, "_visible", 2);
|
|
228
|
+
n([
|
|
207
229
|
p("slot:not([name])")
|
|
208
|
-
],
|
|
209
|
-
|
|
230
|
+
], r.prototype, "_defaultSlot", 2);
|
|
231
|
+
n([
|
|
210
232
|
p('slot[name="content"]')
|
|
211
|
-
],
|
|
212
|
-
|
|
233
|
+
], r.prototype, "_contentSlot", 2);
|
|
234
|
+
n([
|
|
213
235
|
p(".trigger-wrapper")
|
|
214
|
-
],
|
|
215
|
-
|
|
236
|
+
], r.prototype, "_triggerWrapper", 2);
|
|
237
|
+
n([
|
|
216
238
|
p('[part="tooltip"]')
|
|
217
|
-
],
|
|
218
|
-
|
|
239
|
+
], r.prototype, "_tooltipEl", 2);
|
|
240
|
+
n([
|
|
219
241
|
p('[part="arrow"]')
|
|
220
|
-
],
|
|
221
|
-
|
|
242
|
+
], r.prototype, "_arrowEl", 2);
|
|
243
|
+
r = n([
|
|
222
244
|
w("hx-tooltip")
|
|
223
|
-
],
|
|
245
|
+
], r);
|
|
224
246
|
export {
|
|
225
|
-
|
|
247
|
+
r as H
|
|
226
248
|
};
|
|
227
|
-
//# sourceMappingURL=hx-tooltip-
|
|
249
|
+
//# sourceMappingURL=hx-tooltip-DVqtKPCD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hx-tooltip-DVqtKPCD.js","sources":["../../src/components/hx-tooltip/hx-tooltip.styles.ts","../../src/components/hx-tooltip/hx-tooltip.ts"],"sourcesContent":["import { css } from 'lit';\n\n/**\n * hx-tooltip styles.\n *\n * Component-tier tokens with two-level var() fallback:\n * var(--hx-tooltip-{prop}, var(--hx-color-{semantic}, #hex))\n * Inner hex fallbacks track the \"precision cool\" palette (3.2.0):\n * neutral-0 = #FFFFFF, neutral-900 = #0D1825 (surface-inverse anchor).\n */\nexport const helixTooltipStyles = css`\n :host {\n display: inline-block;\n }\n\n .trigger-wrapper {\n display: inline-block;\n }\n\n [part='tooltip'] {\n position: fixed;\n z-index: var(--hx-tooltip-z-index, var(--hx-z-index-tooltip, 1600));\n max-width: var(--hx-tooltip-max-width, 280px);\n padding: var(--hx-tooltip-padding, var(--hx-space-1, 0.25rem) var(--hx-space-2, 0.5rem));\n background: var(--hx-tooltip-bg, var(--hx-color-surface-inverse, #0d1825));\n color: var(--hx-tooltip-color, var(--hx-color-text-inverse, #ffffff));\n font-family: var(--hx-tooltip-font-family, var(--hx-font-family-sans, sans-serif));\n font-size: var(--hx-tooltip-font-size, var(--hx-font-size-xs, 0.75rem));\n line-height: var(--hx-line-height-normal, 1.5);\n border-radius: var(--hx-tooltip-border-radius, var(--hx-border-radius-sm, 0.25rem));\n box-shadow: var(\n --hx-tooltip-shadow,\n var(--hx-shadow-sm, 0 2px 8px var(--hx-overlay-black-20, rgba(0, 0, 0, 0.2)))\n );\n visibility: hidden;\n opacity: 0;\n transition:\n opacity var(--hx-tooltip-transition-duration, var(--hx-transition-fast, 150ms ease)),\n visibility var(--hx-tooltip-transition-duration, var(--hx-transition-fast, 150ms ease));\n overflow-wrap: break-word;\n }\n\n [part='tooltip'].visible {\n visibility: visible;\n opacity: 1;\n }\n\n [part='arrow'] {\n position: absolute;\n width: var(--hx-tooltip-arrow-size, 8px);\n height: var(--hx-tooltip-arrow-size, 8px);\n background: var(--hx-tooltip-bg, var(--hx-color-surface-inverse, #0d1825));\n transform: rotate(45deg);\n pointer-events: none;\n }\n\n @media (prefers-reduced-motion: reduce) {\n [part='tooltip'] {\n transition: none;\n }\n }\n\n /* ─── Forced Colors (Windows High Contrast) ─── */\n /* Belt-and-suspenders: rich per-class HC overrides PLUS the forcedColorsSurface mixin. */\n\n @media (forced-colors: active) {\n [part='tooltip'] {\n border: 1px solid CanvasText;\n }\n\n [part='arrow'] {\n border: 1px solid CanvasText;\n }\n }\n`;\n","import { html } from 'lit';\nimport '../../utilities/document-token-adoption.js';\nimport { customElement, property, query, state } from 'lit/decorators.js';\n\nimport { HelixElement, createIdCounter } from '../../base/index.js';\nimport { helixTooltipStyles } from './hx-tooltip.styles.js';\nimport { forcedColorsSurface } from '../../styles/forced-colors.js';\n\nconst _nextTooltipId = createIdCounter('hx-tooltip');\n\n/**\n * A tooltip that displays contextual help text on hover or focus.\n *\n * ## Architecture Note: Light-DOM Description Shim (group-4 round-1)\n *\n * `aria-describedby` IDREFs cannot resolve across the Shadow DOM boundary —\n * the trigger lives in the consumer's light DOM and references a tooltip\n * whose body is in this component's shadow root. The tooltip text must\n * therefore be exposed in DOCUMENT scope.\n *\n * The shim is a single visually-hidden `<span>` appended to `document.body`\n * with the `_tooltipId` as its `id`. The trigger's `aria-describedby` points\n * at this span. The text content is mirrored from the slotted `content`\n * slot on every relevant signal:\n *\n * 1. `firstUpdated` (initial wiring)\n * 2. `slotchange` on the default slot AND the `content` slot (the slotted\n * element list changes)\n * 3. **Text-content mutations on the assigned `content` slot elements**\n * (round-23 P2 pattern). Without this observer a framework that\n * rewrites the slotted `<span slot=\"content\">` `textContent` IN PLACE\n * (Vue / React keyed text rerender) would leave the shim stale.\n *\n * Cleanup: `disconnectedCallback` removes the shim from `document.body`,\n * disconnects the slot-text observer, and clears the timers. SSR is\n * sidestepped by guarding `document` access — the shim is created lazily\n * the first time `_setupTriggerAria()` runs in a browser environment.\n *\n * `role=\"tooltip\"` is the correct APG role and is NEVER promoted to\n * `role=\"dialog\"` — APG explicitly forbids tooltips from holding focus and\n * the tooltip body is not a focus target. No host-canonical `_internals`\n * work is owed: the trigger is the announced surface, and it correctly\n * references the tooltip via `aria-describedby`.\n *\n * @summary Contextual help text and abbreviations with smart positioning.\n *\n * @tag hx-tooltip\n *\n * @slot - Default slot for the trigger element.\n * @slot content - Tooltip content to display.\n *\n * @csspart tooltip - The tooltip container element.\n * @csspart arrow - The arrow indicator element.\n *\n * @cssprop [--hx-tooltip-bg=var(--hx-color-neutral-900)] - Tooltip background color.\n * @cssprop [--hx-tooltip-color=var(--hx-color-neutral-50)] - Tooltip text color.\n * @cssprop [--hx-tooltip-font-size=var(--hx-font-size-xs)] - Tooltip font size.\n * @cssprop [--hx-tooltip-max-width=280px] - Maximum tooltip width.\n * @cssprop [--hx-tooltip-padding] - Tooltip padding.\n * @cssprop [--hx-tooltip-border-radius=var(--hx-border-radius-sm)] - Tooltip border radius.\n * @cssprop [--hx-tooltip-shadow] - Tooltip box shadow.\n * @cssprop [--hx-tooltip-z-index=9999] - Tooltip z-index.\n * @cssprop [--hx-tooltip-transition-duration=0.15s] - Show/hide transition duration.\n * @cssprop [--hx-tooltip-arrow-size=8px] - Size of the arrow indicator.\n *\n * @example\n * ```html\n * <hx-tooltip>\n * <button>Hover me</button>\n * <span slot=\"content\">Helpful context here</span>\n * </hx-tooltip>\n * ```\n *\n * @example Drupal/Twig usage\n * ```twig\n * <hx-tooltip>\n * <button type=\"button\">{{ trigger_label }}</button>\n * <span slot=\"content\">{{ tooltip_text }}</span>\n * </hx-tooltip>\n * ```\n * @cssprop [--hx-tooltip-font-family=var(--hx-font-family-sans)] - CSS custom property.\n * @cssprop [--hx-z-index-tooltip] - Z-index layer.\n * @cssprop [--hx-space-1] - Spacing token.\n * @cssprop [--hx-space-2] - Spacing token.\n * @cssprop [--hx-color-neutral-900] - Color.\n * @cssprop [--hx-color-neutral-50] - Color.\n * @cssprop [--hx-font-family-sans] - Font family.\n * @cssprop [--hx-font-size-xs] - Font size.\n * @cssprop [--hx-line-height-normal] - Line height.\n * @cssprop [--hx-border-radius-sm] - CSS custom property.\n * @cssprop [--hx-shadow-sm] - Box shadow.\n * @cssprop [--hx-overlay-black-20] - Overlay color.\n * @cssprop [--hx-transition-fast] - Transition timing.\n */\n\n@customElement('hx-tooltip')\nexport class HelixTooltip extends HelixElement {\n static override styles = [helixTooltipStyles, forcedColorsSurface];\n\n /**\n * Preferred placement of the tooltip relative to the trigger.\n * Supports all Floating UI placement values including alignment variants\n * (e.g. 'top-start', 'bottom-end') and 'auto'.\n * @attr placement\n */\n @property({ type: String, reflect: true })\n placement:\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'right'\n | 'right-start'\n | 'right-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'left'\n | 'left-start'\n | 'left-end' = 'top';\n\n /**\n * Delay in milliseconds before the tooltip is shown.\n * @attr show-delay\n */\n @property({ type: Number, attribute: 'show-delay' })\n showDelay = 300;\n\n /**\n * Delay in milliseconds before the tooltip is hidden.\n * @attr hide-delay\n */\n @property({ type: Number, attribute: 'hide-delay' })\n hideDelay = 100;\n\n /** @internal */\n @state() private _visible = false;\n\n /** @internal */\n private _showTimer: ReturnType<typeof setTimeout> | null = null;\n /** @internal */\n private _hideTimer: ReturnType<typeof setTimeout> | null = null;\n\n /** @internal */\n private readonly _tooltipId = _nextTooltipId();\n\n /** @internal */\n @query('slot:not([name])') private _defaultSlot!: HTMLSlotElement | null;\n /** @internal */\n @query('slot[name=\"content\"]') private _contentSlot!: HTMLSlotElement | null;\n /** @internal */\n @query('.trigger-wrapper') private _triggerWrapper!: HTMLElement | null;\n /** @internal */\n @query('[part=\"tooltip\"]') private _tooltipEl!: HTMLElement | null;\n /** @internal */\n @query('[part=\"arrow\"]') private _arrowEl!: HTMLElement | null;\n\n /**\n * Visually-hidden description element in light DOM.\n * Necessary because aria-describedby cannot cross Shadow DOM boundaries —\n * ARIA ID references are scoped to the element's root node. This element\n * lives in the document scope so the trigger's aria-describedby resolves correctly.\n * @internal\n */\n private _lightDomDescription: HTMLSpanElement | null = null;\n\n /**\n * Watches in-place text mutations on the elements assigned to the\n * `<slot name=\"content\">`. Without this observer, a framework that\n * rewrites the slotted `<span slot=\"content\">` `textContent` in place\n * would leave the document-scope shim stale — the `slotchange` event\n * does NOT fire on descendant text mutations.\n *\n * The observer is reinstalled on every `_setupTriggerAria()` call against\n * the deduped current set of assigned elements; it is fully torn down in\n * `disconnectedCallback` to prevent leaks on SSR teardown.\n * @internal\n */\n private _contentSlotTextObserver: MutationObserver | null = null;\n\n // ─── Lifecycle ───\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener('keydown', this._handleKeydown);\n // Re-run ARIA setup on reconnection (firstUpdated does not re-run).\n // hasUpdated is true after the first update cycle completes.\n if (this.hasUpdated) {\n this._setupTriggerAria();\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('keydown', this._handleKeydown);\n this._clearTimers();\n this._lightDomDescription?.remove();\n this._lightDomDescription = null;\n // Round-23 P2: tear down the slotted-content text observer so a\n // disconnect-then-reconnect cycle never leaks observers and the\n // observed light-DOM nodes do not retain a reference to this host.\n this._contentSlotTextObserver?.disconnect();\n this._contentSlotTextObserver = null;\n }\n\n override firstUpdated(): void {\n this._setupTriggerAria();\n }\n\n // ─── ARIA setup ───\n\n /** @internal */\n private _setupTriggerAria(): void {\n const slot = this._defaultSlot;\n if (!slot) return;\n const trigger = slot.assignedElements()[0] as HTMLElement | undefined;\n\n // Sync content from the content slot into a visually-hidden light DOM element.\n // aria-describedby cannot cross Shadow DOM boundaries, so the referenced element\n // must live in the document scope (light DOM), not inside the shadow root.\n const contentSlot = this._contentSlot;\n const contentEls = contentSlot?.assignedElements() ?? [];\n const contentText = contentEls\n .map((el) => el.textContent)\n .join(' ')\n .trim();\n\n // Guard for SSR — document is unavailable server-side\n if (!this._lightDomDescription && typeof document !== 'undefined') {\n this._lightDomDescription = document.createElement('span');\n this._lightDomDescription.id = this._tooltipId;\n // Visually hidden but accessible to screen readers via aria-describedby.\n // Appended to document.body (not this element) so that the ID is in the\n // document scope and resolves correctly across shadow DOM boundaries.\n // Web components must not mutate their own light DOM children.\n this._lightDomDescription.style.cssText =\n 'position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0';\n document.body.appendChild(this._lightDomDescription);\n }\n if (this._lightDomDescription) {\n this._lightDomDescription.textContent = contentText;\n }\n\n if (trigger) {\n trigger.setAttribute('aria-describedby', this._tooltipId);\n }\n\n // Round-23 P2 pattern: observe in-place text mutations on the assigned\n // content elements so a framework-driven `textContent` rewrite re-syncs\n // the document-scope shim. `slotchange` fires only on the assignment\n // list itself, never on descendant text/attribute mutations.\n this._installContentSlotTextObserver(contentEls);\n }\n\n /**\n * (Re-)installs the slotted-content text observer over the deduped union\n * of assigned `content` slot elements. Disconnects any previous observer\n * before re-attaching so observer count is bounded by component lifetime,\n * not by `slotchange` event count.\n * @internal\n */\n private _installContentSlotTextObserver(elements: Element[]): void {\n if (this._contentSlotTextObserver) {\n this._contentSlotTextObserver.disconnect();\n this._contentSlotTextObserver = null;\n }\n if (elements.length === 0) return;\n if (typeof MutationObserver === 'undefined') return;\n const unique = new Set<Element>(elements);\n const observer = new MutationObserver(() => {\n // Re-flatten the current assignment and write the fresh text into the\n // shim. We deliberately do NOT call `_setupTriggerAria()` here — that\n // would reinstall this very observer in a tight loop. The trigger's\n // `aria-describedby` and the shim element are already wired; only the\n // text mirror needs to be refreshed.\n if (!this._lightDomDescription) return;\n const contentSlot = this._contentSlot;\n const fresh =\n contentSlot\n ?.assignedElements()\n .map((el) => el.textContent)\n .join(' ')\n .trim() ?? '';\n if (this._lightDomDescription.textContent !== fresh) {\n this._lightDomDescription.textContent = fresh;\n }\n });\n for (const el of unique) {\n observer.observe(el, {\n characterData: true,\n subtree: true,\n childList: true,\n });\n }\n this._contentSlotTextObserver = observer;\n }\n\n // ─── Show/Hide ───\n\n /** @internal */\n private _scheduleShow(): void {\n this._clearTimers();\n this._showTimer = setTimeout(() => {\n void this._show();\n }, this.showDelay);\n }\n\n /** @internal */\n private _scheduleHide(): void {\n this._clearTimers();\n this._hideTimer = setTimeout(() => {\n this._hide();\n }, this.hideDelay);\n }\n\n /** @internal */\n private async _show(): Promise<void> {\n this._visible = true;\n await this.updateComplete;\n await this._updatePosition();\n }\n\n /** @internal */\n private _hide(): void {\n this._visible = false;\n }\n\n /** @internal */\n private _clearTimers(): void {\n if (this._showTimer !== null) {\n clearTimeout(this._showTimer);\n this._showTimer = null;\n }\n if (this._hideTimer !== null) {\n clearTimeout(this._hideTimer);\n this._hideTimer = null;\n }\n }\n\n // ─── Positioning ───\n\n /** @internal */\n private async _updatePosition(): Promise<void> {\n const reference = this._triggerWrapper;\n const tooltipEl = this._tooltipEl;\n const arrowEl = this._arrowEl;\n\n if (!reference || !tooltipEl || !arrowEl) return;\n\n const { computePosition, flip, shift, offset, arrow } = await import('@floating-ui/dom');\n const { x, y, placement, middlewareData } = await computePosition(reference, tooltipEl, {\n placement: this.placement,\n strategy: 'fixed',\n middleware: [offset(8), flip(), shift({ padding: 8 }), arrow({ element: arrowEl })],\n });\n\n Object.assign(tooltipEl.style, {\n left: `${x}px`,\n top: `${y}px`,\n });\n\n const arrowData = middlewareData.arrow;\n const basePlacement = placement.split('-')[0] ?? 'top';\n const oppositeSide: Record<string, string> = {\n top: 'bottom',\n right: 'left',\n bottom: 'top',\n left: 'right',\n };\n const staticSide = oppositeSide[basePlacement] ?? 'bottom';\n\n // Offset is derived from the arrow element's actual size so that custom\n // --hx-tooltip-arrow-size values position the arrow correctly.\n Object.assign(arrowEl.style, {\n left: arrowData?.x != null ? `${arrowData.x}px` : '',\n top: arrowData?.y != null ? `${arrowData.y}px` : '',\n right: '',\n bottom: '',\n [staticSide]: `${-(arrowEl.offsetWidth / 2)}px`,\n });\n }\n\n // ─── Events ───\n\n /** @internal */\n private _handleKeydown = (e: Event): void => {\n if (!(e instanceof KeyboardEvent)) return;\n if (e.key === 'Escape' && this._visible) {\n this._clearTimers();\n this._hide();\n }\n };\n\n /**\n * Handle mouseleave on the trigger wrapper.\n * Does not schedule hide if keyboard focus is still on the trigger element,\n * preventing mixed keyboard+mouse interactions from dismissing the tooltip\n * while the user is still navigating by keyboard.\n * @internal\n */\n private _handleTriggerMouseleave(): void {\n const slot = this._defaultSlot;\n const trigger = slot?.assignedElements()[0] as HTMLElement | undefined;\n // Guard for SSR — document is unavailable server-side\n const active = typeof document !== 'undefined' ? document.activeElement : null;\n if (trigger && (trigger === active || trigger.contains(active))) {\n return;\n }\n this._scheduleHide();\n }\n\n // ─── Render ───\n\n override render() {\n return html`\n <div\n class=\"trigger-wrapper\"\n @mouseenter=${this._scheduleShow}\n @mouseleave=${this._handleTriggerMouseleave}\n @focusin=${this._scheduleShow}\n @focusout=${this._scheduleHide}\n >\n <slot @slotchange=${this._setupTriggerAria}></slot>\n </div>\n <div\n part=\"tooltip\"\n id=${this._tooltipId}\n role=\"tooltip\"\n aria-hidden=${String(!this._visible)}\n class=${this._visible ? 'visible' : ''}\n @mouseenter=${this._clearTimers}\n @mouseleave=${this._scheduleHide}\n >\n <slot name=\"content\" @slotchange=${this._setupTriggerAria}></slot>\n <div part=\"arrow\"></div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-tooltip': HelixTooltip;\n }\n}\n"],"names":["helixTooltipStyles","css","_nextTooltipId","createIdCounter","HelixTooltip","HelixElement","e","_a","_b","slot","trigger","contentSlot","contentEls","contentText","el","elements","unique","observer","fresh","reference","tooltipEl","arrowEl","computePosition","flip","shift","offset","arrow","x","y","placement","middlewareData","arrowData","basePlacement","staticSide","active","html","forcedColorsSurface","__decorateClass","property","state","query","customElement"],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AccName-aware text flattener. Walks the subtree of `root` and concatenates
|
|
3
|
+
* text-node content, REJECTING any element subtree carrying `aria-hidden="true"`
|
|
4
|
+
* or the `hidden` attribute per W3C AccName 1.2 §4.3.10. Used by host-canonical
|
|
5
|
+
* components for both external IDREF flatten (host aria-labelledby/aria-describedby
|
|
6
|
+
* targets) and slotted-label aggregation, so nested decorative content like
|
|
7
|
+
* `<svg aria-hidden="true"><title>icon</title></svg>` does not leak into the
|
|
8
|
+
* announced name/description.
|
|
9
|
+
*
|
|
10
|
+
* The TreeWalker filter only inspects elements VISITED during the walk — it
|
|
11
|
+
* never tests the root itself, so a hidden ROOT (e.g. `<span slot="label" hidden>`)
|
|
12
|
+
* would still contribute its descendants' text. Per AccName 1.2 §4.3.10, a
|
|
13
|
+
* hidden root contributes the empty string. Gate the walk here so every caller
|
|
14
|
+
* honors the rule symmetrically.
|
|
15
|
+
*
|
|
16
|
+
* ## Intentional divergence from AccName 1.2 §4.3.7 (LabelledBy Recursion)
|
|
17
|
+
*
|
|
18
|
+
* The AccName 1.2 spec (§4.3.7 + "Hidden Not Referenced") states that when an
|
|
19
|
+
* element is DIRECTLY referenced by `aria-labelledby` / `aria-describedby`,
|
|
20
|
+
* that referenced element's subtree contributes to the computed name even when
|
|
21
|
+
* the element itself is hidden via `hidden` / `aria-hidden="true"`. The author's
|
|
22
|
+
* explicit IDREF is treated as intent to use that subtree as the name.
|
|
23
|
+
*
|
|
24
|
+
* This helper deliberately diverges from §4.3.7 by applying the §4.3.10 hidden
|
|
25
|
+
* gate uniformly to ALL callers, including the IDREF-target path. Rationale:
|
|
26
|
+
*
|
|
27
|
+
* 1. **Predictability across consumer mental models.** Consumers expect
|
|
28
|
+
* "visually hidden via `[hidden]` / `aria-hidden=true`" to mean
|
|
29
|
+
* "semantically removed", full stop. A label that disappears visually but
|
|
30
|
+
* keeps announcing creates a debugging trap, especially in CMS / Twig
|
|
31
|
+
* contexts where visibility toggles are often driven by template logic.
|
|
32
|
+
* 2. **Standard accessible-hide pattern is already supported.** Authors who
|
|
33
|
+
* want a label that is visually hidden but contributes its text via
|
|
34
|
+
* `aria-labelledby` should use the established `.sr-only` / `.visually-hidden`
|
|
35
|
+
* pattern (clip-path / position:absolute / width:1px), which neither
|
|
36
|
+
* attribute affects. That pattern correctly contributes here.
|
|
37
|
+
* 3. **Fail-safe for stale references.** A hidden referenced element is more
|
|
38
|
+
* often a stale or accidentally-toggled reference than an intentional
|
|
39
|
+
* hidden-name source. Returning the empty string lets the host fall back
|
|
40
|
+
* to its next AccName step (aria-label, slotted label, placeholder) rather
|
|
41
|
+
* than announcing surprising stale content.
|
|
42
|
+
*
|
|
43
|
+
* If a future component genuinely needs strict §4.3.7 behavior, add a second
|
|
44
|
+
* entry point (e.g. `flattenAccNameForIdRef`) that skips the root-level gate
|
|
45
|
+
* and reuses the TreeWalker logic; do not relax this gate globally.
|
|
46
|
+
*
|
|
47
|
+
* Single source of truth for accessible-name flattening across the library.
|
|
48
|
+
* Used by hx-time-picker, hx-date-picker, hx-toggle-button, and any future
|
|
49
|
+
* host-canonical component that aggregates slotted text into an accessible name.
|
|
50
|
+
*
|
|
51
|
+
* @param root - The element whose subtree text content should be flattened.
|
|
52
|
+
* @returns The concatenated, whitespace-collapsed text content with hidden
|
|
53
|
+
* subtrees excluded.
|
|
54
|
+
*/
|
|
55
|
+
export declare function flattenAccName(root: Element): string;
|
|
56
|
+
//# sourceMappingURL=aria-flatten.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aria-flatten.d.ts","sourceRoot":"","sources":["../../src/utils/aria-flatten.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CA6BpD"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utilities for resolving `aria-labelledby` and `aria-describedby`
|
|
3
|
+
* IDREF token lists across the Shadow DOM boundary.
|
|
4
|
+
*
|
|
5
|
+
* Selection-control components (`hx-checkbox`, `hx-radio-group`, `hx-switch`,
|
|
6
|
+
* etc.) elevate their semantic surface to the host via `ElementInternals` so
|
|
7
|
+
* that consumer-supplied `aria-labelledby` / `aria-describedby` on the host
|
|
8
|
+
* resolves to light-DOM elements rather than being trapped on inner shadow
|
|
9
|
+
* nodes.
|
|
10
|
+
*
|
|
11
|
+
* Modern Chromium 134+ and Safari 17.4+ expose the IDL element-references API
|
|
12
|
+
* (`internals.ariaLabelledByElements`, `internals.ariaDescribedByElements`).
|
|
13
|
+
* For those engines we resolve token IDs against the host's root node (a
|
|
14
|
+
* Document or ShadowRoot) and assign the resulting elements directly.
|
|
15
|
+
*
|
|
16
|
+
* Older engines fall back to the host-attribute path: the ARIA delegation
|
|
17
|
+
* mixin keeps the original token list in `data-aria-labelledby`/
|
|
18
|
+
* `data-aria-describedby`, which assistive technology cannot follow into the
|
|
19
|
+
* shadow root, but that is the same surface area as the pre-fix code and is
|
|
20
|
+
* not a regression.
|
|
21
|
+
*
|
|
22
|
+
* Component authors do NOT need to wire this directly — see
|
|
23
|
+
* `installAriaIdrefMirror()` for an installable observer that keeps an inner
|
|
24
|
+
* node's `aria-*` attributes in sync with the token list across mutations.
|
|
25
|
+
*/
|
|
26
|
+
/**
|
|
27
|
+
* Resolves a whitespace-separated IDREF token list to live element references.
|
|
28
|
+
*
|
|
29
|
+
* Searches the host's containing root first (Document or ShadowRoot), then
|
|
30
|
+
* walks up through enclosing shadow hosts, and finally falls back to the
|
|
31
|
+
* top-level Document. Codex round-15 P1: hx-* controls embedded inside an
|
|
32
|
+
* outer component's shadow tree often legitimately reference labels/descriptions
|
|
33
|
+
* declared in the outer document or in an ancestor shadow tree. Restricting
|
|
34
|
+
* resolution to a single root left those controls anonymous on the
|
|
35
|
+
* `ariaLabelledByElements` / `ariaDescribedByElements` path. The IDL
|
|
36
|
+
* element-references API accepts any element regardless of root, so widening
|
|
37
|
+
* the search closes that gap.
|
|
38
|
+
*
|
|
39
|
+
* Codex round-16 P1: when the host is **slotted into** another component
|
|
40
|
+
* (light-DOM child of a shadow-root-bearing element), `host.getRootNode()`
|
|
41
|
+
* is still the document, so IDREF targets declared in the slot owner's
|
|
42
|
+
* shadow root are unreachable through the ancestor-shadow-host chain. We
|
|
43
|
+
* additionally walk `host.assignedSlot.getRootNode()` — that resolves to
|
|
44
|
+
* the slot owner's shadow root — and continue up that root's host chain so
|
|
45
|
+
* cross-shadow IDREF resolution works for the composed-tree slotting
|
|
46
|
+
* pattern. The walk is recursive: a slot owner that is itself slotted into
|
|
47
|
+
* another shadow tree contributes its own ancestor chain too.
|
|
48
|
+
*
|
|
49
|
+
* Tokens that fail to resolve at every level are silently dropped — matching
|
|
50
|
+
* native attribute-string platform behaviour where unresolved tokens are
|
|
51
|
+
* ignored.
|
|
52
|
+
*/
|
|
53
|
+
export declare function resolveIdrefTokens(host: Element, tokens: string | null): Element[];
|
|
54
|
+
/**
|
|
55
|
+
* True when the runtime exposes the IDL element-references API on
|
|
56
|
+
* `ElementInternals`. Older Firefox / Safari builds return `undefined`
|
|
57
|
+
* for these accessors.
|
|
58
|
+
*/
|
|
59
|
+
export declare function supportsIdrefElementReferences(internals: ElementInternals): boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Mirror snapshot describing what should be applied to inner ARIA-bearing
|
|
62
|
+
* shadow nodes. Components consume this to project the correct attributes
|
|
63
|
+
* onto whichever inner element owns the announced semantic role.
|
|
64
|
+
*/
|
|
65
|
+
export interface AriaIdrefSnapshot {
|
|
66
|
+
/** Computed `aria-labelledby` token list, or `null` to omit. */
|
|
67
|
+
labelledBy: string | null;
|
|
68
|
+
/** Computed `aria-describedby` token list, or `null` to omit. */
|
|
69
|
+
describedBy: string | null;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Merges two whitespace-separated token lists, preserving order and removing
|
|
73
|
+
* duplicates. `null`/empty inputs are skipped. Returns `null` when the merged
|
|
74
|
+
* list is empty.
|
|
75
|
+
*/
|
|
76
|
+
export declare function mergeTokenLists(...lists: Array<string | null | undefined>): string | null;
|
|
77
|
+
/**
|
|
78
|
+
* Options accepted by `installAriaIdrefMirror()`.
|
|
79
|
+
*/
|
|
80
|
+
export interface AriaIdrefMirrorOptions {
|
|
81
|
+
/**
|
|
82
|
+
* Attribute names on the host whose mutations should trigger a resync.
|
|
83
|
+
* Defaults to `['aria-labelledby', 'aria-describedby', 'aria-label']` plus
|
|
84
|
+
* the `data-aria-*` mirrors used by `mixinDelegatesAria`.
|
|
85
|
+
*/
|
|
86
|
+
observedAttributes?: string[];
|
|
87
|
+
/**
|
|
88
|
+
* Whether to observe the resolved root for `id` attribute and `childList`
|
|
89
|
+
* mutations so that late-inserted IDREF targets and id renames trigger a
|
|
90
|
+
* resync. Defaults to `true`.
|
|
91
|
+
*/
|
|
92
|
+
observeRoot?: boolean;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Handle returned by `installAriaIdrefMirror()`. Call `disconnect()` from
|
|
96
|
+
* `disconnectedCallback()` to tear the observers down. `resync()` forces an
|
|
97
|
+
* immediate sync — useful from `connectedCallback()` after the host has been
|
|
98
|
+
* re-attached to a new root.
|
|
99
|
+
*/
|
|
100
|
+
export interface AriaIdrefMirrorHandle {
|
|
101
|
+
/** Force an immediate sync. */
|
|
102
|
+
resync(): void;
|
|
103
|
+
/** Tear down all observers and listeners. */
|
|
104
|
+
disconnect(): void;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Installs a `MutationObserver` pair that keeps host ARIA semantics in sync
|
|
108
|
+
* with mutations to consumer-supplied attributes AND late-target / id
|
|
109
|
+
* mutations in the host's resolved root.
|
|
110
|
+
*
|
|
111
|
+
* The `sync` callback is invoked on:
|
|
112
|
+
* 1. Initial install (synchronously)
|
|
113
|
+
* 2. Any change to one of the observed host attributes
|
|
114
|
+
* 3. Any `id` attribute mutation, child insertion, or child removal in the
|
|
115
|
+
* resolved root (Document or ShadowRoot containing the host)
|
|
116
|
+
*
|
|
117
|
+
* Components should call this from `connectedCallback()` and call
|
|
118
|
+
* `handle.disconnect()` from `disconnectedCallback()`. The handle's
|
|
119
|
+
* `resync()` method is safe to call from any lifecycle hook.
|
|
120
|
+
*
|
|
121
|
+
* Costs are bounded: the host observer touches one element; the root
|
|
122
|
+
* observer is shared per `Document`/`ShadowRoot` (codex round-7 #11) so every
|
|
123
|
+
* subscribing host pays a single attach cost regardless of how many other
|
|
124
|
+
* IDREF-aware controls share the root.
|
|
125
|
+
*/
|
|
126
|
+
export declare function installAriaIdrefMirror(host: Element, sync: () => void, options?: AriaIdrefMirrorOptions): AriaIdrefMirrorHandle;
|
|
127
|
+
//# sourceMappingURL=aria-idref.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aria-idref.d.ts","sourceRoot":"","sources":["../../src/utils/aria-idref.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,EAAE,CA6BlF;AA0ED;;;;GAIG;AACH,wBAAgB,8BAA8B,CAAC,SAAS,EAAE,gBAAgB,GAAG,OAAO,CAOnF;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,gEAAgE;IAChE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,iEAAiE;IACjE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,GAAG,MAAM,GAAG,IAAI,CAazF;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;GAKG;AACH,MAAM,WAAW,qBAAqB;IACpC,+BAA+B;IAC/B,MAAM,IAAI,IAAI,CAAC;IACf,6CAA6C;IAC7C,UAAU,IAAI,IAAI,CAAC;CACpB;AAsED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,MAAM,IAAI,EAChB,OAAO,GAAE,sBAA2B,GACnC,qBAAqB,CAmFvB"}
|
package/figma-inventory.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "1.0.0",
|
|
3
|
-
"generatedAt": "2026-05-
|
|
3
|
+
"generatedAt": "2026-05-05T12:24:24.560Z",
|
|
4
4
|
"sourceCem": "custom-elements.json",
|
|
5
5
|
"helixVersion": "3.3.1",
|
|
6
6
|
"tokensVersion": "3.3.1",
|
|
@@ -5519,6 +5519,30 @@
|
|
|
5519
5519
|
"type": "text",
|
|
5520
5520
|
"defaultValue": ""
|
|
5521
5521
|
},
|
|
5522
|
+
{
|
|
5523
|
+
"figmaPropertyName": "label",
|
|
5524
|
+
"cemAttribute": "label",
|
|
5525
|
+
"type": "text",
|
|
5526
|
+
"defaultValue": "undefined"
|
|
5527
|
+
},
|
|
5528
|
+
{
|
|
5529
|
+
"figmaPropertyName": "accessibleLabel",
|
|
5530
|
+
"cemAttribute": "accessible-label",
|
|
5531
|
+
"type": "text",
|
|
5532
|
+
"defaultValue": "undefined"
|
|
5533
|
+
},
|
|
5534
|
+
{
|
|
5535
|
+
"figmaPropertyName": "helpText",
|
|
5536
|
+
"cemAttribute": "help-text",
|
|
5537
|
+
"type": "text",
|
|
5538
|
+
"defaultValue": "undefined"
|
|
5539
|
+
},
|
|
5540
|
+
{
|
|
5541
|
+
"figmaPropertyName": "error",
|
|
5542
|
+
"cemAttribute": "error",
|
|
5543
|
+
"type": "text",
|
|
5544
|
+
"defaultValue": "undefined"
|
|
5545
|
+
},
|
|
5522
5546
|
{
|
|
5523
5547
|
"figmaPropertyName": "labelGradient",
|
|
5524
5548
|
"cemAttribute": "label-gradient",
|
|
@@ -5569,6 +5593,27 @@
|
|
|
5569
5593
|
"type": "instance-swap",
|
|
5570
5594
|
"default": null,
|
|
5571
5595
|
"description": "Custom trigger element. Default: a color swatch button."
|
|
5596
|
+
},
|
|
5597
|
+
{
|
|
5598
|
+
"figmaPropertyName": "label",
|
|
5599
|
+
"cemSlot": "label",
|
|
5600
|
+
"type": "instance-swap",
|
|
5601
|
+
"default": null,
|
|
5602
|
+
"description": "Visible label projected above the trigger; aggregated text contributes to the host's accessible name when no stronger naming source (aria-labelledby/aria-label/accessible-label/label) is supplied."
|
|
5603
|
+
},
|
|
5604
|
+
{
|
|
5605
|
+
"figmaPropertyName": "help-text",
|
|
5606
|
+
"cemSlot": "help-text",
|
|
5607
|
+
"type": "instance-swap",
|
|
5608
|
+
"default": null,
|
|
5609
|
+
"description": "Help text rendered below the trigger and joined into the host's announced description channel."
|
|
5610
|
+
},
|
|
5611
|
+
{
|
|
5612
|
+
"figmaPropertyName": "error",
|
|
5613
|
+
"cemSlot": "error",
|
|
5614
|
+
"type": "instance-swap",
|
|
5615
|
+
"default": null,
|
|
5616
|
+
"description": "Error message rendered below help text. When present, marks the trigger as aria-invalid and is announced via a polite live region."
|
|
5572
5617
|
}
|
|
5573
5618
|
],
|
|
5574
5619
|
"cssParts": [
|
|
@@ -5599,6 +5644,18 @@
|
|
|
5599
5644
|
{
|
|
5600
5645
|
"description": "The text input area.",
|
|
5601
5646
|
"name": "input"
|
|
5647
|
+
},
|
|
5648
|
+
{
|
|
5649
|
+
"description": "The visible label container above the trigger.",
|
|
5650
|
+
"name": "label"
|
|
5651
|
+
},
|
|
5652
|
+
{
|
|
5653
|
+
"description": "The help-text container rendered below the trigger.",
|
|
5654
|
+
"name": "help-text"
|
|
5655
|
+
},
|
|
5656
|
+
{
|
|
5657
|
+
"description": "The error-message container rendered below help text.",
|
|
5658
|
+
"name": "error"
|
|
5602
5659
|
}
|
|
5603
5660
|
],
|
|
5604
5661
|
"events": [
|
|
@@ -7808,6 +7865,12 @@
|
|
|
7808
7865
|
"cemAttribute": "next-month-label",
|
|
7809
7866
|
"type": "text",
|
|
7810
7867
|
"defaultValue": "Next month"
|
|
7868
|
+
},
|
|
7869
|
+
{
|
|
7870
|
+
"figmaPropertyName": "accessibleLabel",
|
|
7871
|
+
"cemAttribute": "accessible-label",
|
|
7872
|
+
"type": "text",
|
|
7873
|
+
"defaultValue": "null"
|
|
7811
7874
|
}
|
|
7812
7875
|
],
|
|
7813
7876
|
"slots": [
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@helixui/library",
|
|
3
|
-
"version": "3.3.1-next.
|
|
3
|
+
"version": "3.3.1-next.118",
|
|
4
4
|
"description": "Enterprise Web Component Library built with Lit 3.x",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": [
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
"customElements": "custom-elements.json",
|
|
60
60
|
"dependencies": {
|
|
61
61
|
"lit": "^3.3.2",
|
|
62
|
-
"@helixui/tokens": "3.3.1-next.
|
|
62
|
+
"@helixui/tokens": "3.3.1-next.118"
|
|
63
63
|
},
|
|
64
64
|
"peerDependencies": {
|
|
65
65
|
"@floating-ui/dom": "^1.7.6"
|