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,67 @@
|
|
|
1
|
+
# Label
|
|
2
|
+
|
|
3
|
+
A Label provides an accessible caption for a form control. It supports different sizes and weights, can be marked as required or disabled, and can be positioned relative to the control it wraps.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
|
|
7
|
+
```svelte
|
|
8
|
+
<script>
|
|
9
|
+
import { Label } from 'fluentui-svelte';
|
|
10
|
+
</script>
|
|
11
|
+
|
|
12
|
+
<Label label="Email" />
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Examples
|
|
16
|
+
|
|
17
|
+
### Size
|
|
18
|
+
|
|
19
|
+
Use the `size` prop to control the label text size.
|
|
20
|
+
|
|
21
|
+
```svelte
|
|
22
|
+
<Label size="small" label="Small" />
|
|
23
|
+
<Label size="medium" label="Medium" />
|
|
24
|
+
<Label size="large" label="Large" />
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Weight
|
|
28
|
+
|
|
29
|
+
Use the `weight` prop to switch between a regular and a semibold label.
|
|
30
|
+
|
|
31
|
+
```svelte
|
|
32
|
+
<Label weight="regular" label="Regular" />
|
|
33
|
+
<Label weight="semibold" label="Semibold" />
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Label Position
|
|
37
|
+
|
|
38
|
+
Use the `labelPosition` prop to place the label text relative to the wrapped control.
|
|
39
|
+
|
|
40
|
+
```svelte
|
|
41
|
+
<Label labelPosition="before" label="Before" />
|
|
42
|
+
<Label labelPosition="after" label="After" />
|
|
43
|
+
<Label labelPosition="above" label="Above" />
|
|
44
|
+
<Label labelPosition="below" label="Below" />
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Required
|
|
48
|
+
|
|
49
|
+
Pass a `required` object to mark the label as required and render a required indicator.
|
|
50
|
+
|
|
51
|
+
```svelte
|
|
52
|
+
<Label label="Email" required={{ message: 'Required field' }} />
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Component Props
|
|
56
|
+
|
|
57
|
+
| Name | Type | Description |
|
|
58
|
+
| --------------- | ------------------------------------------- | ------------------------------------------------------------------------------- |
|
|
59
|
+
| `label` | `string` | The text content of the label. Default: `'Label Element'`. |
|
|
60
|
+
| `size` | `'small' \| 'medium' \| 'large'` | The size of the label text. Default: `'medium'`. |
|
|
61
|
+
| `weight` | `'regular' \| 'semibold'` | The font weight of the label. Default: `'regular'`. |
|
|
62
|
+
| `labelPosition` | `'before' \| 'after' \| 'above' \| 'below'` | Position of the label text relative to the wrapped content. Default: `'after'`. |
|
|
63
|
+
| `required` | `{ message?: string; abbr?: string }` | Marks the label as required and renders a required indicator (default `*`). |
|
|
64
|
+
| `disabled` | `boolean` | Renders the label in a disabled style and disables pointer events. |
|
|
65
|
+
| `class` | `string` | Additional classes applied to the label element. |
|
|
66
|
+
| `ref` | bindable `HTMLLabelElement` | The DOM reference of the label element. |
|
|
67
|
+
| `children` | `Snippet` | The content wrapped by the label (typically a form control). |
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { LabelProps } from './types.js';
|
|
3
|
+
|
|
4
|
+
let {
|
|
5
|
+
ref = $bindable(),
|
|
6
|
+
class: classes,
|
|
7
|
+
disabled,
|
|
8
|
+
required,
|
|
9
|
+
size = 'medium',
|
|
10
|
+
weight = 'regular',
|
|
11
|
+
label = 'Label Element',
|
|
12
|
+
labelPosition = 'after',
|
|
13
|
+
children,
|
|
14
|
+
...attributes
|
|
15
|
+
}: LabelProps = $props();
|
|
16
|
+
</script>
|
|
17
|
+
|
|
18
|
+
<label
|
|
19
|
+
class={[
|
|
20
|
+
'fs-label',
|
|
21
|
+
`size-${size}`,
|
|
22
|
+
`weight-${weight}`,
|
|
23
|
+
classes,
|
|
24
|
+
{ disabled, required },
|
|
25
|
+
(labelPosition === 'above' || labelPosition === 'below') && 'column'
|
|
26
|
+
]}
|
|
27
|
+
bind:this={ref}
|
|
28
|
+
{...attributes}
|
|
29
|
+
>
|
|
30
|
+
{#if labelPosition === 'before' || labelPosition === 'above'}
|
|
31
|
+
<span>
|
|
32
|
+
{label}
|
|
33
|
+
{#if required}
|
|
34
|
+
<abbr title={required.message || label}>{required.abbr ?? '*'}</abbr>
|
|
35
|
+
{/if}
|
|
36
|
+
</span>
|
|
37
|
+
{/if}
|
|
38
|
+
|
|
39
|
+
{@render children?.()}
|
|
40
|
+
|
|
41
|
+
{#if labelPosition === 'after' || labelPosition === 'below'}
|
|
42
|
+
<span>
|
|
43
|
+
{label}
|
|
44
|
+
{#if required}
|
|
45
|
+
<abbr title={required.message || label}>{required.abbr ?? '*'}</abbr>
|
|
46
|
+
{/if}
|
|
47
|
+
</span>
|
|
48
|
+
{/if}
|
|
49
|
+
</label>
|
|
50
|
+
|
|
51
|
+
<style>
|
|
52
|
+
.fs-label {
|
|
53
|
+
display: inline-flex;
|
|
54
|
+
align-items: center;
|
|
55
|
+
user-select: none;
|
|
56
|
+
&.column {
|
|
57
|
+
flex-direction: column;
|
|
58
|
+
align-items: flex-start;
|
|
59
|
+
}
|
|
60
|
+
&.size-small {
|
|
61
|
+
font-size: var(--fs-caption-font-size);
|
|
62
|
+
letter-spacing: 0.04em;
|
|
63
|
+
gap: 0.25rem;
|
|
64
|
+
}
|
|
65
|
+
&.size-medium {
|
|
66
|
+
font-size: var(--fs-body-font-size);
|
|
67
|
+
gap: 0.375rem;
|
|
68
|
+
}
|
|
69
|
+
&.size-large {
|
|
70
|
+
font-size: var(--fs-subtitle2-font-size);
|
|
71
|
+
gap: 0.5rem;
|
|
72
|
+
}
|
|
73
|
+
&.weight-regular {
|
|
74
|
+
font-weight: 400;
|
|
75
|
+
}
|
|
76
|
+
&.weight-semibold {
|
|
77
|
+
font-weight: 600;
|
|
78
|
+
}
|
|
79
|
+
&.disabled {
|
|
80
|
+
color: var(--fs-text-disabled);
|
|
81
|
+
pointer-events: none;
|
|
82
|
+
}
|
|
83
|
+
&.required {
|
|
84
|
+
& abbr {
|
|
85
|
+
text-decoration: none;
|
|
86
|
+
color: var(--fs-system-critical);
|
|
87
|
+
font-size: inherit;
|
|
88
|
+
line-height: 0;
|
|
89
|
+
}
|
|
90
|
+
&.disabled abbr {
|
|
91
|
+
color: var(--fs-text-disabled);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
</style>
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { HTMLLabelAttributes } from 'svelte/elements';
|
|
2
|
+
import type { Sizes } from '../../types/index.js';
|
|
3
|
+
/** @propsmith LabelProps */
|
|
4
|
+
export type LabelProps = {
|
|
5
|
+
/** The text of the label. Falls back to the rendered children.
|
|
6
|
+
* @default 'Label Element'
|
|
7
|
+
*/
|
|
8
|
+
label?: string;
|
|
9
|
+
/** The size of the label text.
|
|
10
|
+
* @default 'medium'
|
|
11
|
+
*/
|
|
12
|
+
size?: Sizes;
|
|
13
|
+
/** The weight of the label text.
|
|
14
|
+
* @default 'regular'
|
|
15
|
+
*/
|
|
16
|
+
weight?: 'regular' | 'semibold';
|
|
17
|
+
/** Where the label sits relative to the field it describes.
|
|
18
|
+
* @default 'after'
|
|
19
|
+
*/
|
|
20
|
+
labelPosition?: 'before' | 'after' | 'above' | 'below';
|
|
21
|
+
/** Marks the field as required, and describes why through the given message. */
|
|
22
|
+
required?: {
|
|
23
|
+
abbr?: string;
|
|
24
|
+
message: string;
|
|
25
|
+
};
|
|
26
|
+
/** Renders the label as disabled, to match the field it describes. */
|
|
27
|
+
disabled?: boolean;
|
|
28
|
+
/** The DOM reference of the label element.
|
|
29
|
+
* @bindable
|
|
30
|
+
*/
|
|
31
|
+
ref?: HTMLLabelElement;
|
|
32
|
+
} & HTMLLabelAttributes;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# ListView
|
|
2
|
+
|
|
3
|
+
The ListView is a component for rendering a set of vertically stacked items. These items can be focusable, selectable, have one primary action and one or more secondary actions, and support keyboard navigation and accessibility features.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
|
|
7
|
+
```svelte
|
|
8
|
+
<script>
|
|
9
|
+
import { ListView, ListViewItem } from 'fluentui-svelte';
|
|
10
|
+
let list = ['A', 'B', 'C'];
|
|
11
|
+
let selected = ['A'];
|
|
12
|
+
</script>
|
|
13
|
+
|
|
14
|
+
<ListView selectedItems={selected}>
|
|
15
|
+
{#each list as item (item)}
|
|
16
|
+
<ListViewItem value={item}>{item}</ListViewItem>
|
|
17
|
+
{/each}
|
|
18
|
+
</ListView>
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## ListView API
|
|
22
|
+
|
|
23
|
+
> **Best practices:** Please check the Fluent UI React List best practices for guidance.
|
|
24
|
+
|
|
25
|
+
### As
|
|
26
|
+
|
|
27
|
+
You can control which tag the ListView component should use: ul, ol, or div. Default: ul.
|
|
28
|
+
|
|
29
|
+
### Shape
|
|
30
|
+
|
|
31
|
+
Instead of setting this on every ListViewItem, you can set it here and every item will inherit it. Possible values are rounded, circular, or square. Default: rounded.
|
|
32
|
+
|
|
33
|
+
### Navigation Mode
|
|
34
|
+
|
|
35
|
+
This option allows you to set keyboard navigation based on your needs. For view-only data, you do not need to set this unless the items perform some action. If your items have multiple actionable elements within the ListViewItem, like buttons or menus, you can set this to composite.
|
|
36
|
+
|
|
37
|
+
## Examples
|
|
38
|
+
|
|
39
|
+
### Value
|
|
40
|
+
|
|
41
|
+
Sets the value of the current item. You must set this when using the ListView selection system or if items change dynamically.
|
|
42
|
+
|
|
43
|
+
### On Action
|
|
44
|
+
|
|
45
|
+
This event is triggered when clicking or tapping the element. It executes the primary action and, if the role is not row, it also executes the selection itself.
|
|
46
|
+
|
|
47
|
+
### Selection Mode
|
|
48
|
+
|
|
49
|
+
Use `selectionMode` (`single`, `multiselect`, or `extended`) to control how items are selected.
|
|
50
|
+
|
|
51
|
+
```svelte
|
|
52
|
+
<ListView selectionMode="multiselect" selectedItems={['Apple']}>
|
|
53
|
+
{#each ['Apple', 'Banana', 'Cherry'] as item (item)}
|
|
54
|
+
<ListViewItem value={item}>{item}</ListViewItem>
|
|
55
|
+
{/each}
|
|
56
|
+
</ListView>
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Checkmark
|
|
60
|
+
|
|
61
|
+
Add and configure a checkbox for the element. You can use the same props for the Checkbox component. Note: every actionable element inside this ListViewItem must call e.stopPropagation().
|
|
62
|
+
|
|
63
|
+
```svelte
|
|
64
|
+
<ListViewItem
|
|
65
|
+
value="card"
|
|
66
|
+
role="row"
|
|
67
|
+
checkmark={{ style: 'position: absolute; top: 10px; left: 10px; z-index: 10;' }}
|
|
68
|
+
onAction={(e, d) => alert('Triggered Primary Action')}
|
|
69
|
+
>
|
|
70
|
+
<div style="...">
|
|
71
|
+
Card Content Inside ListItem
|
|
72
|
+
<Button
|
|
73
|
+
onclick={(e) => {
|
|
74
|
+
e.stopPropagation();
|
|
75
|
+
alert('Installing');
|
|
76
|
+
}}>Install</Button
|
|
77
|
+
>
|
|
78
|
+
</div>
|
|
79
|
+
</ListViewItem>
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## ListView Props
|
|
83
|
+
|
|
84
|
+
| Name | Type | Description |
|
|
85
|
+
| ------------------- | --------------------------- | --------------------------------------------------------------------------------------------- |
|
|
86
|
+
| `as` | `string` | The HTML tag to use for the list container. Possible values: ul, ol, div. |
|
|
87
|
+
| `selectionMode` | `string` | Selection mode for the list. Possible values: single, multiselect, extended. |
|
|
88
|
+
| `navigationMode` | `string` | Navigation mode for keyboard navigation. Possible values: items, composite. |
|
|
89
|
+
| `selectedItems` | `string[]` | The currently selected item values. |
|
|
90
|
+
| `shape` | `string` | The shape of the list items. Possible values: rounded, circular, square. |
|
|
91
|
+
| `onSelectionChange` | `(Event, string[]) => void` | Callback fired when the selection changes. |
|
|
92
|
+
| `element` | Dynamic | Reference to the list DOM element. Depends on the selected as value. |
|
|
93
|
+
| `children` | Only `ListViewItem` | The ListViewItem children of the list. |
|
|
94
|
+
| Element Attributes | Dynamic | Based on the chosen as value, you will have autocomplete for all HTML attributes of that tag. |
|
|
95
|
+
|
|
96
|
+
## ListViewItem Props
|
|
97
|
+
|
|
98
|
+
| Name | Type | Description |
|
|
99
|
+
| ------------------ | ------------------------------ | --------------------------------------------------------------------------------------------- |
|
|
100
|
+
| `as` | `string` | The HTML tag to use for the item container. Possible values: li, a, div. |
|
|
101
|
+
| `active` | `boolean` | Whether the item is currently active or selected. |
|
|
102
|
+
| `shape` | `string` | The shape of the item. Possible values: rounded, circular, square. |
|
|
103
|
+
| `value` | `string` | The value of the item used for selection. |
|
|
104
|
+
| `onAction` | `(MouseEvent, string) => void` | Callback fired when the item is activated. |
|
|
105
|
+
| `onFocus` | `(Event, string) => void` | Callback fired when the item receives focus. |
|
|
106
|
+
| `role` | `string` | ARIA role for the item. Possible values: treeitem, menuitem, option, row. |
|
|
107
|
+
| `disabled` | `boolean` | Whether the item is disabled. |
|
|
108
|
+
| `checkmark` | `object` | Props for the checkmark or checkbox. |
|
|
109
|
+
| `children` | `Snippet` | The content of the item. |
|
|
110
|
+
| Element Attributes | Dynamic | Based on the chosen as value, you will have autocomplete for all HTML attributes of that tag. |
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
<script lang="ts" generics="T extends 'li' | 'a' | 'div' = 'li'">
|
|
2
|
+
import { onMount } from 'svelte';
|
|
3
|
+
import { COMPONENT_NAME, getListViewContext, ITEM_TAG } from './utils.js';
|
|
4
|
+
import Checkbox from '../checkbox/checkbox.svelte';
|
|
5
|
+
import { invokeHandlers, isObjectEmpty } from '../../internal/index.js';
|
|
6
|
+
import type { ListViewItemProps, ListViewItemDOM } from './types.js';
|
|
7
|
+
import { getTabspotAttributes } from 'tabspot';
|
|
8
|
+
|
|
9
|
+
const ID = $props.id();
|
|
10
|
+
|
|
11
|
+
let {
|
|
12
|
+
as = 'li' as T,
|
|
13
|
+
ref = $bindable(),
|
|
14
|
+
shape,
|
|
15
|
+
disabled,
|
|
16
|
+
active: _active,
|
|
17
|
+
role: _role,
|
|
18
|
+
checkmark,
|
|
19
|
+
value = COMPONENT_NAME + '-' + ID,
|
|
20
|
+
class: classes,
|
|
21
|
+
onAction,
|
|
22
|
+
onfocus,
|
|
23
|
+
children,
|
|
24
|
+
...attributes
|
|
25
|
+
}: ListViewItemProps<T> = $props();
|
|
26
|
+
|
|
27
|
+
// svelte-ignore state_referenced_locally
|
|
28
|
+
if (!ITEM_TAG.includes(as)) throw new Error(`Invalid tag: ${as}. Must be one of ${ITEM_TAG.join(', ')}`);
|
|
29
|
+
|
|
30
|
+
const CONTEXT = getListViewContext();
|
|
31
|
+
|
|
32
|
+
if (!CONTEXT) throw new Error('ListViewItem must be used within a ListView');
|
|
33
|
+
|
|
34
|
+
const { shape: _shape } = CONTEXT.config;
|
|
35
|
+
const { state: _state } = CONTEXT;
|
|
36
|
+
const { handleSelection, registerItem, unregisterItem, getChildrenRole } = CONTEXT.methods;
|
|
37
|
+
const role = $derived(_role || getChildrenRole(as));
|
|
38
|
+
|
|
39
|
+
let active = $derived(_state.selectedItems.includes(value));
|
|
40
|
+
|
|
41
|
+
// A row is a level of its own: right enters the cells, left comes back out. Anything
|
|
42
|
+
// that is not a row navigates as a plain item of the list above it.
|
|
43
|
+
const tabspotAttrs = $derived(
|
|
44
|
+
(role === 'row'
|
|
45
|
+
? getTabspotAttributes({
|
|
46
|
+
mover: {
|
|
47
|
+
axis: 'vertical'
|
|
48
|
+
},
|
|
49
|
+
grouper: { enterDirection: 'right', exitDirection: 'left' }
|
|
50
|
+
})
|
|
51
|
+
: null) ?? {}
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
onMount(() => {
|
|
55
|
+
registerItem?.(ID, value as string, !!disabled);
|
|
56
|
+
return () => unregisterItem?.(ID);
|
|
57
|
+
});
|
|
58
|
+
</script>
|
|
59
|
+
|
|
60
|
+
<svelte:element
|
|
61
|
+
this={as}
|
|
62
|
+
{role}
|
|
63
|
+
data-value={value}
|
|
64
|
+
aria-selected={role === 'option' ? active : undefined}
|
|
65
|
+
aria-disabled={disabled || undefined}
|
|
66
|
+
bind:this={ref as ListViewItemDOM[T]}
|
|
67
|
+
class={[
|
|
68
|
+
'fs-list-view-item',
|
|
69
|
+
shape ? shape : _shape,
|
|
70
|
+
classes,
|
|
71
|
+
{ disabled },
|
|
72
|
+
role !== 'row' && 'indicator',
|
|
73
|
+
(_active || active) && 'active',
|
|
74
|
+
!disabled && role && 'interactive'
|
|
75
|
+
]}
|
|
76
|
+
{...tabspotAttrs}
|
|
77
|
+
onfocus={(e: FocusEvent) => invokeHandlers(e, disabled, [(event: FocusEvent) => onfocus?.(event, value || '')])}
|
|
78
|
+
onclick={(e: MouseEvent) => {
|
|
79
|
+
invokeHandlers(
|
|
80
|
+
e,
|
|
81
|
+
disabled,
|
|
82
|
+
role !== 'row'
|
|
83
|
+
? [
|
|
84
|
+
(event: MouseEvent) => handleSelection?.(event, value),
|
|
85
|
+
(event: MouseEvent) => onAction?.(event, value || '')
|
|
86
|
+
]
|
|
87
|
+
: [(event: MouseEvent) => onAction?.(event, value || '')]
|
|
88
|
+
);
|
|
89
|
+
}}
|
|
90
|
+
{...attributes}
|
|
91
|
+
>
|
|
92
|
+
{#if checkmark}
|
|
93
|
+
<Checkbox {disabled} bind:checked={active} tabindex={-1} {...!isObjectEmpty(checkmark) ? checkmark : {}} />
|
|
94
|
+
{/if}
|
|
95
|
+
{@render children?.()}
|
|
96
|
+
</svelte:element>
|
|
97
|
+
|
|
98
|
+
<style>
|
|
99
|
+
.fs-list-view-item {
|
|
100
|
+
border-radius: var(--fs-control-border-radius);
|
|
101
|
+
font-size: var(--fs-body2-font-size);
|
|
102
|
+
color: var(--fs-text-primary);
|
|
103
|
+
border: none;
|
|
104
|
+
padding: 0.275rem 0.713rem 0.4rem 0.713rem;
|
|
105
|
+
position: relative;
|
|
106
|
+
outline: none;
|
|
107
|
+
display: flex;
|
|
108
|
+
gap: 0.5rem;
|
|
109
|
+
align-items: center;
|
|
110
|
+
text-decoration: none;
|
|
111
|
+
user-select: none;
|
|
112
|
+
&[disabled],
|
|
113
|
+
&[aria-disabled='true'] {
|
|
114
|
+
cursor: not-allowed;
|
|
115
|
+
background: var(--fs-subtle-fill-transparent) !important;
|
|
116
|
+
color: var(--fs-text-disabled) !important;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
&.interactive {
|
|
120
|
+
cursor: pointer;
|
|
121
|
+
&:focus-visible,
|
|
122
|
+
&[data-active='true'] {
|
|
123
|
+
outline: 0.125rem var(--fs-focus-stroke-outer) solid;
|
|
124
|
+
outline-offset: 0.063rem;
|
|
125
|
+
}
|
|
126
|
+
&.indicator {
|
|
127
|
+
&:hover {
|
|
128
|
+
background: var(--fs-subtle-fill-secondary);
|
|
129
|
+
}
|
|
130
|
+
&:active {
|
|
131
|
+
color: var(--fs-text-tertiary);
|
|
132
|
+
background: var(--fs-subtle-fill-tertiary);
|
|
133
|
+
}
|
|
134
|
+
&::after {
|
|
135
|
+
content: '';
|
|
136
|
+
position: absolute;
|
|
137
|
+
top: 50%;
|
|
138
|
+
left: 0;
|
|
139
|
+
width: 3px;
|
|
140
|
+
height: 0;
|
|
141
|
+
transform: translateY(-50%);
|
|
142
|
+
background-color: var(--fs-accent-fill-default);
|
|
143
|
+
border-radius: var(--fs-control-border-radius);
|
|
144
|
+
pointer-events: none;
|
|
145
|
+
}
|
|
146
|
+
&.active {
|
|
147
|
+
background: var(--fs-subtle-fill-tertiary);
|
|
148
|
+
&::after {
|
|
149
|
+
transition: height var(--fs-normal-duration) var(--fs-fast-dismiss);
|
|
150
|
+
height: 50%;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
&.disabled {
|
|
156
|
+
cursor: not-allowed;
|
|
157
|
+
color: var(--fs-text-disabled) !important;
|
|
158
|
+
}
|
|
159
|
+
&.rounded,
|
|
160
|
+
&.rounded:after {
|
|
161
|
+
border-radius: var(--fs-control-border-radius);
|
|
162
|
+
}
|
|
163
|
+
&.circular,
|
|
164
|
+
&.circular:after {
|
|
165
|
+
border-radius: 50vw;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
</style>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ListViewItemProps } from './types.ts';
|
|
2
|
+
declare function $$render<T extends 'li' | 'a' | 'div' = 'li'>(): {
|
|
3
|
+
props: ListViewItemProps<T>;
|
|
4
|
+
exports: {};
|
|
5
|
+
bindings: "ref";
|
|
6
|
+
slots: {};
|
|
7
|
+
events: {};
|
|
8
|
+
};
|
|
9
|
+
declare class __sveltets_Render<T extends 'li' | 'a' | 'div' = 'li'> {
|
|
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 'li' | 'a' | 'div' = 'li'>(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 'li' | 'a' | 'div' = 'li'>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
|
|
21
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
22
|
+
}
|
|
23
|
+
declare const ListViewItem: $$IsomorphicComponent;
|
|
24
|
+
type ListViewItem<T extends 'li' | 'a' | 'div' = 'li'> = InstanceType<typeof ListViewItem<T>>;
|
|
25
|
+
export default ListViewItem;
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
<script lang="ts" generics="Tag extends 'ul' | 'ol' | 'div' = 'ul'">
|
|
2
|
+
import type { ListViewContext, ListViewProps, ListViewDOM } from './types.js';
|
|
3
|
+
import { getRole, TAG, setListViewContext } from './utils.js';
|
|
4
|
+
import { getTabspotAttributes } from 'tabspot';
|
|
5
|
+
|
|
6
|
+
let {
|
|
7
|
+
as = 'ul' as Tag,
|
|
8
|
+
ref = $bindable(),
|
|
9
|
+
selectionMode = 'none',
|
|
10
|
+
navigationMode = 'items',
|
|
11
|
+
shape = 'rounded',
|
|
12
|
+
selectedItems = $bindable([]),
|
|
13
|
+
onSelectionChange,
|
|
14
|
+
disableTabspot = false,
|
|
15
|
+
children,
|
|
16
|
+
...attributes
|
|
17
|
+
}: ListViewProps<Tag> = $props();
|
|
18
|
+
|
|
19
|
+
// svelte-ignore state_referenced_locally
|
|
20
|
+
if (!TAG.includes(as)) throw new Error(`Invalid tag: ${as}. Must be one of ${TAG.join(', ')}`);
|
|
21
|
+
|
|
22
|
+
const ROLE = $derived(getRole(as, selectionMode, navigationMode));
|
|
23
|
+
|
|
24
|
+
const MULTISELECTABLE = $derived(selectionMode === 'multiselect' || selectionMode === 'extended');
|
|
25
|
+
|
|
26
|
+
const tabspotAttrs = $derived(
|
|
27
|
+
!disableTabspot &&
|
|
28
|
+
getTabspotAttributes({
|
|
29
|
+
root: {
|
|
30
|
+
manageSpecialKeys: true
|
|
31
|
+
},
|
|
32
|
+
mover: {
|
|
33
|
+
axis: 'vertical',
|
|
34
|
+
items: '.fs-list-view-item'
|
|
35
|
+
}
|
|
36
|
+
})
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
let anchorIndex: number | null = $state(null);
|
|
40
|
+
|
|
41
|
+
let items: {
|
|
42
|
+
id: string;
|
|
43
|
+
value: string;
|
|
44
|
+
disabled: boolean;
|
|
45
|
+
}[] = $state([]);
|
|
46
|
+
|
|
47
|
+
const config: ListViewContext['config'] = $derived({
|
|
48
|
+
shape
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
const _state: ListViewContext['state'] = {
|
|
52
|
+
get selectedItems() {
|
|
53
|
+
return selectedItems;
|
|
54
|
+
},
|
|
55
|
+
set selectedItems(v) {
|
|
56
|
+
selectedItems = v;
|
|
57
|
+
},
|
|
58
|
+
get anchorIndex() {
|
|
59
|
+
return anchorIndex;
|
|
60
|
+
},
|
|
61
|
+
set anchorIndex(v) {
|
|
62
|
+
anchorIndex = v;
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
let methods: ListViewContext['methods'] = {
|
|
67
|
+
handleSelection: (e: MouseEvent, value: string) => {
|
|
68
|
+
if (selectionMode === 'none') return;
|
|
69
|
+
|
|
70
|
+
const itemIndex = items.findIndex((item) => item.value === value);
|
|
71
|
+
if (itemIndex === -1) return;
|
|
72
|
+
|
|
73
|
+
const item = items[itemIndex];
|
|
74
|
+
if (item.disabled) return;
|
|
75
|
+
|
|
76
|
+
if (selectionMode === 'extended' && e.shiftKey && anchorIndex !== null) {
|
|
77
|
+
const start = Math.min(anchorIndex, itemIndex);
|
|
78
|
+
const end = Math.max(anchorIndex, itemIndex);
|
|
79
|
+
const rangeValues = items
|
|
80
|
+
.slice(start, end + 1)
|
|
81
|
+
.filter((i) => !i.disabled)
|
|
82
|
+
.map((i) => i.value);
|
|
83
|
+
const newSelectedItems = Array.from(new Set([..._state.selectedItems, ...rangeValues]));
|
|
84
|
+
_state.selectedItems = newSelectedItems;
|
|
85
|
+
} else if (MULTISELECTABLE && (e.ctrlKey || e.metaKey)) {
|
|
86
|
+
_state.selectedItems = _state.selectedItems.includes(value)
|
|
87
|
+
? _state.selectedItems.filter((v) => v !== value)
|
|
88
|
+
: [..._state.selectedItems, value];
|
|
89
|
+
_state.anchorIndex = itemIndex;
|
|
90
|
+
} else {
|
|
91
|
+
_state.selectedItems = [value];
|
|
92
|
+
_state.anchorIndex = itemIndex;
|
|
93
|
+
}
|
|
94
|
+
onSelectionChange?.(e, _state.selectedItems);
|
|
95
|
+
},
|
|
96
|
+
registerItem: (id: string, value: string, disabled: boolean) => {
|
|
97
|
+
items.push({ id, value, disabled });
|
|
98
|
+
},
|
|
99
|
+
unregisterItem: (id: string) => {
|
|
100
|
+
items = items.filter((item) => item.id !== id);
|
|
101
|
+
},
|
|
102
|
+
getChildrenRole: (_tag: 'li' | 'a' | 'div') => {
|
|
103
|
+
if (ROLE === 'grid') return 'row';
|
|
104
|
+
if (ROLE === 'listbox') return 'option';
|
|
105
|
+
return _tag !== 'li' ? 'listitem' : undefined;
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
// svelte-ignore state_referenced_locally
|
|
110
|
+
const CONTEXT: ListViewContext = { config, state: _state, events: null, methods };
|
|
111
|
+
|
|
112
|
+
setListViewContext(CONTEXT);
|
|
113
|
+
</script>
|
|
114
|
+
|
|
115
|
+
<svelte:element
|
|
116
|
+
this={as}
|
|
117
|
+
bind:this={ref as ListViewDOM[Tag]}
|
|
118
|
+
class="fs-list-view"
|
|
119
|
+
role={ROLE}
|
|
120
|
+
aria-multiselectable={MULTISELECTABLE || undefined}
|
|
121
|
+
{...tabspotAttrs}
|
|
122
|
+
{...attributes}
|
|
123
|
+
>
|
|
124
|
+
{@render children?.()}
|
|
125
|
+
</svelte:element>
|
|
126
|
+
|
|
127
|
+
<style>
|
|
128
|
+
.fs-list-view {
|
|
129
|
+
list-style: none;
|
|
130
|
+
padding: 0;
|
|
131
|
+
margin: 0;
|
|
132
|
+
width: 100%;
|
|
133
|
+
& :global(.fs-list-view-item) {
|
|
134
|
+
margin: 0.3rem 0;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
</style>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ListViewProps } from './types.ts';
|
|
2
|
+
declare function $$render<Tag extends 'ul' | 'ol' | 'div' = 'ul'>(): {
|
|
3
|
+
props: ListViewProps<Tag>;
|
|
4
|
+
exports: {};
|
|
5
|
+
bindings: "ref" | "selectedItems";
|
|
6
|
+
slots: {};
|
|
7
|
+
events: {};
|
|
8
|
+
};
|
|
9
|
+
declare class __sveltets_Render<Tag extends 'ul' | 'ol' | 'div' = 'ul'> {
|
|
10
|
+
props(): ReturnType<typeof $$render<Tag>>['props'];
|
|
11
|
+
events(): ReturnType<typeof $$render<Tag>>['events'];
|
|
12
|
+
slots(): ReturnType<typeof $$render<Tag>>['slots'];
|
|
13
|
+
bindings(): "ref" | "selectedItems";
|
|
14
|
+
exports(): {};
|
|
15
|
+
}
|
|
16
|
+
interface $$IsomorphicComponent {
|
|
17
|
+
new <Tag extends 'ul' | 'ol' | 'div' = 'ul'>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<Tag>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<Tag>['props']>, ReturnType<__sveltets_Render<Tag>['events']>, ReturnType<__sveltets_Render<Tag>['slots']>> & {
|
|
18
|
+
$$bindings?: ReturnType<__sveltets_Render<Tag>['bindings']>;
|
|
19
|
+
} & ReturnType<__sveltets_Render<Tag>['exports']>;
|
|
20
|
+
<Tag extends 'ul' | 'ol' | 'div' = 'ul'>(internal: unknown, props: ReturnType<__sveltets_Render<Tag>['props']> & {}): ReturnType<__sveltets_Render<Tag>['exports']>;
|
|
21
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
22
|
+
}
|
|
23
|
+
declare const ListView: $$IsomorphicComponent;
|
|
24
|
+
type ListView<Tag extends 'ul' | 'ol' | 'div' = 'ul'> = InstanceType<typeof ListView<Tag>>;
|
|
25
|
+
export default ListView;
|