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,67 @@
1
+ # Label
2
+
3
+ A Label provides an accessible caption for a form control. It supports different sizes and weights, can be marked as required or disabled, and can be positioned relative to the control it wraps.
4
+
5
+ ## Usage
6
+
7
+ ```svelte
8
+ <script>
9
+ import { Label } from 'fluentui-svelte';
10
+ </script>
11
+
12
+ <Label label="Email" />
13
+ ```
14
+
15
+ ## Examples
16
+
17
+ ### Size
18
+
19
+ Use the `size` prop to control the label text size.
20
+
21
+ ```svelte
22
+ <Label size="small" label="Small" />
23
+ <Label size="medium" label="Medium" />
24
+ <Label size="large" label="Large" />
25
+ ```
26
+
27
+ ### Weight
28
+
29
+ Use the `weight` prop to switch between a regular and a semibold label.
30
+
31
+ ```svelte
32
+ <Label weight="regular" label="Regular" />
33
+ <Label weight="semibold" label="Semibold" />
34
+ ```
35
+
36
+ ### Label Position
37
+
38
+ Use the `labelPosition` prop to place the label text relative to the wrapped control.
39
+
40
+ ```svelte
41
+ <Label labelPosition="before" label="Before" />
42
+ <Label labelPosition="after" label="After" />
43
+ <Label labelPosition="above" label="Above" />
44
+ <Label labelPosition="below" label="Below" />
45
+ ```
46
+
47
+ ### Required
48
+
49
+ Pass a `required` object to mark the label as required and render a required indicator.
50
+
51
+ ```svelte
52
+ <Label label="Email" required={{ message: 'Required field' }} />
53
+ ```
54
+
55
+ ## Component Props
56
+
57
+ | Name | Type | Description |
58
+ | --------------- | ------------------------------------------- | ------------------------------------------------------------------------------- |
59
+ | `label` | `string` | The text content of the label. Default: `'Label Element'`. |
60
+ | `size` | `'small' \| 'medium' \| 'large'` | The size of the label text. Default: `'medium'`. |
61
+ | `weight` | `'regular' \| 'semibold'` | The font weight of the label. Default: `'regular'`. |
62
+ | `labelPosition` | `'before' \| 'after' \| 'above' \| 'below'` | Position of the label text relative to the wrapped content. Default: `'after'`. |
63
+ | `required` | `{ message?: string; abbr?: string }` | Marks the label as required and renders a required indicator (default `*`). |
64
+ | `disabled` | `boolean` | Renders the label in a disabled style and disables pointer events. |
65
+ | `class` | `string` | Additional classes applied to the label element. |
66
+ | `ref` | bindable `HTMLLabelElement` | The DOM reference of the label element. |
67
+ | `children` | `Snippet` | The content wrapped by the label (typically a form control). |
@@ -0,0 +1,95 @@
1
+ <script lang="ts">
2
+ import type { LabelProps } from './types.js';
3
+
4
+ let {
5
+ ref = $bindable(),
6
+ class: classes,
7
+ disabled,
8
+ required,
9
+ size = 'medium',
10
+ weight = 'regular',
11
+ label = 'Label Element',
12
+ labelPosition = 'after',
13
+ children,
14
+ ...attributes
15
+ }: LabelProps = $props();
16
+ </script>
17
+
18
+ <label
19
+ class={[
20
+ 'fs-label',
21
+ `size-${size}`,
22
+ `weight-${weight}`,
23
+ classes,
24
+ { disabled, required },
25
+ (labelPosition === 'above' || labelPosition === 'below') && 'column'
26
+ ]}
27
+ bind:this={ref}
28
+ {...attributes}
29
+ >
30
+ {#if labelPosition === 'before' || labelPosition === 'above'}
31
+ <span>
32
+ {label}
33
+ {#if required}
34
+ <abbr title={required.message || label}>{required.abbr ?? '*'}</abbr>
35
+ {/if}
36
+ </span>
37
+ {/if}
38
+
39
+ {@render children?.()}
40
+
41
+ {#if labelPosition === 'after' || labelPosition === 'below'}
42
+ <span>
43
+ {label}
44
+ {#if required}
45
+ <abbr title={required.message || label}>{required.abbr ?? '*'}</abbr>
46
+ {/if}
47
+ </span>
48
+ {/if}
49
+ </label>
50
+
51
+ <style>
52
+ .fs-label {
53
+ display: inline-flex;
54
+ align-items: center;
55
+ user-select: none;
56
+ &.column {
57
+ flex-direction: column;
58
+ align-items: flex-start;
59
+ }
60
+ &.size-small {
61
+ font-size: var(--fs-caption-font-size);
62
+ letter-spacing: 0.04em;
63
+ gap: 0.25rem;
64
+ }
65
+ &.size-medium {
66
+ font-size: var(--fs-body-font-size);
67
+ gap: 0.375rem;
68
+ }
69
+ &.size-large {
70
+ font-size: var(--fs-subtitle2-font-size);
71
+ gap: 0.5rem;
72
+ }
73
+ &.weight-regular {
74
+ font-weight: 400;
75
+ }
76
+ &.weight-semibold {
77
+ font-weight: 600;
78
+ }
79
+ &.disabled {
80
+ color: var(--fs-text-disabled);
81
+ pointer-events: none;
82
+ }
83
+ &.required {
84
+ & abbr {
85
+ text-decoration: none;
86
+ color: var(--fs-system-critical);
87
+ font-size: inherit;
88
+ line-height: 0;
89
+ }
90
+ &.disabled abbr {
91
+ color: var(--fs-text-disabled);
92
+ }
93
+ }
94
+ }
95
+ </style>
@@ -0,0 +1,4 @@
1
+ import type { LabelProps } from './types.ts';
2
+ declare const Label: import("svelte").Component<LabelProps, {}, "ref">;
3
+ type Label = ReturnType<typeof Label>;
4
+ export default Label;
@@ -0,0 +1,32 @@
1
+ import type { HTMLLabelAttributes } from 'svelte/elements';
2
+ import type { Sizes } from '../../types/index.js';
3
+ /** @propsmith LabelProps */
4
+ export type LabelProps = {
5
+ /** The text of the label. Falls back to the rendered children.
6
+ * @default 'Label Element'
7
+ */
8
+ label?: string;
9
+ /** The size of the label text.
10
+ * @default 'medium'
11
+ */
12
+ size?: Sizes;
13
+ /** The weight of the label text.
14
+ * @default 'regular'
15
+ */
16
+ weight?: 'regular' | 'semibold';
17
+ /** Where the label sits relative to the field it describes.
18
+ * @default 'after'
19
+ */
20
+ labelPosition?: 'before' | 'after' | 'above' | 'below';
21
+ /** Marks the field as required, and describes why through the given message. */
22
+ required?: {
23
+ abbr?: string;
24
+ message: string;
25
+ };
26
+ /** Renders the label as disabled, to match the field it describes. */
27
+ disabled?: boolean;
28
+ /** The DOM reference of the label element.
29
+ * @bindable
30
+ */
31
+ ref?: HTMLLabelElement;
32
+ } & HTMLLabelAttributes;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,110 @@
1
+ # ListView
2
+
3
+ The ListView is a component for rendering a set of vertically stacked items. These items can be focusable, selectable, have one primary action and one or more secondary actions, and support keyboard navigation and accessibility features.
4
+
5
+ ## Usage
6
+
7
+ ```svelte
8
+ <script>
9
+ import { ListView, ListViewItem } from 'fluentui-svelte';
10
+ let list = ['A', 'B', 'C'];
11
+ let selected = ['A'];
12
+ </script>
13
+
14
+ <ListView selectedItems={selected}>
15
+ {#each list as item (item)}
16
+ <ListViewItem value={item}>{item}</ListViewItem>
17
+ {/each}
18
+ </ListView>
19
+ ```
20
+
21
+ ## ListView API
22
+
23
+ > **Best practices:** Please check the Fluent UI React List best practices for guidance.
24
+
25
+ ### As
26
+
27
+ You can control which tag the ListView component should use: ul, ol, or div. Default: ul.
28
+
29
+ ### Shape
30
+
31
+ Instead of setting this on every ListViewItem, you can set it here and every item will inherit it. Possible values are rounded, circular, or square. Default: rounded.
32
+
33
+ ### Navigation Mode
34
+
35
+ This option allows you to set keyboard navigation based on your needs. For view-only data, you do not need to set this unless the items perform some action. If your items have multiple actionable elements within the ListViewItem, like buttons or menus, you can set this to composite.
36
+
37
+ ## Examples
38
+
39
+ ### Value
40
+
41
+ Sets the value of the current item. You must set this when using the ListView selection system or if items change dynamically.
42
+
43
+ ### On Action
44
+
45
+ This event is triggered when clicking or tapping the element. It executes the primary action and, if the role is not row, it also executes the selection itself.
46
+
47
+ ### Selection Mode
48
+
49
+ Use `selectionMode` (`single`, `multiselect`, or `extended`) to control how items are selected.
50
+
51
+ ```svelte
52
+ <ListView selectionMode="multiselect" selectedItems={['Apple']}>
53
+ {#each ['Apple', 'Banana', 'Cherry'] as item (item)}
54
+ <ListViewItem value={item}>{item}</ListViewItem>
55
+ {/each}
56
+ </ListView>
57
+ ```
58
+
59
+ ### Checkmark
60
+
61
+ Add and configure a checkbox for the element. You can use the same props for the Checkbox component. Note: every actionable element inside this ListViewItem must call e.stopPropagation().
62
+
63
+ ```svelte
64
+ <ListViewItem
65
+ value="card"
66
+ role="row"
67
+ checkmark={{ style: 'position: absolute; top: 10px; left: 10px; z-index: 10;' }}
68
+ onAction={(e, d) => alert('Triggered Primary Action')}
69
+ >
70
+ <div style="...">
71
+ Card Content Inside ListItem
72
+ <Button
73
+ onclick={(e) => {
74
+ e.stopPropagation();
75
+ alert('Installing');
76
+ }}>Install</Button
77
+ >
78
+ </div>
79
+ </ListViewItem>
80
+ ```
81
+
82
+ ## ListView Props
83
+
84
+ | Name | Type | Description |
85
+ | ------------------- | --------------------------- | --------------------------------------------------------------------------------------------- |
86
+ | `as` | `string` | The HTML tag to use for the list container. Possible values: ul, ol, div. |
87
+ | `selectionMode` | `string` | Selection mode for the list. Possible values: single, multiselect, extended. |
88
+ | `navigationMode` | `string` | Navigation mode for keyboard navigation. Possible values: items, composite. |
89
+ | `selectedItems` | `string[]` | The currently selected item values. |
90
+ | `shape` | `string` | The shape of the list items. Possible values: rounded, circular, square. |
91
+ | `onSelectionChange` | `(Event, string[]) => void` | Callback fired when the selection changes. |
92
+ | `element` | Dynamic | Reference to the list DOM element. Depends on the selected as value. |
93
+ | `children` | Only `ListViewItem` | The ListViewItem children of the list. |
94
+ | Element Attributes | Dynamic | Based on the chosen as value, you will have autocomplete for all HTML attributes of that tag. |
95
+
96
+ ## ListViewItem Props
97
+
98
+ | Name | Type | Description |
99
+ | ------------------ | ------------------------------ | --------------------------------------------------------------------------------------------- |
100
+ | `as` | `string` | The HTML tag to use for the item container. Possible values: li, a, div. |
101
+ | `active` | `boolean` | Whether the item is currently active or selected. |
102
+ | `shape` | `string` | The shape of the item. Possible values: rounded, circular, square. |
103
+ | `value` | `string` | The value of the item used for selection. |
104
+ | `onAction` | `(MouseEvent, string) => void` | Callback fired when the item is activated. |
105
+ | `onFocus` | `(Event, string) => void` | Callback fired when the item receives focus. |
106
+ | `role` | `string` | ARIA role for the item. Possible values: treeitem, menuitem, option, row. |
107
+ | `disabled` | `boolean` | Whether the item is disabled. |
108
+ | `checkmark` | `object` | Props for the checkmark or checkbox. |
109
+ | `children` | `Snippet` | The content of the item. |
110
+ | Element Attributes | Dynamic | Based on the chosen as value, you will have autocomplete for all HTML attributes of that tag. |
@@ -0,0 +1,168 @@
1
+ <script lang="ts" generics="T extends 'li' | 'a' | 'div' = 'li'">
2
+ import { onMount } from 'svelte';
3
+ import { COMPONENT_NAME, getListViewContext, ITEM_TAG } from './utils.js';
4
+ import Checkbox from '../checkbox/checkbox.svelte';
5
+ import { invokeHandlers, isObjectEmpty } from '../../internal/index.js';
6
+ import type { ListViewItemProps, ListViewItemDOM } from './types.js';
7
+ import { getTabspotAttributes } from 'tabspot';
8
+
9
+ const ID = $props.id();
10
+
11
+ let {
12
+ as = 'li' as T,
13
+ ref = $bindable(),
14
+ shape,
15
+ disabled,
16
+ active: _active,
17
+ role: _role,
18
+ checkmark,
19
+ value = COMPONENT_NAME + '-' + ID,
20
+ class: classes,
21
+ onAction,
22
+ onfocus,
23
+ children,
24
+ ...attributes
25
+ }: ListViewItemProps<T> = $props();
26
+
27
+ // svelte-ignore state_referenced_locally
28
+ if (!ITEM_TAG.includes(as)) throw new Error(`Invalid tag: ${as}. Must be one of ${ITEM_TAG.join(', ')}`);
29
+
30
+ const CONTEXT = getListViewContext();
31
+
32
+ if (!CONTEXT) throw new Error('ListViewItem must be used within a ListView');
33
+
34
+ const { shape: _shape } = CONTEXT.config;
35
+ const { state: _state } = CONTEXT;
36
+ const { handleSelection, registerItem, unregisterItem, getChildrenRole } = CONTEXT.methods;
37
+ const role = $derived(_role || getChildrenRole(as));
38
+
39
+ let active = $derived(_state.selectedItems.includes(value));
40
+
41
+ // A row is a level of its own: right enters the cells, left comes back out. Anything
42
+ // that is not a row navigates as a plain item of the list above it.
43
+ const tabspotAttrs = $derived(
44
+ (role === 'row'
45
+ ? getTabspotAttributes({
46
+ mover: {
47
+ axis: 'vertical'
48
+ },
49
+ grouper: { enterDirection: 'right', exitDirection: 'left' }
50
+ })
51
+ : null) ?? {}
52
+ );
53
+
54
+ onMount(() => {
55
+ registerItem?.(ID, value as string, !!disabled);
56
+ return () => unregisterItem?.(ID);
57
+ });
58
+ </script>
59
+
60
+ <svelte:element
61
+ this={as}
62
+ {role}
63
+ data-value={value}
64
+ aria-selected={role === 'option' ? active : undefined}
65
+ aria-disabled={disabled || undefined}
66
+ bind:this={ref as ListViewItemDOM[T]}
67
+ class={[
68
+ 'fs-list-view-item',
69
+ shape ? shape : _shape,
70
+ classes,
71
+ { disabled },
72
+ role !== 'row' && 'indicator',
73
+ (_active || active) && 'active',
74
+ !disabled && role && 'interactive'
75
+ ]}
76
+ {...tabspotAttrs}
77
+ onfocus={(e: FocusEvent) => invokeHandlers(e, disabled, [(event: FocusEvent) => onfocus?.(event, value || '')])}
78
+ onclick={(e: MouseEvent) => {
79
+ invokeHandlers(
80
+ e,
81
+ disabled,
82
+ role !== 'row'
83
+ ? [
84
+ (event: MouseEvent) => handleSelection?.(event, value),
85
+ (event: MouseEvent) => onAction?.(event, value || '')
86
+ ]
87
+ : [(event: MouseEvent) => onAction?.(event, value || '')]
88
+ );
89
+ }}
90
+ {...attributes}
91
+ >
92
+ {#if checkmark}
93
+ <Checkbox {disabled} bind:checked={active} tabindex={-1} {...!isObjectEmpty(checkmark) ? checkmark : {}} />
94
+ {/if}
95
+ {@render children?.()}
96
+ </svelte:element>
97
+
98
+ <style>
99
+ .fs-list-view-item {
100
+ border-radius: var(--fs-control-border-radius);
101
+ font-size: var(--fs-body2-font-size);
102
+ color: var(--fs-text-primary);
103
+ border: none;
104
+ padding: 0.275rem 0.713rem 0.4rem 0.713rem;
105
+ position: relative;
106
+ outline: none;
107
+ display: flex;
108
+ gap: 0.5rem;
109
+ align-items: center;
110
+ text-decoration: none;
111
+ user-select: none;
112
+ &[disabled],
113
+ &[aria-disabled='true'] {
114
+ cursor: not-allowed;
115
+ background: var(--fs-subtle-fill-transparent) !important;
116
+ color: var(--fs-text-disabled) !important;
117
+ }
118
+
119
+ &.interactive {
120
+ cursor: pointer;
121
+ &:focus-visible,
122
+ &[data-active='true'] {
123
+ outline: 0.125rem var(--fs-focus-stroke-outer) solid;
124
+ outline-offset: 0.063rem;
125
+ }
126
+ &.indicator {
127
+ &:hover {
128
+ background: var(--fs-subtle-fill-secondary);
129
+ }
130
+ &:active {
131
+ color: var(--fs-text-tertiary);
132
+ background: var(--fs-subtle-fill-tertiary);
133
+ }
134
+ &::after {
135
+ content: '';
136
+ position: absolute;
137
+ top: 50%;
138
+ left: 0;
139
+ width: 3px;
140
+ height: 0;
141
+ transform: translateY(-50%);
142
+ background-color: var(--fs-accent-fill-default);
143
+ border-radius: var(--fs-control-border-radius);
144
+ pointer-events: none;
145
+ }
146
+ &.active {
147
+ background: var(--fs-subtle-fill-tertiary);
148
+ &::after {
149
+ transition: height var(--fs-normal-duration) var(--fs-fast-dismiss);
150
+ height: 50%;
151
+ }
152
+ }
153
+ }
154
+ }
155
+ &.disabled {
156
+ cursor: not-allowed;
157
+ color: var(--fs-text-disabled) !important;
158
+ }
159
+ &.rounded,
160
+ &.rounded:after {
161
+ border-radius: var(--fs-control-border-radius);
162
+ }
163
+ &.circular,
164
+ &.circular:after {
165
+ border-radius: 50vw;
166
+ }
167
+ }
168
+ </style>
@@ -0,0 +1,25 @@
1
+ import type { ListViewItemProps } from './types.ts';
2
+ declare function $$render<T extends 'li' | 'a' | 'div' = 'li'>(): {
3
+ props: ListViewItemProps<T>;
4
+ exports: {};
5
+ bindings: "ref";
6
+ slots: {};
7
+ events: {};
8
+ };
9
+ declare class __sveltets_Render<T extends 'li' | 'a' | 'div' = 'li'> {
10
+ props(): ReturnType<typeof $$render<T>>['props'];
11
+ events(): ReturnType<typeof $$render<T>>['events'];
12
+ slots(): ReturnType<typeof $$render<T>>['slots'];
13
+ bindings(): "ref";
14
+ exports(): {};
15
+ }
16
+ interface $$IsomorphicComponent {
17
+ new <T extends 'li' | 'a' | 'div' = 'li'>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
18
+ $$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
19
+ } & ReturnType<__sveltets_Render<T>['exports']>;
20
+ <T extends 'li' | 'a' | 'div' = 'li'>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
21
+ z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
22
+ }
23
+ declare const ListViewItem: $$IsomorphicComponent;
24
+ type ListViewItem<T extends 'li' | 'a' | 'div' = 'li'> = InstanceType<typeof ListViewItem<T>>;
25
+ export default ListViewItem;
@@ -0,0 +1,137 @@
1
+ <script lang="ts" generics="Tag extends 'ul' | 'ol' | 'div' = 'ul'">
2
+ import type { ListViewContext, ListViewProps, ListViewDOM } from './types.js';
3
+ import { getRole, TAG, setListViewContext } from './utils.js';
4
+ import { getTabspotAttributes } from 'tabspot';
5
+
6
+ let {
7
+ as = 'ul' as Tag,
8
+ ref = $bindable(),
9
+ selectionMode = 'none',
10
+ navigationMode = 'items',
11
+ shape = 'rounded',
12
+ selectedItems = $bindable([]),
13
+ onSelectionChange,
14
+ disableTabspot = false,
15
+ children,
16
+ ...attributes
17
+ }: ListViewProps<Tag> = $props();
18
+
19
+ // svelte-ignore state_referenced_locally
20
+ if (!TAG.includes(as)) throw new Error(`Invalid tag: ${as}. Must be one of ${TAG.join(', ')}`);
21
+
22
+ const ROLE = $derived(getRole(as, selectionMode, navigationMode));
23
+
24
+ const MULTISELECTABLE = $derived(selectionMode === 'multiselect' || selectionMode === 'extended');
25
+
26
+ const tabspotAttrs = $derived(
27
+ !disableTabspot &&
28
+ getTabspotAttributes({
29
+ root: {
30
+ manageSpecialKeys: true
31
+ },
32
+ mover: {
33
+ axis: 'vertical',
34
+ items: '.fs-list-view-item'
35
+ }
36
+ })
37
+ );
38
+
39
+ let anchorIndex: number | null = $state(null);
40
+
41
+ let items: {
42
+ id: string;
43
+ value: string;
44
+ disabled: boolean;
45
+ }[] = $state([]);
46
+
47
+ const config: ListViewContext['config'] = $derived({
48
+ shape
49
+ });
50
+
51
+ const _state: ListViewContext['state'] = {
52
+ get selectedItems() {
53
+ return selectedItems;
54
+ },
55
+ set selectedItems(v) {
56
+ selectedItems = v;
57
+ },
58
+ get anchorIndex() {
59
+ return anchorIndex;
60
+ },
61
+ set anchorIndex(v) {
62
+ anchorIndex = v;
63
+ }
64
+ };
65
+
66
+ let methods: ListViewContext['methods'] = {
67
+ handleSelection: (e: MouseEvent, value: string) => {
68
+ if (selectionMode === 'none') return;
69
+
70
+ const itemIndex = items.findIndex((item) => item.value === value);
71
+ if (itemIndex === -1) return;
72
+
73
+ const item = items[itemIndex];
74
+ if (item.disabled) return;
75
+
76
+ if (selectionMode === 'extended' && e.shiftKey && anchorIndex !== null) {
77
+ const start = Math.min(anchorIndex, itemIndex);
78
+ const end = Math.max(anchorIndex, itemIndex);
79
+ const rangeValues = items
80
+ .slice(start, end + 1)
81
+ .filter((i) => !i.disabled)
82
+ .map((i) => i.value);
83
+ const newSelectedItems = Array.from(new Set([..._state.selectedItems, ...rangeValues]));
84
+ _state.selectedItems = newSelectedItems;
85
+ } else if (MULTISELECTABLE && (e.ctrlKey || e.metaKey)) {
86
+ _state.selectedItems = _state.selectedItems.includes(value)
87
+ ? _state.selectedItems.filter((v) => v !== value)
88
+ : [..._state.selectedItems, value];
89
+ _state.anchorIndex = itemIndex;
90
+ } else {
91
+ _state.selectedItems = [value];
92
+ _state.anchorIndex = itemIndex;
93
+ }
94
+ onSelectionChange?.(e, _state.selectedItems);
95
+ },
96
+ registerItem: (id: string, value: string, disabled: boolean) => {
97
+ items.push({ id, value, disabled });
98
+ },
99
+ unregisterItem: (id: string) => {
100
+ items = items.filter((item) => item.id !== id);
101
+ },
102
+ getChildrenRole: (_tag: 'li' | 'a' | 'div') => {
103
+ if (ROLE === 'grid') return 'row';
104
+ if (ROLE === 'listbox') return 'option';
105
+ return _tag !== 'li' ? 'listitem' : undefined;
106
+ }
107
+ };
108
+
109
+ // svelte-ignore state_referenced_locally
110
+ const CONTEXT: ListViewContext = { config, state: _state, events: null, methods };
111
+
112
+ setListViewContext(CONTEXT);
113
+ </script>
114
+
115
+ <svelte:element
116
+ this={as}
117
+ bind:this={ref as ListViewDOM[Tag]}
118
+ class="fs-list-view"
119
+ role={ROLE}
120
+ aria-multiselectable={MULTISELECTABLE || undefined}
121
+ {...tabspotAttrs}
122
+ {...attributes}
123
+ >
124
+ {@render children?.()}
125
+ </svelte:element>
126
+
127
+ <style>
128
+ .fs-list-view {
129
+ list-style: none;
130
+ padding: 0;
131
+ margin: 0;
132
+ width: 100%;
133
+ & :global(.fs-list-view-item) {
134
+ margin: 0.3rem 0;
135
+ }
136
+ }
137
+ </style>
@@ -0,0 +1,25 @@
1
+ import type { ListViewProps } from './types.ts';
2
+ declare function $$render<Tag extends 'ul' | 'ol' | 'div' = 'ul'>(): {
3
+ props: ListViewProps<Tag>;
4
+ exports: {};
5
+ bindings: "ref" | "selectedItems";
6
+ slots: {};
7
+ events: {};
8
+ };
9
+ declare class __sveltets_Render<Tag extends 'ul' | 'ol' | 'div' = 'ul'> {
10
+ props(): ReturnType<typeof $$render<Tag>>['props'];
11
+ events(): ReturnType<typeof $$render<Tag>>['events'];
12
+ slots(): ReturnType<typeof $$render<Tag>>['slots'];
13
+ bindings(): "ref" | "selectedItems";
14
+ exports(): {};
15
+ }
16
+ interface $$IsomorphicComponent {
17
+ new <Tag extends 'ul' | 'ol' | 'div' = 'ul'>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<Tag>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<Tag>['props']>, ReturnType<__sveltets_Render<Tag>['events']>, ReturnType<__sveltets_Render<Tag>['slots']>> & {
18
+ $$bindings?: ReturnType<__sveltets_Render<Tag>['bindings']>;
19
+ } & ReturnType<__sveltets_Render<Tag>['exports']>;
20
+ <Tag extends 'ul' | 'ol' | 'div' = 'ul'>(internal: unknown, props: ReturnType<__sveltets_Render<Tag>['props']> & {}): ReturnType<__sveltets_Render<Tag>['exports']>;
21
+ z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
22
+ }
23
+ declare const ListView: $$IsomorphicComponent;
24
+ type ListView<Tag extends 'ul' | 'ol' | 'div' = 'ul'> = InstanceType<typeof ListView<Tag>>;
25
+ export default ListView;