@preference-sl/pref-viewer 2.16.0-beta.9 → 2.16.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.
package/src/styles.js CHANGED
@@ -1,25 +1,71 @@
1
- export const PrefViewerStyleVariables = {
2
- colorPrimary: "#ff6700", // Default accent color - can be overridden via attribute
1
+ /**
2
+ * localStorage key used to persist supported PrefViewer runtime style overrides.
3
+ * @type {string}
4
+ */
5
+ export const PREF_VIEWER_STYLES_STORAGE_KEY = "pref-viewer/styles";
6
+
7
+ /**
8
+ * Default style variables used before host overrides or persisted values are applied.
9
+ * @type {{colorPrimary: string, fontFamily: string, fontSize: string}}
10
+ */
11
+ const PrefViewerDefaultStyleVariables = {
12
+ colorPrimary: "#ff6700",
3
13
  fontFamily: "'Roboto', ui-sans-serif, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji",
14
+ fontSize: "15px",
4
15
  };
5
16
 
6
- // Default palette colors for illumination color picker
7
- export const DEFAULT_ILLUMINATION_PALETTE = [
8
- "#ffffff", // White
9
- "#ff6700", // Orange (default)
10
- "#ff0000", // Red
11
- "#00ff00", // Green
12
- "#0000ff", // Blue
13
- "#ffff00", // Yellow
14
- "#ff00ff", // Magenta
15
- "#00ffff", // Cyan
16
- "#ffb6c1", // Light Pink
17
- "#98fb98", // Light Green
18
- "#87ceeb", // Light Blue
19
- "#dda0dd", // Plum
20
- ];
17
+ /**
18
+ * Reads persisted runtime style overrides in browser contexts.
19
+ * Only `colorPrimary` is consumed by `PrefViewerStyleVariables`; other keys are ignored by the host component.
20
+ * @returns {object} Parsed persisted style overrides, or an empty object when unavailable or invalid.
21
+ */
22
+ function readPersistedStyleVariables() {
23
+ if (typeof window === "undefined") {
24
+ return {};
25
+ }
26
+ try {
27
+ const serialized = window.localStorage?.getItem(PREF_VIEWER_STYLES_STORAGE_KEY);
28
+ return serialized ? JSON.parse(serialized) : {};
29
+ } catch (_error) {
30
+ return {};
31
+ }
32
+ }
33
+
34
+ /** @type {object} Persisted raw style overrides loaded during module initialization. */
35
+ const persistedStyleVariables = readPersistedStyleVariables();
36
+
37
+ /**
38
+ * Shared style variables consumed by PrefViewer CSS templates and Babylon defaults.
39
+ * `colorPrimary` can be overridden at runtime through `<pref-viewer styles>`, `viewer.styles`, `viewer.setStyles()`, or `loadConfig({ styles })`.
40
+ * @type {{colorPrimary: string, fontFamily: string, fontSize: string}}
41
+ */
42
+ export const PrefViewerStyleVariables = {
43
+ ...PrefViewerDefaultStyleVariables,
44
+ colorPrimary: typeof persistedStyleVariables.colorPrimary === "string" && persistedStyleVariables.colorPrimary.trim().length > 0
45
+ ? persistedStyleVariables.colorPrimary.trim()
46
+ : PrefViewerDefaultStyleVariables.colorPrimary,
47
+ };
21
48
 
49
+ /** Root `<pref-viewer>` host styles. Uses `--pref-viewer-color-primary` so `setStyles({ colorPrimary })` can update mounted instances. */
22
50
  export const PrefViewerStyles = `
51
+ :host {
52
+ all: initial;
53
+ display: block;
54
+ font-family: ${PrefViewerStyleVariables.fontFamily};
55
+ font-size: ${PrefViewerStyleVariables.fontSize};
56
+ line-height: 1.2;
57
+ color: #000000;
58
+ }
59
+
60
+ :host *, :host *::before, :host *::after {
61
+ box-sizing: border-box;
62
+ }
63
+
64
+ :host ::selection {
65
+ background: var(--pref-viewer-color-primary, ${PrefViewerStyleVariables.colorPrimary});
66
+ color: #ffffff;
67
+ }
68
+
23
69
  :host .pref-viewer-wrapper {
24
70
  display: grid !important;
25
71
  position: relative;
@@ -66,7 +112,6 @@ export const PrefViewer2DStyles = `
66
112
  display: block;
67
113
  position: relative;
68
114
  outline: none;
69
- box-sizing: border-box;
70
115
  }
71
116
 
72
117
  pref-viewer-2d>div>svg {
@@ -83,9 +128,6 @@ export const PrefViewer3DStyles = `
83
128
  display: none;
84
129
  }
85
130
 
86
- pref-viewer-3d[show-animation-menu="false"] > div.animation-menu {
87
- display: none;
88
- }
89
131
 
90
132
  pref-viewer-3d {
91
133
  grid-column: 1;
@@ -105,7 +147,6 @@ export const PrefViewer3DStyles = `
105
147
  display: block;
106
148
  position: relative;
107
149
  outline: none;
108
- box-sizing: border-box;
109
150
  }
110
151
  `;
111
152
 
@@ -114,13 +155,14 @@ export const PrefViewerMenu3DStyles = `
114
155
  --font-family: ${PrefViewerStyleVariables.fontFamily};
115
156
  --font-weight-bold: 600;
116
157
  --font-weight-medium: 500;
117
- --font-size-large: 1.1rem;
118
- --font-size-medium: 0.95rem;
119
- --font-size-small: 0.75rem;
158
+ --font-size-large: calc(1.1 * ${PrefViewerStyleVariables.fontSize});
159
+ --font-size-medium: calc(0.95 * ${PrefViewerStyleVariables.fontSize});
160
+ --font-size-small: calc(0.75 * ${PrefViewerStyleVariables.fontSize});
120
161
  --text-color: #ffffff;
121
162
  --muted-color: #b2b2b2;
122
- --accent-color: ${PrefViewerStyleVariables.colorPrimary};
123
- --status-color: #ffb0b0;
163
+ --accent-color: var(--pref-viewer-color-primary, ${PrefViewerStyleVariables.colorPrimary});
164
+
165
+ --separator-border: 1px solid rgba(255, 255, 255, 0.1);
124
166
 
125
167
  --toggle-margin: 16px;
126
168
  --toggle-bg-color: rgba(19, 21, 28, 0.6);
@@ -136,7 +178,7 @@ export const PrefViewerMenu3DStyles = `
136
178
  --button-shadow: 0 8px 16px rgba(0, 0, 0, 0.35);
137
179
  --button-radius: 8px;
138
180
 
139
- --panel-width: 280px;
181
+ --panel-width: 300px;
140
182
  --panel-spacing: 16px;
141
183
  --panel-spacing-large: calc(var(--panel-spacing) * 1.5);
142
184
  --panel-bg-color: rgba(19, 21, 28, 0.85);
@@ -153,10 +195,23 @@ export const PrefViewerMenu3DStyles = `
153
195
  --switch-control-width: calc((var(--switch-control-thumb-size) * 2) + (var(--switch-control-bar-spacing) * 2));
154
196
  --switch-control-height: calc(var(--switch-control-thumb-size) + (var(--switch-control-bar-spacing) * 2));
155
197
 
198
+ --slider-thumb-size: 18px;
199
+ --slider-thumb-color: #ffffff;
200
+ --slider-thumb-border: 1px solid rgba(0, 0, 0, 0.25);
201
+ --slider-thumb-shadow: 0 1px 4px rgba(0, 0, 0, 0.45);
202
+ --slider-bar-height: 12px;
203
+ --slider-bar-border: 1px solid rgba(255, 255, 255, 0.5);
204
+
156
205
  position: absolute;
157
206
  top: var(--toggle-margin);
158
207
  right: var(--toggle-margin);
159
208
  z-index: 1200;
209
+ /* The closed panel keeps its place in the flex column (opacity:0, not display:none), so
210
+ this host spans the panel's full 300px x 70vh even when only the toggle is showing.
211
+ Left clickable, that empty space is an invisible catcher over the right edge of the
212
+ viewer: it swallowed the XR entry button and orbiting alike. The toggle and the panel
213
+ each flip back to auto when they become usable, so nothing else is needed. */
214
+ pointer-events: none;
160
215
 
161
216
  font-family: var(--font-family);
162
217
  }
@@ -222,7 +277,7 @@ export const PrefViewerMenu3DStyles = `
222
277
  }
223
278
 
224
279
  pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-header {
225
- margin-bottom: var(--panel-spacing-large);
280
+ margin-bottom: var(--panel-spacing);
226
281
  }
227
282
 
228
283
  pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-header>.menu-title {
@@ -249,11 +304,11 @@ export const PrefViewerMenu3DStyles = `
249
304
  justify-content: space-between;
250
305
  gap: var(--panel-spacing-large);
251
306
  padding: var(--panel-spacing) 0;
252
- border-bottom: 1px solid rgba(255, 255, 255, 0.1);
307
+ border-bottom: var(--separator-border);
253
308
  }
254
309
 
255
- pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-switches>.menu-switch:last-child {
256
- border-bottom: none;
310
+ pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-switches>.menu-switch:first-child {
311
+ border-top: var(--separator-border);
257
312
  }
258
313
 
259
314
  pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-switches>.menu-switch>.menu-switch-copy {
@@ -267,18 +322,6 @@ export const PrefViewerMenu3DStyles = `
267
322
  font-weight: var(--font-weight-medium);
268
323
  }
269
324
 
270
- pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-switches>.menu-switch .menu-switch-title::after {
271
- content: " *";
272
- color: var(--accent-color);
273
- font-weight: var(--font-weight-bold);
274
- opacity: 0;
275
- }
276
-
277
- pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-switches>.menu-switch[data-pending] .menu-switch-title::after {
278
- opacity: 1;
279
- transition: opacity 0.2s ease;
280
- }
281
-
282
325
  pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-switches>.menu-switch small {
283
326
  color: var(--muted-color);
284
327
  font-size: var(--font-size-small);
@@ -299,6 +342,10 @@ export const PrefViewerMenu3DStyles = `
299
342
  cursor: pointer;
300
343
  }
301
344
 
345
+ pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-switches>.menu-switch[data-hidden] {
346
+ display: none;
347
+ }
348
+
302
349
  pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-switches>.menu-switch[data-disabled]>.menu-switch-copy {
303
350
  opacity: 0.6;
304
351
  }
@@ -345,87 +392,35 @@ export const PrefViewerMenu3DStyles = `
345
392
  transform: translateX(var(--switch-control-thumb-size));
346
393
  }
347
394
 
348
- pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-footer {
349
- margin-top: calc(var(--panel-spacing) / 2);
350
- display: flex;
351
- flex-direction: column;
352
- gap: calc(var(--panel-spacing) / 2);
353
- }
354
-
355
- pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-footer>.menu-pending {
356
- font-size: var(--font-size-small);
357
- text-transform: uppercase;
358
- letter-spacing: 0.08em;
359
- color: var(--accent-color);
360
- font-weight: var(--font-weight-medium);
361
- display: block;
362
- opacity: 1;
363
- transition: opacity 0.2s ease;
364
- }
365
-
366
- pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-footer>.menu-pending::before {
367
- content: "* ";
368
- font-size: var(--font-size-medium);
369
- color: var(--accent-color);
370
- font-weight: var(--font-weight-bold);
371
- }
372
-
373
- pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-footer>.menu-pending[hidden] {
374
- opacity: 0;
375
- }
376
-
377
- pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-footer>.menu-status {
378
- font-size: var(--font-size-small);
379
- color: var(--status-color);
395
+ pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-slider[data-hidden] {
380
396
  display: none;
381
397
  }
382
398
 
383
- pref-viewer-menu-3d[data-status="visible"]>.menu-wrapper>.menu-panel>.menu-footer>.menu-status {
384
- display: block;
385
- }
386
-
387
- pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-footer>.menu-apply {
388
- border: none;
389
- border-radius: var(--button-radius);
390
- padding: round(down, calc(var(--panel-spacing) * 0.625), 1px) var(--panel-spacing);
391
- font-size: var(--button-font-size);
392
- font-weight: var(--button-font-weight);
393
- background: var(--accent-color);
394
- color: var(--button-font-color);
395
- cursor: pointer;
396
- transition: transform 0.2s ease, box-shadow 0.2s ease, opacity 0.2s ease;
399
+ pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-slider[data-disabled] .menu-slider-label {
400
+ opacity: 0.6;
397
401
  }
398
402
 
399
- pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-footer>.menu-apply:not(:disabled):hover {
400
- box-shadow: var(--button-shadow);
403
+ pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-slider[data-disabled] input[type="range"] {
404
+ opacity: 0.4;
401
405
  }
402
406
 
403
- pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-footer>.menu-apply:disabled {
407
+ pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-slider[data-disabled] input[type="range"]:disabled {
404
408
  cursor: not-allowed;
405
- opacity: 0.55;
406
409
  }
407
410
 
408
- pref-viewer-menu-3d[data-applying]>.menu-wrapper>.menu-panel>.menu-footer>.menu-apply {
409
- opacity: 0.75;
410
- }
411
-
412
- /* Color Slider Styles */
413
411
  pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-color-picker {
414
412
  display: flex;
415
413
  flex-direction: column;
416
- gap: 8px;
414
+ gap: calc(var(--panel-spacing) / 2);
417
415
  padding: var(--panel-spacing) 0;
418
- border-bottom: 1px solid rgba(255, 255, 255, 0.1);
419
- }
420
-
421
- pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-color-picker:last-child {
422
- border-bottom: none;
416
+ border-bottom: var(--separator-border);
423
417
  }
424
418
 
425
419
  pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-color-picker>.color-slider-row {
426
420
  display: flex;
427
421
  align-items: center;
428
422
  justify-content: space-between;
423
+ gap: calc(var(--panel-spacing) / 2);
429
424
  }
430
425
 
431
426
  pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-color-picker>.color-slider-row>.color-picker-label {
@@ -435,10 +430,10 @@ export const PrefViewerMenu3DStyles = `
435
430
  }
436
431
 
437
432
  pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-color-picker>.color-slider-row>.color-preview {
438
- width: 20px;
439
- height: 20px;
440
- border-radius: 50%;
441
- border: 2px solid rgba(255, 255, 255, 0.3);
433
+ width: var(--switch-control-width);
434
+ align-self: stretch;
435
+ border-radius: calc(var(--slider-bar-height) / 2);
436
+ border: var(--slider-bar-border);
442
437
  flex-shrink: 0;
443
438
  }
444
439
 
@@ -446,35 +441,37 @@ export const PrefViewerMenu3DStyles = `
446
441
  -webkit-appearance: none;
447
442
  appearance: none;
448
443
  width: 100%;
449
- height: 10px;
450
- border-radius: 5px;
451
- cursor: pointer;
444
+ height: var(--slider-bar-height);
445
+ border-radius: calc(var(--slider-bar-height) / 2);
452
446
  background: linear-gradient(to right,
453
447
  hsl(0,100%,50%), hsl(30,100%,50%), hsl(60,100%,50%), hsl(90,100%,50%),
454
448
  hsl(120,100%,50%), hsl(150,100%,50%), hsl(180,100%,50%), hsl(210,100%,50%),
455
449
  hsl(240,100%,50%), hsl(270,100%,50%), hsl(300,100%,50%), hsl(330,100%,50%),
456
450
  hsl(360,100%,50%));
451
+ border: var(--slider-bar-border);
457
452
  outline: none;
453
+ margin: 0;
454
+ cursor: pointer;
458
455
  }
459
456
 
460
457
  pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-color-picker>.color-slider::-webkit-slider-thumb {
461
458
  -webkit-appearance: none;
462
- width: 16px;
463
- height: 16px;
459
+ width: var(--slider-thumb-size);
460
+ height: var(--slider-thumb-size);
464
461
  border-radius: 50%;
465
- background: white;
466
- border: 2px solid rgba(0, 0, 0, 0.25);
467
- box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
462
+ background: var(--slider-thumb-color);
463
+ border: var(--slider-thumb-border);
464
+ box-shadow: var(--slider-thumb-shadow);
468
465
  cursor: pointer;
469
466
  }
470
467
 
471
468
  pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-color-picker>.color-slider::-moz-range-thumb {
472
- width: 16px;
473
- height: 16px;
469
+ width: var(--slider-thumb-size);
470
+ height: var(--slider-thumb-size);
474
471
  border-radius: 50%;
475
- background: white;
476
- border: 2px solid rgba(0, 0, 0, 0.25);
477
- box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
472
+ background: var(--slider-thumb-color);
473
+ border: var(--slider-thumb-border);
474
+ box-shadow: var(--slider-thumb-shadow);
478
475
  cursor: pointer;
479
476
  }
480
477
 
@@ -486,23 +483,16 @@ export const PrefViewerMenu3DStyles = `
486
483
  pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-lighting-slider {
487
484
  display: flex;
488
485
  flex-direction: column;
489
- gap: 8px;
486
+ gap: calc(var(--panel-spacing) / 2);
490
487
  padding: var(--panel-spacing) 0;
491
- border-bottom: 1px solid rgba(255, 255, 255, 0.1);
492
- }
493
-
494
- pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-lighting-slider[data-pending] .lighting-slider-label::after {
495
- content: "•";
496
- margin-left: 8px;
497
- color: var(--accent-color);
498
- font-size: 1.1em;
488
+ border-bottom: var(--separator-border);
499
489
  }
500
490
 
501
491
  pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-lighting-slider>.lighting-slider-row {
502
492
  display: flex;
503
493
  align-items: center;
504
494
  justify-content: space-between;
505
- gap: 12px;
495
+ gap: calc(var(--panel-spacing) / 2);
506
496
  }
507
497
 
508
498
  pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-lighting-slider>.lighting-slider-row>.lighting-slider-label {
@@ -522,37 +512,40 @@ export const PrefViewerMenu3DStyles = `
522
512
  -webkit-appearance: none;
523
513
  appearance: none;
524
514
  width: 100%;
525
- height: 10px;
526
- border-radius: 999px;
527
- cursor: pointer;
528
- background:
529
- linear-gradient(to right,
530
- rgba(255, 214, 120, 0.95) 0%,
531
- rgba(255, 179, 71, 0.98) 20%,
532
- rgba(255, 244, 214, 0.95) 50%,
533
- rgba(118, 165, 255, 0.92) 80%,
534
- rgba(56, 66, 115, 0.95) 100%);
515
+ height: var(--slider-bar-height);
516
+ border-radius: calc(var(--slider-bar-height) / 2);
517
+ background: linear-gradient(to right,
518
+ rgba(56, 66, 115, 0.95) 0%,
519
+ rgba(118, 165, 255, 0.92) 10%,
520
+ rgba(255, 214, 120, 0.95) 30%,
521
+ rgba(255, 244, 214, 0.95) 50%,
522
+ rgba(255, 214, 120, 0.95) 70%,
523
+ rgba(118, 165, 255, 0.92) 90%,
524
+ rgba(56, 66, 115, 0.95) 100%);
525
+ border: var(--slider-bar-border);
535
526
  outline: none;
527
+ margin: 0;
528
+ cursor: pointer;
536
529
  }
537
530
 
538
531
  pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-lighting-slider>.lighting-slider::-webkit-slider-thumb {
539
532
  -webkit-appearance: none;
540
- width: 18px;
541
- height: 18px;
533
+ width: var(--slider-thumb-size);
534
+ height: var(--slider-thumb-size);
542
535
  border-radius: 50%;
543
- background: #ffffff;
544
- border: 2px solid rgba(0, 0, 0, 0.24);
545
- box-shadow: 0 1px 4px rgba(0, 0, 0, 0.45);
536
+ background: var(--slider-thumb-color);
537
+ border: var(--slider-thumb-border);
538
+ box-shadow: var(--slider-thumb-shadow);
546
539
  cursor: pointer;
547
540
  }
548
541
 
549
542
  pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-lighting-slider>.lighting-slider::-moz-range-thumb {
550
- width: 18px;
551
- height: 18px;
543
+ width: var(--slider-thumb-size);
544
+ height: var(--slider-thumb-size);
552
545
  border-radius: 50%;
553
- background: #ffffff;
554
- border: 2px solid rgba(0, 0, 0, 0.24);
555
- box-shadow: 0 1px 4px rgba(0, 0, 0, 0.45);
546
+ background: var(--slider-thumb-color);
547
+ border: var(--slider-thumb-border);
548
+ box-shadow: var(--slider-thumb-shadow);
556
549
  cursor: pointer;
557
550
  }
558
551
 
@@ -571,45 +564,41 @@ export const PrefViewerMenu3DStyles = `
571
564
 
572
565
  pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-lighting-slider>.lighting-slider-actions>.lighting-play-button {
573
566
  appearance: none;
574
- border: 1px solid rgba(255, 255, 255, 0.18);
575
- border-radius: 999px;
576
- background: rgba(255, 255, 255, 0.08);
567
+ background: rgba(255, 255, 255, 0.1);
568
+ border: 1px solid rgba(255, 255, 255, 0.2);
569
+ border-radius: var(--button-radius);
570
+ padding: calc(var(--panel-spacing) * 0.5) var(--panel-spacing);
577
571
  color: var(--text-color);
578
- padding: 6px 12px;
579
572
  font-size: var(--font-size-small);
580
573
  font-weight: var(--font-weight-medium);
574
+ transition: background 0.15s ease, border-color 0.15s ease, box-shadow 0.2s ease;
581
575
  cursor: pointer;
582
- transition: background 0.15s ease, border-color 0.15s ease, transform 0.15s ease;
583
576
  }
584
577
 
585
578
  pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-lighting-slider>.lighting-slider-actions>.lighting-play-button:hover,
586
579
  pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-lighting-slider>.lighting-slider-actions>.lighting-play-button:focus-visible {
587
- background: rgba(255, 255, 255, 0.14);
588
- border-color: rgba(255, 255, 255, 0.28);
589
- transform: translateY(-1px);
580
+ background: rgba(255, 255, 255, 0.15);
581
+ border-color: rgba(255, 255, 255, 0.3);
590
582
  outline: none;
583
+ box-shadow: var(--button-shadow);
591
584
  }
592
585
 
593
- pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-lighting-slider[data-playing] .lighting-slider {
594
- background:
595
- linear-gradient(to right,
596
- rgba(255, 220, 132, 0.96) 0%,
597
- rgba(255, 187, 88, 0.98) 18%,
598
- rgba(255, 247, 226, 0.96) 50%,
599
- rgba(112, 154, 255, 0.92) 82%,
600
- rgba(45, 55, 102, 0.98) 100%);
586
+ pref-viewer-menu-3d>.menu-wrapper>.menu-panel>.menu-footer {
587
+ margin-top: calc(var(--panel-spacing) / 2);
588
+ display: flex;
589
+ flex-direction: column;
590
+ gap: calc(var(--panel-spacing) / 2);
601
591
  }
602
592
  `;
603
593
 
604
594
  export const PrefViewer3DAnimationMenuStyles = `
605
595
  div.pref-viewer-3d.animation-menu, div.pref-viewer-3d.animation-menu * {
606
- box-sizing: border-box;
607
596
  padding: 0;
608
597
  margin: 0;
609
598
  }
610
599
 
611
600
  div.pref-viewer-3d.animation-menu {
612
- --color-primary: ${PrefViewerStyleVariables.colorPrimary};
601
+ --color-primary: var(--pref-viewer-color-primary, ${PrefViewerStyleVariables.colorPrimary});
613
602
  --color-active: var(--color-primary);
614
603
  --color-active-hover: color-mix(in oklab, var(--color-active), black 10%);
615
604
  --color-enabled: #7a7a7a;
@@ -627,7 +616,7 @@ export const PrefViewer3DAnimationMenuStyles = `
627
616
  --selector-button-radius: 6px;
628
617
  --selector-button-padding-horizontal: 8px;
629
618
  --selector-button-padding-vertical: 4px;
630
- --selector-button-font-size: 14px;
619
+ --selector-button-font-size: ${PrefViewerStyleVariables.fontSize};
631
620
  --selector-button-font-weight: 500;
632
621
  --width: calc(var(--button-size) * 6 + var(--button-spacing) * 5 + var(--button-loop-margin-left));
633
622
 
@@ -668,6 +657,7 @@ export const PrefViewer3DAnimationMenuStyles = `
668
657
  font-size: var(--selector-button-font-size);
669
658
  font-weight: var(--selector-button-font-weight);
670
659
  line-height: 1;
660
+ letter-spacing: 0.05em;
671
661
  flex: 1;
672
662
  }
673
663
 
@@ -683,7 +673,7 @@ export const PrefViewer3DAnimationMenuStyles = `
683
673
  cursor: pointer;
684
674
  }
685
675
 
686
- div.pref-viewer-3d.animation-menu>div.animation-menu-buttons>button:not(.active):hover {
676
+ div.pref-viewer-3d.animation-menu>div.animation-menu-selector>button:not(.active):hover {
687
677
  background: var(--color-enabled-hover);
688
678
  }
689
679
 
@@ -700,7 +690,6 @@ export const PrefViewer3DAnimationMenuStyles = `
700
690
  justify-content: center;
701
691
  padding: 0;
702
692
  margin: 0;
703
- cursor: pointer;
704
693
  border: 1px solid var(--color-border);
705
694
  width: var(--button-size);
706
695
  height: var(--button-size);
@@ -723,13 +712,15 @@ export const PrefViewer3DAnimationMenuStyles = `
723
712
 
724
713
  div.pref-viewer-3d.animation-menu>div.animation-menu-buttons>button.enabled {
725
714
  background: var(--color-enabled);
715
+ cursor: pointer;
726
716
  }
727
717
 
728
718
  div.pref-viewer-3d.animation-menu>div.animation-menu-buttons>button.enabled:hover {
729
719
  background: var(--color-enabled-hover);
730
720
  }
731
721
 
732
- div.pref-viewer-3d.animation-menu>div.animation-menu-buttons>button.disabled {
722
+ div.pref-viewer-3d.animation-menu>div.animation-menu-buttons>button.disabled,
723
+ div.pref-viewer-3d.animation-menu>div.animation-menu-buttons>button.disabled:hover {
733
724
  background: var(--color-disabled);
734
725
  }
735
726
 
@@ -795,7 +786,7 @@ export const PrefViewer3DAnimationMenuStyles = `
795
786
 
796
787
  export const PrefViewerDialogStyles = `
797
788
  pref-viewer-dialog {
798
- --color-primary: ${PrefViewerStyleVariables.colorPrimary};
789
+ --color-primary: var(--pref-viewer-color-primary, ${PrefViewerStyleVariables.colorPrimary});
799
790
  --dialog-general-space: 16px;
800
791
  --dialog-bg-color: #ffffff;
801
792
  --dialog-backdrop-color: rgba(0, 0, 0, 0.25);
@@ -855,7 +846,7 @@ export const PrefViewerDialogStyles = `
855
846
  pref-viewer-dialog .dialog-header h3 {
856
847
  margin: 0;
857
848
  font-weight: 500;
858
- font-size: 1.1em;
849
+ font-size: calc(1.1 * ${PrefViewerStyleVariables.fontSize});
859
850
  }
860
851
 
861
852
  pref-viewer-dialog .dialog-content {
@@ -865,7 +856,7 @@ export const PrefViewerDialogStyles = `
865
856
  pref-viewer-dialog .dialog-content h4 {
866
857
  margin: 0;
867
858
  font-weight: 500;
868
- font-size: 1.05em;
859
+ font-size: calc(1.05 * ${PrefViewerStyleVariables.fontSize});
869
860
  }
870
861
 
871
862
  pref-viewer-dialog .dialog-footer {
@@ -878,7 +869,7 @@ export const PrefViewerDialogStyles = `
878
869
 
879
870
  pref-viewer-dialog .dialog-footer button {
880
871
  width: 100%;
881
- font-size: 0.95rem;
872
+ font-size: calc(0.95 * ${PrefViewerStyleVariables.fontSize});
882
873
  font-weight: 600;
883
874
  padding: var(--button-padding-vertical) var(--button-padding-horizontal);
884
875
  border-radius: var(--button-border-radius);