@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,359 @@
|
|
|
1
|
+
# UIKit Theme Guide
|
|
2
|
+
|
|
3
|
+
**Transform your UIKit applications with beautiful, brand-consistent themes that work seamlessly across all components and layouts.**
|
|
4
|
+
|
|
5
|
+
## 🎨 Understanding UIKit Theming
|
|
6
|
+
|
|
7
|
+
UIKit is built on **ShadCN components** and **Tailwind CSS v4**, enhanced with a powerful semantic color system that automatically adapts to your brand. Instead of hardcoded colors like `bg-white` or `text-black`, UIKit uses semantic classes like `bg-background`, `text-foreground`, and `border-border` that intelligently change based on your selected theme.
|
|
8
|
+
|
|
9
|
+
**How it works:**
|
|
10
|
+
- **Semantic colors** automatically map to your theme's values
|
|
11
|
+
- **29 color variables** control the entire design system (backgrounds, text, borders, charts, sidebar)
|
|
12
|
+
- **Light/dark modes** are handled automatically with proper contrast ratios
|
|
13
|
+
- **All components** inherit your theme without any code changes
|
|
14
|
+
|
|
15
|
+
**The result:** Change one theme file, transform your entire application instantly.
|
|
16
|
+
|
|
17
|
+
## 🎯 How Semantic Colors Work
|
|
18
|
+
|
|
19
|
+
### Primary Color Impact
|
|
20
|
+
When you set `primary: '#3B82F6'` (blue) in your theme, it automatically affects these classes across your entire application:
|
|
21
|
+
|
|
22
|
+
```jsx
|
|
23
|
+
// Button components
|
|
24
|
+
<Button className="bg-primary text-primary-foreground"> // Blue button with white text
|
|
25
|
+
<Button variant="outline" className="border-primary text-primary"> // Blue outline with blue text
|
|
26
|
+
|
|
27
|
+
// Form elements
|
|
28
|
+
<Input className="focus:ring-primary" /> // Blue focus ring
|
|
29
|
+
<Checkbox className="data-[state=checked]:bg-primary" /> // Blue when checked
|
|
30
|
+
|
|
31
|
+
// Links and accents
|
|
32
|
+
<a className="text-primary hover:text-primary/80">Link</a> // Blue link
|
|
33
|
+
<Badge className="bg-primary text-primary-foreground">New</Badge> // Blue badge
|
|
34
|
+
|
|
35
|
+
// Charts and data visualization
|
|
36
|
+
<BarChart colors={['var(--primary)']} /> // Blue charts
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Core Color Relationships
|
|
40
|
+
|
|
41
|
+
**Background Colors Hierarchy:**
|
|
42
|
+
```jsx
|
|
43
|
+
// Page structure
|
|
44
|
+
<div className="bg-background"> // Main page (white/dark)
|
|
45
|
+
<Card className="bg-card"> // Elevated content (white/slightly lighter)
|
|
46
|
+
<div className="bg-muted"> // Subtle sections (light gray/darker)
|
|
47
|
+
<div className="bg-accent"> // Interactive areas (very light/subtle)
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**Text Color Hierarchy:**
|
|
51
|
+
```jsx
|
|
52
|
+
<h1 className="text-foreground"> // Primary headings (dark/light)
|
|
53
|
+
<p className="text-muted-foreground"> // Secondary text (gray)
|
|
54
|
+
<span className="text-primary"> // Brand/link text (your brand color)
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**Border System:**
|
|
58
|
+
```jsx
|
|
59
|
+
<div className="border-border"> // Standard borders (light gray)
|
|
60
|
+
<input className="border-input"> // Form borders (same as border)
|
|
61
|
+
<div className="ring-ring"> // Focus rings (usually primary color)
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## 🎨 Color Selection Guide
|
|
65
|
+
|
|
66
|
+
### ✅ **Good Color Choices**
|
|
67
|
+
|
|
68
|
+
**Primary Color (Your Brand):**
|
|
69
|
+
- Use your actual brand color
|
|
70
|
+
- Ensure good contrast with white text
|
|
71
|
+
- Test in both light and dark modes
|
|
72
|
+
```javascript
|
|
73
|
+
// Good examples
|
|
74
|
+
primary: '#1E40AF', // Professional blue
|
|
75
|
+
primary: '#059669', // Trust green
|
|
76
|
+
primary: '#7C3AED', // Creative purple
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**Background Colors:**
|
|
80
|
+
- Light mode: Pure white or very light grays
|
|
81
|
+
- Dark mode: True darks, avoid pure black
|
|
82
|
+
```javascript
|
|
83
|
+
// Light mode
|
|
84
|
+
background: '#FFFFFF', // Pure white
|
|
85
|
+
card: '#FFFFFF', // Same as background for clean look
|
|
86
|
+
muted: '#F8FAFC', // Very light gray for subtle sections
|
|
87
|
+
|
|
88
|
+
// Dark mode
|
|
89
|
+
background: '#0F172A', // Dark blue-gray (not pure black)
|
|
90
|
+
card: '#1E293B', // Slightly lighter than background
|
|
91
|
+
muted: '#334155', // Lighter gray for contrast
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### ❌ **Avoid These Mistakes**
|
|
95
|
+
|
|
96
|
+
**Don't use low-contrast colors:**
|
|
97
|
+
```javascript
|
|
98
|
+
// ❌ Bad - poor readability
|
|
99
|
+
primary: '#FFEB3B', // Yellow on white background
|
|
100
|
+
foreground: '#9CA3AF', // Light gray text on white
|
|
101
|
+
|
|
102
|
+
// ✅ Good - high contrast
|
|
103
|
+
primary: '#1D4ED8', // Dark blue
|
|
104
|
+
foreground: '#1F2937', // Dark gray/black
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**Don't ignore dark mode:**
|
|
108
|
+
```javascript
|
|
109
|
+
// ❌ Bad - same colors for both modes
|
|
110
|
+
light: { primary: '#1E40AF' },
|
|
111
|
+
dark: { primary: '#1E40AF' }, // Too dark for dark backgrounds
|
|
112
|
+
|
|
113
|
+
// ✅ Good - adjusted for dark mode
|
|
114
|
+
light: { primary: '#1E40AF' },
|
|
115
|
+
dark: { primary: '#60A5FA' }, // Lighter version for dark mode
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
**Don't use pure black/white in dark mode:**
|
|
119
|
+
```javascript
|
|
120
|
+
// ❌ Bad - harsh contrast
|
|
121
|
+
dark: {
|
|
122
|
+
background: '#000000', // Pure black is too harsh
|
|
123
|
+
foreground: '#FFFFFF' // Pure white is too bright
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// ✅ Good - softer contrast
|
|
127
|
+
dark: {
|
|
128
|
+
background: '#0F172A', // Dark blue-gray
|
|
129
|
+
foreground: '#F8FAFC' // Off-white
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## 🚀 Why Custom Themes?
|
|
134
|
+
|
|
135
|
+
Go beyond UIKit's 5 built-in themes and create professional design systems that:
|
|
136
|
+
|
|
137
|
+
- **Match your brand identity** - Use your exact brand colors and design tokens
|
|
138
|
+
- **Work everywhere** - Automatic application across all 40+ components and 5 layouts
|
|
139
|
+
- **Support both modes** - One theme definition, light/dark modes handled automatically
|
|
140
|
+
- **Maintain accessibility** - Built-in contrast and readability optimization
|
|
141
|
+
- **Scale seamlessly** - From simple apps to enterprise applications
|
|
142
|
+
|
|
143
|
+
**Best part?** You can create and deploy a complete custom theme in under 5 minutes.
|
|
144
|
+
|
|
145
|
+
## 🚀 Quick Start (Recommended)
|
|
146
|
+
|
|
147
|
+
### Step 1: Generate Your Theme
|
|
148
|
+
```bash
|
|
149
|
+
# Create a new custom theme automatically
|
|
150
|
+
npx uikit generate theme brand
|
|
151
|
+
|
|
152
|
+
# This automatically:
|
|
153
|
+
# ✅ Creates theme file with all required colors
|
|
154
|
+
# ✅ Updates your main.tsx with the new theme
|
|
155
|
+
# ✅ Adds proper imports and configuration
|
|
156
|
+
# ✅ Works with SPA, Multi, and FBCA projects
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### Step 2: Customize Your Colors
|
|
160
|
+
Edit the generated theme file to match your brand:
|
|
161
|
+
|
|
162
|
+
```javascript
|
|
163
|
+
// src/themes/presets/theme-brand.js (or src/web/themes/presets/ for FBCA)
|
|
164
|
+
const themeBrand = {
|
|
165
|
+
id: 'brand',
|
|
166
|
+
name: 'Brand Theme',
|
|
167
|
+
|
|
168
|
+
light: {
|
|
169
|
+
// Main brand color - change this to your brand color
|
|
170
|
+
primary: '#3B82F6', // Your brand blue
|
|
171
|
+
primaryForeground: '#FFFFFF',
|
|
172
|
+
|
|
173
|
+
// Backgrounds
|
|
174
|
+
background: '#FFFFFF', // Page background
|
|
175
|
+
card: '#FFFFFF', // Card backgrounds
|
|
176
|
+
|
|
177
|
+
// Text colors
|
|
178
|
+
foreground: '#1F2937', // Main text
|
|
179
|
+
mutedForeground: '#6B7280', // Secondary text
|
|
180
|
+
|
|
181
|
+
// Other colors (can keep as-is initially)
|
|
182
|
+
secondary: '#F3F4F6',
|
|
183
|
+
secondaryForeground: '#374151',
|
|
184
|
+
accent: '#F3F4F6',
|
|
185
|
+
accentForeground: '#374151',
|
|
186
|
+
destructive: '#EF4444',
|
|
187
|
+
destructiveForeground: '#FFFFFF',
|
|
188
|
+
border: '#E5E7EB',
|
|
189
|
+
input: '#E5E7EB',
|
|
190
|
+
ring: '#3B82F6',
|
|
191
|
+
|
|
192
|
+
// ... more colors (see complete reference below)
|
|
193
|
+
},
|
|
194
|
+
|
|
195
|
+
dark: {
|
|
196
|
+
// Dark mode versions of above colors
|
|
197
|
+
primary: '#60A5FA', // Lighter version for dark mode
|
|
198
|
+
primaryForeground: '#1E293B',
|
|
199
|
+
background: '#0F172A',
|
|
200
|
+
foreground: '#F8FAFC',
|
|
201
|
+
// ... complete dark palette
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
export default themeBrand;
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### Step 3: Bundle and Use
|
|
209
|
+
```bash
|
|
210
|
+
# Generate CSS from your theme
|
|
211
|
+
npx uikit bundle
|
|
212
|
+
|
|
213
|
+
# Your theme is now ready to use!
|
|
214
|
+
# It's already configured in your main.tsx
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
## 🔧 Development Workflow
|
|
220
|
+
|
|
221
|
+
### Watch Mode for Live Updates
|
|
222
|
+
```bash
|
|
223
|
+
# Start theme development with live reload
|
|
224
|
+
npx uikit bundle --watch
|
|
225
|
+
|
|
226
|
+
# In another terminal, start your app
|
|
227
|
+
npm run dev
|
|
228
|
+
|
|
229
|
+
# Now edit your theme file and see changes instantly!
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### Testing Your Theme
|
|
233
|
+
1. **Switch between light/dark modes** - Ensure both look good
|
|
234
|
+
2. **Test different layouts** - AdminLayout, PageLayout, AuthLayout
|
|
235
|
+
3. **Check form components** - Buttons, inputs, alerts
|
|
236
|
+
4. **Verify accessibility** - Good contrast ratios
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## 📋 Complete Color Reference
|
|
241
|
+
|
|
242
|
+
### Core Colors (Required)
|
|
243
|
+
```javascript
|
|
244
|
+
light: {
|
|
245
|
+
// Backgrounds
|
|
246
|
+
background: '#FFFFFF', // Main page background
|
|
247
|
+
foreground: '#1F2937', // Primary text
|
|
248
|
+
card: '#FFFFFF', // Card backgrounds
|
|
249
|
+
cardForeground: '#1F2937', // Text on cards
|
|
250
|
+
popover: '#FFFFFF', // Dropdown backgrounds
|
|
251
|
+
popoverForeground: '#1F2937', // Text in dropdowns
|
|
252
|
+
|
|
253
|
+
// Brand & Actions
|
|
254
|
+
primary: '#3B82F6', // Your brand color
|
|
255
|
+
primaryForeground: '#FFFFFF', // Text on brand elements
|
|
256
|
+
secondary: '#F3F4F6', // Secondary buttons
|
|
257
|
+
secondaryForeground: '#374151', // Text on secondary elements
|
|
258
|
+
destructive: '#EF4444', // Error/danger actions
|
|
259
|
+
destructiveForeground: '#FFFFFF', // Text on error elements
|
|
260
|
+
|
|
261
|
+
// Supporting Colors
|
|
262
|
+
muted: '#F9FAFB', // Subtle backgrounds
|
|
263
|
+
mutedForeground: '#6B7280', // Secondary text
|
|
264
|
+
accent: '#F3F4F6', // Accent elements
|
|
265
|
+
accentForeground: '#374151', // Text on accents
|
|
266
|
+
|
|
267
|
+
// Borders & Focus
|
|
268
|
+
border: '#E5E7EB', // Standard borders
|
|
269
|
+
input: '#E5E7EB', // Input borders
|
|
270
|
+
ring: '#3B82F6', // Focus rings
|
|
271
|
+
|
|
272
|
+
// Chart Colors (for data visualization)
|
|
273
|
+
chart1: '#3B82F6', // Primary data
|
|
274
|
+
chart2: '#10B981', // Secondary data
|
|
275
|
+
chart3: '#F59E0B', // Tertiary data
|
|
276
|
+
chart4: '#EF4444', // Warning data
|
|
277
|
+
chart5: '#8B5CF6', // Additional data
|
|
278
|
+
|
|
279
|
+
// Sidebar Colors (for AdminLayout)
|
|
280
|
+
sidebar: '#F8FAFC',
|
|
281
|
+
sidebarForeground: '#334155',
|
|
282
|
+
sidebarPrimary: '#3B82F6',
|
|
283
|
+
sidebarPrimaryForeground: '#FFFFFF',
|
|
284
|
+
sidebarAccent: '#F1F5F9',
|
|
285
|
+
sidebarAccentForeground: '#334155',
|
|
286
|
+
sidebarBorder: '#E2E8F0',
|
|
287
|
+
sidebarRing: '#3B82F6',
|
|
288
|
+
}
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
### Dark Mode Colors
|
|
292
|
+
```javascript
|
|
293
|
+
dark: {
|
|
294
|
+
// Invert backgrounds, adjust brand colors for dark mode
|
|
295
|
+
background: '#0F172A',
|
|
296
|
+
foreground: '#F8FAFC',
|
|
297
|
+
primary: '#60A5FA', // Lighter version of brand color
|
|
298
|
+
// ... all other colors adjusted for dark mode
|
|
299
|
+
}
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
---
|
|
303
|
+
|
|
304
|
+
## 💡 Quick Tips
|
|
305
|
+
|
|
306
|
+
### Color Selection
|
|
307
|
+
- **Start simple**: Focus on primary, background, and foreground colors first
|
|
308
|
+
- **Brand first**: Use your existing brand colors as the foundation
|
|
309
|
+
- **Test contrast**: Ensure text is readable (use tools like [contrast-ratio.com](https://contrast-ratio.com))
|
|
310
|
+
- **Dark mode**: Make colors lighter/softer for dark backgrounds
|
|
311
|
+
|
|
312
|
+
### Common Patterns
|
|
313
|
+
```javascript
|
|
314
|
+
// Corporate/Professional
|
|
315
|
+
primary: '#1E40AF', // Professional blue
|
|
316
|
+
secondary: '#F1F5F9', // Light gray
|
|
317
|
+
|
|
318
|
+
// Creative/Modern
|
|
319
|
+
primary: '#8B5CF6', // Purple
|
|
320
|
+
accent: '#F59E0B', // Orange
|
|
321
|
+
|
|
322
|
+
// E-commerce
|
|
323
|
+
primary: '#059669', // Trust green
|
|
324
|
+
destructive: '#DC2626', // Clear red
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
### Project Structure
|
|
328
|
+
- **SPA/Multi projects**: `src/themes/presets/theme-{name}.js`
|
|
329
|
+
- **FBCA projects**: `src/web/themes/presets/theme-{name}.js`
|
|
330
|
+
- **CSS output**: Auto-generated in `globals.css`
|
|
331
|
+
|
|
332
|
+
---
|
|
333
|
+
|
|
334
|
+
## 🛠️ CLI Commands
|
|
335
|
+
|
|
336
|
+
```bash
|
|
337
|
+
# Theme Management
|
|
338
|
+
npx uikit generate theme <name> # Create new theme
|
|
339
|
+
npx uikit bundle # Generate CSS
|
|
340
|
+
npx uikit bundle --watch # Development mode
|
|
341
|
+
|
|
342
|
+
# Example Workflow
|
|
343
|
+
npx uikit generate theme brand # 1. Generate
|
|
344
|
+
npx uikit bundle --watch # 2. Start development
|
|
345
|
+
# Edit theme file # 3. Customize colors
|
|
346
|
+
# See changes live in browser # 4. Iterate
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
---
|
|
350
|
+
|
|
351
|
+
## 🎯 Next Steps
|
|
352
|
+
|
|
353
|
+
1. **Generate your theme**: `npx uikit generate theme brand`
|
|
354
|
+
2. **Customize primary color**: Edit the `primary` value to match your brand
|
|
355
|
+
3. **Test in both modes**: Switch between light and dark mode
|
|
356
|
+
4. **Refine gradually**: Adjust other colors as needed
|
|
357
|
+
5. **Share and iterate**: Get feedback and refine your theme
|
|
358
|
+
|
|
359
|
+
**Happy theming!** ✨
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
|
+
<title>UIKit Multi-Page Template</title>
|
|
8
|
+
|
|
9
|
+
<!-- SEO Optimizations -->
|
|
10
|
+
<meta name="description" content="Professional React UI components with beautiful themes and OKLCH color science. Built with @bloomneo/uikit.">
|
|
11
|
+
<meta name="keywords" content="react, ui components, themes, design system, tailwind css, typescript">
|
|
12
|
+
<meta name="author" content="@bloomneo/uikit">
|
|
13
|
+
|
|
14
|
+
<!-- Open Graph -->
|
|
15
|
+
<meta property="og:type" content="website">
|
|
16
|
+
<meta property="og:title" content="UIKit Multi-Page App">
|
|
17
|
+
<meta property="og:description" content="Professional React UI components with beautiful themes">
|
|
18
|
+
<meta property="og:site_name" content="@bloomneo/uikit">
|
|
19
|
+
|
|
20
|
+
<!-- Twitter Cards -->
|
|
21
|
+
<meta name="twitter:card" content="summary_large_image">
|
|
22
|
+
<meta name="twitter:title" content="UIKit Multi-Page App">
|
|
23
|
+
<meta name="twitter:description" content="Professional React UI components with beautiful themes">
|
|
24
|
+
|
|
25
|
+
<!-- Performance -->
|
|
26
|
+
<meta name="robots" content="index,follow">
|
|
27
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
28
|
+
<link rel="dns-prefetch" href="https://fonts.gstatic.com">
|
|
29
|
+
|
|
30
|
+
<!-- Theme color -->
|
|
31
|
+
<meta name="theme-color" content="#3B82F6">
|
|
32
|
+
</head>
|
|
33
|
+
<body>
|
|
34
|
+
<div id="root"></div>
|
|
35
|
+
<script type="module" src="/src/main.tsx"></script>
|
|
36
|
+
|
|
37
|
+
<!-- Structured Data -->
|
|
38
|
+
<script type="application/ld+json">
|
|
39
|
+
{
|
|
40
|
+
"@context": "https://schema.org",
|
|
41
|
+
"@type": "WebApplication",
|
|
42
|
+
"name": "UIKit Multi-Page App",
|
|
43
|
+
"description": "Professional React UI components with beautiful themes",
|
|
44
|
+
"applicationCategory": "DesignApplication",
|
|
45
|
+
"operatingSystem": "Web",
|
|
46
|
+
"offers": {
|
|
47
|
+
"@type": "Offer",
|
|
48
|
+
"price": "0",
|
|
49
|
+
"priceCurrency": "USD"
|
|
50
|
+
},
|
|
51
|
+
"author": {
|
|
52
|
+
"@type": "Organization",
|
|
53
|
+
"name": "@bloomneo/uikit"
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
</script>
|
|
57
|
+
</body>
|
|
58
|
+
</html>
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "{{PROJECT_NAME}}",
|
|
3
|
+
"private": true,
|
|
4
|
+
"version": "0.0.0",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"dev": "vite",
|
|
8
|
+
"build": "tsc && vite build",
|
|
9
|
+
"preview": "vite preview",
|
|
10
|
+
"bundle": "npx uikit bundle",
|
|
11
|
+
"serve": "npx uikit serve",
|
|
12
|
+
"deploy": "npx uikit deploy",
|
|
13
|
+
"deploy:gh": "npm run build && gh-pages -d dist",
|
|
14
|
+
"prerender": "npx uikit prerender",
|
|
15
|
+
"optimize": "npx uikit optimize"
|
|
16
|
+
},
|
|
17
|
+
"dependencies": {
|
|
18
|
+
"@tailwindcss/vite": "^4.1.13",
|
|
19
|
+
"@bloomneo/uikit": "latest",
|
|
20
|
+
"react": "^19.1.0",
|
|
21
|
+
"react-dom": "^19.1.0",
|
|
22
|
+
"react-router-dom": "^7.0.0",
|
|
23
|
+
"lucide-react": "latest"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@types/node": "^24.0.0",
|
|
27
|
+
"@types/react": "^19.1.0",
|
|
28
|
+
"@types/react-dom": "^19.1.0",
|
|
29
|
+
"@vitejs/plugin-react": "^4.2.1",
|
|
30
|
+
"typescript": "^5.8.0",
|
|
31
|
+
"vite": "^7.0.0",
|
|
32
|
+
"tailwindcss": "^4.1.8",
|
|
33
|
+
"gh-pages": "^6.3.0"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<rect width="32" height="32" rx="8" fill="url(#bluePurpleGradient)"/>
|
|
3
|
+
<text x="16" y="20" font-family="Inter, system-ui, sans-serif" font-size="12" font-weight="900" text-anchor="middle" fill="white" letter-spacing="1px">ui</text>
|
|
4
|
+
<defs>
|
|
5
|
+
<linearGradient id="bluePurpleGradient" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
6
|
+
<stop offset="0%" style="stop-color:#3B82F6;stop-opacity:1" />
|
|
7
|
+
<stop offset="100%" style="stop-color:#8B5CF6;stop-opacity:1" />
|
|
8
|
+
</linearGradient>
|
|
9
|
+
</defs>
|
|
10
|
+
</svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="800.117" height="533.577" viewBox="0 0 800.117 533.577" xmlns:xlink="http://www.w3.org/1999/xlink" role="img" artist="Katerina Limpitsouni" source="https://undraw.co/"><g transform="translate(-561.1 -255.53)"><path d="M227.085,491.32a20.667,20.667,0,0,1-25.842-6.955c-.56-.819.685-1.728,1.246-.908a19.137,19.137,0,0,0,24.052,6.421c.895-.428,1.434,1.017.544,1.443Z" transform="translate(359.999 46.668)" fill="#fff"/><path d="M213.126,445.381a11.7,11.7,0,0,0,8.27-7.4c.334-.936,1.737-.294,1.4.635a13.109,13.109,0,0,1-9.131,8.212.8.8,0,0,1-.993-.449A.775.775,0,0,1,213.126,445.381Z" transform="translate(359.099 50.233)" fill="#fff"/><path d="M789.88,705.353H429.157A24.746,24.746,0,0,0,404.44,730.07a24.468,24.468,0,0,0,1.783,9.195,24.719,24.719,0,0,0,22.934,15.53H789.88a24.719,24.719,0,0,0,21.332-12.244,23.863,23.863,0,0,0,1.611-3.287,24.468,24.468,0,0,0,1.783-9.195,24.753,24.753,0,0,0-24.725-24.717Z" transform="translate(344.106 29.299)" fill="#ccc"/><rect width="52.545" height="61.763" transform="translate(928.822 509.469)" fill="#ed9da0"/><path d="M421.339,358.755h5.493A10.071,10.071,0,0,1,436.9,368.826H411.268a10.071,10.071,0,0,1,10.071-10.071Z" transform="translate(525.879 110.849)" fill="#ccc"/><circle cx="56.737" cy="56.737" r="56.737" transform="translate(898.509 413.264)" fill="#ed9da0"/><path d="M559.362,356.041c.429-6.516,4.738-13.183,18.427-16.667,0,0,23.494-30.042,55.419-14.288,0,0,15.477-2.663,26.954,13.4,0,0,11.379-6.711,16.179,5.184,0,0,13.345,24.263,8.432,49.012s-7.428,27.837-7.428,27.837,6.262-51.192-29.808-47.642-65.11-9.135-73.279,18.638c-6.783,23.061-5.928,35.038-5.928,35.038s-22.682-23.006-14.97-41.121C557.306,376.162,558.7,366.089,559.362,356.041Z" transform="translate(332.592 59.378)" fill="#090814"/><path d="M461.292,735.055H775.121c-2.1-23.939-3.468-115.447-3.468-121.469,0-26.564-21.736-55.552-21.736-55.552l-7.78-4.3-64.973-20.271L660.349,511.62a18.7,18.7,0,0,0-14.975-7.312l-53.115.4a18.754,18.754,0,0,0-12.6,4.992l-32.891,30.512L498.53,563.247l-.082-.082-.5.375-7.159,5.156-4.6,3.328S474.1,586.518,464.444,629.99C462.991,636.529,461.972,721.17,461.292,735.055Z" transform="translate(339.663 45.013)" fill="#38bdf8"/><path d="M840.492,742.14c-.756.69-1.52,1.372-2.284,2.054q-4.339,3.858-8.8,7.584-6.742,5.62-13.764,10.9H393.169q-12.9-9.688-24.857-20.543Z" transform="translate(346.93 26.424)" fill="#ccc"/><path d="M501.606,687.088H346.3l3.286-15.612h148.73Z" transform="translate(530.957 86.407)" fill="#090814"/><path d="M860.165,674.4H819.753a6.242,6.242,0,0,0-4.791,2.219,9.059,9.059,0,0,0-1.709-.164,9.585,9.585,0,1,0,0,19.17,9.476,9.476,0,0,0,4.173-.969l.675,8.282,2.679,32.737a5.976,5.976,0,0,0,.509,1.175,6.3,6.3,0,0,0,5.53,3.287H853.1a6.323,6.323,0,0,0,5.538-3.287,6.479,6.479,0,0,0,.5-1.175l7.067-53.1a6.319,6.319,0,0,0-6.04-8.176Zm-46.911,18.489a6.849,6.849,0,0,1,0-13.7c.123,0,.238.033.362.041a6.275,6.275,0,0,0,.1,3.344l2.892,9.4a6.737,6.737,0,0,1-3.353.912Z" transform="translate(312.902 31.719)" fill="#090814"/><path d="M743.547,485.931H487.732a8.3,8.3,0,0,0-8.291,8.291V666.846a8.3,8.3,0,0,0,8.291,8.291H743.547a8.3,8.3,0,0,0,8.291-8.291V494.222a8.3,8.3,0,0,0-8.291-8.291Z" transform="translate(338.244 46.449)" fill="#3f3d56"/><path d="M653.095,635.977H593.25a3.193,3.193,0,0,0-3.188,3.2v94.538h66.23V639.173a3.195,3.195,0,0,0-3.2-3.2Zm-29.721,53.715a7.1,7.1,0,0,1-7.067-7.067v-10.9a7.067,7.067,0,0,1,14.133,0v10.9a7.1,7.1,0,0,1-7.067,7.067Z" transform="translate(329.598 34.722)" fill="#090814"/><path d="M589.839,738.717v9.121a1.787,1.787,0,0,0,1.783,1.783H654.7a1.792,1.792,0,0,0,1.783-1.783v-9.121Z" transform="translate(329.615 26.691)" fill="#3f3d56"/><circle cx="4.039" cy="4.039" r="4.039" transform="translate(1072.313 703.414)" fill="#2f2e41"/><path d="M523.347,669.493a1.413,1.413,0,0,0-1.413,1.413v7.272a1.413,1.413,0,1,0,2.827,0v-7.272a1.413,1.413,0,0,0-1.413-1.413Z" transform="translate(334.923 32.102)" fill="#2f2e41"/><path d="M531.672,669.493a1.413,1.413,0,0,0-1.413,1.413v7.272a1.413,1.413,0,1,0,2.827,0v-7.272a1.413,1.413,0,0,0-1.413-1.413Z" transform="translate(334.272 32.102)" fill="#2f2e41"/><path d="M540,669.493a1.413,1.413,0,0,0-1.413,1.413v7.272a1.413,1.413,0,1,0,2.827,0v-7.272A1.413,1.413,0,0,0,540,669.493Z" transform="translate(333.622 32.102)" fill="#2f2e41"/><path d="M548.323,669.493a1.413,1.413,0,0,0-1.413,1.413v7.272a1.413,1.413,0,1,0,2.827,0v-7.272a1.413,1.413,0,0,0-1.413-1.413Z" transform="translate(332.971 32.102)" fill="#2f2e41"/><circle cx="21.364" cy="21.364" r="21.364" transform="translate(866.053 726.657)" fill="#ed9da0"/><circle cx="21.364" cy="21.364" r="21.364" transform="translate(1015.307 730.766)" fill="#ed9da0"/><path d="M951.482,443.834c-2.111-3.492-4.613-7.22-8.531-8.36-4.537-1.32-9.2,1.3-13.151,3.891a383.216,383.216,0,0,0-34.1,25.128l.012.136c8.483-.585,15.524,21.972,24.007,21.387,6.129-.423,13.912-24.045,19.328-26.945,2.055-1.1,4.059-2.57,6.388-2.672,2.894-.127,5.417,1.894,7.4,4.005,11.729,12.49,15.123,31.589,28.281,42.562a417.584,417.584,0,0,0-29.629-59.131Z" transform="translate(367.473 -1.438)" fill="#38bdf8"/><path d="M971.668,473.478q9.281,16.763,19.688,32.86v.008c-.041.378-.1.756-.156,1.134q-1.257-1.923-2.49-3.862-9.343-14.655-17.757-29.869-3.994-7.235-7.79-14.585-2.934-5.694-5.744-11.455c-.534-1.1-1.052-2.2-1.569-3.311-1.216-2.6-2.416-5.21-3.7-7.773-1.463-2.925-3.246-5.982-5.933-7.946A8.094,8.094,0,0,0,942,427.052a11.772,11.772,0,0,0-6.105,1.75,196.482,196.482,0,0,0-38.645,26.648A201.367,201.367,0,0,0,865.865,490.3c-.279.394-.937.016-.657-.386,1.109-1.561,2.227-3.1,3.377-4.626a202.328,202.328,0,0,1,51.645-48.169q5.017-3.254,10.23-6.2c1.75-.994,3.509-1.972,5.3-2.892a12.923,12.923,0,0,1,5.62-1.742c6.82-.107,10.354,7.617,12.778,12.811q1.134,2.453,2.309,4.9,4.425,9.244,9.195,18.341Q968.6,467.936,971.668,473.478Z" transform="translate(369.861 -0.747)" fill="#3f3d56"/><path d="M894.057,452.725c-.4-.442-.79-.883-1.189-1.325-3.144-3.477-6.518-6.914-10.836-8.908a15.72,15.72,0,0,0-6.586-1.527,18.8,18.8,0,0,0-6.839,1.491c-1.03.411-2.036.878-3.028,1.375-1.133.57-2.246,1.178-3.354,1.792q-3.119,1.726-6.157,3.6-6.045,3.736-11.712,8.043-2.937,2.233-5.754,4.613-2.619,2.211-5.133,4.54c-.358.331-.893-.2-.535-.535.442-.411.888-.82,1.335-1.224q1.893-1.711,3.846-3.356,3.562-3.006,7.308-5.779,5.826-4.315,12.052-8.045,3.112-1.862,6.309-3.568c.644-.343,1.295-.679,1.953-1a31.142,31.142,0,0,1,4.643-1.89,16.518,16.518,0,0,1,7.013-.689,18.259,18.259,0,0,1,6.47,2.238c4.24,2.37,7.528,6.034,10.728,9.61C894.915,452.551,894.383,453.089,894.057,452.725Z" transform="translate(372.387 -1.837)" fill="#3f3d56"/><path d="M865.193,469.927a4.882,4.882,0,0,1-3.028-.867c-2.346-1.777-2.285-6.047.188-13.052a14.734,14.734,0,0,1,7.976-8.572,13.653,13.653,0,0,1,11-.065q.455.2.9.424h0a32.385,32.385,0,0,1,5.623,3.989,37.148,37.148,0,0,0,4.683,3.459l.551.323-.522.368C879.245,465.3,870.221,469.927,865.193,469.927Z" transform="translate(370.227 -2.308)" fill="#38bdf8"/><path d="M918.264,410.146a18.9,18.9,0,0,1-18.541-15.236,18.9,18.9,0,1,0,22.292,14.862A18.983,18.983,0,0,1,918.264,410.146Z" transform="translate(368.342 1.705)" fill="#3f3d56"/><circle cx="28.203" cy="28.203" r="28.203" transform="translate(688.196 356.857)" fill="#3f3d56" opacity="0.74"/><circle cx="28.203" cy="28.203" r="28.203" transform="translate(716.399 356.857)" fill="#ff6584" opacity="0.74"/><circle cx="28.203" cy="28.203" r="28.203" transform="translate(702.536 334.379)" fill="#38bdf8" opacity="0.74"/><rect width="75.934" height="1.643" transform="translate(732.045 377.26) rotate(-17.441)" fill="#3f3d56"/><path d="M835.379,229.333h-.468a9.408,9.408,0,0,1,4.2.993h-2.131a8.67,8.67,0,0,0-8.66,8.66v22.943a8.67,8.67,0,0,0,8.66,8.66h1.358a9.418,9.418,0,0,1-3.426.65h.468a9.493,9.493,0,0,0,9.482-9.482V238.815a9.493,9.493,0,0,0-9.482-9.482Z" transform="translate(355.707 47.972)" fill="#ff6584"/><path d="M835.379,229.333h-.468a9.408,9.408,0,0,1,4.2.993h-2.131a8.67,8.67,0,0,0-8.66,8.66v22.943a8.67,8.67,0,0,0,8.66,8.66h1.358a9.418,9.418,0,0,1-3.426.65h.468a9.493,9.493,0,0,0,9.482-9.482V238.815a9.493,9.493,0,0,0-9.482-9.482Z" transform="translate(355.707 47.972)" opacity="0.21"/><path d="M834.887,270.667a8.67,8.67,0,0,1-8.66-8.66V239.064a8.67,8.67,0,0,1,8.66-8.66h2.131a9.409,9.409,0,0,0-4.2-.993H809.877a9.493,9.493,0,0,0-9.482,9.482v22.943a9.493,9.493,0,0,0,9.482,9.482H832.82a9.418,9.418,0,0,0,3.426-.65Z" transform="translate(357.89 47.966)" fill="#38bdf8"/><path d="M834.887,270.667a8.67,8.67,0,0,1-8.66-8.66V239.064a8.67,8.67,0,0,1,8.66-8.66h2.131a9.409,9.409,0,0,0-4.2-.993H809.877a9.493,9.493,0,0,0-9.482,9.482v22.943a9.493,9.493,0,0,0,9.482,9.482H832.82a9.418,9.418,0,0,0,3.426-.65Z" transform="translate(357.89 47.966)" fill="#ff6584"/><circle cx="3.287" cy="3.287" r="3.287" transform="translate(801.662 351.735)" fill="#3f3d56"/><path d="M968.052,541.114c4.815,3.394,9.441,6.853,14.733,9.466-.1.4-.205.813-.3,1.216-.649-.3-1.282-.625-1.915-.953-5.366-2.81-9.984-6.631-15.021-9.951a32.41,32.41,0,0,0-8.1-4.059,26.73,26.73,0,0,0-9.261-1.085c-13.041.641-24.216,8.423-36.336,12.342-5.933,1.923-12.244,2.95-18.431,1.742s-11.685-4.495-17.149-7.469c-5.39-2.942-11.266-5.9-17.56-5.9-5.127.008-10.518,2.062-13.262,6.6a.615.615,0,0,1-1.06-.624,12.93,12.93,0,0,1,2.243-2.8c3.583-3.394,8.85-4.733,13.69-4.339,6.261.509,11.972,3.468,17.387,6.442,5.744,3.155,11.627,6.549,18.267,7.239,6.557.69,13.049-1.027,19.129-3.336,11.775-4.478,23.394-11.939,36.492-11.11C957.772,534.927,963.064,537.605,968.052,541.114Z" transform="translate(371.489 -25.367)" fill="#3f3d56"/><path d="M415.88,283.625v1.668a8.652,8.652,0,0,0-1.676-.164h-8.6v18.456a10.31,10.31,0,0,1-10.3,10.3H382.6v2.843a8.611,8.611,0,0,0,.666,3.32h-1.758a10.121,10.121,0,0,1-.551-3.32v-2.843h-6.985v-1.643h6.985V293.79a10.31,10.31,0,0,1,10.3-10.3h12.7V280.61h1.643v2.876h8.6a10.259,10.259,0,0,1,1.676.14Z" transform="translate(484.274 -14.808)" fill="#38bdf8"/><path d="M394.294,269.467H371.352a10.31,10.31,0,0,0-10.3,10.3v22.942a10.31,10.31,0,0,0,10.3,10.3h22.942a10.31,10.31,0,0,0,10.3-10.3V279.739A10.309,10.309,0,0,0,394.294,269.467Zm8.661,33.246a8.672,8.672,0,0,1-8.661,8.661H371.352a8.672,8.672,0,0,1-8.661-8.661V279.772a8.673,8.673,0,0,1,8.661-8.661h22.942a8.671,8.671,0,0,1,8.661,8.628Z" transform="translate(485.284 -13.938)" fill="#3f3d56"/><path d="M381.55,312.489v1.643h1.643v-1.643Zm0,0v1.643h1.643v-1.643Zm34.923-28.62a10.263,10.263,0,0,0-1.676-.14H391.854a10.31,10.31,0,0,0-10.3,10.3v22.942a10.12,10.12,0,0,0,.551,3.32,10.308,10.308,0,0,0,9.754,6.985H414.8a10.31,10.31,0,0,0,10.3-10.3V294.034A10.3,10.3,0,0,0,416.472,283.869Zm6.985,33.107a8.672,8.672,0,0,1-8.661,8.661H391.854a8.673,8.673,0,0,1-8.661-8.661V294.034a8.672,8.672,0,0,1,8.661-8.661H414.8a8.664,8.664,0,0,1,8.661,8.661Zm-41.907-4.487v1.643h1.643v-1.643Z" transform="translate(483.682 -15.052)" fill="#3f3d56"/><path d="M337.958,547.3h-80.4a2.116,2.116,0,0,0-2.115,2.108v4.766a285.287,285.287,0,0,0,9.619,29.969h72.893a2.106,2.106,0,0,0,2.108-2.108V549.41A2.11,2.11,0,0,0,337.958,547.3Z" transform="translate(350.622 -79.698)" fill="#38bdf8"/><path d="M334.679,609.663H273.737c.725,1.7,1.464,3.389,2.23,5.07h58.711C337.987,614.781,337.953,609.616,334.679,609.663Z" transform="translate(346.241 -94.634)" fill="#e4e4e4"/><path d="M336.344,624.941H280.69q1.22,2.552,2.508,5.071h53.146C339.652,630.059,339.618,624.9,336.344,624.941Z" transform="translate(344.576 -98.294)" fill="#e4e4e4"/><path d="M338.212,640.229H288.489c.908,1.7,1.844,3.389,2.793,5.07h46.93C341.52,645.346,341.486,640.181,338.212,640.229Z" transform="translate(342.708 -101.956)" fill="#e4e4e4"/><path d="M901.341,229.333h-.468a9.409,9.409,0,0,1,4.2.993H902.94a8.67,8.67,0,0,0-8.661,8.66v22.943a8.67,8.67,0,0,0,8.66,8.66H904.3a9.417,9.417,0,0,1-3.426.65h.468a9.493,9.493,0,0,0,9.482-9.482V238.815a9.493,9.493,0,0,0-9.482-9.482Z" transform="translate(228.938 47.972)" fill="#3f3d56"/><path d="M901.341,229.333h-.468a9.409,9.409,0,0,1,4.2.993H902.94a8.67,8.67,0,0,0-8.661,8.66v22.943a8.67,8.67,0,0,0,8.66,8.66H904.3a9.417,9.417,0,0,1-3.426.65h.468a9.493,9.493,0,0,0,9.482-9.482V238.815a9.493,9.493,0,0,0-9.482-9.482Z" transform="translate(228.938 47.972)" opacity="0.21"/><path d="M835.379,229.333h-.468a9.408,9.408,0,0,1,4.2.993h-2.131a8.67,8.67,0,0,0-8.66,8.66v22.943a8.67,8.67,0,0,0,8.66,8.66h1.358a9.418,9.418,0,0,1-3.426.65h.468a9.493,9.493,0,0,0,9.482-9.482V238.815a9.493,9.493,0,0,0-9.482-9.482Z" transform="translate(234.094 47.972)" fill="#38bdf8"/><path d="M835.379,229.333h-.468a9.408,9.408,0,0,1,4.2.993h-2.131a8.67,8.67,0,0,0-8.66,8.66v22.943a8.67,8.67,0,0,0,8.66,8.66h1.358a9.418,9.418,0,0,1-3.426.65h.468a9.493,9.493,0,0,0,9.482-9.482V238.815a9.493,9.493,0,0,0-9.482-9.482Z" transform="translate(234.094 47.972)" opacity="0.21"/><path d="M834.887,270.667a8.67,8.67,0,0,1-8.66-8.66V239.064a8.67,8.67,0,0,1,8.66-8.66h2.131a9.409,9.409,0,0,0-4.2-.993H809.877a9.493,9.493,0,0,0-9.482,9.482v22.943a9.493,9.493,0,0,0,9.482,9.482H832.82a9.418,9.418,0,0,0,3.426-.65Z" transform="translate(236.277 47.966)" fill="#38bdf8"/><path d="M900.849,270.667a8.67,8.67,0,0,1-8.661-8.66V239.064a8.67,8.67,0,0,1,8.661-8.66h2.131a9.408,9.408,0,0,0-4.2-.993H875.839a9.493,9.493,0,0,0-9.482,9.482v22.943a9.493,9.493,0,0,0,9.482,9.482h22.943a9.418,9.418,0,0,0,3.426-.65Z" transform="translate(231.121 47.966)" fill="#3f3d56"/><path d="M899.6,286.038,891.565,274l-5.875-8.8a3.269,3.269,0,0,0-5.842.846L877.374,274l-4.98,15.982a3.275,3.275,0,0,0,4.848,3.755l1.767-1.093a2.453,2.453,0,0,1,3.731,1.865l1.619,17.667a3.28,3.28,0,0,0,3.254,2.975c.1,0,.2-.008.3-.016l2.482-.222a3.268,3.268,0,0,0,2.958-3.558l-1.668-18.242a2.45,2.45,0,0,1,3.468-2.449l.362.164a3.27,3.27,0,0,0,4.084-4.791Z" transform="translate(230.66 45.283)" fill="#ccc"/><path d="M834.887,270.667a8.67,8.67,0,0,1-8.66-8.66V239.064a8.67,8.67,0,0,1,8.66-8.66h2.131a9.409,9.409,0,0,0-4.2-.993H809.877a9.493,9.493,0,0,0-9.482,9.482v22.943a9.493,9.493,0,0,0,9.482,9.482H832.82a9.418,9.418,0,0,0,3.426-.65Z" transform="translate(236.277 47.966)" fill="#38bdf8"/></g></svg>
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import React, { Suspense, useEffect } from 'react';
|
|
2
|
+
import { BrowserRouter as Router, useLocation } from 'react-router-dom';
|
|
3
|
+
import { PageLayout } from '@bloomneo/uikit/page';
|
|
4
|
+
import { Header, Footer } from './components';
|
|
5
|
+
import { AppRouter } from './router';
|
|
6
|
+
|
|
7
|
+
// Component to handle scroll to top on route change
|
|
8
|
+
const ScrollToTop: React.FC = () => {
|
|
9
|
+
const { pathname } = useLocation();
|
|
10
|
+
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
window.scrollTo(0, 0);
|
|
13
|
+
}, [pathname]);
|
|
14
|
+
|
|
15
|
+
return null;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
// Loading component
|
|
19
|
+
const LoadingSpinner: React.FC = () => (
|
|
20
|
+
<div className="flex items-center justify-center min-h-[400px]">
|
|
21
|
+
<div className="flex items-center gap-3 text-muted-foreground">
|
|
22
|
+
<div className="w-6 h-6 border-2 border-muted-foreground/30 border-t-muted-foreground rounded-full animate-spin" />
|
|
23
|
+
<span>Loading page...</span>
|
|
24
|
+
</div>
|
|
25
|
+
</div>
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
// Layout wrapper that chooses layout based on current route
|
|
29
|
+
const LayoutWrapper: React.FC = () => {
|
|
30
|
+
const location = useLocation();
|
|
31
|
+
|
|
32
|
+
if (location.pathname === '/login') {
|
|
33
|
+
// Login page handles its own AuthLayout
|
|
34
|
+
return (
|
|
35
|
+
<>
|
|
36
|
+
<ScrollToTop />
|
|
37
|
+
<Suspense fallback={<LoadingSpinner />}>
|
|
38
|
+
<AppRouter />
|
|
39
|
+
</Suspense>
|
|
40
|
+
</>
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
if (location.pathname === '/dashboard' || location.pathname.startsWith('/dashboard')) {
|
|
46
|
+
// Dashboard uses its own AdminLayout from the page component
|
|
47
|
+
return (
|
|
48
|
+
<>
|
|
49
|
+
<ScrollToTop />
|
|
50
|
+
<Suspense fallback={<LoadingSpinner />}>
|
|
51
|
+
<AppRouter />
|
|
52
|
+
</Suspense>
|
|
53
|
+
</>
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (location.pathname === '/error' || location.pathname.startsWith('/error')) {
|
|
58
|
+
// ErrorPage uses its own BlankLayout
|
|
59
|
+
return (
|
|
60
|
+
<>
|
|
61
|
+
<ScrollToTop />
|
|
62
|
+
<Suspense fallback={<LoadingSpinner />}>
|
|
63
|
+
<AppRouter />
|
|
64
|
+
</Suspense>
|
|
65
|
+
</>
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Default: PageLayout for all other pages
|
|
70
|
+
return (
|
|
71
|
+
<PageLayout scheme="default" tone="clean" size="xl">
|
|
72
|
+
<ScrollToTop />
|
|
73
|
+
<Header />
|
|
74
|
+
<PageLayout.Content>
|
|
75
|
+
<Suspense fallback={<LoadingSpinner />}>
|
|
76
|
+
<AppRouter />
|
|
77
|
+
</Suspense>
|
|
78
|
+
</PageLayout.Content>
|
|
79
|
+
<Footer />
|
|
80
|
+
</PageLayout>
|
|
81
|
+
);
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
function App() {
|
|
85
|
+
return (
|
|
86
|
+
<Router basename="/">
|
|
87
|
+
<LayoutWrapper />
|
|
88
|
+
</Router>
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export default App;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { useNavigate } from 'react-router-dom';
|
|
3
|
+
import { Footer as UIFooter } from '@bloomneo/uikit/footer';
|
|
4
|
+
import type { NavigationItem } from '@bloomneo/uikit';
|
|
5
|
+
|
|
6
|
+
// Footer navigation
|
|
7
|
+
const footerNavigation: NavigationItem[] = [
|
|
8
|
+
{ key: 'home', label: 'Home', href: '/' },
|
|
9
|
+
{ key: 'about', label: 'About', href: '/about' },
|
|
10
|
+
{ key: 'contact', label: 'Contact', href: '/contact' },
|
|
11
|
+
{ key: 'privacy', label: 'Privacy', href: '/privacy' },
|
|
12
|
+
{ key: 'terms', label: 'Terms', href: '/terms' },
|
|
13
|
+
];
|
|
14
|
+
|
|
15
|
+
// Configurable Footer Component using UIKit sections
|
|
16
|
+
export const Footer: React.FC = () => {
|
|
17
|
+
const navigate = useNavigate();
|
|
18
|
+
|
|
19
|
+
const handleNavigation = (href: string) => {
|
|
20
|
+
navigate(href);
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
return (
|
|
24
|
+
<UIFooter tone="subtle" size="xl">
|
|
25
|
+
<div className="flex flex-col space-y-6">
|
|
26
|
+
{/* Footer Navigation */}
|
|
27
|
+
<div className="flex flex-wrap justify-center gap-6">
|
|
28
|
+
{footerNavigation.map((item) => (
|
|
29
|
+
<button
|
|
30
|
+
key={item.key}
|
|
31
|
+
onClick={() => item.href && handleNavigation(item.href)}
|
|
32
|
+
className="text-sm text-muted-foreground hover:text-foreground transition-colors"
|
|
33
|
+
>
|
|
34
|
+
{item.label}
|
|
35
|
+
</button>
|
|
36
|
+
))}
|
|
37
|
+
</div>
|
|
38
|
+
|
|
39
|
+
{/* Branding Section */}
|
|
40
|
+
<div className="text-center space-y-4">
|
|
41
|
+
<div className="flex items-center justify-center gap-3">
|
|
42
|
+
<div className="w-6 h-6 bg-primary rounded flex items-center justify-center text-primary-foreground font-bold text-xs">
|
|
43
|
+
UI
|
|
44
|
+
</div>
|
|
45
|
+
<span className="font-semibold text-foreground">{{PROJECT_NAME}}</span>
|
|
46
|
+
</div>
|
|
47
|
+
|
|
48
|
+
{/* Copyright */}
|
|
49
|
+
<div className="border-t border-border pt-4">
|
|
50
|
+
<p className="text-sm text-muted-foreground">
|
|
51
|
+
© {{CURRENT_YEAR}} {{PROJECT_NAME}} Multi-Page Template • Built with React Router & Code Splitting
|
|
52
|
+
</p>
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|
|
55
|
+
</div>
|
|
56
|
+
</UIFooter>
|
|
57
|
+
);
|
|
58
|
+
};
|