@geoffcox/sterling-svelte 0.0.15 → 0.0.17

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 (110) hide show
  1. package/@types/clickOutside.d.ts +9 -3
  2. package/{buttons/Button.svelte → Button.svelte} +27 -27
  3. package/{inputs/Checkbox.svelte → Checkbox.svelte} +16 -16
  4. package/{surfaces/Dialog.svelte → Dialog.svelte} +34 -21
  5. package/{inputs/Input.svelte → Input.svelte} +22 -22
  6. package/Label.svelte +52 -0
  7. package/Label.svelte.d.ts +42 -0
  8. package/List.constants.d.ts +1 -0
  9. package/List.constants.js +1 -0
  10. package/List.svelte +324 -0
  11. package/List.svelte.d.ts +69 -0
  12. package/List.types.d.ts +6 -0
  13. package/ListItem.svelte +90 -0
  14. package/ListItem.svelte.d.ts +51 -0
  15. package/Menu.svelte +115 -0
  16. package/Menu.svelte.d.ts +20 -0
  17. package/MenuBar.svelte +97 -0
  18. package/MenuBar.svelte.d.ts +43 -0
  19. package/MenuButton.svelte +102 -0
  20. package/MenuButton.svelte.d.ts +54 -0
  21. package/MenuItem.svelte +338 -0
  22. package/MenuItem.svelte.d.ts +61 -0
  23. package/MenuItemDisplay.svelte +97 -0
  24. package/MenuItemDisplay.svelte.d.ts +21 -0
  25. package/MenuSeparator.svelte +42 -0
  26. package/MenuSeparator.svelte.d.ts +76 -0
  27. package/Menus.constants.d.ts +2 -0
  28. package/Menus.constants.js +2 -0
  29. package/Menus.types.d.ts +22 -0
  30. package/Menus.utils.d.ts +5 -0
  31. package/Menus.utils.js +20 -0
  32. package/Portal.svelte +14 -0
  33. package/Portal.svelte.d.ts +21 -0
  34. package/{display/Progress.svelte → Progress.svelte} +14 -14
  35. package/{inputs/Radio.svelte → Radio.svelte} +15 -15
  36. package/{inputs/Select.svelte → Select.svelte} +96 -102
  37. package/{inputs/Select.svelte.d.ts → Select.svelte.d.ts} +20 -25
  38. package/{inputs/Slider.svelte → Slider.svelte} +49 -24
  39. package/{inputs/Slider.svelte.d.ts → Slider.svelte.d.ts} +25 -0
  40. package/{inputs/Switch.svelte → Switch.svelte} +38 -38
  41. package/Tab.svelte +181 -0
  42. package/{containers/Tab.svelte.d.ts → Tab.svelte.d.ts} +12 -15
  43. package/TabList.svelte +247 -0
  44. package/{containers/TabList.svelte.d.ts → TabList.svelte.d.ts} +21 -21
  45. package/TabList.types.d.ts +7 -0
  46. package/{inputs/TextArea.svelte → TextArea.svelte} +23 -23
  47. package/TextArea.types.js +1 -0
  48. package/Tooltip.svelte +182 -0
  49. package/Tooltip.svelte.d.ts +24 -0
  50. package/Tooltip.types.d.ts +3 -0
  51. package/Tooltip.types.js +1 -0
  52. package/Tree.constants.d.ts +2 -0
  53. package/Tree.constants.js +2 -0
  54. package/Tree.svelte +142 -0
  55. package/Tree.svelte.d.ts +25 -0
  56. package/Tree.types.d.ts +28 -0
  57. package/Tree.types.js +1 -0
  58. package/{containers/TreeChevron.svelte → TreeChevron.svelte} +3 -3
  59. package/TreeItem.svelte +276 -0
  60. package/TreeItem.svelte.d.ts +65 -0
  61. package/{containers/TreeItem.svelte → TreeItemDisplay.svelte} +18 -18
  62. package/{containers/TreeItem.svelte.d.ts → TreeItemDisplay.svelte.d.ts} +11 -14
  63. package/{clickOutside.js → actions/clickOutside.js} +3 -1
  64. package/actions/forwardEvents.d.ts +12 -0
  65. package/actions/forwardEvents.js +32 -0
  66. package/actions/portal.d.ts +8 -0
  67. package/actions/portal.js +19 -0
  68. package/index.d.ts +42 -24
  69. package/index.js +39 -19
  70. package/package.json +45 -29
  71. package/theme/darkTheme.js +66 -74
  72. package/theme/lightTheme.js +66 -74
  73. package/containers/List.svelte +0 -249
  74. package/containers/List.svelte.d.ts +0 -68
  75. package/containers/ListItem.svelte +0 -48
  76. package/containers/ListItem.svelte.d.ts +0 -26
  77. package/containers/Tab.svelte +0 -327
  78. package/containers/TabList.svelte +0 -126
  79. package/containers/Tabs.types.d.ts +0 -12
  80. package/containers/Tree.constants.d.ts +0 -2
  81. package/containers/Tree.constants.js +0 -2
  82. package/containers/Tree.svelte +0 -222
  83. package/containers/Tree.svelte.d.ts +0 -50
  84. package/containers/Tree.types.d.ts +0 -47
  85. package/containers/TreeNode.svelte +0 -267
  86. package/containers/TreeNode.svelte.d.ts +0 -43
  87. package/display/Label.svelte +0 -27
  88. package/display/Label.svelte.d.ts +0 -20
  89. package/surfaces/CloseX.svelte +0 -5
  90. package/surfaces/CloseX.svelte.d.ts +0 -23
  91. /package/{buttons/Button.svelte.d.ts → Button.svelte.d.ts} +0 -0
  92. /package/{buttons/Button.types.d.ts → Button.types.d.ts} +0 -0
  93. /package/{buttons/Button.types.js → Button.types.js} +0 -0
  94. /package/{inputs/Checkbox.svelte.d.ts → Checkbox.svelte.d.ts} +0 -0
  95. /package/{surfaces/Dialog.svelte.d.ts → Dialog.svelte.d.ts} +0 -0
  96. /package/{inputs/Input.svelte.d.ts → Input.svelte.d.ts} +0 -0
  97. /package/{containers/Tabs.types.js → List.types.js} +0 -0
  98. /package/{containers/Tree.types.js → Menus.types.js} +0 -0
  99. /package/{display/Progress.svelte.d.ts → Progress.svelte.d.ts} +0 -0
  100. /package/{display/Progress.types.d.ts → Progress.types.d.ts} +0 -0
  101. /package/{display/Progress.types.js → Progress.types.js} +0 -0
  102. /package/{inputs/Radio.svelte.d.ts → Radio.svelte.d.ts} +0 -0
  103. /package/{inputs/Switch.svelte.d.ts → Switch.svelte.d.ts} +0 -0
  104. /package/{containers/Tabs.constants.d.ts → TabList.constants.d.ts} +0 -0
  105. /package/{containers/Tabs.constants.js → TabList.constants.js} +0 -0
  106. /package/{inputs/TextArea.types.js → TabList.types.js} +0 -0
  107. /package/{inputs/TextArea.svelte.d.ts → TextArea.svelte.d.ts} +0 -0
  108. /package/{inputs/TextArea.types.d.ts → TextArea.types.d.ts} +0 -0
  109. /package/{containers/TreeChevron.svelte.d.ts → TreeChevron.svelte.d.ts} +0 -0
  110. /package/{clickOutside.d.ts → actions/clickOutside.d.ts} +0 -0
@@ -1,249 +0,0 @@
1
- <script>import { createEventDispatcher } from "svelte";
2
- import { v4 as uuid } from "uuid";
3
- import Label from "../display/Label.svelte";
4
- import ListItem from "./ListItem.svelte";
5
- export let disabled = false;
6
- export let items = [];
7
- export let horizontal = false;
8
- export let selectedIndex = -1;
9
- export let selectedItem = void 0;
10
- export let composed = false;
11
- $: {
12
- selectedItem = items[selectedIndex];
13
- }
14
- const inputId = uuid();
15
- let listRef;
16
- let itemRefs = {};
17
- const dispatch = createEventDispatcher();
18
- const raiseItemSelected = (index) => {
19
- dispatch("itemSelected", { index, item: items[index] });
20
- };
21
- export const focusSelectedItem = () => {
22
- listRef.focus();
23
- const selectedRef = itemRefs[selectedIndex];
24
- selectedRef?.focus();
25
- selectedRef?.scrollIntoView({ behavior: "smooth", block: "nearest", inline: "nearest" });
26
- };
27
- $:
28
- canSelectPreviousItem = items.length > 0 && selectedIndex !== 0;
29
- $:
30
- canSelectNextItem = items.length > 0 && selectedIndex !== items.length - 1;
31
- export const selectPreviousItem = () => {
32
- if (canSelectPreviousItem) {
33
- selectedIndex = Math.max(0, selectedIndex - 1);
34
- }
35
- };
36
- export const selectNextItem = () => {
37
- if (canSelectNextItem) {
38
- selectedIndex = Math.min(items.length - 1, selectedIndex + 1);
39
- }
40
- };
41
- export const selectItem = (item) => {
42
- const index = items.indexOf(item);
43
- if (index !== -1) {
44
- selectedIndex = index;
45
- }
46
- };
47
- $: {
48
- raiseItemSelected(selectedIndex);
49
- }
50
- $: {
51
- const selectedRef = itemRefs[selectedIndex];
52
- selectedRef?.scrollIntoView({ behavior: "smooth", block: "nearest", inline: "nearest" });
53
- }
54
- const onItemClick = (index) => {
55
- if (!disabled) {
56
- selectedIndex = index;
57
- }
58
- };
59
- const onArrowSelectPrevious = (event) => {
60
- event.preventDefault();
61
- event.stopPropagation();
62
- selectPreviousItem();
63
- };
64
- const onArrowSelectNext = (event) => {
65
- event.preventDefault();
66
- event.stopPropagation();
67
- selectNextItem();
68
- };
69
- const onKeydown = (event) => {
70
- if (!disabled && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) {
71
- switch (event.key) {
72
- case "ArrowLeft":
73
- if (horizontal) {
74
- onArrowSelectPrevious(event);
75
- }
76
- break;
77
- case "ArrowRight":
78
- if (horizontal) {
79
- onArrowSelectNext(event);
80
- }
81
- break;
82
- case "ArrowUp":
83
- if (!horizontal) {
84
- onArrowSelectPrevious(event);
85
- }
86
- break;
87
- case "ArrowDown":
88
- if (!horizontal) {
89
- onArrowSelectNext(event);
90
- }
91
- break;
92
- default:
93
- break;
94
- }
95
- }
96
- };
97
- </script>
98
-
99
- <!--
100
- @component
101
- A list of items where a single item can be selected.
102
- -->
103
- <!-- svelte-ignore a11y-no-noninteractive-tabindex -->
104
- <div class="sterling-list" class:horizontal class:disabled class:composed tabindex={0}>
105
- {#if $$slots.label}
106
- <Label {disabled} for={inputId}>
107
- <slot name="label" />
108
- </Label>
109
- {/if}
110
- <div
111
- bind:this={listRef}
112
- class="list"
113
- class:disabled
114
- class:horizontal
115
- role="listbox"
116
- tabindex={!disabled ? 0 : undefined}
117
- on:blur
118
- on:click
119
- on:copy
120
- on:cut
121
- on:dblclick
122
- on:focus
123
- on:focusin
124
- on:focusout
125
- on:keydown={onKeydown}
126
- on:keydown
127
- on:keypress
128
- on:keyup
129
- on:mousedown
130
- on:mouseenter
131
- on:mouseleave
132
- on:mousemove
133
- on:mouseover
134
- on:mouseout
135
- on:mouseup
136
- on:scroll
137
- on:wheel
138
- on:paste
139
- {...$$restProps}
140
- >
141
- {#each items as item, index (item)}
142
- {@const selected = selectedIndex === index}
143
- <!-- svelte-ignore a11y-click-events-have-key-events -->
144
- <div
145
- bind:this={itemRefs[index]}
146
- aria-selected={disabled ? undefined : selected}
147
- class="list-item"
148
- data-index={index + 1}
149
- role="option"
150
- on:click={() => onItemClick(index)}
151
- >
152
- <slot name="item" {disabled} {index} {item} {selected}>
153
- <ListItem {disabled} {selected} {index} {item}>
154
- <slot {disabled} {index} {item} {selected}>
155
- {item}
156
- </slot>
157
- </ListItem>
158
- </slot>
159
- </div>
160
- {/each}
161
- </div>
162
- </div>
163
-
164
- <style>
165
- .sterling-list {
166
- background-color: var(--Common__background-color);
167
- border-color: var(--Common__border-color);
168
- border-radius: var(--Common__border-radius);
169
- border-style: var(--Common__border-style);
170
- border-width: var(--Common__border-width);
171
- box-sizing: border-box;
172
- color: var(--Common__color);
173
- display: grid;
174
- grid-template-columns: 1fr;
175
- grid-template-rows: auto 1fr;
176
- height: 100%;
177
- margin: 0;
178
- overflow: hidden;
179
- padding: 0;
180
- transition: background-color 250ms, color 250ms, border-color 250ms;
181
- }
182
-
183
- .sterling-list.horizontal {
184
- height: unset;
185
- width: 100%;
186
- }
187
-
188
- .sterling-list:hover {
189
- border-color: var(--Common__border-color--hover);
190
- color: var(--Common__color--hover);
191
- }
192
-
193
- .sterling-list:focus-within {
194
- border-color: var(--Common__border-color--focus);
195
- color: var(--Common__color--focus);
196
- outline-color: var(--Common__outline-color);
197
- outline-offset: var(--Common__outline-offset);
198
- outline-style: var(--Common__outline-style);
199
- outline-width: var(--Common__outline-width);
200
- }
201
-
202
- .sterling-list.disabled {
203
- background-color: var(--Common__background-color--disabled);
204
- border-color: var(---Common__border-color--disabled);
205
- color: var(--Common__color--disabled);
206
- cursor: not-allowed;
207
- }
208
-
209
- .sterling-list.composed,
210
- .sterling-list:hover.composed,
211
- .sterling-list:focus-visible.composed,
212
- .sterling-list.disabled.composed {
213
- background: none;
214
- border: none;
215
- outline: none;
216
- }
217
-
218
- .list {
219
- display: flex;
220
- flex-direction: column;
221
- flex-wrap: nowrap;
222
- grid-row: 2 / span 1;
223
- overflow-x: hidden;
224
- overflow-y: scroll;
225
- outline: none;
226
- position: relative;
227
- }
228
-
229
- .list.horizontal {
230
- flex-direction: row;
231
- overflow-x: scroll;
232
- overflow-y: hidden;
233
- }
234
-
235
- .sterling-list > :global(label) {
236
- font-size: 0.7em;
237
- margin: 0.5em 0.7em;
238
- }
239
-
240
- .sterling-list > :global(label):empty {
241
- margin: 0;
242
- }
243
-
244
- @media (prefers-reduced-motion) {
245
- .sterling-list {
246
- transition: none;
247
- }
248
- }
249
- </style>
@@ -1,68 +0,0 @@
1
- import { SvelteComponentTyped } from "svelte";
2
- declare class __sveltets_Render<T> {
3
- props(): {
4
- [x: string]: any;
5
- disabled?: boolean | undefined;
6
- items?: T[] | undefined;
7
- horizontal?: boolean | undefined;
8
- selectedIndex?: number | undefined;
9
- selectedItem?: T | undefined;
10
- composed?: boolean | undefined;
11
- focusSelectedItem?: (() => void) | undefined;
12
- selectPreviousItem?: (() => void) | undefined;
13
- selectNextItem?: (() => void) | undefined;
14
- selectItem?: ((item: T) => void) | 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
- itemSelected: CustomEvent<any>;
39
- } & {
40
- [evt: string]: CustomEvent<any>;
41
- };
42
- slots(): {
43
- label: {};
44
- item: {
45
- disabled: boolean;
46
- index: any;
47
- item: T;
48
- selected: any;
49
- };
50
- default: {
51
- disabled: boolean;
52
- index: any;
53
- item: T;
54
- selected: any;
55
- };
56
- };
57
- }
58
- export type ListProps<T> = ReturnType<__sveltets_Render<T>['props']>;
59
- export type ListEvents<T> = ReturnType<__sveltets_Render<T>['events']>;
60
- export type ListSlots<T> = ReturnType<__sveltets_Render<T>['slots']>;
61
- /** A list of items where a single item can be selected. */
62
- export default class List<T> extends SvelteComponentTyped<ListProps<T>, ListEvents<T>, ListSlots<T>> {
63
- get focusSelectedItem(): () => void;
64
- get selectPreviousItem(): () => void;
65
- get selectNextItem(): () => void;
66
- get selectItem(): (item: T) => void;
67
- }
68
- export {};
@@ -1,48 +0,0 @@
1
- <script>export let disabled = false;
2
- export let selected = false;
3
- export let index = -1;
4
- export let item = void 0;
5
- </script>
6
-
7
- <div
8
- aria-selected={disabled ? undefined : selected}
9
- class="sterling-list-item"
10
- class:disabled
11
- class:selected
12
- >
13
- <slot {disabled} {selected} {index} {item} />
14
- </div>
15
-
16
- <style>
17
- .sterling-list-item {
18
- background-color: transparent;
19
- box-sizing: border-box;
20
- color: var(--Input__color);
21
- margin: 0;
22
- padding: 0.5em;
23
- outline: none;
24
- text-overflow: ellipsis;
25
- transition: background-color 250ms, color 250ms, border-color 250ms;
26
- white-space: nowrap;
27
- }
28
-
29
- .sterling-list-item:hover {
30
- background-color: var(--Button__background-color--hover);
31
- color: var(--Button__color--hover);
32
- }
33
-
34
- .sterling-list-item.selected {
35
- background-color: var(--Input__background-color--selected);
36
- color: var(--Input__color--selected);
37
- }
38
-
39
- .sterling-list-item.disabled {
40
- color: var(--Input__color--disabled);
41
- }
42
-
43
- @media (prefers-reduced-motion) {
44
- .sterling-list-item {
45
- transition: none;
46
- }
47
- }
48
- </style>
@@ -1,26 +0,0 @@
1
- import { SvelteComponentTyped } from "svelte";
2
- declare class __sveltets_Render<T> {
3
- props(): {
4
- disabled?: boolean | undefined;
5
- selected?: boolean | undefined;
6
- index?: number | undefined;
7
- item?: T | undefined;
8
- };
9
- events(): {} & {
10
- [evt: string]: CustomEvent<any>;
11
- };
12
- slots(): {
13
- default: {
14
- disabled: boolean;
15
- selected: boolean;
16
- index: number;
17
- item: T | undefined;
18
- };
19
- };
20
- }
21
- export type ListItemProps<T> = ReturnType<__sveltets_Render<T>['props']>;
22
- export type ListItemEvents<T> = ReturnType<__sveltets_Render<T>['events']>;
23
- export type ListItemSlots<T> = ReturnType<__sveltets_Render<T>['slots']>;
24
- export default class ListItem<T> extends SvelteComponentTyped<ListItemProps<T>, ListItemEvents<T>, ListItemSlots<T>> {
25
- }
26
- export {};
@@ -1,327 +0,0 @@
1
- <script>import { getContext } from "svelte";
2
- import { tabListContextKey } from "./Tabs.constants";
3
- export let data = void 0;
4
- export let disabled = false;
5
- export let tabId = void 0;
6
- export let text = void 0;
7
- export let selected = false;
8
- let tabRef;
9
- const {
10
- disabled: tabListDisabled,
11
- selectedTabId,
12
- selectionFollowsFocus,
13
- vertical
14
- } = getContext(tabListContextKey);
15
- $:
16
- _tabId = tabId || data?.tabId;
17
- $:
18
- _text = text || data?.text || _tabId;
19
- $:
20
- _disabled = $tabListDisabled || disabled || data?.disabled === true;
21
- $: {
22
- if (!_tabId) {
23
- throw new Error("Both tabId and data.tabId are missing");
24
- }
25
- }
26
- $: {
27
- selected = $selectedTabId === _tabId;
28
- }
29
- $: {
30
- if (selected) {
31
- selectedTabId.set(_tabId);
32
- tabRef?.focus();
33
- }
34
- }
35
- const getFirstActiveTab = () => {
36
- let foundTab = tabRef.parentElement?.firstElementChild;
37
- while (foundTab) {
38
- if (!foundTab.disabled && foundTab.getAttribute("data-tab-id")) {
39
- break;
40
- }
41
- foundTab = foundTab.nextElementSibling;
42
- }
43
- return foundTab;
44
- };
45
- const getLastActiveTab = () => {
46
- let foundTab = tabRef.parentElement?.lastElementChild;
47
- while (foundTab) {
48
- if (!foundTab.disabled && foundTab.getAttribute("data-tab-id")) {
49
- break;
50
- }
51
- foundTab = foundTab.previousElementSibling;
52
- }
53
- return foundTab;
54
- };
55
- const getPreviousActiveTab = () => {
56
- let foundTab = tabRef?.previousElementSibling;
57
- while (foundTab) {
58
- if (!foundTab.disabled && foundTab.getAttribute("data-tab-id")) {
59
- break;
60
- }
61
- foundTab = foundTab.previousElementSibling;
62
- }
63
- return foundTab;
64
- };
65
- const getNextActiveTab = () => {
66
- let foundTab = tabRef?.nextElementSibling;
67
- while (foundTab) {
68
- if (!foundTab.disabled && foundTab.getAttribute("data-tab-id")) {
69
- break;
70
- }
71
- foundTab = foundTab.nextElementSibling;
72
- }
73
- return foundTab;
74
- };
75
- const focusFirstTab = () => {
76
- if (!_disabled) {
77
- let foundTab = getFirstActiveTab();
78
- if (foundTab) {
79
- foundTab.focus();
80
- return true;
81
- }
82
- }
83
- return false;
84
- };
85
- const focusLastTab = () => {
86
- if (!_disabled) {
87
- let foundTab = getLastActiveTab();
88
- if (foundTab) {
89
- foundTab.focus();
90
- return true;
91
- }
92
- }
93
- return false;
94
- };
95
- const focusPreviousTab = () => {
96
- if (!_disabled) {
97
- let foundTab = getPreviousActiveTab();
98
- if (foundTab) {
99
- foundTab.focus();
100
- return true;
101
- }
102
- }
103
- return false;
104
- };
105
- const focusNextTab = () => {
106
- if (!_disabled) {
107
- let foundTab = getNextActiveTab();
108
- if (foundTab) {
109
- foundTab.focus();
110
- return true;
111
- }
112
- }
113
- return false;
114
- };
115
- const onClick = (event) => {
116
- if (!_disabled) {
117
- selectedTabId.set(_tabId);
118
- }
119
- };
120
- const onFocus = (event) => {
121
- if (!_disabled && $selectionFollowsFocus) {
122
- selectedTabId.set(_tabId);
123
- }
124
- };
125
- const onKeydown = (event) => {
126
- if (!_disabled && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) {
127
- switch (event.key) {
128
- case "Home":
129
- if (focusFirstTab()) {
130
- event.preventDefault();
131
- return false;
132
- }
133
- break;
134
- case "End":
135
- if (focusLastTab()) {
136
- event.preventDefault();
137
- return false;
138
- }
139
- break;
140
- case "ArrowLeft":
141
- if (!$vertical && focusPreviousTab()) {
142
- event.preventDefault();
143
- return false;
144
- }
145
- break;
146
- case "ArrowRight":
147
- if (!$vertical && focusNextTab()) {
148
- event.preventDefault();
149
- return false;
150
- }
151
- break;
152
- case "ArrowUp":
153
- if ($vertical && focusPreviousTab()) {
154
- event.preventDefault();
155
- return false;
156
- }
157
- break;
158
- case "ArrowDown":
159
- if ($vertical && focusNextTab()) {
160
- event.preventDefault();
161
- return false;
162
- }
163
- break;
164
- default:
165
- break;
166
- }
167
- }
168
- };
169
- </script>
170
-
171
- <button
172
- bind:this={tabRef}
173
- class="sterling-tab"
174
- disabled={_disabled}
175
- class:selected
176
- class:vertical={$vertical}
177
- data-tab-id={_tabId}
178
- role="tab"
179
- tabindex={selected ? 0 : -1}
180
- type="button"
181
- on:blur
182
- on:click={onClick}
183
- on:click
184
- on:dblclick
185
- on:focus={onFocus}
186
- on:focus
187
- on:focusin
188
- on:focusout
189
- on:keydown={onKeydown}
190
- on:keydown
191
- on:keypress
192
- on:keyup
193
- on:mousedown
194
- on:mouseenter
195
- on:mouseleave
196
- on:mousemove
197
- on:mouseover
198
- on:mouseout
199
- on:mouseup
200
- on:pointercancel
201
- on:pointerdown
202
- on:pointerenter
203
- on:pointerleave
204
- on:pointermove
205
- on:pointerover
206
- on:pointerout
207
- on:pointerup
208
- on:wheel
209
- >
210
- <div class="content">
211
- <slot {data} disabled={_disabled} {selected} tabId={_tabId} text={_text}>
212
- <div class="text">
213
- {_text || _tabId}
214
- </div>
215
- </slot>
216
- </div>
217
- <div class="indicator" />
218
- </button>
219
-
220
- <style>
221
- .sterling-tab {
222
- align-content: center;
223
- align-items: center;
224
- background-color: var(--Common__background-color);
225
- border-color: transparent;
226
- border-radius: var(--Button__border-radius);
227
- border-style: var(--Common__border-style);
228
- border-width: 0;
229
- box-sizing: border-box;
230
- color: var(--Common__color);
231
- cursor: pointer;
232
- display: grid;
233
- font: inherit;
234
- overflow: hidden;
235
- padding: 0.5em 1em 0.25em 1em;
236
- text-decoration: none;
237
- text-overflow: ellipsis;
238
- transition: background-color 250ms, color 250ms, border-color 250ms;
239
- white-space: nowrap;
240
- }
241
-
242
- .sterling-tab:not(.vertical) {
243
- grid-template-columns: 1fr;
244
- grid-template-rows: 1fr 1em;
245
- justify-content: center;
246
- justify-items: center;
247
- row-gap: 0.15em;
248
- }
249
-
250
- .sterling-tab.vertical {
251
- grid-template-columns: auto 1em;
252
- grid-template-rows: 1fr;
253
- align-content: center;
254
- align-items: center;
255
- justify-content: flex-end;
256
- justify-items: flex-end;
257
- column-gap: 0.15em;
258
- }
259
-
260
- .sterling-tab:hover {
261
- background-color: var(--Common__background-color--hover);
262
- color: var(--Common__color--hover);
263
- }
264
-
265
- .sterling-tab:active {
266
- background-color: var(--Common__background-color--active);
267
- color: var(--Common__color--active);
268
- }
269
-
270
- .sterling-tab:focus-visible {
271
- outline-color: var(--Common__outline-color);
272
- outline-offset: var(--Common__outline-offset);
273
- outline-style: var(--Common__outline-style);
274
- outline-width: var(--Common__outline-width);
275
- }
276
-
277
- .sterling-tab:disabled {
278
- color: var(--Common__color--disabled);
279
- cursor: not-allowed;
280
- }
281
-
282
- .content {
283
- padding: 0 0.2em;
284
- }
285
-
286
- .sterling-tab.vertical .content .text {
287
- padding-top: 0.25em;
288
- }
289
-
290
- .indicator {
291
- background-color: transparent;
292
- border-radius: 10000px;
293
- transition: background-color 250ms;
294
- }
295
-
296
- .sterling-tab:not(.vertical) .indicator {
297
- justify-self: stretch;
298
- height: 0.4em;
299
- }
300
-
301
- .sterling-tab.vertical .indicator {
302
- align-self: stretch;
303
- width: 0.4em;
304
- }
305
-
306
- .sterling-tab:hover .indicator {
307
- background-color: var(--Display__color--faint);
308
- }
309
-
310
- .sterling-tab:active .indicator {
311
- background-color: var(--Button__border-color--hover);
312
- }
313
-
314
- .sterling-tab:disabled .indicator,
315
- .sterling-tab:disabled:hover .indicator,
316
- .sterling-tab:disabled:active .indicator {
317
- background-color: transparent;
318
- }
319
-
320
- .sterling-tab.selected .indicator {
321
- background-color: var(--Input__color);
322
- }
323
-
324
- .sterling-tab.selected:disabled .indicator {
325
- background-color: var(--Input__color--disabled);
326
- }
327
- </style>