@geoffcox/sterling-svelte 0.0.26 → 0.0.28

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.
Files changed (92) hide show
  1. package/Button.svelte +81 -25
  2. package/Button.svelte.d.ts +3 -0
  3. package/Checkbox.svelte +56 -26
  4. package/Checkbox.svelte.d.ts +2 -0
  5. package/ColorPicker.constants.d.ts +1 -0
  6. package/ColorPicker.constants.js +1 -0
  7. package/ColorPicker.svelte +257 -0
  8. package/ColorPicker.svelte.d.ts +49 -0
  9. package/ColorPicker.types.d.ts +4 -0
  10. package/Dialog.svelte +10 -10
  11. package/Dropdown.svelte +97 -58
  12. package/Dropdown.svelte.d.ts +4 -0
  13. package/HexColorSliders.svelte +171 -0
  14. package/HexColorSliders.svelte.d.ts +22 -0
  15. package/HslColorSliders.svelte +208 -0
  16. package/HslColorSliders.svelte.d.ts +22 -0
  17. package/Input.svelte +59 -25
  18. package/Input.svelte.d.ts +3 -2
  19. package/Label.constants.d.ts +1 -0
  20. package/Label.constants.js +1 -0
  21. package/Label.svelte +212 -14
  22. package/Label.svelte.d.ts +24 -4
  23. package/Label.types.d.ts +4 -0
  24. package/Label.types.js +1 -0
  25. package/Link.svelte +62 -16
  26. package/Link.svelte.d.ts +1 -0
  27. package/List.svelte +29 -16
  28. package/List.svelte.d.ts +1 -0
  29. package/List.types.d.ts +4 -3
  30. package/ListItem.svelte +30 -10
  31. package/ListItem.svelte.d.ts +1 -1
  32. package/Menu.svelte +7 -7
  33. package/MenuBar.svelte +1 -1
  34. package/MenuButton.svelte +3 -9
  35. package/MenuButton.svelte.d.ts +2 -4
  36. package/MenuItem.svelte +34 -12
  37. package/MenuItem.svelte.d.ts +2 -1
  38. package/MenuItemDisplay.svelte +8 -1
  39. package/MenuSeparator.svelte +3 -3
  40. package/Popover.svelte +66 -51
  41. package/Popover.svelte.d.ts +4 -2
  42. package/Progress.constants.d.ts +1 -1
  43. package/Progress.constants.js +1 -1
  44. package/Progress.svelte +34 -28
  45. package/Progress.svelte.d.ts +1 -1
  46. package/Progress.types.d.ts +3 -3
  47. package/Radio.svelte +54 -23
  48. package/Radio.svelte.d.ts +2 -0
  49. package/RgbColorSliders.svelte +182 -0
  50. package/RgbColorSliders.svelte.d.ts +22 -0
  51. package/Select.svelte +32 -25
  52. package/Select.svelte.d.ts +1 -1
  53. package/Slider.svelte +111 -123
  54. package/Slider.svelte.d.ts +1 -0
  55. package/Switch.svelte +112 -41
  56. package/Switch.svelte.d.ts +3 -2
  57. package/Tab.svelte +53 -29
  58. package/Tab.svelte.d.ts +7 -4
  59. package/TabList.svelte +21 -11
  60. package/TabList.svelte.d.ts +1 -0
  61. package/TabList.types.d.ts +1 -0
  62. package/TextArea.svelte +48 -22
  63. package/TextArea.svelte.d.ts +4 -3
  64. package/Tooltip.svelte +59 -16
  65. package/Tooltip.svelte.d.ts +34 -2
  66. package/Tree.svelte +35 -21
  67. package/Tree.svelte.d.ts +2 -0
  68. package/Tree.types.d.ts +6 -8
  69. package/TreeChevron.svelte +1 -1
  70. package/TreeItem.svelte +40 -9
  71. package/TreeItem.svelte.d.ts +2 -0
  72. package/TreeItem.types.d.ts +4 -4
  73. package/TreeItemDisplay.svelte +28 -9
  74. package/TreeItemDisplay.svelte.d.ts +3 -1
  75. package/actions/clickOutside.js +1 -1
  76. package/actions/trapKeyboardFocus.d.ts +3 -0
  77. package/actions/trapKeyboardFocus.js +52 -0
  78. package/floating-ui.types.d.ts +2 -0
  79. package/index.d.ts +14 -10
  80. package/index.js +11 -7
  81. package/package.json +12 -4
  82. package/theme/applyTheme.js +3 -2
  83. package/theme/colors.d.ts +1 -0
  84. package/theme/colors.js +28 -13
  85. package/theme/darkTheme.js +129 -87
  86. package/theme/lightTheme.js +109 -90
  87. package/Field.constants.d.ts +0 -1
  88. package/Field.constants.js +0 -1
  89. package/Field.svelte +0 -265
  90. package/Field.svelte.d.ts +0 -75
  91. package/Field.types.d.ts +0 -4
  92. /package/{Field.types.js → ColorPicker.types.js} +0 -0
package/Popover.svelte CHANGED
@@ -1,31 +1,37 @@
1
1
  <script>import { onMount } from "svelte";
2
2
  import { autoUpdate, computePosition, flip, offset } from "@floating-ui/dom";
3
3
  import { portal } from "./actions/portal";
4
- export let placement = "bottom-start";
4
+ export let offsetOptions = { mainAxis: 0, crossAxis: 0 };
5
5
  export let open = false;
6
- export let reference;
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 (portalHost) {
13
- return portalHost;
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
- const middleware = [offset({ mainAxis: -2 }), flip()];
33
+ $:
34
+ middleware = [offset(offsetOptions), flip()];
29
35
  const computePopupPosition = async () => {
30
36
  if (reference && popupRef) {
31
37
  popupPosition = await computePosition(reference, popupRef, {
@@ -47,7 +53,7 @@ const autoUpdateMenuPosition = () => {
47
53
  $:
48
54
  popupRef, reference, autoUpdateMenuPosition();
49
55
  $:
50
- open, bodyHeight, placement, computePopupPosition();
56
+ open, bodyHeight, middleware, placement, computePopupPosition();
51
57
  onMount(() => {
52
58
  ensurePortalHost();
53
59
  resizeObserver.observe(document.body);
@@ -55,46 +61,55 @@ onMount(() => {
55
61
  resizeObserver.unobserve(document.body);
56
62
  };
57
63
  });
64
+ const onKeydown = (event) => {
65
+ if (event.key === "Escape") {
66
+ open = false;
67
+ }
68
+ };
69
+ ensurePortalHost();
58
70
  </script>
59
71
 
60
- <div use:portal={{ target: portalHost ?? document.body }} class="sterling-popover-portal">
61
- <div
62
- bind:this={popupRef}
63
- class="sterling-popover"
64
- class:open
65
- on:blur
66
- on:click
67
- on:copy
68
- on:cut
69
- on:dblclick
70
- on:dragend
71
- on:dragenter
72
- on:dragleave
73
- on:dragover
74
- on:dragstart
75
- on:drop
76
- on:focus
77
- on:focusin
78
- on:focusout
79
- on:keydown
80
- on:keypress
81
- on:keyup
82
- on:mousedown
83
- on:mouseenter
84
- on:mouseleave
85
- on:mousemove
86
- on:mouseover
87
- on:mouseout
88
- on:mouseup
89
- on:scroll
90
- on:wheel
91
- on:paste
92
- {...$$restProps}
93
- style="left:{popupPosition.x}px; top:{popupPosition.y}px"
94
- >
95
- <slot />
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>
96
111
  </div>
97
- </div>
112
+ {/if}
98
113
 
99
114
  <style>
100
115
  .sterling-popover-portal {
@@ -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
- placement?: Placement | undefined;
6
+ offsetOptions?: import("@floating-ui/core").OffsetOptions | undefined;
7
7
  open?: boolean | undefined;
8
- reference: HTMLElement;
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;
@@ -1 +1 @@
1
- export declare const PROGRESS_COLORFULS: string[];
1
+ export declare const PROGRESS_STATUSES: string[];
@@ -1 +1 @@
1
- export const PROGRESS_COLORFULS = ['none', 'auto', 'info', 'success', 'warning', 'error'];
1
+ export const PROGRESS_STATUSES = ['none', 'auto', 'info', 'success', 'warning', 'danger'];
package/Progress.svelte CHANGED
@@ -2,7 +2,7 @@
2
2
  export let max = 100;
3
3
  export let percent = 0;
4
4
  export let vertical = false;
5
- export let colorful = "none";
5
+ export let status = "none";
6
6
  export let disabled = false;
7
7
  let clientHeight;
8
8
  let clientWidth;
@@ -22,7 +22,7 @@ $:
22
22
  $:
23
23
  indicatorStyle = vertical ? `height: ${percentHeight}px` : `width: ${percentWidth}px`;
24
24
  $:
25
- indicatorColor = colorful === "auto" ? percent === 100 ? "success" : "info" : colorful;
25
+ indicatorColor = status === "auto" ? percent === 100 ? "success" : "info" : status;
26
26
  </script>
27
27
 
28
28
  <!--
@@ -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>
@@ -76,7 +76,7 @@ $:
76
76
  class:info={indicatorColor === 'info'}
77
77
  class:success={indicatorColor === 'success'}
78
78
  class:warning={indicatorColor === 'warning'}
79
- class:error={indicatorColor === 'error'}
79
+ class:error={indicatorColor === 'danger'}
80
80
  style={indicatorStyle}
81
81
  />
82
82
  </div>
@@ -84,22 +84,39 @@ $:
84
84
 
85
85
  <style>
86
86
  .sterling-progress {
87
- display: inline-flex;
88
- flex-direction: column;
89
87
  align-content: flex-start;
90
88
  align-items: flex-start;
91
- display: block;
92
- background: var(--stsv-Common__background-color);
89
+ background: var(--stsv-common__background-color);
90
+ border-width: var(--stsv-common__border-width);
91
+ border-style: var(--stsv-common__border-style);
92
+ border-color: var(--stsv-common__border-color);
93
+ border-radius: var(--stsv-common__border-radius);
93
94
  box-sizing: border-box;
95
+ display: block;
94
96
  height: 1em;
95
97
  padding: 0.25em;
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);
98
+ position: relative;
100
99
  transition: background-color 250ms, color 250ms, border-color 250ms;
101
100
  }
102
101
 
102
+ .sterling-progress.disabled::after {
103
+ content: '';
104
+ position: absolute;
105
+ left: 0;
106
+ right: 0;
107
+ top: 0;
108
+ bottom: 0;
109
+ background: repeating-linear-gradient(
110
+ var(--stsv-common--disabled__stripe-angle),
111
+ var(--stsv-common--disabled__stripe-color),
112
+ var(--stsv-common--disabled__stripe-color) var(--stsv-common--disabled__stripe-width),
113
+ var(--stsv-common--disabled__stripe-color--alt) var(--stsv-common--disabled__stripe-width),
114
+ var(--stsv-common--disabled__stripe-color--alt)
115
+ calc(2 * var(--stsv-common--disabled__stripe-width))
116
+ );
117
+ pointer-events: none;
118
+ }
119
+
103
120
  .container {
104
121
  display: flex;
105
122
  justify-content: flex-start;
@@ -108,7 +125,7 @@ $:
108
125
  }
109
126
 
110
127
  .indicator {
111
- background-color: var(--stsv-Display__border-color);
128
+ background-color: var(--stsv-common__border-color);
112
129
  box-sizing: border-box;
113
130
  height: 100%;
114
131
  min-height: 1px;
@@ -140,30 +157,19 @@ $:
140
157
  /* ----- Colorful ----- */
141
158
 
142
159
  .indicator.info {
143
- background-color: var(--stsv-Info__border-color);
160
+ background-color: var(--stsv-status--info__border-color);
144
161
  }
145
162
 
146
163
  .indicator.success {
147
- background-color: var(--stsv-Success__border-color);
164
+ background-color: var(--stsv-status--success__border-color);
148
165
  }
149
166
 
150
167
  .indicator.warning {
151
- background-color: var(--stsv-Warning__border-color);
168
+ background-color: var(--stsv-status--warning__border-color);
152
169
  }
153
170
 
154
171
  .indicator.error {
155
- background-color: var(--stsv-Error__border-color);
156
- }
157
-
158
- /* ----- Disabled ----- */
159
-
160
- .sterling-progress.disabled {
161
- background: var(--stsv-Common__background-color--disabled);
162
- border-color: var(--stsv-Common__border-color--disabled);
163
- }
164
-
165
- .sterling-progress.disabled .indicator {
166
- background-color: var(--stsv-Display__color--disabled);
172
+ background-color: var(--stsv-status--danger__border-color);
167
173
  }
168
174
 
169
175
  @media (prefers-reduced-motion) {
@@ -6,7 +6,7 @@ declare const __propDef: {
6
6
  max?: number | undefined;
7
7
  percent?: number | undefined;
8
8
  vertical?: boolean | undefined;
9
- colorful?: string | undefined;
9
+ status?: string | undefined;
10
10
  disabled?: boolean | undefined;
11
11
  };
12
12
  events: {
@@ -1,4 +1,4 @@
1
- import type { PROGRESS_COLORFULS } from './Progress.constants';
2
- type ProgressColorfulTuple = typeof PROGRESS_COLORFULS;
3
- export type ProgressColorful = ProgressColorfulTuple[number];
1
+ import type { PROGRESS_STATUSES } from './Progress.constants';
2
+ type ProgressStatusTuple = typeof PROGRESS_STATUSES;
3
+ export type ProgressStatus = ProgressStatusTuple[number];
4
4
  export {};
package/Radio.svelte CHANGED
@@ -1,9 +1,9 @@
1
1
  <script>import { idGenerator } from "./idGenerator";
2
- import Label from "./Label.svelte";
3
2
  export let checked = false;
4
3
  export let disabled = false;
5
4
  export let group = void 0;
6
5
  export let id = void 0;
6
+ export let colorful = false;
7
7
  if (checked && $$restProps.value !== group) {
8
8
  group = $$restProps.value;
9
9
  } else if (!checked && $$restProps.value === group) {
@@ -59,7 +59,7 @@ const onChange = (e) => {
59
59
  @component
60
60
  A styled HTML input type=radio element with optional label.
61
61
  -->
62
- <div class="sterling-radio" class:disabled>
62
+ <div class="sterling-radio" class:colorful class:disabled>
63
63
  <div class="container">
64
64
  <input
65
65
  bind:this={inputRef}
@@ -93,17 +93,15 @@ const onChange = (e) => {
93
93
  on:mouseover
94
94
  on:mouseout
95
95
  on:mouseup
96
- on:wheel
96
+ on:wheel|passive
97
97
  {...$$restProps}
98
98
  />
99
99
  <div class="indicator" />
100
100
  </div>
101
101
  {#if $$slots.default}
102
- <Label {disabled} for={id}>
103
- <slot {checked} {disabled} {group} inputId={id} value={$$restProps.value}>
104
- {$$restProps.value}
105
- </slot>
106
- </Label>
102
+ <label for={id}>
103
+ <slot {colorful} {checked} {disabled} {group} inputId={id} value={$$restProps.value} />
104
+ </label>
107
105
  {/if}
108
106
  </div>
109
107
 
@@ -152,10 +150,10 @@ const onChange = (e) => {
152
150
  and there is not a parent CSS selector.
153
151
  */
154
152
  .indicator {
155
- background-color: var(--stsv-Input__background-color);
156
- border-color: var(--stsv-Input__border-color);
157
- border-style: var(--stsv-Input__border-style);
158
- border-width: var(--stsv-Input__border-width);
153
+ background-color: var(--stsv-input__background-color);
154
+ border-color: var(--stsv-input__border-color);
155
+ border-style: var(--stsv-input__border-style);
156
+ border-width: var(--stsv-input__border-width);
159
157
  border-radius: 10000px;
160
158
  box-sizing: border-box;
161
159
  display: inline-block;
@@ -167,20 +165,20 @@ const onChange = (e) => {
167
165
  }
168
166
 
169
167
  input:checked + .indicator {
170
- background-color: var(--stsv-Input__background-color);
171
- border-color: var(--stsv-Input__border-color);
168
+ background-color: var(--stsv-input__background-color);
169
+ border-color: var(--stsv-input__border-color);
172
170
  }
173
171
 
174
172
  .sterling-radio:not(.disabled):hover .indicator {
175
- background-color: var(--stsv-Input__background-color--hover);
176
- border-color: var(--stsv-Input__border-color--hover);
173
+ background-color: var(--stsv-input__background-color--hover);
174
+ border-color: var(--stsv-input__border-color--hover);
177
175
  }
178
176
 
179
177
  input:focus-visible + .indicator {
180
- outline-color: var(--stsv-Common__outline-color);
181
- outline-offset: var(--stsv-Common__outline-offset);
182
- outline-style: var(--stsv-Common__outline-style);
183
- outline-width: var(--stsv-Common__outline-width);
178
+ outline-color: var(--stsv-common__outline-color);
179
+ outline-offset: var(--stsv-common__outline-offset);
180
+ outline-style: var(--stsv-common__outline-style);
181
+ outline-width: var(--stsv-common__outline-width);
184
182
  }
185
183
 
186
184
  .indicator::after {
@@ -197,7 +195,26 @@ const onChange = (e) => {
197
195
  }
198
196
 
199
197
  input:checked + .indicator::after {
200
- background-color: var(--stsv-Input__color);
198
+ background-color: var(--stsv-input__color);
199
+ }
200
+
201
+ .sterling-radio.colorful .indicator {
202
+ background-color: var(--stsv-input--colorful__background-color);
203
+ border-color: var(--stsv-input--colorful__border-color);
204
+ }
205
+
206
+ .sterling-radio.colorful input:checked + .indicator {
207
+ background-color: var(--stsv-input--colorful__background-color);
208
+ border-color: var(--stsv-input--colorful__border-color);
209
+ }
210
+
211
+ .sterling-radio.colorful:not(.disabled):hover .indicator {
212
+ background-color: var(--stsv-input--colorful__background-color--hover);
213
+ border-color: var(--stsv-input--colorful__border-color--hover);
214
+ }
215
+
216
+ .sterling-radio.colorful input:checked + .indicator::after {
217
+ background-color: var(--stsv-input--colorful__color);
201
218
  }
202
219
 
203
220
  .sterling-radio.disabled * {
@@ -205,7 +222,14 @@ const onChange = (e) => {
205
222
  }
206
223
 
207
224
  .container::after {
208
- background: var(--stsv-Disabled__background);
225
+ background: repeating-linear-gradient(
226
+ var(--stsv-common--disabled__stripe-angle),
227
+ var(--stsv-common--disabled__stripe-color),
228
+ var(--stsv-common--disabled__stripe-color) var(--stsv-common--disabled__stripe-width),
229
+ var(--stsv-common--disabled__stripe-color--alt) var(--stsv-common--disabled__stripe-width),
230
+ var(--stsv-common--disabled__stripe-color--alt)
231
+ calc(2 * var(--stsv-common--disabled__stripe-width))
232
+ );
209
233
  border-radius: 10000px;
210
234
  bottom: 0;
211
235
  content: '';
@@ -218,6 +242,12 @@ const onChange = (e) => {
218
242
  transition: opacity 250ms;
219
243
  }
220
244
 
245
+ label {
246
+ color: var(--stsv-common__color);
247
+ transition: color 250ms;
248
+ font: inherit;
249
+ }
250
+
221
251
  .sterling-radio.disabled .container::after {
222
252
  opacity: 1;
223
253
  }
@@ -225,7 +255,8 @@ const onChange = (e) => {
225
255
  @media (prefers-reduced-motion) {
226
256
  .indicator,
227
257
  .indicator::after,
228
- .container::after {
258
+ .container::after,
259
+ label {
229
260
  transition: none;
230
261
  }
231
262
  }
package/Radio.svelte.d.ts CHANGED
@@ -6,6 +6,7 @@ declare const __propDef: {
6
6
  disabled?: boolean | undefined;
7
7
  group?: any | undefined | null;
8
8
  id?: string | undefined;
9
+ colorful?: boolean | undefined;
9
10
  blur?: (() => void) | undefined;
10
11
  click?: (() => void) | undefined;
11
12
  focus?: ((options?: FocusOptions) => void) | undefined;
@@ -41,6 +42,7 @@ declare const __propDef: {
41
42
  };
42
43
  slots: {
43
44
  default: {
45
+ colorful: boolean;
44
46
  checked: boolean;
45
47
  disabled: boolean;
46
48
  group: any;
@@ -0,0 +1,182 @@
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
+ var(--stsv-common--disabled__stripe-angle),
141
+ #444 25%,
142
+ transparent 25%,
143
+ transparent 75%,
144
+ #444 75%,
145
+ #444
146
+ ),
147
+ repeating-linear-gradient(
148
+ var(--stsv-common--disabled__stripe-angle),
149
+ #444 25%,
150
+ #eee 25%,
151
+ #eee 75%,
152
+ #444 75%,
153
+ #444
154
+ ),
155
+ repeating-linear-gradient(
156
+ -var(--stsv-common--disabled__stripe-angle),
157
+ #444 25%,
158
+ transparent 25%,
159
+ transparent 75%,
160
+ #444 75%,
161
+ #444
162
+ ),
163
+ repeating-linear-gradient(
164
+ -var(--stsv-common--disabled__stripe-angle),
165
+ #444 25%,
166
+ #eee 25%,
167
+ #eee 75%,
168
+ #444 75%,
169
+ #444
170
+ );
171
+ background-position: 0 0, 4px 4px;
172
+ background-size: 8px 8px;
173
+ }
174
+
175
+ .alpha-gradient {
176
+ background: linear-gradient(
177
+ to right,
178
+ rgba(var(--red), var(--green), var(--blue), 0) 0%,
179
+ rgba(var(--red), var(--green), var(--blue), 100) 100%
180
+ );
181
+ }
182
+ </style>