fluent-svelte-extra 1.0.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/.prettierignore +1 -0
- package/.prettierrc +7 -0
- package/CHANGELOG.md +7 -0
- package/LICENSE +21 -0
- package/README.md +33 -0
- package/package.json +83 -0
- package/src/app.html +12 -0
- package/src/global.d.ts +1 -0
- package/src/lib/AutoSuggestBox/AutoSuggestBox.scss +44 -0
- package/src/lib/AutoSuggestBox/AutoSuggestBox.svelte +173 -0
- package/src/lib/Button/Button.scss +94 -0
- package/src/lib/Button/Button.svelte +48 -0
- package/src/lib/CalendarDatePicker/CalendarDatePicker.scss +15 -0
- package/src/lib/CalendarDatePicker/CalendarDatePicker.svelte +86 -0
- package/src/lib/CalendarView/CalendarView.scss +156 -0
- package/src/lib/CalendarView/CalendarView.svelte +753 -0
- package/src/lib/CalendarView/CalendarViewItem.scss +130 -0
- package/src/lib/CalendarView/CalendarViewItem.svelte +33 -0
- package/src/lib/Checkbox/Checkbox.scss +117 -0
- package/src/lib/Checkbox/Checkbox.svelte +81 -0
- package/src/lib/ComboBox/ComboBox.scss +152 -0
- package/src/lib/ComboBox/ComboBox.svelte +360 -0
- package/src/lib/ComboBox/ComboBoxItem.scss +80 -0
- package/src/lib/ComboBox/ComboBoxItem.svelte +30 -0
- package/src/lib/ContentDialog/ContentDialog.scss +68 -0
- package/src/lib/ContentDialog/ContentDialog.svelte +123 -0
- package/src/lib/ContextMenu/ContextMenu.scss +11 -0
- package/src/lib/ContextMenu/ContextMenu.svelte +104 -0
- package/src/lib/Expander/Expander.scss +134 -0
- package/src/lib/Expander/Expander.svelte +123 -0
- package/src/lib/Flipper/Flipper.svelte +49 -0
- package/src/lib/Flyout/FlyoutSurface.scss +14 -0
- package/src/lib/Flyout/FlyoutSurface.svelte +21 -0
- package/src/lib/Flyout/FlyoutWrapper.scss +81 -0
- package/src/lib/Flyout/FlyoutWrapper.svelte +126 -0
- package/src/lib/IconButton/IconButton.scss +31 -0
- package/src/lib/IconButton/IconButton.svelte +49 -0
- package/src/lib/InfoBadge/InfoBadge.scss +39 -0
- package/src/lib/InfoBadge/InfoBadge.svelte +81 -0
- package/src/lib/InfoBar/InfoBar.scss +122 -0
- package/src/lib/InfoBar/InfoBar.svelte +133 -0
- package/src/lib/ListItem/ListItem.scss +74 -0
- package/src/lib/ListItem/ListItem.svelte +88 -0
- package/src/lib/MenuBar/MenuBar.scss +10 -0
- package/src/lib/MenuBar/MenuBar.svelte +49 -0
- package/src/lib/MenuBar/MenuBarItem.scss +38 -0
- package/src/lib/MenuBar/MenuBarItem.svelte +135 -0
- package/src/lib/MenuBar/flyoutState.ts +5 -0
- package/src/lib/MenuFlyout/MenuFlyoutDivider.scss +7 -0
- package/src/lib/MenuFlyout/MenuFlyoutDivider.svelte +14 -0
- package/src/lib/MenuFlyout/MenuFlyoutItem.scss +147 -0
- package/src/lib/MenuFlyout/MenuFlyoutItem.svelte +239 -0
- package/src/lib/MenuFlyout/MenuFlyoutSurface.scss +42 -0
- package/src/lib/MenuFlyout/MenuFlyoutSurface.svelte +28 -0
- package/src/lib/MenuFlyout/MenuFlyoutWrapper.scss +64 -0
- package/src/lib/MenuFlyout/MenuFlyoutWrapper.svelte +114 -0
- package/src/lib/NavigationView/NavigationView.scss +0 -0
- package/src/lib/NavigationView/NavigationView.svelte +82 -0
- package/src/lib/NumberBox/NumberBox.scss +31 -0
- package/src/lib/NumberBox/NumberBox.svelte +267 -0
- package/src/lib/PersonPicture/PersonPicture.scss +35 -0
- package/src/lib/PersonPicture/PersonPicture.svelte +62 -0
- package/src/lib/ProgressBar/ProgressBar.scss +83 -0
- package/src/lib/ProgressBar/ProgressBar.svelte +60 -0
- package/src/lib/ProgressRing/ProgressRing.scss +37 -0
- package/src/lib/ProgressRing/ProgressRing.svelte +73 -0
- package/src/lib/RadioButton/RadioButton.scss +114 -0
- package/src/lib/RadioButton/RadioButton.svelte +67 -0
- package/src/lib/RangeSlider/RangeSlider.svelte +91 -0
- package/src/lib/ScrollView/ScrollView.svelte +9 -0
- package/src/lib/Slider/Slider.scss +263 -0
- package/src/lib/Slider/Slider.svelte +261 -0
- package/src/lib/TextBlock/TextBlock.scss +62 -0
- package/src/lib/TextBlock/TextBlock.svelte +70 -0
- package/src/lib/TextBox/TextBox.scss +108 -0
- package/src/lib/TextBox/TextBox.svelte +225 -0
- package/src/lib/TextBox/TextBoxButton.scss +34 -0
- package/src/lib/TextBox/TextBoxButton.svelte +27 -0
- package/src/lib/ToggleSwitch/ToggleSwitch.scss +118 -0
- package/src/lib/ToggleSwitch/ToggleSwitch.svelte +55 -0
- package/src/lib/Tooltip/TooltipSurface.scss +16 -0
- package/src/lib/Tooltip/TooltipSurface.svelte +27 -0
- package/src/lib/Tooltip/TooltipWrapper.scss +66 -0
- package/src/lib/Tooltip/TooltipWrapper.svelte +117 -0
- package/src/lib/_mixins.scss +130 -0
- package/src/lib/index.ts +33 -0
- package/src/lib/internal.ts +213 -0
- package/src/lib/svelte-jsx.d.ts +14 -0
- package/src/lib/theme.css +414 -0
- package/src/routes/__layout.svelte +48 -0
- package/src/routes/docs/__layout.svelte +122 -0
- package/src/routes/docs/components/button.md +43 -0
- package/src/routes/docs/components/calendarview.md +188 -0
- package/src/routes/docs/components/checkbox.md +87 -0
- package/src/routes/docs/components/contentdialog.md +155 -0
- package/src/routes/docs/components/expander.md +115 -0
- package/src/routes/docs/components/flyout.md +107 -0
- package/src/routes/docs/components/iconbutton.md +39 -0
- package/src/routes/docs/components/infobadge.md +54 -0
- package/src/routes/docs/components/infobar.md +102 -0
- package/src/routes/docs/components/listitem.md +87 -0
- package/src/routes/docs/components/personpicture.md +125 -0
- package/src/routes/docs/components/progressring.md +83 -0
- package/src/routes/docs/components/radiobutton.md +88 -0
- package/src/routes/docs/components/slider.md +165 -0
- package/src/routes/docs/components/textblock.md +46 -0
- package/src/routes/docs/components/textbox.md +124 -0
- package/src/routes/docs/components/toggleswitch.md +73 -0
- package/src/routes/docs/getting-started.md +116 -0
- package/src/routes/docs/index.md +37 -0
- package/src/routes/docs/internals/index.md +0 -0
- package/src/routes/index.svelte +121 -0
- package/src/routes/test/__layout-test.svelte +1 -0
- package/src/routes/test/index.svelte +757 -0
- package/src/routes/test/nav.svelte +7 -0
- package/src/site/data/docs.ts +176 -0
- package/src/site/data/home.ts +12 -0
- package/src/site/lib/APIDocs/APIDocs.svelte +178 -0
- package/src/site/lib/APIDocs/ParsedComponent.d.ts +85 -0
- package/src/site/lib/CopyBox/CopyBox.svelte +23 -0
- package/src/site/lib/Example/Example.scss +33 -0
- package/src/site/lib/Example/Example.svelte +18 -0
- package/src/site/lib/HeroCard/HeroCard.scss +24 -0
- package/src/site/lib/HeroCard/HeroCard.svelte +36 -0
- package/src/site/lib/Metadata/Metadata.svelte +14 -0
- package/src/site/lib/Navbar/Navbar.scss +92 -0
- package/src/site/lib/Navbar/Navbar.svelte +47 -0
- package/src/site/lib/PageSection/PageSection.scss +57 -0
- package/src/site/lib/PageSection/PageSection.svelte +10 -0
- package/src/site/lib/Showcase/Showcase.scss +53 -0
- package/src/site/lib/Showcase/Showcase.svelte +67 -0
- package/src/site/lib/Toc/Toc.scss +18 -0
- package/src/site/lib/Toc/Toc.svelte +59 -0
- package/src/site/lib/TreeView/TreeView.svelte +89 -0
- package/src/site/lib/index.ts +9 -0
- package/src/site/styles/_markdown.scss +260 -0
- package/src/site/styles/_mixins.scss +319 -0
- package/src/site/styles/global.scss +40 -0
- package/src/site/styles/pages/docs.scss +74 -0
- package/src/site/styles/pages/home.scss +134 -0
- package/static/bloom-mica-dark.png +0 -0
- package/static/bloom-mica-light.png +0 -0
- package/static/logo.svg +11 -0
- package/svelte.config.js +57 -0
- package/tsconfig.json +38 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/** Determines a completion amount in percentage. If no value or an invalid value is provided, the bar will be indeterminate. */
|
|
3
|
+
export let value: number = undefined;
|
|
4
|
+
|
|
5
|
+
/** Determines the progress bar's visual state. */
|
|
6
|
+
// export let status: "running" | "paused" | "error" = "running";
|
|
7
|
+
|
|
8
|
+
/** Specifies a custom class name for the bar. */
|
|
9
|
+
let className = "";
|
|
10
|
+
export { className as class };
|
|
11
|
+
|
|
12
|
+
/** Obtains a bound DOM reference to the bar's SVG element. */
|
|
13
|
+
export let element: SVGElement = null;
|
|
14
|
+
|
|
15
|
+
/** Obtains a bound DOM reference to the bar's background rail element. Only available if the bar has a determinate value. */
|
|
16
|
+
export let railElement: SVGRectElement = null;
|
|
17
|
+
|
|
18
|
+
/** Obtains a bound DOM reference to the bar's primary track element. */
|
|
19
|
+
export let trackElement: SVGRectElement = null;
|
|
20
|
+
|
|
21
|
+
/** Obtains a bound DOM reference to the bar's secondary track element. Only available if the bar is indeterminate. */
|
|
22
|
+
export let secondaryTrackElement: SVGRectElement = null;
|
|
23
|
+
</script>
|
|
24
|
+
|
|
25
|
+
<svg
|
|
26
|
+
class="progress-bar {className}"
|
|
27
|
+
role="progressbar"
|
|
28
|
+
width="100%"
|
|
29
|
+
height="3"
|
|
30
|
+
aria-valuemin={value ? 0 : undefined}
|
|
31
|
+
aria-valuemax={value ? 100 : undefined}
|
|
32
|
+
aria-valuenow={value}
|
|
33
|
+
class:indeterminate={!value}
|
|
34
|
+
bind:this={element}
|
|
35
|
+
{...$$restProps}
|
|
36
|
+
>
|
|
37
|
+
{#if value}
|
|
38
|
+
<rect
|
|
39
|
+
bind:this={railElement}
|
|
40
|
+
height="1"
|
|
41
|
+
rx="0.5"
|
|
42
|
+
y="1"
|
|
43
|
+
width="100%"
|
|
44
|
+
class="progress-bar-rail"
|
|
45
|
+
/>
|
|
46
|
+
{:else}
|
|
47
|
+
<rect bind:this={secondaryTrackElement} height="3" ry="3" class="progress-bar-track" />
|
|
48
|
+
{/if}
|
|
49
|
+
<rect
|
|
50
|
+
bind:this={trackElement}
|
|
51
|
+
width={value ? `${value}%` : undefined}
|
|
52
|
+
height="3"
|
|
53
|
+
rx="1.5"
|
|
54
|
+
class="progress-bar-track"
|
|
55
|
+
/>
|
|
56
|
+
</svg>
|
|
57
|
+
|
|
58
|
+
<style lang="scss">
|
|
59
|
+
@use "./ProgressBar";
|
|
60
|
+
</style>
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
@keyframes progress-ring-indeterminate {
|
|
2
|
+
0% {
|
|
3
|
+
stroke-dasharray: 0.01px 43.97px;
|
|
4
|
+
transform: rotate(0);
|
|
5
|
+
}
|
|
6
|
+
50% {
|
|
7
|
+
stroke-dasharray: 21.99px 21.99px;
|
|
8
|
+
transform: rotate(450deg);
|
|
9
|
+
}
|
|
10
|
+
100% {
|
|
11
|
+
stroke-dasharray: 0.01px 43.97px;
|
|
12
|
+
transform: rotate(1080deg);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.progress-ring {
|
|
17
|
+
outline: none;
|
|
18
|
+
min-inline-size: 16px;
|
|
19
|
+
min-block-size: 16px;
|
|
20
|
+
|
|
21
|
+
circle {
|
|
22
|
+
transform: rotate(-90deg);
|
|
23
|
+
transform-origin: 50% 50%;
|
|
24
|
+
transition: all var(--control-normal-duration) linear;
|
|
25
|
+
fill: none;
|
|
26
|
+
stroke: var(--accent-default);
|
|
27
|
+
stroke: {
|
|
28
|
+
width: 1.5;
|
|
29
|
+
linecap: round;
|
|
30
|
+
dasharray: 43.97;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
&.indeterminate circle {
|
|
35
|
+
animation: progress-ring-indeterminate 2s linear infinite;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { createEventForwarder } from "$lib/internal";
|
|
3
|
+
import { createEventDispatcher } from "svelte";
|
|
4
|
+
import { get_current_component } from "svelte/internal";
|
|
5
|
+
|
|
6
|
+
/** Determines a completion amount in percentage (0-100). If no value or an invalid value is provided, the ring will be indeterminate. */
|
|
7
|
+
export let value: number = undefined;
|
|
8
|
+
|
|
9
|
+
/** The size (diameter) of the ring in pixels. */
|
|
10
|
+
export let size = 32;
|
|
11
|
+
|
|
12
|
+
/** Specifies a custom class name for the ring. */
|
|
13
|
+
let className = "";
|
|
14
|
+
export { className as class };
|
|
15
|
+
|
|
16
|
+
/** Obtains a bound DOM reference to the ring's SVG element. */
|
|
17
|
+
export let element: SVGElement = null;
|
|
18
|
+
|
|
19
|
+
/** Obtains a bound DOM reference to the ring's fill circle element. */
|
|
20
|
+
export let circleElement: SVGCircleElement = null;
|
|
21
|
+
|
|
22
|
+
const forwardEvents = createEventForwarder(get_current_component(), ["change"]);
|
|
23
|
+
const dispatch = createEventDispatcher();
|
|
24
|
+
|
|
25
|
+
let circumference: number;
|
|
26
|
+
|
|
27
|
+
$: indeterminate = typeof value === "undefined" || value === null || Number.isNaN(value);
|
|
28
|
+
$: dispatch("change", value);
|
|
29
|
+
$: if (circleElement) circumference = Math.PI * (circleElement.r.baseVal.value * 2);
|
|
30
|
+
$: if (value < 0) {
|
|
31
|
+
value = 0;
|
|
32
|
+
} else if (value > 100) {
|
|
33
|
+
value = 100;
|
|
34
|
+
}
|
|
35
|
+
</script>
|
|
36
|
+
|
|
37
|
+
<!--
|
|
38
|
+
@component
|
|
39
|
+
ProgressRing provides visual feedback to to the user that a long-running operation is underway. It can mean that the user cannot interact with the app when the progress indicator is visible, and can also indicate how long the wait time might be. [Docs](https://fluent-svelte.vercel.app/docs/components/progressring)
|
|
40
|
+
- Usage:
|
|
41
|
+
```tsx
|
|
42
|
+
<ProgressRing />
|
|
43
|
+
<ProgressRing value={50} />
|
|
44
|
+
```
|
|
45
|
+
-->
|
|
46
|
+
<svg
|
|
47
|
+
use:forwardEvents
|
|
48
|
+
bind:this={element}
|
|
49
|
+
tabindex="-1"
|
|
50
|
+
class="progress-ring {className}"
|
|
51
|
+
class:indeterminate
|
|
52
|
+
width={size}
|
|
53
|
+
height={size}
|
|
54
|
+
viewBox="0 0 16 16"
|
|
55
|
+
role={value ? "progressbar" : "status"}
|
|
56
|
+
aria-valuemin={!indeterminate ? 0 : undefined}
|
|
57
|
+
aria-valuemax={!indeterminate ? 100 : undefined}
|
|
58
|
+
aria-valuenow={value}
|
|
59
|
+
{...$$restProps}
|
|
60
|
+
>
|
|
61
|
+
<circle
|
|
62
|
+
bind:this={circleElement}
|
|
63
|
+
cx="50%"
|
|
64
|
+
cy="50%"
|
|
65
|
+
r="7"
|
|
66
|
+
stroke-dasharray="3"
|
|
67
|
+
stroke-dashoffset={((100 - value) / 100) * circumference}
|
|
68
|
+
/>
|
|
69
|
+
</svg>
|
|
70
|
+
|
|
71
|
+
<style lang="scss">
|
|
72
|
+
@use "./ProgressRing";
|
|
73
|
+
</style>
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
@use "../mixins" as *;
|
|
2
|
+
|
|
3
|
+
.radio-button {
|
|
4
|
+
@include flex($inline: true, $align: center, $justify: center);
|
|
5
|
+
@include typography-body;
|
|
6
|
+
|
|
7
|
+
position: relative;
|
|
8
|
+
margin: 0;
|
|
9
|
+
border: 1px solid var(--control-strong-stroke-default);
|
|
10
|
+
border-radius: 20px;
|
|
11
|
+
outline: none;
|
|
12
|
+
background-clip: padding-box;
|
|
13
|
+
background-color: var(--control-alt-fill-secondary);
|
|
14
|
+
appearance: none;
|
|
15
|
+
inline-size: 20px;
|
|
16
|
+
block-size: 20px;
|
|
17
|
+
|
|
18
|
+
&::before {
|
|
19
|
+
content: "";
|
|
20
|
+
inline-size: 4px;
|
|
21
|
+
block-size: 4px;
|
|
22
|
+
visibility: hidden;
|
|
23
|
+
position: absolute;
|
|
24
|
+
border-radius: 12px;
|
|
25
|
+
background-color: var(--text-on-accent-primary);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
&:focus-visible {
|
|
29
|
+
box-shadow: var(--focus-stroke);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
&:hover {
|
|
33
|
+
background-color: var(--control-alt-fill-tertiary);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
&:active {
|
|
37
|
+
border-color: var(--control-strong-stroke-disabled);
|
|
38
|
+
background-color: var(--control-alt-fill-quarternary);
|
|
39
|
+
|
|
40
|
+
&::before {
|
|
41
|
+
transition: var(--control-normal-duration) var(--control-fast-out-slow-in-easing);
|
|
42
|
+
visibility: visible;
|
|
43
|
+
inline-size: 10px;
|
|
44
|
+
block-size: 10px;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
&:disabled {
|
|
49
|
+
border-color: var(--control-strong-stroke-disabled);
|
|
50
|
+
background-color: var(--control-alt-fill-disabled);
|
|
51
|
+
|
|
52
|
+
&::before {
|
|
53
|
+
visibility: hidden;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
+ span {
|
|
57
|
+
color: var(--text-disabled);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
&:checked {
|
|
62
|
+
border: none;
|
|
63
|
+
background-color: var(--accent-default);
|
|
64
|
+
|
|
65
|
+
&::before {
|
|
66
|
+
visibility: visible;
|
|
67
|
+
transition: var(--control-normal-duration) var(--control-fast-out-slow-in-easing);
|
|
68
|
+
box-shadow: 0 0 0 1px var(--control-stroke-default);
|
|
69
|
+
inline-size: 12px;
|
|
70
|
+
block-size: 12px;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
&:hover {
|
|
74
|
+
background-color: var(--accent-secondary);
|
|
75
|
+
|
|
76
|
+
&::before {
|
|
77
|
+
inline-size: 14px;
|
|
78
|
+
block-size: 14px;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
&:active {
|
|
83
|
+
background-color: var(--accent-tertiary);
|
|
84
|
+
|
|
85
|
+
&::before {
|
|
86
|
+
inline-size: 10px;
|
|
87
|
+
block-size: 10px;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
&:disabled {
|
|
92
|
+
background-color: var(--accent-disabled);
|
|
93
|
+
|
|
94
|
+
&::before {
|
|
95
|
+
box-shadow: none;
|
|
96
|
+
inline-size: 12px;
|
|
97
|
+
block-size: 12px;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
&-container {
|
|
103
|
+
@include flex($inline: true, $align: center);
|
|
104
|
+
@include typography-body;
|
|
105
|
+
|
|
106
|
+
color: var(--text-primary);
|
|
107
|
+
user-select: none;
|
|
108
|
+
min-block-size: 32px;
|
|
109
|
+
|
|
110
|
+
> span {
|
|
111
|
+
padding-inline-start: 8px;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { get_current_component } from "svelte/internal";
|
|
3
|
+
import { createEventForwarder } from "$lib/internal";
|
|
4
|
+
|
|
5
|
+
/** Bindable value representing a group of radio inputs that the input will be bound to. */
|
|
6
|
+
export let group: any = undefined;
|
|
7
|
+
|
|
8
|
+
/** Controls whether the radio is checked or not. Only valid is `group` is not bound. */
|
|
9
|
+
export let checked = false;
|
|
10
|
+
|
|
11
|
+
/** Sets the input element's native `value` attribute for usage in forms. */
|
|
12
|
+
export let value: any = undefined;
|
|
13
|
+
|
|
14
|
+
/** Controls whether the radio is intended for user interaction, and styles it accordingly. */
|
|
15
|
+
export let disabled = false;
|
|
16
|
+
|
|
17
|
+
/** Specifies a custom class name for the radio. */
|
|
18
|
+
let className = "";
|
|
19
|
+
export { className as class };
|
|
20
|
+
|
|
21
|
+
/** Obtains a bound DOM reference to the checkbox's <input /> element. */
|
|
22
|
+
export let inputElement: HTMLInputElement = null;
|
|
23
|
+
|
|
24
|
+
/** Obtains a bound DOM reference to the checkbox's outer container element. */
|
|
25
|
+
export let containerElement: HTMLLabelElement = null;
|
|
26
|
+
|
|
27
|
+
const forwardEvents = createEventForwarder(get_current_component());
|
|
28
|
+
</script>
|
|
29
|
+
|
|
30
|
+
<!--
|
|
31
|
+
@component
|
|
32
|
+
Radio buttons, also called option buttons, let users select one option from a collection of two or more mutually exclusive, but related, options. The singular behavior of a RadioButtons group distinguishes it from check boxes, which support multi-selection and deselection, or clearing. [Docs](https://fluent-svelte.vercel.app/docs/components/radiobutton)
|
|
33
|
+
- Usage:
|
|
34
|
+
```tsx
|
|
35
|
+
<script>
|
|
36
|
+
import { RadioButton } from "fluent-svelte";
|
|
37
|
+
|
|
38
|
+
let flavor = "chocolate";
|
|
39
|
+
</script>
|
|
40
|
+
|
|
41
|
+
<RadioButton bind:group={flavor} value="chocolate">Chocolate</RadioButton>
|
|
42
|
+
<RadioButton bind:group={flavor} value="vanilla">Vanilla</RadioButton>
|
|
43
|
+
<RadioButton bind:group={flavor} value="strawberry">Strawberry</RadioButton>
|
|
44
|
+
```
|
|
45
|
+
-->
|
|
46
|
+
<label class="radio-button-container" bind:this={containerElement}>
|
|
47
|
+
<input
|
|
48
|
+
use:forwardEvents
|
|
49
|
+
type="radio"
|
|
50
|
+
class="radio-button {className}"
|
|
51
|
+
bind:group
|
|
52
|
+
bind:this={inputElement}
|
|
53
|
+
{value}
|
|
54
|
+
{checked}
|
|
55
|
+
{disabled}
|
|
56
|
+
{...$$restProps}
|
|
57
|
+
/>
|
|
58
|
+
{#if $$slots.default}
|
|
59
|
+
<span>
|
|
60
|
+
<slot />
|
|
61
|
+
</span>
|
|
62
|
+
{/if}
|
|
63
|
+
</label>
|
|
64
|
+
|
|
65
|
+
<style lang="scss">
|
|
66
|
+
@use "./RadioButton";
|
|
67
|
+
</style>
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import { createEventDispatcher } from 'svelte'
|
|
3
|
+
import Slider from '@bulatdashiev/svelte-slider'
|
|
4
|
+
import { TextBlock } from 'fluent-svelte'
|
|
5
|
+
export let min
|
|
6
|
+
export let max
|
|
7
|
+
export let width;
|
|
8
|
+
let values = min + ',' + max
|
|
9
|
+
let range = [min, max]
|
|
10
|
+
|
|
11
|
+
const dispatch = createEventDispatcher()
|
|
12
|
+
|
|
13
|
+
function handleChange(event) {
|
|
14
|
+
values = event.detail.toString()
|
|
15
|
+
dispatch('change', event.detail)
|
|
16
|
+
}
|
|
17
|
+
</script>
|
|
18
|
+
|
|
19
|
+
<div id="sliderComp" style="width: {width}">
|
|
20
|
+
<Slider
|
|
21
|
+
bind:value={range}
|
|
22
|
+
{min}
|
|
23
|
+
{max}
|
|
24
|
+
range
|
|
25
|
+
on:input={(e) => handleChange(e)}
|
|
26
|
+
>
|
|
27
|
+
<div
|
|
28
|
+
slot="left"
|
|
29
|
+
class="handle"
|
|
30
|
+
on:mouseup={() => dispatch('finish', values.toString())}
|
|
31
|
+
/>
|
|
32
|
+
<div
|
|
33
|
+
slot="right"
|
|
34
|
+
class="handle"
|
|
35
|
+
on:mouseup={() => dispatch('finish', values.toString())}
|
|
36
|
+
/>
|
|
37
|
+
</Slider>
|
|
38
|
+
<div id="vals">
|
|
39
|
+
<TextBlock>{values.split(',')[0]}</TextBlock>
|
|
40
|
+
<TextBlock>{values.split(',')[1]}</TextBlock>
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
|
|
44
|
+
<style>
|
|
45
|
+
#vals {
|
|
46
|
+
display: flex;
|
|
47
|
+
justify-content: space-between;
|
|
48
|
+
align-items: center;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.handle {
|
|
52
|
+
width: 0;
|
|
53
|
+
height: 0;
|
|
54
|
+
display: flex;
|
|
55
|
+
justify-content: center;
|
|
56
|
+
align-items: center;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.handle::after {
|
|
60
|
+
background-color: hsl(199, 99%, 69%); /*mavi*/
|
|
61
|
+
border: solid 5px hsl(0, 0%, 30%);
|
|
62
|
+
content: ' ';
|
|
63
|
+
box-sizing: border-box;
|
|
64
|
+
position: absolute;
|
|
65
|
+
border-radius: 50%;
|
|
66
|
+
width: 20px;
|
|
67
|
+
height: 20px;
|
|
68
|
+
transition: all 0.1s linear !important;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.handle:hover::after {
|
|
72
|
+
border: solid 4px hsl(0, 0%, 30%);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.handle:active::after {
|
|
76
|
+
border: solid 6px hsl(0, 0%, 30%);
|
|
77
|
+
box-shadow: 0 0 10px hsla(0, 0%, 0%, 0.4);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
#sliderComp {
|
|
81
|
+
--thumb-bg: transparent;
|
|
82
|
+
--progress-bg: hsl(199, 99%, 69%);
|
|
83
|
+
--track-bg: hsl(0, 0%, 27%);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
#sliderComp {
|
|
87
|
+
--thumb-bg: transparent;
|
|
88
|
+
--progress-bg: hsl(199, 99%, 69%);
|
|
89
|
+
--track-bg: hsl(0, 0%, 27%);
|
|
90
|
+
}
|
|
91
|
+
</style>
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
@use "../mixins" as *;
|
|
2
|
+
|
|
3
|
+
.slider {
|
|
4
|
+
@include flex($align: center, $justify: center);
|
|
5
|
+
position: relative;
|
|
6
|
+
border-radius: var(--control-corner-radius);
|
|
7
|
+
min-inline-size: 32px;
|
|
8
|
+
min-block-size: 32px;
|
|
9
|
+
|
|
10
|
+
> :global(*) {
|
|
11
|
+
direction: ltr;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
&:focus-visible {
|
|
15
|
+
outline: none;
|
|
16
|
+
box-shadow: var(--focus-stroke);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
&:active,
|
|
20
|
+
&-thumb:active,
|
|
21
|
+
&:focus-visible {
|
|
22
|
+
:global(.slider-tooltip) {
|
|
23
|
+
opacity: 1;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
&.orientation- {
|
|
28
|
+
&horizontal {
|
|
29
|
+
block-size: 32px;
|
|
30
|
+
inline-size: 100%;
|
|
31
|
+
|
|
32
|
+
.slider- {
|
|
33
|
+
&rail {
|
|
34
|
+
justify-content: flex-start;
|
|
35
|
+
inline-size: 100%;
|
|
36
|
+
block-size: 4px;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
&track {
|
|
40
|
+
inline-size: var(--slider-percentage);
|
|
41
|
+
block-size: 100%;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
&thumb {
|
|
45
|
+
inset-inline-start: calc(var(--slider-percentage) + var(--slider-thumb-offset));
|
|
46
|
+
transform: translateX(-50%);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
&tick {
|
|
50
|
+
flex-direction: column;
|
|
51
|
+
height: 100%;
|
|
52
|
+
padding: 6px 0;
|
|
53
|
+
inset-inline-start: var(--slider-tick-percentage);
|
|
54
|
+
|
|
55
|
+
&::before,
|
|
56
|
+
&::after {
|
|
57
|
+
width: 1px;
|
|
58
|
+
height: 4px;
|
|
59
|
+
border-inline-start: 1px solid var(--control-strong-fill-default);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
&.reverse {
|
|
65
|
+
.slider- {
|
|
66
|
+
&rail {
|
|
67
|
+
justify-content: flex-end;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
&thumb {
|
|
71
|
+
inset-inline-start: unset;
|
|
72
|
+
inset-inline-end: calc(
|
|
73
|
+
var(--slider-percentage) + var(--slider-thumb-offset)
|
|
74
|
+
);
|
|
75
|
+
transform: translateX(50%);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
&tick {
|
|
79
|
+
inset-inline-start: unset;
|
|
80
|
+
inset-inline-end: var(--slider-tick-percentage);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
&vertical {
|
|
87
|
+
block-size: 100%;
|
|
88
|
+
inline-size: 32px;
|
|
89
|
+
|
|
90
|
+
.slider- {
|
|
91
|
+
&rail {
|
|
92
|
+
align-items: flex-end;
|
|
93
|
+
block-size: 100%;
|
|
94
|
+
inline-size: 4px;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
&track {
|
|
98
|
+
inline-size: 100%;
|
|
99
|
+
block-size: var(--slider-percentage);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
&thumb {
|
|
103
|
+
inset-block-end: calc(var(--slider-percentage) + var(--slider-thumb-offset));
|
|
104
|
+
transform: translateY(50%);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
&tick {
|
|
108
|
+
width: 100%;
|
|
109
|
+
padding: 0 6px;
|
|
110
|
+
inset-block-end: var(--slider-tick-percentage);
|
|
111
|
+
|
|
112
|
+
&::before,
|
|
113
|
+
&::after {
|
|
114
|
+
width: 4px;
|
|
115
|
+
height: 1px;
|
|
116
|
+
border-block-start: 1px solid var(--control-strong-fill-default);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
&.reverse {
|
|
122
|
+
.slider- {
|
|
123
|
+
&rail {
|
|
124
|
+
align-items: flex-start;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
&thumb {
|
|
128
|
+
inset-block-end: unset;
|
|
129
|
+
inset-block-start: calc(
|
|
130
|
+
var(--slider-percentage) + var(--slider-thumb-offset)
|
|
131
|
+
);
|
|
132
|
+
transform: translateY(-50%);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
&tick {
|
|
136
|
+
inset-block-end: unset;
|
|
137
|
+
inset-block-start: var(--slider-tick-percentage);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
&.disabled {
|
|
145
|
+
.slider- {
|
|
146
|
+
&rail {
|
|
147
|
+
background-color: var(--accent-disabled);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
&track {
|
|
151
|
+
background-color: var(--accent-disabled);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
&thumb::before {
|
|
155
|
+
background-color: var(--accent-disabled);
|
|
156
|
+
transform: none;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
&tick {
|
|
160
|
+
&::before,
|
|
161
|
+
&::after {
|
|
162
|
+
border-color: var(--control-fill-disabled);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
&-rail {
|
|
169
|
+
@include flex($align: center);
|
|
170
|
+
overflow: hidden;
|
|
171
|
+
border-radius: 50px;
|
|
172
|
+
background-color: var(--control-strong-fill-default);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
&-track {
|
|
176
|
+
background-color: var(--accent-default);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
&-tick-bar {
|
|
180
|
+
position: absolute;
|
|
181
|
+
z-index: -1;
|
|
182
|
+
width: 100%;
|
|
183
|
+
height: 100%;
|
|
184
|
+
inset-block-start: 0;
|
|
185
|
+
inset-inline-start: 0;
|
|
186
|
+
|
|
187
|
+
&.placement- {
|
|
188
|
+
&before {
|
|
189
|
+
.slider-tick::after {
|
|
190
|
+
visibility: hidden;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
&after {
|
|
195
|
+
.slider-tick::before {
|
|
196
|
+
visibility: hidden;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
&-tick {
|
|
203
|
+
@include flex($justify: between, $align: center);
|
|
204
|
+
position: absolute;
|
|
205
|
+
box-sizing: border-box;
|
|
206
|
+
|
|
207
|
+
&::before,
|
|
208
|
+
&::after {
|
|
209
|
+
content: "";
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
&-thumb {
|
|
214
|
+
@include flex($justify: center, $align: center);
|
|
215
|
+
position: absolute;
|
|
216
|
+
z-index: 10;
|
|
217
|
+
border-radius: 100%;
|
|
218
|
+
background-color: var(--control-solid-fill-default);
|
|
219
|
+
box-shadow: 0 0 0 1px var(--control-stroke-default);
|
|
220
|
+
inline-size: 20px;
|
|
221
|
+
block-size: 20px;
|
|
222
|
+
|
|
223
|
+
&::before {
|
|
224
|
+
content: "";
|
|
225
|
+
position: absolute;
|
|
226
|
+
border-radius: 100%;
|
|
227
|
+
background-color: var(--accent-default);
|
|
228
|
+
transition: var(--control-fast-duration) var(--control-fast-out-slow-in-easing)
|
|
229
|
+
transform;
|
|
230
|
+
inline-size: 12px;
|
|
231
|
+
block-size: 12px;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
&:hover {
|
|
235
|
+
&::before {
|
|
236
|
+
transform: scale(1.167);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
:global(.slider-tooltip) {
|
|
240
|
+
transition-delay: 1s;
|
|
241
|
+
opacity: 1;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
&:active::before {
|
|
246
|
+
background-color: var(--accent-tertiary);
|
|
247
|
+
transform: scale(0.833);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
:global(.slider-tooltip) {
|
|
252
|
+
z-index: 100;
|
|
253
|
+
opacity: 0;
|
|
254
|
+
transition: var(--control-fast-duration) linear opacity;
|
|
255
|
+
transform: translateX(-50%);
|
|
256
|
+
inset-inline-start: 50%;
|
|
257
|
+
inset-block-end: calc(100% + 18px);
|
|
258
|
+
position: absolute;
|
|
259
|
+
pointer-events: none;
|
|
260
|
+
white-space: nowrap;
|
|
261
|
+
max-inline-size: unset;
|
|
262
|
+
}
|
|
263
|
+
}
|