fluentui-svelte 0.1.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 (283) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +201 -0
  3. package/dist/components/auto-suggest-box/auto-suggest-box.d.ts +2 -0
  4. package/dist/components/auto-suggest-box/auto-suggest-box.js +2 -0
  5. package/dist/components/auto-suggest-box/auto-suggest-box.svelte +457 -0
  6. package/dist/components/auto-suggest-box/auto-suggest-box.svelte.d.ts +4 -0
  7. package/dist/components/auto-suggest-box/docs/llms.md +73 -0
  8. package/dist/components/auto-suggest-box/option.svelte +82 -0
  9. package/dist/components/auto-suggest-box/option.svelte.d.ts +4 -0
  10. package/dist/components/auto-suggest-box/types.d.ts +140 -0
  11. package/dist/components/auto-suggest-box/types.js +1 -0
  12. package/dist/components/avatar/avatar.svelte +269 -0
  13. package/dist/components/avatar/avatar.svelte.d.ts +20 -0
  14. package/dist/components/avatar/docs/llms.md +92 -0
  15. package/dist/components/avatar/type.d.ts +63 -0
  16. package/dist/components/avatar/type.js +1 -0
  17. package/dist/components/badge/badge-icon.svelte +103 -0
  18. package/dist/components/badge/badge-icon.svelte.d.ts +25 -0
  19. package/dist/components/badge/badge.svelte +163 -0
  20. package/dist/components/badge/badge.svelte.d.ts +20 -0
  21. package/dist/components/badge/docs/llms.md +133 -0
  22. package/dist/components/badge/types.d.ts +70 -0
  23. package/dist/components/badge/types.js +1 -0
  24. package/dist/components/badge/utils.svelte.d.ts +16 -0
  25. package/dist/components/badge/utils.svelte.js +35 -0
  26. package/dist/components/button/button.svelte +203 -0
  27. package/dist/components/button/button.svelte.d.ts +38 -0
  28. package/dist/components/button/docs/llms.md +102 -0
  29. package/dist/components/button/split-button.svelte +66 -0
  30. package/dist/components/button/split-button.svelte.d.ts +4 -0
  31. package/dist/components/button/types.d.ts +84 -0
  32. package/dist/components/button/types.js +1 -0
  33. package/dist/components/calendar-date-picker/calendar-date-picker.svelte +119 -0
  34. package/dist/components/calendar-date-picker/calendar-date-picker.svelte.d.ts +4 -0
  35. package/dist/components/calendar-date-picker/docs/llms.md +33 -0
  36. package/dist/components/calendar-date-picker/types.d.ts +36 -0
  37. package/dist/components/calendar-date-picker/types.js +1 -0
  38. package/dist/components/calendar-view/calendar-view-controls.svelte +115 -0
  39. package/dist/components/calendar-view/calendar-view-controls.svelte.d.ts +3 -0
  40. package/dist/components/calendar-view/calendar-view-days.svelte +210 -0
  41. package/dist/components/calendar-view/calendar-view-days.svelte.d.ts +3 -0
  42. package/dist/components/calendar-view/calendar-view-grid.d.ts +38 -0
  43. package/dist/components/calendar-view/calendar-view-grid.js +140 -0
  44. package/dist/components/calendar-view/calendar-view-header.svelte +66 -0
  45. package/dist/components/calendar-view/calendar-view-header.svelte.d.ts +18 -0
  46. package/dist/components/calendar-view/calendar-view-item.svelte +181 -0
  47. package/dist/components/calendar-view/calendar-view-item.svelte.d.ts +4 -0
  48. package/dist/components/calendar-view/calendar-view-months.svelte +165 -0
  49. package/dist/components/calendar-view/calendar-view-months.svelte.d.ts +3 -0
  50. package/dist/components/calendar-view/calendar-view-years.svelte +161 -0
  51. package/dist/components/calendar-view/calendar-view-years.svelte.d.ts +3 -0
  52. package/dist/components/calendar-view/calendar-view.svelte +451 -0
  53. package/dist/components/calendar-view/calendar-view.svelte.d.ts +9 -0
  54. package/dist/components/calendar-view/calendar-view.svelte.js +196 -0
  55. package/dist/components/calendar-view/docs/llms.md +121 -0
  56. package/dist/components/calendar-view/index.d.ts +1 -0
  57. package/dist/components/calendar-view/index.js +1 -0
  58. package/dist/components/calendar-view/types.d.ts +174 -0
  59. package/dist/components/calendar-view/types.js +1 -0
  60. package/dist/components/checkbox/checkbox.svelte +171 -0
  61. package/dist/components/checkbox/checkbox.svelte.d.ts +40 -0
  62. package/dist/components/checkbox/docs/llms.md +78 -0
  63. package/dist/components/checkbox/types.d.ts +50 -0
  64. package/dist/components/checkbox/types.js +1 -0
  65. package/dist/components/date-picker/date-picker.svelte +381 -0
  66. package/dist/components/date-picker/date-picker.svelte.d.ts +4 -0
  67. package/dist/components/date-picker/docs/llms.md +52 -0
  68. package/dist/components/date-picker/index.d.ts +1 -0
  69. package/dist/components/date-picker/index.js +1 -0
  70. package/dist/components/date-picker/types.d.ts +74 -0
  71. package/dist/components/date-picker/types.js +1 -0
  72. package/dist/components/dialog/dialog-actions.svelte +37 -0
  73. package/dist/components/dialog/dialog-actions.svelte.d.ts +4 -0
  74. package/dist/components/dialog/dialog-content.svelte +17 -0
  75. package/dist/components/dialog/dialog-content.svelte.d.ts +4 -0
  76. package/dist/components/dialog/dialog-surface.svelte +95 -0
  77. package/dist/components/dialog/dialog-surface.svelte.d.ts +4 -0
  78. package/dist/components/dialog/dialog-title.svelte +33 -0
  79. package/dist/components/dialog/dialog-title.svelte.d.ts +25 -0
  80. package/dist/components/dialog/dialog-trigger.svelte +23 -0
  81. package/dist/components/dialog/dialog-trigger.svelte.d.ts +4 -0
  82. package/dist/components/dialog/dialog.svelte +64 -0
  83. package/dist/components/dialog/dialog.svelte.d.ts +7 -0
  84. package/dist/components/dialog/dialog.svelte.js +2 -0
  85. package/dist/components/dialog/docs/llms.md +131 -0
  86. package/dist/components/dialog/types.d.ts +92 -0
  87. package/dist/components/dialog/types.js +1 -0
  88. package/dist/components/divider/divider.svelte +120 -0
  89. package/dist/components/divider/divider.svelte.d.ts +39 -0
  90. package/dist/components/divider/docs/llms.md +83 -0
  91. package/dist/components/divider/types.d.ts +32 -0
  92. package/dist/components/divider/types.js +1 -0
  93. package/dist/components/dropdown/docs/llms.md +70 -0
  94. package/dist/components/dropdown/dropdown-context.d.ts +2 -0
  95. package/dist/components/dropdown/dropdown-context.js +2 -0
  96. package/dist/components/dropdown/dropdown-option.svelte +31 -0
  97. package/dist/components/dropdown/dropdown-option.svelte.d.ts +4 -0
  98. package/dist/components/dropdown/dropdown.svelte +309 -0
  99. package/dist/components/dropdown/dropdown.svelte.d.ts +4 -0
  100. package/dist/components/dropdown/types.d.ts +82 -0
  101. package/dist/components/dropdown/types.js +1 -0
  102. package/dist/components/dropdown-select/docs/llms.md +72 -0
  103. package/dist/components/dropdown-select/dropdown-select-option.svelte +87 -0
  104. package/dist/components/dropdown-select/dropdown-select-option.svelte.d.ts +4 -0
  105. package/dist/components/dropdown-select/dropdown-select.svelte +165 -0
  106. package/dist/components/dropdown-select/dropdown-select.svelte.d.ts +4 -0
  107. package/dist/components/dropdown-select/dropdown-select.svelte.js +48 -0
  108. package/dist/components/dropdown-select/index.d.ts +2 -0
  109. package/dist/components/dropdown-select/index.js +2 -0
  110. package/dist/components/dropdown-select/types.d.ts +46 -0
  111. package/dist/components/dropdown-select/types.js +1 -0
  112. package/dist/components/expander/docs/llms.md +88 -0
  113. package/dist/components/expander/expander.svelte +249 -0
  114. package/dist/components/expander/expander.svelte.d.ts +21 -0
  115. package/dist/components/expander/types.d.ts +47 -0
  116. package/dist/components/expander/types.js +1 -0
  117. package/dist/components/flyout/docs/llms.md +31 -0
  118. package/dist/components/flyout/flyout.svelte +148 -0
  119. package/dist/components/flyout/flyout.svelte.d.ts +19 -0
  120. package/dist/components/flyout/types.d.ts +36 -0
  121. package/dist/components/flyout/types.js +1 -0
  122. package/dist/components/hyperlink/docs/llms.md +33 -0
  123. package/dist/components/hyperlink/hyperlink.svelte +66 -0
  124. package/dist/components/hyperlink/hyperlink.svelte.d.ts +16 -0
  125. package/dist/components/hyperlink/types.d.ts +14 -0
  126. package/dist/components/hyperlink/types.js +1 -0
  127. package/dist/components/info-bar/docs/llms.md +81 -0
  128. package/dist/components/info-bar/info-bar.svelte +140 -0
  129. package/dist/components/info-bar/info-bar.svelte.d.ts +19 -0
  130. package/dist/components/info-bar/types.d.ts +27 -0
  131. package/dist/components/info-bar/types.js +1 -0
  132. package/dist/components/label/docs/llms.md +67 -0
  133. package/dist/components/label/label.svelte +95 -0
  134. package/dist/components/label/label.svelte.d.ts +4 -0
  135. package/dist/components/label/types.d.ts +32 -0
  136. package/dist/components/label/types.js +1 -0
  137. package/dist/components/list-view/docs/llms.md +110 -0
  138. package/dist/components/list-view/list-view-item.svelte +168 -0
  139. package/dist/components/list-view/list-view-item.svelte.d.ts +25 -0
  140. package/dist/components/list-view/list-view.svelte +137 -0
  141. package/dist/components/list-view/list-view.svelte.d.ts +25 -0
  142. package/dist/components/list-view/types.d.ts +95 -0
  143. package/dist/components/list-view/types.js +1 -0
  144. package/dist/components/list-view/utils.d.ts +6 -0
  145. package/dist/components/list-view/utils.js +12 -0
  146. package/dist/components/menu/context-menu-trigger.svelte +84 -0
  147. package/dist/components/menu/context-menu-trigger.svelte.d.ts +9 -0
  148. package/dist/components/menu/docs/llms.md +169 -0
  149. package/dist/components/menu/menu-divider.svelte +9 -0
  150. package/dist/components/menu/menu-divider.svelte.d.ts +26 -0
  151. package/dist/components/menu/menu-group.svelte +31 -0
  152. package/dist/components/menu/menu-group.svelte.d.ts +4 -0
  153. package/dist/components/menu/menu-item-checkbox.svelte +143 -0
  154. package/dist/components/menu/menu-item-checkbox.svelte.d.ts +15 -0
  155. package/dist/components/menu/menu-item-radio.svelte +147 -0
  156. package/dist/components/menu/menu-item-radio.svelte.d.ts +15 -0
  157. package/dist/components/menu/menu-item-switch.svelte +194 -0
  158. package/dist/components/menu/menu-item-switch.svelte.d.ts +15 -0
  159. package/dist/components/menu/menu-item.svelte +124 -0
  160. package/dist/components/menu/menu-item.svelte.d.ts +18 -0
  161. package/dist/components/menu/menu-list.svelte +38 -0
  162. package/dist/components/menu/menu-list.svelte.d.ts +5 -0
  163. package/dist/components/menu/menu-popover.svelte +125 -0
  164. package/dist/components/menu/menu-popover.svelte.d.ts +12 -0
  165. package/dist/components/menu/menu-trigger.svelte +121 -0
  166. package/dist/components/menu/menu-trigger.svelte.d.ts +4 -0
  167. package/dist/components/menu/menu.svelte +124 -0
  168. package/dist/components/menu/menu.svelte.d.ts +4 -0
  169. package/dist/components/menu/menu.svelte.js +77 -0
  170. package/dist/components/menu/types.d.ts +127 -0
  171. package/dist/components/menu/types.js +1 -0
  172. package/dist/components/number-box/docs/llms.md +37 -0
  173. package/dist/components/number-box/number-box.svelte +115 -0
  174. package/dist/components/number-box/number-box.svelte.d.ts +15 -0
  175. package/dist/components/number-box/types.d.ts +16 -0
  176. package/dist/components/number-box/types.js +1 -0
  177. package/dist/components/persona/docs/llms.md +107 -0
  178. package/dist/components/persona/persona.svelte +79 -0
  179. package/dist/components/persona/persona.svelte.d.ts +4 -0
  180. package/dist/components/persona/types.d.ts +42 -0
  181. package/dist/components/persona/types.js +1 -0
  182. package/dist/components/progress-bar/docs/llms.md +67 -0
  183. package/dist/components/progress-bar/progress-bar.svelte +167 -0
  184. package/dist/components/progress-bar/progress-bar.svelte.d.ts +15 -0
  185. package/dist/components/progress-bar/types.d.ts +39 -0
  186. package/dist/components/progress-bar/types.js +1 -0
  187. package/dist/components/progress-ring/docs/llms.md +76 -0
  188. package/dist/components/progress-ring/progress-ring.svelte +145 -0
  189. package/dist/components/progress-ring/progress-ring.svelte.d.ts +15 -0
  190. package/dist/components/progress-ring/types.d.ts +42 -0
  191. package/dist/components/progress-ring/types.js +1 -0
  192. package/dist/components/radio-button/docs/llms.md +64 -0
  193. package/dist/components/radio-button/radio-button.svelte +129 -0
  194. package/dist/components/radio-button/radio-button.svelte.d.ts +19 -0
  195. package/dist/components/radio-button/types.d.ts +24 -0
  196. package/dist/components/radio-button/types.js +1 -0
  197. package/dist/components/skeleton/docs/llms.md +67 -0
  198. package/dist/components/skeleton/skeleton.svelte +106 -0
  199. package/dist/components/skeleton/skeleton.svelte.d.ts +39 -0
  200. package/dist/components/skeleton/types.d.ts +24 -0
  201. package/dist/components/skeleton/types.js +1 -0
  202. package/dist/components/slider/docs/llms.md +75 -0
  203. package/dist/components/slider/slider.svelte +486 -0
  204. package/dist/components/slider/slider.svelte.d.ts +19 -0
  205. package/dist/components/slider/types.d.ts +102 -0
  206. package/dist/components/slider/types.js +1 -0
  207. package/dist/components/text-box/docs/llms.md +86 -0
  208. package/dist/components/text-box/text-box-button.svelte +65 -0
  209. package/dist/components/text-box/text-box-button.svelte.d.ts +9 -0
  210. package/dist/components/text-box/text-box.svelte +299 -0
  211. package/dist/components/text-box/text-box.svelte.d.ts +16 -0
  212. package/dist/components/text-box/types.d.ts +60 -0
  213. package/dist/components/text-box/types.js +1 -0
  214. package/dist/components/textarea/docs/llms.md +55 -0
  215. package/dist/components/textarea/textarea.svelte +151 -0
  216. package/dist/components/textarea/textarea.svelte.d.ts +17 -0
  217. package/dist/components/textarea/types.d.ts +33 -0
  218. package/dist/components/textarea/types.js +1 -0
  219. package/dist/components/time-picker/docs/llms.md +47 -0
  220. package/dist/components/time-picker/index.d.ts +1 -0
  221. package/dist/components/time-picker/index.js +1 -0
  222. package/dist/components/time-picker/time-picker.svelte +336 -0
  223. package/dist/components/time-picker/time-picker.svelte.d.ts +4 -0
  224. package/dist/components/time-picker/types.d.ts +54 -0
  225. package/dist/components/time-picker/types.js +1 -0
  226. package/dist/components/toggle-switch/docs/llms.md +39 -0
  227. package/dist/components/toggle-switch/toggle-switch.svelte +151 -0
  228. package/dist/components/toggle-switch/toggle-switch.svelte.d.ts +17 -0
  229. package/dist/components/toggle-switch/types.d.ts +20 -0
  230. package/dist/components/toggle-switch/types.js +1 -0
  231. package/dist/components/tooltip/docs/llms.md +74 -0
  232. package/dist/components/tooltip/tooltip.svelte +246 -0
  233. package/dist/components/tooltip/tooltip.svelte.d.ts +18 -0
  234. package/dist/components/tooltip/types.d.ts +67 -0
  235. package/dist/components/tooltip/types.js +1 -0
  236. package/dist/components/tree-view/docs/llms.md +117 -0
  237. package/dist/components/tree-view/tree-view-item-content.svelte +158 -0
  238. package/dist/components/tree-view/tree-view-item-content.svelte.d.ts +4 -0
  239. package/dist/components/tree-view/tree-view-item.svelte +197 -0
  240. package/dist/components/tree-view/tree-view-item.svelte.d.ts +4 -0
  241. package/dist/components/tree-view/tree-view.svelte +220 -0
  242. package/dist/components/tree-view/tree-view.svelte.d.ts +4 -0
  243. package/dist/components/tree-view/tree-view.svelte.js +111 -0
  244. package/dist/components/tree-view/types.d.ts +185 -0
  245. package/dist/components/tree-view/types.js +1 -0
  246. package/dist/css/class-darkmode.css +186 -0
  247. package/dist/css/media-darkmode.css +189 -0
  248. package/dist/css/reset.css +53 -0
  249. package/dist/css/theme.css +276 -0
  250. package/dist/css/typography.css +67 -0
  251. package/dist/css/utils.d.ts +1 -0
  252. package/dist/css/utils.js +153 -0
  253. package/dist/index.d.ts +63 -0
  254. package/dist/index.js +129 -0
  255. package/dist/internal/components/dynamic-carousel/dynamic-carousel.svelte +449 -0
  256. package/dist/internal/components/dynamic-carousel/dynamic-carousel.svelte.d.ts +22 -0
  257. package/dist/internal/components/render-soc/render-soc.svelte +29 -0
  258. package/dist/internal/components/render-soc/render-soc.svelte.d.ts +30 -0
  259. package/dist/internal/constants.d.ts +26 -0
  260. package/dist/internal/constants.js +4036 -0
  261. package/dist/internal/context.d.ts +14 -0
  262. package/dist/internal/context.js +13 -0
  263. package/dist/internal/dom-utils.svelte.d.ts +6 -0
  264. package/dist/internal/dom-utils.svelte.js +46 -0
  265. package/dist/internal/floating-ui/floating.svelte.d.ts +15 -0
  266. package/dist/internal/floating-ui/floating.svelte.js +26 -0
  267. package/dist/internal/floating-ui/utils.d.ts +3 -0
  268. package/dist/internal/floating-ui/utils.js +30 -0
  269. package/dist/internal/index.d.ts +9 -0
  270. package/dist/internal/index.js +9 -0
  271. package/dist/internal/polyfills/expander.svelte.d.ts +21 -0
  272. package/dist/internal/polyfills/expander.svelte.js +96 -0
  273. package/dist/internal/transitions.d.ts +32 -0
  274. package/dist/internal/transitions.js +37 -0
  275. package/dist/internal/utils.d.ts +22 -0
  276. package/dist/internal/utils.js +63 -0
  277. package/dist/providers/fluentui-svelte/fluentui-svelte.d.ts +19 -0
  278. package/dist/providers/fluentui-svelte/fluentui-svelte.js +11 -0
  279. package/dist/providers/fluentui-svelte/fluentui-svelte.svelte +68 -0
  280. package/dist/providers/fluentui-svelte/fluentui-svelte.svelte.d.ts +9 -0
  281. package/dist/types/index.d.ts +117 -0
  282. package/dist/types/index.js +1 -0
  283. package/package.json +142 -0
@@ -0,0 +1,95 @@
1
+ import type { CheckboxProps } from '../checkbox/types.ts';
2
+ import type { FSContext } from '../../internal/index.js';
3
+ import type { PolymorphicProps, Shapes } from '../../types/index.js';
4
+ export type SelectionMode = 'none' | 'single' | 'multiselect' | 'extended';
5
+ export type NavigationMode = 'items' | 'composite';
6
+ /** @propsmith ListViewProps */
7
+ export type ListViewProps<T extends 'ul' | 'ol' | 'div'> = {
8
+ /** How many items can be selected, and how the selection is made.
9
+ * @default 'none'
10
+ */
11
+ selectionMode?: SelectionMode;
12
+ /** Whether the list itself takes a single tab stop, or every item takes its own.
13
+ * @default 'items'
14
+ */
15
+ navigationMode?: NavigationMode;
16
+ /** The values of the selected items.
17
+ * @bindable
18
+ */
19
+ selectedItems?: string[];
20
+ /** The items can have a circular, rounded or square shape.
21
+ * @default 'rounded'
22
+ */
23
+ shape?: Shapes;
24
+ /** Called whenever the selection changes. */
25
+ onSelectionChange?: (e: Event, selectedItems: string[] | []) => void;
26
+ /** The HTML element to render the list as.
27
+ * @type 'ul' | 'ol' | 'div'
28
+ * @default 'ul'
29
+ */
30
+ as?: T | 'ul' | 'ol' | 'div';
31
+ /** The DOM reference of the list element.
32
+ * @type HTMLUListElement | HTMLOListElement | HTMLDivElement
33
+ * @bindable
34
+ */
35
+ ref?: ListViewDOM[T];
36
+ /** Opts the list out of the tabspot focus management, to wire your own.
37
+ * @default false
38
+ */
39
+ disableTabspot?: boolean;
40
+ } & PolymorphicProps<T>;
41
+ export type ListViewDOM = {
42
+ ul: HTMLUListElement;
43
+ ol: HTMLOListElement;
44
+ div: HTMLDivElement;
45
+ };
46
+ /** @propsmith ListViewItemProps */
47
+ export type ListViewItemProps<T extends 'li' | 'a' | 'div' = 'li'> = {
48
+ /** The HTML element to render the item as.
49
+ * @type 'li' | 'a' | 'div'
50
+ * @default 'li'
51
+ */
52
+ as?: T | 'a' | 'div';
53
+ /** The item can have a circular, rounded or square shape. Inherited from the list by default. */
54
+ shape?: Shapes;
55
+ /** The value reported to the list when the item is selected. Falls back to a generated id. */
56
+ value?: string;
57
+ /** Renders the item in its pressed state. */
58
+ active?: boolean;
59
+ /** The ARIA role of the item. Derived from the list by default. */
60
+ role?: 'treeitem' | 'menuitem' | 'option' | 'row';
61
+ /** Disables the user interaction. */
62
+ disabled?: boolean;
63
+ /** The props to spread on the checkbox rendered when the list is multiselect.
64
+ * @type CheckboxProps
65
+ */
66
+ checkmark?: Omit<CheckboxProps, 'element' | 'label' | 'disabled'>;
67
+ /** Called when the item is clicked or activated with the keyboard. */
68
+ onAction?: (e: MouseEvent, value: string) => void;
69
+ /** Called when the item receives the focus. */
70
+ onfocus?: (e: Event, value: string) => void;
71
+ /** The DOM reference of the item element.
72
+ * @type HTMLLIElement | HTMLAnchorElement | HTMLDivElement
73
+ * @bindable
74
+ */
75
+ ref?: ListViewItemDOM[T] | null;
76
+ } & PolymorphicProps<T>;
77
+ export type ListViewItemDOM = {
78
+ li: HTMLLIElement;
79
+ a: HTMLAnchorElement;
80
+ div: HTMLDivElement;
81
+ };
82
+ export type ListViewContextConfig = {
83
+ shape: Shapes;
84
+ };
85
+ export type ListViewContextState = {
86
+ selectedItems: string[];
87
+ anchorIndex: number | null;
88
+ };
89
+ export type ListViewContextMethods = {
90
+ handleSelection: (e: MouseEvent, value: string) => void;
91
+ getChildrenRole: (tag: 'li' | 'a' | 'div') => 'listitem' | 'option' | 'row' | undefined;
92
+ registerItem: (id: string, value: string, disabled: boolean) => void;
93
+ unregisterItem: (id: string) => void;
94
+ };
95
+ export type ListViewContext = FSContext<ListViewContextConfig, ListViewContextState, null, ListViewContextMethods>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,6 @@
1
+ import type { ListViewContext, NavigationMode, SelectionMode } from './types.ts';
2
+ export declare const COMPONENT_NAME = "fslist-view-";
3
+ export declare const TAG: string[];
4
+ export declare const ITEM_TAG: string[];
5
+ export declare function getRole(tag: 'ul' | 'ol' | 'div', selectionMode: SelectionMode, navigationMode: NavigationMode): 'grid' | 'listbox' | 'list' | undefined;
6
+ export declare const getListViewContext: () => ListViewContext | null, setListViewContext: (context: ListViewContext) => void;
@@ -0,0 +1,12 @@
1
+ import { PREFIX } from '../../internal/constants.js';
2
+ import { createFSContext } from '../../internal/index.js';
3
+ export const COMPONENT_NAME = `${PREFIX}list-view-`;
4
+ export const TAG = ['ul', 'ol', 'div'];
5
+ export const ITEM_TAG = ['li', 'a', 'div'];
6
+ export function getRole(tag, selectionMode, navigationMode) {
7
+ if (selectionMode !== 'none') {
8
+ return navigationMode === 'composite' ? 'grid' : 'listbox';
9
+ }
10
+ return tag === 'div' ? 'list' : undefined;
11
+ }
12
+ export const [getListViewContext, setListViewContext] = createFSContext();
@@ -0,0 +1,84 @@
1
+ <script lang="ts">
2
+ import { onMount, tick } from 'svelte';
3
+ import { on } from 'svelte/events';
4
+ import { useDebounce } from 'runed';
5
+ import { COMPONENT_NAME, getMenuContext } from './menu.svelte.js';
6
+ import { preventDefault } from '../../internal/index.js';
7
+ import { VIRTUAL_ELEMENT } from '../../internal/constants.js';
8
+
9
+ let {
10
+ disabled,
11
+ ref
12
+ }: {
13
+ /** Disables the user interaction. */
14
+ disabled?: boolean;
15
+ /** The reference element for the context menu. */
16
+ ref: HTMLElement;
17
+ } = $props();
18
+
19
+ const context = getMenuContext();
20
+
21
+ if (!context) throw new Error(`No MenuContext found for ${COMPONENT_NAME}.`);
22
+
23
+ const { state: _state } = context;
24
+
25
+ const { toggle, close } = context.methods;
26
+
27
+ const { id, openingDelay } = context.config;
28
+
29
+ let offClick: (() => void) | null = $state(null);
30
+
31
+ const debounced = useDebounce(async (e: MouseEvent) => {
32
+ if (disabled) return;
33
+
34
+ const { clientX, clientY } = e;
35
+
36
+ _state.ref = {
37
+ getBoundingClientRect() {
38
+ return {
39
+ width: 0,
40
+ height: 0,
41
+ x: clientX,
42
+ y: clientY,
43
+ top: clientY,
44
+ right: clientX,
45
+ bottom: clientY,
46
+ left: clientX
47
+ };
48
+ }
49
+ };
50
+
51
+ // Add event to check if user click outside the menu to close it
52
+ offClick ??= on(document, 'click', (e) => {
53
+ const clickTarget = e.target as HTMLElement;
54
+
55
+ if (!clickTarget.closest(`#fs-menu-popover-${id}`)) {
56
+ _state.locked = false;
57
+ close(e);
58
+ offClick?.();
59
+ offClick = null;
60
+ }
61
+ });
62
+
63
+ _state.locked = !_state.locked;
64
+ toggle(e);
65
+
66
+ // When requesting to open the context menu when is already open, we need to wait for the toggle to finish before allowing it to be toggled again
67
+ if (!_state.open) {
68
+ await tick();
69
+ _state.locked = !_state.locked;
70
+ toggle(e);
71
+ }
72
+ }, openingDelay || 0);
73
+
74
+ onMount(() => {
75
+ _state.ref ??= VIRTUAL_ELEMENT;
76
+
77
+ const off = on(ref ? ref : document.body, 'contextmenu', preventDefault(debounced));
78
+
79
+ return () => {
80
+ off();
81
+ offClick?.();
82
+ };
83
+ });
84
+ </script>
@@ -0,0 +1,9 @@
1
+ type $$ComponentProps = {
2
+ /** Disables the user interaction. */
3
+ disabled?: boolean;
4
+ /** The reference element for the context menu. */
5
+ ref: HTMLElement;
6
+ };
7
+ declare const ContextMenuTrigger: import("svelte").Component<$$ComponentProps, {}, "">;
8
+ type ContextMenuTrigger = ReturnType<typeof ContextMenuTrigger>;
9
+ export default ContextMenuTrigger;
@@ -0,0 +1,169 @@
1
+ # Menu
2
+
3
+ Menu is a component for displaying a list of actions or options in a dropdown format. It can be used in various contexts, such as navigation, settings, or context menus.
4
+
5
+ This component relies on the Floating UI library for positioning. It provides a flexible API for creating complex menu structures, including nested menus, checkable items, and disabled items.
6
+
7
+ To create a menu, you will need to use the following components:
8
+
9
+ - `Menu`: The root component that creates all the state and provides context to its children.
10
+ - `MenuTrigger`: Handles all the logic for the trigger element that opens the menu. It uses a render prop pattern to provide the necessary props and state to the trigger element.
11
+ - `ContextMenuTrigger`: A variant of MenuTrigger that is designed to be used for context menus. It attaches the menu to a specified element and opens on right-click.
12
+ - `MenuPopover`: The container for the menu content. It handles the positioning and accessibility of the menu.
13
+ - `MenuList`: A wrapper for the list of menu items.
14
+ - `MenuItem`: Represents a single item in the menu. It can be a simple action or a trigger for a nested menu.
15
+ - `SplitButton` or `Button`: The trigger element for the menu.
16
+
17
+ Other components that can be used within the menu include:
18
+
19
+ - `MenuGroup`: A wrapper for grouping related menu items together, with an optional header.
20
+ - `MenuDivider`: A visual separator between menu items or groups.
21
+ - `MenuItemCheckbox`: A menu item that can be checked or unchecked.
22
+ - `MenuItemSwitch`: A menu item that can be toggled on or off.
23
+ - `MenuItemRadio`: A menu item that can be selected as part of a group of radio items.
24
+
25
+ ## Usage
26
+
27
+ To correctly attach events to the trigger element, you should wrap the element with the `children()` `snippet`. This allows you to bind the necessary props and state to your trigger element, ensuring that the menu opens and closes as expected.
28
+
29
+ ```svelte
30
+ <script>
31
+ import { Button, Menu, MenuTrigger, MenuPopover, MenuList, MenuGroup, MenuItem, MenuDivider } from 'fluentui-svelte';
32
+ </script>
33
+
34
+ <Menu>
35
+ <MenuTrigger>
36
+ {#snippet children({ state, menuTriggerProps })}
37
+ <Button bind:ref={state.ref} {...menuTriggerProps}>Open Menu</Button>
38
+ {/snippet}
39
+ </MenuTrigger>
40
+ <MenuPopover>
41
+ <MenuList>
42
+ <MenuGroup header="Group 1">
43
+ <MenuItem>Item 1</MenuItem>
44
+ <MenuItem>Item 2</MenuItem>
45
+ </MenuGroup>
46
+ <MenuDivider />
47
+ <MenuGroup header="Group 2">
48
+ <MenuItem>Item 3</MenuItem>
49
+ <MenuItem>Item 4</MenuItem>
50
+ </MenuGroup>
51
+ </MenuList>
52
+ </MenuPopover>
53
+ </Menu>
54
+ ```
55
+
56
+ ## More Examples
57
+
58
+ ### Menu with checkable items and nested submenus
59
+
60
+ ```svelte
61
+ <Menu hasCheckmarks hasIcons {checkedValues} onCheckedValueChange={(e, value) => (checkedValues = value)}>
62
+ <MenuTrigger>
63
+ {#snippet children({ state, menuTriggerProps })}
64
+ <Button isMenuButton bind:ref={state.ref} {...menuTriggerProps}>
65
+ <AccessTimeRegular /> Open Menu
66
+ </Button>
67
+ {/snippet}
68
+ </MenuTrigger>
69
+ <MenuPopover>
70
+ <MenuList>
71
+ <MenuItem subText="An explanation here">Item With Subtext</MenuItem>
72
+ <MenuDivider />
73
+ <MenuItem disabled>I'm Disabled</MenuItem>
74
+ <MenuItemCheckbox name="item4" value="item4" icon={AccessTimeRegular}>I'm a checkbox</MenuItemCheckbox>
75
+ <MenuItemSwitch>I'm a switch</MenuItemSwitch>
76
+ <MenuItemRadio name="item6" value="item6" icon={AccessTimeRegular}>I'm a radio</MenuItemRadio>
77
+ </MenuList>
78
+ </MenuPopover>
79
+ </Menu>
80
+ ```
81
+
82
+ ### Menu with a SplitButton trigger
83
+
84
+ ```svelte
85
+ <Menu>
86
+ <MenuTrigger>
87
+ {#snippet children({ state, menuTriggerProps, primaryButtonProps })}
88
+ <SplitButton
89
+ bind:menuTriggerRef={state.ref}
90
+ {menuTriggerProps}
91
+ primaryButtonProps={{ onclick: () => alert('Primary action'), ...primaryButtonProps }}
92
+ >
93
+ Primary Action
94
+ </SplitButton>
95
+ {/snippet}
96
+ </MenuTrigger>
97
+ <MenuPopover>
98
+ <MenuList>
99
+ <MenuItem>Item 1</MenuItem>
100
+ <MenuItem>Item 2</MenuItem>
101
+ </MenuList>
102
+ </MenuPopover>
103
+ </Menu>
104
+ ```
105
+
106
+ ## Context Menu
107
+
108
+ This variant of the `MenuTrigger` component allows you to create context menus that open on right-click. You can specify the element to which the context menu should be attached using the `ref` prop. If no element is provided, it will attach to the `document.body` by default.
109
+
110
+ ```svelte
111
+ <Menu>
112
+ <ContextMenuTrigger ref={document.querySelector('#context-menu-box')} />
113
+ <MenuPopover>
114
+ <MenuList>
115
+ <MenuItem>Item 1</MenuItem>
116
+ <MenuItem>Item 2</MenuItem>
117
+ </MenuList>
118
+ </MenuPopover>
119
+ </Menu>
120
+ ```
121
+
122
+ ## Component Props (Menu)
123
+
124
+ | Name | Type | Description |
125
+ | ------------------------- | ------------------------------------------------------------- | ----------------------------------------------------------------------------------------- |
126
+ | `checkedValues` | `Record<string, string[]>` | Map-like object of checked values, keyed by group name. |
127
+ | `onCheckedValueChange` | `(e: Event, checkedValues: Record<string, string[]>) => void` | Callback fired when checked values change. |
128
+ | `hasCheckmarks` | `boolean` | States that menu items can contain selectable items and reserve slots for item alignment. |
129
+ | `hasIcons` | `boolean` | States that menu items can contain icons and reserve slots for item alignment. |
130
+ | `openingDelay` | `number` | The delay in milliseconds before opening a submenu on hover. Default is 0. |
131
+ | `open` | `boolean` | Controls the open state of the menu. |
132
+ | `onOpenChange` | `(e: Event, open: boolean) => void` | Callback fired when the open state of the menu changes. |
133
+ | `openOnHover` | `boolean` | If true, the menu will open when the trigger is hovered. |
134
+ | `persistOnItemActivation` | `boolean` | If true, the menu will not close when a menu item is activated. |
135
+ | `positionConfig` | `Partial<ComputePositionConfig>` | Configuration for the Floating UI positioning. It will be passed down to MenuPopover. |
136
+
137
+ ## Component Props (MenuTrigger)
138
+
139
+ | Name | Type | Description |
140
+ | ---------- | ------------------------------- | ------------------------------------------------------- |
141
+ | `shape` | `rounded \| circular \| square` | The shape of the trigger element. Default is 'rounded'. |
142
+ | `icon` | `Snippet \| Component` | An optional icon to display in the trigger element. |
143
+ | `disabled` | `boolean` | If true, the trigger element will be disabled. |
144
+
145
+ ## Component Props (MenuItem)
146
+
147
+ | Name | Type | Description |
148
+ | ------------------ | ---------------------- | -------------------------------------------------------------------- |
149
+ | `icon` | `Snippet \| Component` | An optional icon to display in the menu item. |
150
+ | `subText` | `string` | Optional subtext to display below the main content of the menu item. |
151
+ | `secondaryContent` | `string` | Optional secondary content to display like a hint text. |
152
+ | `href` | `string` | If provided, the menu item will render as an anchor element. |
153
+ | `disabled` | `boolean` | If true, the menu item will be disabled. |
154
+ | `onClick` | `(e: Event) => void` | Callback fired when the menu item is clicked. |
155
+
156
+ ## Component Props (MenuItemCheckbox/Switch/Radio)
157
+
158
+ | Name | Type | Description |
159
+ | -------------------- | --------- | ------------------------------------------------------------------------------ |
160
+ | All `MenuItem` props | | All props from the MenuItem component are compatible. |
161
+ | `value` | `string` | The value of the checkbox item. This is required for the item to be checkable. |
162
+ | `checked` | `boolean` | Controls the checked state of the checkbox item. (Bindable) |
163
+ | `name` | `string` | The name of the checkbox item, used for grouping related checkboxes. |
164
+
165
+ ## Component Props (MenuGroup)
166
+
167
+ | Name | Type | Description |
168
+ | -------- | -------- | ------------------------------------------------ |
169
+ | `header` | `string` | Optional header text to display above the group. |
@@ -0,0 +1,9 @@
1
+ <div role="separator" class="fs-menu-divider"></div>
2
+
3
+ <style>
4
+ .fs-menu-divider {
5
+ border-bottom: 1px solid var(--fs-control-stroke-default);
6
+ margin: 0.25rem -0.25rem;
7
+ width: auto;
8
+ }
9
+ </style>
@@ -0,0 +1,26 @@
1
+ export default MenuDivider;
2
+ type MenuDivider = SvelteComponent<{
3
+ [x: string]: never;
4
+ }, {
5
+ [evt: string]: CustomEvent<any>;
6
+ }, {}> & {
7
+ $$bindings?: string | undefined;
8
+ };
9
+ declare const MenuDivider: $$__sveltets_2_IsomorphicComponent<{
10
+ [x: string]: never;
11
+ }, {
12
+ [evt: string]: CustomEvent<any>;
13
+ }, {}, {}, string>;
14
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
15
+ new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
16
+ $$bindings?: Bindings;
17
+ } & Exports;
18
+ (internal: unknown, props: {
19
+ $$events?: Events;
20
+ $$slots?: Slots;
21
+ }): Exports & {
22
+ $set?: any;
23
+ $on?: any;
24
+ };
25
+ z_$$bindings?: Bindings;
26
+ }
@@ -0,0 +1,31 @@
1
+ <script lang="ts">
2
+ import { PREFIX } from '../../internal/constants.js';
3
+ import type { MenuGroupProps } from './types.js';
4
+
5
+ const FALLBACK_ID = $props.id();
6
+ const COMPONENT_NAME = 'menu-group';
7
+ const ID = `${PREFIX}${COMPONENT_NAME}-${FALLBACK_ID}`;
8
+
9
+ let { ref = $bindable(), header, children }: MenuGroupProps = $props();
10
+ </script>
11
+
12
+ <div class="fs-menu-group" role="group" aria-labelledby="group-name-{ID}" bind:this={ref}>
13
+ <h3 id="group-name-{ID}" class="group-name">{header || ID}</h3>
14
+ {@render children()}
15
+ </div>
16
+
17
+ <style>
18
+ .fs-menu-group {
19
+ margin: 0;
20
+ display: flex;
21
+ flex-direction: column;
22
+ flex: 1;
23
+ & .group-name {
24
+ font-size: var(--fs-caption-font-size);
25
+ line-height: var(--fs-caption-line-height);
26
+ font-weight: 500;
27
+ padding: 0.313rem 0.5rem 0.313rem;
28
+ color: var(--fs-text-secondary);
29
+ }
30
+ }
31
+ </style>
@@ -0,0 +1,4 @@
1
+ import type { MenuGroupProps } from './types.ts';
2
+ declare const MenuGroup: import("svelte").Component<MenuGroupProps, {}, "ref">;
3
+ type MenuGroup = ReturnType<typeof MenuGroup>;
4
+ export default MenuGroup;
@@ -0,0 +1,143 @@
1
+ <script lang="ts">
2
+ import { watch } from 'runed';
3
+ import CheckmarkFilled from 'fluentui-icons-svelte/CheckmarkFilled.svelte';
4
+ import { Button } from '../../index.js';
5
+ import { PREFIX } from '../../internal/constants.js';
6
+ import { getMenuContext, COMPONENT_NAME as MENU_COMPONENT_NAME } from './menu.svelte.js';
7
+ import { invokeHandlers, RenderSoC } from '../../internal/index.js';
8
+ import type { MenuItemActionableProps } from './types.js';
9
+
10
+ const FALLBACK_ID = $props.id();
11
+ const COMPONENT_NAME = 'menu-item-switch';
12
+ const ID = `${PREFIX}${COMPONENT_NAME}-${FALLBACK_ID}`;
13
+
14
+ let {
15
+ ref = $bindable(),
16
+ icon: Icon,
17
+ secondaryContent,
18
+ children,
19
+ checked = $bindable(),
20
+ disabled,
21
+ class: classes,
22
+ id = ID,
23
+ name = id as string,
24
+ value = id as string,
25
+ subText,
26
+ onclick,
27
+ ...attributes
28
+ }: MenuItemActionableProps = $props();
29
+
30
+ const context = getMenuContext();
31
+
32
+ if (!context) throw new Error(`No MenuContext found for ${MENU_COMPONENT_NAME}.`);
33
+
34
+ const { hasIcons, hasCheckmarks } = context.config;
35
+
36
+ const { toggleCheckbox } = context.methods;
37
+
38
+ const { state: _state } = context;
39
+
40
+ watch(
41
+ () => _state.checkedValues?.[name]?.includes(value),
42
+ () => {
43
+ checked = _state.checkedValues?.[name]?.includes(value) || false;
44
+ }
45
+ );
46
+ </script>
47
+
48
+ <!--
49
+ @component
50
+
51
+ - Usage:
52
+ ```tsx
53
+ <Menu hasIcons>
54
+ <MenuGroup name="Inputs">
55
+ <MenuItemCheckbox secondaryContent="Item 1" hint="Ctrl + 1" {Icon}>Item 1</MenuItemCheckbox>
56
+ <MenuItemCheckbox secondaryContent="Item 2" hint="Ctrl + 2">Item 2</MenuItemCheckbox>
57
+ </MenuGroup>
58
+ </Menu>
59
+ ```
60
+ -->
61
+ <Button
62
+ as="button"
63
+ {disabled}
64
+ appearance="subtle"
65
+ onclick={(e: MouseEvent) => invokeHandlers(e, disabled, [onclick, () => toggleCheckbox(e, value, name)])}
66
+ onkeydown={(e: KeyboardEvent) =>
67
+ invokeHandlers(e, [e.key !== 'Enter', !!disabled], [onkeydown, () => toggleCheckbox(e, value, name)])}
68
+ aria-checked={checked}
69
+ role="menuitemcheckbox"
70
+ style={`--margin-left: ${hasIcons && !Icon ? 1.5 : 0}rem;}`}
71
+ aria-label={secondaryContent ? `${secondaryContent}, Use ${secondaryContent}` : undefined}
72
+ class="fs-menu-item-checkbox {hasIcons || hasCheckmarks ? 'align' : ''} {checked ? 'checked' : ''} {classes}"
73
+ bind:ref
74
+ {...attributes}
75
+ >
76
+ <span class="label" aria-label="{secondaryContent}, Use {secondaryContent}">
77
+ <CheckmarkFilled class="indicator" />
78
+ {#if Icon}
79
+ <RenderSoC SoC={Icon} class="menu-item-icon" args={[{ class: 'menu-item-icon' }]} />
80
+ {/if}
81
+ {#if subText}
82
+ <span class="sub-text">
83
+ {@render children?.()}
84
+ <small>{subText}</small>
85
+ </span>
86
+ {:else}
87
+ {@render children?.()}
88
+ {/if}
89
+ </span>
90
+ {#if secondaryContent}
91
+ <span class="secondary-content" aria-hidden="true">{secondaryContent}</span>
92
+ {/if}
93
+ </Button>
94
+
95
+ <style>
96
+ :global(.fs-menu-item-checkbox.fs-button) {
97
+ width: 100%;
98
+ padding: 0.375rem 0.45rem;
99
+ border-radius: var(--fs-control-inner-border-radius);
100
+ justify-content: space-between;
101
+ font-size: var(--fs-body2-font-size);
102
+ line-height: var(--fs-caption-line-height);
103
+ & :global(svg) {
104
+ width: 1.25rem;
105
+ fill: currentColor;
106
+ & > :global(path) {
107
+ fill: currentColor;
108
+ }
109
+ }
110
+ & .label {
111
+ display: flex;
112
+ align-items: center;
113
+ gap: 0.25rem;
114
+ font-size: inherit;
115
+ }
116
+ & .secondary-content {
117
+ font-size: var(--fs-caption-font-size);
118
+ color: var(--fs-text-secondary);
119
+ margin-left: 0.6rem;
120
+ }
121
+ &:global(.align .label:not(:has(.menu-item-icon))) {
122
+ margin-left: var(--margin-left) !important;
123
+ }
124
+ & .sub-text {
125
+ display: flex;
126
+ flex-direction: column;
127
+ align-items: flex-start;
128
+ text-align: left;
129
+ font-size: inherit;
130
+ & small {
131
+ font-size: var(--fs-caption2-font-size);
132
+ color: var(--fs-text-secondary);
133
+ }
134
+ }
135
+ & :global(svg.indicator) {
136
+ width: 20px;
137
+ opacity: 0;
138
+ }
139
+ &.checked :global(svg.indicator) {
140
+ opacity: 1;
141
+ }
142
+ }
143
+ </style>
@@ -0,0 +1,15 @@
1
+ import type { MenuItemActionableProps } from './types.ts';
2
+ /**
3
+ * - Usage:
4
+ * ```tsx
5
+ * <Menu hasIcons>
6
+ * <MenuGroup name="Inputs">
7
+ * <MenuItemCheckbox secondaryContent="Item 1" hint="Ctrl + 1" {Icon}>Item 1</MenuItemCheckbox>
8
+ * <MenuItemCheckbox secondaryContent="Item 2" hint="Ctrl + 2">Item 2</MenuItemCheckbox>
9
+ * </MenuGroup>
10
+ * </Menu>
11
+ * ```
12
+ */
13
+ declare const MenuItemCheckbox: import("svelte").Component<MenuItemActionableProps, {}, "ref" | "checked">;
14
+ type MenuItemCheckbox = ReturnType<typeof MenuItemCheckbox>;
15
+ export default MenuItemCheckbox;