@sveltia/ui 0.7.5 → 0.8.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 (114) hide show
  1. package/package/components/alert/alert.svelte +4 -4
  2. package/package/components/alert/alert.svelte.d.ts +2 -2
  3. package/package/components/button/button.svelte +5 -3
  4. package/package/components/button/button.svelte.d.ts +6 -4
  5. package/package/components/button/select-button-group.svelte +9 -5
  6. package/package/components/button/select-button.svelte +5 -4
  7. package/package/components/button/select-button.svelte.d.ts +2 -0
  8. package/package/components/calendar/calendar.svelte +20 -14
  9. package/package/components/checkbox/checkbox-group.svelte +6 -5
  10. package/package/components/checkbox/checkbox.svelte +6 -4
  11. package/package/components/checkbox/checkbox.svelte.d.ts +2 -2
  12. package/package/components/dialog/alert-dialog.svelte +50 -0
  13. package/package/components/dialog/alert-dialog.svelte.d.ts +55 -0
  14. package/package/components/dialog/confirmation-dialog.svelte +55 -0
  15. package/package/components/dialog/confirmation-dialog.svelte.d.ts +57 -0
  16. package/package/components/dialog/dialog.svelte +165 -221
  17. package/package/components/dialog/dialog.svelte.d.ts +20 -12
  18. package/package/components/dialog/prompt-dialog.svelte +87 -0
  19. package/package/components/dialog/prompt-dialog.svelte.d.ts +72 -0
  20. package/package/components/disclosure/disclosure.svelte +3 -2
  21. package/package/components/divider/divider.svelte +1 -1
  22. package/package/components/divider/spacer.svelte +1 -12
  23. package/package/components/divider/spacer.svelte.d.ts +0 -2
  24. package/package/components/drawer/drawer.svelte +119 -209
  25. package/package/components/drawer/drawer.svelte.d.ts +13 -9
  26. package/package/components/grid/grid-body.svelte +51 -0
  27. package/package/components/grid/grid-body.svelte.d.ts +36 -0
  28. package/package/components/grid/grid-cell.svelte +22 -0
  29. package/package/components/grid/grid-cell.svelte.d.ts +34 -0
  30. package/package/components/grid/grid-col-header.svelte +22 -0
  31. package/package/components/grid/grid-col-header.svelte.d.ts +34 -0
  32. package/package/components/grid/grid-foot.svelte +27 -0
  33. package/package/components/grid/grid-foot.svelte.d.ts +34 -0
  34. package/package/components/grid/grid-head.svelte +27 -0
  35. package/package/components/grid/grid-head.svelte.d.ts +34 -0
  36. package/package/components/grid/grid-row-header.svelte +23 -0
  37. package/package/components/grid/grid-row-header.svelte.d.ts +34 -0
  38. package/package/components/grid/grid-row.svelte +37 -0
  39. package/package/components/grid/grid-row.svelte.d.ts +44 -0
  40. package/package/components/grid/grid.svelte +52 -0
  41. package/package/components/grid/grid.svelte.d.ts +42 -0
  42. package/package/components/icon/icon.svelte +6 -7
  43. package/package/components/icon/icon.svelte.d.ts +0 -2
  44. package/package/components/listbox/listbox.svelte +3 -3
  45. package/package/components/listbox/option-group.svelte +6 -5
  46. package/package/components/listbox/option.svelte +7 -28
  47. package/package/components/listbox/option.svelte.d.ts +2 -0
  48. package/package/components/menu/menu-button.svelte +26 -16
  49. package/package/components/menu/menu-button.svelte.d.ts +2 -2
  50. package/package/components/menu/menu-item-checkbox.svelte +5 -4
  51. package/package/components/menu/menu-item-checkbox.svelte.d.ts +2 -0
  52. package/package/components/menu/menu-item-group.svelte +4 -3
  53. package/package/components/menu/menu-item-radio.svelte +5 -4
  54. package/package/components/menu/menu-item-radio.svelte.d.ts +2 -0
  55. package/package/components/menu/menu-item.svelte +7 -5
  56. package/package/components/menu/menu-item.svelte.d.ts +4 -2
  57. package/package/components/menu/menu.svelte +1 -1
  58. package/package/components/radio/radio-group.svelte +5 -5
  59. package/package/components/radio/radio.svelte +5 -2
  60. package/package/components/radio/radio.svelte.d.ts +2 -0
  61. package/package/components/select/combobox.svelte +11 -9
  62. package/package/components/slider/slider.svelte +12 -5
  63. package/package/components/switch/switch.svelte +3 -2
  64. package/package/components/switch/switch.svelte.d.ts +2 -2
  65. package/package/components/table/table-body.svelte +31 -3
  66. package/package/components/table/table-body.svelte.d.ts +2 -0
  67. package/package/components/table/table-cell.svelte +3 -4
  68. package/package/components/table/table-cell.svelte.d.ts +1 -1
  69. package/package/components/table/table-col-header.svelte +1 -2
  70. package/package/components/table/table-foot.svelte +7 -3
  71. package/package/components/table/table-head.svelte +7 -3
  72. package/package/components/table/table-row-header.svelte +1 -2
  73. package/package/components/table/table-row.svelte +1 -14
  74. package/package/components/table/table-row.svelte.d.ts +0 -8
  75. package/package/components/table/table.svelte +5 -17
  76. package/package/components/table/table.svelte.d.ts +1 -7
  77. package/package/components/tabs/tab-list.svelte +7 -5
  78. package/package/components/tabs/tab-panel.svelte +1 -1
  79. package/package/components/tabs/tab.svelte +2 -1
  80. package/package/components/tabs/tab.svelte.d.ts +2 -0
  81. package/package/components/text-field/markdown-editor.svelte +30 -6
  82. package/package/components/text-field/markdown-editor.svelte.d.ts +2 -0
  83. package/package/components/text-field/number-input.svelte +36 -6
  84. package/package/components/text-field/number-input.svelte.d.ts +2 -0
  85. package/package/components/text-field/password-input.svelte +34 -8
  86. package/package/components/text-field/password-input.svelte.d.ts +2 -0
  87. package/package/components/text-field/search-bar.svelte +39 -11
  88. package/package/components/text-field/search-bar.svelte.d.ts +5 -0
  89. package/package/components/text-field/text-area.svelte +21 -2
  90. package/package/components/text-field/text-area.svelte.d.ts +2 -0
  91. package/package/components/text-field/text-input.svelte +22 -4
  92. package/package/components/text-field/text-input.svelte.d.ts +7 -2
  93. package/package/components/toast/toast.svelte +47 -17
  94. package/package/components/toast/toast.svelte.d.ts +7 -3
  95. package/package/components/toolbar/toolbar.svelte +3 -4
  96. package/package/components/util/app-shell.svelte +26 -27
  97. package/package/components/util/group.svelte +2 -2
  98. package/package/components/util/modal.svelte +220 -0
  99. package/package/components/util/modal.svelte.d.ts +83 -0
  100. package/package/components/util/popup.svelte +81 -127
  101. package/package/components/util/popup.svelte.d.ts +22 -18
  102. package/package/components/util/portal.svelte +1 -1
  103. package/package/index.d.ts +12 -0
  104. package/package/index.js +12 -0
  105. package/package/locales/en.d.ts +1 -0
  106. package/package/locales/en.js +1 -0
  107. package/package/locales/ja.d.ts +1 -0
  108. package/package/locales/ja.js +1 -0
  109. package/package/services/group.js +51 -13
  110. package/package/styles/core.scss +9 -26
  111. package/package/styles/variables.scss +12 -0
  112. package/package/typedef.d.ts +1 -0
  113. package/package/typedef.js +5 -0
  114. package/package.json +97 -1
@@ -67,23 +67,33 @@
67
67
  };
68
68
  </script>
69
69
 
70
- <Button
71
- class="sui menu-button {className}"
72
- {hidden}
73
- {disabled}
74
- {label}
75
- {variant}
76
- {size}
77
- {iconic}
78
- aria-haspopup="menu"
79
- {...$$restProps}
80
- bind:this={buttonComponent}
81
- >
82
- <slot name="start-icon" slot="start-icon" />
83
- <slot />
84
- <slot name="end-icon" slot="end-icon" />
85
- </Button>
70
+ <div role="none" class="wrapper">
71
+ <Button
72
+ class="sui menu-button {className}"
73
+ {hidden}
74
+ {disabled}
75
+ {label}
76
+ {variant}
77
+ {size}
78
+ {iconic}
79
+ aria-haspopup="menu"
80
+ {...$$restProps}
81
+ bind:this={buttonComponent}
82
+ >
83
+ <slot name="start-icon" slot="start-icon" />
84
+ <slot />
85
+ <slot name="end-icon" slot="end-icon" />
86
+ </Button>
87
+ </div>
86
88
 
87
89
  <Popup anchor={buttonComponent?.element} position={popupPosition} bind:this={popupComponent}>
88
90
  <slot name="popup" />
89
91
  </Popup>
92
+
93
+ <style>.wrapper {
94
+ display: contents;
95
+ }
96
+ .wrapper :global(.icon:last-child) {
97
+ margin: 0 -2px;
98
+ font-size: 20px;
99
+ }</style>
@@ -8,8 +8,8 @@
8
8
  export default class MenuButton extends SvelteComponent<{
9
9
  [x: string]: any;
10
10
  class?: string;
11
- label?: string;
12
11
  focus?: () => void;
12
+ label?: string;
13
13
  disabled?: boolean;
14
14
  size?: "small" | "medium" | "large";
15
15
  hidden?: boolean;
@@ -38,8 +38,8 @@ declare const __propDef: {
38
38
  props: {
39
39
  [x: string]: any;
40
40
  class?: string;
41
- label?: string;
42
41
  focus?: () => void;
42
+ label?: string;
43
43
  disabled?: boolean;
44
44
  size?: 'small' | 'medium' | 'large';
45
45
  hidden?: boolean | undefined;
@@ -44,8 +44,8 @@
44
44
  </script>
45
45
 
46
46
  <MenuItem
47
- class="sui menu-item-checkbox {className}"
48
47
  role="menuitemcheckbox"
48
+ class="sui menu-item-checkbox {className}"
49
49
  {label}
50
50
  {hidden}
51
51
  {disabled}
@@ -54,10 +54,11 @@
54
54
  {iconLabel}
55
55
  {...$$restProps}
56
56
  on:click
57
- on:click={() => {
58
- checked = !checked;
59
- }}
60
57
  on:select
58
+ on:change
59
+ on:change={(event) => {
60
+ checked = /** @type {CustomEvent} */ (event).detail.checked;
61
+ }}
61
62
  >
62
63
  <slot />
63
64
  <svelte:component this={checked ? Icon : undefined} slot="end-icon" name="check" />
@@ -17,6 +17,7 @@ export default class MenuItemCheckbox extends SvelteComponent<{
17
17
  }, {
18
18
  click: MouseEvent;
19
19
  select: Event;
20
+ change: Event;
20
21
  } & {
21
22
  [evt: string]: CustomEvent<any>;
22
23
  }, {
@@ -41,6 +42,7 @@ declare const __propDef: {
41
42
  events: {
42
43
  click: MouseEvent;
43
44
  select: Event;
45
+ change: Event;
44
46
  } & {
45
47
  [evt: string]: CustomEvent<any>;
46
48
  };
@@ -30,19 +30,20 @@
30
30
  </script>
31
31
 
32
32
  <div
33
+ role="group"
33
34
  {id}
34
35
  class="sui menu-item-group {className}"
35
36
  hidden={hidden || undefined}
36
- role="group"
37
37
  aria-hidden={hidden}
38
38
  aria-disabled={disabled}
39
39
  aria-labelledby={title ? '{id}-title' : undefined}
40
+ aria-roledescription="menu item group"
40
41
  {...$$restProps}
41
42
  >
42
43
  {#if title}
43
- <div class="title" id="{id}-title">{title}</div>
44
+ <div role="none" class="title" id="{id}-title">{title}</div>
44
45
  {/if}
45
- <div class="inner" inert={disabled}>
46
+ <div role="none" class="inner" inert={disabled}>
46
47
  <slot />
47
48
  </div>
48
49
  </div>
@@ -45,8 +45,8 @@
45
45
  </script>
46
46
 
47
47
  <MenuItem
48
- class="sui menu-item-radio {className}"
49
48
  role="menuitemradio"
49
+ class="sui menu-item-radio {className}"
50
50
  {label}
51
51
  {hidden}
52
52
  {disabled}
@@ -55,10 +55,11 @@
55
55
  {iconLabel}
56
56
  {...$$restProps}
57
57
  on:click
58
- on:click={() => {
59
- checked = !checked;
60
- }}
61
58
  on:select
59
+ on:change
60
+ on:change={(event) => {
61
+ checked = /** @type {CustomEvent} */ (event).detail.checked;
62
+ }}
62
63
  >
63
64
  <slot />
64
65
  <svelte:component this={checked ? Icon : undefined} slot="end-icon" name="check" />
@@ -18,6 +18,7 @@ export default class MenuItemRadio extends SvelteComponent<{
18
18
  }, {
19
19
  click: MouseEvent;
20
20
  select: Event;
21
+ change: Event;
21
22
  } & {
22
23
  [evt: string]: CustomEvent<any>;
23
24
  }, {
@@ -42,6 +43,7 @@ declare const __propDef: {
42
43
  events: {
43
44
  click: MouseEvent;
44
45
  select: Event;
46
+ change: Event;
45
47
  } & {
46
48
  [evt: string]: CustomEvent<any>;
47
49
  };
@@ -52,7 +52,7 @@
52
52
  $: hasChildren = role === 'menuitem' && $$slots.default;
53
53
  </script>
54
54
 
55
- <div class="sui menuitem {className}" hidden={hidden || undefined}>
55
+ <div role="none" class="sui menuitem {className}" hidden={hidden || undefined}>
56
56
  <Button
57
57
  {role}
58
58
  {hidden}
@@ -73,20 +73,21 @@
73
73
  }
74
74
  }}
75
75
  on:select
76
+ on:change
76
77
  >
77
78
  {#if iconName}
78
- <Icon slot="start-icon" name={iconName} label={iconLabel} />
79
+ <Icon slot="start-icon" name={iconName} aria-label={iconLabel} />
79
80
  {/if}
80
81
  {#if label}
81
- <span class="label">{label}</span>
82
+ <span role="none" class="label">{label}</span>
82
83
  {/if}
83
84
  {#if $$slots['end-icon']}
84
- <span class="icon-outer">
85
+ <span role="none" class="icon-outer">
85
86
  <slot name="end-icon" />
86
87
  </span>
87
88
  {/if}
88
89
  {#if hasChildren}
89
- <span class="icon-outer">
90
+ <span role="none" class="icon-outer">
90
91
  <Icon name="chevron_right" />
91
92
  </span>
92
93
  {/if}
@@ -107,6 +108,7 @@
107
108
  display: flex;
108
109
  justify-content: space-between !important;
109
110
  border-radius: var(--sui-option-border-radius);
111
+ margin: 0 !important;
110
112
  padding: 0 16px;
111
113
  width: 100%;
112
114
  min-width: 160px;
@@ -10,13 +10,14 @@ export default class MenuItem extends SvelteComponent<{
10
10
  class?: string;
11
11
  label?: string;
12
12
  disabled?: boolean;
13
- hidden?: boolean;
14
13
  role?: "menuitem" | "menuitemcheckbox" | "menuitemradio";
14
+ hidden?: boolean;
15
15
  iconName?: string;
16
16
  iconLabel?: string;
17
17
  }, {
18
18
  click: MouseEvent;
19
19
  select: Event;
20
+ change: Event;
20
21
  } & {
21
22
  [evt: string]: CustomEvent<any>;
22
23
  }, {
@@ -34,14 +35,15 @@ declare const __propDef: {
34
35
  class?: string;
35
36
  label?: string | undefined;
36
37
  disabled?: boolean;
37
- hidden?: boolean | undefined;
38
38
  role?: 'menuitem' | 'menuitemcheckbox' | 'menuitemradio';
39
+ hidden?: boolean | undefined;
39
40
  iconName?: string;
40
41
  iconLabel?: string;
41
42
  };
42
43
  events: {
43
44
  click: MouseEvent;
44
45
  select: Event;
46
+ change: Event;
45
47
  } & {
46
48
  [evt: string]: CustomEvent<any>;
47
49
  };
@@ -26,8 +26,8 @@
26
26
  </script>
27
27
 
28
28
  <div
29
- class="sui menu {className}"
30
29
  role="menu"
30
+ class="sui menu {className}"
31
31
  hidden={hidden || undefined}
32
32
  aria-hidden={hidden}
33
33
  aria-disabled={disabled}
@@ -46,9 +46,9 @@
46
46
  </script>
47
47
 
48
48
  <div
49
+ role="radiogroup"
49
50
  class="sui radio-group {className} {orientation}"
50
51
  tabindex="-1"
51
- role="radiogroup"
52
52
  hidden={hidden || undefined}
53
53
  aria-hidden={hidden}
54
54
  aria-disabled={disabled}
@@ -60,7 +60,7 @@
60
60
  use:activateGroup
61
61
  on:change
62
62
  >
63
- <div class="inner" inert={disabled}>
63
+ <div role="none" class="inner" inert={disabled}>
64
64
  <slot />
65
65
  </div>
66
66
  </div>
@@ -72,16 +72,16 @@
72
72
  outline-width: 0 !important;
73
73
  }
74
74
  .radio-group.horizontal {
75
- gap: 16px;
75
+ gap: 8px;
76
76
  align-items: center;
77
77
  }
78
78
  .radio-group.vertical {
79
- gap: 8px;
79
+ gap: 4px;
80
80
  flex-direction: column;
81
81
  }
82
82
  @media (pointer: coarse) {
83
83
  .radio-group.vertical {
84
- gap: 16px;
84
+ gap: 8px;
85
85
  }
86
86
  }
87
87
 
@@ -56,9 +56,9 @@
56
56
  </script>
57
57
 
58
58
  <span
59
+ role="none"
59
60
  class="sui radio {className}"
60
61
  class:disabled
61
- role="none"
62
62
  hidden={hidden || undefined}
63
63
  {...$$restProps}
64
64
  on:click={(event) => {
@@ -68,8 +68,8 @@
68
68
  }}
69
69
  >
70
70
  <Button
71
- {id}
72
71
  role="radio"
72
+ {id}
73
73
  {hidden}
74
74
  {disabled}
75
75
  {name}
@@ -82,6 +82,7 @@
82
82
  checked = true;
83
83
  }}
84
84
  on:select
85
+ on:change
85
86
  />
86
87
  {#if $$slots.default || label}
87
88
  <label id="{id}-label">
@@ -98,6 +99,7 @@
98
99
  display: inline-flex;
99
100
  align-items: center;
100
101
  gap: 8px;
102
+ margin: var(--sui-focus-ring-width);
101
103
  color: var(--sui-control-foreground-color);
102
104
  font-family: var(--sui-control-font-family);
103
105
  font-size: var(--sui-control-font-size);
@@ -126,6 +128,7 @@
126
128
  .radio :global(button) {
127
129
  justify-content: center;
128
130
  overflow: hidden;
131
+ margin: 0 !important;
129
132
  border-width: 1.5px;
130
133
  border-color: var(--sui-checkbox-border-color);
131
134
  border-radius: var(--sui-checkbox-height);
@@ -18,6 +18,7 @@ export default class Radio extends SvelteComponent<{
18
18
  hidden?: boolean;
19
19
  }, {
20
20
  select: Event;
21
+ change: Event;
21
22
  } & {
22
23
  [evt: string]: CustomEvent<any>;
23
24
  }, {
@@ -41,6 +42,7 @@ declare const __propDef: {
41
42
  };
42
43
  events: {
43
44
  select: Event;
45
+ change: Event;
44
46
  } & {
45
47
  [evt: string]: CustomEvent<any>;
46
48
  };
@@ -100,13 +100,13 @@
100
100
  }
101
101
  </script>
102
102
 
103
- <div class="sui combobox {className}" hidden={hidden || undefined} {...$$restProps}>
103
+ <div role="none" class="sui combobox {className}" hidden={hidden || undefined} {...$$restProps}>
104
104
  {#if !editable}
105
105
  <div
106
+ role="combobox"
106
107
  {id}
107
108
  class:selected={value !== undefined}
108
109
  tabindex={disabled ? -1 : 0}
109
- role="combobox"
110
110
  aria-controls="{id}-popup"
111
111
  aria-expanded={$isPopupOpen}
112
112
  aria-hidden={hidden}
@@ -117,7 +117,7 @@
117
117
  {...$$restProps}
118
118
  bind:this={comboboxElement}
119
119
  >
120
- <div class="label">
120
+ <div role="none" class="label">
121
121
  {value !== undefined ? label : $_('_sui.combobox.select_an_option')}
122
122
  </div>
123
123
  </div>
@@ -145,6 +145,7 @@
145
145
  {hidden}
146
146
  {disabled}
147
147
  tabindex={readonly || disabled ? -1 : 0}
148
+ aria-label={$isPopupOpen ? $_('_sui.collapse') : $_('_sui.expand')}
148
149
  aria-controls="{id}-popup"
149
150
  aria-expanded={$isPopupOpen}
150
151
  on:click={(event) => {
@@ -156,11 +157,7 @@
156
157
  }
157
158
  }}
158
159
  >
159
- <Icon
160
- slot="start-icon"
161
- name="expand_more"
162
- label={$isPopupOpen ? $_('_sui.collapse') : $_('_sui.expand')}
163
- />
160
+ <Icon slot="start-icon" name="expand_more" />
164
161
  </Button>
165
162
  </div>
166
163
  <Popup
@@ -168,7 +165,6 @@
168
165
  class="combobox"
169
166
  anchor={comboboxElement ?? inputComponent?.element}
170
167
  {position}
171
- keepContent={true}
172
168
  touchOptimized={true}
173
169
  bind:open={isPopupOpen}
174
170
  bind:this={popupComponent}
@@ -185,6 +181,7 @@
185
181
  </Popup>
186
182
 
187
183
  <style>.combobox {
184
+ margin: var(--sui-focus-ring-width);
188
185
  display: flex;
189
186
  align-items: center;
190
187
  position: relative;
@@ -203,6 +200,7 @@
203
200
  position: absolute;
204
201
  inset: 0 0 auto auto;
205
202
  z-index: 1;
203
+ margin: 0 !important;
206
204
  border-top-left-radius: 0;
207
205
  border-bottom-left-radius: 0;
208
206
  }
@@ -244,6 +242,10 @@
244
242
  white-space: nowrap;
245
243
  text-overflow: ellipsis;
246
244
  }
245
+ .combobox :global(.text-input) {
246
+ margin: 0 !important;
247
+ width: 100% !important;
248
+ }
247
249
  .combobox :global(input) {
248
250
  padding: 0 32px 0 8px;
249
251
  width: 0;
@@ -250,6 +250,10 @@
250
250
  * Initialize the variables.
251
251
  */
252
252
  const init = () => {
253
+ if (!base) {
254
+ return;
255
+ }
256
+
253
257
  barWidth = base.clientWidth;
254
258
 
255
259
  const stepCount = (max - min) / step + 1;
@@ -262,13 +266,15 @@
262
266
  };
263
267
 
264
268
  onMount(() => {
269
+ const observer = new ResizeObserver(() => init());
265
270
  const query = window.matchMedia('(pointer: coarse)');
266
271
 
267
- new ResizeObserver(() => init()).observe(base);
272
+ observer.observe(base);
268
273
  query.addEventListener('change', init);
269
274
  init();
270
275
 
271
276
  return () => {
277
+ observer.disconnect();
272
278
  query.removeEventListener('change', init);
273
279
  };
274
280
  });
@@ -287,21 +293,21 @@
287
293
  />
288
294
 
289
295
  <div
296
+ role="none"
290
297
  class="sui slider {className}"
291
298
  class:disabled
292
299
  class:readonly
293
- role="none"
294
300
  hidden={hidden || undefined}
295
301
  {...$$restProps}
296
302
  on:click|preventDefault|stopPropagation
297
303
  >
298
304
  <div
299
- class="base"
300
305
  role="none"
306
+ class="base"
301
307
  bind:this={base}
302
308
  on:click|preventDefault|stopPropagation={(event) => onClick(event)}
303
309
  >
304
- <div class="base-bar" />
310
+ <div role="none" class="base-bar" />
305
311
  <div
306
312
  class="slider-bar"
307
313
  style:left="{multiThumb ? sliderPositions[0] : 0}px"
@@ -342,8 +348,8 @@
342
348
  {#if optionLabels.length}
343
349
  {#each optionLabels as label, index}
344
350
  <span
351
+ role="none"
345
352
  class="label"
346
- role="presentation"
347
353
  style:left="{(barWidth / (optionLabels.length - 1)) * index}px"
348
354
  >
349
355
  {label}
@@ -356,6 +362,7 @@
356
362
  <style>.slider {
357
363
  position: relative;
358
364
  display: inline-block;
365
+ margin: var(--sui-focus-ring-width);
359
366
  padding: var(--sui-checkbox-height) calc(var(--sui-checkbox-height) / 2);
360
367
  touch-action: none;
361
368
  }
@@ -49,9 +49,9 @@
49
49
  </script>
50
50
 
51
51
  <button
52
+ role="switch"
52
53
  class="sui switch {className}"
53
54
  type="button"
54
- role="switch"
55
55
  hidden={hidden || undefined}
56
56
  disabled={disabled || undefined}
57
57
  aria-checked={checked}
@@ -67,7 +67,7 @@
67
67
  }
68
68
  }}
69
69
  >
70
- <span />
70
+ <span role="none" />
71
71
  {#if label}
72
72
  {label}
73
73
  {:else}
@@ -79,6 +79,7 @@
79
79
  display: inline-flex;
80
80
  align-items: center;
81
81
  gap: 8px;
82
+ margin: var(--sui-focus-ring-width);
82
83
  border-width: 0;
83
84
  border-style: solid;
84
85
  border-color: transparent;
@@ -9,8 +9,8 @@
9
9
  export default class Switch extends SvelteComponent<{
10
10
  [x: string]: any;
11
11
  class?: string;
12
- label?: string;
13
12
  invalid?: boolean;
13
+ label?: string;
14
14
  checked?: boolean | "mixed";
15
15
  disabled?: boolean;
16
16
  required?: boolean;
@@ -30,8 +30,8 @@ declare const __propDef: {
30
30
  props: {
31
31
  [x: string]: any;
32
32
  class?: string;
33
- label?: string | undefined;
34
33
  invalid?: boolean;
34
+ label?: string | undefined;
35
35
  checked?: boolean | 'mixed';
36
36
  disabled?: boolean;
37
37
  required?: boolean;
@@ -5,19 +5,47 @@
5
5
  @see https://w3c.github.io/aria/#rowgroup
6
6
  -->
7
7
  <script>
8
+ import { getRandomId } from '../../services/util';
9
+
8
10
  /**
9
- * CSS class name on the button.
11
+ * The `class` attribute on the wrapper element.
10
12
  * @type {string}
11
13
  */
12
14
  let className = '';
13
-
14
15
  export { className as class };
16
+
17
+ /**
18
+ * Display label for the row group.
19
+ * @type {string}
20
+ */
21
+ export let label = '';
22
+
23
+ const id = getRandomId('tbody');
15
24
  </script>
16
25
 
17
- <div role="rowgroup" class="sui table-body {className}" {...$$restProps}>
26
+ <div
27
+ role="rowgroup"
28
+ class="sui table-body row-group {className}"
29
+ aria-labelledby={label ? `${id}-label` : undefined}
30
+ aria-roledescription="table body"
31
+ {...$$restProps}
32
+ >
33
+ {#if label}
34
+ <tr class="row-group-caption">
35
+ <th id="{id}-label" colspan="9999" scope="rowgroup">{label}</th>
36
+ </tr>
37
+ {/if}
18
38
  <slot />
19
39
  </div>
20
40
 
21
41
  <style>.table-body {
22
42
  display: table-row-group;
43
+ }
44
+
45
+ th {
46
+ padding: 8px;
47
+ color: var(--sui-secondary-foreground-color);
48
+ background-color: var(--sui-secondary-background-color);
49
+ font-size: var(--sui-font-size-default);
50
+ text-align: left;
23
51
  }</style>
@@ -9,6 +9,7 @@
9
9
  export default class TableBody extends SvelteComponent<{
10
10
  [x: string]: any;
11
11
  class?: string;
12
+ label?: string;
12
13
  }, {
13
14
  [evt: string]: CustomEvent<any>;
14
15
  }, {
@@ -23,6 +24,7 @@ declare const __propDef: {
23
24
  props: {
24
25
  [x: string]: any;
25
26
  class?: string;
27
+ label?: string;
26
28
  };
27
29
  events: {
28
30
  [evt: string]: CustomEvent<any>;
@@ -2,19 +2,18 @@
2
2
  @component
3
3
  The equivalent of the HTML `<td>` element.
4
4
  @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/td
5
- @see https://w3c.github.io/aria/#gridcell
5
+ @see https://w3c.github.io/aria/#cell
6
6
  -->
7
7
  <script>
8
8
  /**
9
- * CSS class name on the button.
9
+ * The `class` attribute on the wrapper element.
10
10
  * @type {string}
11
11
  */
12
12
  let className = '';
13
-
14
13
  export { className as class };
15
14
  </script>
16
15
 
17
- <div role="gridcell" class="sui table-cell {className}" {...$$restProps}>
16
+ <div role="cell" class="sui table-cell {className}" {...$$restProps}>
18
17
  <slot />
19
18
  </div>
20
19
 
@@ -4,7 +4,7 @@
4
4
  /**
5
5
  * The equivalent of the HTML `<td>` element.
6
6
  * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/td
7
- * @see https://w3c.github.io/aria/#gridcell
7
+ * @see https://w3c.github.io/aria/#cell
8
8
  */
9
9
  export default class TableCell extends SvelteComponent<{
10
10
  [x: string]: any;
@@ -6,11 +6,10 @@
6
6
  -->
7
7
  <script>
8
8
  /**
9
- * CSS class name on the button.
9
+ * The `class` attribute on the wrapper element.
10
10
  * @type {string}
11
11
  */
12
12
  let className = '';
13
-
14
13
  export { className as class };
15
14
  </script>
16
15