@social.io/catalog 2.0.0 → 2.1.1

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.
@@ -0,0 +1,577 @@
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 { DeesElement, css, customElement, directives, html, property, state, } from '@design.estate/dees-element';
36
+ import { SioLogoRenderer, sioLogoAspect, } from './sio-logo-render.js';
37
+ import { sioElementStyles } from './tokens.js';
38
+ /**
39
+ * The social.io faceted S brand mark from the v8 design prototype.
40
+ *
41
+ * Geometry and animation run on an OffscreenCanvas in a module worker when the
42
+ * browser and consumer bundle support it. The same renderer is used on the
43
+ * main thread as a safe fallback.
44
+ */
45
+ let SioLogo = (() => {
46
+ let _classDecorators = [customElement('sio-logo')];
47
+ let _classDescriptor;
48
+ let _classExtraInitializers = [];
49
+ let _classThis;
50
+ let _classSuper = DeesElement;
51
+ let _size_decorators;
52
+ let _size_initializers = [];
53
+ let _size_extraInitializers = [];
54
+ let _background_decorators;
55
+ let _background_initializers = [];
56
+ let _background_extraInitializers = [];
57
+ let _gap_decorators;
58
+ let _gap_initializers = [];
59
+ let _gap_extraInitializers = [];
60
+ let _radius_decorators;
61
+ let _radius_initializers = [];
62
+ let _radius_extraInitializers = [];
63
+ let _square_decorators;
64
+ let _square_initializers = [];
65
+ let _square_extraInitializers = [];
66
+ let _mono_decorators;
67
+ let _mono_initializers = [];
68
+ let _mono_extraInitializers = [];
69
+ let _theme_decorators;
70
+ let _theme_initializers = [];
71
+ let _theme_extraInitializers = [];
72
+ let _loading_decorators;
73
+ let _loading_initializers = [];
74
+ let _loading_extraInitializers = [];
75
+ let _noEntrance_decorators;
76
+ let _noEntrance_initializers = [];
77
+ let _noEntrance_extraInitializers = [];
78
+ let _noHover_decorators;
79
+ let _noHover_initializers = [];
80
+ let _noHover_extraInitializers = [];
81
+ let _canvasGeneration_decorators;
82
+ let _canvasGeneration_initializers = [];
83
+ let _canvasGeneration_extraInitializers = [];
84
+ var SioLogo = class extends _classSuper {
85
+ static { _classThis = this; }
86
+ static {
87
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
88
+ _size_decorators = [property({ type: Number })];
89
+ _background_decorators = [property({ type: String })];
90
+ _gap_decorators = [property({ type: Number })];
91
+ _radius_decorators = [property({ type: Number })];
92
+ _square_decorators = [property({ type: Boolean })];
93
+ _mono_decorators = [property({ type: String })];
94
+ _theme_decorators = [property({ type: String })];
95
+ _loading_decorators = [property({ type: Boolean, reflect: true })];
96
+ _noEntrance_decorators = [property({ type: Boolean, attribute: 'no-entrance' })];
97
+ _noHover_decorators = [property({ type: Boolean, attribute: 'no-hover' })];
98
+ _canvasGeneration_decorators = [state()];
99
+ __esDecorate(this, null, _size_decorators, { kind: "accessor", name: "size", static: false, private: false, access: { has: obj => "size" in obj, get: obj => obj.size, set: (obj, value) => { obj.size = value; } }, metadata: _metadata }, _size_initializers, _size_extraInitializers);
100
+ __esDecorate(this, null, _background_decorators, { kind: "accessor", name: "background", static: false, private: false, access: { has: obj => "background" in obj, get: obj => obj.background, set: (obj, value) => { obj.background = value; } }, metadata: _metadata }, _background_initializers, _background_extraInitializers);
101
+ __esDecorate(this, null, _gap_decorators, { kind: "accessor", name: "gap", static: false, private: false, access: { has: obj => "gap" in obj, get: obj => obj.gap, set: (obj, value) => { obj.gap = value; } }, metadata: _metadata }, _gap_initializers, _gap_extraInitializers);
102
+ __esDecorate(this, null, _radius_decorators, { kind: "accessor", name: "radius", static: false, private: false, access: { has: obj => "radius" in obj, get: obj => obj.radius, set: (obj, value) => { obj.radius = value; } }, metadata: _metadata }, _radius_initializers, _radius_extraInitializers);
103
+ __esDecorate(this, null, _square_decorators, { kind: "accessor", name: "square", static: false, private: false, access: { has: obj => "square" in obj, get: obj => obj.square, set: (obj, value) => { obj.square = value; } }, metadata: _metadata }, _square_initializers, _square_extraInitializers);
104
+ __esDecorate(this, null, _mono_decorators, { kind: "accessor", name: "mono", static: false, private: false, access: { has: obj => "mono" in obj, get: obj => obj.mono, set: (obj, value) => { obj.mono = value; } }, metadata: _metadata }, _mono_initializers, _mono_extraInitializers);
105
+ __esDecorate(this, null, _theme_decorators, { kind: "accessor", name: "theme", static: false, private: false, access: { has: obj => "theme" in obj, get: obj => obj.theme, set: (obj, value) => { obj.theme = value; } }, metadata: _metadata }, _theme_initializers, _theme_extraInitializers);
106
+ __esDecorate(this, null, _loading_decorators, { kind: "accessor", name: "loading", static: false, private: false, access: { has: obj => "loading" in obj, get: obj => obj.loading, set: (obj, value) => { obj.loading = value; } }, metadata: _metadata }, _loading_initializers, _loading_extraInitializers);
107
+ __esDecorate(this, null, _noEntrance_decorators, { kind: "accessor", name: "noEntrance", static: false, private: false, access: { has: obj => "noEntrance" in obj, get: obj => obj.noEntrance, set: (obj, value) => { obj.noEntrance = value; } }, metadata: _metadata }, _noEntrance_initializers, _noEntrance_extraInitializers);
108
+ __esDecorate(this, null, _noHover_decorators, { kind: "accessor", name: "noHover", static: false, private: false, access: { has: obj => "noHover" in obj, get: obj => obj.noHover, set: (obj, value) => { obj.noHover = value; } }, metadata: _metadata }, _noHover_initializers, _noHover_extraInitializers);
109
+ __esDecorate(this, null, _canvasGeneration_decorators, { kind: "accessor", name: "canvasGeneration", static: false, private: false, access: { has: obj => "canvasGeneration" in obj, get: obj => obj.canvasGeneration, set: (obj, value) => { obj.canvasGeneration = value; } }, metadata: _metadata }, _canvasGeneration_initializers, _canvasGeneration_extraInitializers);
110
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
111
+ SioLogo = _classThis = _classDescriptor.value;
112
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
113
+ }
114
+ static demo = () => html `
115
+ <div style="display:flex;align-items:center;gap:32px;padding:24px;background:#101012;">
116
+ <sio-logo size="120" theme="dark"></sio-logo>
117
+ <sio-logo size="120" square background="#556270" radius="22" theme="dark"></sio-logo>
118
+ <sio-logo size="120" loading theme="dark"></sio-logo>
119
+ <sio-logo size="120" mono="#ffffff" no-entrance theme="dark"></sio-logo>
120
+ </div>
121
+ `;
122
+ #size_accessor_storage = __runInitializers(this, _size_initializers, 40);
123
+ /** rendered height in CSS pixels; tight-crop width follows the brand aspect */
124
+ get size() { return this.#size_accessor_storage; }
125
+ set size(value) { this.#size_accessor_storage = value; }
126
+ #background_accessor_storage = (__runInitializers(this, _size_extraInitializers), __runInitializers(this, _background_initializers, 'transparent'));
127
+ get background() { return this.#background_accessor_storage; }
128
+ set background(value) { this.#background_accessor_storage = value; }
129
+ #gap_accessor_storage = (__runInitializers(this, _background_extraInitializers), __runInitializers(this, _gap_initializers, 2));
130
+ /** inward inset per facet, in 500px design-grid units */
131
+ get gap() { return this.#gap_accessor_storage; }
132
+ set gap(value) { this.#gap_accessor_storage = value; }
133
+ #radius_accessor_storage = (__runInitializers(this, _gap_extraInitializers), __runInitializers(this, _radius_initializers, 16));
134
+ /** facet corner radius, in 500px design-grid units */
135
+ get radius() { return this.#radius_accessor_storage; }
136
+ set radius(value) { this.#radius_accessor_storage = value; }
137
+ #square_accessor_storage = (__runInitializers(this, _radius_extraInitializers), __runInitializers(this, _square_initializers, false));
138
+ /** render on a square tile instead of the tight S crop */
139
+ get square() { return this.#square_accessor_storage; }
140
+ set square(value) { this.#square_accessor_storage = value; }
141
+ #mono_accessor_storage = (__runInitializers(this, _square_extraInitializers), __runInitializers(this, _mono_initializers, ''));
142
+ /** collapse the palette to one color while retaining facet depth */
143
+ get mono() { return this.#mono_accessor_storage; }
144
+ set mono(value) { this.#mono_accessor_storage = value; }
145
+ #theme_accessor_storage = (__runInitializers(this, _mono_extraInitializers), __runInitializers(this, _theme_initializers, 'auto'));
146
+ /** backdrop palette; auto follows the nearest opaque surface */
147
+ get theme() { return this.#theme_accessor_storage; }
148
+ set theme(value) { this.#theme_accessor_storage = value; }
149
+ #loading_accessor_storage = (__runInitializers(this, _theme_extraInitializers), __runInitializers(this, _loading_initializers, false));
150
+ get loading() { return this.#loading_accessor_storage; }
151
+ set loading(value) { this.#loading_accessor_storage = value; }
152
+ #noEntrance_accessor_storage = (__runInitializers(this, _loading_extraInitializers), __runInitializers(this, _noEntrance_initializers, false));
153
+ get noEntrance() { return this.#noEntrance_accessor_storage; }
154
+ set noEntrance(value) { this.#noEntrance_accessor_storage = value; }
155
+ #noHover_accessor_storage = (__runInitializers(this, _noEntrance_extraInitializers), __runInitializers(this, _noHover_initializers, false));
156
+ get noHover() { return this.#noHover_accessor_storage; }
157
+ set noHover(value) { this.#noHover_accessor_storage = value; }
158
+ #canvasGeneration_accessor_storage = (__runInitializers(this, _noHover_extraInitializers), __runInitializers(this, _canvasGeneration_initializers, 0));
159
+ get canvasGeneration() { return this.#canvasGeneration_accessor_storage; }
160
+ set canvasGeneration(value) { this.#canvasGeneration_accessor_storage = value; }
161
+ static styles = [
162
+ ...sioElementStyles,
163
+ css `
164
+ :host {
165
+ display: inline-flex;
166
+ flex: none;
167
+ line-height: 0;
168
+ }
169
+ canvas {
170
+ display: block;
171
+ }
172
+ `,
173
+ ];
174
+ backendState = (__runInitializers(this, _canvasGeneration_extraInitializers), 'idle');
175
+ worker = null;
176
+ renderer = null;
177
+ canvasTransferred = false;
178
+ forceMainThread = false;
179
+ initializationTimeout = null;
180
+ initializationGeneration = 0;
181
+ lifecycleGeneration = 0;
182
+ initialUpdateHandled = false;
183
+ queuedOptions = false;
184
+ queuedPhase = null;
185
+ themeObserver = null;
186
+ reducedMotionMedia = null;
187
+ lastDevicePixelRatio = 0;
188
+ lastLight = null;
189
+ handlePointerEnter = () => {
190
+ if (!this.noHover && !this.loading && !this.prefersReducedMotion())
191
+ this.wave();
192
+ };
193
+ handleAmbientChange = () => {
194
+ if (this.theme !== 'auto')
195
+ return;
196
+ const light = this.isLightBackdrop();
197
+ if (light === this.lastLight)
198
+ return;
199
+ this.lastLight = light;
200
+ this.syncRendererOptions();
201
+ };
202
+ handleReducedMotionChange = () => {
203
+ if (this.prefersReducedMotion())
204
+ this.sendPhase('stop');
205
+ else if (this.loading)
206
+ this.sendPhase('loading');
207
+ };
208
+ handleResize = () => {
209
+ const devicePixelRatio = window.devicePixelRatio || 1;
210
+ if (devicePixelRatio === this.lastDevicePixelRatio)
211
+ return;
212
+ this.syncRendererOptions();
213
+ };
214
+ async connectedCallback() {
215
+ const generation = ++this.lifecycleGeneration;
216
+ const connection = super.connectedCallback();
217
+ this.ensureAccessibleHost();
218
+ this.addEventListener('mouseenter', this.handlePointerEnter);
219
+ window.addEventListener('resize', this.handleResize);
220
+ this.observeReducedMotion();
221
+ await connection;
222
+ await this.updateComplete;
223
+ if (!this.isConnected || generation !== this.lifecycleGeneration)
224
+ return;
225
+ this.observeAmbientTheme();
226
+ if (this.hasUpdated && this.backendState === 'idle')
227
+ this.initializeCanvas();
228
+ }
229
+ async disconnectedCallback() {
230
+ const generation = ++this.lifecycleGeneration;
231
+ this.cleanupOwnedResources(true);
232
+ await super.disconnectedCallback();
233
+ if (!this.isConnected && generation === this.lifecycleGeneration) {
234
+ this.cleanupOwnedResources(true);
235
+ }
236
+ }
237
+ cleanupOwnedResources(replaceTransferredCanvas) {
238
+ this.removeEventListener('mouseenter', this.handlePointerEnter);
239
+ window.removeEventListener('resize', this.handleResize);
240
+ this.stopAmbientThemeObservation();
241
+ this.stopReducedMotionObservation();
242
+ this.destroyBackend(replaceTransferredCanvas);
243
+ }
244
+ render() {
245
+ const height = this.normalizedSize;
246
+ const width = this.square ? height : Math.round(height * sioLogoAspect);
247
+ return html `${directives.keyed(this.canvasGeneration, html `<canvas aria-hidden="true" style="width:${width}px;height:${height}px"></canvas>`)}`;
248
+ }
249
+ firstUpdated(changedProperties) {
250
+ super.firstUpdated(changedProperties);
251
+ this.observeAmbientTheme();
252
+ this.initializeCanvas();
253
+ }
254
+ updated(changedProperties) {
255
+ if (!this.initialUpdateHandled) {
256
+ this.initialUpdateHandled = true;
257
+ return;
258
+ }
259
+ if (!this.isConnected)
260
+ return;
261
+ if (changedProperties.has('canvasGeneration')) {
262
+ this.initializeCanvas();
263
+ return;
264
+ }
265
+ const shapeProperties = [
266
+ 'size',
267
+ 'gap',
268
+ 'radius',
269
+ 'square',
270
+ 'background',
271
+ 'mono',
272
+ ];
273
+ if (shapeProperties.some((propertyName) => changedProperties.has(propertyName))) {
274
+ this.syncRendererOptions();
275
+ }
276
+ if (changedProperties.has('theme')) {
277
+ this.stopAmbientThemeObservation();
278
+ this.observeAmbientTheme();
279
+ this.syncRendererOptions();
280
+ }
281
+ if (changedProperties.has('loading')) {
282
+ this.sendPhase(this.loading && !this.prefersReducedMotion() ? 'loading' : 'stop');
283
+ }
284
+ }
285
+ themeChanged() {
286
+ this.handleAmbientChange();
287
+ }
288
+ play() {
289
+ if (!this.isConnected)
290
+ return;
291
+ this.sendPhase(this.prefersReducedMotion() ? 'stop' : 'in');
292
+ }
293
+ wave() {
294
+ if (!this.isConnected)
295
+ return;
296
+ this.sendPhase(this.prefersReducedMotion() ? 'stop' : 'wave');
297
+ }
298
+ dismiss() {
299
+ if (!this.isConnected)
300
+ return;
301
+ this.sendPhase(this.prefersReducedMotion() ? 'clear' : 'out');
302
+ }
303
+ initializeCanvas() {
304
+ if (!this.isConnected || this.backendState !== 'idle')
305
+ return;
306
+ const canvas = this.shadowRoot?.querySelector('canvas');
307
+ if (!canvas)
308
+ return;
309
+ const generation = ++this.initializationGeneration;
310
+ const supportsWorker = !this.forceMainThread &&
311
+ typeof Worker === 'function' &&
312
+ typeof canvas.transferControlToOffscreen === 'function';
313
+ if (!supportsWorker) {
314
+ this.initializeMainThread(canvas, generation);
315
+ return;
316
+ }
317
+ try {
318
+ const worker = new Worker(new URL('./sio-logo-worker.js', import.meta.url), {
319
+ type: 'module',
320
+ name: 'sio-logo',
321
+ });
322
+ this.worker = worker;
323
+ this.backendState = 'worker-loading';
324
+ worker.onmessage = (event) => {
325
+ if (event.data?.type === 'ready') {
326
+ this.handleWorkerReady(worker, canvas, generation);
327
+ }
328
+ else if (event.data?.type === 'initialized') {
329
+ this.handleWorkerInitialized(worker, generation);
330
+ }
331
+ };
332
+ worker.onerror = () => this.handleWorkerFailure(worker, canvas, generation);
333
+ worker.onmessageerror = () => this.handleWorkerFailure(worker, canvas, generation);
334
+ this.armInitializationTimeout(worker, canvas, generation);
335
+ }
336
+ catch {
337
+ this.forceMainThread = true;
338
+ this.initializeMainThread(canvas, generation);
339
+ }
340
+ }
341
+ handleWorkerReady(worker, canvas, generation) {
342
+ if (!this.isCurrentWorker(worker, generation) || this.backendState !== 'worker-loading')
343
+ return;
344
+ this.clearInitializationTimeout();
345
+ try {
346
+ const offscreenCanvas = canvas.transferControlToOffscreen();
347
+ this.canvasTransferred = true;
348
+ this.backendState = 'worker-transferred';
349
+ this.lastLight = this.isLightBackdrop();
350
+ worker.postMessage({
351
+ type: 'init',
352
+ canvas: offscreenCanvas,
353
+ options: this.getRendererOptions(),
354
+ phase: this.getInitialPhase(),
355
+ }, [offscreenCanvas]);
356
+ this.queuedOptions = false;
357
+ this.armInitializationTimeout(worker, canvas, generation);
358
+ }
359
+ catch {
360
+ this.handleWorkerFailure(worker, canvas, generation);
361
+ }
362
+ }
363
+ handleWorkerInitialized(worker, generation) {
364
+ if (!this.isCurrentWorker(worker, generation) || this.backendState !== 'worker-transferred')
365
+ return;
366
+ this.clearInitializationTimeout();
367
+ this.backendState = 'worker';
368
+ if (this.queuedOptions) {
369
+ this.queuedOptions = false;
370
+ this.syncRendererOptions();
371
+ }
372
+ if (this.queuedPhase) {
373
+ const phase = this.queuedPhase;
374
+ this.queuedPhase = null;
375
+ this.sendPhase(phase);
376
+ }
377
+ }
378
+ handleWorkerFailure(worker, canvas, generation) {
379
+ if (!this.isCurrentWorker(worker, generation))
380
+ return;
381
+ const requiresNewCanvas = this.canvasTransferred;
382
+ this.forceMainThread = true;
383
+ this.destroyBackend(requiresNewCanvas);
384
+ if (!requiresNewCanvas && this.isConnected) {
385
+ this.initializeMainThread(canvas, generation);
386
+ }
387
+ }
388
+ initializeMainThread(canvas, generation) {
389
+ if (!this.isConnected || generation !== this.initializationGeneration)
390
+ return;
391
+ const context = canvas.getContext('2d');
392
+ if (!context)
393
+ return;
394
+ this.backendState = 'main';
395
+ const options = this.getRendererOptions();
396
+ this.lastLight = options.light;
397
+ this.renderer = new SioLogoRenderer(context, options);
398
+ const phase = this.getInitialPhase();
399
+ if (phase)
400
+ this.renderer.start(phase);
401
+ else
402
+ this.renderer.drawStatic();
403
+ this.queuedOptions = false;
404
+ if (this.queuedPhase) {
405
+ const queuedPhase = this.queuedPhase;
406
+ this.queuedPhase = null;
407
+ this.sendPhase(queuedPhase);
408
+ }
409
+ }
410
+ armInitializationTimeout(worker, canvas, generation) {
411
+ this.clearInitializationTimeout();
412
+ this.initializationTimeout = setTimeout(() => {
413
+ this.handleWorkerFailure(worker, canvas, generation);
414
+ }, 2000);
415
+ }
416
+ clearInitializationTimeout() {
417
+ if (this.initializationTimeout === null)
418
+ return;
419
+ clearTimeout(this.initializationTimeout);
420
+ this.initializationTimeout = null;
421
+ }
422
+ isCurrentWorker(worker, generation) {
423
+ return this.isConnected &&
424
+ this.worker === worker &&
425
+ generation === this.initializationGeneration;
426
+ }
427
+ destroyBackend(replaceTransferredCanvas) {
428
+ const transferred = this.canvasTransferred;
429
+ this.clearInitializationTimeout();
430
+ if (this.worker) {
431
+ this.worker.onmessage = null;
432
+ this.worker.onerror = null;
433
+ this.worker.onmessageerror = null;
434
+ this.worker.terminate();
435
+ }
436
+ this.worker = null;
437
+ this.renderer?.stop();
438
+ this.renderer = null;
439
+ this.backendState = 'idle';
440
+ this.canvasTransferred = false;
441
+ this.queuedOptions = false;
442
+ this.queuedPhase = null;
443
+ if (replaceTransferredCanvas && transferred)
444
+ this.canvasGeneration += 1;
445
+ }
446
+ get normalizedSize() {
447
+ return Number.isFinite(this.size) ? Math.max(1, this.size) : 40;
448
+ }
449
+ getRendererOptions() {
450
+ this.lastDevicePixelRatio = window.devicePixelRatio || 1;
451
+ return {
452
+ size: this.normalizedSize,
453
+ dpr: this.lastDevicePixelRatio,
454
+ gap: Number.isFinite(this.gap) ? Math.max(0, this.gap) : 2,
455
+ radius: Number.isFinite(this.radius) ? Math.max(0, this.radius) : 16,
456
+ square: this.square,
457
+ background: this.background,
458
+ mono: this.mono,
459
+ light: this.isLightBackdrop(),
460
+ };
461
+ }
462
+ getInitialPhase() {
463
+ if (!this.isConnected || this.prefersReducedMotion())
464
+ return null;
465
+ if (this.loading)
466
+ return 'loading';
467
+ return this.noEntrance ? null : 'in';
468
+ }
469
+ syncRendererOptions() {
470
+ const options = this.getRendererOptions();
471
+ this.lastLight = options.light;
472
+ if (this.backendState === 'worker') {
473
+ this.worker?.postMessage({ type: 'options', options });
474
+ }
475
+ else if (this.backendState === 'main') {
476
+ this.renderer?.setOptions(options);
477
+ }
478
+ else {
479
+ this.queuedOptions = true;
480
+ }
481
+ }
482
+ sendPhase(phase) {
483
+ if (this.backendState === 'worker') {
484
+ this.worker?.postMessage({ type: 'phase', phase });
485
+ return;
486
+ }
487
+ if (this.backendState === 'main' && this.renderer) {
488
+ if (phase === 'stop') {
489
+ this.renderer.stop();
490
+ this.renderer.drawStatic();
491
+ }
492
+ else if (phase === 'clear') {
493
+ this.renderer.clear();
494
+ }
495
+ else {
496
+ this.renderer.start(phase);
497
+ }
498
+ return;
499
+ }
500
+ this.queuedPhase = phase;
501
+ }
502
+ prefersReducedMotion() {
503
+ return this.reducedMotionMedia?.matches ??
504
+ window.matchMedia?.('(prefers-reduced-motion: reduce)').matches ??
505
+ false;
506
+ }
507
+ isLightBackdrop() {
508
+ if (this.theme === 'light')
509
+ return true;
510
+ if (this.theme === 'dark')
511
+ return false;
512
+ let element = this;
513
+ while (element) {
514
+ if (element === document.body || element === document.documentElement) {
515
+ const pageTheme = document.documentElement.getAttribute('data-sio-theme') ||
516
+ document.documentElement.getAttribute('data-theme');
517
+ if (pageTheme === 'light')
518
+ return true;
519
+ if (pageTheme === 'dark')
520
+ return false;
521
+ }
522
+ const color = getComputedStyle(element).backgroundColor;
523
+ const match = color.match(/rgba?\(\s*([\d.]+)[,\s]+([\d.]+)[,\s]+([\d.]+)(?:\s*[,/]\s*([\d.]+))?\s*\)/);
524
+ if (match) {
525
+ const alpha = match[4] === undefined ? 1 : Number.parseFloat(match[4]);
526
+ if (alpha > 0.2) {
527
+ const luminance = (0.2126 * Number(match[1]) +
528
+ 0.7152 * Number(match[2]) +
529
+ 0.0722 * Number(match[3])) /
530
+ 255;
531
+ return luminance > 0.55;
532
+ }
533
+ }
534
+ const root = element.getRootNode();
535
+ element = element.parentElement || (root instanceof ShadowRoot ? root.host : null);
536
+ }
537
+ return false;
538
+ }
539
+ observeAmbientTheme() {
540
+ if (this.theme !== 'auto' || this.themeObserver)
541
+ return;
542
+ this.themeObserver = new MutationObserver(this.handleAmbientChange);
543
+ this.themeObserver.observe(document.documentElement, {
544
+ attributes: true,
545
+ attributeFilter: ['data-sio-theme', 'data-theme', 'class', 'style'],
546
+ });
547
+ }
548
+ stopAmbientThemeObservation() {
549
+ this.themeObserver?.disconnect();
550
+ this.themeObserver = null;
551
+ }
552
+ observeReducedMotion() {
553
+ if (this.reducedMotionMedia)
554
+ return;
555
+ this.reducedMotionMedia = window.matchMedia?.('(prefers-reduced-motion: reduce)') ?? null;
556
+ this.reducedMotionMedia?.addEventListener('change', this.handleReducedMotionChange);
557
+ }
558
+ stopReducedMotionObservation() {
559
+ this.reducedMotionMedia?.removeEventListener('change', this.handleReducedMotionChange);
560
+ this.reducedMotionMedia = null;
561
+ }
562
+ ensureAccessibleHost() {
563
+ if (this.hasAttribute('aria-hidden'))
564
+ return;
565
+ if (!this.hasAttribute('role'))
566
+ this.setAttribute('role', 'img');
567
+ if (!this.hasAttribute('aria-label'))
568
+ this.setAttribute('aria-label', 'social.io');
569
+ }
570
+ static {
571
+ __runInitializers(_classThis, _classExtraInitializers);
572
+ }
573
+ };
574
+ return SioLogo = _classThis;
575
+ })();
576
+ export { SioLogo };
577
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lvLWxvZ28uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c193ZWIvZWxlbWVudHMvc2lvLWxvZ28udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sRUFDTCxXQUFXLEVBQ1gsR0FBRyxFQUNILGFBQWEsRUFDYixVQUFVLEVBQ1YsSUFBSSxFQUNKLFFBQVEsRUFDUixLQUFLLEdBRU4sTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsR0FHZCxNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQW1CL0M7Ozs7OztHQU1HO0lBRVUsT0FBTzs0QkFEbkIsYUFBYSxDQUFDLFVBQVUsQ0FBQzs7OztzQkFDRyxXQUFXOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3VCQUFuQixTQUFRLFdBQVc7Ozs7Z0NBV3JDLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztzQ0FHMUIsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDOytCQUkxQixRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7a0NBSTFCLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztrQ0FJMUIsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDO2dDQUkzQixRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7aUNBSTFCLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQzttQ0FHMUIsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7c0NBRzFDLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFB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
@@ -21,8 +21,8 @@ export interface ISioTabChangeDetail {
21
21
  *
22
22
  * A liquid-glass bar (blur 28px saturate 180%, 0.5px top hairline) with one
23
23
  * flex-equal tab per channel: 22px icon over a 10.5px label. The active tab
24
- * lights up in its channel color; 30px bottom padding clears the iOS home
25
- * indicator. Selecting a tab dispatches `tab-change` with `{ id, channel }`
24
+ * lights up in its channel color; safe-area-aware bottom padding clears the
25
+ * iOS home indicator. Selecting a tab dispatches `tab-change` with `{ id, channel }`
26
26
  * (bubbles, composed).
27
27
  */
28
28
  export declare class SioTabBar extends DeesElement {
@@ -58,8 +58,8 @@ const calendarChannel = {
58
58
  *
59
59
  * A liquid-glass bar (blur 28px saturate 180%, 0.5px top hairline) with one
60
60
  * flex-equal tab per channel: 22px icon over a 10.5px label. The active tab
61
- * lights up in its channel color; 30px bottom padding clears the iOS home
62
- * indicator. Selecting a tab dispatches `tab-change` with `{ id, channel }`
61
+ * lights up in its channel color; safe-area-aware bottom padding clears the
62
+ * iOS home indicator. Selecting a tab dispatches `tab-change` with `{ id, channel }`
63
63
  * (bubbles, composed).
64
64
  */
65
65
  let SioTabBar = (() => {
@@ -139,7 +139,7 @@ let SioTabBar = (() => {
139
139
  /* toolbar glass, hairline on the top edge (the bar sits at the bottom) */
140
140
  .bar {
141
141
  display: flex;
142
- padding: 8px 0 30px; /* 30px clears the iOS home indicator */
142
+ padding: 8px 0 max(30px, var(--sio-safe-area-bottom, env(safe-area-inset-bottom, 0px)));
143
143
  background: var(--sio-toolbar-glass-bg);
144
144
  backdrop-filter: blur(28px) saturate(180%);
145
145
  -webkit-backdrop-filter: blur(28px) saturate(180%);