@sveltia/ui 0.10.6 → 0.10.7

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.
@@ -137,6 +137,7 @@
137
137
  on:mouseenter
138
138
  on:mouseleave
139
139
  on:click
140
+ on:dblclick
140
141
  on:dragover
141
142
  on:dragleave
142
143
  on:dragend
@@ -144,6 +145,8 @@
144
145
  on:keydown
145
146
  on:keyup
146
147
  on:keypress
148
+ on:focus
149
+ on:blur
147
150
  on:select={(/** @type {CustomEvent} */ event) => {
148
151
  dispatch('select', event.detail);
149
152
  }}
@@ -31,6 +31,7 @@ export default class Button extends SvelteComponent<{
31
31
  mouseenter: MouseEvent;
32
32
  mouseleave: MouseEvent;
33
33
  click: MouseEvent;
34
+ dblclick: MouseEvent;
34
35
  dragover: DragEvent;
35
36
  dragleave: DragEvent;
36
37
  dragend: DragEvent;
@@ -38,6 +39,8 @@ export default class Button extends SvelteComponent<{
38
39
  keydown: KeyboardEvent;
39
40
  keyup: KeyboardEvent;
40
41
  keypress: KeyboardEvent;
42
+ focus: FocusEvent;
43
+ blur: FocusEvent;
41
44
  select: CustomEvent<any>;
42
45
  change: CustomEvent<any>;
43
46
  } & {
@@ -137,6 +140,7 @@ declare const __propDef: {
137
140
  mouseenter: MouseEvent;
138
141
  mouseleave: MouseEvent;
139
142
  click: MouseEvent;
143
+ dblclick: MouseEvent;
140
144
  dragover: DragEvent;
141
145
  dragleave: DragEvent;
142
146
  dragend: DragEvent;
@@ -144,6 +148,8 @@ declare const __propDef: {
144
148
  keydown: KeyboardEvent;
145
149
  keyup: KeyboardEvent;
146
150
  keypress: KeyboardEvent;
151
+ focus: FocusEvent;
152
+ blur: FocusEvent;
147
153
  select: CustomEvent<any>;
148
154
  change: CustomEvent<any>;
149
155
  } & {
@@ -69,6 +69,7 @@
69
69
  aria-checked={selected}
70
70
  {...$$restProps}
71
71
  on:click
72
+ on:dblclick
72
73
  on:select
73
74
  on:change
74
75
  on:change={(event) => {
@@ -19,6 +19,7 @@ export default class SelectButton extends SvelteComponent<{
19
19
  selected?: boolean | undefined;
20
20
  }, {
21
21
  click: MouseEvent;
22
+ dblclick: MouseEvent;
22
23
  select: CustomEvent<any>;
23
24
  change: CustomEvent<any>;
24
25
  } & {
@@ -52,6 +53,7 @@ declare const __propDef: {
52
53
  };
53
54
  events: {
54
55
  click: MouseEvent;
56
+ dblclick: MouseEvent;
55
57
  select: CustomEvent<any>;
56
58
  change: CustomEvent<any>;
57
59
  } & {
@@ -29,6 +29,9 @@
29
29
  aria-selected={selected}
30
30
  {...$$restProps}
31
31
  on:click
32
+ on:dblclick
33
+ on:focus
34
+ on:blur
32
35
  on:select={(/** @type {any} */ event) => {
33
36
  dispatch('select', /** @type {CustomEvent} */ (event).detail);
34
37
  }}
@@ -12,6 +12,9 @@ export default class GridRow extends SvelteComponent<{
12
12
  selected?: boolean | undefined;
13
13
  }, {
14
14
  click: MouseEvent;
15
+ dblclick: MouseEvent;
16
+ focus: FocusEvent;
17
+ blur: FocusEvent;
15
18
  select: CustomEvent<any>;
16
19
  change: CustomEvent<any>;
17
20
  } & {
@@ -32,6 +35,9 @@ declare const __propDef: {
32
35
  };
33
36
  events: {
34
37
  click: MouseEvent;
38
+ dblclick: MouseEvent;
39
+ focus: FocusEvent;
40
+ blur: FocusEvent;
35
41
  select: CustomEvent<any>;
36
42
  change: CustomEvent<any>;
37
43
  } & {
@@ -53,6 +53,9 @@
53
53
  data-type={typeof value}
54
54
  {...$$restProps}
55
55
  on:click
56
+ on:dblclick
57
+ on:focus
58
+ on:blur
56
59
  on:dragover
57
60
  on:dragleave
58
61
  on:dragend
@@ -16,6 +16,9 @@ export default class Option extends SvelteComponent<{
16
16
  selected?: boolean | undefined;
17
17
  }, {
18
18
  click: MouseEvent;
19
+ dblclick: MouseEvent;
20
+ focus: FocusEvent;
21
+ blur: FocusEvent;
19
22
  dragover: DragEvent;
20
23
  dragleave: DragEvent;
21
24
  dragend: DragEvent;
@@ -51,6 +54,9 @@ declare const __propDef: {
51
54
  };
52
55
  events: {
53
56
  click: MouseEvent;
57
+ dblclick: MouseEvent;
58
+ focus: FocusEvent;
59
+ blur: FocusEvent;
54
60
  dragover: DragEvent;
55
61
  dragleave: DragEvent;
56
62
  dragend: DragEvent;
@@ -72,6 +72,8 @@
72
72
  $isPopupOpen = false;
73
73
  }
74
74
  }}
75
+ on:focus
76
+ on:blur
75
77
  on:select
76
78
  on:change
77
79
  >
@@ -16,6 +16,8 @@ export default class MenuItem extends SvelteComponent<{
16
16
  iconLabel?: string | undefined;
17
17
  }, {
18
18
  click: MouseEvent;
19
+ focus: FocusEvent;
20
+ blur: FocusEvent;
19
21
  select: CustomEvent<any>;
20
22
  change: CustomEvent<any>;
21
23
  } & {
@@ -49,6 +51,8 @@ declare const __propDef: {
49
51
  };
50
52
  events: {
51
53
  click: MouseEvent;
54
+ focus: FocusEvent;
55
+ blur: FocusEvent;
52
56
  select: CustomEvent<any>;
53
57
  change: CustomEvent<any>;
54
58
  } & {
@@ -81,6 +81,8 @@
81
81
  event.preventDefault();
82
82
  checked = true;
83
83
  }}
84
+ on:focus
85
+ on:blur
84
86
  on:select
85
87
  on:change
86
88
  />
@@ -17,6 +17,8 @@ export default class Radio extends SvelteComponent<{
17
17
  value?: string | undefined;
18
18
  hidden?: boolean | undefined;
19
19
  }, {
20
+ focus: FocusEvent;
21
+ blur: FocusEvent;
20
22
  select: CustomEvent<any>;
21
23
  change: CustomEvent<any>;
22
24
  } & {
@@ -41,6 +43,8 @@ declare const __propDef: {
41
43
  hidden?: boolean | undefined;
42
44
  };
43
45
  events: {
46
+ focus: FocusEvent;
47
+ blur: FocusEvent;
44
48
  select: CustomEvent<any>;
45
49
  change: CustomEvent<any>;
46
50
  } & {
@@ -64,6 +64,7 @@
64
64
 
65
65
  const dispatch = createEventDispatcher();
66
66
  const id = getRandomId('combobox');
67
+ const selectedSelector = '[role="option"][aria-selected="true"]';
67
68
  /** @type {HTMLElement} */
68
69
  let comboboxElement;
69
70
  /** @type {TextInput | undefined} */
@@ -75,22 +76,40 @@
75
76
  let label = '';
76
77
 
77
78
  /**
78
- * Update the `value` and `label` whenever an option is selected.
79
+ * Update the {@link label} and selected option when the {@link value} is changed.
80
+ */
81
+ const onChange = () => {
82
+ const selected = popupComponent?.content?.querySelector(selectedSelector);
83
+
84
+ const target = /** @type {HTMLButtonElement} */ (
85
+ popupComponent?.content?.querySelector(`[role="option"][value="${value}"]`)
86
+ );
87
+
88
+ if (target) {
89
+ label = target.querySelector('.label')?.textContent || target.textContent || target.value;
90
+
91
+ if (selected !== target) {
92
+ selected?.setAttribute('aria-selected', 'false');
93
+ target.setAttribute('aria-selected', 'true');
94
+ }
95
+ }
96
+ };
97
+
98
+ /**
99
+ * Update the {@link value} whenever an option is selected.
79
100
  * @param {HTMLButtonElement} target - Selected option.
80
101
  */
81
102
  const onSelect = (target) => {
82
103
  // @todo support more types
83
104
  value = target.dataset.type === 'number' ? Number(target.value) : target.value;
84
- label = target.querySelector('.label')?.textContent || target.value;
105
+ onChange();
85
106
  dispatch('change', { target: inputComponent?.element, value });
86
107
  };
87
108
 
88
109
  $: {
89
110
  if (popupComponent?.content) {
90
111
  window.requestAnimationFrame(() => {
91
- const selected = popupComponent?.content?.querySelector(
92
- '[role="option"][aria-selected="true"]',
93
- );
112
+ const selected = popupComponent?.content?.querySelector(selectedSelector);
94
113
 
95
114
  if (selected) {
96
115
  onSelect(/** @type {HTMLButtonElement} */ (selected));
@@ -98,6 +117,11 @@
98
117
  });
99
118
  }
100
119
  }
120
+
121
+ $: {
122
+ void value;
123
+ onChange();
124
+ }
101
125
  </script>
102
126
 
103
127
  <div
@@ -37,6 +37,8 @@
37
37
  {disabled}
38
38
  aria-selected={selected}
39
39
  {...$$restProps}
40
+ on:focus
41
+ on:blur
40
42
  on:select
41
43
  on:change
42
44
  >
@@ -13,6 +13,8 @@ export default class Tab extends SvelteComponent<{
13
13
  hidden?: boolean | undefined;
14
14
  selected?: boolean | undefined;
15
15
  }, {
16
+ focus: FocusEvent;
17
+ blur: FocusEvent;
16
18
  select: CustomEvent<any>;
17
19
  change: CustomEvent<any>;
18
20
  } & {
@@ -40,6 +42,8 @@ declare const __propDef: {
40
42
  selected?: boolean | undefined;
41
43
  };
42
44
  events: {
45
+ focus: FocusEvent;
46
+ blur: FocusEvent;
43
47
  select: CustomEvent<any>;
44
48
  change: CustomEvent<any>;
45
49
  } & {
@@ -78,13 +78,21 @@
78
78
  background-color: var(--sui-selected-background-color);
79
79
  }
80
80
  [role=toolbar] :global(h2) {
81
+ flex: auto;
81
82
  display: flex;
82
83
  align-items: center;
83
84
  gap: 8px;
84
85
  margin: 0;
85
86
  padding: 0 8px;
87
+ min-width: 0;
86
88
  font-size: var(--sui-font-size-large);
87
89
  }
90
+ [role=toolbar] :global(h2) :global(strong) {
91
+ display: block;
92
+ overflow: hidden;
93
+ text-overflow: ellipsis;
94
+ white-space: nowrap;
95
+ }
88
96
  [role=toolbar] :global(h2) :global(span) {
89
97
  font-size: var(--sui-font-size-small);
90
98
  font-weight: normal;
@@ -171,7 +171,7 @@
171
171
  --sui-font-weight-normal: 300;
172
172
  --sui-font-weight-bold: 600;
173
173
  --sui-font-family-monospace: "Noto Sans Mono", monospace;
174
- --sui-font-size-monospace: 13px;
174
+ --sui-font-size-monospace: 12.5px;
175
175
  --sui-line-height-default: 1.25;
176
176
  --sui-line-height-compact: 1.5;
177
177
  --sui-line-height-comfortable: 1.75;
@@ -424,6 +424,10 @@
424
424
  }
425
425
  }
426
426
 
427
+ :global(::selection) {
428
+ background-color: var(--sui-primary-accent-color-translucent);
429
+ }
430
+
427
431
  :global(*) {
428
432
  -webkit-tap-highlight-color: transparent;
429
433
  }
@@ -465,6 +469,7 @@
465
469
  :global(code),
466
470
  :global(pre) {
467
471
  font-family: var(--sui-font-family-monospace);
472
+ font-size: var(--sui-font-size-monospace);
468
473
  }
469
474
 
470
475
  :global(pre) {
@@ -252,10 +252,15 @@ class Group {
252
252
 
253
253
  if (isTarget) {
254
254
  element.focus();
255
+ element.dispatchEvent(new CustomEvent('focus'));
255
256
  }
256
257
  });
257
258
  } else {
258
259
  element.classList.toggle('focused', isTarget);
260
+
261
+ if (isTarget) {
262
+ element.dispatchEvent(new CustomEvent('focus'));
263
+ }
259
264
  }
260
265
 
261
266
  if (controlTarget) {
@@ -35,6 +35,10 @@
35
35
  }
36
36
  }
37
37
 
38
+ ::selection {
39
+ background-color: var(--sui-primary-accent-color-translucent);
40
+ }
41
+
38
42
  * {
39
43
  -webkit-tap-highlight-color: transparent;
40
44
  }
@@ -76,6 +80,7 @@ li {
76
80
  code,
77
81
  pre {
78
82
  font-family: var(--sui-font-family-monospace);
83
+ font-size: var(--sui-font-size-monospace);
79
84
  }
80
85
 
81
86
  pre {
@@ -160,7 +160,7 @@
160
160
  --sui-font-weight-normal: 300;
161
161
  --sui-font-weight-bold: 600;
162
162
  --sui-font-family-monospace: "Noto Sans Mono", monospace;
163
- --sui-font-size-monospace: 13px;
163
+ --sui-font-size-monospace: 12.5px;
164
164
  --sui-line-height-default: 1.25;
165
165
  --sui-line-height-compact: 1.5;
166
166
  --sui-line-height-comfortable: 1.75;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sveltia/ui",
3
- "version": "0.10.6",
3
+ "version": "0.10.7",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "publishConfig": {
@@ -28,7 +28,7 @@
28
28
  "devDependencies": {
29
29
  "@playwright/test": "^1.42.1",
30
30
  "@sveltejs/adapter-auto": "^3.1.1",
31
- "@sveltejs/kit": "^2.5.3",
31
+ "@sveltejs/kit": "^2.5.4",
32
32
  "@sveltejs/package": "^2.3.0",
33
33
  "@sveltejs/vite-plugin-svelte": "^3.0.2",
34
34
  "cspell": "^8.6.0",
@@ -43,16 +43,16 @@
43
43
  "postcss-html": "^1.6.0",
44
44
  "prettier": "^3.2.5",
45
45
  "prettier-plugin-svelte": "^3.2.2",
46
- "sass": "^1.71.1",
46
+ "sass": "^1.72.0",
47
47
  "stylelint": "^16.2.1",
48
48
  "stylelint-config-recommended-scss": "^14.0.0",
49
49
  "stylelint-scss": "^6.2.1",
50
- "svelte-check": "^3.6.6",
50
+ "svelte-check": "^3.6.7",
51
51
  "svelte-i18n": "^4.0.0",
52
52
  "svelte-preprocess": "^5.1.3",
53
53
  "tslib": "^2.6.2",
54
- "vite": "^5.1.5",
55
- "vitest": "^1.3.1"
54
+ "vite": "^5.1.6",
55
+ "vitest": "^1.4.0"
56
56
  },
57
57
  "exports": {
58
58
  "./package.json": "./package.json",