@geoffcox/sterling-svelte 1.0.12 → 2.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 (219) hide show
  1. package/dist/Button.svelte +8 -46
  2. package/dist/Button.svelte.d.ts +9 -65
  3. package/dist/Callout.svelte +47 -72
  4. package/dist/Callout.svelte.d.ts +14 -55
  5. package/dist/Callout.types.d.ts +11 -0
  6. package/dist/Checkbox.svelte +12 -48
  7. package/dist/Checkbox.svelte.d.ts +9 -62
  8. package/dist/Dialog.svelte +30 -38
  9. package/dist/Dialog.svelte.d.ts +13 -36
  10. package/dist/Dropdown.svelte +39 -71
  11. package/dist/Dropdown.svelte.d.ts +17 -76
  12. package/dist/Input.svelte +16 -50
  13. package/dist/Input.svelte.d.ts +12 -74
  14. package/dist/Label.svelte +55 -161
  15. package/dist/Label.svelte.d.ts +16 -81
  16. package/dist/Link.svelte +9 -41
  17. package/dist/Link.svelte.d.ts +11 -64
  18. package/dist/List.svelte +35 -85
  19. package/dist/List.svelte.d.ts +19 -74
  20. package/dist/List.types.d.ts +3 -11
  21. package/dist/ListItem.svelte +27 -56
  22. package/dist/ListItem.svelte.d.ts +12 -66
  23. package/dist/Menu.svelte +18 -45
  24. package/dist/Menu.svelte.d.ts +13 -63
  25. package/dist/MenuBar.svelte +36 -78
  26. package/dist/MenuBar.svelte.d.ts +12 -57
  27. package/dist/MenuButton.svelte +56 -85
  28. package/dist/MenuButton.svelte.d.ts +19 -70
  29. package/dist/MenuItem.svelte +107 -151
  30. package/dist/MenuItem.svelte.d.ts +21 -82
  31. package/dist/MenuItem.types.d.ts +1 -9
  32. package/dist/MenuSeparator.svelte +9 -7
  33. package/dist/MenuSeparator.svelte.d.ts +6 -20
  34. package/dist/Popover.svelte +45 -64
  35. package/dist/Popover.svelte.d.ts +14 -58
  36. package/dist/Progress.constants.d.ts +1 -1
  37. package/dist/Progress.constants.js +1 -1
  38. package/dist/Progress.svelte +24 -71
  39. package/dist/Progress.svelte.d.ts +11 -60
  40. package/dist/Progress.types.d.ts +3 -3
  41. package/dist/Radio.svelte +19 -92
  42. package/dist/Radio.svelte.d.ts +11 -63
  43. package/dist/Select.svelte +55 -94
  44. package/dist/Select.svelte.d.ts +19 -82
  45. package/dist/Slider.svelte +41 -98
  46. package/dist/Slider.svelte.d.ts +18 -65
  47. package/dist/Switch.svelte +29 -78
  48. package/dist/Switch.svelte.d.ts +20 -73
  49. package/dist/Tab.svelte +23 -66
  50. package/dist/Tab.svelte.d.ts +11 -70
  51. package/dist/TabList.svelte +50 -76
  52. package/dist/TabList.svelte.d.ts +17 -69
  53. package/dist/TabList.types.d.ts +3 -11
  54. package/dist/TextArea.svelte +17 -59
  55. package/dist/TextArea.svelte.d.ts +18 -68
  56. package/dist/Tooltip.svelte +23 -66
  57. package/dist/Tooltip.svelte.d.ts +9 -69
  58. package/dist/Tree.svelte +32 -83
  59. package/dist/Tree.svelte.d.ts +14 -66
  60. package/dist/Tree.types.d.ts +3 -11
  61. package/dist/TreeChevron.svelte +10 -49
  62. package/dist/TreeChevron.svelte.d.ts +8 -52
  63. package/dist/TreeItem.svelte +105 -159
  64. package/dist/TreeItem.svelte.d.ts +21 -100
  65. package/dist/TreeItem.types.d.ts +2 -12
  66. package/dist/actions/clickOutside.d.ts +1 -0
  67. package/dist/actions/clickOutside.js +1 -0
  68. package/dist/actions/extraClass.d.ts +8 -0
  69. package/dist/actions/extraClass.js +14 -0
  70. package/dist/index.d.ts +4 -12
  71. package/dist/index.js +3 -9
  72. package/package.json +20 -22
  73. package/dist/Button.constants.d.ts +0 -2
  74. package/dist/Button.constants.js +0 -2
  75. package/dist/Button.types.d.ts +0 -6
  76. package/dist/ColorPicker.constants.d.ts +0 -1
  77. package/dist/ColorPicker.constants.js +0 -1
  78. package/dist/ColorPicker.svelte +0 -287
  79. package/dist/ColorPicker.svelte.d.ts +0 -52
  80. package/dist/ColorPicker.types.d.ts +0 -4
  81. package/dist/ColorPicker.types.js +0 -1
  82. package/dist/HexColorSliders.svelte +0 -103
  83. package/dist/HexColorSliders.svelte.d.ts +0 -51
  84. package/dist/HslColorSliders.svelte +0 -128
  85. package/dist/HslColorSliders.svelte.d.ts +0 -51
  86. package/dist/Label.types.d.ts +0 -6
  87. package/dist/Label.types.js +0 -1
  88. package/dist/MenuItemDisplay.svelte +0 -32
  89. package/dist/MenuItemDisplay.svelte.d.ts +0 -39
  90. package/dist/RgbColorSliders.svelte +0 -93
  91. package/dist/RgbColorSliders.svelte.d.ts +0 -24
  92. package/dist/TreeItemDisplay.svelte +0 -74
  93. package/dist/TreeItemDisplay.svelte.d.ts +0 -73
  94. package/dist/css/Button.base.css +0 -54
  95. package/dist/css/Button.colorful.css +0 -17
  96. package/dist/css/Button.css +0 -8
  97. package/dist/css/Button.disabled.css +0 -22
  98. package/dist/css/Button.secondary.colorful.css +0 -15
  99. package/dist/css/Button.secondary.css +0 -11
  100. package/dist/css/Button.shapes.css +0 -14
  101. package/dist/css/Button.tool.colorful.css +0 -13
  102. package/dist/css/Button.tool.css +0 -18
  103. package/dist/css/Callout.base.css +0 -55
  104. package/dist/css/Callout.colorful.css +0 -5
  105. package/dist/css/Callout.css +0 -2
  106. package/dist/css/Checkbox.base.css +0 -121
  107. package/dist/css/Checkbox.colorful.css +0 -17
  108. package/dist/css/Checkbox.css +0 -3
  109. package/dist/css/Checkbox.disabled.css +0 -28
  110. package/dist/css/ColorPicker.base.css +0 -23
  111. package/dist/css/ColorPicker.css +0 -1
  112. package/dist/css/Dialog.base.css +0 -114
  113. package/dist/css/Dialog.css +0 -1
  114. package/dist/css/Dropdown.base.css +0 -105
  115. package/dist/css/Dropdown.colorful.css +0 -23
  116. package/dist/css/Dropdown.composed.css +0 -11
  117. package/dist/css/Dropdown.css +0 -4
  118. package/dist/css/Dropdown.disabled.css +0 -32
  119. package/dist/css/HexColorSliders.base.css +0 -87
  120. package/dist/css/HexColorSliders.css +0 -1
  121. package/dist/css/HslColorSliders.base.css +0 -105
  122. package/dist/css/HslColorSliders.css +0 -1
  123. package/dist/css/Input.base.css +0 -72
  124. package/dist/css/Input.colorful.css +0 -22
  125. package/dist/css/Input.composed.css +0 -12
  126. package/dist/css/Input.css +0 -4
  127. package/dist/css/Input.disabled.css +0 -24
  128. package/dist/css/Label.base.css +0 -114
  129. package/dist/css/Label.boxed.colorful.css +0 -21
  130. package/dist/css/Label.boxed.css +0 -31
  131. package/dist/css/Label.colorful.css +0 -3
  132. package/dist/css/Label.css +0 -5
  133. package/dist/css/Label.disabled.css +0 -9
  134. package/dist/css/Link.base.css +0 -43
  135. package/dist/css/Link.colorful.css +0 -15
  136. package/dist/css/Link.css +0 -11
  137. package/dist/css/Link.disabled.css +0 -10
  138. package/dist/css/Link.ghost.colorful.css +0 -7
  139. package/dist/css/Link.ghost.css +0 -11
  140. package/dist/css/Link.text-underline.css +0 -8
  141. package/dist/css/Link.text-underline.ghost.css +0 -13
  142. package/dist/css/Link.undecorated.colorful.css +0 -8
  143. package/dist/css/Link.undecorated.css +0 -8
  144. package/dist/css/Link.undecorated.ghost.css +0 -8
  145. package/dist/css/Link.undecorated.underline.css +0 -8
  146. package/dist/css/List.base.css +0 -84
  147. package/dist/css/List.composed.css +0 -8
  148. package/dist/css/List.css +0 -3
  149. package/dist/css/List.disabled.css +0 -7
  150. package/dist/css/ListItem.base.css +0 -33
  151. package/dist/css/ListItem.css +0 -2
  152. package/dist/css/ListItem.disabled.css +0 -28
  153. package/dist/css/Menu.base.css +0 -21
  154. package/dist/css/Menu.css +0 -1
  155. package/dist/css/MenuBar.base.css +0 -9
  156. package/dist/css/MenuBar.css +0 -1
  157. package/dist/css/MenuButton.base.css +0 -13
  158. package/dist/css/MenuButton.css +0 -1
  159. package/dist/css/MenuItem.base.css +0 -48
  160. package/dist/css/MenuItem.css +0 -1
  161. package/dist/css/MenuItemDisplay.base.css +0 -79
  162. package/dist/css/MenuItemDisplay.css +0 -2
  163. package/dist/css/MenuItemDisplay.disabled.css +0 -28
  164. package/dist/css/MenuSeparator.base.css +0 -5
  165. package/dist/css/MenuSeparator.css +0 -1
  166. package/dist/css/Popover.css +0 -21
  167. package/dist/css/Progress.base.css +0 -85
  168. package/dist/css/Progress.css +0 -2
  169. package/dist/css/Progress.disabled.css +0 -17
  170. package/dist/css/Radio.base.css +0 -109
  171. package/dist/css/Radio.colorful.css +0 -18
  172. package/dist/css/Radio.css +0 -3
  173. package/dist/css/Radio.disabled.css +0 -28
  174. package/dist/css/RgbColorSliders.base.css +0 -94
  175. package/dist/css/RgbColorSliders.css +0 -1
  176. package/dist/css/Select.base.css +0 -101
  177. package/dist/css/Select.colorful.css +0 -24
  178. package/dist/css/Select.composed.css +0 -12
  179. package/dist/css/Select.css +0 -4
  180. package/dist/css/Select.disabled.css +0 -28
  181. package/dist/css/Slider.base.css +0 -152
  182. package/dist/css/Slider.colorful.css +0 -11
  183. package/dist/css/Slider.composed.css +0 -8
  184. package/dist/css/Slider.css +0 -4
  185. package/dist/css/Slider.disabled.css +0 -30
  186. package/dist/css/Switch.base.css +0 -175
  187. package/dist/css/Switch.colorful.css +0 -45
  188. package/dist/css/Switch.css +0 -3
  189. package/dist/css/Switch.disabled.css +0 -30
  190. package/dist/css/Tab.base.css +0 -96
  191. package/dist/css/Tab.colorful.css +0 -13
  192. package/dist/css/Tab.css +0 -3
  193. package/dist/css/Tab.disabled.css +0 -36
  194. package/dist/css/TabList.base.css +0 -34
  195. package/dist/css/TabList.css +0 -1
  196. package/dist/css/TextArea.base.css +0 -62
  197. package/dist/css/TextArea.colorful.css +0 -17
  198. package/dist/css/TextArea.composed.css +0 -8
  199. package/dist/css/TextArea.css +0 -4
  200. package/dist/css/TextArea.disabled.css +0 -28
  201. package/dist/css/Tooltip.base.css +0 -6
  202. package/dist/css/Tooltip.css +0 -1
  203. package/dist/css/Tree.base.css +0 -49
  204. package/dist/css/Tree.composed.css +0 -8
  205. package/dist/css/Tree.css +0 -3
  206. package/dist/css/Tree.disabled.css +0 -27
  207. package/dist/css/TreeChevron.base.css +0 -86
  208. package/dist/css/TreeChevron.css +0 -1
  209. package/dist/css/TreeItem.base.css +0 -3
  210. package/dist/css/TreeItem.css +0 -1
  211. package/dist/css/TreeItemDisplay.base.css +0 -48
  212. package/dist/css/TreeItemDisplay.colorful.css +0 -9
  213. package/dist/css/TreeItemDisplay.css +0 -3
  214. package/dist/css/TreeItemDisplay.disabled.css +0 -28
  215. package/dist/css/dark-mode.css +0 -134
  216. package/dist/css/light-mode.css +0 -134
  217. package/dist/css/sterling.css +0 -37
  218. package/dist/package.json +0 -108
  219. /package/dist/{Button.types.js → Callout.types.js} +0 -0
@@ -1,30 +1,18 @@
1
- <script>import { idGenerator } from './idGenerator';
1
+ <svelte:options runes={true} />
2
+
3
+ <script lang="ts">import { idGenerator } from './idGenerator';
2
4
  import { usingKeyboard } from './mediaQueries/usingKeyboard';
3
- // ----- Props ----- //
4
- export let checked = false;
5
- export let disabled = false;
6
- /** The text appearing by the off position. Not used when the offLabel slot is filled. */
7
- export let offText = undefined;
8
- /** The text appearing near the on position. Not used when the onLabel slot is filled. */
9
- export let onText = undefined;
10
- /** Additional class names to apply. */
11
- export let variant = '';
12
- /** When true, the switch is displayed vertically. */
13
- export let vertical = false;
14
- // ----- State ----- //
15
- const inputId = idGenerator.nextId('Switch');
5
+ let { checked = $bindable(false), class: _class, disabled, id, offLabel, onLabel, vertical, ...rest } = $props();
6
+ const inputId = id || idGenerator.nextId('Switch');
16
7
  let inputRef;
17
- let switchWidth = 0;
18
- let switchHeight = 0;
19
- let thumbWidth = 0;
20
- let thumbHeight = 0;
21
- $: switchSize = vertical ? switchHeight : switchWidth;
22
- $: thumbSize = vertical ? thumbHeight : thumbWidth;
23
- $: ratio = vertical ? (checked ? 0 : 1) : checked ? 1 : 0;
24
- $: valueOffset = (switchSize - thumbSize) * ratio;
25
- $: hasOffLabel = $$slots.offLabel || (offText !== undefined && offText.length > 0);
26
- $: hasOnLabel = $$slots.onLabel || (onText !== undefined && onText.length > 0);
27
- // ----- Methods ----- //
8
+ let switchWidth = $state(0);
9
+ let switchHeight = $state(0);
10
+ let thumbWidth = $state(0);
11
+ let thumbHeight = $state(0);
12
+ let switchSize = $derived(vertical ? switchHeight : switchWidth);
13
+ let thumbSize = $derived(vertical ? thumbHeight : thumbWidth);
14
+ let ratio = $derived(vertical ? (checked ? 0 : 1) : checked ? 1 : 0);
15
+ let valueOffset = $derived((switchSize - thumbSize) * ratio);
28
16
  export const blur = () => {
29
17
  inputRef?.blur();
30
18
  };
@@ -36,75 +24,38 @@ export const focus = (options) => {
36
24
  };
37
25
  </script>
38
26
 
39
- <!--
40
- @component
41
- A styled HTML input type=checkbox element.
42
- -->
43
27
  <div
44
- class={`sterling-switch ${variant}`}
28
+ class={`sterling-switch ${_class}`}
45
29
  class:checked
46
30
  class:disabled
47
31
  class:vertical
48
32
  class:using-keyboard={$usingKeyboard}
49
33
  >
50
- <input
51
- bind:this={inputRef}
52
- bind:checked
53
- {disabled}
54
- id={inputId}
55
- type="checkbox"
56
- on:blur
57
- on:click
58
- on:change
59
- on:dblclick
60
- on:dragend
61
- on:dragenter
62
- on:dragleave
63
- on:dragover
64
- on:dragstart
65
- on:drop
66
- on:focus
67
- on:focusin
68
- on:focusout
69
- on:keydown
70
- on:keypress
71
- on:keyup
72
- on:input
73
- on:mousedown
74
- on:mouseenter
75
- on:mouseleave
76
- on:mousemove
77
- on:mouseover
78
- on:mouseout
79
- on:mouseup
80
- on:wheel|passive
81
- {...$$restProps}
82
- />
83
- {#if hasOffLabel}
34
+ <input bind:this={inputRef} bind:checked {disabled} id={inputId} type="checkbox" {...rest} />
35
+ {#if offLabel}
84
36
  <div class="off-label">
85
- <slot name="offLabel" {checked} {disabled} {inputId} {offText} {variant} {vertical}>
86
- {#if offText}
87
- <label for={inputId}>{offText}</label>
88
- {/if}
89
- </slot>
37
+ {#if typeof offLabel === 'string'}
38
+ {offLabel}
39
+ {:else}
40
+ {@render offLabel({ checked, disabled, inputId })}
41
+ {/if}
90
42
  </div>
91
43
  {/if}
92
- <!-- svelte-ignore a11y-click-events-have-key-events -->
93
- <div class="switch" bind:offsetWidth={switchWidth} bind:offsetHeight={switchHeight}>
44
+ <div class="toggle" bind:offsetWidth={switchWidth} bind:offsetHeight={switchHeight}>
94
45
  <div
95
46
  class="thumb"
96
47
  bind:offsetWidth={thumbWidth}
97
48
  bind:offsetHeight={thumbHeight}
98
49
  style={`--thumb-offset: ${valueOffset}px`}
99
- />
50
+ ></div>
100
51
  </div>
101
- {#if hasOnLabel}
52
+ {#if onLabel}
102
53
  <div class="on-label">
103
- <slot name="onLabel" {checked} {disabled} {inputId} {onText} {variant} {vertical}>
104
- {#if onText}
105
- <label for={inputId}>{onText}</label>
106
- {/if}
107
- </slot>
54
+ {#if typeof onLabel === 'string'}
55
+ {onLabel}
56
+ {:else}
57
+ {@render onLabel({ checked, disabled, inputId })}
58
+ {/if}
108
59
  </div>
109
60
  {/if}
110
61
  </div>
@@ -1,74 +1,21 @@
1
- import { SvelteComponent } from "svelte";
2
- declare const __propDef: {
3
- props: {
4
- [x: string]: any;
5
- checked?: boolean | undefined;
6
- disabled?: boolean | undefined;
7
- offText?: string | undefined;
8
- onText?: string | undefined;
9
- variant?: string | undefined;
10
- vertical?: boolean | undefined;
11
- blur?: (() => void) | undefined;
12
- click?: (() => void) | undefined;
13
- focus?: ((options?: FocusOptions) => void) | undefined;
14
- };
15
- events: {
16
- blur: FocusEvent;
17
- click: MouseEvent;
18
- change: Event;
19
- dblclick: MouseEvent;
20
- dragend: DragEvent;
21
- dragenter: DragEvent;
22
- dragleave: DragEvent;
23
- dragover: DragEvent;
24
- dragstart: DragEvent;
25
- drop: DragEvent;
26
- focus: FocusEvent;
27
- focusin: FocusEvent;
28
- focusout: FocusEvent;
29
- keydown: KeyboardEvent;
30
- keypress: KeyboardEvent;
31
- keyup: KeyboardEvent;
32
- input: Event;
33
- mousedown: MouseEvent;
34
- mouseenter: MouseEvent;
35
- mouseleave: MouseEvent;
36
- mousemove: MouseEvent;
37
- mouseover: MouseEvent;
38
- mouseout: MouseEvent;
39
- mouseup: MouseEvent;
40
- wheel: WheelEvent;
41
- } & {
42
- [evt: string]: CustomEvent<any>;
43
- };
44
- slots: {
45
- offLabel: {
46
- checked: boolean;
47
- disabled: boolean;
48
- inputId: string;
49
- offText: string | undefined;
50
- variant: string;
51
- vertical: boolean;
52
- };
53
- onLabel: {
54
- checked: boolean;
55
- disabled: boolean;
56
- inputId: string;
57
- onText: string | undefined;
58
- variant: string;
59
- vertical: boolean;
60
- };
61
- };
62
- exports?: undefined;
63
- bindings?: undefined;
1
+ import type { HTMLInputAttributes } from 'svelte/elements';
2
+ import type { Snippet } from 'svelte';
3
+ type LabelSnippet = Snippet<[
4
+ {
5
+ checked: boolean | null | undefined;
6
+ disabled: boolean | null | undefined;
7
+ inputId: string;
8
+ }
9
+ ]>;
10
+ type Props = HTMLInputAttributes & {
11
+ offLabel?: string | LabelSnippet;
12
+ onLabel?: string | LabelSnippet;
13
+ vertical?: boolean | null | undefined;
64
14
  };
65
- export type SwitchProps = typeof __propDef.props;
66
- export type SwitchEvents = typeof __propDef.events;
67
- export type SwitchSlots = typeof __propDef.slots;
68
- /** A styled HTML input type=checkbox element. */
69
- export default class Switch extends SvelteComponent<SwitchProps, SwitchEvents, SwitchSlots> {
70
- get blur(): () => void;
71
- get click(): () => void;
72
- get focus(): (options?: FocusOptions | undefined) => void;
73
- }
74
- export {};
15
+ declare const Switch: import("svelte").Component<Props, {
16
+ blur: () => void;
17
+ click: () => void;
18
+ focus: (options?: FocusOptions) => void;
19
+ }, "checked">;
20
+ type Switch = ReturnType<typeof Switch>;
21
+ export default Switch;
package/dist/Tab.svelte CHANGED
@@ -1,33 +1,24 @@
1
- <script>import { getContext } from 'svelte';
1
+ <svelte:options runes={true} />
2
+
3
+ <script lang="ts">import { getContext } from 'svelte';
2
4
  import { TAB_LIST_CONTEXT_KEY } from './TabList.constants';
3
5
  import { usingKeyboard } from './mediaQueries/usingKeyboard';
4
- // ----- Props ----- //
5
- /**
6
- * When true, the tab is disabled.
7
- * The tab is also disabled when its parent tab list is disabled.
8
- */
9
- export let disabled = false;
10
- /** When true, the tab is selected. */
11
- export let selected = false;
12
- /** The text of the tab. Not used when the default slot is filled. */
13
- export let text = undefined;
14
- /** The value uniquely identifying this tab within the tab list. */
15
- export let value;
16
- /** Additional class names to apply. */
17
- export let variant = '';
18
- // ----- State ----- //
6
+ let { children, class: _class, disabled = false, value, ...rest } = $props();
19
7
  let tabRef;
20
- const { disabled: tabListDisabled, selectedValue, vertical } = getContext(TAB_LIST_CONTEXT_KEY);
21
- $: _disabled = $tabListDisabled || disabled;
22
- $: {
23
- selected = $selectedValue === value;
24
- }
25
- $: {
26
- if (selected) {
27
- selectedValue.set(value);
8
+ const tabListContext = getContext(TAB_LIST_CONTEXT_KEY);
9
+ let selected = $state(tabListContext.selectedValue === value);
10
+ let _disabled = $derived(tabListContext.disabled || disabled);
11
+ // Using $derived would be preferred, but this helps avoid
12
+ // updates to every tab when selectedValue changes.
13
+ // let selected = $derived(tabContext.selectedValue === value);
14
+ $effect(() => {
15
+ if (tabListContext.selectedValue === value && !selected) {
16
+ selected = true;
17
+ }
18
+ else if (tabListContext.selectedValue !== value && selected) {
19
+ selected = false;
28
20
  }
29
- }
30
- // ----- Methods ----- //
21
+ });
31
22
  export const click = () => {
32
23
  tabRef?.click();
33
24
  };
@@ -42,53 +33,19 @@ export const focus = (options) => {
42
33
  <button
43
34
  bind:this={tabRef}
44
35
  aria-selected={selected}
45
- class={`sterling-tab ${variant}`}
46
- disabled={_disabled}
36
+ class={`sterling-tab ${_class}`}
47
37
  class:selected
48
38
  class:using-keyboard={$usingKeyboard}
49
- class:vertical={$vertical}
39
+ class:vertical={tabListContext.vertical}
50
40
  data-value={value}
41
+ disabled={_disabled}
51
42
  role="tab"
52
43
  type="button"
53
44
  tabIndex={selected ? 0 : -1}
54
- on:blur
55
- on:click
56
- on:dblclick
57
- on:dragend
58
- on:dragenter
59
- on:dragleave
60
- on:dragover
61
- on:dragstart
62
- on:drop
63
- on:focus
64
- on:focusin
65
- on:focusout
66
- on:keydown
67
- on:keypress
68
- on:keyup
69
- on:mousedown
70
- on:mouseenter
71
- on:mouseleave
72
- on:mousemove
73
- on:mouseover
74
- on:mouseout
75
- on:mouseup
76
- on:pointercancel
77
- on:pointerdown
78
- on:pointerenter
79
- on:pointerleave
80
- on:pointermove
81
- on:pointerover
82
- on:pointerout
83
- on:pointerup
84
- on:wheel|passive
45
+ {...rest}
85
46
  >
86
47
  <div class="content">
87
- <slot disabled={_disabled} {selected} {text} {value} {variant}>
88
- <div class="text">
89
- {text || value}
90
- </div>
91
- </slot>
48
+ {@render children?.()}
92
49
  </div>
93
- <div class="indicator" />
50
+ <div class="indicator"></div>
94
51
  </button>
@@ -1,71 +1,12 @@
1
- import { SvelteComponent } from "svelte";
2
- declare const __propDef: {
3
- props: {
4
- /**
5
- * When true, the tab is disabled.
6
- * The tab is also disabled when its parent tab list is disabled.
7
- */ disabled?: boolean | undefined;
8
- /** When true, the tab is selected. */ selected?: boolean | undefined;
9
- /** The text of the tab. Not used when the default slot is filled. */ text?: string | undefined;
10
- /** The value uniquely identifying this tab within the tab list. */ value: string;
11
- /** Additional class names to apply. */ variant?: string | undefined;
12
- click?: (() => void) | undefined;
13
- blur?: (() => void) | undefined;
14
- focus?: ((options?: FocusOptions) => void) | undefined;
15
- };
16
- events: {
17
- blur: FocusEvent;
18
- click: MouseEvent;
19
- dblclick: MouseEvent;
20
- dragend: DragEvent;
21
- dragenter: DragEvent;
22
- dragleave: DragEvent;
23
- dragover: DragEvent;
24
- dragstart: DragEvent;
25
- drop: DragEvent;
26
- focus: FocusEvent;
27
- focusin: FocusEvent;
28
- focusout: FocusEvent;
29
- keydown: KeyboardEvent;
30
- keypress: KeyboardEvent;
31
- keyup: KeyboardEvent;
32
- mousedown: MouseEvent;
33
- mouseenter: MouseEvent;
34
- mouseleave: MouseEvent;
35
- mousemove: MouseEvent;
36
- mouseover: MouseEvent;
37
- mouseout: MouseEvent;
38
- mouseup: MouseEvent;
39
- pointercancel: PointerEvent;
40
- pointerdown: PointerEvent;
41
- pointerenter: PointerEvent;
42
- pointerleave: PointerEvent;
43
- pointermove: PointerEvent;
44
- pointerover: PointerEvent;
45
- pointerout: PointerEvent;
46
- pointerup: PointerEvent;
47
- wheel: WheelEvent;
48
- } & {
49
- [evt: string]: CustomEvent<any>;
50
- };
51
- slots: {
52
- default: {
53
- disabled: boolean;
54
- selected: boolean;
55
- text: string | undefined;
56
- value: string;
57
- variant: string;
58
- };
59
- };
60
- exports?: {} | undefined;
61
- bindings?: string | undefined;
1
+ /// <reference types="svelte" />
2
+ import type { HTMLButtonAttributes } from 'svelte/elements';
3
+ type Props = HTMLButtonAttributes & {
4
+ value: string;
62
5
  };
63
- export type TabProps = typeof __propDef.props;
64
- export type TabEvents = typeof __propDef.events;
65
- export type TabSlots = typeof __propDef.slots;
66
- export default class Tab extends SvelteComponent<TabProps, TabEvents, TabSlots> {
67
- get click(): () => void;
68
- get blur(): () => void;
69
- get focus(): (options?: FocusOptions | undefined) => void;
70
- }
71
- export {};
6
+ declare const Tab: import("svelte").Component<Props, {
7
+ click: () => void;
8
+ blur: () => void;
9
+ focus: (options?: FocusOptions) => void;
10
+ }, "">;
11
+ type Tab = ReturnType<typeof Tab>;
12
+ export default Tab;
@@ -1,36 +1,43 @@
1
- <script>import { createEventDispatcher, setContext } from 'svelte';
2
- import { writable } from 'svelte/store';
1
+ <svelte:options runes={true} />
2
+
3
+ <script lang="ts">import { setContext } from 'svelte';
3
4
  import { TAB_LIST_CONTEXT_KEY } from './TabList.constants';
4
- // ----- Props ----- //
5
- /** When true, the tab list and its tabs are disabled. */
6
- export let disabled = false;
7
- /** The value of the currently selected tab. */
8
- export let selectedValue = undefined;
9
- /** When true, the tab list is displayed vertically. */
10
- export let vertical = false;
11
- /** Additional class names to apply. */
12
- export let variant = '';
13
- // ----- State ----- //
5
+ let { children, class: _class, disabled = false, onSelect, selectedValue = $bindable(), vertical = false, ...rest } = $props();
14
6
  let tabListRef;
15
7
  let lastSelectedTabRef;
16
- const disabledStore = writable(disabled);
17
- const selectedValueStore = writable(selectedValue);
18
- const verticalStore = writable(vertical);
19
- $: disabledStore.set(disabled);
20
- $: selectedValueStore.set(selectedValue);
21
- $: {
22
- selectedValue = $selectedValueStore;
23
- }
24
- $: verticalStore.set(vertical);
25
- // ----- Events ----- //
26
- const dispatch = createEventDispatcher();
27
- const raiseSelect = (value) => {
28
- dispatch('select', { value });
8
+ let tabListContext = {
9
+ get disabled() {
10
+ return disabled;
11
+ },
12
+ set disabled(value) {
13
+ disabled = value;
14
+ },
15
+ get selectedValue() {
16
+ return selectedValue;
17
+ },
18
+ set selectedValue(value) {
19
+ selectedValue = value;
20
+ },
21
+ get vertical() {
22
+ return vertical;
23
+ },
24
+ set vertical(value) {
25
+ vertical = value;
26
+ }
29
27
  };
30
- $: {
31
- raiseSelect(selectedValue);
32
- }
33
- // ----- Methods ----- //
28
+ $effect(() => {
29
+ tabListContext.disabled = disabled;
30
+ });
31
+ $effect(() => {
32
+ tabListContext.selectedValue = selectedValue;
33
+ });
34
+ $effect(() => {
35
+ tabListContext.vertical = vertical;
36
+ });
37
+ setContext(TAB_LIST_CONTEXT_KEY, tabListContext);
38
+ $effect(() => {
39
+ onSelect?.(selectedValue);
40
+ });
34
41
  export const blur = () => {
35
42
  tabListRef?.blur();
36
43
  };
@@ -43,7 +50,6 @@ export const focus = (options) => {
43
50
  selectFirstTab();
44
51
  }
45
52
  };
46
- // ----- Selection ----- //
47
53
  const isElementTab = (candidate) => {
48
54
  return (candidate &&
49
55
  candidate.getAttribute('data-value') !== null &&
@@ -61,7 +67,7 @@ const getSelectedTabElement = () => {
61
67
  }
62
68
  };
63
69
  const selectTab = (value, element) => {
64
- selectedValueStore.set(value);
70
+ selectedValue = value;
65
71
  lastSelectedTabRef = element;
66
72
  element.scrollIntoView({ block: 'nearest', inline: 'nearest' });
67
73
  element.focus();
@@ -116,7 +122,6 @@ export const selectLastTab = () => {
116
122
  }
117
123
  return false;
118
124
  };
119
- // ----- EventHandlers ----- //
120
125
  const onClick = (event) => {
121
126
  if (!disabled) {
122
127
  let candidate = event.target;
@@ -129,6 +134,7 @@ const onClick = (event) => {
129
134
  selectTab(candidateValue, candidate);
130
135
  }
131
136
  }
137
+ rest.onclick?.(event);
132
138
  };
133
139
  const onKeydown = (event) => {
134
140
  // if using arrows, only move when there are no modifier keys
@@ -138,91 +144,59 @@ const onKeydown = (event) => {
138
144
  selectFirstTab();
139
145
  event.preventDefault();
140
146
  event.stopPropagation();
141
- return false;
147
+ break;
142
148
  case 'End':
143
149
  selectLastTab();
144
150
  event.preventDefault();
145
151
  event.stopPropagation();
146
- return false;
152
+ break;
147
153
  case 'ArrowLeft':
148
154
  if (!vertical) {
149
155
  selectPreviousTab();
150
156
  }
151
157
  event.preventDefault();
152
158
  event.stopPropagation();
153
- return false;
159
+ break;
154
160
  case 'ArrowRight':
155
161
  if (!vertical) {
156
162
  selectNextTab();
157
163
  }
158
164
  event.preventDefault();
159
165
  event.stopPropagation();
160
- return false;
166
+ break;
161
167
  case 'ArrowUp':
162
168
  if (vertical) {
163
169
  selectPreviousTab();
164
170
  }
165
171
  event.preventDefault();
166
172
  event.stopPropagation();
167
- return false;
173
+ break;
168
174
  case 'ArrowDown':
169
175
  if (vertical) {
170
176
  selectNextTab();
171
177
  }
172
178
  event.preventDefault();
173
179
  event.stopPropagation();
174
- return false;
180
+ break;
175
181
  default:
176
182
  break;
177
183
  }
178
184
  }
185
+ rest.onkeydown?.(event);
179
186
  };
180
- // ----- Set Context ----- //
181
- setContext(TAB_LIST_CONTEXT_KEY, {
182
- disabled: disabledStore,
183
- selectedValue: selectedValueStore,
184
- vertical: verticalStore
185
- });
186
187
  </script>
187
188
 
188
189
  <div
189
190
  aria-orientation={vertical ? 'vertical' : 'horizontal'}
190
191
  bind:this={tabListRef}
191
- class={`sterling-tab-list ${variant}`}
192
+ class={`sterling-tab-list ${_class}`}
192
193
  class:disabled
193
194
  class:vertical
194
195
  role="tablist"
195
196
  tabindex="-1"
196
- on:blur
197
- on:click
198
- on:click={onClick}
199
- on:copy
200
- on:cut
201
- on:dblclick
202
- on:dragend
203
- on:dragenter
204
- on:dragleave
205
- on:dragover
206
- on:dragstart
207
- on:drop
208
- on:focus
209
- on:focusin
210
- on:focusout
211
- on:keydown
212
- on:keydown={onKeydown}
213
- on:keypress
214
- on:keyup
215
- on:mousedown
216
- on:mouseenter
217
- on:mouseleave
218
- on:mousemove
219
- on:mouseover
220
- on:mouseout
221
- on:mouseup
222
- on:scroll
223
- on:wheel|passive
224
- on:paste
225
- {...$$restProps}
197
+ onclick={onClick}
198
+ onkeydown={onKeydown}
199
+ {...rest}
226
200
  >
227
- <slot {disabled} {selectedValue} {variant} {vertical} />
201
+ {@render children?.()}
228
202
  </div>