@krizaka/ui 3.29.0 → 3.31.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/README.md +4 -8
- package/dist/action-bar.js +3 -3
- package/dist/action-bar.js.map +1 -1
- package/dist/argument-card.d.ts +1 -1
- package/dist/argument-card.js +2 -2
- package/dist/argument-card.js.map +1 -1
- package/dist/blocks.css +19 -60
- package/dist/{button-BmCrLCq7.d.ts → button-Cm9pFH3P.d.ts} +10 -9
- package/dist/button.d.ts +11 -10
- package/dist/button.js +1 -1
- package/dist/captcha.js +1 -1
- package/dist/card-grid.d.ts +5 -12
- package/dist/card-grid.js +4 -12
- package/dist/card-grid.js.map +1 -1
- package/dist/card.d.ts +7 -7
- package/dist/card.js +2 -2
- package/dist/card.js.map +1 -1
- package/dist/{chunk-OUWPBSSL.js → chunk-2AJ4NJUF.js} +8 -9
- package/dist/chunk-2AJ4NJUF.js.map +1 -0
- package/dist/{chunk-MQPC3P4T.js → chunk-2DGLWTPS.js} +3 -3
- package/dist/chunk-2DGLWTPS.js.map +1 -0
- package/dist/{chunk-DZU6RMYD.js → chunk-3DHNN5V7.js} +15 -9
- package/dist/chunk-3DHNN5V7.js.map +1 -0
- package/dist/{chunk-TFJDIOFK.js → chunk-4E5IUZHR.js} +3 -3
- package/dist/chunk-4E5IUZHR.js.map +1 -0
- package/dist/{chunk-HAQWKORZ.js → chunk-4JO5GSSD.js} +1 -37
- package/dist/chunk-4JO5GSSD.js.map +1 -0
- package/dist/{chunk-APNIVNIX.js → chunk-IBDTAMPF.js} +3 -4
- package/dist/chunk-IBDTAMPF.js.map +1 -0
- package/dist/{chunk-LYOPPBMC.js → chunk-KIBICUZK.js} +2 -2
- package/dist/{chunk-HBZPJ3EP.js → chunk-NJFCSVPT.js} +2 -2
- package/dist/{chunk-KM6VAKIE.js → chunk-RE5WJ4QP.js} +2 -2
- package/dist/chunk-RE5WJ4QP.js.map +1 -0
- package/dist/{chunk-CHOJUCVE.js → chunk-SJS6RJIT.js} +15 -9
- package/dist/chunk-SJS6RJIT.js.map +1 -0
- package/dist/{chunk-6ZYRUOTA.js → chunk-UV4HBVH7.js} +15 -9
- package/dist/chunk-UV4HBVH7.js.map +1 -0
- package/dist/command.js +2 -2
- package/dist/confirm-button.d.ts +1 -1
- package/dist/confirm-button.js +1 -1
- package/dist/continue-prompt.js +14 -8
- package/dist/continue-prompt.js.map +1 -1
- package/dist/data-table.js +2 -2
- package/dist/dialog.js +2 -2
- package/dist/engine-flow.d.ts +25 -2
- package/dist/engine-flow.js +27 -6
- package/dist/engine-flow.js.map +1 -1
- package/dist/force-update-screen.js +2 -2
- package/dist/force-update-screen.js.map +1 -1
- package/dist/genui.js +3 -3
- package/dist/glow-card.d.ts +5 -4
- package/dist/glow-card.js +2 -8
- package/dist/glow-card.js.map +1 -1
- package/dist/image-cropper.js +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/iso.d.ts +1 -1
- package/dist/iso.js.map +1 -1
- package/dist/landscape.js +4 -4
- package/dist/landscape.js.map +1 -1
- package/dist/link-card.d.ts +3 -6
- package/dist/link-card.js +1 -1
- package/dist/maintenance-screen.js +1 -1
- package/dist/map.d.ts +50 -5
- package/dist/map.js +202 -66
- package/dist/map.js.map +1 -1
- package/dist/match-dialog.js +1 -1
- package/dist/media-gallery.js +1 -1
- package/dist/media-gallery.js.map +1 -1
- package/dist/media-grid.js +2 -2
- package/dist/motion.css +52 -122
- package/dist/motion.d.ts +2 -2
- package/dist/motion.js +1 -1
- package/dist/native/map.js +64 -64
- package/dist/native/map.js.map +1 -1
- package/dist/native.js +30 -30
- package/dist/native.js.map +1 -1
- package/dist/nav-bar.d.ts +12 -3
- package/dist/nav-bar.js +19 -12
- package/dist/nav-bar.js.map +1 -1
- package/dist/pointer-light.d.ts +6 -9
- package/dist/pointer-light.js +9 -5
- package/dist/pointer-light.js.map +1 -1
- package/dist/radio-group.js +2 -2
- package/dist/radio-group.js.map +1 -1
- package/dist/service-card.js +1 -1
- package/dist/service-card.js.map +1 -1
- package/dist/site-footer.d.ts +1 -1
- package/dist/site-footer.js +2 -2
- package/dist/{sites-CHp_vELn.d.ts → sites-B4prB793.d.ts} +2 -2
- package/dist/sites.d.ts +2 -2
- package/dist/sites.js +6 -7
- package/dist/sites.js.map +1 -1
- package/dist/slider.js +1 -1
- package/dist/slider.js.map +1 -1
- package/dist/story.css +5 -12
- package/dist/theme.d.ts +1 -1
- package/dist/theme.js +1 -1
- package/dist/update-prompt.js +2 -2
- package/dist/update-prompt.js.map +1 -1
- package/dist/vertical-video.js +1 -1
- package/dist/video-player.js +2 -2
- package/dist/video-player.js.map +1 -1
- package/package.json +5 -5
- package/registry/action-bar.json +1 -1
- package/registry/app-shell.json +4 -4
- package/registry/argument-card.json +7 -16
- package/registry/auth-layout.json +4 -4
- package/registry/button.json +20 -20
- package/registry/card-grid.json +21 -24
- package/registry/card.json +7 -7
- package/registry/component-page.json +2 -2
- package/registry/confirm-button.json +6 -6
- package/registry/contact-page.json +2 -2
- package/registry/cover-hero.json +3 -3
- package/registry/dashboard-layout.json +2 -2
- package/registry/detail-layout.json +4 -4
- package/registry/docs-hub-page.json +2 -2
- package/registry/empty-state.json +1 -1
- package/registry/engine-flow.json +74 -3
- package/registry/examples/app-shell/admin-console.js +1 -1
- package/registry/examples/app-shell/admin-console.tsx +1 -1
- package/registry/examples/app-shell/basic.js +1 -1
- package/registry/examples/app-shell/basic.tsx +1 -1
- package/registry/examples/app-shell/desktop.js +1 -1
- package/registry/examples/app-shell/desktop.tsx +1 -1
- package/registry/examples/app-shell/orochia-studio.js +1 -1
- package/registry/examples/app-shell/orochia-studio.tsx +1 -1
- package/registry/examples/argument-card/hover-quiet.js +1 -1
- package/registry/examples/argument-card/hover-quiet.tsx +1 -1
- package/registry/examples/auth-layout/onboarding.js +2 -2
- package/registry/examples/auth-layout/onboarding.tsx +2 -2
- package/registry/examples/auth-layout/sign-in.js +2 -2
- package/registry/examples/auth-layout/sign-in.tsx +2 -2
- package/registry/examples/auth-layout/verify.js +1 -1
- package/registry/examples/auth-layout/verify.tsx +1 -1
- package/registry/examples/avatar/native/presence.dark.png +0 -0
- package/registry/examples/avatar/native/presence.light.png +0 -0
- package/registry/examples/badge/native/tones.dark.png +0 -0
- package/registry/examples/badge/native/tones.light.png +0 -0
- package/registry/examples/button/native/disabled.dark.png +0 -0
- package/registry/examples/button/native/disabled.light.png +0 -0
- package/registry/examples/button/native/gradient.dark.png +0 -0
- package/registry/examples/button/native/gradient.light.png +0 -0
- package/registry/examples/button/native/icon-only.dark.png +0 -0
- package/registry/examples/button/native/icon-only.light.png +0 -0
- package/registry/examples/button/native/icon.dark.png +0 -0
- package/registry/examples/button/native/icon.light.png +0 -0
- package/registry/examples/button/native/loading.dark.png +0 -0
- package/registry/examples/button/native/loading.light.png +0 -0
- package/registry/examples/button/native/primary.dark.png +0 -0
- package/registry/examples/button/native/primary.light.png +0 -0
- package/registry/examples/button/native/sizes.dark.png +0 -0
- package/registry/examples/button/native/sizes.light.png +0 -0
- package/registry/examples/button/signature.js +2 -2
- package/registry/examples/button/signature.tsx +4 -4
- package/registry/examples/card/interactive-link.tsx +1 -1
- package/registry/examples/card/native/body.dark.png +0 -0
- package/registry/examples/card/native/body.light.png +0 -0
- package/registry/examples/card/native/default.dark.png +0 -0
- package/registry/examples/card/native/default.light.png +0 -0
- package/registry/examples/card/native/elevated.dark.png +0 -0
- package/registry/examples/card/native/elevated.light.png +0 -0
- package/registry/examples/card-grid/hover-quiet.js +1 -1
- package/registry/examples/card-grid/hover-quiet.tsx +1 -1
- package/registry/examples/chat/native/assistant.dark.png +0 -0
- package/registry/examples/chat/native/assistant.light.png +0 -0
- package/registry/examples/chat/native/conversation.dark.png +0 -0
- package/registry/examples/chat/native/conversation.light.png +0 -0
- package/registry/examples/chat/native/inbox.dark.png +0 -0
- package/registry/examples/chat/native/inbox.light.png +0 -0
- package/registry/examples/checkbox/native/terms.dark.png +0 -0
- package/registry/examples/checkbox/native/terms.light.png +0 -0
- package/registry/examples/chip/native/multiple.dark.png +0 -0
- package/registry/examples/chip/native/multiple.light.png +0 -0
- package/registry/examples/chip/native/single.dark.png +0 -0
- package/registry/examples/chip/native/single.light.png +0 -0
- package/registry/examples/chip/native/toggle.dark.png +0 -0
- package/registry/examples/chip/native/toggle.light.png +0 -0
- package/registry/examples/component-page/button.js +2 -2
- package/registry/examples/component-page/button.tsx +2 -2
- package/registry/examples/contact-page/team.js +1 -1
- package/registry/examples/contact-page/team.tsx +1 -1
- package/registry/examples/cover-hero/plain.js +1 -1
- package/registry/examples/cover-hero/plain.tsx +1 -1
- package/registry/examples/cover-hero/shop.js +1 -1
- package/registry/examples/cover-hero/shop.tsx +1 -1
- package/registry/examples/dashboard-layout/orazaka-eric.js +2 -2
- package/registry/examples/dashboard-layout/orazaka-eric.tsx +2 -2
- package/registry/examples/date-picker/native/calendar.dark.png +0 -0
- package/registry/examples/date-picker/native/calendar.light.png +0 -0
- package/registry/examples/date-picker/native/day-strip.dark.png +0 -0
- package/registry/examples/date-picker/native/day-strip.light.png +0 -0
- package/registry/examples/date-picker/native/month-year.dark.png +0 -0
- package/registry/examples/date-picker/native/month-year.light.png +0 -0
- package/registry/examples/date-picker/native/time-slots.dark.png +0 -0
- package/registry/examples/date-picker/native/time-slots.light.png +0 -0
- package/registry/examples/description-list/native/job-details.dark.png +0 -0
- package/registry/examples/description-list/native/job-details.light.png +0 -0
- package/registry/examples/detail-layout/checkout.js +1 -1
- package/registry/examples/detail-layout/checkout.tsx +1 -1
- package/registry/examples/detail-layout/job.js +1 -1
- package/registry/examples/detail-layout/job.tsx +1 -1
- package/registry/examples/detail-layout/video.js +2 -2
- package/registry/examples/detail-layout/video.tsx +2 -2
- package/registry/examples/dialog/native/sheet.dark.png +0 -0
- package/registry/examples/dialog/native/sheet.light.png +0 -0
- package/registry/examples/docs-hub-page/krizaka.js +1 -1
- package/registry/examples/docs-hub-page/krizaka.tsx +1 -1
- package/registry/examples/empty-state/library.js +1 -1
- package/registry/examples/empty-state/library.tsx +1 -1
- package/registry/examples/empty-state/native/default.dark.png +0 -0
- package/registry/examples/empty-state/native/default.light.png +0 -0
- package/registry/examples/fab/native/extended.dark.png +0 -0
- package/registry/examples/fab/native/extended.light.png +0 -0
- package/registry/examples/force-update-screen/native/default.dark.png +0 -0
- package/registry/examples/force-update-screen/native/default.light.png +0 -0
- package/registry/examples/form/native/amount.dark.png +0 -0
- package/registry/examples/form/native/amount.light.png +0 -0
- package/registry/examples/form/native/audience.dark.png +0 -0
- package/registry/examples/form/native/audience.light.png +0 -0
- package/registry/examples/form/native/profile.dark.png +0 -0
- package/registry/examples/form/native/profile.light.png +0 -0
- package/registry/examples/form/native/settings.dark.png +0 -0
- package/registry/examples/form/native/settings.light.png +0 -0
- package/registry/examples/form/native/sign-up.dark.png +0 -0
- package/registry/examples/form/native/sign-up.light.png +0 -0
- package/registry/examples/form/native/upload.dark.png +0 -0
- package/registry/examples/form/native/upload.light.png +0 -0
- package/registry/examples/glow-card/spotlight.tsx +1 -1
- package/registry/examples/goal-gauge/native/default.dark.png +0 -0
- package/registry/examples/goal-gauge/native/default.light.png +0 -0
- package/registry/examples/landing-page/krizaka.js +3 -3
- package/registry/examples/landing-page/krizaka.tsx +3 -3
- package/registry/examples/link-card/hover-quiet.js +1 -1
- package/registry/examples/link-card/hover-quiet.tsx +1 -1
- package/registry/examples/loader/native/block.dark.png +0 -0
- package/registry/examples/loader/native/block.light.png +0 -0
- package/registry/examples/map/native/location-picker.dark.png +0 -0
- package/registry/examples/map/native/location-picker.light.png +0 -0
- package/registry/examples/map/route.js +36 -0
- package/registry/examples/map/route.tsx +35 -0
- package/registry/examples/marketing-layout/pricing.js +1 -1
- package/registry/examples/marketing-layout/pricing.tsx +1 -1
- package/registry/examples/marketing-layout/product-page.js +1 -1
- package/registry/examples/marketing-layout/product-page.tsx +2 -2
- package/registry/examples/mascot-state/native/default.dark.png +0 -0
- package/registry/examples/mascot-state/native/default.light.png +0 -0
- package/registry/examples/mascots/native/crane.dark.png +0 -0
- package/registry/examples/mascots/native/crane.light.png +0 -0
- package/registry/examples/mascots/native/default.dark.png +0 -0
- package/registry/examples/mascots/native/default.light.png +0 -0
- package/registry/examples/mascots/native/lovebird.dark.png +0 -0
- package/registry/examples/mascots/native/lovebird.light.png +0 -0
- package/registry/examples/mascots/native/phoenix.dark.png +0 -0
- package/registry/examples/mascots/native/phoenix.light.png +0 -0
- package/registry/examples/match-dialog/native/its-a-match.dark.png +0 -0
- package/registry/examples/match-dialog/native/its-a-match.light.png +0 -0
- package/registry/examples/media-capture/native/photo.dark.png +0 -0
- package/registry/examples/media-capture/native/photo.light.png +0 -0
- package/registry/examples/meta-row/native/video.dark.png +0 -0
- package/registry/examples/meta-row/native/video.light.png +0 -0
- package/registry/examples/meter/native/credits.dark.png +0 -0
- package/registry/examples/meter/native/credits.light.png +0 -0
- package/registry/examples/meter/native/split-ring.dark.png +0 -0
- package/registry/examples/meter/native/split-ring.light.png +0 -0
- package/registry/examples/nav-bar/family-product.js +1 -1
- package/registry/examples/nav-bar/family-product.tsx +1 -1
- package/registry/examples/onboarding/native/first-launch.dark.png +0 -0
- package/registry/examples/onboarding/native/first-launch.light.png +0 -0
- package/registry/examples/permission-prompt/native/blocked.dark.png +0 -0
- package/registry/examples/permission-prompt/native/blocked.light.png +0 -0
- package/registry/examples/permission-prompt/native/camera.dark.png +0 -0
- package/registry/examples/permission-prompt/native/camera.light.png +0 -0
- package/registry/examples/photo-grid/native/profile-photos.dark.png +0 -0
- package/registry/examples/photo-grid/native/profile-photos.light.png +0 -0
- package/registry/examples/pricing-page/credits.js +3 -3
- package/registry/examples/pricing-page/credits.tsx +3 -3
- package/registry/examples/product-page/orazaka.js +2 -2
- package/registry/examples/product-page/orazaka.tsx +2 -2
- package/registry/examples/profile-card/native/default.dark.png +0 -0
- package/registry/examples/profile-card/native/default.light.png +0 -0
- package/registry/examples/progress/native/bar.dark.png +0 -0
- package/registry/examples/progress/native/bar.light.png +0 -0
- package/registry/examples/progress/native/indeterminate.dark.png +0 -0
- package/registry/examples/progress/native/indeterminate.light.png +0 -0
- package/registry/examples/progress/native/ring.dark.png +0 -0
- package/registry/examples/progress/native/ring.light.png +0 -0
- package/registry/examples/radio-group/native/buttons.dark.png +0 -0
- package/registry/examples/radio-group/native/buttons.light.png +0 -0
- package/registry/examples/radio-group/native/cards.dark.png +0 -0
- package/registry/examples/radio-group/native/cards.light.png +0 -0
- package/registry/examples/radio-group/native/list.dark.png +0 -0
- package/registry/examples/radio-group/native/list.light.png +0 -0
- package/registry/examples/screen/native/auth.dark.png +0 -0
- package/registry/examples/screen/native/auth.light.png +0 -0
- package/registry/examples/screen/native/chat.dark.png +0 -0
- package/registry/examples/screen/native/chat.light.png +0 -0
- package/registry/examples/screen/native/profile.dark.png +0 -0
- package/registry/examples/screen/native/profile.light.png +0 -0
- package/registry/examples/screen/native/settings.dark.png +0 -0
- package/registry/examples/screen/native/settings.light.png +0 -0
- package/registry/examples/search-field/native/cancel.dark.png +0 -0
- package/registry/examples/search-field/native/cancel.light.png +0 -0
- package/registry/examples/settings-layout/account.js +1 -1
- package/registry/examples/settings-layout/account.tsx +1 -1
- package/registry/examples/settings-layout/native/account.dark.png +0 -0
- package/registry/examples/settings-layout/native/account.light.png +0 -0
- package/registry/examples/settings-layout/sections.js +1 -1
- package/registry/examples/settings-layout/sections.tsx +1 -1
- package/registry/examples/showcase/native/slides.dark.png +0 -0
- package/registry/examples/showcase/native/slides.light.png +0 -0
- package/registry/examples/slider/native/default.dark.png +0 -0
- package/registry/examples/slider/native/default.light.png +0 -0
- package/registry/examples/slider/native/range.dark.png +0 -0
- package/registry/examples/slider/native/range.light.png +0 -0
- package/registry/examples/slider/native/stepped.dark.png +0 -0
- package/registry/examples/slider/native/stepped.light.png +0 -0
- package/registry/examples/slider/native/vertical.dark.png +0 -0
- package/registry/examples/slider/native/vertical.light.png +0 -0
- package/registry/examples/spinner/native/sizes.dark.png +0 -0
- package/registry/examples/spinner/native/sizes.light.png +0 -0
- package/registry/examples/split-view/messages.js +1 -1
- package/registry/examples/split-view/messages.tsx +1 -1
- package/registry/examples/status-page/building.js +1 -1
- package/registry/examples/status-page/building.tsx +1 -1
- package/registry/examples/step-progress/native/sign-up.dark.png +0 -0
- package/registry/examples/step-progress/native/sign-up.light.png +0 -0
- package/registry/examples/stepper/native/run.dark.png +0 -0
- package/registry/examples/stepper/native/run.light.png +0 -0
- package/registry/examples/sticky-action/phone.js +1 -1
- package/registry/examples/sticky-action/phone.tsx +1 -1
- package/registry/examples/switch/native/default.dark.png +0 -0
- package/registry/examples/switch/native/default.light.png +0 -0
- package/registry/examples/switch/native/settings.dark.png +0 -0
- package/registry/examples/switch/native/settings.light.png +0 -0
- package/registry/examples/tab-bar/native/main-sections.dark.png +0 -0
- package/registry/examples/tab-bar/native/main-sections.light.png +0 -0
- package/registry/examples/tabs/native/sections.dark.png +0 -0
- package/registry/examples/tabs/native/sections.light.png +0 -0
- package/registry/examples/tag-selector/native/interests.dark.png +0 -0
- package/registry/examples/tag-selector/native/interests.light.png +0 -0
- package/registry/examples/toast/native/snackbar.dark.png +0 -0
- package/registry/examples/toast/native/snackbar.light.png +0 -0
- package/registry/examples/toast/native/tones.dark.png +0 -0
- package/registry/examples/toast/native/tones.light.png +0 -0
- package/registry/examples/txt/native/tones.dark.png +0 -0
- package/registry/examples/txt/native/tones.light.png +0 -0
- package/registry/examples/update-prompt/native/default.dark.png +0 -0
- package/registry/examples/update-prompt/native/default.light.png +0 -0
- package/registry/examples/verified-badge/native/verified.dark.png +0 -0
- package/registry/examples/verified-badge/native/verified.light.png +0 -0
- package/registry/examples/vertical-video/native/rail.dark.png +0 -0
- package/registry/examples/vertical-video/native/rail.light.png +0 -0
- package/registry/examples/waveform/native/card.dark.png +0 -0
- package/registry/examples/waveform/native/card.light.png +0 -0
- package/registry/force-update-screen.json +1 -1
- package/registry/form.json +6 -6
- package/registry/glow-card.json +19 -19
- package/registry/index.json +20 -21
- package/registry/iso.json +7 -7
- package/registry/landing-page.json +2 -2
- package/registry/landscape.json +1 -1
- package/registry/link-card.json +15 -24
- package/registry/map.json +235 -6
- package/registry/marketing-layout.json +3 -3
- package/registry/media-gallery.json +1 -1
- package/registry/nav-bar.json +32 -4
- package/registry/pointer-light.json +17 -22
- package/registry/pricing-page.json +2 -2
- package/registry/product-page.json +2 -2
- package/registry/progress.json +2 -2
- package/registry/radio-group.json +1 -1
- package/registry/rail-nav.json +2 -2
- package/registry/service-card.json +1 -1
- package/registry/settings-layout.json +3 -3
- package/registry/site-footer.json +2 -2
- package/registry/sites.json +1 -1
- package/registry/slider.json +1 -1
- package/registry/split-view.json +2 -2
- package/registry/status-page.json +1 -1
- package/registry/sticky-action.json +2 -2
- package/registry/update-prompt.json +1 -1
- package/registry/video-player.json +1 -1
- package/dist/chunk-6ZYRUOTA.js.map +0 -1
- package/dist/chunk-AB5D3KBG.js +0 -37
- package/dist/chunk-AB5D3KBG.js.map +0 -1
- package/dist/chunk-APNIVNIX.js.map +0 -1
- package/dist/chunk-CHOJUCVE.js.map +0 -1
- package/dist/chunk-DZU6RMYD.js.map +0 -1
- package/dist/chunk-HAQWKORZ.js.map +0 -1
- package/dist/chunk-KM6VAKIE.js.map +0 -1
- package/dist/chunk-MQPC3P4T.js.map +0 -1
- package/dist/chunk-OUWPBSSL.js.map +0 -1
- package/dist/chunk-TFJDIOFK.js.map +0 -1
- package/registry/examples/argument-card/hover-light.js +0 -17
- package/registry/examples/argument-card/hover-light.tsx +0 -19
- package/registry/examples/link-card/hover-light.d.ts +0 -4
- package/registry/examples/link-card/hover-light.js +0 -18
- package/registry/examples/link-card/hover-light.tsx +0 -20
- /package/dist/{chunk-LYOPPBMC.js.map → chunk-KIBICUZK.js.map} +0 -0
- /package/dist/{chunk-HBZPJ3EP.js.map → chunk-NJFCSVPT.js.map} +0 -0
- /package/registry/examples/{argument-card/hover-light.d.ts → map/route.d.ts} +0 -0
package/registry/card-grid.json
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
"name": "card-grid",
|
|
3
3
|
"type": "primitive",
|
|
4
4
|
"title": "Card grid",
|
|
5
|
-
"summary": "A responsive grid of cards: as many columns as the width allows (one on a phone), the cells of a row at one height, a staggered reveal
|
|
6
|
-
"description": "A responsive grid of cards: as many columns as the width allows (one on a phone), the cells of a row at one height, a staggered reveal
|
|
5
|
+
"summary": "A responsive grid of cards: as many columns as the width allows (one on a phone), the cells of a row at one height, a staggered reveal; each card keeps its own quiet hover.",
|
|
6
|
+
"description": "A responsive grid of cards: as many columns as the width allows (one on a phone), the cells of a row at one height, a staggered reveal; each card keeps its own quiet hover.",
|
|
7
7
|
"status": "beta",
|
|
8
8
|
"deprecated": null,
|
|
9
9
|
"category": "blocks",
|
|
@@ -42,21 +42,19 @@
|
|
|
42
42
|
"Keep `reveal` on below the first screen, off on it; `columns` makes the stagger restart on each row.",
|
|
43
43
|
"The default `align=\"stretch\"` gives a row one height; the cards pin their foot to the bottom (`LinkCard` facts + way in, `ArgumentCard` actions) so the footers line up. `align=\"start\"` for cards that unfold.",
|
|
44
44
|
"`as=\"ul\"` when the cards are a list of links.",
|
|
45
|
-
"`hover=\"quiet\"` quiets every card of the grid (no glow, a 2 px lift, a ring on focus); a card may still say `hover=\"light\"`.",
|
|
46
45
|
"`foundation` when one thing (an engine, a platform) carries all the others: it takes its own card, wide, above (`foundationPosition=\"end\"` for under), and the cards sit in a hairline frame joined to it. Say the relation with `foundationLabel`; set the hue on `className`."
|
|
47
46
|
],
|
|
48
47
|
"accessibility": {
|
|
49
48
|
"keyboard": [],
|
|
50
49
|
"notes": [
|
|
51
50
|
"The grid adds no role; `as=\"ul\"` makes it a list (each cell an `li`).",
|
|
52
|
-
"
|
|
51
|
+
"Nothing follows the pointer: `light` and `hover` are deprecated since 3.31 (krizaka-ui#393) and do nothing.",
|
|
53
52
|
"Revealed cells are only hidden visually until they enter the viewport; under reduced motion they never move."
|
|
54
53
|
]
|
|
55
54
|
},
|
|
56
55
|
"related": [
|
|
57
56
|
"link-card",
|
|
58
|
-
"argument-card"
|
|
59
|
-
"pointer-light"
|
|
57
|
+
"argument-card"
|
|
60
58
|
],
|
|
61
59
|
"web": {
|
|
62
60
|
"entry": "@krizaka/ui/card-grid",
|
|
@@ -64,7 +62,7 @@
|
|
|
64
62
|
"props": [
|
|
65
63
|
{
|
|
66
64
|
"component": "CardGrid",
|
|
67
|
-
"description": "A responsive grid of cards: equal rows, a staggered reveal
|
|
65
|
+
"description": "A responsive grid of cards: equal rows, a staggered reveal.",
|
|
68
66
|
"props": [
|
|
69
67
|
{
|
|
70
68
|
"name": "children",
|
|
@@ -125,15 +123,15 @@
|
|
|
125
123
|
{
|
|
126
124
|
"name": "hover",
|
|
127
125
|
"type": "CardHover",
|
|
128
|
-
"default":
|
|
129
|
-
"description": "
|
|
126
|
+
"default": null,
|
|
127
|
+
"description": "@deprecated Since 3.31 (krizaka-ui#393): does nothing — every card has the one quiet hover. Removed in 4.0.",
|
|
130
128
|
"required": false
|
|
131
129
|
},
|
|
132
130
|
{
|
|
133
131
|
"name": "light",
|
|
134
132
|
"type": "boolean",
|
|
135
|
-
"default":
|
|
136
|
-
"description": "
|
|
133
|
+
"default": null,
|
|
134
|
+
"description": "@deprecated Since 3.31 (krizaka-ui#393): does nothing — no light follows the pointer. Removed in 4.0.",
|
|
137
135
|
"required": false
|
|
138
136
|
},
|
|
139
137
|
{
|
|
@@ -188,11 +186,11 @@
|
|
|
188
186
|
},
|
|
189
187
|
{
|
|
190
188
|
"name": "hover-quiet",
|
|
191
|
-
"title": "
|
|
192
|
-
"description": "
|
|
189
|
+
"title": "The hover",
|
|
190
|
+
"description": "The grid adds no hover: each card's surface and hairline go one step up, a ring on focus.",
|
|
193
191
|
"path": "examples/card-grid/hover-quiet.tsx",
|
|
194
192
|
"module": "@krizaka/ui/registry/examples/card-grid/hover-quiet",
|
|
195
|
-
"code": "import { ProductLogo } from \"@krizaka/ui\";\nimport { CardGrid } from \"@krizaka/ui/card-grid\";\nimport { LinkCard } from \"@krizaka/ui/link-card\";\n\nconst shortcuts = [\n { id: \"cli\", logo: \"orazaka\", title: \"The CLI\", text: \"npx orazaka install, start, dev — then every command and option.\" },\n { id: \"packs\", logo: \"orazaka\", title: \"Packs & Studios\", text: \"The business offers Orazaka installs without code.\" },\n { id: \"admin\", logo: \"orochia\", title: \"Orochia admin console\", text: \"Verification, moderation, payouts — behind four gates.\" },\n] as const;\n\n// A whole grid quiet: `hover=\"quiet\"` on the grid, the cards inherit it (a card can still say `hover=\"light\"`).\nexport default function CardGridHoverQuiet() {\n return (\n <CardGrid className=\"w-full max-w-4xl\" min={260} reveal={false}
|
|
193
|
+
"code": "import { ProductLogo } from \"@krizaka/ui\";\nimport { CardGrid } from \"@krizaka/ui/card-grid\";\nimport { LinkCard } from \"@krizaka/ui/link-card\";\n\nconst shortcuts = [\n { id: \"cli\", logo: \"orazaka\", title: \"The CLI\", text: \"npx orazaka install, start, dev — then every command and option.\" },\n { id: \"packs\", logo: \"orazaka\", title: \"Packs & Studios\", text: \"The business offers Orazaka installs without code.\" },\n { id: \"admin\", logo: \"orochia\", title: \"Orochia admin console\", text: \"Verification, moderation, payouts — behind four gates.\" },\n] as const;\n\n// A whole grid quiet: `hover=\"quiet\"` on the grid, the cards inherit it (a card can still say `hover=\"light\"`).\nexport default function CardGridHoverQuiet() {\n return (\n <CardGrid className=\"w-full max-w-4xl\" min={260} reveal={false}>\n {shortcuts.map((s) => (\n <LinkCard key={s.id} href={`#${s.id}`} icon={<ProductLogo id={s.logo} size={24} animated={false} />} title={s.title} description={s.text} cta=\"Open\" />\n ))}\n </CardGrid>\n );\n}\n"
|
|
196
194
|
}
|
|
197
195
|
]
|
|
198
196
|
},
|
|
@@ -200,15 +198,15 @@
|
|
|
200
198
|
"files": [
|
|
201
199
|
{
|
|
202
200
|
"path": "card-grid/card-grid.tsx",
|
|
203
|
-
"content": "//
|
|
201
|
+
"content": "// A responsive grid of cards (blocks.css): one column on a phone, the cells of a row share their height, each card rises\n// once as it enters the viewport — staggered by column. The hover is the cards' own quiet one (krizaka-ui#393).\nimport * as React from \"react\";\n\nimport { cn } from \"../cn\";\nimport type { CardHover } from \"../link-card/link-card\";\n\nconst STEP_MS = 70;\n\nexport type CardGridProps = Omit<React.HTMLAttributes<HTMLElement>, \"children\"> & {\n /** The cards: one cell each. */\n children: React.ReactNode;\n /**\n * The narrowest a column may be, in pixels: the grid fits as many columns as the width allows.\n * @default 300\n */\n min?: number;\n /**\n * `fill` keeps empty tracks (a lone card keeps its width); `fit` stretches the cards of a short row across the width.\n * @default \"fill\"\n */\n fit?: \"fill\" | \"fit\";\n /**\n * `stretch` gives the cells of a row one height; `start` lets each card keep its own (cards that open a panel).\n * @default \"stretch\"\n */\n align?: \"stretch\" | \"start\";\n /**\n * The cards rise once into place (`[data-reveal]`, MotionObserver), staggered by column. `false` on the first screen.\n * @default true\n */\n reveal?: boolean;\n /**\n * The columns the stagger counts (the delay restarts on every row).\n * @default 3\n */\n columns?: number;\n /** @deprecated Since 3.31 (krizaka-ui#393): does nothing — no light follows the pointer. Removed in 4.0. */\n light?: boolean;\n /** `ul` when the cards are a list (each cell an `li`). */\n as?: \"div\" | \"ul\" | \"ol\";\n /**\n * A foundation: one wide card that the cards of the grid stand on (an engine, a platform, a shared service). It spans\n * the full width beside the grid, and a hairline joins it to a frame around the cards — \"everything inside runs on it\".\n * The frame takes the hue of `className` (a `data-hue` or a brand class on the grid sets it for the whole block).\n */\n foundation?: React.ReactNode;\n /**\n * Where the foundation sits: above the cards, or under them.\n * @default \"start\"\n */\n foundationPosition?: \"start\" | \"end\";\n /** A short mono label on the frame's edge, naming the relation (`Powered by Orazaka`). Only with `foundation`. */\n foundationLabel?: React.ReactNode;\n /** @deprecated Since 3.31 (krizaka-ui#393): does nothing — every card has the one quiet hover. Removed in 4.0. */\n hover?: CardHover;\n};\n\n/** A responsive grid of cards: equal rows, a staggered reveal. */\nexport function CardGrid({\n children,\n min = 300,\n fit = \"fill\",\n align = \"stretch\",\n reveal = true,\n columns = 3,\n light: _light,\n as: Tag = \"div\",\n foundation,\n foundationPosition = \"start\",\n foundationLabel,\n hover: _hover,\n className,\n style,\n ...props\n}: CardGridProps) {\n const Cell = Tag === \"div\" ? \"div\" : \"li\";\n const grid = (\n <Tag\n className={cn(\"kz-cards\", !foundation && className)}\n data-fit={fit === \"fit\" ? \"\" : undefined}\n data-align={align === \"start\" ? \"start\" : undefined}\n style={{ \"--kz-cards-min\": `${min}px`, ...(foundation ? null : style) } as React.CSSProperties}\n {...props}\n >\n {React.Children.toArray(children).map((child, i) => {\n const step = Math.min(i % Math.max(columns, 1), 5);\n return (\n <Cell\n key={React.isValidElement(child) && child.key != null ? child.key : i}\n className=\"kz-cards-cell\"\n data-reveal={reveal ? \"\" : undefined}\n style={reveal && step ? ({ \"--kz-delay\": `${step * STEP_MS}ms` } as React.CSSProperties) : undefined}\n >\n {child}\n </Cell>\n );\n })}\n </Tag>\n );\n if (!foundation) return grid;\n return (\n <div className={cn(\"kz-foundation\", className)} data-position={foundationPosition} style={style}>\n <div className=\"kz-foundation-base\" data-reveal={reveal ? \"\" : undefined}>\n {foundation}\n </div>\n <div className=\"kz-foundation-group\">\n {foundationLabel && <span className=\"kz-foundation-label\">{foundationLabel}</span>}\n {grid}\n </div>\n </div>\n );\n}\n\n"
|
|
204
202
|
},
|
|
205
203
|
{
|
|
206
204
|
"path": "card-grid/index.ts",
|
|
207
|
-
"content": "/** @krizaka/ui/card-grid — `CardGrid`: a responsive grid of cards, a staggered reveal, the
|
|
205
|
+
"content": "/** @krizaka/ui/card-grid — `CardGrid`: a responsive grid of cards, a staggered reveal, the cards' quiet hover. Client. */\nexport { CardGrid, type CardGridProps } from \"./card-grid\";\n"
|
|
208
206
|
},
|
|
209
207
|
{
|
|
210
208
|
"path": "card-grid/meta.ts",
|
|
211
|
-
"content": "import type { ComponentMeta } from \"../meta\";\n\nexport const meta = {\n title: \"Card grid\",\n summary:\n \"A responsive grid of cards: as many columns as the width allows (one on a phone), the cells of a row at one height, a staggered reveal
|
|
209
|
+
"content": "import type { ComponentMeta } from \"../meta\";\n\nexport const meta = {\n title: \"Card grid\",\n summary:\n \"A responsive grid of cards: as many columns as the width allows (one on a phone), the cells of a row at one height, a staggered reveal; each card keeps its own quiet hover.\",\n status: \"beta\",\n category: \"blocks\",\n platforms: \"web\",\n parity: { native: { status: \"n/a\", reason: \"A block of a public site's page; an app screen on a phone is built from Screen, Header and Card.\", use: \"card\" }, desktop: { status: \"n/a\", reason: \"A public site's page, not a window of the Mac app.\" } },\n whenToUse: [\n \"Entry points of a hub (`LinkCard`), the reasons of a product page (`ArgumentCard`), plans, products.\",\n \"Any set of peer cards that should read as one group with one rhythm.\",\n ],\n whenNotToUse: [\n { when: \"For a sequence the reader follows in order.\", use: \"stepper\" },\n { when: \"For rows of data to compare or sort.\", use: \"data-table\" },\n ],\n bestPractices: [\n \"Set `min` to the narrowest a card still reads well; the grid does the rest at every width.\",\n \"`fit=\\\"fit\\\"` for two or three cards that should share the whole width; `fill` keeps a lone card at its size.\",\n \"Keep `reveal` on below the first screen, off on it; `columns` makes the stagger restart on each row.\",\n \"The default `align=\\\"stretch\\\"` gives a row one height; the cards pin their foot to the bottom (`LinkCard` facts + way in, `ArgumentCard` actions) so the footers line up. `align=\\\"start\\\"` for cards that unfold.\",\n \"`as=\\\"ul\\\"` when the cards are a list of links.\",\n \"`foundation` when one thing (an engine, a platform) carries all the others: it takes its own card, wide, above (`foundationPosition=\\\"end\\\"` for under), and the cards sit in a hairline frame joined to it. Say the relation with `foundationLabel`; set the hue on `className`.\",\n ],\n accessibility: {\n keyboard: [],\n notes: [\n \"The grid adds no role; `as=\\\"ul\\\"` makes it a list (each cell an `li`).\",\n \"Nothing follows the pointer: `light` and `hover` are deprecated since 3.31 (krizaka-ui#393) and do nothing.\",\n \"Revealed cells are only hidden visually until they enter the viewport; under reduced motion they never move.\",\n ],\n },\n related: [\"link-card\", \"argument-card\"],\n web: {\n imports: [\"CardGrid\"],\n examples: [\n { name: \"products\", title: \"Two halves\", description: \"`fit=\\\"fit\\\"`: two cards share the whole width.\" },\n { name: \"aligned\", title: \"An aligned row\", description: \"Cards with sentences of different lengths: one height, and the facts and the way in of every card on the same line.\" },\n { name: \"foundation\", title: \"A foundation\", description: \"`foundation`: one wide card the others stand on, a hairline to a frame around them.\" },\n { name: \"reveal\", title: \"A list of sections\", description: \"`as=\\\"ul\\\"`, six links that rise staggered by column on a real page.\" },\n { name: \"hover-quiet\", title: \"The hover\", description: \"The grid adds no hover: each card's surface and hairline go one step up, a ring on focus.\" },\n ],\n },\n} satisfies ComponentMeta;\n"
|
|
212
210
|
},
|
|
213
211
|
{
|
|
214
212
|
"path": "meta.ts",
|
|
@@ -218,8 +216,7 @@
|
|
|
218
216
|
"dependencies": [],
|
|
219
217
|
"registryDependencies": [
|
|
220
218
|
"cn",
|
|
221
|
-
"link-card"
|
|
222
|
-
"pointer-light"
|
|
219
|
+
"link-card"
|
|
223
220
|
],
|
|
224
221
|
"demo": {
|
|
225
222
|
"path": "examples/card-grid/products.tsx",
|
|
@@ -228,7 +225,7 @@
|
|
|
228
225
|
"props": [
|
|
229
226
|
{
|
|
230
227
|
"component": "CardGrid",
|
|
231
|
-
"description": "A responsive grid of cards: equal rows, a staggered reveal
|
|
228
|
+
"description": "A responsive grid of cards: equal rows, a staggered reveal.",
|
|
232
229
|
"props": [
|
|
233
230
|
{
|
|
234
231
|
"name": "children",
|
|
@@ -289,15 +286,15 @@
|
|
|
289
286
|
{
|
|
290
287
|
"name": "hover",
|
|
291
288
|
"type": "CardHover",
|
|
292
|
-
"default":
|
|
293
|
-
"description": "
|
|
289
|
+
"default": null,
|
|
290
|
+
"description": "@deprecated Since 3.31 (krizaka-ui#393): does nothing — every card has the one quiet hover. Removed in 4.0.",
|
|
294
291
|
"required": false
|
|
295
292
|
},
|
|
296
293
|
{
|
|
297
294
|
"name": "light",
|
|
298
295
|
"type": "boolean",
|
|
299
|
-
"default":
|
|
300
|
-
"description": "
|
|
296
|
+
"default": null,
|
|
297
|
+
"description": "@deprecated Since 3.31 (krizaka-ui#393): does nothing — no light follows the pointer. Removed in 4.0.",
|
|
301
298
|
"required": false
|
|
302
299
|
},
|
|
303
300
|
{
|
package/registry/card.json
CHANGED
|
@@ -82,7 +82,7 @@
|
|
|
82
82
|
"name": "interactive",
|
|
83
83
|
"type": "boolean",
|
|
84
84
|
"default": null,
|
|
85
|
-
"description": "The
|
|
85
|
+
"description": "The quiet hover — the hairline and the surface one step up, nothing moves (krizaka-ui#393): for a card that is a link.",
|
|
86
86
|
"required": false
|
|
87
87
|
},
|
|
88
88
|
{
|
|
@@ -221,10 +221,10 @@
|
|
|
221
221
|
{
|
|
222
222
|
"name": "interactive-link",
|
|
223
223
|
"title": "Interactive link",
|
|
224
|
-
"description": "`asChild` + `<a>`: the whole card is a link
|
|
224
|
+
"description": "`asChild` + `<a>`: the whole card is a link; its hairline and surface go one step up under the pointer.",
|
|
225
225
|
"path": "examples/card/interactive-link.tsx",
|
|
226
226
|
"module": "@krizaka/ui/registry/examples/card/interactive-link",
|
|
227
|
-
"code": "import { Card } from \"@krizaka/ui/card\";\n\n// `asChild` + `<a>`: the whole card is one link; `interactive` adds the
|
|
227
|
+
"code": "import { Card } from \"@krizaka/ui/card\";\n\n// `asChild` + `<a>`: the whole card is one link; `interactive` adds the quiet hover (a hairline and surface step).\nexport default function CardInteractiveLink() {\n return (\n <Card.Root asChild interactive>\n <a href=\"#guide\">\n <Card.Body>\n <Card.Title as=\"h2\">Getting started</Card.Title>\n <Card.Description>Install the preset, import the primitives, ship both themes.</Card.Description>\n <Card.Footer>Read the guide →</Card.Footer>\n </Card.Body>\n </a>\n </Card.Root>\n );\n}\n"
|
|
228
228
|
},
|
|
229
229
|
{
|
|
230
230
|
"name": "stat-card",
|
|
@@ -425,7 +425,7 @@
|
|
|
425
425
|
"files": [
|
|
426
426
|
{
|
|
427
427
|
"path": "card/card.tsx",
|
|
428
|
-
"content": "// Server-safe: no hook, no context. One `tv` definition with slots: each part takes its slot, and a product overrides\n// any part through `className` (merged last by tailwind-merge).\nimport { Slot } from \"radix-ui\";\nimport type * as React from \"react\";\nimport { tv, type VariantProps } from \"tailwind-variants\";\n\nimport { cn } from \"../cn\";\nimport { cardRecipe } from \"./recipe\";\n\nexport const card = tv(cardRecipe);\n\ntype CardVariants = VariantProps<typeof card>;\n/** The parts without a variant read the default slots: no context, so server-safe. */\nconst slots = card();\n\nexport type CardRootProps = React.ComponentProps<\"div\"> &\n Pick<CardVariants, \"radius\" | \"tone\" | \"interactive\"> & {\n /**\n * md · lg · xl.\n * @default \"xl\"\n */\n radius?: CardVariants[\"radius\"];\n /**\n * default (the base surface) · elevated (raised, a shadow) · glass (translucent, blurred).\n * @default \"default\"\n */\n tone?: CardVariants[\"tone\"];\n /** The
|
|
428
|
+
"content": "// Server-safe: no hook, no context. One `tv` definition with slots: each part takes its slot, and a product overrides\n// any part through `className` (merged last by tailwind-merge).\nimport { Slot } from \"radix-ui\";\nimport type * as React from \"react\";\nimport { tv, type VariantProps } from \"tailwind-variants\";\n\nimport { cn } from \"../cn\";\nimport { cardRecipe } from \"./recipe\";\n\nexport const card = tv(cardRecipe);\n\ntype CardVariants = VariantProps<typeof card>;\n/** The parts without a variant read the default slots: no context, so server-safe. */\nconst slots = card();\n\nexport type CardRootProps = React.ComponentProps<\"div\"> &\n Pick<CardVariants, \"radius\" | \"tone\" | \"interactive\"> & {\n /**\n * md · lg · xl.\n * @default \"xl\"\n */\n radius?: CardVariants[\"radius\"];\n /**\n * default (the base surface) · elevated (raised, a shadow) · glass (translucent, blurred).\n * @default \"default\"\n */\n tone?: CardVariants[\"tone\"];\n /** The quiet hover — the hairline and the surface one step up, nothing moves (krizaka-ui#393): for a card that is a link. */\n interactive?: CardVariants[\"interactive\"];\n /** Renders the child (a link, an article) instead of the <div>, with props, classes and ref merged. */\n asChild?: boolean;\n /** Enters on scroll (MotionObserver): the index in the grid becomes the delay (50 ms a step, 8 steps at most). */\n reveal?: number;\n };\n\nexport function CardRoot({ asChild, reveal, radius, tone, interactive, className, style, ...props }: CardRootProps) {\n const Comp = asChild ? Slot.Root : \"div\";\n const revealStyle =\n reveal === undefined ? style : ({ ...style, \"--kz-delay\": `${Math.min(Math.max(reveal, 0), 8) * 50}ms` } as React.CSSProperties);\n return (\n <Comp\n data-reveal={reveal === undefined ? undefined : \"\"}\n data-interactive={interactive ? \"\" : undefined}\n style={revealStyle}\n className={card({ radius, tone, interactive }).root({ className })}\n {...props}\n />\n );\n}\n\nconst ASPECT = { video: \"aspect-video\", square: \"aspect-square\", portrait: \"aspect-[3/4]\", auto: \"\" } as const;\nexport type CardMediaProps = React.ComponentProps<\"div\"> & {\n /** The ratio of the media: video (16:9) · square · portrait (3:4) · auto (the content's). */\n aspect?: keyof typeof ASPECT;\n};\n\nexport function CardMedia({ aspect = \"video\", className, ...props }: CardMediaProps) {\n return <div data-aspect={aspect} className={slots.media({ className: cn(ASPECT[aspect], className) })} {...props} />;\n}\n\nexport type CardImageProps = Omit<React.ComponentProps<\"img\">, \"src\"> & {\n /** The image's URL; `null` or nothing shows the `fallback`. */\n src?: string | null;\n /** Shown when there is no image: an icon, an illustration (decorative). */\n fallback?: React.ReactNode;\n /**\n * When the browser loads it: `lazy` (default, a card in a list or below the fold) or `eager` for the first cards\n * of a page — the image that is the largest contentful paint must not wait (add `fetchPriority=\"high\"`).\n * @default \"lazy\"\n */\n loading?: \"lazy\" | \"eager\";\n};\n\n/** The image of a media, or its `fallback` when there is none. `alt` is empty by default: the title names the card. */\nexport function CardImage({ src, alt = \"\", fallback, loading = \"lazy\", className, ...props }: CardImageProps) {\n if (!src) {\n return (\n <div data-fallback=\"\" aria-hidden className={slots.fallback({ className })}>\n {fallback}\n </div>\n );\n }\n return <img src={src} alt={alt} loading={loading} decoding=\"async\" className={slots.image({ className })} {...props} />;\n}\n\nconst CORNER = {\n \"top-left\": \"left-2.5 top-2.5\",\n \"top-right\": \"right-2.5 top-2.5\",\n \"bottom-left\": \"bottom-2.5 left-2.5\",\n \"bottom-right\": \"bottom-2.5 right-2.5\",\n} as const;\nexport type CardOverlayProps = React.ComponentProps<\"div\"> & {\n /** The corner of the media it sits in. */\n corner?: keyof typeof CORNER;\n};\n\n/** What sits on the media (badges, a caption). `scrim` and `fg-on-media` are invariant: nothing to do for light. */\nexport function CardOverlay({ corner = \"top-left\", className, ...props }: CardOverlayProps) {\n return <div data-corner={corner} className={slots.overlay({ className: cn(CORNER[corner], className) })} {...props} />;\n}\n\nexport type CardBodyProps = React.ComponentProps<\"div\"> & {\n /**\n * none · sm · md · lg.\n * @default \"md\"\n */\n padding?: CardVariants[\"padding\"];\n};\n\nexport function CardBody({ padding, className, ...props }: CardBodyProps) {\n return <div className={card({ padding }).body({ className })} {...props} />;\n}\n\nexport type CardTitleProps = React.ComponentProps<\"h3\"> & {\n /** The heading level, to fit the page's outline. */\n as?: \"h2\" | \"h3\" | \"h4\";\n};\n\nexport function CardTitle({ as: Tag = \"h3\", className, ...props }: CardTitleProps) {\n return <Tag className={slots.title({ className })} {...props} />;\n}\n\nexport function CardDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n return <p className={slots.description({ className })} {...props} />;\n}\n\nexport type CardStatProps = React.ComponentProps<\"div\"> & {\n /** What the figure is, in small capitals above it (the figure is the children). */\n label: React.ReactNode;\n};\n\n/** A figure put forward: the label in capitals, the value in tabular digits. */\nexport function CardStat({ label, className, children, ...props }: CardStatProps) {\n return (\n <div className={slots.stat({ className })} {...props}>\n <p className={slots.statLabel()}>{label}</p>\n <p className={slots.statValue()}>{children}</p>\n </div>\n );\n}\n\nexport function CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return <div className={slots.footer({ className })} {...props} />;\n}\n\n/** `Card.Root/Media/Image/Overlay/Body/Title/Description/Stat/Footer`. */\nexport const Card = {\n Root: CardRoot,\n Media: CardMedia,\n Image: CardImage,\n Overlay: CardOverlay,\n Body: CardBody,\n Title: CardTitle,\n Description: CardDescription,\n Stat: CardStat,\n Footer: CardFooter,\n};\n"
|
|
429
429
|
},
|
|
430
430
|
{
|
|
431
431
|
"path": "card/index.ts",
|
|
@@ -433,11 +433,11 @@
|
|
|
433
433
|
},
|
|
434
434
|
{
|
|
435
435
|
"path": "card/meta.ts",
|
|
436
|
-
"content": "import type { ComponentMeta } from \"../meta\";\n\nexport const meta = {\n title: \"Card\",\n summary: \"The composed chassis of every card: a media with overlays, a body with a title, a description, stats and a footer.\",\n status: \"stable\",\n category: \"layout\",\n platforms: \"both\",\n parity: { desktop: \"web\" },\n whenToUse: [\n \"To present one item of a collection: a video, a creator, a guide, a plan.\",\n \"As a link to the item (`asChild` + `interactive`): the whole card is one target.\",\n \"To group a few figures under a title (`Card.Stat`).\",\n ],\n whenNotToUse: [\n { when: \"To frame a whole page section: use the page layout, not a card around everything.\" },\n { when: \"For a single key figure without a frame.\", use: \"stat\" },\n { when: \"For a message about the page.\", use: \"alert\" },\n ],\n bestPractices: [\n \"Build product cards from these parts and override any of them with `className` — never fork the card.\",\n \"Keep one primary target per card: either the whole card is a link, or it holds buttons — not both.\",\n \"Give `Card.Media` a fixed `aspect` so a grid stays aligned while images load.\",\n \"`Card.Image` loads lazily; pass `loading=\\\"eager\\\"` (and `fetchPriority=\\\"high\\\"`) to the first cards of a page, above the fold.\",\n \"`reveal={index}` with one `MotionObserver` per page for the entrance; it is shown at once under reduced motion.\",\n ],\n accessibility: {\n keyboard: [{ keys: \"Tab / Enter\", action: \"An `asChild` link card is one focusable link that Enter follows.\" }],\n notes: [\n \"`Card.Title` is a heading (`h3` by default, `as` to change the level) so cards are reachable by heading.\",\n \"A card that is a link is named by its content: keep the title first.\",\n \"The image fallback is decorative and hidden from assistive technology.\",\n ],\n },\n related: [\"badge\", \"stat\", \"avatar\", \"skeleton\"],\n web: {\n imports: [\"Card\"],\n examples: [\n { name: \"media-card\", title: \"Media card\", description: \"An image, badges on the media, a title, a description and a footer.\" },\n { name: \"media-fallback\", title: \"Media fallback\", description: \"No image: the `fallback` on the accent gradient.\" },\n { name: \"interactive-link\", title: \"Interactive link\", description: \"`asChild` + `<a>`: the whole card is a link
|
|
436
|
+
"content": "import type { ComponentMeta } from \"../meta\";\n\nexport const meta = {\n title: \"Card\",\n summary: \"The composed chassis of every card: a media with overlays, a body with a title, a description, stats and a footer.\",\n status: \"stable\",\n category: \"layout\",\n platforms: \"both\",\n parity: { desktop: \"web\" },\n whenToUse: [\n \"To present one item of a collection: a video, a creator, a guide, a plan.\",\n \"As a link to the item (`asChild` + `interactive`): the whole card is one target.\",\n \"To group a few figures under a title (`Card.Stat`).\",\n ],\n whenNotToUse: [\n { when: \"To frame a whole page section: use the page layout, not a card around everything.\" },\n { when: \"For a single key figure without a frame.\", use: \"stat\" },\n { when: \"For a message about the page.\", use: \"alert\" },\n ],\n bestPractices: [\n \"Build product cards from these parts and override any of them with `className` — never fork the card.\",\n \"Keep one primary target per card: either the whole card is a link, or it holds buttons — not both.\",\n \"Give `Card.Media` a fixed `aspect` so a grid stays aligned while images load.\",\n \"`Card.Image` loads lazily; pass `loading=\\\"eager\\\"` (and `fetchPriority=\\\"high\\\"`) to the first cards of a page, above the fold.\",\n \"`reveal={index}` with one `MotionObserver` per page for the entrance; it is shown at once under reduced motion.\",\n ],\n accessibility: {\n keyboard: [{ keys: \"Tab / Enter\", action: \"An `asChild` link card is one focusable link that Enter follows.\" }],\n notes: [\n \"`Card.Title` is a heading (`h3` by default, `as` to change the level) so cards are reachable by heading.\",\n \"A card that is a link is named by its content: keep the title first.\",\n \"The image fallback is decorative and hidden from assistive technology.\",\n ],\n },\n related: [\"badge\", \"stat\", \"avatar\", \"skeleton\"],\n web: {\n imports: [\"Card\"],\n examples: [\n { name: \"media-card\", title: \"Media card\", description: \"An image, badges on the media, a title, a description and a footer.\" },\n { name: \"media-fallback\", title: \"Media fallback\", description: \"No image: the `fallback` on the accent gradient.\" },\n { name: \"interactive-link\", title: \"Interactive link\", description: \"`asChild` + `<a>`: the whole card is a link; its hairline and surface go one step up under the pointer.\" },\n { name: \"stat-card\", title: \"Stat card\", description: \"Figures put forward with `Card.Stat`, `tone=\\\"elevated\\\"`.\" },\n { name: \"reveal-grid\", title: \"Reveal grid\", description: \"Cards entering in cascade with `reveal` and `MotionObserver`.\" },\n ],\n },\n native: {\n imports: [\"Card\"],\n differences: [\n \"`onPress` on `Card.Root` makes the whole card a button (no `asChild`, no `interactive`).\",\n \"Built on `View`, `Image` and `Text`: style with `style`, not `className`.\",\n \"No `Card.Stat` and no `reveal`.\",\n ],\n examples: [\n { name: \"default\", title: \"Default\", description: \"A media, a body and a footer.\" },\n { name: \"elevated\", title: \"Elevated\", description: \"`tone=\\\"elevated\\\"`: one step higher, with a shadow.\" },\n { name: \"pressable\", title: \"Pressable\", description: \"`onPress`: the whole card is a button.\" },\n { name: \"body\", title: \"Text and an action\", description: \"A body only, with a button.\" },\n ],\n },\n} satisfies ComponentMeta;\n"
|
|
437
437
|
},
|
|
438
438
|
{
|
|
439
439
|
"path": "card/recipe.ts",
|
|
440
|
-
"content": "// The card's parts, radii, tones and paddings, written once as classes of the Krizaka tokens: the web wears them with\n// `tv(cardRecipe)`, React Native reads the same classes into styles (native/card.tsx): a part of the card that exists only\n// on the web (the
|
|
440
|
+
"content": "// The card's parts, radii, tones and paddings, written once as classes of the Krizaka tokens: the web wears them with\n// `tv(cardRecipe)`, React Native reads the same classes into styles (native/card.tsx): a part of the card that exists only\n// on the web (the hover's tint) is simply ignored there.\nimport { defineRecipe } from \"../recipes/define\";\n\nexport const cardRecipe = defineRecipe({\n slots: {\n root:\n \"group relative flex flex-col overflow-hidden border border-border-default bg-surface-1 text-fg transition-colors \" +\n \"focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring\",\n media: \"relative overflow-hidden bg-media\",\n image: \"h-full w-full object-cover\",\n fallback: \"flex h-full w-full items-center justify-center bg-linear-to-br from-accent/15 via-media to-accent-2/15 text-accent/60\",\n overlay: \"absolute z-10 flex items-center gap-1.5\",\n body: \"relative flex flex-1 flex-col gap-3\",\n title: \"line-clamp-1 text-sm font-semibold text-fg transition-colors group-hover:text-fg-accent\",\n description: \"line-clamp-2 text-xs text-fg-secondary\",\n stat: \"min-w-0\",\n statLabel: \"text-[10px] font-semibold uppercase tracking-wider text-fg-secondary\",\n statValue: \"font-display text-xl font-black tabular-nums text-fg\",\n footer: \"relative mt-auto flex items-center gap-2 border-t border-border-subtle pt-3 text-xs text-fg-secondary\",\n },\n variants: {\n radius: { md: { root: \"rounded-md\" }, lg: { root: \"rounded-lg\" }, xl: { root: \"rounded-xl\" } },\n tone: { default: {}, elevated: { root: \"bg-surface-2 shadow-md\" }, glass: { root: \"bg-surface-1/70 backdrop-blur-md\" } },\n interactive: { true: { root: \"duration-150 hover:border-border-strong hover:bg-surface-2\" } },\n padding: { none: { body: \"p-0\" }, sm: { body: \"p-3\" }, md: { body: \"p-4\" }, lg: { body: \"p-6\" } },\n },\n defaultVariants: { radius: \"xl\", tone: \"default\", padding: \"md\" },\n});\n"
|
|
441
441
|
},
|
|
442
442
|
{
|
|
443
443
|
"path": "meta.ts",
|
|
@@ -472,7 +472,7 @@
|
|
|
472
472
|
"name": "interactive",
|
|
473
473
|
"type": "boolean",
|
|
474
474
|
"default": null,
|
|
475
|
-
"description": "The
|
|
475
|
+
"description": "The quiet hover — the hairline and the surface one step up, nothing moves (krizaka-ui#393): for a card that is a link.",
|
|
476
476
|
"required": false
|
|
477
477
|
},
|
|
478
478
|
{
|
|
@@ -136,7 +136,7 @@
|
|
|
136
136
|
"why": "A builder decides whether a component fits, sees it live and copies it, all on one page.",
|
|
137
137
|
"path": "examples/component-page/button.tsx",
|
|
138
138
|
"module": "@krizaka/ui/registry/examples/component-page/button",
|
|
139
|
-
"code": "import { Button } from \"@krizaka/ui/button\";\nimport { ComponentPage } from \"@krizaka/ui/component-page\";\nimport { LinkCard } from \"@krizaka/ui/link-card\";\n\n// TEMPLATE — a component's page (what ui.krizaka.com generates from the registry): name, summary, status and\n// platforms, the live preview, the import line, its sections; related components aside (under it on a phone).\nexport default function ComponentPageButton() {\n return (\n <ComponentPage\n className=\"w-full\"\n back={<a href=\"#catalogue\">← Components</a>}\n eyebrow=\"Actions\"\n title=\"Button\"\n summary=\"The action: six looks, three sizes, the Krizaka cut, and the whole life of an action built in.\"\n facts={[{ label: \"Web + Mobile\", tone: \"ok\" }, { label: \"Stable\" }]}\n preview={\n <div className=\"flex flex-wrap items-center justify-center gap-3 p-8\">\n <Button variant=\"primary\"
|
|
139
|
+
"code": "import { Button } from \"@krizaka/ui/button\";\nimport { ComponentPage } from \"@krizaka/ui/component-page\";\nimport { LinkCard } from \"@krizaka/ui/link-card\";\n\n// TEMPLATE — a component's page (what ui.krizaka.com generates from the registry): name, summary, status and\n// platforms, the live preview, the import line, its sections; related components aside (under it on a phone).\nexport default function ComponentPageButton() {\n return (\n <ComponentPage\n className=\"w-full\"\n back={<a href=\"#catalogue\">← Components</a>}\n eyebrow=\"Actions\"\n title=\"Button\"\n summary=\"The action: six looks, three sizes, the Krizaka cut, and the whole life of an action built in.\"\n facts={[{ label: \"Web + Mobile\", tone: \"ok\" }, { label: \"Stable\" }]}\n preview={\n <div className=\"flex flex-wrap items-center justify-center gap-3 p-8\">\n <Button variant=\"primary\">Publish</Button>\n <Button variant=\"secondary\">Save a draft</Button>\n </div>\n }\n install={{ code: 'import { Button } from \"@krizaka/ui/button\";', language: \"ts\", copyLabel: \"Copy\", copiedLabel: \"Copied\" }}\n sections={[\n { id: \"when\", title: \"When to use\", children: <p className=\"text-sm text-fg-secondary\">For the action a block is about; links that look like actions use `asChild`.</p> },\n { id: \"a11y\", title: \"Accessibility\", children: <p className=\"text-sm text-fg-secondary\">A real button; while loading it says so in a live region.</p> },\n ]}\n aside={<LinkCard href=\"#confirm-button\" title=\"Confirm button\" description=\"A destructive action in two presses.\" titleAs=\"span\" />}\n />\n );\n}\n"
|
|
140
140
|
}
|
|
141
141
|
]
|
|
142
142
|
},
|
|
@@ -167,7 +167,7 @@
|
|
|
167
167
|
],
|
|
168
168
|
"demo": {
|
|
169
169
|
"path": "examples/component-page/button.tsx",
|
|
170
|
-
"content": "import { Button } from \"@krizaka/ui/button\";\nimport { ComponentPage } from \"@krizaka/ui/component-page\";\nimport { LinkCard } from \"@krizaka/ui/link-card\";\n\n// TEMPLATE — a component's page (what ui.krizaka.com generates from the registry): name, summary, status and\n// platforms, the live preview, the import line, its sections; related components aside (under it on a phone).\nexport default function ComponentPageButton() {\n return (\n <ComponentPage\n className=\"w-full\"\n back={<a href=\"#catalogue\">← Components</a>}\n eyebrow=\"Actions\"\n title=\"Button\"\n summary=\"The action: six looks, three sizes, the Krizaka cut, and the whole life of an action built in.\"\n facts={[{ label: \"Web + Mobile\", tone: \"ok\" }, { label: \"Stable\" }]}\n preview={\n <div className=\"flex flex-wrap items-center justify-center gap-3 p-8\">\n <Button variant=\"primary\"
|
|
170
|
+
"content": "import { Button } from \"@krizaka/ui/button\";\nimport { ComponentPage } from \"@krizaka/ui/component-page\";\nimport { LinkCard } from \"@krizaka/ui/link-card\";\n\n// TEMPLATE — a component's page (what ui.krizaka.com generates from the registry): name, summary, status and\n// platforms, the live preview, the import line, its sections; related components aside (under it on a phone).\nexport default function ComponentPageButton() {\n return (\n <ComponentPage\n className=\"w-full\"\n back={<a href=\"#catalogue\">← Components</a>}\n eyebrow=\"Actions\"\n title=\"Button\"\n summary=\"The action: six looks, three sizes, the Krizaka cut, and the whole life of an action built in.\"\n facts={[{ label: \"Web + Mobile\", tone: \"ok\" }, { label: \"Stable\" }]}\n preview={\n <div className=\"flex flex-wrap items-center justify-center gap-3 p-8\">\n <Button variant=\"primary\">Publish</Button>\n <Button variant=\"secondary\">Save a draft</Button>\n </div>\n }\n install={{ code: 'import { Button } from \"@krizaka/ui/button\";', language: \"ts\", copyLabel: \"Copy\", copiedLabel: \"Copied\" }}\n sections={[\n { id: \"when\", title: \"When to use\", children: <p className=\"text-sm text-fg-secondary\">For the action a block is about; links that look like actions use `asChild`.</p> },\n { id: \"a11y\", title: \"Accessibility\", children: <p className=\"text-sm text-fg-secondary\">A real button; while loading it says so in a live region.</p> },\n ]}\n aside={<LinkCard href=\"#confirm-button\" title=\"Confirm button\" description=\"A destructive action in two presses.\" titleAs=\"span\" />}\n />\n );\n}\n"
|
|
171
171
|
},
|
|
172
172
|
"props": [
|
|
173
173
|
{
|
|
@@ -127,7 +127,7 @@
|
|
|
127
127
|
"name": "magnetic",
|
|
128
128
|
"type": "boolean",
|
|
129
129
|
"default": null,
|
|
130
|
-
"description": "
|
|
130
|
+
"description": "@deprecated Since 3.31 (krizaka-ui#393): does nothing — a button never moves under the pointer. Removed in 4.0.",
|
|
131
131
|
"required": false
|
|
132
132
|
},
|
|
133
133
|
{
|
|
@@ -148,14 +148,14 @@
|
|
|
148
148
|
"name": "shape",
|
|
149
149
|
"type": "\"rounded\" | \"pill\" | \"cut\"",
|
|
150
150
|
"default": "rounded",
|
|
151
|
-
"description": "rounded · pill
|
|
151
|
+
"description": "`rounded` (an 8 px radius, the radius of a field) · `pill`. `cut` is deprecated (krizaka-ui#393: the chamfer is\nretired) — it draws `rounded` and warns in development; it will be removed in 4.0.",
|
|
152
152
|
"required": false
|
|
153
153
|
},
|
|
154
154
|
{
|
|
155
155
|
"name": "shimmer",
|
|
156
156
|
"type": "boolean",
|
|
157
157
|
"default": null,
|
|
158
|
-
"description": "
|
|
158
|
+
"description": "@deprecated Since 3.31 (krizaka-ui#393): does nothing — the hover is quiet. Removed in 4.0.",
|
|
159
159
|
"required": false
|
|
160
160
|
},
|
|
161
161
|
{
|
|
@@ -304,7 +304,7 @@
|
|
|
304
304
|
"name": "magnetic",
|
|
305
305
|
"type": "boolean",
|
|
306
306
|
"default": null,
|
|
307
|
-
"description": "
|
|
307
|
+
"description": "@deprecated Since 3.31 (krizaka-ui#393): does nothing — a button never moves under the pointer. Removed in 4.0.",
|
|
308
308
|
"required": false
|
|
309
309
|
},
|
|
310
310
|
{
|
|
@@ -325,14 +325,14 @@
|
|
|
325
325
|
"name": "shape",
|
|
326
326
|
"type": "\"rounded\" | \"pill\" | \"cut\"",
|
|
327
327
|
"default": "rounded",
|
|
328
|
-
"description": "rounded · pill
|
|
328
|
+
"description": "`rounded` (an 8 px radius, the radius of a field) · `pill`. `cut` is deprecated (krizaka-ui#393: the chamfer is\nretired) — it draws `rounded` and warns in development; it will be removed in 4.0.",
|
|
329
329
|
"required": false
|
|
330
330
|
},
|
|
331
331
|
{
|
|
332
332
|
"name": "shimmer",
|
|
333
333
|
"type": "boolean",
|
|
334
334
|
"default": null,
|
|
335
|
-
"description": "
|
|
335
|
+
"description": "@deprecated Since 3.31 (krizaka-ui#393): does nothing — the hover is quiet. Removed in 4.0.",
|
|
336
336
|
"required": false
|
|
337
337
|
},
|
|
338
338
|
{
|
|
@@ -129,7 +129,7 @@
|
|
|
129
129
|
"why": "A visitor reaches a human by the channel they prefer and learns what happens after they write.",
|
|
130
130
|
"path": "examples/contact-page/team.tsx",
|
|
131
131
|
"module": "@krizaka/ui/registry/examples/contact-page/team",
|
|
132
|
-
"code": "import { Button } from \"@krizaka/ui/button\";\nimport { ContactPage } from \"@krizaka/ui/contact-page\";\nimport { Field, Input, Textarea } from \"@krizaka/ui/field\";\nimport { LinkCard } from \"@krizaka/ui/link-card\";\nimport { Mascot } from \"@krizaka/ui/mascots\";\n\n// TEMPLATE — reaching the team: the public channels as cards beside the private form, then what happens after sending.\n// On a phone the form comes after the channels, its fields at full width.\nexport default function ContactPageTeam() {\n return (\n <ContactPage\n eyebrow=\"Contact\"\n title=\"Talk to the people who build it\"\n lead=\"A person answers within two working days, in English or in French.\"\n aside={<Mascot bird=\"flamingo\" mood=\"welcome\" size={112} />}\n channels={\n <>\n <LinkCard href=\"https://github.com/orgs/krizaka/discussions\" title=\"Discussions\" description=\"Questions and ideas, in public.\" titleAs=\"span\" />\n <LinkCard href=\"https://github.com/krizaka\" title=\"Report a problem\" description=\"An issue on the repository.\" titleAs=\"span\" />\n </>\n }\n form={\n <form className=\"flex flex-col gap-4\">\n <Field.Root>\n <Field.Label htmlFor=\"contact-email\">Email</Field.Label>\n <Input id=\"contact-email\" type=\"email\" autoComplete=\"email\" />\n </Field.Root>\n <Field.Root>\n <Field.Label htmlFor=\"contact-message\">Message</Field.Label>\n <Textarea id=\"contact-message\" rows={4} />\n </Field.Root>\n <Button type=\"submit\" variant=\"primary\" size=\"lg\"
|
|
132
|
+
"code": "import { Button } from \"@krizaka/ui/button\";\nimport { ContactPage } from \"@krizaka/ui/contact-page\";\nimport { Field, Input, Textarea } from \"@krizaka/ui/field\";\nimport { LinkCard } from \"@krizaka/ui/link-card\";\nimport { Mascot } from \"@krizaka/ui/mascots\";\n\n// TEMPLATE — reaching the team: the public channels as cards beside the private form, then what happens after sending.\n// On a phone the form comes after the channels, its fields at full width.\nexport default function ContactPageTeam() {\n return (\n <ContactPage\n eyebrow=\"Contact\"\n title=\"Talk to the people who build it\"\n lead=\"A person answers within two working days, in English or in French.\"\n aside={<Mascot bird=\"flamingo\" mood=\"welcome\" size={112} />}\n channels={\n <>\n <LinkCard href=\"https://github.com/orgs/krizaka/discussions\" title=\"Discussions\" description=\"Questions and ideas, in public.\" titleAs=\"span\" />\n <LinkCard href=\"https://github.com/krizaka\" title=\"Report a problem\" description=\"An issue on the repository.\" titleAs=\"span\" />\n </>\n }\n form={\n <form className=\"flex flex-col gap-4\">\n <Field.Root>\n <Field.Label htmlFor=\"contact-email\">Email</Field.Label>\n <Input id=\"contact-email\" type=\"email\" autoComplete=\"email\" />\n </Field.Root>\n <Field.Root>\n <Field.Label htmlFor=\"contact-message\">Message</Field.Label>\n <Textarea id=\"contact-message\" rows={4} />\n </Field.Root>\n <Button type=\"submit\" variant=\"primary\" size=\"lg\">Send</Button>\n </form>\n }\n next={{ title: \"What happens next\", steps: [{ title: \"We read it\", text: \"The same day, on working days.\" }, { title: \"We answer\", text: \"Within two working days.\" }] }}\n />\n );\n}\n"
|
|
133
133
|
}
|
|
134
134
|
]
|
|
135
135
|
},
|
|
@@ -159,7 +159,7 @@
|
|
|
159
159
|
],
|
|
160
160
|
"demo": {
|
|
161
161
|
"path": "examples/contact-page/team.tsx",
|
|
162
|
-
"content": "import { Button } from \"@krizaka/ui/button\";\nimport { ContactPage } from \"@krizaka/ui/contact-page\";\nimport { Field, Input, Textarea } from \"@krizaka/ui/field\";\nimport { LinkCard } from \"@krizaka/ui/link-card\";\nimport { Mascot } from \"@krizaka/ui/mascots\";\n\n// TEMPLATE — reaching the team: the public channels as cards beside the private form, then what happens after sending.\n// On a phone the form comes after the channels, its fields at full width.\nexport default function ContactPageTeam() {\n return (\n <ContactPage\n eyebrow=\"Contact\"\n title=\"Talk to the people who build it\"\n lead=\"A person answers within two working days, in English or in French.\"\n aside={<Mascot bird=\"flamingo\" mood=\"welcome\" size={112} />}\n channels={\n <>\n <LinkCard href=\"https://github.com/orgs/krizaka/discussions\" title=\"Discussions\" description=\"Questions and ideas, in public.\" titleAs=\"span\" />\n <LinkCard href=\"https://github.com/krizaka\" title=\"Report a problem\" description=\"An issue on the repository.\" titleAs=\"span\" />\n </>\n }\n form={\n <form className=\"flex flex-col gap-4\">\n <Field.Root>\n <Field.Label htmlFor=\"contact-email\">Email</Field.Label>\n <Input id=\"contact-email\" type=\"email\" autoComplete=\"email\" />\n </Field.Root>\n <Field.Root>\n <Field.Label htmlFor=\"contact-message\">Message</Field.Label>\n <Textarea id=\"contact-message\" rows={4} />\n </Field.Root>\n <Button type=\"submit\" variant=\"primary\" size=\"lg\"
|
|
162
|
+
"content": "import { Button } from \"@krizaka/ui/button\";\nimport { ContactPage } from \"@krizaka/ui/contact-page\";\nimport { Field, Input, Textarea } from \"@krizaka/ui/field\";\nimport { LinkCard } from \"@krizaka/ui/link-card\";\nimport { Mascot } from \"@krizaka/ui/mascots\";\n\n// TEMPLATE — reaching the team: the public channels as cards beside the private form, then what happens after sending.\n// On a phone the form comes after the channels, its fields at full width.\nexport default function ContactPageTeam() {\n return (\n <ContactPage\n eyebrow=\"Contact\"\n title=\"Talk to the people who build it\"\n lead=\"A person answers within two working days, in English or in French.\"\n aside={<Mascot bird=\"flamingo\" mood=\"welcome\" size={112} />}\n channels={\n <>\n <LinkCard href=\"https://github.com/orgs/krizaka/discussions\" title=\"Discussions\" description=\"Questions and ideas, in public.\" titleAs=\"span\" />\n <LinkCard href=\"https://github.com/krizaka\" title=\"Report a problem\" description=\"An issue on the repository.\" titleAs=\"span\" />\n </>\n }\n form={\n <form className=\"flex flex-col gap-4\">\n <Field.Root>\n <Field.Label htmlFor=\"contact-email\">Email</Field.Label>\n <Input id=\"contact-email\" type=\"email\" autoComplete=\"email\" />\n </Field.Root>\n <Field.Root>\n <Field.Label htmlFor=\"contact-message\">Message</Field.Label>\n <Textarea id=\"contact-message\" rows={4} />\n </Field.Root>\n <Button type=\"submit\" variant=\"primary\" size=\"lg\">Send</Button>\n </form>\n }\n next={{ title: \"What happens next\", steps: [{ title: \"We read it\", text: \"The same day, on working days.\" }, { title: \"We answer\", text: \"Within two working days.\" }] }}\n />\n );\n}\n"
|
|
163
163
|
},
|
|
164
164
|
"props": [
|
|
165
165
|
{
|
package/registry/cover-hero.json
CHANGED
|
@@ -130,7 +130,7 @@
|
|
|
130
130
|
"description": "A cover photo, the name, the promise, open-now and the neighbourhood, and the main action.",
|
|
131
131
|
"path": "examples/cover-hero/shop.tsx",
|
|
132
132
|
"module": "@krizaka/ui/registry/examples/cover-hero/shop",
|
|
133
|
-
"code": "import { Badge } from \"@krizaka/ui/badge\";\nimport { Button } from \"@krizaka/ui/button\";\nimport { CoverHero } from \"@krizaka/ui/cover-hero\";\n\n// A drawn sky (a data URI, so the example needs no network); a shop passes its own photo.\nconst COVER = \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 800 600'%3E%3Cdefs%3E%3ClinearGradient id='g' x1='0' y1='0' x2='1' y2='1'%3E%3Cstop offset='0' stop-color='%230f3d2e'/%3E%3Cstop offset='1' stop-color='%23b5651d'/%3E%3C/linearGradient%3E%3C/defs%3E%3Crect width='800' height='600' fill='url(%23g)'/%3E%3Ccircle cx='560' cy='190' r='90' fill='%23f2c48d' opacity='.55'/%3E%3Cpath d='M0 470 Q200 380 400 450 T800 420 V600 H0Z' fill='%23f2c48d' opacity='.35'/%3E%3C/svg%3E\";\n\n// A shop's first screen: its cover, the name, one line of promise, the facts that are true, the main action.\nexport default function CoverHeroShop() {\n return (\n <CoverHero\n cover={{ src: COVER, alt: \"\" }}\n eyebrow=\"Saint-Henri · Montréal\"\n title=\"Pattes de Saint-Henri\"\n lead=\"Neighbourhood dog walks, with a photo and a note after each one.\"\n facts={<><Badge tone=\"success\" dot size=\"md\">Open now · closes at 5 pm</Badge><Badge tone=\"scrim\" size=\"md\">Saint-Henri</Badge></>}\n actions={<Button size=\"lg\"
|
|
133
|
+
"code": "import { Badge } from \"@krizaka/ui/badge\";\nimport { Button } from \"@krizaka/ui/button\";\nimport { CoverHero } from \"@krizaka/ui/cover-hero\";\n\n// A drawn sky (a data URI, so the example needs no network); a shop passes its own photo.\nconst COVER = \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 800 600'%3E%3Cdefs%3E%3ClinearGradient id='g' x1='0' y1='0' x2='1' y2='1'%3E%3Cstop offset='0' stop-color='%230f3d2e'/%3E%3Cstop offset='1' stop-color='%23b5651d'/%3E%3C/linearGradient%3E%3C/defs%3E%3Crect width='800' height='600' fill='url(%23g)'/%3E%3Ccircle cx='560' cy='190' r='90' fill='%23f2c48d' opacity='.55'/%3E%3Cpath d='M0 470 Q200 380 400 450 T800 420 V600 H0Z' fill='%23f2c48d' opacity='.35'/%3E%3C/svg%3E\";\n\n// A shop's first screen: its cover, the name, one line of promise, the facts that are true, the main action.\nexport default function CoverHeroShop() {\n return (\n <CoverHero\n cover={{ src: COVER, alt: \"\" }}\n eyebrow=\"Saint-Henri · Montréal\"\n title=\"Pattes de Saint-Henri\"\n lead=\"Neighbourhood dog walks, with a photo and a note after each one.\"\n facts={<><Badge tone=\"success\" dot size=\"md\">Open now · closes at 5 pm</Badge><Badge tone=\"scrim\" size=\"md\">Saint-Henri</Badge></>}\n actions={<Button size=\"lg\" variant=\"primary\">Book a walk</Button>}\n />\n );\n}\n"
|
|
134
134
|
},
|
|
135
135
|
{
|
|
136
136
|
"name": "plain",
|
|
@@ -138,7 +138,7 @@
|
|
|
138
138
|
"description": "The brand's colours stand in for the photo.",
|
|
139
139
|
"path": "examples/cover-hero/plain.tsx",
|
|
140
140
|
"module": "@krizaka/ui/registry/examples/cover-hero/plain",
|
|
141
|
-
"code": "import { Button } from \"@krizaka/ui/button\";\nimport { CoverHero } from \"@krizaka/ui/cover-hero\";\n\n// Without a cover the hero wears the brand's colours: a new shop still opens on a designed screen.\nexport default function CoverHeroPlain() {\n return <CoverHero eyebrow=\"Plateau · Montréal\" title=\"Atelier Sève\" lead=\"Ceramics classes for beginners, in small groups.\" actions={<Button size=\"lg\"
|
|
141
|
+
"code": "import { Button } from \"@krizaka/ui/button\";\nimport { CoverHero } from \"@krizaka/ui/cover-hero\";\n\n// Without a cover the hero wears the brand's colours: a new shop still opens on a designed screen.\nexport default function CoverHeroPlain() {\n return <CoverHero eyebrow=\"Plateau · Montréal\" title=\"Atelier Sève\" lead=\"Ceramics classes for beginners, in small groups.\" actions={<Button size=\"lg\" variant=\"primary\">Book a class</Button>} />;\n}\n"
|
|
142
142
|
}
|
|
143
143
|
]
|
|
144
144
|
},
|
|
@@ -177,7 +177,7 @@
|
|
|
177
177
|
],
|
|
178
178
|
"demo": {
|
|
179
179
|
"path": "examples/cover-hero/shop.tsx",
|
|
180
|
-
"content": "import { Badge } from \"@krizaka/ui/badge\";\nimport { Button } from \"@krizaka/ui/button\";\nimport { CoverHero } from \"@krizaka/ui/cover-hero\";\n\n// A drawn sky (a data URI, so the example needs no network); a shop passes its own photo.\nconst COVER = \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 800 600'%3E%3Cdefs%3E%3ClinearGradient id='g' x1='0' y1='0' x2='1' y2='1'%3E%3Cstop offset='0' stop-color='%230f3d2e'/%3E%3Cstop offset='1' stop-color='%23b5651d'/%3E%3C/linearGradient%3E%3C/defs%3E%3Crect width='800' height='600' fill='url(%23g)'/%3E%3Ccircle cx='560' cy='190' r='90' fill='%23f2c48d' opacity='.55'/%3E%3Cpath d='M0 470 Q200 380 400 450 T800 420 V600 H0Z' fill='%23f2c48d' opacity='.35'/%3E%3C/svg%3E\";\n\n// A shop's first screen: its cover, the name, one line of promise, the facts that are true, the main action.\nexport default function CoverHeroShop() {\n return (\n <CoverHero\n cover={{ src: COVER, alt: \"\" }}\n eyebrow=\"Saint-Henri · Montréal\"\n title=\"Pattes de Saint-Henri\"\n lead=\"Neighbourhood dog walks, with a photo and a note after each one.\"\n facts={<><Badge tone=\"success\" dot size=\"md\">Open now · closes at 5 pm</Badge><Badge tone=\"scrim\" size=\"md\">Saint-Henri</Badge></>}\n actions={<Button size=\"lg\"
|
|
180
|
+
"content": "import { Badge } from \"@krizaka/ui/badge\";\nimport { Button } from \"@krizaka/ui/button\";\nimport { CoverHero } from \"@krizaka/ui/cover-hero\";\n\n// A drawn sky (a data URI, so the example needs no network); a shop passes its own photo.\nconst COVER = \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 800 600'%3E%3Cdefs%3E%3ClinearGradient id='g' x1='0' y1='0' x2='1' y2='1'%3E%3Cstop offset='0' stop-color='%230f3d2e'/%3E%3Cstop offset='1' stop-color='%23b5651d'/%3E%3C/linearGradient%3E%3C/defs%3E%3Crect width='800' height='600' fill='url(%23g)'/%3E%3Ccircle cx='560' cy='190' r='90' fill='%23f2c48d' opacity='.55'/%3E%3Cpath d='M0 470 Q200 380 400 450 T800 420 V600 H0Z' fill='%23f2c48d' opacity='.35'/%3E%3C/svg%3E\";\n\n// A shop's first screen: its cover, the name, one line of promise, the facts that are true, the main action.\nexport default function CoverHeroShop() {\n return (\n <CoverHero\n cover={{ src: COVER, alt: \"\" }}\n eyebrow=\"Saint-Henri · Montréal\"\n title=\"Pattes de Saint-Henri\"\n lead=\"Neighbourhood dog walks, with a photo and a note after each one.\"\n facts={<><Badge tone=\"success\" dot size=\"md\">Open now · closes at 5 pm</Badge><Badge tone=\"scrim\" size=\"md\">Saint-Henri</Badge></>}\n actions={<Button size=\"lg\" variant=\"primary\">Book a walk</Button>}\n />\n );\n}\n"
|
|
181
181
|
},
|
|
182
182
|
"props": [
|
|
183
183
|
{
|
|
@@ -156,7 +156,7 @@
|
|
|
156
156
|
"why": "An operator reads the key figures at a glance and acts on what runs, for the period they chose.",
|
|
157
157
|
"path": "examples/dashboard-layout/orazaka-eric.tsx",
|
|
158
158
|
"module": "@krizaka/ui/registry/examples/dashboard-layout/orazaka-eric",
|
|
159
|
-
"code": "import { Badge } from \"@krizaka/ui/badge\";\nimport { Button } from \"@krizaka/ui/button\";\nimport { Chip } from \"@krizaka/ui/chip\";\nimport { DashboardLayout, Widget } from \"@krizaka/ui/dashboard-layout\";\nimport { Meter } from \"@krizaka/ui/meter\";\nimport { Progress } from \"@krizaka/ui/progress\";\nimport { Stat } from \"@krizaka/ui/stat\";\n\nconst JOBS = [\n { name: \"Catalogue summaries\", studio: \"Writing studio\", value: 72, eta: \"about 2 min\" },\n { name: \"Product shots, autumn\", studio: \"Image studio\", value: 35, eta: \"about 6 min\" },\n];\nconst PACKS = [\n { name: \"Customer support\", runs: \"412 answers this week\" },\n { name: \"Law 25 review\", runs: \"38 documents checked\" },\n];\n\n// TEMPLATE — Orazaka's console, Eric's morning (an accountant who runs his firm's AI on its own server): what the\n// engine did, what is running now, the credits left, the packs at work. The period is a single-choice chip group above the grid;\n// on a phone everything stacks in reading order, the running jobs first after the figures.\nexport default function DashboardLayoutOrazakaEric() {\n return (\n <div className=\"brand-orazaka w-full\">\n <DashboardLayout\n eyebrow=\"Tremblay & associés · on-premise\"\n title=\"Good morning, Eric\"\n description=\"Nothing left your server this week: 1,284 requests, all answered locally.\"\n actions={\n <>\n <Button size=\"sm\" variant=\"secondary\"
|
|
159
|
+
"code": "import { Badge } from \"@krizaka/ui/badge\";\nimport { Button } from \"@krizaka/ui/button\";\nimport { Chip } from \"@krizaka/ui/chip\";\nimport { DashboardLayout, Widget } from \"@krizaka/ui/dashboard-layout\";\nimport { Meter } from \"@krizaka/ui/meter\";\nimport { Progress } from \"@krizaka/ui/progress\";\nimport { Stat } from \"@krizaka/ui/stat\";\n\nconst JOBS = [\n { name: \"Catalogue summaries\", studio: \"Writing studio\", value: 72, eta: \"about 2 min\" },\n { name: \"Product shots, autumn\", studio: \"Image studio\", value: 35, eta: \"about 6 min\" },\n];\nconst PACKS = [\n { name: \"Customer support\", runs: \"412 answers this week\" },\n { name: \"Law 25 review\", runs: \"38 documents checked\" },\n];\n\n// TEMPLATE — Orazaka's console, Eric's morning (an accountant who runs his firm's AI on its own server): what the\n// engine did, what is running now, the credits left, the packs at work. The period is a single-choice chip group above the grid;\n// on a phone everything stacks in reading order, the running jobs first after the figures.\nexport default function DashboardLayoutOrazakaEric() {\n return (\n <div className=\"brand-orazaka w-full\">\n <DashboardLayout\n eyebrow=\"Tremblay & associés · on-premise\"\n title=\"Good morning, Eric\"\n description=\"Nothing left your server this week: 1,284 requests, all answered locally.\"\n actions={\n <>\n <Button size=\"sm\" variant=\"secondary\">Add a pack</Button>\n <Button size=\"sm\" variant=\"primary\">New job</Button>\n </>\n }\n toolbar={\n <Chip.Group type=\"single\" label=\"Period\" defaultValue=\"7d\" required>\n <Chip value=\"today\">Today</Chip>\n <Chip value=\"7d\">7 days</Chip>\n <Chip value=\"30d\">30 days</Chip>\n </Chip.Group>\n }\n >\n <Widget title=\"Requests\">\n <Stat label=\"7 days\" value=\"1,284\" trend=\"up\" trendLabel=\"+6 %\" />\n </Widget>\n <Widget title=\"Answered locally\">\n <Stat label=\"No cloud call\" value=\"100 %\" hint=\"sovereign mode\" />\n </Widget>\n <Widget title=\"Median answer\">\n <Stat label=\"Chat\" value=\"1.8 s\" trend=\"down\" trendLabel=\"−0.3 s\" />\n </Widget>\n <Widget title=\"Credits\" description=\"Workspace plan\">\n <Meter label=\"Credits used\" value={3800} max={12000} valueText=\"3,800 of 12,000\" showLabel />\n </Widget>\n <Widget title=\"Running now\" span={2} action={<Badge tone=\"accent\" dot>2 jobs</Badge>}>\n <ul className=\"flex flex-col gap-4\">\n {JOBS.map((j) => (\n <li key={j.name} className=\"flex flex-col gap-1.5\">\n <span className=\"flex items-baseline justify-between gap-2 text-sm\">\n <span className=\"font-medium text-fg\">{j.name}</span>\n <span className=\"text-xs text-fg-secondary\">{j.studio}</span>\n </span>\n <Progress value={j.value} label={j.name} eta={j.eta} size=\"sm\" />\n </li>\n ))}\n </ul>\n </Widget>\n <Widget title=\"Packs at work\" span={2} action={<Button size=\"sm\" variant=\"ghost\">All packs</Button>}>\n <ul className=\"divide-y divide-border-subtle\">\n {PACKS.map((p) => (\n <li key={p.name} className=\"flex items-center justify-between gap-3 py-2.5 text-sm\">\n <span className=\"font-medium text-fg\">{p.name}</span>\n <span className=\"text-fg-secondary\">{p.runs}</span>\n </li>\n ))}\n </ul>\n </Widget>\n </DashboardLayout>\n </div>\n );\n}\n"
|
|
160
160
|
},
|
|
161
161
|
{
|
|
162
162
|
"name": "widgets",
|
|
@@ -193,7 +193,7 @@
|
|
|
193
193
|
"registryDependencies": [],
|
|
194
194
|
"demo": {
|
|
195
195
|
"path": "examples/dashboard-layout/orazaka-eric.tsx",
|
|
196
|
-
"content": "import { Badge } from \"@krizaka/ui/badge\";\nimport { Button } from \"@krizaka/ui/button\";\nimport { Chip } from \"@krizaka/ui/chip\";\nimport { DashboardLayout, Widget } from \"@krizaka/ui/dashboard-layout\";\nimport { Meter } from \"@krizaka/ui/meter\";\nimport { Progress } from \"@krizaka/ui/progress\";\nimport { Stat } from \"@krizaka/ui/stat\";\n\nconst JOBS = [\n { name: \"Catalogue summaries\", studio: \"Writing studio\", value: 72, eta: \"about 2 min\" },\n { name: \"Product shots, autumn\", studio: \"Image studio\", value: 35, eta: \"about 6 min\" },\n];\nconst PACKS = [\n { name: \"Customer support\", runs: \"412 answers this week\" },\n { name: \"Law 25 review\", runs: \"38 documents checked\" },\n];\n\n// TEMPLATE — Orazaka's console, Eric's morning (an accountant who runs his firm's AI on its own server): what the\n// engine did, what is running now, the credits left, the packs at work. The period is a single-choice chip group above the grid;\n// on a phone everything stacks in reading order, the running jobs first after the figures.\nexport default function DashboardLayoutOrazakaEric() {\n return (\n <div className=\"brand-orazaka w-full\">\n <DashboardLayout\n eyebrow=\"Tremblay & associés · on-premise\"\n title=\"Good morning, Eric\"\n description=\"Nothing left your server this week: 1,284 requests, all answered locally.\"\n actions={\n <>\n <Button size=\"sm\" variant=\"secondary\"
|
|
196
|
+
"content": "import { Badge } from \"@krizaka/ui/badge\";\nimport { Button } from \"@krizaka/ui/button\";\nimport { Chip } from \"@krizaka/ui/chip\";\nimport { DashboardLayout, Widget } from \"@krizaka/ui/dashboard-layout\";\nimport { Meter } from \"@krizaka/ui/meter\";\nimport { Progress } from \"@krizaka/ui/progress\";\nimport { Stat } from \"@krizaka/ui/stat\";\n\nconst JOBS = [\n { name: \"Catalogue summaries\", studio: \"Writing studio\", value: 72, eta: \"about 2 min\" },\n { name: \"Product shots, autumn\", studio: \"Image studio\", value: 35, eta: \"about 6 min\" },\n];\nconst PACKS = [\n { name: \"Customer support\", runs: \"412 answers this week\" },\n { name: \"Law 25 review\", runs: \"38 documents checked\" },\n];\n\n// TEMPLATE — Orazaka's console, Eric's morning (an accountant who runs his firm's AI on its own server): what the\n// engine did, what is running now, the credits left, the packs at work. The period is a single-choice chip group above the grid;\n// on a phone everything stacks in reading order, the running jobs first after the figures.\nexport default function DashboardLayoutOrazakaEric() {\n return (\n <div className=\"brand-orazaka w-full\">\n <DashboardLayout\n eyebrow=\"Tremblay & associés · on-premise\"\n title=\"Good morning, Eric\"\n description=\"Nothing left your server this week: 1,284 requests, all answered locally.\"\n actions={\n <>\n <Button size=\"sm\" variant=\"secondary\">Add a pack</Button>\n <Button size=\"sm\" variant=\"primary\">New job</Button>\n </>\n }\n toolbar={\n <Chip.Group type=\"single\" label=\"Period\" defaultValue=\"7d\" required>\n <Chip value=\"today\">Today</Chip>\n <Chip value=\"7d\">7 days</Chip>\n <Chip value=\"30d\">30 days</Chip>\n </Chip.Group>\n }\n >\n <Widget title=\"Requests\">\n <Stat label=\"7 days\" value=\"1,284\" trend=\"up\" trendLabel=\"+6 %\" />\n </Widget>\n <Widget title=\"Answered locally\">\n <Stat label=\"No cloud call\" value=\"100 %\" hint=\"sovereign mode\" />\n </Widget>\n <Widget title=\"Median answer\">\n <Stat label=\"Chat\" value=\"1.8 s\" trend=\"down\" trendLabel=\"−0.3 s\" />\n </Widget>\n <Widget title=\"Credits\" description=\"Workspace plan\">\n <Meter label=\"Credits used\" value={3800} max={12000} valueText=\"3,800 of 12,000\" showLabel />\n </Widget>\n <Widget title=\"Running now\" span={2} action={<Badge tone=\"accent\" dot>2 jobs</Badge>}>\n <ul className=\"flex flex-col gap-4\">\n {JOBS.map((j) => (\n <li key={j.name} className=\"flex flex-col gap-1.5\">\n <span className=\"flex items-baseline justify-between gap-2 text-sm\">\n <span className=\"font-medium text-fg\">{j.name}</span>\n <span className=\"text-xs text-fg-secondary\">{j.studio}</span>\n </span>\n <Progress value={j.value} label={j.name} eta={j.eta} size=\"sm\" />\n </li>\n ))}\n </ul>\n </Widget>\n <Widget title=\"Packs at work\" span={2} action={<Button size=\"sm\" variant=\"ghost\">All packs</Button>}>\n <ul className=\"divide-y divide-border-subtle\">\n {PACKS.map((p) => (\n <li key={p.name} className=\"flex items-center justify-between gap-3 py-2.5 text-sm\">\n <span className=\"font-medium text-fg\">{p.name}</span>\n <span className=\"text-fg-secondary\">{p.runs}</span>\n </li>\n ))}\n </ul>\n </Widget>\n </DashboardLayout>\n </div>\n );\n}\n"
|
|
197
197
|
},
|
|
198
198
|
"props": [
|
|
199
199
|
{
|