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