@preference-sl/pref-viewer 2.11.0-beta.10 → 2.11.0-beta.12
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/package.json +2 -5
- package/src/babylonjs-animation-controller.js +3 -2
- package/src/babylonjs-animation-opening-menu.js +4 -3
- package/src/babylonjs-animation-opening.js +2 -2
- package/src/index.js +8 -6
- package/src/pref-viewer-2d.js +4 -2
- package/src/pref-viewer-3d.js +7 -3
- package/src/pref-viewer-dialog.js +4 -3
- package/src/pref-viewer-task.js +1 -1
- package/src/styles.js +196 -0
- package/src/css/pref-viewer-2d.css +0 -39
- package/src/css/pref-viewer-3d.css +0 -28
- package/src/css/pref-viewer-dialog.css +0 -105
- package/src/css/pref-viewer.css +0 -11
package/package.json
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@preference-sl/pref-viewer",
|
|
3
|
-
"version": "2.11.0-beta.
|
|
3
|
+
"version": "2.11.0-beta.12",
|
|
4
4
|
"description": "Web Component to preview GLTF models with Babylon.js",
|
|
5
5
|
"author": "Alex Moreno Palacio <amoreno@preference.es>",
|
|
6
6
|
"scripts": {
|
|
7
|
-
"copy-css": "cpx \"src/css/**/*\" dist/css/",
|
|
8
7
|
"release": "standard-version --releaseCommitMessageFormat \"chore(release): {{currentTag}} [skip ci]\"",
|
|
9
8
|
"release:beta": "standard-version --prerelease beta --releaseCommitMessageFormat \"chore(release): {{currentTag}} [skip ci]\"",
|
|
10
|
-
"build": "
|
|
9
|
+
"build": "esbuild src/index.js --bundle --platform=node --format=esm --outfile=dist/bundle.js --sourcemap",
|
|
11
10
|
"start": "npm run build && http-server -c-1 . -p 8080",
|
|
12
11
|
"test": "vitest"
|
|
13
12
|
},
|
|
@@ -31,7 +30,6 @@
|
|
|
31
30
|
"sideEffects": false,
|
|
32
31
|
"files": [
|
|
33
32
|
"src",
|
|
34
|
-
"src/css",
|
|
35
33
|
"index.d.ts"
|
|
36
34
|
],
|
|
37
35
|
"dependencies": {
|
|
@@ -46,7 +44,6 @@
|
|
|
46
44
|
"jszip": "^3.10.1"
|
|
47
45
|
},
|
|
48
46
|
"devDependencies": {
|
|
49
|
-
"cpx": "^1.5.0",
|
|
50
47
|
"esbuild": "^0.25.10",
|
|
51
48
|
"http-server": "^14.1.1",
|
|
52
49
|
"jsdom": "^26.1.0",
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Color3, HighlightLayer, Mesh, PickingInfo, PointerEventTypes, Scene } from "@babylonjs/core";
|
|
2
2
|
import { AdvancedDynamicTexture } from "@babylonjs/gui";
|
|
3
|
-
import {
|
|
3
|
+
import { PrefViewerColors } from "./styles.js";
|
|
4
|
+
import OpeningAnimation from "./babylonjs-animation-opening.js";
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* BabylonJSAnimationController - Manages animation playback and interactive highlighting for model containers in Babylon.js scenes.
|
|
@@ -21,7 +22,7 @@ export default class BabylonJSAnimationController {
|
|
|
21
22
|
#scene = null;
|
|
22
23
|
#animatedNodes = [];
|
|
23
24
|
#highlightLayer = null;
|
|
24
|
-
#highlightColor =
|
|
25
|
+
#highlightColor = Color3.FromHexString(PrefViewerColors.primary);
|
|
25
26
|
#advancedDynamicTexture = null;
|
|
26
27
|
#openingAnimations = [];
|
|
27
28
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { AdvancedDynamicTexture, Button, Control, Image, Slider, StackPanel } from "@babylonjs/gui";
|
|
2
|
-
import
|
|
2
|
+
import OpeningAnimation from "./babylonjs-animation-opening.js";
|
|
3
|
+
import { PrefViewerColors } from "./styles.js";
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* OpeningAnimationMenu - Manages and renders the animation control menu for opening/closing animations in a Babylon.js scene.
|
|
@@ -42,7 +43,7 @@ import { OpeningAnimation } from "./babylonjs-animation-opening.js";
|
|
|
42
43
|
* menu.animationProgress = 0.5;
|
|
43
44
|
* menu.animationLoop = true;
|
|
44
45
|
*/
|
|
45
|
-
export class OpeningAnimationMenu {
|
|
46
|
+
export default class OpeningAnimationMenu {
|
|
46
47
|
#animationState = OpeningAnimation.states.closed;
|
|
47
48
|
#animationProgress = 0;
|
|
48
49
|
#animationLoop = false;
|
|
@@ -57,7 +58,7 @@ export class OpeningAnimationMenu {
|
|
|
57
58
|
// Style properties
|
|
58
59
|
#buttonSize = 28;
|
|
59
60
|
#buttonLoopPaddingLeft = 3;
|
|
60
|
-
#colorActive =
|
|
61
|
+
#colorActive = PrefViewerColors.primary;
|
|
61
62
|
#colorEnabled = "#333333";
|
|
62
63
|
#colorDisabled = "#777777";
|
|
63
64
|
#colorIcon = "#FFFFFF";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AdvancedDynamicTexture } from "@babylonjs/gui";
|
|
2
|
-
import
|
|
2
|
+
import OpeningAnimationMenu from "./babylonjs-animation-opening-menu.js";
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* OpeningAnimation - Manages open/close animations for a model part (e.g., a door) in a Babylon.js scene.
|
|
@@ -48,7 +48,7 @@ import { OpeningAnimationMenu } from "./babylonjs-animation-opening-menu.js";
|
|
|
48
48
|
* anim.showControls(adt);
|
|
49
49
|
* anim.hideControls();
|
|
50
50
|
*/
|
|
51
|
-
export class OpeningAnimation {
|
|
51
|
+
export default class OpeningAnimation {
|
|
52
52
|
static states = {
|
|
53
53
|
paused: 0,
|
|
54
54
|
closed: 1,
|
package/src/index.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
1
|
+
import PrefViewer2D from "./pref-viewer-2d.js";
|
|
2
|
+
import PrefViewer3D from "./pref-viewer-3d.js";
|
|
3
|
+
import PrefViewerDialog from "./pref-viewer-dialog.js";
|
|
4
|
+
import PrefViewerTask from "./pref-viewer-task.js";
|
|
5
|
+
import { PrefViewerStyles } from "./styles.js";
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* PrefViewer - Custom Web Component for advanced 2D and 3D product visualization and configuration.
|
|
@@ -133,7 +134,7 @@ class PrefViewer extends HTMLElement {
|
|
|
133
134
|
if (_old === value || value.toLowerCase() === this.#mode) {
|
|
134
135
|
return;
|
|
135
136
|
}
|
|
136
|
-
this.setMode(value
|
|
137
|
+
this.setMode(value);
|
|
137
138
|
break;
|
|
138
139
|
case "model":
|
|
139
140
|
this.loadModel(value);
|
|
@@ -173,7 +174,7 @@ class PrefViewer extends HTMLElement {
|
|
|
173
174
|
this.shadowRoot.append(this.#wrapper);
|
|
174
175
|
|
|
175
176
|
const style = document.createElement("style");
|
|
176
|
-
style.textContent =
|
|
177
|
+
style.textContent = PrefViewerStyles;
|
|
177
178
|
this.shadowRoot.append(style);
|
|
178
179
|
|
|
179
180
|
this.#createComponent3D();
|
|
@@ -502,6 +503,7 @@ class PrefViewer extends HTMLElement {
|
|
|
502
503
|
* @returns {void}
|
|
503
504
|
*/
|
|
504
505
|
setMode(mode = this.#mode) {
|
|
506
|
+
mode = mode.toLowerCase();
|
|
505
507
|
if (mode !== "2d" && mode !== "3d") {
|
|
506
508
|
console.warn(`PrefViewer: invalid mode "${mode}". Allowed modes are "2d" and "3d".`);
|
|
507
509
|
mode = this.#mode;
|
package/src/pref-viewer-2d.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import SVGResolver from "./svg-resolver.js";
|
|
2
2
|
import PanzoomController from "./panzoom-controller.js";
|
|
3
|
+
import { PrefViewer2DStyles } from "./styles.js";
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* PrefViewer2D - Custom element for rendering and interacting with 2D SVG content.
|
|
@@ -46,7 +47,7 @@ import PanzoomController from "./panzoom-controller.js";
|
|
|
46
47
|
* Notes on extensibility
|
|
47
48
|
* - Modeled for easy addition of other input sources or interaction modes (e.g., selection callbacks).
|
|
48
49
|
*/
|
|
49
|
-
export class PrefViewer2D extends HTMLElement {
|
|
50
|
+
export default class PrefViewer2D extends HTMLElement {
|
|
50
51
|
// State flags
|
|
51
52
|
#isInitialized = false;
|
|
52
53
|
#isLoaded = false;
|
|
@@ -143,8 +144,9 @@ export class PrefViewer2D extends HTMLElement {
|
|
|
143
144
|
#createDOMElements() {
|
|
144
145
|
this.#wrapper = document.createElement("div");
|
|
145
146
|
this.append(this.#wrapper);
|
|
147
|
+
|
|
146
148
|
const style = document.createElement("style");
|
|
147
|
-
style.textContent =
|
|
149
|
+
style.textContent = PrefViewer2DStyles;
|
|
148
150
|
this.append(style);
|
|
149
151
|
}
|
|
150
152
|
|
package/src/pref-viewer-3d.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { CameraData, ContainerData, MaterialData } from "./pref-viewer-3d-data.js";
|
|
2
2
|
import BabylonJSController from "./babylonjs-controller.js";
|
|
3
|
+
import { PrefViewer3DStyles } from "./styles.js";
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* PrefViewer3D - Custom Web Component for interactive 3D visualization and configuration.
|
|
@@ -56,7 +57,7 @@ import BabylonJSController from "./babylonjs-controller.js";
|
|
|
56
57
|
* - Designed for extensibility and integration in product configurators and visualization tools.
|
|
57
58
|
* - All resource management and rendering operations are performed asynchronously for performance.
|
|
58
59
|
*/
|
|
59
|
-
export class PrefViewer3D extends HTMLElement {
|
|
60
|
+
export default class PrefViewer3D extends HTMLElement {
|
|
60
61
|
// State flags
|
|
61
62
|
#isInitialized = false;
|
|
62
63
|
#isLoaded = false;
|
|
@@ -157,10 +158,12 @@ export class PrefViewer3D extends HTMLElement {
|
|
|
157
158
|
#createDOMElements() {
|
|
158
159
|
this.#wrapper = document.createElement("div");
|
|
159
160
|
this.append(this.#wrapper);
|
|
161
|
+
|
|
160
162
|
this.#canvas = document.createElement("canvas");
|
|
161
163
|
this.#wrapper.appendChild(this.#canvas);
|
|
164
|
+
|
|
162
165
|
const style = document.createElement("style");
|
|
163
|
-
style.textContent =
|
|
166
|
+
style.textContent = PrefViewer3DStyles;
|
|
164
167
|
this.append(style);
|
|
165
168
|
}
|
|
166
169
|
|
|
@@ -460,6 +463,7 @@ export class PrefViewer3D extends HTMLElement {
|
|
|
460
463
|
show() {
|
|
461
464
|
this.#isVisible = true;
|
|
462
465
|
this.setAttribute("visible", "true");
|
|
466
|
+
this.#canvas.focus();
|
|
463
467
|
}
|
|
464
468
|
|
|
465
469
|
/**
|
|
@@ -697,4 +701,4 @@ export class PrefViewer3D extends HTMLElement {
|
|
|
697
701
|
get isVisible() {
|
|
698
702
|
return this.#isVisible;
|
|
699
703
|
}
|
|
700
|
-
}
|
|
704
|
+
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { PrefViewerDialogStyles } from "./styles.js";
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* PrefViewerDialog - Custom Web Component for displaying modal dialogs in PrefViewer.
|
|
3
5
|
*
|
|
@@ -20,7 +22,7 @@
|
|
|
20
22
|
* - close(): Hides and removes the dialog, refocuses the canvas if available.
|
|
21
23
|
* - #createDOMElements(): Creates the dialog structure and applies styles.
|
|
22
24
|
*/
|
|
23
|
-
export class PrefViewerDialog extends HTMLElement {
|
|
25
|
+
export default class PrefViewerDialog extends HTMLElement {
|
|
24
26
|
#wrapper = null;
|
|
25
27
|
#header = null;
|
|
26
28
|
#content = null;
|
|
@@ -68,7 +70,7 @@ export class PrefViewerDialog extends HTMLElement {
|
|
|
68
70
|
this.append(this.#wrapper);
|
|
69
71
|
|
|
70
72
|
const style = document.createElement("style");
|
|
71
|
-
style.textContent =
|
|
73
|
+
style.textContent = PrefViewerDialogStyles;
|
|
72
74
|
this.append(style);
|
|
73
75
|
|
|
74
76
|
this.addEventListener("click", this.#closeOnBackdropClick.bind(this));
|
|
@@ -131,7 +133,6 @@ export class PrefViewerDialog extends HTMLElement {
|
|
|
131
133
|
component2D.focus();
|
|
132
134
|
}
|
|
133
135
|
}
|
|
134
|
-
|
|
135
136
|
}
|
|
136
137
|
this.#wrapper = this.#header = this.#content = this.#footer = null;
|
|
137
138
|
this.remove();
|
package/src/pref-viewer-task.js
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
* - Validates the type (case-insensitive) and throws a TypeError if invalid.
|
|
19
19
|
* - Freezes the instance to prevent further modification.
|
|
20
20
|
*/
|
|
21
|
-
export class PrefViewerTask {
|
|
21
|
+
export default class PrefViewerTask {
|
|
22
22
|
static Types = Object.freeze({
|
|
23
23
|
Config: "config",
|
|
24
24
|
Drawing: "drawing",
|
package/src/styles.js
ADDED
|
@@ -0,0 +1,196 @@
|
|
|
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 PrefViewerDialogStyles = `
|
|
92
|
+
pref-viewer-dialog {
|
|
93
|
+
--color-primary: ${PrefViewerColors.primary};
|
|
94
|
+
--dialog-general-space: 16px;
|
|
95
|
+
--dialog-bg-color: #ffffff;
|
|
96
|
+
--dialog-backdrop-color: rgba(0, 0, 0, 0.25);
|
|
97
|
+
--dialog-border-color: #e7e7e7;
|
|
98
|
+
--dialog-border-radius: 8px;
|
|
99
|
+
--dialog-box-shadow: 0 4px 24px rgba(0, 0, 0, 0.25);
|
|
100
|
+
--button-default-bg-color: #bbbbbb;
|
|
101
|
+
--button-default-bg-color-hover: #a1a1a1;
|
|
102
|
+
--button-primary-bg-color: color-mix(in oklab, var(--color-primary), white 25%);
|
|
103
|
+
--button-primary-bg-color-hover: var(--color-primary);
|
|
104
|
+
--button-border-radius: 4px;
|
|
105
|
+
--button-padding-horizontal: 16px;
|
|
106
|
+
--button-padding-vertical: 8px;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
pref-viewer-dialog:not {
|
|
110
|
+
display: none;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
pref-viewer-dialog[open] {
|
|
114
|
+
font-family: 'Roboto', ui-sans-serif, system-ui, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;
|
|
115
|
+
grid-row: 1;
|
|
116
|
+
grid-column: 1;
|
|
117
|
+
overflow: hidden;
|
|
118
|
+
min-width: 0;
|
|
119
|
+
min-height: 0;
|
|
120
|
+
align-self: stretch;
|
|
121
|
+
justify-self: stretch;
|
|
122
|
+
display: flex;
|
|
123
|
+
align-items: center;
|
|
124
|
+
justify-content: center;
|
|
125
|
+
background-color: var(--dialog-backdrop-color);
|
|
126
|
+
position: relative;
|
|
127
|
+
z-index: 1000;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
pref-viewer-dialog>.dialog-wrapper {
|
|
131
|
+
display: flex;
|
|
132
|
+
flex-direction: column;
|
|
133
|
+
align-items: stretch;
|
|
134
|
+
background: var(--dialog-bg-color);
|
|
135
|
+
border: 1px solid var(--dialog-border-color);
|
|
136
|
+
border-radius: var(--dialog-border-radius);
|
|
137
|
+
box-shadow: var(--dialog-box-shadow);
|
|
138
|
+
padding: 0;
|
|
139
|
+
min-width: 320px;
|
|
140
|
+
max-width: 90%;
|
|
141
|
+
max-height: 90%;
|
|
142
|
+
overflow: auto;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
pref-viewer-dialog .dialog-header {
|
|
146
|
+
padding: var(--dialog-general-space);
|
|
147
|
+
border-bottom: 1px solid var(--dialog-border-color);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
pref-viewer-dialog .dialog-header h3 {
|
|
151
|
+
margin: 0;
|
|
152
|
+
font-weight: 500;
|
|
153
|
+
font-size: 1.1em;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
pref-viewer-dialog .dialog-content {
|
|
157
|
+
padding: var(--dialog-general-space);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
pref-viewer-dialog .dialog-content h4 {
|
|
161
|
+
margin: 0;
|
|
162
|
+
font-weight: 500;
|
|
163
|
+
font-size: 1.05em;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
pref-viewer-dialog .dialog-footer {
|
|
167
|
+
border-top: 1px solid var(--dialog-border-color);
|
|
168
|
+
padding: var(--dialog-general-space);
|
|
169
|
+
display: flex;
|
|
170
|
+
gap: var(--dialog-general-space);
|
|
171
|
+
justify-content: stretch;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
pref-viewer-dialog .dialog-footer button {
|
|
175
|
+
width: 100%;
|
|
176
|
+
font-size: 1em;
|
|
177
|
+
padding: var(--button-padding-vertical) var(--button-padding-horizontal);
|
|
178
|
+
border-radius: var(--button-border-radius);
|
|
179
|
+
border: none;
|
|
180
|
+
background: var(--button-default-bg-color);
|
|
181
|
+
cursor: pointer;
|
|
182
|
+
transition: background 0.2s;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
pref-viewer-dialog .dialog-footer button.primary {
|
|
186
|
+
background: var(--button-primary-bg-color);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
pref-viewer-dialog .dialog-footer button:hover {
|
|
190
|
+
background: var(--button-default-bg-color-hover);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
pref-viewer-dialog .dialog-footer button.primary:hover {
|
|
194
|
+
background: var(--button-primary-bg-color-hover);
|
|
195
|
+
}
|
|
196
|
+
`;
|
|
@@ -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
|
-
}
|
package/src/css/pref-viewer.css
DELETED