@gunkin/uiify 0.0.10-alpha → 0.0.12-alpha
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/dist/components/behavior.css +12 -0
- package/dist/components/behavior.css.map +1 -1
- package/dist/components/header/Header.d.ts +3 -19
- package/dist/components/header/Header.d.ts.map +1 -1
- package/dist/components/header/Header.js +4 -253
- package/dist/components/header/Header.js.map +1 -1
- package/dist/components/header/client/HeaderClient.d.ts +7 -0
- package/dist/components/header/client/HeaderClient.d.ts.map +1 -0
- package/dist/components/header/client/HeaderClient.js +93 -0
- package/dist/components/header/client/HeaderClient.js.map +1 -0
- package/dist/components/header/client/index.d.ts +3 -0
- package/dist/components/header/client/index.d.ts.map +1 -0
- package/dist/components/header/client/index.js +6 -0
- package/dist/components/header/client/index.js.map +1 -0
- package/dist/components/header/client.d.ts +1 -0
- package/dist/components/header/client.js +1 -0
- package/dist/components/header/index.d.ts +2 -3
- package/dist/components/header/index.d.ts.map +1 -1
- package/dist/components/header/index.js +2 -15
- package/dist/components/header/index.js.map +1 -1
- package/dist/components/header/types.d.ts +7 -63
- package/dist/components/header/types.d.ts.map +1 -1
- package/dist/components/modal/Modal.js +3 -3
- package/dist/components/modal/Modal.js.map +1 -1
- package/dist/styles/index.css +1 -1
- package/package.json +1 -1
- package/dist/components/header/use-header-scroll-state.d.ts +0 -4
- package/dist/components/header/use-header-scroll-state.d.ts.map +0 -1
- package/dist/components/header/use-header-scroll-state.js +0 -83
- package/dist/components/header/use-header-scroll-state.js.map +0 -1
- package/dist/components/header/use-header.d.ts +0 -4
- package/dist/components/header/use-header.d.ts.map +0 -1
- package/dist/components/header/use-header.js +0 -80
- package/dist/components/header/use-header.js.map +0 -1
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { useEffect, useState } from "react";
|
|
3
|
-
function isScrollBehavior(behavior) {
|
|
4
|
-
return behavior === "elevate-on-scroll" || behavior === "solid-on-scroll" || behavior === "hide-on-scroll-down";
|
|
5
|
-
}
|
|
6
|
-
function usesIntersectionObserver(behavior) {
|
|
7
|
-
return behavior === "elevate-on-scroll" || behavior === "solid-on-scroll";
|
|
8
|
-
}
|
|
9
|
-
function useHeaderScrollState(options = {}) {
|
|
10
|
-
const {
|
|
11
|
-
behavior = "none",
|
|
12
|
-
disabled = false,
|
|
13
|
-
scrollRoot: scrollRootProp,
|
|
14
|
-
scrollRootRef,
|
|
15
|
-
threshold = 0
|
|
16
|
-
} = options;
|
|
17
|
-
const scrollRoot = scrollRootProp ?? scrollRootRef?.current ?? null;
|
|
18
|
-
const [scrolled, setScrolled] = useState(false);
|
|
19
|
-
const [hidden, setHidden] = useState(false);
|
|
20
|
-
useEffect(() => {
|
|
21
|
-
if (disabled || typeof window === "undefined" || typeof document === "undefined") {
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
if (!isScrollBehavior(behavior)) {
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
if (scrollRootRef && !scrollRoot) {
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
if (usesIntersectionObserver(behavior)) {
|
|
31
|
-
const sentinel = document.createElement("div");
|
|
32
|
-
sentinel.setAttribute("aria-hidden", "true");
|
|
33
|
-
sentinel.setAttribute("data-header-scroll-sentinel", "");
|
|
34
|
-
sentinel.style.cssText = "position:absolute;top:0;left:0;width:1px;height:1px;pointer-events:none;visibility:hidden";
|
|
35
|
-
if (scrollRoot) {
|
|
36
|
-
scrollRoot.insertBefore(sentinel, scrollRoot.firstChild);
|
|
37
|
-
} else {
|
|
38
|
-
document.body.prepend(sentinel);
|
|
39
|
-
}
|
|
40
|
-
const rootMargin = threshold > 0 ? `-${threshold}px 0px 0px 0px` : "0px";
|
|
41
|
-
const observer = new IntersectionObserver(
|
|
42
|
-
(entries) => {
|
|
43
|
-
const entry = entries[0];
|
|
44
|
-
if (!entry) return;
|
|
45
|
-
setScrolled(!entry.isIntersecting);
|
|
46
|
-
},
|
|
47
|
-
{ root: scrollRoot, rootMargin, threshold: 0 }
|
|
48
|
-
);
|
|
49
|
-
observer.observe(sentinel);
|
|
50
|
-
return () => {
|
|
51
|
-
observer.disconnect();
|
|
52
|
-
sentinel.remove();
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
if (behavior === "hide-on-scroll-down") {
|
|
56
|
-
let lastScrollTop = scrollRoot ? scrollRoot.scrollTop : window.scrollY;
|
|
57
|
-
let ticking = false;
|
|
58
|
-
const readScrollTop = () => scrollRoot ? scrollRoot.scrollTop : window.scrollY;
|
|
59
|
-
const update = () => {
|
|
60
|
-
const currentScrollTop = readScrollTop();
|
|
61
|
-
const pastThreshold = currentScrollTop > threshold;
|
|
62
|
-
setScrolled(pastThreshold);
|
|
63
|
-
setHidden(pastThreshold && currentScrollTop > lastScrollTop);
|
|
64
|
-
lastScrollTop = currentScrollTop;
|
|
65
|
-
ticking = false;
|
|
66
|
-
};
|
|
67
|
-
const onScroll = () => {
|
|
68
|
-
if (ticking) return;
|
|
69
|
-
ticking = true;
|
|
70
|
-
requestAnimationFrame(update);
|
|
71
|
-
};
|
|
72
|
-
const target = scrollRoot ?? window;
|
|
73
|
-
target.addEventListener("scroll", onScroll, { passive: true });
|
|
74
|
-
return () => target.removeEventListener("scroll", onScroll);
|
|
75
|
-
}
|
|
76
|
-
return void 0;
|
|
77
|
-
}, [behavior, disabled, scrollRoot, scrollRootRef, threshold]);
|
|
78
|
-
return { hidden, scrolled };
|
|
79
|
-
}
|
|
80
|
-
export {
|
|
81
|
-
useHeaderScrollState
|
|
82
|
-
};
|
|
83
|
-
//# sourceMappingURL=use-header-scroll-state.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/header/use-header-scroll-state.ts"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport type {\n HeaderBehavior,\n UseHeaderScrollStateOptions,\n UseHeaderScrollStateReturn,\n} from \"./types.js\";\n\nexport type {\n HeaderBehavior,\n UseHeaderScrollStateOptions,\n UseHeaderScrollStateReturn,\n} from \"./types.js\";\n\nfunction isScrollBehavior(behavior: HeaderBehavior): boolean {\n return (\n behavior === \"elevate-on-scroll\" ||\n behavior === \"solid-on-scroll\" ||\n behavior === \"hide-on-scroll-down\"\n );\n}\n\nfunction usesIntersectionObserver(behavior: HeaderBehavior): boolean {\n return behavior === \"elevate-on-scroll\" || behavior === \"solid-on-scroll\";\n}\n\nexport function useHeaderScrollState(\n options: UseHeaderScrollStateOptions = {},\n): UseHeaderScrollStateReturn {\n const {\n behavior = \"none\",\n disabled = false,\n scrollRoot: scrollRootProp,\n scrollRootRef,\n threshold = 0,\n } = options;\n const scrollRoot = scrollRootProp ?? scrollRootRef?.current ?? null;\n const [scrolled, setScrolled] = useState(false);\n const [hidden, setHidden] = useState(false);\n\n useEffect(() => {\n if (disabled || typeof window === \"undefined\" || typeof document === \"undefined\") {\n return;\n }\n\n if (!isScrollBehavior(behavior)) {\n return;\n }\n\n if (scrollRootRef && !scrollRoot) {\n return;\n }\n\n if (usesIntersectionObserver(behavior)) {\n const sentinel = document.createElement(\"div\");\n sentinel.setAttribute(\"aria-hidden\", \"true\");\n sentinel.setAttribute(\"data-header-scroll-sentinel\", \"\");\n sentinel.style.cssText =\n \"position:absolute;top:0;left:0;width:1px;height:1px;pointer-events:none;visibility:hidden\";\n\n if (scrollRoot) {\n scrollRoot.insertBefore(sentinel, scrollRoot.firstChild);\n } else {\n document.body.prepend(sentinel);\n }\n\n const rootMargin = threshold > 0 ? `-${threshold}px 0px 0px 0px` : \"0px\";\n const observer = new IntersectionObserver(\n (entries) => {\n const entry = entries[0];\n if (!entry) return;\n setScrolled(!entry.isIntersecting);\n },\n { root: scrollRoot, rootMargin, threshold: 0 },\n );\n observer.observe(sentinel);\n\n return () => {\n observer.disconnect();\n sentinel.remove();\n };\n }\n\n if (behavior === \"hide-on-scroll-down\") {\n let lastScrollTop = scrollRoot ? scrollRoot.scrollTop : window.scrollY; // banned-read-ok: scroll handler, batched in rAF\n let ticking = false;\n\n const readScrollTop = (): number => (scrollRoot ? scrollRoot.scrollTop : window.scrollY); // banned-read-ok: scroll handler, batched in rAF\n\n const update = () => {\n const currentScrollTop = readScrollTop();\n const pastThreshold = currentScrollTop > threshold;\n setScrolled(pastThreshold);\n setHidden(pastThreshold && currentScrollTop > lastScrollTop);\n lastScrollTop = currentScrollTop;\n ticking = false;\n };\n\n const onScroll = () => {\n if (ticking) return;\n ticking = true;\n requestAnimationFrame(update);\n };\n\n const target: HTMLElement | Window = scrollRoot ?? window;\n target.addEventListener(\"scroll\", onScroll, { passive: true });\n return () => target.removeEventListener(\"scroll\", onScroll);\n }\n\n return undefined;\n }, [behavior, disabled, scrollRoot, scrollRootRef, threshold]);\n\n return { hidden, scrolled };\n}\n"],"mappings":";AAEA,SAAS,WAAW,gBAAgB;AAapC,SAAS,iBAAiB,UAAmC;AAC3D,SACE,aAAa,uBACb,aAAa,qBACb,aAAa;AAEjB;AAEA,SAAS,yBAAyB,UAAmC;AACnE,SAAO,aAAa,uBAAuB,aAAa;AAC1D;AAEO,SAAS,qBACd,UAAuC,CAAC,GACZ;AAC5B,QAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,YAAY;AAAA,IACZ;AAAA,IACA,YAAY;AAAA,EACd,IAAI;AACJ,QAAM,aAAa,kBAAkB,eAAe,WAAW;AAC/D,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAC9C,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAE1C,YAAU,MAAM;AACd,QAAI,YAAY,OAAO,WAAW,eAAe,OAAO,aAAa,aAAa;AAChF;AAAA,IACF;AAEA,QAAI,CAAC,iBAAiB,QAAQ,GAAG;AAC/B;AAAA,IACF;AAEA,QAAI,iBAAiB,CAAC,YAAY;AAChC;AAAA,IACF;AAEA,QAAI,yBAAyB,QAAQ,GAAG;AACtC,YAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,eAAS,aAAa,eAAe,MAAM;AAC3C,eAAS,aAAa,+BAA+B,EAAE;AACvD,eAAS,MAAM,UACb;AAEF,UAAI,YAAY;AACd,mBAAW,aAAa,UAAU,WAAW,UAAU;AAAA,MACzD,OAAO;AACL,iBAAS,KAAK,QAAQ,QAAQ;AAAA,MAChC;AAEA,YAAM,aAAa,YAAY,IAAI,IAAI,SAAS,mBAAmB;AACnE,YAAM,WAAW,IAAI;AAAA,QACnB,CAAC,YAAY;AACX,gBAAM,QAAQ,QAAQ,CAAC;AACvB,cAAI,CAAC,MAAO;AACZ,sBAAY,CAAC,MAAM,cAAc;AAAA,QACnC;AAAA,QACA,EAAE,MAAM,YAAY,YAAY,WAAW,EAAE;AAAA,MAC/C;AACA,eAAS,QAAQ,QAAQ;AAEzB,aAAO,MAAM;AACX,iBAAS,WAAW;AACpB,iBAAS,OAAO;AAAA,MAClB;AAAA,IACF;AAEA,QAAI,aAAa,uBAAuB;AACtC,UAAI,gBAAgB,aAAa,WAAW,YAAY,OAAO;AAC/D,UAAI,UAAU;AAEd,YAAM,gBAAgB,MAAe,aAAa,WAAW,YAAY,OAAO;AAEhF,YAAM,SAAS,MAAM;AACnB,cAAM,mBAAmB,cAAc;AACvC,cAAM,gBAAgB,mBAAmB;AACzC,oBAAY,aAAa;AACzB,kBAAU,iBAAiB,mBAAmB,aAAa;AAC3D,wBAAgB;AAChB,kBAAU;AAAA,MACZ;AAEA,YAAM,WAAW,MAAM;AACrB,YAAI,QAAS;AACb,kBAAU;AACV,8BAAsB,MAAM;AAAA,MAC9B;AAEA,YAAM,SAA+B,cAAc;AACnD,aAAO,iBAAiB,UAAU,UAAU,EAAE,SAAS,KAAK,CAAC;AAC7D,aAAO,MAAM,OAAO,oBAAoB,UAAU,QAAQ;AAAA,IAC5D;AAEA,WAAO;AAAA,EACT,GAAG,CAAC,UAAU,UAAU,YAAY,eAAe,SAAS,CAAC;AAE7D,SAAO,EAAE,QAAQ,SAAS;AAC5B;","names":[]}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import type { UseHeaderOptions, UseHeaderReturn } from "./types.js";
|
|
2
|
-
export type { HeaderMobileMode, UseHeaderOptions, UseHeaderReturn } from "./types.js";
|
|
3
|
-
export declare function useHeader(options?: UseHeaderOptions): UseHeaderReturn;
|
|
4
|
-
//# sourceMappingURL=use-header.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-header.d.ts","sourceRoot":"","sources":["../../../src/components/header/use-header.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAoB,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEtF,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAatF,wBAAgB,SAAS,CAAC,OAAO,GAAE,gBAAqB,GAAG,eAAe,CAuEzE"}
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { useCallback, useMemo } from "react";
|
|
3
|
-
import { useControllableState, useId } from "@gunkin/uiify/hooks";
|
|
4
|
-
function isDrawerMobileMode(mobileMode) {
|
|
5
|
-
return mobileMode === "drawer" || mobileMode === "sheet" || mobileMode === "fullscreen";
|
|
6
|
-
}
|
|
7
|
-
function exposesNavControls(mobileMode, open) {
|
|
8
|
-
if (mobileMode === "none") return false;
|
|
9
|
-
if (isDrawerMobileMode(mobileMode)) return true;
|
|
10
|
-
if (mobileMode === "collapse") return true;
|
|
11
|
-
return open;
|
|
12
|
-
}
|
|
13
|
-
function useHeader(options = {}) {
|
|
14
|
-
const {
|
|
15
|
-
closeOnSelect = true,
|
|
16
|
-
defaultOpen = false,
|
|
17
|
-
mobileMode = "none",
|
|
18
|
-
onOpenChange,
|
|
19
|
-
open: controlledOpen
|
|
20
|
-
} = options;
|
|
21
|
-
const navId = useId();
|
|
22
|
-
const toggleId = useId();
|
|
23
|
-
const [open, setOpen] = useControllableState({
|
|
24
|
-
defaultValue: defaultOpen,
|
|
25
|
-
onChange: onOpenChange,
|
|
26
|
-
value: controlledOpen
|
|
27
|
-
});
|
|
28
|
-
const toggle = useCallback(() => {
|
|
29
|
-
setOpen((current) => !current);
|
|
30
|
-
}, [setOpen]);
|
|
31
|
-
const close = useCallback(() => {
|
|
32
|
-
setOpen(false);
|
|
33
|
-
}, [setOpen]);
|
|
34
|
-
const getToggleProps = useCallback(
|
|
35
|
-
(props) => ({
|
|
36
|
-
...props,
|
|
37
|
-
id: toggleId,
|
|
38
|
-
...exposesNavControls(mobileMode, open) ? { "aria-controls": navId } : {},
|
|
39
|
-
"aria-expanded": open
|
|
40
|
-
}),
|
|
41
|
-
[mobileMode, navId, open, toggleId]
|
|
42
|
-
);
|
|
43
|
-
const getMobileNavProps = useCallback(
|
|
44
|
-
(props) => ({
|
|
45
|
-
...props,
|
|
46
|
-
id: navId
|
|
47
|
-
}),
|
|
48
|
-
[navId]
|
|
49
|
-
);
|
|
50
|
-
return useMemo(
|
|
51
|
-
() => ({
|
|
52
|
-
close,
|
|
53
|
-
closeOnSelect,
|
|
54
|
-
getMobileNavProps,
|
|
55
|
-
getToggleProps,
|
|
56
|
-
mobileMode,
|
|
57
|
-
navId,
|
|
58
|
-
open,
|
|
59
|
-
setOpen,
|
|
60
|
-
toggle,
|
|
61
|
-
toggleId
|
|
62
|
-
}),
|
|
63
|
-
[
|
|
64
|
-
close,
|
|
65
|
-
closeOnSelect,
|
|
66
|
-
getMobileNavProps,
|
|
67
|
-
getToggleProps,
|
|
68
|
-
mobileMode,
|
|
69
|
-
navId,
|
|
70
|
-
open,
|
|
71
|
-
setOpen,
|
|
72
|
-
toggle,
|
|
73
|
-
toggleId
|
|
74
|
-
]
|
|
75
|
-
);
|
|
76
|
-
}
|
|
77
|
-
export {
|
|
78
|
-
useHeader
|
|
79
|
-
};
|
|
80
|
-
//# sourceMappingURL=use-header.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/header/use-header.ts"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useMemo } from \"react\";\nimport type { ButtonHTMLAttributes, HTMLAttributes } from \"react\";\nimport { useControllableState, useId } from \"@gunkin/uiify/hooks\";\nimport type { HeaderMobileMode, UseHeaderOptions, UseHeaderReturn } from \"./types.js\";\n\nexport type { HeaderMobileMode, UseHeaderOptions, UseHeaderReturn } from \"./types.js\";\n\nfunction isDrawerMobileMode(mobileMode: HeaderMobileMode): boolean {\n return mobileMode === \"drawer\" || mobileMode === \"sheet\" || mobileMode === \"fullscreen\";\n}\n\nfunction exposesNavControls(mobileMode: HeaderMobileMode, open: boolean): boolean {\n if (mobileMode === \"none\") return false;\n if (isDrawerMobileMode(mobileMode)) return true;\n if (mobileMode === \"collapse\") return true;\n return open;\n}\n\nexport function useHeader(options: UseHeaderOptions = {}): UseHeaderReturn {\n const {\n closeOnSelect = true,\n defaultOpen = false,\n mobileMode = \"none\",\n onOpenChange,\n open: controlledOpen,\n } = options;\n\n const navId = useId();\n const toggleId = useId();\n const [open, setOpen] = useControllableState({\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n value: controlledOpen,\n });\n\n const toggle = useCallback(() => {\n setOpen((current) => !current);\n }, [setOpen]);\n\n const close = useCallback(() => {\n setOpen(false);\n }, [setOpen]);\n\n const getToggleProps = useCallback(\n <T extends ButtonHTMLAttributes<HTMLButtonElement>>(props?: T): T =>\n ({\n ...props,\n id: toggleId,\n ...(exposesNavControls(mobileMode, open) ? { \"aria-controls\": navId } : {}),\n \"aria-expanded\": open,\n }) as T,\n [mobileMode, navId, open, toggleId],\n );\n\n const getMobileNavProps = useCallback(\n <T extends HTMLAttributes<HTMLElement>>(props?: T): T =>\n ({\n ...props,\n id: navId,\n }) as T,\n [navId],\n );\n\n return useMemo(\n () => ({\n close,\n closeOnSelect,\n getMobileNavProps,\n getToggleProps,\n mobileMode,\n navId,\n open,\n setOpen,\n toggle,\n toggleId,\n }),\n [\n close,\n closeOnSelect,\n getMobileNavProps,\n getToggleProps,\n mobileMode,\n navId,\n open,\n setOpen,\n toggle,\n toggleId,\n ],\n );\n}\n"],"mappings":";AAEA,SAAS,aAAa,eAAe;AAErC,SAAS,sBAAsB,aAAa;AAK5C,SAAS,mBAAmB,YAAuC;AACjE,SAAO,eAAe,YAAY,eAAe,WAAW,eAAe;AAC7E;AAEA,SAAS,mBAAmB,YAA8B,MAAwB;AAChF,MAAI,eAAe,OAAQ,QAAO;AAClC,MAAI,mBAAmB,UAAU,EAAG,QAAO;AAC3C,MAAI,eAAe,WAAY,QAAO;AACtC,SAAO;AACT;AAEO,SAAS,UAAU,UAA4B,CAAC,GAAoB;AACzE,QAAM;AAAA,IACJ,gBAAgB;AAAA,IAChB,cAAc;AAAA,IACd,aAAa;AAAA,IACb;AAAA,IACA,MAAM;AAAA,EACR,IAAI;AAEJ,QAAM,QAAQ,MAAM;AACpB,QAAM,WAAW,MAAM;AACvB,QAAM,CAAC,MAAM,OAAO,IAAI,qBAAqB;AAAA,IAC3C,cAAc;AAAA,IACd,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AAED,QAAM,SAAS,YAAY,MAAM;AAC/B,YAAQ,CAAC,YAAY,CAAC,OAAO;AAAA,EAC/B,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,QAAQ,YAAY,MAAM;AAC9B,YAAQ,KAAK;AAAA,EACf,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,iBAAiB;AAAA,IACrB,CAAoD,WACjD;AAAA,MACC,GAAG;AAAA,MACH,IAAI;AAAA,MACJ,GAAI,mBAAmB,YAAY,IAAI,IAAI,EAAE,iBAAiB,MAAM,IAAI,CAAC;AAAA,MACzE,iBAAiB;AAAA,IACnB;AAAA,IACF,CAAC,YAAY,OAAO,MAAM,QAAQ;AAAA,EACpC;AAEA,QAAM,oBAAoB;AAAA,IACxB,CAAwC,WACrC;AAAA,MACC,GAAG;AAAA,MACH,IAAI;AAAA,IACN;AAAA,IACF,CAAC,KAAK;AAAA,EACR;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
|