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,165 @@
1
+ <script lang="ts">
2
+ import ChevronDownFilled from 'fluentui-icons-svelte/ChevronDownFilled.svelte';
3
+ import { selectDirection } from './dropdown-select.svelte.js';
4
+ import type { DropdownSelectProps } from './types.js';
5
+
6
+ let {
7
+ hidePlaceholder,
8
+ placeholder = 'Native Select Dropdown',
9
+ ref = $bindable(),
10
+ children,
11
+ wrapperRef = $bindable(),
12
+ wrapperProps,
13
+ multiple,
14
+ value = $bindable(multiple ? [] : ''),
15
+ ...attributes
16
+ }: DropdownSelectProps = $props();
17
+ </script>
18
+
19
+ <div class="fs-dropdown" bind:this={wrapperRef} {...wrapperProps}>
20
+ {#if !multiple}
21
+ <ChevronDownFilled class="indicator" />
22
+ {/if}
23
+ <!--
24
+ Due to svelte limitation: "'multiple' attribute must be static if select uses two-way binding"...
25
+ We need to use a if block with the same structure
26
+ -->
27
+ {#if multiple}
28
+ <select class="fs-dropdown-select" {@attach selectDirection()} multiple bind:value bind:this={ref} {...attributes}>
29
+ <button>
30
+ <selectedcontent></selectedcontent>
31
+ </button>
32
+ {#if !hidePlaceholder}
33
+ <option class="fs-dropdown-placeholder" disabled selected hidden value="">{placeholder}</option>
34
+ {/if}
35
+ {@render children?.()}
36
+ </select>
37
+ {:else}
38
+ <select class="fs-dropdown-select" {@attach selectDirection()} bind:value bind:this={ref} {...attributes}>
39
+ <button>
40
+ <selectedcontent></selectedcontent>
41
+ </button>
42
+ {#if !hidePlaceholder}
43
+ <option class="fs-dropdown-placeholder" disabled selected hidden value="">{placeholder}</option>
44
+ {/if}
45
+ {@render children?.()}
46
+ </select>
47
+ {/if}
48
+ </div>
49
+
50
+ <style>
51
+ .fs-dropdown {
52
+ display: flex;
53
+ align-items: center;
54
+ position: relative;
55
+ border-radius: var(--fs-control-border-radius);
56
+ background: var(--fs-control-fill-default);
57
+ min-width: 10rem;
58
+ &:before {
59
+ content: '';
60
+ pointer-events: none;
61
+ width: calc(100%);
62
+ height: calc(100%);
63
+ position: absolute;
64
+ top: 0;
65
+ left: 0;
66
+ padding: 0.05rem;
67
+ border-radius: 0.313rem;
68
+ mask:
69
+ linear-gradient(#fff 0 0) content-box,
70
+ linear-gradient(#fff 0 0);
71
+ mask-composite: exclude;
72
+ background: var(--fs-elevation-text-border);
73
+ z-index: 1;
74
+ }
75
+ &:after {
76
+ content: '';
77
+ pointer-events: none;
78
+ width: 0;
79
+ height: 10px;
80
+ border-radius: 0px 0px 5px 5px;
81
+ position: absolute;
82
+ bottom: -0.063rem;
83
+ left: calc(50% - 0.063rem);
84
+ clip-path: polygon(0 75%, 100% 75%, 100% 100%, 0% 100%);
85
+ background: transparent;
86
+ transition:
87
+ width var(--fs-normal-duration) var(--fs-point-to-point),
88
+ left var(--fs-normal-duration) var(--fs-point-to-point);
89
+ z-index: 2;
90
+ }
91
+ &:has(:focus-visible, :focus-within):after,
92
+ &:has(:open):after {
93
+ width: calc(100%);
94
+ left: 0;
95
+ background-color: var(--fs-accent-fill-default);
96
+ }
97
+ & .fs-dropdown-select {
98
+ border-radius: 0;
99
+ background: unset;
100
+ appearance: base-select;
101
+ width: 100%;
102
+ height: 100%;
103
+ padding: 0.25rem 2.2rem 0.25rem 0.8rem;
104
+ border: none;
105
+ font-size: var(--fs-body-font-size);
106
+ color: var(--fs-text-secondary);
107
+ cursor: pointer;
108
+ outline: none;
109
+ &::-ms-expand {
110
+ display: none;
111
+ }
112
+ &:has(option:checked:not(.fs-dropdown-placeholder)) {
113
+ color: var(--fs-text-primary);
114
+ }
115
+ &,
116
+ &::picker(select) {
117
+ appearance: base-select;
118
+ }
119
+ &::picker(select) {
120
+ padding: 0.3rem;
121
+ min-height: max-content;
122
+ border-radius: 0 0 var(--fs-control-border-radius) var(--fs-control-border-radius);
123
+ border: 1px solid var(--fs-control-surface-stroke-flyout);
124
+ background: var(--fs-acrylic-background-default);
125
+ box-shadow: var(--fs-shadow-card);
126
+ }
127
+ &::picker-icon {
128
+ display: none;
129
+ }
130
+ &[multiple] {
131
+ padding: 0.3rem;
132
+ }
133
+ &:global(.popover-up)::picker(select) {
134
+ border-radius: var(--fs-control-border-radius) var(--fs-control-border-radius) 0 0;
135
+ }
136
+ }
137
+ &:global(:has(.open.popover-up):not(:has([multiple])))::before {
138
+ border-radius: 0 0 var(--fs-control-border-radius) var(--fs-control-border-radius);
139
+ }
140
+ &:global(:has(.open):not(:has(.popover-up, [multiple])))::before {
141
+ border-radius: var(--fs-control-border-radius) var(--fs-control-border-radius) 0 0;
142
+ }
143
+ &:global(:has(.open):not(:has(.popover-up, [multiple])))::after {
144
+ border-radius: 0;
145
+ }
146
+ & selectedcontent :global(:has(.value-text) :not(.value-text)),
147
+ & selectedcontent :global(.checkmark) {
148
+ display: none;
149
+ }
150
+ &:global(:has(.fs-dropdown-select-option:checked) .fs-dropdown-select-option:not(:checked) .option-content) {
151
+ /* Calc padding + checkmark width + gap */
152
+ padding: 0.275rem 0.5rem 0.4rem calc(0.5rem + 1rem + 0.5rem);
153
+ }
154
+ & :global(.indicator) {
155
+ width: 1rem;
156
+ position: absolute;
157
+ right: 0.6rem;
158
+ pointer-events: none;
159
+ color: var(--fs-text-secondary);
160
+ }
161
+ & :global(select:-internal-list-box:focus option:checked) {
162
+ background: red !important;
163
+ }
164
+ }
165
+ </style>
@@ -0,0 +1,4 @@
1
+ import type { DropdownSelectProps } from './types.ts';
2
+ declare const DropdownSelect: import("svelte").Component<DropdownSelectProps, {}, "ref" | "value" | "wrapperRef">;
3
+ type DropdownSelect = ReturnType<typeof DropdownSelect>;
4
+ export default DropdownSelect;
@@ -0,0 +1,48 @@
1
+ import { onClickOutside } from 'runed';
2
+ export function selectDirection() {
3
+ return (node) => {
4
+ // No needed when multiple is enabled
5
+ if (node.multiple)
6
+ return;
7
+ let cleanup = $state(null);
8
+ let isOpen = $state(false);
9
+ function updateDirection() {
10
+ const positionArea = window?.getComputedStyle(node, '::picker(select)').positionArea;
11
+ node.classList.toggle('popover-up', positionArea.includes('start'));
12
+ if (isOpen) {
13
+ node.classList.add('open');
14
+ }
15
+ else {
16
+ node.classList.remove('open');
17
+ }
18
+ }
19
+ function onToggle() {
20
+ if (!isOpen) {
21
+ window.addEventListener('scroll', updateDirection, { passive: true, capture: true });
22
+ const ro = new ResizeObserver(updateDirection);
23
+ ro.observe(document.documentElement);
24
+ updateDirection();
25
+ cleanup = () => {
26
+ window.removeEventListener('scroll', updateDirection, { capture: true });
27
+ ro.disconnect();
28
+ isOpen = false;
29
+ cleanup = null;
30
+ node.classList.remove('popover-up');
31
+ node.classList.remove('open');
32
+ };
33
+ isOpen = true;
34
+ }
35
+ else {
36
+ cleanup?.();
37
+ }
38
+ }
39
+ onClickOutside(() => node, () => {
40
+ cleanup?.();
41
+ });
42
+ node.addEventListener('click', onToggle);
43
+ return () => {
44
+ cleanup?.();
45
+ node.removeEventListener('click', onToggle);
46
+ };
47
+ };
48
+ }
@@ -0,0 +1,2 @@
1
+ export { default as DropdownSelect } from './dropdown-select.svelte';
2
+ export { default as SelectOption } from './dropdown-select-option.svelte';
@@ -0,0 +1,2 @@
1
+ export { default as DropdownSelect } from './dropdown-select.svelte';
2
+ export { default as SelectOption } from './dropdown-select-option.svelte';
@@ -0,0 +1,46 @@
1
+ import type { Snippet } from 'svelte';
2
+ import type { HTMLAttributes, HTMLOptionAttributes, HTMLSelectAttributes } from 'svelte/elements';
3
+ /** @propsmith DropdownSelectProps */
4
+ export type DropdownSelectProps = {
5
+ /** The selected value. An array of values when `multiple` is set.
6
+ * @type string | string[]
7
+ * @default multiple ? [] : ''
8
+ * @bindable
9
+ */
10
+ value?: string | string[];
11
+ /** Allows more than one option to be selected at a time. */
12
+ multiple?: boolean;
13
+ /** The text shown while no option is selected.
14
+ * @default 'Native Select Dropdown'
15
+ */
16
+ placeholder?: string;
17
+ /** Keeps the placeholder out of the option list once a value is selected. */
18
+ hidePlaceholder?: boolean;
19
+ /** The DOM reference of the select element.
20
+ * @bindable
21
+ */
22
+ ref?: HTMLSelectElement;
23
+ /** The DOM reference of the wrapper element.
24
+ * @bindable
25
+ */
26
+ wrapperRef?: HTMLDivElement;
27
+ /** The attributes to spread on the wrapper element.
28
+ * @type HTMLAttributes
29
+ */
30
+ wrapperProps?: HTMLAttributes<HTMLDivElement>;
31
+ } & HTMLSelectAttributes;
32
+ /** @propsmith DropdownSelectOptionProps */
33
+ export type DropdownSelectOptionProps = {
34
+ /** The value reported to the select when the option is picked. */
35
+ value?: string;
36
+ /** The label of the option. Falls back to the rendered children. */
37
+ text?: string;
38
+ /** Disables the user interaction. */
39
+ disabled?: boolean;
40
+ /** The DOM reference of the option element.
41
+ * @bindable
42
+ */
43
+ ref?: HTMLElement;
44
+ /** The content of the option, used when no `text` is given. */
45
+ children?: Snippet;
46
+ } & HTMLOptionAttributes;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,88 @@
1
+ # Expander
2
+
3
+ Control that displays a header and a collapsible content area.
4
+
5
+ ## Usage
6
+
7
+ A basic expander expects a header and its content. You can configure the header by passing the `header` property. Content can be provided as child elements of the component. By default, the content container has no padding, this allows you to use 100% of the content width if needed.
8
+
9
+ ```svelte
10
+ <script>
11
+ import { Expander } from 'fluentui-svelte';
12
+ </script>
13
+
14
+ <Expander header="Expander Title">
15
+ <p>This is the content of the expander</p>
16
+ </Expander>
17
+ ```
18
+
19
+ ## Component API
20
+
21
+ A brief explanation of the props that really need explaining. You can see the rest of the props in the Component Props table below.
22
+
23
+ ## Examples
24
+
25
+ ### Controlling Expansion
26
+
27
+ Expanders can be either expanded or collapsed. This can be controlled by setting the `expanded` property.
28
+
29
+ ```svelte
30
+ <Expander header="Expander Title" expanded>
31
+ <p>This is the content of the expander</p>
32
+ </Expander>
33
+ ```
34
+
35
+ ### Opening Direction
36
+
37
+ An expander doesn't have to expand downwards. You can control an expander's expansion direction using the `direction` property. To create an upwards-expanding expander, set `direction` to `up`.
38
+
39
+ ```svelte
40
+ <Expander header="Expander Title" direction="up">
41
+ <p>This is the content of the expander</p>
42
+ </Expander>
43
+ ```
44
+
45
+ ### Adding an Icon
46
+
47
+ You can easily add an icon to an expander's header using the `Icon` prop. You can pass either a Snippet or a Component. When using Snippet, you have two options:
48
+
49
+ - Apply the styles to the icon yourself
50
+ - Spread the Snippet props into the SVG element
51
+
52
+ ```svelte
53
+ <script>
54
+ import { Expander } from 'fluentui-svelte';
55
+ /** As component */
56
+ import { InfoRegular } from 'fluentui-icons-svelte';
57
+ </script>
58
+
59
+ <!-- As Snippet -->
60
+ {#snippet IconSnippet(props)}
61
+ <!-- Spread props from Expander Component -->
62
+ <svg {...props} viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
63
+ <path d="M6.747..." />
64
+ </svg>
65
+ {/snippet}
66
+
67
+ <Expander header="Expander Title" direction="up" Icon={InfoRegular}>
68
+ <p>This is the content of the expander</p>
69
+ </Expander>
70
+ <Expander header="Expander Title" direction="up" Icon={IconSnippet}>
71
+ <p>This is the content of the expander</p>
72
+ </Expander>
73
+ ```
74
+
75
+ ## Component Props
76
+
77
+ | Name | Type | Description |
78
+ | ------------- | ---------------------- | ------------------------------------------------------------------------- |
79
+ | `header` | `string` | Label of the expander. |
80
+ | `description` | `string` | Description to render below the header. |
81
+ | `direction` | `string` | The opening direction of the expander. Possible values: `'down'`, `'up'`. |
82
+ | `justify` | `boolean` | Whether the expander is justified to the full width of the container. |
83
+ | `disabled` | `boolean` | Disables the user interaction. |
84
+ | `animation` | `object` | The animation configuration. |
85
+ | `expanded` | `boolean` | Controls the opening state of the expander. |
86
+ | `element` | `HTMLDetailsElement` | The DOM reference of the expander element. |
87
+ | `Icon` | `Snippet \| Component` | The icon to display before the label. |
88
+ | `children` | `Snippet` | The children elements to render inside the expander. |
@@ -0,0 +1,249 @@
1
+ <script lang="ts">
2
+ import { Button } from '../../index.js';
3
+ import { Expander, invokeHandlers, RenderSoC } from '../../internal/index.js';
4
+ import { getReducedMotion } from '../../providers/fluentui-svelte/fluentui-svelte.js';
5
+ import ChevronUpFilled from 'fluentui-icons-svelte/ChevronUpFilled.svelte';
6
+ import type { Action } from 'svelte/action';
7
+ import type { ExpanderProps } from './types.js';
8
+
9
+ let {
10
+ header,
11
+ description,
12
+ disabled = false,
13
+ direction = 'down',
14
+ animation,
15
+ justify = false,
16
+ ref = $bindable(),
17
+ expanded = $bindable(false),
18
+ children,
19
+ Icon,
20
+ summaryRef = $bindable(),
21
+ summaryProps,
22
+ ...attributes
23
+ }: ExpanderProps = $props();
24
+
25
+ const handleClick = () => (expanded = !expanded);
26
+
27
+ const reducedMotion = getReducedMotion();
28
+
29
+ let supportInterpolation = $state(false);
30
+
31
+ const expander: Action<HTMLDetailsElement> = (element) => {
32
+ supportInterpolation = CSS.supports('interpolate-size', 'allow-keywords');
33
+ let cleanEvent: (() => void) | null = null;
34
+ if (!supportInterpolation) {
35
+ const duration = animation?.duration || 400;
36
+ const easing =
37
+ animation?.easing ||
38
+ getComputedStyle(document.documentElement).getPropertyValue('--fs-point-to-point') ||
39
+ 'ease-in-out';
40
+ cleanEvent = new Expander(element, direction, duration, easing, reducedMotion).cleanEvent;
41
+ }
42
+ return {
43
+ destroy: () => {
44
+ cleanEvent?.();
45
+ }
46
+ };
47
+ };
48
+ </script>
49
+
50
+ <!--
51
+ @component
52
+
53
+ The expander is a collapsible container that can be used to hide or show content.
54
+ It is used to reduce the amount of information displayed on the screen and to
55
+ improve the user experience.
56
+
57
+ - Usage:
58
+ ```tsx
59
+ <script>
60
+ import { Expander } from 'fluentui-svelte';
61
+ </script>
62
+
63
+ <Expander label="Expander label" description="Expander description">
64
+ <p>Expander content</p>
65
+ </Expander>
66
+ ```
67
+ -->
68
+ <details
69
+ bind:this={ref}
70
+ bind:open={expanded}
71
+ use:expander
72
+ class={['fs-expander', direction, { disabled, justify }]}
73
+ {...attributes}
74
+ >
75
+ <summary
76
+ class="fs-summary"
77
+ onclick={(e) => invokeHandlers(e, [disabled], [supportInterpolation && (() => e.preventDefault()), handleClick])}
78
+ bind:this={summaryRef}
79
+ {...summaryProps}
80
+ >
81
+ <span class="row">
82
+ {#if Icon}
83
+ <span class="icon">
84
+ <RenderSoC SoC={Icon} />
85
+ </span>
86
+ {/if}
87
+ <span class="title-wrapper">
88
+ {header}
89
+ {#if description}
90
+ <small class="description">
91
+ {description}
92
+ </small>
93
+ {/if}
94
+ </span>
95
+ </span>
96
+ <Button as="div" {disabled} appearance="subtle">
97
+ <ChevronUpFilled
98
+ class={`button-icon ${direction === 'down' ? (expanded ? '' : 'flip') : expanded ? 'flip' : ''}`}
99
+ />
100
+ </Button>
101
+ </summary>
102
+ <div class="content {direction}">
103
+ {@render children?.()}
104
+ </div>
105
+ </details>
106
+
107
+ <style>
108
+ .fs-expander {
109
+ display: flex;
110
+ flex-direction: column;
111
+ flex: 0 1 auto;
112
+ width: max-content;
113
+ &.justify {
114
+ width: 100%;
115
+ }
116
+ &.up {
117
+ flex-direction: column-reverse;
118
+ }
119
+ & .row {
120
+ display: flex;
121
+ align-items: center;
122
+ gap: 0.625rem;
123
+ width: 100%;
124
+ }
125
+ & .fs-summary {
126
+ user-select: none;
127
+ display: flex;
128
+ justify-content: space-between;
129
+ list-style: none;
130
+ background-clip: padding-box;
131
+ border: 0.063rem solid var(--fs-card-stroke-default);
132
+ border-radius: var(--fs-control-border-radius);
133
+ background-color: var(--fs-card-background-default);
134
+ padding: 0.5rem 0.5rem 0.5rem 1rem;
135
+ outline: none;
136
+ cursor: pointer;
137
+ & .title-wrapper {
138
+ line-height: var(--fs-body2-line-height);
139
+ font-size: var(--fs-body2-font-size);
140
+ color: var(--fs-text-primary);
141
+ font-weight: 400;
142
+ display: flex;
143
+ flex-direction: column;
144
+ flex-wrap: wrap;
145
+ gap: 0rem;
146
+ padding-right: 1rem;
147
+ & .description {
148
+ font-size: var(--fs-caption-font-size);
149
+ color: var(--fs-text-secondary);
150
+ margin: 0;
151
+ width: 100%;
152
+ }
153
+ }
154
+ & .icon {
155
+ display: flex;
156
+ align-items: center;
157
+ justify-content: center;
158
+ width: 1.2rem;
159
+ max-width: 1.2rem;
160
+ height: 1.2rem;
161
+ color: var(--fs-text-primary);
162
+ & :global(svg) {
163
+ color: var(--fs-text-primary);
164
+ }
165
+ }
166
+ &:hover {
167
+ /* In the official documentation, this should NOT happen, however, in Windows 11 you can see that they do! and the button stops having hover effects at the same time. */
168
+ /* background-color: var(--fs-card-background-secondary); */
169
+ & :global(.fs-button.subtle) {
170
+ background: var(--fs-subtle-fill-secondary);
171
+ }
172
+ }
173
+ &:focus-visible {
174
+ outline: 0.125rem var(--fs-focus-stroke-outer) solid;
175
+ outline-offset: 0.063rem;
176
+ }
177
+ &:active {
178
+ & :global(.fs-button.subtle) {
179
+ background: var(--fs-subtle-fill-tertiary);
180
+ }
181
+ }
182
+ & :global(.button-icon) {
183
+ transition: transform var(--fs-slow-duration) var(--fs-fast-dismiss);
184
+ width: 1.2rem;
185
+ color: var(--fs-text-primary);
186
+ }
187
+ & :global(.flip) {
188
+ transform: rotate(180deg);
189
+ }
190
+ }
191
+ & .content {
192
+ background-clip: padding-box;
193
+ border: 0.063rem solid var(--fs-card-stroke-default);
194
+ background-color: var(--fs-card-background-secondary);
195
+ &.up {
196
+ border-bottom: none;
197
+ border-top-right-radius: var(--fs-control-border-radius);
198
+ border-top-left-radius: var(--fs-control-border-radius);
199
+ }
200
+ &.down {
201
+ border-top: none;
202
+ border-bottom-right-radius: var(--fs-control-border-radius);
203
+ border-bottom-left-radius: var(--fs-control-border-radius);
204
+ }
205
+ }
206
+ &[open] {
207
+ &.up .fs-summary {
208
+ border-top-right-radius: 0;
209
+ border-top-left-radius: 0;
210
+ }
211
+ &.down .fs-summary {
212
+ border-bottom-right-radius: 0;
213
+ border-bottom-left-radius: 0;
214
+ }
215
+ }
216
+ &.disabled {
217
+ & .fs-summary {
218
+ cursor: not-allowed;
219
+ }
220
+ & .title-wrapper {
221
+ color: var(--fs-text-disabled);
222
+ }
223
+ & :global(.button-icon *) {
224
+ color: var(--fs-text-disabled) !important;
225
+ fill: var(--fs-text-disabled) !important;
226
+ }
227
+ }
228
+ }
229
+ @supports (interpolate-size: allow-keywords) {
230
+ :root {
231
+ interpolate-size: allow-keywords;
232
+ }
233
+ ::details-content {
234
+ display: contents;
235
+ }
236
+ .content {
237
+ transition:
238
+ height var(--fs-normal-duration) var(--fs-point-to-point),
239
+ content-visibility var(--fs-normal-duration) allow-discrete;
240
+ height: 0;
241
+ overflow: clip;
242
+ visibility: hidden;
243
+ }
244
+ [open] .content {
245
+ visibility: visible;
246
+ height: max-content;
247
+ }
248
+ }
249
+ </style>
@@ -0,0 +1,21 @@
1
+ import { Expander } from '../../internal/index.js';
2
+ import type { ExpanderProps } from './types.ts';
3
+ /**
4
+ * The expander is a collapsible container that can be used to hide or show content.
5
+ * It is used to reduce the amount of information displayed on the screen and to
6
+ * improve the user experience.
7
+ *
8
+ * - Usage:
9
+ * ```tsx
10
+ * <script>
11
+ * import { Expander } from 'fluentui-svelte';
12
+ * </script>
13
+ *
14
+ * <Expander label="Expander label" description="Expander description">
15
+ * <p>Expander content</p>
16
+ * </Expander>
17
+ * ```
18
+ */
19
+ declare const Expander: import("svelte").Component<ExpanderProps, {}, "ref" | "expanded" | "summaryRef">;
20
+ type Expander = ReturnType<typeof Expander>;
21
+ export default Expander;
@@ -0,0 +1,47 @@
1
+ import type { Component, Snippet } from 'svelte';
2
+ import type { HTMLAttributes, HTMLDetailsAttributes, SVGAttributes } from 'svelte/elements';
3
+ /** @propsmith ExpanderProps */
4
+ export type ExpanderProps = {
5
+ /** Label of the expander. */
6
+ header: string;
7
+ /** Description to render below the header. */
8
+ description?: string;
9
+ /** Set the opening direction of the expander.
10
+ * @default 'down'
11
+ */
12
+ direction?: 'down' | 'up';
13
+ /** The expander is justified to the full width of the container.
14
+ * @default false
15
+ */
16
+ justify?: boolean;
17
+ /** Disables the user interaction.
18
+ * @default false
19
+ */
20
+ disabled?: boolean;
21
+ /** The animation configuration. Reduced motion is always honoured over this. */
22
+ animation?: {
23
+ duration: number;
24
+ easing: string;
25
+ };
26
+ /** Control the opening state of the expander.
27
+ * @default false
28
+ * @bindable
29
+ */
30
+ expanded?: boolean;
31
+ /** The DOM reference of the expander element.
32
+ * @bindable
33
+ */
34
+ ref?: HTMLDetailsElement;
35
+ /** The icon to display before the label.
36
+ * @type Snippet | Component
37
+ */
38
+ Icon?: Snippet<[SVGAttributes<SVGElement>] | []> | Component<SVGAttributes<SVGElement>>;
39
+ /** The DOM reference of the summary element.
40
+ * @bindable
41
+ */
42
+ summaryRef?: HTMLElement;
43
+ /** The props to spread on the summary element.
44
+ * @type HTMLAttributes
45
+ */
46
+ summaryProps?: HTMLAttributes<HTMLElement>;
47
+ } & HTMLDetailsAttributes;
@@ -0,0 +1 @@
1
+ export {};