@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
|
@@ -136,7 +136,7 @@
|
|
|
136
136
|
"why": "A viewer sees the object itself first, with its facts and the actions that concern it beside it.",
|
|
137
137
|
"path": "examples/detail-layout/video.tsx",
|
|
138
138
|
"module": "@krizaka/ui/registry/examples/detail-layout/video",
|
|
139
|
-
"code": "\"use client\";\n\nimport { Badge } from \"@krizaka/ui/badge\";\nimport { Button } from \"@krizaka/ui/button\";\nimport { DetailLayout } from \"@krizaka/ui/detail-layout\";\nimport { Facts } from \"@krizaka/ui/page\";\nimport { Stat } from \"@krizaka/ui/stat\";\nimport { Tabs } from \"@krizaka/ui/tabs\";\n\n// TEMPLATE — one video in Orochia's studio: the way back to the list, its thumbnail, title and status, its facts, the\n// actions; the tabs (overview · sales · comments); the side panel with the price and the audience — under the content on\n// a phone, where the actions wrap under the title.\nexport default function DetailLayoutVideo() {\n return (\n <div className=\"brand-orochia w-full\">\n <Tabs.Root defaultValue=\"overview\">\n <DetailLayout\n back={<a href=\"#videos\">← Videos</a>}\n media={<div className=\"aspect-video w-40 bg-linear-to-br from-accent to-accent-2\" />}\n eyebrow=\"Video · v-2087\"\n title=\"Night shoot, part 2\"\n status={<Badge tone=\"success\" dot>Published</Badge>}\n meta={<Facts items={[{ label: \"12:48\" }, { label: \"Unlock €4.99\" }, { label: \"18+ checked\", tone: \"ok\" }]} />}\n actions={\n <>\n <Button size=\"sm\" variant=\"secondary\"
|
|
139
|
+
"code": "\"use client\";\n\nimport { Badge } from \"@krizaka/ui/badge\";\nimport { Button } from \"@krizaka/ui/button\";\nimport { DetailLayout } from \"@krizaka/ui/detail-layout\";\nimport { Facts } from \"@krizaka/ui/page\";\nimport { Stat } from \"@krizaka/ui/stat\";\nimport { Tabs } from \"@krizaka/ui/tabs\";\n\n// TEMPLATE — one video in Orochia's studio: the way back to the list, its thumbnail, title and status, its facts, the\n// actions; the tabs (overview · sales · comments); the side panel with the price and the audience — under the content on\n// a phone, where the actions wrap under the title.\nexport default function DetailLayoutVideo() {\n return (\n <div className=\"brand-orochia w-full\">\n <Tabs.Root defaultValue=\"overview\">\n <DetailLayout\n back={<a href=\"#videos\">← Videos</a>}\n media={<div className=\"aspect-video w-40 bg-linear-to-br from-accent to-accent-2\" />}\n eyebrow=\"Video · v-2087\"\n title=\"Night shoot, part 2\"\n status={<Badge tone=\"success\" dot>Published</Badge>}\n meta={<Facts items={[{ label: \"12:48\" }, { label: \"Unlock €4.99\" }, { label: \"18+ checked\", tone: \"ok\" }]} />}\n actions={\n <>\n <Button size=\"sm\" variant=\"secondary\">Edit</Button>\n <Button size=\"sm\" variant=\"primary\">Share</Button>\n </>\n }\n tabs={\n <Tabs.List aria-label=\"Video\">\n <Tabs.Trigger value=\"overview\">Overview</Tabs.Trigger>\n <Tabs.Trigger value=\"sales\">Sales</Tabs.Trigger>\n <Tabs.Trigger value=\"comments\">Comments</Tabs.Trigger>\n </Tabs.List>\n }\n aside={\n <div className=\"flex flex-col gap-4 rounded-xl border border-border-default bg-surface-1 p-4\">\n <Stat label=\"Unlocks\" value=\"146\" trend=\"up\" trendLabel=\"+12\" hint=\"7 days\" />\n <Stat label=\"Earned\" value=\"€653\" hint=\"after the 10 % fee\" />\n </div>\n }\n >\n <Tabs.Content value=\"overview\" className=\"text-sm leading-relaxed text-fg-secondary\">\n The second half of the night shoot in Old Montréal: the rooftop, the rain, the last take at dawn.\n </Tabs.Content>\n <Tabs.Content value=\"sales\" className=\"text-sm text-fg-secondary\">146 unlocks, 3 tips.</Tabs.Content>\n <Tabs.Content value=\"comments\" className=\"text-sm text-fg-secondary\">28 comments, 2 waiting for moderation.</Tabs.Content>\n </DetailLayout>\n </Tabs.Root>\n </div>\n );\n}\n"
|
|
140
140
|
},
|
|
141
141
|
{
|
|
142
142
|
"name": "checkout",
|
|
@@ -147,7 +147,7 @@
|
|
|
147
147
|
"why": "A person pays in a few taps and sees the exact total before committing.",
|
|
148
148
|
"path": "examples/detail-layout/checkout.tsx",
|
|
149
149
|
"module": "@krizaka/ui/registry/examples/detail-layout/checkout",
|
|
150
|
-
"code": "\"use client\";\n\nimport { Button } from \"@krizaka/ui/button\";\nimport { Chip } from \"@krizaka/ui/chip\";\nimport { DetailLayout } from \"@krizaka/ui/detail-layout\";\nimport { Field, Textarea } from \"@krizaka/ui/field\";\nimport { Stat } from \"@krizaka/ui/stat\";\nimport * as React from \"react\";\n\nconst AMOUNTS = [3, 5, 10, 20];\n\n// TEMPLATE — tipping a creator (Orochia): who is paid, the amount in one tap, an optional word, the summary beside the\n// action — under the form on a phone, where the pay button stays last. The total is always said before the button.\nexport default function DetailLayoutCheckout() {\n const [amount, setAmount] = React.useState(\"5\");\n return (\n <div className=\"brand-orochia w-full\">\n <DetailLayout\n back={<a href=\"#elena\">← Elena's page</a>}\n eyebrow=\"Tip\"\n title=\"Say thanks to Elena\"\n meta=\"She keeps 90 %. Paid out every Monday.\"\n aside={\n <div className=\"flex flex-col gap-4 rounded-xl border border-border-default bg-surface-1 p-4\">\n <Stat label=\"You pay\" value={`€${amount}`} hint=\"no fee added on top\" />\n <Button variant=\"primary\"
|
|
150
|
+
"code": "\"use client\";\n\nimport { Button } from \"@krizaka/ui/button\";\nimport { Chip } from \"@krizaka/ui/chip\";\nimport { DetailLayout } from \"@krizaka/ui/detail-layout\";\nimport { Field, Textarea } from \"@krizaka/ui/field\";\nimport { Stat } from \"@krizaka/ui/stat\";\nimport * as React from \"react\";\n\nconst AMOUNTS = [3, 5, 10, 20];\n\n// TEMPLATE — tipping a creator (Orochia): who is paid, the amount in one tap, an optional word, the summary beside the\n// action — under the form on a phone, where the pay button stays last. The total is always said before the button.\nexport default function DetailLayoutCheckout() {\n const [amount, setAmount] = React.useState(\"5\");\n return (\n <div className=\"brand-orochia w-full\">\n <DetailLayout\n back={<a href=\"#elena\">← Elena's page</a>}\n eyebrow=\"Tip\"\n title=\"Say thanks to Elena\"\n meta=\"She keeps 90 %. Paid out every Monday.\"\n aside={\n <div className=\"flex flex-col gap-4 rounded-xl border border-border-default bg-surface-1 p-4\">\n <Stat label=\"You pay\" value={`€${amount}`} hint=\"no fee added on top\" />\n <Button variant=\"primary\" className=\"w-full\">{`Tip €${amount}`}</Button>\n </div>\n }\n >\n <form className=\"flex max-w-lg flex-col gap-5\" onSubmit={(e) => e.preventDefault()}>\n <Chip.Group type=\"single\" label=\"Amount\" value={amount} onValueChange={(v) => v && setAmount(v)} required>\n {AMOUNTS.map((a) => (\n <Chip key={a} value={String(a)}>{`€${a}`}</Chip>\n ))}\n </Chip.Group>\n <Field.Root>\n <Field.Label htmlFor=\"note\">A word for her (optional)</Field.Label>\n <Textarea id=\"note\" rows={3} placeholder=\"The rooftop scene was incredible.\" />\n </Field.Root>\n </form>\n </DetailLayout>\n </div>\n );\n}\n"
|
|
151
151
|
},
|
|
152
152
|
{
|
|
153
153
|
"name": "job",
|
|
@@ -155,7 +155,7 @@
|
|
|
155
155
|
"description": "An engine job without tabs or side panel.",
|
|
156
156
|
"path": "examples/detail-layout/job.tsx",
|
|
157
157
|
"module": "@krizaka/ui/registry/examples/detail-layout/job",
|
|
158
|
-
"code": "import { Badge } from \"@krizaka/ui/badge\";\nimport { Button } from \"@krizaka/ui/button\";\nimport { DetailLayout } from \"@krizaka/ui/detail-layout\";\n\n// Without tabs or side panel: an object's header and its content.\nexport default function DetailLayoutJob() {\n return (\n <DetailLayout\n className=\"w-full\"\n back={<a href=\"#jobs\">← Jobs</a>}\n eyebrow=\"Job · job-4822\"\n title=\"Podcast transcript\"\n status={<Badge tone=\"accent\" dot>Running</Badge>}\n meta=\"Whisper large · started 5 min ago\"\n actions={<Button size=\"sm\" variant=\"danger\"
|
|
158
|
+
"code": "import { Badge } from \"@krizaka/ui/badge\";\nimport { Button } from \"@krizaka/ui/button\";\nimport { DetailLayout } from \"@krizaka/ui/detail-layout\";\n\n// Without tabs or side panel: an object's header and its content.\nexport default function DetailLayoutJob() {\n return (\n <DetailLayout\n className=\"w-full\"\n back={<a href=\"#jobs\">← Jobs</a>}\n eyebrow=\"Job · job-4822\"\n title=\"Podcast transcript\"\n status={<Badge tone=\"accent\" dot>Running</Badge>}\n meta=\"Whisper large · started 5 min ago\"\n actions={<Button size=\"sm\" variant=\"danger\">Cancel</Button>}\n >\n <p className=\"text-sm text-fg-secondary\">The transcript appears here as it is written.</p>\n </DetailLayout>\n );\n}\n"
|
|
159
159
|
}
|
|
160
160
|
]
|
|
161
161
|
},
|
|
@@ -184,7 +184,7 @@
|
|
|
184
184
|
"registryDependencies": [],
|
|
185
185
|
"demo": {
|
|
186
186
|
"path": "examples/detail-layout/video.tsx",
|
|
187
|
-
"content": "\"use client\";\n\nimport { Badge } from \"@krizaka/ui/badge\";\nimport { Button } from \"@krizaka/ui/button\";\nimport { DetailLayout } from \"@krizaka/ui/detail-layout\";\nimport { Facts } from \"@krizaka/ui/page\";\nimport { Stat } from \"@krizaka/ui/stat\";\nimport { Tabs } from \"@krizaka/ui/tabs\";\n\n// TEMPLATE — one video in Orochia's studio: the way back to the list, its thumbnail, title and status, its facts, the\n// actions; the tabs (overview · sales · comments); the side panel with the price and the audience — under the content on\n// a phone, where the actions wrap under the title.\nexport default function DetailLayoutVideo() {\n return (\n <div className=\"brand-orochia w-full\">\n <Tabs.Root defaultValue=\"overview\">\n <DetailLayout\n back={<a href=\"#videos\">← Videos</a>}\n media={<div className=\"aspect-video w-40 bg-linear-to-br from-accent to-accent-2\" />}\n eyebrow=\"Video · v-2087\"\n title=\"Night shoot, part 2\"\n status={<Badge tone=\"success\" dot>Published</Badge>}\n meta={<Facts items={[{ label: \"12:48\" }, { label: \"Unlock €4.99\" }, { label: \"18+ checked\", tone: \"ok\" }]} />}\n actions={\n <>\n <Button size=\"sm\" variant=\"secondary\"
|
|
187
|
+
"content": "\"use client\";\n\nimport { Badge } from \"@krizaka/ui/badge\";\nimport { Button } from \"@krizaka/ui/button\";\nimport { DetailLayout } from \"@krizaka/ui/detail-layout\";\nimport { Facts } from \"@krizaka/ui/page\";\nimport { Stat } from \"@krizaka/ui/stat\";\nimport { Tabs } from \"@krizaka/ui/tabs\";\n\n// TEMPLATE — one video in Orochia's studio: the way back to the list, its thumbnail, title and status, its facts, the\n// actions; the tabs (overview · sales · comments); the side panel with the price and the audience — under the content on\n// a phone, where the actions wrap under the title.\nexport default function DetailLayoutVideo() {\n return (\n <div className=\"brand-orochia w-full\">\n <Tabs.Root defaultValue=\"overview\">\n <DetailLayout\n back={<a href=\"#videos\">← Videos</a>}\n media={<div className=\"aspect-video w-40 bg-linear-to-br from-accent to-accent-2\" />}\n eyebrow=\"Video · v-2087\"\n title=\"Night shoot, part 2\"\n status={<Badge tone=\"success\" dot>Published</Badge>}\n meta={<Facts items={[{ label: \"12:48\" }, { label: \"Unlock €4.99\" }, { label: \"18+ checked\", tone: \"ok\" }]} />}\n actions={\n <>\n <Button size=\"sm\" variant=\"secondary\">Edit</Button>\n <Button size=\"sm\" variant=\"primary\">Share</Button>\n </>\n }\n tabs={\n <Tabs.List aria-label=\"Video\">\n <Tabs.Trigger value=\"overview\">Overview</Tabs.Trigger>\n <Tabs.Trigger value=\"sales\">Sales</Tabs.Trigger>\n <Tabs.Trigger value=\"comments\">Comments</Tabs.Trigger>\n </Tabs.List>\n }\n aside={\n <div className=\"flex flex-col gap-4 rounded-xl border border-border-default bg-surface-1 p-4\">\n <Stat label=\"Unlocks\" value=\"146\" trend=\"up\" trendLabel=\"+12\" hint=\"7 days\" />\n <Stat label=\"Earned\" value=\"€653\" hint=\"after the 10 % fee\" />\n </div>\n }\n >\n <Tabs.Content value=\"overview\" className=\"text-sm leading-relaxed text-fg-secondary\">\n The second half of the night shoot in Old Montréal: the rooftop, the rain, the last take at dawn.\n </Tabs.Content>\n <Tabs.Content value=\"sales\" className=\"text-sm text-fg-secondary\">146 unlocks, 3 tips.</Tabs.Content>\n <Tabs.Content value=\"comments\" className=\"text-sm text-fg-secondary\">28 comments, 2 waiting for moderation.</Tabs.Content>\n </DetailLayout>\n </Tabs.Root>\n </div>\n );\n}\n"
|
|
188
188
|
},
|
|
189
189
|
"props": [
|
|
190
190
|
{
|
|
@@ -165,7 +165,7 @@
|
|
|
165
165
|
"why": "A newcomer picks a collection, starts quickly and sees what is new, from one hub.",
|
|
166
166
|
"path": "examples/docs-hub-page/krizaka.tsx",
|
|
167
167
|
"module": "@krizaka/ui/registry/examples/docs-hub-page/krizaka",
|
|
168
|
-
"code": "import { ProductLogo } from \"@krizaka/ui\";\nimport { Button } from \"@krizaka/ui/button\";\nimport { CodeBlock } from \"@krizaka/ui/code-block\";\nimport { DocsHubPage } from \"@krizaka/ui/docs-hub-page\";\nimport { Kbd } from \"@krizaka/ui/kbd\";\n\nconst COLLECTIONS = [\n { id: \"ui\", title: \"Krizaka UI\", href: \"#ui\", mark: <ProductLogo id=\"krizaka\" size={26} animated={false} />, description: \"Tokens, a Tailwind preset, the components — live, generated from their code.\", links: [{ href: \"#blocks\", label: \"Blocks\" }, { href: \"#layouts\", label: \"Layouts\" }, { href: \"#templates\", label: \"Templates\" }] },\n { id: \"java\", title: \"Krizaka Java\", href: \"#java\", mark: <ProductLogo id=\"krizaka\" size={26} animated={false} />, description: \"Parent, BOM, starters, messaging, Problem Details.\", links: [{ href: \"#bom\", label: \"BOM\" }, { href: \"#messaging\", label: \"Messaging\" }] },\n { id: \"orazaka\", brand: \"orazaka\", title: \"Orazaka\", href: \"#orazaka\", mark: <ProductLogo id=\"orazaka\" size={26} animated={false} />, description: \"The sovereign AI engine: install, packs, administration.\", links: [{ href: \"#cli\", label: \"CLI\" }, { href: \"#packs\", label: \"Packs\" }, { href: \"#admin\", label: \"Admin\" }] },\n { id: \"orochia\", brand: \"orochia\", title: \"Orochia\", href: \"#orochia\", mark: <ProductLogo id=\"orochia\" size={26} animated={false} />, description: \"The creator platform: payments, auctions, the admin console.\", links: [{ href: \"#payouts\", label: \"Payouts\" }, { href: \"#console\", label: \"Console\" }] },\n];\n\n// TEMPLATE — krizaka.com/docs: the search in the middle of the hero (⌘K), the collections each in its product's brand\n// with their quick links, a quick start beside the most read pages, what is new, the owl's promise. On a phone: search,\n// then one collection per row.\nexport default function DocsHubPageKrizaka() {\n return (\n <DocsHubPage\n eyebrow=\"Documentation\"\n title=\"Build with Krizaka\"\n lead=\"Every building block the products are made of, documented from its source.\"\n search={\n <Button variant=\"secondary\" size=\"lg\"
|
|
168
|
+
"code": "import { ProductLogo } from \"@krizaka/ui\";\nimport { Button } from \"@krizaka/ui/button\";\nimport { CodeBlock } from \"@krizaka/ui/code-block\";\nimport { DocsHubPage } from \"@krizaka/ui/docs-hub-page\";\nimport { Kbd } from \"@krizaka/ui/kbd\";\n\nconst COLLECTIONS = [\n { id: \"ui\", title: \"Krizaka UI\", href: \"#ui\", mark: <ProductLogo id=\"krizaka\" size={26} animated={false} />, description: \"Tokens, a Tailwind preset, the components — live, generated from their code.\", links: [{ href: \"#blocks\", label: \"Blocks\" }, { href: \"#layouts\", label: \"Layouts\" }, { href: \"#templates\", label: \"Templates\" }] },\n { id: \"java\", title: \"Krizaka Java\", href: \"#java\", mark: <ProductLogo id=\"krizaka\" size={26} animated={false} />, description: \"Parent, BOM, starters, messaging, Problem Details.\", links: [{ href: \"#bom\", label: \"BOM\" }, { href: \"#messaging\", label: \"Messaging\" }] },\n { id: \"orazaka\", brand: \"orazaka\", title: \"Orazaka\", href: \"#orazaka\", mark: <ProductLogo id=\"orazaka\" size={26} animated={false} />, description: \"The sovereign AI engine: install, packs, administration.\", links: [{ href: \"#cli\", label: \"CLI\" }, { href: \"#packs\", label: \"Packs\" }, { href: \"#admin\", label: \"Admin\" }] },\n { id: \"orochia\", brand: \"orochia\", title: \"Orochia\", href: \"#orochia\", mark: <ProductLogo id=\"orochia\" size={26} animated={false} />, description: \"The creator platform: payments, auctions, the admin console.\", links: [{ href: \"#payouts\", label: \"Payouts\" }, { href: \"#console\", label: \"Console\" }] },\n];\n\n// TEMPLATE — krizaka.com/docs: the search in the middle of the hero (⌘K), the collections each in its product's brand\n// with their quick links, a quick start beside the most read pages, what is new, the owl's promise. On a phone: search,\n// then one collection per row.\nexport default function DocsHubPageKrizaka() {\n return (\n <DocsHubPage\n eyebrow=\"Documentation\"\n title=\"Build with Krizaka\"\n lead=\"Every building block the products are made of, documented from its source.\"\n search={\n <Button variant=\"secondary\" size=\"lg\" className=\"w-full justify-between text-fg-secondary\">\n Search the documentation <Kbd>⌘K</Kbd>\n </Button>\n }\n searchHints={<>Try: <a href=\"#cli\">orazaka install</a> · <a href=\"#button\">Button</a> · <a href=\"#bom\">BOM</a></>}\n collectionsTitle=\"Collections\"\n collections={COLLECTIONS}\n quickstarts={{ title: \"Start in one line\", children: <CodeBlock code=\"npx orazaka install\" language=\"bash\" file=\"Terminal\" copyLabel=\"Copy\" copiedLabel=\"Copied\" /> }}\n popular={{ title: \"Most read\", items: [{ href: \"#cli\", title: \"The CLI\", meta: \"Orazaka\" }, { href: \"#button\", title: \"Button\", meta: \"Krizaka UI\" }, { href: \"#bom\", title: \"The BOM\", meta: \"Java\" }] }}\n whatsNew={{ title: \"What's new\", items: [{ href: \"#ui-260\", title: \"Page blocks: frame, hero, cards, decisions\", meta: \"@krizaka/ui 2.6.0\" }, { href: \"#java-010\", title: \"The platform kit on Maven Central\", meta: \"0.1.0\" }] }}\n promise={{ label: \"The owl's promise\", text: \"Every page here is generated from the code it documents — when the code changes, the page does.\" }}\n />\n );\n}\n"
|
|
169
169
|
}
|
|
170
170
|
]
|
|
171
171
|
},
|
|
@@ -196,7 +196,7 @@
|
|
|
196
196
|
],
|
|
197
197
|
"demo": {
|
|
198
198
|
"path": "examples/docs-hub-page/krizaka.tsx",
|
|
199
|
-
"content": "import { ProductLogo } from \"@krizaka/ui\";\nimport { Button } from \"@krizaka/ui/button\";\nimport { CodeBlock } from \"@krizaka/ui/code-block\";\nimport { DocsHubPage } from \"@krizaka/ui/docs-hub-page\";\nimport { Kbd } from \"@krizaka/ui/kbd\";\n\nconst COLLECTIONS = [\n { id: \"ui\", title: \"Krizaka UI\", href: \"#ui\", mark: <ProductLogo id=\"krizaka\" size={26} animated={false} />, description: \"Tokens, a Tailwind preset, the components — live, generated from their code.\", links: [{ href: \"#blocks\", label: \"Blocks\" }, { href: \"#layouts\", label: \"Layouts\" }, { href: \"#templates\", label: \"Templates\" }] },\n { id: \"java\", title: \"Krizaka Java\", href: \"#java\", mark: <ProductLogo id=\"krizaka\" size={26} animated={false} />, description: \"Parent, BOM, starters, messaging, Problem Details.\", links: [{ href: \"#bom\", label: \"BOM\" }, { href: \"#messaging\", label: \"Messaging\" }] },\n { id: \"orazaka\", brand: \"orazaka\", title: \"Orazaka\", href: \"#orazaka\", mark: <ProductLogo id=\"orazaka\" size={26} animated={false} />, description: \"The sovereign AI engine: install, packs, administration.\", links: [{ href: \"#cli\", label: \"CLI\" }, { href: \"#packs\", label: \"Packs\" }, { href: \"#admin\", label: \"Admin\" }] },\n { id: \"orochia\", brand: \"orochia\", title: \"Orochia\", href: \"#orochia\", mark: <ProductLogo id=\"orochia\" size={26} animated={false} />, description: \"The creator platform: payments, auctions, the admin console.\", links: [{ href: \"#payouts\", label: \"Payouts\" }, { href: \"#console\", label: \"Console\" }] },\n];\n\n// TEMPLATE — krizaka.com/docs: the search in the middle of the hero (⌘K), the collections each in its product's brand\n// with their quick links, a quick start beside the most read pages, what is new, the owl's promise. On a phone: search,\n// then one collection per row.\nexport default function DocsHubPageKrizaka() {\n return (\n <DocsHubPage\n eyebrow=\"Documentation\"\n title=\"Build with Krizaka\"\n lead=\"Every building block the products are made of, documented from its source.\"\n search={\n <Button variant=\"secondary\" size=\"lg\"
|
|
199
|
+
"content": "import { ProductLogo } from \"@krizaka/ui\";\nimport { Button } from \"@krizaka/ui/button\";\nimport { CodeBlock } from \"@krizaka/ui/code-block\";\nimport { DocsHubPage } from \"@krizaka/ui/docs-hub-page\";\nimport { Kbd } from \"@krizaka/ui/kbd\";\n\nconst COLLECTIONS = [\n { id: \"ui\", title: \"Krizaka UI\", href: \"#ui\", mark: <ProductLogo id=\"krizaka\" size={26} animated={false} />, description: \"Tokens, a Tailwind preset, the components — live, generated from their code.\", links: [{ href: \"#blocks\", label: \"Blocks\" }, { href: \"#layouts\", label: \"Layouts\" }, { href: \"#templates\", label: \"Templates\" }] },\n { id: \"java\", title: \"Krizaka Java\", href: \"#java\", mark: <ProductLogo id=\"krizaka\" size={26} animated={false} />, description: \"Parent, BOM, starters, messaging, Problem Details.\", links: [{ href: \"#bom\", label: \"BOM\" }, { href: \"#messaging\", label: \"Messaging\" }] },\n { id: \"orazaka\", brand: \"orazaka\", title: \"Orazaka\", href: \"#orazaka\", mark: <ProductLogo id=\"orazaka\" size={26} animated={false} />, description: \"The sovereign AI engine: install, packs, administration.\", links: [{ href: \"#cli\", label: \"CLI\" }, { href: \"#packs\", label: \"Packs\" }, { href: \"#admin\", label: \"Admin\" }] },\n { id: \"orochia\", brand: \"orochia\", title: \"Orochia\", href: \"#orochia\", mark: <ProductLogo id=\"orochia\" size={26} animated={false} />, description: \"The creator platform: payments, auctions, the admin console.\", links: [{ href: \"#payouts\", label: \"Payouts\" }, { href: \"#console\", label: \"Console\" }] },\n];\n\n// TEMPLATE — krizaka.com/docs: the search in the middle of the hero (⌘K), the collections each in its product's brand\n// with their quick links, a quick start beside the most read pages, what is new, the owl's promise. On a phone: search,\n// then one collection per row.\nexport default function DocsHubPageKrizaka() {\n return (\n <DocsHubPage\n eyebrow=\"Documentation\"\n title=\"Build with Krizaka\"\n lead=\"Every building block the products are made of, documented from its source.\"\n search={\n <Button variant=\"secondary\" size=\"lg\" className=\"w-full justify-between text-fg-secondary\">\n Search the documentation <Kbd>⌘K</Kbd>\n </Button>\n }\n searchHints={<>Try: <a href=\"#cli\">orazaka install</a> · <a href=\"#button\">Button</a> · <a href=\"#bom\">BOM</a></>}\n collectionsTitle=\"Collections\"\n collections={COLLECTIONS}\n quickstarts={{ title: \"Start in one line\", children: <CodeBlock code=\"npx orazaka install\" language=\"bash\" file=\"Terminal\" copyLabel=\"Copy\" copiedLabel=\"Copied\" /> }}\n popular={{ title: \"Most read\", items: [{ href: \"#cli\", title: \"The CLI\", meta: \"Orazaka\" }, { href: \"#button\", title: \"Button\", meta: \"Krizaka UI\" }, { href: \"#bom\", title: \"The BOM\", meta: \"Java\" }] }}\n whatsNew={{ title: \"What's new\", items: [{ href: \"#ui-260\", title: \"Page blocks: frame, hero, cards, decisions\", meta: \"@krizaka/ui 2.6.0\" }, { href: \"#java-010\", title: \"The platform kit on Maven Central\", meta: \"0.1.0\" }] }}\n promise={{ label: \"The owl's promise\", text: \"Every page here is generated from the code it documents — when the code changes, the page does.\" }}\n />\n );\n}\n"
|
|
200
200
|
},
|
|
201
201
|
"props": [
|
|
202
202
|
{
|
|
@@ -122,7 +122,7 @@
|
|
|
122
122
|
"why": "A person facing an empty page knows what belongs here and how to start.",
|
|
123
123
|
"path": "examples/empty-state/library.tsx",
|
|
124
124
|
"module": "@krizaka/ui/registry/examples/empty-state/library",
|
|
125
|
-
"code": "import { Button } from \"@krizaka/ui/button\";\nimport { EmptyState } from \"@krizaka/ui/empty-state\";\nimport { Mascot } from \"@krizaka/ui/mascots\";\nimport { Page } from \"@krizaka/ui/page\";\n\n// TEMPLATE — a page with nothing in it yet (a creator's library): the page keeps its title and place, the bird says it is\n// empty, one sentence tells what will fill it, one button does the first thing. Never a blank screen.\nexport default function EmptyStateLibrary() {\n return (\n <Page className=\"brand-orochia\">\n <h1 className=\"font-display text-2xl font-extrabold tracking-tight text-fg\">Library</h1>\n <EmptyState\n icon={<Mascot bird=\"flamingo\" mood=\"empty\" size={96} />}\n title=\"Nothing here yet\"\n description=\"Your videos, once published, wait here with their sales. The first one takes about ten minutes.\"\n action={<Button variant=\"primary\"
|
|
125
|
+
"code": "import { Button } from \"@krizaka/ui/button\";\nimport { EmptyState } from \"@krizaka/ui/empty-state\";\nimport { Mascot } from \"@krizaka/ui/mascots\";\nimport { Page } from \"@krizaka/ui/page\";\n\n// TEMPLATE — a page with nothing in it yet (a creator's library): the page keeps its title and place, the bird says it is\n// empty, one sentence tells what will fill it, one button does the first thing. Never a blank screen.\nexport default function EmptyStateLibrary() {\n return (\n <Page className=\"brand-orochia\">\n <h1 className=\"font-display text-2xl font-extrabold tracking-tight text-fg\">Library</h1>\n <EmptyState\n icon={<Mascot bird=\"flamingo\" mood=\"empty\" size={96} />}\n title=\"Nothing here yet\"\n description=\"Your videos, once published, wait here with their sales. The first one takes about ten minutes.\"\n action={<Button variant=\"primary\">Publish a first video</Button>}\n />\n </Page>\n );\n}\n"
|
|
126
126
|
}
|
|
127
127
|
]
|
|
128
128
|
},
|
|
@@ -42,6 +42,7 @@
|
|
|
42
42
|
"Give each node its brand scope (`className=\"brand-<id>\"`) and the figure the hub's: photons going in wear the app's colour, those coming back the engine's.",
|
|
43
43
|
"Draw only what runs: `flow=\"both\"` where results really come back, `planned` (with a `status` word) where nothing is wired yet.",
|
|
44
44
|
"Keep a text version (a list) in the page; give each node a one-line `description` and its `href`.",
|
|
45
|
+
"Tune the stream, not the story: `density` (sparse · normal · dense), `speed`, `easing`, `stagger`, and `trigger` (`always`, `hover`, `active`) change how the photons travel, never what the figure claims; `breathe={false}` keeps the engine still.",
|
|
45
46
|
"Five to eight nodes: radial reads at a glance; on a phone the default `compactLayout` puts them in a row above the hub."
|
|
46
47
|
],
|
|
47
48
|
"accessibility": {
|
|
@@ -97,6 +98,13 @@
|
|
|
97
98
|
"description": "The apps around it.",
|
|
98
99
|
"required": true
|
|
99
100
|
},
|
|
101
|
+
{
|
|
102
|
+
"name": "breathe",
|
|
103
|
+
"type": "boolean",
|
|
104
|
+
"default": "true",
|
|
105
|
+
"description": "The engine's mark swells slowly (a loop, still under reduced motion).",
|
|
106
|
+
"required": false
|
|
107
|
+
},
|
|
100
108
|
{
|
|
101
109
|
"name": "compactLayout",
|
|
102
110
|
"type": "false | FlowLayout",
|
|
@@ -118,6 +126,20 @@
|
|
|
118
126
|
"description": "The node shown in the detail line at first.",
|
|
119
127
|
"required": false
|
|
120
128
|
},
|
|
129
|
+
{
|
|
130
|
+
"name": "density",
|
|
131
|
+
"type": "FlowDensity",
|
|
132
|
+
"default": "normal",
|
|
133
|
+
"description": "How many photons share a conduit: `sparse` one or two, `normal` two to four, `dense` four to eight.",
|
|
134
|
+
"required": false
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"name": "easing",
|
|
138
|
+
"type": "FlowEasing",
|
|
139
|
+
"default": "linear",
|
|
140
|
+
"description": "The photons' timing function: `linear` (a steady stream), `ease-in-out` (a pulse that swells and settles), or any\nCSS `<easing-function>` (`cubic-bezier(.2,0,0,1)`, `steps(6)`).",
|
|
141
|
+
"required": false
|
|
142
|
+
},
|
|
121
143
|
{
|
|
122
144
|
"name": "hint",
|
|
123
145
|
"type": "ReactNode",
|
|
@@ -145,6 +167,20 @@
|
|
|
145
167
|
"default": "16",
|
|
146
168
|
"description": "Photon speed, in units per second (the stage is 100 units wide).",
|
|
147
169
|
"required": false
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"name": "stagger",
|
|
173
|
+
"type": "number",
|
|
174
|
+
"default": "300",
|
|
175
|
+
"description": "Milliseconds between one conduit's photons and the next's: 0 sends them all together.",
|
|
176
|
+
"required": false
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
"name": "trigger",
|
|
180
|
+
"type": "FlowTrigger",
|
|
181
|
+
"default": "always",
|
|
182
|
+
"description": "When the photons travel: `always`; `hover` only while the pointer or focus is on the figure (they rest along the\nconduits otherwise); `active` only on the conduit of the chosen node (the others show nothing). Off screen they\nare always paused, and still under reduced motion.",
|
|
183
|
+
"required": false
|
|
148
184
|
}
|
|
149
185
|
]
|
|
150
186
|
}
|
|
@@ -172,7 +208,7 @@
|
|
|
172
208
|
"files": [
|
|
173
209
|
{
|
|
174
210
|
"path": "engine-flow/engine-flow.tsx",
|
|
175
|
-
"content": "// Client (the node a visitor points at or focuses). An engine at the hub and the apps it serves around it: one conduit\n// per app, and photons that travel it — towards the hub (`in`: requests), back (`out`: results) or both — in the app's\n// brand colour going in and the hub's coming back. A planned app is drawn dim, its conduit dashed and still.\n//\n// Motion is the Krizaka signature's (motion.css): CSS animations of `stroke-dashoffset`, no animation frame, no canvas;\n// paused off screen (`data-motion-scope` → MotionObserver's `data-offscreen`), held while the page settles (`kz-loop`),\n// a still frame under reduced motion (the photons rest along their conduit). The stage keeps its aspect ratio and the\n// detail line its height: no layout shift.\n//\n// Accessible: the drawing is hidden from assistive technology; every node is a real button named by its label, and the\n// detail line (polite live region) says the chosen node's description with its link. Pair it with a text version (a\n// list) in the page: the figure is a picture of it.\nimport * as React from \"react\";\n\nimport { cn } from \"../cn\";\nimport { type FlowConduit, flowGeometry, type FlowLayout } from \"./geometry\";\n\nexport interface EngineFlowNode {\n /** A stable id (`orochia`). */\n id: string;\n /** Its name, the button's accessible name (\"Orochia\"). */\n label: string;\n /** Its mark (a `ProductLogo`), decorative. */\n mark?: React.ReactNode;\n /** One line: what it uses the engine for — shown when the node is pointed at or focused. */\n description?: React.ReactNode;\n /** Where it lives (its site). */\n href?: string;\n /** The link's words (\"Visit dev.orochia.com\"); defaults to the label. */\n linkLabel?: React.ReactNode;\n /** Opens the link in a new tab. */\n external?: boolean;\n /** What travels: `in` towards the hub, `out` back from it, `both`.\n * @default \"in\" */\n flow?: \"in\" | \"out\" | \"both\";\n /** Not wired yet: drawn dim, its conduit dashed and still, no photon. */\n planned?: boolean;\n /** A word beside the name in the detail line (\"planned\"), passed translated. */\n status?: React.ReactNode;\n /** Its brand scope (`brand-orochia`): its conduit, photons and ring take its `--kz-accent`. */\n className?: string;\n}\n\nexport interface EngineFlowHub {\n /** The engine's name (\"Orazaka\"). */\n label: string;\n /** Its mark, decorative. */\n mark?: React.ReactNode;\n /** A line under the name (\"the engine\"). */\n caption?: React.ReactNode;\n /** Its brand scope; the photons coming back take its accent. */\n className?: string;\n}\n\nexport type EngineFlowProps = Omit<React.ComponentProps<\"figure\">, \"children\"> & {\n /** What the figure shows (\"Orazaka and the products it powers\"), passed translated. */\n label: string;\n /** The engine, at the hub. */\n hub: EngineFlowHub;\n /** The apps around it. */\n nodes: readonly EngineFlowNode[];\n /** How the nodes sit around the hub.\n * @default \"radial\" */\n layout?: FlowLayout;\n /** The layout under a 560 px wide container (a phone); `false` keeps `layout` everywhere.\n * @default \"top-to-bottom\" */\n compactLayout?: FlowLayout | false;\n /** `photons` travel the conduits; `none` draws them still.\n * @default \"photons\" */\n particles?: \"photons\" | \"none\";\n /** The conduits' shape.\n * @default \"bezier\" */\n conduit?: FlowConduit;\n /** The detail line before a node is chosen (\"Point at a product\"). */\n hint?: React.ReactNode;\n /** The node shown in the detail line at first. */\n defaultActive?: string;\n /** Photon speed, in units per second (the stage is 100 units wide).\n * @default 16 */\n speed?: number;\n};\n\nfunction Stage({\n layout,\n variant,\n nodes,\n hub,\n conduit,\n particles,\n speed,\n active,\n onActive,\n detailId,\n}: {\n layout: FlowLayout;\n variant: \"wide\" | \"compact\";\n nodes: readonly EngineFlowNode[];\n hub: EngineFlowHub;\n conduit: FlowConduit;\n particles: \"photons\" | \"none\";\n speed: number;\n active: string | undefined;\n onActive: (id: string) => void;\n detailId: string;\n}) {\n const g = flowGeometry(layout, nodes.length, conduit);\n const pct = (v: number, of: number) => `${((v / of) * 100).toFixed(3)}%`;\n return (\n <div className=\"kz-flow-stage\" data-variant={variant} data-layout={layout} style={{ aspectRatio: `${g.width} / ${g.height}` }}>\n <svg viewBox={`0 0 ${g.width} ${g.height}`} aria-hidden=\"true\" focusable=\"false\">\n {nodes.map((node, i) => {\n const flow = node.flow ?? \"in\";\n const length = g.lengths[i] ?? 0;\n // Two to four photons per conduit, evenly spaced; the same speed on every conduit.\n const gap = length / Math.min(4, Math.max(2, Math.round(length / 16)));\n const timing = (dir: \"in\" | \"out\") =>\n ({\n \"--kz-flow-gap\": gap.toFixed(3),\n animationDuration: `${(gap / speed).toFixed(2)}s`,\n animationDelay: `${(-((i * 0.37 + (dir === \"out\" ? 0.5 : 0)) % 1) * (gap / speed)).toFixed(2)}s`,\n }) as React.CSSProperties;\n const lanes = node.planned || particles === \"none\" ? [] : flow === \"both\" ? ([\"in\", \"out\"] as const) : [flow];\n return (\n <g\n key={node.id}\n className={cn(\"kz-flow-link\", node.className)}\n data-flow={flow}\n data-planned={node.planned ? \"\" : undefined}\n data-active={active === node.id ? \"\" : undefined}\n >\n <path className=\"kz-flow-wire\" d={g.paths[i]} />\n {lanes.map((dir) => (\n <React.Fragment key={dir}>\n <path className=\"kz-flow-photon kz-loop\" data-dir={dir} data-halo=\"\" d={g.paths[i]} style={timing(dir)} />\n <path className=\"kz-flow-photon kz-loop\" data-dir={dir} d={g.paths[i]} style={timing(dir)} />\n </React.Fragment>\n ))}\n </g>\n );\n })}\n </svg>\n <div className={cn(\"kz-flow-hub\", hub.className)} style={{ left: pct(g.hub.x, g.width), top: pct(g.hub.y, g.height) }}>\n {hub.mark ? <span className=\"kz-flow-hub-mark\">{hub.mark}</span> : null}\n <span className=\"kz-flow-hub-label\">{hub.label}</span>\n {hub.caption ? <span className=\"kz-flow-hub-caption\">{hub.caption}</span> : null}\n </div>\n <ul className=\"kz-flow-nodes\">\n {nodes.map((node, i) => {\n const p = g.nodes[i]!;\n const on = active === node.id;\n return (\n <li key={node.id} style={{ left: pct(p.x, g.width), top: pct(p.y, g.height) }}>\n <button\n type=\"button\"\n className={cn(\"kz-flow-node\", node.className)}\n data-active={on ? \"\" : undefined}\n data-planned={node.planned ? \"\" : undefined}\n aria-pressed={on}\n aria-controls={detailId}\n onPointerEnter={() => onActive(node.id)}\n onFocus={() => onActive(node.id)}\n onClick={() => onActive(node.id)}\n >\n {node.mark ? (\n <span className=\"kz-flow-node-mark\" aria-hidden=\"true\">\n {node.mark}\n </span>\n ) : null}\n <span className=\"kz-flow-node-label\">{node.label}</span>\n </button>\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\n\n/** An engine at the hub and the apps it serves, with what travels between them. */\nexport function EngineFlow({\n label,\n hub,\n nodes,\n layout = \"radial\",\n compactLayout = \"top-to-bottom\",\n particles = \"photons\",\n conduit = \"bezier\",\n hint,\n defaultActive,\n speed = 16,\n className,\n ...props\n}: EngineFlowProps) {\n const [active, setActive] = React.useState<string | undefined>(defaultActive);\n const detailId = `${React.useId()}-detail`;\n const chosen = nodes.find((n) => n.id === active);\n const compact = compactLayout && compactLayout !== layout ? compactLayout : undefined;\n const stage = { nodes, hub, conduit, particles, speed: Math.max(1, speed), active, onActive: setActive, detailId };\n return (\n <figure\n aria-label={label}\n className={cn(\"kz-flow\", className)}\n data-motion-scope=\"\"\n data-active={chosen ? \"\" : undefined}\n data-compact={compact ? \"\" : undefined}\n {...props}\n >\n <Stage layout={layout} variant=\"wide\" {...stage} />\n {compact ? <Stage layout={compact} variant=\"compact\" {...stage} /> : null}\n <figcaption id={detailId} className={cn(\"kz-flow-detail\", chosen?.className)} aria-live=\"polite\">\n {chosen ? (\n <>\n <strong>{chosen.label}</strong>\n {chosen.status ? <span className=\"kz-flow-status\">{chosen.status}</span> : null}\n {chosen.description ? <span> {chosen.description}</span> : null}\n {chosen.href ? (\n <>\n {\" \"}\n <a href={chosen.href} {...(chosen.external ? { target: \"_blank\", rel: \"noopener\" } : {})}>\n {chosen.linkLabel ?? chosen.label}\n <span aria-hidden=\"true\"> →</span>\n </a>\n </>\n ) : null}\n </>\n ) : (\n hint\n )}\n </figcaption>\n </figure>\n );\n}\n"
|
|
211
|
+
"content": "// Client (the node a visitor points at or focuses). An engine at the hub and the apps it serves around it: one conduit\n// per app, and photons that travel it — towards the hub (`in`: requests), back (`out`: results) or both — in the app's\n// brand colour going in and the hub's coming back. A planned app is drawn dim, its conduit dashed and still.\n//\n// Motion is the Krizaka signature's (motion.css): CSS animations of `stroke-dashoffset`, no animation frame, no canvas;\n// paused off screen (`data-motion-scope` → MotionObserver's `data-offscreen`), held while the page settles (`kz-loop`),\n// a still frame under reduced motion (the photons rest along their conduit). The stage keeps its aspect ratio and the\n// detail line its height: no layout shift.\n//\n// Accessible: the drawing is hidden from assistive technology; every node is a real button named by its label, and the\n// detail line (polite live region) says the chosen node's description with its link. Pair it with a text version (a\n// list) in the page: the figure is a picture of it.\nimport * as React from \"react\";\n\nimport { cn } from \"../cn\";\nimport { type FlowConduit, flowGeometry, type FlowLayout } from \"./geometry\";\n\nexport interface EngineFlowNode {\n /** A stable id (`orochia`). */\n id: string;\n /** Its name, the button's accessible name (\"Orochia\"). */\n label: string;\n /** Its mark (a `ProductLogo`), decorative. */\n mark?: React.ReactNode;\n /** One line: what it uses the engine for — shown when the node is pointed at or focused. */\n description?: React.ReactNode;\n /** Where it lives (its site). */\n href?: string;\n /** The link's words (\"Visit dev.orochia.com\"); defaults to the label. */\n linkLabel?: React.ReactNode;\n /** Opens the link in a new tab. */\n external?: boolean;\n /** What travels: `in` towards the hub, `out` back from it, `both`.\n * @default \"in\" */\n flow?: \"in\" | \"out\" | \"both\";\n /** Not wired yet: drawn dim, its conduit dashed and still, no photon. */\n planned?: boolean;\n /** A word beside the name in the detail line (\"planned\"), passed translated. */\n status?: React.ReactNode;\n /** Its brand scope (`brand-orochia`): its conduit, photons and ring take its `--kz-accent`. */\n className?: string;\n}\n\nexport interface EngineFlowHub {\n /** The engine's name (\"Orazaka\"). */\n label: string;\n /** Its mark, decorative. */\n mark?: React.ReactNode;\n /** A line under the name (\"the engine\"). */\n caption?: React.ReactNode;\n /** Its brand scope; the photons coming back take its accent. */\n className?: string;\n}\n\nexport type EngineFlowProps = Omit<React.ComponentProps<\"figure\">, \"children\"> & {\n /** What the figure shows (\"Orazaka and the products it powers\"), passed translated. */\n label: string;\n /** The engine, at the hub. */\n hub: EngineFlowHub;\n /** The apps around it. */\n nodes: readonly EngineFlowNode[];\n /** How the nodes sit around the hub.\n * @default \"radial\" */\n layout?: FlowLayout;\n /** The layout under a 560 px wide container (a phone); `false` keeps `layout` everywhere.\n * @default \"top-to-bottom\" */\n compactLayout?: FlowLayout | false;\n /** `photons` travel the conduits; `none` draws them still.\n * @default \"photons\" */\n particles?: \"photons\" | \"none\";\n /** The conduits' shape.\n * @default \"bezier\" */\n conduit?: FlowConduit;\n /** The detail line before a node is chosen (\"Point at a product\"). */\n hint?: React.ReactNode;\n /** The node shown in the detail line at first. */\n defaultActive?: string;\n /** Photon speed, in units per second (the stage is 100 units wide).\n * @default 16 */\n speed?: number;\n /** How many photons share a conduit: `sparse` one or two, `normal` two to four, `dense` four to eight.\n * @default \"normal\" */\n density?: FlowDensity;\n /** When the photons travel: `always`; `hover` only while the pointer or focus is on the figure (they rest along the\n * conduits otherwise); `active` only on the conduit of the chosen node (the others show nothing). Off screen they\n * are always paused, and still under reduced motion.\n * @default \"always\" */\n trigger?: FlowTrigger;\n /** The photons' timing function: `linear` (a steady stream), `ease-in-out` (a pulse that swells and settles), or any\n * CSS `<easing-function>` (`cubic-bezier(.2,0,0,1)`, `steps(6)`).\n * @default \"linear\" */\n easing?: FlowEasing;\n /** Milliseconds between one conduit's photons and the next's: 0 sends them all together.\n * @default 300 */\n stagger?: number;\n /** The engine's mark swells slowly (a loop, still under reduced motion).\n * @default true */\n breathe?: boolean;\n};\n\nexport type FlowDensity = \"sparse\" | \"normal\" | \"dense\";\nexport type FlowTrigger = \"always\" | \"hover\" | \"active\";\nexport type FlowEasing = \"linear\" | \"ease-in-out\" | (string & {});\n\n/** How many photons a conduit of this length carries (evenly spaced, so the gap is `length / count`). */\nexport function photonCount(length: number, density: FlowDensity = \"normal\"): number {\n const base = Math.round(length / 16);\n if (density === \"sparse\") return Math.min(2, Math.max(1, Math.round(base / 2)));\n if (density === \"dense\") return Math.min(8, Math.max(4, base * 2));\n return Math.min(4, Math.max(2, base));\n}\n\nfunction Stage({\n layout,\n variant,\n nodes,\n hub,\n conduit,\n particles,\n speed,\n density,\n easing,\n stagger,\n breathe,\n active,\n onActive,\n detailId,\n}: {\n layout: FlowLayout;\n variant: \"wide\" | \"compact\";\n nodes: readonly EngineFlowNode[];\n hub: EngineFlowHub;\n conduit: FlowConduit;\n particles: \"photons\" | \"none\";\n speed: number;\n density: FlowDensity;\n easing: FlowEasing;\n stagger: number;\n breathe: boolean;\n active: string | undefined;\n onActive: (id: string) => void;\n detailId: string;\n}) {\n const g = flowGeometry(layout, nodes.length, conduit);\n const pct = (v: number, of: number) => `${((v / of) * 100).toFixed(3)}%`;\n return (\n <div className=\"kz-flow-stage\" data-variant={variant} data-layout={layout} style={{ aspectRatio: `${g.width} / ${g.height}` }}>\n <svg viewBox={`0 0 ${g.width} ${g.height}`} aria-hidden=\"true\" focusable=\"false\">\n {nodes.map((node, i) => {\n const flow = node.flow ?? \"in\";\n const length = g.lengths[i] ?? 0;\n // Photons per conduit (`density`), evenly spaced; the same speed on every conduit.\n const gap = length / photonCount(length, density);\n const period = gap / speed;\n const timing = (dir: \"in\" | \"out\") =>\n ({\n \"--kz-flow-gap\": gap.toFixed(3),\n animationDuration: `${period.toFixed(2)}s`,\n // Each conduit starts `stagger` ms after the previous (a negative delay: already under way); the way back is half a period behind.\n animationDelay: `${(-(((i * stagger) / 1000 + (dir === \"out\" ? period / 2 : 0)) % period)).toFixed(2)}s`,\n ...(easing !== \"linear\" ? { animationTimingFunction: easing } : {}),\n }) as React.CSSProperties;\n const lanes = node.planned || particles === \"none\" ? [] : flow === \"both\" ? ([\"in\", \"out\"] as const) : [flow];\n return (\n <g\n key={node.id}\n className={cn(\"kz-flow-link\", node.className)}\n data-flow={flow}\n data-planned={node.planned ? \"\" : undefined}\n data-active={active === node.id ? \"\" : undefined}\n >\n <path className=\"kz-flow-wire\" d={g.paths[i]} />\n {lanes.map((dir) => (\n <React.Fragment key={dir}>\n <path className=\"kz-flow-photon kz-loop\" data-dir={dir} data-halo=\"\" d={g.paths[i]} style={timing(dir)} />\n <path className=\"kz-flow-photon kz-loop\" data-dir={dir} d={g.paths[i]} style={timing(dir)} />\n </React.Fragment>\n ))}\n </g>\n );\n })}\n </svg>\n <div className={cn(\"kz-flow-hub\", hub.className)} style={{ left: pct(g.hub.x, g.width), top: pct(g.hub.y, g.height) }}>\n {hub.mark ? <span className={cn(\"kz-flow-hub-mark\", breathe && \"kz-loop\")}>{hub.mark}</span> : null}\n <span className=\"kz-flow-hub-label\">{hub.label}</span>\n {hub.caption ? <span className=\"kz-flow-hub-caption\">{hub.caption}</span> : null}\n </div>\n <ul className=\"kz-flow-nodes\">\n {nodes.map((node, i) => {\n const p = g.nodes[i]!;\n const on = active === node.id;\n return (\n <li key={node.id} style={{ left: pct(p.x, g.width), top: pct(p.y, g.height) }}>\n <button\n type=\"button\"\n className={cn(\"kz-flow-node\", node.className)}\n data-active={on ? \"\" : undefined}\n data-planned={node.planned ? \"\" : undefined}\n aria-pressed={on}\n aria-controls={detailId}\n onPointerEnter={() => onActive(node.id)}\n onFocus={() => onActive(node.id)}\n onClick={() => onActive(node.id)}\n >\n {node.mark ? (\n <span className=\"kz-flow-node-mark\" aria-hidden=\"true\">\n {node.mark}\n </span>\n ) : null}\n <span className=\"kz-flow-node-label\">{node.label}</span>\n </button>\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\n\n/** An engine at the hub and the apps it serves, with what travels between them. */\nexport function EngineFlow({\n label,\n hub,\n nodes,\n layout = \"radial\",\n compactLayout = \"top-to-bottom\",\n particles = \"photons\",\n conduit = \"bezier\",\n hint,\n defaultActive,\n speed = 16,\n density = \"normal\",\n trigger = \"always\",\n easing = \"linear\",\n stagger = 300,\n breathe = true,\n className,\n ...props\n}: EngineFlowProps) {\n const [active, setActive] = React.useState<string | undefined>(defaultActive);\n const detailId = `${React.useId()}-detail`;\n const chosen = nodes.find((n) => n.id === active);\n const compact = compactLayout && compactLayout !== layout ? compactLayout : undefined;\n const stage = { nodes, hub, conduit, particles, speed: Math.max(1, speed), density, easing, stagger: Math.max(0, stagger), breathe, active, onActive: setActive, detailId };\n return (\n <figure\n aria-label={label}\n className={cn(\"kz-flow\", className)}\n data-motion-scope=\"\"\n data-active={chosen ? \"\" : undefined}\n data-trigger={trigger === \"always\" ? undefined : trigger}\n data-density={density === \"normal\" ? undefined : density}\n data-compact={compact ? \"\" : undefined}\n {...props}\n >\n <Stage layout={layout} variant=\"wide\" {...stage} />\n {compact ? <Stage layout={compact} variant=\"compact\" {...stage} /> : null}\n <figcaption id={detailId} className={cn(\"kz-flow-detail\", chosen?.className)} aria-live=\"polite\">\n {chosen ? (\n <>\n <strong>{chosen.label}</strong>\n {chosen.status ? <span className=\"kz-flow-status\">{chosen.status}</span> : null}\n {chosen.description ? <span> {chosen.description}</span> : null}\n {chosen.href ? (\n <>\n {\" \"}\n <a href={chosen.href} {...(chosen.external ? { target: \"_blank\", rel: \"noopener\" } : {})}>\n {chosen.linkLabel ?? chosen.label}\n <span aria-hidden=\"true\"> →</span>\n </a>\n </>\n ) : null}\n </>\n ) : (\n hint\n )}\n </figcaption>\n </figure>\n );\n}\n"
|
|
176
212
|
},
|
|
177
213
|
{
|
|
178
214
|
"path": "engine-flow/geometry.ts",
|
|
@@ -180,11 +216,11 @@
|
|
|
180
216
|
},
|
|
181
217
|
{
|
|
182
218
|
"path": "engine-flow/index.ts",
|
|
183
|
-
"content": "/** @krizaka/ui/engine-flow — `EngineFlow`: an engine at the hub, the apps it serves around it, what travels between them (SVG + CSS, no animation frame). Client. */\nexport {
|
|
219
|
+
"content": "/** @krizaka/ui/engine-flow — `EngineFlow`: an engine at the hub, the apps it serves around it, what travels between them (SVG + CSS, no animation frame). Client. */\nexport {\n EngineFlow,\n type EngineFlowHub,\n type EngineFlowNode,\n type EngineFlowProps,\n type FlowDensity,\n type FlowEasing,\n type FlowTrigger,\n photonCount,\n} from \"./engine-flow\";\nexport { FLOW_HEIGHT, type FlowConduit, type FlowGeometry, flowGeometry, type FlowLayout, type FlowPoint,flowPositions } from \"./geometry\";\n"
|
|
184
220
|
},
|
|
185
221
|
{
|
|
186
222
|
"path": "engine-flow/meta.ts",
|
|
187
|
-
"content": "import type { ComponentMeta } from \"../meta\";\n\nexport const meta = {\n title: \"Engine flow\",\n summary:\n \"An engine at the hub and the apps it serves around it, with what travels between them: photons going in (requests) and coming back (results) along each conduit — radial on a wide screen, top to bottom on a phone, planned apps dim and still.\",\n status: \"beta\",\n category: \"data-display\",\n platforms: \"web\",\n parity: {\n native: { status: \"n/a\", reason: \"A diagram of a public site's page; an app screen lists the same facts.\" , use: \"list\" },\n desktop: \"web\",\n },\n whenToUse: [\n \"Showing one platform and the products built on it, in one glance: « one engine, the products it powers ».\",\n \"Saying which way data goes per app — in, back, or both — only where it really runs; what is planned is drawn planned.\",\n ],\n whenNotToUse: [\n { when: \"A sequence of steps a reader follows in order.\", use: \"stepper\" },\n { when: \"Entry points to pages, where the cards are the content.\", use: \"card-grid\" },\n { when: \"A chart of figures over time.\" },\n ],\n bestPractices: [\n \"Give each node its brand scope (`className=\\\"brand-<id>\\\"`) and the figure the hub's: photons going in wear the app's colour, those coming back the engine's.\",\n \"Draw only what runs: `flow=\\\"both\\\"` where results really come back, `planned` (with a `status` word) where nothing is wired yet.\",\n \"Keep a text version (a list) in the page; give each node a one-line `description` and its `href`.\",\n \"Five to eight nodes: radial reads at a glance; on a phone the default `compactLayout` puts them in a row above the hub.\",\n ],\n accessibility: {\n keyboard: [\n { keys: \"Tab\", action: \"Goes through the nodes, then the link of the detail line.\" },\n { keys: \"Enter / Space\", action: \"Chooses the node: the detail line says its description and its link.\" },\n ],\n notes: [\n \"The drawing (conduits, photons) is hidden from assistive technology; each node is a button named by its label, `aria-pressed` when chosen.\",\n \"The detail line is a polite live region: pointing at or focusing a node announces its line.\",\n \"Motion is CSS (motion.css): paused off screen (MotionObserver), held while the page settles, a still frame under reduced motion. No animation frame, no canvas.\",\n \"The stage keeps its aspect ratio and the detail line its height: no layout shift.\",\n ],\n },\n related: [\"card-grid\", \"glow-card\", \"iso\", \"number-ticker\"],\n web: {\n imports: [\"EngineFlow\"],\n examples: [\n { name: \"radial\", title: \"One engine, the products it powers\", description: \"Radial on a wide screen: both ways where results come back, planned products dim and still.\" },\n { name: \"compact\", title: \"On a phone\", description: \"Top to bottom: the products in a row above, flowing down into the engine; the detail line names the chosen one.\" },\n ],\n },\n} satisfies ComponentMeta;\n"
|
|
223
|
+
"content": "import type { ComponentMeta } from \"../meta\";\n\nexport const meta = {\n title: \"Engine flow\",\n summary:\n \"An engine at the hub and the apps it serves around it, with what travels between them: photons going in (requests) and coming back (results) along each conduit — radial on a wide screen, top to bottom on a phone, planned apps dim and still.\",\n status: \"beta\",\n category: \"data-display\",\n platforms: \"web\",\n parity: {\n native: { status: \"n/a\", reason: \"A diagram of a public site's page; an app screen lists the same facts.\" , use: \"list\" },\n desktop: \"web\",\n },\n whenToUse: [\n \"Showing one platform and the products built on it, in one glance: « one engine, the products it powers ».\",\n \"Saying which way data goes per app — in, back, or both — only where it really runs; what is planned is drawn planned.\",\n ],\n whenNotToUse: [\n { when: \"A sequence of steps a reader follows in order.\", use: \"stepper\" },\n { when: \"Entry points to pages, where the cards are the content.\", use: \"card-grid\" },\n { when: \"A chart of figures over time.\" },\n ],\n bestPractices: [\n \"Give each node its brand scope (`className=\\\"brand-<id>\\\"`) and the figure the hub's: photons going in wear the app's colour, those coming back the engine's.\",\n \"Draw only what runs: `flow=\\\"both\\\"` where results really come back, `planned` (with a `status` word) where nothing is wired yet.\",\n \"Keep a text version (a list) in the page; give each node a one-line `description` and its `href`.\",\n \"Tune the stream, not the story: `density` (sparse · normal · dense), `speed`, `easing`, `stagger`, and `trigger` (`always`, `hover`, `active`) change how the photons travel, never what the figure claims; `breathe={false}` keeps the engine still.\",\n \"Five to eight nodes: radial reads at a glance; on a phone the default `compactLayout` puts them in a row above the hub.\",\n ],\n accessibility: {\n keyboard: [\n { keys: \"Tab\", action: \"Goes through the nodes, then the link of the detail line.\" },\n { keys: \"Enter / Space\", action: \"Chooses the node: the detail line says its description and its link.\" },\n ],\n notes: [\n \"The drawing (conduits, photons) is hidden from assistive technology; each node is a button named by its label, `aria-pressed` when chosen.\",\n \"The detail line is a polite live region: pointing at or focusing a node announces its line.\",\n \"Motion is CSS (motion.css): paused off screen (MotionObserver), held while the page settles, a still frame under reduced motion. No animation frame, no canvas.\",\n \"The stage keeps its aspect ratio and the detail line its height: no layout shift.\",\n ],\n },\n related: [\"card-grid\", \"glow-card\", \"iso\", \"number-ticker\"],\n web: {\n imports: [\"EngineFlow\"],\n examples: [\n { name: \"radial\", title: \"One engine, the products it powers\", description: \"Radial on a wide screen: both ways where results come back, planned products dim and still.\" },\n { name: \"compact\", title: \"On a phone\", description: \"Top to bottom: the products in a row above, flowing down into the engine; the detail line names the chosen one.\" },\n ],\n },\n} satisfies ComponentMeta;\n"
|
|
188
224
|
},
|
|
189
225
|
{
|
|
190
226
|
"path": "meta.ts",
|
|
@@ -225,6 +261,13 @@
|
|
|
225
261
|
"description": "The apps around it.",
|
|
226
262
|
"required": true
|
|
227
263
|
},
|
|
264
|
+
{
|
|
265
|
+
"name": "breathe",
|
|
266
|
+
"type": "boolean",
|
|
267
|
+
"default": "true",
|
|
268
|
+
"description": "The engine's mark swells slowly (a loop, still under reduced motion).",
|
|
269
|
+
"required": false
|
|
270
|
+
},
|
|
228
271
|
{
|
|
229
272
|
"name": "compactLayout",
|
|
230
273
|
"type": "false | FlowLayout",
|
|
@@ -246,6 +289,20 @@
|
|
|
246
289
|
"description": "The node shown in the detail line at first.",
|
|
247
290
|
"required": false
|
|
248
291
|
},
|
|
292
|
+
{
|
|
293
|
+
"name": "density",
|
|
294
|
+
"type": "FlowDensity",
|
|
295
|
+
"default": "normal",
|
|
296
|
+
"description": "How many photons share a conduit: `sparse` one or two, `normal` two to four, `dense` four to eight.",
|
|
297
|
+
"required": false
|
|
298
|
+
},
|
|
299
|
+
{
|
|
300
|
+
"name": "easing",
|
|
301
|
+
"type": "FlowEasing",
|
|
302
|
+
"default": "linear",
|
|
303
|
+
"description": "The photons' timing function: `linear` (a steady stream), `ease-in-out` (a pulse that swells and settles), or any\nCSS `<easing-function>` (`cubic-bezier(.2,0,0,1)`, `steps(6)`).",
|
|
304
|
+
"required": false
|
|
305
|
+
},
|
|
249
306
|
{
|
|
250
307
|
"name": "hint",
|
|
251
308
|
"type": "ReactNode",
|
|
@@ -273,6 +330,20 @@
|
|
|
273
330
|
"default": "16",
|
|
274
331
|
"description": "Photon speed, in units per second (the stage is 100 units wide).",
|
|
275
332
|
"required": false
|
|
333
|
+
},
|
|
334
|
+
{
|
|
335
|
+
"name": "stagger",
|
|
336
|
+
"type": "number",
|
|
337
|
+
"default": "300",
|
|
338
|
+
"description": "Milliseconds between one conduit's photons and the next's: 0 sends them all together.",
|
|
339
|
+
"required": false
|
|
340
|
+
},
|
|
341
|
+
{
|
|
342
|
+
"name": "trigger",
|
|
343
|
+
"type": "FlowTrigger",
|
|
344
|
+
"default": "always",
|
|
345
|
+
"description": "When the photons travel: `always`; `hover` only while the pointer or focus is on the figure (they rest along the\nconduits otherwise); `active` only on the conduit of the chosen node (the others show nothing). Off screen they\nare always paused, and still under reduced motion.",
|
|
346
|
+
"required": false
|
|
276
347
|
}
|
|
277
348
|
]
|
|
278
349
|
}
|
|
@@ -38,7 +38,7 @@ function AppShellAdminConsole() {
|
|
|
38
38
|
/* @__PURE__ */ jsx(AppShell.Item, { href: "#backups", icon: icon("M4 7c0-2 16-2 16 0v10c0 2-16 2-16 0zM4 12c0 2 16 2 16 0"), label: "Backups" })
|
|
39
39
|
] }),
|
|
40
40
|
/* @__PURE__ */ jsxs(AppShell.Body, { children: [
|
|
41
|
-
/* @__PURE__ */ jsx(AppShell.Header, { title: "Verification", menuLabel: "Open the menu", actions: /* @__PURE__ */ jsx(Button, { size: "sm", variant: "secondary",
|
|
41
|
+
/* @__PURE__ */ jsx(AppShell.Header, { title: "Verification", menuLabel: "Open the menu", actions: /* @__PURE__ */ jsx(Button, { size: "sm", variant: "secondary", children: "Export" }) }),
|
|
42
42
|
/* @__PURE__ */ jsx(AppShell.Main, { children: /* @__PURE__ */ jsxs(DashboardLayout, { headingAs: "h2", title: "Requests to review", description: "Oldest first. A decision is logged with your name.", children: [
|
|
43
43
|
/* @__PURE__ */ jsx(Widget, { level: 3, title: "Pending", description: "identity and payout", children: /* @__PURE__ */ jsx("p", { className: "font-display text-3xl font-extrabold text-fg", children: "2" }) }),
|
|
44
44
|
/* @__PURE__ */ jsx(Widget, { level: 3, title: "Oldest wait", children: /* @__PURE__ */ jsx("p", { className: "font-display text-3xl font-extrabold text-fg", children: "40 min" }) }),
|
|
@@ -44,7 +44,7 @@ export default function AppShellAdminConsole() {
|
|
|
44
44
|
<AppShell.Item href="#backups" icon={icon("M4 7c0-2 16-2 16 0v10c0 2-16 2-16 0zM4 12c0 2 16 2 16 0")} label="Backups" />
|
|
45
45
|
</AppShell.Sidebar>
|
|
46
46
|
<AppShell.Body>
|
|
47
|
-
<AppShell.Header title="Verification" menuLabel="Open the menu" actions={<Button size="sm" variant="secondary"
|
|
47
|
+
<AppShell.Header title="Verification" menuLabel="Open the menu" actions={<Button size="sm" variant="secondary">Export</Button>} />
|
|
48
48
|
<AppShell.Main>
|
|
49
49
|
<DashboardLayout headingAs="h2" title="Requests to review" description="Oldest first. A decision is logged with your name.">
|
|
50
50
|
<Widget level={3} title="Pending" description="identity and payout">
|
|
@@ -27,7 +27,7 @@ function AppShellBasic() {
|
|
|
27
27
|
}
|
|
28
28
|
),
|
|
29
29
|
/* @__PURE__ */ jsxs(AppShell.Body, { children: [
|
|
30
|
-
/* @__PURE__ */ jsx(AppShell.Header, { title: "Home", menuLabel: "Open the menu", actions: /* @__PURE__ */ jsx(Button, { size: "sm", variant: "primary",
|
|
30
|
+
/* @__PURE__ */ jsx(AppShell.Header, { title: "Home", menuLabel: "Open the menu", actions: /* @__PURE__ */ jsx(Button, { size: "sm", variant: "primary", children: "Upload" }) }),
|
|
31
31
|
/* @__PURE__ */ jsx(AppShell.Main, { children: /* @__PURE__ */ jsx("p", { className: "text-sm text-fg-secondary", children: "The screen's content." }) })
|
|
32
32
|
] })
|
|
33
33
|
] });
|
|
@@ -21,7 +21,7 @@ export default function AppShellBasic() {
|
|
|
21
21
|
<AppShell.Item href="#earnings" icon={dot} label="Earnings" />
|
|
22
22
|
</AppShell.Sidebar>
|
|
23
23
|
<AppShell.Body>
|
|
24
|
-
<AppShell.Header title="Home" menuLabel="Open the menu" actions={<Button size="sm" variant="primary"
|
|
24
|
+
<AppShell.Header title="Home" menuLabel="Open the menu" actions={<Button size="sm" variant="primary">Upload</Button>} />
|
|
25
25
|
<AppShell.Main>
|
|
26
26
|
<p className="text-sm text-fg-secondary">The screen's content.</p>
|
|
27
27
|
</AppShell.Main>
|
|
@@ -22,7 +22,7 @@ function AppShellDesktop() {
|
|
|
22
22
|
/* @__PURE__ */ jsx(AppShell.Item, { href: "#logs", icon: dot, label: "Logs" })
|
|
23
23
|
] }),
|
|
24
24
|
/* @__PURE__ */ jsxs(AppShell.Body, { children: [
|
|
25
|
-
/* @__PURE__ */ jsx(AppShell.Header, { title: "Models", menuLabel: "Open the menu", actions: /* @__PURE__ */ jsx(Button, { size: "sm", variant: "primary",
|
|
25
|
+
/* @__PURE__ */ jsx(AppShell.Header, { title: "Models", menuLabel: "Open the menu", actions: /* @__PURE__ */ jsx(Button, { size: "sm", variant: "primary", children: "Add a model" }) }),
|
|
26
26
|
/* @__PURE__ */ jsxs(AppShell.Main, { className: "space-y-4", children: [
|
|
27
27
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-3 rounded-lg border border-border-subtle bg-surface-1 p-4", children: [
|
|
28
28
|
/* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1 space-y-2", children: [
|
|
@@ -20,7 +20,7 @@ export default function AppShellDesktop() {
|
|
|
20
20
|
<AppShell.Item href="#logs" icon={dot} label="Logs" />
|
|
21
21
|
</AppShell.Sidebar>
|
|
22
22
|
<AppShell.Body>
|
|
23
|
-
<AppShell.Header title="Models" menuLabel="Open the menu" actions={<Button size="sm" variant="primary"
|
|
23
|
+
<AppShell.Header title="Models" menuLabel="Open the menu" actions={<Button size="sm" variant="primary">Add a model</Button>} />
|
|
24
24
|
<AppShell.Main className="space-y-4">
|
|
25
25
|
<div className="flex items-center justify-between gap-3 rounded-lg border border-border-subtle bg-surface-1 p-4">
|
|
26
26
|
<div className="min-w-0 flex-1 space-y-2">
|
|
@@ -55,7 +55,7 @@ function AppShellOrochiaStudio() {
|
|
|
55
55
|
{
|
|
56
56
|
title: "Studio",
|
|
57
57
|
menuLabel: "Open the menu",
|
|
58
|
-
actions: /* @__PURE__ */ jsx(Button, { size: "sm", variant: "primary",
|
|
58
|
+
actions: /* @__PURE__ */ jsx(Button, { size: "sm", variant: "primary", children: "Upload a video" })
|
|
59
59
|
}
|
|
60
60
|
),
|
|
61
61
|
/* @__PURE__ */ jsx(AppShell.Main, { children: /* @__PURE__ */ jsxs(DashboardLayout, { headingAs: "h2", eyebrow: "This week", title: "Good morning, Elena", description: "Three sales since yesterday \u2014 your auction ends tonight.", children: [
|
|
@@ -59,7 +59,7 @@ export default function AppShellOrochiaStudio() {
|
|
|
59
59
|
<AppShell.Header
|
|
60
60
|
title="Studio"
|
|
61
61
|
menuLabel="Open the menu"
|
|
62
|
-
actions={<Button size="sm" variant="primary"
|
|
62
|
+
actions={<Button size="sm" variant="primary">Upload a video</Button>}
|
|
63
63
|
/>
|
|
64
64
|
<AppShell.Main>
|
|
65
65
|
<DashboardLayout headingAs="h2" eyebrow="This week" title="Good morning, Elena" description="Three sales since yesterday — your auction ends tonight.">
|
|
@@ -10,7 +10,7 @@ var reasons = [
|
|
|
10
10
|
{ id: "telemetry", title: "Zero telemetry", hook: "Elsewhere, usage data is the price of the free tier." }
|
|
11
11
|
];
|
|
12
12
|
function ArgumentCardHoverQuiet() {
|
|
13
|
-
return /* @__PURE__ */ jsx(CardGrid, { className: "w-full max-w-5xl", min: 260, reveal: false,
|
|
13
|
+
return /* @__PURE__ */ jsx(CardGrid, { className: "w-full max-w-5xl", min: 260, reveal: false, children: reasons.map((r) => /* @__PURE__ */ jsx(ArgumentCard, { id: `quiet-${r.id}`, title: r.title, hook: { label: "The trap elsewhere", text: r.hook }, more: { href: `#${r.id}`, label: "Details" } }, r.id)) });
|
|
14
14
|
}
|
|
15
15
|
export {
|
|
16
16
|
ArgumentCardHoverQuiet as default
|
|
@@ -10,7 +10,7 @@ const reasons = [
|
|
|
10
10
|
// The quiet hover on the reasons: no glow, a lift, a ring on focus. The grid is quiet, so every card is.
|
|
11
11
|
export default function ArgumentCardHoverQuiet() {
|
|
12
12
|
return (
|
|
13
|
-
<CardGrid className="w-full max-w-5xl" min={260} reveal={false}
|
|
13
|
+
<CardGrid className="w-full max-w-5xl" min={260} reveal={false}>
|
|
14
14
|
{reasons.map((r) => (
|
|
15
15
|
<ArgumentCard key={r.id} id={`quiet-${r.id}`} title={r.title} hook={{ label: "The trap elsewhere", text: r.hook }} more={{ href: `#${r.id}`, label: "Details" }} />
|
|
16
16
|
))}
|
|
@@ -43,8 +43,8 @@ function AuthLayoutOnboarding() {
|
|
|
43
43
|
/* @__PURE__ */ jsx(Field.Hint, { id: "onboarding-iban-hint", children: "Checked before your first payout." })
|
|
44
44
|
] }),
|
|
45
45
|
/* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
|
|
46
|
-
/* @__PURE__ */ jsx(Button, { type: "button", variant: "secondary", size: "lg",
|
|
47
|
-
/* @__PURE__ */ jsx(Button, { type: "submit", variant: "primary", size: "lg",
|
|
46
|
+
/* @__PURE__ */ jsx(Button, { type: "button", variant: "secondary", size: "lg", className: "flex-1", children: "Back" }),
|
|
47
|
+
/* @__PURE__ */ jsx(Button, { type: "submit", variant: "primary", size: "lg", className: "flex-1", children: "Continue" })
|
|
48
48
|
] })
|
|
49
49
|
] })
|
|
50
50
|
]
|
|
@@ -37,8 +37,8 @@ export default function AuthLayoutOnboarding() {
|
|
|
37
37
|
<Field.Hint id="onboarding-iban-hint">Checked before your first payout.</Field.Hint>
|
|
38
38
|
</Field.Root>
|
|
39
39
|
<div className="flex gap-2">
|
|
40
|
-
<Button type="button" variant="secondary" size="lg"
|
|
41
|
-
<Button type="submit" variant="primary" size="lg"
|
|
40
|
+
<Button type="button" variant="secondary" size="lg" className="flex-1">Back</Button>
|
|
41
|
+
<Button type="submit" variant="primary" size="lg" className="flex-1">Continue</Button>
|
|
42
42
|
</div>
|
|
43
43
|
</form>
|
|
44
44
|
</AuthLayout>
|
|
@@ -44,8 +44,8 @@ function AuthLayoutSignIn() {
|
|
|
44
44
|
/* @__PURE__ */ jsx(Input, { id: "sign-in-password", type: "password", autoComplete: "current-password" }),
|
|
45
45
|
/* @__PURE__ */ jsx(Field.Hint, { children: /* @__PURE__ */ jsx("a", { className: "text-fg-accent", href: "#reset", children: "Forgot it?" }) })
|
|
46
46
|
] }),
|
|
47
|
-
/* @__PURE__ */ jsx(Button, { type: "submit", variant: "primary", size: "lg",
|
|
48
|
-
/* @__PURE__ */ jsx(Button, { type: "button", variant: "secondary", size: "lg",
|
|
47
|
+
/* @__PURE__ */ jsx(Button, { type: "submit", variant: "primary", size: "lg", className: "w-full", children: "Sign in" }),
|
|
48
|
+
/* @__PURE__ */ jsx(Button, { type: "button", variant: "secondary", size: "lg", className: "w-full", children: "Use a passkey" })
|
|
49
49
|
] })
|
|
50
50
|
}
|
|
51
51
|
) });
|
|
@@ -34,10 +34,10 @@ export default function AuthLayoutSignIn() {
|
|
|
34
34
|
<Input id="sign-in-password" type="password" autoComplete="current-password" />
|
|
35
35
|
<Field.Hint><a className="text-fg-accent" href="#reset">Forgot it?</a></Field.Hint>
|
|
36
36
|
</Field.Root>
|
|
37
|
-
<Button type="submit" variant="primary" size="lg"
|
|
37
|
+
<Button type="submit" variant="primary" size="lg" className="w-full">
|
|
38
38
|
Sign in
|
|
39
39
|
</Button>
|
|
40
|
-
<Button type="button" variant="secondary" size="lg"
|
|
40
|
+
<Button type="button" variant="secondary" size="lg" className="w-full">
|
|
41
41
|
Use a passkey
|
|
42
42
|
</Button>
|
|
43
43
|
</form>
|
|
@@ -15,7 +15,7 @@ function AuthLayoutVerify() {
|
|
|
15
15
|
/* @__PURE__ */ jsx(Field.Label, { htmlFor: "verify-code", children: "Code" }),
|
|
16
16
|
/* @__PURE__ */ jsx(Input, { id: "verify-code", inputMode: "numeric", autoComplete: "one-time-code", maxLength: 6 })
|
|
17
17
|
] }),
|
|
18
|
-
/* @__PURE__ */ jsx(Button, { type: "submit", variant: "primary", size: "lg",
|
|
18
|
+
/* @__PURE__ */ jsx(Button, { type: "submit", variant: "primary", size: "lg", className: "w-full", children: "Verify" })
|
|
19
19
|
] }) });
|
|
20
20
|
}
|
|
21
21
|
export {
|
|
@@ -12,7 +12,7 @@ export default function AuthLayoutVerify() {
|
|
|
12
12
|
<Field.Label htmlFor="verify-code">Code</Field.Label>
|
|
13
13
|
<Input id="verify-code" inputMode="numeric" autoComplete="one-time-code" maxLength={6} />
|
|
14
14
|
</Field.Root>
|
|
15
|
-
<Button type="submit" variant="primary" size="lg"
|
|
15
|
+
<Button type="submit" variant="primary" size="lg" className="w-full">Verify</Button>
|
|
16
16
|
</form>
|
|
17
17
|
</AuthLayout>
|
|
18
18
|
);
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|