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,14 @@
1
+ /**
2
+ * Base context shape shared across all FluentUI Svelte components.
3
+ * - `config`: readonly props passed by the consumer (never mutated internally)
4
+ * - `state`: reactive internal state
5
+ * - `events`: callbacks exposed to the parent
6
+ * - `methods`: imperative API exposed to the parent
7
+ */
8
+ export type FSContext<Config = Record<string, unknown> | null, State = Record<string, unknown> | null, Events = Record<string, (...args: unknown[]) => void> | null, Methods = Record<string, (...args: unknown[]) => void> | null> = {
9
+ readonly config: Config;
10
+ state: State;
11
+ events: Events;
12
+ methods: Methods;
13
+ };
14
+ export declare function createFSContext<T>(): [() => T | null, (context: T) => void];
@@ -0,0 +1,13 @@
1
+ import { getContext, hasContext, setContext } from 'svelte';
2
+ export function createFSContext() {
3
+ const key = {};
4
+ return [
5
+ () => {
6
+ if (!hasContext(key)) {
7
+ return null;
8
+ }
9
+ return getContext(key);
10
+ },
11
+ (context) => setContext(key, context)
12
+ ];
13
+ }
@@ -0,0 +1,6 @@
1
+ export type ReactiveRect = {
2
+ ref: HTMLElement | null;
3
+ rect: Omit<DOMRect, 'toJSON'>;
4
+ update: () => void;
5
+ };
6
+ export declare const reactiveBoundingRect: () => ReactiveRect;
@@ -0,0 +1,46 @@
1
+ import { on } from 'svelte/events';
2
+ import { useResizeObserver } from 'runed';
3
+ export const reactiveBoundingRect = () => {
4
+ let ref = $state(null);
5
+ let rect = $state({
6
+ bottom: 0,
7
+ height: 0,
8
+ left: 0,
9
+ right: 0,
10
+ top: 0,
11
+ width: 0,
12
+ x: 0,
13
+ y: 0
14
+ });
15
+ const update = () => {
16
+ if (!ref)
17
+ return;
18
+ rect = ref.getBoundingClientRect();
19
+ };
20
+ $effect(() => {
21
+ if (!ref)
22
+ return;
23
+ update();
24
+ const offResize = on(window, 'resize', update);
25
+ const offScroll = on(window, 'scroll', update);
26
+ // We need to use ResizeObserver to detect changes in the size of the element
27
+ const { stop } = useResizeObserver(ref, () => update());
28
+ return () => {
29
+ offResize();
30
+ offScroll();
31
+ stop();
32
+ };
33
+ });
34
+ return {
35
+ get ref() {
36
+ return ref;
37
+ },
38
+ get rect() {
39
+ return rect;
40
+ },
41
+ set ref(el) {
42
+ ref = el;
43
+ },
44
+ update
45
+ };
46
+ };
@@ -0,0 +1,15 @@
1
+ import { type ComputePositionConfig, type ComputePositionReturn, type VirtualElement } from '@floating-ui/dom';
2
+ import type { Attachment } from 'svelte/attachments';
3
+ export interface FloatingOptions {
4
+ /** Use `requestAnimationFrame` for position updates instead of resize/scroll observers. */
5
+ animationFrame?: boolean;
6
+ /** Callback invoked after each position computation. */
7
+ onComputed?: (value: ComputePositionReturn) => void;
8
+ /** Callback invoked if position computation fails. */
9
+ onError?: (error: unknown) => void;
10
+ }
11
+ /**
12
+ * Svelte attachment that positions a floating element relative to a reference using FloatingUI.
13
+ * Automatically updates position on scroll, resize, and DOM mutations.
14
+ */
15
+ export declare const floating: (ref: HTMLElement | VirtualElement, positionConfig?: ComputePositionConfig, { animationFrame, onComputed, onError }?: FloatingOptions) => Attachment<HTMLElement>;
@@ -0,0 +1,26 @@
1
+ import { autoUpdate, computePosition, flip, hide, offset, shift } from '@floating-ui/dom';
2
+ import { roundByDPR } from '../index.js';
3
+ import { DEFAULT_OFFSET } from '../constants.js';
4
+ /**
5
+ * Svelte attachment that positions a floating element relative to a reference using FloatingUI.
6
+ * Automatically updates position on scroll, resize, and DOM mutations.
7
+ */
8
+ export const floating = (ref, positionConfig = {
9
+ placement: 'bottom-start',
10
+ middleware: [offset(DEFAULT_OFFSET), flip(), shift({ padding: DEFAULT_OFFSET }), hide()]
11
+ }, { animationFrame, onComputed, onError } = {}) => (node) => {
12
+ const update = () => {
13
+ computePosition(ref, node, positionConfig)
14
+ .then((data) => {
15
+ const { x, y, middlewareData } = data;
16
+ node.style.transform = `translate(${roundByDPR(x)}px, ${roundByDPR(y)}px)`;
17
+ node.style.visibility = middlewareData.hide?.referenceHidden ? 'hidden' : 'visible';
18
+ onComputed?.(data);
19
+ })
20
+ .catch((err) => {
21
+ onError?.(err);
22
+ });
23
+ };
24
+ const cleanup = autoUpdate(ref, node, update, { animationFrame });
25
+ return () => cleanup();
26
+ };
@@ -0,0 +1,3 @@
1
+ import type { ComputePositionConfig, VirtualElement } from '@floating-ui/dom';
2
+ export declare const getPointerVirtualElement: (e: Event) => VirtualElement;
3
+ export declare const getOffset: (positionConfig?: Partial<ComputePositionConfig>) => number;
@@ -0,0 +1,30 @@
1
+ import { DEFAULT_OFFSET } from '../constants.js';
2
+ export const getPointerVirtualElement = (e) => {
3
+ if (!(e instanceof PointerEvent)) {
4
+ throw new TypeError('Expected a PointerEvent');
5
+ }
6
+ return {
7
+ getBoundingClientRect() {
8
+ return {
9
+ width: 0,
10
+ height: 0,
11
+ x: e.clientX,
12
+ y: e.clientY,
13
+ top: e.clientY,
14
+ right: e.clientX,
15
+ bottom: e.clientY,
16
+ left: e.clientX
17
+ };
18
+ }
19
+ };
20
+ };
21
+ export const getOffset = (positionConfig) => {
22
+ if (!positionConfig)
23
+ return DEFAULT_OFFSET;
24
+ const offsetConfig = positionConfig.middleware?.find((m) => m && m.name === 'offset');
25
+ return offsetConfig
26
+ ? typeof offsetConfig.options === 'number'
27
+ ? offsetConfig.options
28
+ : offsetConfig.options.mainAxis
29
+ : DEFAULT_OFFSET;
30
+ };
@@ -0,0 +1,9 @@
1
+ export * from './utils.ts';
2
+ export * from './dom-utils.svelte.ts';
3
+ export * from './context.ts';
4
+ export * from './transitions.ts';
5
+ export * from './polyfills/expander.svelte.ts';
6
+ export * from './floating-ui/floating.svelte.ts';
7
+ export * from './floating-ui/utils.ts';
8
+ export { default as RenderSoC } from './components/render-soc/render-soc.svelte';
9
+ export { default as DynamicCarousel } from './components/dynamic-carousel/dynamic-carousel.svelte';
@@ -0,0 +1,9 @@
1
+ export * from "./utils.js";
2
+ export * from "./dom-utils.svelte.js";
3
+ export * from "./context.js";
4
+ export * from "./transitions.js";
5
+ export * from "./polyfills/expander.svelte.js";
6
+ export * from "./floating-ui/floating.svelte.js";
7
+ export * from "./floating-ui/utils.js";
8
+ export { default as RenderSoC } from './components/render-soc/render-soc.svelte';
9
+ export { default as DynamicCarousel } from './components/dynamic-carousel/dynamic-carousel.svelte';
@@ -0,0 +1,21 @@
1
+ import type { EASING, YDirection } from '../../types/index.js';
2
+ export declare class Expander {
3
+ details: HTMLDetailsElement;
4
+ summary: HTMLElement | null;
5
+ content: HTMLElement | null;
6
+ animation: Animation | null;
7
+ isClosing: boolean;
8
+ isExpanding: boolean;
9
+ duration: number;
10
+ easing: EASING | string;
11
+ direction: YDirection;
12
+ cleanEvent: () => void;
13
+ reducedMotion: () => boolean;
14
+ get effectiveDuration(): number;
15
+ constructor(element: HTMLDetailsElement | null, direction?: YDirection, duration?: number, easing?: EASING | string, reducedMotion?: () => boolean);
16
+ onClick(e: MouseEvent): void;
17
+ shrink(): void;
18
+ open(): void;
19
+ expand(): void;
20
+ onAnimationFinish(open: boolean): void;
21
+ }
@@ -0,0 +1,96 @@
1
+ import { on } from 'svelte/events';
2
+ import { DURATION } from '../constants.js';
3
+ // Thanks to CSS-Tricks for the Expander example. https://css-tricks.com/how-to-animate-the-details-element/
4
+ export class Expander {
5
+ details;
6
+ summary;
7
+ content;
8
+ animation;
9
+ isClosing;
10
+ isExpanding;
11
+ duration;
12
+ easing;
13
+ direction;
14
+ cleanEvent;
15
+ reducedMotion;
16
+ get effectiveDuration() {
17
+ return this.reducedMotion() ? DURATION.REDUCED : this.duration;
18
+ }
19
+ constructor(element, direction = 'down', duration = DURATION.NORMAL, easing = 'ease-out', reducedMotion = () => false) {
20
+ if (!element) {
21
+ throw new Error('Expander: Missing details element');
22
+ }
23
+ this.details = element;
24
+ this.summary = element.querySelector('summary');
25
+ this.content = element.querySelector('.content');
26
+ this.animation = null;
27
+ this.isClosing = false;
28
+ this.isExpanding = false;
29
+ this.duration = duration;
30
+ this.easing = easing;
31
+ this.direction = direction;
32
+ this.reducedMotion = reducedMotion;
33
+ if (!this.summary || !this.content) {
34
+ throw new Error('Expander: Missing summary or content element');
35
+ }
36
+ this.cleanEvent = on(this.summary, 'click', (e) => this.onClick(e));
37
+ }
38
+ onClick(e) {
39
+ e.preventDefault();
40
+ // Add an overflow on the <details> to avoid content overflowing
41
+ this.details.style.overflow = 'hidden';
42
+ if (this.isClosing || !this.details.open) {
43
+ this.open();
44
+ }
45
+ else if (this.isExpanding || this.details.open) {
46
+ this.shrink();
47
+ }
48
+ }
49
+ shrink() {
50
+ this.isClosing = true;
51
+ const startHeight = `${this.details.offsetHeight}px`;
52
+ const endHeight = `${this.summary?.offsetHeight}px`;
53
+ if (this.animation) {
54
+ // If there is already an animation running, cancel the current animation
55
+ this.animation.cancel();
56
+ }
57
+ // Start a WAAPI animation
58
+ this.animation = this.details.animate({
59
+ // Set the keyframes from the startHeight to endHeight
60
+ height: [startHeight, endHeight]
61
+ }, {
62
+ duration: this.effectiveDuration,
63
+ easing: this.easing
64
+ });
65
+ this.animation.onfinish = () => this.onAnimationFinish(false);
66
+ this.animation.oncancel = () => (this.isClosing = false);
67
+ }
68
+ open() {
69
+ this.details.style.height = `${this.details.offsetHeight}px`;
70
+ this.details.open = true;
71
+ window.requestAnimationFrame(() => this.expand());
72
+ }
73
+ expand() {
74
+ this.isExpanding = true;
75
+ const startHeight = `${this.details.offsetHeight}px`;
76
+ const endHeight = `${this.summary.offsetHeight + this.content.offsetHeight}px`;
77
+ if (this.animation) {
78
+ this.animation.cancel();
79
+ }
80
+ this.animation = this.details.animate({
81
+ height: [startHeight, endHeight]
82
+ }, {
83
+ duration: this.effectiveDuration,
84
+ easing: this.easing
85
+ });
86
+ this.animation.onfinish = () => this.onAnimationFinish(true);
87
+ this.animation.oncancel = () => (this.isExpanding = false);
88
+ }
89
+ onAnimationFinish(open) {
90
+ this.details.open = open;
91
+ this.animation = null;
92
+ this.isClosing = false;
93
+ this.isExpanding = false;
94
+ this.details.style.height = this.details.style.overflow = '';
95
+ }
96
+ }
@@ -0,0 +1,32 @@
1
+ export interface FlyToOffsetOptions {
2
+ delay?: number;
3
+ duration?: number;
4
+ easing?: (t: number) => number;
5
+ y?: number;
6
+ x?: number;
7
+ offset?: number;
8
+ css?: string;
9
+ reducedMotion?: boolean;
10
+ }
11
+ /** Fades and scales an element in/out. */
12
+ export declare function fadeScale(node: HTMLElement, { delay, duration, easing, baseScale, reducedMotion }?: {
13
+ delay?: number;
14
+ duration?: number;
15
+ easing?: (x: number) => number;
16
+ baseScale?: number;
17
+ reducedMotion?: boolean;
18
+ }): {
19
+ delay: number;
20
+ duration: number;
21
+ css: (t: number) => string;
22
+ };
23
+ /**
24
+ * Moves an element to a specific axis offset while fading in/out.
25
+ * Useful for aligning enter/exit animations with FloatingUI positioning.
26
+ */
27
+ export declare function flyToOffset(node: Element, { delay, duration, easing, y, x, offset, css, reducedMotion }?: FlyToOffsetOptions): {
28
+ delay: number;
29
+ duration: number;
30
+ easing: (t: number) => number;
31
+ css: (t: number) => string;
32
+ };
@@ -0,0 +1,37 @@
1
+ import { DURATION } from './constants.js';
2
+ /** Fades and scales an element in/out. */
3
+ export function fadeScale(node, { delay = 0, duration = DURATION.NORMAL, easing = (x) => x, baseScale = 0, reducedMotion = false } = {}) {
4
+ const opacity = +getComputedStyle(node).opacity;
5
+ const initialScale = 1 - baseScale;
6
+ return {
7
+ delay,
8
+ duration: reducedMotion ? DURATION.REDUCED : duration,
9
+ css: (t) => {
10
+ const eased = easing(t);
11
+ return `opacity: ${eased * opacity}; transform: scale(${eased * initialScale + baseScale})`;
12
+ }
13
+ };
14
+ }
15
+ /**
16
+ * Moves an element to a specific axis offset while fading in/out.
17
+ * Useful for aligning enter/exit animations with FloatingUI positioning.
18
+ */
19
+ export function flyToOffset(node, { delay = 0, duration = DURATION.NORMAL, easing = (t) => t, y, x, offset = 0, css, reducedMotion = false } = {}) {
20
+ const style = getComputedStyle(node);
21
+ const opacity = +style.opacity;
22
+ const transform = style.transform === 'none' ? '' : style.transform;
23
+ return {
24
+ delay,
25
+ duration: reducedMotion ? DURATION.REDUCED : duration,
26
+ easing,
27
+ css: (t) => {
28
+ const eased = easing(t);
29
+ const translation = y
30
+ ? `translateY(${y * (1 - eased) + offset * eased}px)`
31
+ : x
32
+ ? `translateX(${x * (1 - eased) + offset * eased}px)`
33
+ : '';
34
+ return `opacity: ${eased * opacity}; transform: ${transform} ${translation}; ${css || ''}`;
35
+ }
36
+ };
37
+ }
@@ -0,0 +1,22 @@
1
+ /** Converts a pixel value (number, string, or getter function) to a `rem` string. */
2
+ export declare const pxToRem: (px: number | string | (() => number | string), base?: number) => string;
3
+ /** Rounds a pixel value to the nearest physical pixel based on the device pixel ratio. */
4
+ export declare const roundByDPR: (value: number, element?: Element) => number;
5
+ /** Converts a kebab-case string to Title Case (e.g. `'my-label'` → `'My Label'`). */
6
+ export declare const capitalize: (str: string) => string;
7
+ export declare const getInitials: (name: string, max?: number) => string;
8
+ type EventHandler<E extends Event> = (this: unknown, event: E) => void;
9
+ /** Wraps a handler so it fires at most once, then becomes a no-op. */
10
+ export declare function once<E extends Event>(fn: EventHandler<E> | null): EventHandler<E>;
11
+ /** Wraps a handler to call `preventDefault()` before invoking it. */
12
+ export declare function preventDefault<E extends Event = Event>(fn: EventHandler<E>): EventHandler<E>;
13
+ /**
14
+ * Dispatches an event to a list of callbacks.
15
+ * If any blocker in `blockers` is true, calls `preventDefault()` and skips the callbacks.
16
+ */
17
+ export declare const invokeHandlers: <T extends Event>(e: T, blockers?: boolean | (boolean | undefined)[], callbacks?: Array<((event: any) => void) | unknown>) => void;
18
+ /** Returns `true` if the object has no own enumerable keys (also handles `null`/`undefined`). */
19
+ export declare const isObjectEmpty: (obj: Record<string, unknown> | null | undefined) => boolean;
20
+ /** Returns the value of a CSS custom property as milliseconds. */
21
+ export declare function getCSSDuration(property: string, element?: Element): number;
22
+ export {};
@@ -0,0 +1,63 @@
1
+ /** Converts a pixel value (number, string, or getter function) to a `rem` string. */
2
+ export const pxToRem = (px, base = 16) => {
3
+ if (typeof px === 'function') {
4
+ px = px();
5
+ }
6
+ return `${((typeof px === 'string' ? parseInt(px) : px) / base).toFixed(2)}rem`;
7
+ };
8
+ /** Rounds a pixel value to the nearest physical pixel based on the device pixel ratio. */
9
+ export const roundByDPR = (value, element) => {
10
+ const dpr = element?.ownerDocument.defaultView?.devicePixelRatio || window.devicePixelRatio || 1;
11
+ return Math.round(value * dpr) / dpr;
12
+ };
13
+ /** Converts a kebab-case string to Title Case (e.g. `'my-label'` → `'My Label'`). */
14
+ export const capitalize = (str) => {
15
+ return str
16
+ .split('-')
17
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
18
+ .join(' ');
19
+ };
20
+ export const getInitials = (name, max = 2) => {
21
+ return name
22
+ .split(' ')
23
+ .map((n, i) => (i < max ? n[0] : ''))
24
+ .join('');
25
+ };
26
+ /** Wraps a handler so it fires at most once, then becomes a no-op. */
27
+ export function once(fn) {
28
+ return function (event) {
29
+ if (fn) {
30
+ fn.call(this, event);
31
+ fn = null;
32
+ }
33
+ };
34
+ }
35
+ /** Wraps a handler to call `preventDefault()` before invoking it. */
36
+ export function preventDefault(fn) {
37
+ return function (event) {
38
+ event.preventDefault();
39
+ fn.call(this, event);
40
+ };
41
+ }
42
+ /**
43
+ * Dispatches an event to a list of callbacks.
44
+ * If any blocker in `blockers` is true, calls `preventDefault()` and skips the callbacks.
45
+ */
46
+ export const invokeHandlers = (e, blockers = [], callbacks = []) => {
47
+ if ((Array.isArray(blockers) ? blockers : [blockers]).some(Boolean))
48
+ return e.preventDefault();
49
+ for (const cb of callbacks) {
50
+ if (typeof cb === 'function')
51
+ cb(e);
52
+ }
53
+ };
54
+ /** Returns `true` if the object has no own enumerable keys (also handles `null`/`undefined`). */
55
+ export const isObjectEmpty = (obj) => Object.keys(obj || {}).length === 0;
56
+ /** Returns the value of a CSS custom property as milliseconds. */
57
+ export function getCSSDuration(property, element = document.documentElement) {
58
+ const raw = window.getComputedStyle(element).getPropertyValue(property).trim();
59
+ const value = parseFloat(raw);
60
+ if (isNaN(value))
61
+ return 0;
62
+ return raw.endsWith('ms') ? value : value * 1000;
63
+ }
@@ -0,0 +1,19 @@
1
+ import { type FSContext } from '../../internal/index.js';
2
+ import type { THEME } from '../../types/index.js';
3
+ import type { TabspotInstance } from 'tabspot';
4
+ export type FSProviderContext = FSContext<null, {
5
+ readonly tabspotInstance: TabspotInstance | undefined;
6
+ readonly reducedMotion: boolean;
7
+ readonly theme: Exclude<THEME, 'system'> | undefined;
8
+ }, null, {
9
+ /** `true`/`false` is the app's own preference and outranks the OS; `null` defers to it again. */
10
+ setReducedMotion: (value: boolean | null) => void;
11
+ /** `'light'`/`'dark'` is the app's own preference and outranks the OS; `null` defers to it again. */
12
+ setTheme: (value: THEME) => void;
13
+ }>;
14
+ export declare const getGlobalFSContext: () => FSProviderContext | null, setGlobalFSContext: (context: FSProviderContext) => void;
15
+ /**
16
+ * `reducedMotion` from the global context, for components that have to hand the value to something
17
+ * that cannot read context itself — a transition function or a plain class.
18
+ */
19
+ export declare function getReducedMotion(): () => boolean;
@@ -0,0 +1,11 @@
1
+ import { createFSContext } from '../../internal/index.js';
2
+ import { prefersReducedMotion } from 'svelte/motion';
3
+ export const [getGlobalFSContext, setGlobalFSContext] = createFSContext();
4
+ /**
5
+ * `reducedMotion` from the global context, for components that have to hand the value to something
6
+ * that cannot read context itself — a transition function or a plain class.
7
+ */
8
+ export function getReducedMotion() {
9
+ const context = getGlobalFSContext();
10
+ return () => context?.state.reducedMotion ?? prefersReducedMotion.current;
11
+ }
@@ -0,0 +1,68 @@
1
+ <script lang="ts">
2
+ import { tabspot, type TabspotInstance } from 'tabspot';
3
+ import { setGlobalFSContext, type FSProviderContext } from './fluentui-svelte.js';
4
+ import { onMount, type Snippet } from 'svelte';
5
+ import { prefersReducedMotion } from 'svelte/motion';
6
+ import { PersistedState } from 'runed';
7
+ import { mode, setMode } from 'mode-watcher';
8
+
9
+ let {
10
+ children,
11
+ tabspotInstance
12
+ }: {
13
+ tabspotInstance?: TabspotInstance;
14
+ children?: Snippet;
15
+ } = $props();
16
+
17
+ // boolean flags for user preferences and null for system default
18
+ let userReducedMotion = new PersistedState<boolean | null>('fluentui-svelte-reduced-motion', null);
19
+
20
+ // Syncing
21
+ let reducedMotion = $derived(userReducedMotion.current ?? prefersReducedMotion.current);
22
+
23
+ const _state: FSProviderContext['state'] = {
24
+ get tabspotInstance() {
25
+ return tabspotInstance;
26
+ },
27
+ get reducedMotion() {
28
+ return reducedMotion;
29
+ },
30
+ get theme() {
31
+ return mode.current;
32
+ }
33
+ };
34
+
35
+ setGlobalFSContext({
36
+ config: null,
37
+ state: _state,
38
+ events: null,
39
+ methods: {
40
+ setReducedMotion: (value) => {
41
+ userReducedMotion.current = value;
42
+ },
43
+ setTheme: (value) => {
44
+ setMode(value);
45
+ }
46
+ }
47
+ });
48
+
49
+ onMount(() => {
50
+ tabspotInstance ??= tabspot();
51
+
52
+ return () => {
53
+ tabspotInstance?.destroy();
54
+ };
55
+ });
56
+
57
+ $effect(() => {
58
+ const root = document.documentElement;
59
+
60
+ root.dataset.fsReducedMotion = String(_state.reducedMotion);
61
+
62
+ return () => {
63
+ delete root.dataset.fsReducedMotion;
64
+ };
65
+ });
66
+ </script>
67
+
68
+ {@render children?.()}
@@ -0,0 +1,9 @@
1
+ import { type TabspotInstance } from 'tabspot';
2
+ import { type Snippet } from 'svelte';
3
+ type $$ComponentProps = {
4
+ tabspotInstance?: TabspotInstance;
5
+ children?: Snippet;
6
+ };
7
+ declare const FluentuiSvelte: import("svelte").Component<$$ComponentProps, {}, "">;
8
+ type FluentuiSvelte = ReturnType<typeof FluentuiSvelte>;
9
+ export default FluentuiSvelte;