@cladd-ui/react 0.0.1 → 0.0.3

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 (241) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1 -1
  3. package/components/Backdrop.d.ts +8 -0
  4. package/components/Backdrop.d.ts.map +1 -0
  5. package/components/Backdrop.js +7 -0
  6. package/components/Backdrop.js.map +1 -0
  7. package/components/BlockTitle.d.ts +10 -0
  8. package/components/BlockTitle.d.ts.map +1 -0
  9. package/components/BlockTitle.js +7 -0
  10. package/components/BlockTitle.js.map +1 -0
  11. package/components/Button.d.ts +61 -0
  12. package/components/Button.d.ts.map +1 -0
  13. package/components/Button.js +83 -0
  14. package/components/Button.js.map +1 -0
  15. package/components/Checkbox.d.ts +57 -0
  16. package/components/Checkbox.d.ts.map +1 -0
  17. package/components/Checkbox.js +48 -0
  18. package/components/Checkbox.js.map +1 -0
  19. package/components/Chip.d.ts +47 -0
  20. package/components/Chip.d.ts.map +1 -0
  21. package/components/Chip.js +55 -0
  22. package/components/Chip.js.map +1 -0
  23. package/components/Dialog.d.ts +118 -0
  24. package/components/Dialog.d.ts.map +1 -0
  25. package/components/Dialog.js +178 -0
  26. package/components/Dialog.js.map +1 -0
  27. package/components/DialogsPortal.d.ts +2 -0
  28. package/components/DialogsPortal.d.ts.map +1 -0
  29. package/components/DialogsPortal.js +17 -0
  30. package/components/DialogsPortal.js.map +1 -0
  31. package/components/DialogsPortalContext.d.ts +49 -0
  32. package/components/DialogsPortalContext.d.ts.map +1 -0
  33. package/components/DialogsPortalContext.js +17 -0
  34. package/components/DialogsPortalContext.js.map +1 -0
  35. package/components/FocusableLayer.d.ts +25 -0
  36. package/components/FocusableLayer.d.ts.map +1 -0
  37. package/components/FocusableLayer.js +18 -0
  38. package/components/FocusableLayer.js.map +1 -0
  39. package/components/Input.d.ts +87 -0
  40. package/components/Input.d.ts.map +1 -0
  41. package/components/Input.js +93 -0
  42. package/components/Input.js.map +1 -0
  43. package/components/Link.d.ts +28 -0
  44. package/components/Link.d.ts.map +1 -0
  45. package/components/Link.js +21 -0
  46. package/components/Link.js.map +1 -0
  47. package/components/List.d.ts +8 -0
  48. package/components/List.d.ts.map +1 -0
  49. package/components/List.js +7 -0
  50. package/components/List.js.map +1 -0
  51. package/components/ListButton.d.ts +61 -0
  52. package/components/ListButton.d.ts.map +1 -0
  53. package/components/ListButton.js +9 -0
  54. package/components/ListButton.js.map +1 -0
  55. package/components/ListItem.d.ts +8 -0
  56. package/components/ListItem.d.ts.map +1 -0
  57. package/components/ListItem.js +7 -0
  58. package/components/ListItem.js.map +1 -0
  59. package/components/ListSeparator.d.ts +8 -0
  60. package/components/ListSeparator.d.ts.map +1 -0
  61. package/components/ListSeparator.js +7 -0
  62. package/components/ListSeparator.js.map +1 -0
  63. package/components/ModalController.d.ts +26 -0
  64. package/components/ModalController.d.ts.map +1 -0
  65. package/components/ModalController.js +52 -0
  66. package/components/ModalController.js.map +1 -0
  67. package/components/NumberField.d.ts +49 -0
  68. package/components/NumberField.d.ts.map +1 -0
  69. package/components/NumberField.js +34 -0
  70. package/components/NumberField.js.map +1 -0
  71. package/components/Popover.d.ts +137 -0
  72. package/components/Popover.d.ts.map +1 -0
  73. package/components/Popover.js +366 -0
  74. package/components/Popover.js.map +1 -0
  75. package/components/Popup.d.ts +120 -0
  76. package/components/Popup.d.ts.map +1 -0
  77. package/components/Popup.js +235 -0
  78. package/components/Popup.js.map +1 -0
  79. package/components/PopupContent.d.ts +19 -0
  80. package/components/PopupContent.d.ts.map +1 -0
  81. package/components/PopupContent.js +8 -0
  82. package/components/PopupContent.js.map +1 -0
  83. package/components/Preloader.d.ts +12 -0
  84. package/components/Preloader.d.ts.map +1 -0
  85. package/components/Preloader.js +30 -0
  86. package/components/Preloader.js.map +1 -0
  87. package/components/Radio.d.ts +53 -0
  88. package/components/Radio.d.ts.map +1 -0
  89. package/components/Radio.js +46 -0
  90. package/components/Radio.js.map +1 -0
  91. package/components/Range.d.ts +35 -0
  92. package/components/Range.d.ts.map +1 -0
  93. package/components/Range.js +76 -0
  94. package/components/Range.js.map +1 -0
  95. package/components/Searchbar.d.ts +29 -0
  96. package/components/Searchbar.d.ts.map +1 -0
  97. package/components/Searchbar.js +10 -0
  98. package/components/Searchbar.js.map +1 -0
  99. package/components/Segmented.d.ts +39 -0
  100. package/components/Segmented.d.ts.map +1 -0
  101. package/components/Segmented.js +26 -0
  102. package/components/Segmented.js.map +1 -0
  103. package/components/SegmentedButton.d.ts +13 -0
  104. package/components/SegmentedButton.d.ts.map +1 -0
  105. package/components/SegmentedButton.js +10 -0
  106. package/components/SegmentedButton.js.map +1 -0
  107. package/components/SegmentedContext.d.ts +36 -0
  108. package/components/SegmentedContext.d.ts.map +1 -0
  109. package/components/SegmentedContext.js +10 -0
  110. package/components/SegmentedContext.js.map +1 -0
  111. package/components/Select.d.ts +145 -0
  112. package/components/Select.d.ts.map +1 -0
  113. package/components/Select.js +316 -0
  114. package/components/Select.js.map +1 -0
  115. package/components/Surface.d.ts +67 -0
  116. package/components/Surface.d.ts.map +1 -0
  117. package/components/Surface.js +36 -0
  118. package/components/Surface.js.map +1 -0
  119. package/components/SurfaceContent.d.ts +8 -0
  120. package/components/SurfaceContent.d.ts.map +1 -0
  121. package/components/SurfaceContent.js +7 -0
  122. package/components/SurfaceContent.js.map +1 -0
  123. package/components/SurfaceContext.d.ts +19 -0
  124. package/components/SurfaceContext.d.ts.map +1 -0
  125. package/components/SurfaceContext.js +9 -0
  126. package/components/SurfaceContext.js.map +1 -0
  127. package/components/SurfaceCut.d.ts +33 -0
  128. package/components/SurfaceCut.d.ts.map +1 -0
  129. package/components/SurfaceCut.js +17 -0
  130. package/components/SurfaceCut.js.map +1 -0
  131. package/components/SurfaceCutContent.d.ts +16 -0
  132. package/components/SurfaceCutContent.d.ts.map +1 -0
  133. package/components/SurfaceCutContent.js +8 -0
  134. package/components/SurfaceCutContent.js.map +1 -0
  135. package/components/TextArea.d.ts +61 -0
  136. package/components/TextArea.d.ts.map +1 -0
  137. package/components/TextArea.js +102 -0
  138. package/components/TextArea.js.map +1 -0
  139. package/components/ThemeContext.d.ts +23 -0
  140. package/components/ThemeContext.d.ts.map +1 -0
  141. package/components/ThemeContext.js +18 -0
  142. package/components/ThemeContext.js.map +1 -0
  143. package/components/Toast.d.ts +89 -0
  144. package/components/Toast.d.ts.map +1 -0
  145. package/components/Toast.js +129 -0
  146. package/components/Toast.js.map +1 -0
  147. package/components/ToastsPortal.d.ts +2 -0
  148. package/components/ToastsPortal.d.ts.map +1 -0
  149. package/components/ToastsPortal.js +17 -0
  150. package/components/ToastsPortal.js.map +1 -0
  151. package/components/ToastsPortalContext.d.ts +45 -0
  152. package/components/ToastsPortalContext.d.ts.map +1 -0
  153. package/components/ToastsPortalContext.js +17 -0
  154. package/components/ToastsPortalContext.js.map +1 -0
  155. package/components/Toggle.d.ts +69 -0
  156. package/components/Toggle.d.ts.map +1 -0
  157. package/components/Toggle.js +48 -0
  158. package/components/Toggle.js.map +1 -0
  159. package/components/Tooltip.d.ts +48 -0
  160. package/components/Tooltip.d.ts.map +1 -0
  161. package/components/Tooltip.js +90 -0
  162. package/components/Tooltip.js.map +1 -0
  163. package/components/UIProvider.d.ts +16 -0
  164. package/components/UIProvider.d.ts.map +1 -0
  165. package/components/UIProvider.js +11 -0
  166. package/components/UIProvider.js.map +1 -0
  167. package/components/WithTooltip.d.ts +36 -0
  168. package/components/WithTooltip.d.ts.map +1 -0
  169. package/components/WithTooltip.js +138 -0
  170. package/components/WithTooltip.js.map +1 -0
  171. package/components/icons/CheckIcon.d.ts +2 -0
  172. package/components/icons/CheckIcon.d.ts.map +1 -0
  173. package/components/icons/CheckIcon.js +5 -0
  174. package/components/icons/CheckIcon.js.map +1 -0
  175. package/components/icons/CloseIcon.d.ts +2 -0
  176. package/components/icons/CloseIcon.d.ts.map +1 -0
  177. package/components/icons/CloseIcon.js +3 -0
  178. package/components/icons/CloseIcon.js.map +1 -0
  179. package/components/icons/DropdownIcon.d.ts +2 -0
  180. package/components/icons/DropdownIcon.d.ts.map +1 -0
  181. package/components/icons/DropdownIcon.js +3 -0
  182. package/components/icons/DropdownIcon.js.map +1 -0
  183. package/components/icons/SearchIcon.d.ts +2 -0
  184. package/components/icons/SearchIcon.d.ts.map +1 -0
  185. package/components/icons/SearchIcon.js +5 -0
  186. package/components/icons/SearchIcon.js.map +1 -0
  187. package/hooks/use-accent-color.d.ts +2 -0
  188. package/hooks/use-accent-color.d.ts.map +1 -0
  189. package/hooks/use-accent-color.js +6 -0
  190. package/hooks/use-accent-color.js.map +1 -0
  191. package/hooks/use-device.d.ts +14 -0
  192. package/hooks/use-device.d.ts.map +1 -0
  193. package/hooks/use-device.js +68 -0
  194. package/hooks/use-device.js.map +1 -0
  195. package/hooks/use-dialog.d.ts +8 -0
  196. package/hooks/use-dialog.d.ts.map +1 -0
  197. package/hooks/use-dialog.js +38 -0
  198. package/hooks/use-dialog.js.map +1 -0
  199. package/hooks/use-focus-trap.d.ts +9 -0
  200. package/hooks/use-focus-trap.d.ts.map +1 -0
  201. package/hooks/use-focus-trap.js +106 -0
  202. package/hooks/use-focus-trap.js.map +1 -0
  203. package/hooks/use-modal-utils.d.ts +17 -0
  204. package/hooks/use-modal-utils.d.ts.map +1 -0
  205. package/hooks/use-modal-utils.js +110 -0
  206. package/hooks/use-modal-utils.js.map +1 -0
  207. package/hooks/use-surface.d.ts +2 -0
  208. package/hooks/use-surface.d.ts.map +1 -0
  209. package/hooks/use-surface.js +6 -0
  210. package/hooks/use-surface.js.map +1 -0
  211. package/hooks/use-theme.d.ts +2 -0
  212. package/hooks/use-theme.d.ts.map +1 -0
  213. package/hooks/use-theme.js +6 -0
  214. package/hooks/use-theme.js.map +1 -0
  215. package/hooks/use-toast.d.ts +3 -0
  216. package/hooks/use-toast.d.ts.map +1 -0
  217. package/hooks/use-toast.js +21 -0
  218. package/hooks/use-toast.js.map +1 -0
  219. package/index.d.ts +42 -0
  220. package/index.d.ts.map +1 -0
  221. package/index.js +42 -0
  222. package/index.js.map +1 -0
  223. package/package.json +27 -9
  224. package/shared/cn.d.ts +3 -0
  225. package/shared/cn.d.ts.map +1 -0
  226. package/shared/cn.js +6 -0
  227. package/shared/cn.js.map +1 -0
  228. package/shared/next-tick.d.ts +2 -0
  229. package/shared/next-tick.d.ts.map +1 -0
  230. package/shared/next-tick.js +6 -0
  231. package/shared/next-tick.js.map +1 -0
  232. package/styles/colors.css +403 -0
  233. package/styles/popup.css +14 -0
  234. package/styles/preloader.css +71 -0
  235. package/styles/range.css +17 -0
  236. package/styles/safe-areas.css +192 -0
  237. package/types.d.ts +2 -0
  238. package/types.d.ts.map +1 -0
  239. package/types.js +2 -0
  240. package/types.js.map +1 -0
  241. package/ui.css +10 -0
@@ -0,0 +1,366 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cloneElement, createContext, useContext, useEffect, useRef, useState, } from 'react';
3
+ import { createPortal } from 'react-dom';
4
+ import { useModalUtils } from '../hooks/use-modal-utils';
5
+ import { useTheme } from '../hooks/use-theme';
6
+ import { cn } from '../shared/cn';
7
+ import { Backdrop } from './Backdrop';
8
+ import { ModalController } from './ModalController';
9
+ import { Surface } from './Surface';
10
+ const PopoverContext = createContext(null);
11
+ const PopoverRootContext = createContext(null);
12
+ /**
13
+ * State container for the `Popover` + `PopoverTrigger` + `Popover` compound. Holds the open
14
+ * state and the anchor ref so a `PopoverTrigger` can register the anchor element and a sibling
15
+ * `Popover` can read both via context.
16
+ *
17
+ * Use this when you want the trigger and the popover to be siblings in JSX (Radix-style):
18
+ *
19
+ * ```tsx
20
+ * <PopoverRoot>
21
+ * <PopoverTrigger><Button>Open</Button></PopoverTrigger>
22
+ * <Popover>...</Popover>
23
+ * </PopoverRoot>
24
+ * ```
25
+ *
26
+ * Skip this and pass `open`/`onOpenChange`/`anchorRef` directly to `<Popover>` if you'd rather
27
+ * control state yourself.
28
+ */
29
+ export const PopoverRoot = ({ children, defaultOpen = false, open: openProp, onOpenChange, }) => {
30
+ const [internalOpen, setInternalOpen] = useState(defaultOpen);
31
+ const anchorRef = useRef(null);
32
+ const isControlled = openProp !== undefined;
33
+ const open = isControlled ? openProp : internalOpen;
34
+ const setOpen = (newOpen) => {
35
+ if (!isControlled)
36
+ setInternalOpen(newOpen);
37
+ onOpenChange?.(newOpen);
38
+ };
39
+ return (_jsx(PopoverRootContext.Provider, { value: { open, setOpen, anchorRef }, children: children }));
40
+ };
41
+ /**
42
+ * Wraps a single child element to act as the popover trigger. **Clones** the child to attach:
43
+ * - a `ref` callback that registers the element as the popover's anchor (composed with any
44
+ * existing ref on the child),
45
+ * - an `onClick` handler that toggles the surrounding `PopoverRoot`'s open state (composed
46
+ * with any existing `onClick`).
47
+ *
48
+ * No-ops (renders the child as-is) when used outside a `PopoverRoot`. Expects exactly one
49
+ * React element child that accepts `ref` and `onClick`.
50
+ */
51
+ export const PopoverTrigger = ({ children, }) => {
52
+ const ctx = useContext(PopoverRootContext);
53
+ if (!ctx)
54
+ return _jsx(_Fragment, { children: children });
55
+ const child = children;
56
+ const originalRef = child?.props?.ref;
57
+ const originalOnClick = child?.props?.onClick;
58
+ const setRef = (el) => {
59
+ ctx.anchorRef.current = el;
60
+ if (typeof originalRef === 'function')
61
+ originalRef(el);
62
+ else if (originalRef &&
63
+ typeof originalRef === 'object' &&
64
+ 'current' in originalRef) {
65
+ originalRef.current = el;
66
+ }
67
+ };
68
+ const onClick = (e) => {
69
+ if (originalOnClick)
70
+ originalOnClick(e);
71
+ ctx.setOpen(!ctx.open);
72
+ };
73
+ return cloneElement(child, { ref: setRef, onClick });
74
+ };
75
+ /**
76
+ * Wraps a single child element to close the surrounding popover when clicked. **Clones** the
77
+ * child to attach an `onClick` handler that flips the surrounding `PopoverRoot`'s open state
78
+ * to `false` (composed with any existing `onClick` on the child).
79
+ *
80
+ * ```tsx
81
+ * <PopoverRoot>
82
+ * <PopoverTrigger><Button>Open</Button></PopoverTrigger>
83
+ * <Popover>
84
+ * ...
85
+ * <PopoverClose><Button>Done</Button></PopoverClose>
86
+ * </Popover>
87
+ * </PopoverRoot>
88
+ * ```
89
+ *
90
+ * No-ops (renders the child as-is) when used outside a `PopoverRoot`.
91
+ */
92
+ export const PopoverClose = ({ children, }) => {
93
+ const ctx = useContext(PopoverRootContext);
94
+ if (!ctx)
95
+ return _jsx(_Fragment, { children: children });
96
+ const child = children;
97
+ const originalOnClick = child?.props?.onClick;
98
+ const onClick = (e) => {
99
+ if (originalOnClick)
100
+ originalOnClick(e);
101
+ ctx.setOpen(false);
102
+ };
103
+ return cloneElement(child, { onClick });
104
+ };
105
+ const POSITIONS = {
106
+ 'top-start': {
107
+ area: 'top center',
108
+ justifySelf: 'start',
109
+ origin: 'origin-bottom-left',
110
+ offsetProperties: ['marginBottom', 'marginLeft'],
111
+ },
112
+ top: {
113
+ area: 'top center',
114
+ origin: 'origin-bottom',
115
+ offsetProperties: ['marginBottom', 'marginLeft'],
116
+ },
117
+ 'top-end': {
118
+ area: 'top center',
119
+ justifySelf: 'end',
120
+ origin: 'origin-bottom-right',
121
+ offsetProperties: ['marginBottom', 'marginRight'],
122
+ },
123
+ 'bottom-start': {
124
+ area: 'bottom center',
125
+ justifySelf: 'start',
126
+ origin: 'origin-top-left',
127
+ offsetProperties: ['marginTop', 'marginLeft'],
128
+ },
129
+ bottom: {
130
+ area: 'bottom center',
131
+ origin: 'origin-top',
132
+ offsetProperties: ['marginTop', 'marginLeft'],
133
+ },
134
+ 'bottom-end': {
135
+ area: 'bottom center',
136
+ justifySelf: 'end',
137
+ origin: 'origin-top-right',
138
+ offsetProperties: ['marginTop', 'marginRight'],
139
+ },
140
+ 'left-start': {
141
+ area: 'center left',
142
+ alignSelf: 'start',
143
+ origin: 'origin-top-right',
144
+ offsetProperties: ['marginRight', 'marginTop'],
145
+ },
146
+ left: {
147
+ area: 'center left',
148
+ origin: 'origin-right',
149
+ offsetProperties: ['marginRight', 'marginTop'],
150
+ },
151
+ 'left-end': {
152
+ area: 'center left',
153
+ alignSelf: 'end',
154
+ origin: 'origin-bottom-right',
155
+ offsetProperties: ['marginRight', 'marginBottom'],
156
+ },
157
+ 'right-start': {
158
+ area: 'center right',
159
+ alignSelf: 'start',
160
+ origin: 'origin-top-left',
161
+ offsetProperties: ['marginLeft', 'marginTop'],
162
+ },
163
+ right: {
164
+ area: 'center right',
165
+ origin: 'origin-left',
166
+ offsetProperties: ['marginLeft', 'marginTop'],
167
+ },
168
+ 'right-end': {
169
+ area: 'center right',
170
+ alignSelf: 'end',
171
+ origin: 'origin-bottom-left',
172
+ offsetProperties: ['marginLeft', 'marginBottom'],
173
+ },
174
+ };
175
+ const resolveOffset = (value, marginProp) => {
176
+ if (typeof value === 'number')
177
+ return `${value}px`;
178
+ if (value.endsWith('%')) {
179
+ const fraction = parseFloat(value) / 100;
180
+ const dim = marginProp === 'marginTop' || marginProp === 'marginBottom'
181
+ ? 'height'
182
+ : 'width';
183
+ return `calc(anchor-size(${dim}) * ${fraction})`;
184
+ }
185
+ return value;
186
+ };
187
+ const PopoverInner = (props) => {
188
+ const theme = useTheme();
189
+ const { phase = 'closed', onPhaseChange = () => { }, className = '', contentClassName = '', anchorRef, anchorRect, root = '#app, #__next, #root', position = 'bottom', offset, backdrop = false, backdropTransparent = false, color, children, surfaceLevel = theme === 'light' ? 1 : undefined, variant = 'gradient', outline = theme === 'dark', lazy = false, closeOnBackdropClick = true, closeOnEscape = true, onOpen = () => { }, onOpened = () => { }, onClose = () => { }, onClosed = () => { }, ref, ...rest } = props;
190
+ const anchorNameRef = useRef('');
191
+ // Reuse existing anchor-name if target already has one (e.g. from Tooltip),
192
+ // otherwise generate a shared one
193
+ if (anchorRef?.current) {
194
+ const existing = anchorRef.current.style.getPropertyValue('anchor-name');
195
+ if (existing) {
196
+ anchorNameRef.current = existing;
197
+ }
198
+ }
199
+ if (!anchorNameRef.current) {
200
+ anchorNameRef.current = `--anchor-${Math.random().toString(36).slice(2, 8)}`;
201
+ }
202
+ const anchorName = anchorNameRef.current;
203
+ const getAnchorRect = () => {
204
+ if (!anchorRect)
205
+ return null;
206
+ if (typeof anchorRect === 'object' && 'current' in anchorRect)
207
+ return anchorRect.current;
208
+ return anchorRect;
209
+ };
210
+ const elRef = useRef(null);
211
+ const containerElRef = useRef(null);
212
+ const wasPointerDown = useRef(false);
213
+ const positionConfig = POSITIONS[position] || POSITIONS['right-start'];
214
+ const { opened, open, close } = useModalUtils({
215
+ lazy,
216
+ phase,
217
+ onPhaseChange,
218
+ onOpen,
219
+ onOpened,
220
+ onClose,
221
+ onClosed,
222
+ transitionEndElRef: elRef,
223
+ closeOnEscape() {
224
+ if (!closeOnEscape)
225
+ return false;
226
+ if (containerElRef.current && containerElRef.current.nextElementSibling) {
227
+ const nextEl = containerElRef.current.nextElementSibling;
228
+ if (nextEl.matches('.popover, .dialog')) {
229
+ return false;
230
+ }
231
+ }
232
+ return true;
233
+ },
234
+ });
235
+ // Set anchor-name on target element if not already set
236
+ useEffect(() => {
237
+ const anchorEl = anchorRef?.current;
238
+ if (!anchorEl || !anchorName)
239
+ return;
240
+ if (!anchorEl.style.getPropertyValue('anchor-name')) {
241
+ anchorEl.style.setProperty('anchor-name', anchorName);
242
+ }
243
+ }, [anchorRef, anchorName]);
244
+ // Click-outside handling
245
+ const onDocumentClick = (e) => {
246
+ if (!opened)
247
+ return;
248
+ const target = e.target;
249
+ if (containerElRef.current && containerElRef.current.contains(target))
250
+ return;
251
+ const targetPopoverEl = target.closest('.popover');
252
+ if (targetPopoverEl) {
253
+ const isParentPopoverClicked = targetPopoverEl &&
254
+ containerElRef.current &&
255
+ targetPopoverEl.nextElementSibling === containerElRef.current;
256
+ if (!isParentPopoverClicked) {
257
+ return;
258
+ }
259
+ }
260
+ if (!wasPointerDown.current)
261
+ return;
262
+ if (!target.closest('body'))
263
+ return;
264
+ if (!closeOnBackdropClick)
265
+ return;
266
+ if (containerElRef.current &&
267
+ containerElRef.current.nextElementSibling &&
268
+ containerElRef.current.nextElementSibling.classList.contains('popover')) {
269
+ return;
270
+ }
271
+ close();
272
+ };
273
+ const onPointerDown = () => {
274
+ wasPointerDown.current = true;
275
+ };
276
+ useEffect(() => {
277
+ document.addEventListener('pointerdown', onPointerDown);
278
+ document.addEventListener('click', onDocumentClick);
279
+ return () => {
280
+ document.removeEventListener('pointerdown', onPointerDown);
281
+ document.removeEventListener('click', onDocumentClick);
282
+ };
283
+ });
284
+ useEffect(() => {
285
+ requestAnimationFrame(() => {
286
+ open();
287
+ });
288
+ }, []);
289
+ // Track popovers that are React-tree children of this one
290
+ const parentPopover = useContext(PopoverContext);
291
+ const childCloseFns = useRef(new Set());
292
+ const popoverContextValue = useRef({
293
+ register: (closeFn) => {
294
+ childCloseFns.current.add(closeFn);
295
+ return () => {
296
+ childCloseFns.current.delete(closeFn);
297
+ };
298
+ },
299
+ }).current;
300
+ // Keep latest close in a ref so the registered callback always calls the current one
301
+ const closeRef = useRef(close);
302
+ closeRef.current = close;
303
+ // Register this popover's close with its parent popover (if any)
304
+ useEffect(() => {
305
+ if (!parentPopover)
306
+ return;
307
+ return parentPopover.register(() => closeRef.current());
308
+ }, [parentPopover]);
309
+ // Cascade close to registered child popovers when this one starts closing
310
+ useEffect(() => {
311
+ if (phase !== 'closing')
312
+ return;
313
+ childCloseFns.current.forEach((closeChild) => closeChild());
314
+ }, [phase]);
315
+ const [mainOffset, crossOffset] = Array.isArray(offset)
316
+ ? offset
317
+ : [offset || 0, 0];
318
+ const [mainProp, crossProp] = positionConfig.offsetProperties;
319
+ const popoverStyle = {
320
+ position: 'absolute',
321
+ positionAnchor: anchorName,
322
+ positionArea: positionConfig.area,
323
+ positionTryFallbacks: 'flip-block, flip-inline, flip-block flip-inline',
324
+ justifySelf: positionConfig.justifySelf,
325
+ alignSelf: positionConfig.alignSelf,
326
+ ...(mainOffset ? { [mainProp]: resolveOffset(mainOffset, mainProp) } : {}),
327
+ ...(crossOffset
328
+ ? { [crossProp]: resolveOffset(crossOffset, crossProp) }
329
+ : {}),
330
+ };
331
+ const content = (_jsx(PopoverContext.Provider, { value: popoverContextValue, children: _jsxs("div", { className: "popover", ref: containerElRef, children: [backdrop && (_jsx(Backdrop, { onClick: () => {
332
+ if (closeOnBackdropClick)
333
+ close();
334
+ }, className: cn('duration-200', backdropTransparent ? 'bg-transparent' : 'bg-backdrop/50', opened ? 'opacity-100' : 'opacity-0') })), anchorRect &&
335
+ !anchorRef?.current &&
336
+ (() => {
337
+ const rect = getAnchorRect();
338
+ return rect ? (_jsx("div", { style: {
339
+ position: 'fixed',
340
+ pointerEvents: 'none',
341
+ left: rect.left,
342
+ top: rect.top,
343
+ width: rect.width,
344
+ height: rect.height,
345
+ anchorName: anchorName,
346
+ } })) : null;
347
+ })(), _jsx(Surface, { ref: (el) => {
348
+ elRef.current = el;
349
+ if (typeof ref === 'function')
350
+ ref(el);
351
+ else if (ref && 'current' in ref)
352
+ ref.current = el;
353
+ }, style: popoverStyle, className: cn('pointer-events-auto z-50 w-40 max-w-[calc(100vw-16px)] rounded-3xl shadow-popover transition-[opacity,transform,scale] duration-0', opened && 'scale-100 opacity-100 ease-[cubic-bezier(0,1,0,1.025)]', (phase === 'opened' || (phase === 'opening' && opened)) &&
354
+ 'duration-400', phase === 'closing' && 'duration-300 ease-out!', (phase === 'closing' || !opened) && 'scale-0 opacity-0', positionConfig.origin, className), color: color, level: surfaceLevel, variant: variant, outline: outline, contentClassName: cn('max-h-[70vh] overflow-auto', contentClassName), ...rest, children: children })] }) }));
355
+ return root
356
+ ? createPortal(content, document.querySelector(root))
357
+ : content;
358
+ };
359
+ export const Popover = ({ open, onOpenChange, anchorRef, ...rest }) => {
360
+ const ctx = useContext(PopoverRootContext);
361
+ const effectiveOpen = open ?? ctx?.open ?? false;
362
+ const effectiveOnOpenChange = onOpenChange ?? ctx?.setOpen ?? (() => { });
363
+ const effectiveAnchorRef = anchorRef ?? ctx?.anchorRef;
364
+ return (_jsx(ModalController, { open: effectiveOpen, onOpenChange: effectiveOnOpenChange, children: _jsx(PopoverInner, { anchorRef: effectiveAnchorRef, ...rest }) }));
365
+ };
366
+ //# sourceMappingURL=Popover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Popover.js","sourceRoot":"","sources":["../../../src/components/Popover.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,120 @@
1
+ import React from 'react';
2
+ import { Color } from '../types';
3
+ /**
4
+ * State container for the `Popup` + `PopupTrigger` + `Popup` compound. Use when you want
5
+ * the trigger and the popup to be siblings in JSX:
6
+ *
7
+ * ```tsx
8
+ * <PopupRoot>
9
+ * <PopupTrigger><Button>Open</Button></PopupTrigger>
10
+ * <Popup>...</Popup>
11
+ * </PopupRoot>
12
+ * ```
13
+ *
14
+ * Skip this and pass `open`/`onOpenChange` directly to `<Popup>` if you'd rather control state.
15
+ */
16
+ export declare const PopupRoot: ({ children, defaultOpen, open: openProp, onOpenChange, }: {
17
+ children: React.ReactNode;
18
+ /** Initial open state (uncontrolled). Default `false`. Ignored when `open` is provided. */
19
+ defaultOpen?: boolean;
20
+ /** Controlled open state. When provided, internal state is bypassed. */
21
+ open?: boolean;
22
+ /** Fires whenever the open state should change. */
23
+ onOpenChange?: (open: boolean) => void;
24
+ }) => import("react/jsx-runtime").JSX.Element;
25
+ /**
26
+ * Wraps a single child element to act as the popup trigger. **Clones** the child to attach
27
+ * an `onClick` handler that toggles the surrounding `PopupRoot`'s open state (composed with
28
+ * any existing `onClick` on the child).
29
+ *
30
+ * No-ops (renders the child as-is) when used outside a `PopupRoot`.
31
+ */
32
+ export declare const PopupTrigger: ({ children }: {
33
+ children: React.ReactNode;
34
+ }) => import("react/jsx-runtime").JSX.Element;
35
+ /**
36
+ * Wraps a single child element to close the surrounding popup when clicked. **Clones** the
37
+ * child to attach an `onClick` handler that flips the surrounding `PopupRoot`'s open state
38
+ * to `false` (composed with any existing `onClick` on the child).
39
+ *
40
+ * ```tsx
41
+ * <PopupRoot>
42
+ * <PopupTrigger><Button>Open</Button></PopupTrigger>
43
+ * <Popup>
44
+ * ...
45
+ * <PopupClose><Button>Close</Button></PopupClose>
46
+ * </Popup>
47
+ * </PopupRoot>
48
+ * ```
49
+ *
50
+ * No-ops (renders the child as-is) when used outside a `PopupRoot`.
51
+ */
52
+ export declare const PopupClose: ({ children }: {
53
+ children: React.ReactNode;
54
+ }) => import("react/jsx-runtime").JSX.Element;
55
+ export interface PopupProps {
56
+ /** Controlled open state. When omitted, falls back to the surrounding `PopupRoot` state, then `false`. */
57
+ open?: boolean;
58
+ /** Fires whenever the open state should change. */
59
+ onOpenChange?: (open: boolean) => void;
60
+ /** Fires when the open transition begins. */
61
+ onOpen?: () => void;
62
+ /** Fires after the open transition completes (`transitionend`). */
63
+ onOpened?: () => void;
64
+ /** Fires when the close transition begins. */
65
+ onClose?: () => void;
66
+ /** Fires after the close transition completes. */
67
+ onClosed?: () => void;
68
+ /** Extra classes applied to the outer popup container (positioning + overflow). */
69
+ className?: string;
70
+ /** Portal target selector. Default `'#app, #__next, #root'`. */
71
+ root?: string;
72
+ /** Selector for the container made `inert` while the popup is open. Default `'.app-container'`. */
73
+ inertContainer?: string;
74
+ /** Defer rendering until first opened, and unmount after close. Default `false`. */
75
+ lazy?: boolean;
76
+ /** Extra classes for the inner content column (where children + header live). */
77
+ contentClassName?: string;
78
+ /** Extra classes for the scrollable wrap that holds the content column. */
79
+ wrapClassName?: string;
80
+ /** Render the top header (with close button + slots). Default `true`. */
81
+ header?: boolean;
82
+ headerClassName?: string;
83
+ /** Slot rendered on the left side of the header (e.g. title, breadcrumbs). */
84
+ headerLeft?: React.ReactNode;
85
+ /** Slot rendered on the right side of the header, before the auto-rendered close button. */
86
+ headerRight?: React.ReactNode;
87
+ /** Render the backdrop. Default `true`. */
88
+ backdrop?: boolean;
89
+ /** Extra classes for the backdrop element. */
90
+ backdropClassName?: string;
91
+ /** Default `true`. */
92
+ closeOnBackdropClick?: boolean;
93
+ /** Default `true`. Suppressed automatically when this popup contains another popover/dialog/popup, or task-edit overlays. */
94
+ closeOnEscape?: boolean;
95
+ /** Render the auto close button in the header. Default `true`. */
96
+ closeButton?: boolean;
97
+ /** Override the close-button glyph. Default is an inline SVG "X". */
98
+ closeButtonContent?: React.ReactNode;
99
+ /** Accent color token for the close button. */
100
+ closeButtonColor?: Color;
101
+ /** Fires before the popup closes from the close-button click. The popup also closes regardless. */
102
+ onCloseButtonClick?: () => void;
103
+ /**
104
+ * Imperative escape hatch - assigned the popup's `close()` function so callers can dismiss it
105
+ * from outside the React tree (e.g. from a non-child callback). The ref's `.current` is set on mount.
106
+ */
107
+ closeRef?: React.MutableRefObject<(() => void) | null>;
108
+ /** ARIA label for the dialog role. Use when there's no visible title. */
109
+ 'aria-label'?: string;
110
+ /** Id of the element labelling this popup. */
111
+ 'aria-labelledby'?: string;
112
+ /** Id of the element describing this popup. */
113
+ 'aria-describedby'?: string;
114
+ /** Popup content. Rendered inside the inner content column, after the header. */
115
+ children?: React.ReactNode;
116
+ /** Slot rendered above the header, inside the popup content wrapper. */
117
+ beforeContent?: React.ReactNode;
118
+ }
119
+ export declare const Popup: ({ open, onOpenChange, ...rest }: PopupProps) => import("react/jsx-runtime").JSX.Element;
120
+ //# sourceMappingURL=Popup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Popup.d.ts","sourceRoot":"","sources":["../../../src/components/Popup.tsx"],"names":[],"mappings":"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"}