@onsvisual/svelte-components 1.0.40 → 1.0.42
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/README.md +24 -24
- package/dist/css/main.css +513 -513
- package/dist/datavis/BarChart/BarChart.stories.svelte +84 -84
- package/dist/datavis/BarChart/docs/component.md +19 -19
- package/dist/datavis/Chart/Chart.stories.svelte +128 -128
- package/dist/datavis/Chart/docs/component.md +31 -31
- package/dist/datavis/Chart/docs/example.md +28 -28
- package/dist/datavis/ColumnChart/ColumnChart.stories.svelte +84 -84
- package/dist/datavis/ColumnChart/docs/component.md +19 -19
- package/dist/datavis/DataCard/DataCard.stories.svelte +45 -45
- package/dist/datavis/DataCard/DataCard.svelte +70 -70
- package/dist/datavis/DataCard/Sparkline.svelte +117 -117
- package/dist/datavis/DataCard/docs/component.md +20 -20
- package/dist/datavis/DataCard/docs/example.md +25 -25
- package/dist/datavis/DotPlotChart/DotPlotChart.stories.svelte +40 -40
- package/dist/datavis/DotPlotChart/docs/component.md +19 -19
- package/dist/datavis/LineChart/LineChart.stories.svelte +64 -64
- package/dist/datavis/LineChart/docs/component.md +31 -31
- package/dist/datavis/ScatterChart/ScatterChart.stories.svelte +55 -55
- package/dist/datavis/ScatterChart/docs/component.md +53 -53
- package/dist/datavis/Table/Table.stories.svelte +48 -48
- package/dist/datavis/Table/Table.svelte +161 -161
- package/dist/datavis/Table/docs/component.md +20 -20
- package/dist/datavis/demo-data/data-scatter.js +40 -40
- package/dist/datavis/demo-data/data.js +18 -18
- package/dist/datavis/intro.mdx +21 -21
- package/dist/decorators/Blockquote/Blockquote.stories.svelte +25 -25
- package/dist/decorators/Blockquote/Blockquote.svelte +27 -27
- package/dist/decorators/Blockquote/docs/component.md +10 -10
- package/dist/decorators/Divider/Divider.stories.svelte +29 -29
- package/dist/decorators/Divider/Divider.svelte +52 -52
- package/dist/decorators/Divider/docs/component.md +12 -12
- package/dist/decorators/Em/Em.stories.svelte +30 -30
- package/dist/decorators/Em/Em.svelte +58 -58
- package/dist/decorators/Em/docs/component.md +12 -12
- package/dist/decorators/Icon/Icon.stories.svelte +27 -27
- package/dist/decorators/Icon/Icon.svelte +93 -93
- package/dist/decorators/Icon/docs/component.md +10 -10
- package/dist/decorators/Indent/Indent.stories.svelte +22 -22
- package/dist/decorators/Indent/Indent.svelte +3 -3
- package/dist/decorators/Indent/docs/component.md +10 -10
- package/dist/index.js +86 -86
- package/dist/inputs/Button/Button.stories.svelte +70 -70
- package/dist/inputs/Button/Button.svelte +152 -152
- package/dist/inputs/Button/Button.svelte.d.ts +2 -2
- package/dist/inputs/Button/docs/component.md +17 -17
- package/dist/inputs/ButtonGroup/ButtonGroup.stories.svelte +40 -40
- package/dist/inputs/ButtonGroup/ButtonGroup.svelte +57 -57
- package/dist/inputs/ButtonGroup/ButtonGroupItem.svelte +101 -101
- package/dist/inputs/ButtonGroup/docs/component.md +23 -23
- package/dist/inputs/Checkbox/Checkbox.stories.svelte +34 -34
- package/dist/inputs/Checkbox/Checkbox.svelte +180 -180
- package/dist/inputs/Checkbox/docs/component.md +14 -14
- package/dist/inputs/Checkboxes/Checkboxes.stories.svelte +34 -34
- package/dist/inputs/Checkboxes/Checkboxes.svelte +62 -62
- package/dist/inputs/Checkboxes/docs/component.md +20 -20
- package/dist/inputs/Checkboxes/docs/example.md +16 -16
- package/dist/inputs/Dropdown/Dropdown.stories.svelte +54 -54
- package/dist/inputs/Dropdown/Dropdown.svelte +66 -66
- package/dist/inputs/Dropdown/docs/component.md +22 -22
- package/dist/inputs/ErrorPanel/ErrorPanel.stories.svelte +25 -25
- package/dist/inputs/ErrorPanel/ErrorPanel.svelte +24 -24
- package/dist/inputs/ErrorPanel/docs/component.md +14 -14
- package/dist/inputs/ErrorSummary/ErrorSummary.stories.svelte +34 -34
- package/dist/inputs/ErrorSummary/ErrorSummary.svelte +47 -47
- package/dist/inputs/ErrorSummary/docs/component.md +17 -17
- package/dist/inputs/ErrorSummary/docs/example.md +12 -12
- package/dist/inputs/Input/Input.stories.svelte +73 -73
- package/dist/inputs/Input/Input.svelte +151 -151
- package/dist/inputs/Input/docs/component.md +16 -16
- package/dist/inputs/Radios/Radio.svelte +90 -90
- package/dist/inputs/Radios/Radios.stories.svelte +51 -51
- package/dist/inputs/Radios/Radios.svelte +62 -62
- package/dist/inputs/Radios/docs/component.md +24 -24
- package/dist/inputs/Radios/docs/example.md +21 -21
- package/dist/inputs/Select/Select.stories.svelte +63 -63
- package/dist/inputs/Select/Select.svelte +326 -326
- package/dist/inputs/Select/docs/component.md +27 -27
- package/dist/inputs/Textarea/Textarea.stories.svelte +40 -40
- package/dist/inputs/Textarea/Textarea.svelte +113 -113
- package/dist/inputs/Textarea/docs/component.md +16 -16
- package/dist/inputs/Toolbar/HelpModal.svelte +234 -234
- package/dist/inputs/Toolbar/ToolControl.svelte +23 -23
- package/dist/inputs/Toolbar/ToolControls.svelte +9 -9
- package/dist/inputs/Toolbar/Toolbar.stories.svelte +148 -148
- package/dist/inputs/Toolbar/Toolbar.svelte +70 -70
- package/dist/inputs/Toolbar/ToolbarButton.svelte +184 -184
- package/dist/inputs/Toolbar/ToolbarDivider.svelte +29 -29
- package/dist/inputs/Toolbar/ToolbarIcon.svelte +106 -106
- package/dist/inputs/Toolbar/ToolbarsContainer.svelte +69 -69
- package/dist/inputs/Toolbar/docs/component.md +101 -101
- package/dist/intro.mdx +66 -66
- package/dist/js/menuOptions.js +14 -14
- package/dist/js/utils.js +133 -133
- package/dist/js/withParams.js +43 -43
- package/dist/layout/Accordion/Accordion.stories.svelte +30 -30
- package/dist/layout/Accordion/Accordion.svelte +55 -55
- package/dist/layout/Accordion/AccordionItem.svelte +51 -51
- package/dist/layout/Accordion/accordion.js +64 -64
- package/dist/layout/Accordion/details.js +83 -83
- package/dist/layout/Accordion/docs/component.md +19 -19
- package/dist/layout/AnalyticsBanner/AnalyticsBanner.stories.svelte +16 -16
- package/dist/layout/AnalyticsBanner/AnalyticsBanner.svelte +314 -314
- package/dist/layout/AnalyticsBanner/docs/component.md +44 -44
- package/dist/layout/BackLink/BackLink.stories.svelte +16 -16
- package/dist/layout/BackLink/BackLink.svelte +30 -30
- package/dist/layout/BackLink/docs/component.md +12 -12
- package/dist/layout/Breadcrumb/Breadcrumb.stories.svelte +31 -31
- package/dist/layout/Breadcrumb/Breadcrumb.svelte +69 -69
- package/dist/layout/Breadcrumb/docs/component.md +15 -15
- package/dist/layout/Card/Card.stories.svelte +39 -39
- package/dist/layout/Card/Card.svelte +127 -127
- package/dist/layout/Card/docs/component.md +14 -14
- package/dist/layout/Card/docs/eg-images.md +27 -27
- package/dist/layout/Card/docs/eg-links.md +12 -12
- package/dist/layout/Card/docs/eg-spans.md +12 -12
- package/dist/layout/Contents/Contents.stories.svelte +27 -27
- package/dist/layout/Contents/Contents.svelte +51 -51
- package/dist/layout/Contents/docs/component.md +18 -18
- package/dist/layout/DescriptionList/DescriptionList.stories.svelte +22 -22
- package/dist/layout/DescriptionList/DescriptionList.svelte +59 -59
- package/dist/layout/DescriptionList/docs/component.md +18 -18
- package/dist/layout/Details/Details.stories.svelte +32 -32
- package/dist/layout/Details/Details.svelte +75 -75
- package/dist/layout/Details/docs/component.md +14 -14
- package/dist/layout/DocumentList/Document.svelte +103 -103
- package/dist/layout/DocumentList/DocumentList.stories.svelte +88 -88
- package/dist/layout/DocumentList/DocumentList.svelte +33 -33
- package/dist/layout/DocumentList/docs/component.md +28 -28
- package/dist/layout/DocumentList/docs/example.md +23 -23
- package/dist/layout/ErrorPage/ErrorPage.stories.svelte +18 -18
- package/dist/layout/ErrorPage/ErrorPage.svelte +48 -48
- package/dist/layout/ErrorPage/docs/component.md +13 -13
- package/dist/layout/Footer/Footer.stories.svelte +24 -24
- package/dist/layout/Footer/Footer.svelte +366 -366
- package/dist/layout/Footer/docs/component.md +10 -10
- package/dist/layout/Grid/Grid.stories.svelte +50 -50
- package/dist/layout/Grid/Grid.svelte +117 -117
- package/dist/layout/Grid/GridCell.svelte +65 -65
- package/dist/layout/Grid/docs/component.md +14 -14
- package/dist/layout/Header/Header.stories.svelte +26 -26
- package/dist/layout/Header/Header.svelte +875 -875
- package/dist/layout/Header/docs/component.md +11 -11
- package/dist/layout/Hero/Hero.stories.svelte +79 -79
- package/dist/layout/Hero/Hero.svelte +364 -364
- package/dist/layout/Hero/docs/component.md +14 -14
- package/dist/layout/Highlight/Highlight.stories.svelte +29 -29
- package/dist/layout/Highlight/Highlight.svelte +77 -77
- package/dist/layout/Highlight/docs/component.md +12 -12
- package/dist/layout/Image/Image.stories.svelte +23 -23
- package/dist/layout/Image/Image.svelte +29 -29
- package/dist/layout/Image/docs/component.md +15 -15
- package/dist/layout/List/Li.svelte +3 -3
- package/dist/layout/List/List.stories.svelte +40 -40
- package/dist/layout/List/List.svelte +46 -46
- package/dist/layout/List/docs/component.md +14 -14
- package/dist/layout/List/docs/example.md +12 -12
- package/dist/layout/NavSections/NavSection.svelte +90 -90
- package/dist/layout/NavSections/NavSections.stories.svelte +51 -51
- package/dist/layout/NavSections/NavSections.svelte +160 -160
- package/dist/layout/NavSections/docs/component.md +25 -25
- package/dist/layout/Notice/Notice.stories.svelte +61 -61
- package/dist/layout/Notice/Notice.svelte +56 -56
- package/dist/layout/Notice/docs/component.md +14 -14
- package/dist/layout/PhaseBanner/PhaseBanner.stories.svelte +24 -24
- package/dist/layout/PhaseBanner/PhaseBanner.svelte +66 -66
- package/dist/layout/PhaseBanner/docs/component.md +14 -14
- package/dist/layout/RelatedContent/RelatedContent.stories.svelte +36 -36
- package/dist/layout/RelatedContent/RelatedContent.svelte +54 -54
- package/dist/layout/RelatedContent/docs/component.md +16 -16
- package/dist/layout/Scroller/Scroller.stories.svelte +60 -60
- package/dist/layout/Scroller/Scroller.svelte +368 -368
- package/dist/layout/Scroller/ScrollerSection.svelte +70 -70
- package/dist/layout/Scroller/docs/component.md +39 -39
- package/dist/layout/Section/Section.stories.svelte +33 -33
- package/dist/layout/Section/Section.svelte +60 -60
- package/dist/layout/Section/docs/component.md +12 -12
- package/dist/layout/ShareButtons/ShareButtons.stories.svelte +20 -20
- package/dist/layout/ShareButtons/ShareButtons.svelte +131 -131
- package/dist/layout/ShareButtons/docs/component.md +14 -14
- package/dist/layout/SkipLink/SkipLink.stories.svelte +16 -16
- package/dist/layout/SkipLink/SkipLink.svelte +9 -9
- package/dist/layout/SkipLink/docs/component.md +11 -11
- package/dist/layout/Summary/Summary.stories.svelte +21 -21
- package/dist/layout/Summary/Summary.svelte +60 -60
- package/dist/layout/Summary/docs/component.md +17 -17
- package/dist/layout/Tabs/Tab.svelte +53 -53
- package/dist/layout/Tabs/Tabs.stories.svelte +29 -29
- package/dist/layout/Tabs/Tabs.svelte +89 -89
- package/dist/layout/Tabs/docs/component.md +16 -16
- package/dist/layout/Tabs/tabs.js +302 -302
- package/dist/layout/Timeline/Timeline.stories.svelte +44 -44
- package/dist/layout/Timeline/Timeline.svelte +17 -17
- package/dist/layout/Timeline/TimelineItem.svelte +14 -14
- package/dist/layout/Timeline/docs/component.md +27 -27
- package/dist/layout/Timeline/docs/example.md +20 -20
- package/dist/templates/EmbedArticle/EmbedArticle.stories.svelte +72 -72
- package/dist/templates/EmbedArticle/docs/component.md +56 -56
- package/dist/templates/FeatureArticle/FeatureArticle.stories.svelte +150 -150
- package/dist/templates/FeatureArticle/docs/component.md +125 -125
- package/dist/templates/StandardArticle/StandardArticle.stories.svelte +86 -86
- package/dist/templates/StandardArticle/docs/component.md +76 -76
- package/dist/templates/intro.mdx +18 -18
- package/dist/wrappers/Container/Container.stories.svelte +38 -38
- package/dist/wrappers/Container/Container.svelte +77 -77
- package/dist/wrappers/Container/docs/component.md +12 -12
- package/dist/wrappers/Embed/Embed.stories.svelte +24 -24
- package/dist/wrappers/Embed/Embed.svelte +44 -44
- package/dist/wrappers/Embed/docs/component.md +15 -15
- package/dist/wrappers/LazyLoad/LazyLoad.stories.svelte +37 -37
- package/dist/wrappers/LazyLoad/LazyLoad.svelte +50 -50
- package/dist/wrappers/LazyLoad/docs/component.md +29 -29
- package/dist/wrappers/Main/Main.stories.svelte +24 -24
- package/dist/wrappers/Main/Main.svelte +11 -11
- package/dist/wrappers/Main/docs/component.md +16 -16
- package/dist/wrappers/Observe/Observe.stories.svelte +29 -29
- package/dist/wrappers/Observe/Observe.svelte +35 -35
- package/dist/wrappers/Observe/docs/component.md +22 -22
- package/dist/wrappers/Theme/Theme.stories.svelte +70 -70
- package/dist/wrappers/Theme/Theme.svelte +76 -76
- package/dist/wrappers/Theme/docs/component.md +10 -10
- package/dist/wrappers/Theme/themes.js +70 -70
- package/package.json +88 -88
|
@@ -1,90 +1,90 @@
|
|
|
1
|
-
<script>
|
|
2
|
-
import { onMount, onDestroy, getContext } from "svelte";
|
|
3
|
-
import { slugify } from "../../js/utils.js";
|
|
4
|
-
import BackLink from "../BackLink/BackLink.svelte";
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Sets the title of the section
|
|
8
|
-
* @type {string}
|
|
9
|
-
*/
|
|
10
|
-
export let title = "Section title";
|
|
11
|
-
/**
|
|
12
|
-
* Sets the unique ID of the section (if not set, this will be slugified from the title)
|
|
13
|
-
* @type {string}
|
|
14
|
-
*/
|
|
15
|
-
export let id = slugify(title);
|
|
16
|
-
/**
|
|
17
|
-
* Optional: Set an additional CSS class for the section
|
|
18
|
-
* @type {string|null}
|
|
19
|
-
*/
|
|
20
|
-
export let cls = null;
|
|
21
|
-
/**
|
|
22
|
-
* Allows the h2 title tag for the section to be visually hidden
|
|
23
|
-
* @type {boolean}
|
|
24
|
-
*/
|
|
25
|
-
export let hideTitle = false;
|
|
26
|
-
/**
|
|
27
|
-
* Treat a section as sub-section. It will have an h3 title, and will be indented in the contents table
|
|
28
|
-
* @type {boolean}
|
|
29
|
-
*/
|
|
30
|
-
export let subsection = false;
|
|
31
|
-
|
|
32
|
-
const sections = getContext("sections");
|
|
33
|
-
const observer = getContext("observer");
|
|
34
|
-
const tocId = getContext("tocId");
|
|
35
|
-
|
|
36
|
-
let section;
|
|
37
|
-
let mounted = false;
|
|
38
|
-
let observed = false;
|
|
39
|
-
|
|
40
|
-
// This should allow the table of contents (toc) to render before hydration
|
|
41
|
-
$sections = [
|
|
42
|
-
...$sections.filter((s) => s.id !== id),
|
|
43
|
-
{ id, dataset: { title, subsection: String(subsection) } }
|
|
44
|
-
];
|
|
45
|
-
|
|
46
|
-
// This allows sections to be highlighted on the toc after hydration,
|
|
47
|
-
// and for sections to be added/removed gracefully from the DOM
|
|
48
|
-
function addToObserver(observer, mounted) {
|
|
49
|
-
if (mounted && observer && !observed) {
|
|
50
|
-
$sections = [...section.parentElement.getElementsByTagName("section")].filter(
|
|
51
|
-
(s) => s.dataset.type === "NavSection"
|
|
52
|
-
);
|
|
53
|
-
observer.observe(section);
|
|
54
|
-
observed = true;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
$: addToObserver($observer, mounted);
|
|
58
|
-
|
|
59
|
-
onMount(() => (mounted = true));
|
|
60
|
-
|
|
61
|
-
onDestroy(() => {
|
|
62
|
-
if ($observer) $observer.unobserve(section);
|
|
63
|
-
if ($sections) $sections = $sections.filter((s) => s.id !== id);
|
|
64
|
-
mounted = observed = false;
|
|
65
|
-
});
|
|
66
|
-
</script>
|
|
67
|
-
|
|
68
|
-
<section
|
|
69
|
-
{id}
|
|
70
|
-
data-title={title}
|
|
71
|
-
data-type="NavSection"
|
|
72
|
-
data-subsection={subsection}
|
|
73
|
-
class={cls}
|
|
74
|
-
aria-label={title}
|
|
75
|
-
bind:this={section}
|
|
76
|
-
>
|
|
77
|
-
{#if title}
|
|
78
|
-
{#if subsection}
|
|
79
|
-
<h3 class="subsection-title" class:ons-u-vh={hideTitle}>{title}</h3>
|
|
80
|
-
{:else}
|
|
81
|
-
<h2 class="section-title" class:ons-u-vh={hideTitle}>
|
|
82
|
-
{title}
|
|
83
|
-
</h2>
|
|
84
|
-
{/if}
|
|
85
|
-
{/if}
|
|
86
|
-
<slot />
|
|
87
|
-
{#if tocId}
|
|
88
|
-
<BackLink href="#{tocId}" cls="ons-u-d-no@m" />
|
|
89
|
-
{/if}
|
|
90
|
-
</section>
|
|
1
|
+
<script>
|
|
2
|
+
import { onMount, onDestroy, getContext } from "svelte";
|
|
3
|
+
import { slugify } from "../../js/utils.js";
|
|
4
|
+
import BackLink from "../BackLink/BackLink.svelte";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Sets the title of the section
|
|
8
|
+
* @type {string}
|
|
9
|
+
*/
|
|
10
|
+
export let title = "Section title";
|
|
11
|
+
/**
|
|
12
|
+
* Sets the unique ID of the section (if not set, this will be slugified from the title)
|
|
13
|
+
* @type {string}
|
|
14
|
+
*/
|
|
15
|
+
export let id = slugify(title);
|
|
16
|
+
/**
|
|
17
|
+
* Optional: Set an additional CSS class for the section
|
|
18
|
+
* @type {string|null}
|
|
19
|
+
*/
|
|
20
|
+
export let cls = null;
|
|
21
|
+
/**
|
|
22
|
+
* Allows the h2 title tag for the section to be visually hidden
|
|
23
|
+
* @type {boolean}
|
|
24
|
+
*/
|
|
25
|
+
export let hideTitle = false;
|
|
26
|
+
/**
|
|
27
|
+
* Treat a section as sub-section. It will have an h3 title, and will be indented in the contents table
|
|
28
|
+
* @type {boolean}
|
|
29
|
+
*/
|
|
30
|
+
export let subsection = false;
|
|
31
|
+
|
|
32
|
+
const sections = getContext("sections");
|
|
33
|
+
const observer = getContext("observer");
|
|
34
|
+
const tocId = getContext("tocId");
|
|
35
|
+
|
|
36
|
+
let section;
|
|
37
|
+
let mounted = false;
|
|
38
|
+
let observed = false;
|
|
39
|
+
|
|
40
|
+
// This should allow the table of contents (toc) to render before hydration
|
|
41
|
+
$sections = [
|
|
42
|
+
...$sections.filter((s) => s.id !== id),
|
|
43
|
+
{ id, dataset: { title, subsection: String(subsection) } }
|
|
44
|
+
];
|
|
45
|
+
|
|
46
|
+
// This allows sections to be highlighted on the toc after hydration,
|
|
47
|
+
// and for sections to be added/removed gracefully from the DOM
|
|
48
|
+
function addToObserver(observer, mounted) {
|
|
49
|
+
if (mounted && observer && !observed) {
|
|
50
|
+
$sections = [...section.parentElement.getElementsByTagName("section")].filter(
|
|
51
|
+
(s) => s.dataset.type === "NavSection"
|
|
52
|
+
);
|
|
53
|
+
observer.observe(section);
|
|
54
|
+
observed = true;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
$: addToObserver($observer, mounted);
|
|
58
|
+
|
|
59
|
+
onMount(() => (mounted = true));
|
|
60
|
+
|
|
61
|
+
onDestroy(() => {
|
|
62
|
+
if ($observer) $observer.unobserve(section);
|
|
63
|
+
if ($sections) $sections = $sections.filter((s) => s.id !== id);
|
|
64
|
+
mounted = observed = false;
|
|
65
|
+
});
|
|
66
|
+
</script>
|
|
67
|
+
|
|
68
|
+
<section
|
|
69
|
+
{id}
|
|
70
|
+
data-title={title}
|
|
71
|
+
data-type="NavSection"
|
|
72
|
+
data-subsection={subsection}
|
|
73
|
+
class={cls}
|
|
74
|
+
aria-label={title}
|
|
75
|
+
bind:this={section}
|
|
76
|
+
>
|
|
77
|
+
{#if title}
|
|
78
|
+
{#if subsection}
|
|
79
|
+
<h3 class="subsection-title" class:ons-u-vh={hideTitle}>{title}</h3>
|
|
80
|
+
{:else}
|
|
81
|
+
<h2 class="section-title" class:ons-u-vh={hideTitle}>
|
|
82
|
+
{title}
|
|
83
|
+
</h2>
|
|
84
|
+
{/if}
|
|
85
|
+
{/if}
|
|
86
|
+
<slot />
|
|
87
|
+
{#if tocId}
|
|
88
|
+
<BackLink href="#{tocId}" cls="ons-u-d-no@m" />
|
|
89
|
+
{/if}
|
|
90
|
+
</section>
|
|
@@ -1,51 +1,51 @@
|
|
|
1
|
-
<script module>
|
|
2
|
-
import { defineMeta } from "@storybook/addon-svelte-csf";
|
|
3
|
-
import { withComponentDocs } from "../../js/withParams.js";
|
|
4
|
-
import NavSections from "./NavSections.svelte";
|
|
5
|
-
import NavSection from "./NavSection.svelte";
|
|
6
|
-
import componentDocs from "./docs/component.md?raw";
|
|
7
|
-
import { lipsum } from "../../js/utils.js";
|
|
8
|
-
|
|
9
|
-
const parameters = { ...withComponentDocs(componentDocs), layout: "fullscreen" };
|
|
10
|
-
parameters.docs.story = { inline: false, iframeHeight: 600 };
|
|
11
|
-
|
|
12
|
-
const { Story } = defineMeta({
|
|
13
|
-
title: "Layout/NavSections",
|
|
14
|
-
component: NavSections,
|
|
15
|
-
tags: ["autodocs"],
|
|
16
|
-
argTypes: {},
|
|
17
|
-
parameters
|
|
18
|
-
});
|
|
19
|
-
</script>
|
|
20
|
-
|
|
21
|
-
{#snippet template(args)}
|
|
22
|
-
<NavSections {...args}>
|
|
23
|
-
<NavSection title="Section one">
|
|
24
|
-
<p>
|
|
25
|
-
{lipsum()}
|
|
26
|
-
</p>
|
|
27
|
-
</NavSection>
|
|
28
|
-
<NavSection title="Subsection A" subsection>
|
|
29
|
-
<p>
|
|
30
|
-
{lipsum(4, 1)}
|
|
31
|
-
</p>
|
|
32
|
-
</NavSection>
|
|
33
|
-
<NavSection title="Subsection B" subsection>
|
|
34
|
-
<p>
|
|
35
|
-
{lipsum(4, 2)}
|
|
36
|
-
</p>
|
|
37
|
-
</NavSection>
|
|
38
|
-
<NavSection title="Section two">
|
|
39
|
-
<p>
|
|
40
|
-
{lipsum(4, 3)}
|
|
41
|
-
</p>
|
|
42
|
-
</NavSection>
|
|
43
|
-
<NavSection title="Section three">
|
|
44
|
-
<p>
|
|
45
|
-
{lipsum()}
|
|
46
|
-
</p>
|
|
47
|
-
</NavSection>
|
|
48
|
-
</NavSections>
|
|
49
|
-
{/snippet}
|
|
50
|
-
|
|
51
|
-
<Story name="Default" args={{}} {template} />
|
|
1
|
+
<script module>
|
|
2
|
+
import { defineMeta } from "@storybook/addon-svelte-csf";
|
|
3
|
+
import { withComponentDocs } from "../../js/withParams.js";
|
|
4
|
+
import NavSections from "./NavSections.svelte";
|
|
5
|
+
import NavSection from "./NavSection.svelte";
|
|
6
|
+
import componentDocs from "./docs/component.md?raw";
|
|
7
|
+
import { lipsum } from "../../js/utils.js";
|
|
8
|
+
|
|
9
|
+
const parameters = { ...withComponentDocs(componentDocs), layout: "fullscreen" };
|
|
10
|
+
parameters.docs.story = { inline: false, iframeHeight: 600 };
|
|
11
|
+
|
|
12
|
+
const { Story } = defineMeta({
|
|
13
|
+
title: "Layout/NavSections",
|
|
14
|
+
component: NavSections,
|
|
15
|
+
tags: ["autodocs"],
|
|
16
|
+
argTypes: {},
|
|
17
|
+
parameters
|
|
18
|
+
});
|
|
19
|
+
</script>
|
|
20
|
+
|
|
21
|
+
{#snippet template(args)}
|
|
22
|
+
<NavSections {...args}>
|
|
23
|
+
<NavSection title="Section one">
|
|
24
|
+
<p>
|
|
25
|
+
{lipsum()}
|
|
26
|
+
</p>
|
|
27
|
+
</NavSection>
|
|
28
|
+
<NavSection title="Subsection A" subsection>
|
|
29
|
+
<p>
|
|
30
|
+
{lipsum(4, 1)}
|
|
31
|
+
</p>
|
|
32
|
+
</NavSection>
|
|
33
|
+
<NavSection title="Subsection B" subsection>
|
|
34
|
+
<p>
|
|
35
|
+
{lipsum(4, 2)}
|
|
36
|
+
</p>
|
|
37
|
+
</NavSection>
|
|
38
|
+
<NavSection title="Section two">
|
|
39
|
+
<p>
|
|
40
|
+
{lipsum(4, 3)}
|
|
41
|
+
</p>
|
|
42
|
+
</NavSection>
|
|
43
|
+
<NavSection title="Section three">
|
|
44
|
+
<p>
|
|
45
|
+
{lipsum()}
|
|
46
|
+
</p>
|
|
47
|
+
</NavSection>
|
|
48
|
+
</NavSections>
|
|
49
|
+
{/snippet}
|
|
50
|
+
|
|
51
|
+
<Story name="Default" args={{}} {template} />
|
|
@@ -1,160 +1,160 @@
|
|
|
1
|
-
<script>
|
|
2
|
-
import { onMount, setContext } from "svelte";
|
|
3
|
-
import { writable } from "svelte/store";
|
|
4
|
-
import Container from "../../wrappers/Container/Container.svelte";
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* ID for back-linking to table of contents
|
|
8
|
-
* @type {string}
|
|
9
|
-
*/
|
|
10
|
-
export let id = "toc";
|
|
11
|
-
/**
|
|
12
|
-
* Optional: Set an additional CSS class for the section
|
|
13
|
-
* @type {string|null}
|
|
14
|
-
*/
|
|
15
|
-
export let cls = null;
|
|
16
|
-
/**
|
|
17
|
-
* Sets the width of the container
|
|
18
|
-
* @type {"narrow"|"medium"|"wide"|"wider"|"full"}
|
|
19
|
-
*/
|
|
20
|
-
export let width = "wide";
|
|
21
|
-
/**
|
|
22
|
-
* A label for the page contents nav
|
|
23
|
-
* @type {string}
|
|
24
|
-
*/
|
|
25
|
-
export let contentsLabel = "Page contents";
|
|
26
|
-
/**
|
|
27
|
-
* Don't include table of contents (allows for custom uses of nav panel)
|
|
28
|
-
* @type {boolean}
|
|
29
|
-
*/
|
|
30
|
-
export let noContents = false;
|
|
31
|
-
/**
|
|
32
|
-
* Adds margin above section
|
|
33
|
-
* @type {boolean}
|
|
34
|
-
*/
|
|
35
|
-
export let marginTop = false;
|
|
36
|
-
/**
|
|
37
|
-
* Adds margin below section
|
|
38
|
-
* @type {boolean}
|
|
39
|
-
*/
|
|
40
|
-
export let marginBottom = true;
|
|
41
|
-
|
|
42
|
-
let el;
|
|
43
|
-
let active;
|
|
44
|
-
let mounted = false;
|
|
45
|
-
|
|
46
|
-
setContext("tocId", id);
|
|
47
|
-
|
|
48
|
-
const sections = writable([]);
|
|
49
|
-
setContext("sections", sections);
|
|
50
|
-
|
|
51
|
-
const observer = writable();
|
|
52
|
-
setContext("observer", observer);
|
|
53
|
-
|
|
54
|
-
function formatSections(sections) {
|
|
55
|
-
if (sections.length === 0) return [];
|
|
56
|
-
const secs = [];
|
|
57
|
-
let sec = { subsections: [] };
|
|
58
|
-
for (const section of sections) {
|
|
59
|
-
if (section.dataset.subsection !== "true") {
|
|
60
|
-
if (sec.title || sec.subsections.length > 0) secs.push(sec);
|
|
61
|
-
sec = { id: section.id, title: section.dataset.title, subsections: [] };
|
|
62
|
-
} else {
|
|
63
|
-
sec.subsections.push({ id: section.id, title: section.dataset.title });
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
return [...secs, sec];
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
onMount(() => {
|
|
70
|
-
if (!noContents) {
|
|
71
|
-
$observer = new IntersectionObserver(
|
|
72
|
-
(entries, observer) => {
|
|
73
|
-
for (let i = 0; i < entries.length; i++) {
|
|
74
|
-
if (entries[i].isIntersecting) {
|
|
75
|
-
active = entries[i].target.id;
|
|
76
|
-
break;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
},
|
|
80
|
-
{
|
|
81
|
-
root: null,
|
|
82
|
-
rootMargin: "-25% 0px -75%",
|
|
83
|
-
threshold: 0
|
|
84
|
-
}
|
|
85
|
-
);
|
|
86
|
-
}
|
|
87
|
-
// The table of contents doesn't populate unless it's after the main content
|
|
88
|
-
// This is a trick to flip the order when the page hydrates
|
|
89
|
-
el.prepend(el.lastElementChild);
|
|
90
|
-
mounted = true;
|
|
91
|
-
});
|
|
92
|
-
</script>
|
|
93
|
-
|
|
94
|
-
<Container {cls} {width} {marginTop} {marginBottom}>
|
|
95
|
-
<div
|
|
96
|
-
class="ons-grid ons-grid--spaced ons-grid--loose ons-js-toc-container"
|
|
97
|
-
class:flip-display-order={!mounted}
|
|
98
|
-
bind:this={el}
|
|
99
|
-
>
|
|
100
|
-
<div class="ons-nav-sections-content ons-grid__col ons-col-8@m">
|
|
101
|
-
<slot name="before" />
|
|
102
|
-
<slot />
|
|
103
|
-
<slot name="after" />
|
|
104
|
-
</div>
|
|
105
|
-
<div class="ons-nav-sections-toc ons-grid__col ons-grid__col--sticky@m ons-col-4@m">
|
|
106
|
-
<aside class="ons-table-of-contents-container" role="complementary">
|
|
107
|
-
<slot name="before-nav" />
|
|
108
|
-
{#if !noContents}
|
|
109
|
-
<nav class="ons-table-of-contents" aria-label="Sections in this page">
|
|
110
|
-
{#if contentsLabel}
|
|
111
|
-
<h2 class="ons-table-of-contents__title ons-u-fs-r--b ons-u-mb-s">Contents</h2>
|
|
112
|
-
{/if}
|
|
113
|
-
<ol class="ons-list ons-u-mb-l ons-list--dashed">
|
|
114
|
-
{#each formatSections($sections) as section}
|
|
115
|
-
<li class="ons-list__item">
|
|
116
|
-
{#if section.id && section.title}
|
|
117
|
-
<a
|
|
118
|
-
href="#{section.id}"
|
|
119
|
-
class="ons-list__link"
|
|
120
|
-
class:ons-table-of-contents__link-active={section.id === active}
|
|
121
|
-
>
|
|
122
|
-
{section.title}
|
|
123
|
-
</a>
|
|
124
|
-
{/if}
|
|
125
|
-
{#if section.subsections.length > 0}
|
|
126
|
-
<ol class="ons-list ons-u-mb-no ons-list--dashed">
|
|
127
|
-
{#each section.subsections as subsection}
|
|
128
|
-
<li class="ons-list__item">
|
|
129
|
-
<a
|
|
130
|
-
href="#{subsection.id}"
|
|
131
|
-
class="ons-list__link"
|
|
132
|
-
class:ons-table-of-contents__link-active={subsection.id === active}
|
|
133
|
-
>
|
|
134
|
-
{subsection.title}
|
|
135
|
-
</a>
|
|
136
|
-
</li>
|
|
137
|
-
{/each}
|
|
138
|
-
</ol>
|
|
139
|
-
{/if}
|
|
140
|
-
</li>
|
|
141
|
-
{/each}
|
|
142
|
-
</ol>
|
|
143
|
-
</nav>
|
|
144
|
-
{/if}
|
|
145
|
-
<slot name="after-nav" />
|
|
146
|
-
</aside>
|
|
147
|
-
</div>
|
|
148
|
-
</div>
|
|
149
|
-
<slot name="footer" />
|
|
150
|
-
</Container>
|
|
151
|
-
|
|
152
|
-
<style>
|
|
153
|
-
/* These classes force the table of contents to render on the left of the page before hydration */
|
|
154
|
-
.flip-display-order {
|
|
155
|
-
direction: rtl;
|
|
156
|
-
}
|
|
157
|
-
.flip-display-order > * {
|
|
158
|
-
direction: initial;
|
|
159
|
-
}
|
|
160
|
-
</style>
|
|
1
|
+
<script>
|
|
2
|
+
import { onMount, setContext } from "svelte";
|
|
3
|
+
import { writable } from "svelte/store";
|
|
4
|
+
import Container from "../../wrappers/Container/Container.svelte";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* ID for back-linking to table of contents
|
|
8
|
+
* @type {string}
|
|
9
|
+
*/
|
|
10
|
+
export let id = "toc";
|
|
11
|
+
/**
|
|
12
|
+
* Optional: Set an additional CSS class for the section
|
|
13
|
+
* @type {string|null}
|
|
14
|
+
*/
|
|
15
|
+
export let cls = null;
|
|
16
|
+
/**
|
|
17
|
+
* Sets the width of the container
|
|
18
|
+
* @type {"narrow"|"medium"|"wide"|"wider"|"full"}
|
|
19
|
+
*/
|
|
20
|
+
export let width = "wide";
|
|
21
|
+
/**
|
|
22
|
+
* A label for the page contents nav
|
|
23
|
+
* @type {string}
|
|
24
|
+
*/
|
|
25
|
+
export let contentsLabel = "Page contents";
|
|
26
|
+
/**
|
|
27
|
+
* Don't include table of contents (allows for custom uses of nav panel)
|
|
28
|
+
* @type {boolean}
|
|
29
|
+
*/
|
|
30
|
+
export let noContents = false;
|
|
31
|
+
/**
|
|
32
|
+
* Adds margin above section
|
|
33
|
+
* @type {boolean}
|
|
34
|
+
*/
|
|
35
|
+
export let marginTop = false;
|
|
36
|
+
/**
|
|
37
|
+
* Adds margin below section
|
|
38
|
+
* @type {boolean}
|
|
39
|
+
*/
|
|
40
|
+
export let marginBottom = true;
|
|
41
|
+
|
|
42
|
+
let el;
|
|
43
|
+
let active;
|
|
44
|
+
let mounted = false;
|
|
45
|
+
|
|
46
|
+
setContext("tocId", id);
|
|
47
|
+
|
|
48
|
+
const sections = writable([]);
|
|
49
|
+
setContext("sections", sections);
|
|
50
|
+
|
|
51
|
+
const observer = writable();
|
|
52
|
+
setContext("observer", observer);
|
|
53
|
+
|
|
54
|
+
function formatSections(sections) {
|
|
55
|
+
if (sections.length === 0) return [];
|
|
56
|
+
const secs = [];
|
|
57
|
+
let sec = { subsections: [] };
|
|
58
|
+
for (const section of sections) {
|
|
59
|
+
if (section.dataset.subsection !== "true") {
|
|
60
|
+
if (sec.title || sec.subsections.length > 0) secs.push(sec);
|
|
61
|
+
sec = { id: section.id, title: section.dataset.title, subsections: [] };
|
|
62
|
+
} else {
|
|
63
|
+
sec.subsections.push({ id: section.id, title: section.dataset.title });
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return [...secs, sec];
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
onMount(() => {
|
|
70
|
+
if (!noContents) {
|
|
71
|
+
$observer = new IntersectionObserver(
|
|
72
|
+
(entries, observer) => {
|
|
73
|
+
for (let i = 0; i < entries.length; i++) {
|
|
74
|
+
if (entries[i].isIntersecting) {
|
|
75
|
+
active = entries[i].target.id;
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
root: null,
|
|
82
|
+
rootMargin: "-25% 0px -75%",
|
|
83
|
+
threshold: 0
|
|
84
|
+
}
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
// The table of contents doesn't populate unless it's after the main content
|
|
88
|
+
// This is a trick to flip the order when the page hydrates
|
|
89
|
+
el.prepend(el.lastElementChild);
|
|
90
|
+
mounted = true;
|
|
91
|
+
});
|
|
92
|
+
</script>
|
|
93
|
+
|
|
94
|
+
<Container {cls} {width} {marginTop} {marginBottom}>
|
|
95
|
+
<div
|
|
96
|
+
class="ons-grid ons-grid--spaced ons-grid--loose ons-js-toc-container"
|
|
97
|
+
class:flip-display-order={!mounted}
|
|
98
|
+
bind:this={el}
|
|
99
|
+
>
|
|
100
|
+
<div class="ons-nav-sections-content ons-grid__col ons-col-8@m">
|
|
101
|
+
<slot name="before" />
|
|
102
|
+
<slot />
|
|
103
|
+
<slot name="after" />
|
|
104
|
+
</div>
|
|
105
|
+
<div class="ons-nav-sections-toc ons-grid__col ons-grid__col--sticky@m ons-col-4@m">
|
|
106
|
+
<aside class="ons-table-of-contents-container" role="complementary">
|
|
107
|
+
<slot name="before-nav" />
|
|
108
|
+
{#if !noContents}
|
|
109
|
+
<nav class="ons-table-of-contents" aria-label="Sections in this page">
|
|
110
|
+
{#if contentsLabel}
|
|
111
|
+
<h2 class="ons-table-of-contents__title ons-u-fs-r--b ons-u-mb-s">Contents</h2>
|
|
112
|
+
{/if}
|
|
113
|
+
<ol class="ons-list ons-u-mb-l ons-list--dashed">
|
|
114
|
+
{#each formatSections($sections) as section}
|
|
115
|
+
<li class="ons-list__item">
|
|
116
|
+
{#if section.id && section.title}
|
|
117
|
+
<a
|
|
118
|
+
href="#{section.id}"
|
|
119
|
+
class="ons-list__link"
|
|
120
|
+
class:ons-table-of-contents__link-active={section.id === active}
|
|
121
|
+
>
|
|
122
|
+
{section.title}
|
|
123
|
+
</a>
|
|
124
|
+
{/if}
|
|
125
|
+
{#if section.subsections.length > 0}
|
|
126
|
+
<ol class="ons-list ons-u-mb-no ons-list--dashed">
|
|
127
|
+
{#each section.subsections as subsection}
|
|
128
|
+
<li class="ons-list__item">
|
|
129
|
+
<a
|
|
130
|
+
href="#{subsection.id}"
|
|
131
|
+
class="ons-list__link"
|
|
132
|
+
class:ons-table-of-contents__link-active={subsection.id === active}
|
|
133
|
+
>
|
|
134
|
+
{subsection.title}
|
|
135
|
+
</a>
|
|
136
|
+
</li>
|
|
137
|
+
{/each}
|
|
138
|
+
</ol>
|
|
139
|
+
{/if}
|
|
140
|
+
</li>
|
|
141
|
+
{/each}
|
|
142
|
+
</ol>
|
|
143
|
+
</nav>
|
|
144
|
+
{/if}
|
|
145
|
+
<slot name="after-nav" />
|
|
146
|
+
</aside>
|
|
147
|
+
</div>
|
|
148
|
+
</div>
|
|
149
|
+
<slot name="footer" />
|
|
150
|
+
</Container>
|
|
151
|
+
|
|
152
|
+
<style>
|
|
153
|
+
/* These classes force the table of contents to render on the left of the page before hydration */
|
|
154
|
+
.flip-display-order {
|
|
155
|
+
direction: rtl;
|
|
156
|
+
}
|
|
157
|
+
.flip-display-order > * {
|
|
158
|
+
direction: initial;
|
|
159
|
+
}
|
|
160
|
+
</style>
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
Use this component to allow users to quickly jump to named sections within a long page of content.
|
|
2
|
-
|
|
3
|
-
As the user scrolls down the page, a table of contents will remain visible on the left of the viewport and will highlight the subheading of the section currently in view.
|
|
4
|
-
|
|
5
|
-
<!-- prettier-ignore -->
|
|
6
|
-
```html
|
|
7
|
-
<script>
|
|
8
|
-
import { NavSections, NavSection } from "@onsvisual/svelte-components";
|
|
9
|
-
</script>
|
|
10
|
-
|
|
11
|
-
<NavSections>
|
|
12
|
-
<NavSection title="Section one">
|
|
13
|
-
<p>Contents of first section.</p>
|
|
14
|
-
</NavSection>
|
|
15
|
-
<NavSection title="Subsection A" subsection>
|
|
16
|
-
<p>Contents of subsection.</p>
|
|
17
|
-
</NavSection>
|
|
18
|
-
<NavSection title="Subsection B" subsection>
|
|
19
|
-
<p>Contents of subsection.</p>
|
|
20
|
-
</NavSection>
|
|
21
|
-
<NavSection title="Section two">
|
|
22
|
-
<p>Contents of third section.</p>
|
|
23
|
-
</NavSection>
|
|
24
|
-
</NavSections>
|
|
25
|
-
```
|
|
1
|
+
Use this component to allow users to quickly jump to named sections within a long page of content.
|
|
2
|
+
|
|
3
|
+
As the user scrolls down the page, a table of contents will remain visible on the left of the viewport and will highlight the subheading of the section currently in view.
|
|
4
|
+
|
|
5
|
+
<!-- prettier-ignore -->
|
|
6
|
+
```html
|
|
7
|
+
<script>
|
|
8
|
+
import { NavSections, NavSection } from "@onsvisual/svelte-components";
|
|
9
|
+
</script>
|
|
10
|
+
|
|
11
|
+
<NavSections>
|
|
12
|
+
<NavSection title="Section one">
|
|
13
|
+
<p>Contents of first section.</p>
|
|
14
|
+
</NavSection>
|
|
15
|
+
<NavSection title="Subsection A" subsection>
|
|
16
|
+
<p>Contents of subsection.</p>
|
|
17
|
+
</NavSection>
|
|
18
|
+
<NavSection title="Subsection B" subsection>
|
|
19
|
+
<p>Contents of subsection.</p>
|
|
20
|
+
</NavSection>
|
|
21
|
+
<NavSection title="Section two">
|
|
22
|
+
<p>Contents of third section.</p>
|
|
23
|
+
</NavSection>
|
|
24
|
+
</NavSections>
|
|
25
|
+
```
|