@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.
Files changed (34) hide show
  1. package/dist/components/behavior.css +12 -0
  2. package/dist/components/behavior.css.map +1 -1
  3. package/dist/components/header/Header.d.ts +3 -19
  4. package/dist/components/header/Header.d.ts.map +1 -1
  5. package/dist/components/header/Header.js +4 -253
  6. package/dist/components/header/Header.js.map +1 -1
  7. package/dist/components/header/client/HeaderClient.d.ts +7 -0
  8. package/dist/components/header/client/HeaderClient.d.ts.map +1 -0
  9. package/dist/components/header/client/HeaderClient.js +93 -0
  10. package/dist/components/header/client/HeaderClient.js.map +1 -0
  11. package/dist/components/header/client/index.d.ts +3 -0
  12. package/dist/components/header/client/index.d.ts.map +1 -0
  13. package/dist/components/header/client/index.js +6 -0
  14. package/dist/components/header/client/index.js.map +1 -0
  15. package/dist/components/header/client.d.ts +1 -0
  16. package/dist/components/header/client.js +1 -0
  17. package/dist/components/header/index.d.ts +2 -3
  18. package/dist/components/header/index.d.ts.map +1 -1
  19. package/dist/components/header/index.js +2 -15
  20. package/dist/components/header/index.js.map +1 -1
  21. package/dist/components/header/types.d.ts +7 -63
  22. package/dist/components/header/types.d.ts.map +1 -1
  23. package/dist/components/modal/Modal.js +3 -3
  24. package/dist/components/modal/Modal.js.map +1 -1
  25. package/dist/styles/index.css +1 -1
  26. package/package.json +1 -1
  27. package/dist/components/header/use-header-scroll-state.d.ts +0 -4
  28. package/dist/components/header/use-header-scroll-state.d.ts.map +0 -1
  29. package/dist/components/header/use-header-scroll-state.js +0 -83
  30. package/dist/components/header/use-header-scroll-state.js.map +0 -1
  31. package/dist/components/header/use-header.d.ts +0 -4
  32. package/dist/components/header/use-header.d.ts.map +0 -1
  33. package/dist/components/header/use-header.js +0 -80
  34. 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":[]}