@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
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/dist/footer.js
ADDED
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
import { jsx as e, jsxs as i, Fragment as B } from "react/jsx-runtime";
|
|
2
|
+
import { createContext as V, forwardRef as v, useContext as k } from "react";
|
|
3
|
+
import { c as w } from "./index-Bke1qZdk.js";
|
|
4
|
+
import { c as t } from "./utils-CwJPJKOE.js";
|
|
5
|
+
import { Button as I } from "./button.js";
|
|
6
|
+
import { Separator as C } from "./separator.js";
|
|
7
|
+
const y = V({
|
|
8
|
+
tone: "contrast",
|
|
9
|
+
size: "xl"
|
|
10
|
+
}), T = w(
|
|
11
|
+
"w-full border-t transition-all duration-200",
|
|
12
|
+
{
|
|
13
|
+
variants: {
|
|
14
|
+
tone: {
|
|
15
|
+
clean: "bg-background/80 backdrop-blur-sm border-border/40 text-foreground",
|
|
16
|
+
subtle: "bg-muted/50 backdrop-blur-sm border-border/30 text-foreground",
|
|
17
|
+
brand: "bg-primary border-primary-foreground/20 text-primary-foreground",
|
|
18
|
+
contrast: "bg-zinc-900 border-zinc-700/40 text-zinc-100"
|
|
19
|
+
},
|
|
20
|
+
position: {
|
|
21
|
+
sticky: "sticky bottom-0 z-30",
|
|
22
|
+
fixed: "fixed bottom-0 left-0 right-0 z-30",
|
|
23
|
+
relative: "relative"
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
defaultVariants: {
|
|
27
|
+
tone: "contrast",
|
|
28
|
+
position: "relative"
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
), L = w(
|
|
32
|
+
"mx-auto",
|
|
33
|
+
{
|
|
34
|
+
variants: {
|
|
35
|
+
size: {
|
|
36
|
+
sm: "max-w-2xl py-4 px-4",
|
|
37
|
+
md: "max-w-4xl py-5 px-4 sm:px-6",
|
|
38
|
+
lg: "max-w-6xl py-6 px-4 sm:px-6 lg:px-8",
|
|
39
|
+
xl: "max-w-7xl py-6 px-4 sm:px-6 lg:px-8",
|
|
40
|
+
full: "max-w-full py-8 px-4 sm:px-6 lg:px-8"
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
defaultVariants: {
|
|
44
|
+
size: "xl"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
), F = v(({
|
|
48
|
+
className: g,
|
|
49
|
+
tone: c = "contrast",
|
|
50
|
+
size: n = "xl",
|
|
51
|
+
position: m = "relative",
|
|
52
|
+
navigation: l = [],
|
|
53
|
+
currentPath: d = "",
|
|
54
|
+
onNavigate: s,
|
|
55
|
+
children: u,
|
|
56
|
+
...h
|
|
57
|
+
}, a) => /* @__PURE__ */ e(y.Provider, { value: { tone: c, size: n }, children: /* @__PURE__ */ e(
|
|
58
|
+
"footer",
|
|
59
|
+
{
|
|
60
|
+
ref: a,
|
|
61
|
+
className: t(T({ tone: c, position: m }), g),
|
|
62
|
+
...h,
|
|
63
|
+
children: /* @__PURE__ */ i("div", { className: t(L({ size: n })), children: [
|
|
64
|
+
l.length > 0 && !u && /* @__PURE__ */ e(
|
|
65
|
+
z,
|
|
66
|
+
{
|
|
67
|
+
navigation: l,
|
|
68
|
+
currentPath: d,
|
|
69
|
+
onNavigate: s
|
|
70
|
+
}
|
|
71
|
+
),
|
|
72
|
+
u
|
|
73
|
+
] })
|
|
74
|
+
}
|
|
75
|
+
) }));
|
|
76
|
+
F.displayName = "Footer";
|
|
77
|
+
const z = v(({
|
|
78
|
+
className: g,
|
|
79
|
+
navigation: c = [],
|
|
80
|
+
currentPath: n = "",
|
|
81
|
+
onNavigate: m,
|
|
82
|
+
logo: l,
|
|
83
|
+
social: d,
|
|
84
|
+
copyright: s,
|
|
85
|
+
...u
|
|
86
|
+
}, h) => {
|
|
87
|
+
const { tone: a } = k(y), N = (r) => {
|
|
88
|
+
r.href && m ? m(r.href, r) : r.onClick && r.onClick();
|
|
89
|
+
}, b = (r = !1) => {
|
|
90
|
+
const f = "text-sm transition-colors cursor-pointer";
|
|
91
|
+
switch (a) {
|
|
92
|
+
case "subtle":
|
|
93
|
+
return t(f, r ? "text-foreground" : "text-muted-foreground hover:text-foreground");
|
|
94
|
+
case "brand":
|
|
95
|
+
return t(f, r ? "text-primary-foreground" : "text-primary-foreground/80 hover:text-primary-foreground");
|
|
96
|
+
case "contrast":
|
|
97
|
+
return t(f, r ? "text-zinc-100" : "text-zinc-300 hover:text-zinc-100");
|
|
98
|
+
default:
|
|
99
|
+
return t(f, r ? "text-foreground" : "text-muted-foreground hover:text-foreground");
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
return /* @__PURE__ */ i(
|
|
103
|
+
"div",
|
|
104
|
+
{
|
|
105
|
+
ref: h,
|
|
106
|
+
className: t("space-y-4", g),
|
|
107
|
+
...u,
|
|
108
|
+
children: [
|
|
109
|
+
/* @__PURE__ */ i("div", { className: "flex flex-col sm:flex-row items-center justify-between gap-4", children: [
|
|
110
|
+
l && /* @__PURE__ */ e("div", { className: "flex-shrink-0", children: l }),
|
|
111
|
+
c.length > 0 && /* @__PURE__ */ e("nav", { className: "flex flex-wrap items-center justify-center gap-6", children: c.map((r) => {
|
|
112
|
+
const f = r.href ? n === r.href : r.isActive;
|
|
113
|
+
return /* @__PURE__ */ e(
|
|
114
|
+
"button",
|
|
115
|
+
{
|
|
116
|
+
onClick: () => N(r),
|
|
117
|
+
className: t(b(f), r.className),
|
|
118
|
+
children: r.label
|
|
119
|
+
},
|
|
120
|
+
r.key
|
|
121
|
+
);
|
|
122
|
+
}) }),
|
|
123
|
+
d && /* @__PURE__ */ e("div", { className: "flex-shrink-0", children: d })
|
|
124
|
+
] }),
|
|
125
|
+
s && /* @__PURE__ */ i(B, { children: [
|
|
126
|
+
/* @__PURE__ */ e(C, { className: t(
|
|
127
|
+
a === "brand" && "bg-primary-foreground/20",
|
|
128
|
+
a === "contrast" && "bg-zinc-700"
|
|
129
|
+
) }),
|
|
130
|
+
/* @__PURE__ */ e("div", { className: "text-center", children: /* @__PURE__ */ e("p", { className: t(
|
|
131
|
+
"text-sm",
|
|
132
|
+
a === "contrast" && "text-zinc-400",
|
|
133
|
+
a === "brand" && "text-primary-foreground/80",
|
|
134
|
+
(a === "clean" || a === "subtle") && "text-muted-foreground"
|
|
135
|
+
), children: s }) })
|
|
136
|
+
] })
|
|
137
|
+
]
|
|
138
|
+
}
|
|
139
|
+
);
|
|
140
|
+
});
|
|
141
|
+
z.displayName = "FooterBasic";
|
|
142
|
+
const S = v(({
|
|
143
|
+
className: g,
|
|
144
|
+
brand: c,
|
|
145
|
+
columns: n = [],
|
|
146
|
+
newsletter: m,
|
|
147
|
+
social: l,
|
|
148
|
+
legal: d = [],
|
|
149
|
+
currentPath: s = "",
|
|
150
|
+
onNavigate: u,
|
|
151
|
+
copyright: h,
|
|
152
|
+
...a
|
|
153
|
+
}, N) => {
|
|
154
|
+
const { tone: b } = k(y), r = (o) => {
|
|
155
|
+
o.href && u ? u(o.href, o) : o.onClick && o.onClick();
|
|
156
|
+
}, p = (() => {
|
|
157
|
+
switch (b) {
|
|
158
|
+
case "subtle":
|
|
159
|
+
return {
|
|
160
|
+
heading: "text-foreground",
|
|
161
|
+
text: "text-muted-foreground",
|
|
162
|
+
link: "text-muted-foreground hover:text-foreground"
|
|
163
|
+
};
|
|
164
|
+
case "brand":
|
|
165
|
+
return {
|
|
166
|
+
heading: "text-primary-foreground",
|
|
167
|
+
text: "text-primary-foreground/70",
|
|
168
|
+
link: "text-primary-foreground/70 hover:text-primary-foreground"
|
|
169
|
+
};
|
|
170
|
+
case "contrast":
|
|
171
|
+
return {
|
|
172
|
+
heading: "text-zinc-100",
|
|
173
|
+
text: "text-zinc-300",
|
|
174
|
+
link: "text-zinc-300 hover:text-zinc-100"
|
|
175
|
+
};
|
|
176
|
+
default:
|
|
177
|
+
return {
|
|
178
|
+
heading: "text-foreground",
|
|
179
|
+
text: "text-muted-foreground",
|
|
180
|
+
link: "text-muted-foreground hover:text-foreground"
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
})();
|
|
184
|
+
return /* @__PURE__ */ i(
|
|
185
|
+
"div",
|
|
186
|
+
{
|
|
187
|
+
ref: N,
|
|
188
|
+
className: t("space-y-8", g),
|
|
189
|
+
...a,
|
|
190
|
+
children: [
|
|
191
|
+
/* @__PURE__ */ i("div", { className: "grid gap-8 grid-cols-1 md:grid-cols-6 lg:grid-cols-6", children: [
|
|
192
|
+
c && /* @__PURE__ */ i("div", { className: "col-span-2", children: [
|
|
193
|
+
" ",
|
|
194
|
+
c
|
|
195
|
+
] }),
|
|
196
|
+
/* @__PURE__ */ e("div", { className: "col-span-4", children: n.length > 0 && /* @__PURE__ */ e("div", { className: t(
|
|
197
|
+
"grid gap-6",
|
|
198
|
+
// No columns: hidden
|
|
199
|
+
n.length === 0 && "hidden",
|
|
200
|
+
// 1 column: single column
|
|
201
|
+
n.length === 1 && "grid-cols-1",
|
|
202
|
+
// 2 columns: responsive 1→2
|
|
203
|
+
n.length === 2 && "grid-cols-2 sm:grid-cols-2 md:grid-cols-3",
|
|
204
|
+
// 3 columns: responsive 1→2→3
|
|
205
|
+
n.length === 3 && "grid-cols-2 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-3",
|
|
206
|
+
// 4+ columns: responsive 1→2→4
|
|
207
|
+
n.length >= 4 && "grid-cols-2 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4"
|
|
208
|
+
), children: n.slice(0, 4).map((o) => /* @__PURE__ */ i("div", { className: "space-y-3", children: [
|
|
209
|
+
/* @__PURE__ */ e("h4", { className: t("text-sm font-semibold", p.heading), children: o.title }),
|
|
210
|
+
/* @__PURE__ */ e("ul", { className: "space-y-2", children: o.items?.map((x) => {
|
|
211
|
+
const A = x.href ? s === x.href : x.isActive;
|
|
212
|
+
return /* @__PURE__ */ e("li", { children: /* @__PURE__ */ e(
|
|
213
|
+
"button",
|
|
214
|
+
{
|
|
215
|
+
onClick: () => r(x),
|
|
216
|
+
className: t(
|
|
217
|
+
"text-sm transition-colors cursor-pointer block",
|
|
218
|
+
A ? p.heading : p.link,
|
|
219
|
+
x.className
|
|
220
|
+
),
|
|
221
|
+
children: x.label
|
|
222
|
+
}
|
|
223
|
+
) }, x.key);
|
|
224
|
+
}) })
|
|
225
|
+
] }, o.key)) }) })
|
|
226
|
+
] }),
|
|
227
|
+
/* @__PURE__ */ i("div", { className: "space-y-4", children: [
|
|
228
|
+
/* @__PURE__ */ e(C, { className: t(
|
|
229
|
+
b === "brand" && "bg-primary-foreground/20",
|
|
230
|
+
b === "contrast" && "bg-zinc-700"
|
|
231
|
+
) }),
|
|
232
|
+
/* @__PURE__ */ i("div", { className: "flex flex-col sm:flex-row items-center justify-between gap-4", children: [
|
|
233
|
+
h && /* @__PURE__ */ e("p", { className: t("text-sm", p.text), children: h }),
|
|
234
|
+
d.length > 0 && /* @__PURE__ */ e("div", { className: "flex items-center gap-4", children: d.map((o) => {
|
|
235
|
+
const x = o.href ? s === o.href : o.isActive;
|
|
236
|
+
return /* @__PURE__ */ e(
|
|
237
|
+
"button",
|
|
238
|
+
{
|
|
239
|
+
onClick: () => r(o),
|
|
240
|
+
className: t(
|
|
241
|
+
"text-sm transition-colors cursor-pointer",
|
|
242
|
+
x ? p.heading : p.link,
|
|
243
|
+
o.className
|
|
244
|
+
),
|
|
245
|
+
children: o.label
|
|
246
|
+
},
|
|
247
|
+
o.key
|
|
248
|
+
);
|
|
249
|
+
}) }),
|
|
250
|
+
l && /* @__PURE__ */ e("div", { className: "flex items-center gap-2", children: l })
|
|
251
|
+
] })
|
|
252
|
+
] })
|
|
253
|
+
]
|
|
254
|
+
}
|
|
255
|
+
);
|
|
256
|
+
});
|
|
257
|
+
S.displayName = "FooterAdvanced";
|
|
258
|
+
const j = v(({
|
|
259
|
+
className: g,
|
|
260
|
+
links: c = [],
|
|
261
|
+
...n
|
|
262
|
+
}, m) => {
|
|
263
|
+
const { tone: l } = k(y), d = () => {
|
|
264
|
+
switch (l) {
|
|
265
|
+
case "subtle":
|
|
266
|
+
return "text-muted-foreground hover:text-foreground hover:bg-background/50";
|
|
267
|
+
case "brand":
|
|
268
|
+
return "text-primary-foreground/70 hover:text-primary-foreground hover:bg-primary-foreground/10";
|
|
269
|
+
case "contrast":
|
|
270
|
+
return "text-zinc-300 hover:text-zinc-100 hover:bg-zinc-800/50";
|
|
271
|
+
default:
|
|
272
|
+
return "text-muted-foreground hover:text-foreground hover:bg-muted";
|
|
273
|
+
}
|
|
274
|
+
};
|
|
275
|
+
return /* @__PURE__ */ e(
|
|
276
|
+
"div",
|
|
277
|
+
{
|
|
278
|
+
ref: m,
|
|
279
|
+
className: t("flex items-center gap-1", g),
|
|
280
|
+
...n,
|
|
281
|
+
children: c.map((s) => /* @__PURE__ */ e(
|
|
282
|
+
I,
|
|
283
|
+
{
|
|
284
|
+
variant: "ghost",
|
|
285
|
+
size: "icon",
|
|
286
|
+
className: t("h-8 w-8 cursor-pointer", d(), s.className),
|
|
287
|
+
onClick: s.onClick,
|
|
288
|
+
title: s.label,
|
|
289
|
+
children: /* @__PURE__ */ e(s.icon, { className: "h-4 w-4" })
|
|
290
|
+
},
|
|
291
|
+
s.key
|
|
292
|
+
))
|
|
293
|
+
}
|
|
294
|
+
);
|
|
295
|
+
});
|
|
296
|
+
j.displayName = "FooterSocial";
|
|
297
|
+
const H = Object.assign(F, {
|
|
298
|
+
Basic: z,
|
|
299
|
+
Advanced: S,
|
|
300
|
+
Social: j
|
|
301
|
+
});
|
|
302
|
+
export {
|
|
303
|
+
H as Footer,
|
|
304
|
+
S as FooterAdvanced,
|
|
305
|
+
z as FooterBasic,
|
|
306
|
+
j as FooterSocial
|
|
307
|
+
};
|
|
308
|
+
//# sourceMappingURL=footer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"footer.js","sources":["../src/components/sections/footer.tsx"],"sourcesContent":["/**\n * Footer component with standardized prop naming and tone system\n * @module @bloomneo/uikit\n * @file src/components/sections/footer.tsx\n */\n\nimport * as React from 'react';\nimport { forwardRef, createContext, useContext } from 'react';\nimport { cva } from 'class-variance-authority';\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/button';\nimport { Separator } from '@/components/ui/separator';\nimport type { Size, NavigationItem } from '@/types';\n\n/**\n * Footer context for sharing configuration\n */\nconst FooterContext = createContext<{\n tone: 'clean' | 'subtle' | 'brand' | 'contrast';\n size: Size;\n}>({\n tone: 'contrast',\n size: 'xl',\n});\n\n/**\n * Footer variants with tone-based semantic colors\n */\nconst footerVariants = cva(\n 'w-full border-t transition-all duration-200',\n {\n variants: {\n tone: {\n clean: 'bg-background/80 backdrop-blur-sm border-border/40 text-foreground',\n subtle: 'bg-muted/50 backdrop-blur-sm border-border/30 text-foreground', \n brand: 'bg-primary border-primary-foreground/20 text-primary-foreground',\n contrast: 'bg-zinc-900 border-zinc-700/40 text-zinc-100'\n },\n position: {\n sticky: 'sticky bottom-0 z-30',\n fixed: 'fixed bottom-0 left-0 right-0 z-30',\n relative: 'relative'\n }\n },\n defaultVariants: {\n tone: 'contrast',\n position: 'relative'\n }\n }\n);\n\n/**\n * Container variants for responsive sizing\n */\nconst containerVariants = cva(\n 'mx-auto',\n {\n variants: {\n size: {\n sm: 'max-w-2xl py-4 px-4',\n md: 'max-w-4xl py-5 px-4 sm:px-6',\n lg: 'max-w-6xl py-6 px-4 sm:px-6 lg:px-8',\n xl: 'max-w-7xl py-6 px-4 sm:px-6 lg:px-8',\n full: 'max-w-full py-8 px-4 sm:px-6 lg:px-8'\n }\n },\n defaultVariants: {\n size: 'xl'\n }\n }\n);\n\n/**\n * Footer component props with standardized system\n */\nexport interface FooterProps extends React.HTMLAttributes<HTMLElement> {\n /** Visual styling tone */\n tone?: 'clean' | 'subtle' | 'brand' | 'contrast';\n /** Footer size (width + padding + spacing) */\n size?: Size;\n /** Footer positioning */\n position?: 'sticky' | 'fixed' | 'relative';\n /** Navigation items */\n navigation?: NavigationItem[];\n /** Current path for active states */\n currentPath?: string;\n /** Navigation handler */\n onNavigate?: (href: string, item: NavigationItem) => void;\n /** Footer content */\n children: React.ReactNode;\n}\n\n/**\n * Main Footer component with standardized props\n */\nconst FooterComponent = forwardRef<HTMLElement, FooterProps>(({ \n className,\n tone = 'contrast',\n size = 'xl',\n position = 'relative',\n navigation = [],\n currentPath = '',\n onNavigate,\n children,\n ...props \n}, ref) => {\n return (\n <FooterContext.Provider value={{ tone, size }}>\n <footer\n ref={ref}\n className={cn(footerVariants({ tone, position }), className)}\n {...props}\n >\n <div className={cn(containerVariants({ size }))}>\n {/* Auto-render navigation if provided */}\n {navigation.length > 0 && !children && (\n <FooterBasic \n navigation={navigation}\n currentPath={currentPath}\n onNavigate={onNavigate}\n />\n )}\n {children}\n </div>\n </footer>\n </FooterContext.Provider>\n );\n});\n\nFooterComponent.displayName = 'Footer';\n\n/**\n * Basic Footer props\n */\nexport interface FooterBasicProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Navigation items (standardized) */\n navigation?: NavigationItem[];\n /** Current path for active states */\n currentPath?: string;\n /** Navigation handler */\n onNavigate?: (href: string, item: NavigationItem) => void;\n /** Footer logo/brand */\n logo?: React.ReactNode;\n /** Social media links */\n social?: React.ReactNode;\n /** Copyright text */\n copyright?: React.ReactNode;\n}\n\n/**\n * Basic Footer - Simple row layout with navigation\n */\nconst FooterBasic = forwardRef<HTMLDivElement, FooterBasicProps>(({\n className,\n navigation = [],\n currentPath = '',\n onNavigate,\n logo,\n social,\n copyright,\n ...props\n}, ref) => {\n const { tone } = useContext(FooterContext);\n\n // Handle navigation click\n const handleItemClick = (item: NavigationItem) => {\n if (item.href && onNavigate) {\n onNavigate(item.href, item);\n } else if (item.onClick) {\n item.onClick();\n }\n };\n\n // Get tone-specific link styles\n const getLinkStyles = (isActive = false) => {\n const baseStyles = 'text-sm transition-colors cursor-pointer';\n \n switch (tone) {\n case 'subtle':\n return cn(baseStyles, isActive ? 'text-foreground' : 'text-muted-foreground hover:text-foreground');\n case 'brand':\n return cn(baseStyles, isActive ? 'text-primary-foreground' : 'text-primary-foreground/80 hover:text-primary-foreground');\n case 'contrast':\n return cn(baseStyles, isActive ? 'text-zinc-100' : 'text-zinc-300 hover:text-zinc-100');\n default:\n return cn(baseStyles, isActive ? 'text-foreground' : 'text-muted-foreground hover:text-foreground');\n }\n };\n\n return (\n <div \n ref={ref}\n className={cn('space-y-4', className)}\n {...props}\n >\n {/* Main row with logo, links, and social */}\n <div className=\"flex flex-col sm:flex-row items-center justify-between gap-4\">\n {/* Logo */}\n {logo && (\n <div className=\"flex-shrink-0\">\n {logo}\n </div>\n )}\n\n {/* Navigation Links */}\n {navigation.length > 0 && (\n <nav className=\"flex flex-wrap items-center justify-center gap-6\">\n {navigation.map((item) => {\n const isActive = item.href ? currentPath === item.href : item.isActive;\n \n return (\n <button\n key={item.key}\n onClick={() => handleItemClick(item)}\n className={cn(getLinkStyles(isActive), item.className)}\n >\n {item.label}\n </button>\n );\n })}\n </nav>\n )}\n\n {/* Social Links */}\n {social && (\n <div className=\"flex-shrink-0\">\n {social}\n </div>\n )}\n </div>\n\n {/* Copyright */}\n {copyright && (\n <>\n <Separator className={cn(\n tone === 'brand' && 'bg-primary-foreground/20',\n tone === 'contrast' && 'bg-zinc-700'\n )} />\n <div className=\"text-center\">\n <p className={cn(\n 'text-sm',\n tone === 'contrast' && 'text-zinc-400',\n tone === 'brand' && 'text-primary-foreground/80',\n (tone === 'clean' || tone === 'subtle') && 'text-muted-foreground'\n )}>\n {copyright}\n </p>\n </div>\n </>\n )}\n </div>\n );\n});\n\nFooterBasic.displayName = 'FooterBasic';\n\n/**\n * Footer column interface\n */\nexport interface FooterColumn {\n /** Unique key */\n key: string;\n /** Column title */\n title: string;\n /** Column navigation items */\n items: NavigationItem[];\n}\n\n/**\n * Advanced Footer props\n */\nexport interface FooterAdvancedProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Brand section (logo + description) */\n brand?: React.ReactNode;\n /** Footer columns with navigation items (up to 5) */\n columns?: FooterColumn[];\n /** Newsletter signup */\n newsletter?: React.ReactNode;\n /** Social media links */\n social?: React.ReactNode;\n /** Legal navigation items */\n legal?: NavigationItem[];\n /** Current path for active states */\n currentPath?: string;\n /** Navigation handler */\n onNavigate?: (href: string, item: NavigationItem) => void;\n /** Copyright text */\n copyright?: React.ReactNode;\n}\n\n/**\n * Advanced Footer - Multi-column layout with organized sections\n */\n/**\n * Advanced Footer - Multi-column layout with organized sections\n * Two-level grid: Brand (30%) + Menu Container (70%) with intelligent 0-4 columns\n */\nconst FooterAdvanced = forwardRef<HTMLDivElement, FooterAdvancedProps>(({\n className,\n brand,\n columns = [],\n newsletter,\n social,\n legal = [],\n currentPath = '',\n onNavigate,\n copyright,\n ...props\n}, ref) => {\n const { tone } = useContext(FooterContext);\n\n // Handle navigation click\n const handleItemClick = (item: NavigationItem) => {\n if (item.href && onNavigate) {\n onNavigate(item.href, item);\n } else if (item.onClick) {\n item.onClick();\n }\n };\n\n // Get tone-specific styles\n const getTextStyles = () => {\n switch (tone) {\n case 'subtle':\n return {\n heading: 'text-foreground',\n text: 'text-muted-foreground',\n link: 'text-muted-foreground hover:text-foreground'\n };\n case 'brand':\n return {\n heading: 'text-primary-foreground',\n text: 'text-primary-foreground/70',\n link: 'text-primary-foreground/70 hover:text-primary-foreground'\n };\n case 'contrast':\n return {\n heading: 'text-zinc-100',\n text: 'text-zinc-300',\n link: 'text-zinc-300 hover:text-zinc-100'\n };\n default:\n return {\n heading: 'text-foreground',\n text: 'text-muted-foreground',\n link: 'text-muted-foreground hover:text-foreground'\n };\n }\n };\n\n const styles = getTextStyles();\n\n return (\n <div \n ref={ref}\n className={cn('space-y-8', className)}\n {...props}\n >\n {/* LEVEL 1: Brand (30%) + Menu Container (70%) Grid */}\n <div className=\"grid gap-8 grid-cols-1 md:grid-cols-6 lg:grid-cols-6\">\n \n {/* Brand Section - 30% width on md+ */}\n {brand && (\n <div className=\"col-span-2\"> {brand}</div>\n )}\n\n {/* Menu Container - 70% width on md+ */}\n <div className=\"col-span-4\">\n {/* LEVEL 2: Intelligent Menu Columns Grid (0-4 columns) */}\n {columns.length > 0 && (\n <div className={cn(\n \"grid gap-6\",\n // No columns: hidden\n columns.length === 0 && \"hidden\",\n // 1 column: single column\n columns.length === 1 && \"grid-cols-1\",\n // 2 columns: responsive 1→2\n columns.length === 2 && \"grid-cols-2 sm:grid-cols-2 md:grid-cols-3\",\n // 3 columns: responsive 1→2→3\n columns.length === 3 && \"grid-cols-2 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-3\",\n // 4+ columns: responsive 1→2→4\n columns.length >= 4 && \"grid-cols-2 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4\"\n )}>\n {columns.slice(0, 4).map((column) => (\n <div key={column.key} className=\"space-y-3\">\n <h4 className={cn('text-sm font-semibold', styles.heading)}>\n {column.title}\n </h4>\n <ul className=\"space-y-2\">\n {column.items?.map((item) => {\n const isActive = item.href ? currentPath === item.href : item.isActive;\n \n return (\n <li key={item.key}>\n <button\n onClick={() => handleItemClick(item)}\n className={cn(\n 'text-sm transition-colors cursor-pointer block',\n isActive ? styles.heading : styles.link,\n item.className\n )}\n >\n {item.label}\n </button>\n </li>\n );\n })}\n </ul>\n </div>\n ))}\n </div>\n )}\n </div>\n \n\n \n </div>\n\n {/* Bottom Section - Legal + Copyright + Social */}\n <div className=\"space-y-4\">\n <Separator className={cn(\n tone === 'brand' && 'bg-primary-foreground/20',\n tone === 'contrast' && 'bg-zinc-700'\n )} />\n \n <div className=\"flex flex-col sm:flex-row items-center justify-between gap-4\">\n {/* Copyright */}\n {copyright && (\n <p className={cn('text-sm', styles.text)}>\n {copyright}\n </p>\n )}\n\n {/* Legal Links */}\n {legal.length > 0 && (\n <div className=\"flex items-center gap-4\">\n {legal.map((item) => {\n const isActive = item.href ? currentPath === item.href : item.isActive;\n \n return (\n <button\n key={item.key}\n onClick={() => handleItemClick(item)}\n className={cn(\n 'text-sm transition-colors cursor-pointer',\n isActive ? styles.heading : styles.link,\n item.className\n )}\n >\n {item.label}\n </button>\n );\n })}\n </div>\n )}\n\n {/* Social Links */}\n {social && (\n <div className=\"flex items-center gap-2\">\n {social}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n});\n\nFooterAdvanced.displayName = 'FooterAdvanced';\n\n/**\n * Social link interface\n */\nexport interface SocialLink {\n /** Unique key */\n key: string;\n /** Accessibility label */\n label: string;\n /** Icon component */\n icon: React.ComponentType<{ className?: string }>;\n /** Click handler */\n onClick: () => void;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Footer Social props\n */\nexport interface FooterSocialProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Social media links */\n links?: SocialLink[];\n}\n\n/**\n * Footer Social component\n */\nconst FooterSocial = forwardRef<HTMLDivElement, FooterSocialProps>(({\n className,\n links = [],\n ...props\n}, ref) => {\n const { tone } = useContext(FooterContext);\n\n const getButtonStyles = () => {\n switch (tone) {\n case 'subtle':\n return 'text-muted-foreground hover:text-foreground hover:bg-background/50';\n case 'brand':\n return 'text-primary-foreground/70 hover:text-primary-foreground hover:bg-primary-foreground/10';\n case 'contrast':\n return 'text-zinc-300 hover:text-zinc-100 hover:bg-zinc-800/50';\n default:\n return 'text-muted-foreground hover:text-foreground hover:bg-muted';\n }\n };\n\n return (\n <div \n ref={ref}\n className={cn('flex items-center gap-1', className)}\n {...props}\n >\n {links.map((link) => (\n <Button\n key={link.key}\n variant=\"ghost\"\n size=\"icon\"\n className={cn('h-8 w-8 cursor-pointer', getButtonStyles(), link.className)}\n onClick={link.onClick}\n title={link.label}\n >\n <link.icon className=\"h-4 w-4\" />\n </Button>\n ))}\n </div>\n );\n});\n\nFooterSocial.displayName = 'FooterSocial';\n\n/**\n * Footer with compound components\n */\nconst Footer = Object.assign(FooterComponent, {\n Basic: FooterBasic,\n Advanced: FooterAdvanced,\n Social: FooterSocial,\n});\n\n/**\n * Export Footer with compound components and individual components\n */\nexport { \n Footer,\n FooterBasic,\n FooterAdvanced,\n FooterSocial\n};"],"names":["FooterContext","createContext","footerVariants","cva","containerVariants","FooterComponent","forwardRef","className","tone","size","position","navigation","currentPath","onNavigate","children","props","ref","jsx","cn","jsxs","FooterBasic","logo","social","copyright","useContext","handleItemClick","item","getLinkStyles","isActive","baseStyles","Fragment","Separator","FooterAdvanced","brand","columns","newsletter","legal","styles","column","FooterSocial","links","getButtonStyles","link","Button","Footer"],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { jsxs as c, jsx as s } from "react/jsx-runtime";
|
|
2
|
+
import * as r from "react";
|
|
3
|
+
import { c as m } from "./utils-CwJPJKOE.js";
|
|
4
|
+
import { Input as b } from "./input.js";
|
|
5
|
+
import { E as N, a as g } from "./eye-DDKoW0KS.js";
|
|
6
|
+
function j({
|
|
7
|
+
label: u,
|
|
8
|
+
helper: i,
|
|
9
|
+
error: e,
|
|
10
|
+
required: a,
|
|
11
|
+
id: d,
|
|
12
|
+
className: t,
|
|
13
|
+
labelClassName: n,
|
|
14
|
+
children: l
|
|
15
|
+
}) {
|
|
16
|
+
const h = r.useId(), o = d ?? h, f = i ? o + "-helper" : void 0, p = e ? o + "-error" : void 0, x = [f, p].filter(Boolean).join(" ") || void 0, v = r.cloneElement(l, {
|
|
17
|
+
id: o,
|
|
18
|
+
"aria-invalid": e ? !0 : void 0,
|
|
19
|
+
"aria-describedby": x
|
|
20
|
+
});
|
|
21
|
+
return /* @__PURE__ */ c("div", { className: m("flex flex-col gap-1.5", t), children: [
|
|
22
|
+
/* @__PURE__ */ c(
|
|
23
|
+
"label",
|
|
24
|
+
{
|
|
25
|
+
htmlFor: o,
|
|
26
|
+
className: m("text-sm font-medium leading-none text-foreground", n),
|
|
27
|
+
children: [
|
|
28
|
+
u,
|
|
29
|
+
a && /* @__PURE__ */ s("span", { className: "ml-0.5 text-destructive", "aria-hidden": "true", children: "*" })
|
|
30
|
+
]
|
|
31
|
+
}
|
|
32
|
+
),
|
|
33
|
+
v,
|
|
34
|
+
i && !e && /* @__PURE__ */ s("p", { id: f, className: "text-xs text-muted-foreground", children: i }),
|
|
35
|
+
e && /* @__PURE__ */ s("p", { id: p, role: "alert", className: "text-xs font-medium text-destructive", children: e })
|
|
36
|
+
] });
|
|
37
|
+
}
|
|
38
|
+
const F = r.forwardRef(
|
|
39
|
+
function({ className: i, toggleLabel: e = { show: "Show password", hide: "Hide password" }, ...a }, d) {
|
|
40
|
+
const [t, n] = r.useState(!1);
|
|
41
|
+
return /* @__PURE__ */ c("div", { className: "relative", children: [
|
|
42
|
+
/* @__PURE__ */ s(
|
|
43
|
+
b,
|
|
44
|
+
{
|
|
45
|
+
ref: d,
|
|
46
|
+
type: t ? "text" : "password",
|
|
47
|
+
className: m("pr-10", i),
|
|
48
|
+
...a
|
|
49
|
+
}
|
|
50
|
+
),
|
|
51
|
+
/* @__PURE__ */ s(
|
|
52
|
+
"button",
|
|
53
|
+
{
|
|
54
|
+
type: "button",
|
|
55
|
+
onClick: () => n((l) => !l),
|
|
56
|
+
"aria-label": t ? e.hide : e.show,
|
|
57
|
+
"aria-pressed": t,
|
|
58
|
+
className: "absolute right-2 top-1/2 -translate-y-1/2 rounded p-1 text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
59
|
+
children: t ? /* @__PURE__ */ s(N, { className: "size-4" }) : /* @__PURE__ */ s(g, { className: "size-4" })
|
|
60
|
+
}
|
|
61
|
+
)
|
|
62
|
+
] });
|
|
63
|
+
}
|
|
64
|
+
);
|
|
65
|
+
export {
|
|
66
|
+
j as FormField,
|
|
67
|
+
F as PasswordInput
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=form-field.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-field.js","sources":["../src/components/ui/form-field.tsx"],"sourcesContent":["/**\n * <FormField> — the canonical label/input/error/helper wrapper.\n *\n * Handles the boring parts every form needs and gets wrong half the time:\n *\n * • generates a stable id and wires `htmlFor` / `aria-describedby` / `aria-invalid`\n * • renders the error message in a `role=\"alert\"` region\n * • supports a \"required\" indicator\n * • clones the child input and merges the wired props automatically\n *\n * @example\n * <FormField label=\"Email\" required error={errors.email} helper=\"We'll never share it\">\n * <Input type=\"email\" value={email} onChange={(e) => setEmail(e.target.value)} />\n * </FormField>\n *\n * Designed to compose cleanly with the existing react-hook-form `<Form />`\n * primitives in this package — pass `<Input {...register('email')} />` as the\n * child and FormField will wire ARIA correctly without you doing a thing.\n */\n\nimport * as React from 'react';\nimport { Eye, EyeOff } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { Input } from '@/components/ui/input';\n\nexport interface FormFieldProps {\n /** Required label text. */\n label: string;\n /** Optional helper / description rendered below the input. */\n helper?: React.ReactNode;\n /** Error message. When present the input is marked aria-invalid. */\n error?: React.ReactNode;\n /** Mark the field as required (shows a red asterisk after the label). */\n required?: boolean;\n /** Pre-generated id. Defaults to React.useId(). */\n id?: string;\n /** Optional class on the wrapper. */\n className?: string;\n /** Optional class on the label. */\n labelClassName?: string;\n /** The actual input. Cloned with `id`, `aria-*` props merged in. */\n children: React.ReactElement<{\n id?: string;\n 'aria-invalid'?: boolean;\n 'aria-describedby'?: string;\n }>;\n}\n\nexport function FormField({\n label,\n helper,\n error,\n required,\n id: idProp,\n className,\n labelClassName,\n children,\n}: FormFieldProps): React.JSX.Element {\n const generatedId = React.useId();\n const id = idProp ?? generatedId;\n const helperId = helper ? id + '-helper' : undefined;\n const errorId = error ? id + '-error' : undefined;\n const describedBy = [helperId, errorId].filter(Boolean).join(' ') || undefined;\n\n const child = React.cloneElement(children, {\n id,\n 'aria-invalid': error ? true : undefined,\n 'aria-describedby': describedBy,\n });\n\n return (\n <div className={cn('flex flex-col gap-1.5', className)}>\n <label\n htmlFor={id}\n className={cn('text-sm font-medium leading-none text-foreground', labelClassName)}\n >\n {label}\n {required && (\n <span className=\"ml-0.5 text-destructive\" aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n {child}\n {helper && !error && (\n <p id={helperId} className=\"text-xs text-muted-foreground\">\n {helper}\n </p>\n )}\n {error && (\n <p id={errorId} role=\"alert\" className=\"text-xs font-medium text-destructive\">\n {error}\n </p>\n )}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------------- */\n/* <PasswordInput> */\n/* ------------------------------------------------------------------------- */\n\nexport interface PasswordInputProps\n extends Omit<React.ComponentProps<typeof Input>, 'type'> {\n /** Optional accessible label for the show/hide button. */\n toggleLabel?: { show: string; hide: string };\n}\n\n/**\n * Password input with a built-in show/hide toggle. Forwards every other prop\n * (including refs, onChange, value) directly to the underlying <Input>.\n */\nexport const PasswordInput = React.forwardRef<HTMLInputElement, PasswordInputProps>(\n function PasswordInput(\n { className, toggleLabel = { show: 'Show password', hide: 'Hide password' }, ...rest },\n ref\n ) {\n const [visible, setVisible] = React.useState(false);\n return (\n <div className=\"relative\">\n <Input\n ref={ref}\n type={visible ? 'text' : 'password'}\n className={cn('pr-10', className)}\n {...rest}\n />\n <button\n type=\"button\"\n onClick={() => setVisible((v) => !v)}\n aria-label={visible ? toggleLabel.hide : toggleLabel.show}\n aria-pressed={visible}\n className=\"absolute right-2 top-1/2 -translate-y-1/2 rounded p-1 text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {visible ? <EyeOff className=\"size-4\" /> : <Eye className=\"size-4\" />}\n </button>\n </div>\n );\n }\n);\n"],"names":["FormField","label","helper","error","required","idProp","className","labelClassName","children","generatedId","React","id","helperId","errorId","describedBy","child","cn","jsxs","jsx","PasswordInput","toggleLabel","rest","ref","visible","setVisible","Input","v","EyeOff","Eye"],"mappings":";;;;;AAgDO,SAASA,EAAU;AAAA,EACxB,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,IAAIC;AAAA,EACJ,WAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,UAAAC;AACF,GAAsC;AACpC,QAAMC,IAAcC,EAAM,MAAA,GACpBC,IAAKN,KAAUI,GACfG,IAAWV,IAASS,IAAK,YAAY,QACrCE,IAAUV,IAAQQ,IAAK,WAAW,QAClCG,IAAc,CAACF,GAAUC,CAAO,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK,QAE/DE,IAAQL,EAAM,aAAaF,GAAU;AAAA,IACzC,IAAAG;AAAA,IACA,gBAAgBR,IAAQ,KAAO;AAAA,IAC/B,oBAAoBW;AAAA,EAAA,CACrB;AAED,2BACG,OAAA,EAAI,WAAWE,EAAG,yBAAyBV,CAAS,GACnD,UAAA;AAAA,IAAA,gBAAAW;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAASN;AAAA,QACT,WAAWK,EAAG,oDAAoDT,CAAc;AAAA,QAE/E,UAAA;AAAA,UAAAN;AAAA,UACAG,KACC,gBAAAc,EAAC,QAAA,EAAK,WAAU,2BAA0B,eAAY,QAAO,UAAA,IAAA,CAE7D;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAGHH;AAAA,IACAb,KAAU,CAACC,KACV,gBAAAe,EAAC,OAAE,IAAIN,GAAU,WAAU,iCACxB,UAAAV,EAAA,CACH;AAAA,IAEDC,uBACE,KAAA,EAAE,IAAIU,GAAS,MAAK,SAAQ,WAAU,wCACpC,UAAAV,EAAA,CACH;AAAA,EAAA,GAEJ;AAEJ;AAgBO,MAAMgB,IAAgBT,EAAM;AAAA,EACjC,SACE,EAAE,WAAAJ,GAAW,aAAAc,IAAc,EAAE,MAAM,iBAAiB,MAAM,gBAAA,GAAmB,GAAGC,EAAA,GAChFC,GACA;AACA,UAAM,CAACC,GAASC,CAAU,IAAId,EAAM,SAAS,EAAK;AAClD,WACE,gBAAAO,EAAC,OAAA,EAAI,WAAU,YACb,UAAA;AAAA,MAAA,gBAAAC;AAAA,QAACO;AAAA,QAAA;AAAA,UACC,KAAAH;AAAA,UACA,MAAMC,IAAU,SAAS;AAAA,UACzB,WAAWP,EAAG,SAASV,CAAS;AAAA,UAC/B,GAAGe;AAAA,QAAA;AAAA,MAAA;AAAA,MAEN,gBAAAH;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,MAAMM,EAAW,CAACE,MAAM,CAACA,CAAC;AAAA,UACnC,cAAYH,IAAUH,EAAY,OAAOA,EAAY;AAAA,UACrD,gBAAcG;AAAA,UACd,WAAU;AAAA,UAET,UAAAA,sBAAWI,GAAA,EAAO,WAAU,UAAS,IAAK,gBAAAT,EAACU,GAAA,EAAI,WAAU,SAAA,CAAS;AAAA,QAAA;AAAA,MAAA;AAAA,IACrE,GACF;AAAA,EAEJ;AACF;"}
|