@rak200/ui 0.6.3 → 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 +105 -10
- 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,14 +12,6 @@ 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
|
-
/**
|
|
16
|
-
* The ids already describing a trigger, as a list rather than the attribute's string.
|
|
17
|
-
*
|
|
18
|
-
* Both halves of the wiring read it — one to add an id, the other to take the same one
|
|
19
|
-
* back out — and they have to agree about what the string means. The empty filter is what
|
|
20
|
-
* makes an absent attribute an empty list: `''.split(' ')` is `['']`, and a list with one
|
|
21
|
-
* empty entry joins back with a leading space.
|
|
22
|
-
*/
|
|
23
15
|
function describing(trigger) {
|
|
24
16
|
return (trigger.getAttribute('aria-describedby') ?? '').split(' ').filter((id) => id !== '');
|
|
25
17
|
}
|
|
@@ -227,6 +219,10 @@ export class UiTooltip extends LitElement {
|
|
|
227
219
|
this.addEventListener('pointerleave', this.#onLeave, watched);
|
|
228
220
|
this.addEventListener('focusin', this.#onFocus, watched);
|
|
229
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();
|
|
230
226
|
}
|
|
231
227
|
disconnectedCallback() {
|
|
232
228
|
// Removed while shown, the tip takes the window listeners with it. A tooltip that
|
|
@@ -234,6 +230,10 @@ export class UiTooltip extends LitElement {
|
|
|
234
230
|
// is no longer in a document.
|
|
235
231
|
this.#hide();
|
|
236
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();
|
|
237
237
|
super.disconnectedCallback();
|
|
238
238
|
}
|
|
239
239
|
render() {
|
|
@@ -299,9 +299,93 @@ export class UiTooltip extends LitElement {
|
|
|
299
299
|
if (!described.includes(tip.id)) {
|
|
300
300
|
trigger.setAttribute('aria-describedby', [...described, tip.id].join(' '));
|
|
301
301
|
}
|
|
302
|
-
|
|
303
|
-
|
|
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);
|
|
304
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
|
+
}
|
|
305
389
|
/**
|
|
306
390
|
* Takes back the one id this element wrote, and leaves every other one alone.
|
|
307
391
|
*
|
|
@@ -316,6 +400,17 @@ export class UiTooltip extends LitElement {
|
|
|
316
400
|
return;
|
|
317
401
|
}
|
|
318
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, '');
|
|
319
414
|
const remaining = describing(wired.trigger).filter((id) => id !== wired.tip.id);
|
|
320
415
|
if (remaining.length === 0) {
|
|
321
416
|
wired.trigger.removeAttribute('aria-describedby');
|
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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"}
|