@sveltia/ui 0.7.4 → 0.8.0

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 (118) 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 +13 -3
  4. package/package/components/button/button.svelte.d.ts +11 -4
  5. package/package/components/button/select-button-group.svelte +12 -8
  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 +16 -9
  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 +164 -220
  17. package/package/components/dialog/dialog.svelte.d.ts +20 -12
  18. package/package/components/dialog/prompt-dialog.svelte +78 -0
  19. package/package/components/dialog/prompt-dialog.svelte.d.ts +72 -0
  20. package/package/components/disclosure/disclosure.svelte +3 -3
  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 +118 -208
  25. package/package/components/drawer/drawer.svelte.d.ts +12 -8
  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 +6 -6
  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 +8 -8
  59. package/package/components/radio/radio-group.svelte.d.ts +2 -2
  60. package/package/components/radio/radio.svelte +5 -2
  61. package/package/components/radio/radio.svelte.d.ts +2 -0
  62. package/package/components/select/combobox.svelte +55 -35
  63. package/package/components/select/combobox.svelte.d.ts +3 -2
  64. package/package/components/select/select.svelte +10 -9
  65. package/package/components/select/select.svelte.d.ts +4 -3
  66. package/package/components/slider/slider.svelte +15 -7
  67. package/package/components/switch/switch.svelte +9 -6
  68. package/package/components/switch/switch.svelte.d.ts +2 -2
  69. package/package/components/table/table-body.svelte +31 -3
  70. package/package/components/table/table-body.svelte.d.ts +2 -0
  71. package/package/components/table/table-cell.svelte +3 -4
  72. package/package/components/table/table-cell.svelte.d.ts +1 -1
  73. package/package/components/table/table-col-header.svelte +1 -2
  74. package/package/components/table/table-foot.svelte +7 -3
  75. package/package/components/table/table-head.svelte +7 -3
  76. package/package/components/table/table-row-header.svelte +1 -2
  77. package/package/components/table/table-row.svelte +1 -14
  78. package/package/components/table/table-row.svelte.d.ts +0 -8
  79. package/package/components/table/table.svelte +5 -17
  80. package/package/components/table/table.svelte.d.ts +1 -7
  81. package/package/components/tabs/tab-list.svelte +7 -5
  82. package/package/components/tabs/tab-panel.svelte +1 -1
  83. package/package/components/tabs/tab.svelte +2 -1
  84. package/package/components/tabs/tab.svelte.d.ts +2 -0
  85. package/package/components/text-field/markdown-editor.svelte +36 -9
  86. package/package/components/text-field/markdown-editor.svelte.d.ts +2 -0
  87. package/package/components/text-field/number-input.svelte +107 -43
  88. package/package/components/text-field/number-input.svelte.d.ts +2 -0
  89. package/package/components/text-field/password-input.svelte +43 -12
  90. package/package/components/text-field/password-input.svelte.d.ts +2 -0
  91. package/package/components/text-field/search-bar.svelte +43 -13
  92. package/package/components/text-field/search-bar.svelte.d.ts +5 -0
  93. package/package/components/text-field/text-area.svelte +26 -6
  94. package/package/components/text-field/text-area.svelte.d.ts +2 -0
  95. package/package/components/text-field/text-input.svelte +37 -7
  96. package/package/components/text-field/text-input.svelte.d.ts +14 -4
  97. package/package/components/toast/toast.svelte +6 -16
  98. package/package/components/toast/toast.svelte.d.ts +2 -2
  99. package/package/components/toolbar/toolbar.svelte +3 -4
  100. package/package/components/util/app-shell.svelte +34 -29
  101. package/package/components/util/group.svelte +2 -2
  102. package/package/components/util/modal.svelte +220 -0
  103. package/package/components/util/modal.svelte.d.ts +83 -0
  104. package/package/components/util/popup.svelte +80 -121
  105. package/package/components/util/popup.svelte.d.ts +22 -13
  106. package/package/components/util/portal.svelte +1 -1
  107. package/package/index.d.ts +12 -0
  108. package/package/index.js +12 -0
  109. package/package/locales/en.d.ts +1 -0
  110. package/package/locales/en.js +1 -0
  111. package/package/locales/ja.d.ts +1 -0
  112. package/package/locales/ja.js +1 -0
  113. package/package/services/group.js +67 -13
  114. package/package/services/popup.d.ts +5 -1
  115. package/package/services/popup.js +22 -19
  116. package/package/styles/core.scss +13 -26
  117. package/package/styles/variables.scss +14 -2
  118. package/package.json +107 -11
@@ -8,17 +8,17 @@
8
8
  import Icon from '../icon/icon.svelte';
9
9
 
10
10
  /**
11
- * Alert type.
11
+ * Status of the alert.
12
12
  * @type {'error' | 'warning' | 'info' | 'success'}
13
13
  */
14
- export let type = 'error';
14
+ export let status = 'error';
15
15
  </script>
16
16
 
17
- <div class="sui alert {type}" role="alert" {...$$restProps}>
17
+ <div role="alert" class="sui alert {status}" {...$$restProps}>
18
18
  {#if $$slots.icon}
19
19
  <slot name="icon" />
20
20
  {:else}
21
- <Icon name={type === 'success' ? 'check_circle' : type} />
21
+ <Icon name={status === 'success' ? 'check_circle' : status} />
22
22
  {/if}
23
23
  <slot />
24
24
  </div>
@@ -8,7 +8,7 @@
8
8
  */
9
9
  export default class Alert extends SvelteComponent<{
10
10
  [x: string]: any;
11
- type?: "error" | "warning" | "info" | "success";
11
+ status?: "error" | "warning" | "info" | "success";
12
12
  }, {
13
13
  [evt: string]: CustomEvent<any>;
14
14
  }, {
@@ -23,7 +23,7 @@ import { SvelteComponent } from "svelte";
23
23
  declare const __propDef: {
24
24
  props: {
25
25
  [x: string]: any;
26
- type?: 'error' | 'warning' | 'info' | 'success';
26
+ status?: 'error' | 'warning' | 'info' | 'success';
27
27
  };
28
28
  events: {
29
29
  [evt: string]: CustomEvent<any>;
@@ -51,6 +51,12 @@
51
51
  * @type {boolean}
52
52
  */
53
53
  export let disabled = false;
54
+ /**
55
+ * Whether to make the widget read-only. An alias of the `aria-readonly` attribute used in certain
56
+ * roles, including `checkbox`, `listbox`, `slider` and `textbox`.
57
+ * @type {boolean | undefined}
58
+ */
59
+ export let readonly = undefined;
54
60
  /**
55
61
  * Whether to mark the widget pressed. An alias of the `aria-pressed` attribute.
56
62
  * @type {boolean | 'mixed' | undefined}
@@ -110,6 +116,7 @@
110
116
  {role}
111
117
  aria-hidden={hidden}
112
118
  aria-disabled={disabled}
119
+ aria-readonly={readonly}
113
120
  aria-pressed={pressed}
114
121
  {...$$restProps}
115
122
  bind:this={element}
@@ -125,21 +132,22 @@
125
132
  on:keyup
126
133
  on:keypress
127
134
  on:select
135
+ on:change
128
136
  >
129
137
  <slot name="start-icon" />
130
138
  {#if variant === 'link'}
131
139
  {#if label}
132
- <span class="label">
140
+ <span role="none" class="label">
133
141
  {label}
134
142
  </span>
135
143
  {:else}
136
- <span class="label">
144
+ <span role="none" class="label">
137
145
  <slot />
138
146
  </span>
139
147
  {/if}
140
148
  {:else}
141
149
  {#if label}
142
- <span class="label">
150
+ <span role="none" class="label">
143
151
  {label}
144
152
  </span>
145
153
  {/if}
@@ -158,6 +166,7 @@
158
166
  display: inline-flex;
159
167
  align-items: center;
160
168
  gap: 4px;
169
+ margin: var(--sui-focus-ring-width);
161
170
  border-width: 0;
162
171
  border-style: solid;
163
172
  border-color: transparent;
@@ -246,6 +255,7 @@ button:global(.link) {
246
255
  color: var(--sui-primary-accent-color-text);
247
256
  }
248
257
  button:global(.link) :global(.label) {
258
+ padding: 0;
249
259
  line-height: var(--sui-line-height-compact);
250
260
  white-space: normal;
251
261
  }
@@ -11,13 +11,14 @@ export default class Button extends SvelteComponent<{
11
11
  class?: string;
12
12
  name?: string;
13
13
  label?: string;
14
- type?: "reset" | "submit" | "button";
15
14
  disabled?: boolean;
16
15
  size?: "small" | "medium" | "large";
16
+ type?: "reset" | "submit" | "button";
17
17
  value?: string;
18
+ role?: string;
18
19
  hidden?: boolean;
19
20
  element?: HTMLButtonElement;
20
- role?: string;
21
+ readonly?: boolean;
21
22
  pressed?: boolean | "mixed";
22
23
  keyShortcuts?: string;
23
24
  variant?: "link" | "primary" | "secondary" | "tertiary" | "ghost";
@@ -36,6 +37,7 @@ export default class Button extends SvelteComponent<{
36
37
  keyup: KeyboardEvent;
37
38
  keypress: KeyboardEvent;
38
39
  select: Event;
40
+ change: Event;
39
41
  } & {
40
42
  [evt: string]: CustomEvent<any>;
41
43
  }, {
@@ -69,6 +71,9 @@ export default class Button extends SvelteComponent<{
69
71
  set disabled(arg: boolean);
70
72
  get disabled(): boolean;
71
73
  /**accessor*/
74
+ set readonly(arg: boolean);
75
+ get readonly(): boolean;
76
+ /**accessor*/
72
77
  set pressed(arg: boolean | "mixed");
73
78
  get pressed(): boolean | "mixed";
74
79
  /**accessor*/
@@ -103,13 +108,14 @@ declare const __propDef: {
103
108
  class?: string;
104
109
  name?: string | undefined;
105
110
  label?: string;
106
- type?: 'button' | 'submit' | 'reset';
107
111
  disabled?: boolean;
108
112
  size?: 'small' | 'medium' | 'large' | undefined;
113
+ type?: 'button' | 'submit' | 'reset';
109
114
  value?: string | undefined;
115
+ role?: string;
110
116
  hidden?: boolean | undefined;
111
117
  element?: HTMLButtonElement | undefined;
112
- role?: string;
118
+ readonly?: boolean | undefined;
113
119
  pressed?: boolean | 'mixed' | undefined;
114
120
  keyShortcuts?: string | undefined;
115
121
  variant?: 'primary' | 'secondary' | 'tertiary' | 'ghost' | 'link' | undefined;
@@ -129,6 +135,7 @@ declare const __propDef: {
129
135
  keyup: KeyboardEvent;
130
136
  keypress: KeyboardEvent;
131
137
  select: Event;
138
+ change: Event;
132
139
  } & {
133
140
  [evt: string]: CustomEvent<any>;
134
141
  };
@@ -24,27 +24,27 @@
24
24
  */
25
25
  export let disabled = false;
26
26
  /**
27
- * Whether to disable the widget. An alias of the `aria-readonly` attribute.
27
+ * Whether to make the widget read-only. An alias of the `aria-readonly` attribute.
28
28
  * @type {boolean}
29
29
  */
30
30
  export let readonly = false;
31
31
  /**
32
- * Whether to disable the widget. An alias of the `aria-required` attribute.
32
+ * Whether to mark the widget required. An alias of the `aria-required` attribute.
33
33
  * @type {boolean}
34
34
  */
35
35
  export let required = false;
36
36
  /**
37
- * Whether to disable the widget. An alias of the `aria-invalid` attribute.
37
+ * Whether to mark the widget invalid. An alias of the `aria-invalid` attribute.
38
38
  * @type {boolean}
39
39
  */
40
40
  export let invalid = false;
41
41
  </script>
42
42
 
43
43
  <div
44
+ role="radiogroup"
44
45
  class="sui select-button-group {className}"
45
46
  hidden={hidden || undefined}
46
47
  tabindex="-1"
47
- role="radiogroup"
48
48
  aria-hidden={hidden}
49
49
  aria-disabled={disabled}
50
50
  aria-readonly={readonly}
@@ -54,7 +54,7 @@
54
54
  use:activateGroup
55
55
  on:change
56
56
  >
57
- <div class="inner" inert={disabled}>
57
+ <div role="none" class="inner" inert={disabled}>
58
58
  <slot />
59
59
  </div>
60
60
  </div>
@@ -62,22 +62,26 @@
62
62
  <style>.select-button-group {
63
63
  display: inline-flex;
64
64
  align-items: center;
65
+ margin: var(--sui-focus-ring-width);
65
66
  }
66
67
  .select-button-group:focus-visible {
67
68
  outline-width: 0 !important;
68
69
  }
69
70
  .select-button-group :global(button) {
70
- border-radius: 0 !important;
71
+ margin: 0 !important;
72
+ border-radius: 0;
71
73
  color: var(--sui-primary-foreground-color);
72
74
  }
73
75
  .select-button-group :global(button):first-child {
74
- border-radius: 4px 0 0 4px !important;
76
+ border-top-left-radius: 4px !important;
77
+ border-bottom-left-radius: 4px;
75
78
  }
76
79
  .select-button-group :global(button):not(:first-child) {
77
80
  border-left-width: 0;
78
81
  }
79
82
  .select-button-group :global(button):last-child {
80
- border-radius: 0 4px 4px 0 !important;
83
+ border-top-right-radius: 4px;
84
+ border-bottom-right-radius: 4px;
81
85
  }
82
86
  .select-button-group :global(button[aria-checked="true"]) {
83
87
  color: var(--sui-highlight-foreground-color);
@@ -56,6 +56,7 @@
56
56
  </script>
57
57
 
58
58
  <Button
59
+ role="radio"
59
60
  class="sui select-button {className}"
60
61
  {value}
61
62
  {hidden}
@@ -64,14 +65,14 @@
64
65
  {variant}
65
66
  {size}
66
67
  {iconic}
67
- role="radio"
68
68
  aria-checked={selected}
69
69
  {...$$restProps}
70
70
  on:click
71
- on:click={() => {
72
- selected = !selected;
73
- }}
74
71
  on:select
72
+ on:change
73
+ on:change={(event) => {
74
+ selected = /** @type {CustomEvent} */ (event).detail.selected;
75
+ }}
75
76
  >
76
77
  <slot name="start-icon" slot="start-icon" />
77
78
  <slot />
@@ -20,6 +20,7 @@ export default class SelectButton extends SvelteComponent<{
20
20
  }, {
21
21
  click: MouseEvent;
22
22
  select: Event;
23
+ change: Event;
23
24
  } & {
24
25
  [evt: string]: CustomEvent<any>;
25
26
  }, {
@@ -52,6 +53,7 @@ declare const __propDef: {
52
53
  events: {
53
54
  click: MouseEvent;
54
55
  select: Event;
56
+ change: Event;
55
57
  } & {
56
58
  [evt: string]: CustomEvent<any>;
57
59
  };
@@ -50,34 +50,36 @@
50
50
 
51
51
  <div role="group">
52
52
  <input type="hidden" bind:value />
53
- <div class="header">
53
+ <div role="none" class="header">
54
54
  <Button
55
55
  variant="ghost"
56
56
  label={firstDay.toLocaleDateString('en', { year: 'numeric', month: 'short' })}
57
57
  aria-haspopup="dialog"
58
58
  >
59
59
  <Icon slot="end-icon" name="arrow_drop_down" />
60
- <div slot="popup" class="popup-inner" role="none" on:click|stopPropagation>
60
+ <div slot="popup" role="none" class="popup-inner" on:click|stopPropagation>
61
61
  <div role="group" aria-label={$_('_sui.calendar.year')}>
62
- <div class="header">
62
+ <div role="none" class="header">
63
63
  <Button
64
+ aria-label={$_('_sui.calendar.previous_decade')}
64
65
  on:click={() => {
65
66
  //
66
67
  }}
67
68
  >
68
- <Icon name="chevron_left" label={$_('_sui.calendar.previous_decade')} />
69
+ <Icon name="chevron_left" />
69
70
  </Button>
70
71
  <Button
72
+ aria-label={$_('_sui.calendar.next_decade')}
71
73
  on:click={() => {
72
74
  //
73
75
  }}
74
76
  >
75
- <Icon name="chevron_right" label={$_('_sui.calendar.next_decade')} />
77
+ <Icon name="chevron_right" />
76
78
  </Button>
77
79
  </div>
78
- <div class="grid">
80
+ <div role="none" class="grid">
79
81
  {#each [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] as year}
80
- <div>
82
+ <div role="none">
81
83
  <Button>202{year}</Button>
82
84
  </div>
83
85
  {/each}
@@ -85,9 +87,9 @@
85
87
  </div>
86
88
  <Divider orientation="vertical" />
87
89
  <div role="group" aria-label={$_('_sui.calendar.month')}>
88
- <div class="grid">
90
+ <div role="none" class="grid">
89
91
  {#each [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] as month}
90
- <div>
92
+ <div role="none">
91
93
  <Button>
92
94
  {new Date(date.getUTCFullYear(), month, 10).toLocaleDateString('en', {
93
95
  month: 'short',
@@ -100,30 +102,33 @@
100
102
  </div>
101
103
  </Button>
102
104
  <Button
105
+ aria-label={$_('_sui.calendar.previous_month')}
103
106
  on:click={() => {
104
107
  firstDay.setUTCMonth(firstDay.getUTCMonth() - 1);
105
108
  firstDay = firstDay;
106
109
  }}
107
110
  >
108
- <Icon name="chevron_left" label={$_('_sui.calendar.previous_month')} />
111
+ <Icon name="chevron_left" />
109
112
  </Button>
110
113
  <Button
114
+ aria-label={$_('_sui.calendar.next_month')}
111
115
  on:click={() => {
112
116
  firstDay.setUTCMonth(firstDay.getUTCMonth() + 1);
113
117
  firstDay = firstDay;
114
118
  }}
115
119
  >
116
- <Icon name="chevron_right" label={$_('_sui.calendar.next_month')} />
120
+ <Icon name="chevron_right" />
117
121
  </Button>
118
122
  </div>
119
- <div class="grid" role="listbox">
123
+ <div role="listbox" class="grid">
120
124
  {#each dayList.slice(0, 7) as { day }}
121
- <div class="weekday" role="presentation">
125
+ <div role="none" class="weekday">
122
126
  {day.toLocaleDateString('en', { weekday: 'narrow' })}
123
127
  </div>
124
128
  {/each}
125
129
  {#each dayList as { day }}
126
130
  <div
131
+ role="none"
127
132
  class:other-month={day.getUTCMonth() !== firstDay.getUTCMonth()}
128
133
  class:today={day.getFullYear() === now.getFullYear() &&
129
134
  day.getMonth() === now.getMonth() &&
@@ -141,7 +146,7 @@
141
146
  </div>
142
147
  {/each}
143
148
  </div>
144
- <div class="footer">
149
+ <div role="none" class="footer">
145
150
  <Button
146
151
  on:click={() => {
147
152
  value = '';
@@ -211,6 +216,7 @@
211
216
  }
212
217
  .grid div :global(button) {
213
218
  justify-content: center;
219
+ margin: 0 !important;
214
220
  width: 100%;
215
221
  height: 24px;
216
222
  border-radius: 50%;
@@ -27,14 +27,15 @@
27
27
  </script>
28
28
 
29
29
  <div
30
+ role="group"
30
31
  class="sui checkbox-group {className} {orientation}"
31
32
  hidden={hidden || undefined}
32
- role="group"
33
33
  aria-hidden={hidden}
34
34
  aria-disabled={disabled}
35
+ aria-roledescription="checkbox group"
35
36
  {...$$restProps}
36
37
  >
37
- <div class="inner" inert={disabled}>
38
+ <div role="none" class="inner" inert={disabled}>
38
39
  <slot />
39
40
  </div>
40
41
  </div>
@@ -43,16 +44,16 @@
43
44
  display: inline-flex;
44
45
  }
45
46
  .checkbox-group.horizontal {
46
- gap: 16px;
47
+ gap: 8px;
47
48
  align-items: center;
48
49
  }
49
50
  .checkbox-group.vertical {
50
- gap: 8px;
51
+ gap: 4px;
51
52
  flex-direction: column;
52
53
  }
53
54
  @media (pointer: coarse) {
54
55
  .checkbox-group.vertical {
55
- gap: 16px;
56
+ gap: 8px;
56
57
  }
57
58
  }
58
59
 
@@ -38,17 +38,17 @@
38
38
  */
39
39
  export let disabled = false;
40
40
  /**
41
- * Whether to disable the widget. An alias of the `aria-readonly` attribute.
41
+ * Whether to make the widget read-only. An alias of the `aria-readonly` attribute.
42
42
  * @type {boolean}
43
43
  */
44
44
  export let readonly = false;
45
45
  /**
46
- * Whether to disable the widget. An alias of the `aria-required` attribute.
46
+ * Whether to mark the widget required. An alias of the `aria-required` attribute.
47
47
  * @type {boolean}
48
48
  */
49
49
  export let required = false;
50
50
  /**
51
- * Whether to disable the widget. An alias of the `aria-invalid` attribute.
51
+ * Whether to mark the widget invalid. An alias of the `aria-invalid` attribute.
52
52
  * @type {boolean}
53
53
  */
54
54
  export let invalid = false;
@@ -77,25 +77,25 @@
77
77
  </script>
78
78
 
79
79
  <div
80
+ role="none"
80
81
  class="sui checkbox {className}"
81
82
  class:checked
82
83
  class:indeterminate
83
84
  class:disabled
85
+ class:readonly
84
86
  hidden={hidden || undefined}
85
- role="none"
86
- {...$$restProps}
87
87
  on:click|preventDefault|stopPropagation={(event) => {
88
88
  if (!(/** @type {HTMLElement} */ (event.target).matches('button'))) {
89
89
  buttonComponent.element.click();
90
90
  }
91
91
  }}
92
92
  >
93
- <div class="inner" inert={disabled}>
93
+ <div role="none" class="inner" inert={disabled}>
94
94
  <Button
95
+ role="checkbox"
95
96
  {id}
96
97
  {name}
97
98
  {value}
98
- role="checkbox"
99
99
  {hidden}
100
100
  {disabled}
101
101
  {readonly}
@@ -104,11 +104,16 @@
104
104
  aria-checked={checked}
105
105
  aria-label={ariaLabel || undefined}
106
106
  aria-labelledby={ariaLabel ? undefined : '{id}-label'}
107
+ {...$$restProps}
107
108
  bind:this={buttonComponent}
108
109
  on:click={(event) => {
110
+ event.preventDefault();
109
111
  event.stopPropagation();
110
- checked = indeterminate ? true : !checked;
111
- dispatch('change', { checked });
112
+
113
+ if (!disabled && !readonly) {
114
+ checked = indeterminate ? true : !checked;
115
+ dispatch('change', { checked });
116
+ }
112
117
  }}
113
118
  >
114
119
  <Icon slot="start-icon" name={indeterminate ? 'remove' : 'check'} />
@@ -129,6 +134,7 @@
129
134
  display: inline-flex;
130
135
  align-items: center;
131
136
  gap: 8px;
137
+ margin: var(--sui-focus-ring-width);
132
138
  color: var(--sui-control-foreground-color);
133
139
  font-family: var(--sui-control-font-family);
134
140
  font-size: var(--sui-control-font-size);
@@ -153,6 +159,7 @@
153
159
  align-items: center;
154
160
  justify-content: center;
155
161
  overflow: hidden;
162
+ margin: 0 !important;
156
163
  border-width: 1.5px;
157
164
  border-color: var(--sui-checkbox-border-color);
158
165
  border-radius: var(--sui-checkbox-border-radius);
@@ -11,8 +11,8 @@ export default class Checkbox extends SvelteComponent<{
11
11
  [x: string]: any;
12
12
  class?: string;
13
13
  name?: string;
14
- label?: string;
15
14
  invalid?: boolean;
15
+ label?: string;
16
16
  checked?: boolean | "mixed";
17
17
  disabled?: boolean;
18
18
  required?: boolean;
@@ -36,8 +36,8 @@ declare const __propDef: {
36
36
  [x: string]: any;
37
37
  class?: string;
38
38
  name?: string | undefined;
39
- label?: string | undefined;
40
39
  invalid?: boolean;
40
+ label?: string | undefined;
41
41
  checked?: boolean | 'mixed';
42
42
  disabled?: boolean;
43
43
  required?: boolean;
@@ -0,0 +1,50 @@
1
+ <!--
2
+ @component
3
+ A modal alert dialog. It only shows the OK button, just like `window.alert()`.
4
+ @see https://w3c.github.io/aria/#alertdialog
5
+ @see https://www.w3.org/WAI/ARIA/apg/patterns/alertdialog/
6
+ @see https://developer.mozilla.org/en-US/docs/Web/API/Window/alert
7
+ -->
8
+ <script>
9
+ import Dialog from './dialog.svelte';
10
+
11
+ /**
12
+ * The `class` attribute on the `<dialog>` element.
13
+ * @type {string}
14
+ */
15
+ let className = '';
16
+ export { className as class };
17
+ /**
18
+ * Whether to open the dialog.
19
+ * @type {boolean}
20
+ */
21
+ export let open = false;
22
+ /**
23
+ * Text label displayed on the header. Required.
24
+ * @type {string}
25
+ */
26
+ export let title;
27
+ /**
28
+ * Text label displayed on the OK button.
29
+ * @type {string}
30
+ */
31
+ export let okLabel = '';
32
+ </script>
33
+
34
+ <Dialog
35
+ role="alertdialog"
36
+ class={className}
37
+ bind:open
38
+ {title}
39
+ {okLabel}
40
+ showCancel={false}
41
+ {...$$restProps}
42
+ on:opening
43
+ on:open
44
+ on:ok
45
+ on:cancel
46
+ on:closing
47
+ on:close
48
+ >
49
+ <slot />
50
+ </Dialog>
@@ -0,0 +1,55 @@
1
+ /** @typedef {typeof __propDef.props} AlertDialogProps */
2
+ /** @typedef {typeof __propDef.events} AlertDialogEvents */
3
+ /** @typedef {typeof __propDef.slots} AlertDialogSlots */
4
+ /**
5
+ * A modal alert dialog. It only shows the OK button, just like `window.alert()`.
6
+ * @see https://w3c.github.io/aria/#alertdialog
7
+ * @see https://www.w3.org/WAI/ARIA/apg/patterns/alertdialog/
8
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/Window/alert
9
+ */
10
+ export default class AlertDialog extends SvelteComponent<{
11
+ [x: string]: any;
12
+ title: string;
13
+ class?: string;
14
+ open?: boolean;
15
+ okLabel?: string;
16
+ }, {
17
+ opening: CustomEvent<any>;
18
+ open: CustomEvent<any>;
19
+ ok: CustomEvent<any>;
20
+ cancel: CustomEvent<any>;
21
+ closing: CustomEvent<any>;
22
+ close: CustomEvent<any>;
23
+ } & {
24
+ [evt: string]: CustomEvent<any>;
25
+ }, {
26
+ default: {};
27
+ }> {
28
+ }
29
+ export type AlertDialogProps = typeof __propDef.props;
30
+ export type AlertDialogEvents = typeof __propDef.events;
31
+ export type AlertDialogSlots = typeof __propDef.slots;
32
+ import { SvelteComponent } from "svelte";
33
+ declare const __propDef: {
34
+ props: {
35
+ [x: string]: any;
36
+ title: string;
37
+ class?: string;
38
+ open?: boolean;
39
+ okLabel?: string;
40
+ };
41
+ events: {
42
+ opening: CustomEvent<any>;
43
+ open: CustomEvent<any>;
44
+ ok: CustomEvent<any>;
45
+ cancel: CustomEvent<any>;
46
+ closing: CustomEvent<any>;
47
+ close: CustomEvent<any>;
48
+ } & {
49
+ [evt: string]: CustomEvent<any>;
50
+ };
51
+ slots: {
52
+ default: {};
53
+ };
54
+ };
55
+ export {};