fluentui-svelte 0.3.0 → 0.4.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 (33) hide show
  1. package/dist/components/breadcrumb/breadcrumb-button.svelte +130 -0
  2. package/dist/components/breadcrumb/breadcrumb-button.svelte.d.ts +35 -0
  3. package/dist/components/breadcrumb/breadcrumb-divider.svelte +39 -0
  4. package/dist/components/breadcrumb/breadcrumb-divider.svelte.d.ts +14 -0
  5. package/dist/components/breadcrumb/breadcrumb-item.svelte +30 -0
  6. package/dist/components/breadcrumb/breadcrumb-item.svelte.d.ts +16 -0
  7. package/dist/components/breadcrumb/breadcrumb.svelte +101 -0
  8. package/dist/components/breadcrumb/breadcrumb.svelte.d.ts +25 -0
  9. package/dist/components/breadcrumb/docs/llms.md +193 -0
  10. package/dist/components/breadcrumb/types.d.ts +80 -0
  11. package/dist/components/breadcrumb/types.js +1 -0
  12. package/dist/components/tab-view/docs/llms.md +146 -0
  13. package/dist/components/tab-view/tab-view-tab.svelte +290 -0
  14. package/dist/components/tab-view/tab-view-tab.svelte.d.ts +20 -0
  15. package/dist/components/tab-view/tab-view.svelte +188 -0
  16. package/dist/components/tab-view/tab-view.svelte.d.ts +26 -0
  17. package/dist/components/tab-view/tab-view.svelte.js +15 -0
  18. package/dist/components/tab-view/types.d.ts +79 -0
  19. package/dist/components/tab-view/types.js +1 -0
  20. package/dist/components/top-nav/docs/llms.md +176 -0
  21. package/dist/components/top-nav/top-nav-item.svelte +234 -0
  22. package/dist/components/top-nav/top-nav-item.svelte.d.ts +41 -0
  23. package/dist/components/top-nav/top-nav.svelte +259 -0
  24. package/dist/components/top-nav/top-nav.svelte.d.ts +26 -0
  25. package/dist/components/top-nav/top-nav.svelte.js +18 -0
  26. package/dist/components/top-nav/types.d.ts +89 -0
  27. package/dist/components/top-nav/types.js +1 -0
  28. package/dist/css/class-darkmode.css +1 -1
  29. package/dist/css/media-darkmode.css +1 -1
  30. package/dist/css/theme.css +1 -1
  31. package/dist/index.d.ts +8 -0
  32. package/dist/index.js +14 -0
  33. package/package.json +1 -1
@@ -0,0 +1,259 @@
1
+ <script lang="ts">
2
+ import { getTabspotAttributes } from 'tabspot';
3
+ import { setTopNavContext, TABSPOT_ITEMS, TABSPOT_SKIP } from './top-nav.svelte.js';
4
+ import type { TopNavContext, TopNavProps } from './types.js';
5
+
6
+ let {
7
+ ref = $bindable(),
8
+ selectedValue = $bindable(''),
9
+ onTabSelect,
10
+ appearance = 'transparent',
11
+ size = 'medium',
12
+ vertical = false,
13
+ disabled = false,
14
+ selectTabOnFocus = false,
15
+ reserveSelectedTabSpace = true,
16
+ disableTabspot = false,
17
+ class: classes,
18
+ children,
19
+ ...attributes
20
+ }: TopNavProps = $props();
21
+
22
+ const context: TopNavContext = $state({
23
+ config: {
24
+ get appearance() {
25
+ return appearance;
26
+ },
27
+ get size() {
28
+ return size;
29
+ },
30
+ get vertical() {
31
+ return vertical;
32
+ },
33
+ get disabled() {
34
+ return disabled;
35
+ },
36
+ get selectTabOnFocus() {
37
+ return selectTabOnFocus;
38
+ },
39
+ get reserveSelectedTabSpace() {
40
+ return reserveSelectedTabSpace;
41
+ }
42
+ },
43
+ state: {
44
+ get selectedValue() {
45
+ return selectedValue;
46
+ },
47
+ set selectedValue(value: string) {
48
+ selectedValue = value;
49
+ }
50
+ },
51
+ events: null,
52
+ methods: {
53
+ selectTab: (event: Event, value: string) => {
54
+ if (selectedValue === value) return;
55
+ selectedValue = value;
56
+ onTabSelect?.(event, value);
57
+ }
58
+ }
59
+ });
60
+
61
+ setTopNavContext(context);
62
+
63
+ /**
64
+ * A single tab stop for the whole strip: the arrows walk the items along the axis they are laid
65
+ * out on, and `Home`/`End` jump to the ends.
66
+ */
67
+ const tabspotAttributes = $derived(
68
+ !disableTabspot &&
69
+ getTabspotAttributes({
70
+ root: { manageSpecialKeys: { Home: true, End: true } },
71
+ mover: {
72
+ axis: vertical ? 'vertical' : 'horizontal',
73
+ items: TABSPOT_ITEMS,
74
+ skip: TABSPOT_SKIP
75
+ }
76
+ })
77
+ );
78
+
79
+ /** The circular appearances fill the selected item instead of underlining it. */
80
+ const hasIndicator = $derived(appearance === 'transparent' || appearance === 'subtle');
81
+
82
+ /** Where the bar sits along the axis, and how far it reaches. Both are read off the DOM. */
83
+ let offset = $state(0);
84
+ let extent = $state(0);
85
+ let measured = $state(false);
86
+
87
+ /**
88
+ * The bar belongs to the strip rather than to the selected item, which is what lets it travel:
89
+ * one element that stays mounted and moves, instead of one per item appearing and disappearing.
90
+ * That costs a measurement, since only the DOM knows where an item ended up.
91
+ *
92
+ * It spans the content of the item rather than its whole box, so the padding is taken off both
93
+ * ends — the same padding the item lays its own hover bar within.
94
+ */
95
+ const measure = () => {
96
+ const root = ref;
97
+ if (!root) return;
98
+
99
+ const item = [...root.querySelectorAll<HTMLElement>(TABSPOT_ITEMS)].find(
100
+ (el) => el.dataset.value === selectedValue
101
+ );
102
+ if (!item) {
103
+ measured = false;
104
+ return;
105
+ }
106
+
107
+ const style = getComputedStyle(item);
108
+ const before = parseFloat(vertical ? style.paddingTop : style.paddingLeft) || 0;
109
+ const after = parseFloat(vertical ? style.paddingBottom : style.paddingRight) || 0;
110
+
111
+ offset = (vertical ? item.offsetTop : item.offsetLeft) + before;
112
+ extent = Math.max(0, (vertical ? item.offsetHeight : item.offsetWidth) - before - after);
113
+ measured = true;
114
+ };
115
+
116
+ // The selection and the axis are what move the bar; both are read through `measure`.
117
+ $effect(() => {
118
+ measure();
119
+ });
120
+
121
+ /**
122
+ * Everything else that moves it does so through the layout: a label that rewrapped, a font that
123
+ * finished loading, an item that was added or removed. The observers are what catch those, since
124
+ * none of them is a change to a prop.
125
+ */
126
+ $effect(() => {
127
+ const root = ref;
128
+ if (!root || !hasIndicator) return;
129
+
130
+ const resize = new ResizeObserver(measure);
131
+ const watch = () => {
132
+ resize.disconnect();
133
+ resize.observe(root);
134
+ for (const item of root.querySelectorAll(TABSPOT_ITEMS)) resize.observe(item);
135
+ };
136
+ const mutations = new MutationObserver(() => {
137
+ watch();
138
+ measure();
139
+ });
140
+
141
+ watch();
142
+ mutations.observe(root, { childList: true, subtree: true });
143
+
144
+ return () => {
145
+ resize.disconnect();
146
+ mutations.disconnect();
147
+ };
148
+ });
149
+ </script>
150
+
151
+ <!--
152
+ @component
153
+ A top nav gives a single selection from a row of items, with a bar that travels to whichever one
154
+ is selected. It owns the selection alone: what an item opens is rendered by the consumer.
155
+
156
+ - Usage:
157
+ ```tsx
158
+ <script>
159
+ import { TopNav, TopNavItem } from 'fluentui-svelte';
160
+
161
+ let selectedValue = $state('arrivals');
162
+ </script>
163
+
164
+ <TopNav bind:selectedValue aria-label="Flights">
165
+ <TopNavItem value="arrivals">Arrivals</TopNavItem>
166
+ <TopNavItem value="departures">Departures</TopNavItem>
167
+ </TopNav>
168
+
169
+ {#if selectedValue === 'arrivals'}
170
+ <p>Arrivals</p>
171
+ {/if}
172
+ ```
173
+ -->
174
+ <div
175
+ bind:this={ref}
176
+ role="tablist"
177
+ aria-orientation={vertical ? 'vertical' : undefined}
178
+ class={['fs-top-nav', appearance, size, { vertical }, classes]}
179
+ {...tabspotAttributes}
180
+ {...attributes}
181
+ >
182
+ {@render children?.()}
183
+ {#if hasIndicator && measured}
184
+ <span
185
+ class="fs-top-nav-indicator"
186
+ aria-hidden="true"
187
+ style:--fs-top-nav-indicator-offset="{offset}px"
188
+ style:--fs-top-nav-indicator-extent="{extent}px"
189
+ ></span>
190
+ {/if}
191
+ </div>
192
+
193
+ <style>
194
+ .fs-top-nav {
195
+ position: relative;
196
+ display: flex;
197
+ align-items: stretch;
198
+ font-family: var(--fs-font-family-base);
199
+ color: var(--fs-text-primary);
200
+ /* Read by every item, so a size change ripples out of the strip alone. */
201
+ --fs-top-nav-item-padding-inline: 0.625rem;
202
+ --fs-top-nav-item-padding-block: 0.375rem;
203
+ --fs-top-nav-item-font-size: var(--fs-body2-font-size);
204
+ --fs-top-nav-item-line-height: var(--fs-body2-line-height);
205
+ --fs-top-nav-item-gap: 0.5rem;
206
+ --fs-top-nav-item-icon-size: 1.25rem;
207
+ --fs-top-nav-bar-thickness: 0.1875rem;
208
+ &.small {
209
+ --fs-top-nav-item-padding-inline: 0.5rem;
210
+ --fs-top-nav-item-padding-block: 0.375rem;
211
+ --fs-top-nav-item-font-size: var(--fs-caption-font-size);
212
+ --fs-top-nav-item-line-height: var(--fs-caption-line-height);
213
+ --fs-top-nav-item-gap: 0.375rem;
214
+ --fs-top-nav-item-icon-size: 1rem;
215
+ --fs-top-nav-bar-thickness: 0.125rem;
216
+ }
217
+ &.large {
218
+ --fs-top-nav-item-padding-block: 0.875rem;
219
+ --fs-top-nav-item-font-size: var(--fs-body-font-size);
220
+ --fs-top-nav-item-line-height: var(--fs-body-line-height);
221
+ }
222
+ &.vertical {
223
+ flex-direction: column;
224
+ align-items: stretch;
225
+ }
226
+ }
227
+
228
+ /*
229
+ * The bar. It is placed from the measurement rather than laid out, so moving it is a transform
230
+ * the compositor can carry — and a transform is what keeps it on screen the whole way across,
231
+ * instead of leaving one item and arriving at the next.
232
+ */
233
+ .fs-top-nav-indicator {
234
+ position: absolute;
235
+ left: 0;
236
+ bottom: 0;
237
+ width: var(--fs-top-nav-indicator-extent, 0);
238
+ height: var(--fs-top-nav-bar-thickness);
239
+ border-radius: var(--fs-top-nav-bar-thickness);
240
+ background: var(--fs-accent-fill-default);
241
+ /* `offsetLeft` is measured from the left whichever way the strip is written. */
242
+ transform: translateX(var(--fs-top-nav-indicator-offset, 0));
243
+ transition:
244
+ transform var(--fs-normal-duration) var(--fs-point-to-point),
245
+ width var(--fs-normal-duration) var(--fs-point-to-point),
246
+ height var(--fs-normal-duration) var(--fs-point-to-point);
247
+ pointer-events: none;
248
+ }
249
+ .fs-top-nav.vertical .fs-top-nav-indicator {
250
+ top: 0;
251
+ bottom: auto;
252
+ /* The leading edge, so a strip written right to left grows its bar on the right. */
253
+ left: auto;
254
+ inset-inline-start: 0;
255
+ width: var(--fs-top-nav-bar-thickness);
256
+ height: var(--fs-top-nav-indicator-extent, 0);
257
+ transform: translateY(var(--fs-top-nav-indicator-offset, 0));
258
+ }
259
+ </style>
@@ -0,0 +1,26 @@
1
+ import type { TopNavProps } from './types.ts';
2
+ /**
3
+ * A top nav gives a single selection from a row of items, with a bar that travels to whichever one
4
+ * is selected. It owns the selection alone: what an item opens is rendered by the consumer.
5
+ *
6
+ * - Usage:
7
+ * ```tsx
8
+ * <script>
9
+ * import { TopNav, TopNavItem } from 'fluentui-svelte';
10
+ *
11
+ * let selectedValue = $state('arrivals');
12
+ * </script>
13
+ *
14
+ * <TopNav bind:selectedValue aria-label="Flights">
15
+ * <TopNavItem value="arrivals">Arrivals</TopNavItem>
16
+ * <TopNavItem value="departures">Departures</TopNavItem>
17
+ * </TopNav>
18
+ *
19
+ * {#if selectedValue === 'arrivals'}
20
+ * <p>Arrivals</p>
21
+ * {/if}
22
+ * ```
23
+ */
24
+ declare const TopNav: import("svelte").Component<TopNavProps, {}, "ref" | "selectedValue">;
25
+ type TopNav = ReturnType<typeof TopNav>;
26
+ export default TopNav;
@@ -0,0 +1,18 @@
1
+ import { PREFIX } from '../../internal/constants.js';
2
+ import { createFSContext } from '../../internal/index.js';
3
+ export const COMPONENT_NAME = `${PREFIX}-top-nav`;
4
+ export const [getTopNavContext, setTopNavContext] = createFSContext();
5
+ /** The items a mover lands on, and what the bar is measured against. */
6
+ export const TABSPOT_ITEMS = '.fs-top-nav-item';
7
+ /**
8
+ * Items the cursor passes over instead of landing on: a disabled item answers nothing once reached.
9
+ * A button says so with the attribute of its own; an anchor, which has none, says it to ARIA.
10
+ */
11
+ export const TABSPOT_SKIP = '[disabled], [aria-disabled="true"]';
12
+ /** Reads the top nav context, or fails loudly when an item is rendered outside a `TopNav`. */
13
+ export const requireTopNavContext = () => {
14
+ const context = getTopNavContext();
15
+ if (!context)
16
+ throw new Error(`No TopNavContext found for ${COMPONENT_NAME}.`);
17
+ return context;
18
+ };
@@ -0,0 +1,89 @@
1
+ import type { FSContext } from '../../internal/index.js';
2
+ import type { PolymorphicProps, Sizes } from '../../types/index.js';
3
+ import type { Snippet, Component } from 'svelte';
4
+ import type { HTMLAttributes } from 'svelte/elements';
5
+ /** How the strip and every item in it is painted. */
6
+ export type TopNavAppearance = 'transparent' | 'subtle' | 'subtle-circular' | 'filled-circular';
7
+ /** An item is a button by default, and an anchor when it goes somewhere. */
8
+ export type TopNavItemGenerics = 'button' | 'a';
9
+ export type TopNavItemElementDOMType = {
10
+ button: HTMLButtonElement;
11
+ a: HTMLAnchorElement;
12
+ };
13
+ export type TopNavContext = FSContext<{
14
+ appearance: TopNavAppearance;
15
+ size: Sizes;
16
+ vertical: boolean;
17
+ disabled: boolean;
18
+ selectTabOnFocus: boolean;
19
+ reserveSelectedTabSpace: boolean;
20
+ }, {
21
+ selectedValue: string;
22
+ }, null, {
23
+ selectTab: (event: Event, value: string) => void;
24
+ }>;
25
+ /** @propsmith TopNavProps */
26
+ export type TopNavProps = {
27
+ /** The DOM reference of the strip.
28
+ * @bindable
29
+ */
30
+ ref?: HTMLDivElement;
31
+ /** The value of the selected item.
32
+ * @bindable
33
+ */
34
+ selectedValue?: string;
35
+ /** Fired when an item is selected. */
36
+ onTabSelect?: (event: Event, value: string) => void;
37
+ /** How the strip is painted: `transparent` has no background of its own, `subtle` fills an item
38
+ * while it is engaged, and the two circular appearances trade the moving bar for a pill.
39
+ * @default 'transparent'
40
+ */
41
+ appearance?: TopNavAppearance;
42
+ /** The size of every item of the strip.
43
+ * @default 'medium'
44
+ */
45
+ size?: Sizes;
46
+ /** Arranges the items in a column, with the bar down their leading edge.
47
+ * @default false
48
+ */
49
+ vertical?: boolean;
50
+ /** Disables the user interaction on every item.
51
+ * @default false
52
+ */
53
+ disabled?: boolean;
54
+ /** Selects an item as soon as the focus reaches it, rather than waiting to be asked.
55
+ * @default false
56
+ */
57
+ selectTabOnFocus?: boolean;
58
+ /** A selected item sets its label in semibold, which is wider than the same label at rest. This
59
+ * holds that width from the start, so selecting an item never shifts the ones beside it.
60
+ * @default true
61
+ */
62
+ reserveSelectedTabSpace?: boolean;
63
+ /** Opts the strip out of the tabspot focus management, to wire your own.
64
+ * @default false
65
+ */
66
+ disableTabspot?: boolean;
67
+ } & HTMLAttributes<HTMLDivElement>;
68
+ /** @propsmith TopNavItemProps */
69
+ export type TopNavItemProps<T extends TopNavItemGenerics = 'button'> = {
70
+ /** The DOM reference of the item.
71
+ * @type TopNavItemElementDOMType[T]
72
+ * @bindable
73
+ */
74
+ ref?: TopNavItemElementDOMType[T];
75
+ /** The DOM element to render. An anchor takes the attributes of one, `href` among them, and is
76
+ * what an item that navigates should be.
77
+ * @type 'button' | 'a'
78
+ * @default 'button'
79
+ */
80
+ as?: T;
81
+ /** The value that identifies the item. Defaults to a generated id. */
82
+ value?: string;
83
+ /** The icon to display before the label.
84
+ * @type Snippet | Component
85
+ */
86
+ icon?: Snippet | Component;
87
+ /** Disables the user interaction. */
88
+ disabled?: boolean;
89
+ } & PolymorphicProps<T>;
@@ -0,0 +1 @@
1
+ export {};
@@ -140,7 +140,7 @@
140
140
 
141
141
  /* System */
142
142
  --fs-system-attention: rgb(var(--fs-accent-light-3));
143
- --fs-system-attetion-bg: #f6f6f608;
143
+ --fs-system-attention-bg: #f6f6f608;
144
144
  --fs-system-attention-solid-bg: #2e2e2e;
145
145
 
146
146
  --fs-system-success: #6ccb5f;
@@ -141,7 +141,7 @@
141
141
 
142
142
  /* System */
143
143
  --fs-system-attention: rgb(var(--fs-accent-light-3));
144
- --fs-system-attetion-bg: #f6f6f608;
144
+ --fs-system-attention-bg: #f6f6f608;
145
145
  --fs-system-attention-solid-bg: #2e2e2e;
146
146
 
147
147
  --fs-system-success: #6ccb5f;
@@ -158,7 +158,7 @@
158
158
  /* System */
159
159
  --fs-system-attention: rgb(var(--fs-accent-base));
160
160
  /* 👇 changed from original #f6f6f608 to color mix with 75% white */
161
- --fs-system-attetion-bg: color-mix(in srgb, rgb(var(--fs-accent-base)), white 75%);
161
+ --fs-system-attention-bg: color-mix(in srgb, rgb(var(--fs-accent-base)), white 85%);
162
162
  --fs-system-attention-solid-bg: #f7f7f7;
163
163
 
164
164
  --fs-system-success: #0f7b0f;
package/dist/index.d.ts CHANGED
@@ -3,6 +3,10 @@ export { default as AutoSuggestBoxOption } from './components/auto-suggest-box/o
3
3
  export { default as Avatar } from './components/avatar/avatar.svelte';
4
4
  export { default as Badge } from './components/badge/badge.svelte';
5
5
  export { default as BadgeIcon } from './components/badge/badge-icon.svelte';
6
+ export { default as Breadcrumb } from './components/breadcrumb/breadcrumb.svelte';
7
+ export { default as BreadcrumbItem } from './components/breadcrumb/breadcrumb-item.svelte';
8
+ export { default as BreadcrumbButton } from './components/breadcrumb/breadcrumb-button.svelte';
9
+ export { default as BreadcrumbDivider } from './components/breadcrumb/breadcrumb-divider.svelte';
6
10
  export { default as Button } from './components/button/button.svelte';
7
11
  export { default as SplitButton } from './components/button/split-button.svelte';
8
12
  export { default as Card } from './components/card/card.svelte';
@@ -64,11 +68,15 @@ export { default as TableCell } from './components/table/table-cell.svelte';
64
68
  export { default as TableSelectionCell } from './components/table/table-selection-cell.svelte';
65
69
  export { default as TableCellLayout } from './components/table/table-cell-layout.svelte';
66
70
  export { default as TableCellActions } from './components/table/table-cell-actions.svelte';
71
+ export { default as TabView } from './components/tab-view/tab-view.svelte';
72
+ export { default as TabViewTab } from './components/tab-view/tab-view-tab.svelte';
67
73
  export { default as TextArea } from './components/textarea/textarea.svelte';
68
74
  export { default as TextBox } from './components/text-box/text-box.svelte';
69
75
  export { default as TextBoxButton } from './components/text-box/text-box-button.svelte';
70
76
  export { default as TimePicker } from './components/time-picker/time-picker.svelte';
71
77
  export { default as ToggleSwitch } from './components/toggle-switch/toggle-switch.svelte';
78
+ export { default as TopNav } from './components/top-nav/top-nav.svelte';
79
+ export { default as TopNavItem } from './components/top-nav/top-nav-item.svelte';
72
80
  export { default as Tooltip } from './components/tooltip/tooltip.svelte';
73
81
  export { default as TreeView } from './components/tree-view/tree-view.svelte';
74
82
  export { default as TreeViewItem } from './components/tree-view/tree-view-item.svelte';
package/dist/index.js CHANGED
@@ -9,6 +9,12 @@ export { default as Avatar } from './components/avatar/avatar.svelte';
9
9
  export { default as Badge } from './components/badge/badge.svelte';
10
10
  export { default as BadgeIcon } from './components/badge/badge-icon.svelte';
11
11
  // End Badge Component
12
+ // Start Breadcrumb Component
13
+ export { default as Breadcrumb } from './components/breadcrumb/breadcrumb.svelte';
14
+ export { default as BreadcrumbItem } from './components/breadcrumb/breadcrumb-item.svelte';
15
+ export { default as BreadcrumbButton } from './components/breadcrumb/breadcrumb-button.svelte';
16
+ export { default as BreadcrumbDivider } from './components/breadcrumb/breadcrumb-divider.svelte';
17
+ // End Breadcrumb Component
12
18
  // Start Button Component
13
19
  export { default as Button } from './components/button/button.svelte';
14
20
  export { default as SplitButton } from './components/button/split-button.svelte';
@@ -120,6 +126,10 @@ export { default as TableSelectionCell } from './components/table/table-selectio
120
126
  export { default as TableCellLayout } from './components/table/table-cell-layout.svelte';
121
127
  export { default as TableCellActions } from './components/table/table-cell-actions.svelte';
122
128
  // End Table Component
129
+ // Start TabView Component
130
+ export { default as TabView } from './components/tab-view/tab-view.svelte';
131
+ export { default as TabViewTab } from './components/tab-view/tab-view-tab.svelte';
132
+ // End TabView Component
123
133
  // Start TextArea Component
124
134
  export { default as TextArea } from './components/textarea/textarea.svelte';
125
135
  // End TextArea Component
@@ -133,6 +143,10 @@ export { default as TimePicker } from './components/time-picker/time-picker.svel
133
143
  // Start ToggleSwitch Component
134
144
  export { default as ToggleSwitch } from './components/toggle-switch/toggle-switch.svelte';
135
145
  // End ToggleSwitch Component
146
+ // Start TopNav Component
147
+ export { default as TopNav } from './components/top-nav/top-nav.svelte';
148
+ export { default as TopNavItem } from './components/top-nav/top-nav-item.svelte';
149
+ // End TopNav Component
136
150
  // Start Tooltip Component
137
151
  export { default as Tooltip } from './components/tooltip/tooltip.svelte';
138
152
  // End Tooltip Component
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fluentui-svelte",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Modern Fluent UI 2 Components for Svelte 5",
5
5
  "author": {
6
6
  "name": "Jorge Acosta",