@vuer-ai/vuer-uikit 0.0.96 → 0.0.98

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 (341) hide show
  1. package/README.md +106 -7
  2. package/cli/dial-cli.js +49 -7
  3. package/dist/SyncScroll/SyncScroll.cjs +10 -10
  4. package/dist/SyncScroll/SyncScroll.mjs +3 -3
  5. package/dist/SyncScroll/index.cjs +10 -10
  6. package/dist/SyncScroll/index.mjs +3 -3
  7. package/dist/chunk-3HEZVWRW.mjs +62 -0
  8. package/dist/chunk-4KWGGESI.cjs +494 -0
  9. package/dist/{chunk-CCMKL2OA.cjs → chunk-7GWDO25E.cjs} +2 -2
  10. package/dist/chunk-A5LCX2UQ.cjs +208 -0
  11. package/dist/chunk-BEJIZ56L.mjs +300 -0
  12. package/dist/chunk-C7VGRU3O.mjs +283 -0
  13. package/dist/{chunk-LONOMMFA.cjs → chunk-LJMNHTTG.cjs} +21 -21
  14. package/dist/chunk-O66RESRR.cjs +285 -0
  15. package/dist/{chunk-RINTUFYQ.cjs → chunk-RMK6W774.cjs} +24 -19
  16. package/dist/{chunk-BFQ2WL5U.mjs → chunk-TTYSYGVE.mjs} +2 -2
  17. package/dist/chunk-VA3PEYFM.mjs +489 -0
  18. package/dist/chunk-VBBJSIY7.cjs +308 -0
  19. package/dist/{chunk-AIINOWEH.mjs → chunk-W4JCKCW7.mjs} +5 -5
  20. package/dist/chunk-WWGF6TBZ.mjs +206 -0
  21. package/dist/chunk-ZGN4UEJR.cjs +679 -0
  22. package/dist/chunk-ZQLRMOUW.mjs +661 -0
  23. package/dist/dial/DialPanel.cjs +24 -24
  24. package/dist/dial/DialPanel.mjs +23 -23
  25. package/dist/dial/DialProvider.cjs +3 -3
  26. package/dist/dial/DialProvider.d.cts +1 -0
  27. package/dist/dial/DialProvider.d.ts +1 -0
  28. package/dist/dial/DialProvider.example.cjs +72 -0
  29. package/dist/dial/DialProvider.example.d.cts +7 -0
  30. package/dist/dial/DialProvider.example.d.ts +7 -0
  31. package/dist/dial/DialProvider.example.mjs +68 -0
  32. package/dist/dial/DialProvider.mjs +1 -1
  33. package/dist/dial/index.cjs +42 -42
  34. package/dist/dial/index.mjs +23 -23
  35. package/dist/dial/wrapped-inputs/ControlledInputs.cjs +27 -27
  36. package/dist/dial/wrapped-inputs/ControlledInputs.mjs +23 -23
  37. package/dist/dial/wrapped-inputs/DialInputs.cjs +34 -34
  38. package/dist/dial/wrapped-inputs/DialInputs.mjs +23 -23
  39. package/dist/dial/wrapped-inputs/DialVectorInput.cjs +24 -24
  40. package/dist/dial/wrapped-inputs/DialVectorInput.mjs +23 -23
  41. package/dist/dial/wrapped-inputs/index.cjs +39 -39
  42. package/dist/dial/wrapped-inputs/index.mjs +23 -23
  43. package/dist/highlight-cursor/cursor-provider.cjs +3 -3
  44. package/dist/highlight-cursor/cursor-provider.mjs +2 -2
  45. package/dist/highlight-cursor/enhanced-components.cjs +10 -10
  46. package/dist/highlight-cursor/enhanced-components.mjs +5 -5
  47. package/dist/highlight-cursor/index.cjs +16 -16
  48. package/dist/highlight-cursor/index.mjs +6 -6
  49. package/dist/hooks/index.cjs +5 -5
  50. package/dist/hooks/index.mjs +1 -1
  51. package/dist/index.cjs +190 -190
  52. package/dist/index.mjs +23 -23
  53. package/dist/ui/UIKitBadge.cjs +6 -6
  54. package/dist/ui/UIKitBadge.mjs +2 -2
  55. package/dist/ui/avatar.cjs +1 -1
  56. package/dist/ui/avatar.mjs +1 -1
  57. package/dist/ui/badge.cjs +1 -1
  58. package/dist/ui/badge.d.cts +1 -1
  59. package/dist/ui/badge.d.ts +1 -1
  60. package/dist/ui/badge.mjs +1 -1
  61. package/dist/ui/button.cjs +1 -1
  62. package/dist/ui/button.mjs +1 -1
  63. package/dist/ui/card.cjs +1 -1
  64. package/dist/ui/card.mjs +1 -1
  65. package/dist/ui/checkbox.cjs +1 -1
  66. package/dist/ui/checkbox.mjs +1 -1
  67. package/dist/ui/collapsible.cjs +1 -1
  68. package/dist/ui/collapsible.mjs +1 -1
  69. package/dist/ui/drawer.cjs +1 -1
  70. package/dist/ui/drawer.mjs +1 -1
  71. package/dist/ui/dropdown.cjs +1 -1
  72. package/dist/ui/dropdown.mjs +1 -1
  73. package/dist/ui/index.cjs +107 -107
  74. package/dist/ui/index.mjs +17 -17
  75. package/dist/ui/inputs/color-input.cjs +1 -1
  76. package/dist/ui/inputs/color-input.mjs +1 -1
  77. package/dist/ui/inputs/index.cjs +11 -11
  78. package/dist/ui/inputs/index.mjs +3 -3
  79. package/dist/ui/inputs/input-numbers.cjs +1 -1
  80. package/dist/ui/inputs/input-numbers.mjs +1 -1
  81. package/dist/ui/inputs/input.cjs +1 -1
  82. package/dist/ui/inputs/input.d.cts +1 -1
  83. package/dist/ui/inputs/input.d.ts +1 -1
  84. package/dist/ui/inputs/input.mjs +1 -1
  85. package/dist/ui/inputs/number-inputs/CmInput.cjs +1 -1
  86. package/dist/ui/inputs/number-inputs/CmInput.mjs +1 -1
  87. package/dist/ui/inputs/number-inputs/DegInput.cjs +1 -1
  88. package/dist/ui/inputs/number-inputs/DegInput.mjs +1 -1
  89. package/dist/ui/inputs/number-inputs/EulerDegInput.cjs +1 -1
  90. package/dist/ui/inputs/number-inputs/EulerDegInput.mjs +1 -1
  91. package/dist/ui/inputs/number-inputs/EulerInput.cjs +1 -1
  92. package/dist/ui/inputs/number-inputs/EulerInput.mjs +1 -1
  93. package/dist/ui/inputs/number-inputs/EulerRadInput.cjs +1 -1
  94. package/dist/ui/inputs/number-inputs/EulerRadInput.mjs +1 -1
  95. package/dist/ui/inputs/number-inputs/InchInput.cjs +1 -1
  96. package/dist/ui/inputs/number-inputs/InchInput.mjs +1 -1
  97. package/dist/ui/inputs/number-inputs/IntInput.cjs +1 -1
  98. package/dist/ui/inputs/number-inputs/IntInput.mjs +1 -1
  99. package/dist/ui/inputs/number-inputs/KVectorInput.cjs +1 -1
  100. package/dist/ui/inputs/number-inputs/KVectorInput.mjs +1 -1
  101. package/dist/ui/inputs/number-inputs/QuaternionInput.cjs +1 -1
  102. package/dist/ui/inputs/number-inputs/QuaternionInput.mjs +1 -1
  103. package/dist/ui/inputs/number-inputs/RadInput.cjs +1 -1
  104. package/dist/ui/inputs/number-inputs/RadInput.mjs +1 -1
  105. package/dist/ui/inputs/number-inputs/TimeInput.cjs +1 -1
  106. package/dist/ui/inputs/number-inputs/TimeInput.mjs +1 -1
  107. package/dist/ui/inputs/number-inputs/Vec3Input.cjs +1 -1
  108. package/dist/ui/inputs/number-inputs/Vec3Input.mjs +1 -1
  109. package/dist/ui/inputs/number-inputs/VectorInput.cjs +1 -1
  110. package/dist/ui/inputs/number-inputs/VectorInput.mjs +1 -1
  111. package/dist/ui/inputs/number-inputs/index.cjs +11 -11
  112. package/dist/ui/inputs/number-inputs/index.mjs +3 -3
  113. package/dist/ui/inputs/presets-input.cjs +1 -1
  114. package/dist/ui/inputs/presets-input.mjs +1 -1
  115. package/dist/ui/label.cjs +1 -1
  116. package/dist/ui/label.mjs +1 -1
  117. package/dist/ui/layout.cjs +1 -1
  118. package/dist/ui/layout.mjs +1 -1
  119. package/dist/ui/layouts/dock-layout/DockLayoutView.cjs +1 -1
  120. package/dist/ui/layouts/dock-layout/DockLayoutView.mjs +1 -1
  121. package/dist/ui/layouts/dock-layout/LayoutSlots.cjs +1 -1
  122. package/dist/ui/layouts/dock-layout/LayoutSlots.mjs +1 -1
  123. package/dist/ui/layouts/dock-layout/index.cjs +1 -1
  124. package/dist/ui/layouts/dock-layout/index.mjs +1 -1
  125. package/dist/ui/layouts/index.cjs +2 -2
  126. package/dist/ui/layouts/index.mjs +2 -2
  127. package/dist/ui/layouts/liquid-layout/LayoutSlots.cjs +1 -1
  128. package/dist/ui/layouts/liquid-layout/LayoutSlots.mjs +1 -1
  129. package/dist/ui/layouts/liquid-layout/LiquidLayoutView.cjs +1 -1
  130. package/dist/ui/layouts/liquid-layout/LiquidLayoutView.mjs +1 -1
  131. package/dist/ui/layouts/liquid-layout/index.cjs +1 -1
  132. package/dist/ui/layouts/liquid-layout/index.mjs +1 -1
  133. package/dist/ui/modal.cjs +1 -1
  134. package/dist/ui/modal.mjs +1 -1
  135. package/dist/ui/navigation.cjs +1 -1
  136. package/dist/ui/navigation.mjs +1 -1
  137. package/dist/ui/pagination.cjs +1 -1
  138. package/dist/ui/pagination.mjs +1 -1
  139. package/dist/ui/panel.cjs +1 -1
  140. package/dist/ui/panel.mjs +1 -1
  141. package/dist/ui/popover.cjs +1 -1
  142. package/dist/ui/popover.mjs +1 -1
  143. package/dist/ui/radio-group.cjs +1 -1
  144. package/dist/ui/radio-group.mjs +1 -1
  145. package/dist/ui/resizable.cjs +1 -1
  146. package/dist/ui/resizable.mjs +1 -1
  147. package/dist/ui/select.cjs +1 -1
  148. package/dist/ui/select.d.cts +1 -1
  149. package/dist/ui/select.d.ts +1 -1
  150. package/dist/ui/select.mjs +1 -1
  151. package/dist/ui/separator.cjs +1 -1
  152. package/dist/ui/separator.mjs +1 -1
  153. package/dist/ui/sheet.cjs +1 -1
  154. package/dist/ui/sheet.mjs +1 -1
  155. package/dist/ui/sidebar.cjs +26 -26
  156. package/dist/ui/sidebar.mjs +2 -2
  157. package/dist/ui/simple-tree-view.cjs +1 -1
  158. package/dist/ui/simple-tree-view.mjs +1 -1
  159. package/dist/ui/skeleton.cjs +1 -1
  160. package/dist/ui/skeleton.mjs +1 -1
  161. package/dist/ui/slider.cjs +1 -1
  162. package/dist/ui/slider.mjs +1 -1
  163. package/dist/ui/switch.cjs +1 -1
  164. package/dist/ui/switch.mjs +1 -1
  165. package/dist/ui/table.cjs +1 -1
  166. package/dist/ui/table.mjs +1 -1
  167. package/dist/ui/tabs.cjs +1 -1
  168. package/dist/ui/tabs.mjs +1 -1
  169. package/dist/ui/textarea.cjs +1 -1
  170. package/dist/ui/textarea.d.cts +1 -1
  171. package/dist/ui/textarea.d.ts +1 -1
  172. package/dist/ui/textarea.mjs +1 -1
  173. package/dist/ui/theme/ThemeToggles.cjs +1 -1
  174. package/dist/ui/theme/ThemeToggles.mjs +1 -1
  175. package/dist/ui/theme/index.cjs +1 -1
  176. package/dist/ui/theme/index.mjs +1 -1
  177. package/dist/ui/toggle-buttons.cjs +1 -1
  178. package/dist/ui/toggle-buttons.mjs +1 -1
  179. package/dist/ui/toggle-group.cjs +1 -1
  180. package/dist/ui/toggle-group.mjs +1 -1
  181. package/dist/ui/toggle.cjs +1 -1
  182. package/dist/ui/toggle.mjs +1 -1
  183. package/dist/ui/toolbar.cjs +1 -1
  184. package/dist/ui/toolbar.mjs +1 -1
  185. package/dist/ui/tooltip.cjs +1 -1
  186. package/dist/ui/tooltip.mjs +1 -1
  187. package/dist/ui/tree-view/TreeSearchBar.cjs +1 -1
  188. package/dist/ui/tree-view/TreeSearchBar.mjs +1 -1
  189. package/dist/ui/tree-view/TreeView.cjs +1 -1
  190. package/dist/ui/tree-view/TreeView.mjs +1 -1
  191. package/dist/ui/tree-view/index.cjs +6 -6
  192. package/dist/ui/tree-view/index.mjs +2 -2
  193. package/dist/ui/tree-view-legacy.cjs +9 -9
  194. package/dist/ui/tree-view-legacy.mjs +5 -5
  195. package/dist/ui/waterfall/CursorOverlay.cjs +1 -1
  196. package/dist/ui/waterfall/CursorOverlay.mjs +1 -1
  197. package/dist/ui/waterfall/TimelineEvent.cjs +1 -1
  198. package/dist/ui/waterfall/TimelineEvent.mjs +1 -1
  199. package/dist/ui/waterfall/TimelineProcessBar.cjs +1 -1
  200. package/dist/ui/waterfall/TimelineProcessBar.mjs +1 -1
  201. package/dist/ui/waterfall/Wedges.cjs +1 -1
  202. package/dist/ui/waterfall/Wedges.mjs +1 -1
  203. package/dist/ui/waterfall/index.cjs +8 -8
  204. package/dist/ui/waterfall/index.mjs +7 -7
  205. package/package.json +28 -2
  206. package/src/SyncScroll/README.md +283 -0
  207. package/src/SyncScroll/SyncScroll.tsx +361 -0
  208. package/src/SyncScroll/index.ts +22 -0
  209. package/src/SyncScroll/useSyncScroll.tsx +226 -0
  210. package/src/cli/dial-cli.ts +1133 -0
  211. package/src/dial/DialPanel.tsx +208 -0
  212. package/src/dial/DialProvider.example.tsx +80 -0
  213. package/src/dial/DialProvider.tsx +138 -0
  214. package/src/dial/index.ts +26 -0
  215. package/src/dial/wrapped-inputs/ControlledInputs.tsx +176 -0
  216. package/src/dial/wrapped-inputs/DialInputs.tsx +401 -0
  217. package/src/dial/wrapped-inputs/DialVectorInput.tsx +125 -0
  218. package/src/dial/wrapped-inputs/index.ts +25 -0
  219. package/src/highlight-cursor/cursor-context.tsx +23 -0
  220. package/src/highlight-cursor/cursor-provider.tsx +264 -0
  221. package/src/highlight-cursor/enhanced-components.tsx +16 -0
  222. package/src/highlight-cursor/index.ts +21 -0
  223. package/src/highlight-cursor/tabs-cursor-context.tsx +121 -0
  224. package/src/highlight-cursor/types.ts +40 -0
  225. package/src/highlight-cursor/with-cursor.tsx +144 -0
  226. package/src/hooks/clientOnly.tsx +54 -0
  227. package/src/hooks/cn.ts +33 -0
  228. package/src/hooks/index.ts +9 -0
  229. package/src/hooks/useDocument.tsx +18 -0
  230. package/src/hooks/useDragSelect.ts +116 -0
  231. package/src/hooks/useIsMobile.ts +35 -0
  232. package/src/hooks/useLocalStorage.ts +122 -0
  233. package/src/hooks/useLocation.tsx +95 -0
  234. package/src/hooks/useQueryParams.tsx +31 -0
  235. package/src/hooks/useWindow.tsx +18 -0
  236. package/src/index.css +5 -0
  237. package/src/index.ts +5 -0
  238. package/src/styles/.editorconfig +0 -0
  239. package/src/styles/theme.css +152 -0
  240. package/src/styles/toast.css +67 -0
  241. package/src/styles/variables.css +229 -0
  242. package/src/ui/UIKitBadge.tsx +171 -0
  243. package/src/ui/avatar.tsx +221 -0
  244. package/src/ui/badge.tsx +74 -0
  245. package/src/ui/button.tsx +143 -0
  246. package/src/ui/card.tsx +146 -0
  247. package/src/ui/checkbox.tsx +78 -0
  248. package/src/ui/collapsible.tsx +43 -0
  249. package/src/ui/drag-selectable/DragSelectProvider.tsx +178 -0
  250. package/src/ui/drag-selectable/createSelectable.tsx +43 -0
  251. package/src/ui/drag-selectable/index.ts +2 -0
  252. package/src/ui/drawer.tsx +137 -0
  253. package/src/ui/dropdown.tsx +707 -0
  254. package/src/ui/icons/MouseCursorIcons.tsx +39 -0
  255. package/src/ui/icons/cursor.tsx +38 -0
  256. package/src/ui/icons/index.ts +2 -0
  257. package/src/ui/index.ts +45 -0
  258. package/src/ui/inputs/color-input.tsx +61 -0
  259. package/src/ui/inputs/index.tsx +5 -0
  260. package/src/ui/inputs/input-numbers.tsx +394 -0
  261. package/src/ui/inputs/input.tsx +155 -0
  262. package/src/ui/inputs/number-inputs/CmInput.tsx +26 -0
  263. package/src/ui/inputs/number-inputs/DegInput.tsx +26 -0
  264. package/src/ui/inputs/number-inputs/EulerDegInput.tsx +14 -0
  265. package/src/ui/inputs/number-inputs/EulerInput.tsx +30 -0
  266. package/src/ui/inputs/number-inputs/EulerRadInput.tsx +14 -0
  267. package/src/ui/inputs/number-inputs/InchInput.tsx +26 -0
  268. package/src/ui/inputs/number-inputs/IntInput.tsx +46 -0
  269. package/src/ui/inputs/number-inputs/KVectorInput.tsx +20 -0
  270. package/src/ui/inputs/number-inputs/QuaternionInput.tsx +27 -0
  271. package/src/ui/inputs/number-inputs/RadInput.tsx +26 -0
  272. package/src/ui/inputs/number-inputs/TimeInput.tsx +26 -0
  273. package/src/ui/inputs/number-inputs/Vec3Input.tsx +26 -0
  274. package/src/ui/inputs/number-inputs/VectorInput.tsx +38 -0
  275. package/src/ui/inputs/number-inputs/index.ts +38 -0
  276. package/src/ui/inputs/presets-input.tsx +59 -0
  277. package/src/ui/label.tsx +35 -0
  278. package/src/ui/layout.tsx +43 -0
  279. package/src/ui/layouts/dock-layout/DockLayoutView.tsx +128 -0
  280. package/src/ui/layouts/dock-layout/LayoutSlots.tsx +85 -0
  281. package/src/ui/layouts/dock-layout/index.tsx +2 -0
  282. package/src/ui/layouts/index.ts +2 -0
  283. package/src/ui/layouts/liquid-layout/LayoutSlots.tsx +82 -0
  284. package/src/ui/layouts/liquid-layout/LiquidLayoutView.tsx +76 -0
  285. package/src/ui/layouts/liquid-layout/index.ts +1 -0
  286. package/src/ui/modal.tsx +211 -0
  287. package/src/ui/navigation.tsx +86 -0
  288. package/src/ui/pagination.tsx +129 -0
  289. package/src/ui/panel.tsx +146 -0
  290. package/src/ui/popover.tsx +112 -0
  291. package/src/ui/radio-group.tsx +63 -0
  292. package/src/ui/resizable.tsx +52 -0
  293. package/src/ui/select.tsx +365 -0
  294. package/src/ui/separator.tsx +26 -0
  295. package/src/ui/sheet.tsx +257 -0
  296. package/src/ui/sidebar.tsx +695 -0
  297. package/src/ui/simple-tree-view.tsx +604 -0
  298. package/src/ui/skeleton.tsx +15 -0
  299. package/src/ui/slider.tsx +204 -0
  300. package/src/ui/switch.tsx +45 -0
  301. package/src/ui/table.tsx +99 -0
  302. package/src/ui/tabs.tsx +192 -0
  303. package/src/ui/textarea.tsx +55 -0
  304. package/src/ui/theme/ThemeProvider.tsx +319 -0
  305. package/src/ui/theme/ThemeToggles.tsx +84 -0
  306. package/src/ui/theme/index.ts +21 -0
  307. package/src/ui/theme/themeScript.tsx +179 -0
  308. package/src/ui/theme/types.ts +61 -0
  309. package/src/ui/toast.tsx +30 -0
  310. package/src/ui/toggle-buttons.tsx +290 -0
  311. package/src/ui/toggle-group.tsx +236 -0
  312. package/src/ui/toggle.tsx +94 -0
  313. package/src/ui/toolbar.tsx +54 -0
  314. package/src/ui/tooltip.tsx +171 -0
  315. package/src/ui/tree-view/TreeSearchBar.tsx +88 -0
  316. package/src/ui/tree-view/TreeView.tsx +232 -0
  317. package/src/ui/tree-view/hooks.tsx +289 -0
  318. package/src/ui/tree-view/index.ts +4 -0
  319. package/src/ui/tree-view/types.ts +23 -0
  320. package/src/ui/tree-view-legacy.tsx +644 -0
  321. package/src/ui/version-badge.tsx +0 -0
  322. package/src/ui/waterfall/CursorOverlay.tsx +96 -0
  323. package/src/ui/waterfall/NavigationControls.tsx +42 -0
  324. package/src/ui/waterfall/Tick.tsx +51 -0
  325. package/src/ui/waterfall/TimeRuleEventDot.tsx +19 -0
  326. package/src/ui/waterfall/TimelineEvent.tsx +60 -0
  327. package/src/ui/waterfall/TimelineProcessBar.tsx +207 -0
  328. package/src/ui/waterfall/Wedges.tsx +67 -0
  329. package/src/ui/waterfall/WheelZoomContext.tsx +128 -0
  330. package/src/ui/waterfall/hooks/useTimelineState.tsx +134 -0
  331. package/src/ui/waterfall/hooks/useViewport.tsx +293 -0
  332. package/src/ui/waterfall/index.tsx +326 -0
  333. package/src/ui/waterfall/types.ts +20 -0
  334. package/src/ui/waterfall/utils.ts +91 -0
  335. package/dist/chunk-W2YAQV5N.mjs +0 -57
  336. package/dist/{chunk-QLCEHV4Q.mjs → chunk-2OZK5DY5.mjs} +2 -2
  337. package/dist/{chunk-Z35DNFRZ.cjs → chunk-7IS37C3P.cjs} +2 -2
  338. package/dist/{chunk-4AOAH77D.mjs → chunk-A2PCEL5S.mjs} +2 -2
  339. package/dist/{chunk-K4VD5PPY.mjs → chunk-BIUDC66P.mjs} +1 -1
  340. package/dist/{chunk-RKJR6RZU.cjs → chunk-OYNLQTHW.cjs} +1 -1
  341. package/dist/{chunk-VE3XLQLO.cjs → chunk-QUFZWF4E.cjs} +2 -2
@@ -0,0 +1,43 @@
1
+ import { Slot } from "@radix-ui/react-slot";
2
+ import { PropsWithChildren, ReactElement } from "react";
3
+
4
+ import { cn } from "../hooks";
5
+
6
+ export interface FormLayoutProps extends PropsWithChildren {
7
+ align?: "start" | "center" | "end" | "baseline";
8
+ asChild?: boolean;
9
+ className?: string;
10
+ orientation?: "label-left" | "label-top";
11
+ children: [ReactElement, ReactElement];
12
+ }
13
+
14
+ /**
15
+ * Convenience layout wrapper for demos and description/content pairs.
16
+ */
17
+ export function FormLayout({
18
+ asChild,
19
+ className,
20
+ align = "center",
21
+ orientation = "label-top",
22
+ children,
23
+ }: FormLayoutProps) {
24
+ const Com = asChild ? Slot : "div";
25
+
26
+ return (
27
+ <Com
28
+ className={cn(
29
+ {
30
+ "items-baseline": align === "baseline",
31
+ "items-center": align === "center",
32
+ "items-start": align === "start",
33
+ "items-end": align === "end",
34
+ "gap-xs flex flex-col items-stretch": orientation === "label-top",
35
+ "gap-xs grid grid-cols-[1fr_2fr] text-center": orientation === "label-left",
36
+ },
37
+ className,
38
+ )}
39
+ >
40
+ {children}
41
+ </Com>
42
+ );
43
+ }
@@ -0,0 +1,128 @@
1
+ import { type ReactNode, useEffect, useRef, useState } from "react";
2
+
3
+ import {
4
+ DockLayout,
5
+ DockLayoutBottom,
6
+ DockLayoutContent,
7
+ DockLayoutLeft,
8
+ DockLayoutRight,
9
+ DockLayoutTop,
10
+ } from "./LayoutSlots";
11
+
12
+ interface DockLayoutViewProps {
13
+ left?: ReactNode;
14
+ right?: ReactNode;
15
+ top?: ReactNode;
16
+ bottom?: ReactNode;
17
+ children?: ReactNode;
18
+ className?: string;
19
+ leftClassName?: string;
20
+ rightClassName?: string;
21
+ topClassName?: string;
22
+ bottomClassName?: string;
23
+ contentClassName?: string;
24
+ }
25
+
26
+ export const DockLayoutView = ({
27
+ left,
28
+ right,
29
+ top,
30
+ bottom,
31
+ children,
32
+ className,
33
+ leftClassName,
34
+ rightClassName,
35
+ topClassName,
36
+ bottomClassName,
37
+ contentClassName,
38
+ }: DockLayoutViewProps) => {
39
+ const containerRef = useRef<HTMLDivElement>(null);
40
+ const leftRef = useRef<HTMLDivElement>(null);
41
+ const rightRef = useRef<HTMLDivElement>(null);
42
+ const bottomRef = useRef<HTMLDivElement>(null);
43
+ const measureRef = useRef<HTMLDivElement>(null);
44
+ const [isBottomFullWidth, setIsBottomFullWidth] = useState(false);
45
+
46
+ useEffect(() => {
47
+ const checkBottomWidth = () => {
48
+ if (!containerRef.current || !bottom || !measureRef.current) return;
49
+
50
+ const containerWidth = containerRef.current.offsetWidth;
51
+ const leftWidth = leftRef.current?.offsetWidth || 0;
52
+ const rightWidth = rightRef.current?.offsetWidth || 0;
53
+ const availableWidth = containerWidth - leftWidth - rightWidth;
54
+
55
+ const bottomActualWidth = measureRef.current.scrollWidth;
56
+
57
+ setIsBottomFullWidth(bottomActualWidth > 0 && availableWidth < bottomActualWidth);
58
+ };
59
+
60
+ const resizeObserver = new ResizeObserver(checkBottomWidth);
61
+
62
+ if (containerRef.current) {
63
+ resizeObserver.observe(containerRef.current);
64
+ }
65
+ if (leftRef.current) {
66
+ resizeObserver.observe(leftRef.current);
67
+ }
68
+ if (rightRef.current) {
69
+ resizeObserver.observe(rightRef.current);
70
+ }
71
+ if (measureRef.current) {
72
+ resizeObserver.observe(measureRef.current);
73
+ checkBottomWidth();
74
+ }
75
+
76
+ return () => {
77
+ resizeObserver.disconnect();
78
+ };
79
+ }, [bottom, left, right]);
80
+
81
+ return (
82
+ <DockLayout ref={containerRef} className={className}>
83
+ {bottom && (
84
+ <div
85
+ ref={measureRef}
86
+ className="pointer-events-none absolute -top-[9999px] left-0 opacity-0"
87
+ style={{ width: "max-content" }}
88
+ >
89
+ <DockLayoutBottom className={bottomClassName}>{bottom}</DockLayoutBottom>
90
+ </div>
91
+ )}
92
+
93
+ {top && <DockLayoutTop className={topClassName}>{top}</DockLayoutTop>}
94
+
95
+ <div className="flex flex-1 overflow-hidden">
96
+ {left && (
97
+ <div ref={leftRef}>
98
+ <DockLayoutLeft className={leftClassName}>{left}</DockLayoutLeft>
99
+ </div>
100
+ )}
101
+
102
+ <div className="flex flex-1 flex-col overflow-hidden">
103
+ <DockLayoutContent className={contentClassName}>{children}</DockLayoutContent>
104
+
105
+ {bottom && !isBottomFullWidth && (
106
+ <div className="flex justify-center">
107
+ <DockLayoutBottom ref={bottomRef} className={bottomClassName}>
108
+ {bottom}
109
+ </DockLayoutBottom>
110
+ </div>
111
+ )}
112
+ </div>
113
+
114
+ {right && (
115
+ <div ref={rightRef}>
116
+ <DockLayoutRight className={rightClassName}>{right}</DockLayoutRight>
117
+ </div>
118
+ )}
119
+ </div>
120
+
121
+ {bottom && isBottomFullWidth && (
122
+ <DockLayoutBottom ref={bottomRef} className={bottomClassName}>
123
+ {bottom}
124
+ </DockLayoutBottom>
125
+ )}
126
+ </DockLayout>
127
+ );
128
+ };
@@ -0,0 +1,85 @@
1
+ import { Slot } from "@radix-ui/react-slot";
2
+ import type { ComponentProps } from "react";
3
+ import { forwardRef } from "react";
4
+
5
+ import { cn } from "../../../hooks";
6
+
7
+ export const DockLayout = forwardRef<HTMLDivElement, ComponentProps<"div">>(
8
+ ({ className, ...props }, ref) => {
9
+ return (
10
+ <div
11
+ ref={ref}
12
+ {...props}
13
+ className={cn("relative flex h-full w-full flex-col overflow-hidden", className)}
14
+ />
15
+ );
16
+ },
17
+ );
18
+
19
+ DockLayout.displayName = "DockLayout";
20
+
21
+ interface DockLayoutChildProps extends ComponentProps<"div"> {
22
+ asChild?: boolean;
23
+ }
24
+
25
+ export function DockLayoutContent({ className, ...props }: Readonly<ComponentProps<"div">>) {
26
+ return (
27
+ <div
28
+ {...props}
29
+ className={cn(
30
+ "relative flex flex-1 flex-col items-center justify-center overflow-auto",
31
+ className,
32
+ )}
33
+ />
34
+ );
35
+ }
36
+
37
+ export function DockLayoutLeft({ className, asChild, ...props }: Readonly<DockLayoutChildProps>) {
38
+ const Comp = asChild ? Slot : "div";
39
+ return (
40
+ <Comp
41
+ {...props}
42
+ className={cn(
43
+ "bg-bg-primary flex h-full flex-shrink-0 flex-col items-start gap-4",
44
+ className,
45
+ )}
46
+ />
47
+ );
48
+ }
49
+
50
+ export function DockLayoutTop({ className, ...props }: Readonly<ComponentProps<"div">>) {
51
+ return (
52
+ <div
53
+ {...props}
54
+ className={cn(
55
+ "absolute top-4 left-1/2 z-20 flex -translate-x-1/2 transform items-start justify-center",
56
+ className,
57
+ )}
58
+ />
59
+ );
60
+ }
61
+
62
+ export function DockLayoutRight({ className, asChild, ...props }: Readonly<DockLayoutChildProps>) {
63
+ const Comp = asChild ? Slot : "div";
64
+ return (
65
+ <Comp
66
+ {...props}
67
+ className={cn("bg-bg-primary flex h-full flex-shrink-0 flex-col items-end gap-4", className)}
68
+ />
69
+ );
70
+ }
71
+
72
+ export const DockLayoutBottom = forwardRef<HTMLDivElement, DockLayoutChildProps>(
73
+ ({ className, asChild, ...props }, ref) => {
74
+ const Comp = asChild ? Slot : "div";
75
+ return (
76
+ <Comp
77
+ ref={ref}
78
+ {...props}
79
+ className={cn("bg-bg-primary inline-flex w-full flex-shrink-0 justify-center", className)}
80
+ />
81
+ );
82
+ },
83
+ );
84
+
85
+ DockLayoutBottom.displayName = "DockLayoutBottom";
@@ -0,0 +1,2 @@
1
+ export * from "./LayoutSlots";
2
+ export * from "./DockLayoutView";
@@ -0,0 +1,2 @@
1
+ export * from "./dock-layout";
2
+ export * from "./liquid-layout";
@@ -0,0 +1,82 @@
1
+ import { Slot } from "@radix-ui/react-slot";
2
+ import type { ComponentProps } from "react";
3
+
4
+ import { cn } from "../../../hooks";
5
+
6
+ export function LiquidLayout({ className, ...props }: Readonly<ComponentProps<"div">>) {
7
+ return (
8
+ <div
9
+ {...props}
10
+ className={cn(
11
+ "pointer-events-none relative z-1 grid h-full w-full grid-cols-3 grid-rows-[1fr_auto] flex-col justify-between overflow-hidden p-4",
12
+ className,
13
+ )}
14
+ />
15
+ );
16
+ }
17
+
18
+ interface LiquidLayoutChildProps extends ComponentProps<"div"> {
19
+ asChild?: boolean;
20
+ }
21
+
22
+ export function LiquidLayoutContent({ className, ...props }: Readonly<ComponentProps<"div">>) {
23
+ return <div {...props} className={cn("pointer-events-auto absolute inset-0 -z-1", className)} />;
24
+ }
25
+
26
+ export function LiquidLayoutLeft({ className, ...props }: Readonly<ComponentProps<"div">>) {
27
+ return (
28
+ <div
29
+ {...props}
30
+ className={cn(
31
+ "order-2 col-start-1 flex flex-col items-start gap-4 [&>*]:pointer-events-auto",
32
+ className,
33
+ )}
34
+ />
35
+ );
36
+ }
37
+
38
+ export function LiquidLayoutTop({ className, ...props }: Readonly<ComponentProps<"div">>) {
39
+ return (
40
+ <div
41
+ {...props}
42
+ className={cn(
43
+ "order-3 col-start-2 flex items-start justify-center [&>*]:pointer-events-auto",
44
+ className,
45
+ )}
46
+ />
47
+ );
48
+ }
49
+
50
+ export function LiquidLayoutRight({
51
+ className,
52
+ asChild,
53
+ ...props
54
+ }: Readonly<LiquidLayoutChildProps>) {
55
+ const Comp = asChild ? Slot : "div";
56
+ return (
57
+ <Comp
58
+ {...props}
59
+ className={cn(
60
+ "order-4 col-start-3 flex flex-col items-end gap-4 [&>*]:pointer-events-auto",
61
+ className,
62
+ )}
63
+ />
64
+ );
65
+ }
66
+
67
+ export function LiquidLayoutBottom({
68
+ className,
69
+ asChild,
70
+ ...props
71
+ }: Readonly<LiquidLayoutChildProps>) {
72
+ const Comp = asChild ? Slot : "div";
73
+ return (
74
+ <Comp
75
+ {...props}
76
+ className={cn(
77
+ "order-5 col-span-3 col-start-1 flex justify-center [&>*]:pointer-events-auto",
78
+ className,
79
+ )}
80
+ />
81
+ );
82
+ }
@@ -0,0 +1,76 @@
1
+ import { type ReactNode } from "react";
2
+
3
+ import {
4
+ LiquidLayout,
5
+ LiquidLayoutBottom,
6
+ LiquidLayoutContent,
7
+ LiquidLayoutLeft,
8
+ LiquidLayoutRight,
9
+ LiquidLayoutTop,
10
+ } from "./LayoutSlots";
11
+ import { cn } from "../../../hooks";
12
+
13
+ /**
14
+ * Props for the LiquidLayoutView component
15
+ */
16
+ interface LiquidLayoutViewProps {
17
+ /** Content to display in the left slot */
18
+ left?: ReactNode;
19
+ /** Content to display in the right slot */
20
+ right?: ReactNode;
21
+ /** Content to display in the top slot */
22
+ top?: ReactNode;
23
+ /** Content to display in the bottom slot */
24
+ bottom?: ReactNode;
25
+ /** Main content to display in the center */
26
+ children?: ReactNode;
27
+ /** Additional CSS classes to apply to the root element */
28
+ className?: string;
29
+ /** CSS classes to apply to the left slot */
30
+ leftClassName?: string;
31
+ /** CSS classes to apply to the right slot */
32
+ rightClassName?: string;
33
+ /** CSS classes to apply to the top slot */
34
+ topClassName?: string;
35
+ /** CSS classes to apply to the bottom slot */
36
+ bottomClassName?: string;
37
+ /** CSS classes to apply to the content slot */
38
+ contentClassName?: string;
39
+ }
40
+
41
+ /**
42
+ * A flexible liquid layout component with slots for left, right, top, bottom, and center content.
43
+ * The layout adapts to different content and screen sizes while maintaining proper positioning.
44
+ *
45
+ * @param props - The component props
46
+ * @returns A liquid layout with positioned content slots
47
+ */
48
+ export const LiquidLayoutView = ({
49
+ left,
50
+ right,
51
+ top,
52
+ bottom,
53
+ children,
54
+ className,
55
+ leftClassName,
56
+ rightClassName,
57
+ topClassName,
58
+ bottomClassName,
59
+ contentClassName,
60
+ }: LiquidLayoutViewProps) => {
61
+ return (
62
+ <LiquidLayout className={className}>
63
+ <LiquidLayoutContent
64
+ className={cn("absolute flex flex-col items-center justify-center", contentClassName)}
65
+ >
66
+ {children}
67
+ </LiquidLayoutContent>
68
+ {bottom && (
69
+ <LiquidLayoutBottom className={cn("mt-4", bottomClassName)}>{bottom}</LiquidLayoutBottom>
70
+ )}
71
+ {right && <LiquidLayoutRight className={rightClassName}>{right}</LiquidLayoutRight>}
72
+ {left && <LiquidLayoutLeft className={leftClassName}>{left}</LiquidLayoutLeft>}
73
+ {top && <LiquidLayoutTop className={topClassName}>{top}</LiquidLayoutTop>}
74
+ </LiquidLayout>
75
+ );
76
+ };
@@ -0,0 +1 @@
1
+ export * from "./LiquidLayoutView";
@@ -0,0 +1,211 @@
1
+ import * as DialogPrimitive from "@radix-ui/react-dialog";
2
+ import { cva } from "class-variance-authority";
3
+ import { XIcon } from "lucide-react";
4
+ import { type ComponentProps } from "react";
5
+
6
+ import { cn } from "../hooks";
7
+
8
+ type ModalProps = ComponentProps<typeof DialogPrimitive.Root>;
9
+
10
+ /**
11
+ * Modal root based on Radix Dialog.
12
+ */
13
+ function Modal({ ...props }: ModalProps) {
14
+ return <DialogPrimitive.Root data-slot="modal" {...props} />;
15
+ }
16
+
17
+ type ModalTriggerProps = ComponentProps<typeof DialogPrimitive.Trigger>;
18
+
19
+ /** Trigger element that opens the modal. */
20
+ function ModalTrigger({ ...props }: ModalTriggerProps) {
21
+ return <DialogPrimitive.Trigger data-slot="modal-trigger" {...props} />;
22
+ }
23
+
24
+ type ModalPortalProps = ComponentProps<typeof DialogPrimitive.Portal>;
25
+
26
+ /** Portal for modal content/overlay. */
27
+ function ModalPortal({ ...props }: ModalPortalProps) {
28
+ return <DialogPrimitive.Portal data-slot="modal-portal" {...props} />;
29
+ }
30
+
31
+ type ModalCloseProps = ComponentProps<typeof DialogPrimitive.Close>;
32
+
33
+ /** Close control for the modal. */
34
+ function ModalClose({ ...props }: ModalCloseProps) {
35
+ return <DialogPrimitive.Close data-slot="modal-close" {...props} />;
36
+ }
37
+
38
+ const modalOverlayVariants = cva([
39
+ "fixed",
40
+ "inset-0",
41
+ "z-10",
42
+ "bg-bg-mask",
43
+ "transition-all",
44
+ "duration-200",
45
+ ]);
46
+
47
+ type ModalOverlayProps = ComponentProps<typeof DialogPrimitive.Overlay>;
48
+
49
+ /** Fullscreen overlay displayed behind the modal. */
50
+ function ModalOverlay({ className, ...props }: ModalOverlayProps) {
51
+ return (
52
+ <DialogPrimitive.Overlay
53
+ data-slot="modal-overlay"
54
+ className={cn(modalOverlayVariants(), className)}
55
+ {...props}
56
+ />
57
+ );
58
+ }
59
+
60
+ const modalContentVariants = cva([
61
+ "pb-xl",
62
+ "px-xl",
63
+ "bg-bg-primary",
64
+ "rounded-uk-xl",
65
+ "shadow-[0_4px_16px_0_var(--color-shadow-secondary)]",
66
+ "duration-200",
67
+ "transition-all",
68
+ "fixed",
69
+ "translate-x-[-50%]",
70
+ "translate-y-[-50%]",
71
+ "z-11",
72
+ "left-1/2",
73
+ "top-1/2",
74
+ "data-[state=open]:animate-in",
75
+ "data-[state=closed]:animate-out",
76
+ "data-[state=closed]:fade-out-0",
77
+ "data-[state=open]:fade-in-0",
78
+ "data-[state=closed]:zoom-out-95",
79
+ "data-[state=open]:zoom-in-95",
80
+ "liquid:liquid-bg",
81
+ ]);
82
+
83
+ interface ModalContentProps extends ComponentProps<typeof DialogPrimitive.Content> {
84
+ showCloseButton?: boolean;
85
+ }
86
+
87
+ /**
88
+ * Modal content panel with optional close button.
89
+ */
90
+ function ModalContent({
91
+ className,
92
+ children,
93
+ showCloseButton = true,
94
+ ...props
95
+ }: ModalContentProps) {
96
+ return (
97
+ <ModalPortal>
98
+ <ModalOverlay />
99
+ <DialogPrimitive.Content
100
+ data-slot="modal-content"
101
+ className={cn(modalContentVariants(), className)}
102
+ {...props}
103
+ >
104
+ {children}
105
+ {showCloseButton && (
106
+ <DialogPrimitive.Close
107
+ data-slot="modal-close"
108
+ className={cn(
109
+ "absolute",
110
+ "right-[16px]",
111
+ "top-[16px]",
112
+ "w-[16px]",
113
+ "h-[16px]",
114
+ "rounded-uk-sm",
115
+ "cursor-pointer",
116
+ "hover:text-icon-highlight",
117
+ "text-icon-primary",
118
+ "flex",
119
+ "items-center",
120
+ "justify-center",
121
+ )}
122
+ >
123
+ <XIcon />
124
+ <span className="sr-only">Close</span>
125
+ </DialogPrimitive.Close>
126
+ )}
127
+ </DialogPrimitive.Content>
128
+ </ModalPortal>
129
+ );
130
+ }
131
+
132
+ type ModalHeaderProps = ComponentProps<"div">;
133
+
134
+ /** Header container inside modal. */
135
+ function ModalHeader({ className, ...props }: ModalHeaderProps) {
136
+ return <div data-slot="modal-header" className={cn("flex flex-col", className)} {...props} />;
137
+ }
138
+
139
+ type ModalTitleProps = ComponentProps<typeof DialogPrimitive.Title>;
140
+
141
+ /** Title element for the modal. */
142
+ function ModalTitle({ className, ...props }: ModalTitleProps) {
143
+ return (
144
+ <DialogPrimitive.Title
145
+ data-slot="modal-title"
146
+ className={cn(
147
+ "text-text-highlight",
148
+ "text-uk-lg",
149
+ "leading-uk-lg",
150
+ "font-medium",
151
+ "py-lg",
152
+ "px-xl",
153
+ "text-center",
154
+ className,
155
+ )}
156
+ {...props}
157
+ />
158
+ );
159
+ }
160
+
161
+ type ModalDescriptionProps = ComponentProps<typeof DialogPrimitive.Description>;
162
+
163
+ /** Secondary descriptive text within the modal. */
164
+ function ModalDescription({ className, ...props }: ModalDescriptionProps) {
165
+ return (
166
+ <DialogPrimitive.Description
167
+ data-slot="modal-description"
168
+ className={cn("text-text-primary", "text-uk-md", "leading-uk-md", "text-start", className)}
169
+ {...props}
170
+ />
171
+ );
172
+ }
173
+
174
+ type ModalFooterProps = ComponentProps<"div">;
175
+
176
+ /** Footer row aligning actions to the end. */
177
+ function ModalFooter({ className, ...props }: ModalFooterProps) {
178
+ return (
179
+ <div
180
+ data-slot="modal-footer"
181
+ className={cn("w-full", "flex", "justify-end", "gap-xs", className)}
182
+ {...props}
183
+ />
184
+ );
185
+ }
186
+
187
+ export {
188
+ Modal,
189
+ ModalTrigger,
190
+ ModalPortal,
191
+ ModalOverlay,
192
+ ModalContent,
193
+ ModalHeader,
194
+ ModalTitle,
195
+ ModalDescription,
196
+ ModalFooter,
197
+ ModalClose,
198
+ };
199
+
200
+ export type {
201
+ ModalProps,
202
+ ModalTriggerProps,
203
+ ModalPortalProps,
204
+ ModalOverlayProps,
205
+ ModalContentProps,
206
+ ModalHeaderProps,
207
+ ModalTitleProps,
208
+ ModalDescriptionProps,
209
+ ModalFooterProps,
210
+ ModalCloseProps,
211
+ };