@geoffcox/sterling-svelte 0.0.26 → 0.0.27
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/Button.svelte +79 -24
- package/Button.svelte.d.ts +1 -0
- package/Checkbox.svelte +44 -19
- package/Checkbox.svelte.d.ts +1 -0
- package/ColorPicker.constants.d.ts +1 -0
- package/ColorPicker.constants.js +1 -0
- package/ColorPicker.svelte +226 -0
- package/ColorPicker.svelte.d.ts +22 -0
- package/ColorPicker.types.d.ts +4 -0
- package/ColorPicker.types.js +1 -0
- package/Dialog.svelte +10 -10
- package/Dropdown.svelte +87 -55
- package/Dropdown.svelte.d.ts +4 -0
- package/Field.svelte +31 -31
- package/HexColorSliders.svelte +150 -0
- package/HexColorSliders.svelte.d.ts +22 -0
- package/HslColorSliders.svelte +187 -0
- package/HslColorSliders.svelte.d.ts +22 -0
- package/Input.svelte +49 -21
- package/Input.svelte.d.ts +2 -1
- package/Label.svelte +3 -3
- package/Link.svelte +63 -17
- package/Link.svelte.d.ts +1 -0
- package/List.svelte +28 -16
- package/List.svelte.d.ts +1 -0
- package/List.types.d.ts +4 -3
- package/ListItem.svelte +29 -10
- package/ListItem.svelte.d.ts +1 -1
- package/Menu.svelte +7 -7
- package/MenuBar.svelte +1 -1
- package/MenuButton.svelte +3 -5
- package/MenuItem.svelte +33 -11
- package/MenuItem.svelte.d.ts +1 -0
- package/MenuItemDisplay.svelte +7 -1
- package/MenuSeparator.svelte +3 -3
- package/Popover.svelte +66 -51
- package/Popover.svelte.d.ts +4 -2
- package/Progress.svelte +14 -14
- package/Radio.svelte +42 -16
- package/Radio.svelte.d.ts +1 -0
- package/RgbColorSliders.svelte +161 -0
- package/RgbColorSliders.svelte.d.ts +22 -0
- package/Select.svelte +30 -24
- package/Slider.svelte +108 -118
- package/Slider.svelte.d.ts +1 -0
- package/Switch.svelte +97 -34
- package/Switch.svelte.d.ts +1 -0
- package/Tab.svelte +52 -29
- package/TabList.svelte +21 -10
- package/TabList.svelte.d.ts +1 -0
- package/TabList.types.d.ts +1 -0
- package/TextArea.svelte +45 -20
- package/TextArea.svelte.d.ts +3 -2
- package/Tooltip.svelte +12 -11
- package/Tree.svelte +34 -21
- package/Tree.svelte.d.ts +2 -0
- package/Tree.types.d.ts +1 -0
- package/TreeChevron.svelte +1 -1
- package/TreeItem.svelte +40 -9
- package/TreeItem.svelte.d.ts +2 -0
- package/TreeItemDisplay.svelte +26 -8
- package/TreeItemDisplay.svelte.d.ts +2 -0
- package/actions/clickOutside.js +1 -1
- package/actions/trapKeyboardFocus.d.ts +3 -0
- package/actions/trapKeyboardFocus.js +52 -0
- package/floating-ui.types.d.ts +2 -0
- package/index.d.ts +8 -3
- package/index.js +7 -2
- package/package.json +10 -1
- package/theme/applyTheme.js +3 -2
- package/theme/colors.d.ts +1 -0
- package/theme/colors.js +28 -13
- package/theme/darkTheme.js +130 -87
- package/theme/lightTheme.js +107 -87
package/Button.svelte
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<script>export let disabled = false;
|
|
2
2
|
export let variant = "regular";
|
|
3
3
|
export let shape = "rounded";
|
|
4
|
+
export let colorful = false;
|
|
4
5
|
let buttonRef;
|
|
5
6
|
export const click = () => {
|
|
6
7
|
buttonRef?.click();
|
|
@@ -20,6 +21,7 @@ export const focus = (options) => {
|
|
|
20
21
|
<button
|
|
21
22
|
bind:this={buttonRef}
|
|
22
23
|
class="sterling-button"
|
|
24
|
+
class:colorful
|
|
23
25
|
class:square={shape === 'square'}
|
|
24
26
|
class:circular={shape === 'circular'}
|
|
25
27
|
class:outline={variant === 'outline'}
|
|
@@ -57,7 +59,7 @@ export const focus = (options) => {
|
|
|
57
59
|
on:pointerover
|
|
58
60
|
on:pointerout
|
|
59
61
|
on:pointerup
|
|
60
|
-
on:wheel
|
|
62
|
+
on:wheel|passive
|
|
61
63
|
{...$$restProps}
|
|
62
64
|
>
|
|
63
65
|
<slot {shape} {variant} />
|
|
@@ -67,13 +69,13 @@ export const focus = (options) => {
|
|
|
67
69
|
button {
|
|
68
70
|
align-content: center;
|
|
69
71
|
align-items: center;
|
|
70
|
-
background-color: var(--stsv-
|
|
71
|
-
border-color: var(--stsv-
|
|
72
|
-
border-radius: var(--stsv-
|
|
73
|
-
border-style: var(--stsv-
|
|
74
|
-
border-width: var(--stsv-
|
|
72
|
+
background-color: var(--stsv-button__background-color);
|
|
73
|
+
border-color: var(--stsv-button__border-color);
|
|
74
|
+
border-radius: var(--stsv-button__border-radius);
|
|
75
|
+
border-style: var(--stsv-button__border-style);
|
|
76
|
+
border-width: var(--stsv-button__border-width);
|
|
75
77
|
box-sizing: border-box;
|
|
76
|
-
color: var(--stsv-
|
|
78
|
+
color: var(--stsv-button__color);
|
|
77
79
|
cursor: pointer;
|
|
78
80
|
display: inline-flex;
|
|
79
81
|
flex-direction: row;
|
|
@@ -105,23 +107,40 @@ export const focus = (options) => {
|
|
|
105
107
|
}
|
|
106
108
|
|
|
107
109
|
button:hover {
|
|
108
|
-
background-color: var(--stsv-
|
|
109
|
-
border-color: var(--stsv-
|
|
110
|
-
color: var(--stsv-
|
|
110
|
+
background-color: var(--stsv-button__background-color--hover);
|
|
111
|
+
border-color: var(--stsv-button__border-color--hover);
|
|
112
|
+
color: var(--stsv-button__color--hover);
|
|
111
113
|
}
|
|
112
114
|
|
|
113
115
|
button:active {
|
|
114
|
-
background-color: var(--stsv-
|
|
115
|
-
border-color: var(--stsv-
|
|
116
|
-
color: var(--stsv-
|
|
116
|
+
background-color: var(--stsv-button__background-color--active);
|
|
117
|
+
border-color: var(--stsv-button__border-color--active);
|
|
118
|
+
color: var(--stsv-button__color--active);
|
|
117
119
|
}
|
|
118
120
|
|
|
119
121
|
button:focus-visible {
|
|
120
|
-
border-color: var(--stsv-
|
|
121
|
-
outline-color: var(--stsv-
|
|
122
|
-
outline-offset: var(--stsv-
|
|
123
|
-
outline-style: var(--stsv-
|
|
124
|
-
outline-width: var(--stsv-
|
|
122
|
+
border-color: var(--stsv-button__border-color--focus);
|
|
123
|
+
outline-color: var(--stsv-common__outline-color);
|
|
124
|
+
outline-offset: var(--stsv-common__outline-offset);
|
|
125
|
+
outline-style: var(--stsv-common__outline-style);
|
|
126
|
+
outline-width: var(--stsv-common__outline-width);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
button.colorful {
|
|
130
|
+
background-color: var(--stsv-button--colorful__background-color);
|
|
131
|
+
border-color: var(--stsv-button--colorful__border-color);
|
|
132
|
+
color: var(--stsv-button--colorful__color);
|
|
133
|
+
}
|
|
134
|
+
button.colorful:hover {
|
|
135
|
+
background-color: var(--stsv-button--colorful__background-color--hover);
|
|
136
|
+
border-color: var(--stsv-button--colorful__border-color--hover);
|
|
137
|
+
color: var(--stsv-button--colorful__color--hover);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
button.colorful:active {
|
|
141
|
+
background-color: var(--stsv-button--colorful__background-color--active);
|
|
142
|
+
border-color: var(--stsv-button--colorful__border-color--active);
|
|
143
|
+
color: var(--stsv-button--colorful__color--active);
|
|
125
144
|
}
|
|
126
145
|
|
|
127
146
|
button.outline {
|
|
@@ -129,11 +148,27 @@ export const focus = (options) => {
|
|
|
129
148
|
}
|
|
130
149
|
|
|
131
150
|
button.outline:hover {
|
|
132
|
-
background-color: var(--stsv-
|
|
151
|
+
background-color: var(--stsv-button__background-color--hover);
|
|
133
152
|
}
|
|
134
153
|
|
|
135
154
|
button.outline:active {
|
|
136
|
-
background-color: var(--stsv-
|
|
155
|
+
background-color: var(--stsv-button__background-color--active);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
button.outline.colorful {
|
|
159
|
+
border-color: var(--stsv-button--colorful__border-color);
|
|
160
|
+
color: var(--stsv-button--colorful__border-color);
|
|
161
|
+
}
|
|
162
|
+
button.outline.colorful:hover {
|
|
163
|
+
background-color: var(--stsv-button--colorful__background-color--hover);
|
|
164
|
+
border-color: var(--stsv-button--colorful__border-color--hover);
|
|
165
|
+
color: var(--stsv-button--colorful__color--hover);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
button.outline.colorful:active {
|
|
169
|
+
background-color: var(--stsv-button--colorful__background-color--active);
|
|
170
|
+
border-color: var(--stsv-button--colorful__border-color--active);
|
|
171
|
+
color: var(--stsv-button--colorful__color--active);
|
|
137
172
|
}
|
|
138
173
|
|
|
139
174
|
button.ghost {
|
|
@@ -142,17 +177,31 @@ export const focus = (options) => {
|
|
|
142
177
|
}
|
|
143
178
|
|
|
144
179
|
button.ghost:hover {
|
|
145
|
-
background-color: var(--stsv-
|
|
180
|
+
background-color: var(--stsv-button__background-color--hover);
|
|
146
181
|
border-color: transparent;
|
|
147
182
|
}
|
|
148
183
|
|
|
149
184
|
button.ghost:active {
|
|
150
|
-
background-color: var(--stsv-
|
|
185
|
+
background-color: var(--stsv-button__background-color--active);
|
|
151
186
|
border-color: transparent;
|
|
152
187
|
}
|
|
153
188
|
|
|
154
189
|
button.ghost:focus-visible {
|
|
155
|
-
border-color: var(--stsv-
|
|
190
|
+
border-color: var(--stsv-button__border-color--focus);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
button.ghost.colorful {
|
|
194
|
+
color: var(--stsv-button--colorful__border-color);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
button.ghost.colorful:hover {
|
|
198
|
+
background-color: var(--stsv-button--colorful__background-color--hover);
|
|
199
|
+
color: var(--stsv-button--colorful__color--hover);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
button.ghost.colorful:active {
|
|
203
|
+
background-color: var(--stsv-button--colorful__background-color--active);
|
|
204
|
+
color: var(--stsv-button--colorful__color--active);
|
|
156
205
|
}
|
|
157
206
|
|
|
158
207
|
button:disabled {
|
|
@@ -167,7 +216,13 @@ export const focus = (options) => {
|
|
|
167
216
|
right: 0;
|
|
168
217
|
top: 0;
|
|
169
218
|
bottom: 0;
|
|
170
|
-
background:
|
|
219
|
+
background: repeating-linear-gradient(
|
|
220
|
+
45deg,
|
|
221
|
+
var(--stsv-common__background-color1--disabled),
|
|
222
|
+
var(--stsv-common__background-color1--disabled) 3px,
|
|
223
|
+
var(--stsv-common__background-color2--disabled) 3px,
|
|
224
|
+
var(--stsv-common__background-color2--disabled) 6px
|
|
225
|
+
);
|
|
171
226
|
pointer-events: none;
|
|
172
227
|
}
|
|
173
228
|
|
package/Button.svelte.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ declare const __propDef: {
|
|
|
5
5
|
disabled?: boolean | undefined;
|
|
6
6
|
variant?: "regular" | "outline" | "ghost" | undefined;
|
|
7
7
|
shape?: "circular" | "rounded" | "square" | undefined;
|
|
8
|
+
colorful?: boolean | undefined;
|
|
8
9
|
click?: (() => void) | undefined;
|
|
9
10
|
blur?: (() => void) | undefined;
|
|
10
11
|
focus?: ((options?: FocusOptions) => void) | undefined;
|
package/Checkbox.svelte
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<script>import { idGenerator } from "./idGenerator";
|
|
2
2
|
import Label from "./Label.svelte";
|
|
3
3
|
export let checked = false;
|
|
4
|
+
export let colorful = false;
|
|
4
5
|
export let disabled = false;
|
|
5
6
|
export let id = void 0;
|
|
6
7
|
let inputRef;
|
|
@@ -24,7 +25,7 @@ export const focus = (options) => {
|
|
|
24
25
|
@component
|
|
25
26
|
A styled HTML input type=checkbox element.
|
|
26
27
|
-->
|
|
27
|
-
<div class="sterling-checkbox" class:disabled>
|
|
28
|
+
<div class="sterling-checkbox" class:colorful class:disabled>
|
|
28
29
|
<div class="container">
|
|
29
30
|
<input
|
|
30
31
|
bind:this={inputRef}
|
|
@@ -56,7 +57,7 @@ export const focus = (options) => {
|
|
|
56
57
|
on:mouseover
|
|
57
58
|
on:mouseout
|
|
58
59
|
on:mouseup
|
|
59
|
-
on:wheel
|
|
60
|
+
on:wheel|passive
|
|
60
61
|
{...$$restProps}
|
|
61
62
|
/>
|
|
62
63
|
<div class="indicator" />
|
|
@@ -115,10 +116,10 @@ export const focus = (options) => {
|
|
|
115
116
|
and there is not a parent CSS selector.
|
|
116
117
|
*/
|
|
117
118
|
.indicator {
|
|
118
|
-
background-color: var(--stsv-
|
|
119
|
-
border-color: var(--stsv-
|
|
120
|
-
border-style: var(--stsv-
|
|
121
|
-
border-width: var(--stsv-
|
|
119
|
+
background-color: var(--stsv-input__background-color);
|
|
120
|
+
border-color: var(--stsv-input__border-color);
|
|
121
|
+
border-style: var(--stsv-input__border-style);
|
|
122
|
+
border-width: var(--stsv-input__border-width);
|
|
122
123
|
box-sizing: border-box;
|
|
123
124
|
display: inline-block;
|
|
124
125
|
height: 20px;
|
|
@@ -129,27 +130,27 @@ export const focus = (options) => {
|
|
|
129
130
|
}
|
|
130
131
|
|
|
131
132
|
input:checked + .indicator {
|
|
132
|
-
background-color: var(--stsv-
|
|
133
|
-
border-color: var(--stsv-
|
|
133
|
+
background-color: var(--stsv-input__background-color);
|
|
134
|
+
border-color: var(--stsv-input__border-color);
|
|
134
135
|
}
|
|
135
136
|
|
|
136
|
-
.sterling-checkbox:hover .indicator {
|
|
137
|
-
background-color: var(--stsv-
|
|
138
|
-
border-color: var(--stsv-
|
|
137
|
+
.sterling-checkbox:not(.disabled):hover .indicator {
|
|
138
|
+
background-color: var(--stsv-input__background-color--hover);
|
|
139
|
+
border-color: var(--stsv-input__border-color--hover);
|
|
139
140
|
}
|
|
140
141
|
|
|
141
142
|
input:focus-visible + .indicator {
|
|
142
|
-
outline-color: var(--stsv-
|
|
143
|
-
outline-offset: var(--stsv-
|
|
144
|
-
outline-style: var(--stsv-
|
|
145
|
-
outline-width: var(--stsv-
|
|
143
|
+
outline-color: var(--stsv-common__outline-color);
|
|
144
|
+
outline-offset: var(--stsv-common__outline-offset);
|
|
145
|
+
outline-style: var(--stsv-common__outline-style);
|
|
146
|
+
outline-width: var(--stsv-common__outline-width);
|
|
146
147
|
}
|
|
147
148
|
|
|
148
149
|
/*
|
|
149
150
|
The checkmark is a rotated L centered in the box.
|
|
150
151
|
*/
|
|
151
152
|
.indicator::after {
|
|
152
|
-
border-color: var(--stsv-
|
|
153
|
+
border-color: var(--stsv-input__color);
|
|
153
154
|
border-style: solid;
|
|
154
155
|
border-width: 0 3px 3px 0;
|
|
155
156
|
box-sizing: border-box;
|
|
@@ -169,8 +170,26 @@ export const focus = (options) => {
|
|
|
169
170
|
opacity: 1;
|
|
170
171
|
}
|
|
171
172
|
|
|
172
|
-
.sterling-checkbox:hover input:checked + .indicator::after {
|
|
173
|
-
border-color: var(--stsv-
|
|
173
|
+
.sterling-checkbox:not(.disabled):hover input:checked + .indicator::after {
|
|
174
|
+
border-color: var(--stsv-input__color--hover);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
.sterling-checkbox.colorful .indicator {
|
|
178
|
+
background-color: var(--stsv-input--colorful__background-color);
|
|
179
|
+
border-color: var(--stsv-input--colorful__border-color);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
.sterling-checkbox.colorful:not(.disabled):hover .indicator {
|
|
183
|
+
background-color: var(--stsv-input--colorful__background-color--hover);
|
|
184
|
+
border-color: var(--stsv-input--colorful__border-color--hover);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
.sterling-checkbox.colorful .indicator::after {
|
|
188
|
+
border-color: var(--stsv-input--colorful__color);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
.sterling-checkbox.colorful:not(.disabled):hover input:checked + .indicator::after {
|
|
192
|
+
border-color: var(--stsv-input--colorful__color--hover);
|
|
174
193
|
}
|
|
175
194
|
|
|
176
195
|
.sterling-checkbox.disabled,
|
|
@@ -179,7 +198,13 @@ export const focus = (options) => {
|
|
|
179
198
|
}
|
|
180
199
|
|
|
181
200
|
.container::after {
|
|
182
|
-
background:
|
|
201
|
+
background: repeating-linear-gradient(
|
|
202
|
+
45deg,
|
|
203
|
+
var(--stsv-common__background-color1--disabled),
|
|
204
|
+
var(--stsv-common__background-color1--disabled) 3px,
|
|
205
|
+
var(--stsv-common__background-color2--disabled) 3px,
|
|
206
|
+
var(--stsv-common__background-color2--disabled) 6px
|
|
207
|
+
);
|
|
183
208
|
bottom: 0;
|
|
184
209
|
content: '';
|
|
185
210
|
left: 0;
|
package/Checkbox.svelte.d.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const COLOR_FORMATS: readonly ["hex", "rgb", "hsl"];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const COLOR_FORMATS = ['hex', 'rgb', 'hsl'];
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
<script>import { tick } from "svelte";
|
|
2
|
+
import tinycolor from "@ctrl/tinycolor";
|
|
3
|
+
import Dropdown from "./Dropdown.svelte";
|
|
4
|
+
import Input from "./Input.svelte";
|
|
5
|
+
import Tab from "./Tab.svelte";
|
|
6
|
+
import TabList from "./TabList.svelte";
|
|
7
|
+
import RgbColorSliders from "./RgbColorSliders.svelte";
|
|
8
|
+
import HslColorSliders from "./HslColorSliders.svelte";
|
|
9
|
+
import HexColorSliders from "./HexColorSliders.svelte";
|
|
10
|
+
import { round } from "lodash-es";
|
|
11
|
+
import { trapKeyboardFocus } from "./actions/trapKeyboardFocus";
|
|
12
|
+
const defaultColorText = "#000000";
|
|
13
|
+
export let colorText = defaultColorText;
|
|
14
|
+
export let colorFormat = "hex";
|
|
15
|
+
export let colorful = false;
|
|
16
|
+
export let composed = false;
|
|
17
|
+
export let disabled = false;
|
|
18
|
+
export let open = false;
|
|
19
|
+
export let stayOpenOnClickAway = false;
|
|
20
|
+
let hue = 0;
|
|
21
|
+
let saturation = 0;
|
|
22
|
+
let lightness = 0;
|
|
23
|
+
let red = 0;
|
|
24
|
+
let green = 0;
|
|
25
|
+
let blue = 0;
|
|
26
|
+
let alpha = 1;
|
|
27
|
+
let hexAlpha = 255;
|
|
28
|
+
let updating = false;
|
|
29
|
+
let tabListRef;
|
|
30
|
+
let tabsRef;
|
|
31
|
+
const updateFromRgb = async () => {
|
|
32
|
+
if (!updating && (colorFormat === "hex" || colorFormat === "rgb")) {
|
|
33
|
+
updating = true;
|
|
34
|
+
const newAlpha = colorFormat === "hex" ? hexAlpha / 255 : alpha;
|
|
35
|
+
const color = tinycolor({ r: red, g: green, b: blue, a: newAlpha });
|
|
36
|
+
const hsl = color.toHsl();
|
|
37
|
+
hue = Math.round(hsl.h);
|
|
38
|
+
saturation = Math.round(hsl.s * 100);
|
|
39
|
+
lightness = Math.round(hsl.l * 100);
|
|
40
|
+
switch (colorFormat) {
|
|
41
|
+
case "rgb":
|
|
42
|
+
colorText = color.toRgbString();
|
|
43
|
+
hexAlpha = Math.round(alpha * 255);
|
|
44
|
+
break;
|
|
45
|
+
case "hex":
|
|
46
|
+
colorText = alpha === 100 ? color.toHexString() : color.toHex8String();
|
|
47
|
+
alpha = round(hexAlpha / 255, 2);
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
await tick();
|
|
51
|
+
updating = false;
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
const updateFromHsl = async () => {
|
|
55
|
+
if (!updating && colorFormat === "hsl") {
|
|
56
|
+
updating = true;
|
|
57
|
+
const color = tinycolor({ h: hue, s: saturation / 100, l: lightness / 100, a: alpha });
|
|
58
|
+
const rgb = color.toRgb();
|
|
59
|
+
red = rgb.r;
|
|
60
|
+
green = rgb.g;
|
|
61
|
+
blue = rgb.b;
|
|
62
|
+
colorText = color.toHslString();
|
|
63
|
+
hexAlpha = Math.round(alpha * 255);
|
|
64
|
+
await tick();
|
|
65
|
+
updating = false;
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
const updateColorsFromText = async () => {
|
|
69
|
+
const color = tinycolor(colorText);
|
|
70
|
+
if (color.isValid) {
|
|
71
|
+
if (!updating) {
|
|
72
|
+
updating = true;
|
|
73
|
+
switch (color.format) {
|
|
74
|
+
case "hsl":
|
|
75
|
+
colorFormat = "hsl";
|
|
76
|
+
break;
|
|
77
|
+
case "rgb":
|
|
78
|
+
colorFormat = "rgb";
|
|
79
|
+
break;
|
|
80
|
+
case "hex":
|
|
81
|
+
case "hex4":
|
|
82
|
+
case "hex8":
|
|
83
|
+
colorFormat = "hex";
|
|
84
|
+
break;
|
|
85
|
+
default:
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
const hsl = color.toHsl();
|
|
89
|
+
hue = Math.round(hsl.h);
|
|
90
|
+
saturation = Math.round(hsl.s * 100);
|
|
91
|
+
lightness = Math.round(hsl.l * 100);
|
|
92
|
+
const rgb = color.toRgb();
|
|
93
|
+
red = rgb.r;
|
|
94
|
+
green = rgb.g;
|
|
95
|
+
blue = rgb.b;
|
|
96
|
+
if (rgb.a) {
|
|
97
|
+
alpha = hsl.a;
|
|
98
|
+
hexAlpha = Math.round(alpha * 255);
|
|
99
|
+
}
|
|
100
|
+
await tick();
|
|
101
|
+
updating = false;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
$:
|
|
106
|
+
colorText, updateColorsFromText();
|
|
107
|
+
$:
|
|
108
|
+
colorFormat, hue, saturation, lightness, alpha, updateFromHsl();
|
|
109
|
+
$:
|
|
110
|
+
colorFormat, red, green, blue, alpha, hexAlpha, updateFromRgb();
|
|
111
|
+
const onInputBlur = async () => {
|
|
112
|
+
if (!updating) {
|
|
113
|
+
if (colorText.trim().length === 0) {
|
|
114
|
+
colorText = defaultColorText;
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const color = tinycolor(colorText);
|
|
118
|
+
if (color.isValid) {
|
|
119
|
+
updating = true;
|
|
120
|
+
switch (colorFormat) {
|
|
121
|
+
case "hsl":
|
|
122
|
+
colorText = color.toHslString();
|
|
123
|
+
break;
|
|
124
|
+
case "rgb":
|
|
125
|
+
colorText = color.toRgbString();
|
|
126
|
+
break;
|
|
127
|
+
case "hex":
|
|
128
|
+
colorText = alpha === 1 ? color.toHexString() : color.toHex8String();
|
|
129
|
+
break;
|
|
130
|
+
default:
|
|
131
|
+
break;
|
|
132
|
+
}
|
|
133
|
+
await tick();
|
|
134
|
+
updating = false;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
const onInputClick = (event) => {
|
|
139
|
+
event.stopPropagation();
|
|
140
|
+
return false;
|
|
141
|
+
};
|
|
142
|
+
const onInputKeydown = (event) => {
|
|
143
|
+
switch (event.key) {
|
|
144
|
+
case "Tab":
|
|
145
|
+
if (open) {
|
|
146
|
+
setTimeout(() => {
|
|
147
|
+
tabListRef?.focus();
|
|
148
|
+
}, 0);
|
|
149
|
+
event.preventDefault();
|
|
150
|
+
event.stopPropagation();
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
break;
|
|
154
|
+
case "Escape":
|
|
155
|
+
if (open) {
|
|
156
|
+
open = false;
|
|
157
|
+
event.preventDefault();
|
|
158
|
+
event.stopPropagation();
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
event.stopImmediatePropagation();
|
|
164
|
+
};
|
|
165
|
+
updateColorsFromText();
|
|
166
|
+
</script>
|
|
167
|
+
|
|
168
|
+
<Dropdown bind:open {colorful} {composed} {disabled} {stayOpenOnClickAway}>
|
|
169
|
+
<div class="value" slot="value">
|
|
170
|
+
<div class="color-box" style="background-color: {colorText}" />
|
|
171
|
+
<Input
|
|
172
|
+
bind:value={colorText}
|
|
173
|
+
{colorful}
|
|
174
|
+
{disabled}
|
|
175
|
+
composed
|
|
176
|
+
on:blur={onInputBlur}
|
|
177
|
+
on:click={onInputClick}
|
|
178
|
+
on:keydown={onInputKeydown}
|
|
179
|
+
spellcheck="false"
|
|
180
|
+
/>
|
|
181
|
+
</div>
|
|
182
|
+
<div class="popup" use:trapKeyboardFocus>
|
|
183
|
+
<div class="tabs" bind:this={tabsRef}>
|
|
184
|
+
<TabList bind:this={tabListRef} bind:selectedValue={colorFormat} {colorful}>
|
|
185
|
+
<Tab value="hex">hex</Tab>
|
|
186
|
+
<Tab value="rgb">rgb</Tab>
|
|
187
|
+
<Tab value="hsl">hsl</Tab>
|
|
188
|
+
</TabList>
|
|
189
|
+
</div>
|
|
190
|
+
<div class="sliders">
|
|
191
|
+
{#if colorFormat === 'rgb'}
|
|
192
|
+
<RgbColorSliders bind:red bind:green bind:blue bind:alpha {colorful} />
|
|
193
|
+
{:else if colorFormat === 'hex'}
|
|
194
|
+
<HexColorSliders bind:red bind:green bind:blue bind:alpha={hexAlpha} {colorful} />
|
|
195
|
+
{:else if colorFormat === 'hsl'}
|
|
196
|
+
<HslColorSliders bind:hue bind:saturation bind:lightness bind:alpha {colorful} />
|
|
197
|
+
{/if}
|
|
198
|
+
</div>
|
|
199
|
+
</div>
|
|
200
|
+
</Dropdown>
|
|
201
|
+
|
|
202
|
+
<style>
|
|
203
|
+
.value {
|
|
204
|
+
display: grid;
|
|
205
|
+
align-items: center;
|
|
206
|
+
justify-content: stretch;
|
|
207
|
+
justify-items: stretch;
|
|
208
|
+
grid-template-columns: auto 1fr;
|
|
209
|
+
padding-left: 0.5em;
|
|
210
|
+
width: 250px;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
.color-box {
|
|
214
|
+
width: 1em;
|
|
215
|
+
height: 1em;
|
|
216
|
+
border: 1px dashed var(--stsv-common__border-color);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
.popup {
|
|
220
|
+
width: fit-content;
|
|
221
|
+
min-width: 500px;
|
|
222
|
+
display: grid;
|
|
223
|
+
align-items: center;
|
|
224
|
+
padding: 0.25em;
|
|
225
|
+
}
|
|
226
|
+
</style>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { SvelteComponentTyped } from "svelte";
|
|
2
|
+
declare const __propDef: {
|
|
3
|
+
props: {
|
|
4
|
+
colorText?: string | undefined;
|
|
5
|
+
colorFormat?: "hex" | "rgb" | "hsl" | undefined;
|
|
6
|
+
colorful?: boolean | undefined;
|
|
7
|
+
composed?: boolean | undefined;
|
|
8
|
+
disabled?: boolean | undefined;
|
|
9
|
+
open?: boolean | undefined;
|
|
10
|
+
stayOpenOnClickAway?: boolean | undefined;
|
|
11
|
+
};
|
|
12
|
+
events: {
|
|
13
|
+
[evt: string]: CustomEvent<any>;
|
|
14
|
+
};
|
|
15
|
+
slots: {};
|
|
16
|
+
};
|
|
17
|
+
export type ColorPickerProps = typeof __propDef.props;
|
|
18
|
+
export type ColorPickerEvents = typeof __propDef.events;
|
|
19
|
+
export type ColorPickerSlots = typeof __propDef.slots;
|
|
20
|
+
export default class ColorPicker extends SvelteComponentTyped<ColorPickerProps, ColorPickerEvents, ColorPickerSlots> {
|
|
21
|
+
}
|
|
22
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/Dialog.svelte
CHANGED
|
@@ -10,7 +10,7 @@ let formRef;
|
|
|
10
10
|
let closing = false;
|
|
11
11
|
const onDocumentClick = (event) => {
|
|
12
12
|
const targetNode = event?.target;
|
|
13
|
-
if (targetNode && !contentRef
|
|
13
|
+
if (targetNode && !contentRef?.contains(targetNode) && backdropCloses) {
|
|
14
14
|
open = false;
|
|
15
15
|
}
|
|
16
16
|
};
|
|
@@ -146,17 +146,17 @@ A styled <dialog> element
|
|
|
146
146
|
}
|
|
147
147
|
|
|
148
148
|
.header {
|
|
149
|
-
background-color: var(--stsv-
|
|
149
|
+
background-color: var(--stsv-common__background-color--secondary);
|
|
150
150
|
}
|
|
151
151
|
|
|
152
152
|
.content {
|
|
153
|
-
background-color: var(--stsv-
|
|
154
|
-
border-color: var(--stsv-
|
|
155
|
-
border-radius: var(--stsv-
|
|
156
|
-
border-style: var(--stsv-
|
|
157
|
-
border-width: var(--stsv-
|
|
153
|
+
background-color: var(--stsv-common__background-color);
|
|
154
|
+
border-color: var(--stsv-common__border-color);
|
|
155
|
+
border-radius: var(--stsv-common__border-radius);
|
|
156
|
+
border-style: var(--stsv-common__border-style);
|
|
157
|
+
border-width: var(--stsv-common__border-width);
|
|
158
158
|
box-sizing: border-box;
|
|
159
|
-
color: var(--stsv-
|
|
159
|
+
color: var(--stsv-common__color);
|
|
160
160
|
display: grid;
|
|
161
161
|
grid-template-columns: 1fr;
|
|
162
162
|
grid-template-rows: auto 1fr auto auto;
|
|
@@ -229,8 +229,8 @@ A styled <dialog> element
|
|
|
229
229
|
}
|
|
230
230
|
|
|
231
231
|
.separator {
|
|
232
|
-
background-color: var(--stsv-
|
|
233
|
-
height: var(--stsv-
|
|
232
|
+
background-color: var(--stsv-common__background-color--secondary);
|
|
233
|
+
height: var(--stsv-common__border-width);
|
|
234
234
|
margin: 0 0.25em;
|
|
235
235
|
}
|
|
236
236
|
|