@rak200/ui 0.6.2 → 0.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/button.d.ts +2 -0
- package/dist/button.d.ts.map +1 -1
- package/dist/button.js +111 -17
- package/dist/button.js.map +1 -1
- package/dist/tooltip.d.ts.map +1 -1
- package/dist/tooltip.js +159 -8
- package/dist/tooltip.js.map +1 -1
- package/package.json +1 -1
package/dist/button.d.ts
CHANGED
|
@@ -15,6 +15,7 @@ export type ButtonVariant = 'primary' | 'secondary';
|
|
|
15
15
|
* ```
|
|
16
16
|
*/
|
|
17
17
|
export declare class UiButton extends LitElement {
|
|
18
|
+
#private;
|
|
18
19
|
static readonly styles: import("lit").CSSResult;
|
|
19
20
|
static readonly properties: {
|
|
20
21
|
variant: {
|
|
@@ -38,6 +39,7 @@ export declare class UiButton extends LitElement {
|
|
|
38
39
|
variant: ButtonVariant;
|
|
39
40
|
/** Whether the button rejects interaction. Reflected, so CSS can select on it. */
|
|
40
41
|
disabled: boolean;
|
|
42
|
+
constructor();
|
|
41
43
|
render(): TemplateResult;
|
|
42
44
|
}
|
|
43
45
|
declare global {
|
package/dist/button.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../src/button.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../src/button.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAsB,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAG1E,+CAA+C;AAC/C,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,WAAW,CAAC;AAEpD;;;;;;;;;;;;GAYG;AACH,qBAAa,QAAS,SAAQ,UAAU;;IACpC,gBAAyB,MAAM,0BAsG7B;IAEF,gBAAyB,UAAU;;;;;;;;;MAGjC;IAEF;;;;;;;;OAQG;IACH,OAAO,EAAE,aAAa,CAAa;IAEnC,kFAAkF;IAClF,QAAQ,UAAS;;IAmDR,MAAM,IAAI,cAAc;CAiBpC;AAQD,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,qBAAqB;QAC3B,WAAW,EAAE,QAAQ,CAAC;KACzB;CACJ"}
|
package/dist/button.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { LitElement, css, html } from 'lit';
|
|
1
|
+
import { LitElement, css, html, nothing } from 'lit';
|
|
2
2
|
import { reference } from './reference.js';
|
|
3
3
|
/**
|
|
4
4
|
* A button.
|
|
@@ -14,21 +14,6 @@ import { reference } from './reference.js';
|
|
|
14
14
|
* ```
|
|
15
15
|
*/
|
|
16
16
|
export class UiButton extends LitElement {
|
|
17
|
-
constructor() {
|
|
18
|
-
super(...arguments);
|
|
19
|
-
/**
|
|
20
|
-
* How much visual weight the button carries.
|
|
21
|
-
*
|
|
22
|
-
* A plain field, not the `accessor` keyword: `accessor` is an auto-accessor, the
|
|
23
|
-
* browser the suite runs in does not implement it, and the transform leaves it in
|
|
24
|
-
* place — the module then fails to parse. The classic Lit pattern, a `static
|
|
25
|
-
* properties` map beside plain fields with `useDefineForClassFields: false`, needs
|
|
26
|
-
* neither the keyword nor decorators.
|
|
27
|
-
*/
|
|
28
|
-
this.variant = 'primary';
|
|
29
|
-
/** Whether the button rejects interaction. Reflected, so CSS can select on it. */
|
|
30
|
-
this.disabled = false;
|
|
31
|
-
}
|
|
32
17
|
static { this.styles = css `
|
|
33
18
|
:host {
|
|
34
19
|
display: inline-block;
|
|
@@ -106,16 +91,125 @@ export class UiButton extends LitElement {
|
|
|
106
91
|
background: ${reference('--ui-color-pressed')};
|
|
107
92
|
transition-duration: 0s;
|
|
108
93
|
}
|
|
94
|
+
|
|
95
|
+
/* The sentence a tooltip handed over: present to a screen reader and absent to
|
|
96
|
+
everybody else. It is already on screen — in the tip, which is the whole point of
|
|
97
|
+
the handoff — so drawing it again would show it twice.
|
|
98
|
+
|
|
99
|
+
display:none would be the shorter way and it is the one this package will not take.
|
|
100
|
+
The accessible description of a hidden element that is DIRECTLY referenced is
|
|
101
|
+
computed anyway, by specification; whether every engine does it is a claim this
|
|
102
|
+
toolchain cannot check, because no instrument here reads an accessibility tree.
|
|
103
|
+
docs/select.md already settles what to do with a feature that cannot be verified,
|
|
104
|
+
and the clip below has nothing left to disagree about: the node is in the tree in
|
|
105
|
+
every engine, and painted in none.
|
|
106
|
+
|
|
107
|
+
No offsets with the absolute, deliberately: an out-of-flow box with none stays at
|
|
108
|
+
its static position, so it neither travels nor grows the scrollable area. */
|
|
109
|
+
#description {
|
|
110
|
+
position: absolute;
|
|
111
|
+
inline-size: 1px;
|
|
112
|
+
block-size: 1px;
|
|
113
|
+
margin: -1px;
|
|
114
|
+
padding: 0;
|
|
115
|
+
overflow: hidden;
|
|
116
|
+
clip-path: inset(50%);
|
|
117
|
+
white-space: nowrap;
|
|
118
|
+
}
|
|
109
119
|
`; }
|
|
110
120
|
static { this.properties = {
|
|
111
121
|
variant: { type: String, reflect: true },
|
|
112
122
|
disabled: { type: Boolean, reflect: true },
|
|
113
123
|
}; }
|
|
124
|
+
/**
|
|
125
|
+
* The sentence a `<ui-tooltip>` handed over, empty until one does.
|
|
126
|
+
*
|
|
127
|
+
* **Private, and the update is asked for by hand rather than declared.** A declared
|
|
128
|
+
* reactive property is one a host can write, and a writable `description` is the
|
|
129
|
+
* option RFC 0006 rejected twice over: it makes the host write the same sentence a
|
|
130
|
+
* tooltip is already holding, and a property written before an element upgrades
|
|
131
|
+
* shadows its accessor permanently on anything not built on Lit — reading back a
|
|
132
|
+
* value it never delivered. What is public here is the event, which reports whether
|
|
133
|
+
* anyone took it.
|
|
134
|
+
*/
|
|
135
|
+
#description;
|
|
136
|
+
constructor() {
|
|
137
|
+
super();
|
|
138
|
+
/**
|
|
139
|
+
* How much visual weight the button carries.
|
|
140
|
+
*
|
|
141
|
+
* A plain field, not the `accessor` keyword: `accessor` is an auto-accessor, the
|
|
142
|
+
* browser the suite runs in does not implement it, and the transform leaves it in
|
|
143
|
+
* place — the module then fails to parse. The classic Lit pattern, a `static
|
|
144
|
+
* properties` map beside plain fields with `useDefineForClassFields: false`, needs
|
|
145
|
+
* neither the keyword nor decorators.
|
|
146
|
+
*/
|
|
147
|
+
this.variant = 'primary';
|
|
148
|
+
/** Whether the button rejects interaction. Reflected, so CSS can select on it. */
|
|
149
|
+
this.disabled = false;
|
|
150
|
+
/**
|
|
151
|
+
* The sentence a `<ui-tooltip>` handed over, empty until one does.
|
|
152
|
+
*
|
|
153
|
+
* **Private, and the update is asked for by hand rather than declared.** A declared
|
|
154
|
+
* reactive property is one a host can write, and a writable `description` is the
|
|
155
|
+
* option RFC 0006 rejected twice over: it makes the host write the same sentence a
|
|
156
|
+
* tooltip is already holding, and a property written before an element upgrades
|
|
157
|
+
* shadows its accessor permanently on anything not built on Lit — reading back a
|
|
158
|
+
* value it never delivered. What is public here is the event, which reports whether
|
|
159
|
+
* anyone took it.
|
|
160
|
+
*/
|
|
161
|
+
this.#description = '';
|
|
162
|
+
/**
|
|
163
|
+
* Takes the tip's sentence and renders it where an IDREF can reach it.
|
|
164
|
+
*
|
|
165
|
+
* An `aria-describedby` written in the host's tree cannot name a node in here — one
|
|
166
|
+
* IDREF, one tree scope — which is the failure #156 measured and this is the answer
|
|
167
|
+
* RFC 0006 chose. `preventDefault()` is the whole of the acknowledgement: the
|
|
168
|
+
* dispatch's return value is what tells the tooltip whether to warn, so a malformed
|
|
169
|
+
* payload is left unclaimed on purpose rather than accepted and ignored.
|
|
170
|
+
*/
|
|
171
|
+
this.#describe = (event) => {
|
|
172
|
+
// The payload is tested and the event's class is not, which is narrower than it
|
|
173
|
+
// looks: a plain `Event` carries no `detail` at all, so the type test below stops
|
|
174
|
+
// one as surely as an `instanceof` would. The guard that used to be here is gone
|
|
175
|
+
// because the mutation floor could not kill it — nothing reached it that the next
|
|
176
|
+
// line did not already turn away, which makes it dead weight rather than defence.
|
|
177
|
+
const handed = event.detail;
|
|
178
|
+
if (typeof handed !== 'string') {
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
event.preventDefault();
|
|
182
|
+
this.#description = handed;
|
|
183
|
+
this.requestUpdate();
|
|
184
|
+
};
|
|
185
|
+
// In the constructor rather than on connection, because the listener has to exist
|
|
186
|
+
// by the time an upgrade is observable: the tooltip waits on
|
|
187
|
+
// `customElements.whenDefined`, which resolves after this has run.
|
|
188
|
+
this.addEventListener('ui-describe', this.#describe);
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Takes the tip's sentence and renders it where an IDREF can reach it.
|
|
192
|
+
*
|
|
193
|
+
* An `aria-describedby` written in the host's tree cannot name a node in here — one
|
|
194
|
+
* IDREF, one tree scope — which is the failure #156 measured and this is the answer
|
|
195
|
+
* RFC 0006 chose. `preventDefault()` is the whole of the acknowledgement: the
|
|
196
|
+
* dispatch's return value is what tells the tooltip whether to warn, so a malformed
|
|
197
|
+
* payload is left unclaimed on purpose rather than accepted and ignored.
|
|
198
|
+
*/
|
|
199
|
+
#describe;
|
|
114
200
|
render() {
|
|
115
201
|
return html `
|
|
116
|
-
<button
|
|
202
|
+
<button
|
|
203
|
+
class=${this.variant}
|
|
204
|
+
?disabled=${this.disabled}
|
|
205
|
+
aria-describedby=${this.#description === '' ? nothing : 'description'}
|
|
206
|
+
part="button"
|
|
207
|
+
>
|
|
117
208
|
<slot></slot>
|
|
118
209
|
</button>
|
|
210
|
+
${this.#description === ''
|
|
211
|
+
? nothing
|
|
212
|
+
: html `<span id="description">${this.#description}</span>`}
|
|
119
213
|
`;
|
|
120
214
|
}
|
|
121
215
|
}
|
package/dist/button.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"button.js","sourceRoot":"","sources":["../src/button.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAuB,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"button.js","sourceRoot":"","sources":["../src/button.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAuB,MAAM,KAAK,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAK3C;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,QAAS,SAAQ,UAAU;aACX,WAAM,GAAG,GAAG,CAAA;;;;;;;2BAOd,SAAS,CAAC,WAAW,CAAC;;6BAEpB,SAAS,CAAC,aAAa,CAAC;uBAC9B,SAAS,CAAC,YAAY,CAAC,SAAS,SAAS,CAAC,YAAY,CAAC;;;;;;;;;;;;;;2CAcnC,SAAS,CAAC,qBAAqB,CAAC;kBACzD,SAAS,CAAC,mBAAmB,CAAC;;;;;;;;;;;iCAWf,SAAS,CAAC,kBAAkB,CAAC;;;;;0BAKpC,SAAS,CAAC,mBAAmB,CAAC;qBACnC,SAAS,CAAC,4BAA4B,CAAC;;;;0BAIlC,SAAS,CAAC,oBAAoB,CAAC;qBACpC,SAAS,CAAC,iBAAiB,CAAC;;;;;;;;;0BASvB,SAAS,CAAC,yBAAyB,CAAC;;;;0BAIpC,SAAS,CAAC,kBAAkB,CAAC;;;;;;;;;0BAS7B,SAAS,CAAC,2BAA2B,CAAC;;;;;0BAKtC,SAAS,CAAC,oBAAoB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA4BpD,AAtG8B,CAsG7B;aAEuB,eAAU,GAAG;QAClC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;QACxC,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;KAC7C,AAHkC,CAGjC;IAgBF;;;;;;;;;;OAUG;IACH,YAAY,CAAM;IAElB;QACI,KAAK,EAAE,CAAC;QA5BZ;;;;;;;;WAQG;QACH,YAAO,GAAkB,SAAS,CAAC;QAEnC,kFAAkF;QAClF,aAAQ,GAAG,KAAK,CAAC;QAEjB;;;;;;;;;;WAUG;QACH,iBAAY,GAAG,EAAE,CAAC;QAWlB;;;;;;;;WAQG;QACM,cAAS,GAAG,CAAC,KAAY,EAAQ,EAAE;YACxC,gFAAgF;YAChF,kFAAkF;YAClF,iFAAiF;YACjF,kFAAkF;YAClF,kFAAkF;YAClF,MAAM,MAAM,GAAa,KAA8B,CAAC,MAAM,CAAC;YAE/D,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC7B,OAAO;YACX,CAAC;YAED,KAAK,CAAC,cAAc,EAAE,CAAC;YAEvB,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;YAC3B,IAAI,CAAC,aAAa,EAAE,CAAC;QACzB,CAAC,CAAC;QA/BE,kFAAkF;QAClF,6DAA6D;QAC7D,mEAAmE;QACnE,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC;IAED;;;;;;;;OAQG;IACM,SAAS,CAgBhB;IAEO,MAAM;QACX,OAAO,IAAI,CAAA;;wBAEK,IAAI,CAAC,OAAO;4BACR,IAAI,CAAC,QAAQ;mCACN,IAAI,CAAC,YAAY,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa;;;;;cAMrE,IAAI,CAAC,YAAY,KAAK,EAAE;YACpB,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,IAAI,CAAA,0BAA0B,IAAI,CAAC,YAAY,SACzD;SACH,CAAC;IACN,CAAC;;AAGL,kFAAkF;AAClF,wFAAwF;AACxF,yFAAyF;AACzF,4EAA4E;AAC5E,cAAc,CAAC,MAAM,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC"}
|
package/dist/tooltip.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tooltip.d.ts","sourceRoot":"","sources":["../src/tooltip.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAa,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"tooltip.d.ts","sourceRoot":"","sources":["../src/tooltip.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAa,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AA4CjE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AACH,qBAAa,SAAU,SAAQ,UAAU;;IACrC,gBAAyB,MAAM,0BAkD7B;IAyFO,iBAAiB,IAAI,IAAI;IA0BzB,oBAAoB,IAAI,IAAI;IAe5B,MAAM,IAAI,cAAc;CA2WpC;AAQD,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,qBAAqB;QAC3B,YAAY,EAAE,SAAS,CAAC;KAC3B;CACJ"}
|
package/dist/tooltip.js
CHANGED
|
@@ -12,6 +12,9 @@ const side = 'data-side';
|
|
|
12
12
|
* inside the boundary, not how the element was made able to take it.
|
|
13
13
|
*/
|
|
14
14
|
const focusable = 'a[href], button, input, select, textarea, [tabindex]';
|
|
15
|
+
function describing(trigger) {
|
|
16
|
+
return (trigger.getAttribute('aria-describedby') ?? '').split(' ').filter((id) => id !== '');
|
|
17
|
+
}
|
|
15
18
|
/**
|
|
16
19
|
* Supplementary text on hover and on keyboard focus.
|
|
17
20
|
*
|
|
@@ -124,6 +127,16 @@ export class UiTooltip extends LitElement {
|
|
|
124
127
|
`; }
|
|
125
128
|
/** Whether the tip is currently shown, which decides what the listeners cost. */
|
|
126
129
|
#shown = false;
|
|
130
|
+
/**
|
|
131
|
+
* The pair this element last wired, so a change can be told from a re-notification.
|
|
132
|
+
*
|
|
133
|
+
* Both slots report, and at first assignment both report the same pair — so without
|
|
134
|
+
* this the wiring would run twice and the warning would be said twice for one trigger.
|
|
135
|
+
* It is also what makes the reference removable: an id can only be taken back out of a
|
|
136
|
+
* list the element does not own if the element remembers which id was its own, and
|
|
137
|
+
* which trigger it put there. #189
|
|
138
|
+
*/
|
|
139
|
+
#wired;
|
|
127
140
|
/**
|
|
128
141
|
* Whether the reader dismissed the tip and has not left the trigger since.
|
|
129
142
|
*
|
|
@@ -206,6 +219,10 @@ export class UiTooltip extends LitElement {
|
|
|
206
219
|
this.addEventListener('pointerleave', this.#onLeave, watched);
|
|
207
220
|
this.addEventListener('focusin', this.#onFocus, watched);
|
|
208
221
|
this.addEventListener('focusout', this.#onLeave, watched);
|
|
222
|
+
// A tooltip a framework moved in the tree comes back wired. `disconnectedCallback`
|
|
223
|
+
// withdraws the description, and nothing fires a `slotchange` on reconnection to
|
|
224
|
+
// put it back — the same argument the fresh `AbortController` above is here for.
|
|
225
|
+
this.#associate();
|
|
209
226
|
}
|
|
210
227
|
disconnectedCallback() {
|
|
211
228
|
// Removed while shown, the tip takes the window listeners with it. A tooltip that
|
|
@@ -213,11 +230,15 @@ export class UiTooltip extends LitElement {
|
|
|
213
230
|
// is no longer in a document.
|
|
214
231
|
this.#hide();
|
|
215
232
|
this.#listeners.abort();
|
|
233
|
+
// The trigger is this element's own child, so it usually leaves with it and has
|
|
234
|
+
// nobody left to describe. What this is for is the host that moves the trigger out
|
|
235
|
+
// first, and the framework that unmounts this element alone.
|
|
236
|
+
this.#unwire();
|
|
216
237
|
super.disconnectedCallback();
|
|
217
238
|
}
|
|
218
239
|
render() {
|
|
219
240
|
return html `
|
|
220
|
-
<slot></slot>
|
|
241
|
+
<slot @slotchange=${this.#associate}></slot>
|
|
221
242
|
<slot name="tip" @slotchange=${this.#associate}></slot>
|
|
222
243
|
`;
|
|
223
244
|
}
|
|
@@ -234,9 +255,19 @@ export class UiTooltip extends LitElement {
|
|
|
234
255
|
/**
|
|
235
256
|
* Makes the tip a popover, names it, and points the trigger at it.
|
|
236
257
|
*
|
|
237
|
-
*
|
|
238
|
-
*
|
|
239
|
-
*
|
|
258
|
+
* **Both slots report**, because a framework re-render replaces an element rather than
|
|
259
|
+
* mutating it and either end can be the one replaced — a tip that is only wired the
|
|
260
|
+
* first time stops being announced at a moment nothing reports, and a trigger that is
|
|
261
|
+
* only described the first time is a *new* trigger nothing describes at all. The
|
|
262
|
+
* second half was measured: replacing the trigger fires the default slot, which this
|
|
263
|
+
* element did not listen to. #189
|
|
264
|
+
*
|
|
265
|
+
* **The previous wiring is undone before the next one is made**, and that is the whole
|
|
266
|
+
* of the removal: the guard below returns when there is nothing to wire, so before
|
|
267
|
+
* {@link UiTooltip.#unwire} existed the one code path that knew the tip was gone was
|
|
268
|
+
* the path that did nothing about it — leaving the trigger pointing at an id that
|
|
269
|
+
* resolves to nothing, and leaving this element believing it owned an entry a later
|
|
270
|
+
* render would append beside.
|
|
240
271
|
*
|
|
241
272
|
* A `role` or an `id` the host wrote is never overwritten. `aria-describedby` is
|
|
242
273
|
* **added to** rather than replaced: the trigger may already be described by something
|
|
@@ -246,6 +277,11 @@ export class UiTooltip extends LitElement {
|
|
|
246
277
|
#associate = () => {
|
|
247
278
|
const trigger = this.#trigger();
|
|
248
279
|
const tip = this.#tip();
|
|
280
|
+
const wired = this.#wired;
|
|
281
|
+
if (wired !== undefined && wired.trigger === trigger && wired.tip === tip) {
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
this.#unwire();
|
|
249
285
|
if (trigger === undefined || tip === undefined) {
|
|
250
286
|
return;
|
|
251
287
|
}
|
|
@@ -259,14 +295,129 @@ export class UiTooltip extends LitElement {
|
|
|
259
295
|
tip.setAttribute('role', 'tooltip');
|
|
260
296
|
}
|
|
261
297
|
tip.setAttribute('popover', 'manual');
|
|
262
|
-
const described = (trigger
|
|
263
|
-
.split(' ')
|
|
264
|
-
.filter((id) => id !== '');
|
|
298
|
+
const described = describing(trigger);
|
|
265
299
|
if (!described.includes(tip.id)) {
|
|
266
300
|
trigger.setAttribute('aria-describedby', [...described, tip.id].join(' '));
|
|
267
301
|
}
|
|
268
|
-
|
|
302
|
+
// The sentence crosses to the trigger as a **copy**, so unlike the IDREF beside it
|
|
303
|
+
// it goes stale the moment the host touches the original — and `slotchange` fires
|
|
304
|
+
// when the tip element is *replaced* and for **neither** in-place edit, measured:
|
|
305
|
+
// not text rewritten through `textContent`, not a node appended to it. The three
|
|
306
|
+
// options are one decision: an edit can land on a descendant as readily as on the
|
|
307
|
+
// tip itself.
|
|
308
|
+
//
|
|
309
|
+
// It rides in the wiring rather than beside it so there is one thing to be absent
|
|
310
|
+
// rather than two — and the pair is what it speaks for, so a disconnected observer
|
|
311
|
+
// and a cleared pair cannot come apart. One per tooltip, over this element's own
|
|
312
|
+
// slotted child: the bridge this proposal rejected owed one observer **per
|
|
313
|
+
// control**, over a node each control had to resolve an id in first. RFC 0006
|
|
314
|
+
const observer = new MutationObserver(() => {
|
|
315
|
+
this.#hand(wiring);
|
|
316
|
+
});
|
|
317
|
+
const wiring = { trigger, tip, observer };
|
|
318
|
+
observer.observe(tip, { characterData: true, childList: true, subtree: true });
|
|
319
|
+
this.#wired = wiring;
|
|
320
|
+
this.#offer(wiring);
|
|
269
321
|
};
|
|
322
|
+
/**
|
|
323
|
+
* Hands the sentence over, once the trigger is in a state where refusal means refusal.
|
|
324
|
+
*
|
|
325
|
+
* A dispatch at an element whose definition has not arrived is heard by nobody and
|
|
326
|
+
* comes back **uncancelled** — which is exactly what a trigger that accepts no text
|
|
327
|
+
* returns. The two are indistinguishable, so warning on that answer would warn at an
|
|
328
|
+
* element that would have accepted. Measured, and measured again for the recovery:
|
|
329
|
+
* the upgrade fires no `slotchange`, no hook and no event at all, so this promise is
|
|
330
|
+
* the only signal there is and waiting on it is a requirement rather than a
|
|
331
|
+
* refinement. RFC 0006
|
|
332
|
+
*
|
|
333
|
+
* **The hyphen test is load-bearing rather than a shortcut**: `whenDefined` throws on
|
|
334
|
+
* a name that could never be a custom element, so `<button>` has to be answered
|
|
335
|
+
* before the registry is asked about it.
|
|
336
|
+
*/
|
|
337
|
+
#offer(wiring) {
|
|
338
|
+
const name = wiring.trigger.localName;
|
|
339
|
+
if (name.includes('-') && customElements.get(name) === undefined) {
|
|
340
|
+
void customElements.whenDefined(name).then(() => {
|
|
341
|
+
// The wiring can have moved on while the definition was travelling, and
|
|
342
|
+
// this element only ever speaks for the one it is holding now.
|
|
343
|
+
if (this.#wired === wiring) {
|
|
344
|
+
this.#hand(wiring);
|
|
345
|
+
}
|
|
346
|
+
});
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
this.#hand(wiring);
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* The dispatch itself, carrying whatever the tip says right now.
|
|
353
|
+
*
|
|
354
|
+
* **The most recent dispatch wins and a trigger never accumulates**: a tooltip has one
|
|
355
|
+
* tip, so this is a value being written rather than an item being added — and
|
|
356
|
+
* accumulation would owe a withdrawal per sentence, which this element has nothing to
|
|
357
|
+
* identify one by.
|
|
358
|
+
*
|
|
359
|
+
* **The advertisement is the return value.** A control that takes the text calls
|
|
360
|
+
* `preventDefault()`, so `dispatchEvent` comes back `false` exactly when someone
|
|
361
|
+
* accepted — which is why the warning below needs no roster of elements, and this
|
|
362
|
+
* proposal already recorded that a roster ages exactly like the sentence it replaced.
|
|
363
|
+
*/
|
|
364
|
+
#hand(wiring) {
|
|
365
|
+
// The markup around the sentence is not the sentence: a tip written across lines
|
|
366
|
+
// carries its indentation into `textContent`, and what the trigger renders is
|
|
367
|
+
// announced rather than laid out.
|
|
368
|
+
if (!this.#say(wiring.trigger, wiring.tip.textContent.trim())) {
|
|
369
|
+
this.#complain(wiring.trigger);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* The dispatch, which is the entire protocol.
|
|
374
|
+
*
|
|
375
|
+
* **One site for both directions**, the sentence and its withdrawal, and that is not
|
|
376
|
+
* only tidiness: the flags are the contract, and written twice only one copy would be
|
|
377
|
+
* read back. `cancelable` is what lets a control answer at all — without it
|
|
378
|
+
* `preventDefault()` does nothing and every trigger reads as refusing — so it belongs
|
|
379
|
+
* where the answer is consumed rather than beside a call that ignores it.
|
|
380
|
+
*
|
|
381
|
+
* @returns whether a control took it, which is the whole of the advertisement: the
|
|
382
|
+
* acknowledgement is `preventDefault()`, so no roster of elements is needed — and
|
|
383
|
+
* this proposal already recorded that a roster ages exactly like the sentence it
|
|
384
|
+
* replaced. RFC 0006
|
|
385
|
+
*/
|
|
386
|
+
#say(trigger, sentence) {
|
|
387
|
+
return !trigger.dispatchEvent(new CustomEvent('ui-describe', { detail: sentence, cancelable: true }));
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Takes back the one id this element wrote, and leaves every other one alone.
|
|
391
|
+
*
|
|
392
|
+
* The attribute is removed rather than left empty when nothing else was in it, because
|
|
393
|
+
* an empty `aria-describedby` is not the same shape as an absent one — `src/input.ts`
|
|
394
|
+
* keeps a whole helper for that distinction — and a trigger this element found bare
|
|
395
|
+
* should be bare again when it lets go.
|
|
396
|
+
*/
|
|
397
|
+
#unwire() {
|
|
398
|
+
const wired = this.#wired;
|
|
399
|
+
if (wired === undefined) {
|
|
400
|
+
return;
|
|
401
|
+
}
|
|
402
|
+
this.#wired = undefined;
|
|
403
|
+
wired.observer.disconnect();
|
|
404
|
+
// The withdrawal, on the same event rather than a second name: `detail` is a
|
|
405
|
+
// string whose empty value means *absent*, which is the shape `help` and `error`
|
|
406
|
+
// already have everywhere else in this package. Without it a control keeps
|
|
407
|
+
// pointing at text describing a tip the reader can no longer summon, which is
|
|
408
|
+
// worse than never having had it because it reads as current.
|
|
409
|
+
//
|
|
410
|
+
// The answer is not read here, and that is deliberate: a trigger that refuses to
|
|
411
|
+
// let go is not a trigger the description failed to reach, so {@link
|
|
412
|
+
// UiTooltip.#complain} has nothing to say about it. RFC 0006
|
|
413
|
+
this.#say(wired.trigger, '');
|
|
414
|
+
const remaining = describing(wired.trigger).filter((id) => id !== wired.tip.id);
|
|
415
|
+
if (remaining.length === 0) {
|
|
416
|
+
wired.trigger.removeAttribute('aria-describedby');
|
|
417
|
+
return;
|
|
418
|
+
}
|
|
419
|
+
wired.trigger.setAttribute('aria-describedby', remaining.join(' '));
|
|
420
|
+
}
|
|
270
421
|
/**
|
|
271
422
|
* Says out loud that the description will not arrive.
|
|
272
423
|
*
|
package/dist/tooltip.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tooltip.js","sourceRoot":"","sources":["../src/tooltip.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAuB,MAAM,KAAK,CAAC;AACjE,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,+DAA+D;AAC/D,IAAI,QAAQ,GAAG,CAAC,CAAC;AAEjB,iFAAiF;AACjF,MAAM,IAAI,GAAG,WAAW,CAAC;AAEzB;;;;;GAKG;AACH,MAAM,SAAS,GAAG,sDAAsD,CAAC;
|
|
1
|
+
{"version":3,"file":"tooltip.js","sourceRoot":"","sources":["../src/tooltip.ts"],"names":[],"mappings":"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"}
|