@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.
- package/CHANGELOG.md +222 -0
- package/LICENSE +21 -0
- package/README.md +513 -0
- package/bin/commands/build.js +232 -0
- package/bin/commands/bundle.js +587 -0
- package/bin/commands/create.js +768 -0
- package/bin/commands/deploy.js +533 -0
- package/bin/commands/generate.js +673 -0
- package/bin/commands/optimize.js +198 -0
- package/bin/commands/prerender.js +306 -0
- package/bin/commands/serve.js +216 -0
- package/bin/templates/fbca/README.md.template +130 -0
- package/bin/templates/fbca/docs/QUICKSTART_FBCA.md +368 -0
- package/bin/templates/fbca/docs/UIKIT_CLI_GUIDE.md +574 -0
- package/bin/templates/fbca/docs/UIKIT_COMPOSITE_UI_SYSTEM.md +649 -0
- package/bin/templates/fbca/docs/UIKIT_LLM_GUIDE.md +2055 -0
- package/bin/templates/fbca/docs/UIKIT_THEME_GUIDE.md +359 -0
- package/bin/templates/fbca/package.json.template +41 -0
- package/bin/templates/fbca/public/favicon.svg +10 -0
- package/bin/templates/fbca/public/hero_fbca.svg +1 -0
- package/bin/templates/fbca/src/utils/asset.ts +6 -0
- package/bin/templates/fbca/src/web/App.tsx.template +20 -0
- package/bin/templates/fbca/src/web/features/auth/pages/index.tsx.template +157 -0
- package/bin/templates/fbca/src/web/features/docs/pages/[...slug].tsx.template +83 -0
- package/bin/templates/fbca/src/web/features/gallery/hooks/useGallery.ts.template +74 -0
- package/bin/templates/fbca/src/web/features/gallery/pages/index.tsx.template +136 -0
- package/bin/templates/fbca/src/web/features/main/components/CTASection.tsx.template +43 -0
- package/bin/templates/fbca/src/web/features/main/pages/About.tsx.template +374 -0
- package/bin/templates/fbca/src/web/features/main/pages/index.tsx.template +214 -0
- package/bin/templates/fbca/src/web/index.html.template +15 -0
- package/bin/templates/fbca/src/web/lib/page-router.tsx.template +134 -0
- package/bin/templates/fbca/src/web/main.tsx.template +14 -0
- package/bin/templates/fbca/src/web/shared/components/Footer.tsx.template +57 -0
- package/bin/templates/fbca/src/web/shared/components/Header.tsx.template +91 -0
- package/bin/templates/fbca/src/web/shared/components/SEO.tsx.template +24 -0
- package/bin/templates/fbca/src/web/shared/components/index.ts.template +3 -0
- package/bin/templates/fbca/src/web/shared/hooks/useSEO.ts.template +85 -0
- package/bin/templates/fbca/src/web/shared/utils/asset.ts +6 -0
- package/bin/templates/fbca/src/web/styles/index.css.template +8 -0
- package/bin/templates/fbca/src/web/utils/asset.ts +6 -0
- package/bin/templates/fbca/tsconfig.json.template +32 -0
- package/bin/templates/fbca/tsconfig.node.json.template +10 -0
- package/bin/templates/fbca/vite.config.ts.template +38 -0
- package/bin/templates/generate/component/component.tsx.template +79 -0
- package/bin/templates/generate/component/index.ts.template +2 -0
- package/bin/templates/generate/component/types.ts.template +58 -0
- package/bin/templates/generate/feature/index.ts.template +14 -0
- package/bin/templates/generate/feature/list-page.tsx.template +34 -0
- package/bin/templates/generate/feature/main-component.tsx.template +37 -0
- package/bin/templates/generate/feature/main-page.tsx.template +30 -0
- package/bin/templates/generate/feature/types.ts.template +34 -0
- package/bin/templates/generate/hook/hook.ts.template +35 -0
- package/bin/templates/generate/index.css.template +10 -0
- package/bin/templates/generate/main.tsx.template +10 -0
- package/bin/templates/generate/page/index.ts.template +2 -0
- package/bin/templates/generate/page/page.tsx.template +86 -0
- package/bin/templates/generate/theme/README.md +31 -0
- package/bin/templates/generate/theme/theme.js.template +155 -0
- package/bin/templates/multi/README.md.template +120 -0
- package/bin/templates/multi/docs/QUICKSTART_MULTI.md +334 -0
- package/bin/templates/multi/docs/UIKIT_CLI_GUIDE.md +574 -0
- package/bin/templates/multi/docs/UIKIT_COMPOSITE_UI_SYSTEM.md +649 -0
- package/bin/templates/multi/docs/UIKIT_LLM_GUIDE.md +2055 -0
- package/bin/templates/multi/docs/UIKIT_THEME_GUIDE.md +359 -0
- package/bin/templates/multi/index.html.template +58 -0
- package/bin/templates/multi/package.json.template +35 -0
- package/bin/templates/multi/public/favicon.svg +10 -0
- package/bin/templates/multi/public/hero_multi.svg +1 -0
- package/bin/templates/multi/src/App.tsx.template +92 -0
- package/bin/templates/multi/src/components/Footer.tsx.template +58 -0
- package/bin/templates/multi/src/components/Header.tsx.template +103 -0
- package/bin/templates/multi/src/components/SEO.tsx.template +19 -0
- package/bin/templates/multi/src/components/index.ts.template +3 -0
- package/bin/templates/multi/src/hooks/useSEO.ts.template +38 -0
- package/bin/templates/multi/src/index.css.template +7 -0
- package/bin/templates/multi/src/main.tsx.template +14 -0
- package/bin/templates/multi/src/pages/About.tsx.template +276 -0
- package/bin/templates/multi/src/pages/Components.tsx.template +288 -0
- package/bin/templates/multi/src/pages/Contact.tsx.template +348 -0
- package/bin/templates/multi/src/pages/Dashboard.tsx.template +306 -0
- package/bin/templates/multi/src/pages/ErrorPage.tsx.template +37 -0
- package/bin/templates/multi/src/pages/Home.tsx.template +201 -0
- package/bin/templates/multi/src/pages/Login.tsx.template +148 -0
- package/bin/templates/multi/src/pages/Themes.tsx.template +207 -0
- package/bin/templates/multi/src/router.tsx.template +34 -0
- package/bin/templates/multi/src/utils/asset.ts +6 -0
- package/bin/templates/multi/tsconfig.json.template +30 -0
- package/bin/templates/multi/tsconfig.node.json +22 -0
- package/bin/templates/multi/vite.config.ts.template +36 -0
- package/bin/templates/single/README.md.template +131 -0
- package/bin/templates/single/docs/QUICKSTART_SINGLE.md +259 -0
- package/bin/templates/single/docs/UIKIT_CLI_GUIDE.md +574 -0
- package/bin/templates/single/docs/UIKIT_COMPOSITE_UI_SYSTEM.md +649 -0
- package/bin/templates/single/docs/UIKIT_LLM_GUIDE.md +2055 -0
- package/bin/templates/single/docs/UIKIT_THEME_GUIDE.md +359 -0
- package/bin/templates/single/index.html.template +37 -0
- package/bin/templates/single/package.json.template +34 -0
- package/bin/templates/single/public/favicon.svg +10 -0
- package/bin/templates/single/public/hero.svg +1 -0
- package/bin/templates/single/src/App.tsx.template +233 -0
- package/bin/templates/single/src/index.css.template +7 -0
- package/bin/templates/single/src/main.tsx.template +14 -0
- package/bin/templates/single/src/styles/fonts.css +99 -0
- package/bin/templates/single/src/utils/asset.ts +6 -0
- package/bin/templates/single/tsconfig.json +31 -0
- package/bin/templates/single/tsconfig.node.json +22 -0
- package/bin/templates/single/vite.config.ts.template +36 -0
- package/bin/templates/spa/README.md.template +105 -0
- package/bin/templates/spa/components/SEO.tsx.template +19 -0
- package/bin/templates/spa/docs/QUICKSTART_SPA.md +300 -0
- package/bin/templates/spa/docs/UIKIT_CLI_GUIDE.md +574 -0
- package/bin/templates/spa/docs/UIKIT_COMPOSITE_UI_SYSTEM.md +649 -0
- package/bin/templates/spa/docs/UIKIT_LLM_GUIDE.md +2055 -0
- package/bin/templates/spa/docs/UIKIT_THEME_GUIDE.md +359 -0
- package/bin/templates/spa/hooks/useSEO.ts.template +38 -0
- package/bin/templates/spa/index.html.template +58 -0
- package/bin/templates/spa/package.json.template +35 -0
- package/bin/templates/spa/public/favicon.svg +15 -0
- package/bin/templates/spa/public/hero_spa.svg +1 -0
- package/bin/templates/spa/src/App.tsx.template +659 -0
- package/bin/templates/spa/src/index.css.template +7 -0
- package/bin/templates/spa/src/main.tsx.template +14 -0
- package/bin/templates/spa/src/utils/asset.ts +6 -0
- package/bin/templates/spa/tsconfig.json.template +30 -0
- package/bin/templates/spa/tsconfig.node.json +22 -0
- package/bin/templates/spa/vite.config.ts.template +36 -0
- package/bin/uikit.js +133 -0
- package/cookbook/README.md +20 -0
- package/cookbook/crud-page.tsx +99 -0
- package/cookbook/dashboard.tsx +89 -0
- package/cookbook/delete-flow.tsx +59 -0
- package/cookbook/login.tsx +85 -0
- package/cookbook/settings.tsx +113 -0
- package/dist/Combination-C0DFrmJW.js +674 -0
- package/dist/Combination-C0DFrmJW.js.map +1 -0
- package/dist/accordion.js +284 -0
- package/dist/accordion.js.map +1 -0
- package/dist/admin.js +429 -0
- package/dist/admin.js.map +1 -0
- package/dist/alert.js +67 -0
- package/dist/alert.js.map +1 -0
- package/dist/auth.js +178 -0
- package/dist/auth.js.map +1 -0
- package/dist/avatar.js +249 -0
- package/dist/avatar.js.map +1 -0
- package/dist/badge.js +40 -0
- package/dist/badge.js.map +1 -0
- package/dist/blank.js +80 -0
- package/dist/blank.js.map +1 -0
- package/dist/breadcrumb.js +104 -0
- package/dist/breadcrumb.js.map +1 -0
- package/dist/button.js +50 -0
- package/dist/button.js.map +1 -0
- package/dist/calendar.js +2785 -0
- package/dist/calendar.js.map +1 -0
- package/dist/card.js +91 -0
- package/dist/card.js.map +1 -0
- package/dist/check-DXouwtzp.js +12 -0
- package/dist/check-DXouwtzp.js.map +1 -0
- package/dist/checkbox.js +268 -0
- package/dist/checkbox.js.map +1 -0
- package/dist/chevron-down-BORJtX8F.js +14 -0
- package/dist/chevron-down-BORJtX8F.js.map +1 -0
- package/dist/chevron-left-C1pkx4AF.js +14 -0
- package/dist/chevron-left-C1pkx4AF.js.map +1 -0
- package/dist/chevron-right-pz9eCjj-.js +14 -0
- package/dist/chevron-right-pz9eCjj-.js.map +1 -0
- package/dist/circle-DHOdTDQh.js +14 -0
- package/dist/circle-DHOdTDQh.js.map +1 -0
- package/dist/collapsible.js +35 -0
- package/dist/collapsible.js.map +1 -0
- package/dist/command.js +481 -0
- package/dist/command.js.map +1 -0
- package/dist/confirm-dialog.js +129 -0
- package/dist/confirm-dialog.js.map +1 -0
- package/dist/container.js +334 -0
- package/dist/container.js.map +1 -0
- package/dist/createLucideIcon-B45kRl5r.js +80 -0
- package/dist/createLucideIcon-B45kRl5r.js.map +1 -0
- package/dist/data-table.js +574 -0
- package/dist/data-table.js.map +1 -0
- package/dist/detail-page.js +454 -0
- package/dist/detail-page.js.map +1 -0
- package/dist/dialog.js +137 -0
- package/dist/dialog.js.map +1 -0
- package/dist/dropdown-menu.js +424 -0
- package/dist/dropdown-menu.js.map +1 -0
- package/dist/ellipsis-BhAoKPVk.js +16 -0
- package/dist/ellipsis-BhAoKPVk.js.map +1 -0
- package/dist/empty-state.js +54 -0
- package/dist/empty-state.js.map +1 -0
- package/dist/errors.js +36 -0
- package/dist/errors.js.map +1 -0
- package/dist/eye-DDKoW0KS.js +46 -0
- package/dist/eye-DDKoW0KS.js.map +1 -0
- package/dist/fonts/caveat-cyrillic-400-normal.woff +0 -0
- package/dist/fonts/caveat-cyrillic-400-normal.woff2 +0 -0
- package/dist/fonts/caveat-cyrillic-700-normal.woff +0 -0
- package/dist/fonts/caveat-cyrillic-700-normal.woff2 +0 -0
- package/dist/fonts/caveat-cyrillic-ext-400-normal.woff +0 -0
- package/dist/fonts/caveat-cyrillic-ext-400-normal.woff2 +0 -0
- package/dist/fonts/caveat-cyrillic-ext-700-normal.woff +0 -0
- package/dist/fonts/caveat-cyrillic-ext-700-normal.woff2 +0 -0
- package/dist/fonts/caveat-latin-400-normal.woff +0 -0
- package/dist/fonts/caveat-latin-400-normal.woff2 +0 -0
- package/dist/fonts/caveat-latin-700-normal.woff +0 -0
- package/dist/fonts/caveat-latin-700-normal.woff2 +0 -0
- package/dist/fonts/caveat-latin-ext-400-normal.woff +0 -0
- package/dist/fonts/caveat-latin-ext-400-normal.woff2 +0 -0
- package/dist/fonts/caveat-latin-ext-700-normal.woff +0 -0
- package/dist/fonts/caveat-latin-ext-700-normal.woff2 +0 -0
- package/dist/fonts/crimson-text-latin-400-normal.woff +0 -0
- package/dist/fonts/crimson-text-latin-400-normal.woff2 +0 -0
- package/dist/fonts/crimson-text-latin-600-normal.woff +0 -0
- package/dist/fonts/crimson-text-latin-600-normal.woff2 +0 -0
- package/dist/fonts/crimson-text-latin-700-normal.woff +0 -0
- package/dist/fonts/crimson-text-latin-700-normal.woff2 +0 -0
- package/dist/fonts/crimson-text-latin-ext-400-normal.woff +0 -0
- package/dist/fonts/crimson-text-latin-ext-400-normal.woff2 +0 -0
- package/dist/fonts/crimson-text-latin-ext-600-normal.woff +0 -0
- package/dist/fonts/crimson-text-latin-ext-600-normal.woff2 +0 -0
- package/dist/fonts/crimson-text-latin-ext-700-normal.woff +0 -0
- package/dist/fonts/crimson-text-latin-ext-700-normal.woff2 +0 -0
- package/dist/fonts/crimson-text-vietnamese-400-normal.woff +0 -0
- package/dist/fonts/crimson-text-vietnamese-400-normal.woff2 +0 -0
- package/dist/fonts/crimson-text-vietnamese-600-normal.woff +0 -0
- package/dist/fonts/crimson-text-vietnamese-600-normal.woff2 +0 -0
- package/dist/fonts/crimson-text-vietnamese-700-normal.woff +0 -0
- package/dist/fonts/crimson-text-vietnamese-700-normal.woff2 +0 -0
- package/dist/fonts/dm-serif-display-latin-400-normal.woff +0 -0
- package/dist/fonts/dm-serif-display-latin-400-normal.woff2 +0 -0
- package/dist/fonts/dm-serif-display-latin-ext-400-normal.woff +0 -0
- package/dist/fonts/dm-serif-display-latin-ext-400-normal.woff2 +0 -0
- package/dist/fonts/libre-baskerville-latin-400-normal.woff +0 -0
- package/dist/fonts/libre-baskerville-latin-400-normal.woff2 +0 -0
- package/dist/fonts/libre-baskerville-latin-700-normal.woff +0 -0
- package/dist/fonts/libre-baskerville-latin-700-normal.woff2 +0 -0
- package/dist/fonts/libre-baskerville-latin-ext-400-normal.woff +0 -0
- package/dist/fonts/libre-baskerville-latin-ext-400-normal.woff2 +0 -0
- package/dist/fonts/libre-baskerville-latin-ext-700-normal.woff +0 -0
- package/dist/fonts/libre-baskerville-latin-ext-700-normal.woff2 +0 -0
- package/dist/fonts/montserrat-cyrillic-400-normal.woff +0 -0
- package/dist/fonts/montserrat-cyrillic-400-normal.woff2 +0 -0
- package/dist/fonts/montserrat-cyrillic-500-normal.woff +0 -0
- package/dist/fonts/montserrat-cyrillic-500-normal.woff2 +0 -0
- package/dist/fonts/montserrat-cyrillic-600-normal.woff +0 -0
- package/dist/fonts/montserrat-cyrillic-600-normal.woff2 +0 -0
- package/dist/fonts/montserrat-cyrillic-ext-400-normal.woff +0 -0
- package/dist/fonts/montserrat-cyrillic-ext-400-normal.woff2 +0 -0
- package/dist/fonts/montserrat-cyrillic-ext-500-normal.woff +0 -0
- package/dist/fonts/montserrat-cyrillic-ext-500-normal.woff2 +0 -0
- package/dist/fonts/montserrat-cyrillic-ext-600-normal.woff +0 -0
- package/dist/fonts/montserrat-cyrillic-ext-600-normal.woff2 +0 -0
- package/dist/fonts/montserrat-latin-400-normal.woff +0 -0
- package/dist/fonts/montserrat-latin-400-normal.woff2 +0 -0
- package/dist/fonts/montserrat-latin-500-normal.woff +0 -0
- package/dist/fonts/montserrat-latin-500-normal.woff2 +0 -0
- package/dist/fonts/montserrat-latin-600-normal.woff +0 -0
- package/dist/fonts/montserrat-latin-600-normal.woff2 +0 -0
- package/dist/fonts/montserrat-latin-ext-400-normal.woff +0 -0
- package/dist/fonts/montserrat-latin-ext-400-normal.woff2 +0 -0
- package/dist/fonts/montserrat-latin-ext-500-normal.woff +0 -0
- package/dist/fonts/montserrat-latin-ext-500-normal.woff2 +0 -0
- package/dist/fonts/montserrat-latin-ext-600-normal.woff +0 -0
- package/dist/fonts/montserrat-latin-ext-600-normal.woff2 +0 -0
- package/dist/fonts/montserrat-vietnamese-400-normal.woff +0 -0
- package/dist/fonts/montserrat-vietnamese-400-normal.woff2 +0 -0
- package/dist/fonts/montserrat-vietnamese-500-normal.woff +0 -0
- package/dist/fonts/montserrat-vietnamese-500-normal.woff2 +0 -0
- package/dist/fonts/montserrat-vietnamese-600-normal.woff +0 -0
- package/dist/fonts/montserrat-vietnamese-600-normal.woff2 +0 -0
- package/dist/fonts/playfair-display-cyrillic-400-normal.woff +0 -0
- package/dist/fonts/playfair-display-cyrillic-400-normal.woff2 +0 -0
- package/dist/fonts/playfair-display-cyrillic-500-normal.woff +0 -0
- package/dist/fonts/playfair-display-cyrillic-500-normal.woff2 +0 -0
- package/dist/fonts/playfair-display-latin-400-normal.woff +0 -0
- package/dist/fonts/playfair-display-latin-400-normal.woff2 +0 -0
- package/dist/fonts/playfair-display-latin-500-normal.woff +0 -0
- package/dist/fonts/playfair-display-latin-500-normal.woff2 +0 -0
- package/dist/fonts/playfair-display-latin-ext-400-normal.woff +0 -0
- package/dist/fonts/playfair-display-latin-ext-400-normal.woff2 +0 -0
- package/dist/fonts/playfair-display-latin-ext-500-normal.woff +0 -0
- package/dist/fonts/playfair-display-latin-ext-500-normal.woff2 +0 -0
- package/dist/fonts/playfair-display-vietnamese-400-normal.woff +0 -0
- package/dist/fonts/playfair-display-vietnamese-400-normal.woff2 +0 -0
- package/dist/fonts/playfair-display-vietnamese-500-normal.woff +0 -0
- package/dist/fonts/playfair-display-vietnamese-500-normal.woff2 +0 -0
- package/dist/fonts/poppins-devanagari-400-normal.woff +0 -0
- package/dist/fonts/poppins-devanagari-400-normal.woff2 +0 -0
- package/dist/fonts/poppins-devanagari-500-normal.woff +0 -0
- package/dist/fonts/poppins-devanagari-500-normal.woff2 +0 -0
- package/dist/fonts/poppins-devanagari-600-normal.woff +0 -0
- package/dist/fonts/poppins-devanagari-600-normal.woff2 +0 -0
- package/dist/fonts/poppins-latin-400-normal.woff +0 -0
- package/dist/fonts/poppins-latin-400-normal.woff2 +0 -0
- package/dist/fonts/poppins-latin-500-normal.woff +0 -0
- package/dist/fonts/poppins-latin-500-normal.woff2 +0 -0
- package/dist/fonts/poppins-latin-600-normal.woff +0 -0
- package/dist/fonts/poppins-latin-600-normal.woff2 +0 -0
- package/dist/fonts/poppins-latin-ext-400-normal.woff +0 -0
- package/dist/fonts/poppins-latin-ext-400-normal.woff2 +0 -0
- package/dist/fonts/poppins-latin-ext-500-normal.woff +0 -0
- package/dist/fonts/poppins-latin-ext-500-normal.woff2 +0 -0
- package/dist/fonts/poppins-latin-ext-600-normal.woff +0 -0
- package/dist/fonts/poppins-latin-ext-600-normal.woff2 +0 -0
- package/dist/fonts/rubik-arabic-400-normal.woff +0 -0
- package/dist/fonts/rubik-arabic-400-normal.woff2 +0 -0
- package/dist/fonts/rubik-arabic-500-normal.woff +0 -0
- package/dist/fonts/rubik-arabic-500-normal.woff2 +0 -0
- package/dist/fonts/rubik-cyrillic-400-normal.woff +0 -0
- package/dist/fonts/rubik-cyrillic-400-normal.woff2 +0 -0
- package/dist/fonts/rubik-cyrillic-500-normal.woff +0 -0
- package/dist/fonts/rubik-cyrillic-500-normal.woff2 +0 -0
- package/dist/fonts/rubik-cyrillic-ext-400-normal.woff +0 -0
- package/dist/fonts/rubik-cyrillic-ext-400-normal.woff2 +0 -0
- package/dist/fonts/rubik-cyrillic-ext-500-normal.woff +0 -0
- package/dist/fonts/rubik-cyrillic-ext-500-normal.woff2 +0 -0
- package/dist/fonts/rubik-hebrew-400-normal.woff +0 -0
- package/dist/fonts/rubik-hebrew-400-normal.woff2 +0 -0
- package/dist/fonts/rubik-hebrew-500-normal.woff +0 -0
- package/dist/fonts/rubik-hebrew-500-normal.woff2 +0 -0
- package/dist/fonts/rubik-latin-400-normal.woff +0 -0
- package/dist/fonts/rubik-latin-400-normal.woff2 +0 -0
- package/dist/fonts/rubik-latin-500-normal.woff +0 -0
- package/dist/fonts/rubik-latin-500-normal.woff2 +0 -0
- package/dist/fonts/rubik-latin-ext-400-normal.woff +0 -0
- package/dist/fonts/rubik-latin-ext-400-normal.woff2 +0 -0
- package/dist/fonts/rubik-latin-ext-500-normal.woff +0 -0
- package/dist/fonts/rubik-latin-ext-500-normal.woff2 +0 -0
- package/dist/fonts/source-serif-pro-cyrillic-400-normal.woff +0 -0
- package/dist/fonts/source-serif-pro-cyrillic-400-normal.woff2 +0 -0
- package/dist/fonts/source-serif-pro-cyrillic-ext-400-normal.woff +0 -0
- package/dist/fonts/source-serif-pro-cyrillic-ext-400-normal.woff2 +0 -0
- package/dist/fonts/source-serif-pro-greek-400-normal.woff +0 -0
- package/dist/fonts/source-serif-pro-greek-400-normal.woff2 +0 -0
- package/dist/fonts/source-serif-pro-latin-400-normal.woff +0 -0
- package/dist/fonts/source-serif-pro-latin-400-normal.woff2 +0 -0
- package/dist/fonts/source-serif-pro-latin-ext-400-normal.woff +0 -0
- package/dist/fonts/source-serif-pro-latin-ext-400-normal.woff2 +0 -0
- package/dist/fonts/source-serif-pro-vietnamese-400-normal.woff +0 -0
- package/dist/fonts/source-serif-pro-vietnamese-400-normal.woff2 +0 -0
- package/dist/fonts/space-grotesk-latin-400-normal.woff +0 -0
- package/dist/fonts/space-grotesk-latin-400-normal.woff2 +0 -0
- package/dist/fonts/space-grotesk-latin-600-normal.woff +0 -0
- package/dist/fonts/space-grotesk-latin-600-normal.woff2 +0 -0
- package/dist/fonts/space-grotesk-latin-700-normal.woff +0 -0
- package/dist/fonts/space-grotesk-latin-700-normal.woff2 +0 -0
- package/dist/fonts/space-grotesk-latin-ext-400-normal.woff +0 -0
- package/dist/fonts/space-grotesk-latin-ext-400-normal.woff2 +0 -0
- package/dist/fonts/space-grotesk-latin-ext-600-normal.woff +0 -0
- package/dist/fonts/space-grotesk-latin-ext-600-normal.woff2 +0 -0
- package/dist/fonts/space-grotesk-latin-ext-700-normal.woff +0 -0
- package/dist/fonts/space-grotesk-latin-ext-700-normal.woff2 +0 -0
- package/dist/fonts/space-grotesk-vietnamese-400-normal.woff +0 -0
- package/dist/fonts/space-grotesk-vietnamese-400-normal.woff2 +0 -0
- package/dist/fonts/space-grotesk-vietnamese-600-normal.woff +0 -0
- package/dist/fonts/space-grotesk-vietnamese-600-normal.woff2 +0 -0
- package/dist/fonts/space-grotesk-vietnamese-700-normal.woff +0 -0
- package/dist/fonts/space-grotesk-vietnamese-700-normal.woff2 +0 -0
- package/dist/fonts/work-sans-latin-400-normal.woff +0 -0
- package/dist/fonts/work-sans-latin-400-normal.woff2 +0 -0
- package/dist/fonts/work-sans-latin-500-normal.woff +0 -0
- package/dist/fonts/work-sans-latin-500-normal.woff2 +0 -0
- package/dist/fonts/work-sans-latin-ext-400-normal.woff +0 -0
- package/dist/fonts/work-sans-latin-ext-400-normal.woff2 +0 -0
- package/dist/fonts/work-sans-latin-ext-500-normal.woff +0 -0
- package/dist/fonts/work-sans-latin-ext-500-normal.woff2 +0 -0
- package/dist/fonts/work-sans-vietnamese-400-normal.woff +0 -0
- package/dist/fonts/work-sans-vietnamese-400-normal.woff2 +0 -0
- package/dist/fonts/work-sans-vietnamese-500-normal.woff +0 -0
- package/dist/fonts/work-sans-vietnamese-500-normal.woff2 +0 -0
- package/dist/footer.js +308 -0
- package/dist/footer.js.map +1 -0
- package/dist/form-field.js +69 -0
- package/dist/form-field.js.map +1 -0
- package/dist/form.js +732 -0
- package/dist/form.js.map +1 -0
- package/dist/format.js +112 -0
- package/dist/format.js.map +1 -0
- package/dist/fouc.js +28 -0
- package/dist/fouc.js.map +1 -0
- package/dist/header.js +289 -0
- package/dist/header.js.map +1 -0
- package/dist/hooks.js +13 -0
- package/dist/hooks.js.map +1 -0
- package/dist/hover-card.js +210 -0
- package/dist/hover-card.js.map +1 -0
- package/dist/index-0ioNhtNM.js +11 -0
- package/dist/index-0ioNhtNM.js.map +1 -0
- package/dist/index-1QHKgw6D.js +55 -0
- package/dist/index-1QHKgw6D.js.map +1 -0
- package/dist/index-B6sSWi7l.js +747 -0
- package/dist/index-B6sSWi7l.js.map +1 -0
- package/dist/index-BCjJQGh8.js +71 -0
- package/dist/index-BCjJQGh8.js.map +1 -0
- package/dist/index-BGQepRFJ.js +28 -0
- package/dist/index-BGQepRFJ.js.map +1 -0
- package/dist/index-BVRIAMfe.js +37 -0
- package/dist/index-BVRIAMfe.js.map +1 -0
- package/dist/index-BY7PeRJA.js +145 -0
- package/dist/index-BY7PeRJA.js.map +1 -0
- package/dist/index-BZPx6jYI.js +9 -0
- package/dist/index-BZPx6jYI.js.map +1 -0
- package/dist/index-Ba4eHUBD.js +243 -0
- package/dist/index-Ba4eHUBD.js.map +1 -0
- package/dist/index-Bke1qZdk.js +35 -0
- package/dist/index-Bke1qZdk.js.map +1 -0
- package/dist/index-C0UREtMP.js +60 -0
- package/dist/index-C0UREtMP.js.map +1 -0
- package/dist/index-CCKe-Mpx.js +7 -0
- package/dist/index-CCKe-Mpx.js.map +1 -0
- package/dist/index-DFZozV_h.js +69 -0
- package/dist/index-DFZozV_h.js.map +1 -0
- package/dist/index-DFi6WydO.js +180 -0
- package/dist/index-DFi6WydO.js.map +1 -0
- package/dist/index-DQH6odE9.js +83 -0
- package/dist/index-DQH6odE9.js.map +1 -0
- package/dist/index-EO5flKM3.js +119 -0
- package/dist/index-EO5flKM3.js.map +1 -0
- package/dist/index-Lf7yDOXW.js +615 -0
- package/dist/index-Lf7yDOXW.js.map +1 -0
- package/dist/index-dhIqEbxW.js +1541 -0
- package/dist/index-dhIqEbxW.js.map +1 -0
- package/dist/index-pWhlqjff.js +32 -0
- package/dist/index-pWhlqjff.js.map +1 -0
- package/dist/index-rKs9bXHr.js +7 -0
- package/dist/index-rKs9bXHr.js.map +1 -0
- package/dist/index-xqkGMOJ8.js +14 -0
- package/dist/index-xqkGMOJ8.js.map +1 -0
- package/dist/index.js +247 -0
- package/dist/index.js.map +1 -0
- package/dist/input.js +22 -0
- package/dist/input.js.map +1 -0
- package/dist/label.js +36 -0
- package/dist/label.js.map +1 -0
- package/dist/layout-wrapper.js +208 -0
- package/dist/layout-wrapper.js.map +1 -0
- package/dist/llms.txt +1140 -0
- package/dist/menu-DBhEanGo.js +16 -0
- package/dist/menu-DBhEanGo.js.map +1 -0
- package/dist/menubar.js +565 -0
- package/dist/menubar.js.map +1 -0
- package/dist/mobile.js +183 -0
- package/dist/mobile.js.map +1 -0
- package/dist/motion.js +119 -0
- package/dist/motion.js.map +1 -0
- package/dist/page-header.js +47 -0
- package/dist/page-header.js.map +1 -0
- package/dist/page.js +214 -0
- package/dist/page.js.map +1 -0
- package/dist/pagination.js +121 -0
- package/dist/pagination.js.map +1 -0
- package/dist/platform.js +194 -0
- package/dist/platform.js.map +1 -0
- package/dist/popover.js +263 -0
- package/dist/popover.js.map +1 -0
- package/dist/popup.js +335 -0
- package/dist/popup.js.map +1 -0
- package/dist/progress.js +108 -0
- package/dist/progress.js.map +1 -0
- package/dist/radio-group.js +272 -0
- package/dist/radio-group.js.map +1 -0
- package/dist/safe-area.js +42 -0
- package/dist/safe-area.js.map +1 -0
- package/dist/search-CpUwRnG-.js +15 -0
- package/dist/search-CpUwRnG-.js.map +1 -0
- package/dist/select.js +985 -0
- package/dist/select.js.map +1 -0
- package/dist/separator.js +45 -0
- package/dist/separator.js.map +1 -0
- package/dist/sheet.js +127 -0
- package/dist/sheet.js.map +1 -0
- package/dist/skeleton.js +16 -0
- package/dist/skeleton.js.map +1 -0
- package/dist/slider.js +485 -0
- package/dist/slider.js.map +1 -0
- package/dist/sonner.js +52 -0
- package/dist/sonner.js.map +1 -0
- package/dist/styles/fonts.css +253 -0
- package/dist/styles.css +2 -0
- package/dist/switch.js +155 -0
- package/dist/switch.js.map +1 -0
- package/dist/tab-bar.js +110 -0
- package/dist/tab-bar.js.map +1 -0
- package/dist/table.js +115 -0
- package/dist/table.js.map +1 -0
- package/dist/tabs.js +218 -0
- package/dist/tabs.js.map +1 -0
- package/dist/textarea.js +19 -0
- package/dist/textarea.js.map +1 -0
- package/dist/theme-provider.js +154 -0
- package/dist/theme-provider.js.map +1 -0
- package/dist/themes.js +873 -0
- package/dist/themes.js.map +1 -0
- package/dist/toast.js +63 -0
- package/dist/toast.js.map +1 -0
- package/dist/toggle.js +70 -0
- package/dist/toggle.js.map +1 -0
- package/dist/tooltip.js +375 -0
- package/dist/tooltip.js.map +1 -0
- package/dist/types/App.d.ts +3 -0
- package/dist/types/App.d.ts.map +1 -0
- package/dist/types/components/layouts/admin.d.ts +117 -0
- package/dist/types/components/layouts/admin.d.ts.map +1 -0
- package/dist/types/components/layouts/auth.d.ts +17 -0
- package/dist/types/components/layouts/auth.d.ts.map +1 -0
- package/dist/types/components/layouts/blank.d.ts +63 -0
- package/dist/types/components/layouts/blank.d.ts.map +1 -0
- package/dist/types/components/layouts/layout-wrapper.d.ts +130 -0
- package/dist/types/components/layouts/layout-wrapper.d.ts.map +1 -0
- package/dist/types/components/layouts/mobile.d.ts +91 -0
- package/dist/types/components/layouts/mobile.d.ts.map +1 -0
- package/dist/types/components/layouts/page.d.ts +181 -0
- package/dist/types/components/layouts/page.d.ts.map +1 -0
- package/dist/types/components/layouts/popup.d.ts +100 -0
- package/dist/types/components/layouts/popup.d.ts.map +1 -0
- package/dist/types/components/sections/container.d.ts +79 -0
- package/dist/types/components/sections/container.d.ts.map +1 -0
- package/dist/types/components/sections/footer.d.ts +128 -0
- package/dist/types/components/sections/footer.d.ts.map +1 -0
- package/dist/types/components/sections/header.d.ts +72 -0
- package/dist/types/components/sections/header.d.ts.map +1 -0
- package/dist/types/components/sections/safe-area.d.ts +46 -0
- package/dist/types/components/sections/safe-area.d.ts.map +1 -0
- package/dist/types/components/sections/tab-bar.d.ts +61 -0
- package/dist/types/components/sections/tab-bar.d.ts.map +1 -0
- package/dist/types/components/ui/accordion.d.ts +8 -0
- package/dist/types/components/ui/accordion.d.ts.map +1 -0
- package/dist/types/components/ui/alert.d.ts +10 -0
- package/dist/types/components/ui/alert.d.ts.map +1 -0
- package/dist/types/components/ui/avatar.d.ts +7 -0
- package/dist/types/components/ui/avatar.d.ts.map +1 -0
- package/dist/types/components/ui/badge.d.ts +10 -0
- package/dist/types/components/ui/badge.d.ts.map +1 -0
- package/dist/types/components/ui/breadcrumb.d.ts +12 -0
- package/dist/types/components/ui/breadcrumb.d.ts.map +1 -0
- package/dist/types/components/ui/button.d.ts +11 -0
- package/dist/types/components/ui/button.d.ts.map +1 -0
- package/dist/types/components/ui/calendar.d.ts +9 -0
- package/dist/types/components/ui/calendar.d.ts.map +1 -0
- package/dist/types/components/ui/card.d.ts +10 -0
- package/dist/types/components/ui/card.d.ts.map +1 -0
- package/dist/types/components/ui/checkbox.d.ts +5 -0
- package/dist/types/components/ui/checkbox.d.ts.map +1 -0
- package/dist/types/components/ui/collapsible.d.ts +6 -0
- package/dist/types/components/ui/collapsible.d.ts.map +1 -0
- package/dist/types/components/ui/command.d.ts +19 -0
- package/dist/types/components/ui/command.d.ts.map +1 -0
- package/dist/types/components/ui/confirm-dialog.d.ts +72 -0
- package/dist/types/components/ui/confirm-dialog.d.ts.map +1 -0
- package/dist/types/components/ui/data-table.d.ts +211 -0
- package/dist/types/components/ui/data-table.d.ts.map +1 -0
- package/dist/types/components/ui/detail-page.d.ts +119 -0
- package/dist/types/components/ui/detail-page.d.ts.map +1 -0
- package/dist/types/components/ui/dialog.d.ts +16 -0
- package/dist/types/components/ui/dialog.d.ts.map +1 -0
- package/dist/types/components/ui/dropdown-menu.d.ts +26 -0
- package/dist/types/components/ui/dropdown-menu.d.ts.map +1 -0
- package/dist/types/components/ui/empty-state.d.ts +30 -0
- package/dist/types/components/ui/empty-state.d.ts.map +1 -0
- package/dist/types/components/ui/form-field.d.ts +57 -0
- package/dist/types/components/ui/form-field.d.ts.map +1 -0
- package/dist/types/components/ui/form.d.ts +185 -0
- package/dist/types/components/ui/form.d.ts.map +1 -0
- package/dist/types/components/ui/hover-card.d.ts +7 -0
- package/dist/types/components/ui/hover-card.d.ts.map +1 -0
- package/dist/types/components/ui/input.d.ts +4 -0
- package/dist/types/components/ui/input.d.ts.map +1 -0
- package/dist/types/components/ui/label.d.ts +5 -0
- package/dist/types/components/ui/label.d.ts.map +1 -0
- package/dist/types/components/ui/menubar.d.ts +27 -0
- package/dist/types/components/ui/menubar.d.ts.map +1 -0
- package/dist/types/components/ui/motion.d.ts +130 -0
- package/dist/types/components/ui/motion.d.ts.map +1 -0
- package/dist/types/components/ui/page-header.d.ts +45 -0
- package/dist/types/components/ui/page-header.d.ts.map +1 -0
- package/dist/types/components/ui/pagination.d.ts +14 -0
- package/dist/types/components/ui/pagination.d.ts.map +1 -0
- package/dist/types/components/ui/popover.d.ts +8 -0
- package/dist/types/components/ui/popover.d.ts.map +1 -0
- package/dist/types/components/ui/progress.d.ts +5 -0
- package/dist/types/components/ui/progress.d.ts.map +1 -0
- package/dist/types/components/ui/radio-group.d.ts +6 -0
- package/dist/types/components/ui/radio-group.d.ts.map +1 -0
- package/dist/types/components/ui/select.d.ts +16 -0
- package/dist/types/components/ui/select.d.ts.map +1 -0
- package/dist/types/components/ui/separator.d.ts +5 -0
- package/dist/types/components/ui/separator.d.ts.map +1 -0
- package/dist/types/components/ui/sheet.d.ts +14 -0
- package/dist/types/components/ui/sheet.d.ts.map +1 -0
- package/dist/types/components/ui/skeleton.d.ts +3 -0
- package/dist/types/components/ui/skeleton.d.ts.map +1 -0
- package/dist/types/components/ui/slider.d.ts +5 -0
- package/dist/types/components/ui/slider.d.ts.map +1 -0
- package/dist/types/components/ui/sonner.d.ts +4 -0
- package/dist/types/components/ui/sonner.d.ts.map +1 -0
- package/dist/types/components/ui/switch.d.ts +5 -0
- package/dist/types/components/ui/switch.d.ts.map +1 -0
- package/dist/types/components/ui/table.d.ts +11 -0
- package/dist/types/components/ui/table.d.ts.map +1 -0
- package/dist/types/components/ui/tabs.d.ts +8 -0
- package/dist/types/components/ui/tabs.d.ts.map +1 -0
- package/dist/types/components/ui/textarea.d.ts +4 -0
- package/dist/types/components/ui/textarea.d.ts.map +1 -0
- package/dist/types/components/ui/toast.d.ts +70 -0
- package/dist/types/components/ui/toast.d.ts.map +1 -0
- package/dist/types/components/ui/toggle.d.ts +10 -0
- package/dist/types/components/ui/toggle.d.ts.map +1 -0
- package/dist/types/components/ui/tooltip.d.ts +8 -0
- package/dist/types/components/ui/tooltip.d.ts.map +1 -0
- package/dist/types/hooks/index.d.ts +14 -0
- package/dist/types/hooks/index.d.ts.map +1 -0
- package/dist/types/hooks/useApi.d.ts +38 -0
- package/dist/types/hooks/useApi.d.ts.map +1 -0
- package/dist/types/hooks/useBreakpoint.d.ts +35 -0
- package/dist/types/hooks/useBreakpoint.d.ts.map +1 -0
- package/dist/types/hooks/useDataTable.d.ts +59 -0
- package/dist/types/hooks/useDataTable.d.ts.map +1 -0
- package/dist/types/hooks/useMediaQuery.d.ts +12 -0
- package/dist/types/hooks/useMediaQuery.d.ts.map +1 -0
- package/dist/types/hooks/useStorage.d.ts +35 -0
- package/dist/types/hooks/useStorage.d.ts.map +1 -0
- package/dist/types/index.d.ts +75 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/lib/errors.d.ts +37 -0
- package/dist/types/lib/errors.d.ts.map +1 -0
- package/dist/types/lib/format.d.ts +80 -0
- package/dist/types/lib/format.d.ts.map +1 -0
- package/dist/types/lib/fouc.d.ts +64 -0
- package/dist/types/lib/fouc.d.ts.map +1 -0
- package/dist/types/lib/platform.d.ts +156 -0
- package/dist/types/lib/platform.d.ts.map +1 -0
- package/dist/types/lib/utils.d.ts +14 -0
- package/dist/types/lib/utils.d.ts.map +1 -0
- package/dist/types/main.d.ts +2 -0
- package/dist/types/main.d.ts.map +1 -0
- package/dist/types/themes/index.d.ts +499 -0
- package/dist/types/themes/index.d.ts.map +1 -0
- package/dist/types/themes/presets/base.d.ts +108 -0
- package/dist/types/themes/presets/base.d.ts.map +1 -0
- package/dist/types/themes/presets/elegant.d.ts +108 -0
- package/dist/types/themes/presets/elegant.d.ts.map +1 -0
- package/dist/types/themes/presets/metro.d.ts +114 -0
- package/dist/types/themes/presets/metro.d.ts.map +1 -0
- package/dist/types/themes/presets/studio.d.ts +115 -0
- package/dist/types/themes/presets/studio.d.ts.map +1 -0
- package/dist/types/themes/presets/vivid.d.ts +115 -0
- package/dist/types/themes/presets/vivid.d.ts.map +1 -0
- package/dist/types/themes/theme-provider.d.ts +122 -0
- package/dist/types/themes/theme-provider.d.ts.map +1 -0
- package/dist/types/types/index.d.ts +813 -0
- package/dist/types/types/index.d.ts.map +1 -0
- package/dist/uikit.css +1 -0
- package/dist/useDataTable-CPiBpEg-.js +254 -0
- package/dist/useDataTable-CPiBpEg-.js.map +1 -0
- package/dist/utils-CwJPJKOE.js +2278 -0
- package/dist/utils-CwJPJKOE.js.map +1 -0
- package/dist/utils.js +5 -0
- package/dist/utils.js.map +1 -0
- package/dist/wrapper.js +13 -0
- package/dist/wrapper.js.map +1 -0
- package/dist/x-BxwubQiM.js +15 -0
- package/dist/x-BxwubQiM.js.map +1 -0
- package/examples/README.md +18 -0
- package/examples/button.tsx +16 -0
- package/examples/confirm-dialog.tsx +44 -0
- package/examples/data-table.tsx +35 -0
- package/examples/dialog.tsx +34 -0
- package/examples/empty-state.tsx +13 -0
- package/examples/form-field.tsx +22 -0
- package/examples/format.tsx +19 -0
- package/examples/page-header.tsx +17 -0
- package/examples/skeleton.tsx +12 -0
- package/examples/theme-provider.tsx +33 -0
- package/examples/toast.tsx +32 -0
- package/examples/use-breakpoint.tsx +17 -0
- package/llms.txt +1140 -0
- 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":"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","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;"}
|