@preference-sl/pref-viewer 2.11.0-beta.9 → 2.12.0-beta.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 ADDED
@@ -0,0 +1,381 @@
1
+ export const PrefViewerColors = {
2
+ primary: "#ff6700", // Always specify in hexadecimal
3
+ };
4
+
5
+ export const PrefViewerStyles = `
6
+ :host .pref-viewer-wrapper {
7
+ display: grid !important;
8
+ position: relative;
9
+ width: 100%;
10
+ height: 100%;
11
+ grid-template-columns: 1fr;
12
+ grid-template-rows: 1fr;
13
+ grid-gap: 0;
14
+ min-width: 0;
15
+ min-height: 0;
16
+ }
17
+ `;
18
+
19
+ export const PrefViewer2DStyles = `
20
+ pref-viewer-2d {
21
+ --pref-viewer-2d-bg-color: #ffffff;
22
+ --pref-viewer-2d-svg-padding: 10px;
23
+ }
24
+
25
+ pref-viewer-2d[visible="true"] {
26
+ display: block;
27
+ }
28
+
29
+ pref-viewer-2d[visible="false"] {
30
+ display: none;
31
+ }
32
+
33
+ pref-viewer-2d {
34
+ grid-column: 1;
35
+ grid-row: 1;
36
+ overflow: hidden;
37
+ min-width: 0;
38
+ min-height: 0;
39
+ align-self: stretch;
40
+ justify-self: stretch;
41
+ background: var(--pref-viewer-2d-bg-color);
42
+ }
43
+
44
+ pref-viewer-2d,
45
+ pref-viewer-2d>div,
46
+ pref-viewer-2d>div>svg {
47
+ width: 100%;
48
+ height: 100%;
49
+ display: block;
50
+ position: relative;
51
+ outline: none;
52
+ box-sizing: border-box;
53
+ }
54
+
55
+ pref-viewer-2d>div>svg {
56
+ padding: var(--pref-viewer-2d-svg-padding);
57
+ }
58
+ `;
59
+
60
+ export const PrefViewer3DStyles = `
61
+ pref-viewer-3d[visible="true"] {
62
+ display: block;
63
+ }
64
+
65
+ pref-viewer-3d[visible="false"] {
66
+ display: none;
67
+ }
68
+
69
+ pref-viewer-3d {
70
+ grid-column: 1;
71
+ grid-row: 1;
72
+ overflow: hidden;
73
+ min-width: 0;
74
+ min-height: 0;
75
+ align-self: stretch;
76
+ justify-self: stretch;
77
+ }
78
+
79
+ pref-viewer-3d,
80
+ pref-viewer-3d>div,
81
+ pref-viewer-3d>div>canvas {
82
+ width: 100%;
83
+ height: 100%;
84
+ display: block;
85
+ position: relative;
86
+ outline: none;
87
+ box-sizing: border-box;
88
+ }
89
+ `;
90
+
91
+ export const PrefViewer3DAnimationMenuStyles = `
92
+ div.pref-viewer-3d.animation-menu, div.pref-viewer-3d.animation-menu * {
93
+ box-sizing: border-box;
94
+ padding: 0;
95
+ margin: 0;
96
+ }
97
+
98
+ div.pref-viewer-3d.animation-menu {
99
+ --color-primary: ${PrefViewerColors.primary};
100
+ --color-active: var(--color-primary);
101
+ --color-active-hover: color-mix(in oklab, var(--color-active), black 10%);
102
+ --color-enabled: #7a7a7a;
103
+ --color-enabled-hover: color-mix(in oklab, var(--color-enabled), black 15%);
104
+ --color-disabled: #bdbdbd;
105
+ --color-icon: #FFFFFF;
106
+ --color-border: #FFFFFF;
107
+ --button-size: 32px;
108
+ --icon-size: 24px;
109
+ --button-loop-margin-left: 3px;
110
+ --button-spacing: 2px;
111
+ --slider-thumb-width: 20px;
112
+ --slider-bar-height: 8px;
113
+ --slider-bar-offset: 10px;
114
+ --selector-button-radius: 6px;
115
+ --selector-button-padding-horizontal: 8px;
116
+ --selector-button-padding-vertical: 4px;
117
+ --selector-button-font-size: 14px;
118
+ --selector-button-font-weight: 500;
119
+ --width: calc(var(--button-size) * 6 + var(--button-spacing) * 5 + var(--button-loop-margin-left));
120
+
121
+ display: block;
122
+ position: absolute;
123
+ bottom: 10px;
124
+
125
+ right: calc(50% - (var(--width) / 2));
126
+ z-index: 1000;
127
+ }
128
+
129
+ div.pref-viewer-3d.animation-menu>div.animation-menu-selector {
130
+ fore
131
+ padding: 0;
132
+ margin: 0;
133
+ display: flex;
134
+ flex-wrap: wrap;
135
+ gap: var(--button-spacing);
136
+ max-width: var(--width);
137
+ margin-bottom: var(--button-spacing);
138
+ }
139
+
140
+ div.pref-viewer-3d.animation-menu>div.animation-menu-selector>button {
141
+ display: block;
142
+ padding: var(--selector-button-padding-vertical) var(--selector-button-padding-horizontal);
143
+ margin: 0;
144
+ border: 1px solid var(--color-border);
145
+ border-radius: var(--selector-button-radius);
146
+ background: var(--color-enabled);
147
+ color: var(--color-icon);
148
+ font-size: var(--selector-button-font-size);
149
+ font-weight: var(--selector-button-font-weight);
150
+ line-height: 1;
151
+ flex: 1;
152
+ }
153
+
154
+ div.pref-viewer-3d.animation-menu>div.animation-menu-selector>button.active {
155
+ background: var(--color-active);
156
+ }
157
+
158
+ div.pref-viewer-3d.animation-menu>div.animation-menu-selector>button.active:hover {
159
+ background: var(--color-active-hover);
160
+ }
161
+
162
+ div.pref-viewer-3d.animation-menu>div.animation-menu-selector>button:not(.active) {
163
+ cursor: pointer;
164
+ }
165
+
166
+ div.pref-viewer-3d.animation-menu>div.animation-menu-buttons>button:not(.active):hover {
167
+ background: var(--color-enabled-hover);
168
+ }
169
+
170
+ div.pref-viewer-3d.animation-menu>div.animation-menu-buttons {
171
+ padding: 0;
172
+ margin: 0;
173
+ display: flex;
174
+ gap: var(--button-spacing);
175
+ }
176
+
177
+ div.pref-viewer-3d.animation-menu>div.animation-menu-buttons>button {
178
+ display: flex;
179
+ align-items: center;
180
+ justify-content: center;
181
+ padding: 0;
182
+ margin: 0;
183
+ cursor: pointer;
184
+ border: 1px solid var(--color-border);
185
+ width: var(--button-size);
186
+ height: var(--button-size);
187
+ background: var(--color-enabled);
188
+ }
189
+
190
+ div.pref-viewer-3d.animation-menu>div.animation-menu-buttons>button>svg {
191
+ fill: var(--color-icon);
192
+ width: 100%;
193
+ height: 100%;
194
+ }
195
+
196
+ div.pref-viewer-3d.animation-menu>div.animation-menu-buttons>button.active {
197
+ background: var(--color-active);
198
+ }
199
+
200
+ div.pref-viewer-3d.animation-menu>div.animation-menu-buttons>button.active:hover {
201
+ background: var(--color-active-hover);
202
+ }
203
+
204
+ div.pref-viewer-3d.animation-menu>div.animation-menu-buttons>button.enabled {
205
+ background: var(--color-enabled);
206
+ }
207
+
208
+ div.pref-viewer-3d.animation-menu>div.animation-menu-buttons>button.enabled:hover {
209
+ background: var(--color-enabled-hover);
210
+ }
211
+
212
+ div.pref-viewer-3d.animation-menu>div.animation-menu-buttons>button.disabled {
213
+ background: var(--color-disabled);
214
+ }
215
+
216
+ div.pref-viewer-3d.animation-menu>div.animation-menu-buttons>button.visible {
217
+ display: block-flex;
218
+ }
219
+
220
+ div.pref-viewer-3d.animation-menu>div.animation-menu-buttons>button.hidden {
221
+ display: none;
222
+ }
223
+
224
+ div.pref-viewer-3d.animation-menu>div.animation-menu-buttons>button[name="button_animation_repeat"],
225
+ div.pref-viewer-3d.animation-menu>div.animation-menu-buttons>button[name="button_animation_repeatOff"] {
226
+ margin-left: var(--button-loop-margin-left);
227
+ }
228
+
229
+ div.pref-viewer-3d.animation-menu>input[type="range"] {
230
+ -webkit-appearance: none;
231
+ width: 100%;
232
+ height: var(--slider-bar-height);
233
+ border: 1px solid var(--color-border);
234
+ outline: none;
235
+ accent-color: var(--color-active);
236
+ background: var(--color-enabled);
237
+ border-radius: var(--slider-bar-height);
238
+ -webkit-transition: .2s;
239
+ transition: background .2s;
240
+ margin: var(--slider-bar-offset) 0px;
241
+ }
242
+
243
+ div.pref-viewer-3d.animation-menu>input[type="range"]::-webkit-slider-thumb {
244
+ -webkit-appearance: none;
245
+ appearance: none;
246
+ height: var(--slider-thumb-width);
247
+ width: var(--slider-thumb-width);
248
+ border-radius: 50%;
249
+ border: 1px solid var(--color-border);
250
+ background: var(--color-active);
251
+ cursor: pointer;
252
+ -webkit-transition: .2s;
253
+ transition: background .2s;
254
+ }
255
+
256
+ div.pref-viewer-3d.animation-menu>input[type="range"]::-webkit-slider-thumb:hover {
257
+ background: var(--color-active-hover);
258
+ }
259
+
260
+ div.pref-viewer-3d.animation-menu>input[type="range"]::-moz-range-track {
261
+ height: var(--slider-thumb-width);
262
+ width: var(--slider-thumb-width);
263
+ border-radius: 50%;
264
+ border: 1px solid var(--color-border);
265
+ background: var(--color-active);
266
+ cursor: pointer;
267
+ -webkit-transition: .2s;
268
+ transition: background .2s;
269
+ }
270
+
271
+ div.pref-viewer-3d.animation-menu>input[type="range"]::-moz-range-track:hover {
272
+ background: var(--color-active-hover);
273
+ }
274
+ `;
275
+
276
+ export const PrefViewerDialogStyles = `
277
+ pref-viewer-dialog {
278
+ --color-primary: ${PrefViewerColors.primary};
279
+ --dialog-general-space: 16px;
280
+ --dialog-bg-color: #ffffff;
281
+ --dialog-backdrop-color: rgba(0, 0, 0, 0.25);
282
+ --dialog-border-color: #e7e7e7;
283
+ --dialog-border-radius: 8px;
284
+ --dialog-box-shadow: 0 4px 24px rgba(0, 0, 0, 0.25);
285
+ --button-default-bg-color: #bbbbbb;
286
+ --button-default-bg-color-hover: color-mix(in oklab, var(--button-default-bg-color), black 10%);
287
+ --button-primary-bg-color: var(--color-primary);
288
+ --button-primary-bg-color-hover: color-mix(in oklab, var(--button-primary-bg-color), black 10%);
289
+ --button-border-radius: 4px;
290
+ --button-padding-horizontal: 16px;
291
+ --button-padding-vertical: 8px;
292
+ }
293
+
294
+ pref-viewer-dialog:not {
295
+ display: none;
296
+ }
297
+
298
+ pref-viewer-dialog[open] {
299
+ font-family: 'Roboto', ui-sans-serif, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;
300
+ grid-row: 1;
301
+ grid-column: 1;
302
+ overflow: hidden;
303
+ min-width: 0;
304
+ min-height: 0;
305
+ align-self: stretch;
306
+ justify-self: stretch;
307
+ display: flex;
308
+ align-items: center;
309
+ justify-content: center;
310
+ background-color: var(--dialog-backdrop-color);
311
+ position: relative;
312
+ z-index: 1000;
313
+ }
314
+
315
+ pref-viewer-dialog>.dialog-wrapper {
316
+ display: flex;
317
+ flex-direction: column;
318
+ align-items: stretch;
319
+ background: var(--dialog-bg-color);
320
+ border: 1px solid var(--dialog-border-color);
321
+ border-radius: var(--dialog-border-radius);
322
+ box-shadow: var(--dialog-box-shadow);
323
+ padding: 0;
324
+ min-width: 320px;
325
+ max-width: 90%;
326
+ max-height: 90%;
327
+ overflow: auto;
328
+ }
329
+
330
+ pref-viewer-dialog .dialog-header {
331
+ padding: var(--dialog-general-space);
332
+ border-bottom: 1px solid var(--dialog-border-color);
333
+ }
334
+
335
+ pref-viewer-dialog .dialog-header h3 {
336
+ margin: 0;
337
+ font-weight: 500;
338
+ font-size: 1.1em;
339
+ }
340
+
341
+ pref-viewer-dialog .dialog-content {
342
+ padding: var(--dialog-general-space);
343
+ }
344
+
345
+ pref-viewer-dialog .dialog-content h4 {
346
+ margin: 0;
347
+ font-weight: 500;
348
+ font-size: 1.05em;
349
+ }
350
+
351
+ pref-viewer-dialog .dialog-footer {
352
+ border-top: 1px solid var(--dialog-border-color);
353
+ padding: var(--dialog-general-space);
354
+ display: flex;
355
+ gap: var(--dialog-general-space);
356
+ justify-content: stretch;
357
+ }
358
+
359
+ pref-viewer-dialog .dialog-footer button {
360
+ width: 100%;
361
+ font-size: 1em;
362
+ padding: var(--button-padding-vertical) var(--button-padding-horizontal);
363
+ border-radius: var(--button-border-radius);
364
+ border: none;
365
+ background: var(--button-default-bg-color);
366
+ cursor: pointer;
367
+ transition: background 0.2s;
368
+ }
369
+
370
+ pref-viewer-dialog .dialog-footer button.primary {
371
+ background: var(--button-primary-bg-color);
372
+ }
373
+
374
+ pref-viewer-dialog .dialog-footer button:hover {
375
+ background: var(--button-default-bg-color-hover);
376
+ }
377
+
378
+ pref-viewer-dialog .dialog-footer button.primary:hover {
379
+ background: var(--button-primary-bg-color-hover);
380
+ }
381
+ `;
@@ -121,6 +121,29 @@ export default class SVGResolver {
121
121
  return [value, size];
122
122
  }
123
123
 
124
+ // Some payloads are base64 of UTF-16 strings, which leave NUL bytes after atob; strip them and retry.
125
+ const cleanedDecoded = decoded.replace(/\u0000/g, "");
126
+ if (cleanedDecoded !== decoded && isSvg(cleanedDecoded)) {
127
+ size = raw.length;
128
+ value = cleanedDecoded;
129
+ return [value, size];
130
+ }
131
+
132
+ // Last resort: attempt decoding the binary buffer as UTF-16LE when available (TextDecoder is native in browsers).
133
+ if (typeof TextDecoder !== "undefined") {
134
+ try {
135
+ const bytes = Uint8Array.from(decoded, (c) => c.charCodeAt(0));
136
+ const utf16 = new TextDecoder("utf-16le").decode(bytes);
137
+ if (isSvg(utf16)) {
138
+ size = raw.length;
139
+ value = utf16;
140
+ return [value, size];
141
+ }
142
+ } catch {
143
+ // ignore and fall through
144
+ }
145
+ }
146
+
124
147
  return [value, size];
125
148
  }
126
149
 
@@ -1,39 +0,0 @@
1
- /* Variables */
2
- pref-viewer-2d {
3
- --pref-viewer-2d-bg-color: #ffffff;
4
- --pref-viewer-2d-svg-padding: 10px;
5
- }
6
-
7
- pref-viewer-2d[visible="true"] {
8
- display: block;
9
- }
10
-
11
- pref-viewer-2d[visible="false"] {
12
- display: none;
13
- }
14
-
15
- pref-viewer-2d {
16
- grid-column: 1;
17
- grid-row: 1;
18
- overflow: hidden;
19
- min-width: 0;
20
- min-height: 0;
21
- align-self: stretch;
22
- justify-self: stretch;
23
- background: var(--pref-viewer-2d-bg-color);
24
- }
25
-
26
- pref-viewer-2d,
27
- pref-viewer-2d>div,
28
- pref-viewer-2d>div>svg {
29
- width: 100%;
30
- height: 100%;
31
- display: block;
32
- position: relative;
33
- outline: none;
34
- box-sizing: border-box;
35
- }
36
-
37
- pref-viewer-2d>div>svg {
38
- padding: var(--pref-viewer-2d-svg-padding);
39
- }
@@ -1,28 +0,0 @@
1
- pref-viewer-3d[visible="true"] {
2
- display: block;
3
- }
4
-
5
- pref-viewer-3d[visible="false"] {
6
- display: none;
7
- }
8
-
9
- pref-viewer-3d {
10
- grid-column: 1;
11
- grid-row: 1;
12
- overflow: hidden;
13
- min-width: 0;
14
- min-height: 0;
15
- align-self: stretch;
16
- justify-self: stretch;
17
- }
18
-
19
- pref-viewer-3d,
20
- pref-viewer-3d>div,
21
- pref-viewer-3d>div>canvas {
22
- width: 100%;
23
- height: 100%;
24
- display: block;
25
- position: relative;
26
- outline: none;
27
- box-sizing: border-box;
28
- }
@@ -1,105 +0,0 @@
1
- /* Variables */
2
- pref-viewer-dialog {
3
- --brand-color: #ff6700;
4
- --dialog-general-space: 16px;
5
- --dialog-bg-color: #ffffff;
6
- --dialog-backdrop-color: rgba(0, 0, 0, 0.25);
7
- --dialog-border-color: #e7e7e7;
8
- --dialog-border-radius: 8px;
9
- --dialog-box-shadow: 0 4px 24px rgba(0, 0, 0, 0.25);
10
- --button-default-bg-color: #bbbbbb;
11
- --button-default-bg-color-hover: #a1a1a1;
12
- --button-primary-bg-color: color-mix(in oklab, var(--brand-color), white 25%);
13
- --button-primary-bg-color-hover: var(--brand-color);
14
- --button-border-radius: 4px;
15
- --button-padding-horizontal: 16px;
16
- --button-padding-vertical: 8px;
17
- }
18
-
19
- pref-viewer-dialog:not {
20
- display: none;
21
- }
22
-
23
- pref-viewer-dialog[open] {
24
- font-family: 'Roboto', ui-sans-serif, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;
25
- grid-row: 1;
26
- grid-column: 1;
27
- overflow: hidden;
28
- min-width: 0;
29
- min-height: 0;
30
- align-self: stretch;
31
- justify-self: stretch;
32
- display: flex;
33
- align-items: center;
34
- justify-content: center;
35
- background-color: var(--dialog-backdrop-color);
36
- position: relative;
37
- z-index: 1000;
38
- }
39
-
40
- pref-viewer-dialog>.dialog-wrapper {
41
- display: flex;
42
- flex-direction: column;
43
- align-items: stretch;
44
- background: var(--dialog-bg-color);
45
- border: 1px solid var(--dialog-border-color);
46
- border-radius: var(--dialog-border-radius);
47
- box-shadow: var(--dialog-box-shadow);
48
- padding: 0;
49
- min-width: 320px;
50
- max-width: 90%;
51
- max-height: 90%;
52
- overflow: auto;
53
- }
54
-
55
- pref-viewer-dialog .dialog-header {
56
- padding: var(--dialog-general-space);
57
- border-bottom: 1px solid var(--dialog-border-color);
58
- }
59
-
60
- pref-viewer-dialog .dialog-header h3 {
61
- margin: 0;
62
- font-weight: 500;
63
- font-size: 1.1em;
64
- }
65
-
66
- pref-viewer-dialog .dialog-content {
67
- padding: var(--dialog-general-space);
68
- }
69
-
70
- pref-viewer-dialog .dialog-content h4 {
71
- margin: 0;
72
- font-weight: 500;
73
- font-size: 1.05em;
74
- }
75
-
76
- pref-viewer-dialog .dialog-footer {
77
- border-top: 1px solid var(--dialog-border-color);
78
- padding: var(--dialog-general-space);
79
- display: flex;
80
- gap: var(--dialog-general-space);
81
- justify-content: stretch;
82
- }
83
-
84
- pref-viewer-dialog .dialog-footer button {
85
- width: 100%;
86
- font-size: 1em;
87
- padding: var(--button-padding-vertical) var(--button-padding-horizontal);
88
- border-radius: var(--button-border-radius);
89
- border: none;
90
- background: var(--button-default-bg-color);
91
- cursor: pointer;
92
- transition: background 0.2s;
93
- }
94
-
95
- pref-viewer-dialog .dialog-footer button.primary {
96
- background: var(--button-primary-bg-color);
97
- }
98
-
99
- pref-viewer-dialog .dialog-footer button:hover {
100
- background: var(--button-default-bg-color-hover);
101
- }
102
-
103
- pref-viewer-dialog .dialog-footer button.primary:hover {
104
- background: var(--button-primary-bg-color-hover);
105
- }
@@ -1,11 +0,0 @@
1
- :host .pref-viewer-wrapper {
2
- display: grid !important;
3
- position: relative;
4
- width: 100%;
5
- height: 100%;
6
- grid-template-columns: 1fr;
7
- grid-template-rows: 1fr;
8
- grid-gap: 0;
9
- min-width: 0;
10
- min-height: 0;
11
- }