@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
package/dist/js/utils.js
CHANGED
|
@@ -1,133 +1,133 @@
|
|
|
1
|
-
import parse from "parse-color";
|
|
2
|
-
|
|
3
|
-
const randomString = () => {
|
|
4
|
-
return Math.random().toString(16).slice(2, 8);
|
|
5
|
-
};
|
|
6
|
-
|
|
7
|
-
export const slugify = (str, suffix = false) =>
|
|
8
|
-
typeof str === "string"
|
|
9
|
-
? str
|
|
10
|
-
.toString()
|
|
11
|
-
.normalize("NFD")
|
|
12
|
-
.replace(/[\u0300-\u036f]/g, "")
|
|
13
|
-
.toLowerCase()
|
|
14
|
-
.trim()
|
|
15
|
-
.replace(/\s+/g, "-")
|
|
16
|
-
.replace(/[^\w-]+/g, "")
|
|
17
|
-
.replace(/--+/g, "-")
|
|
18
|
-
.concat(suffix ? `-${randomString()}` : "")
|
|
19
|
-
: randomString();
|
|
20
|
-
|
|
21
|
-
export const isNumeric = (val) => isFinite(val) && val !== null;
|
|
22
|
-
|
|
23
|
-
export const validDate = (str) => {
|
|
24
|
-
if (!str) return false;
|
|
25
|
-
const date = new Date(str);
|
|
26
|
-
// @ts-ignore
|
|
27
|
-
return !isNaN(date);
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
export const formatDate = (
|
|
31
|
-
str,
|
|
32
|
-
locale = "en-GB",
|
|
33
|
-
opts = { year: "numeric", month: "long", day: "2-digit" }
|
|
34
|
-
) => {
|
|
35
|
-
const date = new Date(str);
|
|
36
|
-
// @ts-ignore
|
|
37
|
-
return date.toLocaleDateString(locale, opts);
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
export const format = (val, dp = null) => {
|
|
41
|
-
return Number.isInteger(dp)
|
|
42
|
-
? val.toLocaleString("en-GB", {
|
|
43
|
-
minimumFractionDigits: dp,
|
|
44
|
-
maximumFractionDigits: dp
|
|
45
|
-
})
|
|
46
|
-
: val.toLocaleString("en-GB");
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
export const formatter = (dp = null) => {
|
|
50
|
-
return Number.isInteger(dp)
|
|
51
|
-
? new Intl.NumberFormat("en-GB", {
|
|
52
|
-
minimumFractionDigits: dp,
|
|
53
|
-
maximumFractionDigits: dp
|
|
54
|
-
}).format
|
|
55
|
-
: new Intl.NumberFormat("en-GB").format;
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
// Functions for natural sorting, regardless of type
|
|
59
|
-
// Less performant than d3.ascending and d3.descending, but handles mixed types
|
|
60
|
-
const collator = new Intl.Collator("en", { numeric: true });
|
|
61
|
-
const isSortable = (a, b) =>
|
|
62
|
-
typeof a === typeof b &&
|
|
63
|
-
(["number", "string", "boolean"].includes(typeof a) ||
|
|
64
|
-
(typeof a.getMonth === "function" && typeof b.getMonth === "function"));
|
|
65
|
-
|
|
66
|
-
export const ascending = (a, b) =>
|
|
67
|
-
a === b
|
|
68
|
-
? 0
|
|
69
|
-
: a == null
|
|
70
|
-
? 1
|
|
71
|
-
: b == null
|
|
72
|
-
? -1
|
|
73
|
-
: !isSortable(a, b)
|
|
74
|
-
? collator.compare(a, b)
|
|
75
|
-
: a < b
|
|
76
|
-
? -1
|
|
77
|
-
: a > b
|
|
78
|
-
? 1
|
|
79
|
-
: 0;
|
|
80
|
-
|
|
81
|
-
export const descending = (a, b) =>
|
|
82
|
-
a === b
|
|
83
|
-
? 0
|
|
84
|
-
: a == null
|
|
85
|
-
? 1
|
|
86
|
-
: b == null
|
|
87
|
-
? -1
|
|
88
|
-
: !isSortable(a, b)
|
|
89
|
-
? collator.compare(b, a)
|
|
90
|
-
: b < a
|
|
91
|
-
? -1
|
|
92
|
-
: b > a
|
|
93
|
-
? 1
|
|
94
|
-
: 0;
|
|
95
|
-
|
|
96
|
-
export const sleep = (ms = 1000) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
97
|
-
|
|
98
|
-
export const contrastColor = (color) => {
|
|
99
|
-
if (!color || typeof color !== "string") return "black";
|
|
100
|
-
const rgb = parse(color).rgb;
|
|
101
|
-
if (rgb) {
|
|
102
|
-
const brightness = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000;
|
|
103
|
-
return brightness > 125 ? "black" : "white";
|
|
104
|
-
}
|
|
105
|
-
return "black";
|
|
106
|
-
};
|
|
107
|
-
|
|
108
|
-
export const darkenColor = (color, factor = 0.5) => {
|
|
109
|
-
if (!color || typeof color !== "string") return color;
|
|
110
|
-
const hsl = parse(color).hsl;
|
|
111
|
-
if (hsl) {
|
|
112
|
-
hsl[2] = hsl[2] * factor;
|
|
113
|
-
return `hsl(${hsl[0]}, ${hsl[1]}%, ${hsl[2]}%)`;
|
|
114
|
-
}
|
|
115
|
-
return color;
|
|
116
|
-
};
|
|
117
|
-
|
|
118
|
-
export const lipsum = (sentences = 4, offset = 0) => {
|
|
119
|
-
const texts = [
|
|
120
|
-
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
|
|
121
|
-
"Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.",
|
|
122
|
-
"Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.",
|
|
123
|
-
"Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
|
|
124
|
-
];
|
|
125
|
-
const passage = [];
|
|
126
|
-
for (let i = 0; i < sentences; i++) {
|
|
127
|
-
passage.push(texts[(i + offset) % 4]);
|
|
128
|
-
}
|
|
129
|
-
return passage.join(" ");
|
|
130
|
-
};
|
|
131
|
-
|
|
132
|
-
export const matchMedia = (query) => window.matchMedia(query);
|
|
133
|
-
matchMedia.hasMatchMedia = () => typeof window.matchMedia === "function";
|
|
1
|
+
import parse from "parse-color";
|
|
2
|
+
|
|
3
|
+
const randomString = () => {
|
|
4
|
+
return Math.random().toString(16).slice(2, 8);
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
export const slugify = (str, suffix = false) =>
|
|
8
|
+
typeof str === "string"
|
|
9
|
+
? str
|
|
10
|
+
.toString()
|
|
11
|
+
.normalize("NFD")
|
|
12
|
+
.replace(/[\u0300-\u036f]/g, "")
|
|
13
|
+
.toLowerCase()
|
|
14
|
+
.trim()
|
|
15
|
+
.replace(/\s+/g, "-")
|
|
16
|
+
.replace(/[^\w-]+/g, "")
|
|
17
|
+
.replace(/--+/g, "-")
|
|
18
|
+
.concat(suffix ? `-${randomString()}` : "")
|
|
19
|
+
: randomString();
|
|
20
|
+
|
|
21
|
+
export const isNumeric = (val) => isFinite(val) && val !== null;
|
|
22
|
+
|
|
23
|
+
export const validDate = (str) => {
|
|
24
|
+
if (!str) return false;
|
|
25
|
+
const date = new Date(str);
|
|
26
|
+
// @ts-ignore
|
|
27
|
+
return !isNaN(date);
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export const formatDate = (
|
|
31
|
+
str,
|
|
32
|
+
locale = "en-GB",
|
|
33
|
+
opts = { year: "numeric", month: "long", day: "2-digit" }
|
|
34
|
+
) => {
|
|
35
|
+
const date = new Date(str);
|
|
36
|
+
// @ts-ignore
|
|
37
|
+
return date.toLocaleDateString(locale, opts);
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export const format = (val, dp = null) => {
|
|
41
|
+
return Number.isInteger(dp)
|
|
42
|
+
? val.toLocaleString("en-GB", {
|
|
43
|
+
minimumFractionDigits: dp,
|
|
44
|
+
maximumFractionDigits: dp
|
|
45
|
+
})
|
|
46
|
+
: val.toLocaleString("en-GB");
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export const formatter = (dp = null) => {
|
|
50
|
+
return Number.isInteger(dp)
|
|
51
|
+
? new Intl.NumberFormat("en-GB", {
|
|
52
|
+
minimumFractionDigits: dp,
|
|
53
|
+
maximumFractionDigits: dp
|
|
54
|
+
}).format
|
|
55
|
+
: new Intl.NumberFormat("en-GB").format;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
// Functions for natural sorting, regardless of type
|
|
59
|
+
// Less performant than d3.ascending and d3.descending, but handles mixed types
|
|
60
|
+
const collator = new Intl.Collator("en", { numeric: true });
|
|
61
|
+
const isSortable = (a, b) =>
|
|
62
|
+
typeof a === typeof b &&
|
|
63
|
+
(["number", "string", "boolean"].includes(typeof a) ||
|
|
64
|
+
(typeof a.getMonth === "function" && typeof b.getMonth === "function"));
|
|
65
|
+
|
|
66
|
+
export const ascending = (a, b) =>
|
|
67
|
+
a === b
|
|
68
|
+
? 0
|
|
69
|
+
: a == null
|
|
70
|
+
? 1
|
|
71
|
+
: b == null
|
|
72
|
+
? -1
|
|
73
|
+
: !isSortable(a, b)
|
|
74
|
+
? collator.compare(a, b)
|
|
75
|
+
: a < b
|
|
76
|
+
? -1
|
|
77
|
+
: a > b
|
|
78
|
+
? 1
|
|
79
|
+
: 0;
|
|
80
|
+
|
|
81
|
+
export const descending = (a, b) =>
|
|
82
|
+
a === b
|
|
83
|
+
? 0
|
|
84
|
+
: a == null
|
|
85
|
+
? 1
|
|
86
|
+
: b == null
|
|
87
|
+
? -1
|
|
88
|
+
: !isSortable(a, b)
|
|
89
|
+
? collator.compare(b, a)
|
|
90
|
+
: b < a
|
|
91
|
+
? -1
|
|
92
|
+
: b > a
|
|
93
|
+
? 1
|
|
94
|
+
: 0;
|
|
95
|
+
|
|
96
|
+
export const sleep = (ms = 1000) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
97
|
+
|
|
98
|
+
export const contrastColor = (color) => {
|
|
99
|
+
if (!color || typeof color !== "string") return "black";
|
|
100
|
+
const rgb = parse(color).rgb;
|
|
101
|
+
if (rgb) {
|
|
102
|
+
const brightness = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000;
|
|
103
|
+
return brightness > 125 ? "black" : "white";
|
|
104
|
+
}
|
|
105
|
+
return "black";
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
export const darkenColor = (color, factor = 0.5) => {
|
|
109
|
+
if (!color || typeof color !== "string") return color;
|
|
110
|
+
const hsl = parse(color).hsl;
|
|
111
|
+
if (hsl) {
|
|
112
|
+
hsl[2] = hsl[2] * factor;
|
|
113
|
+
return `hsl(${hsl[0]}, ${hsl[1]}%, ${hsl[2]}%)`;
|
|
114
|
+
}
|
|
115
|
+
return color;
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
export const lipsum = (sentences = 4, offset = 0) => {
|
|
119
|
+
const texts = [
|
|
120
|
+
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
|
|
121
|
+
"Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.",
|
|
122
|
+
"Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.",
|
|
123
|
+
"Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
|
|
124
|
+
];
|
|
125
|
+
const passage = [];
|
|
126
|
+
for (let i = 0; i < sentences; i++) {
|
|
127
|
+
passage.push(texts[(i + offset) % 4]);
|
|
128
|
+
}
|
|
129
|
+
return passage.join(" ");
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
export const matchMedia = (query) => window.matchMedia(query);
|
|
133
|
+
matchMedia.hasMatchMedia = () => typeof window.matchMedia === "function";
|
package/dist/js/withParams.js
CHANGED
|
@@ -1,43 +1,43 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Use custom source code in the "Show code" pull down.
|
|
3
|
-
* @param {object} source Source code object, where key is the language of the source code and value is the code string.
|
|
4
|
-
* @param {object} otherOptions Other props object options, allowing chaining with other methods like withStoryDocs
|
|
5
|
-
* @returns props object including parameters
|
|
6
|
-
*/
|
|
7
|
-
export const withSource = (source, otherOptions = {}) => {
|
|
8
|
-
const language = Object.keys(source)[0];
|
|
9
|
-
const code = source[language];
|
|
10
|
-
const docs = {
|
|
11
|
-
...otherOptions?.parameters?.docs,
|
|
12
|
-
source: { code, language }
|
|
13
|
-
};
|
|
14
|
-
return { docs };
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Add custom documentation to a story.
|
|
19
|
-
* @param {string} storyDocs Markdown string of docs
|
|
20
|
-
* @param {object} otherOptions Other props object options, allowing chaining with other methods like withSource
|
|
21
|
-
* @returns props object including parameters
|
|
22
|
-
*/
|
|
23
|
-
export const withStoryDocs = (storyDocs, otherOptions = {}) => {
|
|
24
|
-
const docs = {
|
|
25
|
-
...otherOptions?.parameters?.docs,
|
|
26
|
-
description: { story: storyDocs }
|
|
27
|
-
};
|
|
28
|
-
return { docs };
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Add custom documentation to the top of the component docs page.
|
|
33
|
-
* @param {string} componentDocs Markdown string of docs
|
|
34
|
-
* @param {object} otherOptions Other props object options, allowing chaining with other methods like withSource
|
|
35
|
-
* @returns props object including parameters
|
|
36
|
-
*/
|
|
37
|
-
export const withComponentDocs = (componentDocs, otherOptions = {}) => {
|
|
38
|
-
const docs = {
|
|
39
|
-
...otherOptions?.parameters?.docs,
|
|
40
|
-
description: { component: componentDocs }
|
|
41
|
-
};
|
|
42
|
-
return { docs };
|
|
43
|
-
};
|
|
1
|
+
/**
|
|
2
|
+
* Use custom source code in the "Show code" pull down.
|
|
3
|
+
* @param {object} source Source code object, where key is the language of the source code and value is the code string.
|
|
4
|
+
* @param {object} otherOptions Other props object options, allowing chaining with other methods like withStoryDocs
|
|
5
|
+
* @returns props object including parameters
|
|
6
|
+
*/
|
|
7
|
+
export const withSource = (source, otherOptions = {}) => {
|
|
8
|
+
const language = Object.keys(source)[0];
|
|
9
|
+
const code = source[language];
|
|
10
|
+
const docs = {
|
|
11
|
+
...otherOptions?.parameters?.docs,
|
|
12
|
+
source: { code, language }
|
|
13
|
+
};
|
|
14
|
+
return { docs };
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Add custom documentation to a story.
|
|
19
|
+
* @param {string} storyDocs Markdown string of docs
|
|
20
|
+
* @param {object} otherOptions Other props object options, allowing chaining with other methods like withSource
|
|
21
|
+
* @returns props object including parameters
|
|
22
|
+
*/
|
|
23
|
+
export const withStoryDocs = (storyDocs, otherOptions = {}) => {
|
|
24
|
+
const docs = {
|
|
25
|
+
...otherOptions?.parameters?.docs,
|
|
26
|
+
description: { story: storyDocs }
|
|
27
|
+
};
|
|
28
|
+
return { docs };
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Add custom documentation to the top of the component docs page.
|
|
33
|
+
* @param {string} componentDocs Markdown string of docs
|
|
34
|
+
* @param {object} otherOptions Other props object options, allowing chaining with other methods like withSource
|
|
35
|
+
* @returns props object including parameters
|
|
36
|
+
*/
|
|
37
|
+
export const withComponentDocs = (componentDocs, otherOptions = {}) => {
|
|
38
|
+
const docs = {
|
|
39
|
+
...otherOptions?.parameters?.docs,
|
|
40
|
+
description: { component: componentDocs }
|
|
41
|
+
};
|
|
42
|
+
return { docs };
|
|
43
|
+
};
|
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
<script module>
|
|
2
|
-
import { defineMeta } from "@storybook/addon-svelte-csf";
|
|
3
|
-
import { withComponentDocs } from "../../js/withParams.js";
|
|
4
|
-
import Accordion from "./Accordion.svelte";
|
|
5
|
-
import AccordionItem from "./AccordionItem.svelte";
|
|
6
|
-
import componentDocs from "./docs/component.md?raw";
|
|
7
|
-
|
|
8
|
-
const { Story } = defineMeta({
|
|
9
|
-
title: "Layout/Accordion",
|
|
10
|
-
component: Accordion,
|
|
11
|
-
tags: ["autodocs"],
|
|
12
|
-
argTypes: {},
|
|
13
|
-
parameters: withComponentDocs(componentDocs)
|
|
14
|
-
});
|
|
15
|
-
</script>
|
|
16
|
-
|
|
17
|
-
{#snippet template(args)}
|
|
18
|
-
<Accordion {...args}>
|
|
19
|
-
<AccordionItem title="First item">
|
|
20
|
-
<p>Contents of first item.</p>
|
|
21
|
-
</AccordionItem>
|
|
22
|
-
<AccordionItem title="Second item">
|
|
23
|
-
<p>Contents of second item.</p>
|
|
24
|
-
</AccordionItem>
|
|
25
|
-
</Accordion>
|
|
26
|
-
{/snippet}
|
|
27
|
-
|
|
28
|
-
<Story name="Default" args={{}} {template} />
|
|
29
|
-
|
|
30
|
-
<Story name="With 'show all' toggle" args={{ showToggle: true }} {template} />
|
|
1
|
+
<script module>
|
|
2
|
+
import { defineMeta } from "@storybook/addon-svelte-csf";
|
|
3
|
+
import { withComponentDocs } from "../../js/withParams.js";
|
|
4
|
+
import Accordion from "./Accordion.svelte";
|
|
5
|
+
import AccordionItem from "./AccordionItem.svelte";
|
|
6
|
+
import componentDocs from "./docs/component.md?raw";
|
|
7
|
+
|
|
8
|
+
const { Story } = defineMeta({
|
|
9
|
+
title: "Layout/Accordion",
|
|
10
|
+
component: Accordion,
|
|
11
|
+
tags: ["autodocs"],
|
|
12
|
+
argTypes: {},
|
|
13
|
+
parameters: withComponentDocs(componentDocs)
|
|
14
|
+
});
|
|
15
|
+
</script>
|
|
16
|
+
|
|
17
|
+
{#snippet template(args)}
|
|
18
|
+
<Accordion {...args}>
|
|
19
|
+
<AccordionItem title="First item">
|
|
20
|
+
<p>Contents of first item.</p>
|
|
21
|
+
</AccordionItem>
|
|
22
|
+
<AccordionItem title="Second item">
|
|
23
|
+
<p>Contents of second item.</p>
|
|
24
|
+
</AccordionItem>
|
|
25
|
+
</Accordion>
|
|
26
|
+
{/snippet}
|
|
27
|
+
|
|
28
|
+
<Story name="Default" args={{}} {template} />
|
|
29
|
+
|
|
30
|
+
<Story name="With 'show all' toggle" args={{ showToggle: true }} {template} />
|
|
@@ -1,55 +1,55 @@
|
|
|
1
|
-
<script>
|
|
2
|
-
import { onMount, setContext } from "svelte";
|
|
3
|
-
import Accordion from "./accordion.js";
|
|
4
|
-
import Details from "./details.js";
|
|
5
|
-
import { slugify, sleep } from "../../js/utils.js";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Optional: Set the unique ID of the accordion
|
|
9
|
-
* @type {string}
|
|
10
|
-
*/
|
|
11
|
-
export let id = slugify();
|
|
12
|
-
/**
|
|
13
|
-
* Optional: Set an additional CSS class for the component
|
|
14
|
-
* @type {string|null}
|
|
15
|
-
*/
|
|
16
|
-
export let cls = null;
|
|
17
|
-
/**
|
|
18
|
-
* Option to include a "show all" toggle above the accordion
|
|
19
|
-
* @type {boolean}
|
|
20
|
-
*/
|
|
21
|
-
export let showToggle = false;
|
|
22
|
-
|
|
23
|
-
let el, buttonEl;
|
|
24
|
-
|
|
25
|
-
setContext("dataGroup", id);
|
|
26
|
-
|
|
27
|
-
onMount(async () => {
|
|
28
|
-
await sleep(0);
|
|
29
|
-
const detailsComponents = [...el.querySelectorAll(".ons-js-details")];
|
|
30
|
-
const detailsEls = detailsComponents.map((element) => new Details(element));
|
|
31
|
-
new Accordion(buttonEl, detailsEls);
|
|
32
|
-
});
|
|
33
|
-
</script>
|
|
34
|
-
|
|
35
|
-
<div {id} class="ons-accordion {cls}" bind:this={el}>
|
|
36
|
-
<button
|
|
37
|
-
type="button"
|
|
38
|
-
class="ons-btn ons-accordion__toggle-all ons-u-mb-s ons-u-d-no ons-btn--secondary ons-btn--small"
|
|
39
|
-
class:hide-toggle={!showToggle}
|
|
40
|
-
data-close-all="Hide all"
|
|
41
|
-
data-group={id}
|
|
42
|
-
bind:this={buttonEl}
|
|
43
|
-
>
|
|
44
|
-
<span class="ons-btn__inner ons-accordion__toggle-all-inner"
|
|
45
|
-
><span class="ons-btn__text">Show all</span></span
|
|
46
|
-
>
|
|
47
|
-
</button>
|
|
48
|
-
<slot />
|
|
49
|
-
</div>
|
|
50
|
-
|
|
51
|
-
<style>
|
|
52
|
-
button.hide-toggle {
|
|
53
|
-
display: none;
|
|
54
|
-
}
|
|
55
|
-
</style>
|
|
1
|
+
<script>
|
|
2
|
+
import { onMount, setContext } from "svelte";
|
|
3
|
+
import Accordion from "./accordion.js";
|
|
4
|
+
import Details from "./details.js";
|
|
5
|
+
import { slugify, sleep } from "../../js/utils.js";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Optional: Set the unique ID of the accordion
|
|
9
|
+
* @type {string}
|
|
10
|
+
*/
|
|
11
|
+
export let id = slugify();
|
|
12
|
+
/**
|
|
13
|
+
* Optional: Set an additional CSS class for the component
|
|
14
|
+
* @type {string|null}
|
|
15
|
+
*/
|
|
16
|
+
export let cls = null;
|
|
17
|
+
/**
|
|
18
|
+
* Option to include a "show all" toggle above the accordion
|
|
19
|
+
* @type {boolean}
|
|
20
|
+
*/
|
|
21
|
+
export let showToggle = false;
|
|
22
|
+
|
|
23
|
+
let el, buttonEl;
|
|
24
|
+
|
|
25
|
+
setContext("dataGroup", id);
|
|
26
|
+
|
|
27
|
+
onMount(async () => {
|
|
28
|
+
await sleep(0);
|
|
29
|
+
const detailsComponents = [...el.querySelectorAll(".ons-js-details")];
|
|
30
|
+
const detailsEls = detailsComponents.map((element) => new Details(element));
|
|
31
|
+
new Accordion(buttonEl, detailsEls);
|
|
32
|
+
});
|
|
33
|
+
</script>
|
|
34
|
+
|
|
35
|
+
<div {id} class="ons-accordion {cls}" bind:this={el}>
|
|
36
|
+
<button
|
|
37
|
+
type="button"
|
|
38
|
+
class="ons-btn ons-accordion__toggle-all ons-u-mb-s ons-u-d-no ons-btn--secondary ons-btn--small"
|
|
39
|
+
class:hide-toggle={!showToggle}
|
|
40
|
+
data-close-all="Hide all"
|
|
41
|
+
data-group={id}
|
|
42
|
+
bind:this={buttonEl}
|
|
43
|
+
>
|
|
44
|
+
<span class="ons-btn__inner ons-accordion__toggle-all-inner"
|
|
45
|
+
><span class="ons-btn__text">Show all</span></span
|
|
46
|
+
>
|
|
47
|
+
</button>
|
|
48
|
+
<slot />
|
|
49
|
+
</div>
|
|
50
|
+
|
|
51
|
+
<style>
|
|
52
|
+
button.hide-toggle {
|
|
53
|
+
display: none;
|
|
54
|
+
}
|
|
55
|
+
</style>
|
|
@@ -1,51 +1,51 @@
|
|
|
1
|
-
<script>
|
|
2
|
-
import { getContext } from "svelte";
|
|
3
|
-
import { slugify } from "../../js/utils.js";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Sets the title of the accordion item
|
|
7
|
-
* @type {string|null}
|
|
8
|
-
*/
|
|
9
|
-
export let title = null;
|
|
10
|
-
/**
|
|
11
|
-
* Sets the unique ID of the accordion item
|
|
12
|
-
* @type {string}
|
|
13
|
-
*/
|
|
14
|
-
export let id = slugify(title);
|
|
15
|
-
/**
|
|
16
|
-
* Set the heading level for the accordion items
|
|
17
|
-
* @type {"h2"|"h3"}
|
|
18
|
-
*/
|
|
19
|
-
export let headingTag = "h2";
|
|
20
|
-
|
|
21
|
-
const dataGroup = getContext("dataGroup");
|
|
22
|
-
</script>
|
|
23
|
-
|
|
24
|
-
<div {id} class="ons-details ons-js-details ons-details--accordion" data-group={dataGroup}>
|
|
25
|
-
<div class="ons-details__heading ons-js-details-heading" role="button">
|
|
26
|
-
{#if headingTag === "h3"}
|
|
27
|
-
<h3 class="ons-details__title ons-u-fs-r--b">{title}</h3>
|
|
28
|
-
{:else}
|
|
29
|
-
<h2 class="ons-details__title ons-u-fs-r--b">{title}</h2>
|
|
30
|
-
{/if}
|
|
31
|
-
<span class="ons-details__icon">
|
|
32
|
-
<svg
|
|
33
|
-
class="ons-icon"
|
|
34
|
-
viewBox="0 0 8 13"
|
|
35
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
36
|
-
focusable="false"
|
|
37
|
-
fill="currentColor"
|
|
38
|
-
role="img"
|
|
39
|
-
title="ons-icon-chevron"
|
|
40
|
-
>
|
|
41
|
-
<path
|
|
42
|
-
d="M5.74,14.28l-.57-.56a.5.5,0,0,1,0-.71h0l5-5-5-5a.5.5,0,0,1,0-.71h0l.57-.56a.5.5,0,0,1,.71,0h0l5.93,5.93a.5.5,0,0,1,0,.7L6.45,14.28a.5.5,0,0,1-.71,0Z"
|
|
43
|
-
transform="translate(-5.02 -1.59)"
|
|
44
|
-
/>
|
|
45
|
-
</svg></span
|
|
46
|
-
>
|
|
47
|
-
</div>
|
|
48
|
-
<div id="{id}-content" class="ons-details__content ons-js-details-content">
|
|
49
|
-
<slot />
|
|
50
|
-
</div>
|
|
51
|
-
</div>
|
|
1
|
+
<script>
|
|
2
|
+
import { getContext } from "svelte";
|
|
3
|
+
import { slugify } from "../../js/utils.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Sets the title of the accordion item
|
|
7
|
+
* @type {string|null}
|
|
8
|
+
*/
|
|
9
|
+
export let title = null;
|
|
10
|
+
/**
|
|
11
|
+
* Sets the unique ID of the accordion item
|
|
12
|
+
* @type {string}
|
|
13
|
+
*/
|
|
14
|
+
export let id = slugify(title);
|
|
15
|
+
/**
|
|
16
|
+
* Set the heading level for the accordion items
|
|
17
|
+
* @type {"h2"|"h3"}
|
|
18
|
+
*/
|
|
19
|
+
export let headingTag = "h2";
|
|
20
|
+
|
|
21
|
+
const dataGroup = getContext("dataGroup");
|
|
22
|
+
</script>
|
|
23
|
+
|
|
24
|
+
<div {id} class="ons-details ons-js-details ons-details--accordion" data-group={dataGroup}>
|
|
25
|
+
<div class="ons-details__heading ons-js-details-heading" role="button">
|
|
26
|
+
{#if headingTag === "h3"}
|
|
27
|
+
<h3 class="ons-details__title ons-u-fs-r--b">{title}</h3>
|
|
28
|
+
{:else}
|
|
29
|
+
<h2 class="ons-details__title ons-u-fs-r--b">{title}</h2>
|
|
30
|
+
{/if}
|
|
31
|
+
<span class="ons-details__icon">
|
|
32
|
+
<svg
|
|
33
|
+
class="ons-icon"
|
|
34
|
+
viewBox="0 0 8 13"
|
|
35
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
36
|
+
focusable="false"
|
|
37
|
+
fill="currentColor"
|
|
38
|
+
role="img"
|
|
39
|
+
title="ons-icon-chevron"
|
|
40
|
+
>
|
|
41
|
+
<path
|
|
42
|
+
d="M5.74,14.28l-.57-.56a.5.5,0,0,1,0-.71h0l5-5-5-5a.5.5,0,0,1,0-.71h0l.57-.56a.5.5,0,0,1,.71,0h0l5.93,5.93a.5.5,0,0,1,0,.7L6.45,14.28a.5.5,0,0,1-.71,0Z"
|
|
43
|
+
transform="translate(-5.02 -1.59)"
|
|
44
|
+
/>
|
|
45
|
+
</svg></span
|
|
46
|
+
>
|
|
47
|
+
</div>
|
|
48
|
+
<div id="{id}-content" class="ons-details__content ons-js-details-content">
|
|
49
|
+
<slot />
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|