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