fluentui-svelte 0.5.0 → 0.7.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 (259) hide show
  1. package/dist/components/app-surface/app-surface.svelte +96 -0
  2. package/dist/components/app-surface/app-surface.svelte.d.ts +22 -0
  3. package/dist/components/app-surface/docs/llms.md +73 -0
  4. package/dist/components/app-surface/types.d.ts +19 -0
  5. package/dist/components/app-surface/types.js +1 -0
  6. package/dist/components/app-window/app-window.d.ts +3 -0
  7. package/dist/components/app-window/app-window.js +3 -0
  8. package/dist/components/app-window/app-window.svelte +193 -0
  9. package/dist/components/app-window/app-window.svelte.d.ts +25 -0
  10. package/dist/components/app-window/docs/llms.md +119 -0
  11. package/dist/components/app-window/types.d.ts +66 -0
  12. package/dist/components/app-window/types.js +1 -0
  13. package/dist/components/auto-suggest-box/auto-suggest-box.svelte +47 -31
  14. package/dist/components/auto-suggest-box/auto-suggest-box.svelte.d.ts +2 -2
  15. package/dist/components/auto-suggest-box/docs/llms.md +34 -33
  16. package/dist/components/auto-suggest-box/option.svelte +6 -4
  17. package/dist/components/auto-suggest-box/types.d.ts +13 -16
  18. package/dist/components/avatar/avatar.svelte +4 -3
  19. package/dist/components/avatar/docs/llms.md +1 -1
  20. package/dist/components/avatar/type.d.ts +1 -1
  21. package/dist/components/badge/badge-icon.svelte +2 -2
  22. package/dist/components/badge/badge.svelte +2 -2
  23. package/dist/components/badge/docs/llms.md +2 -2
  24. package/dist/components/badge/types.d.ts +2 -2
  25. package/dist/components/breadcrumb/breadcrumb-button.svelte +2 -2
  26. package/dist/components/breadcrumb/breadcrumb-divider.svelte +2 -2
  27. package/dist/components/breadcrumb/breadcrumb-item.svelte +2 -2
  28. package/dist/components/breadcrumb/breadcrumb.svelte +10 -5
  29. package/dist/components/breadcrumb/docs/llms.md +11 -11
  30. package/dist/components/breadcrumb/types.d.ts +7 -7
  31. package/dist/components/button/button.svelte +2 -2
  32. package/dist/components/button/docs/llms.md +17 -17
  33. package/dist/components/button/split-button.svelte +7 -7
  34. package/dist/components/button/types.d.ts +5 -5
  35. package/dist/components/calendar-date-picker/calendar-date-picker.svelte +98 -10
  36. package/dist/components/calendar-date-picker/calendar-date-picker.svelte.d.ts +1 -1
  37. package/dist/components/calendar-date-picker/docs/llms.md +19 -14
  38. package/dist/components/calendar-date-picker/types.d.ts +22 -8
  39. package/dist/components/calendar-view/calendar-view-days.svelte +3 -2
  40. package/dist/components/calendar-view/calendar-view-grid.js +8 -3
  41. package/dist/components/calendar-view/calendar-view-item.svelte +10 -4
  42. package/dist/components/calendar-view/calendar-view-months.svelte +3 -2
  43. package/dist/components/calendar-view/calendar-view-years.svelte +3 -2
  44. package/dist/components/calendar-view/calendar-view.svelte +11 -4
  45. package/dist/components/calendar-view/calendar-view.svelte.js +5 -0
  46. package/dist/components/calendar-view/docs/llms.md +20 -19
  47. package/dist/components/calendar-view/types.d.ts +6 -1
  48. package/dist/components/card/card-footer.svelte +2 -2
  49. package/dist/components/card/card-header.svelte +5 -4
  50. package/dist/components/card/card-preview.svelte +13 -2
  51. package/dist/components/card/card.svelte +5 -5
  52. package/dist/components/card/docs/llms.md +22 -21
  53. package/dist/components/card/types.d.ts +8 -4
  54. package/dist/components/checkbox/checkbox.svelte +47 -26
  55. package/dist/components/checkbox/checkbox.svelte.d.ts +3 -24
  56. package/dist/components/checkbox/docs/llms.md +24 -23
  57. package/dist/components/checkbox/types.d.ts +10 -23
  58. package/dist/components/date-picker/date-picker.svelte +98 -27
  59. package/dist/components/date-picker/date-picker.svelte.d.ts +1 -1
  60. package/dist/components/date-picker/docs/llms.md +23 -20
  61. package/dist/components/date-picker/types.d.ts +24 -15
  62. package/dist/components/dialog/dialog-actions.svelte +17 -2
  63. package/dist/components/dialog/dialog-content.svelte +2 -2
  64. package/dist/components/dialog/dialog-content.svelte.d.ts +1 -1
  65. package/dist/components/dialog/dialog-surface.svelte +130 -8
  66. package/dist/components/dialog/dialog-title.svelte +23 -6
  67. package/dist/components/dialog/dialog-trigger.svelte +8 -2
  68. package/dist/components/dialog/dialog-trigger.svelte.d.ts +1 -1
  69. package/dist/components/dialog/dialog.svelte +22 -11
  70. package/dist/components/dialog/docs/llms.md +56 -19
  71. package/dist/components/dialog/types.d.ts +31 -9
  72. package/dist/components/dialog/utils.d.ts +2 -0
  73. package/dist/components/dialog/utils.js +1 -0
  74. package/dist/components/divider/divider.svelte +6 -4
  75. package/dist/components/divider/types.d.ts +1 -1
  76. package/dist/components/dropdown/docs/llms.md +30 -28
  77. package/dist/components/dropdown/dropdown-option.svelte +17 -5
  78. package/dist/components/dropdown/dropdown.svelte +182 -84
  79. package/dist/components/dropdown/dropdown.svelte.d.ts +1 -1
  80. package/dist/components/dropdown/types.d.ts +26 -20
  81. package/dist/components/dropdown-select/docs/llms.md +24 -22
  82. package/dist/components/dropdown-select/dropdown-select-option.svelte +2 -2
  83. package/dist/components/dropdown-select/dropdown-select.svelte +42 -7
  84. package/dist/components/dropdown-select/types.d.ts +4 -4
  85. package/dist/components/expander/docs/llms.md +3 -3
  86. package/dist/components/expander/expander.svelte +13 -8
  87. package/dist/components/expander/types.d.ts +5 -5
  88. package/dist/components/flyout/docs/llms.md +1 -1
  89. package/dist/components/flyout/flyout.svelte +17 -6
  90. package/dist/components/flyout/types.d.ts +1 -1
  91. package/dist/components/hyperlink/docs/llms.md +6 -6
  92. package/dist/components/hyperlink/hyperlink.svelte +13 -4
  93. package/dist/components/hyperlink/types.d.ts +1 -1
  94. package/dist/components/info-bar/docs/llms.md +11 -10
  95. package/dist/components/info-bar/info-bar.svelte +3 -2
  96. package/dist/components/info-bar/types.d.ts +4 -0
  97. package/dist/components/label/docs/llms.md +75 -22
  98. package/dist/components/label/label-context.d.ts +14 -0
  99. package/dist/components/label/label-context.js +10 -0
  100. package/dist/components/label/label.svelte +153 -30
  101. package/dist/components/label/label.svelte.d.ts +1 -1
  102. package/dist/components/label/types.d.ts +48 -4
  103. package/dist/components/list-view/docs/llms.md +103 -33
  104. package/dist/components/list-view/list-view-item-branch.svelte +257 -0
  105. package/dist/components/list-view/list-view-item-branch.svelte.d.ts +4 -0
  106. package/dist/components/list-view/list-view-item.svelte +164 -46
  107. package/dist/components/list-view/list-view-item.svelte.d.ts +5 -5
  108. package/dist/components/list-view/list-view.svelte +73 -25
  109. package/dist/components/list-view/types.d.ts +71 -8
  110. package/dist/components/list-view/utils.d.ts +10 -0
  111. package/dist/components/list-view/utils.js +17 -1
  112. package/dist/components/menu/docs/llms.md +98 -15
  113. package/dist/components/menu/menu-command-bar-item.svelte +61 -0
  114. package/dist/components/menu/menu-command-bar-item.svelte.d.ts +14 -0
  115. package/dist/components/menu/menu-command-bar.svelte +218 -0
  116. package/dist/components/menu/menu-command-bar.svelte.d.ts +21 -0
  117. package/dist/components/menu/menu-group.svelte +6 -3
  118. package/dist/components/menu/menu-item-checkbox.svelte +5 -4
  119. package/dist/components/menu/menu-item-radio.svelte +5 -4
  120. package/dist/components/menu/menu-item-switch.svelte +5 -4
  121. package/dist/components/menu/menu-item.svelte +5 -5
  122. package/dist/components/menu/menu-item.svelte.d.ts +2 -3
  123. package/dist/components/menu/menu-list.svelte +10 -1
  124. package/dist/components/menu/menu-popover.svelte +9 -5
  125. package/dist/components/menu/menu-trigger.svelte +2 -1
  126. package/dist/components/menu/menu.svelte.js +1 -0
  127. package/dist/components/menu/types.d.ts +62 -7
  128. package/dist/components/number-box/docs/llms.md +6 -4
  129. package/dist/components/number-box/number-box.svelte +35 -29
  130. package/dist/components/number-box/number-box.svelte.d.ts +1 -1
  131. package/dist/components/number-box/types.d.ts +1 -1
  132. package/dist/components/persona/docs/llms.md +29 -25
  133. package/dist/components/persona/persona.svelte +8 -6
  134. package/dist/components/persona/types.d.ts +4 -3
  135. package/dist/components/progress-bar/docs/llms.md +13 -13
  136. package/dist/components/progress-bar/progress-bar.svelte +6 -6
  137. package/dist/components/progress-bar/types.d.ts +4 -4
  138. package/dist/components/progress-ring/docs/llms.md +14 -14
  139. package/dist/components/progress-ring/progress-ring.svelte +5 -5
  140. package/dist/components/progress-ring/types.d.ts +3 -3
  141. package/dist/components/radio-button/docs/llms.md +11 -8
  142. package/dist/components/radio-button/radio-button.svelte +38 -12
  143. package/dist/components/radio-button/radio-button.svelte.d.ts +1 -1
  144. package/dist/components/radio-button/types.d.ts +11 -8
  145. package/dist/components/rating/docs/llms.md +111 -0
  146. package/dist/components/rating/rating.svelte +247 -0
  147. package/dist/components/rating/rating.svelte.d.ts +19 -0
  148. package/dist/components/rating/types.d.ts +44 -0
  149. package/dist/components/rating/types.js +1 -0
  150. package/dist/components/side-nav/docs/llms.md +110 -0
  151. package/dist/components/side-nav/side-nav-branch.svelte +43 -0
  152. package/dist/components/side-nav/side-nav-branch.svelte.d.ts +4 -0
  153. package/dist/components/side-nav/side-nav-item.svelte +75 -0
  154. package/dist/components/side-nav/side-nav-item.svelte.d.ts +25 -0
  155. package/dist/components/side-nav/side-nav-list.svelte +32 -0
  156. package/dist/components/side-nav/side-nav-list.svelte.d.ts +7 -0
  157. package/dist/components/side-nav/side-nav.d.ts +2 -0
  158. package/dist/components/side-nav/side-nav.js +2 -0
  159. package/dist/components/side-nav/side-nav.svelte +355 -0
  160. package/dist/components/side-nav/side-nav.svelte.d.ts +24 -0
  161. package/dist/components/side-nav/types.d.ts +149 -0
  162. package/dist/components/side-nav/types.js +1 -0
  163. package/dist/components/skeleton/docs/llms.md +1 -1
  164. package/dist/components/skeleton/skeleton.svelte +2 -2
  165. package/dist/components/skeleton/types.d.ts +1 -1
  166. package/dist/components/slider/docs/llms.md +31 -28
  167. package/dist/components/slider/slider.svelte +126 -61
  168. package/dist/components/slider/slider.svelte.d.ts +1 -3
  169. package/dist/components/slider/types.d.ts +21 -14
  170. package/dist/components/tab-view/docs/llms.md +7 -7
  171. package/dist/components/tab-view/tab-view-tab.svelte +16 -14
  172. package/dist/components/tab-view/tab-view.svelte +16 -9
  173. package/dist/components/tab-view/types.d.ts +6 -6
  174. package/dist/components/table/docs/llms.md +38 -33
  175. package/dist/components/table/table-body.svelte +2 -2
  176. package/dist/components/table/table-cell-actions.svelte +8 -2
  177. package/dist/components/table/table-cell-layout.svelte +2 -2
  178. package/dist/components/table/table-cell.svelte +2 -2
  179. package/dist/components/table/table-header-cell.svelte +2 -2
  180. package/dist/components/table/table-header.svelte +2 -2
  181. package/dist/components/table/table-row.svelte +2 -2
  182. package/dist/components/table/table-selection-cell.svelte +6 -6
  183. package/dist/components/table/table.svelte +2 -2
  184. package/dist/components/table/types.d.ts +11 -11
  185. package/dist/components/tag/docs/llms.md +383 -0
  186. package/dist/components/tag/tag-group.d.ts +2 -0
  187. package/dist/components/tag/tag-group.js +2 -0
  188. package/dist/components/tag/tag-group.svelte +117 -0
  189. package/dist/components/tag/tag-group.svelte.d.ts +20 -0
  190. package/dist/components/tag/tag.svelte +459 -0
  191. package/dist/components/tag/tag.svelte.d.ts +19 -0
  192. package/dist/components/tag/types.d.ts +137 -0
  193. package/dist/components/tag/types.js +1 -0
  194. package/dist/components/tag-picker/docs/llms.md +298 -0
  195. package/dist/components/tag-picker/option-group.svelte +51 -0
  196. package/dist/components/tag-picker/option-group.svelte.d.ts +4 -0
  197. package/dist/components/tag-picker/option.svelte +82 -0
  198. package/dist/components/tag-picker/option.svelte.d.ts +4 -0
  199. package/dist/components/tag-picker/tag-picker.d.ts +2 -0
  200. package/dist/components/tag-picker/tag-picker.js +2 -0
  201. package/dist/components/tag-picker/tag-picker.svelte +716 -0
  202. package/dist/components/tag-picker/tag-picker.svelte.d.ts +21 -0
  203. package/dist/components/tag-picker/types.d.ts +142 -0
  204. package/dist/components/tag-picker/types.js +1 -0
  205. package/dist/components/text-box/docs/llms.md +31 -4
  206. package/dist/components/text-box/text-box-button.svelte +3 -3
  207. package/dist/components/text-box/text-box-button.svelte.d.ts +1 -1
  208. package/dist/components/text-box/text-box.svelte +41 -14
  209. package/dist/components/text-box/types.d.ts +5 -5
  210. package/dist/components/textarea/docs/llms.md +4 -3
  211. package/dist/components/textarea/textarea.svelte +14 -6
  212. package/dist/components/textarea/types.d.ts +2 -4
  213. package/dist/components/time-picker/docs/llms.md +18 -15
  214. package/dist/components/time-picker/time-picker.svelte +133 -33
  215. package/dist/components/time-picker/time-picker.svelte.d.ts +1 -1
  216. package/dist/components/time-picker/types.d.ts +23 -13
  217. package/dist/components/title-bar/docs/llms.md +382 -0
  218. package/dist/components/title-bar/title-bar-left-controls.svelte +215 -0
  219. package/dist/components/title-bar/title-bar-left-controls.svelte.d.ts +22 -0
  220. package/dist/components/title-bar/title-bar-right-controls.svelte +190 -0
  221. package/dist/components/title-bar/title-bar-right-controls.svelte.d.ts +27 -0
  222. package/dist/components/title-bar/title-bar.d.ts +3 -0
  223. package/dist/components/title-bar/title-bar.js +4 -0
  224. package/dist/components/title-bar/title-bar.svelte +224 -0
  225. package/dist/components/title-bar/title-bar.svelte.d.ts +26 -0
  226. package/dist/components/title-bar/types.d.ts +165 -0
  227. package/dist/components/title-bar/types.js +1 -0
  228. package/dist/components/toggle-switch/docs/llms.md +11 -9
  229. package/dist/components/toggle-switch/toggle-switch.svelte +23 -14
  230. package/dist/components/toggle-switch/toggle-switch.svelte.d.ts +1 -1
  231. package/dist/components/toggle-switch/types.d.ts +12 -10
  232. package/dist/components/tooltip/docs/llms.md +1 -1
  233. package/dist/components/tooltip/tooltip.svelte +5 -4
  234. package/dist/components/tooltip/types.d.ts +1 -1
  235. package/dist/components/top-nav/docs/llms.md +1 -1
  236. package/dist/components/top-nav/top-nav-item.svelte +2 -2
  237. package/dist/components/top-nav/top-nav.svelte +2 -2
  238. package/dist/components/top-nav/types.d.ts +2 -2
  239. package/dist/components/tree-view/docs/llms.md +11 -11
  240. package/dist/components/tree-view/tree-view-item-content.svelte +3 -3
  241. package/dist/components/tree-view/tree-view-item.svelte +13 -5
  242. package/dist/components/tree-view/tree-view.svelte +20 -5
  243. package/dist/components/tree-view/tree-view.svelte.d.ts +1 -1
  244. package/dist/components/tree-view/tree-view.svelte.js +31 -3
  245. package/dist/components/tree-view/types.d.ts +7 -3
  246. package/dist/index.d.ts +25 -0
  247. package/dist/index.js +32 -0
  248. package/dist/internal/components/dynamic-carousel/dynamic-carousel.svelte +26 -5
  249. package/dist/internal/components/dynamic-carousel/dynamic-carousel.svelte.d.ts +2 -0
  250. package/dist/internal/constants.d.ts +0 -4
  251. package/dist/internal/constants.js +0 -4002
  252. package/dist/internal/index.d.ts +1 -0
  253. package/dist/internal/index.js +1 -0
  254. package/dist/internal/native-field.svelte.d.ts +44 -0
  255. package/dist/internal/native-field.svelte.js +85 -0
  256. package/dist/internal/utils.d.ts +16 -2
  257. package/dist/internal/utils.js +25 -3
  258. package/dist/types/index.d.ts +3 -3
  259. package/package.json +51 -37
@@ -1,5 +1,6 @@
1
1
  export * from './utils.ts';
2
2
  export * from './dom-utils.svelte.ts';
3
+ export * from './native-field.svelte.ts';
3
4
  export * from './context.ts';
4
5
  export * from './transitions.ts';
5
6
  export * from './polyfills/expander.svelte.ts';
@@ -1,5 +1,6 @@
1
1
  export * from "./utils.js";
2
2
  export * from "./dom-utils.svelte.js";
3
+ export * from "./native-field.svelte.js";
3
4
  export * from "./context.js";
4
5
  export * from "./transitions.js";
5
6
  export * from "./polyfills/expander.svelte.js";
@@ -0,0 +1,44 @@
1
+ import type { AriaAttributes } from 'svelte/elements';
2
+ type Field = HTMLInputElement | HTMLSelectElement;
3
+ type PointerEventName = 'click' | 'dblclick' | 'auxclick' | 'contextmenu' | `mouse${string}` | `pointer${string}` | `touch${string}` | `drag${string}` | 'drop' | 'wheel';
4
+ type KeyboardFocusEventName = `key${string}` | 'focus' | 'blur' | 'focusin' | 'focusout';
5
+ type Handlers<E extends string> = `on${E}` | `on${E}capture`;
6
+ /** The attributes of a field nobody sees: its look and its pointer events belong to what is drawn instead. */
7
+ export type HiddenInputAttributes<T> = Omit<T, Handlers<PointerEventName>>;
8
+ /**
9
+ * The attributes of the native field a custom control stands in front of. People point at, type into
10
+ * and focus the visible control, so `class`, `style` and those events go through its own attributes,
11
+ * and `onfocus` and `onblur` are moved onto it.
12
+ */
13
+ export type NativeFieldAttributes<T> = Omit<HiddenInputAttributes<T>, Handlers<KeyboardFocusEventName>> & {
14
+ /** Called when the visible control takes the focus. */
15
+ onfocus?: (event: FocusEvent) => void;
16
+ /** Called when the visible control loses the focus. */
17
+ onblur?: (event: FocusEvent) => void;
18
+ };
19
+ type FieldAria = Pick<AriaAttributes, 'aria-labelledby' | 'aria-label' | 'aria-describedby' | 'aria-errormessage' | 'aria-required' | 'aria-invalid'>;
20
+ /**
21
+ * The native field a custom control stands in front of, so that forms submit, validate and reset it.
22
+ * Assistive technologies meet the visible control instead, so the field hides from them, except while
23
+ * the browser reports it invalid: the field then holds the focus and the validation message, which
24
+ * moving the focus would close, and it is announced. The first key pressed there goes on from the
25
+ * visible control.
26
+ */
27
+ export declare class NativeField {
28
+ #private;
29
+ /** A submission found the field invalid, and it was neither fixed nor reset since. */
30
+ invalid: boolean;
31
+ /** The browser is reporting the field: it has the focus and shows the validation message. */
32
+ reported: boolean;
33
+ /** `label` is the Label the field is inside, which names the visible control before its labels can be read. */
34
+ constructor(field: () => Field | null | undefined, control: () => HTMLElement | null | undefined, label?: {
35
+ labelId: string;
36
+ } | null);
37
+ /**
38
+ * The labels and ARIA of the field name and describe it.
39
+ */
40
+ aria(attributes: FieldAria & {
41
+ required?: boolean | null;
42
+ }, own?: FieldAria, role?: 'button' | 'combobox'): FieldAria;
43
+ }
44
+ export {};
@@ -0,0 +1,85 @@
1
+ import { on } from 'svelte/events';
2
+ import { labelIds } from "./utils.js";
3
+ /** The keys that open a picker from its button. */
4
+ const ACTIVATION_KEYS = ['Enter', ' ', 'ArrowDown', 'ArrowUp'];
5
+ /** The field the browser focuses and reports when a submission fails. */
6
+ const firstInvalid = (form) => Array.from(form.elements).find((element) => {
7
+ const field = element;
8
+ return field.willValidate && !field.validity.valid;
9
+ });
10
+ /**
11
+ * The native field a custom control stands in front of, so that forms submit, validate and reset it.
12
+ * Assistive technologies meet the visible control instead, so the field hides from them, except while
13
+ * the browser reports it invalid: the field then holds the focus and the validation message, which
14
+ * moving the focus would close, and it is announced. The first key pressed there goes on from the
15
+ * visible control.
16
+ */
17
+ export class NativeField {
18
+ /** A submission found the field invalid, and it was neither fixed nor reset since. */
19
+ invalid = $state(false);
20
+ /** The browser is reporting the field: it has the focus and shows the validation message. */
21
+ reported = $state(false);
22
+ #field;
23
+ #label;
24
+ /** `label` is the Label the field is inside, which names the visible control before its labels can be read. */
25
+ constructor(field, control, label = null) {
26
+ this.#field = field;
27
+ this.#label = label;
28
+ $effect(() => {
29
+ const element = field();
30
+ if (!element)
31
+ return;
32
+ const offs = [
33
+ on(element, 'invalid', () => {
34
+ this.invalid = true;
35
+ if (element.form && firstInvalid(element.form) !== element)
36
+ return;
37
+ // The browser focuses the field right after this event, and the focus must not land
38
+ // on something hidden from assistive technologies.
39
+ element.removeAttribute('aria-hidden');
40
+ this.reported = true;
41
+ // `checkValidity` reports nothing, so a field it found invalid hides again.
42
+ setTimeout(() => {
43
+ if (document.activeElement !== element)
44
+ this.reported = false;
45
+ });
46
+ }),
47
+ on(element, 'change', () => {
48
+ if (this.invalid)
49
+ this.invalid = !element.validity.valid;
50
+ }),
51
+ on(element, 'blur', () => (this.reported = false)),
52
+ on(element, 'keydown', (event) => {
53
+ if (event.key === 'Tab')
54
+ return;
55
+ event.preventDefault();
56
+ const target = control();
57
+ target?.focus();
58
+ if (ACTIVATION_KEYS.includes(event.key))
59
+ target?.click();
60
+ })
61
+ ];
62
+ if (element.form)
63
+ offs.push(on(element.form, 'reset', () => (this.invalid = false)));
64
+ return () => offs.forEach((off) => off());
65
+ });
66
+ }
67
+ /**
68
+ * The labels and ARIA of the field name and describe it.
69
+ */
70
+ aria(attributes, own = {}, role = 'combobox') {
71
+ const naming = {
72
+ 'aria-labelledby': own['aria-labelledby'] ?? attributes['aria-labelledby'] ?? labelIds(this.#field()) ?? this.#label?.labelId,
73
+ 'aria-label': own['aria-label'] ?? attributes['aria-label'],
74
+ 'aria-describedby': own['aria-describedby'] ?? attributes['aria-describedby']
75
+ };
76
+ if (role === 'button')
77
+ return naming;
78
+ return {
79
+ ...naming,
80
+ 'aria-required': own['aria-required'] ?? (attributes.required ? true : undefined),
81
+ 'aria-invalid': own['aria-invalid'] ?? (this.invalid || attributes['aria-invalid'] || undefined),
82
+ 'aria-errormessage': own['aria-errormessage'] ?? attributes['aria-errormessage']
83
+ };
84
+ }
85
+ }
@@ -1,5 +1,7 @@
1
- /** Converts a pixel value (number, string, or getter function) to a `rem` string. */
1
+ /** Converts pixels to rem using the current root font size, or 16px during SSR. An explicit base overrides detection. */
2
2
  export declare const pxToRem: (px: number | string | (() => number | string), base?: number) => string;
3
+ /** A number is a length in pixels, converted to rem; a string is any CSS length and is used as it is. */
4
+ export declare const toLength: (value: number | string) => string;
3
5
  /** Rounds a pixel value to the nearest physical pixel based on the device pixel ratio. */
4
6
  export declare const roundByDPR: (value: number, element?: Element) => number;
5
7
  /** Converts a kebab-case string to Title Case (e.g. `'my-label'` → `'My Label'`). */
@@ -10,11 +12,23 @@ type EventHandler<E extends Event> = (this: unknown, event: E) => void;
10
12
  export declare function once<E extends Event>(fn: EventHandler<E> | null): EventHandler<E>;
11
13
  /** Wraps a handler to call `preventDefault()` before invoking it. */
12
14
  export declare function preventDefault<E extends Event = Event>(fn: EventHandler<E>): EventHandler<E>;
15
+ /** Method syntax keeps `event` bivariant, so handlers typed with a narrower `currentTarget` are accepted. */
16
+ type BivariantHandler<E extends Event> = {
17
+ bivarianceHack(event: E): unknown;
18
+ }['bivarianceHack'];
13
19
  /**
14
20
  * Dispatches an event to a list of callbacks.
15
21
  * If any blocker in `blockers` is true, calls `preventDefault()` and skips the callbacks.
16
22
  */
17
- export declare const invokeHandlers: <T extends Event>(e: T, blockers?: boolean | (boolean | undefined)[], callbacks?: Array<((event: any) => void) | unknown>) => void;
23
+ export declare const invokeHandlers: <T extends Event>(e: T, blockers?: boolean | (boolean | undefined)[], callbacks?: Array<BivariantHandler<NoInfer<T>> | false | null | undefined>) => void;
24
+ /**
25
+ * A custom control sets the value of its native field programmatically, which fires no event.
26
+ * Once the field shows the new value, this fires the events when a user edit of the field would.
27
+ * Call it from event handlers only: `flushSync` cannot run inside an effect.
28
+ */
29
+ export declare function dispatchFieldEvents(field: EventTarget | null | undefined, types?: ('input' | 'change')[]): void;
30
+ /** The ids of the labels of a native field, so the visible control that stands in for it is named by them. */
31
+ export declare const labelIds: (field: HTMLInputElement | HTMLSelectElement | null | undefined) => string | undefined;
18
32
  /** Returns `true` if the object has no own enumerable keys (also handles `null`/`undefined`). */
19
33
  export declare const isObjectEmpty: (obj: Record<string, unknown> | null | undefined) => boolean;
20
34
  /** Returns the value of a CSS custom property as milliseconds. */
@@ -1,10 +1,18 @@
1
- /** Converts a pixel value (number, string, or getter function) to a `rem` string. */
2
- export const pxToRem = (px, base = 16) => {
1
+ import { flushSync } from 'svelte';
2
+ /** Converts pixels to rem using the current root font size, or 16px during SSR. An explicit base overrides detection. */
3
+ export const pxToRem = (px, base) => {
3
4
  if (typeof px === 'function') {
4
5
  px = px();
5
6
  }
6
- return `${((typeof px === 'string' ? parseInt(px) : px) / base).toFixed(2)}rem`;
7
+ const rootSize = base ??
8
+ (typeof window === 'undefined'
9
+ ? 16
10
+ : parseFloat(window.getComputedStyle(window.document.documentElement).fontSize));
11
+ const resolvedBase = Number.isFinite(rootSize) && rootSize > 0 ? rootSize : 16;
12
+ return `${(typeof px === 'string' ? parseFloat(px) : px) / resolvedBase}rem`;
7
13
  };
14
+ /** A number is a length in pixels, converted to rem; a string is any CSS length and is used as it is. */
15
+ export const toLength = (value) => (typeof value === 'number' ? pxToRem(value) : value);
8
16
  /** Rounds a pixel value to the nearest physical pixel based on the device pixel ratio. */
9
17
  export const roundByDPR = (value, element) => {
10
18
  const dpr = element?.ownerDocument.defaultView?.devicePixelRatio || window.devicePixelRatio || 1;
@@ -51,6 +59,20 @@ export const invokeHandlers = (e, blockers = [], callbacks = []) => {
51
59
  cb(e);
52
60
  }
53
61
  };
62
+ /**
63
+ * A custom control sets the value of its native field programmatically, which fires no event.
64
+ * Once the field shows the new value, this fires the events when a user edit of the field would.
65
+ * Call it from event handlers only: `flushSync` cannot run inside an effect.
66
+ */
67
+ export function dispatchFieldEvents(field, types = ['input', 'change']) {
68
+ flushSync();
69
+ for (const type of types)
70
+ field?.dispatchEvent(new Event(type, { bubbles: true }));
71
+ }
72
+ /** The ids of the labels of a native field, so the visible control that stands in for it is named by them. */
73
+ export const labelIds = (field) => Array.from(field?.labels ?? [], (label) => label.id)
74
+ .filter(Boolean)
75
+ .join(' ') || undefined;
54
76
  /** Returns `true` if the object has no own enumerable keys (also handles `null`/`undefined`). */
55
77
  export const isObjectEmpty = (obj) => Object.keys(obj || {}).length === 0;
56
78
  /** Returns the value of a CSS custom property as milliseconds. */
@@ -4,8 +4,8 @@ export type NoUndefinedField<T> = {
4
4
  [P in keyof T]-?: P extends Record<P, infer V> ? NoUndefinedField<NonNullable<V>> : NonNullable<T[P]>;
5
5
  };
6
6
  /** Omits all keys from `T` whose name starts with the prefix `K`. */
7
- export type OmitByWord<T, K extends string> = {
8
- [P in keyof T as P extends `${K}${string}` ? never : P]: T[P];
7
+ export type OmitByWord<T, K extends string, Excluded extends PropertyKey = never> = {
8
+ [P in keyof T as P extends Excluded ? never : P extends `${K}${string}` ? never : P]: T[P];
9
9
  };
10
10
  /** Picks only the keys from `T` whose name starts with the prefix `K`. */
11
11
  export type PickByWord<T, K extends string> = {
@@ -33,7 +33,7 @@ export type THEME = 'light' | 'dark' | 'system';
33
33
  * @see https://github.com/sveltejs/svelte/issues/16046
34
34
  * @see https://github.com/sveltejs/svelte/issues/16839
35
35
  */
36
- export type PolymorphicProps<T extends keyof SvelteHTMLElements> = OmitByWord<SvelteHTMLElements[T], 'on:' | 'aria'> & AriaAttributes;
36
+ export type PolymorphicProps<T extends keyof SvelteHTMLElements, Excluded extends PropertyKey = never> = OmitByWord<SvelteHTMLElements[T], 'on:' | 'aria', Excluded> & AriaAttributes;
37
37
  /** Library maturity/status shown as a badge in the navigation. Not part of SEO/GEO. */
38
38
  export type ComponentStatus = 'New' | 'Beta' | 'WIP' | 'AI' | 'Experimental' | 'Prototype' | 'Empty';
39
39
  /** Open Graph metadata (https://ogp.me). Used to build `<meta property="og:*">` tags. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fluentui-svelte",
3
- "version": "0.5.0",
3
+ "version": "0.7.0",
4
4
  "description": "Modern Fluent UI 2 Components for Svelte 5",
5
5
  "author": {
6
6
  "name": "Jorge Acosta",
@@ -68,72 +68,86 @@
68
68
  },
69
69
  "dependencies": {
70
70
  "@floating-ui/dom": "^1.8.0",
71
- "fluentui-icons-svelte": "^1.1.1",
71
+ "fluentui-icons-svelte": "^1.2.0",
72
72
  "mode-watcher": "^1.1.0",
73
- "runed": "^0.37.1",
73
+ "runed": "^0.38.0",
74
74
  "tabspot": "^0.8.0"
75
75
  },
76
76
  "peerDependencies": {
77
77
  "svelte": "^5.0.0"
78
78
  },
79
79
  "devDependencies": {
80
- "@changesets/changelog-github": "^1.0.0",
81
- "@changesets/cli": "^3.0.1",
80
+ "@changesets/changelog-github": "^1.0.1",
81
+ "@changesets/cli": "^3.0.3",
82
82
  "@eslint/js": "^10.0.1",
83
- "@humanspeak/svelte-virtual-list": "^0.5.14",
84
- "@inlang/paraglide-js": "^2.24.1",
83
+ "@humanspeak/svelte-virtual-list": "^0.5.15",
84
+ "@inlang/paraglide-js": "^2.29.3",
85
85
  "@inlang/paraglide-js-svelte": "^1.0.4",
86
86
  "@jlacostaec/paraglide-markup-svelte": "0.1.0",
87
87
  "@jlacostaec/propsmith": "^0.2.0",
88
- "@playwright/test": "^1.62.1",
89
- "@sveltejs/adapter-auto": "^7.0.1",
90
- "@sveltejs/adapter-cloudflare": "^7.2.9",
91
- "@sveltejs/kit": "^2.70.3",
92
- "@sveltejs/package": "^2.5.8",
93
- "@sveltejs/vite-plugin-svelte": "^7.3.0",
94
- "@types/node": "^26.2.0",
95
- "@vitest/browser-playwright": "^4.1.11",
96
- "eslint": "^10.8.1",
88
+ "@playwright/test": "^1.64.1",
89
+ "@sveltejs/adapter-auto": "^8.0.0",
90
+ "@sveltejs/adapter-cloudflare": "^8.0.2",
91
+ "@sveltejs/enhanced-img": "^1.0.0",
92
+ "@sveltejs/kit": "^3.1.1",
93
+ "@sveltejs/package": "^3.0.2",
94
+ "@sveltejs/vite-plugin-svelte": "^7.3.1",
95
+ "@types/node": "^26.6.6",
96
+ "@vitest/browser-playwright": "^5.1.0",
97
+ "eslint": "^10.14.0",
97
98
  "eslint-config-prettier": "^10.1.8",
98
- "eslint-plugin-svelte": "^3.23.0",
99
- "globals": "^17.11.0",
99
+ "eslint-plugin-svelte": "^3.23.1",
100
+ "globals": "^17.14.0",
100
101
  "mdsvex": "^0.12.8",
101
102
  "panzoom": "^9.4.4",
102
- "playwright": "^1.62.1",
103
- "prettier": "^3.9.6",
103
+ "playwright": "^1.64.1",
104
+ "prettier": "^3.9.10",
104
105
  "prettier-plugin-svelte": "^4.1.1",
105
- "publint": "^0.3.24",
106
+ "publint": "^0.3.25",
106
107
  "rehype-class-names": "^2.0.0",
107
108
  "rehype-slug": "^6.0.0",
108
- "shiki": "^4.4.3",
109
+ "shiki": "^4.6.0",
109
110
  "simplex-noise": "^4.0.3",
110
- "svelte": "^5.56.9",
111
- "svelte-check": "^4.7.6",
111
+ "svelte": "^5.57.3",
112
+ "svelte-check": "^4.7.8",
113
+ "svelte-meta-tags": "^5.0.3",
112
114
  "typescript": "6.0.3",
113
- "typescript-eslint": "^8.67.0",
114
- "vite": "^8.2.1",
115
- "vitest": "^4.1.11",
116
- "vitest-browser-svelte": "^3.0.0",
117
- "wrangler": "^4.124.0"
115
+ "typescript-eslint": "^8.72.1",
116
+ "vite": "^8.3.5",
117
+ "vitest": "^5.1.0",
118
+ "vitest-browser-svelte": "^3.1.0",
119
+ "wrangler": "^4.156.2"
120
+ },
121
+ "imports": {
122
+ "#lib": "./src/lib/index.js",
123
+ "#lib/*": "./src/lib/*",
124
+ "#types": "./src/lib/types/index.js",
125
+ "#internal": "./src/lib/internal/index.js",
126
+ "#components/*": "./src/lib/components/*",
127
+ "#css/*": "./src/lib/css/*",
128
+ "#site/*": "./src/site/*",
129
+ "#i18n/*": "./src/i18n/*",
130
+ "#constants": "./src/lib/internal/constants.js"
118
131
  },
119
132
  "engines": {
120
133
  "node": ">=24"
121
134
  },
122
135
  "scripts": {
123
136
  "dev": "pnpm urls && vite dev",
124
- "build:site": "pnpm urls && vite build && pnpm prepare",
125
- "build": "pnpm urls && vite build && npm run prepack",
126
- "preview": "pnpm run build && wrangler pages dev",
127
- "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
128
- "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
137
+ "build:site": "pnpm urls && pnpm check && vite build && pnpm prepare",
138
+ "build": "pnpm urls && pnpm check && vite build && npm run prepack",
139
+ "preview": "wrangler pages dev",
140
+ "i18n": "paraglide-js compile --project ./project.inlang --outdir ./src/i18n --strategy url cookie baseLocale --emit-ts-declarations --silent",
141
+ "check": "pnpm i18n && wrangler types --check && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
142
+ "check:watch": "pnpm i18n && wrangler types --check && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
129
143
  "lint": "prettier --check . && eslint .",
130
144
  "format": "prettier --write .",
131
145
  "test:unit": "vitest",
132
- "test": "npm run test:unit -- --run && npm run test:e2e",
146
+ "test": "pnpm run test:unit -- --run && npm run test:e2e",
133
147
  "test:e2e": "playwright install && playwright test",
134
- "deploy": "pnpm run build:site && wrangler pages deploy",
148
+ "deploy": "pnpm run build:site && wrangler deploy",
135
149
  "urls": "node scripts/gen-urls.js",
136
- "cf-typegen": "wrangler types src/worker-configuration.d.ts",
150
+ "cf-typegen": "wrangler types",
137
151
  "changeset:version": "changeset version && git add --all",
138
152
  "changeset:publish": "changeset publish"
139
153
  }