@bodil/dom 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/LICENCE.md +288 -0
  2. package/dist/component.d.ts +147 -0
  3. package/dist/component.js +405 -0
  4. package/dist/component.js.map +1 -0
  5. package/dist/component.test.d.ts +1 -0
  6. package/dist/component.test.js +141 -0
  7. package/dist/component.test.js.map +1 -0
  8. package/dist/css.d.ts +14 -0
  9. package/dist/css.js +63 -0
  10. package/dist/css.js.map +1 -0
  11. package/dist/decorators/attribute.d.ts +26 -0
  12. package/dist/decorators/attribute.js +115 -0
  13. package/dist/decorators/attribute.js.map +1 -0
  14. package/dist/decorators/attribute.test.d.ts +1 -0
  15. package/dist/decorators/attribute.test.js +148 -0
  16. package/dist/decorators/attribute.test.js.map +1 -0
  17. package/dist/decorators/connect.d.ts +9 -0
  18. package/dist/decorators/connect.js +44 -0
  19. package/dist/decorators/connect.js.map +1 -0
  20. package/dist/decorators/connect.test.d.ts +1 -0
  21. package/dist/decorators/connect.test.js +196 -0
  22. package/dist/decorators/connect.test.js.map +1 -0
  23. package/dist/decorators/reactive.d.ts +7 -0
  24. package/dist/decorators/reactive.js +45 -0
  25. package/dist/decorators/reactive.js.map +1 -0
  26. package/dist/decorators/reactive.test.d.ts +1 -0
  27. package/dist/decorators/reactive.test.js +113 -0
  28. package/dist/decorators/reactive.test.js.map +1 -0
  29. package/dist/decorators/require.d.ts +3 -0
  30. package/dist/decorators/require.js +6 -0
  31. package/dist/decorators/require.js.map +1 -0
  32. package/dist/decorators/require.test.d.ts +1 -0
  33. package/dist/decorators/require.test.js +117 -0
  34. package/dist/decorators/require.test.js.map +1 -0
  35. package/dist/dom.d.ts +92 -0
  36. package/dist/dom.js +354 -0
  37. package/dist/dom.js.map +1 -0
  38. package/dist/emitter.d.ts +10 -0
  39. package/dist/emitter.js +17 -0
  40. package/dist/emitter.js.map +1 -0
  41. package/dist/event.d.ts +70 -0
  42. package/dist/event.js +14 -0
  43. package/dist/event.js.map +1 -0
  44. package/dist/event.test.d.ts +1 -0
  45. package/dist/event.test.js +20 -0
  46. package/dist/event.test.js.map +1 -0
  47. package/dist/geometry.d.ts +48 -0
  48. package/dist/geometry.js +117 -0
  49. package/dist/geometry.js.map +1 -0
  50. package/dist/index.d.ts +10 -0
  51. package/dist/index.js +11 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/scheduler.d.ts +2 -0
  54. package/dist/scheduler.js +54 -0
  55. package/dist/scheduler.js.map +1 -0
  56. package/dist/slot.d.ts +31 -0
  57. package/dist/slot.js +67 -0
  58. package/dist/slot.js.map +1 -0
  59. package/dist/test-global.d.ts +0 -0
  60. package/dist/test-global.js +5 -0
  61. package/dist/test-global.js.map +1 -0
  62. package/package.json +116 -0
  63. package/src/component.test.ts +90 -0
  64. package/src/component.ts +607 -0
  65. package/src/css.ts +69 -0
  66. package/src/decorators/attribute.test.ts +77 -0
  67. package/src/decorators/attribute.ts +197 -0
  68. package/src/decorators/connect.test.ts +119 -0
  69. package/src/decorators/connect.ts +85 -0
  70. package/src/decorators/reactive.test.ts +45 -0
  71. package/src/decorators/reactive.ts +80 -0
  72. package/src/decorators/require.test.ts +57 -0
  73. package/src/decorators/require.ts +11 -0
  74. package/src/dom.ts +456 -0
  75. package/src/emitter.ts +32 -0
  76. package/src/event.test.ts +22 -0
  77. package/src/event.ts +74 -0
  78. package/src/geometry.ts +147 -0
  79. package/src/index.ts +12 -0
  80. package/src/scheduler.ts +58 -0
  81. package/src/slot.ts +95 -0
  82. package/src/test-global.ts +5 -0
@@ -0,0 +1,405 @@
1
+ var _a;
2
+ import { assert, isIterable, isNullish, present } from "@bodil/core/assert";
3
+ import { DisposableContext, toDisposable } from "@bodil/core/disposable";
4
+ import { Signal } from "@bodil/signal";
5
+ import { adoptStyles, getCompatibleStyle, nothing, render, unsafeCSS, } from "lit";
6
+ import { attributeConfig, detectAttributeType, fromAttribute, toAttribute, } from "./decorators/attribute";
7
+ import { connectedJobs } from "./decorators/connect";
8
+ import { reactiveFields, signalForObject } from "./decorators/reactive";
9
+ import { requiredProperties } from "./decorators/require";
10
+ import { childElements } from "./dom";
11
+ import { EmitterElement } from "./emitter";
12
+ import { eventListener } from "./event";
13
+ import { scheduler } from "./scheduler";
14
+ import { findSlot, getOrSetQuery, getOrSetSignal, SlotChangeController, } from "./slot";
15
+ export { attribute } from "./decorators/attribute";
16
+ export { connect, connectEffect, } from "./decorators/connect";
17
+ export { reactive } from "./decorators/reactive";
18
+ export { require } from "./decorators/require";
19
+ Symbol.metadata ??= Symbol.for("Symbol.metadata");
20
+ function listsEqual(as, bs) {
21
+ return as.length === bs.length && as.every((a, index) => Object.is(a, bs[index]));
22
+ }
23
+ const finalised = Symbol("finalised");
24
+ function processCSSStyleSpec(spec) {
25
+ return getCompatibleStyle(typeof spec === "string" ? unsafeCSS(spec) : spec);
26
+ }
27
+ export class Component extends EmitterElement {
28
+ static { this.deps = []; }
29
+ static { this.shadowRootOptions = { mode: "open" }; }
30
+ static { this.initialisers = new Set(); }
31
+ /** @ignore */
32
+ static { this.attributeConfig = new Map(); }
33
+ /** @ignore */
34
+ static { this.elementStyles = []; }
35
+ /** @ignore */
36
+ static { this.requiredProperties = new Set(); }
37
+ static { this[_a] = true; }
38
+ #controllers;
39
+ #connectedContext;
40
+ #isUpdatePending;
41
+ #updateSignal;
42
+ #updateSignalWatcher;
43
+ #updateResult;
44
+ #stabilised;
45
+ #rootPart;
46
+ #firstUpdate;
47
+ #initialised;
48
+ #viewTransitionRequested;
49
+ get isUpdatePending() {
50
+ return this.#isUpdatePending;
51
+ }
52
+ get updateComplete() {
53
+ return this.#updateResult.promise;
54
+ }
55
+ get hasStabilised() {
56
+ return this.#stabilised.promise;
57
+ }
58
+ #abortController;
59
+ get abortSignal() {
60
+ return this.#abortController.signal;
61
+ }
62
+ static addInitialiser(init) {
63
+ if (!Object.hasOwn(this, "initialisers")) {
64
+ this.initialisers = new Set();
65
+ }
66
+ this.initialisers.add(init);
67
+ }
68
+ static get observedAttributes() {
69
+ this.finalise();
70
+ return this.attributeConfig.keys().toArray();
71
+ }
72
+ static finalise() {
73
+ if (!Object.hasOwn(this, finalised)) {
74
+ this[finalised] = true;
75
+ const parent = Object.getPrototypeOf(this);
76
+ parent.finalise();
77
+ this.attributeConfig = new Map([
78
+ ...parent.attributeConfig,
79
+ ...(this[Symbol.metadata]?.[attributeConfig] ??
80
+ []),
81
+ ]);
82
+ this.requiredProperties = new Set([
83
+ ...parent.requiredProperties,
84
+ ...(this[Symbol.metadata]?.[requiredProperties] ?? []),
85
+ ]);
86
+ this.initialisers = new Set([...parent.initialisers, ...this.initialisers]);
87
+ this.elementStyles = [...parent.elementStyles];
88
+ if (Object.hasOwn(this, "styles")) {
89
+ if (Array.isArray(this.styles)) {
90
+ const sheets = new Set(this.styles
91
+ .flat(Infinity)
92
+ .reverse());
93
+ for (const sheet of sheets) {
94
+ this.elementStyles.unshift(processCSSStyleSpec(sheet));
95
+ }
96
+ }
97
+ else if (this.styles !== undefined) {
98
+ this.elementStyles.push(processCSSStyleSpec(this.styles));
99
+ }
100
+ }
101
+ }
102
+ }
103
+ constructor() {
104
+ super();
105
+ this.renderOptions = { host: this };
106
+ this.#controllers = new Set();
107
+ this.#connectedContext = new DisposableContext();
108
+ this.#isUpdatePending = false;
109
+ this.#updateSignalWatcher = new Signal.subtle.Watcher(() => this.requestUpdate());
110
+ this.#updateResult = Promise.withResolvers();
111
+ this.#stabilised = Promise.withResolvers();
112
+ this.#firstUpdate = false;
113
+ this.#initialised = false;
114
+ this.#viewTransitionRequested = false;
115
+ this.renderRoot = this.createRenderRoot();
116
+ this.#abortController = new AbortController();
117
+ // set up reactive fields, because decorators can't do this themselves
118
+ for (const field of this.constructor[Symbol.metadata]?.[reactiveFields] ?? []) {
119
+ const sig = signalForObject(this, field, () => Signal(undefined, { equals: Object.is }));
120
+ Object.defineProperty(this, field, {
121
+ get() {
122
+ return sig.get();
123
+ },
124
+ set(value) {
125
+ sig.set(value);
126
+ },
127
+ enumerable: true,
128
+ configurable: true,
129
+ });
130
+ }
131
+ // run initialisers
132
+ for (const init of this.constructor.initialisers) {
133
+ init.call(this);
134
+ }
135
+ this.#initialised = false;
136
+ }
137
+ connectedCallback() {
138
+ this.#connectedContext.dispose();
139
+ this.#controllers.forEach((c) => c.hostConnected?.());
140
+ this.#rootPart?.setConnected(true);
141
+ for (const [key, config] of this.constructor.attributeConfig.entries()) {
142
+ if (config.reflect) {
143
+ this.syncAttribute(key, config);
144
+ }
145
+ }
146
+ for (const job of connectedJobs(this)) {
147
+ const result = job.call(this);
148
+ const items = isNullish(result)
149
+ ? Iterator.from([])
150
+ : isIterable(result)
151
+ ? Iterator.from(result)
152
+ : Iterator.from([result]);
153
+ items.filter((i) => i !== undefined).forEach(this.useWhileConnected.bind(this));
154
+ }
155
+ this.useWhileConnected(Signal.effect(() => {
156
+ if (this.hasRequiredProperties().get()) {
157
+ if (!this.#initialised) {
158
+ this.#initialised = true;
159
+ this.firstInitialised();
160
+ }
161
+ this.initialised();
162
+ this.requestUpdate();
163
+ }
164
+ }));
165
+ this.requestUpdate();
166
+ }
167
+ disconnectedCallback() {
168
+ if (this.#updateSignal !== undefined) {
169
+ this.#updateSignalWatcher.unwatch(this.#updateSignal);
170
+ this.#updateSignal = undefined;
171
+ }
172
+ this.#isUpdatePending = false;
173
+ this.#abortController.abort(new DOMException(`${this.tagName} element disconnected`, "AbortError"));
174
+ this.#abortController = new AbortController();
175
+ this.#rootPart?.setConnected(false);
176
+ this.#controllers.forEach((c) => c.hostDisconnected?.());
177
+ this.#connectedContext.dispose();
178
+ }
179
+ attributeChangedCallback(name, old, valueString) {
180
+ if (old === valueString) {
181
+ return;
182
+ }
183
+ const attrConfig = this.constructor.attributeConfig.get(name);
184
+ assert(attrConfig !== undefined);
185
+ const value = fromAttribute(valueString, present(attrConfig.type, `@attribute decorator for ${this.constructor.name}.${name} needs a type declaration, eg. @attribute({type: String})`));
186
+ this[attrConfig.property] = value;
187
+ }
188
+ syncAttribute(name, config) {
189
+ if (this.isConnected) {
190
+ config ??= this.constructor.attributeConfig.get(name);
191
+ assert(config !== undefined);
192
+ if (config.reflect) {
193
+ const realValue = this[config.property];
194
+ config.type ??= detectAttributeType(realValue);
195
+ const value = toAttribute(realValue, present(config.type));
196
+ const oldValue = this.getAttribute(name);
197
+ if (value !== oldValue) {
198
+ if (value === null) {
199
+ this.removeAttribute(name);
200
+ }
201
+ else {
202
+ this.setAttribute(name, value);
203
+ }
204
+ }
205
+ }
206
+ }
207
+ }
208
+ $signal(prop) {
209
+ const _value = this[prop];
210
+ return signalForObject(this, prop, () => {
211
+ throw new TypeError(`Object has no reactive property ${JSON.stringify(prop)}`);
212
+ });
213
+ }
214
+ addController(controller) {
215
+ this.#controllers.add(controller);
216
+ if (this.renderRoot !== undefined && this.isConnected) {
217
+ controller.hostConnected?.();
218
+ }
219
+ }
220
+ removeController(controller) {
221
+ this.#controllers.delete(controller);
222
+ }
223
+ createRenderRoot() {
224
+ const renderRoot = this.shadowRoot ??
225
+ this.attachShadow(this.constructor.shadowRootOptions);
226
+ adoptStyles(renderRoot, [...this.constructor.elementStyles]);
227
+ this.renderOptions.renderBefore ??= renderRoot.firstChild;
228
+ return renderRoot;
229
+ }
230
+ requestUpdate(opts) {
231
+ if (opts?.viewTransition === true) {
232
+ this.#viewTransitionRequested = true;
233
+ }
234
+ if (!this.isUpdatePending && this.isConnected && this.#initialised) {
235
+ this.#isUpdatePending = true;
236
+ this.#updateResult = Promise.withResolvers();
237
+ scheduler(this);
238
+ }
239
+ }
240
+ #hasRequiredProperties;
241
+ hasRequiredProperties() {
242
+ if (this.#hasRequiredProperties === undefined) {
243
+ const requiredProperties = this.constructor.requiredProperties;
244
+ this.#hasRequiredProperties = Signal.computed(() => {
245
+ return requiredProperties.size === 0
246
+ ? true
247
+ : requiredProperties
248
+ .keys()
249
+ .every((key) => this[key] !== undefined);
250
+ },
251
+ // every signal update is relevant, even if the signal value doesn't
252
+ // change, because the required values probably did.
253
+ { equals: () => false });
254
+ }
255
+ return this.#hasRequiredProperties;
256
+ }
257
+ async performUpdate() {
258
+ let didFirstUpdate = false;
259
+ const runUpdate = () => {
260
+ this.#controllers.forEach((c) => c.hostUpdate?.());
261
+ this.update();
262
+ this.#controllers.forEach((c) => c.hostUpdated?.());
263
+ if (!this.#firstUpdate) {
264
+ this.#firstUpdate = true;
265
+ this.firstUpdated();
266
+ didFirstUpdate = true;
267
+ }
268
+ this.updated();
269
+ };
270
+ if (!this.isConnected || !this.isUpdatePending) {
271
+ return;
272
+ }
273
+ try {
274
+ if (this.#viewTransitionRequested &&
275
+ typeof document.startViewTransition === "function") {
276
+ this.#viewTransitionRequested = false;
277
+ await document.startViewTransition(runUpdate).finished;
278
+ }
279
+ else {
280
+ runUpdate();
281
+ }
282
+ this.#updateResult.resolve(true);
283
+ this.#isUpdatePending = false;
284
+ if (didFirstUpdate) {
285
+ await this.stabilise();
286
+ this.stabilised();
287
+ this.#stabilised.resolve();
288
+ }
289
+ }
290
+ catch (e) {
291
+ this.#updateResult.reject(e);
292
+ this.#isUpdatePending = false;
293
+ if (didFirstUpdate) {
294
+ this.#stabilised.reject(e);
295
+ }
296
+ }
297
+ }
298
+ update() {
299
+ if (this.#updateSignal !== undefined) {
300
+ this.#updateSignalWatcher.unwatch(this.#updateSignal);
301
+ }
302
+ this.#updateSignal = Signal.computed(() => {
303
+ this.renderOptions.isConnected = this.isConnected;
304
+ this.#rootPart = render(this.render(), this.renderRoot, this.renderOptions);
305
+ });
306
+ this.#updateSignalWatcher.watch(this.#updateSignal);
307
+ this.#updateSignal.get();
308
+ }
309
+ findChildComponents(root = this.renderRoot) {
310
+ let all = childElements(root).toArray();
311
+ const top = [...all];
312
+ for (const el of top) {
313
+ all = [...all, ...this.findChildComponents(el)];
314
+ }
315
+ return Iterator.from(all).filter((el) => el instanceof Component);
316
+ }
317
+ async stabilise() {
318
+ // wait for children to stabilise
319
+ const children = this.findChildComponents();
320
+ // eslint-disable-next-line no-console
321
+ await Promise.all(children.map((child) => child.hasStabilised)).catch(console.error);
322
+ }
323
+ updated() {
324
+ // called when an update has completed
325
+ }
326
+ firstUpdated() {
327
+ // called when the first update has completed, and before
328
+ // {@link Component.updated}.
329
+ }
330
+ stabilised() {
331
+ // called when the component has stabilised after its first update
332
+ }
333
+ initialised() {
334
+ // called when a property marked `@require` has changed and every
335
+ // such property is non-`undefined`.
336
+ }
337
+ firstInitialised() {
338
+ // called the first time all properties marked `@require` become
339
+ // defined, and before {@link Component.initialised}.
340
+ }
341
+ render() {
342
+ return nothing;
343
+ }
344
+ [(_a = finalised, Symbol.dispose)]() {
345
+ for (const child of this.findChildComponents()) {
346
+ child[Symbol.dispose]();
347
+ }
348
+ this.disconnectedCallback();
349
+ this.#rootPart?._$clear?.();
350
+ this.#rootPart = undefined;
351
+ this.remove();
352
+ }
353
+ useWhileConnected(disposifiable) {
354
+ if (isNullish(disposifiable)) {
355
+ return disposifiable;
356
+ }
357
+ const disposable = toDisposable(disposifiable);
358
+ this.#connectedContext.use(disposable);
359
+ return disposable;
360
+ }
361
+ on(type, callback, options) {
362
+ return eventListener(this, type, callback, options);
363
+ }
364
+ /**
365
+ * If an element that is either inside this element's shadow root or is a
366
+ * child of this element (ie. slotted) currently has focus, return that
367
+ * element. Otherwise, return null.
368
+ */
369
+ getFocusedElement() {
370
+ return this.shadowRoot?.activeElement ?? this.querySelector(":focus");
371
+ }
372
+ query(selector) {
373
+ return this.renderRoot.querySelector(selector);
374
+ }
375
+ queryAll(selector) {
376
+ return this.renderRoot.querySelectorAll(selector);
377
+ }
378
+ querySlot(options) {
379
+ const { slot, selector, instanceOf, nodes, reactive } = options ?? {};
380
+ const query = getOrSetQuery(this, options ?? {}, () => (slotEl) => {
381
+ const elements = isNullish(slotEl)
382
+ ? []
383
+ : nodes === true
384
+ ? slotEl.assignedNodes(options)
385
+ : slotEl.assignedElements(options);
386
+ const selectedElements = selector !== undefined && nodes !== true
387
+ ? elements.filter((node) => node.matches(selector))
388
+ : elements;
389
+ return instanceOf !== undefined
390
+ ? selectedElements.filter((el) => el instanceof instanceOf)
391
+ : selectedElements;
392
+ });
393
+ const slotEl = findSlot(this, slot);
394
+ if (reactive !== true) {
395
+ return query(slotEl);
396
+ }
397
+ const sig = getOrSetSignal(this, query, () => {
398
+ const sig = Signal(query(slotEl), { equals: listsEqual });
399
+ this.addController(new SlotChangeController(this, slot, sig, query));
400
+ return sig.readOnly();
401
+ });
402
+ return sig;
403
+ }
404
+ }
405
+ //# sourceMappingURL=component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component.js","sourceRoot":"","sources":["../src/component.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,141 @@
1
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
2
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
3
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
4
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
5
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
6
+ var _, done = false;
7
+ for (var i = decorators.length - 1; i >= 0; i--) {
8
+ var context = {};
9
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
10
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
11
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
12
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
13
+ if (kind === "accessor") {
14
+ if (result === void 0) continue;
15
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
16
+ if (_ = accept(result.get)) descriptor.get = _;
17
+ if (_ = accept(result.set)) descriptor.set = _;
18
+ if (_ = accept(result.init)) initializers.unshift(_);
19
+ }
20
+ else if (_ = accept(result)) {
21
+ if (kind === "field") initializers.unshift(_);
22
+ else descriptor[key] = _;
23
+ }
24
+ }
25
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
26
+ done = true;
27
+ };
28
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
29
+ var useValue = arguments.length > 2;
30
+ for (var i = 0; i < initializers.length; i++) {
31
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
32
+ }
33
+ return useValue ? value : void 0;
34
+ };
35
+ import { html } from "lit";
36
+ import { customElement } from "lit/decorators.js";
37
+ import { createRef, ref } from "lit/directives/ref.js";
38
+ import { expect, expectTypeOf, test } from "vitest";
39
+ import { Component } from "./component";
40
+ test("Component.query", async () => {
41
+ let QueryTestClass = (() => {
42
+ let _classDecorators = [customElement("query-test-class")];
43
+ let _classDescriptor;
44
+ let _classExtraInitializers = [];
45
+ let _classThis;
46
+ let _classSuper = Component;
47
+ var QueryTestClass = class extends _classSuper {
48
+ static { _classThis = this; }
49
+ constructor() {
50
+ super(...arguments);
51
+ this.div = createRef();
52
+ this.p = createRef();
53
+ }
54
+ static {
55
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
56
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
57
+ QueryTestClass = _classThis = _classDescriptor.value;
58
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
59
+ __runInitializers(_classThis, _classExtraInitializers);
60
+ }
61
+ render() {
62
+ return html `<div ${ref(this.div)} class="welp"></div>
63
+ <p ${ref(this.p)} class="welp"></p>`;
64
+ }
65
+ };
66
+ return QueryTestClass = _classThis;
67
+ })();
68
+ const t = document.createElement("query-test-class");
69
+ document.body.append(t);
70
+ await t.updateComplete;
71
+ expect(t.query("div")).toBe(t.div.value);
72
+ expectTypeOf(t.query("div")).toEqualTypeOf();
73
+ expect(t.query("p")).toBe(t.p.value);
74
+ expectTypeOf(t.query("p")).toEqualTypeOf();
75
+ expect(t.query(".welp")).toBe(t.div.value);
76
+ expectTypeOf(t.query(".welp")).toEqualTypeOf();
77
+ expect(Array.from(t.queryAll("div"))).deep.equal([t.div.value]);
78
+ expectTypeOf(t.queryAll("div")).toEqualTypeOf();
79
+ expect(Array.from(t.queryAll("p"))).deep.equal([t.p.value]);
80
+ expectTypeOf(t.queryAll("p")).toEqualTypeOf();
81
+ expect(Array.from(t.queryAll(".welp"))).deep.equal([t.div.value, t.p.value]);
82
+ expectTypeOf(t.queryAll(".welp")).toEqualTypeOf();
83
+ });
84
+ test("Component.querySlot", async () => {
85
+ let QuerySlotTestClass = (() => {
86
+ let _classDecorators = [customElement("query-slot-test-class")];
87
+ let _classDescriptor;
88
+ let _classExtraInitializers = [];
89
+ let _classThis;
90
+ let _classSuper = Component;
91
+ var QuerySlotTestClass = class extends _classSuper {
92
+ static { _classThis = this; }
93
+ static {
94
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
95
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
96
+ QuerySlotTestClass = _classThis = _classDescriptor.value;
97
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
98
+ __runInitializers(_classThis, _classExtraInitializers);
99
+ }
100
+ render() {
101
+ return html `<slot></slot><slot name="fixes-the-bug"></slot>`;
102
+ }
103
+ };
104
+ return QuerySlotTestClass = _classThis;
105
+ })();
106
+ const t = document.createElement("query-slot-test-class");
107
+ document.body.append(t);
108
+ const e = (cls, slot) => {
109
+ const el = document.createElement("div");
110
+ el.classList.add(cls);
111
+ if (slot !== undefined) {
112
+ el.slot = slot;
113
+ }
114
+ t.append(el);
115
+ return el;
116
+ };
117
+ const joe = e("joe");
118
+ const mike = e("mike");
119
+ const robert = e("robert", "fixes-the-bug");
120
+ await t.updateComplete;
121
+ expect(t.querySlot()).deep.equal([joe, mike]);
122
+ expect(t.querySlot({ slot: "fixes-the-bug" })).deep.equal([robert]);
123
+ const slot = t.querySlot({ slot: "fixes-the-bug", reactive: true });
124
+ expectTypeOf(slot).toEqualTypeOf();
125
+ expect(slot.get()).deep.equal([robert]);
126
+ joe.slot = "fixes-the-bug"; // for argument's sake
127
+ expect(slot.get()).deep.equal([joe, robert]);
128
+ expect(t.querySlot()).deep.equal([mike]);
129
+ robert.removeAttribute("slot");
130
+ expect(slot.get()).deep.equal([joe]);
131
+ expect(t.querySlot()).deep.equal([mike, robert]);
132
+ const divsByInstance = t.querySlot({ instanceOf: HTMLDivElement });
133
+ expectTypeOf(divsByInstance).toEqualTypeOf();
134
+ expect(divsByInstance).deep.equal([mike, robert]);
135
+ const divsBySelector = t.querySlot({ selector: "div" });
136
+ expectTypeOf(divsBySelector).toEqualTypeOf();
137
+ expect(divsBySelector).deep.equal([mike, robert]);
138
+ expect(t.querySlot({ selector: "div.robert" })).deep.equal([robert]);
139
+ expectTypeOf(t.querySlot({ nodes: true })).toEqualTypeOf();
140
+ });
141
+ //# sourceMappingURL=component.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component.test.js","sourceRoot":"","sources":["../src/component.test.ts"],"names":[],"mappings":"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"}
package/dist/css.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ import { Option } from "@bodil/opt";
2
+ export type Pixels = number;
3
+ /**
4
+ * Get a computed CSS property for an element.
5
+ */
6
+ export declare function getComputedProperty(element: Element, property: string): Option<string>;
7
+ /**
8
+ * Parse a CSS size value with units into pixels.
9
+ */
10
+ export declare function parseSize(value: string): Option<Pixels>;
11
+ /**
12
+ * Parse a CSS time value with units into milliseconds.
13
+ */
14
+ export declare function parseTime(value: string): Option<number>;
package/dist/css.js ADDED
@@ -0,0 +1,63 @@
1
+ import { assert } from "@bodil/core/assert";
2
+ import { None, Option, Some } from "@bodil/opt";
3
+ /**
4
+ * Get a computed CSS property for an element.
5
+ */
6
+ export function getComputedProperty(element, property) {
7
+ return Option.from(window.getComputedStyle(element)?.getPropertyValue(property));
8
+ }
9
+ const NUMBER_MATCHER = /^(?<number>[+-]?\d+(?:[.]\d+)?(?:e\d+)?)(?<unit>[a-zA-Z]+)$/;
10
+ function parseWithUnit(value) {
11
+ const match = NUMBER_MATCHER.exec(value.trim());
12
+ if (match?.groups === undefined) {
13
+ return None;
14
+ }
15
+ assert(match.groups.number !== undefined);
16
+ assert(match.groups.unit !== undefined);
17
+ const number = Number.parseFloat(match.groups.number);
18
+ if (Number.isNaN(number)) {
19
+ return None;
20
+ }
21
+ return Some({ number, unit: match.groups.unit });
22
+ }
23
+ /**
24
+ * Parse a CSS size value with units into pixels.
25
+ */
26
+ export function parseSize(value) {
27
+ return parseWithUnit(value).chain(({ number, unit }) => {
28
+ switch (unit) {
29
+ case "px":
30
+ return Some(number);
31
+ case "cm":
32
+ return Some((number * 96) / 2.54);
33
+ case "mm":
34
+ return Some((number * 96) / 0.254);
35
+ case "Q":
36
+ return Some((number * 96) / 0.0635);
37
+ case "in":
38
+ return Some(number * 96);
39
+ case "pc":
40
+ return Some((number * 96) / 6);
41
+ case "pt":
42
+ return Some((number * 96) / 72);
43
+ default:
44
+ return None;
45
+ }
46
+ });
47
+ }
48
+ /**
49
+ * Parse a CSS time value with units into milliseconds.
50
+ */
51
+ export function parseTime(value) {
52
+ return parseWithUnit(value).chain(({ number, unit }) => {
53
+ switch (unit) {
54
+ case "ms":
55
+ return Some(number);
56
+ case "s":
57
+ return Some(number * 1000);
58
+ default:
59
+ return None;
60
+ }
61
+ });
62
+ }
63
+ //# sourceMappingURL=css.js.map