@bloomneo/uikit 1.5.0

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 (678) hide show
  1. package/CHANGELOG.md +222 -0
  2. package/LICENSE +21 -0
  3. package/README.md +513 -0
  4. package/bin/commands/build.js +232 -0
  5. package/bin/commands/bundle.js +587 -0
  6. package/bin/commands/create.js +768 -0
  7. package/bin/commands/deploy.js +533 -0
  8. package/bin/commands/generate.js +673 -0
  9. package/bin/commands/optimize.js +198 -0
  10. package/bin/commands/prerender.js +306 -0
  11. package/bin/commands/serve.js +216 -0
  12. package/bin/templates/fbca/README.md.template +130 -0
  13. package/bin/templates/fbca/docs/QUICKSTART_FBCA.md +368 -0
  14. package/bin/templates/fbca/docs/UIKIT_CLI_GUIDE.md +574 -0
  15. package/bin/templates/fbca/docs/UIKIT_COMPOSITE_UI_SYSTEM.md +649 -0
  16. package/bin/templates/fbca/docs/UIKIT_LLM_GUIDE.md +2055 -0
  17. package/bin/templates/fbca/docs/UIKIT_THEME_GUIDE.md +359 -0
  18. package/bin/templates/fbca/package.json.template +41 -0
  19. package/bin/templates/fbca/public/favicon.svg +10 -0
  20. package/bin/templates/fbca/public/hero_fbca.svg +1 -0
  21. package/bin/templates/fbca/src/utils/asset.ts +6 -0
  22. package/bin/templates/fbca/src/web/App.tsx.template +20 -0
  23. package/bin/templates/fbca/src/web/features/auth/pages/index.tsx.template +157 -0
  24. package/bin/templates/fbca/src/web/features/docs/pages/[...slug].tsx.template +83 -0
  25. package/bin/templates/fbca/src/web/features/gallery/hooks/useGallery.ts.template +74 -0
  26. package/bin/templates/fbca/src/web/features/gallery/pages/index.tsx.template +136 -0
  27. package/bin/templates/fbca/src/web/features/main/components/CTASection.tsx.template +43 -0
  28. package/bin/templates/fbca/src/web/features/main/pages/About.tsx.template +374 -0
  29. package/bin/templates/fbca/src/web/features/main/pages/index.tsx.template +214 -0
  30. package/bin/templates/fbca/src/web/index.html.template +15 -0
  31. package/bin/templates/fbca/src/web/lib/page-router.tsx.template +134 -0
  32. package/bin/templates/fbca/src/web/main.tsx.template +14 -0
  33. package/bin/templates/fbca/src/web/shared/components/Footer.tsx.template +57 -0
  34. package/bin/templates/fbca/src/web/shared/components/Header.tsx.template +91 -0
  35. package/bin/templates/fbca/src/web/shared/components/SEO.tsx.template +24 -0
  36. package/bin/templates/fbca/src/web/shared/components/index.ts.template +3 -0
  37. package/bin/templates/fbca/src/web/shared/hooks/useSEO.ts.template +85 -0
  38. package/bin/templates/fbca/src/web/shared/utils/asset.ts +6 -0
  39. package/bin/templates/fbca/src/web/styles/index.css.template +8 -0
  40. package/bin/templates/fbca/src/web/utils/asset.ts +6 -0
  41. package/bin/templates/fbca/tsconfig.json.template +32 -0
  42. package/bin/templates/fbca/tsconfig.node.json.template +10 -0
  43. package/bin/templates/fbca/vite.config.ts.template +38 -0
  44. package/bin/templates/generate/component/component.tsx.template +79 -0
  45. package/bin/templates/generate/component/index.ts.template +2 -0
  46. package/bin/templates/generate/component/types.ts.template +58 -0
  47. package/bin/templates/generate/feature/index.ts.template +14 -0
  48. package/bin/templates/generate/feature/list-page.tsx.template +34 -0
  49. package/bin/templates/generate/feature/main-component.tsx.template +37 -0
  50. package/bin/templates/generate/feature/main-page.tsx.template +30 -0
  51. package/bin/templates/generate/feature/types.ts.template +34 -0
  52. package/bin/templates/generate/hook/hook.ts.template +35 -0
  53. package/bin/templates/generate/index.css.template +10 -0
  54. package/bin/templates/generate/main.tsx.template +10 -0
  55. package/bin/templates/generate/page/index.ts.template +2 -0
  56. package/bin/templates/generate/page/page.tsx.template +86 -0
  57. package/bin/templates/generate/theme/README.md +31 -0
  58. package/bin/templates/generate/theme/theme.js.template +155 -0
  59. package/bin/templates/multi/README.md.template +120 -0
  60. package/bin/templates/multi/docs/QUICKSTART_MULTI.md +334 -0
  61. package/bin/templates/multi/docs/UIKIT_CLI_GUIDE.md +574 -0
  62. package/bin/templates/multi/docs/UIKIT_COMPOSITE_UI_SYSTEM.md +649 -0
  63. package/bin/templates/multi/docs/UIKIT_LLM_GUIDE.md +2055 -0
  64. package/bin/templates/multi/docs/UIKIT_THEME_GUIDE.md +359 -0
  65. package/bin/templates/multi/index.html.template +58 -0
  66. package/bin/templates/multi/package.json.template +35 -0
  67. package/bin/templates/multi/public/favicon.svg +10 -0
  68. package/bin/templates/multi/public/hero_multi.svg +1 -0
  69. package/bin/templates/multi/src/App.tsx.template +92 -0
  70. package/bin/templates/multi/src/components/Footer.tsx.template +58 -0
  71. package/bin/templates/multi/src/components/Header.tsx.template +103 -0
  72. package/bin/templates/multi/src/components/SEO.tsx.template +19 -0
  73. package/bin/templates/multi/src/components/index.ts.template +3 -0
  74. package/bin/templates/multi/src/hooks/useSEO.ts.template +38 -0
  75. package/bin/templates/multi/src/index.css.template +7 -0
  76. package/bin/templates/multi/src/main.tsx.template +14 -0
  77. package/bin/templates/multi/src/pages/About.tsx.template +276 -0
  78. package/bin/templates/multi/src/pages/Components.tsx.template +288 -0
  79. package/bin/templates/multi/src/pages/Contact.tsx.template +348 -0
  80. package/bin/templates/multi/src/pages/Dashboard.tsx.template +306 -0
  81. package/bin/templates/multi/src/pages/ErrorPage.tsx.template +37 -0
  82. package/bin/templates/multi/src/pages/Home.tsx.template +201 -0
  83. package/bin/templates/multi/src/pages/Login.tsx.template +148 -0
  84. package/bin/templates/multi/src/pages/Themes.tsx.template +207 -0
  85. package/bin/templates/multi/src/router.tsx.template +34 -0
  86. package/bin/templates/multi/src/utils/asset.ts +6 -0
  87. package/bin/templates/multi/tsconfig.json.template +30 -0
  88. package/bin/templates/multi/tsconfig.node.json +22 -0
  89. package/bin/templates/multi/vite.config.ts.template +36 -0
  90. package/bin/templates/single/README.md.template +131 -0
  91. package/bin/templates/single/docs/QUICKSTART_SINGLE.md +259 -0
  92. package/bin/templates/single/docs/UIKIT_CLI_GUIDE.md +574 -0
  93. package/bin/templates/single/docs/UIKIT_COMPOSITE_UI_SYSTEM.md +649 -0
  94. package/bin/templates/single/docs/UIKIT_LLM_GUIDE.md +2055 -0
  95. package/bin/templates/single/docs/UIKIT_THEME_GUIDE.md +359 -0
  96. package/bin/templates/single/index.html.template +37 -0
  97. package/bin/templates/single/package.json.template +34 -0
  98. package/bin/templates/single/public/favicon.svg +10 -0
  99. package/bin/templates/single/public/hero.svg +1 -0
  100. package/bin/templates/single/src/App.tsx.template +233 -0
  101. package/bin/templates/single/src/index.css.template +7 -0
  102. package/bin/templates/single/src/main.tsx.template +14 -0
  103. package/bin/templates/single/src/styles/fonts.css +99 -0
  104. package/bin/templates/single/src/utils/asset.ts +6 -0
  105. package/bin/templates/single/tsconfig.json +31 -0
  106. package/bin/templates/single/tsconfig.node.json +22 -0
  107. package/bin/templates/single/vite.config.ts.template +36 -0
  108. package/bin/templates/spa/README.md.template +105 -0
  109. package/bin/templates/spa/components/SEO.tsx.template +19 -0
  110. package/bin/templates/spa/docs/QUICKSTART_SPA.md +300 -0
  111. package/bin/templates/spa/docs/UIKIT_CLI_GUIDE.md +574 -0
  112. package/bin/templates/spa/docs/UIKIT_COMPOSITE_UI_SYSTEM.md +649 -0
  113. package/bin/templates/spa/docs/UIKIT_LLM_GUIDE.md +2055 -0
  114. package/bin/templates/spa/docs/UIKIT_THEME_GUIDE.md +359 -0
  115. package/bin/templates/spa/hooks/useSEO.ts.template +38 -0
  116. package/bin/templates/spa/index.html.template +58 -0
  117. package/bin/templates/spa/package.json.template +35 -0
  118. package/bin/templates/spa/public/favicon.svg +15 -0
  119. package/bin/templates/spa/public/hero_spa.svg +1 -0
  120. package/bin/templates/spa/src/App.tsx.template +659 -0
  121. package/bin/templates/spa/src/index.css.template +7 -0
  122. package/bin/templates/spa/src/main.tsx.template +14 -0
  123. package/bin/templates/spa/src/utils/asset.ts +6 -0
  124. package/bin/templates/spa/tsconfig.json.template +30 -0
  125. package/bin/templates/spa/tsconfig.node.json +22 -0
  126. package/bin/templates/spa/vite.config.ts.template +36 -0
  127. package/bin/uikit.js +133 -0
  128. package/cookbook/README.md +20 -0
  129. package/cookbook/crud-page.tsx +99 -0
  130. package/cookbook/dashboard.tsx +89 -0
  131. package/cookbook/delete-flow.tsx +59 -0
  132. package/cookbook/login.tsx +85 -0
  133. package/cookbook/settings.tsx +113 -0
  134. package/dist/Combination-C0DFrmJW.js +674 -0
  135. package/dist/Combination-C0DFrmJW.js.map +1 -0
  136. package/dist/accordion.js +284 -0
  137. package/dist/accordion.js.map +1 -0
  138. package/dist/admin.js +429 -0
  139. package/dist/admin.js.map +1 -0
  140. package/dist/alert.js +67 -0
  141. package/dist/alert.js.map +1 -0
  142. package/dist/auth.js +178 -0
  143. package/dist/auth.js.map +1 -0
  144. package/dist/avatar.js +249 -0
  145. package/dist/avatar.js.map +1 -0
  146. package/dist/badge.js +40 -0
  147. package/dist/badge.js.map +1 -0
  148. package/dist/blank.js +80 -0
  149. package/dist/blank.js.map +1 -0
  150. package/dist/breadcrumb.js +104 -0
  151. package/dist/breadcrumb.js.map +1 -0
  152. package/dist/button.js +50 -0
  153. package/dist/button.js.map +1 -0
  154. package/dist/calendar.js +2785 -0
  155. package/dist/calendar.js.map +1 -0
  156. package/dist/card.js +91 -0
  157. package/dist/card.js.map +1 -0
  158. package/dist/check-DXouwtzp.js +12 -0
  159. package/dist/check-DXouwtzp.js.map +1 -0
  160. package/dist/checkbox.js +268 -0
  161. package/dist/checkbox.js.map +1 -0
  162. package/dist/chevron-down-BORJtX8F.js +14 -0
  163. package/dist/chevron-down-BORJtX8F.js.map +1 -0
  164. package/dist/chevron-left-C1pkx4AF.js +14 -0
  165. package/dist/chevron-left-C1pkx4AF.js.map +1 -0
  166. package/dist/chevron-right-pz9eCjj-.js +14 -0
  167. package/dist/chevron-right-pz9eCjj-.js.map +1 -0
  168. package/dist/circle-DHOdTDQh.js +14 -0
  169. package/dist/circle-DHOdTDQh.js.map +1 -0
  170. package/dist/collapsible.js +35 -0
  171. package/dist/collapsible.js.map +1 -0
  172. package/dist/command.js +481 -0
  173. package/dist/command.js.map +1 -0
  174. package/dist/confirm-dialog.js +129 -0
  175. package/dist/confirm-dialog.js.map +1 -0
  176. package/dist/container.js +334 -0
  177. package/dist/container.js.map +1 -0
  178. package/dist/createLucideIcon-B45kRl5r.js +80 -0
  179. package/dist/createLucideIcon-B45kRl5r.js.map +1 -0
  180. package/dist/data-table.js +574 -0
  181. package/dist/data-table.js.map +1 -0
  182. package/dist/detail-page.js +454 -0
  183. package/dist/detail-page.js.map +1 -0
  184. package/dist/dialog.js +137 -0
  185. package/dist/dialog.js.map +1 -0
  186. package/dist/dropdown-menu.js +424 -0
  187. package/dist/dropdown-menu.js.map +1 -0
  188. package/dist/ellipsis-BhAoKPVk.js +16 -0
  189. package/dist/ellipsis-BhAoKPVk.js.map +1 -0
  190. package/dist/empty-state.js +54 -0
  191. package/dist/empty-state.js.map +1 -0
  192. package/dist/errors.js +36 -0
  193. package/dist/errors.js.map +1 -0
  194. package/dist/eye-DDKoW0KS.js +46 -0
  195. package/dist/eye-DDKoW0KS.js.map +1 -0
  196. package/dist/fonts/caveat-cyrillic-400-normal.woff +0 -0
  197. package/dist/fonts/caveat-cyrillic-400-normal.woff2 +0 -0
  198. package/dist/fonts/caveat-cyrillic-700-normal.woff +0 -0
  199. package/dist/fonts/caveat-cyrillic-700-normal.woff2 +0 -0
  200. package/dist/fonts/caveat-cyrillic-ext-400-normal.woff +0 -0
  201. package/dist/fonts/caveat-cyrillic-ext-400-normal.woff2 +0 -0
  202. package/dist/fonts/caveat-cyrillic-ext-700-normal.woff +0 -0
  203. package/dist/fonts/caveat-cyrillic-ext-700-normal.woff2 +0 -0
  204. package/dist/fonts/caveat-latin-400-normal.woff +0 -0
  205. package/dist/fonts/caveat-latin-400-normal.woff2 +0 -0
  206. package/dist/fonts/caveat-latin-700-normal.woff +0 -0
  207. package/dist/fonts/caveat-latin-700-normal.woff2 +0 -0
  208. package/dist/fonts/caveat-latin-ext-400-normal.woff +0 -0
  209. package/dist/fonts/caveat-latin-ext-400-normal.woff2 +0 -0
  210. package/dist/fonts/caveat-latin-ext-700-normal.woff +0 -0
  211. package/dist/fonts/caveat-latin-ext-700-normal.woff2 +0 -0
  212. package/dist/fonts/crimson-text-latin-400-normal.woff +0 -0
  213. package/dist/fonts/crimson-text-latin-400-normal.woff2 +0 -0
  214. package/dist/fonts/crimson-text-latin-600-normal.woff +0 -0
  215. package/dist/fonts/crimson-text-latin-600-normal.woff2 +0 -0
  216. package/dist/fonts/crimson-text-latin-700-normal.woff +0 -0
  217. package/dist/fonts/crimson-text-latin-700-normal.woff2 +0 -0
  218. package/dist/fonts/crimson-text-latin-ext-400-normal.woff +0 -0
  219. package/dist/fonts/crimson-text-latin-ext-400-normal.woff2 +0 -0
  220. package/dist/fonts/crimson-text-latin-ext-600-normal.woff +0 -0
  221. package/dist/fonts/crimson-text-latin-ext-600-normal.woff2 +0 -0
  222. package/dist/fonts/crimson-text-latin-ext-700-normal.woff +0 -0
  223. package/dist/fonts/crimson-text-latin-ext-700-normal.woff2 +0 -0
  224. package/dist/fonts/crimson-text-vietnamese-400-normal.woff +0 -0
  225. package/dist/fonts/crimson-text-vietnamese-400-normal.woff2 +0 -0
  226. package/dist/fonts/crimson-text-vietnamese-600-normal.woff +0 -0
  227. package/dist/fonts/crimson-text-vietnamese-600-normal.woff2 +0 -0
  228. package/dist/fonts/crimson-text-vietnamese-700-normal.woff +0 -0
  229. package/dist/fonts/crimson-text-vietnamese-700-normal.woff2 +0 -0
  230. package/dist/fonts/dm-serif-display-latin-400-normal.woff +0 -0
  231. package/dist/fonts/dm-serif-display-latin-400-normal.woff2 +0 -0
  232. package/dist/fonts/dm-serif-display-latin-ext-400-normal.woff +0 -0
  233. package/dist/fonts/dm-serif-display-latin-ext-400-normal.woff2 +0 -0
  234. package/dist/fonts/libre-baskerville-latin-400-normal.woff +0 -0
  235. package/dist/fonts/libre-baskerville-latin-400-normal.woff2 +0 -0
  236. package/dist/fonts/libre-baskerville-latin-700-normal.woff +0 -0
  237. package/dist/fonts/libre-baskerville-latin-700-normal.woff2 +0 -0
  238. package/dist/fonts/libre-baskerville-latin-ext-400-normal.woff +0 -0
  239. package/dist/fonts/libre-baskerville-latin-ext-400-normal.woff2 +0 -0
  240. package/dist/fonts/libre-baskerville-latin-ext-700-normal.woff +0 -0
  241. package/dist/fonts/libre-baskerville-latin-ext-700-normal.woff2 +0 -0
  242. package/dist/fonts/montserrat-cyrillic-400-normal.woff +0 -0
  243. package/dist/fonts/montserrat-cyrillic-400-normal.woff2 +0 -0
  244. package/dist/fonts/montserrat-cyrillic-500-normal.woff +0 -0
  245. package/dist/fonts/montserrat-cyrillic-500-normal.woff2 +0 -0
  246. package/dist/fonts/montserrat-cyrillic-600-normal.woff +0 -0
  247. package/dist/fonts/montserrat-cyrillic-600-normal.woff2 +0 -0
  248. package/dist/fonts/montserrat-cyrillic-ext-400-normal.woff +0 -0
  249. package/dist/fonts/montserrat-cyrillic-ext-400-normal.woff2 +0 -0
  250. package/dist/fonts/montserrat-cyrillic-ext-500-normal.woff +0 -0
  251. package/dist/fonts/montserrat-cyrillic-ext-500-normal.woff2 +0 -0
  252. package/dist/fonts/montserrat-cyrillic-ext-600-normal.woff +0 -0
  253. package/dist/fonts/montserrat-cyrillic-ext-600-normal.woff2 +0 -0
  254. package/dist/fonts/montserrat-latin-400-normal.woff +0 -0
  255. package/dist/fonts/montserrat-latin-400-normal.woff2 +0 -0
  256. package/dist/fonts/montserrat-latin-500-normal.woff +0 -0
  257. package/dist/fonts/montserrat-latin-500-normal.woff2 +0 -0
  258. package/dist/fonts/montserrat-latin-600-normal.woff +0 -0
  259. package/dist/fonts/montserrat-latin-600-normal.woff2 +0 -0
  260. package/dist/fonts/montserrat-latin-ext-400-normal.woff +0 -0
  261. package/dist/fonts/montserrat-latin-ext-400-normal.woff2 +0 -0
  262. package/dist/fonts/montserrat-latin-ext-500-normal.woff +0 -0
  263. package/dist/fonts/montserrat-latin-ext-500-normal.woff2 +0 -0
  264. package/dist/fonts/montserrat-latin-ext-600-normal.woff +0 -0
  265. package/dist/fonts/montserrat-latin-ext-600-normal.woff2 +0 -0
  266. package/dist/fonts/montserrat-vietnamese-400-normal.woff +0 -0
  267. package/dist/fonts/montserrat-vietnamese-400-normal.woff2 +0 -0
  268. package/dist/fonts/montserrat-vietnamese-500-normal.woff +0 -0
  269. package/dist/fonts/montserrat-vietnamese-500-normal.woff2 +0 -0
  270. package/dist/fonts/montserrat-vietnamese-600-normal.woff +0 -0
  271. package/dist/fonts/montserrat-vietnamese-600-normal.woff2 +0 -0
  272. package/dist/fonts/playfair-display-cyrillic-400-normal.woff +0 -0
  273. package/dist/fonts/playfair-display-cyrillic-400-normal.woff2 +0 -0
  274. package/dist/fonts/playfair-display-cyrillic-500-normal.woff +0 -0
  275. package/dist/fonts/playfair-display-cyrillic-500-normal.woff2 +0 -0
  276. package/dist/fonts/playfair-display-latin-400-normal.woff +0 -0
  277. package/dist/fonts/playfair-display-latin-400-normal.woff2 +0 -0
  278. package/dist/fonts/playfair-display-latin-500-normal.woff +0 -0
  279. package/dist/fonts/playfair-display-latin-500-normal.woff2 +0 -0
  280. package/dist/fonts/playfair-display-latin-ext-400-normal.woff +0 -0
  281. package/dist/fonts/playfair-display-latin-ext-400-normal.woff2 +0 -0
  282. package/dist/fonts/playfair-display-latin-ext-500-normal.woff +0 -0
  283. package/dist/fonts/playfair-display-latin-ext-500-normal.woff2 +0 -0
  284. package/dist/fonts/playfair-display-vietnamese-400-normal.woff +0 -0
  285. package/dist/fonts/playfair-display-vietnamese-400-normal.woff2 +0 -0
  286. package/dist/fonts/playfair-display-vietnamese-500-normal.woff +0 -0
  287. package/dist/fonts/playfair-display-vietnamese-500-normal.woff2 +0 -0
  288. package/dist/fonts/poppins-devanagari-400-normal.woff +0 -0
  289. package/dist/fonts/poppins-devanagari-400-normal.woff2 +0 -0
  290. package/dist/fonts/poppins-devanagari-500-normal.woff +0 -0
  291. package/dist/fonts/poppins-devanagari-500-normal.woff2 +0 -0
  292. package/dist/fonts/poppins-devanagari-600-normal.woff +0 -0
  293. package/dist/fonts/poppins-devanagari-600-normal.woff2 +0 -0
  294. package/dist/fonts/poppins-latin-400-normal.woff +0 -0
  295. package/dist/fonts/poppins-latin-400-normal.woff2 +0 -0
  296. package/dist/fonts/poppins-latin-500-normal.woff +0 -0
  297. package/dist/fonts/poppins-latin-500-normal.woff2 +0 -0
  298. package/dist/fonts/poppins-latin-600-normal.woff +0 -0
  299. package/dist/fonts/poppins-latin-600-normal.woff2 +0 -0
  300. package/dist/fonts/poppins-latin-ext-400-normal.woff +0 -0
  301. package/dist/fonts/poppins-latin-ext-400-normal.woff2 +0 -0
  302. package/dist/fonts/poppins-latin-ext-500-normal.woff +0 -0
  303. package/dist/fonts/poppins-latin-ext-500-normal.woff2 +0 -0
  304. package/dist/fonts/poppins-latin-ext-600-normal.woff +0 -0
  305. package/dist/fonts/poppins-latin-ext-600-normal.woff2 +0 -0
  306. package/dist/fonts/rubik-arabic-400-normal.woff +0 -0
  307. package/dist/fonts/rubik-arabic-400-normal.woff2 +0 -0
  308. package/dist/fonts/rubik-arabic-500-normal.woff +0 -0
  309. package/dist/fonts/rubik-arabic-500-normal.woff2 +0 -0
  310. package/dist/fonts/rubik-cyrillic-400-normal.woff +0 -0
  311. package/dist/fonts/rubik-cyrillic-400-normal.woff2 +0 -0
  312. package/dist/fonts/rubik-cyrillic-500-normal.woff +0 -0
  313. package/dist/fonts/rubik-cyrillic-500-normal.woff2 +0 -0
  314. package/dist/fonts/rubik-cyrillic-ext-400-normal.woff +0 -0
  315. package/dist/fonts/rubik-cyrillic-ext-400-normal.woff2 +0 -0
  316. package/dist/fonts/rubik-cyrillic-ext-500-normal.woff +0 -0
  317. package/dist/fonts/rubik-cyrillic-ext-500-normal.woff2 +0 -0
  318. package/dist/fonts/rubik-hebrew-400-normal.woff +0 -0
  319. package/dist/fonts/rubik-hebrew-400-normal.woff2 +0 -0
  320. package/dist/fonts/rubik-hebrew-500-normal.woff +0 -0
  321. package/dist/fonts/rubik-hebrew-500-normal.woff2 +0 -0
  322. package/dist/fonts/rubik-latin-400-normal.woff +0 -0
  323. package/dist/fonts/rubik-latin-400-normal.woff2 +0 -0
  324. package/dist/fonts/rubik-latin-500-normal.woff +0 -0
  325. package/dist/fonts/rubik-latin-500-normal.woff2 +0 -0
  326. package/dist/fonts/rubik-latin-ext-400-normal.woff +0 -0
  327. package/dist/fonts/rubik-latin-ext-400-normal.woff2 +0 -0
  328. package/dist/fonts/rubik-latin-ext-500-normal.woff +0 -0
  329. package/dist/fonts/rubik-latin-ext-500-normal.woff2 +0 -0
  330. package/dist/fonts/source-serif-pro-cyrillic-400-normal.woff +0 -0
  331. package/dist/fonts/source-serif-pro-cyrillic-400-normal.woff2 +0 -0
  332. package/dist/fonts/source-serif-pro-cyrillic-ext-400-normal.woff +0 -0
  333. package/dist/fonts/source-serif-pro-cyrillic-ext-400-normal.woff2 +0 -0
  334. package/dist/fonts/source-serif-pro-greek-400-normal.woff +0 -0
  335. package/dist/fonts/source-serif-pro-greek-400-normal.woff2 +0 -0
  336. package/dist/fonts/source-serif-pro-latin-400-normal.woff +0 -0
  337. package/dist/fonts/source-serif-pro-latin-400-normal.woff2 +0 -0
  338. package/dist/fonts/source-serif-pro-latin-ext-400-normal.woff +0 -0
  339. package/dist/fonts/source-serif-pro-latin-ext-400-normal.woff2 +0 -0
  340. package/dist/fonts/source-serif-pro-vietnamese-400-normal.woff +0 -0
  341. package/dist/fonts/source-serif-pro-vietnamese-400-normal.woff2 +0 -0
  342. package/dist/fonts/space-grotesk-latin-400-normal.woff +0 -0
  343. package/dist/fonts/space-grotesk-latin-400-normal.woff2 +0 -0
  344. package/dist/fonts/space-grotesk-latin-600-normal.woff +0 -0
  345. package/dist/fonts/space-grotesk-latin-600-normal.woff2 +0 -0
  346. package/dist/fonts/space-grotesk-latin-700-normal.woff +0 -0
  347. package/dist/fonts/space-grotesk-latin-700-normal.woff2 +0 -0
  348. package/dist/fonts/space-grotesk-latin-ext-400-normal.woff +0 -0
  349. package/dist/fonts/space-grotesk-latin-ext-400-normal.woff2 +0 -0
  350. package/dist/fonts/space-grotesk-latin-ext-600-normal.woff +0 -0
  351. package/dist/fonts/space-grotesk-latin-ext-600-normal.woff2 +0 -0
  352. package/dist/fonts/space-grotesk-latin-ext-700-normal.woff +0 -0
  353. package/dist/fonts/space-grotesk-latin-ext-700-normal.woff2 +0 -0
  354. package/dist/fonts/space-grotesk-vietnamese-400-normal.woff +0 -0
  355. package/dist/fonts/space-grotesk-vietnamese-400-normal.woff2 +0 -0
  356. package/dist/fonts/space-grotesk-vietnamese-600-normal.woff +0 -0
  357. package/dist/fonts/space-grotesk-vietnamese-600-normal.woff2 +0 -0
  358. package/dist/fonts/space-grotesk-vietnamese-700-normal.woff +0 -0
  359. package/dist/fonts/space-grotesk-vietnamese-700-normal.woff2 +0 -0
  360. package/dist/fonts/work-sans-latin-400-normal.woff +0 -0
  361. package/dist/fonts/work-sans-latin-400-normal.woff2 +0 -0
  362. package/dist/fonts/work-sans-latin-500-normal.woff +0 -0
  363. package/dist/fonts/work-sans-latin-500-normal.woff2 +0 -0
  364. package/dist/fonts/work-sans-latin-ext-400-normal.woff +0 -0
  365. package/dist/fonts/work-sans-latin-ext-400-normal.woff2 +0 -0
  366. package/dist/fonts/work-sans-latin-ext-500-normal.woff +0 -0
  367. package/dist/fonts/work-sans-latin-ext-500-normal.woff2 +0 -0
  368. package/dist/fonts/work-sans-vietnamese-400-normal.woff +0 -0
  369. package/dist/fonts/work-sans-vietnamese-400-normal.woff2 +0 -0
  370. package/dist/fonts/work-sans-vietnamese-500-normal.woff +0 -0
  371. package/dist/fonts/work-sans-vietnamese-500-normal.woff2 +0 -0
  372. package/dist/footer.js +308 -0
  373. package/dist/footer.js.map +1 -0
  374. package/dist/form-field.js +69 -0
  375. package/dist/form-field.js.map +1 -0
  376. package/dist/form.js +732 -0
  377. package/dist/form.js.map +1 -0
  378. package/dist/format.js +112 -0
  379. package/dist/format.js.map +1 -0
  380. package/dist/fouc.js +28 -0
  381. package/dist/fouc.js.map +1 -0
  382. package/dist/header.js +289 -0
  383. package/dist/header.js.map +1 -0
  384. package/dist/hooks.js +13 -0
  385. package/dist/hooks.js.map +1 -0
  386. package/dist/hover-card.js +210 -0
  387. package/dist/hover-card.js.map +1 -0
  388. package/dist/index-0ioNhtNM.js +11 -0
  389. package/dist/index-0ioNhtNM.js.map +1 -0
  390. package/dist/index-1QHKgw6D.js +55 -0
  391. package/dist/index-1QHKgw6D.js.map +1 -0
  392. package/dist/index-B6sSWi7l.js +747 -0
  393. package/dist/index-B6sSWi7l.js.map +1 -0
  394. package/dist/index-BCjJQGh8.js +71 -0
  395. package/dist/index-BCjJQGh8.js.map +1 -0
  396. package/dist/index-BGQepRFJ.js +28 -0
  397. package/dist/index-BGQepRFJ.js.map +1 -0
  398. package/dist/index-BVRIAMfe.js +37 -0
  399. package/dist/index-BVRIAMfe.js.map +1 -0
  400. package/dist/index-BY7PeRJA.js +145 -0
  401. package/dist/index-BY7PeRJA.js.map +1 -0
  402. package/dist/index-BZPx6jYI.js +9 -0
  403. package/dist/index-BZPx6jYI.js.map +1 -0
  404. package/dist/index-Ba4eHUBD.js +243 -0
  405. package/dist/index-Ba4eHUBD.js.map +1 -0
  406. package/dist/index-Bke1qZdk.js +35 -0
  407. package/dist/index-Bke1qZdk.js.map +1 -0
  408. package/dist/index-C0UREtMP.js +60 -0
  409. package/dist/index-C0UREtMP.js.map +1 -0
  410. package/dist/index-CCKe-Mpx.js +7 -0
  411. package/dist/index-CCKe-Mpx.js.map +1 -0
  412. package/dist/index-DFZozV_h.js +69 -0
  413. package/dist/index-DFZozV_h.js.map +1 -0
  414. package/dist/index-DFi6WydO.js +180 -0
  415. package/dist/index-DFi6WydO.js.map +1 -0
  416. package/dist/index-DQH6odE9.js +83 -0
  417. package/dist/index-DQH6odE9.js.map +1 -0
  418. package/dist/index-EO5flKM3.js +119 -0
  419. package/dist/index-EO5flKM3.js.map +1 -0
  420. package/dist/index-Lf7yDOXW.js +615 -0
  421. package/dist/index-Lf7yDOXW.js.map +1 -0
  422. package/dist/index-dhIqEbxW.js +1541 -0
  423. package/dist/index-dhIqEbxW.js.map +1 -0
  424. package/dist/index-pWhlqjff.js +32 -0
  425. package/dist/index-pWhlqjff.js.map +1 -0
  426. package/dist/index-rKs9bXHr.js +7 -0
  427. package/dist/index-rKs9bXHr.js.map +1 -0
  428. package/dist/index-xqkGMOJ8.js +14 -0
  429. package/dist/index-xqkGMOJ8.js.map +1 -0
  430. package/dist/index.js +247 -0
  431. package/dist/index.js.map +1 -0
  432. package/dist/input.js +22 -0
  433. package/dist/input.js.map +1 -0
  434. package/dist/label.js +36 -0
  435. package/dist/label.js.map +1 -0
  436. package/dist/layout-wrapper.js +208 -0
  437. package/dist/layout-wrapper.js.map +1 -0
  438. package/dist/llms.txt +1140 -0
  439. package/dist/menu-DBhEanGo.js +16 -0
  440. package/dist/menu-DBhEanGo.js.map +1 -0
  441. package/dist/menubar.js +565 -0
  442. package/dist/menubar.js.map +1 -0
  443. package/dist/mobile.js +183 -0
  444. package/dist/mobile.js.map +1 -0
  445. package/dist/motion.js +119 -0
  446. package/dist/motion.js.map +1 -0
  447. package/dist/page-header.js +47 -0
  448. package/dist/page-header.js.map +1 -0
  449. package/dist/page.js +214 -0
  450. package/dist/page.js.map +1 -0
  451. package/dist/pagination.js +121 -0
  452. package/dist/pagination.js.map +1 -0
  453. package/dist/platform.js +194 -0
  454. package/dist/platform.js.map +1 -0
  455. package/dist/popover.js +263 -0
  456. package/dist/popover.js.map +1 -0
  457. package/dist/popup.js +335 -0
  458. package/dist/popup.js.map +1 -0
  459. package/dist/progress.js +108 -0
  460. package/dist/progress.js.map +1 -0
  461. package/dist/radio-group.js +272 -0
  462. package/dist/radio-group.js.map +1 -0
  463. package/dist/safe-area.js +42 -0
  464. package/dist/safe-area.js.map +1 -0
  465. package/dist/search-CpUwRnG-.js +15 -0
  466. package/dist/search-CpUwRnG-.js.map +1 -0
  467. package/dist/select.js +985 -0
  468. package/dist/select.js.map +1 -0
  469. package/dist/separator.js +45 -0
  470. package/dist/separator.js.map +1 -0
  471. package/dist/sheet.js +127 -0
  472. package/dist/sheet.js.map +1 -0
  473. package/dist/skeleton.js +16 -0
  474. package/dist/skeleton.js.map +1 -0
  475. package/dist/slider.js +485 -0
  476. package/dist/slider.js.map +1 -0
  477. package/dist/sonner.js +52 -0
  478. package/dist/sonner.js.map +1 -0
  479. package/dist/styles/fonts.css +253 -0
  480. package/dist/styles.css +2 -0
  481. package/dist/switch.js +155 -0
  482. package/dist/switch.js.map +1 -0
  483. package/dist/tab-bar.js +110 -0
  484. package/dist/tab-bar.js.map +1 -0
  485. package/dist/table.js +115 -0
  486. package/dist/table.js.map +1 -0
  487. package/dist/tabs.js +218 -0
  488. package/dist/tabs.js.map +1 -0
  489. package/dist/textarea.js +19 -0
  490. package/dist/textarea.js.map +1 -0
  491. package/dist/theme-provider.js +154 -0
  492. package/dist/theme-provider.js.map +1 -0
  493. package/dist/themes.js +873 -0
  494. package/dist/themes.js.map +1 -0
  495. package/dist/toast.js +63 -0
  496. package/dist/toast.js.map +1 -0
  497. package/dist/toggle.js +70 -0
  498. package/dist/toggle.js.map +1 -0
  499. package/dist/tooltip.js +375 -0
  500. package/dist/tooltip.js.map +1 -0
  501. package/dist/types/App.d.ts +3 -0
  502. package/dist/types/App.d.ts.map +1 -0
  503. package/dist/types/components/layouts/admin.d.ts +117 -0
  504. package/dist/types/components/layouts/admin.d.ts.map +1 -0
  505. package/dist/types/components/layouts/auth.d.ts +17 -0
  506. package/dist/types/components/layouts/auth.d.ts.map +1 -0
  507. package/dist/types/components/layouts/blank.d.ts +63 -0
  508. package/dist/types/components/layouts/blank.d.ts.map +1 -0
  509. package/dist/types/components/layouts/layout-wrapper.d.ts +130 -0
  510. package/dist/types/components/layouts/layout-wrapper.d.ts.map +1 -0
  511. package/dist/types/components/layouts/mobile.d.ts +91 -0
  512. package/dist/types/components/layouts/mobile.d.ts.map +1 -0
  513. package/dist/types/components/layouts/page.d.ts +181 -0
  514. package/dist/types/components/layouts/page.d.ts.map +1 -0
  515. package/dist/types/components/layouts/popup.d.ts +100 -0
  516. package/dist/types/components/layouts/popup.d.ts.map +1 -0
  517. package/dist/types/components/sections/container.d.ts +79 -0
  518. package/dist/types/components/sections/container.d.ts.map +1 -0
  519. package/dist/types/components/sections/footer.d.ts +128 -0
  520. package/dist/types/components/sections/footer.d.ts.map +1 -0
  521. package/dist/types/components/sections/header.d.ts +72 -0
  522. package/dist/types/components/sections/header.d.ts.map +1 -0
  523. package/dist/types/components/sections/safe-area.d.ts +46 -0
  524. package/dist/types/components/sections/safe-area.d.ts.map +1 -0
  525. package/dist/types/components/sections/tab-bar.d.ts +61 -0
  526. package/dist/types/components/sections/tab-bar.d.ts.map +1 -0
  527. package/dist/types/components/ui/accordion.d.ts +8 -0
  528. package/dist/types/components/ui/accordion.d.ts.map +1 -0
  529. package/dist/types/components/ui/alert.d.ts +10 -0
  530. package/dist/types/components/ui/alert.d.ts.map +1 -0
  531. package/dist/types/components/ui/avatar.d.ts +7 -0
  532. package/dist/types/components/ui/avatar.d.ts.map +1 -0
  533. package/dist/types/components/ui/badge.d.ts +10 -0
  534. package/dist/types/components/ui/badge.d.ts.map +1 -0
  535. package/dist/types/components/ui/breadcrumb.d.ts +12 -0
  536. package/dist/types/components/ui/breadcrumb.d.ts.map +1 -0
  537. package/dist/types/components/ui/button.d.ts +11 -0
  538. package/dist/types/components/ui/button.d.ts.map +1 -0
  539. package/dist/types/components/ui/calendar.d.ts +9 -0
  540. package/dist/types/components/ui/calendar.d.ts.map +1 -0
  541. package/dist/types/components/ui/card.d.ts +10 -0
  542. package/dist/types/components/ui/card.d.ts.map +1 -0
  543. package/dist/types/components/ui/checkbox.d.ts +5 -0
  544. package/dist/types/components/ui/checkbox.d.ts.map +1 -0
  545. package/dist/types/components/ui/collapsible.d.ts +6 -0
  546. package/dist/types/components/ui/collapsible.d.ts.map +1 -0
  547. package/dist/types/components/ui/command.d.ts +19 -0
  548. package/dist/types/components/ui/command.d.ts.map +1 -0
  549. package/dist/types/components/ui/confirm-dialog.d.ts +72 -0
  550. package/dist/types/components/ui/confirm-dialog.d.ts.map +1 -0
  551. package/dist/types/components/ui/data-table.d.ts +211 -0
  552. package/dist/types/components/ui/data-table.d.ts.map +1 -0
  553. package/dist/types/components/ui/detail-page.d.ts +119 -0
  554. package/dist/types/components/ui/detail-page.d.ts.map +1 -0
  555. package/dist/types/components/ui/dialog.d.ts +16 -0
  556. package/dist/types/components/ui/dialog.d.ts.map +1 -0
  557. package/dist/types/components/ui/dropdown-menu.d.ts +26 -0
  558. package/dist/types/components/ui/dropdown-menu.d.ts.map +1 -0
  559. package/dist/types/components/ui/empty-state.d.ts +30 -0
  560. package/dist/types/components/ui/empty-state.d.ts.map +1 -0
  561. package/dist/types/components/ui/form-field.d.ts +57 -0
  562. package/dist/types/components/ui/form-field.d.ts.map +1 -0
  563. package/dist/types/components/ui/form.d.ts +185 -0
  564. package/dist/types/components/ui/form.d.ts.map +1 -0
  565. package/dist/types/components/ui/hover-card.d.ts +7 -0
  566. package/dist/types/components/ui/hover-card.d.ts.map +1 -0
  567. package/dist/types/components/ui/input.d.ts +4 -0
  568. package/dist/types/components/ui/input.d.ts.map +1 -0
  569. package/dist/types/components/ui/label.d.ts +5 -0
  570. package/dist/types/components/ui/label.d.ts.map +1 -0
  571. package/dist/types/components/ui/menubar.d.ts +27 -0
  572. package/dist/types/components/ui/menubar.d.ts.map +1 -0
  573. package/dist/types/components/ui/motion.d.ts +130 -0
  574. package/dist/types/components/ui/motion.d.ts.map +1 -0
  575. package/dist/types/components/ui/page-header.d.ts +45 -0
  576. package/dist/types/components/ui/page-header.d.ts.map +1 -0
  577. package/dist/types/components/ui/pagination.d.ts +14 -0
  578. package/dist/types/components/ui/pagination.d.ts.map +1 -0
  579. package/dist/types/components/ui/popover.d.ts +8 -0
  580. package/dist/types/components/ui/popover.d.ts.map +1 -0
  581. package/dist/types/components/ui/progress.d.ts +5 -0
  582. package/dist/types/components/ui/progress.d.ts.map +1 -0
  583. package/dist/types/components/ui/radio-group.d.ts +6 -0
  584. package/dist/types/components/ui/radio-group.d.ts.map +1 -0
  585. package/dist/types/components/ui/select.d.ts +16 -0
  586. package/dist/types/components/ui/select.d.ts.map +1 -0
  587. package/dist/types/components/ui/separator.d.ts +5 -0
  588. package/dist/types/components/ui/separator.d.ts.map +1 -0
  589. package/dist/types/components/ui/sheet.d.ts +14 -0
  590. package/dist/types/components/ui/sheet.d.ts.map +1 -0
  591. package/dist/types/components/ui/skeleton.d.ts +3 -0
  592. package/dist/types/components/ui/skeleton.d.ts.map +1 -0
  593. package/dist/types/components/ui/slider.d.ts +5 -0
  594. package/dist/types/components/ui/slider.d.ts.map +1 -0
  595. package/dist/types/components/ui/sonner.d.ts +4 -0
  596. package/dist/types/components/ui/sonner.d.ts.map +1 -0
  597. package/dist/types/components/ui/switch.d.ts +5 -0
  598. package/dist/types/components/ui/switch.d.ts.map +1 -0
  599. package/dist/types/components/ui/table.d.ts +11 -0
  600. package/dist/types/components/ui/table.d.ts.map +1 -0
  601. package/dist/types/components/ui/tabs.d.ts +8 -0
  602. package/dist/types/components/ui/tabs.d.ts.map +1 -0
  603. package/dist/types/components/ui/textarea.d.ts +4 -0
  604. package/dist/types/components/ui/textarea.d.ts.map +1 -0
  605. package/dist/types/components/ui/toast.d.ts +70 -0
  606. package/dist/types/components/ui/toast.d.ts.map +1 -0
  607. package/dist/types/components/ui/toggle.d.ts +10 -0
  608. package/dist/types/components/ui/toggle.d.ts.map +1 -0
  609. package/dist/types/components/ui/tooltip.d.ts +8 -0
  610. package/dist/types/components/ui/tooltip.d.ts.map +1 -0
  611. package/dist/types/hooks/index.d.ts +14 -0
  612. package/dist/types/hooks/index.d.ts.map +1 -0
  613. package/dist/types/hooks/useApi.d.ts +38 -0
  614. package/dist/types/hooks/useApi.d.ts.map +1 -0
  615. package/dist/types/hooks/useBreakpoint.d.ts +35 -0
  616. package/dist/types/hooks/useBreakpoint.d.ts.map +1 -0
  617. package/dist/types/hooks/useDataTable.d.ts +59 -0
  618. package/dist/types/hooks/useDataTable.d.ts.map +1 -0
  619. package/dist/types/hooks/useMediaQuery.d.ts +12 -0
  620. package/dist/types/hooks/useMediaQuery.d.ts.map +1 -0
  621. package/dist/types/hooks/useStorage.d.ts +35 -0
  622. package/dist/types/hooks/useStorage.d.ts.map +1 -0
  623. package/dist/types/index.d.ts +75 -0
  624. package/dist/types/index.d.ts.map +1 -0
  625. package/dist/types/lib/errors.d.ts +37 -0
  626. package/dist/types/lib/errors.d.ts.map +1 -0
  627. package/dist/types/lib/format.d.ts +80 -0
  628. package/dist/types/lib/format.d.ts.map +1 -0
  629. package/dist/types/lib/fouc.d.ts +64 -0
  630. package/dist/types/lib/fouc.d.ts.map +1 -0
  631. package/dist/types/lib/platform.d.ts +156 -0
  632. package/dist/types/lib/platform.d.ts.map +1 -0
  633. package/dist/types/lib/utils.d.ts +14 -0
  634. package/dist/types/lib/utils.d.ts.map +1 -0
  635. package/dist/types/main.d.ts +2 -0
  636. package/dist/types/main.d.ts.map +1 -0
  637. package/dist/types/themes/index.d.ts +499 -0
  638. package/dist/types/themes/index.d.ts.map +1 -0
  639. package/dist/types/themes/presets/base.d.ts +108 -0
  640. package/dist/types/themes/presets/base.d.ts.map +1 -0
  641. package/dist/types/themes/presets/elegant.d.ts +108 -0
  642. package/dist/types/themes/presets/elegant.d.ts.map +1 -0
  643. package/dist/types/themes/presets/metro.d.ts +114 -0
  644. package/dist/types/themes/presets/metro.d.ts.map +1 -0
  645. package/dist/types/themes/presets/studio.d.ts +115 -0
  646. package/dist/types/themes/presets/studio.d.ts.map +1 -0
  647. package/dist/types/themes/presets/vivid.d.ts +115 -0
  648. package/dist/types/themes/presets/vivid.d.ts.map +1 -0
  649. package/dist/types/themes/theme-provider.d.ts +122 -0
  650. package/dist/types/themes/theme-provider.d.ts.map +1 -0
  651. package/dist/types/types/index.d.ts +813 -0
  652. package/dist/types/types/index.d.ts.map +1 -0
  653. package/dist/uikit.css +1 -0
  654. package/dist/useDataTable-CPiBpEg-.js +254 -0
  655. package/dist/useDataTable-CPiBpEg-.js.map +1 -0
  656. package/dist/utils-CwJPJKOE.js +2278 -0
  657. package/dist/utils-CwJPJKOE.js.map +1 -0
  658. package/dist/utils.js +5 -0
  659. package/dist/utils.js.map +1 -0
  660. package/dist/wrapper.js +13 -0
  661. package/dist/wrapper.js.map +1 -0
  662. package/dist/x-BxwubQiM.js +15 -0
  663. package/dist/x-BxwubQiM.js.map +1 -0
  664. package/examples/README.md +18 -0
  665. package/examples/button.tsx +16 -0
  666. package/examples/confirm-dialog.tsx +44 -0
  667. package/examples/data-table.tsx +35 -0
  668. package/examples/dialog.tsx +34 -0
  669. package/examples/empty-state.tsx +13 -0
  670. package/examples/form-field.tsx +22 -0
  671. package/examples/format.tsx +19 -0
  672. package/examples/page-header.tsx +17 -0
  673. package/examples/skeleton.tsx +12 -0
  674. package/examples/theme-provider.tsx +33 -0
  675. package/examples/toast.tsx +32 -0
  676. package/examples/use-breakpoint.tsx +17 -0
  677. package/llms.txt +1140 -0
  678. package/package.json +430 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menubar.js","sources":["../node_modules/@radix-ui/react-menubar/dist/index.mjs","../src/components/ui/menubar.tsx"],"sourcesContent":["\"use client\";\n\n// src/menubar.tsx\nimport * as React from \"react\";\nimport { createCollection } from \"@radix-ui/react-collection\";\nimport { useDirection } from \"@radix-ui/react-direction\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { useId } from \"@radix-ui/react-id\";\nimport * as MenuPrimitive from \"@radix-ui/react-menu\";\nimport { createMenuScope } from \"@radix-ui/react-menu\";\nimport * as RovingFocusGroup from \"@radix-ui/react-roving-focus\";\nimport { createRovingFocusGroupScope } from \"@radix-ui/react-roving-focus\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { jsx } from \"react/jsx-runtime\";\nvar MENUBAR_NAME = \"Menubar\";\nvar [Collection, useCollection, createCollectionScope] = createCollection(MENUBAR_NAME);\nvar [createMenubarContext, createMenubarScope] = createContextScope(MENUBAR_NAME, [\n createCollectionScope,\n createRovingFocusGroupScope\n]);\nvar useMenuScope = createMenuScope();\nvar useRovingFocusGroupScope = createRovingFocusGroupScope();\nvar [MenubarContextProvider, useMenubarContext] = createMenubarContext(MENUBAR_NAME);\nvar Menubar = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopeMenubar,\n value: valueProp,\n onValueChange,\n defaultValue,\n loop = true,\n dir,\n ...menubarProps\n } = props;\n const direction = useDirection(dir);\n const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeMenubar);\n const [value, setValue] = useControllableState({\n prop: valueProp,\n onChange: onValueChange,\n defaultProp: defaultValue ?? \"\",\n caller: MENUBAR_NAME\n });\n const [currentTabStopId, setCurrentTabStopId] = React.useState(null);\n return /* @__PURE__ */ jsx(\n MenubarContextProvider,\n {\n scope: __scopeMenubar,\n value,\n onMenuOpen: React.useCallback(\n (value2) => {\n setValue(value2);\n setCurrentTabStopId(value2);\n },\n [setValue]\n ),\n onMenuClose: React.useCallback(() => setValue(\"\"), [setValue]),\n onMenuToggle: React.useCallback(\n (value2) => {\n setValue((prevValue) => prevValue ? \"\" : value2);\n setCurrentTabStopId(value2);\n },\n [setValue]\n ),\n dir: direction,\n loop,\n children: /* @__PURE__ */ jsx(Collection.Provider, { scope: __scopeMenubar, children: /* @__PURE__ */ jsx(Collection.Slot, { scope: __scopeMenubar, children: /* @__PURE__ */ jsx(\n RovingFocusGroup.Root,\n {\n asChild: true,\n ...rovingFocusGroupScope,\n orientation: \"horizontal\",\n loop,\n dir: direction,\n currentTabStopId,\n onCurrentTabStopIdChange: setCurrentTabStopId,\n children: /* @__PURE__ */ jsx(Primitive.div, { role: \"menubar\", ...menubarProps, ref: forwardedRef })\n }\n ) }) })\n }\n );\n }\n);\nMenubar.displayName = MENUBAR_NAME;\nvar MENU_NAME = \"MenubarMenu\";\nvar [MenubarMenuProvider, useMenubarMenuContext] = createMenubarContext(MENU_NAME);\nvar MenubarMenu = (props) => {\n const { __scopeMenubar, value: valueProp, ...menuProps } = props;\n const autoValue = useId();\n const value = valueProp || autoValue || \"LEGACY_REACT_AUTO_VALUE\";\n const context = useMenubarContext(MENU_NAME, __scopeMenubar);\n const menuScope = useMenuScope(__scopeMenubar);\n const triggerRef = React.useRef(null);\n const wasKeyboardTriggerOpenRef = React.useRef(false);\n const open = context.value === value;\n React.useEffect(() => {\n if (!open) wasKeyboardTriggerOpenRef.current = false;\n }, [open]);\n return /* @__PURE__ */ jsx(\n MenubarMenuProvider,\n {\n scope: __scopeMenubar,\n value,\n triggerId: useId(),\n triggerRef,\n contentId: useId(),\n wasKeyboardTriggerOpenRef,\n children: /* @__PURE__ */ jsx(\n MenuPrimitive.Root,\n {\n ...menuScope,\n open,\n onOpenChange: (open2) => {\n if (!open2) context.onMenuClose();\n },\n modal: false,\n dir: context.dir,\n ...menuProps\n }\n )\n }\n );\n};\nMenubarMenu.displayName = MENU_NAME;\nvar TRIGGER_NAME = \"MenubarTrigger\";\nvar MenubarTrigger = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeMenubar, disabled = false, ...triggerProps } = props;\n const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeMenubar);\n const menuScope = useMenuScope(__scopeMenubar);\n const context = useMenubarContext(TRIGGER_NAME, __scopeMenubar);\n const menuContext = useMenubarMenuContext(TRIGGER_NAME, __scopeMenubar);\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, ref, menuContext.triggerRef);\n const [isFocused, setIsFocused] = React.useState(false);\n const open = context.value === menuContext.value;\n return /* @__PURE__ */ jsx(Collection.ItemSlot, { scope: __scopeMenubar, value: menuContext.value, disabled, children: /* @__PURE__ */ jsx(\n RovingFocusGroup.Item,\n {\n asChild: true,\n ...rovingFocusGroupScope,\n focusable: !disabled,\n tabStopId: menuContext.value,\n children: /* @__PURE__ */ jsx(MenuPrimitive.Anchor, { asChild: true, ...menuScope, children: /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n role: \"menuitem\",\n id: menuContext.triggerId,\n \"aria-haspopup\": \"menu\",\n \"aria-expanded\": open,\n \"aria-controls\": open ? menuContext.contentId : void 0,\n \"data-highlighted\": isFocused ? \"\" : void 0,\n \"data-state\": open ? \"open\" : \"closed\",\n \"data-disabled\": disabled ? \"\" : void 0,\n disabled,\n ...triggerProps,\n ref: composedRefs,\n onPointerDown: composeEventHandlers(props.onPointerDown, (event) => {\n if (!disabled && event.button === 0 && event.ctrlKey === false) {\n context.onMenuOpen(menuContext.value);\n if (!open) event.preventDefault();\n }\n }),\n onPointerEnter: composeEventHandlers(props.onPointerEnter, () => {\n const menubarOpen = Boolean(context.value);\n if (menubarOpen && !open) {\n context.onMenuOpen(menuContext.value);\n ref.current?.focus();\n }\n }),\n onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {\n if (disabled) return;\n if ([\"Enter\", \" \"].includes(event.key)) context.onMenuToggle(menuContext.value);\n if (event.key === \"ArrowDown\") context.onMenuOpen(menuContext.value);\n if ([\"Enter\", \" \", \"ArrowDown\"].includes(event.key)) {\n menuContext.wasKeyboardTriggerOpenRef.current = true;\n event.preventDefault();\n }\n }),\n onFocus: composeEventHandlers(props.onFocus, () => setIsFocused(true)),\n onBlur: composeEventHandlers(props.onBlur, () => setIsFocused(false))\n }\n ) })\n }\n ) });\n }\n);\nMenubarTrigger.displayName = TRIGGER_NAME;\nvar PORTAL_NAME = \"MenubarPortal\";\nvar MenubarPortal = (props) => {\n const { __scopeMenubar, ...portalProps } = props;\n const menuScope = useMenuScope(__scopeMenubar);\n return /* @__PURE__ */ jsx(MenuPrimitive.Portal, { ...menuScope, ...portalProps });\n};\nMenubarPortal.displayName = PORTAL_NAME;\nvar CONTENT_NAME = \"MenubarContent\";\nvar MenubarContent = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeMenubar, align = \"start\", ...contentProps } = props;\n const menuScope = useMenuScope(__scopeMenubar);\n const context = useMenubarContext(CONTENT_NAME, __scopeMenubar);\n const menuContext = useMenubarMenuContext(CONTENT_NAME, __scopeMenubar);\n const getItems = useCollection(__scopeMenubar);\n const hasInteractedOutsideRef = React.useRef(false);\n return /* @__PURE__ */ jsx(\n MenuPrimitive.Content,\n {\n id: menuContext.contentId,\n \"aria-labelledby\": menuContext.triggerId,\n \"data-radix-menubar-content\": \"\",\n ...menuScope,\n ...contentProps,\n ref: forwardedRef,\n align,\n onCloseAutoFocus: composeEventHandlers(props.onCloseAutoFocus, (event) => {\n const menubarOpen = Boolean(context.value);\n if (!menubarOpen && !hasInteractedOutsideRef.current) {\n menuContext.triggerRef.current?.focus();\n }\n hasInteractedOutsideRef.current = false;\n event.preventDefault();\n }),\n onFocusOutside: composeEventHandlers(props.onFocusOutside, (event) => {\n const target = event.target;\n const isMenubarTrigger = getItems().some((item) => item.ref.current?.contains(target));\n if (isMenubarTrigger) event.preventDefault();\n }),\n onInteractOutside: composeEventHandlers(props.onInteractOutside, () => {\n hasInteractedOutsideRef.current = true;\n }),\n onEntryFocus: (event) => {\n if (!menuContext.wasKeyboardTriggerOpenRef.current) event.preventDefault();\n },\n onKeyDown: composeEventHandlers(\n props.onKeyDown,\n (event) => {\n if ([\"ArrowRight\", \"ArrowLeft\"].includes(event.key)) {\n const target = event.target;\n const targetIsSubTrigger = target.hasAttribute(\"data-radix-menubar-subtrigger\");\n const isKeyDownInsideSubMenu = target.closest(\"[data-radix-menubar-content]\") !== event.currentTarget;\n const prevMenuKey = context.dir === \"rtl\" ? \"ArrowRight\" : \"ArrowLeft\";\n const isPrevKey = prevMenuKey === event.key;\n const isNextKey = !isPrevKey;\n if (isNextKey && targetIsSubTrigger) return;\n if (isKeyDownInsideSubMenu && isPrevKey) return;\n const items = getItems().filter((item) => !item.disabled);\n let candidateValues = items.map((item) => item.value);\n if (isPrevKey) candidateValues.reverse();\n const currentIndex = candidateValues.indexOf(menuContext.value);\n candidateValues = context.loop ? wrapArray(candidateValues, currentIndex + 1) : candidateValues.slice(currentIndex + 1);\n const [nextValue] = candidateValues;\n if (nextValue) context.onMenuOpen(nextValue);\n }\n },\n { checkForDefaultPrevented: false }\n ),\n style: {\n ...props.style,\n // re-namespace exposed content custom properties\n ...{\n \"--radix-menubar-content-transform-origin\": \"var(--radix-popper-transform-origin)\",\n \"--radix-menubar-content-available-width\": \"var(--radix-popper-available-width)\",\n \"--radix-menubar-content-available-height\": \"var(--radix-popper-available-height)\",\n \"--radix-menubar-trigger-width\": \"var(--radix-popper-anchor-width)\",\n \"--radix-menubar-trigger-height\": \"var(--radix-popper-anchor-height)\"\n }\n }\n }\n );\n }\n);\nMenubarContent.displayName = CONTENT_NAME;\nvar GROUP_NAME = \"MenubarGroup\";\nvar MenubarGroup = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeMenubar, ...groupProps } = props;\n const menuScope = useMenuScope(__scopeMenubar);\n return /* @__PURE__ */ jsx(MenuPrimitive.Group, { ...menuScope, ...groupProps, ref: forwardedRef });\n }\n);\nMenubarGroup.displayName = GROUP_NAME;\nvar LABEL_NAME = \"MenubarLabel\";\nvar MenubarLabel = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeMenubar, ...labelProps } = props;\n const menuScope = useMenuScope(__scopeMenubar);\n return /* @__PURE__ */ jsx(MenuPrimitive.Label, { ...menuScope, ...labelProps, ref: forwardedRef });\n }\n);\nMenubarLabel.displayName = LABEL_NAME;\nvar ITEM_NAME = \"MenubarItem\";\nvar MenubarItem = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeMenubar, ...itemProps } = props;\n const menuScope = useMenuScope(__scopeMenubar);\n return /* @__PURE__ */ jsx(MenuPrimitive.Item, { ...menuScope, ...itemProps, ref: forwardedRef });\n }\n);\nMenubarItem.displayName = ITEM_NAME;\nvar CHECKBOX_ITEM_NAME = \"MenubarCheckboxItem\";\nvar MenubarCheckboxItem = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeMenubar, ...checkboxItemProps } = props;\n const menuScope = useMenuScope(__scopeMenubar);\n return /* @__PURE__ */ jsx(MenuPrimitive.CheckboxItem, { ...menuScope, ...checkboxItemProps, ref: forwardedRef });\n }\n);\nMenubarCheckboxItem.displayName = CHECKBOX_ITEM_NAME;\nvar RADIO_GROUP_NAME = \"MenubarRadioGroup\";\nvar MenubarRadioGroup = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeMenubar, ...radioGroupProps } = props;\n const menuScope = useMenuScope(__scopeMenubar);\n return /* @__PURE__ */ jsx(MenuPrimitive.RadioGroup, { ...menuScope, ...radioGroupProps, ref: forwardedRef });\n }\n);\nMenubarRadioGroup.displayName = RADIO_GROUP_NAME;\nvar RADIO_ITEM_NAME = \"MenubarRadioItem\";\nvar MenubarRadioItem = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeMenubar, ...radioItemProps } = props;\n const menuScope = useMenuScope(__scopeMenubar);\n return /* @__PURE__ */ jsx(MenuPrimitive.RadioItem, { ...menuScope, ...radioItemProps, ref: forwardedRef });\n }\n);\nMenubarRadioItem.displayName = RADIO_ITEM_NAME;\nvar INDICATOR_NAME = \"MenubarItemIndicator\";\nvar MenubarItemIndicator = React.forwardRef((props, forwardedRef) => {\n const { __scopeMenubar, ...itemIndicatorProps } = props;\n const menuScope = useMenuScope(__scopeMenubar);\n return /* @__PURE__ */ jsx(MenuPrimitive.ItemIndicator, { ...menuScope, ...itemIndicatorProps, ref: forwardedRef });\n});\nMenubarItemIndicator.displayName = INDICATOR_NAME;\nvar SEPARATOR_NAME = \"MenubarSeparator\";\nvar MenubarSeparator = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeMenubar, ...separatorProps } = props;\n const menuScope = useMenuScope(__scopeMenubar);\n return /* @__PURE__ */ jsx(MenuPrimitive.Separator, { ...menuScope, ...separatorProps, ref: forwardedRef });\n }\n);\nMenubarSeparator.displayName = SEPARATOR_NAME;\nvar ARROW_NAME = \"MenubarArrow\";\nvar MenubarArrow = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeMenubar, ...arrowProps } = props;\n const menuScope = useMenuScope(__scopeMenubar);\n return /* @__PURE__ */ jsx(MenuPrimitive.Arrow, { ...menuScope, ...arrowProps, ref: forwardedRef });\n }\n);\nMenubarArrow.displayName = ARROW_NAME;\nvar SUB_NAME = \"MenubarSub\";\nvar MenubarSub = (props) => {\n const { __scopeMenubar, children, open: openProp, onOpenChange, defaultOpen } = props;\n const menuScope = useMenuScope(__scopeMenubar);\n const [open, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen ?? false,\n onChange: onOpenChange,\n caller: SUB_NAME\n });\n return /* @__PURE__ */ jsx(MenuPrimitive.Sub, { ...menuScope, open, onOpenChange: setOpen, children });\n};\nMenubarSub.displayName = SUB_NAME;\nvar SUB_TRIGGER_NAME = \"MenubarSubTrigger\";\nvar MenubarSubTrigger = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeMenubar, ...subTriggerProps } = props;\n const menuScope = useMenuScope(__scopeMenubar);\n return /* @__PURE__ */ jsx(\n MenuPrimitive.SubTrigger,\n {\n \"data-radix-menubar-subtrigger\": \"\",\n ...menuScope,\n ...subTriggerProps,\n ref: forwardedRef\n }\n );\n }\n);\nMenubarSubTrigger.displayName = SUB_TRIGGER_NAME;\nvar SUB_CONTENT_NAME = \"MenubarSubContent\";\nvar MenubarSubContent = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeMenubar, ...subContentProps } = props;\n const menuScope = useMenuScope(__scopeMenubar);\n return /* @__PURE__ */ jsx(\n MenuPrimitive.SubContent,\n {\n ...menuScope,\n \"data-radix-menubar-content\": \"\",\n ...subContentProps,\n ref: forwardedRef,\n style: {\n ...props.style,\n // re-namespace exposed content custom properties\n ...{\n \"--radix-menubar-content-transform-origin\": \"var(--radix-popper-transform-origin)\",\n \"--radix-menubar-content-available-width\": \"var(--radix-popper-available-width)\",\n \"--radix-menubar-content-available-height\": \"var(--radix-popper-available-height)\",\n \"--radix-menubar-trigger-width\": \"var(--radix-popper-anchor-width)\",\n \"--radix-menubar-trigger-height\": \"var(--radix-popper-anchor-height)\"\n }\n }\n }\n );\n }\n);\nMenubarSubContent.displayName = SUB_CONTENT_NAME;\nfunction wrapArray(array, startIndex) {\n return array.map((_, index) => array[(startIndex + index) % array.length]);\n}\nvar Root3 = Menubar;\nvar Menu = MenubarMenu;\nvar Trigger = MenubarTrigger;\nvar Portal2 = MenubarPortal;\nvar Content2 = MenubarContent;\nvar Group2 = MenubarGroup;\nvar Label2 = MenubarLabel;\nvar Item3 = MenubarItem;\nvar CheckboxItem2 = MenubarCheckboxItem;\nvar RadioGroup2 = MenubarRadioGroup;\nvar RadioItem2 = MenubarRadioItem;\nvar ItemIndicator2 = MenubarItemIndicator;\nvar Separator2 = MenubarSeparator;\nvar Arrow2 = MenubarArrow;\nvar Sub2 = MenubarSub;\nvar SubTrigger2 = MenubarSubTrigger;\nvar SubContent2 = MenubarSubContent;\nexport {\n Arrow2 as Arrow,\n CheckboxItem2 as CheckboxItem,\n Content2 as Content,\n Group2 as Group,\n Item3 as Item,\n ItemIndicator2 as ItemIndicator,\n Label2 as Label,\n Menu,\n Menubar,\n MenubarArrow,\n MenubarCheckboxItem,\n MenubarContent,\n MenubarGroup,\n MenubarItem,\n MenubarItemIndicator,\n MenubarLabel,\n MenubarMenu,\n MenubarPortal,\n MenubarRadioGroup,\n MenubarRadioItem,\n MenubarSeparator,\n MenubarSub,\n MenubarSubContent,\n MenubarSubTrigger,\n MenubarTrigger,\n Portal2 as Portal,\n RadioGroup2 as RadioGroup,\n RadioItem2 as RadioItem,\n Root3 as Root,\n Separator2 as Separator,\n Sub2 as Sub,\n SubContent2 as SubContent,\n SubTrigger2 as SubTrigger,\n Trigger,\n createMenubarScope\n};\n//# sourceMappingURL=index.mjs.map\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as MenubarPrimitive from \"@radix-ui/react-menubar\"\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Menubar({\n className,\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.Root>) {\n return (\n <MenubarPrimitive.Root\n data-slot=\"menubar\"\n className={cn(\n \"bg-background flex h-9 items-center gap-1 rounded-md border p-1 shadow-xs\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MenubarMenu({\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.Menu>) {\n return <MenubarPrimitive.Menu data-slot=\"menubar-menu\" {...props} />\n}\n\nfunction MenubarGroup({\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.Group>) {\n return <MenubarPrimitive.Group data-slot=\"menubar-group\" {...props} />\n}\n\nfunction MenubarPortal({\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.Portal>) {\n return <MenubarPrimitive.Portal data-slot=\"menubar-portal\" {...props} />\n}\n\nfunction MenubarRadioGroup({\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.RadioGroup>) {\n return (\n <MenubarPrimitive.RadioGroup data-slot=\"menubar-radio-group\" {...props} />\n )\n}\n\nfunction MenubarTrigger({\n className,\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.Trigger>) {\n return (\n <MenubarPrimitive.Trigger\n data-slot=\"menubar-trigger\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex items-center rounded-sm px-2 py-1 text-sm font-medium outline-hidden select-none\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MenubarContent({\n className,\n align = \"start\",\n alignOffset = -4,\n sideOffset = 8,\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.Content>) {\n return (\n <MenubarPortal>\n <MenubarPrimitive.Content\n data-slot=\"menubar-content\"\n align={align}\n alignOffset={alignOffset}\n sideOffset={sideOffset}\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[12rem] origin-(--radix-menubar-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-md\",\n className\n )}\n {...props}\n />\n </MenubarPortal>\n )\n}\n\nfunction MenubarItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.Item> & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n}) {\n return (\n <MenubarPrimitive.Item\n data-slot=\"menubar-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MenubarCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.CheckboxItem>) {\n return (\n <MenubarPrimitive.CheckboxItem\n data-slot=\"menubar-checkbox-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-xs py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <MenubarPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </MenubarPrimitive.ItemIndicator>\n </span>\n {children}\n </MenubarPrimitive.CheckboxItem>\n )\n}\n\nfunction MenubarRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.RadioItem>) {\n return (\n <MenubarPrimitive.RadioItem\n data-slot=\"menubar-radio-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-xs py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <MenubarPrimitive.ItemIndicator>\n <CircleIcon className=\"size-2 fill-current\" />\n </MenubarPrimitive.ItemIndicator>\n </span>\n {children}\n </MenubarPrimitive.RadioItem>\n )\n}\n\nfunction MenubarLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.Label> & {\n inset?: boolean\n}) {\n return (\n <MenubarPrimitive.Label\n data-slot=\"menubar-label\"\n data-inset={inset}\n className={cn(\n \"px-2 py-1.5 text-sm font-medium data-[inset]:pl-8\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MenubarSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.Separator>) {\n return (\n <MenubarPrimitive.Separator\n data-slot=\"menubar-separator\"\n className={cn(\"bg-border -mx-1 my-1 h-px\", className)}\n {...props}\n />\n )\n}\n\nfunction MenubarShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"menubar-shortcut\"\n className={cn(\n \"text-muted-foreground ml-auto text-xs tracking-widest\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction MenubarSub({\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.Sub>) {\n return <MenubarPrimitive.Sub data-slot=\"menubar-sub\" {...props} />\n}\n\nfunction MenubarSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.SubTrigger> & {\n inset?: boolean\n}) {\n return (\n <MenubarPrimitive.SubTrigger\n data-slot=\"menubar-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-none select-none data-[inset]:pl-8\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto h-4 w-4\" />\n </MenubarPrimitive.SubTrigger>\n )\n}\n\nfunction MenubarSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof MenubarPrimitive.SubContent>) {\n return (\n <MenubarPrimitive.SubContent\n data-slot=\"menubar-sub-content\"\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] origin-(--radix-menubar-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Menubar,\n MenubarPortal,\n MenubarMenu,\n MenubarTrigger,\n MenubarContent,\n MenubarGroup,\n MenubarSeparator,\n MenubarLabel,\n MenubarItem,\n MenubarShortcut,\n MenubarCheckboxItem,\n MenubarRadioGroup,\n MenubarRadioItem,\n MenubarSub,\n MenubarSubTrigger,\n MenubarSubContent,\n}\n"],"names":["MENUBAR_NAME","Collection","useCollection","createCollectionScope","createCollection","createMenubarContext","createMenubarScope","createContextScope","createRovingFocusGroupScope","useMenuScope","createMenuScope","useRovingFocusGroupScope","MenubarContextProvider","useMenubarContext","Menubar","React","props","forwardedRef","__scopeMenubar","valueProp","onValueChange","defaultValue","loop","dir","menubarProps","direction","useDirection","rovingFocusGroupScope","value","setValue","useControllableState","currentTabStopId","setCurrentTabStopId","jsx","value2","prevValue","RovingFocusGroup.Root","Primitive","MENU_NAME","MenubarMenuProvider","useMenubarMenuContext","MenubarMenu","menuProps","autoValue","useId","context","menuScope","triggerRef","wasKeyboardTriggerOpenRef","open","MenuPrimitive.Root","open2","TRIGGER_NAME","MenubarTrigger","disabled","triggerProps","menuContext","ref","composedRefs","useComposedRefs","isFocused","setIsFocused","RovingFocusGroup.Item","MenuPrimitive.Anchor","composeEventHandlers","event","PORTAL_NAME","MenubarPortal","portalProps","MenuPrimitive.Portal","CONTENT_NAME","MenubarContent","align","contentProps","getItems","hasInteractedOutsideRef","MenuPrimitive.Content","target","item","targetIsSubTrigger","isKeyDownInsideSubMenu","isPrevKey","candidateValues","currentIndex","wrapArray","nextValue","GROUP_NAME","MenubarGroup","groupProps","MenuPrimitive.Group","LABEL_NAME","MenubarLabel","labelProps","MenuPrimitive.Label","ITEM_NAME","MenubarItem","itemProps","MenuPrimitive.Item","CHECKBOX_ITEM_NAME","MenubarCheckboxItem","checkboxItemProps","MenuPrimitive.CheckboxItem","RADIO_GROUP_NAME","MenubarRadioGroup","radioGroupProps","MenuPrimitive.RadioGroup","RADIO_ITEM_NAME","MenubarRadioItem","radioItemProps","MenuPrimitive.RadioItem","INDICATOR_NAME","MenubarItemIndicator","itemIndicatorProps","MenuPrimitive.ItemIndicator","SEPARATOR_NAME","MenubarSeparator","separatorProps","MenuPrimitive.Separator","ARROW_NAME","MenubarArrow","arrowProps","MenuPrimitive.Arrow","SUB_NAME","MenubarSub","children","openProp","onOpenChange","defaultOpen","setOpen","MenuPrimitive.Sub","SUB_TRIGGER_NAME","MenubarSubTrigger","subTriggerProps","MenuPrimitive.SubTrigger","SUB_CONTENT_NAME","MenubarSubContent","subContentProps","MenuPrimitive.SubContent","array","startIndex","_","index","Root3","Menu","Trigger","Portal2","Content2","Group2","Label2","Item3","CheckboxItem2","RadioGroup2","RadioItem2","ItemIndicator2","Separator2","Sub2","SubTrigger2","SubContent2","className","MenubarPrimitive.Root","cn","MenubarPrimitive.Menu","MenubarPrimitive.Group","MenubarPrimitive.Portal","MenubarPrimitive.RadioGroup","MenubarPrimitive.Trigger","alignOffset","sideOffset","MenubarPrimitive.Content","inset","variant","MenubarPrimitive.Item","checked","jsxs","MenubarPrimitive.CheckboxItem","MenubarPrimitive.ItemIndicator","CheckIcon","MenubarPrimitive.RadioItem","CircleIcon","MenubarPrimitive.Label","MenubarPrimitive.Separator","MenubarShortcut","MenubarPrimitive.Sub","MenubarPrimitive.SubTrigger","ChevronRightIcon","MenubarPrimitive.SubContent"],"mappings":";;;;;;;;;;;;;;AAiBA,IAAIA,IAAe,WACf,CAACC,GAAYC,IAAeC,EAAqB,IAAIC,GAAiBJ,CAAY,GAClF,CAACK,GAAsBC,EAAkB,IAAIC,GAAmBP,GAAc;AAAA,EAChFG;AAAA,EACAK;AACF,CAAC,GACGC,IAAeC,GAAe,GAC9BC,IAA2BH,EAA2B,GACtD,CAACI,IAAwBC,CAAiB,IAAIR,EAAqBL,CAAY,GAC/Ec,IAAUC,EAAM;AAAA,EAClB,CAACC,GAAOC,MAAiB;AACvB,UAAM;AAAA,MACJ,gBAAAC;AAAA,MACA,OAAOC;AAAA,MACP,eAAAC;AAAA,MACA,cAAAC;AAAA,MACA,MAAAC,IAAO;AAAA,MACP,KAAAC;AAAA,MACA,GAAGC;AAAA,IACT,IAAQR,GACES,IAAYC,GAAaH,CAAG,GAC5BI,IAAwBhB,EAAyBO,CAAc,GAC/D,CAACU,GAAOC,CAAQ,IAAIC,EAAqB;AAAA,MAC7C,MAAMX;AAAA,MACN,UAAUC;AAAA,MACV,aAAaC,KAAgB;AAAA,MAC7B,QAAQrB;AAAA,IACd,CAAK,GACK,CAAC+B,GAAkBC,CAAmB,IAAIjB,EAAM,SAAS,IAAI;AACnE,WAAuB,gBAAAkB;AAAA,MACrBrB;AAAA,MACA;AAAA,QACE,OAAOM;AAAA,QACP,OAAAU;AAAA,QACA,YAAYb,EAAM;AAAA,UAChB,CAACmB,MAAW;AACV,YAAAL,EAASK,CAAM,GACfF,EAAoBE,CAAM;AAAA,UAC5B;AAAA,UACA,CAACL,CAAQ;AAAA,QACnB;AAAA,QACQ,aAAad,EAAM,YAAY,MAAMc,EAAS,EAAE,GAAG,CAACA,CAAQ,CAAC;AAAA,QAC7D,cAAcd,EAAM;AAAA,UAClB,CAACmB,MAAW;AACV,YAAAL,EAAS,CAACM,MAAcA,IAAY,KAAKD,CAAM,GAC/CF,EAAoBE,CAAM;AAAA,UAC5B;AAAA,UACA,CAACL,CAAQ;AAAA,QACnB;AAAA,QACQ,KAAKJ;AAAA,QACL,MAAAH;AAAA,QACA,UAA0B,gBAAAW,EAAIhC,EAAW,UAAU,EAAE,OAAOiB,GAAgB,UAA0B,gBAAAe,EAAIhC,EAAW,MAAM,EAAE,OAAOiB,GAAgB,UAA0B,gBAAAe;AAAA,UAC5KG;AAAAA,UACA;AAAA,YACE,SAAS;AAAA,YACT,GAAGT;AAAA,YACH,aAAa;AAAA,YACb,MAAAL;AAAA,YACA,KAAKG;AAAA,YACL,kBAAAM;AAAA,YACA,0BAA0BC;AAAA,YAC1B,UAA0B,gBAAAC,EAAII,EAAU,KAAK,EAAE,MAAM,WAAW,GAAGb,GAAc,KAAKP,EAAY,CAAE;AAAA,UAChH;AAAA,QACA,EAAS,CAAE,EAAC,CAAE;AAAA,MACd;AAAA,IACA;AAAA,EACE;AACF;AACAH,EAAQ,cAAcd;AACtB,IAAIsC,IAAY,eACZ,CAACC,IAAqBC,CAAqB,IAAInC,EAAqBiC,CAAS,GAC7EG,IAAc,CAACzB,MAAU;AAC3B,QAAM,EAAE,gBAAAE,GAAgB,OAAOC,GAAW,GAAGuB,EAAS,IAAK1B,GACrD2B,IAAYC,EAAK,GACjBhB,IAAQT,KAAawB,KAAa,2BAClCE,IAAUhC,EAAkByB,GAAWpB,CAAc,GACrD4B,IAAYrC,EAAaS,CAAc,GACvC6B,IAAahC,EAAM,OAAO,IAAI,GAC9BiC,IAA4BjC,EAAM,OAAO,EAAK,GAC9CkC,IAAOJ,EAAQ,UAAUjB;AAC/B,SAAAb,EAAM,UAAU,MAAM;AACpB,IAAKkC,MAAMD,EAA0B,UAAU;AAAA,EACjD,GAAG,CAACC,CAAI,CAAC,GACc,gBAAAhB;AAAA,IACrBM;AAAA,IACA;AAAA,MACE,OAAOrB;AAAA,MACP,OAAAU;AAAA,MACA,WAAWgB,EAAK;AAAA,MAChB,YAAAG;AAAA,MACA,WAAWH,EAAK;AAAA,MAChB,2BAAAI;AAAA,MACA,UAA0B,gBAAAf;AAAA,QACxBiB;AAAAA,QACA;AAAA,UACE,GAAGJ;AAAA,UACH,MAAAG;AAAA,UACA,cAAc,CAACE,MAAU;AACvB,YAAKA,KAAON,EAAQ,YAAW;AAAA,UACjC;AAAA,UACA,OAAO;AAAA,UACP,KAAKA,EAAQ;AAAA,UACb,GAAGH;AAAA,QACb;AAAA,MACA;AAAA,IACA;AAAA,EACA;AACA;AACAD,EAAY,cAAcH;AAC1B,IAAIc,IAAe,kBACfC,IAAiBtC,EAAM;AAAA,EACzB,CAACC,GAAOC,MAAiB;AACvB,UAAM,EAAE,gBAAAC,GAAgB,UAAAoC,IAAW,IAAO,GAAGC,EAAY,IAAKvC,GACxDW,IAAwBhB,EAAyBO,CAAc,GAC/D4B,IAAYrC,EAAaS,CAAc,GACvC2B,IAAUhC,EAAkBuC,GAAclC,CAAc,GACxDsC,IAAchB,EAAsBY,GAAclC,CAAc,GAChEuC,IAAM1C,EAAM,OAAO,IAAI,GACvB2C,IAAeC,GAAgB1C,GAAcwC,GAAKD,EAAY,UAAU,GACxE,CAACI,GAAWC,CAAY,IAAI9C,EAAM,SAAS,EAAK,GAChDkC,IAAOJ,EAAQ,UAAUW,EAAY;AAC3C,WAAuB,gBAAAvB,EAAIhC,EAAW,UAAU,EAAE,OAAOiB,GAAgB,OAAOsC,EAAY,OAAO,UAAAF,GAAU,UAA0B,gBAAArB;AAAA,MACrI6B;AAAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,GAAGnC;AAAA,QACH,WAAW,CAAC2B;AAAA,QACZ,WAAWE,EAAY;AAAA,QACvB,UAA0B,gBAAAvB,EAAI8B,IAAsB,EAAE,SAAS,IAAM,GAAGjB,GAAW,UAA0B,gBAAAb;AAAA,UAC3GI,EAAU;AAAA,UACV;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,IAAImB,EAAY;AAAA,YAChB,iBAAiB;AAAA,YACjB,iBAAiBP;AAAA,YACjB,iBAAiBA,IAAOO,EAAY,YAAY;AAAA,YAChD,oBAAoBI,IAAY,KAAK;AAAA,YACrC,cAAcX,IAAO,SAAS;AAAA,YAC9B,iBAAiBK,IAAW,KAAK;AAAA,YACjC,UAAAA;AAAA,YACA,GAAGC;AAAA,YACH,KAAKG;AAAA,YACL,eAAeM,EAAqBhD,EAAM,eAAe,CAACiD,MAAU;AAClE,cAAI,CAACX,KAAYW,EAAM,WAAW,KAAKA,EAAM,YAAY,OACvDpB,EAAQ,WAAWW,EAAY,KAAK,GAC/BP,KAAMgB,EAAM,eAAc;AAAA,YAEnC,CAAC;AAAA,YACD,gBAAgBD,EAAqBhD,EAAM,gBAAgB,MAAM;AAE/D,cADoB,EAAQ6B,EAAQ,SACjB,CAACI,MAClBJ,EAAQ,WAAWW,EAAY,KAAK,GACpCC,EAAI,SAAS,MAAK;AAAA,YAEtB,CAAC;AAAA,YACD,WAAWO,EAAqBhD,EAAM,WAAW,CAACiD,MAAU;AAC1D,cAAIX,MACA,CAAC,SAAS,GAAG,EAAE,SAASW,EAAM,GAAG,KAAGpB,EAAQ,aAAaW,EAAY,KAAK,GAC1ES,EAAM,QAAQ,eAAapB,EAAQ,WAAWW,EAAY,KAAK,GAC/D,CAAC,SAAS,KAAK,WAAW,EAAE,SAASS,EAAM,GAAG,MAChDT,EAAY,0BAA0B,UAAU,IAChDS,EAAM,eAAc;AAAA,YAExB,CAAC;AAAA,YACD,SAASD,EAAqBhD,EAAM,SAAS,MAAM6C,EAAa,EAAI,CAAC;AAAA,YACrE,QAAQG,EAAqBhD,EAAM,QAAQ,MAAM6C,EAAa,EAAK,CAAC;AAAA,UAChF;AAAA,QACA,EAAS,CAAE;AAAA,MACX;AAAA,IACA,GAAO;AAAA,EACL;AACF;AACAR,EAAe,cAAcD;AAC7B,IAAIc,KAAc,iBACdC,IAAgB,CAACnD,MAAU;AAC7B,QAAM,EAAE,gBAAAE,GAAgB,GAAGkD,EAAW,IAAKpD,GACrC8B,IAAYrC,EAAaS,CAAc;AAC7C,SAAuB,gBAAAe,EAAIoC,IAAsB,EAAE,GAAGvB,GAAW,GAAGsB,EAAW,CAAE;AACnF;AACAD,EAAc,cAAcD;AAC5B,IAAII,IAAe,kBACfC,IAAiBxD,EAAM;AAAA,EACzB,CAACC,GAAOC,MAAiB;AACvB,UAAM,EAAE,gBAAAC,GAAgB,OAAAsD,IAAQ,SAAS,GAAGC,EAAY,IAAKzD,GACvD8B,IAAYrC,EAAaS,CAAc,GACvC2B,IAAUhC,EAAkByD,GAAcpD,CAAc,GACxDsC,IAAchB,EAAsB8B,GAAcpD,CAAc,GAChEwD,IAAWxE,GAAcgB,CAAc,GACvCyD,IAA0B5D,EAAM,OAAO,EAAK;AAClD,WAAuB,gBAAAkB;AAAA,MACrB2C;AAAAA,MACA;AAAA,QACE,IAAIpB,EAAY;AAAA,QAChB,mBAAmBA,EAAY;AAAA,QAC/B,8BAA8B;AAAA,QAC9B,GAAGV;AAAA,QACH,GAAG2B;AAAA,QACH,KAAKxD;AAAA,QACL,OAAAuD;AAAA,QACA,kBAAkBR,EAAqBhD,EAAM,kBAAkB,CAACiD,MAAU;AAExE,UAAI,CADgB,EAAQpB,EAAQ,SAChB,CAAC8B,EAAwB,WAC3CnB,EAAY,WAAW,SAAS,MAAK,GAEvCmB,EAAwB,UAAU,IAClCV,EAAM,eAAc;AAAA,QACtB,CAAC;AAAA,QACD,gBAAgBD,EAAqBhD,EAAM,gBAAgB,CAACiD,MAAU;AACpE,gBAAMY,IAASZ,EAAM;AAErB,UADyBS,IAAW,KAAK,CAACI,MAASA,EAAK,IAAI,SAAS,SAASD,CAAM,CAAC,KAC/DZ,EAAM,eAAc;AAAA,QAC5C,CAAC;AAAA,QACD,mBAAmBD,EAAqBhD,EAAM,mBAAmB,MAAM;AACrE,UAAA2D,EAAwB,UAAU;AAAA,QACpC,CAAC;AAAA,QACD,cAAc,CAACV,MAAU;AACvB,UAAKT,EAAY,0BAA0B,WAASS,EAAM,eAAc;AAAA,QAC1E;AAAA,QACA,WAAWD;AAAA,UACThD,EAAM;AAAA,UACN,CAACiD,MAAU;AACT,gBAAI,CAAC,cAAc,WAAW,EAAE,SAASA,EAAM,GAAG,GAAG;AACnD,oBAAMY,IAASZ,EAAM,QACfc,IAAqBF,EAAO,aAAa,+BAA+B,GACxEG,IAAyBH,EAAO,QAAQ,8BAA8B,MAAMZ,EAAM,eAElFgB,KADcpC,EAAQ,QAAQ,QAAQ,eAAe,iBACzBoB,EAAM;AAGxC,kBAFkB,CAACgB,KACFF,KACbC,KAA0BC,EAAW;AAEzC,kBAAIC,IADUR,IAAW,OAAO,CAACI,MAAS,CAACA,EAAK,QAAQ,EAC5B,IAAI,CAACA,MAASA,EAAK,KAAK;AACpD,cAAIG,KAAWC,EAAgB,QAAO;AACtC,oBAAMC,IAAeD,EAAgB,QAAQ1B,EAAY,KAAK;AAC9D,cAAA0B,IAAkBrC,EAAQ,OAAOuC,GAAUF,GAAiBC,IAAe,CAAC,IAAID,EAAgB,MAAMC,IAAe,CAAC;AACtH,oBAAM,CAACE,CAAS,IAAIH;AACpB,cAAIG,KAAWxC,EAAQ,WAAWwC,CAAS;AAAA,YAC7C;AAAA,UACF;AAAA,UACA,EAAE,0BAA0B,GAAK;AAAA,QAC3C;AAAA,QACQ,OAAO;AAAA,UACL,GAAGrE,EAAM;AAAA,UAGP,4CAA4C;AAAA,UAC5C,2CAA2C;AAAA,UAC3C,4CAA4C;AAAA,UAC5C,iCAAiC;AAAA,UACjC,kCAAkC;AAAA,QAE9C;AAAA,MACA;AAAA,IACA;AAAA,EACE;AACF;AACAuD,EAAe,cAAcD;AAC7B,IAAIgB,KAAa,gBACbC,IAAexE,EAAM;AAAA,EACvB,CAACC,GAAOC,MAAiB;AACvB,UAAM,EAAE,gBAAAC,GAAgB,GAAGsE,EAAU,IAAKxE,GACpC8B,IAAYrC,EAAaS,CAAc;AAC7C,WAAuB,gBAAAe,EAAIwD,IAAqB,EAAE,GAAG3C,GAAW,GAAG0C,GAAY,KAAKvE,GAAc;AAAA,EACpG;AACF;AACAsE,EAAa,cAAcD;AAC3B,IAAII,KAAa,gBACbC,IAAe5E,EAAM;AAAA,EACvB,CAACC,GAAOC,MAAiB;AACvB,UAAM,EAAE,gBAAAC,GAAgB,GAAG0E,EAAU,IAAK5E,GACpC8B,IAAYrC,EAAaS,CAAc;AAC7C,WAAuB,gBAAAe,EAAI4D,IAAqB,EAAE,GAAG/C,GAAW,GAAG8C,GAAY,KAAK3E,GAAc;AAAA,EACpG;AACF;AACA0E,EAAa,cAAcD;AAC3B,IAAII,KAAY,eACZC,IAAchF,EAAM;AAAA,EACtB,CAACC,GAAOC,MAAiB;AACvB,UAAM,EAAE,gBAAAC,GAAgB,GAAG8E,EAAS,IAAKhF,GACnC8B,IAAYrC,EAAaS,CAAc;AAC7C,WAAuB,gBAAAe,EAAIgE,IAAoB,EAAE,GAAGnD,GAAW,GAAGkD,GAAW,KAAK/E,GAAc;AAAA,EAClG;AACF;AACA8E,EAAY,cAAcD;AAC1B,IAAII,KAAqB,uBACrBC,IAAsBpF,EAAM;AAAA,EAC9B,CAACC,GAAOC,MAAiB;AACvB,UAAM,EAAE,gBAAAC,GAAgB,GAAGkF,EAAiB,IAAKpF,GAC3C8B,IAAYrC,EAAaS,CAAc;AAC7C,WAAuB,gBAAAe,EAAIoE,IAA4B,EAAE,GAAGvD,GAAW,GAAGsD,GAAmB,KAAKnF,GAAc;AAAA,EAClH;AACF;AACAkF,EAAoB,cAAcD;AAClC,IAAII,KAAmB,qBACnBC,IAAoBxF,EAAM;AAAA,EAC5B,CAACC,GAAOC,MAAiB;AACvB,UAAM,EAAE,gBAAAC,GAAgB,GAAGsF,EAAe,IAAKxF,GACzC8B,IAAYrC,EAAaS,CAAc;AAC7C,WAAuB,gBAAAe,EAAIwE,IAA0B,EAAE,GAAG3D,GAAW,GAAG0D,GAAiB,KAAKvF,GAAc;AAAA,EAC9G;AACF;AACAsF,EAAkB,cAAcD;AAChC,IAAII,KAAkB,oBAClBC,IAAmB5F,EAAM;AAAA,EAC3B,CAACC,GAAOC,MAAiB;AACvB,UAAM,EAAE,gBAAAC,GAAgB,GAAG0F,EAAc,IAAK5F,GACxC8B,IAAYrC,EAAaS,CAAc;AAC7C,WAAuB,gBAAAe,EAAI4E,IAAyB,EAAE,GAAG/D,GAAW,GAAG8D,GAAgB,KAAK3F,GAAc;AAAA,EAC5G;AACF;AACA0F,EAAiB,cAAcD;AAC/B,IAAII,KAAiB,wBACjBC,IAAuBhG,EAAM,WAAW,CAACC,GAAOC,MAAiB;AACnE,QAAM,EAAE,gBAAAC,GAAgB,GAAG8F,EAAkB,IAAKhG,GAC5C8B,IAAYrC,EAAaS,CAAc;AAC7C,SAAuB,gBAAAe,EAAIgF,IAA6B,EAAE,GAAGnE,GAAW,GAAGkE,GAAoB,KAAK/F,GAAc;AACpH,CAAC;AACD8F,EAAqB,cAAcD;AACnC,IAAII,KAAiB,oBACjBC,IAAmBpG,EAAM;AAAA,EAC3B,CAACC,GAAOC,MAAiB;AACvB,UAAM,EAAE,gBAAAC,GAAgB,GAAGkG,EAAc,IAAKpG,GACxC8B,IAAYrC,EAAaS,CAAc;AAC7C,WAAuB,gBAAAe,EAAIoF,IAAyB,EAAE,GAAGvE,GAAW,GAAGsE,GAAgB,KAAKnG,GAAc;AAAA,EAC5G;AACF;AACAkG,EAAiB,cAAcD;AAC/B,IAAII,KAAa,gBACbC,KAAexG,EAAM;AAAA,EACvB,CAACC,GAAOC,MAAiB;AACvB,UAAM,EAAE,gBAAAC,GAAgB,GAAGsG,EAAU,IAAKxG,GACpC8B,IAAYrC,EAAaS,CAAc;AAC7C,WAAuB,gBAAAe,EAAIwF,IAAqB,EAAE,GAAG3E,GAAW,GAAG0E,GAAY,KAAKvG,GAAc;AAAA,EACpG;AACF;AACAsG,GAAa,cAAcD;AAC3B,IAAII,IAAW,cACXC,KAAa,CAAC3G,MAAU;AAC1B,QAAM,EAAE,gBAAAE,GAAgB,UAAA0G,GAAU,MAAMC,GAAU,cAAAC,GAAc,aAAAC,EAAW,IAAK/G,GAC1E8B,IAAYrC,EAAaS,CAAc,GACvC,CAAC+B,GAAM+E,CAAO,IAAIlG,EAAqB;AAAA,IAC3C,MAAM+F;AAAA,IACN,aAAaE,KAAe;AAAA,IAC5B,UAAUD;AAAA,IACV,QAAQJ;AAAA,EACZ,CAAG;AACD,SAAuB,gBAAAzF,EAAIgG,IAAmB,EAAE,GAAGnF,GAAW,MAAAG,GAAM,cAAc+E,GAAS,UAAAJ,GAAU;AACvG;AACAD,GAAW,cAAcD;AACzB,IAAIQ,KAAmB,qBACnBC,KAAoBpH,EAAM;AAAA,EAC5B,CAACC,GAAOC,MAAiB;AACvB,UAAM,EAAE,gBAAAC,GAAgB,GAAGkH,EAAe,IAAKpH,GACzC8B,IAAYrC,EAAaS,CAAc;AAC7C,WAAuB,gBAAAe;AAAA,MACrBoG;AAAAA,MACA;AAAA,QACE,iCAAiC;AAAA,QACjC,GAAGvF;AAAA,QACH,GAAGsF;AAAA,QACH,KAAKnH;AAAA,MACb;AAAA,IACA;AAAA,EACE;AACF;AACAkH,GAAkB,cAAcD;AAChC,IAAII,KAAmB,qBACnBC,KAAoBxH,EAAM;AAAA,EAC5B,CAACC,GAAOC,MAAiB;AACvB,UAAM,EAAE,gBAAAC,GAAgB,GAAGsH,EAAe,IAAKxH,GACzC8B,IAAYrC,EAAaS,CAAc;AAC7C,WAAuB,gBAAAe;AAAA,MACrBwG;AAAAA,MACA;AAAA,QACE,GAAG3F;AAAA,QACH,8BAA8B;AAAA,QAC9B,GAAG0F;AAAA,QACH,KAAKvH;AAAA,QACL,OAAO;AAAA,UACL,GAAGD,EAAM;AAAA,UAGP,4CAA4C;AAAA,UAC5C,2CAA2C;AAAA,UAC3C,4CAA4C;AAAA,UAC5C,iCAAiC;AAAA,UACjC,kCAAkC;AAAA,QAE9C;AAAA,MACA;AAAA,IACA;AAAA,EACE;AACF;AACAuH,GAAkB,cAAcD;AAChC,SAASlD,GAAUsD,GAAOC,GAAY;AACpC,SAAOD,EAAM,IAAI,CAACE,GAAGC,MAAUH,GAAOC,IAAaE,KAASH,EAAM,MAAM,CAAC;AAC3E;AACA,IAAII,KAAQhI,GACRiI,KAAOtG,GACPuG,KAAU3F,GACV4F,KAAU9E,GACV+E,KAAW3E,GACX4E,KAAS5D,GACT6D,KAASzD,GACT0D,KAAQtD,GACRuD,KAAgBnD,GAChBoD,KAAchD,GACdiD,KAAa7C,GACb8C,KAAiB1C,GACjB2C,KAAavC,GAEbwC,KAAOhC,IACPiC,KAAczB,IACd0B,KAActB;ACvalB,SAASzH,GAAQ;AAAA,EACf,WAAAgJ;AAAA,EACA,GAAG9I;AACL,GAAuD;AACrD,SACE,gBAAAiB;AAAA,IAAC8H;AAAAA,IAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAWC;AAAA,QACT;AAAA,QACAF;AAAA,MAAA;AAAA,MAED,GAAG9I;AAAA,IAAA;AAAA,EAAA;AAGV;AAEA,SAASyB,GAAY;AAAA,EACnB,GAAGzB;AACL,GAAuD;AACrD,2BAAQiJ,IAAA,EAAsB,aAAU,gBAAgB,GAAGjJ,GAAO;AACpE;AAEA,SAASuE,GAAa;AAAA,EACpB,GAAGvE;AACL,GAAwD;AACtD,2BAAQkJ,IAAA,EAAuB,aAAU,iBAAiB,GAAGlJ,GAAO;AACtE;AAEA,SAASmD,GAAc;AAAA,EACrB,GAAGnD;AACL,GAAyD;AACvD,2BAAQmJ,IAAA,EAAwB,aAAU,kBAAkB,GAAGnJ,GAAO;AACxE;AAEA,SAASuF,GAAkB;AAAA,EACzB,GAAGvF;AACL,GAA6D;AAC3D,2BACGoJ,IAAA,EAA4B,aAAU,uBAAuB,GAAGpJ,GAAO;AAE5E;AAEA,SAASqC,GAAe;AAAA,EACtB,WAAAyG;AAAA,EACA,GAAG9I;AACL,GAA0D;AACxD,SACE,gBAAAiB;AAAA,IAACoI;AAAAA,IAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAWL;AAAA,QACT;AAAA,QACAF;AAAA,MAAA;AAAA,MAED,GAAG9I;AAAA,IAAA;AAAA,EAAA;AAGV;AAEA,SAASuD,GAAe;AAAA,EACtB,WAAAuF;AAAA,EACA,OAAAtF,IAAQ;AAAA,EACR,aAAA8F,IAAc;AAAA,EACd,YAAAC,IAAa;AAAA,EACb,GAAGvJ;AACL,GAA0D;AACxD,2BACGmD,IAAA,EACC,UAAA,gBAAAlC;AAAA,IAACuI;AAAAA,IAAA;AAAA,MACC,aAAU;AAAA,MACV,OAAAhG;AAAA,MACA,aAAA8F;AAAA,MACA,YAAAC;AAAA,MACA,WAAWP;AAAA,QACT;AAAA,QACAF;AAAA,MAAA;AAAA,MAED,GAAG9I;AAAA,IAAA;AAAA,EAAA,GAER;AAEJ;AAEA,SAAS+E,GAAY;AAAA,EACnB,WAAA+D;AAAA,EACA,OAAAW;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,GAAG1J;AACL,GAGG;AACD,SACE,gBAAAiB;AAAA,IAAC0I;AAAAA,IAAA;AAAA,MACC,aAAU;AAAA,MACV,cAAYF;AAAA,MACZ,gBAAcC;AAAA,MACd,WAAWV;AAAA,QACT;AAAA,QACAF;AAAA,MAAA;AAAA,MAED,GAAG9I;AAAA,IAAA;AAAA,EAAA;AAGV;AAEA,SAASmF,GAAoB;AAAA,EAC3B,WAAA2D;AAAA,EACA,UAAAlC;AAAA,EACA,SAAAgD;AAAA,EACA,GAAG5J;AACL,GAA+D;AAC7D,SACE,gBAAA6J;AAAA,IAACC;AAAAA,IAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAWd;AAAA,QACT;AAAA,QACAF;AAAA,MAAA;AAAA,MAEF,SAAAc;AAAA,MACC,GAAG5J;AAAA,MAEJ,UAAA;AAAA,QAAA,gBAAAiB,EAAC,QAAA,EAAK,WAAU,iFACd,UAAA,gBAAAA,EAAC8I,IAAA,EACC,UAAA,gBAAA9I,EAAC+I,IAAA,EAAU,WAAU,SAAA,CAAS,EAAA,CAChC,GACF;AAAA,QACCpD;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGP;AAEA,SAASjB,GAAiB;AAAA,EACxB,WAAAmD;AAAA,EACA,UAAAlC;AAAA,EACA,GAAG5G;AACL,GAA4D;AAC1D,SACE,gBAAA6J;AAAA,IAACI;AAAAA,IAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAWjB;AAAA,QACT;AAAA,QACAF;AAAA,MAAA;AAAA,MAED,GAAG9I;AAAA,MAEJ,UAAA;AAAA,QAAA,gBAAAiB,EAAC,QAAA,EAAK,WAAU,iFACd,UAAA,gBAAAA,EAAC8I,IAAA,EACC,UAAA,gBAAA9I,EAACiJ,IAAA,EAAW,WAAU,sBAAA,CAAsB,EAAA,CAC9C,GACF;AAAA,QACCtD;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGP;AAEA,SAASjC,GAAa;AAAA,EACpB,WAAAmE;AAAA,EACA,OAAAW;AAAA,EACA,GAAGzJ;AACL,GAEG;AACD,SACE,gBAAAiB;AAAA,IAACkJ;AAAAA,IAAA;AAAA,MACC,aAAU;AAAA,MACV,cAAYV;AAAA,MACZ,WAAWT;AAAA,QACT;AAAA,QACAF;AAAA,MAAA;AAAA,MAED,GAAG9I;AAAA,IAAA;AAAA,EAAA;AAGV;AAEA,SAASmG,GAAiB;AAAA,EACxB,WAAA2C;AAAA,EACA,GAAG9I;AACL,GAA4D;AAC1D,SACE,gBAAAiB;AAAA,IAACmJ;AAAAA,IAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAWpB,EAAG,6BAA6BF,CAAS;AAAA,MACnD,GAAG9I;AAAA,IAAA;AAAA,EAAA;AAGV;AAEA,SAASqK,GAAgB;AAAA,EACvB,WAAAvB;AAAA,EACA,GAAG9I;AACL,GAAiC;AAC/B,SACE,gBAAAiB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW+H;AAAA,QACT;AAAA,QACAF;AAAA,MAAA;AAAA,MAED,GAAG9I;AAAA,IAAA;AAAA,EAAA;AAGV;AAEA,SAAS2G,GAAW;AAAA,EAClB,GAAG3G;AACL,GAAsD;AACpD,2BAAQsK,IAAA,EAAqB,aAAU,eAAe,GAAGtK,GAAO;AAClE;AAEA,SAASmH,GAAkB;AAAA,EACzB,WAAA2B;AAAA,EACA,OAAAW;AAAA,EACA,UAAA7C;AAAA,EACA,GAAG5G;AACL,GAEG;AACD,SACE,gBAAA6J;AAAA,IAACU;AAAAA,IAAA;AAAA,MACC,aAAU;AAAA,MACV,cAAYd;AAAA,MACZ,WAAWT;AAAA,QACT;AAAA,QACAF;AAAA,MAAA;AAAA,MAED,GAAG9I;AAAA,MAEH,UAAA;AAAA,QAAA4G;AAAA,QACD,gBAAA3F,EAACuJ,IAAA,EAAiB,WAAU,kBAAA,CAAkB;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGpD;AAEA,SAASjD,GAAkB;AAAA,EACzB,WAAAuB;AAAA,EACA,GAAG9I;AACL,GAA6D;AAC3D,SACE,gBAAAiB;AAAA,IAACwJ;AAAAA,IAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAWzB;AAAA,QACT;AAAA,QACAF;AAAA,MAAA;AAAA,MAED,GAAG9I;AAAA,IAAA;AAAA,EAAA;AAGV;","x_google_ignoreList":[0]}
package/dist/mobile.js ADDED
@@ -0,0 +1,183 @@
1
+ import { jsx as e, jsxs as s } from "react/jsx-runtime";
2
+ import * as M from "react";
3
+ import { createContext as w, forwardRef as p, useState as C, useContext as f } from "react";
4
+ import { c as g } from "./index-Bke1qZdk.js";
5
+ import { c as b } from "./utils-CwJPJKOE.js";
6
+ import { Button as h } from "./button.js";
7
+ import { C as z } from "./chevron-left-C1pkx4AF.js";
8
+ import { M as T } from "./menu-DBhEanGo.js";
9
+ const u = w({
10
+ scheme: "tabbed",
11
+ tone: "clean",
12
+ size: "lg"
13
+ }), L = g(
14
+ "min-h-screen flex flex-col bg-background",
15
+ {
16
+ variants: {
17
+ tone: {
18
+ clean: "bg-background text-foreground",
19
+ subtle: "bg-muted/5 text-foreground",
20
+ brand: "bg-primary/5 text-foreground",
21
+ contrast: "bg-zinc-900 text-zinc-100"
22
+ }
23
+ },
24
+ defaultVariants: {
25
+ tone: "clean"
26
+ }
27
+ }
28
+ ), x = p(({
29
+ scheme: r = "tabbed",
30
+ tone: a = "clean",
31
+ size: o = "lg",
32
+ tabs: n = [],
33
+ defaultTab: c,
34
+ className: l,
35
+ children: d
36
+ }, i) => {
37
+ const [m, t] = C(c || n[0]?.key);
38
+ return /* @__PURE__ */ e(u.Provider, { value: { scheme: r, tone: a, size: o, activeTab: m, setActiveTab: t }, children: /* @__PURE__ */ e(
39
+ "div",
40
+ {
41
+ ref: i,
42
+ className: b(L({ tone: a }), l),
43
+ children: d
44
+ }
45
+ ) });
46
+ });
47
+ x.displayName = "MobileLayout";
48
+ const y = p(({
49
+ title: r,
50
+ onBack: a,
51
+ onMenu: o,
52
+ actions: n,
53
+ className: c,
54
+ children: l
55
+ }, d) => {
56
+ const { scheme: i, tone: m } = f(u), t = g(
57
+ "sticky top-0 z-50 w-full border-b bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60",
58
+ {
59
+ variants: {
60
+ tone: {
61
+ clean: "border-border",
62
+ subtle: "border-muted bg-muted/10",
63
+ brand: "border-primary/20 bg-primary/5",
64
+ contrast: "border-zinc-700 bg-zinc-900"
65
+ }
66
+ }
67
+ }
68
+ );
69
+ return /* @__PURE__ */ s("div", { ref: d, className: b(t({ tone: m }), c), children: [
70
+ /* @__PURE__ */ e("div", { className: "h-safe-top", style: { paddingTop: "env(safe-area-inset-top)" } }),
71
+ /* @__PURE__ */ s("div", { className: "flex h-14 items-center px-4", children: [
72
+ /* @__PURE__ */ s("div", { className: "flex items-center gap-2", children: [
73
+ i === "stack" && a && /* @__PURE__ */ s(
74
+ h,
75
+ {
76
+ variant: "ghost",
77
+ size: "sm",
78
+ onClick: a,
79
+ className: "h-9 w-9 p-0",
80
+ children: [
81
+ /* @__PURE__ */ e(z, { className: "h-5 w-5" }),
82
+ /* @__PURE__ */ e("span", { className: "sr-only", children: "Back" })
83
+ ]
84
+ }
85
+ ),
86
+ i === "drawer" && o && /* @__PURE__ */ s(
87
+ h,
88
+ {
89
+ variant: "ghost",
90
+ size: "sm",
91
+ onClick: o,
92
+ className: "h-9 w-9 p-0",
93
+ children: [
94
+ /* @__PURE__ */ e(T, { className: "h-5 w-5" }),
95
+ /* @__PURE__ */ e("span", { className: "sr-only", children: "Menu" })
96
+ ]
97
+ }
98
+ )
99
+ ] }),
100
+ /* @__PURE__ */ s("div", { className: "flex-1 text-center", children: [
101
+ r && /* @__PURE__ */ e("h1", { className: "text-lg font-semibold tracking-tight", children: r }),
102
+ l
103
+ ] }),
104
+ /* @__PURE__ */ e("div", { className: "flex items-center gap-2", children: n })
105
+ ] })
106
+ ] });
107
+ });
108
+ y.displayName = "MobileLayout.Header";
109
+ const v = p(({
110
+ className: r,
111
+ noScroll: a = !1,
112
+ children: o
113
+ }, n) => {
114
+ const { scheme: c } = f(u);
115
+ return /* @__PURE__ */ e(
116
+ "div",
117
+ {
118
+ ref: n,
119
+ className: b(
120
+ "flex-1 w-full",
121
+ !a && "overflow-y-auto",
122
+ c === "tabbed" && "pb-16",
123
+ // Space for tab bar
124
+ r
125
+ ),
126
+ children: o
127
+ }
128
+ );
129
+ });
130
+ v.displayName = "MobileLayout.Content";
131
+ const N = p(({
132
+ tabs: r,
133
+ onTabClick: a,
134
+ className: o
135
+ }, n) => {
136
+ const { tone: c, activeTab: l, setActiveTab: d } = f(u), i = (t) => {
137
+ d?.(t), a?.(t);
138
+ }, m = g(
139
+ "fixed bottom-0 left-0 right-0 z-50 border-t bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60",
140
+ {
141
+ variants: {
142
+ tone: {
143
+ clean: "border-border",
144
+ subtle: "border-muted bg-muted/10",
145
+ brand: "border-primary/20 bg-primary/5",
146
+ contrast: "border-zinc-700 bg-zinc-900"
147
+ }
148
+ }
149
+ }
150
+ );
151
+ return /* @__PURE__ */ s("div", { ref: n, className: b(m({ tone: c }), o), children: [
152
+ /* @__PURE__ */ e("div", { className: "flex h-16 items-center justify-around px-2", children: r.map((t) => {
153
+ const k = l === t.key;
154
+ return /* @__PURE__ */ s(
155
+ "button",
156
+ {
157
+ onClick: () => i(t.key),
158
+ className: b(
159
+ "flex flex-col items-center justify-center gap-1 rounded-lg px-3 py-2 text-xs font-medium transition-colors min-w-[60px]",
160
+ k ? "text-primary" : "text-muted-foreground hover:text-foreground"
161
+ ),
162
+ children: [
163
+ t.icon && /* @__PURE__ */ e("span", { className: "h-5 w-5", children: M.createElement(t.icon, { className: "h-5 w-5" }) }),
164
+ /* @__PURE__ */ e("span", { className: "truncate", children: t.label })
165
+ ]
166
+ },
167
+ t.key
168
+ );
169
+ }) }),
170
+ /* @__PURE__ */ e("div", { className: "h-safe-bottom", style: { paddingBottom: "env(safe-area-inset-bottom)" } })
171
+ ] });
172
+ });
173
+ N.displayName = "MobileLayout.TabBar";
174
+ const O = Object.assign(x, {
175
+ Header: y,
176
+ Content: v,
177
+ TabBar: N
178
+ }), P = () => f(u);
179
+ export {
180
+ O as MobileLayout,
181
+ P as useMobileLayout
182
+ };
183
+ //# sourceMappingURL=mobile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mobile.js","sources":["../src/components/layouts/mobile.tsx"],"sourcesContent":["/**\n * Mobile Layout - Native mobile app layout with tabs/stack navigation\n * @module @bloomneo/uikit\n * @file src/components/layouts/mobile.tsx\n */\n\nimport * as React from 'react';\nimport { forwardRef, createContext, useContext, useState } from 'react';\nimport { cva } from 'class-variance-authority';\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/button';\nimport { ChevronLeft, Menu } from 'lucide-react';\nimport type { NavigationItem, Size, Tone } from '@/types';\n\n/**\n * MobileLayout schemes - mobile navigation patterns\n * tabbed: Bottom tab navigation (iOS/Android standard)\n * stack: Stack navigation with back button (detail pages)\n * drawer: Side drawer navigation (hamburger menu)\n */\nexport type MobileLayoutScheme = 'tabbed' | 'stack' | 'drawer';\n\n/**\n * Mobile context for sharing configuration across compound components\n */\nconst MobileContext = createContext<{\n scheme: MobileLayoutScheme;\n tone: Tone;\n size: Size;\n activeTab?: string;\n setActiveTab?: (tab: string) => void;\n}>({\n scheme: 'tabbed',\n tone: 'clean',\n size: 'lg',\n});\n\n/**\n * Mobile layout container variants\n */\nconst mobileVariants = cva(\n 'min-h-screen flex flex-col bg-background',\n {\n variants: {\n tone: {\n clean: 'bg-background text-foreground',\n subtle: 'bg-muted/5 text-foreground',\n brand: 'bg-primary/5 text-foreground',\n contrast: 'bg-zinc-900 text-zinc-100'\n }\n },\n defaultVariants: {\n tone: 'clean'\n }\n }\n);\n\n/**\n * MobileLayout Root - Container with context\n */\nexport interface MobileLayoutProps {\n /** RECOMMENDED: Layout scheme (default: \"tabbed\") */\n scheme?: MobileLayoutScheme;\n /** RECOMMENDED: Visual styling tone (default: \"clean\") */\n tone?: Tone;\n /** OPTIONAL: Layout size (default: \"lg\") */\n size?: Size;\n /** OPTIONAL: Tabs for tabbed scheme */\n tabs?: NavigationItem[];\n /** OPTIONAL: Default active tab */\n defaultTab?: string;\n /** OPTIONAL: Additional CSS classes */\n className?: string;\n /** REQUIRED: Mobile layout structure */\n children: React.ReactNode;\n}\n\n/**\n * MobileLayout Root Component\n * @llm-usage\n * <MobileLayout scheme=\"tabbed\" tone=\"clean\" tabs={[...]}>\n * <MobileLayout.Header title=\"Home\" />\n * <MobileLayout.Content>{children}</MobileLayout.Content>\n * </MobileLayout>\n */\nconst MobileLayoutRoot = forwardRef<HTMLDivElement, MobileLayoutProps>(({\n scheme = 'tabbed',\n tone = 'clean',\n size = 'lg',\n tabs = [],\n defaultTab,\n className,\n children,\n}, ref) => {\n const [activeTab, setActiveTab] = useState(defaultTab || tabs[0]?.key);\n\n return (\n <MobileContext.Provider value={{ scheme, tone, size, activeTab, setActiveTab }}>\n <div\n ref={ref}\n className={cn(mobileVariants({ tone }), className)}\n >\n {children}\n </div>\n </MobileContext.Provider>\n );\n});\nMobileLayoutRoot.displayName = 'MobileLayout';\n\n/**\n * Mobile Header Component\n */\nexport interface MobileHeaderProps {\n /** OPTIONAL: Header title */\n title?: string;\n /** OPTIONAL: Back button handler (for stack scheme) */\n onBack?: () => void;\n /** OPTIONAL: Show menu button (for drawer scheme) */\n onMenu?: () => void;\n /** OPTIONAL: Actions on the right */\n actions?: React.ReactNode;\n /** OPTIONAL: Additional CSS classes */\n className?: string;\n /** OPTIONAL: Children for custom header content */\n children?: React.ReactNode;\n}\n\nconst MobileHeader = forwardRef<HTMLDivElement, MobileHeaderProps>(({\n title,\n onBack,\n onMenu,\n actions,\n className,\n children,\n}, ref) => {\n const { scheme, tone } = useContext(MobileContext);\n\n const headerVariants = cva(\n 'sticky top-0 z-50 w-full border-b bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60',\n {\n variants: {\n tone: {\n clean: 'border-border',\n subtle: 'border-muted bg-muted/10',\n brand: 'border-primary/20 bg-primary/5',\n contrast: 'border-zinc-700 bg-zinc-900'\n }\n }\n }\n );\n\n return (\n <div ref={ref} className={cn(headerVariants({ tone }), className)}>\n {/* Safe area for iOS notch */}\n <div className=\"h-safe-top\" style={{ paddingTop: 'env(safe-area-inset-top)' }} />\n\n <div className=\"flex h-14 items-center px-4\">\n {/* Left section */}\n <div className=\"flex items-center gap-2\">\n {scheme === 'stack' && onBack && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onBack}\n className=\"h-9 w-9 p-0\"\n >\n <ChevronLeft className=\"h-5 w-5\" />\n <span className=\"sr-only\">Back</span>\n </Button>\n )}\n {scheme === 'drawer' && onMenu && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onMenu}\n className=\"h-9 w-9 p-0\"\n >\n <Menu className=\"h-5 w-5\" />\n <span className=\"sr-only\">Menu</span>\n </Button>\n )}\n </div>\n\n {/* Center - Title */}\n <div className=\"flex-1 text-center\">\n {title && (\n <h1 className=\"text-lg font-semibold tracking-tight\">{title}</h1>\n )}\n {children}\n </div>\n\n {/* Right - Actions */}\n <div className=\"flex items-center gap-2\">\n {actions}\n </div>\n </div>\n </div>\n );\n});\nMobileHeader.displayName = 'MobileLayout.Header';\n\n/**\n * Mobile Content Component\n */\nexport interface MobileContentProps {\n /** OPTIONAL: Additional CSS classes */\n className?: string;\n /** OPTIONAL: Disable scroll */\n noScroll?: boolean;\n /** REQUIRED: Page content */\n children: React.ReactNode;\n}\n\nconst MobileContent = forwardRef<HTMLDivElement, MobileContentProps>(({\n className,\n noScroll = false,\n children,\n}, ref) => {\n const { scheme } = useContext(MobileContext);\n\n return (\n <div\n ref={ref}\n className={cn(\n 'flex-1 w-full',\n !noScroll && 'overflow-y-auto',\n scheme === 'tabbed' && 'pb-16', // Space for tab bar\n className\n )}\n >\n {children}\n </div>\n );\n});\nMobileContent.displayName = 'MobileLayout.Content';\n\n/**\n * Mobile TabBar Component (for tabbed scheme)\n */\nexport interface MobileTabBarProps {\n /** REQUIRED: Navigation tabs */\n tabs: NavigationItem[];\n /** OPTIONAL: Tab click handler */\n onTabClick?: (tabId: string) => void;\n /** OPTIONAL: Additional CSS classes */\n className?: string;\n}\n\nconst MobileTabBar = forwardRef<HTMLDivElement, MobileTabBarProps>(({\n tabs,\n onTabClick,\n className,\n}, ref) => {\n const { tone, activeTab, setActiveTab } = useContext(MobileContext);\n\n const handleTabClick = (tabId: string) => {\n setActiveTab?.(tabId);\n onTabClick?.(tabId);\n };\n\n const tabBarVariants = cva(\n 'fixed bottom-0 left-0 right-0 z-50 border-t bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60',\n {\n variants: {\n tone: {\n clean: 'border-border',\n subtle: 'border-muted bg-muted/10',\n brand: 'border-primary/20 bg-primary/5',\n contrast: 'border-zinc-700 bg-zinc-900'\n }\n }\n }\n );\n\n return (\n <div ref={ref} className={cn(tabBarVariants({ tone }), className)}>\n <div className=\"flex h-16 items-center justify-around px-2\">\n {tabs.map((tab) => {\n const isActive = activeTab === tab.key;\n return (\n <button\n key={tab.key}\n onClick={() => handleTabClick(tab.key)}\n className={cn(\n 'flex flex-col items-center justify-center gap-1 rounded-lg px-3 py-2 text-xs font-medium transition-colors min-w-[60px]',\n isActive\n ? 'text-primary'\n : 'text-muted-foreground hover:text-foreground'\n )}\n >\n {tab.icon && (\n <span className=\"h-5 w-5\">\n {React.createElement(tab.icon, { className: 'h-5 w-5' })}\n </span>\n )}\n <span className=\"truncate\">{tab.label}</span>\n </button>\n );\n })}\n </div>\n {/* Safe area for iOS home indicator */}\n <div className=\"h-safe-bottom\" style={{ paddingBottom: 'env(safe-area-inset-bottom)' }} />\n </div>\n );\n});\nMobileTabBar.displayName = 'MobileLayout.TabBar';\n\n/**\n * MobileLayout compound component export\n */\nexport const MobileLayout = Object.assign(MobileLayoutRoot, {\n Header: MobileHeader,\n Content: MobileContent,\n TabBar: MobileTabBar,\n});\n\n/**\n * Hook to access mobile layout context\n */\nexport const useMobileLayout = () => useContext(MobileContext);\n"],"names":["MobileContext","createContext","mobileVariants","cva","MobileLayoutRoot","forwardRef","scheme","tone","size","tabs","defaultTab","className","children","ref","activeTab","setActiveTab","useState","jsx","cn","MobileHeader","title","onBack","onMenu","actions","useContext","headerVariants","jsxs","Button","ChevronLeft","Menu","MobileContent","noScroll","MobileTabBar","onTabClick","handleTabClick","tabId","tabBarVariants","tab","isActive","React","MobileLayout","useMobileLayout"],"mappings":"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"}
package/dist/motion.js ADDED
@@ -0,0 +1,119 @@
1
+ import { jsx as p } from "react/jsx-runtime";
2
+ import * as o from "react";
3
+ import { forwardRef as v } from "react";
4
+ import { c } from "./utils-CwJPJKOE.js";
5
+ const u = (e, s = "normal", n = 0, t = "immediate") => {
6
+ const a = {
7
+ fast: "duration-200",
8
+ normal: "duration-300",
9
+ slow: "duration-500"
10
+ }, r = {
11
+ fadeIn: "animate-in fade-in",
12
+ slideInUp: "animate-in slide-in-from-bottom-4",
13
+ scaleIn: "animate-in zoom-in-95",
14
+ slideInDown: "animate-in slide-in-from-top-4",
15
+ pulse: "animate-pulse"
16
+ }, i = {
17
+ immediate: "",
18
+ hover: "hover:animate-in",
19
+ inView: "motion-safe:animate-in"
20
+ // Uses CSS animation with reduced motion support
21
+ };
22
+ return [
23
+ r[e],
24
+ a[s],
25
+ i[t],
26
+ n > 0 ? `delay-[${n}ms]` : ""
27
+ ].filter(Boolean).join(" ");
28
+ }, w = v(({
29
+ as: e = "div",
30
+ preset: s = "fadeIn",
31
+ duration: n = "normal",
32
+ delay: t = 0,
33
+ trigger: a = "immediate",
34
+ className: r,
35
+ children: i,
36
+ ...m
37
+ }, l) => {
38
+ const d = u(s, n, t, a);
39
+ return o.createElement(
40
+ e,
41
+ {
42
+ ...m,
43
+ ref: l,
44
+ className: c(d, r)
45
+ },
46
+ i
47
+ );
48
+ });
49
+ w.displayName = "Motion";
50
+ const I = ({
51
+ size: e = "md",
52
+ className: s
53
+ }) => /* @__PURE__ */ p(
54
+ "div",
55
+ {
56
+ className: c(
57
+ "rounded-full border-2 border-primary border-t-transparent animate-spin",
58
+ {
59
+ sm: "h-4 w-4",
60
+ md: "h-6 w-6",
61
+ lg: "h-8 w-8"
62
+ }[e],
63
+ s
64
+ )
65
+ }
66
+ ), y = ({
67
+ preset: e = "fadeIn",
68
+ duration: s = "normal",
69
+ delay: n = 0,
70
+ as: t = "div",
71
+ className: a,
72
+ children: r
73
+ }) => {
74
+ const [i, m] = o.useState(!1), l = o.useRef(null);
75
+ o.useEffect(() => {
76
+ const f = new IntersectionObserver(
77
+ ([h]) => {
78
+ h.isIntersecting && (m(!0), f.disconnect());
79
+ },
80
+ { threshold: 0.1 }
81
+ );
82
+ return l.current && f.observe(l.current), () => f.disconnect();
83
+ }, []);
84
+ const d = i ? u(e, s, n, "immediate") : "opacity-0";
85
+ return o.createElement(
86
+ t,
87
+ {
88
+ ref: l,
89
+ className: c(d, a)
90
+ },
91
+ r
92
+ );
93
+ }, N = ({
94
+ effect: e = "scale",
95
+ as: s = "div",
96
+ className: n,
97
+ children: t
98
+ }) => {
99
+ const a = {
100
+ scale: "hover:scale-105 transition-transform duration-200",
101
+ lift: "hover:-translate-y-1 hover:shadow-lg transition-all duration-200",
102
+ glow: "hover:shadow-lg hover:shadow-primary/25 transition-shadow duration-200",
103
+ rotate: "hover:rotate-1 transition-transform duration-200"
104
+ };
105
+ return o.createElement(
106
+ s,
107
+ {
108
+ className: c(a[e], n)
109
+ },
110
+ t
111
+ );
112
+ };
113
+ export {
114
+ N as Hover,
115
+ I as LoadingSpinner,
116
+ w as Motion,
117
+ y as Reveal
118
+ };
119
+ //# sourceMappingURL=motion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"motion.js","sources":["../src/components/ui/motion.tsx"],"sourcesContent":["/**\n * Ultra-Simple Motion Component - 10/10 LLM Rating\n * Pure CSS animations with zero JavaScript complexity\n * @module @bloomneo/uikit\n * @file src/components/ui/motion.tsx\n */\n\nimport * as React from 'react';\nimport { forwardRef } from 'react';\nimport { cn } from '@/lib/utils';\n\n// Type for HTML element tag names\ntype HTMLElementTagName = keyof React.JSX.IntrinsicElements;\n\n/**\n * Animation presets - maps to CSS classes\n */\nexport type AnimationPreset = 'fadeIn' | 'slideInUp' | 'scaleIn' | 'slideInDown' | 'pulse';\n\n/**\n * Animation duration options\n */\nexport type AnimationDuration = 'fast' | 'normal' | 'slow';\n\n/**\n * Animation trigger options\n */\nexport type AnimationTrigger = 'immediate' | 'hover' | 'inView';\n\n/**\n * Get animation CSS classes based on props\n */\nconst getAnimationClasses = (\n preset: AnimationPreset,\n duration: AnimationDuration = 'normal',\n delay: number = 0,\n trigger: AnimationTrigger = 'immediate'\n): string => {\n // Duration mapping\n const durationClasses = {\n fast: 'duration-200',\n normal: 'duration-300', \n slow: 'duration-500',\n };\n\n // Animation preset mapping\n const presetClasses = {\n fadeIn: 'animate-in fade-in',\n slideInUp: 'animate-in slide-in-from-bottom-4',\n scaleIn: 'animate-in zoom-in-95',\n slideInDown: 'animate-in slide-in-from-top-4',\n pulse: 'animate-pulse',\n };\n\n // Trigger mapping\n const triggerClasses = {\n immediate: '',\n hover: 'hover:animate-in',\n inView: 'motion-safe:animate-in', // Uses CSS animation with reduced motion support\n };\n\n // Build class string\n const classes = [\n presetClasses[preset],\n durationClasses[duration],\n triggerClasses[trigger],\n delay > 0 ? `delay-[${delay}ms]` : '',\n ].filter(Boolean);\n\n return classes.join(' ');\n};\n\n/**\n * Motion component props - ultra-simple\n */\nexport interface MotionProps extends React.HTMLAttributes<HTMLElement> {\n /** HTML element to render */\n as?: HTMLElementTagName;\n /** Animation preset */\n preset?: AnimationPreset;\n /** Animation duration */\n duration?: AnimationDuration;\n /** Animation delay in milliseconds */\n delay?: number;\n /** Animation trigger */\n trigger?: AnimationTrigger;\n /** Children */\n children: React.ReactNode;\n}\n\n/**\n * Ultra-Simple Motion Component - 10/10 LLM Rating\n * Pure CSS animations, zero JavaScript complexity\n */\nexport const Motion = forwardRef<HTMLElement, MotionProps>(({\n as: Component = 'div',\n preset = 'fadeIn',\n duration = 'normal',\n delay = 0,\n trigger = 'immediate',\n className,\n children,\n ...props\n}, ref) => {\n const animationClasses = getAnimationClasses(preset, duration, delay, trigger);\n\n return React.createElement(\n Component,\n {\n ...props,\n ref,\n className: cn(animationClasses, className),\n },\n children\n );\n});\n\nMotion.displayName = 'Motion';\n\n/**\n * Loading Spinner - Pure CSS\n */\nexport interface LoadingSpinnerProps {\n /** Spinner size */\n size?: 'sm' | 'md' | 'lg';\n /** Custom className */\n className?: string;\n}\n\nexport const LoadingSpinner: React.FC<LoadingSpinnerProps> = ({\n size = 'md',\n className,\n}) => {\n const sizeClasses = {\n sm: 'h-4 w-4',\n md: 'h-6 w-6',\n lg: 'h-8 w-8',\n };\n\n return (\n <div\n className={cn(\n 'rounded-full border-2 border-primary border-t-transparent animate-spin',\n sizeClasses[size],\n className\n )}\n />\n );\n};\n\n/**\n * Reveal component for scroll-triggered animations\n * Uses Intersection Observer with CSS classes\n */\nexport interface RevealProps {\n /** Animation preset */\n preset?: AnimationPreset;\n /** Animation duration */\n duration?: AnimationDuration;\n /** Animation delay */\n delay?: number;\n /** Container element */\n as?: HTMLElementTagName;\n /** Additional className */\n className?: string;\n /** Children */\n children: React.ReactNode;\n}\n\nexport const Reveal: React.FC<RevealProps> = ({\n preset = 'fadeIn',\n duration = 'normal',\n delay = 0,\n as = 'div',\n className,\n children,\n}) => {\n const [isVisible, setIsVisible] = React.useState(false);\n const ref = React.useRef<HTMLElement>(null);\n\n React.useEffect(() => {\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n setIsVisible(true);\n observer.disconnect(); // Animate only once\n }\n },\n { threshold: 0.1 }\n );\n\n if (ref.current) {\n observer.observe(ref.current);\n }\n\n return () => observer.disconnect();\n }, []);\n\n const animationClasses = isVisible \n ? getAnimationClasses(preset, duration, delay, 'immediate')\n : 'opacity-0';\n\n return React.createElement(\n as,\n {\n ref,\n className: cn(animationClasses, className),\n },\n children\n );\n};\n\n/**\n * Hover Animation Component - Pure CSS\n */\nexport interface HoverProps {\n /** Hover animation effect */\n effect?: 'scale' | 'lift' | 'glow' | 'rotate';\n /** Container element */\n as?: HTMLElementTagName;\n /** Additional className */\n className?: string;\n /** Children */\n children: React.ReactNode;\n}\n\nexport const Hover: React.FC<HoverProps> = ({\n effect = 'scale',\n as = 'div',\n className,\n children,\n}) => {\n const effectClasses = {\n scale: 'hover:scale-105 transition-transform duration-200',\n lift: 'hover:-translate-y-1 hover:shadow-lg transition-all duration-200',\n glow: 'hover:shadow-lg hover:shadow-primary/25 transition-shadow duration-200',\n rotate: 'hover:rotate-1 transition-transform duration-200',\n };\n\n return React.createElement(\n as,\n {\n className: cn(effectClasses[effect], className),\n },\n children\n );\n};\n\n/**\n * @llm-usage Ultra-Simple Motion Examples (10/10 LLM Rating)\n * \n * Basic animations:\n * <Motion preset=\"fadeIn\" duration=\"normal\">\n * <div>Fades in immediately</div>\n * </Motion>\n * \n * <Motion preset=\"slideInUp\" duration=\"slow\" delay={200}>\n * <Card>Slides up after 200ms delay</Card>\n * </Motion>\n * \n * Hover effects:\n * <Motion preset=\"scaleIn\" trigger=\"hover\">\n * <Button>Scales on hover</Button>\n * </Motion>\n * \n * Scroll-triggered reveal:\n * <Reveal preset=\"slideInUp\" duration=\"normal\">\n * <div>Animates when scrolled into view</div>\n * </Reveal>\n * \n * Hover animations:\n * <Hover effect=\"scale\">\n * <Card>Scales on hover</Card>\n * </Hover>\n * \n * <Hover effect=\"lift\">\n * <Button>Lifts on hover</Button>\n * </Hover>\n * \n * Loading spinner:\n * <LoadingSpinner size=\"md\" />\n * \n * Different elements:\n * <Motion as=\"button\" preset=\"scaleIn\" duration=\"fast\">\n * Click me\n * </Motion>\n * \n * <Motion as=\"img\" preset=\"fadeIn\" delay={500}>\n * <img src=\"image.jpg\" alt=\"Delayed fade\" />\n * </Motion>\n */"],"names":["getAnimationClasses","preset","duration","delay","trigger","durationClasses","presetClasses","triggerClasses","Motion","forwardRef","Component","className","children","props","ref","animationClasses","React","cn","LoadingSpinner","size","jsx","Reveal","as","isVisible","setIsVisible","observer","entry","Hover","effect","effectClasses"],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import { jsxs as r, jsx as e } from "react/jsx-runtime";
2
+ import { c as h } from "./utils-CwJPJKOE.js";
3
+ import { C as x } from "./chevron-right-pz9eCjj-.js";
4
+ function g({ href: i, children: t }) {
5
+ return /* @__PURE__ */ e("a", { href: i, className: "hover:text-foreground", children: t });
6
+ }
7
+ function v({
8
+ title: i,
9
+ description: t,
10
+ icon: n,
11
+ breadcrumbs: a,
12
+ actions: d,
13
+ renderLink: m = g,
14
+ className: o,
15
+ ...f
16
+ }) {
17
+ return /* @__PURE__ */ r(
18
+ "div",
19
+ {
20
+ className: h("flex flex-col gap-3 border-b border-border pb-4", o),
21
+ ...f,
22
+ children: [
23
+ a && a.length > 0 && /* @__PURE__ */ e("nav", { "aria-label": "Breadcrumb", className: "flex items-center text-sm text-muted-foreground", children: /* @__PURE__ */ e("ol", { className: "flex flex-wrap items-center gap-1", children: a.map((l, c) => {
24
+ const s = c === a.length - 1;
25
+ return /* @__PURE__ */ r("li", { className: "flex items-center gap-1", children: [
26
+ l.href && !s ? m({ href: l.href, children: l.label }) : /* @__PURE__ */ e("span", { "aria-current": s ? "page" : void 0, className: s ? "text-foreground" : void 0, children: l.label }),
27
+ !s && /* @__PURE__ */ e(x, { className: "size-3.5 shrink-0", "aria-hidden": "true" })
28
+ ] }, c);
29
+ }) }) }),
30
+ /* @__PURE__ */ r("div", { className: "flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between", children: [
31
+ /* @__PURE__ */ r("div", { className: "flex items-start gap-3", children: [
32
+ n && /* @__PURE__ */ e("div", { className: "mt-0.5 flex size-9 shrink-0 items-center justify-center rounded-md bg-muted text-muted-foreground [&>svg]:size-5", "aria-hidden": "true", children: n }),
33
+ /* @__PURE__ */ r("div", { className: "flex flex-col gap-0.5", children: [
34
+ /* @__PURE__ */ e("h1", { className: "text-2xl font-semibold tracking-tight text-foreground", children: i }),
35
+ t && /* @__PURE__ */ e("p", { className: "text-sm text-muted-foreground", children: t })
36
+ ] })
37
+ ] }),
38
+ d && /* @__PURE__ */ e("div", { className: "flex shrink-0 items-center gap-2", children: d })
39
+ ] })
40
+ ]
41
+ }
42
+ );
43
+ }
44
+ export {
45
+ v as PageHeader
46
+ };
47
+ //# sourceMappingURL=page-header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-header.js","sources":["../src/components/ui/page-header.tsx"],"sourcesContent":["/**\n * <PageHeader> — the standard top-of-page block.\n *\n * Replaces the hand-rolled \"icon + title + description + actions\" combo that\n * appears on every admin/settings/detail page. Optionally renders a back link\n * and breadcrumbs above the title.\n *\n * @example\n * <PageHeader\n * icon={<Users />}\n * title=\"User management\"\n * description=\"View and manage all users\"\n * breadcrumbs={[{ label: 'Admin', href: '/admin' }, { label: 'Users' }]}\n * actions={<Button>Add user</Button>}\n * />\n */\n\nimport * as React from 'react';\nimport { ChevronRight } from 'lucide-react';\nimport { cn } from '@/lib/utils';\n\nexport interface PageHeaderCrumb {\n label: string;\n /** When omitted the crumb renders as plain text (current page). */\n href?: string;\n}\n\nexport interface PageHeaderProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Required headline. */\n title: string;\n /** Optional supporting copy. */\n description?: React.ReactNode;\n /** Optional icon shown to the left of the title. */\n icon?: React.ReactNode;\n /** Optional breadcrumb list rendered above the title. */\n breadcrumbs?: PageHeaderCrumb[];\n /** Optional action area, typically buttons. */\n actions?: React.ReactNode;\n /**\n * If provided, the breadcrumb anchors and the icon link to this prop. This\n * lets the component stay router-agnostic — pass a Next.js / React Router\n * Link as a render prop, or just a string href.\n */\n renderLink?: (props: { href: string; children: React.ReactNode }) => React.ReactNode;\n}\n\nfunction defaultRenderLink({ href, children }: { href: string; children: React.ReactNode }) {\n return (\n <a href={href} className=\"hover:text-foreground\">\n {children}\n </a>\n );\n}\n\nexport function PageHeader({\n title,\n description,\n icon,\n breadcrumbs,\n actions,\n renderLink = defaultRenderLink,\n className,\n ...rest\n}: PageHeaderProps): React.JSX.Element {\n return (\n <div\n className={cn('flex flex-col gap-3 border-b border-border pb-4', className)}\n {...rest}\n >\n {breadcrumbs && breadcrumbs.length > 0 && (\n <nav aria-label=\"Breadcrumb\" className=\"flex items-center text-sm text-muted-foreground\">\n <ol className=\"flex flex-wrap items-center gap-1\">\n {breadcrumbs.map((crumb, i) => {\n const isLast = i === breadcrumbs.length - 1;\n return (\n <li key={i} className=\"flex items-center gap-1\">\n {crumb.href && !isLast\n ? renderLink({ href: crumb.href, children: crumb.label })\n : (\n <span aria-current={isLast ? 'page' : undefined} className={isLast ? 'text-foreground' : undefined}>\n {crumb.label}\n </span>\n )}\n {!isLast && <ChevronRight className=\"size-3.5 shrink-0\" aria-hidden=\"true\" />}\n </li>\n );\n })}\n </ol>\n </nav>\n )}\n\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"flex items-start gap-3\">\n {icon && (\n <div className=\"mt-0.5 flex size-9 shrink-0 items-center justify-center rounded-md bg-muted text-muted-foreground [&>svg]:size-5\" aria-hidden=\"true\">\n {icon}\n </div>\n )}\n <div className=\"flex flex-col gap-0.5\">\n <h1 className=\"text-2xl font-semibold tracking-tight text-foreground\">{title}</h1>\n {description && (\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n )}\n </div>\n </div>\n {actions && <div className=\"flex shrink-0 items-center gap-2\">{actions}</div>}\n </div>\n </div>\n );\n}\n"],"names":["defaultRenderLink","href","children","jsx","PageHeader","title","description","icon","breadcrumbs","actions","renderLink","className","rest","jsxs","cn","crumb","i","isLast","ChevronRight"],"mappings":";;;AA8CA,SAASA,EAAkB,EAAE,MAAAC,GAAM,UAAAC,KAAyD;AAC1F,SACE,gBAAAC,EAAC,KAAA,EAAE,MAAAF,GAAY,WAAU,yBACtB,UAAAC,GACH;AAEJ;AAEO,SAASE,EAAW;AAAA,EACzB,OAAAC;AAAA,EACA,aAAAC;AAAA,EACA,MAAAC;AAAA,EACA,aAAAC;AAAA,EACA,SAAAC;AAAA,EACA,YAAAC,IAAaV;AAAA,EACb,WAAAW;AAAA,EACA,GAAGC;AACL,GAAuC;AACrC,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC,EAAG,mDAAmDH,CAAS;AAAA,MACzE,GAAGC;AAAA,MAEH,UAAA;AAAA,QAAAJ,KAAeA,EAAY,SAAS,KACnC,gBAAAL,EAAC,OAAA,EAAI,cAAW,cAAa,WAAU,mDACrC,UAAA,gBAAAA,EAAC,QAAG,WAAU,qCACX,YAAY,IAAI,CAACY,GAAOC,MAAM;AAC7B,gBAAMC,IAASD,MAAMR,EAAY,SAAS;AAC1C,iBACE,gBAAAK,EAAC,MAAA,EAAW,WAAU,2BACnB,UAAA;AAAA,YAAAE,EAAM,QAAQ,CAACE,IACZP,EAAW,EAAE,MAAMK,EAAM,MAAM,UAAUA,EAAM,MAAA,CAAO,IAEtD,gBAAAZ,EAAC,QAAA,EAAK,gBAAcc,IAAS,SAAS,QAAW,WAAWA,IAAS,oBAAoB,QACtF,UAAAF,EAAM,MAAA,CACT;AAAA,YAEH,CAACE,KAAU,gBAAAd,EAACe,KAAa,WAAU,qBAAoB,eAAY,OAAA,CAAO;AAAA,UAAA,EAAA,GARpEF,CAST;AAAA,QAEJ,CAAC,GACH,GACF;AAAA,QAGF,gBAAAH,EAAC,OAAA,EAAI,WAAU,qEACb,UAAA;AAAA,UAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0BACZ,UAAA;AAAA,YAAAN,uBACE,OAAA,EAAI,WAAU,oHAAmH,eAAY,QAC3I,UAAAA,GACH;AAAA,YAEF,gBAAAM,EAAC,OAAA,EAAI,WAAU,yBACb,UAAA;AAAA,cAAA,gBAAAV,EAAC,MAAA,EAAG,WAAU,yDAAyD,UAAAE,GAAM;AAAA,cAC5EC,KACC,gBAAAH,EAAC,KAAA,EAAE,WAAU,iCAAiC,UAAAG,EAAA,CAAY;AAAA,YAAA,EAAA,CAE9D;AAAA,UAAA,GACF;AAAA,UACCG,KAAW,gBAAAN,EAAC,OAAA,EAAI,WAAU,oCAAoC,UAAAM,EAAA,CAAQ;AAAA,QAAA,EAAA,CACzE;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;"}