@geoffcox/sterling-svelte 0.0.31 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. package/@types/clickOutside.d.ts +11 -7
  2. package/Button.svelte +11 -183
  3. package/Button.svelte.d.ts +2 -6
  4. package/Callout.svelte +107 -146
  5. package/Callout.svelte.d.ts +1 -1
  6. package/Checkbox.svelte +15 -177
  7. package/Checkbox.svelte.d.ts +2 -2
  8. package/ColorPicker.svelte +204 -223
  9. package/ColorPicker.svelte.d.ts +1 -2
  10. package/Dialog.svelte +90 -187
  11. package/Dialog.svelte.d.ts +2 -1
  12. package/Dropdown.svelte +52 -220
  13. package/Dropdown.svelte.d.ts +4 -8
  14. package/HexColorSliders.svelte +77 -145
  15. package/HexColorSliders.svelte.d.ts +28 -1
  16. package/HslColorSliders.svelte +99 -179
  17. package/HslColorSliders.svelte.d.ts +28 -1
  18. package/Input.svelte +27 -136
  19. package/Input.svelte.d.ts +2 -3
  20. package/Label.constants.d.ts +1 -0
  21. package/Label.constants.js +1 -0
  22. package/Label.svelte +96 -169
  23. package/Label.svelte.d.ts +6 -1
  24. package/Label.types.d.ts +3 -1
  25. package/Link.svelte +9 -106
  26. package/Link.svelte.d.ts +0 -1
  27. package/List.svelte +142 -230
  28. package/List.svelte.d.ts +2 -3
  29. package/List.types.d.ts +6 -1
  30. package/ListItem.svelte +25 -94
  31. package/ListItem.svelte.d.ts +2 -0
  32. package/Menu.svelte +48 -65
  33. package/Menu.svelte.d.ts +4 -1
  34. package/MenuBar.svelte +84 -86
  35. package/MenuBar.svelte.d.ts +4 -1
  36. package/MenuButton.svelte +66 -73
  37. package/MenuButton.svelte.d.ts +7 -3
  38. package/MenuItem.svelte +256 -288
  39. package/MenuItem.svelte.d.ts +2 -2
  40. package/MenuItemDisplay.svelte +12 -116
  41. package/MenuItemDisplay.svelte.d.ts +21 -7
  42. package/MenuSeparator.svelte +6 -45
  43. package/MenuSeparator.svelte.d.ts +8 -78
  44. package/Popover.constants.d.ts +1 -1
  45. package/Popover.constants.js +1 -1
  46. package/Popover.svelte +66 -80
  47. package/Popover.svelte.d.ts +5 -1
  48. package/Progress.svelte +28 -126
  49. package/Progress.svelte.d.ts +4 -3
  50. package/Radio.svelte +49 -192
  51. package/Radio.svelte.d.ts +2 -2
  52. package/RgbColorSliders.svelte +48 -137
  53. package/RgbColorSliders.svelte.d.ts +5 -5
  54. package/Select.svelte +122 -250
  55. package/Select.svelte.d.ts +6 -2
  56. package/Slider.svelte +90 -259
  57. package/Slider.svelte.d.ts +1 -2
  58. package/Switch.svelte +24 -259
  59. package/Switch.svelte.d.ts +3 -1
  60. package/Tab.svelte +27 -175
  61. package/Tab.svelte.d.ts +6 -4
  62. package/TabList.svelte +146 -171
  63. package/TabList.svelte.d.ts +3 -2
  64. package/TabList.types.d.ts +6 -1
  65. package/TextArea.svelte +32 -129
  66. package/TextArea.svelte.d.ts +1 -1
  67. package/Tooltip.svelte +46 -47
  68. package/Tooltip.svelte.d.ts +8 -3
  69. package/Tree.constants.d.ts +0 -1
  70. package/Tree.constants.js +0 -1
  71. package/Tree.svelte +35 -119
  72. package/Tree.svelte.d.ts +4 -4
  73. package/Tree.types.d.ts +1 -3
  74. package/TreeChevron.svelte +18 -98
  75. package/TreeChevron.svelte.d.ts +1 -0
  76. package/TreeItem.constants.d.ts +1 -0
  77. package/TreeItem.constants.js +1 -0
  78. package/TreeItem.svelte +251 -211
  79. package/TreeItem.svelte.d.ts +7 -3
  80. package/TreeItem.types.d.ts +1 -1
  81. package/TreeItemDisplay.svelte +20 -104
  82. package/TreeItemDisplay.svelte.d.ts +2 -2
  83. package/actions/applyLightDarkMode.d.ts +10 -0
  84. package/actions/applyLightDarkMode.js +36 -0
  85. package/actions/forwardEvents.js +3 -3
  86. package/css/Button.base.css +74 -0
  87. package/css/Button.colorful.css +17 -0
  88. package/css/Button.css +7 -0
  89. package/css/Button.secondary.colorful.css +15 -0
  90. package/css/Button.secondary.css +11 -0
  91. package/css/Button.shapes.css +14 -0
  92. package/css/Button.tool.colorful.css +13 -0
  93. package/css/Button.tool.css +18 -0
  94. package/css/Callout.base.css +43 -0
  95. package/css/Callout.colorful.css +5 -0
  96. package/css/Callout.css +2 -0
  97. package/css/Checkbox.base.css +145 -0
  98. package/css/Checkbox.colorful.css +17 -0
  99. package/css/Checkbox.css +2 -0
  100. package/css/ColorPicker.base.css +23 -0
  101. package/css/ColorPicker.css +1 -0
  102. package/css/Dialog.base.css +116 -0
  103. package/css/Dialog.css +1 -0
  104. package/css/Dropdown.base.css +147 -0
  105. package/css/Dropdown.colorful.css +23 -0
  106. package/css/Dropdown.css +2 -0
  107. package/css/HexColorSliders.base.css +106 -0
  108. package/css/HexColorSliders.css +1 -0
  109. package/css/HslColorSliders.base.css +124 -0
  110. package/css/HslColorSliders.css +1 -0
  111. package/css/Input.base.css +100 -0
  112. package/css/Input.colorful.css +22 -0
  113. package/css/Input.composed.css +8 -0
  114. package/css/Input.css +3 -0
  115. package/css/Label.base.css +119 -0
  116. package/css/Label.boxed.colorful.css +21 -0
  117. package/css/Label.boxed.css +31 -0
  118. package/css/Label.colorful.css +3 -0
  119. package/css/Label.css +4 -0
  120. package/css/Link.base.css +52 -0
  121. package/css/Link.colorful.css +15 -0
  122. package/css/Link.css +6 -0
  123. package/css/Link.ghost.colorful.css +7 -0
  124. package/css/Link.ghost.css +11 -0
  125. package/css/Link.undecorated.colorful.css +6 -0
  126. package/css/Link.undecorated.css +6 -0
  127. package/css/List.base.css +98 -0
  128. package/css/List.css +1 -0
  129. package/css/ListItem.base.css +59 -0
  130. package/css/ListItem.css +1 -0
  131. package/css/Menu.base.css +21 -0
  132. package/css/Menu.css +1 -0
  133. package/css/MenuBar.base.css +9 -0
  134. package/css/MenuBar.css +1 -0
  135. package/css/MenuButton.base.css +13 -0
  136. package/css/MenuButton.css +1 -0
  137. package/css/MenuItem.base.css +48 -0
  138. package/css/MenuItem.css +1 -0
  139. package/css/MenuItemDisplay.base.css +104 -0
  140. package/css/MenuItemDisplay.css +1 -0
  141. package/css/MenuSeparator.base.css +5 -0
  142. package/css/MenuSeparator.css +1 -0
  143. package/css/Popover copy.css +21 -0
  144. package/css/Popover.css +21 -0
  145. package/css/Progress.base.css +99 -0
  146. package/css/Progress.css +1 -0
  147. package/css/Radio.base.css +135 -0
  148. package/css/Radio.colorful.css +18 -0
  149. package/css/Radio.css +2 -0
  150. package/css/RgbColorSliders.base.css +94 -0
  151. package/css/RgbColorSliders.css +1 -0
  152. package/css/Select.base.css +127 -0
  153. package/css/Select.colorful.css +24 -0
  154. package/css/Select.composed.css +12 -0
  155. package/css/Select.css +3 -0
  156. package/css/Slider.base.css +182 -0
  157. package/css/Slider.colorful.css +11 -0
  158. package/css/Slider.composed.css +8 -0
  159. package/css/Slider.css +3 -0
  160. package/css/Switch.base.css +193 -0
  161. package/css/Switch.colorful.css +39 -0
  162. package/css/Switch.css +2 -0
  163. package/css/Tab.base.css +135 -0
  164. package/css/Tab.colorful.css +13 -0
  165. package/css/Tab.css +2 -0
  166. package/css/TabList.base.css +34 -0
  167. package/css/TabList.css +1 -0
  168. package/css/TextArea.base.css +85 -0
  169. package/css/TextArea.colorful.css +17 -0
  170. package/css/TextArea.composed.css +8 -0
  171. package/css/TextArea.css +3 -0
  172. package/css/Tooltip.base.css +6 -0
  173. package/css/Tooltip.css +1 -0
  174. package/css/Tree.base.css +74 -0
  175. package/css/Tree.composed.css +8 -0
  176. package/css/Tree.css +2 -0
  177. package/css/TreeChevron.base.css +86 -0
  178. package/css/TreeChevron.css +1 -0
  179. package/css/TreeItem.base.css +3 -0
  180. package/css/TreeItem.css +1 -0
  181. package/css/TreeItemDisplay.base.css +74 -0
  182. package/css/TreeItemDisplay.colorful.css +9 -0
  183. package/css/TreeItemDisplay.css +1 -0
  184. package/css/dark-mode.css +134 -0
  185. package/css/light-mode.css +134 -0
  186. package/css/sterling.css +37 -0
  187. package/index.d.ts +9 -13
  188. package/index.js +8 -12
  189. package/mediaQueries/prefersColorSchemeDark.d.ts +2 -0
  190. package/mediaQueries/prefersColorSchemeDark.js +10 -0
  191. package/{stores → mediaQueries}/prefersReducedMotion.d.ts +1 -0
  192. package/{stores → mediaQueries}/usingKeyboard.d.ts +1 -0
  193. package/package.json +121 -13
  194. package/Link.constants.d.ts +0 -1
  195. package/Link.constants.js +0 -1
  196. package/Link.types.d.ts +0 -4
  197. package/Link.types.js +0 -1
  198. package/theme/applyDarkTheme.d.ts +0 -7
  199. package/theme/applyDarkTheme.js +0 -11
  200. package/theme/applyLightTheme.d.ts +0 -7
  201. package/theme/applyLightTheme.js +0 -11
  202. package/theme/applyTheme.d.ts +0 -7
  203. package/theme/applyTheme.js +0 -20
  204. package/theme/colors.d.ts +0 -54
  205. package/theme/colors.js +0 -82
  206. package/theme/darkTheme.d.ts +0 -2
  207. package/theme/darkTheme.js +0 -142
  208. package/theme/lightTheme.d.ts +0 -2
  209. package/theme/lightTheme.js +0 -119
  210. package/theme/toggleDarkTheme.d.ts +0 -18
  211. package/theme/toggleDarkTheme.js +0 -53
  212. package/theme/types.d.ts +0 -21
  213. package/theme/types.js +0 -1
  214. /package/{stores → mediaQueries}/prefersReducedMotion.js +0 -0
  215. /package/{stores → mediaQueries}/usingKeyboard.js +0 -0
package/Dialog.svelte CHANGED
@@ -1,83 +1,113 @@
1
- <script>import { onMount, tick } from "svelte";
2
- import Button from "./Button.svelte";
1
+ <script>import { onMount, tick } from 'svelte';
2
+ import Button from './Button.svelte';
3
3
  const dialogFadeDuration = 250;
4
- export let open = false;
5
- export let returnValue = "";
4
+ // ----- Props ----- //
5
+ /** When true, clicking outside the dialog causes the dialog close. */
6
6
  export let backdropCloses = false;
7
+ /** When true, the dialog is open; otherwise the dialog is closed. */
8
+ export let open = false;
9
+ /**
10
+ * The return value from the dialog:
11
+ * - an empty string indicates cancellation
12
+ * - a value indicates form submission.
13
+ */
14
+ export let returnValue = '';
15
+ /** Additional class names to apply. */
16
+ export let variant = '';
17
+ // ----- State ----- //
7
18
  let dialogRef;
8
19
  let contentRef;
9
20
  let formRef;
10
21
  let closing = false;
22
+ // ----- Event Handlers ----- //
11
23
  const onDocumentClick = (event) => {
12
- const targetNode = event?.target;
13
- if (targetNode && !contentRef?.contains(targetNode) && backdropCloses) {
14
- open = false;
15
- }
24
+ // as tracking clicks outside the dialog is only active while the dialog is open
25
+ // the clickOutside action is not used and reimplemented here.
26
+ const targetNode = event?.target;
27
+ // the content must be used as the container because dialog::backdrop is considered
28
+ // part of the HTMLDialogElement
29
+ if (targetNode && !contentRef?.contains(targetNode) && backdropCloses) {
30
+ open = false;
31
+ }
16
32
  };
17
33
  const showDialog = () => {
18
- if (dialogRef?.open === false) {
19
- document.addEventListener("click", onDocumentClick, true);
20
- dialogRef.showModal();
21
- }
22
- open = true;
34
+ if (dialogRef?.open === false) {
35
+ // when open, track clicks outside the dialog (use capture = true)
36
+ document.addEventListener('click', onDocumentClick, true);
37
+ dialogRef.showModal();
38
+ }
39
+ open = true;
23
40
  };
24
- const closeDialog = (returnValue2 = "") => {
25
- if (dialogRef?.open === true) {
26
- document.removeEventListener("click", onDocumentClick);
27
- closing = true;
28
- tick();
29
- setTimeout(() => {
30
- dialogRef.close(returnValue2);
31
- open = false;
32
- closing = false;
33
- }, dialogFadeDuration);
34
- } else {
35
- open = false;
36
- }
41
+ const closeDialog = (returnValue = '') => {
42
+ if (dialogRef?.open === true) {
43
+ // when closed, stop tracking clicks outside the dialog
44
+ document.removeEventListener('click', onDocumentClick);
45
+ // to allow time for the CSS transition animation, closing the dialog is delayed
46
+ closing = true;
47
+ tick();
48
+ setTimeout(() => {
49
+ dialogRef.close(returnValue);
50
+ open = false;
51
+ closing = false;
52
+ }, dialogFadeDuration);
53
+ }
54
+ else {
55
+ open = false;
56
+ }
37
57
  };
38
- const updateDialog = (open2) => {
39
- if (open2) {
40
- showDialog();
41
- } else {
42
- closeDialog();
43
- }
58
+ const updateDialog = (open) => {
59
+ if (open) {
60
+ showDialog();
61
+ }
62
+ else {
63
+ closeDialog();
64
+ }
44
65
  };
45
66
  const onCancel = (event) => {
46
- event.preventDefault();
47
- event.stopPropagation();
48
- closeDialog();
49
- return false;
67
+ // Cancelling a dialog instantly hides the dialog.
68
+ // To allow animation with closeDialog, this event is canceled.
69
+ event.preventDefault();
70
+ event.stopPropagation();
71
+ closeDialog();
72
+ return false;
50
73
  };
51
74
  const onSubmit = (event) => {
52
- const anyEvent = event;
53
- if (anyEvent?.submitter.type === "submit") {
54
- if (dialogRef.open) {
55
- closeDialog(anyEvent?.submitter.value ?? "");
56
- setTimeout(() => {
57
- formRef.requestSubmit(anyEvent?.submitter);
58
- }, dialogFadeDuration);
59
- event.preventDefault();
60
- return false;
75
+ // Submitting a form instantly hides the dialog.
76
+ // The dialog.close event is not cancellable, but form.submit is.
77
+ // To allow animation with closeDialog, this event is canceled.
78
+ // The form is resubmitted after the dialog closes to ensure the form is in the correct state.
79
+ const anyEvent = event;
80
+ if (anyEvent?.submitter.type === 'submit') {
81
+ if (dialogRef.open) {
82
+ closeDialog(anyEvent?.submitter.value ?? '');
83
+ setTimeout(() => {
84
+ formRef.requestSubmit(anyEvent?.submitter);
85
+ }, dialogFadeDuration);
86
+ event.preventDefault();
87
+ return false;
88
+ }
89
+ }
90
+ else {
91
+ event.preventDefault();
92
+ return false;
61
93
  }
62
- } else {
63
- event.preventDefault();
64
- return false;
65
- }
66
94
  };
67
95
  const onClose = (event) => {
68
- returnValue = dialogRef.returnValue;
96
+ // This event is not cancelable.
97
+ // Update the returnValue whenever the dialog closes.
98
+ returnValue = dialogRef.returnValue;
69
99
  };
70
100
  $: {
71
- updateDialog(open);
101
+ updateDialog(open);
72
102
  }
73
103
  onMount(() => {
74
- updateDialog(open);
75
- dialogRef.addEventListener("cancel", onCancel);
76
- dialogRef.addEventListener("close", onClose);
77
- return () => {
78
- dialogRef?.removeEventListener("cancel", onCancel);
79
- dialogRef?.removeEventListener("close", onClose);
80
- };
104
+ updateDialog(open);
105
+ dialogRef.addEventListener('cancel', onCancel);
106
+ dialogRef.addEventListener('close', onClose);
107
+ return () => {
108
+ dialogRef?.removeEventListener('cancel', onCancel);
109
+ dialogRef?.removeEventListener('close', onClose);
110
+ };
81
111
  });
82
112
  </script>
83
113
 
@@ -89,7 +119,7 @@ A styled &lt;dialog&gt; element
89
119
  -->
90
120
  <dialog
91
121
  bind:this={dialogRef}
92
- class="dialog"
122
+ class={`sterling-dialog ${variant}`}
93
123
  class:open
94
124
  class:closing
95
125
  on:close
@@ -105,7 +135,7 @@ A styled &lt;dialog&gt; element
105
135
  <slot name="title" />
106
136
  </div>
107
137
  <div class="close">
108
- <Button variant="ghost" shape="circular" on:click={() => closeDialog()}>
138
+ <Button variant={`circular tool ${variant}`} on:click={() => closeDialog()}>
109
139
  <div class="close-x" />
110
140
  </Button>
111
141
  </div>
@@ -122,130 +152,3 @@ A styled &lt;dialog&gt; element
122
152
  </div>
123
153
  </form>
124
154
  </dialog>
125
-
126
- <style>
127
- .dialog {
128
- padding: 0;
129
- border: none;
130
- background: none;
131
- }
132
-
133
- .dialog::backdrop {
134
- backdrop-filter: blur(2px);
135
- background: rgba(0, 0, 0, 0.3);
136
- transition: opacity 250ms;
137
- opacity: 0;
138
- }
139
-
140
- .dialog.open::backdrop {
141
- opacity: 1;
142
- }
143
-
144
- .dialog.closing::backdrop {
145
- opacity: 0;
146
- }
147
-
148
- .header {
149
- background-color: var(--stsv-common__background-color--secondary);
150
- }
151
-
152
- .content {
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
- box-sizing: border-box;
159
- color: var(--stsv-common__color);
160
- display: grid;
161
- grid-template-columns: 1fr;
162
- grid-template-rows: auto 1fr auto auto;
163
- justify-content: stretch;
164
- justify-items: stretch;
165
- align-items: stretch;
166
- transition: opacity 250ms;
167
- opacity: 0;
168
- }
169
-
170
- .dialog.open .content {
171
- opacity: 1;
172
- }
173
-
174
- .dialog.closing .content {
175
- opacity: 0;
176
- }
177
-
178
- .header {
179
- display: grid;
180
- grid-template-columns: 1fr auto;
181
- grid-template-rows: 1fr;
182
- justify-items: stretch;
183
- align-items: center;
184
- padding: 0.25em 0.5em;
185
- }
186
-
187
- .title {
188
- font-size: 1.4em;
189
- }
190
-
191
- .close {
192
- justify-self: flex-end;
193
- }
194
-
195
- .close :global(button) {
196
- width: 1.75em;
197
- height: 1.75em;
198
- padding: 0;
199
- }
200
-
201
- .close-x {
202
- width: 1em;
203
- height: 1em;
204
- position: relative;
205
- }
206
-
207
- .close-x:before,
208
- .close-x:after {
209
- content: '';
210
- position: absolute;
211
- width: 0.75em;
212
- height: 0.125em;
213
- background-color: currentColor;
214
- top: 0.45em;
215
- }
216
-
217
- .close-x:before {
218
- transform: rotate(45deg);
219
- left: 0.125em;
220
- }
221
-
222
- .close-x:after {
223
- transform: rotate(-45deg);
224
- right: 0.125em;
225
- }
226
-
227
- .body {
228
- padding: 1em;
229
- }
230
-
231
- .separator {
232
- background-color: var(--stsv-common__background-color--secondary);
233
- height: var(--stsv-common__border-width);
234
- margin: 0 0.25em;
235
- }
236
-
237
- .footer {
238
- display: flex;
239
- justify-content: flex-end;
240
- justify-items: flex-end;
241
- padding: 0.5em 1em;
242
- gap: 5px;
243
- }
244
-
245
- @media (prefers-reduced-motion) {
246
- .dialog::backdrop,
247
- .content {
248
- transition: none;
249
- }
250
- }
251
- </style>
@@ -2,9 +2,10 @@ import { SvelteComponentTyped } from "svelte";
2
2
  declare const __propDef: {
3
3
  props: {
4
4
  [x: string]: any;
5
+ backdropCloses?: boolean | undefined;
5
6
  open?: boolean | undefined;
6
7
  returnValue?: string | undefined;
7
- backdropCloses?: boolean | undefined;
8
+ variant?: string | undefined;
8
9
  };
9
10
  events: {
10
11
  close: Event;
package/Dropdown.svelte CHANGED
@@ -1,66 +1,75 @@
1
- <script>import { createEventDispatcher } from "svelte";
2
- import Popover from "./Popover.svelte";
3
- import { clickOutside } from "./actions/clickOutside";
4
- import { idGenerator } from "./idGenerator";
5
- import { prefersReducedMotion } from "./stores/prefersReducedMotion";
6
- import { slide } from "svelte/transition";
7
- const popupId = idGenerator.nextId("Dropdown-popup");
8
- export let colorful = false;
9
- export let composed = false;
1
+ <script>import { createEventDispatcher } from 'svelte';
2
+ import Popover from './Popover.svelte';
3
+ import { clickOutside } from './actions/clickOutside';
4
+ import { idGenerator } from './idGenerator';
5
+ import { prefersReducedMotion } from './mediaQueries/prefersReducedMotion';
6
+ import { slide } from 'svelte/transition';
7
+ const popupId = idGenerator.nextId('Dropdown-popup');
8
+ // ----- Props ----- //
9
+ /** Disables the dropdown. */
10
10
  export let disabled = false;
11
+ /** When true, the dropdown is open. */
11
12
  export let open = false;
13
+ /** When the user clicks away from the dropdown, it remains open. */
12
14
  export let stayOpenOnClickAway = false;
15
+ /** Additional class names to apply. */
16
+ export let variant = '';
17
+ // ----- State ----- //
13
18
  let dropdownRef;
14
19
  let popupContentRef;
20
+ // ----- Events ----- //
15
21
  const dispatch = createEventDispatcher();
16
- const raiseOpen = (open2) => {
17
- dispatch("open", { open: open2 });
22
+ const raiseOpen = (open) => {
23
+ dispatch('open', { open });
18
24
  };
25
+ // ----- Reactions ----- //
19
26
  $: {
20
- raiseOpen(open);
27
+ raiseOpen(open);
21
28
  }
29
+ // ----- Methods ----- //
22
30
  export const click = () => {
23
- dropdownRef?.click();
31
+ dropdownRef?.click();
24
32
  };
25
33
  export const blur = () => {
26
- dropdownRef?.blur();
34
+ dropdownRef?.blur();
27
35
  };
28
36
  export const focus = (options) => {
29
- dropdownRef?.focus(options);
37
+ dropdownRef?.focus(options);
30
38
  };
39
+ // ----- Event Handlers ----- //
31
40
  const onClick = (event) => {
32
- if (!disabled) {
33
- open = !open;
34
- event.preventDefault();
35
- event.stopPropagation();
36
- }
37
- };
38
- const onKeydown = (event) => {
39
- if (!event.altKey && !event.ctrlKey && !event.shiftKey) {
40
- switch (event.key) {
41
- case " ":
41
+ if (!disabled) {
42
42
  open = !open;
43
43
  event.preventDefault();
44
44
  event.stopPropagation();
45
- return false;
46
- case "Escape":
47
- open = false;
48
- event.preventDefault();
49
- event.stopPropagation();
50
- return false;
51
45
  }
52
- }
46
+ };
47
+ const onKeydown = (event) => {
48
+ if (!event.altKey && !event.ctrlKey && !event.shiftKey) {
49
+ switch (event.key) {
50
+ case ' ':
51
+ open = !open;
52
+ event.preventDefault();
53
+ event.stopPropagation();
54
+ return false;
55
+ case 'Escape':
56
+ open = false;
57
+ event.preventDefault();
58
+ event.stopPropagation();
59
+ return false;
60
+ }
61
+ }
53
62
  };
54
63
  const onClickOutside = (event) => {
55
- if (!stayOpenOnClickAway) {
56
- open = false;
57
- }
64
+ if (!stayOpenOnClickAway) {
65
+ open = false;
66
+ }
58
67
  };
68
+ // ----- Animation ----- //
59
69
  const slideNoOp = (node, params) => {
60
- return { delay: 0, duration: 0 };
70
+ return { delay: 0, duration: 0 };
61
71
  };
62
- $:
63
- slideMotion = !$prefersReducedMotion ? slide : slideNoOp;
72
+ $: slideMotion = !$prefersReducedMotion ? slide : slideNoOp;
64
73
  </script>
65
74
 
66
75
  <div
@@ -68,9 +77,7 @@ $:
68
77
  aria-controls={popupId}
69
78
  aria-haspopup={true}
70
79
  aria-expanded={open}
71
- class="sterling-dropdown"
72
- class:colorful
73
- class:composed
80
+ class={`sterling-dropdown ${variant}`}
74
81
  class:disabled
75
82
  role="combobox"
76
83
  tabindex="0"
@@ -107,9 +114,9 @@ $:
107
114
  {...$$restProps}
108
115
  >
109
116
  <div class="value">
110
- <slot name="value" {colorful} {composed} {disabled} {open} />
117
+ <slot name="value" {disabled} {open} {variant} />
111
118
  </div>
112
- <slot name="button" {colorful} {composed} {disabled} {open}>
119
+ <slot name="button" {disabled} {open} {variant}>
113
120
  <div class="button">
114
121
  <div class="chevron" />
115
122
  </div>
@@ -117,186 +124,11 @@ $:
117
124
 
118
125
  <Popover reference={dropdownRef} open={!disabled && open}>
119
126
  <div
120
- class="popup-content"
127
+ class={`sterling-dropdown-popup-content ${variant}`}
121
128
  transition:slideMotion|global={{ duration: 200 }}
122
- class:colorful
123
129
  bind:this={popupContentRef}
124
130
  >
125
- <slot {colorful} {composed} {disabled} {open} />
131
+ <slot {disabled} {open} {variant} />
126
132
  </div>
127
133
  </Popover>
128
134
  </div>
129
-
130
- <style>
131
- .sterling-dropdown {
132
- align-content: stretch;
133
- align-items: stretch;
134
- background-color: var(--stsv-input__background-color);
135
- border-color: var(--stsv-input__border-color);
136
- border-radius: var(--stsv-button__border-radius);
137
- border-style: var(--stsv-input__border-style);
138
- border-width: var(--stsv-input__border-width);
139
- color: var(--stsv-input__color);
140
- display: grid;
141
- grid-template-columns: minmax(0, 1fr) auto;
142
- grid-template-rows: auto;
143
- outline: none;
144
- overflow: hidden;
145
- padding: 0;
146
- position: relative;
147
- transition: background-color 250ms, color 250ms, border-color 250ms;
148
- }
149
-
150
- .sterling-dropdown:hover {
151
- background-color: var(--stsv-input__background-color--hover);
152
- border-color: var(--stsv-input__border-color--hover);
153
- color: var(--stsv-input__color--hover);
154
- }
155
-
156
- .sterling-dropdown:focus {
157
- background-color: var(--stsv-input__background-color--focus);
158
- border-color: var(--stsv-input__border-color--focus);
159
- color: var(--stsv-input__color--focus);
160
- outline-color: var(--stsv-common__outline-color);
161
- outline-offset: var(--stsv-common__outline-offset);
162
- outline-style: var(--stsv-common__outline-style);
163
- outline-width: var(--stsv-common__outline-width);
164
- }
165
-
166
- .sterling-dropdown.colorful {
167
- background-color: var(--stsv-input--colorful__background-color);
168
- border-color: var(--stsv-input--colorful__border-color);
169
- color: var(--stsv-input--colorful__color);
170
- }
171
-
172
- .sterling-dropdown.colorful:hover {
173
- background-color: var(--stsv-input--colorful__background-color--hover);
174
- border-color: var(--stsv-input--colorful__border-color--hover);
175
- color: var(--stsv-input--colorful__color--hover);
176
- }
177
-
178
- .sterling-dropdown.colorful:focus {
179
- background-color: var(--stsv-input--colorful__background-color--focus);
180
- border-color: var(--stsv-input--colorful__border-color--focus);
181
- color: var(--stsv-input--colorful__color--focus);
182
- }
183
-
184
- .sterling-dropdown.disabled {
185
- cursor: not-allowed;
186
- outline: none;
187
- }
188
-
189
- .sterling-dropdown.disabled .button {
190
- cursor: not-allowed;
191
- }
192
-
193
- .sterling-dropdown::after {
194
- background: repeating-linear-gradient(
195
- var(--stsv-common--disabled__stripe-angle),
196
- var(--stsv-common--disabled__stripe-color),
197
- var(--stsv-common--disabled__stripe-color) var(--stsv-common--disabled__stripe-width),
198
- var(--stsv-common--disabled__stripe-color--alt) var(--stsv-common--disabled__stripe-width),
199
- var(--stsv-common--disabled__stripe-color--alt)
200
- calc(2 * var(--stsv-common--disabled__stripe-width))
201
- );
202
- bottom: 0;
203
- content: '';
204
- left: 0;
205
- opacity: 0;
206
- position: absolute;
207
- right: 0;
208
- top: 0;
209
- pointer-events: none;
210
- transition: opacity 250ms;
211
- }
212
-
213
- .sterling-dropdown.disabled::after {
214
- opacity: 1;
215
- }
216
-
217
- .sterling-dropdown.composed,
218
- .sterling-dropdown.composed:hover,
219
- .sterling-dropdown.composed.focus {
220
- background: none;
221
- border: none;
222
- outline: none;
223
- }
224
-
225
- .sterling-dropdown.composed.disabled::after {
226
- opacity: 0;
227
- }
228
-
229
- .value {
230
- overflow: hidden;
231
- }
232
-
233
- .button {
234
- align-self: center;
235
- cursor: pointer;
236
- }
237
-
238
- .chevron {
239
- display: block;
240
- position: relative;
241
- border: none;
242
- background: none;
243
- margin: 0;
244
- height: 100%;
245
- min-width: 2em;
246
- min-height: 2em;
247
- }
248
-
249
- .chevron::after {
250
- position: absolute;
251
- content: '';
252
- top: 50%;
253
- left: 50%;
254
- width: 7px;
255
- height: 7px;
256
- border-right: 3px solid currentColor;
257
- border-top: 3px solid currentColor;
258
- /*
259
- The chevron is a right triangle, rotated to face down.
260
- It should be moved up so it is centered vertically after rotation.
261
- The amount to move is the hypotenuse of the right triangle of the chevron.
262
- For a right triangle with equal a and b where c=1
263
- a^2 + b^2 = c^2
264
- a^2 + a^2 = c^2
265
- 2a^2 = c^2
266
- 2a^2 = 1
267
- a^2 = 0.5
268
- a = sqrt(0.5)
269
- a = 0.707
270
- */
271
- transform: translate(-50%, calc(-50% / 0.707)) rotate(135deg);
272
- transform-origin: 50% 50%;
273
- }
274
-
275
- .popup-content {
276
- background-color: var(--stsv-common__background-color);
277
- border-color: var(--stsv-common__border-color);
278
- border-radius: var(--stsv-common__border-radius);
279
- border-style: var(--stsv-common__border-style);
280
- border-width: var(--stsv-common__border-width);
281
- box-shadow: rgba(0, 0, 0, 0.4) 2px 2px 4px -1px;
282
- color: var(--stsv-common__color);
283
- padding: 0.25em;
284
- display: grid;
285
- grid-template-columns: 1fr;
286
- grid-template-rows: 1fr;
287
- overflow: hidden;
288
- }
289
-
290
- .popup-content.colorful {
291
- background-color: var(--stsv-common--colorful__background-color);
292
- border-color: var(--stsv-common--colorful__border-color);
293
- color: var(--stsv-common--colorful__color);
294
- }
295
-
296
- @media (prefers-reduced-motion) {
297
- .sterling-dropdown,
298
- .sterling-dropdown::after {
299
- transition: none;
300
- }
301
- }
302
- </style>
@@ -2,11 +2,10 @@ import { SvelteComponentTyped } from "svelte";
2
2
  declare const __propDef: {
3
3
  props: {
4
4
  [x: string]: any;
5
- colorful?: boolean | undefined;
6
- composed?: boolean | undefined;
7
5
  disabled?: boolean | undefined;
8
6
  open?: boolean | undefined;
9
7
  stayOpenOnClickAway?: boolean | undefined;
8
+ variant?: string | undefined;
10
9
  click?: (() => void) | undefined;
11
10
  blur?: (() => void) | undefined;
12
11
  focus?: ((options?: FocusOptions) => void) | undefined;
@@ -44,22 +43,19 @@ declare const __propDef: {
44
43
  };
45
44
  slots: {
46
45
  value: {
47
- colorful: boolean;
48
- composed: boolean;
49
46
  disabled: boolean;
50
47
  open: boolean;
48
+ variant: string;
51
49
  };
52
50
  button: {
53
- colorful: boolean;
54
- composed: boolean;
55
51
  disabled: boolean;
56
52
  open: boolean;
53
+ variant: string;
57
54
  };
58
55
  default: {
59
- colorful: boolean;
60
- composed: boolean;
61
56
  disabled: boolean;
62
57
  open: boolean;
58
+ variant: string;
63
59
  };
64
60
  };
65
61
  };