@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,2055 @@
|
|
|
1
|
+
# @bloomneo/uikit - COMPLETE LLM Usage Guide v2.1
|
|
2
|
+
|
|
3
|
+
## 🎯 QUICK START (30 SECONDS)
|
|
4
|
+
|
|
5
|
+
### STEP 1: Required Setup (COPY-PASTE EVERY PROJECT)
|
|
6
|
+
```jsx
|
|
7
|
+
import { ThemeProvider } from '@bloomneo/uikit/theme-provider';
|
|
8
|
+
import '@bloomneo/uikit/styles'; // ← CRITICAL: Must import this
|
|
9
|
+
|
|
10
|
+
function App() {
|
|
11
|
+
return (
|
|
12
|
+
<ThemeProvider theme="base" mode="light">
|
|
13
|
+
{/* Your app goes here */}
|
|
14
|
+
</ThemeProvider>
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### STEP 2: Component Selection (FOLLOW THIS DECISION TREE)
|
|
20
|
+
```
|
|
21
|
+
What are you building?
|
|
22
|
+
├── Dashboard/Admin Panel → AdminLayout
|
|
23
|
+
├── Company Website → PageLayout
|
|
24
|
+
├── Login/Signup Page → AuthLayout
|
|
25
|
+
├── Error/About Page → BlankLayout
|
|
26
|
+
└── Chrome Extension/Popup → PopupLayout
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## 🏗️ FBCA PROJECT TEMPLATE (Feature-Based Architecture)
|
|
32
|
+
|
|
33
|
+
### When to Use FBCA
|
|
34
|
+
Use `--fbca` flag when building applications that need:
|
|
35
|
+
- **Feature isolation** - Each business feature is self-contained
|
|
36
|
+
- **Auto-discovery routing** - Routes generated from file structure
|
|
37
|
+
- **Scalable architecture** - Easy to add new features without touching existing code
|
|
38
|
+
- **Team collaboration** - Multiple developers can work on different features
|
|
39
|
+
|
|
40
|
+
### Quick FBCA Setup
|
|
41
|
+
```bash
|
|
42
|
+
npx uikit create myapp --fbca --theme elegant
|
|
43
|
+
cd myapp && npm run dev
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### FBCA File Structure
|
|
47
|
+
```
|
|
48
|
+
src/
|
|
49
|
+
├── features/
|
|
50
|
+
│ ├── auth/ # Authentication feature
|
|
51
|
+
│ │ └── pages/
|
|
52
|
+
│ │ ├── login.tsx # Route: /auth/login
|
|
53
|
+
│ │ └── register.tsx # Route: /auth/register
|
|
54
|
+
│ ├── dashboard/ # Dashboard feature
|
|
55
|
+
│ │ └── pages/
|
|
56
|
+
│ │ ├── index.tsx # Route: /dashboard
|
|
57
|
+
│ │ └── settings.tsx # Route: /dashboard/settings
|
|
58
|
+
│ └── main/ # Main feature (special case)
|
|
59
|
+
│ └── pages/
|
|
60
|
+
│ └── index.tsx # Route: / (homepage)
|
|
61
|
+
├── shared/
|
|
62
|
+
│ ├── components/ # Reusable UI components
|
|
63
|
+
│ └── hooks/ # Custom React hooks (SEO, etc.)
|
|
64
|
+
└── lib/
|
|
65
|
+
└── page-router.tsx # Auto-discovery routing system
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### FBCA Routing Conventions
|
|
69
|
+
```jsx
|
|
70
|
+
// File-based routing patterns:
|
|
71
|
+
index.tsx → /feature (feature root)
|
|
72
|
+
[param].tsx → /feature/:param (dynamic routes)
|
|
73
|
+
nested/page.tsx → /feature/nested/page
|
|
74
|
+
main/pages/index.tsx → / (homepage - special case)
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### FBCA Features Included
|
|
78
|
+
- **Auto-discovery routing** with Vite glob imports
|
|
79
|
+
- **SEO management** with custom useSEO hook
|
|
80
|
+
- **Lazy loading** with React Suspense
|
|
81
|
+
- **Feature isolation** with clear boundaries
|
|
82
|
+
- **Shared components** for reusable UI
|
|
83
|
+
- **TypeScript support** with full type safety
|
|
84
|
+
|
|
85
|
+
### Example FBCA Usage
|
|
86
|
+
```jsx
|
|
87
|
+
// src/features/products/pages/[id].tsx
|
|
88
|
+
import { useSEO } from '@/shared/hooks/useSEO';
|
|
89
|
+
import { ProductCard } from '@/shared/components/ProductCard';
|
|
90
|
+
|
|
91
|
+
export default function ProductDetailsPage() {
|
|
92
|
+
const { id } = useParams(); // Auto-available from React Router
|
|
93
|
+
|
|
94
|
+
useSEO({
|
|
95
|
+
title: `Product ${id}`,
|
|
96
|
+
description: `Details for product ${id}`,
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
return (
|
|
100
|
+
<div>
|
|
101
|
+
<h1>Product {id}</h1>
|
|
102
|
+
<ProductCard productId={id} />
|
|
103
|
+
</div>
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## 📋 COMPONENT PATTERNS (ONLY 2 TYPES)
|
|
111
|
+
|
|
112
|
+
### 🏗️ COMPOUND LAYOUTS (Use Child Components)
|
|
113
|
+
**AdminLayout & PageLayout ONLY**
|
|
114
|
+
```jsx
|
|
115
|
+
// ✅ CORRECT - Use child components
|
|
116
|
+
<AdminLayout scheme="sidebar" tone="subtle">
|
|
117
|
+
<AdminLayout.Header title="Dashboard" position="sticky" />
|
|
118
|
+
<AdminLayout.Sidebar navigation={nav} />
|
|
119
|
+
<AdminLayout.Content>
|
|
120
|
+
<YourContent />
|
|
121
|
+
</AdminLayout.Content>
|
|
122
|
+
</AdminLayout>
|
|
123
|
+
|
|
124
|
+
// ❌ WRONG - Don't pass direct children
|
|
125
|
+
<AdminLayout>
|
|
126
|
+
<YourContent /> {/* This breaks */}
|
|
127
|
+
</AdminLayout>
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### 📄 SINGLE LAYOUTS (Direct Children)
|
|
131
|
+
**AuthLayout, BlankLayout, PopupLayout**
|
|
132
|
+
```jsx
|
|
133
|
+
// ✅ CORRECT - Pass content directly
|
|
134
|
+
<AuthLayout scheme="card" tone="clean">
|
|
135
|
+
<LoginForm />
|
|
136
|
+
</AuthLayout>
|
|
137
|
+
|
|
138
|
+
// ❌ WRONG - Don't use child components
|
|
139
|
+
<AuthLayout>
|
|
140
|
+
<AuthLayout.Content>Form</AuthLayout.Content> {/* No such thing */}
|
|
141
|
+
</AuthLayout>
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## 🎨 PROPS SYSTEM (3 CORE PROPS EVERYWHERE)
|
|
147
|
+
|
|
148
|
+
### Standard Props (Same for ALL components)
|
|
149
|
+
```jsx
|
|
150
|
+
<AnyLayout
|
|
151
|
+
scheme="specific-to-component" // Layout structure
|
|
152
|
+
tone="clean|subtle|brand|contrast" // Visual emphasis
|
|
153
|
+
size="sm|md|lg|xl|full" // Component size
|
|
154
|
+
>
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### Scheme Options by Component
|
|
158
|
+
```jsx
|
|
159
|
+
AdminLayout: scheme = 'sidebar|compact';
|
|
160
|
+
PageLayout: scheme = 'base|sidebar';
|
|
161
|
+
AuthLayout: scheme = 'simple|card|split|hero';
|
|
162
|
+
BlankLayout: scheme = 'simple|card';
|
|
163
|
+
PopupLayout: scheme = 'modal|drawer|floating';
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Size Configurations (Exact Measurements)
|
|
167
|
+
```jsx
|
|
168
|
+
size = 'sm'; // Sidebars: 192px, Content: max-w-2xl, Padding: 16px
|
|
169
|
+
size = 'md'; // Sidebars: 224px, Content: max-w-4xl, Padding: 20px
|
|
170
|
+
size = 'lg'; // Sidebars: 256px, Content: max-w-6xl, Padding: 24px (DEFAULT)
|
|
171
|
+
size = 'xl'; // Sidebars: 288px, Content: max-w-7xl, Padding: 28px
|
|
172
|
+
size = 'full'; // Sidebars: 320px, Content: max-w-full, Padding: 32px
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Tone Visual Guide
|
|
176
|
+
```jsx
|
|
177
|
+
tone = 'clean'; // Pure white/light backgrounds (websites, auth)
|
|
178
|
+
tone = 'subtle'; // Light gray backgrounds (admin panels, professional)
|
|
179
|
+
tone = 'brand'; // Primary colored backgrounds (headers, CTAs, emphasis)
|
|
180
|
+
tone = 'contrast'; // Dark/bold backgrounds (footers, high contrast areas)
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## 🧩 ALL UI COMPONENTS (37 TOTAL)
|
|
186
|
+
|
|
187
|
+
### Form & Input Components
|
|
188
|
+
```jsx
|
|
189
|
+
import { Button } from '@bloomneo/uikit/button';
|
|
190
|
+
import { Input } from '@bloomneo/uikit/input';
|
|
191
|
+
import { Textarea } from '@bloomneo/uikit/textarea';
|
|
192
|
+
import { Label } from '@bloomneo/uikit/label';
|
|
193
|
+
import { Checkbox } from '@bloomneo/uikit/checkbox';
|
|
194
|
+
import { RadioGroup, RadioGroupItem } from '@bloomneo/uikit/radio-group';
|
|
195
|
+
import { Switch } from '@bloomneo/uikit/switch';
|
|
196
|
+
import { Slider } from '@bloomneo/uikit/slider';
|
|
197
|
+
import {
|
|
198
|
+
Select,
|
|
199
|
+
SelectContent,
|
|
200
|
+
SelectItem,
|
|
201
|
+
SelectTrigger,
|
|
202
|
+
SelectValue,
|
|
203
|
+
} from '@bloomneo/uikit/select';
|
|
204
|
+
|
|
205
|
+
// NEW: Enhanced Form Components (Recommended for 90% of use cases)
|
|
206
|
+
import {
|
|
207
|
+
ValidatedInput,
|
|
208
|
+
ValidatedSelect,
|
|
209
|
+
ValidatedCheckbox,
|
|
210
|
+
FormActions,
|
|
211
|
+
} from '@bloomneo/uikit/form';
|
|
212
|
+
|
|
213
|
+
// Advanced React Hook Form Integration (10% of cases)
|
|
214
|
+
import {
|
|
215
|
+
Form,
|
|
216
|
+
FormField,
|
|
217
|
+
FormItem,
|
|
218
|
+
FormLabel,
|
|
219
|
+
FormControl,
|
|
220
|
+
FormMessage,
|
|
221
|
+
} from '@bloomneo/uikit/form';
|
|
222
|
+
|
|
223
|
+
// Usage Examples
|
|
224
|
+
<div className="space-y-4">
|
|
225
|
+
{/* Basic shadcn form components */}
|
|
226
|
+
<Label className="text-foreground">Email</Label>
|
|
227
|
+
<Input placeholder="Enter email" className="bg-background border-border" />
|
|
228
|
+
<Button className="bg-primary text-primary-foreground">Submit</Button>;
|
|
229
|
+
|
|
230
|
+
{/* NEW: Validated form components (recommended) */}
|
|
231
|
+
<ValidatedInput
|
|
232
|
+
type="email"
|
|
233
|
+
required
|
|
234
|
+
label="Email Address"
|
|
235
|
+
value={email}
|
|
236
|
+
onChange={setEmail}
|
|
237
|
+
showPasswordStrength // For password type
|
|
238
|
+
showPasswordToggle // For password type
|
|
239
|
+
/>
|
|
240
|
+
|
|
241
|
+
<ValidatedSelect
|
|
242
|
+
required
|
|
243
|
+
label="Country"
|
|
244
|
+
value={country}
|
|
245
|
+
onChange={setCountry}
|
|
246
|
+
options={[
|
|
247
|
+
{ label: 'United States', value: 'us' },
|
|
248
|
+
{ label: 'Canada', value: 'ca' },
|
|
249
|
+
]}
|
|
250
|
+
/>
|
|
251
|
+
|
|
252
|
+
<ValidatedCheckbox
|
|
253
|
+
required
|
|
254
|
+
label="I agree to terms"
|
|
255
|
+
description="Please read our terms and conditions"
|
|
256
|
+
checked={agreed}
|
|
257
|
+
onChange={setAgreed}
|
|
258
|
+
/>
|
|
259
|
+
|
|
260
|
+
<FormActions
|
|
261
|
+
submitText="Create Account"
|
|
262
|
+
showCancel
|
|
263
|
+
loading={isLoading}
|
|
264
|
+
onCancel={() => router.back()}
|
|
265
|
+
/>
|
|
266
|
+
</div>;
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
### Display & Layout Components
|
|
270
|
+
```jsx
|
|
271
|
+
import {
|
|
272
|
+
Card,
|
|
273
|
+
CardHeader,
|
|
274
|
+
CardTitle,
|
|
275
|
+
CardContent,
|
|
276
|
+
CardFooter,
|
|
277
|
+
} from '@bloomneo/uikit/card';
|
|
278
|
+
import { Badge } from '@bloomneo/uikit/badge';
|
|
279
|
+
import { Avatar, AvatarImage, AvatarFallback } from '@bloomneo/uikit/avatar';
|
|
280
|
+
import { Separator } from '@bloomneo/uikit/separator';
|
|
281
|
+
import { Progress } from '@bloomneo/uikit/progress';
|
|
282
|
+
import { Skeleton } from '@bloomneo/uikit/skeleton';
|
|
283
|
+
import { Alert, AlertTitle, AlertDescription } from '@bloomneo/uikit/alert';
|
|
284
|
+
import {
|
|
285
|
+
Breadcrumb,
|
|
286
|
+
BreadcrumbList,
|
|
287
|
+
BreadcrumbItem,
|
|
288
|
+
BreadcrumbLink,
|
|
289
|
+
} from '@bloomneo/uikit/breadcrumb';
|
|
290
|
+
import {
|
|
291
|
+
Tabs,
|
|
292
|
+
TabsList,
|
|
293
|
+
TabsTrigger,
|
|
294
|
+
TabsContent,
|
|
295
|
+
} from '@bloomneo/uikit/tabs';
|
|
296
|
+
import {
|
|
297
|
+
Accordion,
|
|
298
|
+
AccordionItem,
|
|
299
|
+
AccordionTrigger,
|
|
300
|
+
AccordionContent,
|
|
301
|
+
} from '@bloomneo/uikit/accordion';
|
|
302
|
+
|
|
303
|
+
// Usage
|
|
304
|
+
<Card className="bg-card border-border">
|
|
305
|
+
<CardHeader>
|
|
306
|
+
<CardTitle className="text-foreground">Title</CardTitle>
|
|
307
|
+
</CardHeader>
|
|
308
|
+
<CardContent className="text-muted-foreground">Content here</CardContent>
|
|
309
|
+
</Card>;
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
### Navigation & Menu Components
|
|
313
|
+
```jsx
|
|
314
|
+
import {
|
|
315
|
+
DropdownMenu,
|
|
316
|
+
DropdownMenuTrigger,
|
|
317
|
+
DropdownMenuContent,
|
|
318
|
+
DropdownMenuItem,
|
|
319
|
+
} from '@bloomneo/uikit/dropdown-menu';
|
|
320
|
+
import {
|
|
321
|
+
Menubar,
|
|
322
|
+
MenubarMenu,
|
|
323
|
+
MenubarTrigger,
|
|
324
|
+
MenubarContent,
|
|
325
|
+
MenubarItem,
|
|
326
|
+
} from '@bloomneo/uikit/menubar';
|
|
327
|
+
import {
|
|
328
|
+
Pagination,
|
|
329
|
+
PaginationContent,
|
|
330
|
+
PaginationItem,
|
|
331
|
+
PaginationLink,
|
|
332
|
+
} from '@bloomneo/uikit/pagination';
|
|
333
|
+
import {
|
|
334
|
+
Command,
|
|
335
|
+
CommandInput,
|
|
336
|
+
CommandList,
|
|
337
|
+
CommandItem,
|
|
338
|
+
} from '@bloomneo/uikit/command';
|
|
339
|
+
import {
|
|
340
|
+
Collapsible,
|
|
341
|
+
CollapsibleTrigger,
|
|
342
|
+
CollapsibleContent,
|
|
343
|
+
} from '@bloomneo/uikit/collapsible';
|
|
344
|
+
import { Toggle } from '@bloomneo/uikit/toggle';
|
|
345
|
+
|
|
346
|
+
// Usage
|
|
347
|
+
<DropdownMenu>
|
|
348
|
+
<DropdownMenuTrigger asChild>
|
|
349
|
+
<Button className="bg-background border-border">Open</Button>
|
|
350
|
+
</DropdownMenuTrigger>
|
|
351
|
+
<DropdownMenuContent className="bg-popover border-border">
|
|
352
|
+
<DropdownMenuItem className="text-foreground">Item 1</DropdownMenuItem>
|
|
353
|
+
</DropdownMenuContent>
|
|
354
|
+
</DropdownMenu>;
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
### Overlay & Modal Components
|
|
358
|
+
```jsx
|
|
359
|
+
import {
|
|
360
|
+
Dialog,
|
|
361
|
+
DialogTrigger,
|
|
362
|
+
DialogContent,
|
|
363
|
+
DialogHeader,
|
|
364
|
+
DialogTitle,
|
|
365
|
+
} from '@bloomneo/uikit/dialog';
|
|
366
|
+
import {
|
|
367
|
+
Sheet,
|
|
368
|
+
SheetTrigger,
|
|
369
|
+
SheetContent,
|
|
370
|
+
SheetHeader,
|
|
371
|
+
SheetTitle,
|
|
372
|
+
} from '@bloomneo/uikit/sheet';
|
|
373
|
+
import {
|
|
374
|
+
Popover,
|
|
375
|
+
PopoverTrigger,
|
|
376
|
+
PopoverContent,
|
|
377
|
+
} from '@bloomneo/uikit/popover';
|
|
378
|
+
import {
|
|
379
|
+
HoverCard,
|
|
380
|
+
HoverCardTrigger,
|
|
381
|
+
HoverCardContent,
|
|
382
|
+
} from '@bloomneo/uikit/hover-card';
|
|
383
|
+
import {
|
|
384
|
+
Tooltip,
|
|
385
|
+
TooltipProvider,
|
|
386
|
+
TooltipTrigger,
|
|
387
|
+
TooltipContent,
|
|
388
|
+
} from '@bloomneo/uikit/tooltip';
|
|
389
|
+
|
|
390
|
+
// Usage
|
|
391
|
+
<Dialog>
|
|
392
|
+
<DialogTrigger asChild>
|
|
393
|
+
<Button className="bg-primary text-primary-foreground">Open Dialog</Button>
|
|
394
|
+
</DialogTrigger>
|
|
395
|
+
<DialogContent className="bg-background border-border">
|
|
396
|
+
<DialogHeader>
|
|
397
|
+
<DialogTitle className="text-foreground">Dialog Title</DialogTitle>
|
|
398
|
+
</DialogHeader>
|
|
399
|
+
<p className="text-muted-foreground">Dialog content</p>
|
|
400
|
+
</DialogContent>
|
|
401
|
+
</Dialog>;
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
### Data & Table Components
|
|
405
|
+
```jsx
|
|
406
|
+
import {
|
|
407
|
+
Table,
|
|
408
|
+
TableHeader,
|
|
409
|
+
TableBody,
|
|
410
|
+
TableRow,
|
|
411
|
+
TableHead,
|
|
412
|
+
TableCell,
|
|
413
|
+
} from '@bloomneo/uikit/table';
|
|
414
|
+
import { DataTable } from '@bloomneo/uikit/data-table';
|
|
415
|
+
import { Calendar } from '@bloomneo/uikit/calendar';
|
|
416
|
+
import { Toaster } from '@bloomneo/uikit/sonner';
|
|
417
|
+
|
|
418
|
+
// Basic Table Usage
|
|
419
|
+
<Table className="bg-background">
|
|
420
|
+
<TableHeader>
|
|
421
|
+
<TableRow className="border-border">
|
|
422
|
+
<TableHead className="text-foreground">Name</TableHead>
|
|
423
|
+
</TableRow>
|
|
424
|
+
</TableHeader>
|
|
425
|
+
<TableBody>
|
|
426
|
+
<TableRow className="border-border">
|
|
427
|
+
<TableCell className="text-foreground">John</TableCell>
|
|
428
|
+
</TableRow>
|
|
429
|
+
</TableBody>
|
|
430
|
+
</Table>;
|
|
431
|
+
|
|
432
|
+
// Enhanced DataTable Usage
|
|
433
|
+
<DataTable
|
|
434
|
+
data={users}
|
|
435
|
+
columns={[
|
|
436
|
+
{
|
|
437
|
+
id: 'name',
|
|
438
|
+
header: 'Name',
|
|
439
|
+
accessorKey: 'name',
|
|
440
|
+
sortable: true,
|
|
441
|
+
filterable: true,
|
|
442
|
+
},
|
|
443
|
+
{
|
|
444
|
+
id: 'email',
|
|
445
|
+
header: 'Email',
|
|
446
|
+
accessorKey: 'email',
|
|
447
|
+
sortable: true,
|
|
448
|
+
filterable: true,
|
|
449
|
+
filterType: 'text',
|
|
450
|
+
},
|
|
451
|
+
{
|
|
452
|
+
id: 'status',
|
|
453
|
+
header: 'Status',
|
|
454
|
+
accessorKey: 'status',
|
|
455
|
+
cell: (value) => <Badge>{value}</Badge>,
|
|
456
|
+
filterable: true,
|
|
457
|
+
filterType: 'select',
|
|
458
|
+
filterOptions: [
|
|
459
|
+
{ label: 'Active', value: 'active' },
|
|
460
|
+
{ label: 'Inactive', value: 'inactive' },
|
|
461
|
+
],
|
|
462
|
+
},
|
|
463
|
+
]}
|
|
464
|
+
searchable
|
|
465
|
+
filterable
|
|
466
|
+
sortable
|
|
467
|
+
pagination
|
|
468
|
+
selectable
|
|
469
|
+
actions={[
|
|
470
|
+
{
|
|
471
|
+
id: 'edit',
|
|
472
|
+
label: 'Edit',
|
|
473
|
+
icon: Edit,
|
|
474
|
+
onClick: (row) => editUser(row),
|
|
475
|
+
},
|
|
476
|
+
{
|
|
477
|
+
id: 'delete',
|
|
478
|
+
label: 'Delete',
|
|
479
|
+
icon: Trash2,
|
|
480
|
+
onClick: (row) => deleteUser(row),
|
|
481
|
+
variant: 'destructive',
|
|
482
|
+
},
|
|
483
|
+
]}
|
|
484
|
+
/>;
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
### NEW: Motion & Animation Components
|
|
488
|
+
```jsx
|
|
489
|
+
import {
|
|
490
|
+
Motion,
|
|
491
|
+
LoadingSpinner,
|
|
492
|
+
Reveal,
|
|
493
|
+
Hover,
|
|
494
|
+
} from '@bloomneo/uikit/motion';
|
|
495
|
+
|
|
496
|
+
// Simple CSS-based animations
|
|
497
|
+
<Motion preset="fadeIn" duration="normal">
|
|
498
|
+
<Card>Fades in immediately</Card>
|
|
499
|
+
</Motion>
|
|
500
|
+
|
|
501
|
+
<Motion preset="slideInUp" duration="slow" delay={200}>
|
|
502
|
+
<div>Slides up after 200ms delay</div>
|
|
503
|
+
</Motion>
|
|
504
|
+
|
|
505
|
+
<Motion preset="scaleIn" trigger="hover">
|
|
506
|
+
<Button>Scales on hover</Button>
|
|
507
|
+
</Motion>
|
|
508
|
+
|
|
509
|
+
// Scroll-triggered animations
|
|
510
|
+
<Reveal preset="slideInUp" duration="normal">
|
|
511
|
+
<div>Animates when scrolled into view</div>
|
|
512
|
+
</Reveal>
|
|
513
|
+
|
|
514
|
+
// Hover effects
|
|
515
|
+
<Hover effect="scale">
|
|
516
|
+
<Card>Scales on hover</Card>
|
|
517
|
+
</Hover>
|
|
518
|
+
|
|
519
|
+
<Hover effect="lift">
|
|
520
|
+
<Button>Lifts on hover with shadow</Button>
|
|
521
|
+
</Hover>
|
|
522
|
+
|
|
523
|
+
// Loading spinner
|
|
524
|
+
<LoadingSpinner size="md" />
|
|
525
|
+
```
|
|
526
|
+
|
|
527
|
+
---
|
|
528
|
+
|
|
529
|
+
## 🧭 NAVIGATION SYSTEM (COMPLETE GUIDE)
|
|
530
|
+
|
|
531
|
+
### Basic Navigation Structure
|
|
532
|
+
```jsx
|
|
533
|
+
const navigation = [
|
|
534
|
+
{
|
|
535
|
+
key: 'unique-id', // REQUIRED: Unique identifier
|
|
536
|
+
label: 'Display Text', // REQUIRED: What users see
|
|
537
|
+
href: '/path', // For page navigation
|
|
538
|
+
onClick: () => {}, // For actions/functions
|
|
539
|
+
icon: HomeIcon, // Lucide React icon (optional)
|
|
540
|
+
badge: 'New', // Notification badge (optional)
|
|
541
|
+
isActive: true, // Current page indicator (optional)
|
|
542
|
+
className: 'custom-css', // Additional styling (optional)
|
|
543
|
+
},
|
|
544
|
+
];
|
|
545
|
+
```
|
|
546
|
+
|
|
547
|
+
### Advanced Navigation with Submenus
|
|
548
|
+
```jsx
|
|
549
|
+
const navigation = [
|
|
550
|
+
{
|
|
551
|
+
key: 'dashboard',
|
|
552
|
+
label: 'Dashboard',
|
|
553
|
+
href: '/admin',
|
|
554
|
+
icon: LayoutDashboard,
|
|
555
|
+
isActive: true,
|
|
556
|
+
},
|
|
557
|
+
{
|
|
558
|
+
key: 'analytics',
|
|
559
|
+
label: 'Analytics',
|
|
560
|
+
icon: BarChart3,
|
|
561
|
+
badge: '5',
|
|
562
|
+
items: [
|
|
563
|
+
// Submenu items (max 2 levels)
|
|
564
|
+
{
|
|
565
|
+
key: 'overview',
|
|
566
|
+
label: 'Overview',
|
|
567
|
+
href: '/admin/analytics/overview',
|
|
568
|
+
},
|
|
569
|
+
{
|
|
570
|
+
key: 'reports',
|
|
571
|
+
label: 'Reports',
|
|
572
|
+
href: '/admin/analytics/reports',
|
|
573
|
+
badge: 'New',
|
|
574
|
+
},
|
|
575
|
+
],
|
|
576
|
+
},
|
|
577
|
+
];
|
|
578
|
+
```
|
|
579
|
+
|
|
580
|
+
### Navigation Handler Function
|
|
581
|
+
```jsx
|
|
582
|
+
const handleNavigation = (href, item) => {
|
|
583
|
+
if (item.onClick) {
|
|
584
|
+
item.onClick(); // Execute custom function
|
|
585
|
+
} else if (href) {
|
|
586
|
+
// Handle routing based on your app
|
|
587
|
+
window.location.href = href; // Simple navigation
|
|
588
|
+
// navigate(href); // React Router
|
|
589
|
+
// router.push(href); // Next.js
|
|
590
|
+
}
|
|
591
|
+
};
|
|
592
|
+
```
|
|
593
|
+
|
|
594
|
+
---
|
|
595
|
+
|
|
596
|
+
## 📍 BREADCRUMBS SYSTEM
|
|
597
|
+
|
|
598
|
+
### AdminLayout.Header Breadcrumbs
|
|
599
|
+
```jsx
|
|
600
|
+
<AdminLayout.Header
|
|
601
|
+
title="User Management"
|
|
602
|
+
position="sticky"
|
|
603
|
+
breadcrumbs={[
|
|
604
|
+
{ label: 'Admin', href: '/admin' },
|
|
605
|
+
{ label: 'Users', href: '/admin/users' },
|
|
606
|
+
{ label: 'John Doe' }, // Current page - no href
|
|
607
|
+
]}
|
|
608
|
+
actions={<Button>Edit User</Button>}
|
|
609
|
+
/>
|
|
610
|
+
```
|
|
611
|
+
|
|
612
|
+
### PageLayout.Content Breadcrumbs
|
|
613
|
+
```jsx
|
|
614
|
+
<PageLayout.Content
|
|
615
|
+
title="User Profile"
|
|
616
|
+
breadcrumbs={[
|
|
617
|
+
{ label: 'Home', href: '/' },
|
|
618
|
+
{ label: 'Users', href: '/users' },
|
|
619
|
+
{ label: 'John Doe' }, // Current page - no href
|
|
620
|
+
]}
|
|
621
|
+
onNavigate={(href, item) => navigate(href)}
|
|
622
|
+
>
|
|
623
|
+
<UserProfileContent />
|
|
624
|
+
</PageLayout.Content>
|
|
625
|
+
```
|
|
626
|
+
|
|
627
|
+
### Breadcrumb Structure
|
|
628
|
+
```jsx
|
|
629
|
+
const breadcrumbs = [
|
|
630
|
+
{
|
|
631
|
+
label: 'Home', // REQUIRED: Display text
|
|
632
|
+
href: '/', // OPTIONAL: Link (omit for current page)
|
|
633
|
+
},
|
|
634
|
+
{
|
|
635
|
+
label: 'Products',
|
|
636
|
+
href: '/products',
|
|
637
|
+
},
|
|
638
|
+
{
|
|
639
|
+
label: 'iPhone 15', // Current page - no href
|
|
640
|
+
},
|
|
641
|
+
];
|
|
642
|
+
```
|
|
643
|
+
|
|
644
|
+
---
|
|
645
|
+
|
|
646
|
+
## 🎨 COLOR SYSTEM (COMPLETE REFERENCE)
|
|
647
|
+
|
|
648
|
+
### ✅ Semantic Color Classes (ALWAYS USE)
|
|
649
|
+
```jsx
|
|
650
|
+
// Background Colors
|
|
651
|
+
className = 'bg-background'; // Main page background
|
|
652
|
+
className = 'bg-card'; // Card/panel backgrounds
|
|
653
|
+
className = 'bg-popover'; // Dropdown/modal backgrounds
|
|
654
|
+
className = 'bg-muted'; // Subtle background areas
|
|
655
|
+
className = 'bg-primary'; // Primary buttons/brand elements
|
|
656
|
+
className = 'bg-secondary'; // Secondary buttons/elements
|
|
657
|
+
className = 'bg-destructive'; // Error/danger elements
|
|
658
|
+
|
|
659
|
+
// Text Colors
|
|
660
|
+
className = 'text-foreground'; // Primary text
|
|
661
|
+
className = 'text-muted-foreground'; // Secondary/subtle text
|
|
662
|
+
className = 'text-card-foreground'; // Text on card backgrounds
|
|
663
|
+
className = 'text-primary-foreground'; // Text on primary elements
|
|
664
|
+
className = 'text-secondary-foreground'; // Text on secondary elements
|
|
665
|
+
className = 'text-destructive'; // Error text
|
|
666
|
+
|
|
667
|
+
// Border Colors
|
|
668
|
+
className = 'border-border'; // Standard borders
|
|
669
|
+
className = 'border-input'; // Input field borders
|
|
670
|
+
className = 'border-primary'; // Primary colored borders
|
|
671
|
+
```
|
|
672
|
+
|
|
673
|
+
### Semantic Colors and Themes
|
|
674
|
+
Semantic color classes (e.g., `bg-primary`, `text-foreground`) adapt to the selected theme:
|
|
675
|
+
- `base`: Metallic black gradients for `bg-primary`
|
|
676
|
+
- `vivid`: Luxurious purple with slight orange for `bg-primary`
|
|
677
|
+
- `metro`: Nice green gradients for `bg-primary`
|
|
678
|
+
- `elegant`: Professional blue gradients for `bg-primary`
|
|
679
|
+
- `studio`: Black with orange accents for `bg-primary`
|
|
680
|
+
|
|
681
|
+
### ❌ Hardcoded Colors (NEVER USE)
|
|
682
|
+
```jsx
|
|
683
|
+
// These break in dark mode and don't match themes
|
|
684
|
+
className = 'bg-white text-black';
|
|
685
|
+
className = 'bg-blue-500 text-white';
|
|
686
|
+
className = 'border-gray-200';
|
|
687
|
+
className = 'bg-red-500';
|
|
688
|
+
className = 'text-green-600';
|
|
689
|
+
```
|
|
690
|
+
|
|
691
|
+
---
|
|
692
|
+
|
|
693
|
+
## 🎯 ENHANCED THEME SYSTEM (ZERO-TOUCH MAGIC)
|
|
694
|
+
|
|
695
|
+
### 🪄 Automatic Enhancement Features
|
|
696
|
+
The power of `@bloomneo/uikit` is that standard shadcn components automatically become beautiful without changing your code:
|
|
697
|
+
```jsx
|
|
698
|
+
// ✨ This standard code:
|
|
699
|
+
<Button className="bg-primary text-primary-foreground">Click Me</Button>
|
|
700
|
+
|
|
701
|
+
// 🎨 Automatically becomes (based on theme):
|
|
702
|
+
// base: Metallic black gradient, System UI fonts, professional styling
|
|
703
|
+
// vivid: Luxurious purple and slight orange gradient, Inter font, enhanced shadows
|
|
704
|
+
// metro: Nice green gradient, clean typography, sharp edges
|
|
705
|
+
// elegant: Professional blue gradient, luxury spacing, elegant shadows
|
|
706
|
+
// studio: Black and orange gradient, artistic fonts, bold styling
|
|
707
|
+
```
|
|
708
|
+
|
|
709
|
+
What happens automatically:
|
|
710
|
+
- **Gradients**: `bg-primary` becomes theme-specific gradients
|
|
711
|
+
- **Typography**: Custom fonts per theme (e.g., Inter, System UI)
|
|
712
|
+
- **Spacing**: Theme-specific padding and margins
|
|
713
|
+
- **Shadows**: Theme-appropriate shadow effects
|
|
714
|
+
- **Borders**: Theme-adjusted rounded corners
|
|
715
|
+
|
|
716
|
+
### Theme Migration Note
|
|
717
|
+
Previous versions of `@bloomneo/uikit` used themes named `aurora`, `default`, `ruby`, and `neon`. These have been replaced:
|
|
718
|
+
- `aurora` → `vivid` (luxurious purple with slight orange)
|
|
719
|
+
- `default` → `base` (metallic black)
|
|
720
|
+
- `ruby` → `elegant` (professional blue)
|
|
721
|
+
- `neon` → `studio` (black and orange)
|
|
722
|
+
- `metro` remains `metro` (nice green)
|
|
723
|
+
Update your code to use the new theme names to ensure compatibility.
|
|
724
|
+
|
|
725
|
+
### Level 1: Global Theme (Set Once in ThemeProvider)
|
|
726
|
+
```jsx
|
|
727
|
+
<ThemeProvider theme="base" mode="dark">
|
|
728
|
+
{/* Affects ALL components globally with enhanced design tokens */}
|
|
729
|
+
</ThemeProvider>
|
|
730
|
+
|
|
731
|
+
// Available Themes with Enhanced Design Tokens:
|
|
732
|
+
theme = 'base'; // Metallic black with System UI fonts
|
|
733
|
+
theme = 'vivid'; // Luxurious purple and slight orange with Inter fonts
|
|
734
|
+
theme = 'metro'; // Nice green with clean typography
|
|
735
|
+
theme = 'elegant'; // Professional blue with enhanced spacing
|
|
736
|
+
theme = 'studio'; // Black and orange with artistic fonts
|
|
737
|
+
|
|
738
|
+
// Available Modes:
|
|
739
|
+
mode = 'light'; // Light color scheme
|
|
740
|
+
mode = 'dark'; // Dark color scheme with enhanced contrast
|
|
741
|
+
```
|
|
742
|
+
|
|
743
|
+
### 🎨 Theme Switching (Dynamic Changes)
|
|
744
|
+
```jsx
|
|
745
|
+
import { useTheme } from '@bloomneo/uikit';
|
|
746
|
+
|
|
747
|
+
function ThemeControls() {
|
|
748
|
+
const { theme, setTheme, mode, setMode } = useTheme();
|
|
749
|
+
|
|
750
|
+
return (
|
|
751
|
+
<div className="flex gap-2">
|
|
752
|
+
<Button onClick={() => setTheme('vivid')}>
|
|
753
|
+
Vivid Theme
|
|
754
|
+
</Button>
|
|
755
|
+
<Button onClick={() => setTheme('metro')}>
|
|
756
|
+
Metro Theme
|
|
757
|
+
</Button>
|
|
758
|
+
<Button onClick={() => setMode(mode === 'light' ? 'dark' : 'light')}>
|
|
759
|
+
Toggle {mode === 'light' ? 'Dark' : 'Light'} Mode
|
|
760
|
+
</Button>
|
|
761
|
+
</div>
|
|
762
|
+
);
|
|
763
|
+
}
|
|
764
|
+
```
|
|
765
|
+
|
|
766
|
+
### 🚀 Theme Generation & Bundling CLI
|
|
767
|
+
|
|
768
|
+
#### Generate Custom Themes (Recommended)
|
|
769
|
+
Create complete custom themes automatically:
|
|
770
|
+
```bash
|
|
771
|
+
# Generate new custom theme with complete color system
|
|
772
|
+
npx uikit generate theme brand
|
|
773
|
+
|
|
774
|
+
# What this creates:
|
|
775
|
+
# - Theme file with 29 semantic colors (light + dark modes)
|
|
776
|
+
# - Auto-detects project structure (SPA/Multi/FBCA)
|
|
777
|
+
# - Updates main.tsx with theme and imports
|
|
778
|
+
# - Ready for bundling and use
|
|
779
|
+
```
|
|
780
|
+
|
|
781
|
+
#### Bundle Themes to CSS
|
|
782
|
+
Generate optimized CSS for custom themes:
|
|
783
|
+
```bash
|
|
784
|
+
# Bundle themes from your project directory
|
|
785
|
+
npx uikit bundle
|
|
786
|
+
|
|
787
|
+
# Watch mode for development
|
|
788
|
+
npx uikit bundle --watch
|
|
789
|
+
|
|
790
|
+
# Custom output location
|
|
791
|
+
npx uikit bundle --output=src/styles/themes.css
|
|
792
|
+
```
|
|
793
|
+
|
|
794
|
+
#### Project Structure Support
|
|
795
|
+
**SPA/Multi projects:**
|
|
796
|
+
- Themes: `src/themes/presets/`
|
|
797
|
+
- CSS output: `src/styles/globals.css`
|
|
798
|
+
|
|
799
|
+
**FBCA projects:**
|
|
800
|
+
- Themes: `src/web/themes/presets/`
|
|
801
|
+
- CSS output: `src/web/styles/globals.css`
|
|
802
|
+
|
|
803
|
+
**Legacy directories also supported:**
|
|
804
|
+
- `src/web/assets/themes/presets/`
|
|
805
|
+
- `themes/presets/`
|
|
806
|
+
|
|
807
|
+
The default presets include `base`, `vivid`, `metro`, `elegant`, and `studio`.
|
|
808
|
+
|
|
809
|
+
### Level 2: Component Tone (Per Component)
|
|
810
|
+
```jsx
|
|
811
|
+
<AdminLayout tone="subtle"> // Professional gray backgrounds
|
|
812
|
+
<Header tone="brand"> // Primary colored backgrounds
|
|
813
|
+
<Footer tone="contrast"> // High contrast/dark backgrounds
|
|
814
|
+
<AuthLayout tone="clean"> // Pure white/clean backgrounds
|
|
815
|
+
|
|
816
|
+
// Tone Meanings:
|
|
817
|
+
tone="clean" // Pure, minimal, white/light backgrounds
|
|
818
|
+
tone="subtle" // Muted, professional, gray backgrounds
|
|
819
|
+
tone="brand" // Primary colored, branded elements
|
|
820
|
+
tone="contrast" // High emphasis, dark/bold backgrounds
|
|
821
|
+
```
|
|
822
|
+
|
|
823
|
+
---
|
|
824
|
+
|
|
825
|
+
## 🚀 COMPLETE USAGE EXAMPLES
|
|
826
|
+
|
|
827
|
+
### 1. Enhanced Login Form (NEW Form Components)
|
|
828
|
+
```jsx
|
|
829
|
+
import { AuthLayout } from '@bloomneo/uikit/auth';
|
|
830
|
+
import {
|
|
831
|
+
ValidatedInput,
|
|
832
|
+
ValidatedCheckbox,
|
|
833
|
+
FormActions,
|
|
834
|
+
} from '@bloomneo/uikit/form';
|
|
835
|
+
import { ThemeProvider } from '@bloomneo/uikit/theme-provider';
|
|
836
|
+
import { useState } from 'react';
|
|
837
|
+
import '@bloomneo/uikit/styles';
|
|
838
|
+
|
|
839
|
+
function EnhancedLoginPage() {
|
|
840
|
+
const [formData, setFormData] = useState({
|
|
841
|
+
email: '',
|
|
842
|
+
password: '',
|
|
843
|
+
remember: false,
|
|
844
|
+
});
|
|
845
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
846
|
+
|
|
847
|
+
const handleSubmit = async (e) => {
|
|
848
|
+
e.preventDefault();
|
|
849
|
+
setIsLoading(true);
|
|
850
|
+
// Simulate API call
|
|
851
|
+
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
852
|
+
console.log('Login attempt:', formData);
|
|
853
|
+
setIsLoading(false);
|
|
854
|
+
};
|
|
855
|
+
|
|
856
|
+
return (
|
|
857
|
+
<ThemeProvider theme="base" mode="light">
|
|
858
|
+
<AuthLayout
|
|
859
|
+
scheme="card"
|
|
860
|
+
tone="clean"
|
|
861
|
+
size="md"
|
|
862
|
+
title="Welcome back"
|
|
863
|
+
subtitle="Sign in to your account to continue"
|
|
864
|
+
logo={
|
|
865
|
+
<div className="w-16 h-16 bg-primary rounded-xl flex items-center justify-center">
|
|
866
|
+
<span className="text-2xl font-bold text-primary-foreground">
|
|
867
|
+
L
|
|
868
|
+
</span>
|
|
869
|
+
</div>
|
|
870
|
+
}
|
|
871
|
+
>
|
|
872
|
+
<form onSubmit={handleSubmit} className="space-y-6">
|
|
873
|
+
<ValidatedInput
|
|
874
|
+
type="email"
|
|
875
|
+
required
|
|
876
|
+
label="Email address"
|
|
877
|
+
placeholder="name@example.com"
|
|
878
|
+
value={formData.email}
|
|
879
|
+
onChange={(value) =>
|
|
880
|
+
setFormData((prev) => ({ ...prev, email: value }))
|
|
881
|
+
}
|
|
882
|
+
/>
|
|
883
|
+
<ValidatedInput
|
|
884
|
+
type="password"
|
|
885
|
+
required
|
|
886
|
+
minLength={8}
|
|
887
|
+
label="Password"
|
|
888
|
+
placeholder="Enter your password"
|
|
889
|
+
value={formData.password}
|
|
890
|
+
onChange={(value) =>
|
|
891
|
+
setFormData((prev) => ({ ...prev, password: value }))
|
|
892
|
+
}
|
|
893
|
+
showPasswordStrength
|
|
894
|
+
showPasswordToggle
|
|
895
|
+
/>
|
|
896
|
+
<ValidatedCheckbox
|
|
897
|
+
label="Remember me for 30 days"
|
|
898
|
+
description="Keep me signed in on this device"
|
|
899
|
+
checked={formData.remember}
|
|
900
|
+
onChange={(value) =>
|
|
901
|
+
setFormData((prev) => ({ ...prev, remember: value }))
|
|
902
|
+
}
|
|
903
|
+
/>
|
|
904
|
+
<FormActions
|
|
905
|
+
submitText="Sign in"
|
|
906
|
+
showCancel={false}
|
|
907
|
+
loading={isLoading}
|
|
908
|
+
disabled={!formData.email || !formData.password}
|
|
909
|
+
/>
|
|
910
|
+
</form>
|
|
911
|
+
</AuthLayout>
|
|
912
|
+
</ThemeProvider>
|
|
913
|
+
);
|
|
914
|
+
}
|
|
915
|
+
```
|
|
916
|
+
|
|
917
|
+
### 2. Interactive Dashboard with Motion (NEW Motion Components)
|
|
918
|
+
```jsx
|
|
919
|
+
import { AdminLayout } from '@bloomneo/uikit/admin';
|
|
920
|
+
import { Card, CardHeader, CardTitle, CardContent } from '@bloomneo/uikit/card';
|
|
921
|
+
import { Button } from '@bloomneo/uikit/button';
|
|
922
|
+
import { Badge } from '@bloomneo/uikit/badge';
|
|
923
|
+
import { Motion, Reveal, Hover, LoadingSpinner } from '@bloomneo/uikit/motion';
|
|
924
|
+
import { ThemeProvider } from '@bloomneo/uikit/theme-provider';
|
|
925
|
+
import { Home, Users, BarChart3 } from 'lucide-react';
|
|
926
|
+
import { useState } from 'react';
|
|
927
|
+
import '@bloomneo/uikit/styles';
|
|
928
|
+
|
|
929
|
+
const navigation = [
|
|
930
|
+
{
|
|
931
|
+
key: 'dashboard',
|
|
932
|
+
label: 'Dashboard',
|
|
933
|
+
href: '/admin',
|
|
934
|
+
icon: Home,
|
|
935
|
+
isActive: true,
|
|
936
|
+
},
|
|
937
|
+
{
|
|
938
|
+
key: 'users',
|
|
939
|
+
label: 'Users',
|
|
940
|
+
href: '/admin/users',
|
|
941
|
+
icon: Users,
|
|
942
|
+
badge: '12',
|
|
943
|
+
},
|
|
944
|
+
{
|
|
945
|
+
key: 'analytics',
|
|
946
|
+
label: 'Analytics',
|
|
947
|
+
icon: BarChart3,
|
|
948
|
+
items: [
|
|
949
|
+
{ key: 'overview', label: 'Overview', href: '/admin/analytics' },
|
|
950
|
+
{ key: 'reports', label: 'Reports', href: '/admin/analytics/reports' },
|
|
951
|
+
],
|
|
952
|
+
},
|
|
953
|
+
];
|
|
954
|
+
|
|
955
|
+
function AnimatedDashboard() {
|
|
956
|
+
const [loading, setLoading] = useState(false);
|
|
957
|
+
|
|
958
|
+
const stats = [
|
|
959
|
+
{ title: 'Total Users', value: '1,234', change: '+12%', delay: 0 },
|
|
960
|
+
{ title: 'Revenue', value: '$45,678', change: '+8%', delay: 100 },
|
|
961
|
+
{ title: 'Orders', value: '892', change: '+15%', delay: 200 },
|
|
962
|
+
{ title: 'Conversion', value: '3.2%', change: '+2%', delay: 300 },
|
|
963
|
+
];
|
|
964
|
+
|
|
965
|
+
return (
|
|
966
|
+
<ThemeProvider theme="base" mode="light">
|
|
967
|
+
<AdminLayout scheme="sidebar" tone="subtle" size="lg">
|
|
968
|
+
<AdminLayout.Header
|
|
969
|
+
title="Dashboard"
|
|
970
|
+
position="sticky"
|
|
971
|
+
actions={
|
|
972
|
+
<Hover effect="scale">
|
|
973
|
+
<Button
|
|
974
|
+
className="bg-primary text-primary-foreground"
|
|
975
|
+
onClick={() => setLoading(!loading)}
|
|
976
|
+
>
|
|
977
|
+
{loading ? <LoadingSpinner size="sm" /> : 'Refresh Data'}
|
|
978
|
+
</Button>
|
|
979
|
+
</Hover>
|
|
980
|
+
}
|
|
981
|
+
/>
|
|
982
|
+
<AdminLayout.Sidebar
|
|
983
|
+
navigation={navigation}
|
|
984
|
+
currentPath="/admin"
|
|
985
|
+
onNavigate={(href) => (window.location.href = href)}
|
|
986
|
+
logo={
|
|
987
|
+
<Motion preset="scaleIn" duration="normal">
|
|
988
|
+
<div className="flex items-center gap-2">
|
|
989
|
+
<div className="w-8 h-8 bg-primary rounded-lg"></div>
|
|
990
|
+
<span className="text-xl font-bold text-foreground">Admin</span>
|
|
991
|
+
</div>
|
|
992
|
+
</Motion>
|
|
993
|
+
}
|
|
994
|
+
/>
|
|
995
|
+
<AdminLayout.Content>
|
|
996
|
+
<div className="space-y-6">
|
|
997
|
+
<div className="grid gap-4 md:grid-cols-2 lg:grid-cols-4">
|
|
998
|
+
{stats.map((stat, index) => (
|
|
999
|
+
<Motion
|
|
1000
|
+
key={stat.title}
|
|
1001
|
+
preset="slideInUp"
|
|
1002
|
+
duration="normal"
|
|
1003
|
+
delay={stat.delay}
|
|
1004
|
+
>
|
|
1005
|
+
<Hover effect="lift">
|
|
1006
|
+
<Card className="bg-card text-card-foreground border-border">
|
|
1007
|
+
<CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2">
|
|
1008
|
+
<CardTitle className="text-sm font-medium text-foreground">
|
|
1009
|
+
{stat.title}
|
|
1010
|
+
</CardTitle>
|
|
1011
|
+
<Users className="h-4 w-4 text-muted-foreground" />
|
|
1012
|
+
</CardHeader>
|
|
1013
|
+
<CardContent>
|
|
1014
|
+
<div className="text-2xl font-bold text-foreground">
|
|
1015
|
+
{stat.value}
|
|
1016
|
+
</div>
|
|
1017
|
+
<Badge className="mt-1 bg-green-100 text-green-800">
|
|
1018
|
+
{stat.change} from last month
|
|
1019
|
+
</Badge>
|
|
1020
|
+
</CardContent>
|
|
1021
|
+
</Card>
|
|
1022
|
+
</Hover>
|
|
1023
|
+
</Motion>
|
|
1024
|
+
))}
|
|
1025
|
+
</div>
|
|
1026
|
+
<Reveal preset="fadeIn" duration="slow">
|
|
1027
|
+
<Card className="bg-card text-card-foreground border-border">
|
|
1028
|
+
<CardHeader>
|
|
1029
|
+
<CardTitle className="text-foreground">
|
|
1030
|
+
Recent Activity
|
|
1031
|
+
</CardTitle>
|
|
1032
|
+
</CardHeader>
|
|
1033
|
+
<CardContent>
|
|
1034
|
+
<div className="space-y-4">
|
|
1035
|
+
{[1, 2, 3].map((item, index) => (
|
|
1036
|
+
<Motion
|
|
1037
|
+
key={item}
|
|
1038
|
+
preset="slideInUp"
|
|
1039
|
+
duration="fast"
|
|
1040
|
+
delay={index * 100}
|
|
1041
|
+
>
|
|
1042
|
+
<div className="flex items-center gap-3 p-3 bg-muted/20 rounded-lg">
|
|
1043
|
+
<div className="w-2 h-2 bg-primary rounded-full"></div>
|
|
1044
|
+
<div className="flex-1">
|
|
1045
|
+
<p className="text-sm text-foreground">
|
|
1046
|
+
Activity {item}
|
|
1047
|
+
</p>
|
|
1048
|
+
<p className="text-xs text-muted-foreground">
|
|
1049
|
+
2 minutes ago
|
|
1050
|
+
</p>
|
|
1051
|
+
</div>
|
|
1052
|
+
</div>
|
|
1053
|
+
</Motion>
|
|
1054
|
+
))}
|
|
1055
|
+
</div>
|
|
1056
|
+
</CardContent>
|
|
1057
|
+
</Card>
|
|
1058
|
+
</Reveal>
|
|
1059
|
+
</div>
|
|
1060
|
+
</AdminLayout.Content>
|
|
1061
|
+
</AdminLayout>
|
|
1062
|
+
</ThemeProvider>
|
|
1063
|
+
);
|
|
1064
|
+
}
|
|
1065
|
+
```
|
|
1066
|
+
|
|
1067
|
+
### 3. Advanced Data Table with Full Features (NEW DataTable)
|
|
1068
|
+
```jsx
|
|
1069
|
+
import { PageLayout } from '@bloomneo/uikit/page';
|
|
1070
|
+
import { DataTable } from '@bloomneo/uikit/data-table';
|
|
1071
|
+
import { Badge } from '@bloomneo/uikit/badge';
|
|
1072
|
+
import { Button } from '@bloomneo/uikit/button';
|
|
1073
|
+
import { Avatar, AvatarImage, AvatarFallback } from '@bloomneo/uikit/avatar';
|
|
1074
|
+
import { ThemeProvider } from '@bloomneo/uikit/theme-provider';
|
|
1075
|
+
import { Edit, Trash2, Eye, Download } from 'lucide-react';
|
|
1076
|
+
import { useState } from 'react';
|
|
1077
|
+
import '@bloomneo/uikit/styles';
|
|
1078
|
+
|
|
1079
|
+
function UserManagementPage() {
|
|
1080
|
+
const [users] = useState([
|
|
1081
|
+
{
|
|
1082
|
+
id: '1',
|
|
1083
|
+
name: 'John Doe',
|
|
1084
|
+
email: 'john@example.com',
|
|
1085
|
+
role: 'Admin',
|
|
1086
|
+
status: 'active',
|
|
1087
|
+
lastLogin: '2025-09-11',
|
|
1088
|
+
avatar: 'https://avatar.vercel.sh/john',
|
|
1089
|
+
},
|
|
1090
|
+
{
|
|
1091
|
+
id: '2',
|
|
1092
|
+
name: 'Jane Smith',
|
|
1093
|
+
email: 'jane@example.com',
|
|
1094
|
+
role: 'User',
|
|
1095
|
+
status: 'inactive',
|
|
1096
|
+
lastLogin: '2025-09-10',
|
|
1097
|
+
avatar: 'https://avatar.vercel.sh/jane',
|
|
1098
|
+
},
|
|
1099
|
+
]);
|
|
1100
|
+
|
|
1101
|
+
const columns = [
|
|
1102
|
+
{
|
|
1103
|
+
id: 'user',
|
|
1104
|
+
header: 'User',
|
|
1105
|
+
accessorKey: 'name',
|
|
1106
|
+
sortable: true,
|
|
1107
|
+
filterable: true,
|
|
1108
|
+
cell: (value, row) => (
|
|
1109
|
+
<div className="flex items-center gap-3">
|
|
1110
|
+
<Avatar className="h-8 w-8">
|
|
1111
|
+
<AvatarImage src={row.avatar} alt={row.name} />
|
|
1112
|
+
<AvatarFallback className="bg-primary text-primary-foreground">
|
|
1113
|
+
{row.name
|
|
1114
|
+
.split(' ')
|
|
1115
|
+
.map((n) => n[0])
|
|
1116
|
+
.join('')}
|
|
1117
|
+
</AvatarFallback>
|
|
1118
|
+
</Avatar>
|
|
1119
|
+
<div>
|
|
1120
|
+
<div className="font-medium text-foreground">{row.name}</div>
|
|
1121
|
+
<div className="text-sm text-muted-foreground">{row.email}</div>
|
|
1122
|
+
</div>
|
|
1123
|
+
</div>
|
|
1124
|
+
),
|
|
1125
|
+
},
|
|
1126
|
+
{
|
|
1127
|
+
id: 'role',
|
|
1128
|
+
header: 'Role',
|
|
1129
|
+
accessorKey: 'role',
|
|
1130
|
+
sortable: true,
|
|
1131
|
+
filterable: true,
|
|
1132
|
+
filterType: 'select',
|
|
1133
|
+
filterOptions: [
|
|
1134
|
+
{ label: 'Admin', value: 'Admin' },
|
|
1135
|
+
{ label: 'User', value: 'User' },
|
|
1136
|
+
{ label: 'Manager', value: 'Manager' },
|
|
1137
|
+
],
|
|
1138
|
+
},
|
|
1139
|
+
{
|
|
1140
|
+
id: 'status',
|
|
1141
|
+
header: 'Status',
|
|
1142
|
+
accessorKey: 'status',
|
|
1143
|
+
sortable: true,
|
|
1144
|
+
filterable: true,
|
|
1145
|
+
filterType: 'select',
|
|
1146
|
+
filterOptions: [
|
|
1147
|
+
{ label: 'Active', value: 'active' },
|
|
1148
|
+
{ label: 'Inactive', value: 'inactive' },
|
|
1149
|
+
],
|
|
1150
|
+
cell: (value) => (
|
|
1151
|
+
<Badge
|
|
1152
|
+
className={
|
|
1153
|
+
value === 'active'
|
|
1154
|
+
? 'bg-green-100 text-green-800'
|
|
1155
|
+
: 'bg-red-100 text-red-800'
|
|
1156
|
+
}
|
|
1157
|
+
>
|
|
1158
|
+
{value}
|
|
1159
|
+
</Badge>
|
|
1160
|
+
),
|
|
1161
|
+
},
|
|
1162
|
+
{
|
|
1163
|
+
id: 'lastLogin',
|
|
1164
|
+
header: 'Last Login',
|
|
1165
|
+
accessorKey: 'lastLogin',
|
|
1166
|
+
sortable: true,
|
|
1167
|
+
filterable: true,
|
|
1168
|
+
filterType: 'date',
|
|
1169
|
+
dataType: 'date',
|
|
1170
|
+
},
|
|
1171
|
+
];
|
|
1172
|
+
|
|
1173
|
+
const actions = [
|
|
1174
|
+
{
|
|
1175
|
+
id: 'view',
|
|
1176
|
+
label: 'View Profile',
|
|
1177
|
+
icon: Eye,
|
|
1178
|
+
onClick: (user) => console.log('View user:', user.name),
|
|
1179
|
+
},
|
|
1180
|
+
{
|
|
1181
|
+
id: 'edit',
|
|
1182
|
+
label: 'Edit User',
|
|
1183
|
+
icon: Edit,
|
|
1184
|
+
onClick: (user) => console.log('Edit user:', user.name),
|
|
1185
|
+
},
|
|
1186
|
+
{
|
|
1187
|
+
id: 'delete',
|
|
1188
|
+
label: 'Delete User',
|
|
1189
|
+
icon: Trash2,
|
|
1190
|
+
variant: 'destructive',
|
|
1191
|
+
onClick: (user) => console.log('Delete user:', user.name),
|
|
1192
|
+
visible: (user) => user.role !== 'Admin',
|
|
1193
|
+
},
|
|
1194
|
+
];
|
|
1195
|
+
|
|
1196
|
+
const bulkActions = [
|
|
1197
|
+
{
|
|
1198
|
+
id: 'export',
|
|
1199
|
+
label: 'Export Selected',
|
|
1200
|
+
icon: Download,
|
|
1201
|
+
onClick: (selectedUsers) => console.log('Export:', selectedUsers),
|
|
1202
|
+
},
|
|
1203
|
+
{
|
|
1204
|
+
id: 'deactivate',
|
|
1205
|
+
label: 'Deactivate Selected',
|
|
1206
|
+
variant: 'destructive',
|
|
1207
|
+
onClick: (selectedUsers) => console.log('Deactivate:', selectedUsers),
|
|
1208
|
+
},
|
|
1209
|
+
];
|
|
1210
|
+
|
|
1211
|
+
return (
|
|
1212
|
+
<ThemeProvider theme="base" mode="light">
|
|
1213
|
+
<PageLayout scheme="base" tone="clean" size="xl">
|
|
1214
|
+
<PageLayout.Header
|
|
1215
|
+
title="User Management"
|
|
1216
|
+
navigation={[
|
|
1217
|
+
{ key: 'dashboard', label: 'Dashboard', href: '/' },
|
|
1218
|
+
{ key: 'users', label: 'Users', href: '/users', isActive: true },
|
|
1219
|
+
{ key: 'settings', label: 'Settings', href: '/settings' },
|
|
1220
|
+
]}
|
|
1221
|
+
/>
|
|
1222
|
+
<PageLayout.Content>
|
|
1223
|
+
<div className="space-y-6">
|
|
1224
|
+
<div className="flex items-center justify-between">
|
|
1225
|
+
<div>
|
|
1226
|
+
<h1 className="text-3xl font-bold text-foreground">Users</h1>
|
|
1227
|
+
<p className="text-muted-foreground">
|
|
1228
|
+
Manage your team members and their permissions
|
|
1229
|
+
</p>
|
|
1230
|
+
</div>
|
|
1231
|
+
<Button className="bg-primary text-primary-foreground">
|
|
1232
|
+
Add User
|
|
1233
|
+
</Button>
|
|
1234
|
+
</div>
|
|
1235
|
+
<DataTable
|
|
1236
|
+
data={users}
|
|
1237
|
+
columns={columns}
|
|
1238
|
+
searchable
|
|
1239
|
+
searchPlaceholder="Search users..."
|
|
1240
|
+
filterable
|
|
1241
|
+
sortable
|
|
1242
|
+
selectable
|
|
1243
|
+
pagination
|
|
1244
|
+
pageSize={10}
|
|
1245
|
+
actions={actions}
|
|
1246
|
+
bulkActions={bulkActions}
|
|
1247
|
+
exportable
|
|
1248
|
+
exportFormats={['csv', 'json', 'excel']}
|
|
1249
|
+
onExport={(format, data) => {
|
|
1250
|
+
console.log(`Exporting ${data.length} users as ${format}`);
|
|
1251
|
+
}}
|
|
1252
|
+
emptyState={
|
|
1253
|
+
<div className="text-center py-12">
|
|
1254
|
+
<div className="text-muted-foreground mb-4">
|
|
1255
|
+
No users found
|
|
1256
|
+
</div>
|
|
1257
|
+
<Button>Add your first user</Button>
|
|
1258
|
+
</div>
|
|
1259
|
+
}
|
|
1260
|
+
className="border border-border rounded-lg"
|
|
1261
|
+
/>
|
|
1262
|
+
</div>
|
|
1263
|
+
</PageLayout.Content>
|
|
1264
|
+
<PageLayout.Footer
|
|
1265
|
+
copyright="© 2025 User Management System. All rights reserved."
|
|
1266
|
+
/>
|
|
1267
|
+
</PageLayout>
|
|
1268
|
+
</ThemeProvider>
|
|
1269
|
+
);
|
|
1270
|
+
}
|
|
1271
|
+
```
|
|
1272
|
+
|
|
1273
|
+
---
|
|
1274
|
+
|
|
1275
|
+
## 🔧 NEW COMPONENTS INTEGRATION PATTERNS
|
|
1276
|
+
|
|
1277
|
+
### Form Component Integration
|
|
1278
|
+
```jsx
|
|
1279
|
+
// ✅ RECOMMENDED: Use ValidatedInput for forms with validation needs
|
|
1280
|
+
const [formData, setFormData] = useState({ email: '', password: '' });
|
|
1281
|
+
|
|
1282
|
+
<ValidatedInput
|
|
1283
|
+
type="email"
|
|
1284
|
+
required
|
|
1285
|
+
label="Email"
|
|
1286
|
+
value={formData.email}
|
|
1287
|
+
onChange={(value) => setFormData((prev) => ({ ...prev, email: value }))}
|
|
1288
|
+
/>;
|
|
1289
|
+
|
|
1290
|
+
// ✅ ADVANCED: Use React Hook Form for complex forms
|
|
1291
|
+
import { useForm } from 'react-hook-form';
|
|
1292
|
+
import { Form, FormField, FormItem, FormControl } from '@bloomneo/uikit/form';
|
|
1293
|
+
|
|
1294
|
+
const form = useForm();
|
|
1295
|
+
|
|
1296
|
+
<Form {...form}>
|
|
1297
|
+
<FormField
|
|
1298
|
+
control={form.control}
|
|
1299
|
+
name="email"
|
|
1300
|
+
render={({ field }) => (
|
|
1301
|
+
<FormItem>
|
|
1302
|
+
<FormControl>
|
|
1303
|
+
<ValidatedInput {...field} type="email" required label="Email" />
|
|
1304
|
+
</FormControl>
|
|
1305
|
+
</FormItem>
|
|
1306
|
+
)}
|
|
1307
|
+
/>
|
|
1308
|
+
</Form>;
|
|
1309
|
+
```
|
|
1310
|
+
|
|
1311
|
+
### Motion Component Integration
|
|
1312
|
+
```jsx
|
|
1313
|
+
// ✅ Page transitions
|
|
1314
|
+
<Motion preset="fadeIn" duration="normal">
|
|
1315
|
+
<PageContent />
|
|
1316
|
+
</Motion>;
|
|
1317
|
+
|
|
1318
|
+
// ✅ List item animations
|
|
1319
|
+
{items.map((item, index) => (
|
|
1320
|
+
<Motion key={item.id} preset="slideInUp" delay={index * 100}>
|
|
1321
|
+
<ListItem item={item} />
|
|
1322
|
+
</Motion>
|
|
1323
|
+
))}
|
|
1324
|
+
|
|
1325
|
+
// ✅ Interactive elements
|
|
1326
|
+
<Hover effect="scale">
|
|
1327
|
+
<Card>Interactive card</Card>
|
|
1328
|
+
</Hover>;
|
|
1329
|
+
|
|
1330
|
+
// ✅ Loading states
|
|
1331
|
+
{loading && <LoadingSpinner size="lg" />}
|
|
1332
|
+
```
|
|
1333
|
+
|
|
1334
|
+
### DataTable Integration
|
|
1335
|
+
```jsx
|
|
1336
|
+
// ✅ Basic usage with minimal props
|
|
1337
|
+
<DataTable
|
|
1338
|
+
data={users}
|
|
1339
|
+
columns={basicColumns}
|
|
1340
|
+
searchable
|
|
1341
|
+
pagination
|
|
1342
|
+
/>
|
|
1343
|
+
|
|
1344
|
+
// ✅ Advanced usage with all features
|
|
1345
|
+
<DataTable
|
|
1346
|
+
data={users}
|
|
1347
|
+
columns={advancedColumns}
|
|
1348
|
+
searchable
|
|
1349
|
+
filterable
|
|
1350
|
+
sortable
|
|
1351
|
+
selectable
|
|
1352
|
+
pagination
|
|
1353
|
+
actions={rowActions}
|
|
1354
|
+
bulkActions={bulkActions}
|
|
1355
|
+
exportable
|
|
1356
|
+
onExport={handleExport}
|
|
1357
|
+
/>
|
|
1358
|
+
```
|
|
1359
|
+
|
|
1360
|
+
---
|
|
1361
|
+
|
|
1362
|
+
## 🏗️ SECTION COMPONENTS (Advanced Usage)
|
|
1363
|
+
|
|
1364
|
+
### Header Component (Standalone)
|
|
1365
|
+
```jsx
|
|
1366
|
+
import { Header, HeaderLogo, HeaderNav } from '@bloomneo/uikit/header';
|
|
1367
|
+
|
|
1368
|
+
<Header tone="clean" size="xl" position="sticky">
|
|
1369
|
+
<HeaderLogo>
|
|
1370
|
+
<img src="/logo.png" alt="Logo" className="h-8 w-auto" />
|
|
1371
|
+
</HeaderLogo>
|
|
1372
|
+
<HeaderNav
|
|
1373
|
+
navigation={navigation}
|
|
1374
|
+
currentPath="/current"
|
|
1375
|
+
onNavigate={handleNavigation}
|
|
1376
|
+
/>
|
|
1377
|
+
</Header>;
|
|
1378
|
+
```
|
|
1379
|
+
|
|
1380
|
+
### Footer Component (Standalone)
|
|
1381
|
+
```jsx
|
|
1382
|
+
import { Footer } from '@bloomneo/uikit/footer';
|
|
1383
|
+
|
|
1384
|
+
<Footer tone="contrast" size="xl" position="relative">
|
|
1385
|
+
<div className="text-center py-4">
|
|
1386
|
+
<p className="text-sm text-muted-foreground">© 2025 Company</p>
|
|
1387
|
+
</div>
|
|
1388
|
+
</Footer>;
|
|
1389
|
+
```
|
|
1390
|
+
|
|
1391
|
+
### Container Component (Content with Sidebar)
|
|
1392
|
+
```jsx
|
|
1393
|
+
import { Container } from '@bloomneo/uikit/container';
|
|
1394
|
+
|
|
1395
|
+
<Container
|
|
1396
|
+
tone="clean"
|
|
1397
|
+
size="xl"
|
|
1398
|
+
sidebar="left"
|
|
1399
|
+
navigation={sidebarNav}
|
|
1400
|
+
currentPath="/current"
|
|
1401
|
+
onNavigate={handleNavigation}
|
|
1402
|
+
>
|
|
1403
|
+
<MainContent />
|
|
1404
|
+
</Container>;
|
|
1405
|
+
```
|
|
1406
|
+
|
|
1407
|
+
---
|
|
1408
|
+
|
|
1409
|
+
## 📐 COMPOUND COMPONENT PROPS (DETAILED)
|
|
1410
|
+
|
|
1411
|
+
### AdminLayout Props
|
|
1412
|
+
```jsx
|
|
1413
|
+
// AdminLayout Root
|
|
1414
|
+
<AdminLayout
|
|
1415
|
+
scheme="sidebar|compact" // Layout structure (base: 'sidebar')
|
|
1416
|
+
tone="clean|subtle|brand|contrast" // Visual emphasis (base: 'subtle')
|
|
1417
|
+
size="sm|md|lg|xl|full" // Layout size (base: 'lg')
|
|
1418
|
+
baseSidebarOpen={true} // Initial sidebar state (base: true)
|
|
1419
|
+
position="relative|sticky|fixed" // Positioning behavior (base: 'relative')
|
|
1420
|
+
>
|
|
1421
|
+
|
|
1422
|
+
// AdminLayout.Header
|
|
1423
|
+
<AdminLayout.Header
|
|
1424
|
+
title="Dashboard" // Page title (optional)
|
|
1425
|
+
position="sticky|fixed|relative" // Header positioning (base: 'sticky')
|
|
1426
|
+
breadcrumbs={[ // Breadcrumb navigation (optional)
|
|
1427
|
+
{ label: 'Admin', href: '/admin' },
|
|
1428
|
+
{ label: 'Dashboard' }
|
|
1429
|
+
]}
|
|
1430
|
+
actions={<Button>Action</Button>} // Header actions (optional)
|
|
1431
|
+
/>
|
|
1432
|
+
|
|
1433
|
+
// AdminLayout.Sidebar
|
|
1434
|
+
<AdminLayout.Sidebar
|
|
1435
|
+
navigation={navigationItems} // Navigation items (optional)
|
|
1436
|
+
currentPath="/admin" // Current path for active states (optional)
|
|
1437
|
+
onNavigate={handleNavigation} // Navigation handler (optional)
|
|
1438
|
+
logo={<Logo />} // Logo component (optional)
|
|
1439
|
+
footer={<SidebarFooter />} // Footer content (optional)
|
|
1440
|
+
position="relative|sticky|fixed" // Sidebar positioning (optional)
|
|
1441
|
+
/>
|
|
1442
|
+
|
|
1443
|
+
// AdminLayout.Content
|
|
1444
|
+
<AdminLayout.Content>
|
|
1445
|
+
{/* Your admin content here */}
|
|
1446
|
+
</AdminLayout.Content>
|
|
1447
|
+
```
|
|
1448
|
+
|
|
1449
|
+
### PageLayout Props
|
|
1450
|
+
```jsx
|
|
1451
|
+
// PageLayout Root
|
|
1452
|
+
<PageLayout
|
|
1453
|
+
scheme="base|sidebar" // Layout structure (base: 'base')
|
|
1454
|
+
tone="clean|subtle|brand|contrast" // Visual emphasis (base: 'clean')
|
|
1455
|
+
size="sm|md|lg|xl|full" // Layout size (base: 'xl')
|
|
1456
|
+
>
|
|
1457
|
+
|
|
1458
|
+
// PageLayout.Header
|
|
1459
|
+
<PageLayout.Header
|
|
1460
|
+
navigation={navigationItems} // Navigation items (optional)
|
|
1461
|
+
currentPath="/" // Current path for active states (optional)
|
|
1462
|
+
onNavigate={handleNavigation} // Navigation handler (optional)
|
|
1463
|
+
logo={<Logo />} // Logo component (optional)
|
|
1464
|
+
title="My Site" // Site title if no logo (optional)
|
|
1465
|
+
actions={<HeaderActions />} // Header actions (optional)
|
|
1466
|
+
position="sticky|fixed|relative" // Header positioning (base: 'sticky')
|
|
1467
|
+
/>
|
|
1468
|
+
|
|
1469
|
+
// PageLayout.Content
|
|
1470
|
+
<PageLayout.Content
|
|
1471
|
+
title="Page Title" // Page title above content (optional)
|
|
1472
|
+
breadcrumbs={[ // Page breadcrumbs (optional)
|
|
1473
|
+
{ label: "Home", href: "/" },
|
|
1474
|
+
{ label: "About" }
|
|
1475
|
+
]}
|
|
1476
|
+
sidebar="none|left|right" // Sidebar position (base: 'none')
|
|
1477
|
+
navigation={sidebarNav} // Sidebar navigation (optional)
|
|
1478
|
+
sidebarContent={<CustomSidebar />} // Custom sidebar content (optional)
|
|
1479
|
+
onNavigate={handleNavigation} // Navigation handler (optional)
|
|
1480
|
+
sidebarPosition="sticky|fixed|relative" // Sidebar positioning (optional)
|
|
1481
|
+
>
|
|
1482
|
+
{/* Your page content here */}
|
|
1483
|
+
</PageLayout.Content>
|
|
1484
|
+
|
|
1485
|
+
// PageLayout.Footer
|
|
1486
|
+
<PageLayout.Footer
|
|
1487
|
+
navigation={footerNav} // Footer navigation (optional)
|
|
1488
|
+
copyright="© 2025 Company" // Copyright text (optional)
|
|
1489
|
+
position="sticky|fixed|relative" // Footer positioning (base: 'relative')
|
|
1490
|
+
>
|
|
1491
|
+
{/* Custom footer content (optional) */}
|
|
1492
|
+
</PageLayout.Footer>
|
|
1493
|
+
```
|
|
1494
|
+
|
|
1495
|
+
---
|
|
1496
|
+
|
|
1497
|
+
## 🔧 INTEGRATION EXAMPLES
|
|
1498
|
+
|
|
1499
|
+
### React Router Integration
|
|
1500
|
+
```jsx
|
|
1501
|
+
import { useNavigate, useLocation } from 'react-router-dom';
|
|
1502
|
+
|
|
1503
|
+
function App() {
|
|
1504
|
+
const navigate = useNavigate();
|
|
1505
|
+
const location = useLocation();
|
|
1506
|
+
|
|
1507
|
+
const handleNavigation = (href, item) => {
|
|
1508
|
+
if (item.onClick) {
|
|
1509
|
+
item.onClick();
|
|
1510
|
+
} else if (href) {
|
|
1511
|
+
navigate(href);
|
|
1512
|
+
}
|
|
1513
|
+
};
|
|
1514
|
+
|
|
1515
|
+
return (
|
|
1516
|
+
<AdminLayout>
|
|
1517
|
+
<AdminLayout.Sidebar
|
|
1518
|
+
navigation={navigation}
|
|
1519
|
+
currentPath={location.pathname}
|
|
1520
|
+
onNavigate={handleNavigation}
|
|
1521
|
+
/>
|
|
1522
|
+
</AdminLayout>
|
|
1523
|
+
);
|
|
1524
|
+
}
|
|
1525
|
+
```
|
|
1526
|
+
|
|
1527
|
+
### Next.js Integration
|
|
1528
|
+
```jsx
|
|
1529
|
+
import { useRouter } from 'next/router';
|
|
1530
|
+
|
|
1531
|
+
function App() {
|
|
1532
|
+
const router = useRouter();
|
|
1533
|
+
|
|
1534
|
+
const handleNavigation = (href, item) => {
|
|
1535
|
+
if (item.onClick) {
|
|
1536
|
+
item.onClick();
|
|
1537
|
+
} else if (href) {
|
|
1538
|
+
router.push(href);
|
|
1539
|
+
}
|
|
1540
|
+
};
|
|
1541
|
+
|
|
1542
|
+
return (
|
|
1543
|
+
<PageLayout>
|
|
1544
|
+
<PageLayout.Header
|
|
1545
|
+
navigation={navigation}
|
|
1546
|
+
currentPath={router.pathname}
|
|
1547
|
+
onNavigate={handleNavigation}
|
|
1548
|
+
/>
|
|
1549
|
+
</PageLayout>
|
|
1550
|
+
);
|
|
1551
|
+
}
|
|
1552
|
+
```
|
|
1553
|
+
|
|
1554
|
+
### State Management Integration
|
|
1555
|
+
```jsx
|
|
1556
|
+
import { useStore } from '@/store';
|
|
1557
|
+
|
|
1558
|
+
function Dashboard() {
|
|
1559
|
+
const { user, notifications, updateUser } = useStore();
|
|
1560
|
+
|
|
1561
|
+
const navigation = [
|
|
1562
|
+
{
|
|
1563
|
+
key: 'notifications',
|
|
1564
|
+
label: 'Notifications',
|
|
1565
|
+
href: '/notifications',
|
|
1566
|
+
badge: notifications.length.toString(),
|
|
1567
|
+
},
|
|
1568
|
+
];
|
|
1569
|
+
|
|
1570
|
+
return (
|
|
1571
|
+
<AdminLayout>
|
|
1572
|
+
<AdminLayout.Header
|
|
1573
|
+
title={`Welcome, ${user.name}`}
|
|
1574
|
+
actions={
|
|
1575
|
+
<Button onClick={() => updateUser({ lastSeen: new Date() })}>
|
|
1576
|
+
Update Profile
|
|
1577
|
+
</Button>
|
|
1578
|
+
}
|
|
1579
|
+
/>
|
|
1580
|
+
<AdminLayout.Sidebar navigation={navigation} />
|
|
1581
|
+
</AdminLayout>
|
|
1582
|
+
);
|
|
1583
|
+
}
|
|
1584
|
+
```
|
|
1585
|
+
|
|
1586
|
+
---
|
|
1587
|
+
|
|
1588
|
+
## 🆕 NEW COMPONENTS DEEP DIVE
|
|
1589
|
+
|
|
1590
|
+
### ValidatedInput Advanced Features
|
|
1591
|
+
```jsx
|
|
1592
|
+
// Email validation with custom pattern
|
|
1593
|
+
<ValidatedInput
|
|
1594
|
+
type="email"
|
|
1595
|
+
required
|
|
1596
|
+
label="Business Email"
|
|
1597
|
+
placeholder="you@company.com"
|
|
1598
|
+
pattern="^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"
|
|
1599
|
+
value={email}
|
|
1600
|
+
onChange={setEmail}
|
|
1601
|
+
/>
|
|
1602
|
+
|
|
1603
|
+
// Password with strength meter
|
|
1604
|
+
<ValidatedInput
|
|
1605
|
+
type="password"
|
|
1606
|
+
required
|
|
1607
|
+
minLength={12}
|
|
1608
|
+
label="Secure Password"
|
|
1609
|
+
placeholder="Create a strong password"
|
|
1610
|
+
value={password}
|
|
1611
|
+
onChange={setPassword}
|
|
1612
|
+
showPasswordStrength
|
|
1613
|
+
showPasswordToggle
|
|
1614
|
+
/>
|
|
1615
|
+
|
|
1616
|
+
// Phone number with pattern validation
|
|
1617
|
+
<ValidatedInput
|
|
1618
|
+
type="tel"
|
|
1619
|
+
required
|
|
1620
|
+
label="Phone Number"
|
|
1621
|
+
placeholder="+1 (555) 123-4567"
|
|
1622
|
+
pattern="^\+?[1-9]\d{1,14}$"
|
|
1623
|
+
value={phone}
|
|
1624
|
+
onChange={setPhone}
|
|
1625
|
+
/>
|
|
1626
|
+
```
|
|
1627
|
+
|
|
1628
|
+
### DataTable Advanced Configuration
|
|
1629
|
+
```jsx
|
|
1630
|
+
// The `virtualized` prop enables virtualization for large datasets, improving performance by rendering only visible rows. Requires a fixed `height` prop.
|
|
1631
|
+
const advancedColumns = [
|
|
1632
|
+
{
|
|
1633
|
+
id: 'user',
|
|
1634
|
+
header: 'User Information',
|
|
1635
|
+
accessor: (row) => `${row.firstName} ${row.lastName}`,
|
|
1636
|
+
sortable: true,
|
|
1637
|
+
filterable: true,
|
|
1638
|
+
cell: (value, row) => (
|
|
1639
|
+
<div className="flex items-center gap-3">
|
|
1640
|
+
<Avatar>
|
|
1641
|
+
<AvatarImage src={row.avatar} />
|
|
1642
|
+
<AvatarFallback>{row.initials}</AvatarFallback>
|
|
1643
|
+
</Avatar>
|
|
1644
|
+
<div>
|
|
1645
|
+
<div className="font-medium">{value}</div>
|
|
1646
|
+
<div className="text-sm text-muted-foreground">{row.email}</div>
|
|
1647
|
+
<div className="text-xs text-muted-foreground">{row.department}</div>
|
|
1648
|
+
</div>
|
|
1649
|
+
</div>
|
|
1650
|
+
),
|
|
1651
|
+
width: 300,
|
|
1652
|
+
pinned: 'left',
|
|
1653
|
+
},
|
|
1654
|
+
{
|
|
1655
|
+
id: 'performance',
|
|
1656
|
+
header: 'Performance Score',
|
|
1657
|
+
accessorKey: 'performanceScore',
|
|
1658
|
+
sortable: true,
|
|
1659
|
+
filterable: true,
|
|
1660
|
+
filterType: 'number',
|
|
1661
|
+
dataType: 'number',
|
|
1662
|
+
cell: (value) => (
|
|
1663
|
+
<div className="flex items-center gap-2">
|
|
1664
|
+
<div className="w-16 bg-muted rounded-full h-2">
|
|
1665
|
+
<div
|
|
1666
|
+
className="bg-primary h-2 rounded-full transition-all"
|
|
1667
|
+
style={{ width: `${value}%` }}
|
|
1668
|
+
/>
|
|
1669
|
+
</div>
|
|
1670
|
+
<span className="text-sm font-medium">{value}%</span>
|
|
1671
|
+
</div>
|
|
1672
|
+
),
|
|
1673
|
+
},
|
|
1674
|
+
{
|
|
1675
|
+
id: 'actions',
|
|
1676
|
+
header: 'Quick Actions',
|
|
1677
|
+
cell: (value, row) => (
|
|
1678
|
+
<div className="flex gap-1">
|
|
1679
|
+
<Button size="sm" variant="outline">
|
|
1680
|
+
Edit
|
|
1681
|
+
</Button>
|
|
1682
|
+
<Button size="sm" variant="outline">
|
|
1683
|
+
Message
|
|
1684
|
+
</Button>
|
|
1685
|
+
</div>
|
|
1686
|
+
),
|
|
1687
|
+
width: 150,
|
|
1688
|
+
},
|
|
1689
|
+
];
|
|
1690
|
+
|
|
1691
|
+
<DataTable
|
|
1692
|
+
data={employees}
|
|
1693
|
+
columns={advancedColumns}
|
|
1694
|
+
searchable
|
|
1695
|
+
searchPlaceholder="Search employees..."
|
|
1696
|
+
filterable
|
|
1697
|
+
sortable
|
|
1698
|
+
selectable
|
|
1699
|
+
selectionMode="multiple"
|
|
1700
|
+
pagination
|
|
1701
|
+
pageSize={25}
|
|
1702
|
+
height="600px"
|
|
1703
|
+
virtualized
|
|
1704
|
+
density="comfortable"
|
|
1705
|
+
striped
|
|
1706
|
+
hoverable
|
|
1707
|
+
actions={[
|
|
1708
|
+
{
|
|
1709
|
+
id: 'profile',
|
|
1710
|
+
label: 'View Profile',
|
|
1711
|
+
icon: User,
|
|
1712
|
+
onClick: (employee) => viewProfile(employee.id),
|
|
1713
|
+
},
|
|
1714
|
+
{
|
|
1715
|
+
id: 'edit',
|
|
1716
|
+
label: 'Edit Employee',
|
|
1717
|
+
icon: Edit,
|
|
1718
|
+
onClick: (employee) => editEmployee(employee.id),
|
|
1719
|
+
},
|
|
1720
|
+
{
|
|
1721
|
+
id: 'deactivate',
|
|
1722
|
+
label: 'Deactivate',
|
|
1723
|
+
icon: UserX,
|
|
1724
|
+
variant: 'destructive',
|
|
1725
|
+
onClick: (employee) => deactivateEmployee(employee.id),
|
|
1726
|
+
visible: (employee) => employee.status === 'active',
|
|
1727
|
+
},
|
|
1728
|
+
]}
|
|
1729
|
+
bulkActions={[
|
|
1730
|
+
{
|
|
1731
|
+
id: 'export',
|
|
1732
|
+
label: 'Export Selected',
|
|
1733
|
+
icon: Download,
|
|
1734
|
+
onClick: (selected) => exportEmployees(selected),
|
|
1735
|
+
},
|
|
1736
|
+
{
|
|
1737
|
+
id: 'bulk-edit',
|
|
1738
|
+
label: 'Bulk Edit',
|
|
1739
|
+
icon: Edit,
|
|
1740
|
+
onClick: (selected) => openBulkEdit(selected),
|
|
1741
|
+
},
|
|
1742
|
+
]}
|
|
1743
|
+
expandable
|
|
1744
|
+
renderExpanded={(employee) => (
|
|
1745
|
+
<div className="p-4 bg-muted/20">
|
|
1746
|
+
<h4 className="font-medium mb-2">Employee Details</h4>
|
|
1747
|
+
<div className="grid grid-cols-2 gap-4 text-sm">
|
|
1748
|
+
<div>Start Date: {employee.startDate}</div>
|
|
1749
|
+
<div>Manager: {employee.manager}</div>
|
|
1750
|
+
<div>Location: {employee.location}</div>
|
|
1751
|
+
<div>Salary: {employee.salary}</div>
|
|
1752
|
+
</div>
|
|
1753
|
+
</div>
|
|
1754
|
+
)}
|
|
1755
|
+
exportable
|
|
1756
|
+
exportFormats={['csv', 'json', 'excel']}
|
|
1757
|
+
onExport={(format, data) => handleExport(format, data)}
|
|
1758
|
+
/>;
|
|
1759
|
+
```
|
|
1760
|
+
|
|
1761
|
+
### Motion Component Advanced Patterns
|
|
1762
|
+
```jsx
|
|
1763
|
+
// Page transition animations
|
|
1764
|
+
function PageTransition({ children, pathname }) {
|
|
1765
|
+
return (
|
|
1766
|
+
<Motion
|
|
1767
|
+
key={pathname}
|
|
1768
|
+
preset="fadeIn"
|
|
1769
|
+
duration="normal"
|
|
1770
|
+
className="min-h-screen"
|
|
1771
|
+
>
|
|
1772
|
+
{children}
|
|
1773
|
+
</Motion>
|
|
1774
|
+
);
|
|
1775
|
+
}
|
|
1776
|
+
|
|
1777
|
+
// Staggered list animations
|
|
1778
|
+
function AnimatedList({ items }) {
|
|
1779
|
+
return (
|
|
1780
|
+
<div className="space-y-2">
|
|
1781
|
+
{items.map((item, index) => (
|
|
1782
|
+
<Motion
|
|
1783
|
+
key={item.id}
|
|
1784
|
+
preset="slideInUp"
|
|
1785
|
+
duration="fast"
|
|
1786
|
+
delay={index * 50}
|
|
1787
|
+
>
|
|
1788
|
+
<ListItem item={item} />
|
|
1789
|
+
</Motion>
|
|
1790
|
+
))}
|
|
1791
|
+
</div>
|
|
1792
|
+
);
|
|
1793
|
+
}
|
|
1794
|
+
|
|
1795
|
+
// Scroll-triggered sections
|
|
1796
|
+
function FeaturesSection() {
|
|
1797
|
+
return (
|
|
1798
|
+
<section className="py-20">
|
|
1799
|
+
<Reveal preset="fadeIn" duration="slow">
|
|
1800
|
+
<h2 className="text-3xl font-bold text-center mb-12">Features</h2>
|
|
1801
|
+
</Reveal>
|
|
1802
|
+
<div className="grid md:grid-cols-3 gap-8">
|
|
1803
|
+
{features.map((feature, index) => (
|
|
1804
|
+
<Reveal
|
|
1805
|
+
key={feature.id}
|
|
1806
|
+
preset="slideInUp"
|
|
1807
|
+
duration="normal"
|
|
1808
|
+
delay={index * 200}
|
|
1809
|
+
>
|
|
1810
|
+
<Hover effect="lift">
|
|
1811
|
+
<Card>
|
|
1812
|
+
<CardContent className="p-6 text-center">
|
|
1813
|
+
<feature.icon className="h-12 w-12 mx-auto mb-4 text-primary" />
|
|
1814
|
+
<h3 className="text-xl font-semibold mb-2">
|
|
1815
|
+
{feature.title}
|
|
1816
|
+
</h3>
|
|
1817
|
+
<p className="text-muted-foreground">{feature.description}</p>
|
|
1818
|
+
</CardContent>
|
|
1819
|
+
</Card>
|
|
1820
|
+
</Hover>
|
|
1821
|
+
</Reveal>
|
|
1822
|
+
))}
|
|
1823
|
+
</div>
|
|
1824
|
+
</section>
|
|
1825
|
+
);
|
|
1826
|
+
}
|
|
1827
|
+
|
|
1828
|
+
// Interactive button with loading states
|
|
1829
|
+
function SubmitButton({ loading, onSubmit }) {
|
|
1830
|
+
return (
|
|
1831
|
+
<Hover effect="scale">
|
|
1832
|
+
<Button
|
|
1833
|
+
onClick={onSubmit}
|
|
1834
|
+
disabled={loading}
|
|
1835
|
+
className="bg-primary text-primary-foreground min-w-32"
|
|
1836
|
+
>
|
|
1837
|
+
{loading ? (
|
|
1838
|
+
<div className="flex items-center gap-2">
|
|
1839
|
+
<LoadingSpinner size="sm" />
|
|
1840
|
+
Processing...
|
|
1841
|
+
</div>
|
|
1842
|
+
) : (
|
|
1843
|
+
'Submit Form'
|
|
1844
|
+
)}
|
|
1845
|
+
</Button>
|
|
1846
|
+
</Hover>
|
|
1847
|
+
);
|
|
1848
|
+
}
|
|
1849
|
+
```
|
|
1850
|
+
|
|
1851
|
+
---
|
|
1852
|
+
|
|
1853
|
+
## ✅❌ DOS AND DON'TS (UPDATED FOR NEW COMPONENTS)
|
|
1854
|
+
|
|
1855
|
+
### 🎯 **NEW COMPONENT USAGE**
|
|
1856
|
+
|
|
1857
|
+
#### ✅ DO - Enhanced Form Components
|
|
1858
|
+
```jsx
|
|
1859
|
+
<ValidatedInput
|
|
1860
|
+
type="email"
|
|
1861
|
+
required
|
|
1862
|
+
label="Email"
|
|
1863
|
+
value={email}
|
|
1864
|
+
onChange={setEmail}
|
|
1865
|
+
showPasswordStrength // For passwords
|
|
1866
|
+
/>
|
|
1867
|
+
|
|
1868
|
+
<FormActions
|
|
1869
|
+
submitText="Create Account"
|
|
1870
|
+
showCancel
|
|
1871
|
+
loading={isSubmitting}
|
|
1872
|
+
onCancel={() => router.back()}
|
|
1873
|
+
/>
|
|
1874
|
+
```
|
|
1875
|
+
|
|
1876
|
+
#### ❌ DON'T - Wrong Form Patterns
|
|
1877
|
+
```jsx
|
|
1878
|
+
// Don't use basic Input for validated forms
|
|
1879
|
+
<Input type="email" required /> // No validation feedback
|
|
1880
|
+
|
|
1881
|
+
// Don't create custom form actions
|
|
1882
|
+
<div className="flex gap-2">
|
|
1883
|
+
<button type="submit">Submit</button>
|
|
1884
|
+
</div> // Use FormActions instead
|
|
1885
|
+
```
|
|
1886
|
+
|
|
1887
|
+
#### ✅ DO - Motion Components
|
|
1888
|
+
```jsx
|
|
1889
|
+
<Motion preset="fadeIn" duration="normal">
|
|
1890
|
+
<Content />
|
|
1891
|
+
</Motion>
|
|
1892
|
+
|
|
1893
|
+
<Reveal preset="slideInUp">
|
|
1894
|
+
<Section />
|
|
1895
|
+
</Reveal>
|
|
1896
|
+
|
|
1897
|
+
<Hover effect="scale">
|
|
1898
|
+
<Card />
|
|
1899
|
+
</Hover>
|
|
1900
|
+
```
|
|
1901
|
+
|
|
1902
|
+
#### ❌ DON'T - Complex Animation Libraries
|
|
1903
|
+
```jsx
|
|
1904
|
+
import { motion } from 'framer-motion' // Use Motion instead
|
|
1905
|
+
import anime from 'animejs' // Use Motion instead
|
|
1906
|
+
className="animate-bounce" // Use Motion presets
|
|
1907
|
+
```
|
|
1908
|
+
|
|
1909
|
+
#### ✅ DO - DataTable Configuration
|
|
1910
|
+
```jsx
|
|
1911
|
+
<DataTable
|
|
1912
|
+
data={users}
|
|
1913
|
+
columns={columns}
|
|
1914
|
+
searchable
|
|
1915
|
+
filterable
|
|
1916
|
+
sortable
|
|
1917
|
+
pagination
|
|
1918
|
+
actions={rowActions}
|
|
1919
|
+
/>;
|
|
1920
|
+
|
|
1921
|
+
const columns = [
|
|
1922
|
+
{
|
|
1923
|
+
id: 'name',
|
|
1924
|
+
header: 'Name',
|
|
1925
|
+
accessorKey: 'name',
|
|
1926
|
+
sortable: true,
|
|
1927
|
+
filterable: true,
|
|
1928
|
+
filterType: 'text',
|
|
1929
|
+
},
|
|
1930
|
+
];
|
|
1931
|
+
```
|
|
1932
|
+
|
|
1933
|
+
#### ❌ DON'T - Basic Table for Complex Data
|
|
1934
|
+
```jsx
|
|
1935
|
+
<Table>
|
|
1936
|
+
<TableRow>
|
|
1937
|
+
<TableCell>{user.name}</TableCell>
|
|
1938
|
+
</TableRow>
|
|
1939
|
+
</Table> // Missing search, filter, pagination
|
|
1940
|
+
|
|
1941
|
+
<input placeholder="Search..." /> // Use DataTable's built-in search
|
|
1942
|
+
```
|
|
1943
|
+
|
|
1944
|
+
### 🔄 **COMPONENT SELECTION UPDATED**
|
|
1945
|
+
|
|
1946
|
+
#### ✅ DO - Choose Right Component for Task
|
|
1947
|
+
```jsx
|
|
1948
|
+
// Forms with validation → ValidatedInput
|
|
1949
|
+
<ValidatedInput type="email" required label="Email" />
|
|
1950
|
+
|
|
1951
|
+
// Search/filters → Input
|
|
1952
|
+
<Input placeholder="Search products..." />
|
|
1953
|
+
|
|
1954
|
+
// Complex tables → DataTable
|
|
1955
|
+
<DataTable data={users} columns={columns} searchable />
|
|
1956
|
+
|
|
1957
|
+
// Simple tables → Table
|
|
1958
|
+
<Table>
|
|
1959
|
+
<TableBody>
|
|
1960
|
+
<TableRow>...</TableRow>
|
|
1961
|
+
</TableBody>
|
|
1962
|
+
</Table>
|
|
1963
|
+
|
|
1964
|
+
// Page animations → Motion/Reveal
|
|
1965
|
+
<Motion preset="fadeIn"><Page /></Motion>
|
|
1966
|
+
|
|
1967
|
+
// Interactive elements → Hover
|
|
1968
|
+
<Hover effect="scale"><Button /></Hover>
|
|
1969
|
+
```
|
|
1970
|
+
|
|
1971
|
+
#### ❌ DON'T - Wrong Component Choice
|
|
1972
|
+
```jsx
|
|
1973
|
+
<Input required /> // Use ValidatedInput for forms
|
|
1974
|
+
<Table> + custom search/filter // Use DataTable for complex data
|
|
1975
|
+
<div className="animate-pulse"> // Use LoadingSpinner
|
|
1976
|
+
// Complex CSS animations // Use Motion components
|
|
1977
|
+
```
|
|
1978
|
+
|
|
1979
|
+
---
|
|
1980
|
+
|
|
1981
|
+
## 🚨 CRITICAL REMINDERS (UPDATED)
|
|
1982
|
+
|
|
1983
|
+
### 🎯 **Core Rules** (Never Break These)
|
|
1984
|
+
1. **✅ ALWAYS** import styles: `import '@bloomneo/uikit/styles'`
|
|
1985
|
+
2. **✅ ALWAYS** wrap in ThemeProvider: `<ThemeProvider theme="base">`
|
|
1986
|
+
3. **✅ ALWAYS** use semantic colors: `bg-background text-foreground`
|
|
1987
|
+
4. **✅ ALWAYS** use individual imports: `import { Button } from '@bloomneo/uikit/button'` (avoid barrel imports for tree-shaking)
|
|
1988
|
+
5. **✅ NEVER** use hardcoded colors: `bg-white text-black`
|
|
1989
|
+
6. **✅ COMPOUND** layouts need child components: `<AdminLayout><AdminLayout.Header/></AdminLayout>`
|
|
1990
|
+
7. **✅ SINGLE** layouts take direct children: `<AuthLayout><LoginForm/></AuthLayout>`
|
|
1991
|
+
8. **✅ FORMS** use ValidatedInput for validation: `<ValidatedInput required />`
|
|
1992
|
+
9. **✅ ANIMATIONS** use Motion components: `<Motion preset="fadeIn" />`
|
|
1993
|
+
10. **✅ TABLES** use DataTable for complex data: `<DataTable searchable filterable />`
|
|
1994
|
+
|
|
1995
|
+
### 🔍 **Quality Checklist** (Every Component)
|
|
1996
|
+
- [ ] File header with description and @module/@file
|
|
1997
|
+
- [ ] Correct component pattern (compound vs single)
|
|
1998
|
+
- [ ] Semantic colors only (no hardcoded colors)
|
|
1999
|
+
- [ ] Standard navigation structure (key + label)
|
|
2000
|
+
- [ ] Appropriate scheme/tone/size props
|
|
2001
|
+
- [ ] Individual imports (not barrel imports)
|
|
2002
|
+
- [ ] ValidatedInput for form validation
|
|
2003
|
+
- [ ] Motion components for animations
|
|
2004
|
+
- [ ] DataTable for complex data operations
|
|
2005
|
+
|
|
2006
|
+
### ⚡ **Success Factors** (High Quality Code)
|
|
2007
|
+
- **Consistency**: Uniform patterns across files
|
|
2008
|
+
- **Documentation**: Clear headers and comments
|
|
2009
|
+
- **Semantic Colors**: Theme-compatible styling
|
|
2010
|
+
- **Type Safety**: Proper TypeScript usage
|
|
2011
|
+
- **Performance**: Optimized imports for tree-shaking
|
|
2012
|
+
- **Validation**: Built-in form validation
|
|
2013
|
+
- **Animation**: Smooth, performant CSS animations
|
|
2014
|
+
- **Data Management**: Professional table features
|
|
2015
|
+
|
|
2016
|
+
---
|
|
2017
|
+
|
|
2018
|
+
## ✅ SUCCESS CHECKLIST (UPDATED)
|
|
2019
|
+
|
|
2020
|
+
### Required Setup
|
|
2021
|
+
- [ ] `import '@bloomneo/uikit/styles'` in root file
|
|
2022
|
+
- [ ] ThemeProvider setup in `main.tsx` (automatically included in templates)
|
|
2023
|
+
- [ ] Choose correct layout: AdminLayout/PageLayout/AuthLayout/BlankLayout/PopupLayout
|
|
2024
|
+
|
|
2025
|
+
### Component Patterns
|
|
2026
|
+
- [ ] Use compound pattern for AdminLayout & PageLayout (with .Header, .Content, etc.)
|
|
2027
|
+
- [ ] Use single pattern for AuthLayout, BlankLayout & PopupLayout (direct children)
|
|
2028
|
+
- [ ] Set appropriate scheme, tone, size props on all layouts
|
|
2029
|
+
|
|
2030
|
+
### NEW: Enhanced Components
|
|
2031
|
+
- [ ] Use ValidatedInput for forms requiring validation
|
|
2032
|
+
- [ ] Use Motion/Reveal/Hover for animations
|
|
2033
|
+
- [ ] Use DataTable for complex data operations
|
|
2034
|
+
- [ ] Use LoadingSpinner for loading states
|
|
2035
|
+
- [ ] Use FormActions for consistent form buttons
|
|
2036
|
+
|
|
2037
|
+
### Styling
|
|
2038
|
+
- [ ] Use ONLY semantic colors (bg-background, text-foreground, border-border)
|
|
2039
|
+
- [ ] NEVER use hardcoded colors (bg-white, text-black, border-gray-200)
|
|
2040
|
+
- [ ] Apply semantic classes to all UI components
|
|
2041
|
+
|
|
2042
|
+
### Navigation & Data
|
|
2043
|
+
- [ ] Structure navigation with required key + label properties
|
|
2044
|
+
- [ ] Configure DataTable columns with proper types and features
|
|
2045
|
+
- [ ] Implement onNavigate handler for routing integration
|
|
2046
|
+
- [ ] Use appropriate animation presets for user experience
|
|
2047
|
+
|
|
2048
|
+
### Integration & Testing
|
|
2049
|
+
- [ ] Connect to your routing system (React Router, Next.js, etc.)
|
|
2050
|
+
- [ ] Test form validation with ValidatedInput components
|
|
2051
|
+
- [ ] Test DataTable sorting, filtering, and pagination
|
|
2052
|
+
- [ ] Test animations and loading states
|
|
2053
|
+
- [ ] Verify responsive behavior on mobile/desktop
|
|
2054
|
+
|
|
2055
|
+
Following this complete guide ensures 100% successful UIKit implementation with all new enhanced components.
|