@mattilsynet/design 2.2.24 → 2.2.26
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/mtds/alert/alert.js +9 -8
- package/mtds/alert/alert.js.map +1 -1
- package/mtds/analytics/analytics.d.ts +1 -1
- package/mtds/analytics/analytics.js +165 -101
- package/mtds/analytics/analytics.js.map +1 -1
- package/mtds/app/app-observer.js +73 -27
- package/mtds/app/app-observer.js.map +1 -1
- package/mtds/app/app-toggle.js +2 -24
- package/mtds/app/app-toggle.js.map +1 -1
- package/mtds/app/app-toggle2.js +16 -10
- package/mtds/app/app-toggle2.js.map +1 -1
- package/mtds/app/app.d.ts +5 -5
- package/mtds/app/app.js +36 -32
- package/mtds/app/app.js.map +1 -1
- package/mtds/atlas/atlas-element.d.ts +9 -14
- package/mtds/atlas/atlas-element.js +98 -76
- package/mtds/atlas/atlas-element.js.map +1 -1
- package/mtds/atlas/atlas-marker.d.ts +20 -0
- package/mtds/atlas/atlas-marker.js +73 -0
- package/mtds/atlas/atlas-marker.js.map +1 -0
- package/mtds/atlas/atlas-matgeo.d.ts +37 -0
- package/mtds/atlas/atlas-matgeo.js +93 -0
- package/mtds/atlas/atlas-matgeo.js.map +1 -0
- package/mtds/atlas/atlas-wms.d.ts +17 -0
- package/mtds/atlas/atlas-wms.js +39 -0
- package/mtds/atlas/atlas-wms.js.map +1 -0
- package/mtds/atlas/atlas.css.js +80 -94
- package/mtds/atlas/atlas.css.js.map +1 -1
- package/mtds/atlas/atlas.d.ts +51 -0
- package/mtds/atlas/atlas.js +38 -0
- package/mtds/atlas/atlas.js.map +1 -0
- package/mtds/atlas/atlas.stories.d.ts +6 -1
- package/mtds/atlas/cluster.js +1576 -697
- package/mtds/atlas/cluster.js.map +1 -1
- package/mtds/atlas.iife.js +84 -98
- package/mtds/atlas.js +10 -4
- package/mtds/atlas.js.map +1 -1
- package/mtds/avatar/avatar.js +8 -8
- package/mtds/avatar/avatar.js.map +1 -1
- package/mtds/badge/badge.d.ts +2 -2
- package/mtds/badge/badge.js +7 -7
- package/mtds/badge/badge.js.map +1 -1
- package/mtds/breadcrumbs/breadcrumbs-observer.js +10 -9
- package/mtds/breadcrumbs/breadcrumbs-observer.js.map +1 -1
- package/mtds/breadcrumbs/breadcrumbs.js +14 -13
- package/mtds/breadcrumbs/breadcrumbs.js.map +1 -1
- package/mtds/button/button.js +16 -14
- package/mtds/button/button.js.map +1 -1
- package/mtds/card/card.js +14 -12
- package/mtds/card/card.js.map +1 -1
- package/mtds/chart/chart-axis.js +27 -15
- package/mtds/chart/chart-axis.js.map +1 -1
- package/mtds/chart/chart-bars.js +15 -13
- package/mtds/chart/chart-bars.js.map +1 -1
- package/mtds/chart/chart-element.d.ts +5 -0
- package/mtds/chart/chart-element.js +83 -48
- package/mtds/chart/chart-element.js.map +1 -1
- package/mtds/chart/chart-lines.js +54 -32
- package/mtds/chart/chart-lines.js.map +1 -1
- package/mtds/chart/chart-pies.js +34 -14
- package/mtds/chart/chart-pies.js.map +1 -1
- package/mtds/chart/chart.css.js +2 -2
- package/mtds/chart/chart.css.js.map +1 -1
- package/mtds/chart/chart.d.ts +3 -4
- package/mtds/chart/chart.js +12 -12
- package/mtds/chart/chart.js.map +1 -1
- package/mtds/chip/chip.js +8 -8
- package/mtds/chip/chip.js.map +1 -1
- package/mtds/details/details.d.ts +3 -3
- package/mtds/details/details.js +14 -12
- package/mtds/details/details.js.map +1 -1
- package/mtds/dialog/dialog-observer.js +35 -22
- package/mtds/dialog/dialog-observer.js.map +1 -1
- package/mtds/dialog/dialog.d.ts +2 -2
- package/mtds/dialog/dialog.js +12 -12
- package/mtds/dialog/dialog.js.map +1 -1
- package/mtds/divider/divider.d.ts +2 -2
- package/mtds/divider/divider.js +10 -10
- package/mtds/divider/divider.js.map +1 -1
- package/mtds/errorsummary/errorsummary-observer.js +11 -8
- package/mtds/errorsummary/errorsummary-observer.js.map +1 -1
- package/mtds/errorsummary/errorsummary.d.ts +1 -1
- package/mtds/errorsummary/errorsummary.js +11 -11
- package/mtds/errorsummary/errorsummary.js.map +1 -1
- package/mtds/external/@turf/boolean-point-in-polygon/dist/esm/index.js +35 -0
- package/mtds/external/@turf/boolean-point-in-polygon/dist/esm/index.js.map +1 -0
- package/mtds/external/@turf/helpers/dist/esm/index.js +40 -0
- package/mtds/external/@turf/helpers/dist/esm/index.js.map +1 -0
- package/mtds/external/@turf/invariant/dist/esm/index.js +28 -0
- package/mtds/external/@turf/invariant/dist/esm/index.js.map +1 -0
- package/mtds/external/leaflet/dist/leaflet-src.js +6006 -3098
- package/mtds/external/leaflet/dist/leaflet-src.js.map +1 -1
- package/mtds/external/leaflet/dist/leaflet.css.js +2 -2
- package/mtds/external/leaflet/dist/leaflet.css.js.map +1 -1
- package/mtds/external/point-in-polygon-hao/dist/esm/index.js +56 -0
- package/mtds/external/point-in-polygon-hao/dist/esm/index.js.map +1 -0
- package/mtds/external/robust-predicates/esm/orient2d.js +168 -0
- package/mtds/external/robust-predicates/esm/orient2d.js.map +1 -0
- package/mtds/external/robust-predicates/esm/util.js +91 -0
- package/mtds/external/robust-predicates/esm/util.js.map +1 -0
- package/mtds/field/field-observer.js +114 -62
- package/mtds/field/field-observer.js.map +1 -1
- package/mtds/field/field.d.ts +6 -6
- package/mtds/field/field.js +166 -133
- package/mtds/field/field.js.map +1 -1
- package/mtds/field/field.stories.d.ts +2 -0
- package/mtds/fieldset/fieldset-observer.js +24 -14
- package/mtds/fieldset/fieldset-observer.js.map +1 -1
- package/mtds/fieldset/fieldset.d.ts +1 -1
- package/mtds/fieldset/fieldset.js +11 -11
- package/mtds/fieldset/fieldset.js.map +1 -1
- package/mtds/fileupload/fileupload.js +9 -8
- package/mtds/fileupload/fileupload.js.map +1 -1
- package/mtds/helptext/helptext.d.ts +1 -1
- package/mtds/helptext/helptext.js +15 -15
- package/mtds/helptext/helptext.js.map +1 -1
- package/mtds/index.iife.js +9 -9
- package/mtds/index.js +26 -24
- package/mtds/input/input.d.ts +3 -3
- package/mtds/input/input.js +22 -20
- package/mtds/input/input.js.map +1 -1
- package/mtds/law/law-helper.d.ts +6 -2
- package/mtds/law/law-helper.js +145 -63
- package/mtds/law/law-helper.js.map +1 -1
- package/mtds/law/law.d.ts +6 -2
- package/mtds/law/law.js +6 -6
- package/mtds/law/law.js.map +1 -1
- package/mtds/law/law.stories.d.ts +1 -0
- package/mtds/layout/layout.js +13 -10
- package/mtds/layout/layout.js.map +1 -1
- package/mtds/link/link.js +8 -7
- package/mtds/link/link.js.map +1 -1
- package/mtds/logo/logo-observer.js +18 -12
- package/mtds/logo/logo-observer.js.map +1 -1
- package/mtds/logo/logo.js +8 -8
- package/mtds/logo/logo.js.map +1 -1
- package/mtds/package.json.js +2 -2
- package/mtds/pagination/pagination-helper.js +17 -11
- package/mtds/pagination/pagination-helper.js.map +1 -1
- package/mtds/pagination/pagination.d.ts +1 -1
- package/mtds/pagination/pagination.js +30 -30
- package/mtds/pagination/pagination.js.map +1 -1
- package/mtds/popover/popover-observer.js +47 -28
- package/mtds/popover/popover-observer.js.map +1 -1
- package/mtds/popover/popover.js +13 -11
- package/mtds/popover/popover.js.map +1 -1
- package/mtds/progress/progress.d.ts +1 -1
- package/mtds/progress/progress.js +8 -8
- package/mtds/progress/progress.js.map +1 -1
- package/mtds/react-atlas.d.ts +1 -0
- package/mtds/react-atlas.js +15 -0
- package/mtds/react-atlas.js.map +1 -0
- package/mtds/react-types.d.ts +3 -0
- package/mtds/react.js +79 -79
- package/mtds/skeleton/skeleton.js +8 -8
- package/mtds/skeleton/skeleton.js.map +1 -1
- package/mtds/spinner/spinner.d.ts +2 -2
- package/mtds/spinner/spinner.js +8 -8
- package/mtds/spinner/spinner.js.map +1 -1
- package/mtds/steps/steps.d.ts +2 -2
- package/mtds/steps/steps.js +7 -7
- package/mtds/steps/steps.js.map +1 -1
- package/mtds/styles.css +4586 -1
- package/mtds/styles.module.css.js +167 -112
- package/mtds/styles.module.css.js.map +1 -1
- package/mtds/table/table-observer.js +22 -19
- package/mtds/table/table-observer.js.map +1 -1
- package/mtds/table/table.d.ts +4 -4
- package/mtds/table/table.js +18 -16
- package/mtds/table/table.js.map +1 -1
- package/mtds/tabs/tabs.d.ts +4 -4
- package/mtds/tabs/tabs.js +25 -21
- package/mtds/tabs/tabs.js.map +1 -1
- package/mtds/tag/tag.js +8 -8
- package/mtds/tag/tag.js.map +1 -1
- package/mtds/tailwind.css +24 -6
- package/mtds/toast/toast-helper.js +35 -20
- package/mtds/toast/toast-helper.js.map +1 -1
- package/mtds/toast/toast-observer.js +30 -15
- package/mtds/toast/toast-observer.js.map +1 -1
- package/mtds/toast/toast.js +45 -37
- package/mtds/toast/toast.js.map +1 -1
- package/mtds/togglegroup/togglegroup-observer.js +15 -10
- package/mtds/togglegroup/togglegroup-observer.js.map +1 -1
- package/mtds/togglegroup/togglegroup.d.ts +3 -3
- package/mtds/togglegroup/togglegroup.js +20 -18
- package/mtds/togglegroup/togglegroup.js.map +1 -1
- package/mtds/tooltip/tooltip-observer.js +48 -32
- package/mtds/tooltip/tooltip-observer.js.map +1 -1
- package/mtds/typography/typography.js +28 -19
- package/mtds/typography/typography.js.map +1 -1
- package/mtds/utils.d.ts +12 -3
- package/mtds/utils.js +133 -81
- package/mtds/utils.js.map +1 -1
- package/mtds/validation/validation.d.ts +1 -1
- package/mtds/validation/validation.js +12 -12
- package/mtds/validation/validation.js.map +1 -1
- package/package.json +16 -10
|
@@ -1,28 +1,43 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import { tag
|
|
4
|
-
function
|
|
5
|
-
const
|
|
6
|
-
|
|
1
|
+
import clsx from "clsx";
|
|
2
|
+
import styles from "../styles.module.css.js";
|
|
3
|
+
import { tag, attr } from "../utils.js";
|
|
4
|
+
function toast(content, opt = {}) {
|
|
5
|
+
const dialog = document.getElementById(opt.id || "") || tag("dialog");
|
|
6
|
+
attr(dialog, "aria-busy", opt.busy ? "true" : null);
|
|
7
|
+
attr(dialog, "class", clsx(styles.toast, opt.className));
|
|
8
|
+
attr(dialog, "data-closedby", opt.closedby || null);
|
|
9
|
+
attr(dialog, "data-color", opt.color || null);
|
|
10
|
+
attr(dialog, "data-icon", `${opt.icon ?? ""}` || null);
|
|
11
|
+
attr(dialog, "data-timeout", `${opt.timeout ?? ""}` || null);
|
|
12
|
+
attr(dialog, "id", opt.id || `${Date.now()}`);
|
|
13
|
+
attr(dialog, "open", opt.open === false ? null : "");
|
|
14
|
+
dialog.innerHTML = content;
|
|
15
|
+
dialog.addEventListener("animationend", handleToastClose, { once: true });
|
|
16
|
+
document.body.appendChild(dialog);
|
|
17
|
+
return dialog.id;
|
|
7
18
|
}
|
|
8
|
-
function
|
|
9
|
-
|
|
19
|
+
function handleToastClose({ animationName, target }) {
|
|
20
|
+
if (animationName === styles._toastClose)
|
|
21
|
+
target.remove();
|
|
10
22
|
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
const { loading
|
|
23
|
+
toast.success = (content, opt) => toast(content, { color: "success", ...opt });
|
|
24
|
+
toast.danger = (content, opt) => toast(content, { color: "danger", ...opt });
|
|
25
|
+
toast.info = (content, opt) => toast(content, { color: "info", ...opt });
|
|
26
|
+
toast.warning = (content, opt) => toast(content, { color: "warning", ...opt });
|
|
27
|
+
toast.neutral = (content, opt) => toast(content, { color: "neutral", ...opt });
|
|
28
|
+
toast.promise = async function promise(action, props) {
|
|
29
|
+
const { loading, success, error, ...opt } = props;
|
|
30
|
+
const id = toast(loading, { busy: true, ...opt });
|
|
18
31
|
try {
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
32
|
+
const result = await action();
|
|
33
|
+
toast.success(success, { id, busy: false });
|
|
34
|
+
return result;
|
|
35
|
+
} catch (_error) {
|
|
36
|
+
toast.danger(error, { id, busy: false });
|
|
37
|
+
throw _error;
|
|
23
38
|
}
|
|
24
39
|
};
|
|
25
40
|
export {
|
|
26
|
-
|
|
41
|
+
toast
|
|
27
42
|
};
|
|
28
43
|
//# sourceMappingURL=toast-helper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toast-helper.js","sources":["../../designsystem/toast/toast-helper.ts"],"sourcesContent":["import clsx from \"clsx\";\nimport styles from \"../styles.module.css\";\nimport { attr, tag } from \"../utils\";\n\nexport type ToastOptions = {\n\tclassName?: string;\n\tclosedby?: \"none\";\n\tcolor?: \"main\" | \"neutral\" | \"success\" | \"danger\" | \"info\" | \"warning\";\n\ticon?: boolean | \"none\";\n\ttimeout?: number | false;\n\tbusy?: boolean;\n\topen?: boolean;\n\tid?: string;\n};\n\nexport function toast(content: string, opt: ToastOptions = {}) {\n\tconst dialog = document.getElementById(opt.id || \"\") || tag(\"dialog\");\n\n\tattr(dialog, \"aria-busy\", opt.busy ? \"true\" : null);\n\tattr(dialog, \"class\", clsx(styles.toast, opt.className));\n\tattr(dialog, \"data-closedby\", opt.closedby || null);\n\tattr(dialog, \"data-color\", opt.color || null);\n\tattr(dialog, \"data-icon\", `${opt.icon ?? \"\"}` || null);\n\tattr(dialog, \"data-timeout\", `${opt.timeout ?? \"\"}` || null);\n\tattr(dialog, \"id\", opt.id || `${Date.now()}`);\n\tattr(dialog, \"open\", opt.open === false ? null : \"\");\n\n\tdialog.innerHTML = content;\n\tdialog.addEventListener(\"animationend\", handleToastClose, { once: true });\n\tdocument.body.appendChild(dialog);\n\treturn dialog.id;\n}\n\nfunction handleToastClose({ animationName, target }: Partial<AnimationEvent>) {\n\tif (animationName === styles._toastClose)\n\t\t(target as HTMLDialogElement).remove();\n}\n\n// Expose toast.danger, toast.info, toast.success etc.\ntoast.success = (content: string, opt?: ToastOptions) =>\n\ttoast(content, { color: \"success\", ...opt });\ntoast.danger = (content: string, opt?: ToastOptions) =>\n\ttoast(content, { color: \"danger\", ...opt });\ntoast.info = (content: string, opt: ToastOptions) =>\n\ttoast(content, { color: \"info\", ...opt });\ntoast.warning = (content: string, opt?: ToastOptions) =>\n\ttoast(content, { color: \"warning\", ...opt });\ntoast.neutral = (content: string, opt?: ToastOptions) =>\n\ttoast(content, { color: \"neutral\", ...opt });\ntoast.promise = async function promise<T>(\n\taction: () => Promise<T>,\n\tprops: ToastOptions & {\n\t\tloading: string;\n\t\tsuccess: string;\n\t\terror: string;\n\t},\n): Promise<T> {\n\tconst { loading, success, error, ...opt } = props;\n\tconst id = toast(loading, { busy: true, ...opt });\n\ttry {\n\t\tconst result = await action();\n\t\ttoast.success(success, { id, busy: false });\n\t\treturn result;\n\t} catch (_error) {\n\t\ttoast.danger(error, { id, busy: false });\n\t\tthrow _error;\n\t}\n};\n"],"names":[
|
|
1
|
+
{"version":3,"file":"toast-helper.js","sources":["../../designsystem/toast/toast-helper.ts"],"sourcesContent":["import clsx from \"clsx\";\nimport styles from \"../styles.module.css\";\nimport { attr, tag } from \"../utils\";\n\nexport type ToastOptions = {\n\tclassName?: string;\n\tclosedby?: \"none\";\n\tcolor?: \"main\" | \"neutral\" | \"success\" | \"danger\" | \"info\" | \"warning\";\n\ticon?: boolean | \"none\";\n\ttimeout?: number | false;\n\tbusy?: boolean;\n\topen?: boolean;\n\tid?: string;\n};\n\nexport function toast(content: string, opt: ToastOptions = {}) {\n\tconst dialog = document.getElementById(opt.id || \"\") || tag(\"dialog\");\n\n\tattr(dialog, \"aria-busy\", opt.busy ? \"true\" : null);\n\tattr(dialog, \"class\", clsx(styles.toast, opt.className));\n\tattr(dialog, \"data-closedby\", opt.closedby || null);\n\tattr(dialog, \"data-color\", opt.color || null);\n\tattr(dialog, \"data-icon\", `${opt.icon ?? \"\"}` || null);\n\tattr(dialog, \"data-timeout\", `${opt.timeout ?? \"\"}` || null);\n\tattr(dialog, \"id\", opt.id || `${Date.now()}`);\n\tattr(dialog, \"open\", opt.open === false ? null : \"\");\n\n\tdialog.innerHTML = content;\n\tdialog.addEventListener(\"animationend\", handleToastClose, { once: true });\n\tdocument.body.appendChild(dialog);\n\treturn dialog.id;\n}\n\nfunction handleToastClose({ animationName, target }: Partial<AnimationEvent>) {\n\tif (animationName === styles._toastClose)\n\t\t(target as HTMLDialogElement).remove();\n}\n\n// Expose toast.danger, toast.info, toast.success etc.\ntoast.success = (content: string, opt?: ToastOptions) =>\n\ttoast(content, { color: \"success\", ...opt });\ntoast.danger = (content: string, opt?: ToastOptions) =>\n\ttoast(content, { color: \"danger\", ...opt });\ntoast.info = (content: string, opt: ToastOptions) =>\n\ttoast(content, { color: \"info\", ...opt });\ntoast.warning = (content: string, opt?: ToastOptions) =>\n\ttoast(content, { color: \"warning\", ...opt });\ntoast.neutral = (content: string, opt?: ToastOptions) =>\n\ttoast(content, { color: \"neutral\", ...opt });\ntoast.promise = async function promise<T>(\n\taction: () => Promise<T>,\n\tprops: ToastOptions & {\n\t\tloading: string;\n\t\tsuccess: string;\n\t\terror: string;\n\t},\n): Promise<T> {\n\tconst { loading, success, error, ...opt } = props;\n\tconst id = toast(loading, { busy: true, ...opt });\n\ttry {\n\t\tconst result = await action();\n\t\ttoast.success(success, { id, busy: false });\n\t\treturn result;\n\t} catch (_error) {\n\t\ttoast.danger(error, { id, busy: false });\n\t\tthrow _error;\n\t}\n};\n"],"names":[],"mappings":";;;AAeO,SAAS,MAAM,SAAiB,MAAoB,IAAI;AAC9D,QAAM,SAAS,SAAS,eAAe,IAAI,MAAM,EAAE,KAAK,IAAI,QAAQ;AAEpE,OAAK,QAAQ,aAAa,IAAI,OAAO,SAAS,IAAI;AAClD,OAAK,QAAQ,SAAS,KAAK,OAAO,OAAO,IAAI,SAAS,CAAC;AACvD,OAAK,QAAQ,iBAAiB,IAAI,YAAY,IAAI;AAClD,OAAK,QAAQ,cAAc,IAAI,SAAS,IAAI;AAC5C,OAAK,QAAQ,aAAa,GAAG,IAAI,QAAQ,EAAE,MAAM,IAAI;AACrD,OAAK,QAAQ,gBAAgB,GAAG,IAAI,WAAW,EAAE,MAAM,IAAI;AAC3D,OAAK,QAAQ,MAAM,IAAI,MAAM,GAAG,KAAK,IAAA,CAAK,EAAE;AAC5C,OAAK,QAAQ,QAAQ,IAAI,SAAS,QAAQ,OAAO,EAAE;AAEnD,SAAO,YAAY;AACnB,SAAO,iBAAiB,gBAAgB,kBAAkB,EAAE,MAAM,MAAM;AACxE,WAAS,KAAK,YAAY,MAAM;AAChC,SAAO,OAAO;AACf;AAEA,SAAS,iBAAiB,EAAE,eAAe,UAAmC;AAC7E,MAAI,kBAAkB,OAAO;AAC3B,WAA6B,OAAA;AAChC;AAGA,MAAM,UAAU,CAAC,SAAiB,QACjC,MAAM,SAAS,EAAE,OAAO,WAAW,GAAG,KAAK;AAC5C,MAAM,SAAS,CAAC,SAAiB,QAChC,MAAM,SAAS,EAAE,OAAO,UAAU,GAAG,KAAK;AAC3C,MAAM,OAAO,CAAC,SAAiB,QAC9B,MAAM,SAAS,EAAE,OAAO,QAAQ,GAAG,KAAK;AACzC,MAAM,UAAU,CAAC,SAAiB,QACjC,MAAM,SAAS,EAAE,OAAO,WAAW,GAAG,KAAK;AAC5C,MAAM,UAAU,CAAC,SAAiB,QACjC,MAAM,SAAS,EAAE,OAAO,WAAW,GAAG,KAAK;AAC5C,MAAM,UAAU,eAAe,QAC9B,QACA,OAKa;AACb,QAAM,EAAE,SAAS,SAAS,OAAO,GAAG,QAAQ;AAC5C,QAAM,KAAK,MAAM,SAAS,EAAE,MAAM,MAAM,GAAG,KAAK;AAChD,MAAI;AACH,UAAM,SAAS,MAAM,OAAA;AACrB,UAAM,QAAQ,SAAS,EAAE,IAAI,MAAM,OAAO;AAC1C,WAAO;AAAA,EACR,SAAS,QAAQ;AAChB,UAAM,OAAO,OAAO,EAAE,IAAI,MAAM,OAAO;AACvC,UAAM;AAAA,EACP;AACD;"}
|
|
@@ -1,20 +1,35 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { onLoaded
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
import styles from "../styles.module.css.js";
|
|
2
|
+
import { onLoaded, on, attr } from "../utils.js";
|
|
3
|
+
const CSS_TOAST = styles.toast.split(" ")[0];
|
|
4
|
+
const ATTR_SORT = "data-sort";
|
|
5
|
+
function handleToastState({ animationName, target }) {
|
|
6
|
+
const dialog = target;
|
|
7
|
+
if (animationName === styles._toastTimeout) dialog.close();
|
|
8
|
+
if (animationName !== styles._toastOpen) return;
|
|
9
|
+
const ms = Number(attr(dialog, "data-timeout"));
|
|
10
|
+
dialog.style.setProperty("--mtdsc-toast-timeout", ms ? `${ms}ms` : null);
|
|
11
|
+
dialog.hasAttribute(ATTR_SORT) || attr(dialog, ATTR_SORT, `${Date.now()}`);
|
|
12
|
+
attr(dialog, "tabindex", "0");
|
|
13
|
+
[...document.querySelectorAll(`.${CSS_TOAST}[open]`)].sort((a, b) => Number(attr(b, ATTR_SORT)) - Number(attr(a, ATTR_SORT))).reduce((top, toast) => {
|
|
14
|
+
toast.style.translate = `0 ${toast === target ? 0 : top}px`;
|
|
15
|
+
return top + toast.offsetHeight + 5;
|
|
16
|
+
}, 0);
|
|
9
17
|
}
|
|
10
|
-
function
|
|
11
|
-
if (
|
|
12
|
-
const
|
|
13
|
-
|
|
18
|
+
function handleToastClick({ target, clientX: x, clientY: y }) {
|
|
19
|
+
if (target instanceof HTMLDialogElement && target.classList.contains(CSS_TOAST) && attr(target, "data-closedby") !== "none") {
|
|
20
|
+
const rect = target.getBoundingClientRect();
|
|
21
|
+
const toast = window.getComputedStyle(target);
|
|
22
|
+
const close = window.getComputedStyle(target, "::after");
|
|
23
|
+
const top = rect.top + Number.parseInt(toast.paddingTop, 10);
|
|
24
|
+
const bottom = top + Number.parseInt(close.height, 10);
|
|
25
|
+
const right = rect.right - Number.parseInt(toast.paddingRight, 10);
|
|
26
|
+
const left = right - Number.parseInt(close.width, 10);
|
|
27
|
+
const isClose = top <= y && y <= bottom && left <= x && x <= right;
|
|
28
|
+
if (isClose) target.close();
|
|
14
29
|
}
|
|
15
30
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
31
|
+
onLoaded(() => [
|
|
32
|
+
on(document, "animationstart", handleToastState),
|
|
33
|
+
on(document, "click", handleToastClick)
|
|
19
34
|
]);
|
|
20
35
|
//# sourceMappingURL=toast-observer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toast-observer.js","sources":["../../designsystem/toast/toast-observer.ts"],"sourcesContent":["import styles from \"../styles.module.css\";\nimport { attr, on, onLoaded } from \"../utils\";\n\nconst CSS_TOAST = styles.toast.split(\" \")[0];\nconst ATTR_SORT = \"data-sort\";\n\nfunction handleToastState({ animationName, target }: Partial<AnimationEvent>) {\n\tconst dialog = target as HTMLDialogElement;\n\tif (animationName === styles._toastTimeout) dialog.close();\n\tif (animationName !== styles._toastOpen) return;\n\n\tconst ms = Number(attr(dialog, \"data-timeout\"));\n\tdialog.style.setProperty(\"--mtdsc-toast-timeout\", ms ? `${ms}ms` : null);\n\tdialog.hasAttribute(ATTR_SORT) || attr(dialog, ATTR_SORT, `${Date.now()}`);\n\tattr(dialog, \"tabindex\", \"0\"); // Make focusable\n\n\t// Setup layout\n\t[...document.querySelectorAll<HTMLDialogElement>(`.${CSS_TOAST}[open]`)]\n\t\t.sort((a, b) => Number(attr(b, ATTR_SORT)) - Number(attr(a, ATTR_SORT)))\n\t\t.reduce((top, toast) => {\n\t\t\ttoast.style.translate = `0 ${toast === target ? 0 : top}px`;\n\t\t\treturn top + toast.offsetHeight + 5;\n\t\t}, 0);\n}\n\nfunction handleToastClick({ target, clientX: x, clientY: y }: MouseEvent) {\n\tif (\n\t\ttarget instanceof HTMLDialogElement &&\n\t\ttarget.classList.contains(CSS_TOAST) &&\n\t\tattr(target, \"data-closedby\") !== \"none\"\n\t) {\n\t\tconst rect = target.getBoundingClientRect();\n\t\tconst toast = window.getComputedStyle(target);\n\t\tconst close = window.getComputedStyle(target, \"::after\");\n\t\tconst top = rect.top + Number.parseInt(toast.paddingTop, 10);\n\t\tconst bottom = top + Number.parseInt(close.height, 10);\n\t\tconst right = rect.right - Number.parseInt(toast.paddingRight, 10);\n\t\tconst left = right - Number.parseInt(close.width, 10);\n\t\tconst isClose = top <= y && y <= bottom && left <= x && x <= right;\n\n\t\tif (isClose) target.close(); // Click is on ::after element\n\t}\n}\n\nonLoaded(() => [\n\ton(document, \"animationstart\", handleToastState),\n\ton(document, \"click\", handleToastClick as EventListener),\n]);\n"],"names":[
|
|
1
|
+
{"version":3,"file":"toast-observer.js","sources":["../../designsystem/toast/toast-observer.ts"],"sourcesContent":["import styles from \"../styles.module.css\";\nimport { attr, on, onLoaded } from \"../utils\";\n\nconst CSS_TOAST = styles.toast.split(\" \")[0];\nconst ATTR_SORT = \"data-sort\";\n\nfunction handleToastState({ animationName, target }: Partial<AnimationEvent>) {\n\tconst dialog = target as HTMLDialogElement;\n\tif (animationName === styles._toastTimeout) dialog.close();\n\tif (animationName !== styles._toastOpen) return;\n\n\tconst ms = Number(attr(dialog, \"data-timeout\"));\n\tdialog.style.setProperty(\"--mtdsc-toast-timeout\", ms ? `${ms}ms` : null);\n\tdialog.hasAttribute(ATTR_SORT) || attr(dialog, ATTR_SORT, `${Date.now()}`);\n\tattr(dialog, \"tabindex\", \"0\"); // Make focusable\n\n\t// Setup layout\n\t[...document.querySelectorAll<HTMLDialogElement>(`.${CSS_TOAST}[open]`)]\n\t\t.sort((a, b) => Number(attr(b, ATTR_SORT)) - Number(attr(a, ATTR_SORT)))\n\t\t.reduce((top, toast) => {\n\t\t\ttoast.style.translate = `0 ${toast === target ? 0 : top}px`;\n\t\t\treturn top + toast.offsetHeight + 5;\n\t\t}, 0);\n}\n\nfunction handleToastClick({ target, clientX: x, clientY: y }: MouseEvent) {\n\tif (\n\t\ttarget instanceof HTMLDialogElement &&\n\t\ttarget.classList.contains(CSS_TOAST) &&\n\t\tattr(target, \"data-closedby\") !== \"none\"\n\t) {\n\t\tconst rect = target.getBoundingClientRect();\n\t\tconst toast = window.getComputedStyle(target);\n\t\tconst close = window.getComputedStyle(target, \"::after\");\n\t\tconst top = rect.top + Number.parseInt(toast.paddingTop, 10);\n\t\tconst bottom = top + Number.parseInt(close.height, 10);\n\t\tconst right = rect.right - Number.parseInt(toast.paddingRight, 10);\n\t\tconst left = right - Number.parseInt(close.width, 10);\n\t\tconst isClose = top <= y && y <= bottom && left <= x && x <= right;\n\n\t\tif (isClose) target.close(); // Click is on ::after element\n\t}\n}\n\nonLoaded(() => [\n\ton(document, \"animationstart\", handleToastState),\n\ton(document, \"click\", handleToastClick as EventListener),\n]);\n"],"names":[],"mappings":";;AAGA,MAAM,YAAY,OAAO,MAAM,MAAM,GAAG,EAAE,CAAC;AAC3C,MAAM,YAAY;AAElB,SAAS,iBAAiB,EAAE,eAAe,UAAmC;AAC7E,QAAM,SAAS;AACf,MAAI,kBAAkB,OAAO,cAAe,QAAO,MAAA;AACnD,MAAI,kBAAkB,OAAO,WAAY;AAEzC,QAAM,KAAK,OAAO,KAAK,QAAQ,cAAc,CAAC;AAC9C,SAAO,MAAM,YAAY,yBAAyB,KAAK,GAAG,EAAE,OAAO,IAAI;AACvE,SAAO,aAAa,SAAS,KAAK,KAAK,QAAQ,WAAW,GAAG,KAAK,IAAA,CAAK,EAAE;AACzE,OAAK,QAAQ,YAAY,GAAG;AAG5B,GAAC,GAAG,SAAS,iBAAoC,IAAI,SAAS,QAAQ,CAAC,EACrE,KAAK,CAAC,GAAG,MAAM,OAAO,KAAK,GAAG,SAAS,CAAC,IAAI,OAAO,KAAK,GAAG,SAAS,CAAC,CAAC,EACtE,OAAO,CAAC,KAAK,UAAU;AACvB,UAAM,MAAM,YAAY,KAAK,UAAU,SAAS,IAAI,GAAG;AACvD,WAAO,MAAM,MAAM,eAAe;AAAA,EACnC,GAAG,CAAC;AACN;AAEA,SAAS,iBAAiB,EAAE,QAAQ,SAAS,GAAG,SAAS,KAAiB;AACzE,MACC,kBAAkB,qBAClB,OAAO,UAAU,SAAS,SAAS,KACnC,KAAK,QAAQ,eAAe,MAAM,QACjC;AACD,UAAM,OAAO,OAAO,sBAAA;AACpB,UAAM,QAAQ,OAAO,iBAAiB,MAAM;AAC5C,UAAM,QAAQ,OAAO,iBAAiB,QAAQ,SAAS;AACvD,UAAM,MAAM,KAAK,MAAM,OAAO,SAAS,MAAM,YAAY,EAAE;AAC3D,UAAM,SAAS,MAAM,OAAO,SAAS,MAAM,QAAQ,EAAE;AACrD,UAAM,QAAQ,KAAK,QAAQ,OAAO,SAAS,MAAM,cAAc,EAAE;AACjE,UAAM,OAAO,QAAQ,OAAO,SAAS,MAAM,OAAO,EAAE;AACpD,UAAM,UAAU,OAAO,KAAK,KAAK,UAAU,QAAQ,KAAK,KAAK;AAE7D,QAAI,gBAAgB,MAAA;AAAA,EACrB;AACD;AAEA,SAAS,MAAM;AAAA,EACd,GAAG,UAAU,kBAAkB,gBAAgB;AAAA,EAC/C,GAAG,UAAU,SAAS,gBAAiC;AACxD,CAAC;"}
|
package/mtds/toast/toast.js
CHANGED
|
@@ -1,54 +1,62 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { jsx
|
|
3
|
-
import
|
|
4
|
-
import { createRoot
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
7
|
-
if (
|
|
8
|
-
const
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import clsx from "clsx";
|
|
4
|
+
import { createRoot } from "react-dom/client";
|
|
5
|
+
import styles from "../styles.module.css.js";
|
|
6
|
+
import { isBrowser, tag } from "../utils.js";
|
|
7
|
+
if (isBrowser() && !window._mtdsReactToasts) {
|
|
8
|
+
const root = createRoot(document.body.appendChild(tag("div")));
|
|
9
|
+
const toasts = /* @__PURE__ */ new Map();
|
|
10
|
+
const render = () => root.render(Array.from(toasts.values() || []));
|
|
9
11
|
window._mtdsReactToasts = {
|
|
10
|
-
set: (
|
|
11
|
-
delete: ({ animationName
|
|
12
|
-
|
|
12
|
+
set: (id, jsx2) => toasts.set(id, jsx2) && render(),
|
|
13
|
+
delete: ({ animationName, currentTarget }) => {
|
|
14
|
+
if (animationName !== styles._toastClose) return;
|
|
15
|
+
toasts.delete(currentTarget.id);
|
|
16
|
+
render();
|
|
13
17
|
}
|
|
14
18
|
};
|
|
15
19
|
}
|
|
16
|
-
function
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
/* @__PURE__ */
|
|
20
|
+
function toast(content, opt = {}) {
|
|
21
|
+
const id = opt.id || `${Date.now()}`;
|
|
22
|
+
window._mtdsReactToasts?.set(
|
|
23
|
+
id,
|
|
24
|
+
/* @__PURE__ */ jsx(
|
|
21
25
|
"dialog",
|
|
22
26
|
{
|
|
23
|
-
"aria-busy":
|
|
24
|
-
className:
|
|
25
|
-
"data-closedby":
|
|
26
|
-
"data-color":
|
|
27
|
-
"data-timeout":
|
|
28
|
-
id
|
|
27
|
+
"aria-busy": opt.busy,
|
|
28
|
+
className: clsx(styles.toast, opt.className),
|
|
29
|
+
"data-closedby": opt.closedby,
|
|
30
|
+
"data-color": opt.color,
|
|
31
|
+
"data-timeout": opt.timeout,
|
|
32
|
+
id,
|
|
29
33
|
onAnimationEnd: window._mtdsReactToasts.delete,
|
|
30
|
-
open:
|
|
31
|
-
children:
|
|
34
|
+
open: opt.open ?? true,
|
|
35
|
+
children: content
|
|
32
36
|
},
|
|
33
|
-
|
|
37
|
+
id
|
|
34
38
|
)
|
|
35
|
-
)
|
|
39
|
+
);
|
|
40
|
+
return id;
|
|
36
41
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
const { loading
|
|
42
|
+
toast.success = (content, opt) => toast(content, { color: "success", ...opt });
|
|
43
|
+
toast.danger = (content, opt) => toast(content, { color: "danger", ...opt });
|
|
44
|
+
toast.info = (content, opt) => toast(content, { color: "info", ...opt });
|
|
45
|
+
toast.warning = (content, opt) => toast(content, { color: "warning", ...opt });
|
|
46
|
+
toast.neutral = (content, opt) => toast(content, { color: "neutral", ...opt });
|
|
47
|
+
toast.promise = async function promise(action, props) {
|
|
48
|
+
const { loading, success, error, ...opt } = props;
|
|
49
|
+
const id = toast(loading, { busy: true, ...opt });
|
|
44
50
|
try {
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
51
|
+
const result = await action();
|
|
52
|
+
toast.success(success, { id, busy: false });
|
|
53
|
+
return result;
|
|
54
|
+
} catch (_error) {
|
|
55
|
+
toast.danger(error, { id, busy: false });
|
|
56
|
+
throw _error;
|
|
49
57
|
}
|
|
50
58
|
};
|
|
51
59
|
export {
|
|
52
|
-
|
|
60
|
+
toast
|
|
53
61
|
};
|
|
54
62
|
//# sourceMappingURL=toast.js.map
|
package/mtds/toast/toast.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toast.js","sources":["../../designsystem/toast/toast.tsx"],"sourcesContent":["\"use client\";\nimport clsx from \"clsx\";\nimport { createRoot } from \"react-dom/client\";\nimport styles from \"../styles.module.css\";\nimport {
|
|
1
|
+
{"version":3,"file":"toast.js","sources":["../../designsystem/toast/toast.tsx"],"sourcesContent":["\"use client\";\nimport clsx from \"clsx\";\nimport { createRoot } from \"react-dom/client\";\nimport styles from \"../styles.module.css\";\nimport { isBrowser, tag } from \"../utils\";\nimport type { ToastOptions } from \"./toast-helper\";\n\ndeclare global {\n\tinterface Window {\n\t\t_mtdsReactToasts?: {\n\t\t\tset: (id: string, jsx: React.ReactNode) => void;\n\t\t\tdelete: (event: React.AnimationEvent<HTMLDialogElement>) => void;\n\t\t};\n\t}\n}\n\n// Ensure only a single toast master is created\nif (isBrowser() && !window._mtdsReactToasts) {\n\tconst root = createRoot(document.body.appendChild(tag(\"div\")));\n\tconst toasts = new Map<string, React.ReactNode>();\n\tconst render = () => root.render(Array.from(toasts.values() || []));\n\n\t// Expose methods to add/remove toasts from the root container\n\twindow._mtdsReactToasts = {\n\t\tset: (id, jsx) => toasts.set(id, jsx) && render(),\n\t\tdelete: ({ animationName, currentTarget }) => {\n\t\t\tif (animationName !== styles._toastClose) return;\n\t\t\ttoasts.delete(currentTarget.id);\n\t\t\trender();\n\t\t},\n\t};\n}\n\nexport function toast(content: React.ReactNode, opt: ToastOptions = {}) {\n\tconst id = opt.id || `${Date.now()}`;\n\twindow._mtdsReactToasts?.set(\n\t\tid,\n\t\t<dialog\n\t\t\taria-busy={opt.busy}\n\t\t\tclassName={clsx(styles.toast, opt.className)}\n\t\t\tdata-closedby={opt.closedby}\n\t\t\tdata-color={opt.color}\n\t\t\tdata-timeout={opt.timeout}\n\t\t\tid={id}\n\t\t\tkey={id}\n\t\t\tonAnimationEnd={window._mtdsReactToasts.delete}\n\t\t\topen={opt.open ?? true}\n\t\t>\n\t\t\t{content}\n\t\t</dialog>,\n\t);\n\n\treturn id;\n}\n\n// Expose toast.danger, toast.info, toast.success etc.\ntoast.success = (content: React.ReactNode, opt?: ToastOptions) =>\n\ttoast(content, { color: \"success\", ...opt });\ntoast.danger = (content: React.ReactNode, opt?: ToastOptions) =>\n\ttoast(content, { color: \"danger\", ...opt });\ntoast.info = (content: React.ReactNode, opt?: ToastOptions) =>\n\ttoast(content, { color: \"info\", ...opt });\ntoast.warning = (content: React.ReactNode, opt?: ToastOptions) =>\n\ttoast(content, { color: \"warning\", ...opt });\ntoast.neutral = (content: React.ReactNode, opt?: ToastOptions) =>\n\ttoast(content, { color: \"neutral\", ...opt });\ntoast.promise = async function promise<T>(\n\taction: () => Promise<T>,\n\tprops: ToastOptions & {\n\t\tloading: React.ReactNode;\n\t\tsuccess: React.ReactNode;\n\t\terror: React.ReactNode;\n\t},\n): Promise<T> {\n\tconst { loading, success, error, ...opt } = props;\n\tconst id = toast(loading, { busy: true, ...opt });\n\ttry {\n\t\tconst result = await action();\n\t\ttoast.success(success, { id, busy: false });\n\t\treturn result;\n\t} catch (_error) {\n\t\ttoast.danger(error, { id, busy: false });\n\t\tthrow _error;\n\t}\n};\n"],"names":["jsx"],"mappings":";;;;;AAiBA,IAAI,UAAA,KAAe,CAAC,OAAO,kBAAkB;AAC5C,QAAM,OAAO,WAAW,SAAS,KAAK,YAAY,IAAI,KAAK,CAAC,CAAC;AAC7D,QAAM,6BAAa,IAAA;AACnB,QAAM,SAAS,MAAM,KAAK,OAAO,MAAM,KAAK,OAAO,YAAY,CAAA,CAAE,CAAC;AAGlE,SAAO,mBAAmB;AAAA,IACzB,KAAK,CAAC,IAAIA,SAAQ,OAAO,IAAI,IAAIA,IAAG,KAAK,OAAA;AAAA,IACzC,QAAQ,CAAC,EAAE,eAAe,oBAAoB;AAC7C,UAAI,kBAAkB,OAAO,YAAa;AAC1C,aAAO,OAAO,cAAc,EAAE;AAC9B,aAAA;AAAA,IACD;AAAA,EAAA;AAEF;AAEO,SAAS,MAAM,SAA0B,MAAoB,IAAI;AACvE,QAAM,KAAK,IAAI,MAAM,GAAG,KAAK,KAAK;AAClC,SAAO,kBAAkB;AAAA,IACxB;AAAA,IACA;AAAA,MAAC;AAAA,MAAA;AAAA,QACA,aAAW,IAAI;AAAA,QACf,WAAW,KAAK,OAAO,OAAO,IAAI,SAAS;AAAA,QAC3C,iBAAe,IAAI;AAAA,QACnB,cAAY,IAAI;AAAA,QAChB,gBAAc,IAAI;AAAA,QAClB;AAAA,QAEA,gBAAgB,OAAO,iBAAiB;AAAA,QACxC,MAAM,IAAI,QAAQ;AAAA,QAEjB,UAAA;AAAA,MAAA;AAAA,MAJI;AAAA,IAAA;AAAA,EAKN;AAGD,SAAO;AACR;AAGA,MAAM,UAAU,CAAC,SAA0B,QAC1C,MAAM,SAAS,EAAE,OAAO,WAAW,GAAG,KAAK;AAC5C,MAAM,SAAS,CAAC,SAA0B,QACzC,MAAM,SAAS,EAAE,OAAO,UAAU,GAAG,KAAK;AAC3C,MAAM,OAAO,CAAC,SAA0B,QACvC,MAAM,SAAS,EAAE,OAAO,QAAQ,GAAG,KAAK;AACzC,MAAM,UAAU,CAAC,SAA0B,QAC1C,MAAM,SAAS,EAAE,OAAO,WAAW,GAAG,KAAK;AAC5C,MAAM,UAAU,CAAC,SAA0B,QAC1C,MAAM,SAAS,EAAE,OAAO,WAAW,GAAG,KAAK;AAC5C,MAAM,UAAU,eAAe,QAC9B,QACA,OAKa;AACb,QAAM,EAAE,SAAS,SAAS,OAAO,GAAG,QAAQ;AAC5C,QAAM,KAAK,MAAM,SAAS,EAAE,MAAM,MAAM,GAAG,KAAK;AAChD,MAAI;AACH,UAAM,SAAS,MAAM,OAAA;AACrB,UAAM,QAAQ,SAAS,EAAE,IAAI,MAAM,OAAO;AAC1C,WAAO;AAAA,EACR,SAAS,QAAQ;AAChB,UAAM,OAAO,OAAO,EAAE,IAAI,MAAM,OAAO;AACvC,UAAM;AAAA,EACP;AACD;"}
|
|
@@ -1,13 +1,18 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { onLoaded
|
|
3
|
-
const
|
|
4
|
-
function
|
|
5
|
-
const { key
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
import styles from "../styles.module.css.js";
|
|
2
|
+
import { onLoaded, on } from "../utils.js";
|
|
3
|
+
const CSS_TOGGLEGROUP = `.${styles.togglegroup.split(" ")[0]}`;
|
|
4
|
+
function handleTogglegroupKeydown(event) {
|
|
5
|
+
const { key, target: el } = event;
|
|
6
|
+
const group = el instanceof HTMLInputElement && el.closest(CSS_TOGGLEGROUP);
|
|
7
|
+
if (!group) return;
|
|
8
|
+
if (key === "Enter") el.click();
|
|
9
|
+
if (key?.startsWith("Arrow")) {
|
|
10
|
+
event.preventDefault();
|
|
11
|
+
const inputs = group.getElementsByTagName("input");
|
|
12
|
+
const index = [...inputs].indexOf(el);
|
|
13
|
+
const move = key.match(/Arrow(Right|Down)/) ? 1 : -1;
|
|
14
|
+
inputs[(inputs.length + index + move) % inputs.length]?.focus();
|
|
10
15
|
}
|
|
11
16
|
}
|
|
12
|
-
|
|
17
|
+
onLoaded(() => [on(document, "keydown", handleTogglegroupKeydown)]);
|
|
13
18
|
//# sourceMappingURL=togglegroup-observer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"togglegroup-observer.js","sources":["../../designsystem/togglegroup/togglegroup-observer.ts"],"sourcesContent":["import styles from \"../styles.module.css\";\nimport { on, onLoaded } from \"../utils\";\n\nconst CSS_TOGGLEGROUP = `.${styles.togglegroup.split(\" \")[0]}`;\n\n// Prevent browsers from showing default validation bubbles\nfunction handleTogglegroupKeydown(event: Event & Partial<KeyboardEvent>) {\n\tconst { key, target: el } = event;\n\tconst group = el instanceof HTMLInputElement && el.closest(CSS_TOGGLEGROUP);\n\n\tif (!group) return;\n\tif (key === \"Enter\") el.click();\n\tif (key?.startsWith(\"Arrow\")) {\n\t\tevent.preventDefault();\n\t\tconst inputs = group.getElementsByTagName(\"input\");\n\t\tconst index = [...inputs].indexOf(el);\n\t\tconst move = key.match(/Arrow(Right|Down)/) ? 1 : -1;\n\t\tinputs[(inputs.length + index + move) % inputs.length]?.focus();\n\t}\n}\n\nonLoaded(() => [on(document, \"keydown\", handleTogglegroupKeydown)]);\n"],"names":[
|
|
1
|
+
{"version":3,"file":"togglegroup-observer.js","sources":["../../designsystem/togglegroup/togglegroup-observer.ts"],"sourcesContent":["import styles from \"../styles.module.css\";\nimport { on, onLoaded } from \"../utils\";\n\nconst CSS_TOGGLEGROUP = `.${styles.togglegroup.split(\" \")[0]}`;\n\n// Prevent browsers from showing default validation bubbles\nfunction handleTogglegroupKeydown(event: Event & Partial<KeyboardEvent>) {\n\tconst { key, target: el } = event;\n\tconst group = el instanceof HTMLInputElement && el.closest(CSS_TOGGLEGROUP);\n\n\tif (!group) return;\n\tif (key === \"Enter\") el.click();\n\tif (key?.startsWith(\"Arrow\")) {\n\t\tevent.preventDefault();\n\t\tconst inputs = group.getElementsByTagName(\"input\");\n\t\tconst index = [...inputs].indexOf(el);\n\t\tconst move = key.match(/Arrow(Right|Down)/) ? 1 : -1;\n\t\tinputs[(inputs.length + index + move) % inputs.length]?.focus();\n\t}\n}\n\nonLoaded(() => [on(document, \"keydown\", handleTogglegroupKeydown)]);\n"],"names":[],"mappings":";;AAGA,MAAM,kBAAkB,IAAI,OAAO,YAAY,MAAM,GAAG,EAAE,CAAC,CAAC;AAG5D,SAAS,yBAAyB,OAAuC;AACxE,QAAM,EAAE,KAAK,QAAQ,GAAA,IAAO;AAC5B,QAAM,QAAQ,cAAc,oBAAoB,GAAG,QAAQ,eAAe;AAE1E,MAAI,CAAC,MAAO;AACZ,MAAI,QAAQ,QAAS,IAAG,MAAA;AACxB,MAAI,KAAK,WAAW,OAAO,GAAG;AAC7B,UAAM,eAAA;AACN,UAAM,SAAS,MAAM,qBAAqB,OAAO;AACjD,UAAM,QAAQ,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE;AACpC,UAAM,OAAO,IAAI,MAAM,mBAAmB,IAAI,IAAI;AAClD,YAAQ,OAAO,SAAS,QAAQ,QAAQ,OAAO,MAAM,GAAG,MAAA;AAAA,EACzD;AACD;AAEA,SAAS,MAAM,CAAC,GAAG,UAAU,WAAW,wBAAwB,CAAC,CAAC;"}
|
|
@@ -3,9 +3,9 @@ export type TogglegroupItemProps = Omit<React.ComponentPropsWithoutRef<"label">,
|
|
|
3
3
|
name: string;
|
|
4
4
|
value: string;
|
|
5
5
|
};
|
|
6
|
-
export declare const Togglegroup:
|
|
7
|
-
Item:
|
|
6
|
+
export declare const Togglegroup: import('react').ForwardRefExoticComponent<Omit<import('react').DetailedHTMLProps<import('react').FieldsetHTMLAttributes<HTMLFieldSetElement>, HTMLFieldSetElement>, "ref"> & import('react').RefAttributes<HTMLFieldSetElement>> & {
|
|
7
|
+
Item: import('react').ForwardRefExoticComponent<Omit<Omit<import('react').DetailedHTMLProps<import('react').LabelHTMLAttributes<HTMLLabelElement>, HTMLLabelElement>, "ref">, "onChange"> & Pick<Omit<import('react').DetailedHTMLProps<import('react').InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>, "ref">, "defaultChecked" | "onChange" | "checked"> & {
|
|
8
8
|
name: string;
|
|
9
9
|
value: string;
|
|
10
|
-
} &
|
|
10
|
+
} & import('react').RefAttributes<HTMLLabelElement>>;
|
|
11
11
|
};
|
|
@@ -1,29 +1,31 @@
|
|
|
1
|
-
import { jsx
|
|
2
|
-
import
|
|
3
|
-
import { forwardRef
|
|
4
|
-
import
|
|
5
|
-
const
|
|
6
|
-
function({ className
|
|
7
|
-
return /* @__PURE__ */
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import clsx from "clsx";
|
|
3
|
+
import { forwardRef } from "react";
|
|
4
|
+
import styles from "../styles.module.css.js";
|
|
5
|
+
const TogglegroupComp = forwardRef(
|
|
6
|
+
function Togglegroup2({ className, ...rest }, ref) {
|
|
7
|
+
return /* @__PURE__ */ jsx(
|
|
8
8
|
"fieldset",
|
|
9
9
|
{
|
|
10
|
-
className:
|
|
11
|
-
ref
|
|
12
|
-
...
|
|
10
|
+
className: clsx(styles.togglegroup, className),
|
|
11
|
+
ref,
|
|
12
|
+
...rest
|
|
13
13
|
}
|
|
14
14
|
);
|
|
15
15
|
}
|
|
16
|
-
)
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
16
|
+
);
|
|
17
|
+
const TogglegroupItem = forwardRef(
|
|
18
|
+
function TogglegroupItem2({ children, checked, defaultChecked, name, onChange, ...rest }, ref) {
|
|
19
|
+
return /* @__PURE__ */ jsxs("label", { ref, ...rest, children: [
|
|
20
|
+
/* @__PURE__ */ jsx("input", { type: "radio", ...{ checked, defaultChecked, name, onChange } }),
|
|
21
|
+
children
|
|
21
22
|
] });
|
|
22
23
|
}
|
|
23
|
-
)
|
|
24
|
-
|
|
24
|
+
);
|
|
25
|
+
const Togglegroup = Object.assign(TogglegroupComp, {
|
|
26
|
+
Item: TogglegroupItem
|
|
25
27
|
});
|
|
26
28
|
export {
|
|
27
|
-
|
|
29
|
+
Togglegroup
|
|
28
30
|
};
|
|
29
31
|
//# sourceMappingURL=togglegroup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"togglegroup.js","sources":["../../designsystem/togglegroup/togglegroup.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { forwardRef } from \"react\";\nimport styles from \"../styles.module.css\";\n\nexport type TogglegroupProps = React.ComponentPropsWithoutRef<\"fieldset\">;\nexport type TogglegroupItemProps = Omit<\n\tReact.ComponentPropsWithoutRef<\"label\">,\n\t\"onChange\"\n> &\n\tPick<\n\t\tReact.ComponentPropsWithoutRef<\"input\">,\n\t\t\"defaultChecked\" | \"checked\" | \"onChange\"\n\t> & { name: string; value: string }; // Make name and value required\n\nconst TogglegroupComp = forwardRef<HTMLFieldSetElement, TogglegroupProps>(\n\tfunction Togglegroup({ className, ...rest }, ref) {\n\t\treturn (\n\t\t\t<fieldset\n\t\t\t\tclassName={clsx(styles.togglegroup, className)}\n\t\t\t\tref={ref}\n\t\t\t\t{...rest}\n\t\t\t/>\n\t\t);\n\t},\n);\nconst TogglegroupItem = forwardRef<HTMLLabelElement, TogglegroupItemProps>(\n\tfunction TogglegroupItem(\n\t\t{ children, checked, defaultChecked, name, onChange, ...rest },\n\t\tref,\n\t) {\n\t\treturn (\n\t\t\t<label ref={ref} {...rest}>\n\t\t\t\t<input type=\"radio\" {...{ checked, defaultChecked, name, onChange }} />\n\t\t\t\t{children}\n\t\t\t</label>\n\t\t);\n\t},\n);\n\nexport const Togglegroup = Object.assign(TogglegroupComp, {\n\tItem: TogglegroupItem,\n});\n"],"names":["
|
|
1
|
+
{"version":3,"file":"togglegroup.js","sources":["../../designsystem/togglegroup/togglegroup.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { forwardRef } from \"react\";\nimport styles from \"../styles.module.css\";\n\nexport type TogglegroupProps = React.ComponentPropsWithoutRef<\"fieldset\">;\nexport type TogglegroupItemProps = Omit<\n\tReact.ComponentPropsWithoutRef<\"label\">,\n\t\"onChange\"\n> &\n\tPick<\n\t\tReact.ComponentPropsWithoutRef<\"input\">,\n\t\t\"defaultChecked\" | \"checked\" | \"onChange\"\n\t> & { name: string; value: string }; // Make name and value required\n\nconst TogglegroupComp = forwardRef<HTMLFieldSetElement, TogglegroupProps>(\n\tfunction Togglegroup({ className, ...rest }, ref) {\n\t\treturn (\n\t\t\t<fieldset\n\t\t\t\tclassName={clsx(styles.togglegroup, className)}\n\t\t\t\tref={ref}\n\t\t\t\t{...rest}\n\t\t\t/>\n\t\t);\n\t},\n);\nconst TogglegroupItem = forwardRef<HTMLLabelElement, TogglegroupItemProps>(\n\tfunction TogglegroupItem(\n\t\t{ children, checked, defaultChecked, name, onChange, ...rest },\n\t\tref,\n\t) {\n\t\treturn (\n\t\t\t<label ref={ref} {...rest}>\n\t\t\t\t<input type=\"radio\" {...{ checked, defaultChecked, name, onChange }} />\n\t\t\t\t{children}\n\t\t\t</label>\n\t\t);\n\t},\n);\n\nexport const Togglegroup = Object.assign(TogglegroupComp, {\n\tItem: TogglegroupItem,\n});\n"],"names":["Togglegroup","TogglegroupItem"],"mappings":";;;;AAcA,MAAM,kBAAkB;AAAA,EACvB,SAASA,aAAY,EAAE,WAAW,GAAG,KAAA,GAAQ,KAAK;AACjD,WACC;AAAA,MAAC;AAAA,MAAA;AAAA,QACA,WAAW,KAAK,OAAO,aAAa,SAAS;AAAA,QAC7C;AAAA,QACC,GAAG;AAAA,MAAA;AAAA,IAAA;AAAA,EAGP;AACD;AACA,MAAM,kBAAkB;AAAA,EACvB,SAASC,iBACR,EAAE,UAAU,SAAS,gBAAgB,MAAM,UAAU,GAAG,KAAA,GACxD,KACC;AACD,WACC,qBAAC,SAAA,EAAM,KAAW,GAAG,MACpB,UAAA;AAAA,MAAA,oBAAC,SAAA,EAAM,MAAK,SAAS,GAAG,EAAE,SAAS,gBAAgB,MAAM,SAAA,GAAY;AAAA,MACpE;AAAA,IAAA,GACF;AAAA,EAEF;AACD;AAEO,MAAM,cAAc,OAAO,OAAO,iBAAiB;AAAA,EACzD,MAAM;AACP,CAAC;"}
|
|
@@ -1,43 +1,59 @@
|
|
|
1
|
-
import { flip
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import { flip, shift } from "@floating-ui/dom";
|
|
2
|
+
import styles from "../styles.module.css.js";
|
|
3
|
+
import { isBrowser, tag, onLoaded, on, onMutation, QUICK_EVENT, attr, anchorPosition } from "../utils.js";
|
|
4
|
+
const ESC = "Escape";
|
|
5
|
+
const THROTTLE_DELAY = 300;
|
|
6
|
+
const TOOLTIP_ID = "mtds-tooltip";
|
|
7
|
+
const TOOLTIP = isBrowser() ? document.getElementById(TOOLTIP_ID) || tag("div", {
|
|
8
|
+
class: styles._tooltip,
|
|
9
|
+
id: TOOLTIP_ID,
|
|
7
10
|
popover: "manual"
|
|
8
11
|
}) : null;
|
|
9
|
-
let
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
12
|
+
let ANCHOR = null;
|
|
13
|
+
let LAST_CALL = Number.NEGATIVE_INFINITY;
|
|
14
|
+
let THROTTLE = 0;
|
|
15
|
+
function handleTipToggle({ target, type, key }) {
|
|
16
|
+
if (type === "keydown" && key !== ESC) return;
|
|
17
|
+
const wait = LAST_CALL + THROTTLE_DELAY - Date.now();
|
|
18
|
+
clearTimeout(THROTTLE);
|
|
19
|
+
THROTTLE = setTimeout(
|
|
20
|
+
handleMoveThrottled,
|
|
21
|
+
Math.max(wait, 0),
|
|
22
|
+
key === ESC ? null : target
|
|
17
23
|
);
|
|
18
24
|
}
|
|
19
|
-
function
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
25
|
+
function handleMoveThrottled(target) {
|
|
26
|
+
LAST_CALL = Date.now();
|
|
27
|
+
if (!TOOLTIP || target === TOOLTIP) return;
|
|
28
|
+
if (!TOOLTIP?.isConnected) document.body.append(TOOLTIP);
|
|
29
|
+
let anchor = target?.closest?.("[data-tooltip]") || null;
|
|
30
|
+
if (anchor === ANCHOR) return;
|
|
31
|
+
const text = anchor && attr(anchor, "data-tooltip") || "";
|
|
32
|
+
const position = anchor && attr(anchor, "data-tooltip-position") || window.getComputedStyle(anchor || document.body).getPropertyValue("--mtds-tooltip-position")?.trim() || "top";
|
|
33
|
+
const isHidden = !text || text === "false" || text === "true" || position === "none";
|
|
34
|
+
if (isHidden) anchor = null;
|
|
35
|
+
if (anchor) TOOLTIP.textContent = text;
|
|
36
|
+
anchorPosition(TOOLTIP, false);
|
|
37
|
+
ANCHOR = anchor;
|
|
38
|
+
TOOLTIP.hidePopover();
|
|
39
|
+
TOOLTIP.togglePopover(!!anchor);
|
|
40
|
+
anchorPosition(TOOLTIP, anchor || false, {
|
|
26
41
|
strategy: "fixed",
|
|
27
|
-
placement:
|
|
28
|
-
middleware: [
|
|
42
|
+
placement: position,
|
|
43
|
+
middleware: [flip(), shift({ padding: 10 })]
|
|
29
44
|
});
|
|
30
45
|
}
|
|
31
|
-
function
|
|
32
|
-
document.querySelectorAll("[data-tooltip]").forEach((
|
|
33
|
-
const
|
|
34
|
-
|
|
46
|
+
function handleTipLabels() {
|
|
47
|
+
document.querySelectorAll("[data-tooltip]").forEach((el) => {
|
|
48
|
+
const empty = !el?.textContent?.trim();
|
|
49
|
+
const text = attr(el, "data-tooltip");
|
|
50
|
+
attr(el, `aria-${empty ? "label" : "description"}`, text);
|
|
35
51
|
});
|
|
36
52
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
53
|
+
onLoaded(() => [
|
|
54
|
+
on(document, "blur,focus,mouseout,mouseover", handleTipToggle, QUICK_EVENT),
|
|
55
|
+
on(window, "keydown", handleTipToggle, QUICK_EVENT),
|
|
56
|
+
on(window, "blur", handleTipToggle, QUICK_EVENT),
|
|
57
|
+
onMutation(handleTipLabels, "data-tooltip")
|
|
42
58
|
]);
|
|
43
59
|
//# sourceMappingURL=tooltip-observer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tooltip-observer.js","sources":["../../designsystem/tooltip/tooltip-observer.ts"],"sourcesContent":["import { flip, type Placement, shift } from \"@floating-ui/dom\";\nimport styles from \"../styles.module.css\";\nimport {\n\tanchorPosition,\n\tattr,\n\
|
|
1
|
+
{"version":3,"file":"tooltip-observer.js","sources":["../../designsystem/tooltip/tooltip-observer.ts"],"sourcesContent":["import { flip, type Placement, shift } from \"@floating-ui/dom\";\nimport styles from \"../styles.module.css\";\nimport {\n\tanchorPosition,\n\tattr,\n\tisBrowser,\n\ton,\n\tonLoaded,\n\tonMutation,\n\tQUICK_EVENT,\n\ttag,\n} from \"../utils\";\n\nconst ESC = \"Escape\";\nconst THROTTLE_DELAY = 300;\nconst TOOLTIP_ID = \"mtds-tooltip\";\nconst TOOLTIP = isBrowser()\n\t? document.getElementById(TOOLTIP_ID) ||\n\t\ttag(\"div\", {\n\t\t\tclass: styles._tooltip,\n\t\t\tid: TOOLTIP_ID,\n\t\t\tpopover: \"manual\",\n\t\t})\n\t: null;\n\nlet ANCHOR: Element | null = null;\nlet LAST_CALL = Number.NEGATIVE_INFINITY;\nlet THROTTLE: number | ReturnType<typeof setTimeout> = 0;\n\nfunction handleTipToggle({ target, type, key }: Event & { key?: string }) {\n\tif (type === \"keydown\" && key !== ESC) return; // Allow ESC dismiss to follow https://www.w3.org/WAI/ARIA/apg/patterns/tooltip/\n\tconst wait = LAST_CALL + THROTTLE_DELAY - Date.now();\n\tclearTimeout(THROTTLE);\n\tTHROTTLE = setTimeout(\n\t\thandleMoveThrottled,\n\t\tMath.max(wait, 0),\n\t\tkey === ESC ? null : target,\n\t);\n}\n\n// Using a throttled function to avoid performance issues\nfunction handleMoveThrottled(target: Element | null) {\n\tLAST_CALL = Date.now();\n\n\t// Build and append tooltip if not existing\n\tif (!TOOLTIP || target === TOOLTIP) return; // Allow tooltip to be hovered, following https://www.w3.org/TR/WCAG21/#content-on-hover-or-focus\n\tif (!TOOLTIP?.isConnected) document.body.append(TOOLTIP); // Ensure connected\n\tlet anchor = target?.closest?.<Element>(\"[data-tooltip]\") || null;\n\n\t// No need to update\n\tif (anchor === ANCHOR) return;\n\n\tconst text = (anchor && attr(anchor, \"data-tooltip\")) || \"\";\n\tconst position =\n\t\t(anchor && attr(anchor, \"data-tooltip-position\")) ||\n\t\twindow\n\t\t\t.getComputedStyle(anchor || document.body)\n\t\t\t.getPropertyValue(\"--mtds-tooltip-position\")\n\t\t\t?.trim() ||\n\t\t\"top\"; // Position can both be set by attribute or CSS custom property\n\n\tconst isHidden =\n\t\t!text || text === \"false\" || text === \"true\" || position === \"none\";\n\n\tif (isHidden) anchor = null; // Do not show tooltip if boolish value\n\tif (anchor) TOOLTIP.textContent = text; // Only update content if new anchor\n\n\tanchorPosition(TOOLTIP, false); // Reset anchor position\n\n\tANCHOR = anchor; // Store new anchor - might be null if no new anchor\n\tTOOLTIP.hidePopover(); // Hide tooltip so it can be placed on top-layer on next show\n\tTOOLTIP.togglePopover(!!anchor);\n\tanchorPosition(TOOLTIP, anchor || false, {\n\t\tstrategy: \"fixed\",\n\t\tplacement: position as Placement,\n\t\tmiddleware: [flip(), shift({ padding: 10 })],\n\t});\n}\n\nfunction handleTipLabels() {\n\tdocument.querySelectorAll(\"[data-tooltip]\").forEach((el) => {\n\t\tconst empty = !el?.textContent?.trim();\n\t\tconst text = attr(el, \"data-tooltip\");\n\t\tattr(el, `aria-${empty ? \"label\" : \"description\"}`, text);\n\t});\n}\n\nonLoaded(() => [\n\ton(document, \"blur,focus,mouseout,mouseover\", handleTipToggle, QUICK_EVENT),\n\ton(window, \"keydown\", handleTipToggle, QUICK_EVENT),\n\ton(window, \"blur\", handleTipToggle, QUICK_EVENT),\n\tonMutation(handleTipLabels, \"data-tooltip\"),\n]);\n"],"names":[],"mappings":";;;AAaA,MAAM,MAAM;AACZ,MAAM,iBAAiB;AACvB,MAAM,aAAa;AACnB,MAAM,UAAU,cACb,SAAS,eAAe,UAAU,KACnC,IAAI,OAAO;AAAA,EACV,OAAO,OAAO;AAAA,EACd,IAAI;AAAA,EACJ,SAAS;AACV,CAAC,IACA;AAEH,IAAI,SAAyB;AAC7B,IAAI,YAAY,OAAO;AACvB,IAAI,WAAmD;AAEvD,SAAS,gBAAgB,EAAE,QAAQ,MAAM,OAAiC;AACzE,MAAI,SAAS,aAAa,QAAQ,IAAK;AACvC,QAAM,OAAO,YAAY,iBAAiB,KAAK,IAAA;AAC/C,eAAa,QAAQ;AACrB,aAAW;AAAA,IACV;AAAA,IACA,KAAK,IAAI,MAAM,CAAC;AAAA,IAChB,QAAQ,MAAM,OAAO;AAAA,EAAA;AAEvB;AAGA,SAAS,oBAAoB,QAAwB;AACpD,cAAY,KAAK,IAAA;AAGjB,MAAI,CAAC,WAAW,WAAW,QAAS;AACpC,MAAI,CAAC,SAAS,YAAa,UAAS,KAAK,OAAO,OAAO;AACvD,MAAI,SAAS,QAAQ,UAAmB,gBAAgB,KAAK;AAG7D,MAAI,WAAW,OAAQ;AAEvB,QAAM,OAAQ,UAAU,KAAK,QAAQ,cAAc,KAAM;AACzD,QAAM,WACJ,UAAU,KAAK,QAAQ,uBAAuB,KAC/C,OACE,iBAAiB,UAAU,SAAS,IAAI,EACxC,iBAAiB,yBAAyB,GACzC,UACH;AAED,QAAM,WACL,CAAC,QAAQ,SAAS,WAAW,SAAS,UAAU,aAAa;AAE9D,MAAI,SAAU,UAAS;AACvB,MAAI,gBAAgB,cAAc;AAElC,iBAAe,SAAS,KAAK;AAE7B,WAAS;AACT,UAAQ,YAAA;AACR,UAAQ,cAAc,CAAC,CAAC,MAAM;AAC9B,iBAAe,SAAS,UAAU,OAAO;AAAA,IACxC,UAAU;AAAA,IACV,WAAW;AAAA,IACX,YAAY,CAAC,KAAA,GAAQ,MAAM,EAAE,SAAS,IAAI,CAAC;AAAA,EAAA,CAC3C;AACF;AAEA,SAAS,kBAAkB;AAC1B,WAAS,iBAAiB,gBAAgB,EAAE,QAAQ,CAAC,OAAO;AAC3D,UAAM,QAAQ,CAAC,IAAI,aAAa,KAAA;AAChC,UAAM,OAAO,KAAK,IAAI,cAAc;AACpC,SAAK,IAAI,QAAQ,QAAQ,UAAU,aAAa,IAAI,IAAI;AAAA,EACzD,CAAC;AACF;AAEA,SAAS,MAAM;AAAA,EACd,GAAG,UAAU,iCAAiC,iBAAiB,WAAW;AAAA,EAC1E,GAAG,QAAQ,WAAW,iBAAiB,WAAW;AAAA,EAClD,GAAG,QAAQ,QAAQ,iBAAiB,WAAW;AAAA,EAC/C,WAAW,iBAAiB,cAAc;AAC3C,CAAC;"}
|