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,151 @@
1
+ <script lang="ts">
2
+ import { PREFIX } from '../../internal/constants.js';
3
+ import type { ToggleSwitchProps } from './types.js';
4
+
5
+ const FALLBACK_ID = $props.id();
6
+ const COMPONENT_NAME = 'toggle-switch';
7
+ const ID = `${PREFIX}${COMPONENT_NAME}-${FALLBACK_ID}`;
8
+
9
+ let {
10
+ ref = $bindable(),
11
+ checked = $bindable(),
12
+ id = ID,
13
+ name = id,
14
+ label,
15
+ labelAttributes,
16
+ labelElement,
17
+ ...attributes
18
+ }: ToggleSwitchProps = $props();
19
+ </script>
20
+
21
+ <!--
22
+ @component
23
+
24
+ This file contains the Svelte component implementation of a Fluent UI Toggle Switch.
25
+ The Fluent UI Toggle Switch is a customizable input element that allows users to switch between two states.
26
+
27
+ - Usage:
28
+ ```tsx
29
+ <script>
30
+ import { ToggleSwitch } from 'fluentui-svelte';
31
+ </script>
32
+
33
+ <ToggleSwitch label="Toggle Switch" />
34
+ ```
35
+ -->
36
+ <label class="fs-toggle-switch" {...labelAttributes} bind:this={labelElement}>
37
+ <input type="checkbox" role="switch" {id} {name} bind:checked bind:this={ref} {...attributes} />
38
+ {#if label}
39
+ <span>
40
+ {label}
41
+ </span>
42
+ {/if}
43
+ </label>
44
+
45
+ <style>
46
+ label {
47
+ display: flex;
48
+ align-items: center;
49
+ border-radius: 1.125rem;
50
+ outline: none;
51
+ cursor: pointer;
52
+ user-select: none;
53
+ &:has(input:focus-visible) {
54
+ outline: 0.125rem var(--fs-focus-stroke-outer) solid;
55
+ outline-offset: 0.125rem;
56
+ &:has(span) {
57
+ border-radius: 0.063rem;
58
+ outline-offset: 0.313rem;
59
+ }
60
+ }
61
+ &:hover input {
62
+ background-color: var(--fs-control-alt-fill-tertiary);
63
+ &::after {
64
+ transform: translateX(0) scale(1.16);
65
+ }
66
+ &:checked::after {
67
+ transform: translateX(1.25rem) scale(1.16);
68
+ }
69
+ }
70
+ &:active input {
71
+ background-color: var(--fs-control-alt-fill-quaternary);
72
+ &::after {
73
+ width: 1rem;
74
+ }
75
+ &:checked {
76
+ background-color: var(--fs-accent-fill-secondary);
77
+ border-color: var(--fs-control-fill-transparent);
78
+ &::after {
79
+ margin-left: calc(-0.25rem * 1.16);
80
+ }
81
+ }
82
+ }
83
+ &:has(input:disabled) {
84
+ pointer-events: none;
85
+ color: var(--fs-text-disabled);
86
+ & input {
87
+ background-color: var(--fs-control-alt-fill-disabled);
88
+ border-color: var(--fs-control-strong-stroke-disabled);
89
+ &:checked {
90
+ background-clip: padding-box;
91
+ background-color: var(--fs-accent-fill-disabled);
92
+ border-color: var(--fs-accent-fill-disabled);
93
+ &::after {
94
+ background-color: var(--fs-text-on-accent-disabled);
95
+ }
96
+ }
97
+ }
98
+ & input::after {
99
+ background-color: var(--fs-text-disabled);
100
+ }
101
+ }
102
+ & input {
103
+ appearance: none;
104
+ display: flex;
105
+ align-items: center;
106
+ position: relative;
107
+ outline: none;
108
+ width: 2.5rem;
109
+ min-width: 2.5rem;
110
+ height: 1.25rem;
111
+ border: 0.063rem solid var(--fs-control-strong-stroke-default);
112
+ border-radius: 1.125rem;
113
+ background-color: var(--fs-control-alt-fill-secondary);
114
+ padding: 0.063rem;
115
+ cursor: pointer;
116
+ &::after {
117
+ content: '';
118
+ position: absolute;
119
+ left: 0.22rem;
120
+ width: 0.75rem;
121
+ height: 0.75rem;
122
+ border-radius: 0.75rem;
123
+ background-color: var(--fs-text-secondary);
124
+ transition:
125
+ transform var(--fs-fast-duration) var(--fs-point-to-point),
126
+ width var(--fs-fast-duration),
127
+ margin var(--fs-fast-duration);
128
+ }
129
+ /* Add effects support for Keyboard Events */
130
+ &:active::after {
131
+ width: 1rem;
132
+ }
133
+ &:checked {
134
+ background-color: var(--fs-accent-fill-default);
135
+ border-color: var(--fs-accent-fill-default);
136
+ &::after {
137
+ transform: translateX(1.25rem);
138
+ background-color: var(--fs-text-on-accent-primary);
139
+ }
140
+ &:active::after {
141
+ margin-left: calc(-0.25rem * 1.16);
142
+ }
143
+ }
144
+ }
145
+ & span {
146
+ font-size: inherit;
147
+ color: inherit;
148
+ padding-inline: 0.8rem;
149
+ }
150
+ }
151
+ </style>
@@ -0,0 +1,17 @@
1
+ import type { ToggleSwitchProps } from './types.ts';
2
+ /**
3
+ * This file contains the Svelte component implementation of a Fluent UI Toggle Switch.
4
+ * The Fluent UI Toggle Switch is a customizable input element that allows users to switch between two states.
5
+ *
6
+ * - Usage:
7
+ * ```tsx
8
+ * <script>
9
+ * import { ToggleSwitch } from 'fluentui-svelte';
10
+ * </script>
11
+ *
12
+ * <ToggleSwitch label="Toggle Switch" />
13
+ * ```
14
+ */
15
+ declare const ToggleSwitch: import("svelte").Component<ToggleSwitchProps, {}, "ref" | "checked">;
16
+ type ToggleSwitch = ReturnType<typeof ToggleSwitch>;
17
+ export default ToggleSwitch;
@@ -0,0 +1,20 @@
1
+ import type { HTMLLabelAttributes, SvelteHTMLElements } from 'svelte/elements';
2
+ /** @propsmith ToggleSwitchProps */
3
+ export type ToggleSwitchProps = {
4
+ /** Whether the switch is on.
5
+ * @bindable
6
+ */
7
+ checked?: boolean;
8
+ /** The DOM reference of the input element.
9
+ * @bindable
10
+ */
11
+ ref?: HTMLInputElement;
12
+ /** The label displayed next to the input element. */
13
+ label?: string;
14
+ /** The attributes to spread on the label wrapping the switch.
15
+ * @type HTMLLabelAttributes
16
+ */
17
+ labelAttributes?: HTMLLabelAttributes;
18
+ /** The DOM reference of the label element. */
19
+ labelElement?: HTMLLabelElement;
20
+ } & SvelteHTMLElements['input'];
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,74 @@
1
+ # Tooltip
2
+
3
+ A tooltip displays additional information about another component. The information is displayed above and near the target component.
4
+
5
+ ## Usage
6
+
7
+ ```svelte
8
+ <script>
9
+ import { Tooltip, Button } from 'fluentui-svelte';
10
+ </script>
11
+
12
+ <Tooltip content="Tooltip content" relationship="description" withArrow>
13
+ {#snippet children(attrs)}
14
+ <Button {...attrs}>Hover over me</Button>
15
+ {/snippet}
16
+ </Tooltip>
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
+ ### Content
24
+
25
+ The content prop specifies the content to be displayed in the tooltip when the user hovers over the target element. This can be a string, a Svelte component, or a Snippet.
26
+
27
+ ### Position
28
+
29
+ The positionConfig prop allows you to specify your own custom position using Floating UI's position configuration. This gives you more control over the placement of the tooltip, allowing you to define custom offsets, middleware, and more.
30
+
31
+ ### With Arrow
32
+
33
+ The withArrow prop is a boolean that, when set to true, adds an arrow to the tooltip pointing towards the target element. This can help visually connect the tooltip to the element it is describing.
34
+
35
+ ```svelte
36
+ <Tooltip content="Tooltip with arrow" relationship="description" withArrow>
37
+ {#snippet children(attrs)}
38
+ <Button {...attrs}>With arrow</Button>
39
+ {/snippet}
40
+ </Tooltip>
41
+ ```
42
+
43
+ ### Delay
44
+
45
+ The openDelay and hideDelay props allow you to specify a delay, in milliseconds, before the tooltip is shown or hidden after the user hovers over the target element. This can help prevent the tooltip from appearing or disappearing too quickly.
46
+
47
+ ```svelte
48
+ <Tooltip content="Delayed tooltip" openDelay={500} hideDelay={200}>
49
+ {#snippet children(attrs)}
50
+ <Button {...attrs}>Delayed</Button>
51
+ {/snippet}
52
+ </Tooltip>
53
+ ```
54
+
55
+ ### onVisibleChange
56
+
57
+ The onVisibleChange prop is a callback function that is called whenever the visibility of the tooltip changes. This allows you to programmatically respond to the tooltip being shown or hidden.
58
+
59
+ ### relationship
60
+
61
+ The relationship prop allows you to specify the relationship between the tooltip and the target element. This can be used for accessibility purposes, such as indicating that the tooltip is a description of the target element.
62
+
63
+ ## Component Props
64
+
65
+ | Name | Type | Description |
66
+ | ------------------ | -------------------------------- | --------------------------------------------------------------------------------------------------------------- |
67
+ | `content` | `string \| Snippet \| Component` | The content to be displayed in the tooltip. This can be a string, a Svelte component, or a Snippet. |
68
+ | `positionConfig` | `Partial<ComputePositionConfig>` | The position configuration of the tooltip. This allows you to define custom offsets, middleware, and more. |
69
+ | `withArrow` | `boolean` | Whether the tooltip should display an arrow pointing towards the target element. |
70
+ | `openDelay` | `number` | The delay, in milliseconds, before the tooltip is shown after the user hovers over the target element. |
71
+ | `hideDelay` | `number` | The delay, in milliseconds, before the tooltip is hidden after the user stops hovering over the target element. |
72
+ | `onVisibleChange` | `(visible: boolean) => void` | A callback function that is called whenever the visibility of the tooltip changes. |
73
+ | `element` | `HTMLElement` | The DOM reference of the tooltip element. |
74
+ | Element Attributes | | All other attributes that can be applied to the tooltip element. |
@@ -0,0 +1,246 @@
1
+ <script lang="ts">
2
+ import { on } from 'svelte/events';
3
+ import { useDebounce } from 'runed';
4
+ import { floating, roundByDPR, RenderSoC } from '../../internal/index.js';
5
+ import { Flyout } from '../../index.js';
6
+ import { PREFIX } from '../../internal/constants.js';
7
+ import { arrow, flip, hide, offset, shift, type ComputePositionReturn, type Side } from '@floating-ui/dom';
8
+ import type { Attachment } from 'svelte/attachments';
9
+ import type { TooltipProps } from './types.js';
10
+
11
+ const FALLBACK_ID = $props.id();
12
+ const COMPONENT_NAME = 'tooltip';
13
+ const ID = `${PREFIX}${COMPONENT_NAME}-${FALLBACK_ID}`;
14
+
15
+ let {
16
+ ref = $bindable(),
17
+ content = 'I am a tooltip',
18
+ placement,
19
+ target,
20
+ positionConfig: _config,
21
+ open = $bindable(false),
22
+ withArrow = false,
23
+ openDelay = 100,
24
+ hideDelay = 300,
25
+ preventClose = $bindable(false),
26
+ onVisibleChange,
27
+ animationFrame = false,
28
+ relationship = 'label',
29
+ class: classes,
30
+ id = ID,
31
+ children,
32
+ ...attributes
33
+ }: TooltipProps = $props();
34
+
35
+ let anchor: HTMLElement | null = $state(null);
36
+ let explicitTrigger: HTMLElement | null = $state(null);
37
+ let arrowElement: HTMLElement | null = $state(null);
38
+ let hoveringTooltip = $state(false);
39
+
40
+ const childrenProps = $derived({
41
+ 'aria-labelledby': relationship === 'label' ? id : undefined,
42
+ 'aria-describedby': relationship === 'description' ? id : undefined
43
+ });
44
+
45
+ const handleOpen = useDebounce(
46
+ () => {
47
+ open = true;
48
+ onVisibleChange?.(true);
49
+ },
50
+ () => openDelay
51
+ );
52
+
53
+ const handleClose = useDebounce(
54
+ () => {
55
+ if (preventClose || hoveringTooltip) return;
56
+ open = false;
57
+ onVisibleChange?.(false);
58
+ },
59
+ () => hideDelay
60
+ );
61
+
62
+ const triggerRef: Attachment = (node) => {
63
+ explicitTrigger = node as HTMLElement;
64
+ return () => {
65
+ explicitTrigger = null;
66
+ };
67
+ };
68
+
69
+ let triggerElement = $derived(
70
+ target ?? explicitTrigger ?? (anchor ? (anchor as HTMLElement).nextElementSibling : null)
71
+ );
72
+
73
+ let positionConfig = $derived({
74
+ ..._config,
75
+ placement: placement ?? _config?.placement ?? 'top',
76
+ strategy: 'fixed' as const,
77
+ middleware: [
78
+ ...(_config?.middleware ?? [offset(8), flip(), shift({ padding: 8 }), hide()]),
79
+ ...(withArrow && arrowElement ? [arrow({ element: arrowElement })] : [])
80
+ ]
81
+ });
82
+
83
+ const arrowComputeCallback = (data: ComputePositionReturn) => {
84
+ if (!arrowElement) return;
85
+
86
+ const { x, y } = data.middlewareData.arrow || {};
87
+ const { placement } = data;
88
+
89
+ const side = placement.split('-')[0] as Side;
90
+
91
+ // Invert the side of the arrow
92
+ const staticSide = {
93
+ top: 'bottom',
94
+ right: 'left',
95
+ bottom: 'top',
96
+ left: 'right'
97
+ }[side];
98
+
99
+ if (staticSide && arrowElement.style) {
100
+ Object.assign(arrowElement.style, {
101
+ left: x != null ? `${roundByDPR(x)}px` : '',
102
+ top: y != null ? `${roundByDPR(y)}px` : '',
103
+ [staticSide]: `${-(arrowElement.offsetWidth / 2) + 1}px`,
104
+ transform: 'rotate(45deg)'
105
+ });
106
+ arrowElement.style.setProperty(
107
+ '--fs-tooltip-mask-angle',
108
+ {
109
+ top: '135deg',
110
+ right: '-135deg',
111
+ bottom: '-45deg',
112
+ left: '45deg'
113
+ }[side]
114
+ );
115
+ }
116
+ };
117
+
118
+ $effect(() => {
119
+ if (!triggerElement) return;
120
+
121
+ const cleanups = [
122
+ on(triggerElement, 'mouseenter', () => handleOpen()),
123
+ on(triggerElement, 'mouseleave', () => handleClose()),
124
+ on(triggerElement, 'focusin', () => handleOpen()),
125
+ on(triggerElement, 'focusout', () => handleClose())
126
+ ];
127
+
128
+ return () => cleanups.forEach((c) => c());
129
+ });
130
+
131
+ $effect(() => {
132
+ if (!ref || !open) return;
133
+
134
+ const cleanups = [
135
+ on(ref, 'mouseenter', () => {
136
+ hoveringTooltip = true;
137
+ }),
138
+ on(ref, 'mouseleave', () => {
139
+ hoveringTooltip = false;
140
+ handleClose();
141
+ })
142
+ ];
143
+
144
+ return () => {
145
+ hoveringTooltip = false;
146
+ cleanups.forEach((c) => c());
147
+ };
148
+ });
149
+
150
+ $effect(() => {
151
+ if (!open) return;
152
+
153
+ return on(document, 'keydown', (e) => {
154
+ if (e.key === 'Escape') {
155
+ open = false;
156
+ onVisibleChange?.(false);
157
+ }
158
+ });
159
+ });
160
+ </script>
161
+
162
+ <!-- @component
163
+ This is a implementation of Fluent UI tooltip component. The tooltip is a small pop-up box that appears when a user hovers over an element. It provides additional information about the element being hovered over.
164
+
165
+ - Usage:
166
+ ```tsx
167
+ <script>
168
+ import { Tooltip } from 'fluentui-svelte';
169
+ </script>
170
+
171
+ <Tooltip>
172
+ <Button>Hover me!</Button>
173
+ </Tooltip>
174
+ ```
175
+ -->
176
+ <Flyout
177
+ {id}
178
+ class={['fs-tooltip', !open && 'tooltip-hidden', classes]}
179
+ role="tooltip"
180
+ bind:ref
181
+ {...attributes}
182
+ {@attach triggerElement && open
183
+ ? floating(triggerElement, positionConfig, {
184
+ onComputed: withArrow ? arrowComputeCallback : undefined,
185
+ animationFrame
186
+ })
187
+ : undefined}
188
+ >
189
+ {#if typeof content === 'string'}
190
+ {content}
191
+ {:else if typeof content === 'function'}
192
+ <RenderSoC SoC={content} />
193
+ {/if}
194
+ {#if withArrow}
195
+ <div class="fs-tooltip-arrow" aria-hidden="true" bind:this={arrowElement}></div>
196
+ {/if}
197
+ </Flyout>
198
+
199
+ {#if !explicitTrigger && !target}
200
+ <i hidden bind:this={anchor}></i>
201
+ {/if}
202
+
203
+ {@render children?.(childrenProps, triggerRef)}
204
+
205
+ <style>
206
+ :global(.fs-tooltip) {
207
+ position: fixed !important;
208
+ top: 0;
209
+ left: 0;
210
+ z-index: 50;
211
+ & .fs-tooltip-arrow {
212
+ position: absolute;
213
+ width: 16px;
214
+ height: 16px;
215
+ background: var(--fs-acrylic-background-default);
216
+ border-radius: var(--fs-control-border-radius);
217
+ border: 1px solid var(--fs-control-surface-stroke-flyout);
218
+ transform: rotate(45deg);
219
+ mask: linear-gradient(
220
+ var(--fs-tooltip-mask-angle, -45deg),
221
+ transparent 0%,
222
+ transparent 50%,
223
+ black 50%,
224
+ black 100%
225
+ );
226
+ &::before {
227
+ content: '';
228
+ border-radius: calc(var(--fs-control-overlay-border-radius) - 0.063rem);
229
+ width: 100%;
230
+ height: 100%;
231
+ position: absolute;
232
+ inset: 0;
233
+ background: var(--fs-acrilic-noise);
234
+ background-size: 2.5rem;
235
+ opacity: 0.1;
236
+ filter: grayscale(1);
237
+ z-index: 0;
238
+ pointer-events: none;
239
+ }
240
+ }
241
+ &.tooltip-hidden {
242
+ visibility: hidden !important;
243
+ pointer-events: none;
244
+ }
245
+ }
246
+ </style>
@@ -0,0 +1,18 @@
1
+ import type { TooltipProps } from './types.ts';
2
+ /**
3
+ * This is a implementation of Fluent UI tooltip component. The tooltip is a small pop-up box that appears when a user hovers over an element. It provides additional information about the element being hovered over.
4
+ *
5
+ * - Usage:
6
+ * ```tsx
7
+ * <script>
8
+ * import { Tooltip } from 'fluentui-svelte';
9
+ * </script>
10
+ *
11
+ * <Tooltip>
12
+ * <Button>Hover me!</Button>
13
+ * </Tooltip>
14
+ * ```
15
+ */
16
+ declare const Tooltip: import("svelte").Component<TooltipProps, {}, "ref" | "open" | "preventClose">;
17
+ type Tooltip = ReturnType<typeof Tooltip>;
18
+ export default Tooltip;
@@ -0,0 +1,67 @@
1
+ import type { ComputePositionConfig, Placement } from '@floating-ui/dom';
2
+ import type { Component, Snippet } from 'svelte';
3
+ import type { Attachment } from 'svelte/attachments';
4
+ import type { HTMLAttributes } from 'svelte/elements';
5
+ /** @propsmith TooltipProps */
6
+ export type TooltipProps = {
7
+ /** The content to display in the tooltip.
8
+ * @type string | Snippet | Component
9
+ * @default 'I am a tooltip'
10
+ */
11
+ content?: string | Snippet | Component;
12
+ /** The class to apply to the tooltip. */
13
+ class?: string;
14
+ /** The DOM reference of the tooltip element.
15
+ * @bindable
16
+ */
17
+ ref?: HTMLElement;
18
+ /** The element the tooltip is anchored to. Falls back to the rendered children. */
19
+ target?: HTMLElement;
20
+ /** Controls the open state of the tooltip.
21
+ * @default false
22
+ * @bindable
23
+ */
24
+ open?: boolean;
25
+ /** Whether the tooltip has an arrow pointing at its target.
26
+ * @default false
27
+ */
28
+ withArrow?: boolean;
29
+ /** The position configuration handed over to floating-ui.
30
+ * @type ComputePositionConfig
31
+ */
32
+ positionConfig?: Partial<ComputePositionConfig>;
33
+ /** The delay in milliseconds before the tooltip is shown.
34
+ * @default 100
35
+ */
36
+ openDelay?: number;
37
+ /** The delay in milliseconds before the tooltip is hidden.
38
+ * @default 300
39
+ */
40
+ hideDelay?: number;
41
+ /** Callback function that is called when the visibility of the tooltip changes. */
42
+ onVisibleChange?: (visible: boolean) => void;
43
+ /** The relationship of the tooltip to its target, which decides how it is announced.
44
+ * @default 'label'
45
+ */
46
+ relationship?: 'label' | 'description' | 'inaccessible';
47
+ /** Where the tooltip is placed relative to its target. */
48
+ placement?: Placement;
49
+ /** The id of the tooltip element, referenced by the target. Falls back to a generated id. */
50
+ id?: string;
51
+ /** Keeps the tooltip open until it is closed by hand.
52
+ * @default false
53
+ * @bindable
54
+ */
55
+ preventClose?: boolean;
56
+ /** Repositions the tooltip on every animation frame, for a target that keeps moving.
57
+ * @default false
58
+ */
59
+ animationFrame?: boolean;
60
+ /** The target of the tooltip. It receives the ARIA attributes and the attachment to spread on your element.
61
+ * @type Snippet
62
+ */
63
+ children?: Snippet<[{
64
+ 'aria-labelledby'?: string;
65
+ 'aria-describedby'?: string;
66
+ }, Attachment]>;
67
+ } & Omit<HTMLAttributes<HTMLDivElement>, 'children'>;
@@ -0,0 +1 @@
1
+ export {};