@geoffcox/sterling-svelte 0.0.16 → 0.0.18

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 (119) hide show
  1. package/{buttons/Button.svelte → Button.svelte} +27 -27
  2. package/{inputs/Checkbox.svelte → Checkbox.svelte} +26 -21
  3. package/{inputs/Checkbox.svelte.d.ts → Checkbox.svelte.d.ts} +2 -1
  4. package/{surfaces/Dialog.svelte → Dialog.svelte} +34 -21
  5. package/Field.svelte +257 -0
  6. package/Field.svelte.d.ts +63 -0
  7. package/Field.types.d.ts +1 -0
  8. package/Input.svelte +115 -0
  9. package/{inputs/Input.svelte.d.ts → Input.svelte.d.ts} +8 -3
  10. package/Label.svelte +51 -0
  11. package/Label.svelte.d.ts +41 -0
  12. package/List.constants.d.ts +1 -0
  13. package/List.constants.js +1 -0
  14. package/List.svelte +293 -0
  15. package/List.svelte.d.ts +63 -0
  16. package/List.types.d.ts +6 -0
  17. package/ListItem.svelte +89 -0
  18. package/ListItem.svelte.d.ts +51 -0
  19. package/{containers/Menu.svelte → Menu.svelte} +42 -27
  20. package/{containers/MenuBar.svelte → MenuBar.svelte} +13 -13
  21. package/{buttons/MenuButton.svelte → MenuButton.svelte} +17 -17
  22. package/{buttons/MenuButton.svelte.d.ts → MenuButton.svelte.d.ts} +1 -1
  23. package/{containers/MenuItem.svelte → MenuItem.svelte} +42 -54
  24. package/{containers/MenuItem.svelte.d.ts → MenuItem.svelte.d.ts} +2 -2
  25. package/{containers/MenuSeparator.svelte → MenuSeparator.svelte} +2 -2
  26. package/Menus.types.d.ts +22 -0
  27. package/{containers/Menus.utils.d.ts → Menus.utils.d.ts} +2 -2
  28. package/{containers/Menus.utils.js → Menus.utils.js} +6 -6
  29. package/{display/Progress.svelte → Progress.svelte} +28 -52
  30. package/{display/Progress.svelte.d.ts → Progress.svelte.d.ts} +1 -3
  31. package/Progress.types.d.ts +1 -0
  32. package/{inputs/Radio.svelte → Radio.svelte} +34 -29
  33. package/{inputs/Radio.svelte.d.ts → Radio.svelte.d.ts} +7 -2
  34. package/{inputs/Select.svelte → Select.svelte} +112 -130
  35. package/Select.svelte.d.ts +53 -0
  36. package/{inputs/Slider.svelte → Slider.svelte} +90 -86
  37. package/Slider.svelte.d.ts +51 -0
  38. package/{inputs/Switch.svelte → Switch.svelte} +43 -41
  39. package/Tab.svelte +181 -0
  40. package/{containers/Tab.svelte.d.ts → Tab.svelte.d.ts} +12 -15
  41. package/TabList.svelte +247 -0
  42. package/{containers/TabList.svelte.d.ts → TabList.svelte.d.ts} +21 -21
  43. package/TabList.types.d.ts +7 -0
  44. package/TextArea.svelte +113 -0
  45. package/{inputs/TextArea.svelte.d.ts → TextArea.svelte.d.ts} +3 -6
  46. package/TextArea.types.js +1 -0
  47. package/Tooltip.svelte +182 -0
  48. package/Tooltip.svelte.d.ts +24 -0
  49. package/Tooltip.types.d.ts +3 -0
  50. package/Tooltip.types.js +1 -0
  51. package/Tree.constants.d.ts +2 -0
  52. package/Tree.constants.js +2 -0
  53. package/Tree.svelte +114 -0
  54. package/Tree.svelte.d.ts +24 -0
  55. package/Tree.types.d.ts +28 -0
  56. package/Tree.types.js +1 -0
  57. package/{containers/TreeChevron.svelte → TreeChevron.svelte} +3 -3
  58. package/TreeItem.svelte +276 -0
  59. package/TreeItem.svelte.d.ts +65 -0
  60. package/{containers/TreeItem.svelte → TreeItemDisplay.svelte} +18 -18
  61. package/{containers/TreeItem.svelte.d.ts → TreeItemDisplay.svelte.d.ts} +11 -14
  62. package/{forwardEvents.js → actions/forwardEvents.js} +0 -2
  63. package/index.d.ts +44 -31
  64. package/index.js +40 -25
  65. package/package.json +45 -41
  66. package/theme/darkTheme.js +73 -74
  67. package/theme/lightTheme.js +76 -77
  68. package/containers/List.svelte +0 -249
  69. package/containers/List.svelte.d.ts +0 -68
  70. package/containers/ListItem.svelte +0 -48
  71. package/containers/ListItem.svelte.d.ts +0 -26
  72. package/containers/Menus.types.d.ts +0 -22
  73. package/containers/Tab.svelte +0 -327
  74. package/containers/TabList.svelte +0 -126
  75. package/containers/Tabs.types.d.ts +0 -12
  76. package/containers/Tree.constants.d.ts +0 -2
  77. package/containers/Tree.constants.js +0 -2
  78. package/containers/Tree.svelte +0 -222
  79. package/containers/Tree.svelte.d.ts +0 -50
  80. package/containers/Tree.types.d.ts +0 -47
  81. package/containers/TreeNode.svelte +0 -266
  82. package/containers/TreeNode.svelte.d.ts +0 -43
  83. package/display/Label.svelte +0 -27
  84. package/display/Label.svelte.d.ts +0 -20
  85. package/display/Progress.types.d.ts +0 -1
  86. package/inputs/Input.svelte +0 -129
  87. package/inputs/Select.svelte.d.ts +0 -62
  88. package/inputs/Slider.svelte.d.ts +0 -28
  89. package/inputs/TextArea.svelte +0 -154
  90. package/surfaces/CloseX.svelte +0 -5
  91. package/surfaces/CloseX.svelte.d.ts +0 -23
  92. package/surfaces/Portal.svelte +0 -14
  93. package/surfaces/Portal.svelte.d.ts +0 -21
  94. /package/{buttons/Button.svelte.d.ts → Button.svelte.d.ts} +0 -0
  95. /package/{buttons/Button.types.d.ts → Button.types.d.ts} +0 -0
  96. /package/{buttons/Button.types.js → Button.types.js} +0 -0
  97. /package/{surfaces/Dialog.svelte.d.ts → Dialog.svelte.d.ts} +0 -0
  98. /package/{containers/Menus.types.js → Field.types.js} +0 -0
  99. /package/{containers/Tabs.types.js → List.types.js} +0 -0
  100. /package/{containers/Menu.svelte.d.ts → Menu.svelte.d.ts} +0 -0
  101. /package/{containers/MenuBar.svelte.d.ts → MenuBar.svelte.d.ts} +0 -0
  102. /package/{containers/MenuItemDisplay.svelte → MenuItemDisplay.svelte} +0 -0
  103. /package/{containers/MenuItemDisplay.svelte.d.ts → MenuItemDisplay.svelte.d.ts} +0 -0
  104. /package/{containers/MenuSeparator.svelte.d.ts → MenuSeparator.svelte.d.ts} +0 -0
  105. /package/{containers/Menus.constants.d.ts → Menus.constants.d.ts} +0 -0
  106. /package/{containers/Menus.constants.js → Menus.constants.js} +0 -0
  107. /package/{containers/Tree.types.js → Menus.types.js} +0 -0
  108. /package/{display/Progress.types.js → Progress.types.js} +0 -0
  109. /package/{inputs/Switch.svelte.d.ts → Switch.svelte.d.ts} +0 -0
  110. /package/{containers/Tabs.constants.d.ts → TabList.constants.d.ts} +0 -0
  111. /package/{containers/Tabs.constants.js → TabList.constants.js} +0 -0
  112. /package/{inputs/TextArea.types.js → TabList.types.js} +0 -0
  113. /package/{inputs/TextArea.types.d.ts → TextArea.types.d.ts} +0 -0
  114. /package/{containers/TreeChevron.svelte.d.ts → TreeChevron.svelte.d.ts} +0 -0
  115. /package/{clickOutside.d.ts → actions/clickOutside.d.ts} +0 -0
  116. /package/{clickOutside.js → actions/clickOutside.js} +0 -0
  117. /package/{forwardEvents.d.ts → actions/forwardEvents.d.ts} +0 -0
  118. /package/{portal.d.ts → actions/portal.d.ts} +0 -0
  119. /package/{portal.js → actions/portal.js} +0 -0
package/Input.svelte ADDED
@@ -0,0 +1,115 @@
1
+ <script>import { v4 as uuid } from "uuid";
2
+ import Label from "./Label.svelte";
3
+ export let composed = false;
4
+ export let disabled = false;
5
+ export let id = void 0;
6
+ export let value = "";
7
+ $: {
8
+ if ($$slots.default && id === void 0) {
9
+ id = uuid();
10
+ }
11
+ }
12
+ </script>
13
+
14
+ {#if $$slots.default}
15
+ <Label {disabled} for={id}>
16
+ <slot {composed} {disabled} {value} />
17
+ </Label>
18
+ {/if}
19
+ <input
20
+ bind:value
21
+ class="sterling-input"
22
+ class:composed
23
+ {disabled}
24
+ {id}
25
+ on:blur
26
+ on:click
27
+ on:change
28
+ on:copy
29
+ on:cut
30
+ on:paste
31
+ on:dblclick
32
+ on:focus
33
+ on:focusin
34
+ on:focusout
35
+ on:input
36
+ on:invalid
37
+ on:keydown
38
+ on:keypress
39
+ on:keyup
40
+ on:mousedown
41
+ on:mouseenter
42
+ on:mouseleave
43
+ on:mousemove
44
+ on:mouseover
45
+ on:mouseout
46
+ on:mouseup
47
+ on:select
48
+ on:submit
49
+ on:reset
50
+ on:wheel
51
+ {...$$restProps}
52
+ />
53
+
54
+ <style>
55
+ .sterling-input {
56
+ background-color: var(--stsv-Input__background-color);
57
+ border-color: var(--stsv-Input__border-color);
58
+ border-radius: var(--stsv-Input__border-radius);
59
+ border-style: var(--stsv-Input__border-style);
60
+ border-width: var(--stsv-Input__border-width);
61
+ color: var(--stsv-Input__color);
62
+ font: inherit;
63
+ margin: 0;
64
+ outline: none;
65
+ padding: 0.5em;
66
+ transition: background-color 250ms, color 250ms, border-color 250ms;
67
+ }
68
+
69
+ .sterling-input:hover {
70
+ background-color: var(--stsv-Input__background-color--hover);
71
+ border-color: var(--stsv-Input__border-color--hover);
72
+ color: var(--stsv-Input__color--hover);
73
+ }
74
+
75
+ .sterling-input:focus {
76
+ background-color: var(--stsv-Input__background-color--focus);
77
+ border-color: var(--stsv-Input__border-color--focus);
78
+ color: var(--stsv-Input__color--focus);
79
+ outline-color: var(--stsv-Common__outline-color);
80
+ outline-offset: var(--stsv-Common__outline-offset);
81
+ outline-style: var(--stsv-Common__outline-style);
82
+ outline-width: var(--stsv-Common__outline-width);
83
+ }
84
+
85
+ .sterling-input:disabled {
86
+ background-color: var(--stsv-Common__background-color--disabled);
87
+ border-color: var(--stsv--Common__border-color--disabled);
88
+ color: var(--stsv-Common__color--disabled);
89
+ cursor: not-allowed;
90
+ }
91
+
92
+ .sterling-input.composed,
93
+ .sterling-input.composed:hover,
94
+ .sterling-input.composed:focus,
95
+ .sterling-input.composed.disabled {
96
+ background: transparent;
97
+ border: none;
98
+ outline: none;
99
+ }
100
+
101
+ .sterling-input::placeholder {
102
+ color: var(--stsv-Display__color--faint);
103
+ transition: background-color 250ms, color 250ms, border-color 250ms;
104
+ }
105
+
106
+ .sterling-input:disabled::placeholder {
107
+ color: var(--stsv-Display__color--disabled);
108
+ }
109
+
110
+ @media (prefers-reduced-motion) {
111
+ .sterling-input {
112
+ transition: none;
113
+ }
114
+ }
115
+ </style>
@@ -2,8 +2,10 @@ import { SvelteComponentTyped } from "svelte";
2
2
  declare const __propDef: {
3
3
  props: {
4
4
  [x: string]: any;
5
- value?: string | undefined;
5
+ composed?: boolean | undefined;
6
6
  disabled?: boolean | undefined;
7
+ id?: string | undefined;
8
+ value?: string | undefined;
7
9
  };
8
10
  events: {
9
11
  blur: FocusEvent;
@@ -36,13 +38,16 @@ declare const __propDef: {
36
38
  [evt: string]: CustomEvent<any>;
37
39
  };
38
40
  slots: {
39
- label: {};
41
+ default: {
42
+ composed: boolean;
43
+ disabled: boolean;
44
+ value: string;
45
+ };
40
46
  };
41
47
  };
42
48
  export type InputProps = typeof __propDef.props;
43
49
  export type InputEvents = typeof __propDef.events;
44
50
  export type InputSlots = typeof __propDef.slots;
45
- /** A styled HTML input element with optional label. */
46
51
  export default class Input extends SvelteComponentTyped<InputProps, InputEvents, InputSlots> {
47
52
  }
48
53
  export {};
package/Label.svelte ADDED
@@ -0,0 +1,51 @@
1
+ <script>export let disabled = false;
2
+ HTMLLabelElement;
3
+ </script>
4
+
5
+ <label
6
+ aria-disabled={disabled}
7
+ class="sterling-label"
8
+ class:disabled
9
+ on:blur
10
+ on:click
11
+ on:copy
12
+ on:cut
13
+ on:dblclick
14
+ on:focus
15
+ on:focusin
16
+ on:focusout
17
+ on:keydown
18
+ on:keypress
19
+ on:keyup
20
+ on:mousedown
21
+ on:mouseenter
22
+ on:mouseleave
23
+ on:mousemove
24
+ on:mouseover
25
+ on:mouseout
26
+ on:mouseup
27
+ on:scroll
28
+ on:wheel
29
+ on:paste
30
+ {...$$restProps}
31
+ >
32
+ <slot />
33
+ </label>
34
+
35
+ <style>
36
+ label {
37
+ color: var(--stsv-Display__color);
38
+ transition: color 250ms;
39
+ font: inherit;
40
+ }
41
+
42
+ label.disabled {
43
+ color: var(--stsv-Common__color--disabled);
44
+ }
45
+
46
+ @media (prefers-reduced-motion) {
47
+ label {
48
+ transition: none;
49
+ }
50
+ }
51
+ </style>
@@ -0,0 +1,41 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ [x: string]: any;
5
+ disabled?: boolean | undefined;
6
+ };
7
+ events: {
8
+ blur: FocusEvent;
9
+ click: MouseEvent;
10
+ copy: ClipboardEvent;
11
+ cut: ClipboardEvent;
12
+ dblclick: MouseEvent;
13
+ focus: FocusEvent;
14
+ focusin: FocusEvent;
15
+ focusout: FocusEvent;
16
+ keydown: KeyboardEvent;
17
+ keypress: KeyboardEvent;
18
+ keyup: KeyboardEvent;
19
+ mousedown: MouseEvent;
20
+ mouseenter: MouseEvent;
21
+ mouseleave: MouseEvent;
22
+ mousemove: MouseEvent;
23
+ mouseover: MouseEvent;
24
+ mouseout: MouseEvent;
25
+ mouseup: MouseEvent;
26
+ scroll: Event;
27
+ wheel: WheelEvent;
28
+ paste: ClipboardEvent;
29
+ } & {
30
+ [evt: string]: CustomEvent<any>;
31
+ };
32
+ slots: {
33
+ default: {};
34
+ };
35
+ };
36
+ export type LabelProps = typeof __propDef.props;
37
+ export type LabelEvents = typeof __propDef.events;
38
+ export type LabelSlots = typeof __propDef.slots;
39
+ export default class Label extends SvelteComponentTyped<LabelProps, LabelEvents, LabelSlots> {
40
+ }
41
+ export {};
@@ -0,0 +1 @@
1
+ export declare const listContextKey = "sterlingList";
@@ -0,0 +1 @@
1
+ export const listContextKey = 'sterlingList';
package/List.svelte ADDED
@@ -0,0 +1,293 @@
1
+ <script>import { createKeyborg } from "keyborg";
2
+ import { createEventDispatcher, onMount, setContext } from "svelte";
3
+ import { writable } from "svelte/store";
4
+ import { v4 as uuid } from "uuid";
5
+ import { listContextKey } from "./List.constants";
6
+ export let composed = false;
7
+ export let disabled = false;
8
+ export let horizontal = false;
9
+ export let selectedValue = void 0;
10
+ const listId = `list-${uuid()}`;
11
+ let listRef;
12
+ let lastSelectedItemRef;
13
+ const disabledStore = writable(disabled);
14
+ const horizontalStore = writable(horizontal);
15
+ const selectedValueStore = writable(selectedValue);
16
+ $: {
17
+ disabledStore.set(disabled);
18
+ }
19
+ $: {
20
+ horizontalStore.set(horizontal);
21
+ }
22
+ $: {
23
+ selectedValueStore.set(selectedValue);
24
+ }
25
+ $: {
26
+ selectedValue = $selectedValueStore;
27
+ }
28
+ const dispatch = createEventDispatcher();
29
+ const raiseSelect = (value) => {
30
+ dispatch("select", { value });
31
+ };
32
+ $: {
33
+ raiseSelect(selectedValue);
34
+ }
35
+ let keyborg = createKeyborg(window);
36
+ let usingKeyboard = keyborg.isNavigatingWithKeyboard();
37
+ const keyborgHandler = (value) => {
38
+ usingKeyboard = value;
39
+ };
40
+ export const focus = () => {
41
+ listRef?.focus();
42
+ };
43
+ export const scrollToSelectedItem = () => {
44
+ const element = getSelectedItemElement();
45
+ element?.scrollIntoView({ block: "nearest", inline: "nearest" });
46
+ };
47
+ const isElementListItem = (candidate) => {
48
+ return candidate && candidate.getAttribute("data-value") !== null && candidate.getAttribute("data-value") !== void 0 && candidate.getAttribute("role") === "listitem";
49
+ };
50
+ const getSelectedItemElement = () => {
51
+ if (isElementListItem(lastSelectedItemRef) && lastSelectedItemRef?.getAttribute("data-value") === selectedValue && lastSelectedItemRef?.closest('[role="list"]') === listRef) {
52
+ return lastSelectedItemRef;
53
+ } else {
54
+ return listRef?.querySelector("[data-value][aria-selected=true]");
55
+ }
56
+ };
57
+ const selectItem = (value, element) => {
58
+ selectedValueStore.set(value);
59
+ lastSelectedItemRef = element;
60
+ element.scrollIntoView({ block: "nearest", inline: "nearest" });
61
+ };
62
+ export const selectFirstItem = () => {
63
+ let candidate = listRef?.firstElementChild;
64
+ while (candidate && !isElementListItem(candidate)) {
65
+ candidate = candidate.nextElementSibling;
66
+ }
67
+ let candidateValue = candidate?.getAttribute("data-value");
68
+ if (candidateValue && candidate) {
69
+ selectItem(candidateValue, candidate);
70
+ return true;
71
+ }
72
+ return false;
73
+ };
74
+ export const selectPreviousItem = () => {
75
+ let selectedItem = getSelectedItemElement();
76
+ let candidate = selectedItem?.previousElementSibling;
77
+ while (candidate && !isElementListItem(candidate)) {
78
+ candidate = candidate.previousElementSibling;
79
+ }
80
+ let candidateValue = candidate?.getAttribute("data-value");
81
+ if (candidateValue && candidate) {
82
+ selectItem(candidateValue, candidate);
83
+ return true;
84
+ }
85
+ return false;
86
+ };
87
+ export const selectNextItem = () => {
88
+ let selectedItem = getSelectedItemElement();
89
+ let candidate = selectedItem?.nextElementSibling;
90
+ while (candidate && !isElementListItem(candidate)) {
91
+ candidate = candidate.nextElementSibling;
92
+ }
93
+ let candidateValue = candidate?.getAttribute("data-value");
94
+ if (candidateValue && candidate) {
95
+ selectItem(candidateValue, candidate);
96
+ return true;
97
+ }
98
+ return false;
99
+ };
100
+ export const selectLastItem = () => {
101
+ let candidate = listRef?.lastElementChild;
102
+ while (candidate && !isElementListItem(candidate)) {
103
+ candidate = candidate.previousElementSibling;
104
+ }
105
+ let candidateValue = candidate?.getAttribute("data-value");
106
+ if (candidateValue && candidate) {
107
+ selectItem(candidateValue, candidate);
108
+ return true;
109
+ }
110
+ return false;
111
+ };
112
+ onMount(() => {
113
+ keyborg.subscribe(keyborgHandler);
114
+ return () => {
115
+ keyborg.unsubscribe(keyborgHandler);
116
+ };
117
+ });
118
+ const onClick = (event) => {
119
+ if (!disabled) {
120
+ let candidate = event.target;
121
+ let candidateValue = candidate?.getAttribute("data-value");
122
+ if (candidateValue === void 0 || candidateValue === null) {
123
+ candidate = candidate?.closest("[data-value]");
124
+ candidateValue = candidate?.getAttribute("data-value");
125
+ }
126
+ if (candidateValue && candidate) {
127
+ selectItem(candidateValue, candidate);
128
+ }
129
+ }
130
+ };
131
+ const onKeydown = (event) => {
132
+ if (!disabled && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) {
133
+ switch (event.key) {
134
+ case "Home":
135
+ selectFirstItem();
136
+ event.preventDefault();
137
+ event.stopPropagation();
138
+ return false;
139
+ case "End":
140
+ selectLastItem();
141
+ event.preventDefault();
142
+ event.stopPropagation();
143
+ return false;
144
+ case "ArrowLeft":
145
+ if (horizontal) {
146
+ selectedValue !== void 0 ? selectPreviousItem() : selectLastItem();
147
+ }
148
+ event.preventDefault();
149
+ event.stopPropagation();
150
+ return false;
151
+ case "ArrowRight":
152
+ if (horizontal) {
153
+ selectedValue !== void 0 ? selectNextItem() : selectFirstItem();
154
+ }
155
+ event.preventDefault();
156
+ event.stopPropagation();
157
+ return false;
158
+ case "ArrowUp":
159
+ if (!horizontal) {
160
+ selectedValue !== void 0 ? selectPreviousItem() : selectLastItem();
161
+ }
162
+ event.preventDefault();
163
+ event.stopPropagation();
164
+ return false;
165
+ case "ArrowDown":
166
+ if (!horizontal) {
167
+ selectedValue !== void 0 ? selectNextItem() : selectFirstItem();
168
+ }
169
+ event.preventDefault();
170
+ event.stopPropagation();
171
+ return false;
172
+ }
173
+ }
174
+ };
175
+ setContext(listContextKey, {
176
+ disabled: disabledStore,
177
+ selectedValue: selectedValueStore,
178
+ horizontal: horizontalStore
179
+ });
180
+ </script>
181
+
182
+ <!--
183
+ @component
184
+ A list of items where a single item can be selected.
185
+ -->
186
+ <!-- svelte-ignore a11y-no-noninteractive-tabindex -->
187
+ <div
188
+ aria-activedescendant={selectedValue}
189
+ aria-disabled={disabled}
190
+ aria-orientation={horizontal ? 'horizontal' : 'vertical'}
191
+ bind:this={listRef}
192
+ class="sterling-list"
193
+ class:composed
194
+ class:disabled
195
+ class:horizontal
196
+ class:using-keyboard={usingKeyboard}
197
+ id={listId}
198
+ role="list"
199
+ tabindex={0}
200
+ on:blur
201
+ on:click
202
+ on:click={onClick}
203
+ on:copy
204
+ on:cut
205
+ on:dblclick
206
+ on:focus
207
+ on:focusin
208
+ on:focusout
209
+ on:keydown
210
+ on:keydown={onKeydown}
211
+ on:keypress
212
+ on:keyup
213
+ on:mousedown
214
+ on:mouseenter
215
+ on:mouseleave
216
+ on:mousemove
217
+ on:mouseover
218
+ on:mouseout
219
+ on:mouseup
220
+ on:scroll
221
+ on:wheel
222
+ on:paste
223
+ {...$$restProps}
224
+ >
225
+ <slot {composed} {disabled} {horizontal} {selectedValue} />
226
+ </div>
227
+
228
+ <style>
229
+ .sterling-list {
230
+ background-color: var(--stsv-Common__background-color);
231
+ border-color: var(--stsv-Common__border-color);
232
+ border-radius: var(--stsv-Common__border-radius);
233
+ border-style: var(--stsv-Common__border-style);
234
+ border-width: var(--stsv-Common__border-width);
235
+ box-sizing: border-box;
236
+ color: var(--stsv-Common__color);
237
+ display: flex;
238
+ flex-direction: column;
239
+ flex-wrap: nowrap;
240
+ height: 100%;
241
+ margin: 0;
242
+ overflow-x: hidden;
243
+ overflow-y: scroll;
244
+ outline: none;
245
+ padding: 0;
246
+ position: relative;
247
+ transition: background-color 250ms, color 250ms, border-color 250ms;
248
+ }
249
+
250
+ .sterling-list.horizontal {
251
+ flex-direction: row;
252
+ height: unset;
253
+ overflow-x: scroll;
254
+ overflow-y: hidden;
255
+ width: 100%;
256
+ }
257
+
258
+ .sterling-list:hover {
259
+ border-color: var(--stsv-Common__border-color--hover);
260
+ color: var(--stsv-Common__color--hover);
261
+ }
262
+
263
+ .sterling-list.using-keyboard:focus-within {
264
+ border-color: var(--stsv-Common__border-color--focus);
265
+ color: var(--stsv-Common__color--focus);
266
+ outline-color: var(--stsv-Common__outline-color);
267
+ outline-offset: var(--stsv-Common__outline-offset);
268
+ outline-style: var(--stsv-Common__outline-style);
269
+ outline-width: var(--stsv-Common__outline-width);
270
+ }
271
+
272
+ .sterling-list.disabled {
273
+ background-color: var(--stsv-Common__background-color--disabled);
274
+ border-color: var(--stsv--Common__border-color--disabled);
275
+ color: var(--stsv-Common__color--disabled);
276
+ cursor: not-allowed;
277
+ }
278
+
279
+ .sterling-list.composed,
280
+ .sterling-list.composed:hover,
281
+ .sterling-list.composed.using-keyboard:focus-within,
282
+ .sterling-list.composed.disabled {
283
+ background: none;
284
+ border: none;
285
+ outline: none;
286
+ }
287
+
288
+ @media (prefers-reduced-motion) {
289
+ .sterling-list {
290
+ transition: none;
291
+ }
292
+ }
293
+ </style>
@@ -0,0 +1,63 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ [x: string]: any;
5
+ composed?: boolean | undefined;
6
+ disabled?: boolean | undefined;
7
+ horizontal?: boolean | undefined;
8
+ selectedValue?: string | undefined;
9
+ focus?: (() => void) | undefined;
10
+ scrollToSelectedItem?: (() => void) | undefined;
11
+ selectFirstItem?: (() => boolean) | undefined;
12
+ selectPreviousItem?: (() => boolean) | undefined;
13
+ selectNextItem?: (() => boolean) | undefined;
14
+ selectLastItem?: (() => boolean) | undefined;
15
+ };
16
+ events: {
17
+ blur: FocusEvent;
18
+ click: MouseEvent;
19
+ copy: ClipboardEvent;
20
+ cut: ClipboardEvent;
21
+ dblclick: MouseEvent;
22
+ focus: FocusEvent;
23
+ focusin: FocusEvent;
24
+ focusout: FocusEvent;
25
+ keydown: KeyboardEvent;
26
+ keypress: KeyboardEvent;
27
+ keyup: KeyboardEvent;
28
+ mousedown: MouseEvent;
29
+ mouseenter: MouseEvent;
30
+ mouseleave: MouseEvent;
31
+ mousemove: MouseEvent;
32
+ mouseover: MouseEvent;
33
+ mouseout: MouseEvent;
34
+ mouseup: MouseEvent;
35
+ scroll: Event;
36
+ wheel: WheelEvent;
37
+ paste: ClipboardEvent;
38
+ select: CustomEvent<any>;
39
+ } & {
40
+ [evt: string]: CustomEvent<any>;
41
+ };
42
+ slots: {
43
+ default: {
44
+ composed: boolean;
45
+ disabled: boolean;
46
+ horizontal: boolean;
47
+ selectedValue: string | undefined;
48
+ };
49
+ };
50
+ };
51
+ export type ListProps = typeof __propDef.props;
52
+ export type ListEvents = typeof __propDef.events;
53
+ export type ListSlots = typeof __propDef.slots;
54
+ /** A list of items where a single item can be selected. */
55
+ export default class List extends SvelteComponentTyped<ListProps, ListEvents, ListSlots> {
56
+ get focus(): () => void;
57
+ get scrollToSelectedItem(): () => void;
58
+ get selectFirstItem(): () => boolean;
59
+ get selectPreviousItem(): () => boolean;
60
+ get selectNextItem(): () => boolean;
61
+ get selectLastItem(): () => boolean;
62
+ }
63
+ export {};
@@ -0,0 +1,6 @@
1
+ import type { Readable, Writable } from 'svelte/store';
2
+ export type ListContext = {
3
+ disabled: Readable<boolean>;
4
+ selectedValue: Writable<string | undefined>;
5
+ horizontal: Readable<boolean>;
6
+ };
@@ -0,0 +1,89 @@
1
+ <script>import { getContext } from "svelte";
2
+ import { listContextKey } from "./List.constants";
3
+ export let disabled = false;
4
+ export let value;
5
+ const {
6
+ disabled: listDisabled,
7
+ selectedValue,
8
+ horizontal
9
+ } = getContext(listContextKey);
10
+ let itemRef;
11
+ $:
12
+ _disabled = disabled || $listDisabled;
13
+ $:
14
+ selected = $selectedValue === value;
15
+ </script>
16
+
17
+ <div
18
+ aria-selected={selected}
19
+ bind:this={itemRef}
20
+ class="sterling-list-item"
21
+ class:disabled={_disabled}
22
+ class:selected
23
+ data-value={value}
24
+ role="listitem"
25
+ on:blur
26
+ on:click
27
+ on:dblclick
28
+ on:focus
29
+ on:focusin
30
+ on:focusout
31
+ on:keydown
32
+ on:keypress
33
+ on:keyup
34
+ on:mousedown
35
+ on:mouseenter
36
+ on:mouseleave
37
+ on:mousemove
38
+ on:mouseover
39
+ on:mouseout
40
+ on:mouseup
41
+ on:pointercancel
42
+ on:pointerdown
43
+ on:pointerenter
44
+ on:pointerleave
45
+ on:pointermove
46
+ on:pointerover
47
+ on:pointerout
48
+ on:pointerup
49
+ on:wheel
50
+ {...$$restProps}
51
+ >
52
+ <slot {disabled} {horizontal} {selected} {value}>{value}</slot>
53
+ </div>
54
+
55
+ <style>
56
+ .sterling-list-item {
57
+ background-color: transparent;
58
+ box-sizing: border-box;
59
+ color: var(--stsv-Input__color);
60
+ cursor: pointer;
61
+ margin: 0;
62
+ padding: 0.5em;
63
+ outline: none;
64
+ text-overflow: ellipsis;
65
+ transition: background-color 250ms, color 250ms, border-color 250ms;
66
+ white-space: nowrap;
67
+ }
68
+
69
+ .sterling-list-item:not(.disabled):hover {
70
+ background-color: var(--stsv-Button__background-color--hover);
71
+ color: var(--stsv-Button__color--hover);
72
+ }
73
+
74
+ .sterling-list-item.selected {
75
+ background-color: var(--stsv-Input__background-color--selected);
76
+ color: var(--stsv-Input__color--selected);
77
+ }
78
+
79
+ .sterling-list-item.disabled {
80
+ color: var(--stsv-Common__color--disabled);
81
+ cursor: not-allowed;
82
+ }
83
+
84
+ @media (prefers-reduced-motion) {
85
+ .sterling-list-item {
86
+ transition: none;
87
+ }
88
+ }
89
+ </style>