torch-glare 2.3.0 → 2.4.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 (264) hide show
  1. package/README.md +8 -0
  2. package/apps/lib/components/ActionButton.tsx +7 -12
  3. package/apps/lib/components/ActionsGroup.tsx +4 -15
  4. package/apps/lib/components/AlertDialog.tsx +173 -191
  5. package/apps/lib/components/Avatar.tsx +13 -16
  6. package/apps/lib/components/Badge.tsx +7 -3
  7. package/apps/lib/components/BadgeField.tsx +76 -71
  8. package/apps/lib/components/Breadcrumb.tsx +49 -85
  9. package/apps/lib/components/Button.tsx +20 -19
  10. package/apps/lib/components/ButtonGroup.tsx +31 -41
  11. package/apps/lib/components/Calendar.tsx +51 -29
  12. package/apps/lib/components/Card.tsx +2 -13
  13. package/apps/lib/components/ChartBlockTool.ts +17 -52
  14. package/apps/lib/components/Checkbox.tsx +9 -16
  15. package/apps/lib/components/ContextMenu.tsx +110 -106
  16. package/apps/lib/components/CountBadge.tsx +4 -6
  17. package/apps/lib/components/DataTable.tsx +196 -216
  18. package/apps/lib/components/DataViews/DataViewRadio.tsx +10 -8
  19. package/apps/lib/components/DataViews/DataViewsConfigPanel.tsx +21 -55
  20. package/apps/lib/components/DataViews/DataViewsHeader.tsx +1 -3
  21. package/apps/lib/components/DataViews/DataViewsLayout.tsx +5 -12
  22. package/apps/lib/components/DataViews/FilterPanel.tsx +173 -150
  23. package/apps/lib/components/DataViews/HeaderSearch.tsx +1 -5
  24. package/apps/lib/components/DataViews/InboxView.tsx +22 -68
  25. package/apps/lib/components/DataViews/InboxViewCard.tsx +68 -77
  26. package/apps/lib/components/DataViews/KanbanView.tsx +8 -25
  27. package/apps/lib/components/DataViews/PanelControls.tsx +3 -13
  28. package/apps/lib/components/DataViews/SettingsPanel.tsx +83 -89
  29. package/apps/lib/components/DataViews/TableView.tsx +8 -28
  30. package/apps/lib/components/DataViews/TreeView.tsx +12 -40
  31. package/apps/lib/components/DataViews/badgeAdapter.ts +32 -28
  32. package/apps/lib/components/DataViews/fieldRenderers.tsx +106 -141
  33. package/apps/lib/components/DataViews/filters/DatePickerRangeFilter.tsx +87 -0
  34. package/apps/lib/components/DataViews/filters/DateRangePopover.tsx +39 -32
  35. package/apps/lib/components/DataViews/filters/PresetChips.tsx +15 -15
  36. package/apps/lib/components/DataViews/filters/RangeSliderWithInputs.tsx +69 -58
  37. package/apps/lib/components/DataViews/index.ts +26 -26
  38. package/apps/lib/components/DataViews/tree/TreeDrawer.tsx +12 -16
  39. package/apps/lib/components/DataViews/tree/TreeSidebar.tsx +28 -31
  40. package/apps/lib/components/DataViews/types.ts +111 -114
  41. package/apps/lib/components/DatePicker.tsx +198 -191
  42. package/apps/lib/components/Dialog.tsx +92 -105
  43. package/apps/lib/components/Divider.tsx +21 -24
  44. package/apps/lib/components/Drawer.tsx +79 -139
  45. package/apps/lib/components/DropdownMenu.tsx +144 -181
  46. package/apps/lib/components/FieldHint.tsx +4 -11
  47. package/apps/lib/components/Form.tsx +146 -155
  48. package/apps/lib/components/FormStepper.tsx +9 -39
  49. package/apps/lib/components/HeaderBar.tsx +119 -0
  50. package/apps/lib/components/ImageAttachment.tsx +111 -73
  51. package/apps/lib/components/InnerLabelField.tsx +20 -16
  52. package/apps/lib/components/Input.tsx +171 -172
  53. package/apps/lib/components/InputField.tsx +44 -45
  54. package/apps/lib/components/InputOTP.tsx +68 -69
  55. package/apps/lib/components/Label.tsx +31 -35
  56. package/apps/lib/components/LabelField.tsx +4 -5
  57. package/apps/lib/components/LabeledCheckBox.tsx +8 -12
  58. package/apps/lib/components/LabeledRadio.tsx +7 -5
  59. package/apps/lib/components/LinkButton.tsx +2 -9
  60. package/apps/lib/components/LoginButton.tsx +4 -9
  61. package/apps/lib/components/PasswordLevel.tsx +5 -5
  62. package/apps/lib/components/Popover.tsx +15 -33
  63. package/apps/lib/components/ProfileMenu.tsx +67 -72
  64. package/apps/lib/components/Radio.tsx +1 -5
  65. package/apps/lib/components/RadioCard.tsx +9 -28
  66. package/apps/lib/components/ScrollArea.tsx +45 -43
  67. package/apps/lib/components/SearchField.tsx +49 -39
  68. package/apps/lib/components/SearchableSelect.tsx +46 -52
  69. package/apps/lib/components/SearchableTable.tsx +199 -219
  70. package/apps/lib/components/SearchableTree.tsx +469 -0
  71. package/apps/lib/components/SearchableTreeDialog.tsx +493 -0
  72. package/apps/lib/components/SectionBlock.tsx +4 -16
  73. package/apps/lib/components/Select.tsx +53 -80
  74. package/apps/lib/components/SimpleSelect.tsx +196 -187
  75. package/apps/lib/components/Skeleton.tsx +9 -12
  76. package/apps/lib/components/SlideDatePicker.tsx +215 -166
  77. package/apps/lib/components/SpinLoading.tsx +33 -49
  78. package/apps/lib/components/Stepper.tsx +13 -56
  79. package/apps/lib/components/Switch.tsx +8 -10
  80. package/apps/lib/components/TabFormItem.tsx +3 -12
  81. package/apps/lib/components/TabSwitch.tsx +7 -34
  82. package/apps/lib/components/Table.tsx +60 -75
  83. package/apps/lib/components/TableDnDWrapper.ts +15 -48
  84. package/apps/lib/components/TextEditor.tsx +93 -104
  85. package/apps/lib/components/Textarea.tsx +8 -12
  86. package/apps/lib/components/Timeline.tsx +21 -41
  87. package/apps/lib/components/Toast.tsx +83 -83
  88. package/apps/lib/components/Toggle.tsx +112 -114
  89. package/apps/lib/components/ToggleButton.tsx +1 -1
  90. package/apps/lib/components/Tooltip.tsx +24 -19
  91. package/apps/lib/components/TransparentLabel.tsx +61 -62
  92. package/apps/lib/components/TreeDropDown.tsx +86 -52
  93. package/apps/lib/components/TreeFolder/TreeFolder.tsx +15 -48
  94. package/apps/lib/components/TreeFolder/TreeFolderBreadcrumb.tsx +16 -21
  95. package/apps/lib/components/TreeFolder/TreeFolderRow.tsx +9 -20
  96. package/apps/lib/components/TreeFolder/TreeFolderStyles.tsx +3 -3
  97. package/apps/lib/components/TreeFolder/icons.tsx +14 -17
  98. package/apps/lib/components/TreeFolder/index.ts +15 -8
  99. package/apps/lib/components/TreeFolder/treeFolderUtils.ts +47 -52
  100. package/apps/lib/components/TreeFolder/types.ts +32 -32
  101. package/apps/lib/components/TreeFolder/useTreeFolderDnD.ts +117 -123
  102. package/apps/lib/hooks/useActiveTreeItem.ts +52 -55
  103. package/apps/lib/hooks/useClickOutside.ts +21 -20
  104. package/apps/lib/hooks/useDataViewsState.ts +86 -80
  105. package/apps/lib/hooks/useIsMobile.ts +12 -12
  106. package/apps/lib/hooks/useResize.ts +54 -65
  107. package/apps/lib/hooks/useTagSelection.ts +201 -201
  108. package/apps/lib/layouts/CNLayout.tsx +181 -140
  109. package/apps/lib/layouts/DataViewCard.tsx +4 -18
  110. package/apps/lib/layouts/FieldSection.tsx +2 -6
  111. package/apps/lib/layouts/TreeSubLayout.tsx +24 -38
  112. package/apps/lib/providers/ThemeProvider.tsx +8 -23
  113. package/apps/lib/registry.json +1004 -0
  114. package/apps/lib/tsconfig.json +9 -0
  115. package/apps/lib/utils/cn.ts +1 -1
  116. package/apps/lib/utils/dataViews/columnUtils.ts +46 -44
  117. package/apps/lib/utils/dataViews/fieldUtils.ts +70 -71
  118. package/apps/lib/utils/dataViews/nestedDataUtils.tsx +129 -122
  119. package/apps/lib/utils/dataViews/pathUtils.ts +74 -67
  120. package/apps/lib/utils/dataViews/rangeUtils.ts +121 -112
  121. package/apps/lib/utils/dataViews/treeUtils.ts +204 -211
  122. package/apps/lib/utils/dateFormat.ts +64 -54
  123. package/apps/lib/utils/markdownParser.ts +2 -7
  124. package/apps/lib/utils/resize.ts +21 -25
  125. package/apps/lib/utils/types.ts +13 -13
  126. package/dist/bin/index.js +8 -2
  127. package/dist/bin/index.js.map +1 -1
  128. package/dist/src/shared/getAvailableFiles.d.ts.map +1 -1
  129. package/dist/src/shared/getAvailableFiles.js +6 -1
  130. package/dist/src/shared/getAvailableFiles.js.map +1 -1
  131. package/dist/src/shared/loadRegistry.d.ts +7 -0
  132. package/dist/src/shared/loadRegistry.d.ts.map +1 -0
  133. package/dist/src/shared/loadRegistry.js +31 -0
  134. package/dist/src/shared/loadRegistry.js.map +1 -0
  135. package/dist/src/shared/resolveInstallPlan.d.ts +12 -0
  136. package/dist/src/shared/resolveInstallPlan.d.ts.map +1 -0
  137. package/dist/src/shared/resolveInstallPlan.js +39 -0
  138. package/dist/src/shared/resolveInstallPlan.js.map +1 -0
  139. package/dist/src/types/main.d.ts +24 -0
  140. package/dist/src/types/main.d.ts.map +1 -1
  141. package/docs/README.md +10 -2
  142. package/docs/components/action-button.md +30 -24
  143. package/docs/components/actions-group.md +26 -20
  144. package/docs/components/alert-dialog.md +45 -45
  145. package/docs/components/avatar.md +6 -2
  146. package/docs/components/badge-field.md +6 -2
  147. package/docs/components/badge.md +7 -1
  148. package/docs/components/breadcrumb.md +15 -40
  149. package/docs/components/button-group.md +13 -10
  150. package/docs/components/button.md +58 -33
  151. package/docs/components/calendar.md +26 -19
  152. package/docs/components/card.md +19 -16
  153. package/docs/components/chart-block-tool.md +128 -0
  154. package/docs/components/checkbox.md +16 -8
  155. package/docs/components/cn-layout.md +7 -1
  156. package/docs/components/context-menu.md +47 -24
  157. package/docs/components/count-badge.md +7 -1
  158. package/docs/components/data-table.md +45 -33
  159. package/docs/components/data-views-config-panel.md +18 -14
  160. package/docs/components/data-views-layout.md +20 -17
  161. package/docs/components/date-picker.md +30 -23
  162. package/docs/components/dialog.md +43 -42
  163. package/docs/components/divider.md +10 -4
  164. package/docs/components/drawer.md +8 -33
  165. package/docs/components/dropdown-menu.md +51 -32
  166. package/docs/components/field-hint.md +37 -25
  167. package/docs/components/field-section.md +9 -3
  168. package/docs/components/form-stepper.md +6 -0
  169. package/docs/components/form.md +17 -20
  170. package/docs/components/header-bar.md +187 -0
  171. package/docs/components/image-attachment.md +33 -41
  172. package/docs/components/inbox-view.md +16 -5
  173. package/docs/components/inner-label-field.md +34 -24
  174. package/docs/components/input-field.md +18 -10
  175. package/docs/components/input-otp.md +14 -11
  176. package/docs/components/input.md +22 -16
  177. package/docs/components/kanban-view.md +15 -5
  178. package/docs/components/label-field.md +32 -22
  179. package/docs/components/label.md +43 -32
  180. package/docs/components/labeled-check-box.md +16 -8
  181. package/docs/components/labeled-radio.md +18 -11
  182. package/docs/components/link-button.md +7 -1
  183. package/docs/components/login-button.md +8 -2
  184. package/docs/components/password-level.md +37 -24
  185. package/docs/components/popover.md +26 -23
  186. package/docs/components/profile-menu.md +38 -27
  187. package/docs/components/radio-card.md +16 -9
  188. package/docs/components/radio.md +16 -8
  189. package/docs/components/scroll-area.md +6 -2
  190. package/docs/components/search-field.md +14 -6
  191. package/docs/components/searchable-select.md +19 -14
  192. package/docs/components/searchable-table.md +60 -41
  193. package/docs/components/searchable-tree-dialog.md +190 -0
  194. package/docs/components/searchable-tree.md +200 -0
  195. package/docs/components/section-block.md +130 -4
  196. package/docs/components/select.md +23 -18
  197. package/docs/components/simple-select.md +14 -10
  198. package/docs/components/skeleton.md +43 -33
  199. package/docs/components/slide-date-picker.md +37 -29
  200. package/docs/components/spin-loading.md +32 -23
  201. package/docs/components/stepper.md +6 -0
  202. package/docs/components/switch.md +14 -6
  203. package/docs/components/tab-form-item.md +7 -1
  204. package/docs/components/tab-switch.md +13 -6
  205. package/docs/components/table-dnd-wrapper.md +105 -0
  206. package/docs/components/table-view.md +15 -5
  207. package/docs/components/table.md +28 -28
  208. package/docs/components/text-editor.md +19 -13
  209. package/docs/components/textarea.md +15 -7
  210. package/docs/components/timeline.md +6 -0
  211. package/docs/components/toast.md +35 -26
  212. package/docs/components/toggle-button.md +24 -21
  213. package/docs/components/toggle.md +23 -15
  214. package/docs/components/tooltip.md +42 -30
  215. package/docs/components/transparent-label.md +29 -20
  216. package/docs/components/tree-drop-down.md +31 -23
  217. package/docs/components/tree-sub-layout.md +6 -2
  218. package/docs/components/tree-view.md +16 -5
  219. package/docs/explanation/architecture.md +54 -0
  220. package/docs/explanation/design-system.md +52 -0
  221. package/docs/how-to/data-views-from-backend-response.md +7 -4
  222. package/docs/how-to/guides.md +24 -18
  223. package/docs/migration/changelog.md +38 -0
  224. package/docs/reference/cli.md +87 -0
  225. package/docs/reference/components.md +11 -12
  226. package/docs/reference/hooks.md +8 -8
  227. package/docs/reference/providers.md +22 -22
  228. package/docs/reference/tailwind-plugins.md +2 -2
  229. package/docs/reference/theme.md +85 -0
  230. package/docs/reference/types.md +4 -4
  231. package/docs/reference/utilities.md +19 -26
  232. package/docs/tutorials/building-first-form.md +20 -13
  233. package/docs/tutorials/component-composition.md +34 -50
  234. package/docs/tutorials/getting-started.md +2 -2
  235. package/docs/tutorials/theming-basics.md +13 -10
  236. package/package.json +31 -3
  237. package/dist/src/commands/block.d.ts +0 -5
  238. package/dist/src/commands/block.d.ts.map +0 -1
  239. package/dist/src/commands/block.js +0 -255
  240. package/dist/src/commands/block.js.map +0 -1
  241. package/dist/src/shared/configureFonts.d.ts +0 -6
  242. package/dist/src/shared/configureFonts.d.ts.map +0 -1
  243. package/dist/src/shared/configureFonts.js +0 -106
  244. package/dist/src/shared/configureFonts.js.map +0 -1
  245. package/dist/src/shared/configureGlobalCss.d.ts +0 -6
  246. package/dist/src/shared/configureGlobalCss.d.ts.map +0 -1
  247. package/dist/src/shared/configureGlobalCss.js +0 -154
  248. package/dist/src/shared/configureGlobalCss.js.map +0 -1
  249. package/dist/src/shared/configureTailwind.d.ts +0 -7
  250. package/dist/src/shared/configureTailwind.d.ts.map +0 -1
  251. package/dist/src/shared/configureTailwind.js +0 -163
  252. package/dist/src/shared/configureTailwind.js.map +0 -1
  253. package/dist/src/shared/detectFramework.d.ts +0 -23
  254. package/dist/src/shared/detectFramework.d.ts.map +0 -1
  255. package/dist/src/shared/detectFramework.js +0 -119
  256. package/dist/src/shared/detectFramework.js.map +0 -1
  257. package/dist/src/shared/installBaseUtils.d.ts +0 -5
  258. package/dist/src/shared/installBaseUtils.d.ts.map +0 -1
  259. package/dist/src/shared/installBaseUtils.js +0 -79
  260. package/dist/src/shared/installBaseUtils.js.map +0 -1
  261. package/dist/src/shared/resolveAliases.d.ts +0 -24
  262. package/dist/src/shared/resolveAliases.d.ts.map +0 -1
  263. package/dist/src/shared/resolveAliases.js +0 -98
  264. package/dist/src/shared/resolveAliases.js.map +0 -1
@@ -4,14 +4,12 @@ import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
4
4
  import { cn } from "../utils/cn";
5
5
  import { Themes } from "../utils/types";
6
6
 
7
-
8
7
  interface DropdownMenuProps {
9
8
  variant?: "PresentationStyle";
10
9
  className?: string;
11
- theme?: Themes
10
+ theme?: Themes;
12
11
  }
13
12
 
14
-
15
13
  const DropdownMenu = DropdownMenuPrimitive.Root;
16
14
 
17
15
  const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;
@@ -19,7 +17,7 @@ const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;
19
17
  const DropdownMenuGroup = React.forwardRef<
20
18
  React.ElementRef<typeof DropdownMenuPrimitive.Group>,
21
19
  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Group> &
22
- VariantProps<typeof menuGroupStyles>
20
+ VariantProps<typeof menuGroupStyles>
23
21
  >(({ className, variant = "Boxed", ...props }, ref) => (
24
22
  <DropdownMenuPrimitive.Group
25
23
  ref={ref}
@@ -36,7 +34,7 @@ const DropdownMenuSub = DropdownMenuPrimitive.Sub;
36
34
  const DropdownMenuRadioGroup = React.forwardRef<
37
35
  React.ElementRef<typeof DropdownMenuPrimitive.RadioGroup>,
38
36
  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioGroup> &
39
- VariantProps<typeof menuGroupStyles>
37
+ VariantProps<typeof menuGroupStyles>
40
38
  >(({ className, variant = "Boxed", ...props }, ref) => (
41
39
  <DropdownMenuPrimitive.RadioGroup
42
40
  ref={ref}
@@ -44,13 +42,12 @@ const DropdownMenuRadioGroup = React.forwardRef<
44
42
  {...props}
45
43
  />
46
44
  ));
47
- DropdownMenuRadioGroup.displayName =
48
- DropdownMenuPrimitive.RadioGroup.displayName;
45
+ DropdownMenuRadioGroup.displayName = DropdownMenuPrimitive.RadioGroup.displayName;
49
46
 
50
47
  const DropdownMenuContent = React.forwardRef<
51
48
  React.ElementRef<typeof DropdownMenuPrimitive.Content>,
52
49
  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content> &
53
- DropdownMenuProps & { autoGroup?: boolean }
50
+ DropdownMenuProps & { autoGroup?: boolean; maxHeight?: number }
54
51
  >(
55
52
  (
56
53
  {
@@ -60,10 +57,12 @@ const DropdownMenuContent = React.forwardRef<
60
57
  variant = "PresentationStyle",
61
58
  autoGroup = true,
62
59
  collisionPadding = 8,
60
+ maxHeight = 320,
61
+ style,
63
62
  children,
64
63
  ...props
65
64
  },
66
- ref
65
+ ref,
67
66
  ) => (
68
67
  <DropdownMenuPrimitive.Portal>
69
68
  <DropdownMenuPrimitive.Content
@@ -71,19 +70,19 @@ const DropdownMenuContent = React.forwardRef<
71
70
  ref={ref}
72
71
  sideOffset={sideOffset}
73
72
  collisionPadding={collisionPadding}
74
- className={cn(
75
- menuContentStyles({ variant }),
76
- // Cap to the space Radix has after collision handling so a tall menu
77
- // scrolls instead of overflowing off-screen.
78
- "max-h-[var(--radix-dropdown-menu-content-available-height)]",
79
- className
80
- )}
73
+ // Cap at maxHeight, but never exceed the space Radix has after collision
74
+ // handling. The menu scrolls (overflow on the surface) past this height.
75
+ style={{
76
+ maxHeight: `min(${maxHeight}px, var(--radix-dropdown-menu-content-available-height))`,
77
+ ...style,
78
+ }}
79
+ className={cn(menuContentStyles({ variant }), className)}
81
80
  {...props}
82
81
  >
83
82
  {autoGroup ? autoGroupChildren(children) : children}
84
83
  </DropdownMenuPrimitive.Content>
85
84
  </DropdownMenuPrimitive.Portal>
86
- )
85
+ ),
87
86
  );
88
87
  DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;
89
88
 
@@ -96,33 +95,28 @@ const DropdownMenuSubTrigger = React.forwardRef<
96
95
  (
97
96
  {
98
97
  className,
98
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars -- excluded from {...props} spread
99
99
  inset,
100
100
  children,
101
101
  variant = "Default",
102
102
  size = "M",
103
103
  ...props
104
104
  },
105
- ref
105
+ ref,
106
106
  ) => (
107
107
  <DropdownMenuPrimitive.SubTrigger
108
108
  ref={ref}
109
- className={cn(
110
- MenuItemStyles({ variant, size }),
111
- "justify-between",
112
- className
113
- )}
109
+ className={cn(MenuItemStyles({ variant, size }), "justify-between", className)}
114
110
  {...props}
115
111
  >
116
- <div className="justify-between"><div className="flex gap-2">
117
- {children}
112
+ <div className="justify-between">
113
+ <div className="flex gap-2">{children}</div>
114
+ <i className="ri-arrow-right-s-line text-[16px] rtl:rotate-180"></i>
118
115
  </div>
119
- <i className="ri-arrow-right-s-line text-[16px] rtl:rotate-180"></i></div>
120
-
121
116
  </DropdownMenuPrimitive.SubTrigger>
122
- )
117
+ ),
123
118
  );
124
- DropdownMenuSubTrigger.displayName =
125
- DropdownMenuPrimitive.SubTrigger.displayName;
119
+ DropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName;
126
120
 
127
121
  const DropdownMenuSubContent = React.forwardRef<
128
122
  React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,
@@ -130,30 +124,18 @@ const DropdownMenuSubContent = React.forwardRef<
130
124
  variant?: "PresentationStyle";
131
125
  autoGroup?: boolean;
132
126
  }
133
- >(
134
- (
135
- {
136
- className,
137
- variant = "PresentationStyle",
138
- autoGroup = true,
139
- children,
140
- ...props
141
- },
142
- ref
143
- ) => (
144
- <DropdownMenuPrimitive.Portal>
145
- <DropdownMenuPrimitive.SubContent
146
- ref={ref}
147
- className={cn(menuContentStyles({ variant }), className)}
148
- {...props}
149
- >
150
- {autoGroup ? autoGroupChildren(children) : children}
151
- </DropdownMenuPrimitive.SubContent>
152
- </DropdownMenuPrimitive.Portal>
153
- )
154
- );
155
- DropdownMenuSubContent.displayName =
156
- DropdownMenuPrimitive.SubContent.displayName;
127
+ >(({ className, variant = "PresentationStyle", autoGroup = true, children, ...props }, ref) => (
128
+ <DropdownMenuPrimitive.Portal>
129
+ <DropdownMenuPrimitive.SubContent
130
+ ref={ref}
131
+ className={cn(menuContentStyles({ variant }), className)}
132
+ {...props}
133
+ >
134
+ {autoGroup ? autoGroupChildren(children) : children}
135
+ </DropdownMenuPrimitive.SubContent>
136
+ </DropdownMenuPrimitive.Portal>
137
+ ));
138
+ DropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName;
157
139
 
158
140
  const DropdownMenuItem = React.forwardRef<
159
141
  React.ElementRef<typeof DropdownMenuPrimitive.Item>,
@@ -164,6 +146,7 @@ const DropdownMenuItem = React.forwardRef<
164
146
  (
165
147
  {
166
148
  className,
149
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars -- excluded from {...props} spread
167
150
  inset,
168
151
  children,
169
152
  variant = "Default",
@@ -171,126 +154,104 @@ const DropdownMenuItem = React.forwardRef<
171
154
  active,
172
155
  ...props
173
156
  },
174
- ref
157
+ ref,
175
158
  ) => (
176
159
  <DropdownMenuPrimitive.Item
177
160
  {...props}
178
161
  ref={ref}
179
- className={cn(
180
- MenuItemStyles({ variant, size, active }),
181
- className
182
- )}
162
+ className={cn(MenuItemStyles({ variant, size, active }), className)}
183
163
  >
184
- <div >{children}</div>
164
+ <div>{children}</div>
185
165
  </DropdownMenuPrimitive.Item>
186
- )
166
+ ),
187
167
  );
188
168
  DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;
189
169
 
190
170
  const DropdownMenuCheckboxItem = React.forwardRef<
191
171
  React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,
192
172
  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem> &
193
- VariantProps<typeof MenuItemStyles>
194
- >(
195
- (
196
- {
197
- className,
198
- children,
199
- checked,
200
- variant = "Default",
201
- size = "M",
202
- onSelect,
203
- ...props
204
- },
205
- ref
206
- ) => (
207
- <DropdownMenuPrimitive.CheckboxItem
208
- ref={ref}
209
- className={cn(
210
- MenuItemStyles({ variant, size }),
211
- "relative",
212
- className
213
- )}
214
- checked={checked}
215
- // Keep the menu open when toggling; preventDefault stops Radix's auto-close.
216
- onSelect={(event) => {
217
- event.preventDefault();
218
- onSelect?.(event);
219
- }}
220
- {...props}
221
- >
222
-
223
- <div className="relative flex items-center">
224
- <span className="h-full flex items-center justify-center">
225
- {/* Red dot is the default; hidden once the item is checked. */}
226
- <div className=" flex justify-center items-center h-full [[data-state=checked]_&]:hidden">
227
- <div className="w-[16px] h-[16px] rounded-[3px] border border-white-alpha-40 bg-black-alpha-15 group-hover:border-white-700 group-hover:bg-black-alpha-075">
228
- </div>
173
+ VariantProps<typeof MenuItemStyles>
174
+ >(({ className, children, checked, variant = "Default", size = "M", onSelect, ...props }, ref) => (
175
+ <DropdownMenuPrimitive.CheckboxItem
176
+ ref={ref}
177
+ className={cn(MenuItemStyles({ variant, size }), "relative", className)}
178
+ checked={checked}
179
+ // Keep the menu open when toggling; preventDefault stops Radix's auto-close.
180
+ onSelect={(event) => {
181
+ event.preventDefault();
182
+ onSelect?.(event);
183
+ }}
184
+ {...props}
185
+ >
186
+ <div className="relative flex items-center">
187
+ <span className="h-full flex items-center justify-center">
188
+ {/* Red dot is the default; hidden once the item is checked. */}
189
+ <div className=" flex justify-center items-center h-full [[data-state=checked]_&]:hidden">
190
+ <div className="w-[16px] h-[16px] rounded-[3px] border border-white-alpha-40 bg-black-alpha-15 group-hover:border-white-700 group-hover:bg-black-alpha-075"></div>
191
+ </div>
192
+
193
+ {/* Blue dot only renders when the item is checked. */}
194
+ <DropdownMenuPrimitive.ItemIndicator>
195
+ <div className="bg-blue-sparkle-600 flex justify-center items-center w-[16px] h-[16px] rounded-[3px]">
196
+ <svg
197
+ xmlns="http://www.w3.org/2000/svg"
198
+ width="14"
199
+ height="14"
200
+ viewBox="0 0 14 14"
201
+ fill="none"
202
+ >
203
+ <path
204
+ d="M5.8339 8.84977L11.1961 3.48755L12.0211 4.3125L5.8339 10.4997L2.12158 6.7874L2.94654 5.96245L5.8339 8.84977Z"
205
+ fill="#F9F9F9"
206
+ />
207
+ </svg>
229
208
  </div>
230
-
231
- {/* Blue dot only renders when the item is checked. */}
232
- <DropdownMenuPrimitive.ItemIndicator>
233
- <div className="bg-blue-sparkle-600 flex justify-center items-center w-[16px] h-[16px] rounded-[3px]">
234
-
235
- <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14" fill="none">
236
- <path d="M5.8339 8.84977L11.1961 3.48755L12.0211 4.3125L5.8339 10.4997L2.12158 6.7874L2.94654 5.96245L5.8339 8.84977Z" fill="#F9F9F9" />
237
- </svg>
238
- </div>
239
- </DropdownMenuPrimitive.ItemIndicator>
240
- </span> {children}</div>
241
- </DropdownMenuPrimitive.CheckboxItem>
242
- )
243
- );
244
- DropdownMenuCheckboxItem.displayName =
245
- DropdownMenuPrimitive.CheckboxItem.displayName;
209
+ </DropdownMenuPrimitive.ItemIndicator>
210
+ </span>{" "}
211
+ {children}
212
+ </div>
213
+ </DropdownMenuPrimitive.CheckboxItem>
214
+ ));
215
+ DropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName;
246
216
 
247
217
  const DropdownMenuRadioItem = React.forwardRef<
248
218
  React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,
249
219
  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem> &
250
- VariantProps<typeof MenuItemStyles>
251
- >(
252
- (
253
- {
254
- className,
255
- children,
256
- variant = "Default",
257
- size = "M",
258
- onSelect,
259
- ...props
260
- },
261
- ref
262
- ) => (
263
- <DropdownMenuPrimitive.RadioItem
264
- ref={ref}
265
- className={cn(
266
- MenuItemStyles({ variant, size }),
267
- "relative",
268
- className
269
- )}
270
- // Keep the menu open when selecting; preventDefault stops Radix's auto-close.
271
- onSelect={(event) => {
272
- event.preventDefault();
273
- onSelect?.(event);
274
- }}
275
- {...props}
276
- >
277
- <div className="relative flex items-center">
278
- <span className="h-full left-2 flex h-3.5 w-3.5 items-center justify-center">
279
- {/* Red dot is the default; hidden once the item is checked. */}
280
- <div className=" flex justify-center items-center h-full [[data-state=checked]_&]:hidden">
281
- <div className="w-[14px] h-[14px] rounded-[100px] border border-white-alpha-40 bg-black-alpha-15 group-hover:border-white-700 group-hover:bg-black-alpha-075">
282
- </div>
283
- </div>
284
- <DropdownMenuPrimitive.ItemIndicator>
285
- <svg xmlns="http://www.w3.org/2000/svg" width="14" height="16" viewBox="0 0 14 14" fill="none">
286
- <rect width="14" height="14" rx="7" fill="#005ECC" />
287
- <rect x="5" y="5" width="4" height="4" rx="2" fill="white" />
288
- </svg> </DropdownMenuPrimitive.ItemIndicator>
289
- </span>
290
- {children} </div>
291
- </DropdownMenuPrimitive.RadioItem>
292
- )
293
- );
220
+ VariantProps<typeof MenuItemStyles>
221
+ >(({ className, children, variant = "Default", size = "M", onSelect, ...props }, ref) => (
222
+ <DropdownMenuPrimitive.RadioItem
223
+ ref={ref}
224
+ className={cn(MenuItemStyles({ variant, size }), "relative", className)}
225
+ // Keep the menu open when selecting; preventDefault stops Radix's auto-close.
226
+ onSelect={(event) => {
227
+ event.preventDefault();
228
+ onSelect?.(event);
229
+ }}
230
+ {...props}
231
+ >
232
+ <div className="relative flex items-center">
233
+ <span className="h-full left-2 flex h-3.5 w-3.5 items-center justify-center">
234
+ {/* Red dot is the default; hidden once the item is checked. */}
235
+ <div className=" flex justify-center items-center h-full [[data-state=checked]_&]:hidden">
236
+ <div className="w-[14px] h-[14px] rounded-[100px] border border-white-alpha-40 bg-black-alpha-15 group-hover:border-white-700 group-hover:bg-black-alpha-075"></div>
237
+ </div>
238
+ <DropdownMenuPrimitive.ItemIndicator>
239
+ <svg
240
+ xmlns="http://www.w3.org/2000/svg"
241
+ width="14"
242
+ height="16"
243
+ viewBox="0 0 14 14"
244
+ fill="none"
245
+ >
246
+ <rect width="14" height="14" rx="7" fill="#005ECC" />
247
+ <rect x="5" y="5" width="4" height="4" rx="2" fill="white" />
248
+ </svg>{" "}
249
+ </DropdownMenuPrimitive.ItemIndicator>
250
+ </span>
251
+ {children}{" "}
252
+ </div>
253
+ </DropdownMenuPrimitive.RadioItem>
254
+ ));
294
255
  DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;
295
256
 
296
257
  // Item types that should be boxed together when sitting loose in the menu.
@@ -305,9 +266,7 @@ const GROUPABLE_TYPES = [
305
266
 
306
267
  const isGroupable = (child: React.ReactNode): child is React.ReactElement =>
307
268
  React.isValidElement(child) &&
308
- (GROUPABLE_TYPES as readonly React.ElementType[]).includes(
309
- child.type as React.ElementType
310
- );
269
+ (GROUPABLE_TYPES as readonly React.ElementType[]).includes(child.type as React.ElementType);
311
270
 
312
271
  // Wraps consecutive runs of loose items in a Boxed DropdownMenuGroup so items
313
272
  // render inside a container even when the consumer doesn't write one. Labels,
@@ -321,7 +280,7 @@ function autoGroupChildren(children: React.ReactNode): React.ReactNode {
321
280
  out.push(
322
281
  <DropdownMenuGroup key={key} variant="Boxed">
323
282
  {run}
324
- </DropdownMenuGroup>
283
+ </DropdownMenuGroup>,
325
284
  );
326
285
  run = [];
327
286
  };
@@ -344,25 +303,28 @@ const DropdownMenuLabel = React.forwardRef<
344
303
  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {
345
304
  inset?: boolean;
346
305
  }
347
- >(({ className, inset, ...props }, ref) => (
348
- <DropdownMenuPrimitive.Label
349
- ref={ref}
350
- className={cn(
351
- "text-content-presentation-global-primary-light typography-body-small-medium px-[12px] pt-1 flex justify-start items-center",
352
- className
353
- )}
354
- {...props}
355
- />
356
- ));
306
+ >(
307
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars -- excluded from {...props} spread
308
+ ({ className, inset, ...props }, ref) => (
309
+ <DropdownMenuPrimitive.Label
310
+ ref={ref}
311
+ className={cn(
312
+ "text-content-presentation-global-primary-light typography-body-small-medium px-[12px] pt-1 flex justify-start items-center",
313
+ className,
314
+ )}
315
+ {...props}
316
+ />
317
+ ),
318
+ );
357
319
  DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;
358
320
 
359
- const DropdownMenuShortcut = ({
360
- className,
361
- ...props
362
- }: React.HTMLAttributes<HTMLSpanElement>) => {
321
+ const DropdownMenuShortcut = ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) => {
363
322
  return (
364
323
  <span
365
- className={cn("ltr:ml-auto rtl:mr-auto rtl:ml-0 text-xs tracking-widest opacity-60", className)}
324
+ className={cn(
325
+ "ltr:ml-auto rtl:mr-auto rtl:ml-0 text-xs tracking-widest opacity-60",
326
+ className,
327
+ )}
366
328
  {...props}
367
329
  />
368
330
  );
@@ -398,6 +360,7 @@ export const MenuItemStyles = cva(
398
360
  "border",
399
361
  "border-transparent",
400
362
  "flex",
363
+ "shrink-0", // keep full row height so the menu scrolls instead of squishing
401
364
  "items-center",
402
365
  "justify-start",
403
366
  "text-overflow",
@@ -484,7 +447,7 @@ export const MenuItemStyles = cva(
484
447
  className: ["text-content-presentation-state-negative"],
485
448
  },
486
449
  ],
487
- }
450
+ },
488
451
  );
489
452
 
490
453
  export const menuContentStyles = cva(
@@ -493,13 +456,13 @@ export const menuContentStyles = cva(
493
456
  "rounded-[14px]",
494
457
  "min-w-[240px]",
495
458
  "outline-none",
496
- "overflow-scroll",
459
+ "overflow-y-auto",
460
+ "overflow-x-hidden",
497
461
  // Only animate the OPEN (enter) state. An exit animation on [data-state=closed]
498
462
  // holds the old DOM node during close, which breaks the context menu's
499
463
  // close/reposition on a second right-click (Radix issue #2572).
500
464
  "data-[state=open]:animate-in",
501
465
  "data-[state=open]:fade-in-0",
502
- "overflow-x-hidden",
503
466
  "scrollbar-hide",
504
467
  "backdrop-blur-[21px]",
505
468
  "flex gap-1 flex-col",
@@ -516,10 +479,10 @@ export const menuContentStyles = cva(
516
479
  variant: "PresentationStyle",
517
480
  },
518
481
  },
519
- }
482
+ },
520
483
  );
521
484
 
522
- export const menuGroupStyles = cva(["flex", "flex-col"], {
485
+ export const menuGroupStyles = cva(["flex", "flex-col", "shrink-0"], {
523
486
  variants: {
524
487
  variant: {
525
488
  // Visually contains its items in a bordered card.
@@ -20,7 +20,7 @@ export const glareFieldAlert = cva(
20
20
  defaultVariants: {
21
21
  state: "info",
22
22
  },
23
- }
23
+ },
24
24
  );
25
25
 
26
26
  type FieldAlertVariant = "success" | "error" | "warning" | "info";
@@ -29,17 +29,10 @@ interface Props extends HTMLAttributes<HTMLDivElement> {
29
29
  label: ReactNode;
30
30
  state?: FieldAlertVariant;
31
31
  icon?: ReactNode;
32
- theme?: Themes
32
+ theme?: Themes;
33
33
  }
34
34
 
35
- export const FieldHint: React.FC<Props> = ({
36
- label,
37
- state,
38
- theme,
39
- icon,
40
- className,
41
- ...props
42
- }) => {
35
+ export const FieldHint: React.FC<Props> = ({ label, state, theme, icon, className, ...props }) => {
43
36
  return (
44
37
  <section
45
38
  {...props}
@@ -48,7 +41,7 @@ export const FieldHint: React.FC<Props> = ({
48
41
  glareFieldAlert({
49
42
  state,
50
43
  }),
51
- className
44
+ className,
52
45
  )}
53
46
  >
54
47
  <section className="flex items-center justify-center min-w-[26px] min-h-[26px] h-full rounded-[4px] text-[18px]">