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,203 @@
1
+ <script lang="ts" generics="T extends ButtonGenerics = 'button'">
2
+ import { invokeHandlers, RenderSoC } from '../../internal/index.js';
3
+ import ChevronDownFilled from 'fluentui-icons-svelte/ChevronDownFilled.svelte';
4
+ import type { ButtonGenerics, ButtonProps } from './types.js';
5
+
6
+ let {
7
+ as = 'button' as T,
8
+ appearance = 'accent',
9
+ class: classes,
10
+ shape = 'rounded',
11
+ disabled,
12
+ ref = $bindable(),
13
+ onclick,
14
+ onkeydown,
15
+ isMenuButton,
16
+ indicatorPosition = 'after',
17
+ indicatorIcon,
18
+ disabledFocusable = false,
19
+ tabindex: _tabIndex,
20
+ children,
21
+ ...attributes
22
+ }: ButtonProps<T> = $props();
23
+
24
+ // svelte-ignore state_referenced_locally
25
+ if (as !== 'button' && as !== 'a' && as !== 'div') {
26
+ throw new Error(`Invalid 'as' prop value: ${as}. Expected 'button', 'a', or 'div'.`);
27
+ }
28
+ </script>
29
+
30
+ <!--
31
+ @component
32
+ A button triggers an action or event when activated and supports three visual appearances (accent, standar & subtle).
33
+ - Usage:
34
+ ```tsx
35
+ <script>
36
+ import { Button } from 'fluentui-svelte';
37
+ </script>
38
+
39
+ <Button>Click me!</Button>
40
+ <Button as="a">I'm an Anchor!</Button>
41
+ <Button appearance="standard" disabled>You can't click me!</Button>
42
+ ```
43
+ -->
44
+ <svelte:element
45
+ this={as}
46
+ bind:this={ref}
47
+ disabled={disabled && as !== 'div' ? true : undefined}
48
+ aria-disabled={disabled && as !== 'div' ? true : undefined}
49
+ class={['fs-button', shape, appearance, classes]}
50
+ tabindex={_tabIndex ?? (as !== 'div' && (disabledFocusable || disabled) ? -1 : undefined)}
51
+ onclick={(e: MouseEvent) => invokeHandlers(e, [as === 'div', disabled], [onclick])}
52
+ onkeydown={(e: KeyboardEvent) => invokeHandlers(e, [as === 'div', disabled], [onkeydown])}
53
+ {...attributes}
54
+ >
55
+ {#if isMenuButton && indicatorPosition === 'before'}
56
+ {#if indicatorIcon}
57
+ <RenderSoC SoC={indicatorIcon} class="indicator" args={[{ class: 'indicator' }]} />
58
+ {:else}
59
+ <ChevronDownFilled class="indicator" />
60
+ {/if}
61
+ {/if}
62
+
63
+ {#if children}
64
+ {@render children()}
65
+ {:else}
66
+ {appearance[0].toUpperCase() + appearance.slice(1) + ' Button'}
67
+ {/if}
68
+
69
+ {#if isMenuButton && indicatorPosition === 'after'}
70
+ {#if indicatorIcon}
71
+ <RenderSoC SoC={indicatorIcon} class="indicator" args={[{ class: 'indicator' }]} />
72
+ {:else}
73
+ <ChevronDownFilled class="indicator" />
74
+ {/if}
75
+ {/if}
76
+ </svelte:element>
77
+
78
+ <style>
79
+ .fs-button {
80
+ border-radius: var(--fs-control-border-radius);
81
+ font-size: var(--fs-body-font-size);
82
+ line-height: var(--fs-body-line-height);
83
+ color: var(--fs-text-primary);
84
+ background: transparent;
85
+ border: none;
86
+ padding: 0.375rem 0.813rem 0.5rem 0.813rem;
87
+ cursor: pointer;
88
+ position: relative;
89
+ outline: none;
90
+ display: flex;
91
+ gap: 0.5rem;
92
+ align-items: center;
93
+ text-align: center;
94
+ justify-content: center;
95
+ user-select: none;
96
+ &:not([type])[href] {
97
+ text-decoration: none;
98
+ }
99
+ &:disabled,
100
+ &[disabled] {
101
+ cursor: not-allowed;
102
+ }
103
+ &:not(.subtle):after {
104
+ content: '';
105
+ inset: 0;
106
+ position: absolute;
107
+ padding: 0.063rem;
108
+ mask:
109
+ linear-gradient(#fff 0 0) content-box,
110
+ linear-gradient(#fff 0 0);
111
+ mask-composite: exclude;
112
+ border-radius: inherit;
113
+ }
114
+ &:focus-visible {
115
+ outline: 0.125rem var(--fs-focus-stroke-outer) solid;
116
+ outline-offset: 0.063rem;
117
+ }
118
+ & :global(svg.indicator) {
119
+ width: 1rem;
120
+ height: auto;
121
+ pointer-events: none;
122
+ }
123
+ }
124
+ .fs-button.accent {
125
+ color: var(--fs-text-on-accent-primary);
126
+ background: var(--fs-accent-fill-default);
127
+ &::after {
128
+ background: var(--fs-elevation-accent-control-border);
129
+ }
130
+ &:hover {
131
+ background: var(--fs-accent-fill-secondary);
132
+ &::after {
133
+ background: var(--fs-elevation-accent-control-border);
134
+ }
135
+ }
136
+ &:active {
137
+ color: var(--fs-text-on-accent-secondary);
138
+ &::after {
139
+ background: var(--fs-control-stroke-on-accent-default);
140
+ }
141
+ }
142
+ &:disabled,
143
+ &[disabled] {
144
+ background: var(--fs-accent-fill-disabled) !important;
145
+ color: var(--fs-text-on-accent-disabled) !important;
146
+ &::after {
147
+ background: var(--fs-elevation-accent-control-disabled) !important;
148
+ }
149
+ }
150
+ }
151
+ .fs-button.standard {
152
+ background: var(--fs-control-fill-default);
153
+ &::after {
154
+ background: var(--fs-elevation-control-border);
155
+ }
156
+ &:hover {
157
+ background: var(--fs-control-fill-secondary);
158
+ }
159
+ &:active {
160
+ color: var(--fs-text-secondary);
161
+ &::after {
162
+ background: var(--fs-control-stroke-default);
163
+ }
164
+ }
165
+ &:disabled,
166
+ &[disabled] {
167
+ background: var(--fs-control-fill-disabled) !important;
168
+ color: var(--fs-text-disabled) !important;
169
+ &::after {
170
+ background: var(--fs-control-stroke-default) !important;
171
+ }
172
+ }
173
+ }
174
+ .fs-button.subtle {
175
+ &::after {
176
+ background: var(--fs-control-fill-transparent);
177
+ }
178
+ &:hover {
179
+ background: var(--fs-subtle-fill-secondary);
180
+ }
181
+ &:active {
182
+ color: var(--fs-text-tertiary);
183
+ background: var(--fs-subtle-fill-tertiary);
184
+ &::after {
185
+ background: var(--fs-control-stroke-default);
186
+ }
187
+ }
188
+ &:disabled,
189
+ &[disabled] {
190
+ background: var(--fs-subtle-fill-transparent) !important;
191
+ color: var(--fs-text-disabled) !important;
192
+ }
193
+ }
194
+ .fs-button.rounded {
195
+ border-radius: var(--fs-control-border-radius);
196
+ }
197
+ .fs-button.circular {
198
+ border-radius: 50vw;
199
+ }
200
+ .fs-button.square {
201
+ border-radius: 0;
202
+ }
203
+ </style>
@@ -0,0 +1,38 @@
1
+ import type { ButtonGenerics, ButtonProps } from './types.ts';
2
+ declare function $$render<T extends ButtonGenerics = 'button'>(): {
3
+ props: ButtonProps<T>;
4
+ exports: {};
5
+ bindings: "ref";
6
+ slots: {};
7
+ events: {};
8
+ };
9
+ declare class __sveltets_Render<T extends ButtonGenerics = 'button'> {
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 ButtonGenerics = 'button'>(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 ButtonGenerics = 'button'>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
21
+ z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
22
+ }
23
+ /**
24
+ * A button triggers an action or event when activated and supports three visual appearances (accent, standar & subtle).
25
+ * - Usage:
26
+ * ```tsx
27
+ * <script>
28
+ * import { Button } from 'fluentui-svelte';
29
+ * </script>
30
+ *
31
+ * <Button>Click me!</Button>
32
+ * <Button as="a">I'm an Anchor!</Button>
33
+ * <Button appearance="standard" disabled>You can't click me!</Button>
34
+ * ```
35
+ */
36
+ declare const Button: $$IsomorphicComponent;
37
+ type Button<T extends ButtonGenerics = 'button'> = InstanceType<typeof Button<T>>;
38
+ export default Button;
@@ -0,0 +1,102 @@
1
+ # Button
2
+
3
+ A button triggers an action or event when activated and supports three visual appearances: accent, standard, and subtle.
4
+
5
+ ## Usage
6
+
7
+ ```svelte
8
+ <script>
9
+ import { Button } from 'fluentui-svelte';
10
+ </script>
11
+
12
+ <Button>I am a Button</Button>
13
+ ```
14
+
15
+ ## Component API
16
+
17
+ A brief explanation of the props that really need explaining. You can see the rest of the props in the Component Props table below.
18
+
19
+ ## Examples
20
+
21
+ ### As
22
+
23
+ You can control which tag the button component should use: button, a, or div.
24
+
25
+ ```svelte
26
+ <Button>I am a Button</Button>
27
+ <Button as="a" href="/">I am a Anchor</Button>
28
+ <Button as="div">I am a Div</Button>
29
+ ```
30
+
31
+ ### Shape
32
+
33
+ A button can be rounded, circular, or square. Default: rounded.
34
+
35
+ ```svelte
36
+ <Button shape="circular" />
37
+ <Button />
38
+ <Button shape="square" />
39
+ ```
40
+
41
+ ### Appearance
42
+
43
+ A button can have its content and borders styled for greater emphasis or to be subtle.
44
+
45
+ ```svelte
46
+ <Button appearance="accent" />
47
+ <Button appearance="standard" />
48
+ <Button appearance="subtle" />
49
+ ```
50
+
51
+ ## Component Props
52
+
53
+ | Name | Type | Description |
54
+ | ------------------- | ---------------------- | ------------------------------------------------------------------------------------------------- |
55
+ | `ref` | `HTMLElement` | The DOM reference of the button element. |
56
+ | `as` | `string` | The DOM element to render. Possible values: 'button', 'a', 'div'. |
57
+ | `disabled` | `boolean` | Disables user interaction. |
58
+ | `shape` | `string` | The shape of the button or buttons. Possible values: 'circular', 'rounded', 'square'. |
59
+ | `appearance` | `string` | The appearance of the button or buttons. Possible values: 'accent', 'standard', 'subtle'. |
60
+ | `disabledFocusable` | `boolean` | Allows the button to be focusable even when disabled. |
61
+ | `isMenuButton` | `boolean` | Adds an icon that indicates the button triggers a menu. |
62
+ | `indicatorPosition` | `'before' \| 'after'` | The position of the icon. Possible values: 'before', 'after'. |
63
+ | `indicatorIcon` | `Snippet \| Component` | The icon used as the menu indicator. Defaults to a chevron-down icon. |
64
+ | Element Attributes | | Based on the chosen component tag, you will get autocomplete for all HTML attributes of that tag. |
65
+
66
+ ## Split Button
67
+
68
+ A split button is a special type of button that combines a standard button with a menu button to provide users with a primary action and additional options.
69
+
70
+ ### Usage
71
+
72
+ ```svelte
73
+ <script>
74
+ import { SplitButton } from 'fluentui-svelte';
75
+ </script>
76
+
77
+ <SplitButton />
78
+ <SplitButton appearance="standard" />
79
+ <SplitButton appearance="subtle" />
80
+ <SplitButton shape="circular" />
81
+ <SplitButton shape="circular" appearance="standard" />
82
+ <SplitButton shape="circular" appearance="subtle" />
83
+ ```
84
+
85
+ ### Adding a Menu
86
+
87
+ To add a menu to the split button, please refer to the Menu documentation for details on how to create menus and pass them as a prop to the SplitButton component.
88
+
89
+ ### Component Props
90
+
91
+ | Name | Type | Description |
92
+ | ------------------------- | ----------------------- | ----------------------------------------------------------------------------------------- |
93
+ | `wrapperRef` | `HTMLDivElement` | The DOM reference of the split button wrapper element. |
94
+ | `primaryButtonRef` | `HTMLButtonElement` | The DOM reference of the primary button element. |
95
+ | `primaryButtonProps` | `ButtonProps<'button'>` | Additional props to pass to the primary button. |
96
+ | `menuTriggerRef` | `HTMLButtonElement` | The DOM reference of the menu trigger button element. |
97
+ | `menuTriggerProps` | `ButtonProps<'button'>` | Additional props to pass to the menu trigger button. |
98
+ | `class` | `string` | Additional classes to add to the split button wrapper element. |
99
+ | `shape` | `string` | The shape of the button or buttons. Possible values: 'circular', 'rounded', 'square'. |
100
+ | `appearance` | `string` | The appearance of the button or buttons. Possible values: 'accent', 'standard', 'subtle'. |
101
+ | `disabled` | `boolean` | Disables user interaction. |
102
+ | WrapperElement Attributes | HTMLElement Attributes | All other attributes can be applied to the split button wrapper element. |
@@ -0,0 +1,66 @@
1
+ <script lang="ts">
2
+ import Button from './button.svelte';
3
+ import ChevronDownFilled from 'fluentui-icons-svelte/ChevronDownFilled.svelte';
4
+ import type { SplitButtonProps } from './types.js';
5
+
6
+ let {
7
+ class: classes,
8
+ appearance = 'accent',
9
+ shape = 'rounded',
10
+ disabled = false,
11
+ wrapperRef = $bindable(),
12
+ primaryButtonProps,
13
+ menuTriggerProps,
14
+ primaryButtonRef = $bindable(),
15
+ menuTriggerRef = $bindable(),
16
+ children,
17
+ ...attributes
18
+ }: SplitButtonProps = $props();
19
+ </script>
20
+
21
+ <div class={['fs-split-button', classes]} role="group" bind:this={wrapperRef} {...attributes}>
22
+ <Button as="button" {appearance} {shape} {disabled} bind:ref={primaryButtonRef} {...primaryButtonProps}>
23
+ {#if children}
24
+ {@render children()}
25
+ {:else}
26
+ {appearance[0].toUpperCase() + appearance.slice(1) + ' Button'}
27
+ {/if}
28
+ </Button>
29
+ <Button
30
+ as="button"
31
+ class="menu-button"
32
+ {appearance}
33
+ {shape}
34
+ {disabled}
35
+ bind:ref={menuTriggerRef}
36
+ {...menuTriggerProps}
37
+ >
38
+ <ChevronDownFilled class="indicator" />
39
+ </Button>
40
+ </div>
41
+
42
+ <style>
43
+ .fs-split-button {
44
+ display: inline-flex;
45
+ align-items: stretch;
46
+ & :global(:first-child) {
47
+ border-top-right-radius: 0 !important;
48
+ border-bottom-right-radius: 0 !important;
49
+ z-index: 1;
50
+ }
51
+ & :global(:last-child) {
52
+ z-index: 0;
53
+ border-top-left-radius: 0 !important;
54
+ border-bottom-left-radius: 0 !important;
55
+ margin-left: -1px;
56
+ &::after {
57
+ padding-left: 0;
58
+ }
59
+ }
60
+ & :global(svg.indicator) {
61
+ width: 1rem;
62
+ margin: 0;
63
+ pointer-events: none;
64
+ }
65
+ }
66
+ </style>
@@ -0,0 +1,4 @@
1
+ import type { SplitButtonProps } from './types.ts';
2
+ declare const SplitButton: import("svelte").Component<SplitButtonProps, {}, "wrapperRef" | "primaryButtonRef" | "menuTriggerRef">;
3
+ type SplitButton = ReturnType<typeof SplitButton>;
4
+ export default SplitButton;
@@ -0,0 +1,84 @@
1
+ import type { Component, Snippet } from 'svelte';
2
+ import type { Appearances, BeforeOrAfter, PolymorphicProps, Shapes } from '../../types/index.js';
3
+ export type ButtonGenerics = 'button' | 'a' | 'div';
4
+ /** @propsmith ButtonProps */
5
+ export type ButtonProps<T extends ButtonGenerics = 'button'> = {
6
+ /** The DOM reference of the button element.
7
+ * @type ButtonElementDOMType[T]
8
+ * @bindable
9
+ */
10
+ ref?: ButtonElementDOMType[T];
11
+ /** The DOM element to render.
12
+ * @type 'button' | 'a' | 'div'
13
+ * @default 'button'
14
+ */
15
+ as?: T;
16
+ /** Disables the user interaction. */
17
+ disabled?: boolean;
18
+ /** A button can be rounded, circular, or square.
19
+ * @default 'rounded'
20
+ */
21
+ shape?: Shapes;
22
+ /** A button can have its content and borders styled for greater emphasis or to be subtle.
23
+ * @default 'accent'
24
+ */
25
+ appearance?: Appearances;
26
+ /** When set, allows the button to be focusable even when it has been disabled.
27
+ *
28
+ * This is used in scenarios where it is important to keep a consistent tab order for screen reader and keyboard
29
+ * users. The primary example of this pattern is when the disabled button is in a menu or a commandbar, and is
30
+ * seldom used for standalone buttons.
31
+ * @default false
32
+ */
33
+ disabledFocusable?: boolean;
34
+ /** Add an icon that indicates the button triggers a menu. */
35
+ isMenuButton?: boolean;
36
+ /** Position of the menu indicator relative to the button content.
37
+ * @default 'after'
38
+ */
39
+ indicatorPosition?: BeforeOrAfter;
40
+ /** The icon used to indicate the button triggers a menu.
41
+ * @type Snippet | Component
42
+ */
43
+ indicatorIcon?: Snippet<unknown[]> | Component<Record<string, unknown>>;
44
+ } & PolymorphicProps<T>;
45
+ export type ButtonElementDOMType = {
46
+ button: HTMLButtonElement;
47
+ a: HTMLAnchorElement;
48
+ div: HTMLDivElement;
49
+ };
50
+ /** @propsmith SplitButtonProps */
51
+ export type SplitButtonProps = {
52
+ /** Both buttons can have their content and borders styled for greater emphasis or to be subtle.
53
+ * @default 'accent'
54
+ */
55
+ appearance?: Appearances;
56
+ /** Both buttons can be rounded, circular, or square.
57
+ * @default 'rounded'
58
+ */
59
+ shape?: Shapes;
60
+ /** Disables the user interaction on both buttons.
61
+ * @default false
62
+ */
63
+ disabled?: boolean;
64
+ /** The props to spread on the primary button.
65
+ * @type ButtonProps
66
+ */
67
+ primaryButtonProps: ButtonProps<'button'>;
68
+ /** The props to spread on the button that opens the menu.
69
+ * @type ButtonProps
70
+ */
71
+ menuTriggerProps: ButtonProps<'button'>;
72
+ /** The DOM reference of the element wrapping both buttons.
73
+ * @bindable
74
+ */
75
+ wrapperRef?: HTMLDivElement;
76
+ /** The DOM reference of the primary button.
77
+ * @bindable
78
+ */
79
+ primaryButtonRef?: HTMLButtonElement;
80
+ /** The DOM reference of the button that opens the menu.
81
+ * @bindable
82
+ */
83
+ menuTriggerRef?: HTMLButtonElement;
84
+ } & PolymorphicProps<'div'>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,119 @@
1
+ <script lang="ts">
2
+ import { Button, CalendarView } from '../../index.js';
3
+ import { CalendarLtrRegular } from 'fluentui-icons-svelte';
4
+ import type { CalendarDatePickerProps } from './types.js';
5
+ import { onMount, tick } from 'svelte';
6
+ import { on } from 'svelte/events';
7
+ import { PREFIX } from '../../internal/constants.js';
8
+ import { flip, hide, offset, shift } from '@floating-ui/dom';
9
+
10
+ let {
11
+ value = $bindable(null),
12
+ locale = 'en-US',
13
+ format = {
14
+ year: 'numeric',
15
+ month: 'numeric',
16
+ day: 'numeric'
17
+ },
18
+ calendarPosition: _positionConfig,
19
+ blackoutDates,
20
+ ref = $bindable(),
21
+ headers,
22
+ maxDate,
23
+ minDate,
24
+ weekStart,
25
+ onChange,
26
+ triggerRef = $bindable(),
27
+ popupRef = $bindable(),
28
+ popupLabel = 'Choose a date',
29
+ ...attributes
30
+ }: CalendarDatePickerProps = $props();
31
+
32
+ const FALLBACK_ID = $props.id();
33
+ const POPUP_ID = `${PREFIX}calendardatepicker-${FALLBACK_ID}-popup`;
34
+
35
+ let open = $state(false);
36
+
37
+ /** Closing always hands the focus back to the trigger button. */
38
+ function closePopup() {
39
+ open = false;
40
+ triggerRef?.focus();
41
+ }
42
+
43
+ let positionConfig = $derived({
44
+ ..._positionConfig,
45
+ placement: _positionConfig?.placement ?? 'bottom-start',
46
+ middleware: _positionConfig?.middleware ?? [offset(8), flip(), shift({ padding: 8 }), hide()]
47
+ });
48
+
49
+ onMount(() => {
50
+ const off = on(document, 'click', (event: MouseEvent) => {
51
+ if (ref && !ref.contains(event.target as Node)) {
52
+ open = false;
53
+ }
54
+ });
55
+
56
+ return () => off();
57
+ });
58
+
59
+ $effect(() => {
60
+ if (!open) return;
61
+
62
+ return on(document, 'keydown', (event: KeyboardEvent) => {
63
+ if (event.key !== 'Escape') return;
64
+ event.preventDefault();
65
+ closePopup();
66
+ });
67
+ });
68
+
69
+ // Move into the dialog on open
70
+ $effect(() => {
71
+ if (!open || !popupRef) return;
72
+
73
+ tick().then(() => {
74
+ (popupRef?.querySelector<HTMLElement>('[role="gridcell"] button') ?? popupRef)?.focus();
75
+ });
76
+ });
77
+ </script>
78
+
79
+ <div class="fs-calendar-date-picker" bind:this={ref} {...attributes}>
80
+ <Button
81
+ appearance="standard"
82
+ aria-haspopup="dialog"
83
+ aria-expanded={open}
84
+ aria-controls={open ? POPUP_ID : undefined}
85
+ bind:ref={triggerRef}
86
+ onclick={() => (open = !open)}
87
+ >
88
+ {#if value}
89
+ {value.toLocaleDateString(locale, format)}
90
+ {:else}
91
+ Pick a date
92
+ {/if}
93
+ <CalendarLtrRegular width="1rem" />
94
+ </Button>
95
+ {#if open}
96
+ <CalendarView
97
+ bind:value
98
+ bind:ref={popupRef}
99
+ id={POPUP_ID}
100
+ role="dialog"
101
+ aria-modal="true"
102
+ aria-label={popupLabel}
103
+ tabindex={-1}
104
+ floating={{ ref, positionConfig }}
105
+ onChange={onChange as any}
106
+ {blackoutDates}
107
+ {headers}
108
+ {maxDate}
109
+ {minDate}
110
+ {weekStart}
111
+ />
112
+ {/if}
113
+ </div>
114
+
115
+ <style>
116
+ .fs-calendar-date-picker {
117
+ position: relative;
118
+ }
119
+ </style>
@@ -0,0 +1,4 @@
1
+ import type { CalendarDatePickerProps } from './types.js';
2
+ declare const CalendarDatePicker: import("svelte").Component<CalendarDatePickerProps, {}, "ref" | "value" | "triggerRef" | "popupRef">;
3
+ type CalendarDatePicker = ReturnType<typeof CalendarDatePicker>;
4
+ export default CalendarDatePicker;
@@ -0,0 +1,33 @@
1
+ # Calendar Date Picker
2
+
3
+ A button trigger paired with a CalendarView popup for selecting a single date.
4
+
5
+ ## Usage
6
+
7
+ ```svelte
8
+ <script>
9
+ import { CalendarDatePicker } from 'fluentui-svelte';
10
+
11
+ let value = $state(null);
12
+ </script>
13
+
14
+ <CalendarDatePicker bind:value />
15
+ ```
16
+
17
+ ## Component API
18
+
19
+ The `CalendarDatePicker` combines a button trigger with a `CalendarView` popup. Clicking the trigger opens the calendar, and selecting a day updates the bound `value` and closes the popup. Because it builds on `CalendarView`, calendar props such as `blackoutDates`, `minDate`, `maxDate`, `weekStart` and `headers` are forwarded straight to the popup calendar.
20
+
21
+ ## Component Props
22
+
23
+ | Name | Type | Default | Description |
24
+ | ------------------ | -------------------------------- | ------------------------------------------------------- | --------------------------------------------------------- |
25
+ | `ref` | bindable `HTMLDivElement` | | The DOM reference of the picker element. |
26
+ | `value` | bindable `Date \| null` | `null` | The selected date. |
27
+ | `format` | `Intl.DateTimeFormatOptions` | `{ year: 'numeric', month: 'numeric', day: 'numeric' }` | The options used to format the date shown on the trigger. |
28
+ | `calendarPosition` | `Partial<ComputePositionConfig>` | | The floating UI configuration object of the popup. |
29
+ | `onChange` | `(event, value) => void` | | Called whenever the selected date changes. |
30
+
31
+ `locale`, `blackoutDates`, `headers`, `minDate`, `maxDate` and `weekStart` are forwarded
32
+ straight to the underlying `CalendarView`. All `div` HTML attributes are forwarded to the
33
+ root element.