@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
@@ -1,12 +1,9 @@
1
- <script>import { v4 as uuid } from "uuid";
2
- import Label from "../display/Label.svelte";
3
- export let value = 0;
1
+ <script>export let value = 0;
4
2
  export let max = 100;
5
3
  export let percent = 0;
6
4
  export let vertical = false;
7
5
  export let colorful = "none";
8
6
  export let disabled = false;
9
- const inputId = uuid();
10
7
  let clientHeight;
11
8
  let clientWidth;
12
9
  $:
@@ -25,7 +22,7 @@ $:
25
22
  $:
26
23
  indicatorStyle = vertical ? `height: ${percentHeight}px` : `width: ${percentWidth}px`;
27
24
  $:
28
- indicatorColor = colorful === "auto" ? percent === 100 ? "success" : "progress" : colorful;
25
+ indicatorColor = colorful === "auto" ? percent === 100 ? "success" : "info" : colorful;
29
26
  </script>
30
27
 
31
28
  <!--
@@ -39,6 +36,7 @@ $:
39
36
  class="sterling-progress"
40
37
  class:disabled
41
38
  class:vertical
39
+ role="progressbar"
42
40
  on:click
43
41
  on:dblclick
44
42
  on:focus
@@ -53,22 +51,15 @@ $:
53
51
  on:wheel
54
52
  {...$$restProps}
55
53
  >
56
- {#if $$slots.label}
57
- <Label {disabled} for={inputId}>
58
- <slot name="label" />
59
- </Label>
60
- {/if}
61
- <div class="progress-bar" id={inputId}>
62
- <div class="container" bind:clientWidth bind:clientHeight>
63
- <div
64
- class="indicator"
65
- class:progress={indicatorColor === 'progress'}
66
- class:success={indicatorColor === 'success'}
67
- class:warning={indicatorColor === 'warning'}
68
- class:error={indicatorColor === 'error'}
69
- style={indicatorStyle}
70
- />
71
- </div>
54
+ <div class="container" bind:clientWidth bind:clientHeight>
55
+ <div
56
+ class="indicator"
57
+ class:info={indicatorColor === 'info'}
58
+ class:success={indicatorColor === 'success'}
59
+ class:warning={indicatorColor === 'warning'}
60
+ class:error={indicatorColor === 'error'}
61
+ style={indicatorStyle}
62
+ />
72
63
  </div>
73
64
  </div>
74
65
 
@@ -78,27 +69,15 @@ $:
78
69
  flex-direction: column;
79
70
  align-content: flex-start;
80
71
  align-items: flex-start;
81
- }
82
-
83
- .sterling-progress > :global(label) {
84
- font-size: 0.7em;
85
- margin: 0.5em 0.7em;
86
- }
87
-
88
- .sterling-progress > :global(label):empty {
89
- margin: 0;
90
- }
91
-
92
- .progress-bar {
93
72
  display: block;
94
- background: var(--Common__background-color);
73
+ background: var(--stsv-Common__background-color);
95
74
  box-sizing: border-box;
96
75
  height: 1em;
97
76
  padding: 0.2em;
98
- border-width: var(--Common__border-width);
99
- border-style: var(--Common__border-style);
100
- border-color: var(--Common__border-color);
101
- border-radius: var(--Common__border-radius);
77
+ border-width: var(--stsv-Common__border-width);
78
+ border-style: var(--stsv-Common__border-style);
79
+ border-color: var(--stsv-Common__border-color);
80
+ border-radius: var(--stsv-Common__border-radius);
102
81
  transition: background-color 250ms, color 250ms, border-color 250ms;
103
82
  }
104
83
 
@@ -111,7 +90,7 @@ $:
111
90
  }
112
91
 
113
92
  .indicator {
114
- background-color: var(--Display__color);
93
+ background-color: var(--stsv-Display__border-color);
115
94
  box-sizing: border-box;
116
95
  height: 100%;
117
96
  min-height: 1px;
@@ -123,9 +102,6 @@ $:
123
102
  .sterling-progress.vertical {
124
103
  align-items: center;
125
104
  align-content: center;
126
- }
127
-
128
- .sterling-progress.vertical .progress-bar {
129
105
  height: unset;
130
106
  width: 1em;
131
107
  }
@@ -146,35 +122,35 @@ $:
146
122
 
147
123
  /* ----- Colorful ----- */
148
124
 
149
- .indicator.progress {
150
- background-color: var(--Display__color--progress);
125
+ .indicator.info {
126
+ background-color: var(--stsv-Info__border-color);
151
127
  }
152
128
 
153
129
  .indicator.success {
154
- background-color: var(--Display__color--success);
130
+ background-color: var(--stsv-Success__border-color);
155
131
  }
156
132
 
157
133
  .indicator.warning {
158
- background-color: var(--Display__color--warning);
134
+ background-color: var(--stsv-Warning__border-color);
159
135
  }
160
136
 
161
137
  .indicator.error {
162
- background-color: var(--Display__color--error);
138
+ background-color: var(--stsv-Error__border-color);
163
139
  }
164
140
 
165
141
  /* ----- Disabled ----- */
166
142
 
167
- .sterling-progress.disabled .progress-bar {
168
- background: var(--Common__background-color--disabled);
169
- border-color: var(--Common__border-color--disabled);
143
+ .sterling-progress.disabled {
144
+ background: var(--stsv-Common__background-color--disabled);
145
+ border-color: var(--stsv-Common__border-color--disabled);
170
146
  }
171
147
 
172
148
  .sterling-progress.disabled .indicator {
173
- background-color: var(--Display__color--disabled);
149
+ background-color: var(--stsv-Display__color--disabled);
174
150
  }
175
151
 
176
152
  @media (prefers-reduced-motion) {
177
- .progress-bar,
153
+ .sterling-progress,
178
154
  .indicator {
179
155
  transition: none;
180
156
  }
@@ -26,9 +26,7 @@ declare const __propDef: {
26
26
  } & {
27
27
  [evt: string]: CustomEvent<any>;
28
28
  };
29
- slots: {
30
- label: {};
31
- };
29
+ slots: {};
32
30
  };
33
31
  export type ProgressProps = typeof __propDef.props;
34
32
  export type ProgressEvents = typeof __propDef.events;
@@ -0,0 +1 @@
1
+ export type ProgressColorful = 'none' | 'auto' | 'info' | 'success' | 'warning' | 'error';
@@ -1,27 +1,32 @@
1
1
  <script>import { onMount } from "svelte";
2
2
  import { v4 as uuid } from "uuid";
3
- import Label from "../display/Label.svelte";
3
+ import Label from "./Label.svelte";
4
4
  export let checked = false;
5
- export let group = void 0;
6
5
  export let disabled = false;
7
- const inputId = uuid();
6
+ export let group = void 0;
7
+ export let id = void 0;
8
+ let mounted = false;
9
+ $: {
10
+ if ($$slots.default && id === void 0) {
11
+ id = uuid();
12
+ }
13
+ }
14
+ $: {
15
+ if (mounted) {
16
+ checked = group === $$restProps.value;
17
+ }
18
+ }
8
19
  const onChange = (e) => {
9
20
  if (e.currentTarget.checked) {
10
21
  group = $$restProps.value;
11
22
  }
12
23
  };
13
- let mounted = false;
14
24
  onMount(() => {
15
25
  if (checked) {
16
26
  group = $$restProps.value;
17
27
  }
18
28
  mounted = true;
19
29
  });
20
- $: {
21
- if (mounted) {
22
- checked = group === $$restProps.value;
23
- }
24
- }
25
30
  </script>
26
31
 
27
32
  <!--
@@ -31,6 +36,9 @@ $: {
31
36
  <div class="sterling-radio">
32
37
  <div class="container">
33
38
  <input
39
+ checked={group === $$restProps.value}
40
+ {disabled}
41
+ {id}
34
42
  type="radio"
35
43
  on:blur
36
44
  on:click
@@ -53,17 +61,14 @@ $: {
53
61
  on:mouseup
54
62
  on:toggle
55
63
  on:wheel
56
- checked={group === $$restProps.value}
57
64
  {...$$restProps}
58
- {disabled}
59
- id={inputId}
60
65
  />
61
66
  <div class="indicator" />
62
67
  </div>
63
- {#if $$slots.label}
68
+ {#if $$slots.default}
64
69
  <div class="label">
65
- <Label {disabled} for={inputId}>
66
- <slot name="label" />
70
+ <Label {disabled} for={id}>
71
+ <slot {checked} {disabled} {group} />
67
72
  </Label>
68
73
  </div>
69
74
  {/if}
@@ -114,10 +119,10 @@ $: {
114
119
  and there is not a parent CSS selector.
115
120
  */
116
121
  .indicator {
117
- background-color: var(--Input__background-color);
118
- border-color: var(--Input__border-color);
119
- border-style: var(--Input__border-style);
120
- border-width: var(--Input__border-width);
122
+ background-color: var(--stsv-Input__background-color);
123
+ border-color: var(--stsv-Input__border-color);
124
+ border-style: var(--stsv-Input__border-style);
125
+ border-width: var(--stsv-Input__border-width);
121
126
  border-radius: 10000px;
122
127
  box-sizing: border-box;
123
128
  display: inline-block;
@@ -129,20 +134,20 @@ $: {
129
134
  }
130
135
 
131
136
  input:checked + .indicator {
132
- background-color: var(--Input__background-color);
133
- border-color: var(--Input__border-color);
137
+ background-color: var(--stsv-Input__background-color);
138
+ border-color: var(--stsv-Input__border-color);
134
139
  }
135
140
 
136
141
  input:focus-visible + .indicator {
137
- outline-color: var(--Common__outline-color);
138
- outline-offset: var(--Common__outline-offset);
139
- outline-style: var(--Common__outline-style);
140
- outline-width: var(--Common__outline-width);
142
+ outline-color: var(--stsv-Common__outline-color);
143
+ outline-offset: var(--stsv-Common__outline-offset);
144
+ outline-style: var(--stsv-Common__outline-style);
145
+ outline-width: var(--stsv-Common__outline-width);
141
146
  }
142
147
 
143
148
  input:disabled + .indicator {
144
- background-color: var(--Input__background-color--disabled);
145
- border-color: var(--Input__border-color--disabled);
149
+ background-color: var(--stsv-Common__background-color--disabled);
150
+ border-color: var(--stsv-Common__border-color--disabled);
146
151
  }
147
152
 
148
153
  .indicator::after {
@@ -159,11 +164,11 @@ $: {
159
164
  }
160
165
 
161
166
  input:checked + .indicator::after {
162
- background-color: var(--Input__color);
167
+ background-color: var(--stsv-Input__color);
163
168
  }
164
169
 
165
170
  input:checked:disabled + .indicator::after {
166
- background-color: var(--Input__color--disabled);
171
+ background-color: var(--stsv-Common__color--disabled);
167
172
  }
168
173
 
169
174
  .label {
@@ -3,8 +3,9 @@ declare const __propDef: {
3
3
  props: {
4
4
  [x: string]: any;
5
5
  checked?: boolean | undefined;
6
- group?: any | undefined | null;
7
6
  disabled?: boolean | undefined;
7
+ group?: any | undefined | null;
8
+ id?: string | undefined;
8
9
  };
9
10
  events: {
10
11
  blur: FocusEvent;
@@ -31,7 +32,11 @@ declare const __propDef: {
31
32
  [evt: string]: CustomEvent<any>;
32
33
  };
33
34
  slots: {
34
- label: {};
35
+ default: {
36
+ checked: boolean;
37
+ disabled: boolean;
38
+ group: any;
39
+ };
35
40
  };
36
41
  };
37
42
  export type RadioProps = typeof __propDef.props;
@@ -1,50 +1,47 @@
1
- <script>import { createEventDispatcher, onMount, tick } from "svelte";
1
+ <script>import { computePosition, flip, offset, shift, autoUpdate } from "@floating-ui/dom";
2
+ import { createEventDispatcher, onMount, tick } from "svelte";
2
3
  import { v4 as uuid } from "uuid";
3
- import { computePosition, flip, offset, shift, autoUpdate } from "@floating-ui/dom";
4
- import { clickOutside } from "../clickOutside";
5
- import Label from "../display/Label.svelte";
6
- import List from "../containers/List.svelte";
7
- import Input from "./Input.svelte";
4
+ import { clickOutside } from "./actions/clickOutside";
5
+ import List from "./List.svelte";
6
+ const popupId = uuid();
7
+ export let composed = false;
8
8
  export let disabled = false;
9
- export let items = [];
10
9
  export let open = false;
11
- export let selectedIndex = 0;
12
- export let selectedItem = void 0;
13
- $: {
14
- selectedItem = items[selectedIndex];
15
- }
16
- const inputId = uuid();
10
+ export let selectedValue = void 0;
17
11
  let prevOpen = false;
18
- let pendingSelectedIndex = selectedIndex;
12
+ let pendingSelectedValue = selectedValue;
19
13
  let selectRef;
20
14
  let popupRef;
21
15
  let listRef;
22
- const popupId = uuid();
23
16
  let popupPosition = {
24
17
  x: void 0,
25
18
  y: void 0
26
19
  };
27
20
  const dispatch = createEventDispatcher();
28
- const raiseItemSelected = (index) => {
29
- dispatch("itemSelected", { index, item: items[index] });
21
+ const raiseSelect = (value) => {
22
+ dispatch("select", { value });
30
23
  };
31
- const raiseItemSelectPending = (index) => {
32
- dispatch("itemSelectPending", { index, item: items[index] });
24
+ const raisePending = (value) => {
25
+ dispatch("pending", { value });
33
26
  };
34
- $:
35
- selectedIndex, () => {
36
- pendingSelectedIndex = selectedIndex;
37
- };
38
27
  $: {
39
- raiseItemSelected(selectedIndex);
28
+ pendingSelectedValue = selectedValue;
40
29
  }
41
30
  $: {
42
- raiseItemSelectPending(pendingSelectedIndex);
31
+ raiseSelect(selectedValue);
32
+ }
33
+ $: {
34
+ if (open) {
35
+ raisePending(pendingSelectedValue);
36
+ }
43
37
  }
44
38
  $: {
45
39
  if (open && !prevOpen) {
46
40
  prevOpen = true;
47
- tick().then(() => listRef?.focusSelectedItem());
41
+ tick().then(() => {
42
+ listRef?.focus();
43
+ listRef?.scrollToSelectedItem();
44
+ });
48
45
  } else if (prevOpen) {
49
46
  prevOpen = false;
50
47
  tick().then(() => selectRef?.focus());
@@ -76,23 +73,36 @@ const onSelectKeydown = (event) => {
76
73
  switch (event.key) {
77
74
  case " ":
78
75
  {
79
- open = !open;
76
+ if (!open) {
77
+ open = true;
78
+ }
80
79
  event.preventDefault();
81
80
  event.stopPropagation();
81
+ return false;
82
82
  }
83
83
  break;
84
84
  case "ArrowUp":
85
85
  {
86
- listRef.selectPreviousItem();
86
+ if (selectedValue) {
87
+ listRef.selectPreviousItem();
88
+ } else {
89
+ listRef.selectLastItem();
90
+ }
87
91
  event.preventDefault();
88
92
  event.stopPropagation();
93
+ return false;
89
94
  }
90
95
  break;
91
96
  case "ArrowDown":
92
97
  {
93
- listRef.selectNextItem();
98
+ if (selectedValue) {
99
+ listRef.selectNextItem();
100
+ } else {
101
+ listRef.selectFirstItem();
102
+ }
94
103
  event.preventDefault();
95
104
  event.stopPropagation();
105
+ return false;
96
106
  }
97
107
  break;
98
108
  }
@@ -103,49 +113,46 @@ const onListKeydown = (event) => {
103
113
  switch (event.key) {
104
114
  case "Enter":
105
115
  {
106
- selectedIndex = pendingSelectedIndex;
116
+ selectedValue = pendingSelectedValue;
107
117
  open = !open;
108
118
  event.preventDefault();
109
119
  event.stopPropagation();
120
+ return false;
110
121
  }
111
122
  break;
112
123
  case "Escape":
113
124
  {
114
- pendingSelectedIndex = selectedIndex;
125
+ pendingSelectedValue = selectedValue;
115
126
  open = !open;
116
127
  event.preventDefault();
117
128
  event.stopPropagation();
129
+ return false;
118
130
  }
119
131
  break;
120
132
  }
121
133
  }
122
134
  };
123
135
  const onListClick = (event) => {
124
- if (!disabled && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) {
125
- selectedIndex = pendingSelectedIndex;
126
- open = false;
127
- event.preventDefault();
128
- event.stopPropagation();
129
- }
136
+ open = false;
137
+ event.preventDefault();
138
+ event.stopPropagation();
139
+ return false;
130
140
  };
131
- const onPendingItemSelected = (event) => {
132
- pendingSelectedIndex = event.detail.index;
141
+ const onListSelect = (event) => {
142
+ pendingSelectedValue = event.detail.value;
133
143
  if (!open) {
134
- selectedIndex = pendingSelectedIndex;
144
+ selectedValue = pendingSelectedValue;
135
145
  }
136
146
  };
137
147
  </script>
138
148
 
139
- <!--
140
- @component
141
- A single item that can be selected from a popup list of items.
142
- -->
143
149
  <div
144
150
  bind:this={selectRef}
145
151
  aria-controls={popupId}
146
152
  aria-haspopup="listbox"
147
153
  aria-expanded={open}
148
154
  class="sterling-select"
155
+ class:composed
149
156
  class:disabled
150
157
  role="combobox"
151
158
  tabindex="0"
@@ -175,29 +182,19 @@ A single item that can be selected from a popup list of items.
175
182
  on:keydown={onSelectKeydown}
176
183
  {...$$restProps}
177
184
  >
178
- {#if $$slots.label}
179
- <Label {disabled} for={inputId}>
180
- <!-- BUGBUG: Problem with slot let params conflict
181
- It seems that when a default slot is used multiple times in a module,
182
- the first time sets the possible let params.
183
- If we don't define the same let params on this label slot that
184
- is the default slot for label, then using the default slot for list
185
- will error saying the property is not defined.
186
- -->
187
- <slot name="label" index={0} item={undefined} selected={false} />
188
- </Label>
189
- {/if}
190
- <div class="input" id={inputId}>
191
- <div class="value">
192
- <slot name="value">
193
- {items[selectedIndex]}
194
- </slot>
195
- </div>
196
- <div class="button">
197
- <slot name="button" {open}>
198
- <div class="chevron" />
199
- </slot>
200
- </div>
185
+ <div class="value">
186
+ <slot name="value" {disabled} {open} {selectedValue}>
187
+ {#if selectedValue}
188
+ {selectedValue}
189
+ {:else}
190
+ <span>&nbsp;</span>
191
+ {/if}
192
+ </slot>
193
+ </div>
194
+ <div class="button">
195
+ <slot name="button" {open}>
196
+ <div class="chevron" />
197
+ </slot>
201
198
  </div>
202
199
  <div
203
200
  bind:this={popupRef}
@@ -207,88 +204,71 @@ A single item that can be selected from a popup list of items.
207
204
  style="left:{popupPosition.x}px; top:{popupPosition.y}px"
208
205
  >
209
206
  <div class="popup-content">
210
- <slot name="list">
211
- {#if $$slots.default}
212
- <List
213
- bind:this={listRef}
214
- selectedIndex={pendingSelectedIndex}
215
- {items}
216
- {disabled}
217
- on:click={onListClick}
218
- on:keydown={onListKeydown}
219
- on:itemSelected={onPendingItemSelected}
220
- >
221
- <svelte:fragment let:disabled let:index let:item let:selected>
222
- <slot {disabled} {index} {item} {selected} />
223
- </svelte:fragment>
224
- </List>
225
- {:else}
226
- <List
227
- bind:this={listRef}
228
- selectedIndex={pendingSelectedIndex}
229
- {items}
230
- {disabled}
231
- on:click={onListClick}
232
- on:keydown={onListKeydown}
233
- on:itemSelected={onPendingItemSelected}
234
- />
235
- {/if}
236
- </slot>
207
+ <List
208
+ bind:this={listRef}
209
+ {disabled}
210
+ selectedValue={pendingSelectedValue}
211
+ on:click={onListClick}
212
+ on:keydown={onListKeydown}
213
+ on:select={onListSelect}
214
+ tabIndex={open ? 0 : -1}
215
+ >
216
+ <slot />
217
+ </List>
237
218
  </div>
238
219
  </div>
239
220
  </div>
240
221
 
241
222
  <style>
242
223
  .sterling-select {
243
- background-color: var(--Input__background-color);
244
- border-color: var(--Input__border-color);
245
- border-radius: var(--Input__border-radius);
246
- border-style: var(--Input__border-style);
247
- border-width: var(--Input__border-width);
248
- color: var(--Input__color);
224
+ align-content: center;
225
+ align-items: center;
226
+ background-color: var(--stsv-Input__background-color);
227
+ border-color: var(--stsv-Input__border-color);
228
+ border-radius: var(--stsv-Input__border-radius);
229
+ border-style: var(--stsv-Input__border-style);
230
+ border-width: var(--stsv-Input__border-width);
231
+ color: var(--stsv-Input__color);
232
+ cursor: pointer;
233
+ display: grid;
234
+ grid-template-columns: 1fr auto;
235
+ grid-template-rows: auto;
236
+ outline: none;
249
237
  padding: 0;
250
238
  transition: background-color 250ms, color 250ms, border-color 250ms;
251
239
  }
252
240
 
253
241
  .sterling-select:hover {
254
- background-color: var(--Input__background-color--hover);
255
- border-color: var(--Input__border-color--hover);
256
- color: var(--Input__color--hover);
242
+ background-color: var(--stsv-Input__background-color--hover);
243
+ border-color: var(--stsv-Input__border-color--hover);
244
+ color: var(--stsv-Input__color--hover);
257
245
  }
258
246
 
259
- .sterling-select:focus-within {
260
- background-color: var(--Input__background-color--focus);
261
- border-color: var(--Input__border-color--focus);
262
- color: var(--Input__color--focus);
263
- outline-color: var(--Common__outline-color);
264
- outline-offset: var(--Common__outline-offset);
265
- outline-style: var(--Common__outline-style);
266
- outline-width: var(--Common__outline-width);
247
+ .sterling-select:focus {
248
+ background-color: var(--stsv-Input__background-color--focus);
249
+ border-color: var(--stsv-Input__border-color--focus);
250
+ color: var(--stsv-Input__color--focus);
251
+ outline-color: var(--stsv-Common__outline-color);
252
+ outline-offset: var(--stsv-Common__outline-offset);
253
+ outline-style: var(--stsv-Common__outline-style);
254
+ outline-width: var(--stsv-Common__outline-width);
267
255
  }
268
256
 
269
257
  .sterling-select.disabled {
270
- background-color: var(--Input__background-color--disabled);
271
- border-color: var(---Input__border-color--disabled);
272
- color: var(--Input__color--disabled);
258
+ background-color: var(--stsv-Common__background-color--disabled);
259
+ border-color: var(--stsv--Common__border-color--disabled);
260
+ color: var(--stsv-Common__color--disabled);
273
261
  cursor: not-allowed;
274
262
  outline: none;
275
263
  }
276
264
 
277
- .sterling-select > :global(label) {
278
- font-size: 0.7em;
279
- margin: 0.5em 0 0 0.7em;
280
- }
281
-
282
- .sterling-select > :global(label):empty {
283
- margin: 0;
284
- }
285
-
286
- .input {
287
- display: grid;
288
- grid-template-columns: 1fr auto;
289
- grid-template-rows: auto;
290
- align-content: center;
291
- align-items: center;
265
+ .sterling-select.composed,
266
+ .sterling-select.composed:hover,
267
+ .sterling-select.composed.focus,
268
+ .sterling-select.composed.disabled {
269
+ background: none;
270
+ border: none;
271
+ outline: none;
292
272
  }
293
273
 
294
274
  .value {
@@ -332,9 +312,11 @@ A single item that can be selected from a popup list of items.
332
312
  }
333
313
 
334
314
  .popup {
315
+ background-color: var(--stsv-Common__background-color);
335
316
  box-sizing: border-box;
336
317
  display: none;
337
- overflow: hidden;
318
+ overflow: visible;
319
+ outline: none;
338
320
  position: absolute;
339
321
  box-shadow: rgba(0, 0, 0, 0.4) 2px 2px 4px -1px;
340
322
  width: fit-content;