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,92 @@
|
|
|
1
|
+
@use "src/lib/mixins" as *;
|
|
2
|
+
|
|
3
|
+
.navbar {
|
|
4
|
+
@include flex($align: center, $justify: center);
|
|
5
|
+
position: fixed;
|
|
6
|
+
transform: translateY(0.001px);
|
|
7
|
+
inset-block-start: 0;
|
|
8
|
+
inset-inline-start: 0;
|
|
9
|
+
z-index: 1000;
|
|
10
|
+
inline-size: 100%;
|
|
11
|
+
min-block-size: 56px;
|
|
12
|
+
box-sizing: border-box;
|
|
13
|
+
border-bottom: 1px solid var(--surface-stroke-flyout);
|
|
14
|
+
background-color: var(--layer-background-default);
|
|
15
|
+
background-clip: padding-box;
|
|
16
|
+
backdrop-filter: blur(60px);
|
|
17
|
+
&-inner {
|
|
18
|
+
@include flex($align: center);
|
|
19
|
+
inline-size: 100%;
|
|
20
|
+
max-inline-size: 1440px;
|
|
21
|
+
padding-inline: 18px 12px;
|
|
22
|
+
margin: 0 auto;
|
|
23
|
+
}
|
|
24
|
+
a:focus-visible {
|
|
25
|
+
outline: none;
|
|
26
|
+
box-shadow: var(--focus-stroke);
|
|
27
|
+
}
|
|
28
|
+
nav {
|
|
29
|
+
@include flex($align: center, $justify: end, $gap: 12px);
|
|
30
|
+
flex: 1 1 auto;
|
|
31
|
+
padding: 0 16px;
|
|
32
|
+
a {
|
|
33
|
+
@include flex($align: center, $justify: center);
|
|
34
|
+
border-radius: var(--control-corner-radius);
|
|
35
|
+
position: relative;
|
|
36
|
+
text-decoration: none;
|
|
37
|
+
color: var(--text-primary);
|
|
38
|
+
transition: var(--control-fast-duration) var(--control-fast-out-slow-in-easing);
|
|
39
|
+
padding: 5px 11px;
|
|
40
|
+
&:hover,
|
|
41
|
+
&.selected {
|
|
42
|
+
background-color: var(--subtle-fill-secondary);
|
|
43
|
+
}
|
|
44
|
+
&:active {
|
|
45
|
+
background-color: var(--subtle-fill-tertiary);
|
|
46
|
+
}
|
|
47
|
+
&.selected {
|
|
48
|
+
color: var(--accent-text-primary);
|
|
49
|
+
}
|
|
50
|
+
> :global(svg) {
|
|
51
|
+
@include icon($size: calc(var(--body-font-size) + 2px));
|
|
52
|
+
margin-right: 8px;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.logo,
|
|
59
|
+
.buttons {
|
|
60
|
+
flex: 0 0 auto;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.logo {
|
|
64
|
+
@include flex($justify: center, $align: center);
|
|
65
|
+
text-decoration: none;
|
|
66
|
+
position: relative;
|
|
67
|
+
color: var(--text-primary);
|
|
68
|
+
transition: var(--control-fast-duration) var(--control-fast-out-slow-in-easing);
|
|
69
|
+
font: {
|
|
70
|
+
family: var(--fds-font-family-display);
|
|
71
|
+
size: 20px;
|
|
72
|
+
weight: 600;
|
|
73
|
+
}
|
|
74
|
+
&:hover {
|
|
75
|
+
color: var(--text-secondary);
|
|
76
|
+
}
|
|
77
|
+
> img {
|
|
78
|
+
margin-inline-end: 14px;
|
|
79
|
+
width: auto;
|
|
80
|
+
height: 32px;
|
|
81
|
+
}
|
|
82
|
+
:global(.text-block) {
|
|
83
|
+
color: var(--text-secondary);
|
|
84
|
+
margin-inline-start: 6px;
|
|
85
|
+
position: relative;
|
|
86
|
+
top: 1px;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.buttons {
|
|
91
|
+
@include flex($align: center, $gap: 8px);
|
|
92
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { page } from "$app/stores";
|
|
3
|
+
import { TextBlock } from "$lib";
|
|
4
|
+
|
|
5
|
+
interface Item {
|
|
6
|
+
href: string;
|
|
7
|
+
name: string;
|
|
8
|
+
icon?: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export let items: Item[];
|
|
12
|
+
</script>
|
|
13
|
+
|
|
14
|
+
<header class="navbar">
|
|
15
|
+
<div class="navbar-inner">
|
|
16
|
+
<a class="logo" href="/">
|
|
17
|
+
<img src="/logo.svg" width="32" height="32" alt="Fluent Svelte logo" />
|
|
18
|
+
Fluent Svelte <TextBlock variant="caption">ALPHA</TextBlock>
|
|
19
|
+
</a>
|
|
20
|
+
<nav>
|
|
21
|
+
{#each items as { href, name, icon }}
|
|
22
|
+
<a
|
|
23
|
+
{href}
|
|
24
|
+
sveltekit:prefetch
|
|
25
|
+
class:selected={$page.url.pathname === href ||
|
|
26
|
+
($page.url.pathname.split("/").length > 1 &&
|
|
27
|
+
href.split("/").length > 1 &&
|
|
28
|
+
$page.url.pathname.startsWith(href) &&
|
|
29
|
+
!(href === "" || href === "/")) ||
|
|
30
|
+
(href === "/" && $page.url.pathname === "")}
|
|
31
|
+
>
|
|
32
|
+
{#if icon}
|
|
33
|
+
{@html icon}
|
|
34
|
+
{/if}
|
|
35
|
+
<TextBlock>{name}</TextBlock>
|
|
36
|
+
</a>
|
|
37
|
+
{/each}
|
|
38
|
+
</nav>
|
|
39
|
+
<div class="buttons">
|
|
40
|
+
<slot name="buttons" />
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
</header>
|
|
44
|
+
|
|
45
|
+
<style lang="scss">
|
|
46
|
+
@use "./Navbar";
|
|
47
|
+
</style>
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
@use "src/lib/mixins" as *;
|
|
2
|
+
|
|
3
|
+
.page-section {
|
|
4
|
+
&-inner {
|
|
5
|
+
margin: 0 auto;
|
|
6
|
+
width: 100%;
|
|
7
|
+
max-width: 1440px;
|
|
8
|
+
padding: 72px;
|
|
9
|
+
}
|
|
10
|
+
:global {
|
|
11
|
+
h1,
|
|
12
|
+
h2,
|
|
13
|
+
h3 {
|
|
14
|
+
margin: 0;
|
|
15
|
+
font-family: var(--font-family-display);
|
|
16
|
+
color: var(--text-primary);
|
|
17
|
+
font-weight: 600;
|
|
18
|
+
line-height: normal;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
h1 {
|
|
22
|
+
font-size: 7.2rem;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
h2 {
|
|
26
|
+
font-size: 4.8rem;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
h3 {
|
|
30
|
+
font-size: 3.2rem;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
p:not([class]) {
|
|
34
|
+
max-width: 65ch;
|
|
35
|
+
margin-block: 12px 24px;
|
|
36
|
+
color: var(--text-secondary);
|
|
37
|
+
font: {
|
|
38
|
+
size: 1.6rem;
|
|
39
|
+
weight: 400;
|
|
40
|
+
}
|
|
41
|
+
line-height: 1.65;
|
|
42
|
+
@media (prefers-color-scheme: dark) {
|
|
43
|
+
color: var(--text-tertiary);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
hr:not([class]) {
|
|
48
|
+
margin: 0 0 24px;
|
|
49
|
+
border: none;
|
|
50
|
+
border-block-start: 1px solid var(--divider-default);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.buttons-spacer {
|
|
54
|
+
@include flex($inline: true, $wrap: true, $gap: 8px);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
@use "src/lib/mixins" as *;
|
|
2
|
+
|
|
3
|
+
.component-showcase {
|
|
4
|
+
position: relative;
|
|
5
|
+
overflow: hidden;
|
|
6
|
+
outline: none;
|
|
7
|
+
contain: layout;
|
|
8
|
+
min-block-size: 240px;
|
|
9
|
+
inline-size: 100%;
|
|
10
|
+
border-radius: var(--overlay-corner-radius);
|
|
11
|
+
background-clip: padding-box;
|
|
12
|
+
background-color: var(--card-background-default);
|
|
13
|
+
border: 1px solid var(--card-stroke-default);
|
|
14
|
+
box-shadow: var(--card-shadow);
|
|
15
|
+
padding: 24px;
|
|
16
|
+
z-index: 1;
|
|
17
|
+
&:focus-visible {
|
|
18
|
+
box-shadow: var(--focus-stroke);
|
|
19
|
+
}
|
|
20
|
+
&-grid {
|
|
21
|
+
margin: 24px;
|
|
22
|
+
position: relative;
|
|
23
|
+
display: grid;
|
|
24
|
+
place-items: center;
|
|
25
|
+
grid-gap: 12px;
|
|
26
|
+
}
|
|
27
|
+
&-backdrop,
|
|
28
|
+
&-inner {
|
|
29
|
+
@include flex($align: center, $justify: center);
|
|
30
|
+
position: absolute;
|
|
31
|
+
inset-inline-start: 0;
|
|
32
|
+
inset-block-start: 0;
|
|
33
|
+
inline-size: 100%;
|
|
34
|
+
block-size: 100%;
|
|
35
|
+
}
|
|
36
|
+
&-backdrop {
|
|
37
|
+
z-index: -1;
|
|
38
|
+
transform: translate(-50%, -50%);
|
|
39
|
+
block-size: 600%;
|
|
40
|
+
inline-size: 600%;
|
|
41
|
+
}
|
|
42
|
+
&-buttons {
|
|
43
|
+
position: absolute;
|
|
44
|
+
inset-inline-end: 12px;
|
|
45
|
+
inset-block-end: 12px;
|
|
46
|
+
}
|
|
47
|
+
:global {
|
|
48
|
+
.info-bar {
|
|
49
|
+
inline-size: 100%;
|
|
50
|
+
margin-block-end: 0;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { IconButton, Tooltip } from "$lib";
|
|
3
|
+
|
|
4
|
+
import _panzoom from "panzoom";
|
|
5
|
+
import type { PanZoomOptions } from "panzoom";
|
|
6
|
+
|
|
7
|
+
import Edit from "@fluentui/svg-icons/icons/edit_16_regular.svg?raw";
|
|
8
|
+
|
|
9
|
+
export let columns = 1;
|
|
10
|
+
|
|
11
|
+
export let columnWidth = "1fr";
|
|
12
|
+
|
|
13
|
+
export let repl = "";
|
|
14
|
+
|
|
15
|
+
let className = "";
|
|
16
|
+
export { className as class };
|
|
17
|
+
|
|
18
|
+
function panzoom(node: HTMLElement, options?: PanZoomOptions) {
|
|
19
|
+
_panzoom(node, options);
|
|
20
|
+
}
|
|
21
|
+
</script>
|
|
22
|
+
|
|
23
|
+
<div class="component-showcase {className}" {...$$restProps}>
|
|
24
|
+
<div use:panzoom={{ minZoom: 0.5, maxZoom: 10, bounds: true }} class="component-showcase-inner">
|
|
25
|
+
<div
|
|
26
|
+
class="component-showcase-grid"
|
|
27
|
+
style="grid-template-columns: {`${columnWidth} `.repeat(columns)}"
|
|
28
|
+
>
|
|
29
|
+
<slot />
|
|
30
|
+
</div>
|
|
31
|
+
<svg class="component-showcase-backdrop">
|
|
32
|
+
<pattern
|
|
33
|
+
id="pattern-14333"
|
|
34
|
+
x="5.800038310074086"
|
|
35
|
+
y="6.229276141719765"
|
|
36
|
+
width="11.17258097342026"
|
|
37
|
+
height="11.17258097342026"
|
|
38
|
+
patternUnits="userSpaceOnUse"
|
|
39
|
+
>
|
|
40
|
+
<circle
|
|
41
|
+
cx="0.2979354926245403"
|
|
42
|
+
cy="0.2979354926245403"
|
|
43
|
+
r="0.2979354926245403"
|
|
44
|
+
fill="var(--fds-text-disabled)"
|
|
45
|
+
/>
|
|
46
|
+
</pattern>
|
|
47
|
+
<rect x="0" y="0" width="100%" height="100%" fill="url(#pattern-14333)" />
|
|
48
|
+
</svg>
|
|
49
|
+
</div>
|
|
50
|
+
<div class="component-showcase-buttons">
|
|
51
|
+
{#if repl}
|
|
52
|
+
<Tooltip text="Edit in Svelte REPL" offset={8} placement="left">
|
|
53
|
+
<IconButton
|
|
54
|
+
href="https://svelte.dev/repl/{repl}"
|
|
55
|
+
target="blank"
|
|
56
|
+
rel="noreferrer noopener"
|
|
57
|
+
>
|
|
58
|
+
{@html Edit}
|
|
59
|
+
</IconButton>
|
|
60
|
+
</Tooltip>
|
|
61
|
+
{/if}
|
|
62
|
+
</div>
|
|
63
|
+
</div>
|
|
64
|
+
|
|
65
|
+
<style lang="scss">
|
|
66
|
+
@use "./Showcase";
|
|
67
|
+
</style>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
.table-of-contents {
|
|
2
|
+
li {
|
|
3
|
+
list-style-type: none;
|
|
4
|
+
margin: 0;
|
|
5
|
+
padding: 0;
|
|
6
|
+
margin-left: calc(12px * var(--depth));
|
|
7
|
+
}
|
|
8
|
+
:global(.list-item) {
|
|
9
|
+
margin-inline: 0;
|
|
10
|
+
inline-size: 100%;
|
|
11
|
+
block-size: 28px;
|
|
12
|
+
:global(.text-block) {
|
|
13
|
+
white-space: nowrap;
|
|
14
|
+
overflow: hidden;
|
|
15
|
+
text-overflow: ellipsis;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { onMount } from "svelte";
|
|
3
|
+
|
|
4
|
+
import { ListItem } from "$lib";
|
|
5
|
+
import { page } from "$app/stores";
|
|
6
|
+
|
|
7
|
+
export let target: HTMLElement;
|
|
8
|
+
|
|
9
|
+
let headings: HTMLHeadingElement[] = [];
|
|
10
|
+
let activeHeading: HTMLHeadingElement;
|
|
11
|
+
|
|
12
|
+
$: $page,
|
|
13
|
+
(headings =
|
|
14
|
+
target &&
|
|
15
|
+
Array.from(target.querySelectorAll("h1, h2, h3")).filter(
|
|
16
|
+
node => !node.closest(".component-showcase-grid, .markdown-body > table")
|
|
17
|
+
));
|
|
18
|
+
|
|
19
|
+
function handleScroll() {
|
|
20
|
+
if (headings)
|
|
21
|
+
activeHeading = [...headings]
|
|
22
|
+
.reverse()
|
|
23
|
+
.find(heading => heading.offsetTop <= window.scrollY);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function handleClick(event, index: number, id: string) {
|
|
27
|
+
if (id) history.pushState({}, "", `#${id}`);
|
|
28
|
+
|
|
29
|
+
window.scrollTo({
|
|
30
|
+
top: headings[index].offsetTop + 1,
|
|
31
|
+
behavior: "smooth"
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
onMount(() => {
|
|
36
|
+
window.addEventListener("scroll", handleScroll);
|
|
37
|
+
});
|
|
38
|
+
</script>
|
|
39
|
+
|
|
40
|
+
{#if target}
|
|
41
|
+
{#key $page}
|
|
42
|
+
<nav class="table-of-contents">
|
|
43
|
+
{#each headings as { tagName, innerText, id }, i}
|
|
44
|
+
<li style="--fds-depth: {+tagName[1] - 1};">
|
|
45
|
+
<ListItem
|
|
46
|
+
on:click={e => handleClick(e, i, id)}
|
|
47
|
+
selected={activeHeading === headings[i]}
|
|
48
|
+
>
|
|
49
|
+
{innerText}
|
|
50
|
+
</ListItem>
|
|
51
|
+
</li>
|
|
52
|
+
{/each}
|
|
53
|
+
</nav>
|
|
54
|
+
{/key}
|
|
55
|
+
{/if}
|
|
56
|
+
|
|
57
|
+
<style lang="scss">
|
|
58
|
+
@use "./Toc";
|
|
59
|
+
</style>
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { onMount } from "svelte";
|
|
3
|
+
import { page } from "$app/stores";
|
|
4
|
+
|
|
5
|
+
import { ListItem, TextBlock } from "$lib";
|
|
6
|
+
|
|
7
|
+
export let tree = [];
|
|
8
|
+
export let __depth = 0;
|
|
9
|
+
|
|
10
|
+
let treeViewState: any;
|
|
11
|
+
|
|
12
|
+
onMount(() => {
|
|
13
|
+
// Check localStorage for an existing treeViewState
|
|
14
|
+
// If none exists, use a blank object string
|
|
15
|
+
treeViewState = JSON.parse(localStorage.getItem("treeViewState") ?? "{}");
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
// Utility function for converting regular names to kebab case
|
|
19
|
+
const id = (s: string) => s.toLowerCase().split(" ").join("-");
|
|
20
|
+
|
|
21
|
+
// Function for expanding/collapsing docs categories
|
|
22
|
+
function toggleExpansion(event: MouseEvent, name: string) {
|
|
23
|
+
event.stopPropagation();
|
|
24
|
+
|
|
25
|
+
// Modify treeViewState to have the opposite of the previous entry for the category
|
|
26
|
+
treeViewState[id(name)] = !treeViewState[id(name)];
|
|
27
|
+
|
|
28
|
+
// Update value in localStorage for persistence
|
|
29
|
+
localStorage.setItem("treeViewState", JSON.stringify(treeViewState));
|
|
30
|
+
}
|
|
31
|
+
</script>
|
|
32
|
+
|
|
33
|
+
<div class="tree-view">
|
|
34
|
+
{#each tree as { name, path, type, pages, icon }}
|
|
35
|
+
{#if type === "category"}
|
|
36
|
+
{#if __depth > 0}
|
|
37
|
+
<div class="subtree" class:expanded={treeViewState?.[id(name)]}>
|
|
38
|
+
<ListItem
|
|
39
|
+
type="expander"
|
|
40
|
+
expanded={treeViewState?.[id(name)]}
|
|
41
|
+
on:click={e => toggleExpansion(e, name)}
|
|
42
|
+
>
|
|
43
|
+
<svelte:fragment slot="icon">
|
|
44
|
+
{@html icon || ""}
|
|
45
|
+
</svelte:fragment>
|
|
46
|
+
{name}
|
|
47
|
+
</ListItem>
|
|
48
|
+
{#if treeViewState?.[id(name)]}
|
|
49
|
+
<div class="subtree-items">
|
|
50
|
+
<svelte:self __depth={__depth + 1} tree={pages} />
|
|
51
|
+
</div>
|
|
52
|
+
{/if}
|
|
53
|
+
</div>
|
|
54
|
+
{:else}
|
|
55
|
+
<TextBlock class="category-header" variant="bodyStrong">{name}</TextBlock>
|
|
56
|
+
<svelte:self __depth={__depth + 1} tree={pages} />
|
|
57
|
+
{/if}
|
|
58
|
+
{:else}
|
|
59
|
+
<ListItem
|
|
60
|
+
on:click
|
|
61
|
+
type="navigation"
|
|
62
|
+
selected={`/docs${path}` === $page.url.pathname}
|
|
63
|
+
href="/docs{path}"
|
|
64
|
+
>
|
|
65
|
+
<svelte:fragment slot="icon">
|
|
66
|
+
{@html icon || ""}
|
|
67
|
+
</svelte:fragment>
|
|
68
|
+
{name}
|
|
69
|
+
</ListItem>
|
|
70
|
+
{/if}
|
|
71
|
+
{/each}
|
|
72
|
+
</div>
|
|
73
|
+
|
|
74
|
+
<style lang="scss">
|
|
75
|
+
// Add padding to subtrees for the nesting effect
|
|
76
|
+
.subtree-items {
|
|
77
|
+
padding-inline-start: 24px;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.tree-view {
|
|
81
|
+
max-block-size: 100%;
|
|
82
|
+
min-block-size: 0;
|
|
83
|
+
:global(.category-header) {
|
|
84
|
+
inline-size: 100%;
|
|
85
|
+
padding-inline: 16px;
|
|
86
|
+
padding-block: 10px;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
</style>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { default as CopyBox } from "./CopyBox/CopyBox.svelte";
|
|
2
|
+
export { default as HeroCard } from "./HeroCard/HeroCard.svelte";
|
|
3
|
+
export { default as Metadata } from "./Metadata/Metadata.svelte";
|
|
4
|
+
export { default as PageSection } from "./PageSection/PageSection.svelte";
|
|
5
|
+
export { default as Navbar } from "./Navbar/Navbar.svelte";
|
|
6
|
+
export { default as TreeView } from "./TreeView/TreeView.svelte";
|
|
7
|
+
export { default as Showcase } from "./Showcase/Showcase.svelte";
|
|
8
|
+
export { default as Toc } from "./Toc/Toc.svelte";
|
|
9
|
+
export { default as APIDocs } from "./APIDocs/APIDocs.svelte";
|