@gunkin/uiify 0.0.11-alpha → 0.0.13-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 (247) hide show
  1. package/dist/components/behavior.css +21 -6
  2. package/dist/components/behavior.css.map +1 -1
  3. package/dist/components/breadcrumb/Breadcrumb.d.ts.map +1 -1
  4. package/dist/components/breadcrumb/Breadcrumb.js +5 -4
  5. package/dist/components/breadcrumb/Breadcrumb.js.map +1 -1
  6. package/dist/components/carousel/CarouselMarkup.d.ts.map +1 -1
  7. package/dist/components/carousel/CarouselMarkup.js +2 -1
  8. package/dist/components/carousel/CarouselMarkup.js.map +1 -1
  9. package/dist/components/carousel/client/CarouselClientView.d.ts.map +1 -1
  10. package/dist/components/carousel/client/CarouselClientView.js +1 -0
  11. package/dist/components/carousel/client/CarouselClientView.js.map +1 -1
  12. package/dist/components/carousel/client/carousel-controller.d.ts.map +1 -1
  13. package/dist/components/carousel/client/carousel-controller.js +25 -4
  14. package/dist/components/carousel/client/carousel-controller.js.map +1 -1
  15. package/dist/components/carousel/client/carousel-observer.d.ts.map +1 -1
  16. package/dist/components/carousel/client/carousel-observer.js +40 -0
  17. package/dist/components/carousel/client/carousel-observer.js.map +1 -1
  18. package/dist/components/carousel/fade/fade-controller.d.ts.map +1 -1
  19. package/dist/components/carousel/fade/fade-controller.js +3 -0
  20. package/dist/components/carousel/fade/fade-controller.js.map +1 -1
  21. package/dist/components/carousel/types.d.ts +2 -0
  22. package/dist/components/carousel/types.d.ts.map +1 -1
  23. package/dist/components/checkbox/Checkbox.d.ts +1 -6
  24. package/dist/components/checkbox/Checkbox.d.ts.map +1 -1
  25. package/dist/components/checkbox/Checkbox.js +2 -52
  26. package/dist/components/checkbox/Checkbox.js.map +1 -1
  27. package/dist/components/drawer/Drawer.d.ts +1 -1
  28. package/dist/components/drawer/Drawer.d.ts.map +1 -1
  29. package/dist/components/drawer/Drawer.js +46 -9
  30. package/dist/components/drawer/Drawer.js.map +1 -1
  31. package/dist/components/drawer/DrawerNative.d.ts +8 -16
  32. package/dist/components/drawer/DrawerNative.d.ts.map +1 -1
  33. package/dist/components/drawer/DrawerNative.js +80 -34
  34. package/dist/components/drawer/DrawerNative.js.map +1 -1
  35. package/dist/components/drawer/drawer-store.d.ts +1 -1
  36. package/dist/components/drawer/drawer-store.d.ts.map +1 -1
  37. package/dist/components/drawer/drawer-store.js +7 -3
  38. package/dist/components/drawer/drawer-store.js.map +1 -1
  39. package/dist/components/drawer/index.d.ts +3 -3
  40. package/dist/components/drawer/index.d.ts.map +1 -1
  41. package/dist/components/drawer/index.js +9 -1
  42. package/dist/components/drawer/index.js.map +1 -1
  43. package/dist/components/drawer/types.d.ts +114 -3
  44. package/dist/components/drawer/types.d.ts.map +1 -1
  45. package/dist/components/dropdown-menu/DropdownMenu.d.ts.map +1 -1
  46. package/dist/components/dropdown-menu/DropdownMenu.js +1 -0
  47. package/dist/components/dropdown-menu/DropdownMenu.js.map +1 -1
  48. package/dist/components/enhance/dialog-dismiss.d.ts +1 -1
  49. package/dist/components/enhance/dialog-dismiss.d.ts.map +1 -1
  50. package/dist/components/enhance/dialog-dismiss.js +19 -10
  51. package/dist/components/enhance/dialog-dismiss.js.map +1 -1
  52. package/dist/components/enhance/internal/box-observer.d.ts +4 -0
  53. package/dist/components/enhance/internal/box-observer.d.ts.map +1 -0
  54. package/dist/components/enhance/internal/box-observer.js +32 -0
  55. package/dist/components/enhance/internal/box-observer.js.map +1 -0
  56. package/dist/components/enhance/sheet-swipe.d.ts.map +1 -1
  57. package/dist/components/enhance/sheet-swipe.js +42 -14
  58. package/dist/components/enhance/sheet-swipe.js.map +1 -1
  59. package/dist/components/enhance/types.d.ts +5 -0
  60. package/dist/components/enhance/types.d.ts.map +1 -0
  61. package/dist/components/field/Field.d.ts.map +1 -1
  62. package/dist/components/field/Field.js +1 -0
  63. package/dist/components/field/Field.js.map +1 -1
  64. package/dist/components/file-upload/FileUpload.d.ts +4 -7
  65. package/dist/components/file-upload/FileUpload.d.ts.map +1 -1
  66. package/dist/components/file-upload/FileUpload.js +28 -122
  67. package/dist/components/file-upload/FileUpload.js.map +1 -1
  68. package/dist/components/file-upload/FileUploadInput.d.ts +7 -0
  69. package/dist/components/file-upload/FileUploadInput.d.ts.map +1 -0
  70. package/dist/components/file-upload/FileUploadInput.js +60 -0
  71. package/dist/components/file-upload/FileUploadInput.js.map +1 -0
  72. package/dist/components/file-upload/FileUploadRoot.d.ts +8 -0
  73. package/dist/components/file-upload/FileUploadRoot.d.ts.map +1 -0
  74. package/dist/components/file-upload/FileUploadRoot.js +70 -0
  75. package/dist/components/file-upload/FileUploadRoot.js.map +1 -0
  76. package/dist/components/file-upload/file-upload-context.d.ts +3 -0
  77. package/dist/components/file-upload/file-upload-context.d.ts.map +1 -0
  78. package/dist/components/file-upload/file-upload-context.js +8 -0
  79. package/dist/components/file-upload/file-upload-context.js.map +1 -0
  80. package/dist/components/file-upload/index.d.ts +1 -1
  81. package/dist/components/file-upload/index.d.ts.map +1 -1
  82. package/dist/components/file-upload/index.js.map +1 -1
  83. package/dist/components/file-upload/types.d.ts +8 -10
  84. package/dist/components/file-upload/types.d.ts.map +1 -1
  85. package/dist/components/form/Form.d.ts.map +1 -1
  86. package/dist/components/form/Form.js +2 -1
  87. package/dist/components/form/Form.js.map +1 -1
  88. package/dist/components/header/Header.d.ts +3 -19
  89. package/dist/components/header/Header.d.ts.map +1 -1
  90. package/dist/components/header/Header.js +4 -253
  91. package/dist/components/header/Header.js.map +1 -1
  92. package/dist/components/header/client/HeaderClient.d.ts +7 -0
  93. package/dist/components/header/client/HeaderClient.d.ts.map +1 -0
  94. package/dist/components/header/client/HeaderClient.js +93 -0
  95. package/dist/components/header/client/HeaderClient.js.map +1 -0
  96. package/dist/components/header/client/index.d.ts +3 -0
  97. package/dist/components/header/client/index.d.ts.map +1 -0
  98. package/dist/components/header/client/index.js +6 -0
  99. package/dist/components/header/client/index.js.map +1 -0
  100. package/dist/components/header/client.d.ts +1 -0
  101. package/dist/components/header/client.js +1 -0
  102. package/dist/components/header/index.d.ts +2 -3
  103. package/dist/components/header/index.d.ts.map +1 -1
  104. package/dist/components/header/index.js +2 -15
  105. package/dist/components/header/index.js.map +1 -1
  106. package/dist/components/header/types.d.ts +7 -63
  107. package/dist/components/header/types.d.ts.map +1 -1
  108. package/dist/components/hover-card/HoverCard.js +1 -1
  109. package/dist/components/hover-card/HoverCard.js.map +1 -1
  110. package/dist/components/index.d.ts +0 -1
  111. package/dist/components/index.d.ts.map +1 -1
  112. package/dist/components/index.js +0 -1
  113. package/dist/components/index.js.map +1 -1
  114. package/dist/components/input/Input.d.ts.map +1 -1
  115. package/dist/components/input/Input.js +1 -1
  116. package/dist/components/input/Input.js.map +1 -1
  117. package/dist/components/internal/choice-family/ChoiceGroup.js +1 -1
  118. package/dist/components/internal/choice-family/ChoiceGroup.js.map +1 -1
  119. package/dist/components/internal/choice-family/types.d.ts +3 -3
  120. package/dist/components/internal/choice-family/types.d.ts.map +1 -1
  121. package/dist/components/internal/native-check-control/NativeCheckControl.d.ts +7 -0
  122. package/dist/components/internal/native-check-control/NativeCheckControl.d.ts.map +1 -0
  123. package/dist/components/internal/native-check-control/NativeCheckControl.js +56 -0
  124. package/dist/components/internal/native-check-control/NativeCheckControl.js.map +1 -0
  125. package/dist/components/internal/native-check-control/types.d.ts +13 -0
  126. package/dist/components/internal/native-check-control/types.d.ts.map +1 -0
  127. package/dist/components/internal/native-check-control/types.js +1 -0
  128. package/dist/components/number-field/NumberField.d.ts.map +1 -1
  129. package/dist/components/number-field/NumberField.js +11 -2
  130. package/dist/components/number-field/NumberField.js.map +1 -1
  131. package/dist/components/number-field/format.d.ts +1 -0
  132. package/dist/components/number-field/format.d.ts.map +1 -1
  133. package/dist/components/number-field/format.js +18 -6
  134. package/dist/components/number-field/format.js.map +1 -1
  135. package/dist/components/popup/PopupParts.d.ts.map +1 -1
  136. package/dist/components/popup/PopupParts.js +2 -0
  137. package/dist/components/popup/PopupParts.js.map +1 -1
  138. package/dist/components/select/Select.d.ts.map +1 -1
  139. package/dist/components/select/Select.js +1 -1
  140. package/dist/components/select/Select.js.map +1 -1
  141. package/dist/components/skeleton/Skeleton.d.ts.map +1 -1
  142. package/dist/components/skeleton/Skeleton.js +14 -35
  143. package/dist/components/skeleton/Skeleton.js.map +1 -1
  144. package/dist/components/skeleton/types.d.ts +1 -8
  145. package/dist/components/skeleton/types.d.ts.map +1 -1
  146. package/dist/components/table/Table.d.ts +1 -40
  147. package/dist/components/table/Table.d.ts.map +1 -1
  148. package/dist/components/table/Table.js +9 -259
  149. package/dist/components/table/Table.js.map +1 -1
  150. package/dist/components/table/TableShell.d.ts +5 -1
  151. package/dist/components/table/TableShell.d.ts.map +1 -1
  152. package/dist/components/table/TableShell.js +63 -9
  153. package/dist/components/table/TableShell.js.map +1 -1
  154. package/dist/components/table/client/Table.d.ts +30 -0
  155. package/dist/components/table/client/Table.d.ts.map +1 -0
  156. package/dist/components/table/client/Table.js +135 -0
  157. package/dist/components/table/client/Table.js.map +1 -0
  158. package/dist/components/table/client/TableBody.d.ts +7 -0
  159. package/dist/components/table/client/TableBody.d.ts.map +1 -0
  160. package/dist/components/table/client/TableBody.js +35 -0
  161. package/dist/components/table/client/TableBody.js.map +1 -0
  162. package/dist/components/table/client/TableColumnHeader.d.ts +7 -0
  163. package/dist/components/table/client/TableColumnHeader.d.ts.map +1 -0
  164. package/dist/components/table/client/TableColumnHeader.js +69 -0
  165. package/dist/components/table/client/TableColumnHeader.js.map +1 -0
  166. package/dist/components/table/client/TableExpansion.d.ts +11 -0
  167. package/dist/components/table/client/TableExpansion.d.ts.map +1 -0
  168. package/dist/components/table/client/TableExpansion.js +43 -0
  169. package/dist/components/table/client/TableExpansion.js.map +1 -0
  170. package/dist/components/table/client/TableRow.d.ts +7 -0
  171. package/dist/components/table/client/TableRow.d.ts.map +1 -0
  172. package/dist/components/table/client/TableRow.js +95 -0
  173. package/dist/components/table/client/TableRow.js.map +1 -0
  174. package/dist/components/table/client/TableSelection.d.ts +11 -0
  175. package/dist/components/table/client/TableSelection.d.ts.map +1 -0
  176. package/dist/components/table/client/TableSelection.js +48 -0
  177. package/dist/components/table/client/TableSelection.js.map +1 -0
  178. package/dist/components/table/client/table-context.d.ts +3 -0
  179. package/dist/components/table/client/table-context.d.ts.map +1 -0
  180. package/dist/components/table/client/table-context.js +8 -0
  181. package/dist/components/table/client/table-context.js.map +1 -0
  182. package/dist/components/table/client.d.ts +4 -0
  183. package/dist/components/table/client.d.ts.map +1 -0
  184. package/dist/components/table/client.js +30 -0
  185. package/dist/components/table/client.js.map +1 -0
  186. package/dist/components/table/index.d.ts +2 -2
  187. package/dist/components/table/index.d.ts.map +1 -1
  188. package/dist/components/table/index.js +7 -7
  189. package/dist/components/table/index.js.map +1 -1
  190. package/dist/components/table/types.d.ts +42 -15
  191. package/dist/components/table/types.d.ts.map +1 -1
  192. package/dist/components/textarea/Textarea.d.ts.map +1 -1
  193. package/dist/components/textarea/Textarea.js +1 -1
  194. package/dist/components/textarea/Textarea.js.map +1 -1
  195. package/dist/components/tooltip/Tooltip.js +1 -1
  196. package/dist/components/tooltip/Tooltip.js.map +1 -1
  197. package/dist/components/virtual-scroll/VirtualScroll.d.ts.map +1 -1
  198. package/dist/components/virtual-scroll/VirtualScroll.js +54 -34
  199. package/dist/components/virtual-scroll/VirtualScroll.js.map +1 -1
  200. package/dist/components/virtual-scroll/types.d.ts +2 -2
  201. package/dist/components/virtual-scroll/types.d.ts.map +1 -1
  202. package/dist/components/virtual-scroll/types.js.map +1 -1
  203. package/dist/components/virtual-scroll/virtual-scroll-scroll.d.ts.map +1 -1
  204. package/dist/components/virtual-scroll/virtual-scroll-scroll.js +0 -1
  205. package/dist/components/virtual-scroll/virtual-scroll-scroll.js.map +1 -1
  206. package/dist/core/roving-focus.d.ts +2 -1
  207. package/dist/core/roving-focus.d.ts.map +1 -1
  208. package/dist/core/roving-focus.js.map +1 -1
  209. package/dist/core/use-popover.d.ts.map +1 -1
  210. package/dist/core/use-popover.js +6 -1
  211. package/dist/core/use-popover.js.map +1 -1
  212. package/dist/elements/choice/types.d.ts +1 -1
  213. package/dist/elements/choice/types.d.ts.map +1 -1
  214. package/dist/styles/index.css +1 -1
  215. package/dist/styles/tailwind.css +1 -0
  216. package/dist/styles/tokens.css +1 -1
  217. package/package.json +1 -1
  218. package/dist/components/drawer/client-types.d.ts +0 -99
  219. package/dist/components/drawer/client-types.d.ts.map +0 -1
  220. package/dist/components/drawer/client-types.js +0 -1
  221. package/dist/components/enhance/internal/read-box.d.ts +0 -3
  222. package/dist/components/enhance/internal/read-box.d.ts.map +0 -1
  223. package/dist/components/enhance/internal/read-box.js +0 -7
  224. package/dist/components/enhance/internal/read-box.js.map +0 -1
  225. package/dist/components/header/use-header-scroll-state.d.ts +0 -4
  226. package/dist/components/header/use-header-scroll-state.d.ts.map +0 -1
  227. package/dist/components/header/use-header-scroll-state.js +0 -83
  228. package/dist/components/header/use-header-scroll-state.js.map +0 -1
  229. package/dist/components/header/use-header.d.ts +0 -4
  230. package/dist/components/header/use-header.d.ts.map +0 -1
  231. package/dist/components/header/use-header.js +0 -80
  232. package/dist/components/header/use-header.js.map +0 -1
  233. package/dist/components/stepper/Stepper.d.ts +0 -7
  234. package/dist/components/stepper/Stepper.d.ts.map +0 -1
  235. package/dist/components/stepper/Stepper.js +0 -35
  236. package/dist/components/stepper/Stepper.js.map +0 -1
  237. package/dist/components/stepper/index.d.ts +0 -3
  238. package/dist/components/stepper/index.d.ts.map +0 -1
  239. package/dist/components/stepper/index.js +0 -5
  240. package/dist/components/stepper/index.js.map +0 -1
  241. package/dist/components/stepper/types.d.ts +0 -14
  242. package/dist/components/stepper/types.d.ts.map +0 -1
  243. package/dist/components/stepper.d.ts +0 -1
  244. package/dist/components/stepper.js +0 -1
  245. /package/dist/components/{stepper → enhance}/types.js +0 -0
  246. /package/dist/components/{stepper → enhance}/types.js.map +0 -0
  247. /package/dist/components/{drawer/client-types.js.map → internal/native-check-control/types.js.map} +0 -0
@@ -1,260 +1,11 @@
1
- "use client";
2
1
  import { jsx } from "react/jsx-runtime";
3
- import {
4
- useCallback,
5
- useMemo,
6
- useRef
7
- } from "react";
8
- import { useIsomorphicLayoutEffect, useMergedRefs } from "@gunkin/uiify/hooks";
9
- import { createPartContext } from "@gunkin/uiify/core";
10
- import { useRenderElement } from "@gunkin/uiify/core/render";
11
- import { Drawer } from "../drawer/Drawer.js";
12
- import { useHeader } from "./use-header.js";
13
- import { useHeaderScrollState } from "./use-header-scroll-state.js";
14
- const [HeaderProvider, useHeaderContext] = createPartContext("Header");
15
- function isDrawerMode(mobileMode) {
16
- return mobileMode === "drawer" || mobileMode === "sheet" || mobileMode === "fullscreen";
17
- }
18
- function drawerSide(mobileMode) {
19
- if (mobileMode === "sheet") return "bottom";
20
- return "left";
21
- }
22
- function defaultModal(mobileMode) {
23
- return isDrawerMode(mobileMode);
24
- }
25
- function defaultLockScroll(mobileMode, modal) {
26
- return isDrawerMode(mobileMode) && modal;
27
- }
28
- function defaultCloseOnSelect(mobileMode) {
29
- return mobileMode !== "none";
30
- }
31
- function handleCloseOnSelect(event, closeOnSelect, close) {
32
- if (!closeOnSelect) return;
33
- const target = event.target;
34
- if (!(target instanceof Element)) return;
35
- const activator = target.closest("a[href], button:not([disabled])");
36
- if (!activator || !event.currentTarget.contains(activator)) return;
37
- close();
38
- }
39
- function HeaderRoot(props) {
40
- const {
41
- behavior = "none",
42
- children,
43
- closeOnSelect: closeOnSelectProp,
44
- defaultOpen,
45
- hidden: hiddenProp,
46
- lockScroll: lockScrollProp,
47
- mobileMode = "none",
48
- modal: modalProp,
49
- onOpenChange,
50
- open,
51
- placement = "static",
52
- scrolled: scrolledProp,
53
- ...consumerProps
54
- } = props;
55
- const modal = modalProp ?? defaultModal(mobileMode);
56
- const lockScroll = lockScrollProp ?? defaultLockScroll(mobileMode, modal);
57
- const closeOnSelect = closeOnSelectProp ?? defaultCloseOnSelect(mobileMode);
58
- const toggleRef = useRef(null);
59
- const wasOpenRef = useRef(false);
60
- const header = useHeader({
61
- closeOnSelect,
62
- mobileMode,
63
- ...defaultOpen !== void 0 ? { defaultOpen } : {},
64
- ...onOpenChange ? { onOpenChange } : {},
65
- ...open !== void 0 ? { open } : {}
66
- });
67
- useIsomorphicLayoutEffect(() => {
68
- if (wasOpenRef.current && !header.open && isDrawerMode(mobileMode)) {
69
- queueMicrotask(() => toggleRef.current?.focus({ preventScroll: true }));
70
- }
71
- wasOpenRef.current = header.open;
72
- }, [header.open, mobileMode]);
73
- const contextValue = useMemo(
74
- () => ({
75
- ...header,
76
- behavior,
77
- hidden: hiddenProp ?? false,
78
- lockScroll,
79
- modal,
80
- placement,
81
- scrolled: scrolledProp ?? false,
82
- toggleRef
83
- }),
84
- [behavior, header, hiddenProp, lockScroll, modal, placement, scrolledProp]
85
- );
86
- const rootElement = useRenderElement({
87
- defaultTag: "div",
88
- props: {
89
- ...consumerProps,
90
- "data-behavior": behavior,
91
- "data-hidden": hiddenProp ? "" : void 0,
92
- "data-lock-scroll": lockScroll && header.open && isDrawerMode(mobileMode) ? "" : void 0,
93
- "data-mobile-mode": mobileMode,
94
- "data-state": header.open ? "open" : "closed",
95
- "data-placement": placement,
96
- "data-scrolled": scrolledProp ? "" : void 0,
97
- children
98
- },
99
- state: {
100
- open: header.open,
101
- placement,
102
- behavior,
103
- mobileMode,
104
- scrolled: scrolledProp ?? false,
105
- hidden: hiddenProp ?? false
106
- }
107
- });
108
- const tree = /* @__PURE__ */ jsx(HeaderProvider, { value: contextValue, children: rootElement });
109
- if (isDrawerMode(mobileMode)) {
110
- return /* @__PURE__ */ jsx(
111
- Drawer.Root,
112
- {
113
- modal,
114
- onOpenChange: header.setOpen,
115
- open: header.open,
116
- side: drawerSide(mobileMode),
117
- children: tree
118
- }
119
- );
120
- }
121
- return tree;
2
+ function HeaderRoot({ placement = "static", ...props }) {
3
+ return /* @__PURE__ */ jsx("header", { ...props, "data-uiify-header": "", "data-placement": placement });
122
4
  }
123
5
  HeaderRoot.displayName = "HeaderRoot";
124
- function HeaderToggle(props) {
125
- const {
126
- closeLabel = "Close navigation",
127
- openLabel = "Open navigation",
128
- ref,
129
- onClick,
130
- ...consumerProps
131
- } = props;
132
- const { getToggleProps, mobileMode, open, toggle, toggleRef } = useHeaderContext("Toggle");
133
- const mergedRef = useMergedRefs(toggleRef, ref);
134
- const dialogMode = isDrawerMode(mobileMode);
135
- const toggleProps = getToggleProps({
136
- type: "button",
137
- "aria-haspopup": dialogMode ? "dialog" : void 0,
138
- "aria-label": open ? closeLabel : openLabel,
139
- onClick(event) {
140
- toggle();
141
- onClick?.(event);
142
- }
143
- });
144
- return useRenderElement({
145
- defaultTag: "button",
146
- props: {
147
- ...consumerProps,
148
- ref: mergedRef,
149
- ...toggleProps
150
- },
151
- state: { open }
152
- });
153
- }
154
- function HeaderMobileNav(props) {
155
- const { children, forceMount, onClick: consumerOnClick, ...consumerProps } = props;
156
- const { close, closeOnSelect, getMobileNavProps, mobileMode, open } = useHeaderContext("MobileNav");
157
- const onClick = useCallback(
158
- (event) => {
159
- handleCloseOnSelect(event, closeOnSelect, close);
160
- consumerOnClick?.(event);
161
- },
162
- [close, closeOnSelect, consumerOnClick]
163
- );
164
- const noneNav = useRenderElement({
165
- defaultTag: "nav",
166
- props: {
167
- ...consumerProps,
168
- ...getMobileNavProps({ onClick }),
169
- children
170
- },
171
- state: { open }
172
- });
173
- const drawerNav = useRenderElement({
174
- defaultTag: "nav",
175
- props: {
176
- ...consumerProps,
177
- ...getMobileNavProps({
178
- "data-mobile-mode": mobileMode,
179
- "data-state": open ? "open" : "closed",
180
- onClick
181
- }),
182
- children
183
- },
184
- state: { open, mobileMode }
185
- });
186
- const collapseNav = useRenderElement({
187
- defaultTag: "nav",
188
- props: {
189
- ...consumerProps,
190
- ...getMobileNavProps({
191
- "aria-hidden": open ? void 0 : true,
192
- "data-mobile-mode": mobileMode,
193
- "data-state": open ? "open" : "closed",
194
- hidden: open ? void 0 : true,
195
- onClick
196
- }),
197
- children
198
- },
199
- state: { open, mobileMode }
200
- });
201
- if (mobileMode === "none") {
202
- return noneNav;
203
- }
204
- if (mobileMode === "collapse") {
205
- if (!open && !forceMount) {
206
- return null;
207
- }
208
- return collapseNav;
209
- }
210
- return /* @__PURE__ */ jsx(Drawer.Content, { children: drawerNav });
211
- }
212
- HeaderMobileNav.displayName = "HeaderMobileNav";
213
- function HeaderClose(props) {
214
- const { children, className, onClick, ...consumerProps } = props;
215
- const { close, mobileMode } = useHeaderContext("Close");
216
- const handleClick = (event) => {
217
- close();
218
- onClick?.(event);
219
- };
220
- const closeButton = useRenderElement({
221
- defaultTag: "button",
222
- props: {
223
- ...consumerProps,
224
- type: "button",
225
- onClick: handleClick,
226
- ...className !== void 0 ? { className } : {},
227
- children
228
- },
229
- state: {}
230
- });
231
- if (isDrawerMode(mobileMode)) {
232
- return /* @__PURE__ */ jsx(
233
- Drawer.Close,
234
- {
235
- ...consumerProps,
236
- ...className !== void 0 ? { className } : {},
237
- ...onClick !== void 0 ? { onClick } : {},
238
- children
239
- }
240
- );
241
- }
242
- return closeButton;
243
- }
244
- HeaderClose.displayName = "HeaderClose";
245
- const Header = {
246
- Close: HeaderClose,
247
- MobileNav: HeaderMobileNav,
248
- Root: HeaderRoot,
249
- Toggle: HeaderToggle
250
- };
6
+ const Header = { Root: HeaderRoot };
251
7
  export {
252
8
  Header,
253
- HeaderClose,
254
- HeaderMobileNav,
255
- HeaderRoot,
256
- HeaderToggle,
257
- useHeader,
258
- useHeaderScrollState
9
+ HeaderRoot
259
10
  };
260
11
  //# sourceMappingURL=Header.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/header/Header.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n useCallback,\n useMemo,\n useRef,\n type MouseEvent,\n type ReactElement,\n type SyntheticEvent,\n} from \"react\";\nimport { useIsomorphicLayoutEffect, useMergedRefs } from \"@gunkin/uiify/hooks\";\nimport { createPartContext } from \"@gunkin/uiify/core\";\nimport { useRenderElement } from \"@gunkin/uiify/core/render\";\nimport { Drawer } from \"../drawer/Drawer.js\";\nimport type { DrawerSide } from \"../drawer/types.js\";\nimport { useHeader } from \"./use-header.js\";\nimport { useHeaderScrollState } from \"./use-header-scroll-state.js\";\nimport type {\n HeaderMobileMode,\n HeaderRootProps,\n HeaderContextValue,\n HeaderToggleProps,\n HeaderMobileNavProps,\n HeaderCloseProps,\n} from \"./types.js\";\n\nexport type {\n HeaderBehavior,\n HeaderCloseProps,\n HeaderMobileNavProps,\n HeaderMobileMode,\n HeaderPlacement,\n HeaderRootProps,\n HeaderToggleProps,\n UseHeaderOptions,\n UseHeaderReturn,\n UseHeaderScrollStateOptions,\n UseHeaderScrollStateReturn,\n} from \"./types.js\";\n\nconst [HeaderProvider, useHeaderContext] = createPartContext<HeaderContextValue>(\"Header\");\n\nfunction isDrawerMode(mobileMode: HeaderMobileMode): boolean {\n return mobileMode === \"drawer\" || mobileMode === \"sheet\" || mobileMode === \"fullscreen\";\n}\n\nfunction drawerSide(mobileMode: HeaderMobileMode): DrawerSide {\n if (mobileMode === \"sheet\") return \"bottom\";\n return \"left\";\n}\n\nfunction defaultModal(mobileMode: HeaderMobileMode): boolean {\n return isDrawerMode(mobileMode);\n}\n\nfunction defaultLockScroll(mobileMode: HeaderMobileMode, modal: boolean): boolean {\n return isDrawerMode(mobileMode) && modal;\n}\n\nfunction defaultCloseOnSelect(mobileMode: HeaderMobileMode): boolean {\n return mobileMode !== \"none\";\n}\n\nfunction handleCloseOnSelect(\n event: SyntheticEvent<HTMLElement>,\n closeOnSelect: boolean,\n close: () => void,\n): void {\n if (!closeOnSelect) return;\n const target = event.target;\n if (!(target instanceof Element)) return;\n const activator = target.closest(\"a[href], button:not([disabled])\");\n if (!activator || !event.currentTarget.contains(activator)) return;\n close();\n}\n\nexport function HeaderRoot(props: HeaderRootProps): ReactElement | null {\n const {\n behavior = \"none\",\n children,\n closeOnSelect: closeOnSelectProp,\n defaultOpen,\n hidden: hiddenProp,\n lockScroll: lockScrollProp,\n mobileMode = \"none\",\n modal: modalProp,\n onOpenChange,\n open,\n placement = \"static\",\n scrolled: scrolledProp,\n ...consumerProps\n } = props;\n\n const modal = modalProp ?? defaultModal(mobileMode);\n const lockScroll = lockScrollProp ?? defaultLockScroll(mobileMode, modal);\n const closeOnSelect = closeOnSelectProp ?? defaultCloseOnSelect(mobileMode);\n const toggleRef = useRef<HTMLButtonElement | null>(null);\n const wasOpenRef = useRef(false);\n\n const header = useHeader({\n closeOnSelect,\n mobileMode,\n ...(defaultOpen !== undefined ? { defaultOpen } : {}),\n ...(onOpenChange ? { onOpenChange } : {}),\n ...(open !== undefined ? { open } : {}),\n });\n\n useIsomorphicLayoutEffect(() => {\n if (wasOpenRef.current && !header.open && isDrawerMode(mobileMode)) {\n queueMicrotask(() => toggleRef.current?.focus({ preventScroll: true }));\n }\n wasOpenRef.current = header.open;\n }, [header.open, mobileMode]);\n\n const contextValue = useMemo<HeaderContextValue>(\n () => ({\n ...header,\n behavior,\n hidden: hiddenProp ?? false,\n lockScroll,\n modal,\n placement,\n scrolled: scrolledProp ?? false,\n toggleRef,\n }),\n [behavior, header, hiddenProp, lockScroll, modal, placement, scrolledProp],\n );\n\n const rootElement = useRenderElement({\n defaultTag: \"div\",\n props: {\n ...consumerProps,\n \"data-behavior\": behavior,\n \"data-hidden\": hiddenProp ? \"\" : undefined,\n \"data-lock-scroll\": lockScroll && header.open && isDrawerMode(mobileMode) ? \"\" : undefined,\n \"data-mobile-mode\": mobileMode,\n \"data-state\": header.open ? \"open\" : \"closed\",\n \"data-placement\": placement,\n \"data-scrolled\": scrolledProp ? \"\" : undefined,\n children,\n },\n state: {\n open: header.open,\n placement,\n behavior,\n mobileMode,\n scrolled: scrolledProp ?? false,\n hidden: hiddenProp ?? false,\n },\n });\n\n const tree = <HeaderProvider value={contextValue}>{rootElement}</HeaderProvider>;\n\n if (isDrawerMode(mobileMode)) {\n return (\n <Drawer.Root\n modal={modal}\n onOpenChange={header.setOpen}\n open={header.open}\n side={drawerSide(mobileMode)}\n >\n {tree}\n </Drawer.Root>\n );\n }\n\n return tree;\n}\nHeaderRoot.displayName = \"HeaderRoot\";\n\nexport function HeaderToggle(props: HeaderToggleProps): ReactElement | null {\n const {\n closeLabel = \"Close navigation\",\n openLabel = \"Open navigation\",\n ref,\n onClick,\n ...consumerProps\n } = props;\n const { getToggleProps, mobileMode, open, toggle, toggleRef } = useHeaderContext(\"Toggle\");\n const mergedRef = useMergedRefs(toggleRef, ref);\n const dialogMode = isDrawerMode(mobileMode);\n\n const toggleProps = getToggleProps({\n type: \"button\",\n \"aria-haspopup\": dialogMode ? \"dialog\" : undefined,\n \"aria-label\": open ? closeLabel : openLabel,\n onClick(event: MouseEvent<HTMLButtonElement>) {\n toggle();\n onClick?.(event);\n },\n });\n\n return useRenderElement({\n defaultTag: \"button\",\n props: {\n ...consumerProps,\n ref: mergedRef,\n ...toggleProps,\n },\n state: { open },\n });\n}\n\nexport function HeaderMobileNav(props: HeaderMobileNavProps): ReactElement | null {\n const { children, forceMount, onClick: consumerOnClick, ...consumerProps } = props;\n const { close, closeOnSelect, getMobileNavProps, mobileMode, open } =\n useHeaderContext(\"MobileNav\");\n\n const onClick = useCallback(\n (event: SyntheticEvent<HTMLElement>) => {\n handleCloseOnSelect(event, closeOnSelect, close);\n consumerOnClick?.(event as React.MouseEvent<HTMLElement>);\n },\n [close, closeOnSelect, consumerOnClick],\n );\n\n const noneNav = useRenderElement({\n defaultTag: \"nav\",\n props: {\n ...consumerProps,\n ...getMobileNavProps({ onClick }),\n children,\n },\n state: { open },\n });\n\n const drawerNav = useRenderElement({\n defaultTag: \"nav\",\n props: {\n ...consumerProps,\n ...getMobileNavProps({\n \"data-mobile-mode\": mobileMode,\n \"data-state\": open ? \"open\" : \"closed\",\n onClick,\n }),\n children,\n },\n state: { open, mobileMode },\n });\n\n const collapseNav = useRenderElement({\n defaultTag: \"nav\",\n props: {\n ...consumerProps,\n ...getMobileNavProps({\n \"aria-hidden\": open ? undefined : true,\n \"data-mobile-mode\": mobileMode,\n \"data-state\": open ? \"open\" : \"closed\",\n hidden: open ? undefined : true,\n onClick,\n }),\n children,\n },\n state: { open, mobileMode },\n });\n\n if (mobileMode === \"none\") {\n return noneNav;\n }\n\n if (mobileMode === \"collapse\") {\n if (!open && !forceMount) {\n return null;\n }\n\n return collapseNav;\n }\n\n return <Drawer.Content>{drawerNav}</Drawer.Content>;\n}\nHeaderMobileNav.displayName = \"HeaderMobileNav\";\n\nexport function HeaderClose(props: HeaderCloseProps): ReactElement | null {\n const { children, className, onClick, ...consumerProps } = props;\n const { close, mobileMode } = useHeaderContext(\"Close\");\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n close();\n onClick?.(event);\n };\n\n const closeButton = useRenderElement({\n defaultTag: \"button\",\n props: {\n ...consumerProps,\n type: \"button\",\n onClick: handleClick,\n ...(className !== undefined ? { className } : {}),\n children,\n },\n state: {},\n });\n\n if (isDrawerMode(mobileMode)) {\n return (\n <Drawer.Close\n {...consumerProps}\n {...(className !== undefined ? { className } : {})}\n {...(onClick !== undefined ? { onClick } : {})}\n >\n {children}\n </Drawer.Close>\n );\n }\n\n return closeButton;\n}\nHeaderClose.displayName = \"HeaderClose\";\n\nexport const Header = {\n Close: HeaderClose,\n MobileNav: HeaderMobileNav,\n Root: HeaderRoot,\n Toggle: HeaderToggle,\n};\n\nexport { useHeader, useHeaderScrollState };\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/components/header/Header.tsx"],"sourcesContent":["import type { ReactElement } from \"react\";\nimport type { HeaderRootProps } from \"./types.js\";\n\nexport function HeaderRoot({ placement = \"static\", ...props }: HeaderRootProps): ReactElement {\n return <header {...props} data-uiify-header=\"\" data-placement={placement} />;\n}\nHeaderRoot.displayName = \"HeaderRoot\";\n\nexport const Header = { Root: HeaderRoot };\n"],"mappings":"AAIS;AADF,SAAS,WAAW,EAAE,YAAY,UAAU,GAAG,MAAM,GAAkC;AAC5F,SAAO,oBAAC,YAAQ,GAAG,OAAO,qBAAkB,IAAG,kBAAgB,WAAW;AAC5E;AACA,WAAW,cAAc;AAElB,MAAM,SAAS,EAAE,MAAM,WAAW;","names":[]}
@@ -0,0 +1,7 @@
1
+ import type { ReactElement } from "react";
2
+ import type { HeaderClientProps } from "../types.js";
3
+ export declare function HeaderClient({ hideOnScroll, scrollTarget, placement, ref, ...props }: HeaderClientProps): ReactElement;
4
+ export declare namespace HeaderClient {
5
+ var displayName: string;
6
+ }
7
+ //# sourceMappingURL=HeaderClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HeaderClient.d.ts","sourceRoot":"","sources":["../../../../src/components/header/client/HeaderClient.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAG1C,OAAO,KAAK,EAAE,iBAAiB,EAAqB,MAAM,aAAa,CAAC;AAExE,wBAAgB,YAAY,CAAC,EAC3B,YAAmB,EACnB,YAAY,EACZ,SAAoB,EACpB,GAAG,EACH,GAAG,KAAK,EACT,EAAE,iBAAiB,GAAG,YAAY,CAmFlC;yBAzFe,YAAY"}
@@ -0,0 +1,93 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { useEffect, useRef, useState } from "react";
4
+ import { useMergedRefs } from "../../../hooks/use-merged-refs.js";
5
+ import { HeaderRoot } from "../Header.js";
6
+ function HeaderClient({
7
+ hideOnScroll = true,
8
+ scrollTarget,
9
+ placement = "sticky",
10
+ ref,
11
+ ...props
12
+ }) {
13
+ const rootRef = useRef(null);
14
+ const mergedRef = useMergedRefs(rootRef, ref);
15
+ const [state, setState] = useState("top");
16
+ useEffect(() => {
17
+ const root = rootRef.current;
18
+ const view = root?.ownerDocument.defaultView;
19
+ if (!root || !view) return;
20
+ const element = scrollTarget === void 0 ? null : root.ownerDocument.getElementById(scrollTarget);
21
+ const target = scrollTarget === void 0 ? view : element;
22
+ const readPosition = () => {
23
+ return Math.max(0, element ? element.scrollTop : view.scrollY);
24
+ };
25
+ let previous = target ? readPosition() : 0;
26
+ let current = previous === 0 ? "top" : "visible";
27
+ setState(current);
28
+ if (!target) return;
29
+ let height = Infinity;
30
+ let movement = 0;
31
+ let frame = 0;
32
+ const update = (next) => {
33
+ if (current === next) return;
34
+ current = next;
35
+ setState(next);
36
+ };
37
+ const protectedState = () => root.contains(root.ownerDocument.activeElement) || root.querySelector("dialog[open], details[open], :popover-open") !== null;
38
+ const reveal = () => {
39
+ if (protectedState()) {
40
+ movement = 0;
41
+ update(readPosition() === 0 ? "top" : "visible");
42
+ }
43
+ };
44
+ const resize = new view.ResizeObserver((entries) => {
45
+ const entry = entries[0];
46
+ if (entry) height = entry.borderBoxSize[0]?.blockSize ?? entry.contentRect.height;
47
+ });
48
+ resize.observe(root, { box: "border-box" });
49
+ const mutation = new view.MutationObserver(reveal);
50
+ mutation.observe(root, {
51
+ subtree: true,
52
+ childList: true,
53
+ attributes: true,
54
+ attributeFilter: ["open"]
55
+ });
56
+ root.addEventListener("focusin", reveal);
57
+ root.addEventListener("toggle", reveal, true);
58
+ const scroll = () => {
59
+ if (frame) return;
60
+ frame = view.requestAnimationFrame(() => {
61
+ frame = 0;
62
+ const position = readPosition();
63
+ const delta = position - previous;
64
+ previous = position;
65
+ if (position === 0 || !hideOnScroll || placement === "static" || protectedState()) {
66
+ movement = 0;
67
+ update(position === 0 ? "top" : "visible");
68
+ return;
69
+ }
70
+ if (delta !== 0)
71
+ movement = Math.sign(delta) === Math.sign(movement) ? movement + delta : delta;
72
+ if (current === "top") update("visible");
73
+ if (movement <= -8) update("visible");
74
+ if (position > height && movement >= 8) update("hidden");
75
+ });
76
+ };
77
+ target.addEventListener("scroll", scroll, { passive: true });
78
+ return () => {
79
+ target.removeEventListener("scroll", scroll);
80
+ root.removeEventListener("focusin", reveal);
81
+ root.removeEventListener("toggle", reveal, true);
82
+ resize.disconnect();
83
+ mutation.disconnect();
84
+ if (frame) view.cancelAnimationFrame(frame);
85
+ };
86
+ }, [hideOnScroll, scrollTarget, placement]);
87
+ return /* @__PURE__ */ jsx(HeaderRoot, { ...props, placement, ref: mergedRef, "data-state": state });
88
+ }
89
+ HeaderClient.displayName = "HeaderClient";
90
+ export {
91
+ HeaderClient
92
+ };
93
+ //# sourceMappingURL=HeaderClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/header/client/HeaderClient.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport type { ReactElement } from \"react\";\nimport { useMergedRefs } from \"../../../hooks/use-merged-refs.js\";\nimport { HeaderRoot } from \"../Header.js\";\nimport type { HeaderClientProps, HeaderClientState } from \"../types.js\";\n\nexport function HeaderClient({\n hideOnScroll = true,\n scrollTarget,\n placement = \"sticky\",\n ref,\n ...props\n}: HeaderClientProps): ReactElement {\n const rootRef = useRef<HTMLElement>(null);\n const mergedRef = useMergedRefs(rootRef, ref);\n const [state, setState] = useState<HeaderClientState>(\"top\");\n\n useEffect(() => {\n const root = rootRef.current;\n const view = root?.ownerDocument.defaultView;\n if (!root || !view) return;\n const element =\n scrollTarget === undefined ? null : root.ownerDocument.getElementById(scrollTarget);\n const target = scrollTarget === undefined ? view : element;\n const readPosition = () => {\n // banned-read-ok: Scroll offset is the required direction input; it does not measure layout.\n return Math.max(0, element ? element.scrollTop : view.scrollY);\n };\n let previous = target ? readPosition() : 0;\n let current: HeaderClientState = previous === 0 ? \"top\" : \"visible\";\n setState(current);\n if (!target) return;\n\n let height = Infinity;\n let movement = 0;\n let frame = 0;\n const update = (next: HeaderClientState) => {\n if (current === next) return;\n current = next;\n setState(next);\n };\n const protectedState = () =>\n root.contains(root.ownerDocument.activeElement) ||\n root.querySelector(\"dialog[open], details[open], :popover-open\") !== null;\n const reveal = () => {\n if (protectedState()) {\n movement = 0;\n update(readPosition() === 0 ? \"top\" : \"visible\");\n }\n };\n const resize = new view.ResizeObserver((entries) => {\n const entry = entries[0];\n if (entry) height = entry.borderBoxSize[0]?.blockSize ?? entry.contentRect.height;\n });\n resize.observe(root, { box: \"border-box\" });\n const mutation = new view.MutationObserver(reveal);\n mutation.observe(root, {\n subtree: true,\n childList: true,\n attributes: true,\n attributeFilter: [\"open\"],\n });\n root.addEventListener(\"focusin\", reveal);\n root.addEventListener(\"toggle\", reveal, true);\n const scroll = () => {\n if (frame) return;\n frame = view.requestAnimationFrame(() => {\n frame = 0;\n const position = readPosition();\n const delta = position - previous;\n previous = position;\n if (position === 0 || !hideOnScroll || placement === \"static\" || protectedState()) {\n movement = 0;\n update(position === 0 ? \"top\" : \"visible\");\n return;\n }\n if (delta !== 0)\n movement = Math.sign(delta) === Math.sign(movement) ? movement + delta : delta;\n if (current === \"top\") update(\"visible\");\n if (movement <= -8) update(\"visible\");\n if (position > height && movement >= 8) update(\"hidden\");\n });\n };\n target.addEventListener(\"scroll\", scroll, { passive: true });\n return () => {\n target.removeEventListener(\"scroll\", scroll);\n root.removeEventListener(\"focusin\", reveal);\n root.removeEventListener(\"toggle\", reveal, true);\n resize.disconnect();\n mutation.disconnect();\n if (frame) view.cancelAnimationFrame(frame);\n };\n }, [hideOnScroll, scrollTarget, placement]);\n\n return <HeaderRoot {...props} placement={placement} ref={mergedRef} data-state={state} />;\n}\nHeaderClient.displayName = \"HeaderClient\";\n"],"mappings":"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","names":[]}
@@ -0,0 +1,3 @@
1
+ export { HeaderClient } from "./HeaderClient.js";
2
+ export type { HeaderClientProps, HeaderClientState } from "../types.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/header/client/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,6 @@
1
+ "use client";
2
+ import { HeaderClient } from "./HeaderClient.js";
3
+ export {
4
+ HeaderClient
5
+ };
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/header/client/index.ts"],"sourcesContent":["\"use client\";\n\nexport { HeaderClient } from \"./HeaderClient.js\";\nexport type { HeaderClientProps, HeaderClientState } from \"../types.js\";\n"],"mappings":";AAEA,SAAS,oBAAoB;","names":[]}
@@ -0,0 +1 @@
1
+ export * from "./client/index.js";
@@ -0,0 +1 @@
1
+ export * from "./client/index.js";
@@ -1,4 +1,3 @@
1
- export { Header, HeaderClose, HeaderMobileNav, HeaderRoot, HeaderToggle, useHeaderScrollState, } from "./Header.js";
2
- export { useHeader } from "./use-header.js";
3
- export type { HeaderBehavior, HeaderCloseProps, HeaderMobileNavProps, HeaderMobileMode, HeaderPlacement, HeaderRootProps, HeaderToggleProps, UseHeaderOptions, UseHeaderReturn, UseHeaderScrollStateOptions, UseHeaderScrollStateReturn, } from "./types.js";
1
+ export { Header, HeaderRoot } from "./Header.js";
2
+ export type { HeaderClientProps, HeaderClientState, HeaderPlacement, HeaderRootProps, } from "./types.js";
4
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/header/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,WAAW,EACX,eAAe,EACf,UAAU,EACV,YAAY,EACZ,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,2BAA2B,EAC3B,0BAA0B,GAC3B,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/header/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACjD,YAAY,EACV,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,eAAe,GAChB,MAAM,YAAY,CAAC"}
@@ -1,19 +1,6 @@
1
- import {
2
- Header,
3
- HeaderClose,
4
- HeaderMobileNav,
5
- HeaderRoot,
6
- HeaderToggle,
7
- useHeaderScrollState
8
- } from "./Header.js";
9
- import { useHeader } from "./use-header.js";
1
+ import { Header, HeaderRoot } from "./Header.js";
10
2
  export {
11
3
  Header,
12
- HeaderClose,
13
- HeaderMobileNav,
14
- HeaderRoot,
15
- HeaderToggle,
16
- useHeader,
17
- useHeaderScrollState
4
+ HeaderRoot
18
5
  };
19
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/header/index.ts"],"sourcesContent":["export {\n Header,\n HeaderClose,\n HeaderMobileNav,\n HeaderRoot,\n HeaderToggle,\n useHeaderScrollState,\n} from \"./Header.js\";\nexport { useHeader } from \"./use-header.js\";\nexport type {\n HeaderBehavior,\n HeaderCloseProps,\n HeaderMobileNavProps,\n HeaderMobileMode,\n HeaderPlacement,\n HeaderRootProps,\n HeaderToggleProps,\n UseHeaderOptions,\n UseHeaderReturn,\n UseHeaderScrollStateOptions,\n UseHeaderScrollStateReturn,\n} from \"./types.js\";\n"],"mappings":"AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,iBAAiB;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/header/index.ts"],"sourcesContent":["export { Header, HeaderRoot } from \"./Header.js\";\nexport type {\n HeaderClientProps,\n HeaderClientState,\n HeaderPlacement,\n HeaderRootProps,\n} from \"./types.js\";\n"],"mappings":"AAAA,SAAS,QAAQ,kBAAkB;","names":[]}
@@ -1,67 +1,11 @@
1
- import type { ButtonHTMLAttributes, HTMLAttributes, Ref, RefObject } from "react";
2
- export type HeaderBehavior = "none" | "elevate-on-scroll" | "solid-on-scroll" | "hide-on-scroll-down";
3
- export type HeaderMobileMode = "none" | "collapse" | "drawer" | "sheet" | "fullscreen";
4
- export type HeaderPlacement = "static" | "sticky" | "fixed";
5
- export interface UseHeaderOptions {
6
- readonly closeOnSelect?: boolean;
7
- readonly defaultOpen?: boolean;
8
- readonly mobileMode?: HeaderMobileMode;
9
- readonly onOpenChange?: (open: boolean) => void;
10
- readonly open?: boolean;
11
- }
12
- export interface UseHeaderReturn {
13
- readonly close: () => void;
14
- readonly closeOnSelect: boolean;
15
- readonly getMobileNavProps: <T extends HTMLAttributes<HTMLElement>>(props?: T) => T;
16
- readonly getToggleProps: <T extends ButtonHTMLAttributes<HTMLButtonElement>>(props?: T) => T;
17
- readonly mobileMode: HeaderMobileMode;
18
- readonly navId: string;
19
- readonly open: boolean;
20
- readonly setOpen: (open: boolean) => void;
21
- readonly toggle: () => void;
22
- readonly toggleId: string;
23
- }
24
- export interface HeaderRootProps extends HTMLAttributes<HTMLDivElement> {
25
- readonly behavior?: HeaderBehavior;
26
- readonly closeOnSelect?: boolean;
27
- readonly defaultOpen?: boolean;
28
- readonly hidden?: boolean;
29
- readonly lockScroll?: boolean;
30
- readonly mobileMode?: HeaderMobileMode;
31
- readonly modal?: boolean;
32
- readonly onOpenChange?: (open: boolean) => void;
33
- readonly open?: boolean;
1
+ import type { ComponentPropsWithRef } from "react";
2
+ export type HeaderPlacement = "static" | "sticky";
3
+ export interface HeaderRootProps extends ComponentPropsWithRef<"header"> {
34
4
  readonly placement?: HeaderPlacement;
35
- readonly scrolled?: boolean;
36
- }
37
- export interface HeaderContextValue extends UseHeaderReturn {
38
- readonly behavior: HeaderBehavior;
39
- readonly hidden: boolean;
40
- readonly lockScroll: boolean;
41
- readonly modal: boolean;
42
- readonly placement: HeaderPlacement;
43
- readonly scrolled: boolean;
44
- readonly toggleRef: RefObject<HTMLButtonElement | null>;
45
- }
46
- export interface HeaderToggleProps extends ButtonHTMLAttributes<HTMLButtonElement> {
47
- readonly closeLabel?: string;
48
- readonly openLabel?: string;
49
- readonly ref?: Ref<HTMLButtonElement>;
50
- }
51
- export interface HeaderMobileNavProps extends HTMLAttributes<HTMLElement> {
52
- readonly forceMount?: boolean;
53
- }
54
- export interface HeaderCloseProps extends ButtonHTMLAttributes<HTMLButtonElement> {
55
- }
56
- export interface UseHeaderScrollStateOptions {
57
- readonly behavior?: HeaderBehavior;
58
- readonly disabled?: boolean;
59
- readonly scrollRoot?: HTMLElement | null;
60
- readonly scrollRootRef?: RefObject<HTMLElement | null>;
61
- readonly threshold?: number;
62
5
  }
63
- export interface UseHeaderScrollStateReturn {
64
- readonly hidden: boolean;
65
- readonly scrolled: boolean;
6
+ export type HeaderClientState = "top" | "visible" | "hidden";
7
+ export interface HeaderClientProps extends HeaderRootProps {
8
+ readonly hideOnScroll?: boolean;
9
+ readonly scrollTarget?: string;
66
10
  }
67
11
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/header/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/header/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,OAAO,CAAC;AAEnD,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAElD,MAAM,WAAW,eAAgB,SAAQ,qBAAqB,CAAC,QAAQ,CAAC;IACtE,QAAQ,CAAC,SAAS,CAAC,EAAE,eAAe,CAAC;CACtC;AAED,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE7D,MAAM,WAAW,iBAAkB,SAAQ,eAAe;IACxD,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC"}
@@ -66,7 +66,7 @@ function HoverCardTrigger(props) {
66
66
  ...consumerStyle ? { style: consumerStyle } : {},
67
67
  "aria-controls": contentId,
68
68
  "aria-expanded": open,
69
- ...nativeButton ? { type: "button" } : {},
69
+ ...nativeButton ? { type: "button", "data-uiify-button": "" } : {},
70
70
  ...className ? { className } : {},
71
71
  onBlur: composeEventHandlers(consumerOnBlur, (event) => {
72
72
  if (!event.currentTarget.contains(event.relatedTarget)) closeCard();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/hover-card/HoverCard.tsx"],"sourcesContent":["\"use client\";\n\nimport { useRef } from \"react\";\nimport type { CSSProperties, ElementType, FocusEvent, PointerEvent, ReactElement } from \"react\";\nimport { useIsomorphicLayoutEffect, useMergedRefs } from \"@gunkin/uiify/hooks\";\nimport {\n createAnchorPositionerProps,\n createAnchorTriggerProps,\n anchorNameForId,\n} from \"@gunkin/uiify/core/anchor-position\";\nimport { composeEventHandlers } from \"@gunkin/uiify/core/compose-event-handlers\";\nimport {\n createPartContext,\n splitRef,\n useHoverOverlay,\n type HoverIntentStore,\n} from \"@gunkin/uiify/core\";\nimport { useRenderElement } from \"@gunkin/uiify/core/render\";\nimport type { HoverCardContentProps, HoverCardRootProps, HoverCardTriggerProps } from \"./types.js\";\n\ninterface HoverCardClientContextValue {\n readonly anchorId: string;\n readonly closeCard: () => void;\n readonly contentId: string;\n readonly intent: HoverIntentStore;\n readonly open: boolean;\n readonly openCard: (immediate?: boolean) => void;\n readonly setContentId: (id: string) => void;\n}\n\nconst [HoverCardProvider, useHoverCardContext] =\n createPartContext<HoverCardClientContextValue>(\"HoverCard\");\n\nexport function HoverCardRoot(props: HoverCardRootProps): ReactElement | null {\n const {\n children,\n closeDelay = 300,\n defaultOpen = false,\n id,\n onOpenChange,\n open,\n openDelay = 700,\n } = props;\n const overlay = useHoverOverlay({\n closeDelay,\n ...(defaultOpen !== undefined ? { defaultOpen } : {}),\n ...(id !== undefined ? { id } : {}),\n idPrefix: \"uiify-hover-card\",\n ...(onOpenChange ? { onOpenChange } : {}),\n ...(open !== undefined ? { open } : {}),\n openDelay,\n });\n\n const contextValue: HoverCardClientContextValue = {\n anchorId: overlay.anchorId,\n closeCard: overlay.closeOverlay,\n contentId: overlay.contentId,\n intent: overlay.intent,\n open: overlay.open,\n openCard: overlay.openOverlay,\n setContentId: overlay.setContentId,\n };\n\n return <HoverCardProvider value={contextValue}>{children}</HoverCardProvider>;\n}\nHoverCardRoot.displayName = \"HoverCardRoot\";\n\nexport function HoverCardTrigger<TAs extends ElementType = \"button\">(\n props: HoverCardTriggerProps<TAs>,\n): ReactElement | null {\n const { as, render, className, ...consumerProps } = props as HoverCardTriggerProps<\"button\">;\n const { anchorId, closeCard, contentId, intent, open, openCard } = useHoverCardContext(\"Trigger\");\n const nativeButton = !as || as === \"button\";\n const consumerStyle = (consumerProps as { style?: CSSProperties }).style;\n const {\n onBlur: consumerOnBlur,\n onFocus: consumerOnFocus,\n onPointerEnter: consumerOnPointerEnter,\n onPointerLeave: consumerOnPointerLeave,\n } = consumerProps as {\n onBlur?: (event: FocusEvent<HTMLElement>) => void;\n onFocus?: (event: FocusEvent<HTMLElement>) => void;\n onPointerEnter?: (event: PointerEvent<HTMLElement>) => void;\n onPointerLeave?: (event: PointerEvent<HTMLElement>) => void;\n };\n\n return useRenderElement({\n as,\n defaultTag: \"button\",\n props: {\n ...consumerProps,\n ...createAnchorTriggerProps(anchorNameForId(anchorId)),\n ...(consumerStyle ? { style: consumerStyle } : {}),\n \"aria-controls\": contentId,\n \"aria-expanded\": open,\n ...(nativeButton ? { type: \"button\" } : {}),\n ...(className ? { className } : {}),\n onBlur: composeEventHandlers(consumerOnBlur, (event: FocusEvent<HTMLElement>) => {\n if (!event.currentTarget.contains(event.relatedTarget)) closeCard();\n }),\n onFocus: composeEventHandlers(consumerOnFocus, () => {\n openCard(true);\n }),\n onPointerEnter: composeEventHandlers(\n consumerOnPointerEnter,\n (event: PointerEvent<HTMLElement>) => {\n if (event.pointerType === \"mouse\") openCard(false);\n },\n ),\n onPointerLeave: composeEventHandlers(\n consumerOnPointerLeave,\n (event: PointerEvent<HTMLElement>) => {\n if (event.pointerType === \"mouse\") intent.scheduleClose(() => closeCard());\n },\n ),\n },\n render,\n state: { open, positioning: \"native\" as const },\n });\n}\n\nexport function HoverCardContent<TAs extends ElementType = \"div\">(\n props: HoverCardContentProps<TAs>,\n): ReactElement | null {\n const {\n align = \"center\",\n as,\n render,\n className,\n side = \"bottom\",\n ...consumerProps\n } = props as HoverCardContentProps<\"div\">;\n const { anchorId, closeCard, contentId, intent, open, setContentId } =\n useHoverCardContext(\"Content\");\n const [consumerRef, domProps] = splitRef<HTMLElement, typeof consumerProps>(consumerProps);\n const popupRef = useRef<HTMLElement | null>(null);\n const mergedRef = useMergedRefs(popupRef, consumerRef);\n const consumerDomProps = domProps as { id?: string; style?: CSSProperties };\n const resolvedId =\n typeof consumerDomProps.id === \"string\" && consumerDomProps.id.length > 0\n ? consumerDomProps.id\n : contentId;\n const consumerStyle = consumerDomProps.style;\n\n useIsomorphicLayoutEffect(() => {\n setContentId(resolvedId);\n }, [resolvedId, setContentId]);\n\n // Same technique as core/use-popover.ts: guard with .matches(\":popover-open\")\n // so a StrictMode double-invoke or an unrelated re-run doesn't call\n // showPopover/hidePopover on a popover already in that state (both throw).\n // try/catch covers the node having disconnected between render and effect.\n useIsomorphicLayoutEffect(() => {\n const popup = popupRef.current;\n if (!popup) return;\n try {\n if (open && !popup.matches(\":popover-open\")) popup.showPopover();\n if (!open && popup.matches(\":popover-open\")) popup.hidePopover();\n } catch {\n // The node may have disconnected between render and layout effect.\n }\n }, [open]);\n\n const { onPointerEnter: consumerOnPointerEnter, onPointerLeave: consumerOnPointerLeave } =\n domProps as {\n onPointerEnter?: (event: PointerEvent<HTMLElement>) => void;\n onPointerLeave?: (event: PointerEvent<HTMLElement>) => void;\n };\n\n return useRenderElement({\n as,\n defaultTag: \"div\",\n props: {\n ...domProps,\n ...createAnchorPositionerProps({\n align,\n anchorName: anchorNameForId(anchorId),\n side,\n }),\n ...(consumerStyle ? { style: consumerStyle } : {}),\n ref: mergedRef,\n popover: \"manual\",\n // The consumer's own non-empty `id` wins; otherwise the context-generated id is used.\n id: resolvedId,\n \"data-part\": \"content\",\n \"data-uiify-hover-card\": \"\",\n \"data-state\": open ? \"open\" : \"closed\",\n ...(className ? { className } : {}),\n onPointerEnter: composeEventHandlers(consumerOnPointerEnter, () => {\n intent.clearCloseTimer();\n }),\n onPointerLeave: composeEventHandlers(\n consumerOnPointerLeave,\n (event: PointerEvent<HTMLElement>) => {\n if (event.pointerType === \"mouse\") intent.scheduleClose(() => closeCard());\n },\n ),\n },\n render,\n state: { open, positioning: \"native\" as const },\n });\n}\n\nexport const HoverCard = {\n Content: HoverCardContent,\n Root: HoverCardRoot,\n Trigger: HoverCardTrigger,\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/components/hover-card/HoverCard.tsx"],"sourcesContent":["\"use client\";\n\nimport { useRef } from \"react\";\nimport type { CSSProperties, ElementType, FocusEvent, PointerEvent, ReactElement } from \"react\";\nimport { useIsomorphicLayoutEffect, useMergedRefs } from \"@gunkin/uiify/hooks\";\nimport {\n createAnchorPositionerProps,\n createAnchorTriggerProps,\n anchorNameForId,\n} from \"@gunkin/uiify/core/anchor-position\";\nimport { composeEventHandlers } from \"@gunkin/uiify/core/compose-event-handlers\";\nimport {\n createPartContext,\n splitRef,\n useHoverOverlay,\n type HoverIntentStore,\n} from \"@gunkin/uiify/core\";\nimport { useRenderElement } from \"@gunkin/uiify/core/render\";\nimport type { HoverCardContentProps, HoverCardRootProps, HoverCardTriggerProps } from \"./types.js\";\n\ninterface HoverCardClientContextValue {\n readonly anchorId: string;\n readonly closeCard: () => void;\n readonly contentId: string;\n readonly intent: HoverIntentStore;\n readonly open: boolean;\n readonly openCard: (immediate?: boolean) => void;\n readonly setContentId: (id: string) => void;\n}\n\nconst [HoverCardProvider, useHoverCardContext] =\n createPartContext<HoverCardClientContextValue>(\"HoverCard\");\n\nexport function HoverCardRoot(props: HoverCardRootProps): ReactElement | null {\n const {\n children,\n closeDelay = 300,\n defaultOpen = false,\n id,\n onOpenChange,\n open,\n openDelay = 700,\n } = props;\n const overlay = useHoverOverlay({\n closeDelay,\n ...(defaultOpen !== undefined ? { defaultOpen } : {}),\n ...(id !== undefined ? { id } : {}),\n idPrefix: \"uiify-hover-card\",\n ...(onOpenChange ? { onOpenChange } : {}),\n ...(open !== undefined ? { open } : {}),\n openDelay,\n });\n\n const contextValue: HoverCardClientContextValue = {\n anchorId: overlay.anchorId,\n closeCard: overlay.closeOverlay,\n contentId: overlay.contentId,\n intent: overlay.intent,\n open: overlay.open,\n openCard: overlay.openOverlay,\n setContentId: overlay.setContentId,\n };\n\n return <HoverCardProvider value={contextValue}>{children}</HoverCardProvider>;\n}\nHoverCardRoot.displayName = \"HoverCardRoot\";\n\nexport function HoverCardTrigger<TAs extends ElementType = \"button\">(\n props: HoverCardTriggerProps<TAs>,\n): ReactElement | null {\n const { as, render, className, ...consumerProps } = props as HoverCardTriggerProps<\"button\">;\n const { anchorId, closeCard, contentId, intent, open, openCard } = useHoverCardContext(\"Trigger\");\n const nativeButton = !as || as === \"button\";\n const consumerStyle = (consumerProps as { style?: CSSProperties }).style;\n const {\n onBlur: consumerOnBlur,\n onFocus: consumerOnFocus,\n onPointerEnter: consumerOnPointerEnter,\n onPointerLeave: consumerOnPointerLeave,\n } = consumerProps as {\n onBlur?: (event: FocusEvent<HTMLElement>) => void;\n onFocus?: (event: FocusEvent<HTMLElement>) => void;\n onPointerEnter?: (event: PointerEvent<HTMLElement>) => void;\n onPointerLeave?: (event: PointerEvent<HTMLElement>) => void;\n };\n\n return useRenderElement({\n as,\n defaultTag: \"button\",\n props: {\n ...consumerProps,\n ...createAnchorTriggerProps(anchorNameForId(anchorId)),\n ...(consumerStyle ? { style: consumerStyle } : {}),\n \"aria-controls\": contentId,\n \"aria-expanded\": open,\n ...(nativeButton ? { type: \"button\", \"data-uiify-button\": \"\" } : {}),\n ...(className ? { className } : {}),\n onBlur: composeEventHandlers(consumerOnBlur, (event: FocusEvent<HTMLElement>) => {\n if (!event.currentTarget.contains(event.relatedTarget)) closeCard();\n }),\n onFocus: composeEventHandlers(consumerOnFocus, () => {\n openCard(true);\n }),\n onPointerEnter: composeEventHandlers(\n consumerOnPointerEnter,\n (event: PointerEvent<HTMLElement>) => {\n if (event.pointerType === \"mouse\") openCard(false);\n },\n ),\n onPointerLeave: composeEventHandlers(\n consumerOnPointerLeave,\n (event: PointerEvent<HTMLElement>) => {\n if (event.pointerType === \"mouse\") intent.scheduleClose(() => closeCard());\n },\n ),\n },\n render,\n state: { open, positioning: \"native\" as const },\n });\n}\n\nexport function HoverCardContent<TAs extends ElementType = \"div\">(\n props: HoverCardContentProps<TAs>,\n): ReactElement | null {\n const {\n align = \"center\",\n as,\n render,\n className,\n side = \"bottom\",\n ...consumerProps\n } = props as HoverCardContentProps<\"div\">;\n const { anchorId, closeCard, contentId, intent, open, setContentId } =\n useHoverCardContext(\"Content\");\n const [consumerRef, domProps] = splitRef<HTMLElement, typeof consumerProps>(consumerProps);\n const popupRef = useRef<HTMLElement | null>(null);\n const mergedRef = useMergedRefs(popupRef, consumerRef);\n const consumerDomProps = domProps as { id?: string; style?: CSSProperties };\n const resolvedId =\n typeof consumerDomProps.id === \"string\" && consumerDomProps.id.length > 0\n ? consumerDomProps.id\n : contentId;\n const consumerStyle = consumerDomProps.style;\n\n useIsomorphicLayoutEffect(() => {\n setContentId(resolvedId);\n }, [resolvedId, setContentId]);\n\n // Same technique as core/use-popover.ts: guard with .matches(\":popover-open\")\n // so a StrictMode double-invoke or an unrelated re-run doesn't call\n // showPopover/hidePopover on a popover already in that state (both throw).\n // try/catch covers the node having disconnected between render and effect.\n useIsomorphicLayoutEffect(() => {\n const popup = popupRef.current;\n if (!popup) return;\n try {\n if (open && !popup.matches(\":popover-open\")) popup.showPopover();\n if (!open && popup.matches(\":popover-open\")) popup.hidePopover();\n } catch {\n // The node may have disconnected between render and layout effect.\n }\n }, [open]);\n\n const { onPointerEnter: consumerOnPointerEnter, onPointerLeave: consumerOnPointerLeave } =\n domProps as {\n onPointerEnter?: (event: PointerEvent<HTMLElement>) => void;\n onPointerLeave?: (event: PointerEvent<HTMLElement>) => void;\n };\n\n return useRenderElement({\n as,\n defaultTag: \"div\",\n props: {\n ...domProps,\n ...createAnchorPositionerProps({\n align,\n anchorName: anchorNameForId(anchorId),\n side,\n }),\n ...(consumerStyle ? { style: consumerStyle } : {}),\n ref: mergedRef,\n popover: \"manual\",\n // The consumer's own non-empty `id` wins; otherwise the context-generated id is used.\n id: resolvedId,\n \"data-part\": \"content\",\n \"data-uiify-hover-card\": \"\",\n \"data-state\": open ? \"open\" : \"closed\",\n ...(className ? { className } : {}),\n onPointerEnter: composeEventHandlers(consumerOnPointerEnter, () => {\n intent.clearCloseTimer();\n }),\n onPointerLeave: composeEventHandlers(\n consumerOnPointerLeave,\n (event: PointerEvent<HTMLElement>) => {\n if (event.pointerType === \"mouse\") intent.scheduleClose(() => closeCard());\n },\n ),\n },\n render,\n state: { open, positioning: \"native\" as const },\n });\n}\n\nexport const HoverCard = {\n Content: HoverCardContent,\n Root: HoverCardRoot,\n Trigger: HoverCardTrigger,\n};\n"],"mappings":"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","names":[]}