@refraction-ui/react 0.22.0 → 0.23.1

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 (201) hide show
  1. package/dist/{chunk-V24GDHUX.js → chunk-4ACSHPCM.js} +2 -2
  2. package/dist/{chunk-SDAJVXD4.js → chunk-5P56PN3J.js} +2 -2
  3. package/dist/chunk-75BKRTPO.js +417 -0
  4. package/dist/{chunk-2Q6HHFAN.js.map → chunk-75BKRTPO.js.map} +1 -1
  5. package/dist/chunk-7P7EJ56S.js +7 -0
  6. package/dist/{chunk-QPCKJ2YR.js → chunk-GG6MZDGV.js} +2 -2
  7. package/dist/{chunk-QDMLIDYN.js → chunk-GU5MI7FX.js} +2 -2
  8. package/dist/{chunk-3Y2T26QD.js → chunk-JZQ5ZL46.js} +6 -4
  9. package/dist/{chunk-3Y2T26QD.js.map → chunk-JZQ5ZL46.js.map} +2 -2
  10. package/dist/{chunk-RSWOLRIC.js → chunk-KIZD73DK.js} +2 -2
  11. package/dist/{chunk-XMFNBOPO.js → chunk-PY2TIFCT.js} +2 -2
  12. package/dist/{chunk-XWP763SH.js → chunk-V727VZOE.js} +4 -2
  13. package/dist/{chunk-XWP763SH.js.map → chunk-V727VZOE.js.map} +2 -2
  14. package/dist/{chunk-3I3DYDHR.js → chunk-WNLYPQOS.js} +2 -2
  15. package/dist/{chunk-63N4PZUJ.js → chunk-X6HEKRWE.js} +2 -2
  16. package/dist/{chunk-WYKPPK3W.js → chunk-XAJDSVZR.js} +2 -2
  17. package/dist/faro-engine-VIUXJAPH-FSARIABU.js +3 -0
  18. package/dist/{faro-engine-47HGRAQH-JKINJPMH.js.map → faro-engine-VIUXJAPH-FSARIABU.js.map} +1 -1
  19. package/dist/index.cjs +736 -274
  20. package/dist/index.cjs.map +1 -1
  21. package/dist/index.d.cts +3 -0
  22. package/dist/index.d.ts +3 -0
  23. package/dist/index.js +3 -0
  24. package/dist/internal/avatar/index.d.cts +4 -1
  25. package/dist/internal/avatar/index.d.ts +4 -1
  26. package/dist/internal/data-table/index.d.cts +48 -3
  27. package/dist/internal/data-table/index.d.ts +48 -3
  28. package/dist/internal/line-chart/index.d.ts +17 -3
  29. package/dist/internal/native-select/index.d.ts +21 -0
  30. package/dist/internal/react-avatar/index.d.cts +4 -2
  31. package/dist/internal/react-avatar/index.d.ts +4 -2
  32. package/dist/internal/react-command/index.d.cts +13 -2
  33. package/dist/internal/react-command/index.d.ts +13 -2
  34. package/dist/internal/react-data-table/index.d.cts +27 -9
  35. package/dist/internal/react-data-table/index.d.ts +27 -9
  36. package/dist/internal/react-dialog/index.d.cts +5 -0
  37. package/dist/internal/react-dialog/index.d.ts +5 -0
  38. package/dist/internal/react-dropdown-menu/index.d.cts +19 -1
  39. package/dist/internal/react-dropdown-menu/index.d.ts +19 -1
  40. package/dist/internal/react-line-chart/index.d.ts +7 -2
  41. package/dist/internal/react-native-select/index.d.ts +19 -0
  42. package/dist/internal/react-stat-grid/index.d.ts +22 -11
  43. package/dist/internal/react-table/index.d.ts +39 -0
  44. package/dist/internal/stat-grid/index.d.ts +49 -7
  45. package/dist/internal/table/index.d.ts +46 -0
  46. package/dist/react-accordion.js +1 -1
  47. package/dist/react-action-list.js +1 -1
  48. package/dist/react-ai.js +1 -1
  49. package/dist/react-analytics.js +16 -4
  50. package/dist/react-analytics.js.map +2 -2
  51. package/dist/react-animated-text.js +1 -1
  52. package/dist/react-app-shell.js +1 -1
  53. package/dist/react-audience-feature-card.js +1 -1
  54. package/dist/react-audio-room.js +1 -1
  55. package/dist/react-auth.js +1 -1
  56. package/dist/react-avatar-group.js +1 -1
  57. package/dist/react-avatar.js +13 -9
  58. package/dist/react-avatar.js.map +2 -2
  59. package/dist/react-badge.js +1 -1
  60. package/dist/react-bottom-nav.js +1 -1
  61. package/dist/react-brand-network-cell.js +1 -1
  62. package/dist/react-breadcrumbs.js +1 -1
  63. package/dist/react-browser-chrome-mock.js +1 -1
  64. package/dist/react-button.js +3 -3
  65. package/dist/react-calendar.js +1 -1
  66. package/dist/react-call-controls.js +1 -1
  67. package/dist/react-callout.js +1 -1
  68. package/dist/react-card-grid.js +1 -1
  69. package/dist/react-card.js +1 -1
  70. package/dist/react-carousel.js +1 -1
  71. package/dist/react-charts.js +1 -1
  72. package/dist/react-checkbox.js +1 -1
  73. package/dist/react-checklist.js +1 -1
  74. package/dist/react-code-block.js +1 -1
  75. package/dist/react-code-editor.js +1 -1
  76. package/dist/react-collapsible.js +1 -1
  77. package/dist/react-combobox.js +1 -1
  78. package/dist/react-command-input.js +1 -1
  79. package/dist/react-command.js +115 -70
  80. package/dist/react-command.js.map +3 -3
  81. package/dist/react-composer.js +3 -3
  82. package/dist/react-content-protection.js +1 -1
  83. package/dist/react-conversation.js +5 -5
  84. package/dist/react-cookie-consent.js +1 -1
  85. package/dist/react-data-table.js +125 -114
  86. package/dist/react-data-table.js.map +2 -2
  87. package/dist/react-date-picker.js +1 -1
  88. package/dist/react-device-frame.js +1 -1
  89. package/dist/react-dialog.js +33 -9
  90. package/dist/react-dialog.js.map +2 -2
  91. package/dist/react-diff-viewer.js +1 -1
  92. package/dist/react-dropdown-menu.js +61 -8
  93. package/dist/react-dropdown-menu.js.map +3 -3
  94. package/dist/react-editor-status-bar.js +1 -1
  95. package/dist/react-editor-tabs.js +1 -1
  96. package/dist/react-emoji-picker.js +2 -2
  97. package/dist/react-empty-state.js +1 -1
  98. package/dist/react-feedback-dialog.js +2 -2
  99. package/dist/react-file-tree.js +1 -1
  100. package/dist/react-file-upload.js +1 -1
  101. package/dist/react-floating-reactions.js +1 -1
  102. package/dist/react-flow-editor.js +2 -2
  103. package/dist/react-footer.js +1 -1
  104. package/dist/react-funnel-chart.js +1 -1
  105. package/dist/react-graph-view.js +2 -2
  106. package/dist/react-infinite-canvas.js +2 -2
  107. package/dist/react-inline-editor.js +1 -1
  108. package/dist/react-input-group.js +1 -1
  109. package/dist/react-input.js +2 -2
  110. package/dist/react-install-prompt.js +1 -1
  111. package/dist/react-kanban-board.js +1 -1
  112. package/dist/react-keyboard-shortcut.js +2 -2
  113. package/dist/react-language-selector.js +1 -1
  114. package/dist/react-line-chart.js +49 -11
  115. package/dist/react-line-chart.js.map +2 -2
  116. package/dist/react-link-card.js +1 -1
  117. package/dist/react-live-captions.js +1 -1
  118. package/dist/react-live-cursors.js +1 -1
  119. package/dist/react-live-transcript.js +1 -1
  120. package/dist/react-location-selector.js +1 -1
  121. package/dist/react-logger.js +3 -3
  122. package/dist/react-markdown-renderer.js +2 -2
  123. package/dist/react-marquee-strip.js +1 -1
  124. package/dist/react-mascot.js +1 -1
  125. package/dist/react-mastery-bar.js +1 -1
  126. package/dist/react-mini-map.js +1 -1
  127. package/dist/react-mobile-nav.js +1 -1
  128. package/dist/react-native-select.js +52 -0
  129. package/dist/react-native-select.js.map +7 -0
  130. package/dist/react-navbar.js +1 -1
  131. package/dist/react-numbered-steps.js +1 -1
  132. package/dist/react-otp-input.js +1 -1
  133. package/dist/react-page-header.js +1 -1
  134. package/dist/react-pagination.js +1 -1
  135. package/dist/react-password-input.js +2 -2
  136. package/dist/react-payment.js +1 -1
  137. package/dist/react-popover.js +1 -1
  138. package/dist/react-pre-call-lobby.js +1 -1
  139. package/dist/react-presence-indicator.js +1 -1
  140. package/dist/react-pricing-card.js +1 -1
  141. package/dist/react-progress-display.js +1 -1
  142. package/dist/react-radial-gauge.js +1 -1
  143. package/dist/react-radio.js +1 -1
  144. package/dist/react-rating-scale.js +1 -1
  145. package/dist/react-reaction-bar.js +1 -1
  146. package/dist/react-resizable-layout.js +1 -1
  147. package/dist/react-search-bar.js +1 -1
  148. package/dist/react-section-head.js +1 -1
  149. package/dist/react-segmented-control.js +1 -1
  150. package/dist/react-select.js +1 -1
  151. package/dist/react-separator.js +1 -1
  152. package/dist/react-sheet.js +1 -1
  153. package/dist/react-sidebar.js +1 -1
  154. package/dist/react-skeleton.js +1 -1
  155. package/dist/react-skip-to-content.js +1 -1
  156. package/dist/react-slide-viewer.js +1 -1
  157. package/dist/react-slider.js +1 -1
  158. package/dist/react-slot-picker.js +1 -1
  159. package/dist/react-social-auth-button.js +3 -3
  160. package/dist/react-sortable-list.js +1 -1
  161. package/dist/react-stat-grid.js +91 -22
  162. package/dist/react-stat-grid.js.map +2 -2
  163. package/dist/react-status-indicator.js +1 -1
  164. package/dist/react-steps.js +1 -1
  165. package/dist/react-sticky-note.js +1 -1
  166. package/dist/react-switch.js +1 -1
  167. package/dist/react-table-of-contents.js +1 -1
  168. package/dist/react-table.js +148 -0
  169. package/dist/react-table.js.map +7 -0
  170. package/dist/react-tabs.js +35 -6
  171. package/dist/react-tabs.js.map +2 -2
  172. package/dist/react-terminal.js +1 -1
  173. package/dist/react-test-results.js +1 -1
  174. package/dist/react-textarea.js +1 -1
  175. package/dist/react-thread-view.js +2 -2
  176. package/dist/react-timeline.js +1 -1
  177. package/dist/react-toast.js +1 -1
  178. package/dist/react-tooltip.js +1 -1
  179. package/dist/react-version-selector.js +1 -1
  180. package/dist/react-video-grid.js +2 -2
  181. package/dist/react-video-player.js +1 -1
  182. package/dist/react-video-tile.js +2 -2
  183. package/dist/react-voice-pill.js +1 -1
  184. package/dist/react-waveform.js +1 -1
  185. package/dist/react-wizard.js +1 -1
  186. package/dist/shared.js +53 -0
  187. package/dist/shared.js.map +7 -0
  188. package/package.json +3 -1
  189. package/dist/chunk-2Q6HHFAN.js +0 -164
  190. package/dist/chunk-SDZ3LROZ.js +0 -7
  191. package/dist/faro-engine-47HGRAQH-JKINJPMH.js +0 -3
  192. /package/dist/{chunk-V24GDHUX.js.map → chunk-4ACSHPCM.js.map} +0 -0
  193. /package/dist/{chunk-SDAJVXD4.js.map → chunk-5P56PN3J.js.map} +0 -0
  194. /package/dist/{chunk-SDZ3LROZ.js.map → chunk-7P7EJ56S.js.map} +0 -0
  195. /package/dist/{chunk-QPCKJ2YR.js.map → chunk-GG6MZDGV.js.map} +0 -0
  196. /package/dist/{chunk-QDMLIDYN.js.map → chunk-GU5MI7FX.js.map} +0 -0
  197. /package/dist/{chunk-RSWOLRIC.js.map → chunk-KIZD73DK.js.map} +0 -0
  198. /package/dist/{chunk-XMFNBOPO.js.map → chunk-PY2TIFCT.js.map} +0 -0
  199. /package/dist/{chunk-3I3DYDHR.js.map → chunk-WNLYPQOS.js.map} +0 -0
  200. /package/dist/{chunk-63N4PZUJ.js.map → chunk-X6HEKRWE.js.map} +0 -0
  201. /package/dist/{chunk-WYKPPK3W.js.map → chunk-XAJDSVZR.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  cn,
3
3
  cva
4
- } from "./chunk-2Q6HHFAN.js";
4
+ } from "./chunk-75BKRTPO.js";
5
5
 
6
6
  // ../react-device-frame/dist/index.js
7
7
  import * as React from "react";
@@ -2,12 +2,12 @@ import {
2
2
  createDialog,
3
3
  dialogContentVariants,
4
4
  overlayStyles
5
- } from "./chunk-V24GDHUX.js";
5
+ } from "./chunk-4ACSHPCM.js";
6
6
  import {
7
7
  cn,
8
8
  createKeyboardHandler,
9
9
  devWarn
10
- } from "./chunk-2Q6HHFAN.js";
10
+ } from "./chunk-75BKRTPO.js";
11
11
 
12
12
  // ../react-dialog/dist/index.js
13
13
  import * as React from "react";
@@ -48,6 +48,8 @@ function Dialog({
48
48
  apiRef.current = createDialog({ open, modal });
49
49
  }
50
50
  const api = apiRef.current;
51
+ const [hasTitle, setHasTitle] = React.useState(false);
52
+ const [hasDescription, setHasDescription] = React.useState(false);
51
53
  const ctx = React.useMemo(
52
54
  () => ({
53
55
  open,
@@ -55,9 +57,13 @@ function Dialog({
55
57
  modal,
56
58
  contentId: api.ids.content,
57
59
  titleId: api.ids.title,
58
- descriptionId: api.ids.description
60
+ descriptionId: api.ids.description,
61
+ hasTitle,
62
+ hasDescription,
63
+ setHasTitle,
64
+ setHasDescription
59
65
  }),
60
- [open, handleOpenChange, modal, api.ids.content, api.ids.title, api.ids.description]
66
+ [open, handleOpenChange, modal, api.ids.content, api.ids.title, api.ids.description, hasTitle, hasDescription]
61
67
  );
62
68
  return React.createElement(DialogContext.Provider, { value: ctx }, children);
63
69
  }
@@ -102,9 +108,17 @@ var DialogOverlay = React.forwardRef(
102
108
  });
103
109
  }
104
110
  );
111
+ function containsElement(node, type) {
112
+ let found = false;
113
+ React.Children.forEach(node, (child) => {
114
+ if (found || !React.isValidElement(child)) return;
115
+ found = child.type === type || containsElement(child.props.children, type);
116
+ });
117
+ return found;
118
+ }
105
119
  var DialogContent = React.forwardRef(
106
120
  function DialogContent2({ className, children, onKeyDown, ...props }, ref) {
107
- const { open, onOpenChange, modal, contentId, titleId, descriptionId } = useDialogContext();
121
+ const { open, onOpenChange, modal, contentId, titleId, descriptionId, hasTitle, hasDescription } = useDialogContext();
108
122
  React.useMemo(
109
123
  () => createDialog({ open, modal }),
110
124
  [open, modal]
@@ -126,8 +140,10 @@ var DialogContent = React.forwardRef(
126
140
  ref,
127
141
  role: "dialog",
128
142
  "aria-modal": modal,
129
- "aria-labelledby": titleId,
130
- "aria-describedby": descriptionId,
143
+ // Reference only parts that exist: an id pointing at nothing leaves the
144
+ // dialog unnamed while looking labelled.
145
+ "aria-labelledby": hasTitle || containsElement(children, DialogTitle) ? titleId : void 0,
146
+ "aria-describedby": hasDescription || containsElement(children, DialogDescription) ? descriptionId : void 0,
131
147
  id: contentId,
132
148
  className: cn(dialogContentVariants(), className),
133
149
  onKeyDown: handleKeyDown,
@@ -165,7 +181,11 @@ var DialogFooter = React.forwardRef(
165
181
  );
166
182
  var DialogTitle = React.forwardRef(
167
183
  function DialogTitle2({ className, ...props }, ref) {
168
- const { titleId } = useDialogContext();
184
+ const { titleId, setHasTitle } = useDialogContext();
185
+ React.useEffect(() => {
186
+ setHasTitle(true);
187
+ return () => setHasTitle(false);
188
+ }, [setHasTitle]);
169
189
  return React.createElement("h2", {
170
190
  ref,
171
191
  id: titleId,
@@ -175,7 +195,11 @@ var DialogTitle = React.forwardRef(
175
195
  }
176
196
  );
177
197
  var DialogDescription = React.forwardRef(function DialogDescription2({ className, ...props }, ref) {
178
- const { descriptionId } = useDialogContext();
198
+ const { descriptionId, setHasDescription } = useDialogContext();
199
+ React.useEffect(() => {
200
+ setHasDescription(true);
201
+ return () => setHasDescription(false);
202
+ }, [setHasDescription]);
179
203
  return React.createElement("p", {
180
204
  ref,
181
205
  id: descriptionId,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../react-dialog/src/dialog.tsx"],
4
- "sourcesContent": ["import * as React from 'react'\nimport * as ReactDOM from 'react-dom'\nimport {\n createDialog,\n overlayStyles,\n dialogContentVariants,\n type DialogProps as CoreDialogProps,\n} from '@refraction-ui/dialog'\nimport { cn, createKeyboardHandler, devWarn } from '@refraction-ui/shared'\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\ninterface DialogContextValue {\n open: boolean\n onOpenChange: (open: boolean) => void\n modal: boolean\n contentId: string\n titleId: string\n descriptionId: string\n}\n\nconst DialogContext = React.createContext<DialogContextValue | null>(null)\n\nfunction useDialogContext(): DialogContextValue {\n const ctx = React.useContext(DialogContext)\n if (!ctx) {\n devWarn(\n 'react-dialog/context-outside-provider',\n 'Dialog compound components (DialogTrigger/DialogContent/DialogTitle/etc.) must be rendered inside a <Dialog>. The missing DialogContext makes this throw.',\n )\n throw new Error('Dialog compound components must be used within <Dialog>')\n }\n return ctx\n}\n\n// ---------------------------------------------------------------------------\n// Dialog (root provider)\n// ---------------------------------------------------------------------------\n\nexport interface DialogProps {\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n modal?: boolean\n children?: React.ReactNode\n}\n\nexport function Dialog({\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n modal = true,\n children,\n}: DialogProps) {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen)\n const isControlled = controlledOpen !== undefined\n const open = isControlled ? controlledOpen : uncontrolledOpen\n\n const handleOpenChange = React.useCallback(\n (next: boolean) => {\n if (!isControlled) {\n setUncontrolledOpen(next)\n }\n onOpenChange?.(next)\n },\n [isControlled, onOpenChange],\n )\n\n // Use the headless core to get stable IDs\n const apiRef = React.useRef<ReturnType<typeof createDialog> | null>(null)\n if (apiRef.current === null) {\n apiRef.current = createDialog({ open, modal })\n }\n const api = apiRef.current\n\n const ctx = React.useMemo<DialogContextValue>(\n () => ({\n open,\n onOpenChange: handleOpenChange,\n modal,\n contentId: api.ids.content,\n titleId: api.ids.title,\n descriptionId: api.ids.description,\n }),\n [open, handleOpenChange, modal, api.ids.content, api.ids.title, api.ids.description],\n )\n\n return React.createElement(DialogContext.Provider, { value: ctx }, children)\n}\n\n// ---------------------------------------------------------------------------\n// DialogTrigger\n// ---------------------------------------------------------------------------\n\nexport interface DialogTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n asChild?: boolean\n}\n\nexport const DialogTrigger = React.forwardRef<HTMLButtonElement, DialogTriggerProps>(\n function DialogTrigger({ onClick, children, ...props }, ref) {\n const { open, onOpenChange, contentId } = useDialogContext()\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n onOpenChange(!open)\n onClick?.(e)\n }\n\n return React.createElement(\n 'button',\n {\n ref,\n type: 'button',\n 'aria-expanded': open,\n 'aria-controls': contentId,\n 'aria-haspopup': 'dialog',\n onClick: handleClick,\n ...props,\n },\n children,\n )\n },\n)\n\n// ---------------------------------------------------------------------------\n// DialogOverlay\n// ---------------------------------------------------------------------------\n\nexport interface DialogOverlayProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const DialogOverlay = React.forwardRef<HTMLDivElement, DialogOverlayProps>(\n function DialogOverlay({ className, onClick, ...props }, ref) {\n const { open, onOpenChange } = useDialogContext()\n\n if (!open) return null\n\n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n // Only close if clicking the overlay itself, not children\n if (e.target === e.currentTarget) {\n onOpenChange(false)\n }\n onClick?.(e)\n }\n\n return React.createElement('div', {\n ref,\n className: cn(overlayStyles, className),\n 'data-state': open ? 'open' : 'closed',\n onClick: handleClick,\n ...props,\n })\n },\n)\n\n// ---------------------------------------------------------------------------\n// DialogContent\n// ---------------------------------------------------------------------------\n\nexport interface DialogContentProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const DialogContent = React.forwardRef<HTMLDivElement, DialogContentProps>(\n function DialogContent({ className, children, onKeyDown, ...props }, ref) {\n const { open, onOpenChange, modal, contentId, titleId, descriptionId } =\n useDialogContext()\n\n const api = React.useMemo(\n () => createDialog({ open, modal }),\n [open, modal],\n )\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n const handler = createKeyboardHandler({\n Escape: (ev) => {\n ev.preventDefault()\n onOpenChange(false)\n },\n })\n handler(e.nativeEvent)\n onKeyDown?.(e)\n }\n\n if (!open) return null\n\n const content = React.createElement(\n 'div',\n {\n ref,\n role: 'dialog',\n 'aria-modal': modal,\n 'aria-labelledby': titleId,\n 'aria-describedby': descriptionId,\n id: contentId,\n className: cn(dialogContentVariants(), className),\n onKeyDown: handleKeyDown,\n tabIndex: -1,\n ...props,\n },\n children,\n )\n\n // Render via portal if document is available (client-side)\n if (typeof document !== 'undefined') {\n return ReactDOM.createPortal(content, document.body)\n }\n\n // SSR fallback: render inline\n return content\n },\n)\n\n// ---------------------------------------------------------------------------\n// DialogHeader\n// ---------------------------------------------------------------------------\n\nexport interface DialogHeaderProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const DialogHeader = React.forwardRef<HTMLDivElement, DialogHeaderProps>(\n function DialogHeader({ className, ...props }, ref) {\n return React.createElement('div', {\n ref,\n className: cn('flex flex-col space-y-1.5 text-center sm:text-left', className),\n ...props,\n })\n },\n)\n\n// ---------------------------------------------------------------------------\n// DialogFooter\n// ---------------------------------------------------------------------------\n\nexport interface DialogFooterProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const DialogFooter = React.forwardRef<HTMLDivElement, DialogFooterProps>(\n function DialogFooter({ className, ...props }, ref) {\n return React.createElement('div', {\n ref,\n className: cn(\n 'flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2',\n className,\n ),\n ...props,\n })\n },\n)\n\n// ---------------------------------------------------------------------------\n// DialogTitle\n// ---------------------------------------------------------------------------\n\nexport interface DialogTitleProps extends React.HTMLAttributes<HTMLHeadingElement> {}\n\nexport const DialogTitle = React.forwardRef<HTMLHeadingElement, DialogTitleProps>(\n function DialogTitle({ className, ...props }, ref) {\n const { titleId } = useDialogContext()\n\n return React.createElement('h2', {\n ref,\n id: titleId,\n className: cn('text-lg font-semibold leading-none tracking-tight', className),\n ...props,\n })\n },\n)\n\n// ---------------------------------------------------------------------------\n// DialogDescription\n// ---------------------------------------------------------------------------\n\nexport interface DialogDescriptionProps extends React.HTMLAttributes<HTMLParagraphElement> {}\n\nexport const DialogDescription = React.forwardRef<\n HTMLParagraphElement,\n DialogDescriptionProps\n>(function DialogDescription({ className, ...props }, ref) {\n const { descriptionId } = useDialogContext()\n\n return React.createElement('p', {\n ref,\n id: descriptionId,\n className: cn('text-sm text-muted-foreground', className),\n ...props,\n })\n})\n\n// ---------------------------------------------------------------------------\n// DialogClose\n// ---------------------------------------------------------------------------\n\nexport interface DialogCloseProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {}\n\nexport const DialogClose = React.forwardRef<HTMLButtonElement, DialogCloseProps>(\n function DialogClose({ onClick, children, ...props }, ref) {\n const { onOpenChange } = useDialogContext()\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n onOpenChange(false)\n onClick?.(e)\n }\n\n return React.createElement(\n 'button',\n {\n ref,\n type: 'button',\n onClick: handleClick,\n ...props,\n },\n children,\n )\n },\n)\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import * as React from 'react'\nimport * as ReactDOM from 'react-dom'\nimport {\n createDialog,\n overlayStyles,\n dialogContentVariants,\n type DialogProps as CoreDialogProps,\n} from '@refraction-ui/dialog'\nimport { cn, createKeyboardHandler, devWarn } from '@refraction-ui/shared'\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\ninterface DialogContextValue {\n open: boolean\n onOpenChange: (open: boolean) => void\n modal: boolean\n contentId: string\n titleId: string\n descriptionId: string\n /** Whether a DialogTitle / DialogDescription is mounted — only then is it referenced. */\n hasTitle: boolean\n hasDescription: boolean\n setHasTitle: (present: boolean) => void\n setHasDescription: (present: boolean) => void\n}\n\nconst DialogContext = React.createContext<DialogContextValue | null>(null)\n\nfunction useDialogContext(): DialogContextValue {\n const ctx = React.useContext(DialogContext)\n if (!ctx) {\n devWarn(\n 'react-dialog/context-outside-provider',\n 'Dialog compound components (DialogTrigger/DialogContent/DialogTitle/etc.) must be rendered inside a <Dialog>. The missing DialogContext makes this throw.',\n )\n throw new Error('Dialog compound components must be used within <Dialog>')\n }\n return ctx\n}\n\n// ---------------------------------------------------------------------------\n// Dialog (root provider)\n// ---------------------------------------------------------------------------\n\nexport interface DialogProps {\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n modal?: boolean\n children?: React.ReactNode\n}\n\nexport function Dialog({\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n modal = true,\n children,\n}: DialogProps) {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen)\n const isControlled = controlledOpen !== undefined\n const open = isControlled ? controlledOpen : uncontrolledOpen\n\n const handleOpenChange = React.useCallback(\n (next: boolean) => {\n if (!isControlled) {\n setUncontrolledOpen(next)\n }\n onOpenChange?.(next)\n },\n [isControlled, onOpenChange],\n )\n\n // Use the headless core to get stable IDs\n const apiRef = React.useRef<ReturnType<typeof createDialog> | null>(null)\n if (apiRef.current === null) {\n apiRef.current = createDialog({ open, modal })\n }\n const api = apiRef.current\n const [hasTitle, setHasTitle] = React.useState(false)\n const [hasDescription, setHasDescription] = React.useState(false)\n\n const ctx = React.useMemo<DialogContextValue>(\n () => ({\n open,\n onOpenChange: handleOpenChange,\n modal,\n contentId: api.ids.content,\n titleId: api.ids.title,\n descriptionId: api.ids.description,\n hasTitle,\n hasDescription,\n setHasTitle,\n setHasDescription,\n }),\n [open, handleOpenChange, modal, api.ids.content, api.ids.title, api.ids.description, hasTitle, hasDescription],\n )\n\n return React.createElement(DialogContext.Provider, { value: ctx }, children)\n}\n\n// ---------------------------------------------------------------------------\n// DialogTrigger\n// ---------------------------------------------------------------------------\n\nexport interface DialogTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n asChild?: boolean\n}\n\nexport const DialogTrigger = React.forwardRef<HTMLButtonElement, DialogTriggerProps>(\n function DialogTrigger({ onClick, children, ...props }, ref) {\n const { open, onOpenChange, contentId } = useDialogContext()\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n onOpenChange(!open)\n onClick?.(e)\n }\n\n return React.createElement(\n 'button',\n {\n ref,\n type: 'button',\n 'aria-expanded': open,\n 'aria-controls': contentId,\n 'aria-haspopup': 'dialog',\n onClick: handleClick,\n ...props,\n },\n children,\n )\n },\n)\n\n// ---------------------------------------------------------------------------\n// DialogOverlay\n// ---------------------------------------------------------------------------\n\nexport interface DialogOverlayProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const DialogOverlay = React.forwardRef<HTMLDivElement, DialogOverlayProps>(\n function DialogOverlay({ className, onClick, ...props }, ref) {\n const { open, onOpenChange } = useDialogContext()\n\n if (!open) return null\n\n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n // Only close if clicking the overlay itself, not children\n if (e.target === e.currentTarget) {\n onOpenChange(false)\n }\n onClick?.(e)\n }\n\n return React.createElement('div', {\n ref,\n className: cn(overlayStyles, className),\n 'data-state': open ? 'open' : 'closed',\n onClick: handleClick,\n ...props,\n })\n },\n)\n\n// ---------------------------------------------------------------------------\n// DialogContent\n// ---------------------------------------------------------------------------\n\nexport interface DialogContentProps extends React.HTMLAttributes<HTMLDivElement> {}\n\n/**\n * Whether `type` appears in the element tree — covers the first and server\n * render, before a mounted DialogTitle/DialogDescription has registered.\n * Parts nested inside custom components are found once they mount.\n */\nfunction containsElement(node: React.ReactNode, type: React.ElementType): boolean {\n let found = false\n React.Children.forEach(node, (child) => {\n if (found || !React.isValidElement<{ children?: React.ReactNode }>(child)) return\n found = child.type === type || containsElement(child.props.children, type)\n })\n return found\n}\n\nexport const DialogContent = React.forwardRef<HTMLDivElement, DialogContentProps>(\n function DialogContent({ className, children, onKeyDown, ...props }, ref) {\n const { open, onOpenChange, modal, contentId, titleId, descriptionId, hasTitle, hasDescription } =\n useDialogContext()\n\n const api = React.useMemo(\n () => createDialog({ open, modal }),\n [open, modal],\n )\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n const handler = createKeyboardHandler({\n Escape: (ev) => {\n ev.preventDefault()\n onOpenChange(false)\n },\n })\n handler(e.nativeEvent)\n onKeyDown?.(e)\n }\n\n if (!open) return null\n\n const content = React.createElement(\n 'div',\n {\n ref,\n role: 'dialog',\n 'aria-modal': modal,\n // Reference only parts that exist: an id pointing at nothing leaves the\n // dialog unnamed while looking labelled.\n 'aria-labelledby': hasTitle || containsElement(children, DialogTitle) ? titleId : undefined,\n 'aria-describedby':\n hasDescription || containsElement(children, DialogDescription) ? descriptionId : undefined,\n id: contentId,\n className: cn(dialogContentVariants(), className),\n onKeyDown: handleKeyDown,\n tabIndex: -1,\n ...props,\n },\n children,\n )\n\n // Render via portal if document is available (client-side)\n if (typeof document !== 'undefined') {\n return ReactDOM.createPortal(content, document.body)\n }\n\n // SSR fallback: render inline\n return content\n },\n)\n\n// ---------------------------------------------------------------------------\n// DialogHeader\n// ---------------------------------------------------------------------------\n\nexport interface DialogHeaderProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const DialogHeader = React.forwardRef<HTMLDivElement, DialogHeaderProps>(\n function DialogHeader({ className, ...props }, ref) {\n return React.createElement('div', {\n ref,\n className: cn('flex flex-col space-y-1.5 text-center sm:text-left', className),\n ...props,\n })\n },\n)\n\n// ---------------------------------------------------------------------------\n// DialogFooter\n// ---------------------------------------------------------------------------\n\nexport interface DialogFooterProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const DialogFooter = React.forwardRef<HTMLDivElement, DialogFooterProps>(\n function DialogFooter({ className, ...props }, ref) {\n return React.createElement('div', {\n ref,\n className: cn(\n 'flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2',\n className,\n ),\n ...props,\n })\n },\n)\n\n// ---------------------------------------------------------------------------\n// DialogTitle\n// ---------------------------------------------------------------------------\n\nexport interface DialogTitleProps extends React.HTMLAttributes<HTMLHeadingElement> {}\n\nexport const DialogTitle = React.forwardRef<HTMLHeadingElement, DialogTitleProps>(\n function DialogTitle({ className, ...props }, ref) {\n const { titleId, setHasTitle } = useDialogContext()\n React.useEffect(() => {\n setHasTitle(true)\n return () => setHasTitle(false)\n }, [setHasTitle])\n\n return React.createElement('h2', {\n ref,\n id: titleId,\n className: cn('text-lg font-semibold leading-none tracking-tight', className),\n ...props,\n })\n },\n)\n\n// ---------------------------------------------------------------------------\n// DialogDescription\n// ---------------------------------------------------------------------------\n\nexport interface DialogDescriptionProps extends React.HTMLAttributes<HTMLParagraphElement> {}\n\nexport const DialogDescription = React.forwardRef<\n HTMLParagraphElement,\n DialogDescriptionProps\n>(function DialogDescription({ className, ...props }, ref) {\n const { descriptionId, setHasDescription } = useDialogContext()\n React.useEffect(() => {\n setHasDescription(true)\n return () => setHasDescription(false)\n }, [setHasDescription])\n\n return React.createElement('p', {\n ref,\n id: descriptionId,\n className: cn('text-sm text-muted-foreground', className),\n ...props,\n })\n})\n\n// ---------------------------------------------------------------------------\n// DialogClose\n// ---------------------------------------------------------------------------\n\nexport interface DialogCloseProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {}\n\nexport const DialogClose = React.forwardRef<HTMLButtonElement, DialogCloseProps>(\n function DialogClose({ onClick, children, ...props }, ref) {\n const { onOpenChange } = useDialogContext()\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n onOpenChange(false)\n onClick?.(e)\n }\n\n return React.createElement(\n 'button',\n {\n ref,\n type: 'button',\n onClick: handleClick,\n ...props,\n },\n children,\n )\n },\n)\n"],
5
+ "mappings": "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",
6
6
  "names": ["DialogTrigger", "DialogOverlay", "DialogContent", "DialogHeader", "DialogFooter", "DialogTitle", "DialogDescription", "DialogClose"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  cn,
3
3
  cva
4
- } from "./chunk-2Q6HHFAN.js";
4
+ } from "./chunk-75BKRTPO.js";
5
5
 
6
6
  // ../react-diff-viewer/dist/index.js
7
7
  import * as React from "react";
@@ -6,7 +6,7 @@ import {
6
6
  cva,
7
7
  devWarn,
8
8
  generateId
9
- } from "./chunk-2Q6HHFAN.js";
9
+ } from "./chunk-75BKRTPO.js";
10
10
 
11
11
  // ../react-dropdown-menu/dist/index.js
12
12
  import * as React from "react";
@@ -138,11 +138,13 @@ function DropdownMenu({
138
138
  apiRef.current = createDropdownMenu({ open });
139
139
  }
140
140
  const api = apiRef.current;
141
+ const triggerRef = React.useRef(null);
141
142
  const ctx = React.useMemo(
142
143
  () => ({
143
144
  open,
144
145
  onOpenChange: handleOpenChange,
145
- contentId: api.ids.content
146
+ contentId: api.ids.content,
147
+ triggerRef
146
148
  }),
147
149
  [open, handleOpenChange, api.ids.content]
148
150
  );
@@ -150,7 +152,12 @@ function DropdownMenu({
150
152
  }
151
153
  var DropdownMenuTrigger = React.forwardRef(
152
154
  function DropdownMenuTrigger2({ asChild = false, onClick, children, ...props }, ref) {
153
- const { open, onOpenChange, contentId } = useDropdownMenuContext();
155
+ const { open, onOpenChange, contentId, triggerRef } = useDropdownMenuContext();
156
+ const setRefs = (node) => {
157
+ triggerRef.current = node;
158
+ if (typeof ref === "function") ref(node);
159
+ else if (ref) ref.current = node;
160
+ };
154
161
  const handleClick = (e) => {
155
162
  onOpenChange(!open);
156
163
  onClick?.(e);
@@ -181,20 +188,63 @@ var DropdownMenuTrigger = React.forwardRef(
181
188
  if (!e.defaultPrevented) handleClick(e);
182
189
  },
183
190
  ref: (node) => {
184
- if (typeof ref === "function") ref(node);
185
- else if (ref) ref.current = node;
191
+ setRefs(node);
186
192
  if (typeof childRef === "function") childRef(node);
187
193
  else if (childRef) childRef.current = node;
188
194
  }
189
195
  };
190
196
  return React.cloneElement(child, mergedProps);
191
197
  }
192
- return React.createElement("button", { ref, ...triggerProps }, children);
198
+ return React.createElement("button", { ref: setRefs, ...triggerProps }, children);
193
199
  }
194
200
  );
201
+ var DEFAULT_SIDE_OFFSET = 4;
202
+ var useIsomorphicLayoutEffect = typeof window !== "undefined" ? React.useLayoutEffect : React.useEffect;
203
+ function computeMenuPosition(trigger, contentWidth, align, sideOffset) {
204
+ const left = align === "end" ? trigger.right - contentWidth : align === "center" ? trigger.left + trigger.width / 2 - contentWidth / 2 : trigger.left;
205
+ return { position: "fixed", top: trigger.bottom + sideOffset, left: Math.max(0, left), minWidth: trigger.width };
206
+ }
195
207
  var DropdownMenuContent = React.forwardRef(
196
- function DropdownMenuContent2({ className, children, onKeyDown, ...props }, ref) {
197
- const { open, onOpenChange, contentId } = useDropdownMenuContext();
208
+ function DropdownMenuContent2({ className, children, onKeyDown, align = "start", sideOffset = DEFAULT_SIDE_OFFSET, style, ...props }, forwardedRef) {
209
+ const { open, onOpenChange, contentId, triggerRef } = useDropdownMenuContext();
210
+ const contentRef = React.useRef(null);
211
+ const ref = React.useCallback(
212
+ (node) => {
213
+ contentRef.current = node;
214
+ if (typeof forwardedRef === "function") forwardedRef(node);
215
+ else if (forwardedRef) forwardedRef.current = node;
216
+ },
217
+ [forwardedRef]
218
+ );
219
+ const [position, setPosition] = React.useState(null);
220
+ useIsomorphicLayoutEffect(() => {
221
+ if (!open) return;
222
+ const update = () => {
223
+ const trigger = triggerRef.current;
224
+ const content2 = contentRef.current;
225
+ if (!trigger) return;
226
+ setPosition(
227
+ computeMenuPosition(trigger.getBoundingClientRect(), content2?.offsetWidth ?? 0, align, sideOffset)
228
+ );
229
+ };
230
+ update();
231
+ window.addEventListener("resize", update);
232
+ window.addEventListener("scroll", update, true);
233
+ return () => {
234
+ window.removeEventListener("resize", update);
235
+ window.removeEventListener("scroll", update, true);
236
+ };
237
+ }, [open, align, sideOffset, triggerRef]);
238
+ React.useEffect(() => {
239
+ if (!open) return;
240
+ const onPointerDown = (event) => {
241
+ const target = event.target;
242
+ if (contentRef.current?.contains(target) || triggerRef.current?.contains(target)) return;
243
+ onOpenChange(false);
244
+ };
245
+ document.addEventListener("pointerdown", onPointerDown);
246
+ return () => document.removeEventListener("pointerdown", onPointerDown);
247
+ }, [open, onOpenChange, triggerRef]);
198
248
  const handleKeyDown = (e) => {
199
249
  const handler = createKeyboardHandler({
200
250
  Escape: (ev) => {
@@ -214,6 +264,8 @@ var DropdownMenuContent = React.forwardRef(
214
264
  id: contentId,
215
265
  "data-state": open ? "open" : "closed",
216
266
  className: cn(menuContentVariants(), className),
267
+ style: position ? { ...position, ...style } : style,
268
+ "data-align": align,
217
269
  onKeyDown: handleKeyDown,
218
270
  tabIndex: -1,
219
271
  ...props
@@ -286,6 +338,7 @@ export {
286
338
  DropdownMenuLabel,
287
339
  DropdownMenuSeparator,
288
340
  DropdownMenuTrigger,
341
+ computeMenuPosition,
289
342
  menuContentVariants,
290
343
  menuItemVariants
291
344
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../dropdown-menu/src/dropdown-menu.ts", "../../dropdown-menu/src/dropdown-menu.styles.ts", "../../react-dropdown-menu/src/dropdown-menu.tsx"],
4
- "sourcesContent": ["import type { AccessibilityProps, KeyboardHandlerMap } from '@refraction-ui/shared'\nimport { createMachine, Keys, generateId } from '@refraction-ui/shared'\n\nexport interface DropdownMenuProps {\n /** Whether the menu is open (controlled) */\n open?: boolean\n /** Whether the menu starts open (uncontrolled) */\n defaultOpen?: boolean\n /** Callback when open state changes */\n onOpenChange?: (open: boolean) => void\n}\n\nexport interface MenuItemProps {\n /** Whether the item is disabled */\n disabled?: boolean\n /** Callback when the item is selected */\n onSelect?: () => void\n}\n\nexport interface DropdownMenuState {\n open: boolean\n}\n\nexport interface DropdownMenuAPI {\n /** Current menu state */\n state: DropdownMenuState\n /** ARIA attributes for the trigger button */\n triggerProps: Partial<AccessibilityProps> & Record<string, unknown>\n /** ARIA attributes for the menu content */\n contentProps: Partial<AccessibilityProps> & Record<string, unknown>\n /** Factory for menu item props */\n getItemProps(item: MenuItemProps): Partial<AccessibilityProps> & Record<string, unknown>\n /** Open the menu */\n open(): void\n /** Close the menu */\n close(): void\n /** Toggle the menu */\n toggle(): void\n /** Keyboard handlers for the menu */\n keyboardHandlers: KeyboardHandlerMap\n /** Generated IDs for aria linking */\n ids: {\n content: string\n }\n}\n\nexport function createDropdownMenu(props: DropdownMenuProps = {}): DropdownMenuAPI {\n const { open: controlledOpen, defaultOpen = false, onOpenChange } = props\n\n const machine = createMachine<'open' | 'closed', 'OPEN' | 'CLOSE'>({\n initial: controlledOpen ?? defaultOpen ? 'open' : 'closed',\n states: {\n closed: { on: { OPEN: 'open' } },\n open: { on: { CLOSE: 'closed' } },\n },\n })\n\n const contentId = generateId('rfr-dropdown-menu')\n\n function isOpen(): boolean {\n if (controlledOpen !== undefined) return controlledOpen\n return machine.matches('open')\n }\n\n function openMenu(): void {\n machine.send('OPEN')\n onOpenChange?.(true)\n }\n\n function closeMenu(): void {\n machine.send('CLOSE')\n onOpenChange?.(false)\n }\n\n function toggleMenu(): void {\n if (isOpen()) {\n closeMenu()\n } else {\n openMenu()\n }\n }\n\n function getItemProps(item: MenuItemProps): Partial<AccessibilityProps> & Record<string, unknown> {\n return {\n role: 'menuitem',\n tabIndex: item.disabled ? -1 : 0,\n 'data-disabled': item.disabled ? '' : undefined,\n 'aria-disabled': item.disabled || undefined,\n }\n }\n\n const keyboardHandlers: KeyboardHandlerMap = {\n [Keys.Escape]: (e: KeyboardEvent) => {\n e.preventDefault()\n closeMenu()\n },\n [Keys.ArrowDown]: (e: KeyboardEvent) => {\n e.preventDefault()\n },\n [Keys.ArrowUp]: (e: KeyboardEvent) => {\n e.preventDefault()\n },\n [Keys.Enter]: (e: KeyboardEvent) => {\n e.preventDefault()\n },\n [Keys.Home]: (e: KeyboardEvent) => {\n e.preventDefault()\n },\n [Keys.End]: (e: KeyboardEvent) => {\n e.preventDefault()\n },\n }\n\n const triggerProps: Partial<AccessibilityProps> & Record<string, unknown> = {\n 'aria-expanded': isOpen(),\n 'aria-controls': contentId,\n 'aria-haspopup': 'menu',\n }\n\n const contentProps: Partial<AccessibilityProps> & Record<string, unknown> = {\n role: 'menu',\n id: contentId,\n 'data-state': isOpen() ? 'open' : 'closed',\n }\n\n return {\n state: { open: isOpen() },\n triggerProps,\n contentProps,\n getItemProps,\n open: openMenu,\n close: closeMenu,\n toggle: toggleMenu,\n keyboardHandlers,\n ids: {\n content: contentId,\n },\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\nexport const menuContentVariants = cva({\n base: 'z-50 rounded-md border bg-popover shadow-md',\n})\n\nexport const menuItemVariants = cva({\n base: 'relative flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n})\n", "import * as React from 'react'\nimport * as ReactDOM from 'react-dom'\nimport {\n createDropdownMenu,\n menuContentVariants,\n menuItemVariants,\n type DropdownMenuProps as CoreDropdownMenuProps,\n type MenuItemProps as CoreMenuItemProps,\n} from '@refraction-ui/dropdown-menu'\nimport { cn, createKeyboardHandler, devWarn } from '@refraction-ui/shared'\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\ninterface DropdownMenuContextValue {\n open: boolean\n onOpenChange: (open: boolean) => void\n contentId: string\n}\n\nconst DropdownMenuContext = React.createContext<DropdownMenuContextValue | null>(null)\n\nfunction useDropdownMenuContext(): DropdownMenuContextValue {\n const ctx = React.useContext(DropdownMenuContext)\n if (!ctx) {\n devWarn(\n 'react-dropdown-menu/context-outside-provider',\n 'DropdownMenu compound components (DropdownMenuTrigger/DropdownMenuContent/DropdownMenuItem/etc.) must be rendered inside a <DropdownMenu>. The missing DropdownMenuContext makes this throw.',\n )\n throw new Error('DropdownMenu compound components must be used within <DropdownMenu>')\n }\n return ctx\n}\n\n// ---------------------------------------------------------------------------\n// DropdownMenu (root provider)\n// ---------------------------------------------------------------------------\n\nexport interface DropdownMenuProps {\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n children?: React.ReactNode\n}\n\nexport function DropdownMenu({\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n children,\n}: DropdownMenuProps) {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen)\n const isControlled = controlledOpen !== undefined\n const open = isControlled ? controlledOpen : uncontrolledOpen\n\n const handleOpenChange = React.useCallback(\n (next: boolean) => {\n if (!isControlled) {\n setUncontrolledOpen(next)\n }\n onOpenChange?.(next)\n },\n [isControlled, onOpenChange],\n )\n\n // Use the headless core to get stable IDs\n const apiRef = React.useRef<ReturnType<typeof createDropdownMenu> | null>(null)\n if (apiRef.current === null) {\n apiRef.current = createDropdownMenu({ open })\n }\n const api = apiRef.current\n\n const ctx = React.useMemo<DropdownMenuContextValue>(\n () => ({\n open,\n onOpenChange: handleOpenChange,\n contentId: api.ids.content,\n }),\n [open, handleOpenChange, api.ids.content],\n )\n\n return React.createElement(DropdownMenuContext.Provider, { value: ctx }, children)\n}\n\n// ---------------------------------------------------------------------------\n// DropdownMenuTrigger\n// ---------------------------------------------------------------------------\n\nexport interface DropdownMenuTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Merge the trigger's props/behavior onto the child element instead of\n * rendering a `<button>` around it (Radix-style `asChild`). Use it with\n * styled triggers like `<Button>` — otherwise you'd nest a button in a\n * button (invalid HTML and a hydration error). */\n asChild?: boolean\n}\n\nexport const DropdownMenuTrigger = React.forwardRef<HTMLButtonElement, DropdownMenuTriggerProps>(\n function DropdownMenuTrigger({ asChild = false, onClick, children, ...props }, ref) {\n const { open, onOpenChange, contentId } = useDropdownMenuContext()\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n onOpenChange(!open)\n onClick?.(e)\n }\n\n const triggerProps = {\n type: 'button' as const,\n 'aria-expanded': open,\n 'aria-controls': contentId,\n 'aria-haspopup': 'menu' as const,\n onClick: handleClick,\n ...props,\n }\n\n if (asChild) {\n if (!React.isValidElement(children)) {\n devWarn(\n 'dropdown-menu-trigger-asChild-child',\n 'DropdownMenuTrigger: `asChild` expects a single React element child; rendering nothing.',\n )\n return null\n }\n const child = children as React.ReactElement<\n Record<string, unknown>\n > & { ref?: React.Ref<HTMLButtonElement> }\n const childOnClick = child.props.onClick as\n | ((e: React.MouseEvent<HTMLButtonElement>) => void)\n | undefined\n const childRef = child.ref\n const mergedProps = {\n ...triggerProps,\n onClick: (e: React.MouseEvent<HTMLButtonElement>) => {\n childOnClick?.(e)\n if (!e.defaultPrevented) handleClick(e)\n },\n ref: (node: HTMLButtonElement | null) => {\n if (typeof ref === 'function') ref(node)\n else if (ref) ref.current = node\n if (typeof childRef === 'function') childRef(node)\n else if (childRef) childRef.current = node\n },\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return React.cloneElement(child, mergedProps as any)\n }\n\n return React.createElement('button', { ref, ...triggerProps }, children)\n },\n)\n\n// ---------------------------------------------------------------------------\n// DropdownMenuContent\n// ---------------------------------------------------------------------------\n\nexport interface DropdownMenuContentProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const DropdownMenuContent = React.forwardRef<HTMLDivElement, DropdownMenuContentProps>(\n function DropdownMenuContent({ className, children, onKeyDown, ...props }, ref) {\n const { open, onOpenChange, contentId } = useDropdownMenuContext()\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n const handler = createKeyboardHandler({\n Escape: (ev) => {\n ev.preventDefault()\n onOpenChange(false)\n },\n })\n handler(e.nativeEvent)\n onKeyDown?.(e)\n }\n\n if (!open) return null\n\n const content = React.createElement(\n 'div',\n {\n ref,\n role: 'menu',\n id: contentId,\n 'data-state': open ? 'open' : 'closed',\n className: cn(menuContentVariants(), className),\n onKeyDown: handleKeyDown,\n tabIndex: -1,\n ...props,\n },\n children,\n )\n\n // Render via portal if document is available (client-side)\n if (typeof document !== 'undefined') {\n return ReactDOM.createPortal(content, document.body)\n }\n\n // SSR fallback: render inline\n return content\n },\n)\n\n// ---------------------------------------------------------------------------\n// DropdownMenuItem\n// ---------------------------------------------------------------------------\n\nexport interface DropdownMenuItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {\n disabled?: boolean\n onSelect?: () => void\n}\n\nexport const DropdownMenuItem = React.forwardRef<HTMLDivElement, DropdownMenuItemProps>(\n function DropdownMenuItem({ className, disabled, onSelect, onClick, children, ...props }, ref) {\n const { onOpenChange } = useDropdownMenuContext()\n\n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return\n onSelect?.()\n onOpenChange(false)\n onClick?.(e)\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (disabled) return\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onSelect?.()\n onOpenChange(false)\n }\n }\n\n return React.createElement(\n 'div',\n {\n ref,\n role: 'menuitem',\n tabIndex: disabled ? -1 : 0,\n 'data-disabled': disabled ? '' : undefined,\n 'aria-disabled': disabled || undefined,\n className: cn(menuItemVariants(), className),\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n ...props,\n },\n children,\n )\n },\n)\n\n// ---------------------------------------------------------------------------\n// DropdownMenuSeparator\n// ---------------------------------------------------------------------------\n\nexport interface DropdownMenuSeparatorProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const DropdownMenuSeparator = React.forwardRef<HTMLDivElement, DropdownMenuSeparatorProps>(\n function DropdownMenuSeparator({ className, ...props }, ref) {\n return React.createElement('div', {\n ref,\n role: 'separator',\n className: cn('-mx-1 my-1 h-px bg-muted', className),\n ...props,\n })\n },\n)\n\n// ---------------------------------------------------------------------------\n// DropdownMenuLabel\n// ---------------------------------------------------------------------------\n\nexport interface DropdownMenuLabelProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const DropdownMenuLabel = React.forwardRef<HTMLDivElement, DropdownMenuLabelProps>(\n function DropdownMenuLabel({ className, ...props }, ref) {\n return React.createElement('div', {\n ref,\n className: cn('px-2 py-1.5 text-sm font-semibold', className),\n ...props,\n })\n },\n)\n"],
5
- "mappings": "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",
6
- "names": ["DropdownMenuTrigger", "DropdownMenuContent", "DropdownMenuItem", "DropdownMenuSeparator", "DropdownMenuLabel"]
4
+ "sourcesContent": ["import type { AccessibilityProps, KeyboardHandlerMap } from '@refraction-ui/shared'\nimport { createMachine, Keys, generateId } from '@refraction-ui/shared'\n\nexport interface DropdownMenuProps {\n /** Whether the menu is open (controlled) */\n open?: boolean\n /** Whether the menu starts open (uncontrolled) */\n defaultOpen?: boolean\n /** Callback when open state changes */\n onOpenChange?: (open: boolean) => void\n}\n\nexport interface MenuItemProps {\n /** Whether the item is disabled */\n disabled?: boolean\n /** Callback when the item is selected */\n onSelect?: () => void\n}\n\nexport interface DropdownMenuState {\n open: boolean\n}\n\nexport interface DropdownMenuAPI {\n /** Current menu state */\n state: DropdownMenuState\n /** ARIA attributes for the trigger button */\n triggerProps: Partial<AccessibilityProps> & Record<string, unknown>\n /** ARIA attributes for the menu content */\n contentProps: Partial<AccessibilityProps> & Record<string, unknown>\n /** Factory for menu item props */\n getItemProps(item: MenuItemProps): Partial<AccessibilityProps> & Record<string, unknown>\n /** Open the menu */\n open(): void\n /** Close the menu */\n close(): void\n /** Toggle the menu */\n toggle(): void\n /** Keyboard handlers for the menu */\n keyboardHandlers: KeyboardHandlerMap\n /** Generated IDs for aria linking */\n ids: {\n content: string\n }\n}\n\nexport function createDropdownMenu(props: DropdownMenuProps = {}): DropdownMenuAPI {\n const { open: controlledOpen, defaultOpen = false, onOpenChange } = props\n\n const machine = createMachine<'open' | 'closed', 'OPEN' | 'CLOSE'>({\n initial: controlledOpen ?? defaultOpen ? 'open' : 'closed',\n states: {\n closed: { on: { OPEN: 'open' } },\n open: { on: { CLOSE: 'closed' } },\n },\n })\n\n const contentId = generateId('rfr-dropdown-menu')\n\n function isOpen(): boolean {\n if (controlledOpen !== undefined) return controlledOpen\n return machine.matches('open')\n }\n\n function openMenu(): void {\n machine.send('OPEN')\n onOpenChange?.(true)\n }\n\n function closeMenu(): void {\n machine.send('CLOSE')\n onOpenChange?.(false)\n }\n\n function toggleMenu(): void {\n if (isOpen()) {\n closeMenu()\n } else {\n openMenu()\n }\n }\n\n function getItemProps(item: MenuItemProps): Partial<AccessibilityProps> & Record<string, unknown> {\n return {\n role: 'menuitem',\n tabIndex: item.disabled ? -1 : 0,\n 'data-disabled': item.disabled ? '' : undefined,\n 'aria-disabled': item.disabled || undefined,\n }\n }\n\n const keyboardHandlers: KeyboardHandlerMap = {\n [Keys.Escape]: (e: KeyboardEvent) => {\n e.preventDefault()\n closeMenu()\n },\n [Keys.ArrowDown]: (e: KeyboardEvent) => {\n e.preventDefault()\n },\n [Keys.ArrowUp]: (e: KeyboardEvent) => {\n e.preventDefault()\n },\n [Keys.Enter]: (e: KeyboardEvent) => {\n e.preventDefault()\n },\n [Keys.Home]: (e: KeyboardEvent) => {\n e.preventDefault()\n },\n [Keys.End]: (e: KeyboardEvent) => {\n e.preventDefault()\n },\n }\n\n const triggerProps: Partial<AccessibilityProps> & Record<string, unknown> = {\n 'aria-expanded': isOpen(),\n 'aria-controls': contentId,\n 'aria-haspopup': 'menu',\n }\n\n const contentProps: Partial<AccessibilityProps> & Record<string, unknown> = {\n role: 'menu',\n id: contentId,\n 'data-state': isOpen() ? 'open' : 'closed',\n }\n\n return {\n state: { open: isOpen() },\n triggerProps,\n contentProps,\n getItemProps,\n open: openMenu,\n close: closeMenu,\n toggle: toggleMenu,\n keyboardHandlers,\n ids: {\n content: contentId,\n },\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\nexport const menuContentVariants = cva({\n base: 'z-50 rounded-md border bg-popover shadow-md',\n})\n\nexport const menuItemVariants = cva({\n base: 'relative flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n})\n", "import * as React from 'react'\nimport * as ReactDOM from 'react-dom'\nimport {\n createDropdownMenu,\n menuContentVariants,\n menuItemVariants,\n type DropdownMenuProps as CoreDropdownMenuProps,\n type MenuItemProps as CoreMenuItemProps,\n} from '@refraction-ui/dropdown-menu'\nimport { cn, createKeyboardHandler, devWarn } from '@refraction-ui/shared'\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\ninterface DropdownMenuContextValue {\n open: boolean\n onOpenChange: (open: boolean) => void\n contentId: string\n /** The trigger element, so the portalled content can anchor to it. */\n triggerRef: React.MutableRefObject<HTMLElement | null>\n}\n\nconst DropdownMenuContext = React.createContext<DropdownMenuContextValue | null>(null)\n\nfunction useDropdownMenuContext(): DropdownMenuContextValue {\n const ctx = React.useContext(DropdownMenuContext)\n if (!ctx) {\n devWarn(\n 'react-dropdown-menu/context-outside-provider',\n 'DropdownMenu compound components (DropdownMenuTrigger/DropdownMenuContent/DropdownMenuItem/etc.) must be rendered inside a <DropdownMenu>. The missing DropdownMenuContext makes this throw.',\n )\n throw new Error('DropdownMenu compound components must be used within <DropdownMenu>')\n }\n return ctx\n}\n\n// ---------------------------------------------------------------------------\n// DropdownMenu (root provider)\n// ---------------------------------------------------------------------------\n\nexport interface DropdownMenuProps {\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n children?: React.ReactNode\n}\n\nexport function DropdownMenu({\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n children,\n}: DropdownMenuProps) {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen)\n const isControlled = controlledOpen !== undefined\n const open = isControlled ? controlledOpen : uncontrolledOpen\n\n const handleOpenChange = React.useCallback(\n (next: boolean) => {\n if (!isControlled) {\n setUncontrolledOpen(next)\n }\n onOpenChange?.(next)\n },\n [isControlled, onOpenChange],\n )\n\n // Use the headless core to get stable IDs\n const apiRef = React.useRef<ReturnType<typeof createDropdownMenu> | null>(null)\n if (apiRef.current === null) {\n apiRef.current = createDropdownMenu({ open })\n }\n const api = apiRef.current\n\n const triggerRef = React.useRef<HTMLElement | null>(null)\n\n const ctx = React.useMemo<DropdownMenuContextValue>(\n () => ({\n open,\n onOpenChange: handleOpenChange,\n contentId: api.ids.content,\n triggerRef,\n }),\n [open, handleOpenChange, api.ids.content],\n )\n\n return React.createElement(DropdownMenuContext.Provider, { value: ctx }, children)\n}\n\n// ---------------------------------------------------------------------------\n// DropdownMenuTrigger\n// ---------------------------------------------------------------------------\n\nexport interface DropdownMenuTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Merge the trigger's props/behavior onto the child element instead of\n * rendering a `<button>` around it (Radix-style `asChild`). Use it with\n * styled triggers like `<Button>` — otherwise you'd nest a button in a\n * button (invalid HTML and a hydration error). */\n asChild?: boolean\n}\n\nexport const DropdownMenuTrigger = React.forwardRef<HTMLButtonElement, DropdownMenuTriggerProps>(\n function DropdownMenuTrigger({ asChild = false, onClick, children, ...props }, ref) {\n const { open, onOpenChange, contentId, triggerRef } = useDropdownMenuContext()\n const setRefs = (node: HTMLButtonElement | null) => {\n triggerRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) ref.current = node\n }\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n onOpenChange(!open)\n onClick?.(e)\n }\n\n const triggerProps = {\n type: 'button' as const,\n 'aria-expanded': open,\n 'aria-controls': contentId,\n 'aria-haspopup': 'menu' as const,\n onClick: handleClick,\n ...props,\n }\n\n if (asChild) {\n if (!React.isValidElement(children)) {\n devWarn(\n 'dropdown-menu-trigger-asChild-child',\n 'DropdownMenuTrigger: `asChild` expects a single React element child; rendering nothing.',\n )\n return null\n }\n const child = children as React.ReactElement<\n Record<string, unknown>\n > & { ref?: React.Ref<HTMLButtonElement> }\n const childOnClick = child.props.onClick as\n | ((e: React.MouseEvent<HTMLButtonElement>) => void)\n | undefined\n const childRef = child.ref\n const mergedProps = {\n ...triggerProps,\n onClick: (e: React.MouseEvent<HTMLButtonElement>) => {\n childOnClick?.(e)\n if (!e.defaultPrevented) handleClick(e)\n },\n ref: (node: HTMLButtonElement | null) => {\n setRefs(node)\n if (typeof childRef === 'function') childRef(node)\n else if (childRef) childRef.current = node\n },\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return React.cloneElement(child, mergedProps as any)\n }\n\n return React.createElement('button', { ref: setRefs, ...triggerProps }, children)\n },\n)\n\n// ---------------------------------------------------------------------------\n// Positioning\n// ---------------------------------------------------------------------------\n\nexport type DropdownMenuAlign = 'start' | 'center' | 'end'\n\nconst DEFAULT_SIDE_OFFSET = 4\n\nconst useIsomorphicLayoutEffect = typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect\n\n/**\n * Fixed-position coordinates that place a menu under its trigger, aligned to\n * the trigger's start, centre or end edge. Pure, so it is unit-testable.\n */\nexport function computeMenuPosition(\n trigger: { top: number; bottom: number; left: number; right: number; width: number },\n contentWidth: number,\n align: DropdownMenuAlign,\n sideOffset: number,\n): React.CSSProperties {\n const left =\n align === 'end'\n ? trigger.right - contentWidth\n : align === 'center'\n ? trigger.left + trigger.width / 2 - contentWidth / 2\n : trigger.left\n return { position: 'fixed', top: trigger.bottom + sideOffset, left: Math.max(0, left), minWidth: trigger.width }\n}\n\n// ---------------------------------------------------------------------------\n// DropdownMenuContent\n// ---------------------------------------------------------------------------\n\nexport interface DropdownMenuContentProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Horizontal alignment to the trigger. Defaults to `start`. */\n align?: DropdownMenuAlign\n /** Gap between trigger and menu in px. Defaults to 4. */\n sideOffset?: number\n}\n\nexport const DropdownMenuContent = React.forwardRef<HTMLDivElement, DropdownMenuContentProps>(\n function DropdownMenuContent(\n { className, children, onKeyDown, align = 'start', sideOffset = DEFAULT_SIDE_OFFSET, style, ...props },\n forwardedRef,\n ) {\n const { open, onOpenChange, contentId, triggerRef } = useDropdownMenuContext()\n const contentRef = React.useRef<HTMLDivElement | null>(null)\n const ref = React.useCallback(\n (node: HTMLDivElement | null) => {\n contentRef.current = node\n if (typeof forwardedRef === 'function') forwardedRef(node)\n else if (forwardedRef) forwardedRef.current = node\n },\n [forwardedRef],\n )\n const [position, setPosition] = React.useState<React.CSSProperties | null>(null)\n\n // The content is portalled to <body>, so anchor it to the trigger with\n // fixed coordinates, and follow the trigger on scroll / resize.\n useIsomorphicLayoutEffect(() => {\n if (!open) return\n const update = () => {\n const trigger = triggerRef.current\n const content = contentRef.current\n if (!trigger) return\n setPosition(\n computeMenuPosition(trigger.getBoundingClientRect(), content?.offsetWidth ?? 0, align, sideOffset),\n )\n }\n update()\n window.addEventListener('resize', update)\n window.addEventListener('scroll', update, true)\n return () => {\n window.removeEventListener('resize', update)\n window.removeEventListener('scroll', update, true)\n }\n }, [open, align, sideOffset, triggerRef])\n\n // Close on a pointer press outside the menu and its trigger.\n React.useEffect(() => {\n if (!open) return\n const onPointerDown = (event: PointerEvent) => {\n const target = event.target as Node\n if (contentRef.current?.contains(target) || triggerRef.current?.contains(target)) return\n onOpenChange(false)\n }\n document.addEventListener('pointerdown', onPointerDown)\n return () => document.removeEventListener('pointerdown', onPointerDown)\n }, [open, onOpenChange, triggerRef])\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n const handler = createKeyboardHandler({\n Escape: (ev) => {\n ev.preventDefault()\n onOpenChange(false)\n },\n })\n handler(e.nativeEvent)\n onKeyDown?.(e)\n }\n\n if (!open) return null\n\n const content = React.createElement(\n 'div',\n {\n ref,\n role: 'menu',\n id: contentId,\n 'data-state': open ? 'open' : 'closed',\n className: cn(menuContentVariants(), className),\n style: position ? { ...position, ...style } : style,\n 'data-align': align,\n onKeyDown: handleKeyDown,\n tabIndex: -1,\n ...props,\n },\n children,\n )\n\n // Render via portal if document is available (client-side)\n if (typeof document !== 'undefined') {\n return ReactDOM.createPortal(content, document.body)\n }\n\n // SSR fallback: render inline\n return content\n },\n)\n\n// ---------------------------------------------------------------------------\n// DropdownMenuItem\n// ---------------------------------------------------------------------------\n\nexport interface DropdownMenuItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {\n disabled?: boolean\n onSelect?: () => void\n}\n\nexport const DropdownMenuItem = React.forwardRef<HTMLDivElement, DropdownMenuItemProps>(\n function DropdownMenuItem({ className, disabled, onSelect, onClick, children, ...props }, ref) {\n const { onOpenChange } = useDropdownMenuContext()\n\n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return\n onSelect?.()\n onOpenChange(false)\n onClick?.(e)\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (disabled) return\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onSelect?.()\n onOpenChange(false)\n }\n }\n\n return React.createElement(\n 'div',\n {\n ref,\n role: 'menuitem',\n tabIndex: disabled ? -1 : 0,\n 'data-disabled': disabled ? '' : undefined,\n 'aria-disabled': disabled || undefined,\n className: cn(menuItemVariants(), className),\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n ...props,\n },\n children,\n )\n },\n)\n\n// ---------------------------------------------------------------------------\n// DropdownMenuSeparator\n// ---------------------------------------------------------------------------\n\nexport interface DropdownMenuSeparatorProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const DropdownMenuSeparator = React.forwardRef<HTMLDivElement, DropdownMenuSeparatorProps>(\n function DropdownMenuSeparator({ className, ...props }, ref) {\n return React.createElement('div', {\n ref,\n role: 'separator',\n className: cn('-mx-1 my-1 h-px bg-muted', className),\n ...props,\n })\n },\n)\n\n// ---------------------------------------------------------------------------\n// DropdownMenuLabel\n// ---------------------------------------------------------------------------\n\nexport interface DropdownMenuLabelProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const DropdownMenuLabel = React.forwardRef<HTMLDivElement, DropdownMenuLabelProps>(\n function DropdownMenuLabel({ className, ...props }, ref) {\n return React.createElement('div', {\n ref,\n className: cn('px-2 py-1.5 text-sm font-semibold', className),\n ...props,\n })\n },\n)\n"],
5
+ "mappings": "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",
6
+ "names": ["DropdownMenuTrigger", "DropdownMenuContent", "content", "DropdownMenuItem", "DropdownMenuSeparator", "DropdownMenuLabel"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  cn,
3
3
  cva
4
- } from "./chunk-2Q6HHFAN.js";
4
+ } from "./chunk-75BKRTPO.js";
5
5
 
6
6
  // ../react-editor-status-bar/dist/index.js
7
7
  import * as React from "react";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  cn,
3
3
  cva
4
- } from "./chunk-2Q6HHFAN.js";
4
+ } from "./chunk-75BKRTPO.js";
5
5
 
6
6
  // ../react-editor-tabs/dist/index.js
7
7
  import * as React from "react";
@@ -22,10 +22,10 @@ import {
22
22
  searchEmojis,
23
23
  twemojiAssetUrl,
24
24
  twemojiFilename
25
- } from "./chunk-3I3DYDHR.js";
25
+ } from "./chunk-WNLYPQOS.js";
26
26
  import {
27
27
  cn
28
- } from "./chunk-2Q6HHFAN.js";
28
+ } from "./chunk-75BKRTPO.js";
29
29
 
30
30
  // ../react-emoji-picker/dist/index.js
31
31
  import * as React from "react";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  cn,
3
3
  cva
4
- } from "./chunk-2Q6HHFAN.js";
4
+ } from "./chunk-75BKRTPO.js";
5
5
 
6
6
  // ../react-empty-state/dist/index.js
7
7
  import * as React from "react";
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  createDialog
3
- } from "./chunk-V24GDHUX.js";
3
+ } from "./chunk-4ACSHPCM.js";
4
4
  import {
5
5
  cn,
6
6
  cva,
7
7
  generateId
8
- } from "./chunk-2Q6HHFAN.js";
8
+ } from "./chunk-75BKRTPO.js";
9
9
 
10
10
  // ../react-feedback-dialog/dist/index.js
11
11
  import * as React from "react";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  cn,
3
3
  cva
4
- } from "./chunk-2Q6HHFAN.js";
4
+ } from "./chunk-75BKRTPO.js";
5
5
 
6
6
  // ../react-file-tree/dist/index.js
7
7
  import * as React from "react";
@@ -2,7 +2,7 @@ import {
2
2
  cn,
3
3
  cva,
4
4
  generateId
5
- } from "./chunk-2Q6HHFAN.js";
5
+ } from "./chunk-75BKRTPO.js";
6
6
 
7
7
  // ../react-file-upload/dist/index.js
8
8
  import * as React from "react";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  cn,
3
3
  cva
4
- } from "./chunk-2Q6HHFAN.js";
4
+ } from "./chunk-75BKRTPO.js";
5
5
 
6
6
  // ../react-floating-reactions/dist/index.js
7
7
  import * as React from "react";
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  InfiniteCanvas
3
- } from "./chunk-WYKPPK3W.js";
3
+ } from "./chunk-XAJDSVZR.js";
4
4
  import {
5
5
  cn,
6
6
  cva
7
- } from "./chunk-2Q6HHFAN.js";
7
+ } from "./chunk-75BKRTPO.js";
8
8
 
9
9
  // ../react-flow-editor/dist/index.js
10
10
  import * as React from "react";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  cn,
3
3
  cva
4
- } from "./chunk-2Q6HHFAN.js";
4
+ } from "./chunk-75BKRTPO.js";
5
5
 
6
6
  // ../react-footer/dist/index.js
7
7
  import * as React from "react";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  cn
3
- } from "./chunk-2Q6HHFAN.js";
3
+ } from "./chunk-75BKRTPO.js";
4
4
 
5
5
  // ../react-funnel-chart/dist/index.js
6
6
  import * as React from "react";
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  InfiniteCanvas
3
- } from "./chunk-WYKPPK3W.js";
3
+ } from "./chunk-XAJDSVZR.js";
4
4
  import {
5
5
  cn,
6
6
  cva
7
- } from "./chunk-2Q6HHFAN.js";
7
+ } from "./chunk-75BKRTPO.js";
8
8
 
9
9
  // ../react-graph-view/dist/index.js
10
10
  import * as React from "react";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  InfiniteCanvas
3
- } from "./chunk-WYKPPK3W.js";
4
- import "./chunk-2Q6HHFAN.js";
3
+ } from "./chunk-XAJDSVZR.js";
4
+ import "./chunk-75BKRTPO.js";
5
5
  export {
6
6
  InfiniteCanvas
7
7
  };
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  cn,
3
3
  cva
4
- } from "./chunk-2Q6HHFAN.js";
4
+ } from "./chunk-75BKRTPO.js";
5
5
 
6
6
  // ../react-inline-editor/dist/index.js
7
7
  import * as React from "react";
@@ -2,7 +2,7 @@ import {
2
2
  cn,
3
3
  cva,
4
4
  generateId
5
- } from "./chunk-2Q6HHFAN.js";
5
+ } from "./chunk-75BKRTPO.js";
6
6
 
7
7
  // ../react-input-group/dist/index.js
8
8
  import * as React from "react";
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  Input,
3
3
  inputVariants
4
- } from "./chunk-RSWOLRIC.js";
5
- import "./chunk-2Q6HHFAN.js";
4
+ } from "./chunk-KIZD73DK.js";
5
+ import "./chunk-75BKRTPO.js";
6
6
  export {
7
7
  Input,
8
8
  inputVariants
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  cn,
3
3
  cva
4
- } from "./chunk-2Q6HHFAN.js";
4
+ } from "./chunk-75BKRTPO.js";
5
5
 
6
6
  // ../react-install-prompt/dist/index.js
7
7
  import * as React from "react";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  cn,
3
3
  cva
4
- } from "./chunk-2Q6HHFAN.js";
4
+ } from "./chunk-75BKRTPO.js";
5
5
 
6
6
  // ../react-kanban-board/dist/index.js
7
7
  import * as React from "react";
@@ -14,8 +14,8 @@ import {
14
14
  shortcutKeyStyles,
15
15
  shortcutSeparatorStyles,
16
16
  useShortcut
17
- } from "./chunk-QDMLIDYN.js";
18
- import "./chunk-2Q6HHFAN.js";
17
+ } from "./chunk-GU5MI7FX.js";
18
+ import "./chunk-75BKRTPO.js";
19
19
  export {
20
20
  AltHintState,
21
21
  KeyboardShortcut,