@geoffcox/sterling-svelte 0.0.25 → 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 +88 -47
- package/Dropdown.svelte.d.ts +4 -0
- package/Field.svelte +34 -46
- 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 +31 -30
- 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 +92 -121
- package/Menu.svelte.d.ts +8 -2
- package/MenuBar.svelte +77 -32
- package/MenuBar.types.d.ts +2 -2
- package/MenuButton.svelte +48 -28
- package/MenuItem.constants.d.ts +1 -0
- package/MenuItem.constants.js +1 -0
- package/MenuItem.svelte +202 -139
- package/MenuItem.svelte.d.ts +7 -3
- package/MenuItem.types.d.ts +14 -5
- package/MenuItem.utils.d.ts +2 -0
- package/MenuItem.utils.js +16 -0
- package/MenuItemDisplay.svelte +9 -2
- package/MenuItemDisplay.svelte.d.ts +1 -0
- package/MenuSeparator.svelte +3 -3
- package/Popover.svelte +68 -64
- 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 +50 -32
- 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 +53 -30
- package/TabList.svelte +23 -28
- package/TabList.svelte.d.ts +1 -0
- package/TabList.types.d.ts +1 -1
- package/TextArea.svelte +45 -20
- package/TextArea.svelte.d.ts +3 -2
- package/Tooltip.svelte +12 -11
- package/Tree.svelte +37 -35
- package/Tree.svelte.d.ts +2 -0
- package/Tree.types.d.ts +1 -0
- package/TreeChevron.svelte +1 -1
- package/TreeItem.svelte +47 -10
- 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 +10 -5
- package/index.js +8 -3
- package/package.json +12 -1
- package/stores/prefersReducedMotion.d.ts +1 -0
- package/stores/prefersReducedMotion.js +10 -0
- package/stores/usingKeyboard.d.ts +1 -0
- package/stores/usingKeyboard.js +13 -0
- 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/Popover.svelte
CHANGED
|
@@ -1,35 +1,37 @@
|
|
|
1
1
|
<script>import { onMount } from "svelte";
|
|
2
|
-
import { autoUpdate, computePosition, flip, offset
|
|
2
|
+
import { autoUpdate, computePosition, flip, offset } from "@floating-ui/dom";
|
|
3
3
|
import { portal } from "./actions/portal";
|
|
4
|
-
export let
|
|
4
|
+
export let offsetOptions = { mainAxis: 0, crossAxis: 0 };
|
|
5
5
|
export let open = false;
|
|
6
|
-
export let
|
|
6
|
+
export let persistent = false;
|
|
7
|
+
export let placement = "bottom-start";
|
|
7
8
|
export let portalHost = void 0;
|
|
9
|
+
export let reference;
|
|
8
10
|
let popupRef;
|
|
9
11
|
let popupPosition = { x: 0, y: 0 };
|
|
10
12
|
const hostId = "SterlingPopoverPortal";
|
|
11
13
|
const ensurePortalHost = () => {
|
|
12
|
-
if (
|
|
13
|
-
|
|
14
|
+
if (document) {
|
|
15
|
+
if (portalHost) {
|
|
16
|
+
return portalHost;
|
|
17
|
+
}
|
|
18
|
+
let host = document.querySelector(`#${hostId}`);
|
|
19
|
+
if (!host) {
|
|
20
|
+
console.log("creating portal host");
|
|
21
|
+
host = document.createElement("div");
|
|
22
|
+
host.id = hostId;
|
|
23
|
+
host.style.overflow = "visible";
|
|
24
|
+
document.body.append(host);
|
|
25
|
+
}
|
|
26
|
+
portalHost = host;
|
|
14
27
|
}
|
|
15
|
-
let host = document.querySelector(`#${hostId}`);
|
|
16
|
-
if (!host) {
|
|
17
|
-
host = document.createElement("div");
|
|
18
|
-
host.id = hostId;
|
|
19
|
-
host.style.overflow = "visible";
|
|
20
|
-
document.body.append(host);
|
|
21
|
-
}
|
|
22
|
-
portalHost = host;
|
|
23
28
|
};
|
|
24
29
|
let bodyHeight = 0;
|
|
25
30
|
const resizeObserver = new ResizeObserver((entries) => {
|
|
26
31
|
bodyHeight = entries[0].target.clientHeight;
|
|
27
32
|
});
|
|
28
|
-
|
|
29
|
-
offset(
|
|
30
|
-
flip(),
|
|
31
|
-
shift({ padding: 0, mainAxis: true, crossAxis: true })
|
|
32
|
-
];
|
|
33
|
+
$:
|
|
34
|
+
middleware = [offset(offsetOptions), flip()];
|
|
33
35
|
const computePopupPosition = async () => {
|
|
34
36
|
if (reference && popupRef) {
|
|
35
37
|
popupPosition = await computePosition(reference, popupRef, {
|
|
@@ -51,7 +53,7 @@ const autoUpdateMenuPosition = () => {
|
|
|
51
53
|
$:
|
|
52
54
|
popupRef, reference, autoUpdateMenuPosition();
|
|
53
55
|
$:
|
|
54
|
-
open, bodyHeight, placement, computePopupPosition();
|
|
56
|
+
open, bodyHeight, middleware, placement, computePopupPosition();
|
|
55
57
|
onMount(() => {
|
|
56
58
|
ensurePortalHost();
|
|
57
59
|
resizeObserver.observe(document.body);
|
|
@@ -59,46 +61,55 @@ onMount(() => {
|
|
|
59
61
|
resizeObserver.unobserve(document.body);
|
|
60
62
|
};
|
|
61
63
|
});
|
|
64
|
+
const onKeydown = (event) => {
|
|
65
|
+
if (event.key === "Escape") {
|
|
66
|
+
open = false;
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
ensurePortalHost();
|
|
62
70
|
</script>
|
|
63
71
|
|
|
64
|
-
|
|
65
|
-
<div
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
72
|
+
{#if open || persistent}
|
|
73
|
+
<div use:portal={{ target: portalHost ?? document.body }} class="sterling-popover-portal">
|
|
74
|
+
<div
|
|
75
|
+
bind:this={popupRef}
|
|
76
|
+
class="sterling-popover"
|
|
77
|
+
class:open
|
|
78
|
+
on:blur
|
|
79
|
+
on:click
|
|
80
|
+
on:copy
|
|
81
|
+
on:cut
|
|
82
|
+
on:dblclick
|
|
83
|
+
on:dragend
|
|
84
|
+
on:dragenter
|
|
85
|
+
on:dragleave
|
|
86
|
+
on:dragover
|
|
87
|
+
on:dragstart
|
|
88
|
+
on:drop
|
|
89
|
+
on:focus
|
|
90
|
+
on:focusin
|
|
91
|
+
on:focusout
|
|
92
|
+
on:keydown
|
|
93
|
+
on:keypress
|
|
94
|
+
on:keyup
|
|
95
|
+
on:mousedown
|
|
96
|
+
on:mouseenter
|
|
97
|
+
on:mouseleave
|
|
98
|
+
on:mousemove
|
|
99
|
+
on:mouseover
|
|
100
|
+
on:mouseout
|
|
101
|
+
on:mouseup
|
|
102
|
+
on:scroll
|
|
103
|
+
on:wheel|passive
|
|
104
|
+
on:paste
|
|
105
|
+
on:keydown={onKeydown}
|
|
106
|
+
{...$$restProps}
|
|
107
|
+
style="left:{popupPosition.x}px; top:{popupPosition.y}px"
|
|
108
|
+
>
|
|
109
|
+
<slot />
|
|
110
|
+
</div>
|
|
100
111
|
</div>
|
|
101
|
-
|
|
112
|
+
{/if}
|
|
102
113
|
|
|
103
114
|
<style>
|
|
104
115
|
.sterling-popover-portal {
|
|
@@ -108,11 +119,6 @@ onMount(() => {
|
|
|
108
119
|
}
|
|
109
120
|
|
|
110
121
|
.sterling-popover {
|
|
111
|
-
background-color: var(--stsv-Common__background-color);
|
|
112
|
-
border-color: var(--stsv-Common__border-color);
|
|
113
|
-
border-radius: var(--stsv-Common__border-radius);
|
|
114
|
-
border-style: var(--stsv-Common__border-style);
|
|
115
|
-
border-width: var(--stsv-Common__border-width);
|
|
116
122
|
box-shadow: rgba(0, 0, 0, 0.4) 2px 2px 4px -1px;
|
|
117
123
|
box-sizing: border-box;
|
|
118
124
|
display: none;
|
|
@@ -120,9 +126,7 @@ onMount(() => {
|
|
|
120
126
|
grid-template-rows: 1fr;
|
|
121
127
|
height: fit-content;
|
|
122
128
|
left: 0;
|
|
123
|
-
|
|
124
|
-
overflow: auto;
|
|
125
|
-
overscroll-behavior: contain;
|
|
129
|
+
overflow: hidden;
|
|
126
130
|
position: absolute;
|
|
127
131
|
top: 0;
|
|
128
132
|
width: max-content;
|
package/Popover.svelte.d.ts
CHANGED
|
@@ -3,10 +3,12 @@ import type { Placement } from '@floating-ui/dom';
|
|
|
3
3
|
declare const __propDef: {
|
|
4
4
|
props: {
|
|
5
5
|
[x: string]: any;
|
|
6
|
-
|
|
6
|
+
offsetOptions?: import("@floating-ui/core").OffsetOptions | undefined;
|
|
7
7
|
open?: boolean | undefined;
|
|
8
|
-
|
|
8
|
+
persistent?: boolean | undefined;
|
|
9
|
+
placement?: Placement | undefined;
|
|
9
10
|
portalHost?: HTMLElement | undefined;
|
|
11
|
+
reference: HTMLElement;
|
|
10
12
|
};
|
|
11
13
|
events: {
|
|
12
14
|
blur: FocusEvent;
|
package/Progress.svelte
CHANGED
|
@@ -67,7 +67,7 @@ $:
|
|
|
67
67
|
on:pointerover
|
|
68
68
|
on:pointerout
|
|
69
69
|
on:pointerup
|
|
70
|
-
on:wheel
|
|
70
|
+
on:wheel|passive
|
|
71
71
|
{...$$restProps}
|
|
72
72
|
>
|
|
73
73
|
<div class="container" bind:clientWidth bind:clientHeight>
|
|
@@ -89,14 +89,14 @@ $:
|
|
|
89
89
|
align-content: flex-start;
|
|
90
90
|
align-items: flex-start;
|
|
91
91
|
display: block;
|
|
92
|
-
background: var(--stsv-
|
|
92
|
+
background: var(--stsv-common__background-color);
|
|
93
93
|
box-sizing: border-box;
|
|
94
94
|
height: 1em;
|
|
95
95
|
padding: 0.25em;
|
|
96
|
-
border-width: var(--stsv-
|
|
97
|
-
border-style: var(--stsv-
|
|
98
|
-
border-color: var(--stsv-
|
|
99
|
-
border-radius: var(--stsv-
|
|
96
|
+
border-width: var(--stsv-common__border-width);
|
|
97
|
+
border-style: var(--stsv-common__border-style);
|
|
98
|
+
border-color: var(--stsv-common__border-color);
|
|
99
|
+
border-radius: var(--stsv-common__border-radius);
|
|
100
100
|
transition: background-color 250ms, color 250ms, border-color 250ms;
|
|
101
101
|
}
|
|
102
102
|
|
|
@@ -108,7 +108,7 @@ $:
|
|
|
108
108
|
}
|
|
109
109
|
|
|
110
110
|
.indicator {
|
|
111
|
-
background-color: var(--stsv-
|
|
111
|
+
background-color: var(--stsv-common__border-color);
|
|
112
112
|
box-sizing: border-box;
|
|
113
113
|
height: 100%;
|
|
114
114
|
min-height: 1px;
|
|
@@ -140,30 +140,30 @@ $:
|
|
|
140
140
|
/* ----- Colorful ----- */
|
|
141
141
|
|
|
142
142
|
.indicator.info {
|
|
143
|
-
background-color: var(--stsv-
|
|
143
|
+
background-color: var(--stsv-status--info__border-color);
|
|
144
144
|
}
|
|
145
145
|
|
|
146
146
|
.indicator.success {
|
|
147
|
-
background-color: var(--stsv-
|
|
147
|
+
background-color: var(--stsv-status--success__border-color);
|
|
148
148
|
}
|
|
149
149
|
|
|
150
150
|
.indicator.warning {
|
|
151
|
-
background-color: var(--stsv-
|
|
151
|
+
background-color: var(--stsv-status--warning__border-color);
|
|
152
152
|
}
|
|
153
153
|
|
|
154
154
|
.indicator.error {
|
|
155
|
-
background-color: var(--stsv-
|
|
155
|
+
background-color: var(--stsv-status--error__border-color);
|
|
156
156
|
}
|
|
157
157
|
|
|
158
158
|
/* ----- Disabled ----- */
|
|
159
159
|
|
|
160
160
|
.sterling-progress.disabled {
|
|
161
|
-
background: var(--stsv-
|
|
162
|
-
border-color: var(--stsv-
|
|
161
|
+
background: var(--stsv-common__background-color--disabled);
|
|
162
|
+
border-color: var(--stsv-common__border-color--disabled);
|
|
163
163
|
}
|
|
164
164
|
|
|
165
165
|
.sterling-progress.disabled .indicator {
|
|
166
|
-
background-color: var(--stsv-
|
|
166
|
+
background-color: var(--stsv-common__color--disabled);
|
|
167
167
|
}
|
|
168
168
|
|
|
169
169
|
@media (prefers-reduced-motion) {
|
package/Radio.svelte
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
<script>import { idGenerator } from "./idGenerator";
|
|
2
2
|
import Label from "./Label.svelte";
|
|
3
|
+
export let colorful = false;
|
|
3
4
|
export let checked = false;
|
|
4
5
|
export let disabled = false;
|
|
5
6
|
export let group = void 0;
|
|
@@ -59,7 +60,7 @@ const onChange = (e) => {
|
|
|
59
60
|
@component
|
|
60
61
|
A styled HTML input type=radio element with optional label.
|
|
61
62
|
-->
|
|
62
|
-
<div class="sterling-radio" class:disabled>
|
|
63
|
+
<div class="sterling-radio" class:colorful class:disabled>
|
|
63
64
|
<div class="container">
|
|
64
65
|
<input
|
|
65
66
|
bind:this={inputRef}
|
|
@@ -93,7 +94,7 @@ const onChange = (e) => {
|
|
|
93
94
|
on:mouseover
|
|
94
95
|
on:mouseout
|
|
95
96
|
on:mouseup
|
|
96
|
-
on:wheel
|
|
97
|
+
on:wheel|passive
|
|
97
98
|
{...$$restProps}
|
|
98
99
|
/>
|
|
99
100
|
<div class="indicator" />
|
|
@@ -152,10 +153,10 @@ const onChange = (e) => {
|
|
|
152
153
|
and there is not a parent CSS selector.
|
|
153
154
|
*/
|
|
154
155
|
.indicator {
|
|
155
|
-
background-color: var(--stsv-
|
|
156
|
-
border-color: var(--stsv-
|
|
157
|
-
border-style: var(--stsv-
|
|
158
|
-
border-width: var(--stsv-
|
|
156
|
+
background-color: var(--stsv-input__background-color);
|
|
157
|
+
border-color: var(--stsv-input__border-color);
|
|
158
|
+
border-style: var(--stsv-input__border-style);
|
|
159
|
+
border-width: var(--stsv-input__border-width);
|
|
159
160
|
border-radius: 10000px;
|
|
160
161
|
box-sizing: border-box;
|
|
161
162
|
display: inline-block;
|
|
@@ -167,20 +168,20 @@ const onChange = (e) => {
|
|
|
167
168
|
}
|
|
168
169
|
|
|
169
170
|
input:checked + .indicator {
|
|
170
|
-
background-color: var(--stsv-
|
|
171
|
-
border-color: var(--stsv-
|
|
171
|
+
background-color: var(--stsv-input__background-color);
|
|
172
|
+
border-color: var(--stsv-input__border-color);
|
|
172
173
|
}
|
|
173
174
|
|
|
174
175
|
.sterling-radio:not(.disabled):hover .indicator {
|
|
175
|
-
background-color: var(--stsv-
|
|
176
|
-
border-color: var(--stsv-
|
|
176
|
+
background-color: var(--stsv-input__background-color--hover);
|
|
177
|
+
border-color: var(--stsv-input__border-color--hover);
|
|
177
178
|
}
|
|
178
179
|
|
|
179
180
|
input:focus-visible + .indicator {
|
|
180
|
-
outline-color: var(--stsv-
|
|
181
|
-
outline-offset: var(--stsv-
|
|
182
|
-
outline-style: var(--stsv-
|
|
183
|
-
outline-width: var(--stsv-
|
|
181
|
+
outline-color: var(--stsv-common__outline-color);
|
|
182
|
+
outline-offset: var(--stsv-common__outline-offset);
|
|
183
|
+
outline-style: var(--stsv-common__outline-style);
|
|
184
|
+
outline-width: var(--stsv-common__outline-width);
|
|
184
185
|
}
|
|
185
186
|
|
|
186
187
|
.indicator::after {
|
|
@@ -197,7 +198,26 @@ const onChange = (e) => {
|
|
|
197
198
|
}
|
|
198
199
|
|
|
199
200
|
input:checked + .indicator::after {
|
|
200
|
-
background-color: var(--stsv-
|
|
201
|
+
background-color: var(--stsv-input__color);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
.sterling-radio.colorful .indicator {
|
|
205
|
+
background-color: var(--stsv-input--colorful__background-color);
|
|
206
|
+
border-color: var(--stsv-input--colorful__border-color);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
.sterling-radio.colorful input:checked + .indicator {
|
|
210
|
+
background-color: var(--stsv-input--colorful__background-color);
|
|
211
|
+
border-color: var(--stsv-input--colorful__border-color);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
.sterling-radio.colorful:not(.disabled):hover .indicator {
|
|
215
|
+
background-color: var(--stsv-input--colorful__background-color--hover);
|
|
216
|
+
border-color: var(--stsv-input--colorful__border-color--hover);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
.sterling-radio.colorful input:checked + .indicator::after {
|
|
220
|
+
background-color: var(--stsv-input--colorful__color);
|
|
201
221
|
}
|
|
202
222
|
|
|
203
223
|
.sterling-radio.disabled * {
|
|
@@ -205,7 +225,13 @@ const onChange = (e) => {
|
|
|
205
225
|
}
|
|
206
226
|
|
|
207
227
|
.container::after {
|
|
208
|
-
background:
|
|
228
|
+
background: repeating-linear-gradient(
|
|
229
|
+
45deg,
|
|
230
|
+
var(--stsv-common__background-color1--disabled),
|
|
231
|
+
var(--stsv-common__background-color1--disabled) 3px,
|
|
232
|
+
var(--stsv-common__background-color2--disabled) 3px,
|
|
233
|
+
var(--stsv-common__background-color2--disabled) 6px
|
|
234
|
+
);
|
|
209
235
|
border-radius: 10000px;
|
|
210
236
|
bottom: 0;
|
|
211
237
|
content: '';
|
package/Radio.svelte.d.ts
CHANGED
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
<script>import { createEventDispatcher } from "svelte";
|
|
2
|
+
import Input from "./Input.svelte";
|
|
3
|
+
import Slider from "./Slider.svelte";
|
|
4
|
+
import { round } from "lodash-es";
|
|
5
|
+
export let red = 0;
|
|
6
|
+
export let green = 0;
|
|
7
|
+
export let blue = 0;
|
|
8
|
+
export let alpha = 1;
|
|
9
|
+
export let colorful = false;
|
|
10
|
+
let redText = red.toString();
|
|
11
|
+
let greenText = green.toString();
|
|
12
|
+
let blueText = blue.toString();
|
|
13
|
+
let alphaText = alpha.toString();
|
|
14
|
+
$: {
|
|
15
|
+
redText = red.toString();
|
|
16
|
+
}
|
|
17
|
+
$: {
|
|
18
|
+
greenText = green.toString();
|
|
19
|
+
}
|
|
20
|
+
$: {
|
|
21
|
+
blueText = blue.toString();
|
|
22
|
+
}
|
|
23
|
+
$: {
|
|
24
|
+
alphaText = alpha.toString();
|
|
25
|
+
}
|
|
26
|
+
const dispatcher = createEventDispatcher();
|
|
27
|
+
const raiseChange = () => {
|
|
28
|
+
dispatcher("change", { red, green, blue, alpha });
|
|
29
|
+
};
|
|
30
|
+
$:
|
|
31
|
+
red, green, blue, alpha, raiseChange();
|
|
32
|
+
const parseRgbValue = (text, defaultValue = 0) => {
|
|
33
|
+
if (!text) {
|
|
34
|
+
return defaultValue;
|
|
35
|
+
}
|
|
36
|
+
const newValue = text ? Number.parseFloat(text) : defaultValue;
|
|
37
|
+
if (newValue && newValue !== Number.NaN) {
|
|
38
|
+
return Math.round(Math.max(0, Math.min(255, newValue)));
|
|
39
|
+
}
|
|
40
|
+
return defaultValue;
|
|
41
|
+
};
|
|
42
|
+
const onRedInputChange = (event) => {
|
|
43
|
+
const inputChangeEvent = event;
|
|
44
|
+
red = parseRgbValue(inputChangeEvent?.currentTarget?.value, red);
|
|
45
|
+
};
|
|
46
|
+
const onGreenInputChange = (event) => {
|
|
47
|
+
const inputChangeEvent = event;
|
|
48
|
+
green = parseRgbValue(inputChangeEvent?.currentTarget?.value, green);
|
|
49
|
+
};
|
|
50
|
+
const onBlueInputChange = (event) => {
|
|
51
|
+
const inputChangeEvent = event;
|
|
52
|
+
blue = parseRgbValue(inputChangeEvent?.currentTarget?.value, blue);
|
|
53
|
+
};
|
|
54
|
+
const onAlphaInputchange = (event) => {
|
|
55
|
+
const inputChangeEvent = event;
|
|
56
|
+
const text = inputChangeEvent?.currentTarget?.value;
|
|
57
|
+
const newValue = text ? Number.parseFloat(text) : alpha;
|
|
58
|
+
if (newValue && newValue !== Number.NaN) {
|
|
59
|
+
alpha = round(Math.max(0, Math.min(1, newValue)), 2);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
</script>
|
|
63
|
+
|
|
64
|
+
<div class="sterling-rgb-color-sliders">
|
|
65
|
+
<div class="slider red-slider">
|
|
66
|
+
<Slider {colorful} min={0} max={255} precision={0} bind:value={red} />
|
|
67
|
+
</div>
|
|
68
|
+
<Input {colorful} bind:value={redText} on:change={(e) => onRedInputChange(e)} />
|
|
69
|
+
<div class="slider green-slider">
|
|
70
|
+
<Slider {colorful} min={0} max={255} precision={0} bind:value={green} />
|
|
71
|
+
</div>
|
|
72
|
+
<Input {colorful} bind:value={greenText} on:change={(e) => onGreenInputChange(e)} />
|
|
73
|
+
<div class="slider blue-slider">
|
|
74
|
+
<Slider {colorful} min={0} max={255} precision={0} bind:value={blue} />
|
|
75
|
+
</div>
|
|
76
|
+
<Input {colorful} bind:value={blueText} on:change={(e) => onBlueInputChange(e)} />
|
|
77
|
+
<div class="alpha" style={`--red:${red};--green:${green};--blue:${blue}`}>
|
|
78
|
+
<div class="alpha-hatch" />
|
|
79
|
+
<div class="alpha-gradient" />
|
|
80
|
+
<div class="slider alpha-slider">
|
|
81
|
+
<Slider {colorful} min={0} max={1} precision={2} bind:value={alpha} />
|
|
82
|
+
</div>
|
|
83
|
+
</div>
|
|
84
|
+
<Input {colorful} bind:value={alphaText} on:change={(e) => onAlphaInputchange(e)} />
|
|
85
|
+
</div>
|
|
86
|
+
|
|
87
|
+
<style>
|
|
88
|
+
.sterling-rgb-color-sliders {
|
|
89
|
+
align-items: center;
|
|
90
|
+
display: grid;
|
|
91
|
+
grid-template-columns: 1fr 4em;
|
|
92
|
+
column-gap: 0.5em;
|
|
93
|
+
row-gap: 0.25em;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
.slider :global(.fill),
|
|
97
|
+
.slider :global(.sterling-slider.colorful .fill) {
|
|
98
|
+
background-color: transparent;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.slider :global(.track),
|
|
102
|
+
.slider :global(.sterling-slider.colorful .track) {
|
|
103
|
+
background-color: transparent;
|
|
104
|
+
background-image: linear-gradient(to right, #ffffff, #ffffff 1px, #000000 1px, #000000);
|
|
105
|
+
background-size: 2px 100%;
|
|
106
|
+
opacity: 0.1;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.red-slider {
|
|
110
|
+
background: linear-gradient(to right, black 0%, rgb(255, 0, 0) 100%);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
.green-slider {
|
|
114
|
+
background: linear-gradient(to right, black 0%, rgb(0, 255, 0) 100%);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.blue-slider {
|
|
118
|
+
background: linear-gradient(to right, black 0%, rgb(0, 0, 255) 100%);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.alpha {
|
|
122
|
+
display: grid;
|
|
123
|
+
grid-template-columns: 1fr;
|
|
124
|
+
grid-template-rows: 1fr;
|
|
125
|
+
place-content: stretch;
|
|
126
|
+
place-items: stretch;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
.alpha-gradient,
|
|
130
|
+
.alpha-hatch,
|
|
131
|
+
.alpha-slider {
|
|
132
|
+
grid-row: 1 / span 1;
|
|
133
|
+
grid-column: 1 / span 1;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.alpha-hatch {
|
|
137
|
+
background-color: #eee;
|
|
138
|
+
opacity: 0.1;
|
|
139
|
+
background-image: repeating-linear-gradient(
|
|
140
|
+
45deg,
|
|
141
|
+
#444 25%,
|
|
142
|
+
transparent 25%,
|
|
143
|
+
transparent 75%,
|
|
144
|
+
#444 75%,
|
|
145
|
+
#444
|
|
146
|
+
),
|
|
147
|
+
repeating-linear-gradient(45deg, #444 25%, #eee 25%, #eee 75%, #444 75%, #444),
|
|
148
|
+
repeating-linear-gradient(-45deg, #444 25%, transparent 25%, transparent 75%, #444 75%, #444),
|
|
149
|
+
repeating-linear-gradient(-45deg, #444 25%, #eee 25%, #eee 75%, #444 75%, #444);
|
|
150
|
+
background-position: 0 0, 4px 4px;
|
|
151
|
+
background-size: 8px 8px;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.alpha-gradient {
|
|
155
|
+
background: linear-gradient(
|
|
156
|
+
to right,
|
|
157
|
+
rgba(var(--red), var(--green), var(--blue), 0) 0%,
|
|
158
|
+
rgba(var(--red), var(--green), var(--blue), 100) 100%
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
</style>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { SvelteComponentTyped } from "svelte";
|
|
2
|
+
declare const __propDef: {
|
|
3
|
+
props: {
|
|
4
|
+
red?: number | undefined;
|
|
5
|
+
green?: number | undefined;
|
|
6
|
+
blue?: number | undefined;
|
|
7
|
+
alpha?: number | undefined;
|
|
8
|
+
colorful?: boolean | undefined;
|
|
9
|
+
};
|
|
10
|
+
events: {
|
|
11
|
+
change: CustomEvent<any>;
|
|
12
|
+
} & {
|
|
13
|
+
[evt: string]: CustomEvent<any>;
|
|
14
|
+
};
|
|
15
|
+
slots: {};
|
|
16
|
+
};
|
|
17
|
+
export type RgbColorSlidersProps = typeof __propDef.props;
|
|
18
|
+
export type RgbColorSlidersEvents = typeof __propDef.events;
|
|
19
|
+
export type RgbColorSlidersSlots = typeof __propDef.slots;
|
|
20
|
+
export default class RgbColorSliders extends SvelteComponentTyped<RgbColorSlidersProps, RgbColorSlidersEvents, RgbColorSlidersSlots> {
|
|
21
|
+
}
|
|
22
|
+
export {};
|