@krizaka/ui 3.29.0 → 3.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -8
- package/dist/action-bar.js +3 -3
- package/dist/action-bar.js.map +1 -1
- package/dist/argument-card.d.ts +1 -1
- package/dist/argument-card.js +2 -2
- package/dist/argument-card.js.map +1 -1
- package/dist/blocks.css +19 -60
- package/dist/{button-BmCrLCq7.d.ts → button-Cm9pFH3P.d.ts} +10 -9
- package/dist/button.d.ts +11 -10
- package/dist/button.js +1 -1
- package/dist/captcha.js +1 -1
- package/dist/card-grid.d.ts +5 -12
- package/dist/card-grid.js +4 -12
- package/dist/card-grid.js.map +1 -1
- package/dist/card.d.ts +7 -7
- package/dist/card.js +2 -2
- package/dist/card.js.map +1 -1
- package/dist/{chunk-OUWPBSSL.js → chunk-2AJ4NJUF.js} +8 -9
- package/dist/chunk-2AJ4NJUF.js.map +1 -0
- package/dist/{chunk-MQPC3P4T.js → chunk-2DGLWTPS.js} +3 -3
- package/dist/chunk-2DGLWTPS.js.map +1 -0
- package/dist/{chunk-DZU6RMYD.js → chunk-3DHNN5V7.js} +15 -9
- package/dist/chunk-3DHNN5V7.js.map +1 -0
- package/dist/{chunk-TFJDIOFK.js → chunk-4E5IUZHR.js} +3 -3
- package/dist/chunk-4E5IUZHR.js.map +1 -0
- package/dist/{chunk-HAQWKORZ.js → chunk-4JO5GSSD.js} +1 -37
- package/dist/chunk-4JO5GSSD.js.map +1 -0
- package/dist/{chunk-APNIVNIX.js → chunk-IBDTAMPF.js} +3 -4
- package/dist/chunk-IBDTAMPF.js.map +1 -0
- package/dist/{chunk-LYOPPBMC.js → chunk-KIBICUZK.js} +2 -2
- package/dist/{chunk-HBZPJ3EP.js → chunk-NJFCSVPT.js} +2 -2
- package/dist/{chunk-KM6VAKIE.js → chunk-RE5WJ4QP.js} +2 -2
- package/dist/chunk-RE5WJ4QP.js.map +1 -0
- package/dist/{chunk-CHOJUCVE.js → chunk-SJS6RJIT.js} +15 -9
- package/dist/chunk-SJS6RJIT.js.map +1 -0
- package/dist/{chunk-6ZYRUOTA.js → chunk-UV4HBVH7.js} +15 -9
- package/dist/chunk-UV4HBVH7.js.map +1 -0
- package/dist/command.js +2 -2
- package/dist/confirm-button.d.ts +1 -1
- package/dist/confirm-button.js +1 -1
- package/dist/continue-prompt.js +14 -8
- package/dist/continue-prompt.js.map +1 -1
- package/dist/data-table.js +2 -2
- package/dist/dialog.js +2 -2
- package/dist/engine-flow.d.ts +25 -2
- package/dist/engine-flow.js +27 -6
- package/dist/engine-flow.js.map +1 -1
- package/dist/force-update-screen.js +2 -2
- package/dist/force-update-screen.js.map +1 -1
- package/dist/genui.js +3 -3
- package/dist/glow-card.d.ts +5 -4
- package/dist/glow-card.js +2 -8
- package/dist/glow-card.js.map +1 -1
- package/dist/image-cropper.js +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/iso.d.ts +1 -1
- package/dist/iso.js.map +1 -1
- package/dist/landscape.js +4 -4
- package/dist/landscape.js.map +1 -1
- package/dist/link-card.d.ts +3 -6
- package/dist/link-card.js +1 -1
- package/dist/maintenance-screen.js +1 -1
- package/dist/map.d.ts +50 -5
- package/dist/map.js +202 -66
- package/dist/map.js.map +1 -1
- package/dist/match-dialog.js +1 -1
- package/dist/media-gallery.js +1 -1
- package/dist/media-gallery.js.map +1 -1
- package/dist/media-grid.js +2 -2
- package/dist/motion.css +52 -122
- package/dist/motion.d.ts +2 -2
- package/dist/motion.js +1 -1
- package/dist/native/map.js +64 -64
- package/dist/native/map.js.map +1 -1
- package/dist/native.js +30 -30
- package/dist/native.js.map +1 -1
- package/dist/nav-bar.d.ts +12 -3
- package/dist/nav-bar.js +19 -12
- package/dist/nav-bar.js.map +1 -1
- package/dist/pointer-light.d.ts +6 -9
- package/dist/pointer-light.js +9 -5
- package/dist/pointer-light.js.map +1 -1
- package/dist/radio-group.js +2 -2
- package/dist/radio-group.js.map +1 -1
- package/dist/service-card.js +1 -1
- package/dist/service-card.js.map +1 -1
- package/dist/site-footer.d.ts +1 -1
- package/dist/site-footer.js +2 -2
- package/dist/{sites-CHp_vELn.d.ts → sites-B4prB793.d.ts} +2 -2
- package/dist/sites.d.ts +2 -2
- package/dist/sites.js +6 -7
- package/dist/sites.js.map +1 -1
- package/dist/slider.js +1 -1
- package/dist/slider.js.map +1 -1
- package/dist/story.css +5 -12
- package/dist/theme.d.ts +1 -1
- package/dist/theme.js +1 -1
- package/dist/update-prompt.js +2 -2
- package/dist/update-prompt.js.map +1 -1
- package/dist/vertical-video.js +1 -1
- package/dist/video-player.js +2 -2
- package/dist/video-player.js.map +1 -1
- package/package.json +5 -5
- package/registry/action-bar.json +1 -1
- package/registry/app-shell.json +4 -4
- package/registry/argument-card.json +7 -16
- package/registry/auth-layout.json +4 -4
- package/registry/button.json +20 -20
- package/registry/card-grid.json +21 -24
- package/registry/card.json +7 -7
- package/registry/component-page.json +2 -2
- package/registry/confirm-button.json +6 -6
- package/registry/contact-page.json +2 -2
- package/registry/cover-hero.json +3 -3
- package/registry/dashboard-layout.json +2 -2
- package/registry/detail-layout.json +4 -4
- package/registry/docs-hub-page.json +2 -2
- package/registry/empty-state.json +1 -1
- package/registry/engine-flow.json +74 -3
- package/registry/examples/app-shell/admin-console.js +1 -1
- package/registry/examples/app-shell/admin-console.tsx +1 -1
- package/registry/examples/app-shell/basic.js +1 -1
- package/registry/examples/app-shell/basic.tsx +1 -1
- package/registry/examples/app-shell/desktop.js +1 -1
- package/registry/examples/app-shell/desktop.tsx +1 -1
- package/registry/examples/app-shell/orochia-studio.js +1 -1
- package/registry/examples/app-shell/orochia-studio.tsx +1 -1
- package/registry/examples/argument-card/hover-quiet.js +1 -1
- package/registry/examples/argument-card/hover-quiet.tsx +1 -1
- package/registry/examples/auth-layout/onboarding.js +2 -2
- package/registry/examples/auth-layout/onboarding.tsx +2 -2
- package/registry/examples/auth-layout/sign-in.js +2 -2
- package/registry/examples/auth-layout/sign-in.tsx +2 -2
- package/registry/examples/auth-layout/verify.js +1 -1
- package/registry/examples/auth-layout/verify.tsx +1 -1
- package/registry/examples/avatar/native/presence.dark.png +0 -0
- package/registry/examples/avatar/native/presence.light.png +0 -0
- package/registry/examples/badge/native/tones.dark.png +0 -0
- package/registry/examples/badge/native/tones.light.png +0 -0
- package/registry/examples/button/native/disabled.dark.png +0 -0
- package/registry/examples/button/native/disabled.light.png +0 -0
- package/registry/examples/button/native/gradient.dark.png +0 -0
- package/registry/examples/button/native/gradient.light.png +0 -0
- package/registry/examples/button/native/icon-only.dark.png +0 -0
- package/registry/examples/button/native/icon-only.light.png +0 -0
- package/registry/examples/button/native/icon.dark.png +0 -0
- package/registry/examples/button/native/icon.light.png +0 -0
- package/registry/examples/button/native/loading.dark.png +0 -0
- package/registry/examples/button/native/loading.light.png +0 -0
- package/registry/examples/button/native/primary.dark.png +0 -0
- package/registry/examples/button/native/primary.light.png +0 -0
- package/registry/examples/button/native/sizes.dark.png +0 -0
- package/registry/examples/button/native/sizes.light.png +0 -0
- package/registry/examples/button/signature.js +2 -2
- package/registry/examples/button/signature.tsx +4 -4
- package/registry/examples/card/interactive-link.tsx +1 -1
- package/registry/examples/card/native/body.dark.png +0 -0
- package/registry/examples/card/native/body.light.png +0 -0
- package/registry/examples/card/native/default.dark.png +0 -0
- package/registry/examples/card/native/default.light.png +0 -0
- package/registry/examples/card/native/elevated.dark.png +0 -0
- package/registry/examples/card/native/elevated.light.png +0 -0
- package/registry/examples/card-grid/hover-quiet.js +1 -1
- package/registry/examples/card-grid/hover-quiet.tsx +1 -1
- package/registry/examples/chat/native/assistant.dark.png +0 -0
- package/registry/examples/chat/native/assistant.light.png +0 -0
- package/registry/examples/chat/native/conversation.dark.png +0 -0
- package/registry/examples/chat/native/conversation.light.png +0 -0
- package/registry/examples/chat/native/inbox.dark.png +0 -0
- package/registry/examples/chat/native/inbox.light.png +0 -0
- package/registry/examples/checkbox/native/terms.dark.png +0 -0
- package/registry/examples/checkbox/native/terms.light.png +0 -0
- package/registry/examples/chip/native/multiple.dark.png +0 -0
- package/registry/examples/chip/native/multiple.light.png +0 -0
- package/registry/examples/chip/native/single.dark.png +0 -0
- package/registry/examples/chip/native/single.light.png +0 -0
- package/registry/examples/chip/native/toggle.dark.png +0 -0
- package/registry/examples/chip/native/toggle.light.png +0 -0
- package/registry/examples/component-page/button.js +2 -2
- package/registry/examples/component-page/button.tsx +2 -2
- package/registry/examples/contact-page/team.js +1 -1
- package/registry/examples/contact-page/team.tsx +1 -1
- package/registry/examples/cover-hero/plain.js +1 -1
- package/registry/examples/cover-hero/plain.tsx +1 -1
- package/registry/examples/cover-hero/shop.js +1 -1
- package/registry/examples/cover-hero/shop.tsx +1 -1
- package/registry/examples/dashboard-layout/orazaka-eric.js +2 -2
- package/registry/examples/dashboard-layout/orazaka-eric.tsx +2 -2
- package/registry/examples/date-picker/native/calendar.dark.png +0 -0
- package/registry/examples/date-picker/native/calendar.light.png +0 -0
- package/registry/examples/date-picker/native/day-strip.dark.png +0 -0
- package/registry/examples/date-picker/native/day-strip.light.png +0 -0
- package/registry/examples/date-picker/native/month-year.dark.png +0 -0
- package/registry/examples/date-picker/native/month-year.light.png +0 -0
- package/registry/examples/date-picker/native/time-slots.dark.png +0 -0
- package/registry/examples/date-picker/native/time-slots.light.png +0 -0
- package/registry/examples/description-list/native/job-details.dark.png +0 -0
- package/registry/examples/description-list/native/job-details.light.png +0 -0
- package/registry/examples/detail-layout/checkout.js +1 -1
- package/registry/examples/detail-layout/checkout.tsx +1 -1
- package/registry/examples/detail-layout/job.js +1 -1
- package/registry/examples/detail-layout/job.tsx +1 -1
- package/registry/examples/detail-layout/video.js +2 -2
- package/registry/examples/detail-layout/video.tsx +2 -2
- package/registry/examples/dialog/native/sheet.dark.png +0 -0
- package/registry/examples/dialog/native/sheet.light.png +0 -0
- package/registry/examples/docs-hub-page/krizaka.js +1 -1
- package/registry/examples/docs-hub-page/krizaka.tsx +1 -1
- package/registry/examples/empty-state/library.js +1 -1
- package/registry/examples/empty-state/library.tsx +1 -1
- package/registry/examples/empty-state/native/default.dark.png +0 -0
- package/registry/examples/empty-state/native/default.light.png +0 -0
- package/registry/examples/fab/native/extended.dark.png +0 -0
- package/registry/examples/fab/native/extended.light.png +0 -0
- package/registry/examples/force-update-screen/native/default.dark.png +0 -0
- package/registry/examples/force-update-screen/native/default.light.png +0 -0
- package/registry/examples/form/native/amount.dark.png +0 -0
- package/registry/examples/form/native/amount.light.png +0 -0
- package/registry/examples/form/native/audience.dark.png +0 -0
- package/registry/examples/form/native/audience.light.png +0 -0
- package/registry/examples/form/native/profile.dark.png +0 -0
- package/registry/examples/form/native/profile.light.png +0 -0
- package/registry/examples/form/native/settings.dark.png +0 -0
- package/registry/examples/form/native/settings.light.png +0 -0
- package/registry/examples/form/native/sign-up.dark.png +0 -0
- package/registry/examples/form/native/sign-up.light.png +0 -0
- package/registry/examples/form/native/upload.dark.png +0 -0
- package/registry/examples/form/native/upload.light.png +0 -0
- package/registry/examples/glow-card/spotlight.tsx +1 -1
- package/registry/examples/goal-gauge/native/default.dark.png +0 -0
- package/registry/examples/goal-gauge/native/default.light.png +0 -0
- package/registry/examples/landing-page/krizaka.js +3 -3
- package/registry/examples/landing-page/krizaka.tsx +3 -3
- package/registry/examples/link-card/hover-quiet.js +1 -1
- package/registry/examples/link-card/hover-quiet.tsx +1 -1
- package/registry/examples/loader/native/block.dark.png +0 -0
- package/registry/examples/loader/native/block.light.png +0 -0
- package/registry/examples/map/native/location-picker.dark.png +0 -0
- package/registry/examples/map/native/location-picker.light.png +0 -0
- package/registry/examples/map/route.js +36 -0
- package/registry/examples/map/route.tsx +35 -0
- package/registry/examples/marketing-layout/pricing.js +1 -1
- package/registry/examples/marketing-layout/pricing.tsx +1 -1
- package/registry/examples/marketing-layout/product-page.js +1 -1
- package/registry/examples/marketing-layout/product-page.tsx +2 -2
- package/registry/examples/mascot-state/native/default.dark.png +0 -0
- package/registry/examples/mascot-state/native/default.light.png +0 -0
- package/registry/examples/mascots/native/crane.dark.png +0 -0
- package/registry/examples/mascots/native/crane.light.png +0 -0
- package/registry/examples/mascots/native/default.dark.png +0 -0
- package/registry/examples/mascots/native/default.light.png +0 -0
- package/registry/examples/mascots/native/lovebird.dark.png +0 -0
- package/registry/examples/mascots/native/lovebird.light.png +0 -0
- package/registry/examples/mascots/native/phoenix.dark.png +0 -0
- package/registry/examples/mascots/native/phoenix.light.png +0 -0
- package/registry/examples/match-dialog/native/its-a-match.dark.png +0 -0
- package/registry/examples/match-dialog/native/its-a-match.light.png +0 -0
- package/registry/examples/media-capture/native/photo.dark.png +0 -0
- package/registry/examples/media-capture/native/photo.light.png +0 -0
- package/registry/examples/meta-row/native/video.dark.png +0 -0
- package/registry/examples/meta-row/native/video.light.png +0 -0
- package/registry/examples/meter/native/credits.dark.png +0 -0
- package/registry/examples/meter/native/credits.light.png +0 -0
- package/registry/examples/meter/native/split-ring.dark.png +0 -0
- package/registry/examples/meter/native/split-ring.light.png +0 -0
- package/registry/examples/nav-bar/family-product.js +1 -1
- package/registry/examples/nav-bar/family-product.tsx +1 -1
- package/registry/examples/onboarding/native/first-launch.dark.png +0 -0
- package/registry/examples/onboarding/native/first-launch.light.png +0 -0
- package/registry/examples/permission-prompt/native/blocked.dark.png +0 -0
- package/registry/examples/permission-prompt/native/blocked.light.png +0 -0
- package/registry/examples/permission-prompt/native/camera.dark.png +0 -0
- package/registry/examples/permission-prompt/native/camera.light.png +0 -0
- package/registry/examples/photo-grid/native/profile-photos.dark.png +0 -0
- package/registry/examples/photo-grid/native/profile-photos.light.png +0 -0
- package/registry/examples/pricing-page/credits.js +3 -3
- package/registry/examples/pricing-page/credits.tsx +3 -3
- package/registry/examples/product-page/orazaka.js +2 -2
- package/registry/examples/product-page/orazaka.tsx +2 -2
- package/registry/examples/profile-card/native/default.dark.png +0 -0
- package/registry/examples/profile-card/native/default.light.png +0 -0
- package/registry/examples/progress/native/bar.dark.png +0 -0
- package/registry/examples/progress/native/bar.light.png +0 -0
- package/registry/examples/progress/native/indeterminate.dark.png +0 -0
- package/registry/examples/progress/native/indeterminate.light.png +0 -0
- package/registry/examples/progress/native/ring.dark.png +0 -0
- package/registry/examples/progress/native/ring.light.png +0 -0
- package/registry/examples/radio-group/native/buttons.dark.png +0 -0
- package/registry/examples/radio-group/native/buttons.light.png +0 -0
- package/registry/examples/radio-group/native/cards.dark.png +0 -0
- package/registry/examples/radio-group/native/cards.light.png +0 -0
- package/registry/examples/radio-group/native/list.dark.png +0 -0
- package/registry/examples/radio-group/native/list.light.png +0 -0
- package/registry/examples/screen/native/auth.dark.png +0 -0
- package/registry/examples/screen/native/auth.light.png +0 -0
- package/registry/examples/screen/native/chat.dark.png +0 -0
- package/registry/examples/screen/native/chat.light.png +0 -0
- package/registry/examples/screen/native/profile.dark.png +0 -0
- package/registry/examples/screen/native/profile.light.png +0 -0
- package/registry/examples/screen/native/settings.dark.png +0 -0
- package/registry/examples/screen/native/settings.light.png +0 -0
- package/registry/examples/search-field/native/cancel.dark.png +0 -0
- package/registry/examples/search-field/native/cancel.light.png +0 -0
- package/registry/examples/settings-layout/account.js +1 -1
- package/registry/examples/settings-layout/account.tsx +1 -1
- package/registry/examples/settings-layout/native/account.dark.png +0 -0
- package/registry/examples/settings-layout/native/account.light.png +0 -0
- package/registry/examples/settings-layout/sections.js +1 -1
- package/registry/examples/settings-layout/sections.tsx +1 -1
- package/registry/examples/showcase/native/slides.dark.png +0 -0
- package/registry/examples/showcase/native/slides.light.png +0 -0
- package/registry/examples/slider/native/default.dark.png +0 -0
- package/registry/examples/slider/native/default.light.png +0 -0
- package/registry/examples/slider/native/range.dark.png +0 -0
- package/registry/examples/slider/native/range.light.png +0 -0
- package/registry/examples/slider/native/stepped.dark.png +0 -0
- package/registry/examples/slider/native/stepped.light.png +0 -0
- package/registry/examples/slider/native/vertical.dark.png +0 -0
- package/registry/examples/slider/native/vertical.light.png +0 -0
- package/registry/examples/spinner/native/sizes.dark.png +0 -0
- package/registry/examples/spinner/native/sizes.light.png +0 -0
- package/registry/examples/split-view/messages.js +1 -1
- package/registry/examples/split-view/messages.tsx +1 -1
- package/registry/examples/status-page/building.js +1 -1
- package/registry/examples/status-page/building.tsx +1 -1
- package/registry/examples/step-progress/native/sign-up.dark.png +0 -0
- package/registry/examples/step-progress/native/sign-up.light.png +0 -0
- package/registry/examples/stepper/native/run.dark.png +0 -0
- package/registry/examples/stepper/native/run.light.png +0 -0
- package/registry/examples/sticky-action/phone.js +1 -1
- package/registry/examples/sticky-action/phone.tsx +1 -1
- package/registry/examples/switch/native/default.dark.png +0 -0
- package/registry/examples/switch/native/default.light.png +0 -0
- package/registry/examples/switch/native/settings.dark.png +0 -0
- package/registry/examples/switch/native/settings.light.png +0 -0
- package/registry/examples/tab-bar/native/main-sections.dark.png +0 -0
- package/registry/examples/tab-bar/native/main-sections.light.png +0 -0
- package/registry/examples/tabs/native/sections.dark.png +0 -0
- package/registry/examples/tabs/native/sections.light.png +0 -0
- package/registry/examples/tag-selector/native/interests.dark.png +0 -0
- package/registry/examples/tag-selector/native/interests.light.png +0 -0
- package/registry/examples/toast/native/snackbar.dark.png +0 -0
- package/registry/examples/toast/native/snackbar.light.png +0 -0
- package/registry/examples/toast/native/tones.dark.png +0 -0
- package/registry/examples/toast/native/tones.light.png +0 -0
- package/registry/examples/txt/native/tones.dark.png +0 -0
- package/registry/examples/txt/native/tones.light.png +0 -0
- package/registry/examples/update-prompt/native/default.dark.png +0 -0
- package/registry/examples/update-prompt/native/default.light.png +0 -0
- package/registry/examples/verified-badge/native/verified.dark.png +0 -0
- package/registry/examples/verified-badge/native/verified.light.png +0 -0
- package/registry/examples/vertical-video/native/rail.dark.png +0 -0
- package/registry/examples/vertical-video/native/rail.light.png +0 -0
- package/registry/examples/waveform/native/card.dark.png +0 -0
- package/registry/examples/waveform/native/card.light.png +0 -0
- package/registry/force-update-screen.json +1 -1
- package/registry/form.json +6 -6
- package/registry/glow-card.json +19 -19
- package/registry/index.json +20 -21
- package/registry/iso.json +7 -7
- package/registry/landing-page.json +2 -2
- package/registry/landscape.json +1 -1
- package/registry/link-card.json +15 -24
- package/registry/map.json +235 -6
- package/registry/marketing-layout.json +3 -3
- package/registry/media-gallery.json +1 -1
- package/registry/nav-bar.json +32 -4
- package/registry/pointer-light.json +17 -22
- package/registry/pricing-page.json +2 -2
- package/registry/product-page.json +2 -2
- package/registry/progress.json +2 -2
- package/registry/radio-group.json +1 -1
- package/registry/rail-nav.json +2 -2
- package/registry/service-card.json +1 -1
- package/registry/settings-layout.json +3 -3
- package/registry/site-footer.json +2 -2
- package/registry/sites.json +1 -1
- package/registry/slider.json +1 -1
- package/registry/split-view.json +2 -2
- package/registry/status-page.json +1 -1
- package/registry/sticky-action.json +2 -2
- package/registry/update-prompt.json +1 -1
- package/registry/video-player.json +1 -1
- package/dist/chunk-6ZYRUOTA.js.map +0 -1
- package/dist/chunk-AB5D3KBG.js +0 -37
- package/dist/chunk-AB5D3KBG.js.map +0 -1
- package/dist/chunk-APNIVNIX.js.map +0 -1
- package/dist/chunk-CHOJUCVE.js.map +0 -1
- package/dist/chunk-DZU6RMYD.js.map +0 -1
- package/dist/chunk-HAQWKORZ.js.map +0 -1
- package/dist/chunk-KM6VAKIE.js.map +0 -1
- package/dist/chunk-MQPC3P4T.js.map +0 -1
- package/dist/chunk-OUWPBSSL.js.map +0 -1
- package/dist/chunk-TFJDIOFK.js.map +0 -1
- package/registry/examples/argument-card/hover-light.js +0 -17
- package/registry/examples/argument-card/hover-light.tsx +0 -19
- package/registry/examples/link-card/hover-light.d.ts +0 -4
- package/registry/examples/link-card/hover-light.js +0 -18
- package/registry/examples/link-card/hover-light.tsx +0 -20
- /package/dist/{chunk-LYOPPBMC.js.map → chunk-KIBICUZK.js.map} +0 -0
- /package/dist/{chunk-HBZPJ3EP.js.map → chunk-NJFCSVPT.js.map} +0 -0
- /package/registry/examples/{argument-card/hover-light.d.ts → map/route.d.ts} +0 -0
package/registry/landscape.json
CHANGED
|
@@ -131,7 +131,7 @@
|
|
|
131
131
|
},
|
|
132
132
|
{
|
|
133
133
|
"path": "landscape/landscape.tsx",
|
|
134
|
-
"content": "// The Krizaka landscape — a valley at dusk under a constellation: three ranges of peaks, a phoenix over a river of\n// two flames, trees of light, a treehouse, and the flock at work (the falcon on watch, the owl, the duck at its\n// laptop, the flamingo). The brand layer's illustration, like the marks: drawn in code, ids unique per instance, its\n// own colours by default (`tone=\"own\"`) or the host brand's sky and peaks (`tone=\"brand\"`). Decorative.\nimport type * as React from \"react\";\nimport { useId } from \"react\";\n\nimport { cn } from \"../cn\";\n\n/** The sky and the peaks: the Krizaka dusk (`own`), or the host brand's accents (`brand`). Birds keep their colours. */\nconst TONES = {\n own: {\n \"--kzl-sun\": \"#f59e0b\",\n \"--kzl-sun-2\": \"#ec4899\",\n \"--kzl-sun-3\": \"#6366f1\",\n \"--kzl-far\": \"#6366f1\",\n \"--kzl-far-2\": \"#4f46e5\",\n \"--kzl-far-line\": \"#818cf8\",\n \"--kzl-mid\": \"#06b6d4\",\n \"--kzl-mid-2\": \"#0891b2\",\n \"--kzl-mid-line\": \"#22d3ee\",\n \"--kzl-near\": \"#d946ef\",\n \"--kzl-near-2\": \"#a855f7\",\n \"--kzl-near-line\": \"#e879f9\",\n \"--kzl-aurora-l\": \"#00f2fe\",\n \"--kzl-aurora-r\": \"#ec4899\",\n },\n brand: {\n \"--kzl-sun\": \"var(--kz-accent-2, var(--kz-accent))\",\n \"--kzl-sun-2\": \"var(--kz-accent)\",\n \"--kzl-sun-3\": \"var(--kz-accent)\",\n \"--kzl-far\": \"var(--kz-accent-2, var(--kz-accent))\",\n \"--kzl-far-2\": \"var(--kz-accent-2, var(--kz-accent))\",\n \"--kzl-far-line\": \"var(--kz-accent-2, var(--kz-accent))\",\n \"--kzl-mid\": \"color-mix(in srgb, var(--kz-accent) 55%, var(--kz-accent-2, var(--kz-accent)))\",\n \"--kzl-mid-2\": \"color-mix(in srgb, var(--kz-accent) 55%, var(--kz-accent-2, var(--kz-accent)))\",\n \"--kzl-mid-line\": \"color-mix(in srgb, var(--kz-accent) 55%, var(--kz-accent-2, var(--kz-accent)))\",\n \"--kzl-near\": \"var(--kz-accent)\",\n \"--kzl-near-2\": \"var(--kz-accent)\",\n \"--kzl-near-line\": \"var(--kz-accent)\",\n \"--kzl-aurora-l\": \"var(--kz-accent-2, var(--kz-accent))\",\n \"--kzl-aurora-r\": \"var(--kz-accent)\",\n },\n} as const;\n\nconst CSS = `\n.kzl { pointer-events: none; overflow: hidden; }\n.kzl-fade { position: absolute; bottom: 0; left: 0; right: 0; height: 120px; pointer-events: none; z-index: 3;\n background: linear-gradient(to top, var(--kz-surface-0) 0%, transparent 100%); }\n /* --- Cyber Phoenix & Flame Flow animations --- */\n @keyframes kzl-phoenix-flow-purple {\n from { stroke-dashoffset: 350; }\n to { stroke-dashoffset: 0; }\n }\n @keyframes kzl-phoenix-flow-gold {\n from { stroke-dashoffset: 0; }\n to { stroke-dashoffset: 350; }\n }\n @keyframes kzl-phoenix-bob {\n 0%, 100% { transform: translateY(0) scale(1); }\n 50% { transform: translateY(-8px) scale(1.02); }\n }\n @keyframes kzl-wing-flap-l-phoenix {\n 0%, 100% { transform: rotate(0deg); }\n 50% { transform: rotate(-10deg) translateY(-2px); }\n }\n @keyframes kzl-wing-flap-r-phoenix {\n 0%, 100% { transform: rotate(0deg); }\n 50% { transform: rotate(10deg) translateY(-2px); }\n }\n @keyframes kzl-core-glow {\n 0%, 100% { fill: #ffef5c; filter: drop-shadow(0 0 1px #ffef5c); }\n 50% { fill: #ffffff; filter: drop-shadow(0 0 5px #ff3c00); }\n }\n\n .kzl-cyber-phoenix {\n animation: kzl-phoenix-bob 4s ease-in-out infinite;\n transform-origin: 600px 325px;\n transition: transform 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);\n }\n .kzl-cyber-phoenix:hover {\n transform: translateY(-4px) scale(1.08);\n }\n .kzl-phoenix-wing-l {\n animation: kzl-wing-flap-l-phoenix 2.5s ease-in-out infinite;\n }\n .kzl-phoenix-wing-r {\n animation: kzl-wing-flap-r-phoenix 2.5s ease-in-out infinite;\n }\n .kzl-cyber-phoenix:hover .kzl-phoenix-wing-l {\n animation: kzl-wing-flap-l-phoenix 0.6s linear infinite;\n }\n .kzl-cyber-phoenix:hover .kzl-phoenix-wing-r {\n animation: kzl-wing-flap-r-phoenix 0.6s linear infinite;\n }\n .kzl-phoenix-core {\n animation: kzl-core-glow 1.5s ease-in-out infinite;\n }\n\n /* --- Pulse Animations --- */\n @keyframes kzl-opacity-pulse {\n 0%, 100% { opacity: 0.35; }\n 50% { opacity: 0.95; }\n }\n .kzl-pulse-slow {\n animation: kzl-opacity-pulse 4s ease-in-out infinite;\n }\n @keyframes kzl-sun-pulse {\n 0%, 100% { opacity: 0.16; transform: scale(0.96); }\n 50% { opacity: 0.32; transform: scale(1.04); }\n }\n .kzl-sun-pulsing {\n animation: kzl-sun-pulse 6s ease-in-out infinite;\n transform-origin: 600px 200px;\n }\n\n /* --- Rising local data pulses --- */\n @keyframes kzl-rise-fade-1 {\n 0% { transform: translateY(80px) scale(0.5); opacity: 0; }\n 40% { opacity: 0.8; }\n 100% { transform: translateY(-30px) scale(1.3); opacity: 0; }\n }\n @keyframes kzl-rise-fade-2 {\n 0% { transform: translateY(60px) scale(0.4); opacity: 0; }\n 50% { opacity: 0.9; }\n 100% { transform: translateY(-50px) scale(1.2); opacity: 0; }\n }\n .kzl-rising-pulse-1 {\n animation: kzl-rise-fade-1 4s cubic-bezier(0.1, 0.8, 0.3, 1) infinite;\n transform-origin: center;\n }\n .kzl-rising-pulse-2 {\n animation: kzl-rise-fade-2 5s cubic-bezier(0.1, 0.8, 0.3, 1) infinite 1.5s;\n transform-origin: center;\n }\n\n /* --- Mascot Hover Animations (Stable Hitboxes) --- */\n .kzl-bird-graphics {\n transform-box: fill-box;\n transform-origin: center;\n transition: transform 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);\n }\n .kzl-bird-hitbox:hover .kzl-bird-graphics {\n transform: scale(1.08) translateY(-4px);\n }\n\n /* --- Bird Eye Blinking/Glowing Animations --- */\n .kzl-falcon-eye {\n animation: kzl-falcon-eye-pulse 2.5s ease-in-out infinite;\n }\n .kzl-duck-eye {\n transform-box: fill-box;\n transform-origin: center;\n animation: kzl-eye-blink 5s ease-in-out infinite 1s;\n }\n .kzl-flamingo-eye {\n transform-box: fill-box;\n transform-origin: center;\n animation: kzl-eye-blink 6s ease-in-out infinite 2.5s;\n }\n .kzl-owl-eye {\n transform-box: fill-box;\n transform-origin: center;\n animation: kzl-eye-blink 4s ease-in-out infinite 0.5s;\n }\n\n @keyframes kzl-eye-blink {\n 0%, 90%, 100% {\n transform: scaleY(1);\n }\n 95% {\n transform: scaleY(0.15);\n }\n }\n\n @keyframes kzl-falcon-eye-pulse {\n 0%, 100% { fill: #00f2fe; filter: drop-shadow(0 0 2px #00f2fe); }\n 50% { fill: #00ff66; filter: drop-shadow(0 0 5px #00ff66); }\n }\n\n /* FalconBot constant loop animations */\n .kzl-falcon-bot .kzl-head-group {\n animation: kzl-head-bob 4s ease-in-out infinite;\n }\n .kzl-falcon-bot .kzl-wing-left {\n animation: kzl-wing-flap-left 3s ease-in-out infinite;\n }\n .kzl-falcon-bot .kzl-wing-right {\n animation: kzl-wing-flap-right 3s ease-in-out infinite;\n }\n .kzl-falcon-bot .kzl-sentry-laser {\n animation: kzl-scan-flicker 5s ease-in-out infinite;\n }\n\n @keyframes kzl-scan-flicker {\n 0%, 100% { opacity: 0; }\n 10%, 90% { opacity: 0.15; }\n 50% { opacity: 0.5; }\n }\n @keyframes kzl-head-bob {\n 0%, 100% { transform: translateY(0) rotate(0deg); }\n 50% { transform: translateY(-2px) rotate(2deg); }\n }\n @keyframes kzl-wing-flap-left {\n 0%, 100% { transform: rotate(0deg); }\n 50% { transform: rotate(-8deg) scaleX(1.05); }\n }\n @keyframes kzl-wing-flap-right {\n 0%, 100% { transform: rotate(0deg); }\n 50% { transform: rotate(8deg) scaleX(1.05); }\n }\n\n /* Developer Duck constant loop animations */\n .kzl-developer-duck .kzl-head-group {\n animation: kzl-duck-look 6s ease-in-out infinite;\n }\n .kzl-developer-duck .kzl-wing-left-type {\n animation: kzl-wing-type-l 0.5s ease-in-out infinite;\n }\n .kzl-developer-duck .kzl-wing-right-type {\n animation: kzl-wing-type-r 0.5s ease-in-out infinite 0.25s;\n }\n .kzl-developer-duck .kzl-laptop-screen {\n animation: kzl-screen-flicker-idle 3s ease-in-out infinite;\n }\n .kzl-developer-duck .kzl-holo-projection {\n animation: kzl-holo-flicker 6s ease-in-out infinite;\n }\n .kzl-developer-duck .kzl-holo-elements {\n animation: kzl-holo-elements-rise 6s ease-in-out infinite;\n }\n\n @keyframes kzl-screen-flicker-idle {\n 0%, 100% { opacity: 0.7; }\n 50% { opacity: 0.95; filter: drop-shadow(0 0 3px var(--kz-accent)); }\n }\n @keyframes kzl-holo-flicker {\n 0%, 100% { opacity: 0; }\n 20%, 80% { opacity: 0.35; }\n 50% { opacity: 0.65; }\n }\n @keyframes kzl-holo-elements-rise {\n 0% { transform: translateY(10px); opacity: 0; }\n 50% { opacity: 0.8; }\n 100% { transform: translateY(-15px); opacity: 0; }\n }\n @keyframes kzl-duck-look {\n 0%, 100% { transform: rotate(0deg); }\n 30% { transform: rotate(-5deg); }\n 70% { transform: rotate(5deg); }\n }\n @keyframes kzl-wing-type-l {\n 0%, 100% { transform: translateY(0) rotate(0deg); }\n 50% { transform: translateY(-3px) rotate(-4deg); }\n }\n @keyframes kzl-wing-type-r {\n 0%, 100% { transform: translateY(0) rotate(0deg); }\n 50% { transform: translateY(-3px) rotate(4deg); }\n }\n\n /* Flamingo Bot constant loop animations */\n .kzl-flamingo-bot .kzl-head-group {\n animation: kzl-flamingo-head-bob 5s ease-in-out infinite;\n }\n .kzl-flamingo-bot .kzl-flamingo-neck {\n animation: kzl-flamingo-neck-sway 7s ease-in-out infinite;\n transform-origin: 20px 74px;\n }\n .kzl-flamingo-bot .kzl-flamingo-wing {\n animation: kzl-flamingo-wing-flap 4s ease-in-out infinite;\n }\n\n @keyframes kzl-flamingo-neck-sway {\n 0%, 100% { transform: rotate(0deg); }\n 50% { transform: rotate(-3deg) scaleY(1.02); }\n }\n @keyframes kzl-flamingo-head-bob {\n 0%, 100% { transform: translate(8px, 12px) translateY(0) rotate(0deg); }\n 50% { transform: translate(8px, 12px) translateY(-5px) rotate(-3deg); }\n }\n @keyframes kzl-flamingo-wing-flap {\n 0%, 100% { transform: translateY(0) rotate(0deg); }\n 50% { transform: translateY(-2px) rotate(-6deg); }\n }\n\n /* Owl Bot constant loop animations */\n .kzl-owl-bot {\n animation: kzl-owl-sway 5s ease-in-out infinite;\n transform-origin: center;\n }\n @keyframes kzl-owl-sway {\n 0%, 100% { transform: rotate(0deg) translateY(0); }\n 50% { transform: rotate(-3deg) translateY(-2px); }\n }\n\n /* Treehouse hover glow */\n .kzl-cyber-treehouse:hover .kzl-window-glow {\n fill: #f59e0b;\n filter: drop-shadow(0 0 10px #f59e0b);\n }\n\n /* Floating tech particles */\n @keyframes kzl-float-up-down {\n 0%, 100% { transform: translateY(0); opacity: 0.4; }\n 50% { transform: translateY(-24px); opacity: 0.95; }\n }\n .kzl-float-particle-1 { animation: kzl-float-up-down 4.2s ease-in-out infinite; }\n .kzl-float-particle-2 { animation: kzl-float-up-down 5.2s ease-in-out infinite 1.2s; }\n .kzl-float-particle-3 { animation: kzl-float-up-down 4.7s ease-in-out infinite 0.6s; }\n .kzl-float-particle-4 { animation: kzl-float-up-down 6.2s ease-in-out infinite 2.2s; }\n\n @media (max-width: 1024px) {\n .kzl-mobile-hide {\n display: none !important;\n }\n }\n/* Still: with animated={false}, off screen, and under reduced motion — every loop holds its first frame. */\n.kzl[data-still] *, .kzl[data-offscreen] * { animation-play-state: paused !important; }\n@media (prefers-reduced-motion: reduce) {\n .kzl * { animation-play-state: paused !important; transition: none !important; }\n}\n`;\n\nexport type LandscapeProps = Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> & {\n /**\n * `own`: the Krizaka dusk (indigo, cyan and magenta peaks). `brand`: the sky and the peaks in the host brand's\n * accents (`.brand-<id>`). The birds and the phoenix keep their own colours.\n * @default \"own\"\n */\n tone?: \"own\" | \"brand\";\n /**\n * The flock at work in the valley (hidden under 1024 px wide either way).\n * @default true\n */\n flock?: boolean;\n /**\n * The phoenix and its river of two flames.\n * @default true\n */\n phoenix?: boolean;\n /**\n * The slow loops (the sun, the stars, the flames, the birds). `false` holds the first frame; always held under\n * `prefers-reduced-motion` and while off screen (with `MotionObserver`).\n * @default true\n */\n animated?: boolean;\n /**\n * `absolute`: fills its positioned parent, anchored at the bottom (a backdrop). `relative`: a block in the flow — give\n * it a height.\n * @default \"absolute\"\n */\n position?: \"absolute\" | \"relative\";\n /**\n * Fades the bottom into the page's surface.\n * @default true\n */\n fade?: boolean;\n};\n\n/** The Krizaka landscape: a decorative backdrop for a hero or a page's end (`aria-hidden`). */\nexport function Landscape({ tone = \"own\", flock = true, phoenix = true, animated = true, position = \"absolute\", fade = true, className, style, ...props }: LandscapeProps) {\n const u = \"kzl\" + useId().replace(/[^a-zA-Z0-9_-]/g, \"\");\n const box: React.CSSProperties =\n position === \"absolute\" ? { position: \"absolute\", inset: \"auto 0 0 0\", height: \"100%\", width: \"100%\" } : { position: \"relative\", width: \"100%\", height: 440 };\n return (\n <div\n aria-hidden\n data-motion-scope=\"\"\n data-still={animated ? undefined : \"\"}\n className={cn(\"kzl\", className)}\n style={{ ...box, ...(TONES[tone] as React.CSSProperties), ...style }}\n {...props}\n >\n <style>{CSS}</style>\n <svg width=\"100%\" height=\"100%\" viewBox=\"0 50 1200 520\" preserveAspectRatio=\"xMidYMax slice\" fill=\"none\" style={{ display: \"block\", pointerEvents: \"none\" }}>\n <defs>\n {/* Vibrant Cyber Sun Glow */}\n <radialGradient id={`${u}-sun-glow`} cx=\"50%\" cy=\"50%\" r=\"50%\">\n <stop offset=\"0%\" stopColor=\"var(--kzl-sun)\" stopOpacity=\"0.45\" />\n <stop offset=\"30%\" stopColor=\"var(--kzl-sun-2)\" stopOpacity=\"0.28\" />\n <stop offset=\"70%\" stopColor=\"var(--kzl-sun-3)\" stopOpacity=\"0.16\" />\n <stop offset=\"100%\" stopColor=\"transparent\" stopOpacity=\"0\" />\n </radialGradient>\n\n {/* Mountains Vibrant Gradients */}\n <linearGradient id={`${u}-mtn-back`} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor=\"var(--kzl-far)\" stopOpacity=\"0.75\" /> {/* indigo */}\n <stop offset=\"50%\" stopColor=\"var(--kzl-far-2)\" stopOpacity=\"0.45\" />\n <stop offset=\"100%\" stopColor=\"var(--kz-surface-0)\" />\n </linearGradient>\n <linearGradient id={`${u}-mtn-mid`} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor=\"var(--kzl-mid)\" stopOpacity=\"0.7\" /> {/* cyan */}\n <stop offset=\"50%\" stopColor=\"var(--kzl-mid-2)\" stopOpacity=\"0.4\" />\n <stop offset=\"100%\" stopColor=\"var(--kz-surface-0)\" />\n </linearGradient>\n <linearGradient id={`${u}-mtn-front`} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor=\"var(--kzl-near)\" stopOpacity=\"0.8\" /> {/* pink */}\n <stop offset=\"50%\" stopColor=\"var(--kzl-near-2)\" stopOpacity=\"0.5\" />\n <stop offset=\"100%\" stopColor=\"var(--kz-surface-0)\" />\n </linearGradient>\n\n {/* Vibrant Mascot Gradients */}\n <linearGradient id={`${u}-falcon-grad`} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor=\"#ff9f00\" />\n <stop offset=\"100%\" stopColor=\"#ff2a00\" />\n </linearGradient>\n <linearGradient id={`${u}-duck-grad`} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor=\"#f43f5e\" />\n <stop offset=\"100%\" stopColor=\"#be123c\" />\n </linearGradient>\n <linearGradient id={`${u}-flamingo-grad`} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor=\"#3b82f6\" />\n <stop offset=\"100%\" stopColor=\"#1d4ed8\" />\n </linearGradient>\n <linearGradient id={`${u}-owl-grad`} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor=\"#a78bfa\" />\n <stop offset=\"100%\" stopColor=\"#6d28d9\" />\n </linearGradient>\n\n {/* Hologram Projections */}\n <linearGradient id={`${u}-holo-grad`} x1=\"0%\" y1=\"100%\" x2=\"0%\" y2=\"0%\">\n <stop offset=\"0%\" stopColor=\"#10b981\" stopOpacity=\"0.5\" />\n <stop offset=\"100%\" stopColor=\"#10b981\" stopOpacity=\"0\" />\n </linearGradient>\n\n {/* Rival flame gradients for the Cyber-Phoenix */}\n <linearGradient id={`${u}-phoenix-gold-grad`} x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor=\"#ffb000\" />\n <stop offset=\"100%\" stopColor=\"#ff3c00\" />\n </linearGradient>\n <linearGradient id={`${u}-phoenix-purple-grad`} x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor=\"#c084fc\" />\n <stop offset=\"100%\" stopColor=\"#db2777\" />\n </linearGradient>\n <linearGradient id={`${u}-phoenix-body-grad`} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor=\"var(--kz-surface-3)\" />\n <stop offset=\"100%\" stopColor=\"var(--kz-surface-2)\" />\n </linearGradient>\n\n {/* Glowing stream gradients */}\n <linearGradient id={`${u}-gold-glow`} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor=\"#ff3c00\" stopOpacity=\"0.95\" />\n <stop offset=\"50%\" stopColor=\"#ffb000\" stopOpacity=\"0.75\" />\n <stop offset=\"100%\" stopColor=\"var(--kz-surface-0)\" />\n </linearGradient>\n <linearGradient id={`${u}-purple-glow`} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor=\"#db2777\" stopOpacity=\"0.95\" />\n <stop offset=\"50%\" stopColor=\"#a78bfa\" stopOpacity=\"0.75\" />\n <stop offset=\"100%\" stopColor=\"var(--kz-surface-0)\" />\n </linearGradient>\n\n {/* River mask to fade out at the bottom */}\n <linearGradient id={`${u}-river-mask-grad`} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"85%\" stopColor=\"white\" />\n <stop offset=\"100%\" stopColor=\"black\" />\n </linearGradient>\n <mask id={`${u}-river-fade-mask`}>\n <rect x=\"0\" y=\"0\" width=\"1200\" height=\"1000\" fill={`url(#${u}-river-mask-grad)`} />\n </mask>\n\n {/* Cyber trees gradient */}\n <linearGradient id={`${u}-tree-grad`} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor=\"var(--kz-accent)\" stopOpacity=\"0.35\" />\n <stop offset=\"100%\" stopColor=\"transparent\" />\n </linearGradient>\n\n {/* Cyber Bench Gradient */}\n <linearGradient id={`${u}-bench-grad`} x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\n <stop offset=\"0%\" stopColor=\"var(--kz-surface-3)\" />\n <stop offset=\"100%\" stopColor=\"var(--kz-surface-2)\" />\n </linearGradient>\n\n {/* Cyber Aurora Glows */}\n <radialGradient id={`${u}-aurora-left`} cx=\"20%\" cy=\"30%\" r=\"50%\">\n <stop offset=\"0%\" stopColor=\"var(--kzl-aurora-l)\" stopOpacity=\"0.22\" />\n <stop offset=\"100%\" stopColor=\"transparent\" stopOpacity=\"0\" />\n </radialGradient>\n <radialGradient id={`${u}-aurora-right`} cx=\"80%\" cy=\"25%\" r=\"50%\">\n <stop offset=\"0%\" stopColor=\"var(--kzl-aurora-r)\" stopOpacity=\"0.22\" />\n <stop offset=\"100%\" stopColor=\"transparent\" stopOpacity=\"0\" />\n </radialGradient>\n </defs>\n\n <g transform=\"translate(0, 60)\">\n {/* ─── Cyber Aurora Backdrop ─── */}\n <circle cx=\"200\" cy=\"180\" r=\"600\" fill={`url(#${u}-aurora-left)`} />\n <circle cx=\"1000\" cy=\"150\" r=\"600\" fill={`url(#${u}-aurora-right)`} />\n\n {/* ─── Ethereal Sun and Sky Network Nodes (Constellations) ─── */}\n <circle cx=\"600\" cy=\"200\" r=\"380\" fill={`url(#${u}-sun-glow)`} />\n <circle cx=\"600\" cy=\"200\" r=\"64\" fill=\"var(--kzl-sun)\" opacity=\"0.16\" className=\"kzl-sun-pulsing\" />\n\n {/* Constellation grid lines in the sky */}\n <g opacity=\"0.3\" stroke=\"var(--kz-accent)\" strokeWidth=\"1\">\n <line x1=\"300\" y1=\"120\" x2=\"380\" y2=\"80\" />\n <line x1=\"380\" y1=\"80\" x2=\"450\" y2=\"110\" />\n <line x1=\"450\" y1=\"110\" x2=\"300\" y2=\"120\" />\n <line x1=\"450\" y1=\"110\" x2=\"520\" y2=\"60\" />\n <line x1=\"750\" y1=\"80\" x2=\"840\" y2=\"130\" />\n <line x1=\"840\" y1=\"130\" x2=\"900\" y2=\"70\" />\n <line x1=\"900\" y1=\"70\" x2=\"750\" y2=\"80\" />\n </g>\n {/* Constellation node points */}\n <g fill=\"var(--kz-accent)\" opacity=\"0.65\">\n <circle cx=\"300\" cy=\"120\" r=\"3.5\" />\n <circle cx=\"380\" cy=\"80\" r=\"5\" className=\"kzl-pulse-slow\" />\n <circle cx=\"450\" cy=\"110\" r=\"3\" />\n <circle cx=\"520\" cy=\"60\" r=\"4.5\" />\n <circle cx=\"750\" cy=\"80\" r=\"4.5\" />\n <circle cx=\"840\" cy=\"130\" r=\"3.5\" />\n <circle cx=\"900\" cy=\"70\" r=\"6\" className=\"kzl-pulse-slow\" />\n </g>\n\n {/* ─── Layered Mountains (with Digital Contours) ─── */}\n {/* Far Peaks */}\n <path d=\"M 150 480 L 420 280 L 680 480 Z\" fill={`url(#${u}-mtn-back)`} stroke=\"var(--kzl-far-line)\" strokeWidth=\"1.5\" />\n <path d=\"M 520 480 L 780 230 L 1050 480 Z\" fill={`url(#${u}-mtn-back)`} stroke=\"var(--kzl-far-line)\" strokeWidth=\"1.5\" />\n\n {/* Mid Peaks */}\n <path d=\"M -50 500 L 220 320 L 500 500 Z\" fill={`url(#${u}-mtn-mid)`} stroke=\"var(--kzl-mid-line)\" strokeWidth=\"1.5\" />\n <path d=\"M 700 500 L 980 300 L 1250 500 Z\" fill={`url(#${u}-mtn-mid)`} stroke=\"var(--kzl-mid-line)\" strokeWidth=\"1.5\" />\n\n {/* Wireframe grids on mountains (Contour lines) */}\n <g stroke=\"var(--kz-accent)\" strokeWidth=\"1.2\" opacity=\"0.18\">\n {/* Mid peak left contours */}\n <line x1=\"30\" y1=\"440\" x2=\"410\" y2=\"440\" />\n <line x1=\"85\" y1=\"400\" x2=\"355\" y2=\"400\" />\n <line x1=\"140\" y1=\"360\" x2=\"300\" y2=\"360\" />\n {/* Mid peak right contours */}\n <line x1=\"770\" y1=\"450\" x2=\"1180\" y2=\"450\" />\n <line x1=\"825\" y1=\"410\" x2=\"1125\" y2=\"410\" />\n <line x1=\"880\" y1=\"370\" x2=\"1070\" y2=\"370\" />\n </g>\n\n {/* Front Peaks */}\n <path d=\"M 100 520 L 360 380 L 620 520 Z\" fill={`url(#${u}-mtn-front)`} stroke=\"var(--kzl-near-line)\" strokeWidth=\"1.8\" />\n <path d=\"M 580 520 L 850 350 L 1100 520 Z\" fill={`url(#${u}-mtn-front)`} stroke=\"var(--kzl-near-line)\" strokeWidth=\"1.8\" />\n\n {phoenix && (\n <>\n {/* ─── Cyber-Phoenix & Dual Glowing Flame Trails ─── */}\n {/* Dual Cascading Flame Trails */}\n {/* Left Purple Flame Trail */}\n <path\n d=\"M 590 340 C 570 370, 610 390, 590 410 C 570 430, 490 440, 510 480 C 530 520, 670 530, 700 560 C 720 580, 750 600, 730 630 C 710 660, 630 670, 650 710 C 660 730, 690 740, 700 760 C 710 780, 670 800, 650 830 C 630 860, 680 890, 690 920 C 695 935, 705 945, 710 1000\"\n fill=\"none\"\n stroke={`url(#${u}-purple-glow)`}\n strokeWidth=\"6\"\n strokeLinecap=\"round\"\n opacity=\"0.6\"\n mask={`url(#${u}-river-fade-mask)`}\n style={{\n filter: \"drop-shadow(0 0 6px rgba(219, 39, 119, 0.4))\",\n }}\n />\n <path\n d=\"M 590 340 C 570 370, 610 390, 590 410 C 570 430, 490 440, 510 480 C 530 520, 670 530, 700 560 C 720 580, 750 600, 730 630 C 710 660, 630 670, 650 710 C 660 730, 690 740, 700 760 C 710 780, 670 800, 650 830 C 630 860, 680 890, 690 920 C 695 935, 705 945, 710 1000\"\n fill=\"none\"\n stroke=\"#db2777\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n opacity=\"0.9\"\n mask={`url(#${u}-river-fade-mask)`}\n style={{\n strokeDasharray: \"25, 20\",\n animation: \"kzl-phoenix-flow-purple 8s linear infinite\",\n pointerEvents: \"none\",\n filter: \"drop-shadow(0 0 3px #db2777)\",\n }}\n />\n\n {/* Right Gold Flame Trail */}\n <path\n d=\"M 610 340 C 590 370, 630 390, 610 410 C 590 430, 510 440, 530 480 C 550 520, 690 530, 720 560 C 740 580, 770 600, 750 630 C 730 660, 650 670, 670 710 C 680 730, 710 740, 720 760 C 730 780, 690 800, 670 830 C 650 860, 700 890, 710 920 C 715 935, 725 945, 730 1000\"\n fill=\"none\"\n stroke={`url(#${u}-gold-glow)`}\n strokeWidth=\"6\"\n strokeLinecap=\"round\"\n opacity=\"0.6\"\n mask={`url(#${u}-river-fade-mask)`}\n style={{\n filter: \"drop-shadow(0 0 6px rgba(251, 191, 36, 0.4))\",\n }}\n />\n <path\n d=\"M 610 340 C 590 370, 630 390, 610 410 C 590 430, 510 440, 530 480 C 550 520, 690 530, 720 560 C 740 580, 770 600, 750 630 C 730 660, 650 670, 670 710 C 680 730, 710 740, 720 760 C 730 780, 690 800, 670 830 C 650 860, 700 890, 710 920 C 715 935, 725 945, 730 1000\"\n fill=\"none\"\n stroke=\"#fbbf24\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n opacity=\"0.9\"\n mask={`url(#${u}-river-fade-mask)`}\n style={{\n strokeDasharray: \"35, 15\",\n animation: \"kzl-phoenix-flow-gold 6s linear infinite\",\n pointerEvents: \"none\",\n filter: \"drop-shadow(0 0 3px #fbbf24)\",\n }}\n />\n\n {/* Hoverable Cyber-Phoenix Soaring in the Valley Center */}\n <g className=\"kzl-cyber-phoenix\" style={{ cursor: \"pointer\", pointerEvents: \"auto\" }}>\n {/* Main Body diamond capsule */}\n <polygon\n points=\"600,310 608,325 600,345 592,325\"\n fill={`url(#${u}-phoenix-body-grad)`}\n stroke=\"var(--kz-border-strong)\"\n strokeWidth=\"1.2\"\n />\n {/* Glowing Phoenix Core */}\n <circle cx=\"600\" cy=\"325\" r=\"3\" fill=\"#ffef5c\" className=\"kzl-phoenix-core\" />\n\n {/* Head */}\n <circle cx=\"600\" cy=\"302\" r=\"6\" fill={`url(#${u}-phoenix-body-grad)`} stroke=\"var(--kz-border-strong)\" strokeWidth=\"1.2\" />\n {/* Visor */}\n <rect x=\"598\" y=\"300\" width=\"4\" height=\"2\" rx=\"0.5\" fill=\"#00f2fe\" />\n {/* Head Crest */}\n <polygon points=\"600,296 603,290 600,293 597,290\" fill=\"#ff3c00\" />\n\n {/* Left Wing (Purple mechanical fire) */}\n <path\n d=\"M 592 322 C 555 310, 520 325, 498 348 C 525 348, 545 338, 568 340 C 582 341, 588 333, 592 322 Z\"\n fill={`url(#${u}-phoenix-purple-grad)`}\n stroke=\"var(--kz-border-strong)\"\n strokeWidth=\"1\"\n className=\"kzl-phoenix-wing-l\"\n style={{ transformOrigin: \"592px 322px\" }}\n />\n\n {/* Right Wing (Gold mechanical fire) */}\n <path\n d=\"M 608 322 C 645 310, 680 325, 702 348 C 675 348, 655 338, 632 340 C 618 341, 612 333, 608 322 Z\"\n fill={`url(#${u}-phoenix-gold-grad)`}\n stroke=\"var(--kz-border-strong)\"\n strokeWidth=\"1\"\n className=\"kzl-phoenix-wing-r\"\n style={{ transformOrigin: \"608px 322px\" }}\n />\n </g>\n\n </>\n )}\n {/* ─── Cyber Trees & Hexagonal Foliage (Nature + Tech) ─── */}\n {/* Left Tree */}\n <g transform=\"translate(180, 360)\">\n {/* Server trunk */}\n <line x1=\"0\" y1=\"120\" x2=\"0\" y2=\"40\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"4\" />\n <rect x=\"-8\" y=\"50\" width=\"16\" height=\"28\" rx=\"2\" fill=\"var(--kz-surface-2)\" stroke=\"var(--kz-border-subtle)\" />\n {/* LED dots on trunk */}\n <circle cx=\"0\" cy=\"58\" r=\"1.5\" fill=\"var(--kz-accent)\" />\n <circle cx=\"0\" cy=\"66\" r=\"1.5\" fill=\"var(--kz-accent)\" opacity=\"0.6\" />\n {/* Hexagonal foliage */}\n <polygon points=\"0,-10 35,10 35,50 0,70 -35,50 -35,10\" fill={`url(#${u}-tree-grad)`} stroke=\"var(--kz-accent)\" strokeWidth=\"1.2\" opacity=\"0.4\" />\n <polygon points=\"0,-5 25,10 25,40 0,55 -25,40 -25,10\" fill={`url(#${u}-tree-grad)`} stroke=\"var(--kz-accent)\" strokeWidth=\"1.2\" opacity=\"0.6\" />\n </g>\n\n {/* Treehouse Tree (Center-Left) */}\n <g transform=\"translate(420, 320)\">\n {/* Trunk */}\n <line x1=\"0\" y1=\"180\" x2=\"0\" y2=\"60\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"5\" />\n <line x1=\"0\" y1=\"110\" x2=\"35\" y2=\"90\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"3.5\" />\n {/* Foliage */}\n <polygon points=\"0,-20 52,10 52,70 0,100 -52,70 -52,10\" fill={`url(#${u}-tree-grad)`} stroke=\"var(--kz-accent)\" strokeWidth=\"1.2\" opacity=\"0.35\" />\n <polygon points=\"0,-10 38,10 38,55 0,75 -38,55 -38,10\" fill={`url(#${u}-tree-grad)`} stroke=\"var(--kz-accent)\" strokeWidth=\"1.2\" opacity=\"0.5\" />\n\n {/* Hexagonal Treehouse */}\n <g transform=\"translate(0, 50)\" style={{ pointerEvents: \"auto\", cursor: \"pointer\" }} className=\"kzl-cyber-treehouse\">\n <polygon points=\"0,-30 26,-15 26,15 0,30 -26,15 -26,-15\" fill=\"var(--kz-surface-3)\" stroke=\"var(--kz-accent)\" strokeWidth=\"1.5\" />\n {/* Window */}\n <circle cx=\"0\" cy=\"0\" r=\"8\" fill=\"var(--kz-surface-1)\" stroke=\"var(--kz-border-strong)\" />\n <circle cx=\"0\" cy=\"0\" r=\"4\" fill=\"var(--kz-accent)\" className=\"kzl-window-glow\" />\n {/* Ladder */}\n <path d=\"M -6 30 L -6 95 M 6 30 L 6 95 M -6 42 L 6 42 M -6 54 L 6 54 M -6 66 L 6 66 M -6 78 L 6 78 M -6 90 L 6 90\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"1.5\" />\n {/* Animated green local data pulses rising from treehouse */}\n <circle cx=\"0\" cy=\"-45\" r=\"3\" fill=\"#10b981\" className=\"kzl-rising-pulse-1\" />\n <circle cx=\"15\" cy=\"-35\" r=\"2\" fill=\"#10b981\" className=\"kzl-rising-pulse-2\" />\n </g>\n </g>\n\n {/* Right Tree */}\n <g transform=\"translate(1000, 340)\">\n <line x1=\"0\" y1=\"160\" x2=\"0\" y2=\"60\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"4\" />\n <polygon points=\"0,-15 42,10 42,60 0,85 -42,60 -42,10\" fill={`url(#${u}-tree-grad)`} stroke=\"var(--kz-accent)\" strokeWidth=\"1.2\" opacity=\"0.4\" />\n <polygon points=\"0,-5 28,10 28,42 0,60 -28,42 -28,10\" fill={`url(#${u}-tree-grad)`} stroke=\"var(--kz-accent)\" strokeWidth=\"1.2\" opacity=\"0.6\" />\n </g>\n\n {/* ─── Cyber Tech Bench (Center-Right) ─── */}\n <g transform=\"translate(740, 480)\">\n {/* Bench support legs */}\n <line x1=\"20\" y1=\"35\" x2=\"20\" y2=\"60\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"4\" />\n <line x1=\"140\" y1=\"35\" x2=\"140\" y2=\"60\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"4\" />\n {/* Bench seat */}\n <rect x=\"0\" y=\"22\" width=\"160\" height=\"12\" rx=\"4\" fill={`url(#${u}-bench-grad)`} stroke=\"var(--kz-border-default)\" strokeWidth=\"1.2\" />\n {/* Bench backrest */}\n <rect x=\"0\" y=\"0\" width=\"160\" height=\"10\" rx=\"3\" fill={`url(#${u}-bench-grad)`} stroke=\"var(--kz-border-default)\" strokeWidth=\"1.2\" transform=\"rotate(-5, 80, 5)\" />\n {/* Backrest brackets */}\n <line x1=\"15\" y1=\"10\" x2=\"15\" y2=\"24\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"3\" />\n <line x1=\"145\" y1=\"10\" x2=\"145\" y2=\"24\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"3\" />\n </g>\n\n {flock && (\n <>\n {/* ─── MASCOT BIRD 4: Cyber Owl (Teal/Indigo - Left Tree) ─── */}\n <g transform=\"translate(180, 275) scale(1.4)\" className=\"kzl-bird-hitbox kzl-mobile-hide\">\n <rect x=\"-20\" y=\"-15\" width=\"40\" height=\"70\" fill=\"transparent\" style={{ cursor: \"pointer\", pointerEvents: \"all\" }} />\n <g className=\"kzl-bird-graphics kzl-owl-bot\">\n {/* Shadow */}\n <ellipse cx=\"0\" cy=\"50\" rx=\"16\" ry=\"4\" fill=\"rgba(0,0,0,0.15)\" />\n {/* Body */}\n <path\n d=\"M -15,10 C -15,-10, 15,-10, 15,10 C 15,30, 10,45, 0,45 C -10,45, -15,30, -15,10 Z\"\n fill={`url(#${u}-owl-grad)`}\n stroke=\"var(--kz-border-strong)\"\n strokeWidth=\"1.2\"\n />\n {/* Belly plate */}\n <path\n d=\"M -8,15 C -8,5, 8,5, 8,15 C 8,28, 5,35, 0,35 C -5,35, -8,28, -8,15 Z\"\n fill=\"#00f2fe\"\n opacity=\"0.35\"\n />\n {/* Eyes */}\n <circle cx=\"-6\" cy=\"2\" r=\"5\" fill=\"var(--kz-surface-0)\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"1\" />\n <circle cx=\"6\" cy=\"2\" r=\"5\" fill=\"var(--kz-surface-0)\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"1\" />\n <circle cx=\"-6\" cy=\"2\" r=\"2\" fill=\"#00ff66\" className=\"kzl-owl-eye\" />\n <circle cx=\"6\" cy=\"2\" r=\"2\" fill=\"#00ff66\" className=\"kzl-owl-eye\" />\n {/* Beak */}\n <polygon points=\"-2,4 2,4 0,10\" fill=\"#fbbf24\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"1\" />\n {/* Horns / Ears */}\n <polygon points=\"-12,-8 -6,-4 -14,2\" fill=\"#7c3aed\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"1\" />\n <polygon points=\"12,-8 6,-4 14,2\" fill=\"#7c3aed\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"1\" />\n </g>\n </g>\n\n {/* ─── MASCOT BIRD 1: Cyber-Sentry Falcon (Orange - Left) ─── */}\n <g transform=\"translate(120, 360) scale(1.65)\" className=\"kzl-bird-hitbox kzl-mobile-hide\">\n <rect x=\"-10\" y=\"0\" width=\"70\" height=\"90\" fill=\"transparent\" style={{ cursor: \"pointer\", pointerEvents: \"all\" }} />\n <g className=\"kzl-bird-graphics kzl-falcon-bot\">\n {/* Shadow */}\n <ellipse cx=\"25\" cy=\"85\" rx=\"30\" ry=\"6\" fill=\"rgba(0,0,0,0.15)\" />\n \n {/* Legs */}\n <line x1=\"16\" y1=\"65\" x2=\"12\" y2=\"85\" stroke=\"#f97316\" strokeWidth=\"3\" strokeLinecap=\"round\" />\n <line x1=\"34\" y1=\"65\" x2=\"38\" y2=\"85\" stroke=\"#f97316\" strokeWidth=\"3\" strokeLinecap=\"round\" />\n {/* Feet claws */}\n <path d=\"M 6 85 L 14 85 M 34 85 L 44 85\" stroke=\"#f97316\" strokeWidth=\"3\" strokeLinecap=\"round\" />\n\n {/* Body */}\n <path\n d=\"M 5 35 C 5 20, 45 20, 45 35 C 45 58, 38 68, 25 68 C 12 68, 5 58, 5 35 Z\"\n fill={`url(#${u}-falcon-grad)`}\n stroke=\"var(--kz-border-strong)\"\n strokeWidth=\"1.5\"\n />\n {/* Belly plate */}\n <path\n d=\"M 12 38 C 12 28, 38 28, 38 38 C 38 52, 32 58, 25 58 C 18 58, 12 52, 12 38 Z\"\n fill=\"#ff9800\"\n opacity=\"0.85\"\n />\n\n {/* Wings */}\n <path\n d=\"M 2 30 C -8 40, -4 60, 10 58 C 5 50, 4 38, 2 30 Z\"\n fill=\"#d84315\"\n stroke=\"var(--kz-border-strong)\"\n strokeWidth=\"1.2\"\n className=\"kzl-wing-left\"\n style={{ transformOrigin: \"2px 30px\" }}\n />\n <path\n d=\"M 48 30 C 58 40, 54 60, 40 58 C 45 50, 46 38, 48 30 Z\"\n fill=\"#d84315\"\n stroke=\"var(--kz-border-strong)\"\n strokeWidth=\"1.2\"\n className=\"kzl-wing-right\"\n style={{ transformOrigin: \"48px 30px\" }}\n />\n\n {/* Tail feathers */}\n <path d=\"M 20 66 L 15 80 L 25 76 L 35 80 L 30 66\" fill=\"#bf360c\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"1\" />\n\n {/* Head */}\n <g className=\"kzl-head-group\" style={{ transformOrigin: \"25px 28px\" }}>\n <circle cx=\"25\" cy=\"22\" r=\"18\" fill={`url(#${u}-falcon-grad)`} stroke=\"var(--kz-border-strong)\" strokeWidth=\"1.5\" />\n \n {/* Beak */}\n <polygon points=\"21,24 29,24 25,36\" fill=\"#ffb300\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"1.2\" />\n\n {/* Visor */}\n <rect x=\"9\" y=\"10\" width=\"32\" height=\"10\" rx=\"3\" fill=\"var(--kz-surface-0)\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"1.2\" />\n {/* Lenses */}\n <circle cx=\"17\" cy=\"15\" r=\"2.5\" fill=\"#00f2fe\" className=\"kzl-falcon-eye\" />\n <circle cx=\"33\" cy=\"15\" r=\"2.5\" fill=\"#00f2fe\" className=\"kzl-falcon-eye\" />\n {/* Wire */}\n <path d=\"M 41 15 C 44 15, 43 25, 41 28\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"1\" fill=\"none\" />\n </g>\n\n {/* Sentry Scan Laser Overlay */}\n <polygon points=\"25,28 -60,180 110,180\" fill={`url(#${u}-holo-grad)`} className=\"kzl-sentry-laser\" opacity=\"0\" style={{ transformOrigin: \"25px 28px\", pointerEvents: \"none\" }} />\n </g>\n </g>\n\n {/* ─── MASCOT BIRD 2: Developer Duck (Pink - Center Bench) ─── */}\n <g transform=\"translate(750, 355) scale(1.75)\" className=\"kzl-bird-hitbox kzl-mobile-hide\">\n <rect x=\"-10\" y=\"5\" width=\"70\" height=\"75\" fill=\"transparent\" style={{ cursor: \"pointer\", pointerEvents: \"all\" }} />\n <g className=\"kzl-bird-graphics kzl-developer-duck\">\n {/* Sitting body */}\n <path\n d=\"M 5 45 C 5 30, 45 30, 45 45 C 45 62, 38 72, 25 72 C 12 72, 5 62, 5 45 Z\"\n fill={`url(#${u}-duck-grad)`}\n stroke=\"var(--kz-border-strong)\"\n strokeWidth=\"1.5\"\n />\n {/* Belly light */}\n <path\n d=\"M 12 48 C 12 40, 38 40, 38 48 C 38 60, 32 64, 25 64 C 18 64, 12 60, 12 48 Z\"\n fill=\"#f472b6\"\n opacity=\"0.85\"\n />\n\n {/* Wings typing */}\n <path\n d=\"M -2 40 C -8 46, -4 55, 10 52\"\n fill=\"none\"\n stroke=\"#db2777\"\n strokeWidth=\"8\"\n strokeLinecap=\"round\"\n className=\"kzl-wing-left-type\"\n />\n <path\n d=\"M 52 40 C 58 46, 54 55, 40 52\"\n fill=\"none\"\n stroke=\"#db2777\"\n strokeWidth=\"8\"\n strokeLinecap=\"round\"\n className=\"kzl-wing-right-type\"\n />\n\n {/* Head */}\n <g className=\"kzl-head-group\" style={{ transformOrigin: \"25px 32px\" }}>\n <circle cx=\"25\" cy=\"24\" r=\"16\" fill={`url(#${u}-duck-grad)`} stroke=\"var(--kz-border-strong)\" strokeWidth=\"1.5\" />\n {/* Duck Beak */}\n <path\n d=\"M 12 24 C 12 20, 22 18, 25 18 C 28 18, 38 20, 38 24 C 38 28, 28 32, 25 32 C 22 32, 12 28, 12 24 Z\"\n fill=\"#fbbf24\"\n stroke=\"var(--kz-border-strong)\"\n strokeWidth=\"1.2\"\n />\n {/* Eyes */}\n <circle cx=\"19\" cy=\"16\" r=\"2\" fill=\"var(--kz-text-primary)\" className=\"kzl-duck-eye\" />\n <circle cx=\"31\" cy=\"16\" r=\"2\" fill=\"var(--kz-text-primary)\" className=\"kzl-duck-eye\" />\n {/* Glasses */}\n <circle cx=\"19\" cy=\"16\" r=\"4.5\" fill=\"none\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"1.2\" />\n <circle cx=\"31\" cy=\"16\" r=\"4.5\" fill=\"none\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"1.2\" />\n <line x1=\"23.5\" y1=\"16\" x2=\"26.5\" y2=\"16\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"1.2\" />\n </g>\n\n {/* Holographic Laptop */}\n <g transform=\"translate(10, 52)\">\n {/* Base */}\n <polygon points=\"-8,16 38,16 30,22 -14,22\" fill=\"var(--kz-surface-3)\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"1\" />\n {/* Hologram screen */}\n <polygon\n points=\"-4,14 34,14 30,-2 -8,-2\"\n fill=\"var(--kz-accent-soft)\"\n stroke=\"var(--kz-accent)\"\n strokeWidth=\"1\"\n opacity=\"0.8\"\n className=\"kzl-laptop-screen\"\n />\n {/* Glowing prompt line */}\n <line x1=\"-2\" y1=\"4\" x2=\"24\" y2=\"4\" stroke=\"var(--kz-accent)\" strokeWidth=\"1.5\" opacity=\"0.9\" />\n <line x1=\"-2\" y1=\"8\" x2=\"16\" y2=\"8\" stroke=\"var(--kz-accent)\" strokeWidth=\"1.5\" opacity=\"0.6\" />\n \n {/* Holographic Projection */}\n <polygon points=\"12,-2 -40,-80 70,-80\" fill={`url(#${u}-holo-grad)`} opacity=\"0\" className=\"kzl-holo-projection\" style={{ pointerEvents: \"none\" }} />\n {/* Tiny code elements inside hologram */}\n <g className=\"kzl-holo-elements\" opacity=\"0\">\n <rect x=\"-10\" y=\"-45\" width=\"22\" height=\"6\" rx=\"2\" fill=\"var(--kz-surface-3)\" stroke=\"#10b981\" strokeWidth=\"0.5\" />\n <rect x=\"18\" y=\"-35\" width=\"18\" height=\"6\" rx=\"2\" fill=\"var(--kz-surface-3)\" stroke=\"#10b981\" strokeWidth=\"0.5\" />\n </g>\n </g>\n </g>\n </g>\n\n {/* ─── MASCOT BIRD 3: High-Neck Flamingo-Bot (Blue - Right) ─── */}\n <g transform=\"translate(1000, 270) scale(1.75)\" className=\"kzl-bird-hitbox kzl-mobile-hide\">\n <rect x=\"-15\" y=\"0\" width=\"65\" height=\"165\" fill=\"transparent\" style={{ cursor: \"pointer\", pointerEvents: \"all\" }} />\n <g className=\"kzl-bird-graphics kzl-flamingo-bot\">\n {/* Shadow */}\n <ellipse cx=\"20\" cy=\"160\" rx=\"22\" ry=\"5\" fill=\"rgba(0,0,0,0.15)\" />\n\n {/* Long legs */}\n <line x1=\"12\" y1=\"105\" x2=\"12\" y2=\"160\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"2.5\" />\n <line x1=\"26\" y1=\"105\" x2=\"28\" y2=\"160\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"2.5\" />\n {/* Joints */}\n <circle cx=\"12\" cy=\"130\" r=\"2.5\" fill=\"#3b82f6\" />\n <circle cx=\"27\" cy=\"130\" r=\"2.5\" fill=\"#3b82f6\" />\n\n {/* Body */}\n <path\n d=\"M 2 80 C 2 68, 38 68, 38 80 C 38 108, 28 112, 20 112 C 12 112, 2 108, 2 80 Z\"\n fill={`url(#${u}-flamingo-grad)`}\n stroke=\"var(--kz-border-strong)\"\n strokeWidth=\"1.5\"\n />\n\n {/* Wing (Vibrant contrast) */}\n <path\n d=\"M 8 82 L 20 74 L 32 82 L 32 94 L 20 102 L 8 94 Z\"\n fill=\"#ec4899\"\n stroke=\"var(--kz-border-strong)\"\n strokeWidth=\"1\"\n opacity=\"0.95\"\n className=\"kzl-flamingo-wing\"\n />\n\n {/* Curved neck */}\n <path\n d=\"M 20 74 C 20 60, -2 40, 8 18\"\n fill=\"none\"\n stroke={`url(#${u}-flamingo-grad)`}\n strokeWidth=\"6\"\n strokeLinecap=\"round\"\n className=\"kzl-flamingo-neck\"\n />\n\n {/* Head */}\n <g className=\"kzl-head-group\" transform=\"translate(8, 12)\" style={{ transformOrigin: \"0px 0px\" }}>\n <circle cx=\"0\" cy=\"0\" r=\"10\" fill={`url(#${u}-flamingo-grad)`} stroke=\"var(--kz-border-strong)\" strokeWidth=\"1.2\" />\n \n {/* Eye */}\n <circle cx=\"-3\" cy=\"-2\" r=\"1.5\" fill=\"var(--kz-surface-0)\" />\n <circle cx=\"-3\" cy=\"-2\" r=\"0.6\" fill=\"#f43f5e\" className=\"kzl-flamingo-eye\" />\n\n {/* Beak */}\n <path d=\"M -8 -2 C -18 2, -16 14, -22 18 C -14 10, -8 4, -8 -2 Z\" fill=\"#fbbf24\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"1\" />\n\n {/* Hat */}\n <path d=\"M -8 -8 L 8 -8 L 6 -14 L -6 -14 Z\" fill=\"var(--kz-surface-3)\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"1.2\" />\n <ellipse cx=\"0\" cy=\"-8\" rx=\"10\" ry=\"1.5\" fill=\"var(--kz-surface-3)\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"1\" />\n </g>\n </g>\n </g>\n\n </>\n )}\n {/* ─── Floating Glowing Tech Particles ─── */}\n <circle cx=\"340\" cy=\"300\" r=\"6\" fill=\"#00f2fe\" opacity=\"0.75\" className=\"kzl-float-particle-1\" />\n <circle cx=\"520\" cy=\"220\" r=\"5\" fill=\"#a855f7\" opacity=\"0.65\" className=\"kzl-float-particle-2\" />\n <circle cx=\"710\" cy=\"310\" r=\"6.5\" fill=\"#3b82f6\" opacity=\"0.7\" className=\"kzl-float-particle-3\" />\n <circle cx=\"920\" cy=\"250\" r=\"5\" fill=\"#00f2fe\" opacity=\"0.8\" className=\"kzl-float-particle-4\" />\n </g>\n </svg>\n {fade && <div className=\"kzl-fade\" />}\n </div>\n );\n}\n"
|
|
134
|
+
"content": "// The Krizaka landscape — a valley at dusk under a constellation: three ranges of peaks, a phoenix over a river of\n// two flames, trees of light, a treehouse, and the flock at work (the falcon on watch, the owl, the duck at its\n// laptop, the flamingo). The brand layer's illustration, like the marks: drawn in code, ids unique per instance, its\n// own colours by default (`tone=\"own\"`) or the host brand's sky and peaks (`tone=\"brand\"`). Decorative.\nimport type * as React from \"react\";\nimport { useId } from \"react\";\n\nimport { cn } from \"../cn\";\n\n/** The sky and the peaks: the Krizaka dusk (`own`), or the host brand's accents (`brand`). Birds keep their colours. */\nconst TONES = {\n own: {\n \"--kzl-sun\": \"#f59e0b\",\n \"--kzl-sun-2\": \"#ec4899\",\n \"--kzl-sun-3\": \"#6366f1\",\n \"--kzl-far\": \"#6366f1\",\n \"--kzl-far-2\": \"#4f46e5\",\n \"--kzl-far-line\": \"#818cf8\",\n \"--kzl-mid\": \"#06b6d4\",\n \"--kzl-mid-2\": \"#0891b2\",\n \"--kzl-mid-line\": \"#22d3ee\",\n \"--kzl-near\": \"#d946ef\",\n \"--kzl-near-2\": \"#a855f7\",\n \"--kzl-near-line\": \"#e879f9\",\n \"--kzl-aurora-l\": \"#00f2fe\",\n \"--kzl-aurora-r\": \"#ec4899\",\n },\n brand: {\n \"--kzl-sun\": \"var(--kz-accent-2, var(--kz-accent))\",\n \"--kzl-sun-2\": \"var(--kz-accent)\",\n \"--kzl-sun-3\": \"var(--kz-accent)\",\n \"--kzl-far\": \"var(--kz-accent-2, var(--kz-accent))\",\n \"--kzl-far-2\": \"var(--kz-accent-2, var(--kz-accent))\",\n \"--kzl-far-line\": \"var(--kz-accent-2, var(--kz-accent))\",\n \"--kzl-mid\": \"color-mix(in srgb, var(--kz-accent) 55%, var(--kz-accent-2, var(--kz-accent)))\",\n \"--kzl-mid-2\": \"color-mix(in srgb, var(--kz-accent) 55%, var(--kz-accent-2, var(--kz-accent)))\",\n \"--kzl-mid-line\": \"color-mix(in srgb, var(--kz-accent) 55%, var(--kz-accent-2, var(--kz-accent)))\",\n \"--kzl-near\": \"var(--kz-accent)\",\n \"--kzl-near-2\": \"var(--kz-accent)\",\n \"--kzl-near-line\": \"var(--kz-accent)\",\n \"--kzl-aurora-l\": \"var(--kz-accent-2, var(--kz-accent))\",\n \"--kzl-aurora-r\": \"var(--kz-accent)\",\n },\n} as const;\n\nconst CSS = `\n.kzl { pointer-events: none; overflow: hidden; }\n.kzl-fade { position: absolute; bottom: 0; left: 0; right: 0; height: 120px; pointer-events: none; z-index: 3;\n background: linear-gradient(to top, var(--kz-surface-0) 0%, transparent 100%); }\n /* --- Cyber Phoenix & Flame Flow animations --- */\n @keyframes kzl-phoenix-flow-purple {\n from { stroke-dashoffset: 350; }\n to { stroke-dashoffset: 0; }\n }\n @keyframes kzl-phoenix-flow-gold {\n from { stroke-dashoffset: 0; }\n to { stroke-dashoffset: 350; }\n }\n @keyframes kzl-phoenix-bob {\n 0%, 100% { transform: translateY(0) scale(1); }\n 50% { transform: translateY(-8px) scale(1.02); }\n }\n @keyframes kzl-wing-flap-l-phoenix {\n 0%, 100% { transform: rotate(0deg); }\n 50% { transform: rotate(-10deg) translateY(-2px); }\n }\n @keyframes kzl-wing-flap-r-phoenix {\n 0%, 100% { transform: rotate(0deg); }\n 50% { transform: rotate(10deg) translateY(-2px); }\n }\n @keyframes kzl-core-glow {\n 0%, 100% { fill: #ffef5c; filter: drop-shadow(0 0 1px #ffef5c); }\n 50% { fill: #ffffff; filter: drop-shadow(0 0 5px #ff3c00); }\n }\n\n .kzl-cyber-phoenix {\n animation: kzl-phoenix-bob 4s ease-in-out infinite;\n transform-origin: 600px 325px;\n transition: transform 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);\n }\n .kzl-cyber-phoenix:hover {\n transform: translateY(-4px) scale(1.08);\n }\n .kzl-phoenix-wing-l {\n animation: kzl-wing-flap-l-phoenix 2.5s ease-in-out infinite;\n }\n .kzl-phoenix-wing-r {\n animation: kzl-wing-flap-r-phoenix 2.5s ease-in-out infinite;\n }\n .kzl-cyber-phoenix:hover .kzl-phoenix-wing-l {\n animation: kzl-wing-flap-l-phoenix 0.6s linear infinite;\n }\n .kzl-cyber-phoenix:hover .kzl-phoenix-wing-r {\n animation: kzl-wing-flap-r-phoenix 0.6s linear infinite;\n }\n .kzl-phoenix-core {\n animation: kzl-core-glow 1.5s ease-in-out infinite;\n }\n\n /* --- Pulse Animations --- */\n @keyframes kzl-opacity-pulse {\n 0%, 100% { opacity: 0.35; }\n 50% { opacity: 0.95; }\n }\n .kzl-pulse-slow {\n animation: kzl-opacity-pulse 4s ease-in-out infinite;\n }\n @keyframes kzl-sun-pulse {\n 0%, 100% { opacity: 0.16; transform: scale(0.96); }\n 50% { opacity: 0.32; transform: scale(1.04); }\n }\n .kzl-sun-pulsing {\n animation: kzl-sun-pulse 6s ease-in-out infinite;\n transform-origin: 600px 200px;\n }\n\n /* --- Rising local data pulses --- */\n @keyframes kzl-rise-fade-1 {\n 0% { transform: translateY(80px) scale(0.5); opacity: 0; }\n 40% { opacity: 0.8; }\n 100% { transform: translateY(-30px) scale(1.3); opacity: 0; }\n }\n @keyframes kzl-rise-fade-2 {\n 0% { transform: translateY(60px) scale(0.4); opacity: 0; }\n 50% { opacity: 0.9; }\n 100% { transform: translateY(-50px) scale(1.2); opacity: 0; }\n }\n .kzl-rising-pulse-1 {\n animation: kzl-rise-fade-1 4s cubic-bezier(0.1, 0.8, 0.3, 1) infinite;\n transform-origin: center;\n }\n .kzl-rising-pulse-2 {\n animation: kzl-rise-fade-2 5s cubic-bezier(0.1, 0.8, 0.3, 1) infinite 1.5s;\n transform-origin: center;\n }\n\n /* --- Mascot Hover Animations (Stable Hitboxes) --- */\n .kzl-bird-graphics {\n transform-box: fill-box;\n transform-origin: center;\n transition: transform 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);\n }\n .kzl-bird-hitbox:hover .kzl-bird-graphics {\n transform: scale(1.08) translateY(-4px);\n }\n\n /* --- Bird Eye Blinking/Glowing Animations --- */\n .kzl-falcon-eye {\n animation: kzl-falcon-eye-pulse 2.5s ease-in-out infinite;\n }\n .kzl-duck-eye {\n transform-box: fill-box;\n transform-origin: center;\n animation: kzl-eye-blink 5s ease-in-out infinite 1s;\n }\n .kzl-flamingo-eye {\n transform-box: fill-box;\n transform-origin: center;\n animation: kzl-eye-blink 6s ease-in-out infinite 2.5s;\n }\n .kzl-owl-eye {\n transform-box: fill-box;\n transform-origin: center;\n animation: kzl-eye-blink 4s ease-in-out infinite 0.5s;\n }\n\n @keyframes kzl-eye-blink {\n 0%, 90%, 100% {\n transform: scaleY(1);\n }\n 95% {\n transform: scaleY(0.15);\n }\n }\n\n @keyframes kzl-falcon-eye-pulse {\n 0%, 100% { fill: #00f2fe; filter: drop-shadow(0 0 2px #00f2fe); }\n 50% { fill: #00ff66; filter: drop-shadow(0 0 5px #00ff66); }\n }\n\n /* FalconBot constant loop animations */\n .kzl-falcon-bot .kzl-head-group {\n animation: kzl-head-bob 4s ease-in-out infinite;\n }\n .kzl-falcon-bot .kzl-wing-left {\n animation: kzl-wing-flap-left 3s ease-in-out infinite;\n }\n .kzl-falcon-bot .kzl-wing-right {\n animation: kzl-wing-flap-right 3s ease-in-out infinite;\n }\n .kzl-falcon-bot .kzl-sentry-laser {\n animation: kzl-scan-flicker 5s ease-in-out infinite;\n }\n\n @keyframes kzl-scan-flicker {\n 0%, 100% { opacity: 0; }\n 10%, 90% { opacity: 0.15; }\n 50% { opacity: 0.5; }\n }\n @keyframes kzl-head-bob {\n 0%, 100% { transform: translateY(0) rotate(0deg); }\n 50% { transform: translateY(-2px) rotate(2deg); }\n }\n @keyframes kzl-wing-flap-left {\n 0%, 100% { transform: rotate(0deg); }\n 50% { transform: rotate(-8deg) scaleX(1.05); }\n }\n @keyframes kzl-wing-flap-right {\n 0%, 100% { transform: rotate(0deg); }\n 50% { transform: rotate(8deg) scaleX(1.05); }\n }\n\n /* Developer Duck constant loop animations */\n .kzl-developer-duck .kzl-head-group {\n animation: kzl-duck-look 6s ease-in-out infinite;\n }\n .kzl-developer-duck .kzl-wing-left-type {\n animation: kzl-wing-type-l 0.5s ease-in-out infinite;\n }\n .kzl-developer-duck .kzl-wing-right-type {\n animation: kzl-wing-type-r 0.5s ease-in-out infinite 0.25s;\n }\n .kzl-developer-duck .kzl-laptop-screen {\n animation: kzl-screen-flicker-idle 3s ease-in-out infinite;\n }\n .kzl-developer-duck .kzl-holo-projection {\n animation: kzl-holo-flicker 6s ease-in-out infinite;\n }\n .kzl-developer-duck .kzl-holo-elements {\n animation: kzl-holo-elements-rise 6s ease-in-out infinite;\n }\n\n @keyframes kzl-screen-flicker-idle {\n 0%, 100% { opacity: 0.7; }\n 50% { opacity: 0.95; filter: drop-shadow(0 0 3px var(--kz-accent)); }\n }\n @keyframes kzl-holo-flicker {\n 0%, 100% { opacity: 0; }\n 20%, 80% { opacity: 0.35; }\n 50% { opacity: 0.65; }\n }\n @keyframes kzl-holo-elements-rise {\n 0% { transform: translateY(10px); opacity: 0; }\n 50% { opacity: 0.8; }\n 100% { transform: translateY(-15px); opacity: 0; }\n }\n @keyframes kzl-duck-look {\n 0%, 100% { transform: rotate(0deg); }\n 30% { transform: rotate(-5deg); }\n 70% { transform: rotate(5deg); }\n }\n @keyframes kzl-wing-type-l {\n 0%, 100% { transform: translateY(0) rotate(0deg); }\n 50% { transform: translateY(-3px) rotate(-4deg); }\n }\n @keyframes kzl-wing-type-r {\n 0%, 100% { transform: translateY(0) rotate(0deg); }\n 50% { transform: translateY(-3px) rotate(4deg); }\n }\n\n /* Flamingo Bot constant loop animations */\n .kzl-flamingo-bot .kzl-head-group {\n animation: kzl-flamingo-head-bob 5s ease-in-out infinite;\n }\n .kzl-flamingo-bot .kzl-flamingo-neck {\n animation: kzl-flamingo-neck-sway 7s ease-in-out infinite;\n transform-origin: 20px 74px;\n }\n .kzl-flamingo-bot .kzl-flamingo-wing {\n animation: kzl-flamingo-wing-flap 4s ease-in-out infinite;\n }\n\n @keyframes kzl-flamingo-neck-sway {\n 0%, 100% { transform: rotate(0deg); }\n 50% { transform: rotate(-3deg) scaleY(1.02); }\n }\n @keyframes kzl-flamingo-head-bob {\n 0%, 100% { transform: translate(8px, 12px) translateY(0) rotate(0deg); }\n 50% { transform: translate(8px, 12px) translateY(-5px) rotate(-3deg); }\n }\n @keyframes kzl-flamingo-wing-flap {\n 0%, 100% { transform: translateY(0) rotate(0deg); }\n 50% { transform: translateY(-2px) rotate(-6deg); }\n }\n\n /* Owl Bot constant loop animations */\n .kzl-owl-bot {\n animation: kzl-owl-sway 5s ease-in-out infinite;\n transform-origin: center;\n }\n @keyframes kzl-owl-sway {\n 0%, 100% { transform: rotate(0deg) translateY(0); }\n 50% { transform: rotate(-3deg) translateY(-2px); }\n }\n\n /* Treehouse hover glow */\n .kzl-cyber-treehouse:hover .kzl-window-glow {\n fill: #f59e0b;\n filter: drop-shadow(0 0 10px #f59e0b);\n }\n\n /* Floating tech particles */\n @keyframes kzl-float-up-down {\n 0%, 100% { transform: translateY(0); opacity: 0.4; }\n 50% { transform: translateY(-24px); opacity: 0.95; }\n }\n .kzl-float-particle-1 { animation: kzl-float-up-down 4.2s ease-in-out infinite; }\n .kzl-float-particle-2 { animation: kzl-float-up-down 5.2s ease-in-out infinite 1.2s; }\n .kzl-float-particle-3 { animation: kzl-float-up-down 4.7s ease-in-out infinite 0.6s; }\n .kzl-float-particle-4 { animation: kzl-float-up-down 6.2s ease-in-out infinite 2.2s; }\n\n @media (max-width: 1024px) {\n .kzl-mobile-hide {\n display: none !important;\n }\n }\n/* Still: with animated={false}, off screen, and under reduced motion — every loop holds its first frame. */\n.kzl[data-still] *, .kzl[data-offscreen] * { animation-play-state: paused !important; }\n@media (prefers-reduced-motion: reduce) {\n .kzl * { animation-play-state: paused !important; transition: none !important; }\n}\n`;\n\nexport type LandscapeProps = Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> & {\n /**\n * `own`: the Krizaka dusk (indigo, cyan and magenta peaks). `brand`: the sky and the peaks in the host brand's\n * accents (`.brand-<id>`). The birds and the phoenix keep their own colours.\n * @default \"own\"\n */\n tone?: \"own\" | \"brand\";\n /**\n * The flock at work in the valley (hidden under 1024 px wide either way).\n * @default true\n */\n flock?: boolean;\n /**\n * The phoenix and its river of two flames.\n * @default true\n */\n phoenix?: boolean;\n /**\n * The slow loops (the sun, the stars, the flames, the birds). `false` holds the first frame; always held under\n * `prefers-reduced-motion` and while off screen (with `MotionObserver`).\n * @default true\n */\n animated?: boolean;\n /**\n * `absolute`: fills its positioned parent, anchored at the bottom (a backdrop). `relative`: a block in the flow — give\n * it a height.\n * @default \"absolute\"\n */\n position?: \"absolute\" | \"relative\";\n /**\n * Fades the bottom into the page's surface.\n * @default true\n */\n fade?: boolean;\n};\n\n/** The Krizaka landscape: a decorative backdrop for a hero or a page's end (`aria-hidden`). */\nexport function Landscape({ tone = \"own\", flock = true, phoenix = true, animated = true, position = \"absolute\", fade = true, className, style, ...props }: LandscapeProps) {\n const u = \"kzl\" + useId().replace(/[^a-zA-Z0-9_-]/g, \"\");\n const box: React.CSSProperties =\n position === \"absolute\" ? { position: \"absolute\", inset: \"auto 0 0 0\", height: \"100%\", width: \"100%\" } : { position: \"relative\", width: \"100%\", height: 440 };\n return (\n <div\n aria-hidden\n data-motion-scope=\"\"\n data-still={animated ? undefined : \"\"}\n className={cn(\"kzl\", className)}\n style={{ ...box, ...(TONES[tone] as React.CSSProperties), ...style }}\n {...props}\n >\n <style>{CSS}</style>\n <svg width=\"100%\" height=\"100%\" viewBox=\"0 50 1200 520\" preserveAspectRatio=\"xMidYMax slice\" fill=\"none\" style={{ display: \"block\", pointerEvents: \"none\" }}>\n <defs>\n {/* Vibrant Cyber Sun Glow */}\n <radialGradient id={`${u}-sun-glow`} cx=\"50%\" cy=\"50%\" r=\"50%\">\n <stop offset=\"0%\" stopColor=\"var(--kzl-sun)\" stopOpacity=\"0.45\" />\n <stop offset=\"30%\" stopColor=\"var(--kzl-sun-2)\" stopOpacity=\"0.28\" />\n <stop offset=\"70%\" stopColor=\"var(--kzl-sun-3)\" stopOpacity=\"0.16\" />\n <stop offset=\"100%\" stopColor=\"transparent\" stopOpacity=\"0\" />\n </radialGradient>\n\n {/* Mountains Vibrant Gradients */}\n <linearGradient id={`${u}-mtn-back`} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor=\"var(--kzl-far)\" stopOpacity=\"0.75\" /> {/* indigo */}\n <stop offset=\"50%\" stopColor=\"var(--kzl-far-2)\" stopOpacity=\"0.45\" />\n <stop offset=\"100%\" stopColor=\"var(--kz-surface-0)\" />\n </linearGradient>\n <linearGradient id={`${u}-mtn-mid`} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor=\"var(--kzl-mid)\" stopOpacity=\"0.7\" /> {/* cyan */}\n <stop offset=\"50%\" stopColor=\"var(--kzl-mid-2)\" stopOpacity=\"0.4\" />\n <stop offset=\"100%\" stopColor=\"var(--kz-surface-0)\" />\n </linearGradient>\n <linearGradient id={`${u}-mtn-front`} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor=\"var(--kzl-near)\" stopOpacity=\"0.8\" /> {/* pink */}\n <stop offset=\"50%\" stopColor=\"var(--kzl-near-2)\" stopOpacity=\"0.5\" />\n <stop offset=\"100%\" stopColor=\"var(--kz-surface-0)\" />\n </linearGradient>\n\n {/* Vibrant Mascot Gradients */}\n <linearGradient id={`${u}-falcon-grad`} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor=\"#ff9f00\" />\n <stop offset=\"100%\" stopColor=\"#ff2a00\" />\n </linearGradient>\n <linearGradient id={`${u}-duck-grad`} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor=\"#f43f5e\" />\n <stop offset=\"100%\" stopColor=\"#be123c\" />\n </linearGradient>\n <linearGradient id={`${u}-flamingo-grad`} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor=\"#3e76a8\" />\n <stop offset=\"100%\" stopColor=\"#1d4ed8\" />\n </linearGradient>\n <linearGradient id={`${u}-owl-grad`} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor=\"#a78bfa\" />\n <stop offset=\"100%\" stopColor=\"#6d28d9\" />\n </linearGradient>\n\n {/* Hologram Projections */}\n <linearGradient id={`${u}-holo-grad`} x1=\"0%\" y1=\"100%\" x2=\"0%\" y2=\"0%\">\n <stop offset=\"0%\" stopColor=\"#10b981\" stopOpacity=\"0.5\" />\n <stop offset=\"100%\" stopColor=\"#10b981\" stopOpacity=\"0\" />\n </linearGradient>\n\n {/* Rival flame gradients for the Cyber-Phoenix */}\n <linearGradient id={`${u}-phoenix-gold-grad`} x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor=\"#ffb000\" />\n <stop offset=\"100%\" stopColor=\"#ff3c00\" />\n </linearGradient>\n <linearGradient id={`${u}-phoenix-purple-grad`} x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor=\"#c084fc\" />\n <stop offset=\"100%\" stopColor=\"#db2777\" />\n </linearGradient>\n <linearGradient id={`${u}-phoenix-body-grad`} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor=\"var(--kz-surface-3)\" />\n <stop offset=\"100%\" stopColor=\"var(--kz-surface-2)\" />\n </linearGradient>\n\n {/* Glowing stream gradients */}\n <linearGradient id={`${u}-gold-glow`} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor=\"#ff3c00\" stopOpacity=\"0.95\" />\n <stop offset=\"50%\" stopColor=\"#ffb000\" stopOpacity=\"0.75\" />\n <stop offset=\"100%\" stopColor=\"var(--kz-surface-0)\" />\n </linearGradient>\n <linearGradient id={`${u}-purple-glow`} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor=\"#db2777\" stopOpacity=\"0.95\" />\n <stop offset=\"50%\" stopColor=\"#a78bfa\" stopOpacity=\"0.75\" />\n <stop offset=\"100%\" stopColor=\"var(--kz-surface-0)\" />\n </linearGradient>\n\n {/* River mask to fade out at the bottom */}\n <linearGradient id={`${u}-river-mask-grad`} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"85%\" stopColor=\"white\" />\n <stop offset=\"100%\" stopColor=\"black\" />\n </linearGradient>\n <mask id={`${u}-river-fade-mask`}>\n <rect x=\"0\" y=\"0\" width=\"1200\" height=\"1000\" fill={`url(#${u}-river-mask-grad)`} />\n </mask>\n\n {/* Cyber trees gradient */}\n <linearGradient id={`${u}-tree-grad`} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor=\"var(--kz-accent)\" stopOpacity=\"0.35\" />\n <stop offset=\"100%\" stopColor=\"transparent\" />\n </linearGradient>\n\n {/* Cyber Bench Gradient */}\n <linearGradient id={`${u}-bench-grad`} x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\n <stop offset=\"0%\" stopColor=\"var(--kz-surface-3)\" />\n <stop offset=\"100%\" stopColor=\"var(--kz-surface-2)\" />\n </linearGradient>\n\n {/* Cyber Aurora Glows */}\n <radialGradient id={`${u}-aurora-left`} cx=\"20%\" cy=\"30%\" r=\"50%\">\n <stop offset=\"0%\" stopColor=\"var(--kzl-aurora-l)\" stopOpacity=\"0.22\" />\n <stop offset=\"100%\" stopColor=\"transparent\" stopOpacity=\"0\" />\n </radialGradient>\n <radialGradient id={`${u}-aurora-right`} cx=\"80%\" cy=\"25%\" r=\"50%\">\n <stop offset=\"0%\" stopColor=\"var(--kzl-aurora-r)\" stopOpacity=\"0.22\" />\n <stop offset=\"100%\" stopColor=\"transparent\" stopOpacity=\"0\" />\n </radialGradient>\n </defs>\n\n <g transform=\"translate(0, 60)\">\n {/* ─── Cyber Aurora Backdrop ─── */}\n <circle cx=\"200\" cy=\"180\" r=\"600\" fill={`url(#${u}-aurora-left)`} />\n <circle cx=\"1000\" cy=\"150\" r=\"600\" fill={`url(#${u}-aurora-right)`} />\n\n {/* ─── Ethereal Sun and Sky Network Nodes (Constellations) ─── */}\n <circle cx=\"600\" cy=\"200\" r=\"380\" fill={`url(#${u}-sun-glow)`} />\n <circle cx=\"600\" cy=\"200\" r=\"64\" fill=\"var(--kzl-sun)\" opacity=\"0.16\" className=\"kzl-sun-pulsing\" />\n\n {/* Constellation grid lines in the sky */}\n <g opacity=\"0.3\" stroke=\"var(--kz-accent)\" strokeWidth=\"1\">\n <line x1=\"300\" y1=\"120\" x2=\"380\" y2=\"80\" />\n <line x1=\"380\" y1=\"80\" x2=\"450\" y2=\"110\" />\n <line x1=\"450\" y1=\"110\" x2=\"300\" y2=\"120\" />\n <line x1=\"450\" y1=\"110\" x2=\"520\" y2=\"60\" />\n <line x1=\"750\" y1=\"80\" x2=\"840\" y2=\"130\" />\n <line x1=\"840\" y1=\"130\" x2=\"900\" y2=\"70\" />\n <line x1=\"900\" y1=\"70\" x2=\"750\" y2=\"80\" />\n </g>\n {/* Constellation node points */}\n <g fill=\"var(--kz-accent)\" opacity=\"0.65\">\n <circle cx=\"300\" cy=\"120\" r=\"3.5\" />\n <circle cx=\"380\" cy=\"80\" r=\"5\" className=\"kzl-pulse-slow\" />\n <circle cx=\"450\" cy=\"110\" r=\"3\" />\n <circle cx=\"520\" cy=\"60\" r=\"4.5\" />\n <circle cx=\"750\" cy=\"80\" r=\"4.5\" />\n <circle cx=\"840\" cy=\"130\" r=\"3.5\" />\n <circle cx=\"900\" cy=\"70\" r=\"6\" className=\"kzl-pulse-slow\" />\n </g>\n\n {/* ─── Layered Mountains (with Digital Contours) ─── */}\n {/* Far Peaks */}\n <path d=\"M 150 480 L 420 280 L 680 480 Z\" fill={`url(#${u}-mtn-back)`} stroke=\"var(--kzl-far-line)\" strokeWidth=\"1.5\" />\n <path d=\"M 520 480 L 780 230 L 1050 480 Z\" fill={`url(#${u}-mtn-back)`} stroke=\"var(--kzl-far-line)\" strokeWidth=\"1.5\" />\n\n {/* Mid Peaks */}\n <path d=\"M -50 500 L 220 320 L 500 500 Z\" fill={`url(#${u}-mtn-mid)`} stroke=\"var(--kzl-mid-line)\" strokeWidth=\"1.5\" />\n <path d=\"M 700 500 L 980 300 L 1250 500 Z\" fill={`url(#${u}-mtn-mid)`} stroke=\"var(--kzl-mid-line)\" strokeWidth=\"1.5\" />\n\n {/* Wireframe grids on mountains (Contour lines) */}\n <g stroke=\"var(--kz-accent)\" strokeWidth=\"1.2\" opacity=\"0.18\">\n {/* Mid peak left contours */}\n <line x1=\"30\" y1=\"440\" x2=\"410\" y2=\"440\" />\n <line x1=\"85\" y1=\"400\" x2=\"355\" y2=\"400\" />\n <line x1=\"140\" y1=\"360\" x2=\"300\" y2=\"360\" />\n {/* Mid peak right contours */}\n <line x1=\"770\" y1=\"450\" x2=\"1180\" y2=\"450\" />\n <line x1=\"825\" y1=\"410\" x2=\"1125\" y2=\"410\" />\n <line x1=\"880\" y1=\"370\" x2=\"1070\" y2=\"370\" />\n </g>\n\n {/* Front Peaks */}\n <path d=\"M 100 520 L 360 380 L 620 520 Z\" fill={`url(#${u}-mtn-front)`} stroke=\"var(--kzl-near-line)\" strokeWidth=\"1.8\" />\n <path d=\"M 580 520 L 850 350 L 1100 520 Z\" fill={`url(#${u}-mtn-front)`} stroke=\"var(--kzl-near-line)\" strokeWidth=\"1.8\" />\n\n {phoenix && (\n <>\n {/* ─── Cyber-Phoenix & Dual Glowing Flame Trails ─── */}\n {/* Dual Cascading Flame Trails */}\n {/* Left Purple Flame Trail */}\n <path\n d=\"M 590 340 C 570 370, 610 390, 590 410 C 570 430, 490 440, 510 480 C 530 520, 670 530, 700 560 C 720 580, 750 600, 730 630 C 710 660, 630 670, 650 710 C 660 730, 690 740, 700 760 C 710 780, 670 800, 650 830 C 630 860, 680 890, 690 920 C 695 935, 705 945, 710 1000\"\n fill=\"none\"\n stroke={`url(#${u}-purple-glow)`}\n strokeWidth=\"6\"\n strokeLinecap=\"round\"\n opacity=\"0.6\"\n mask={`url(#${u}-river-fade-mask)`}\n style={{\n filter: \"drop-shadow(0 0 6px rgba(219, 39, 119, 0.4))\",\n }}\n />\n <path\n d=\"M 590 340 C 570 370, 610 390, 590 410 C 570 430, 490 440, 510 480 C 530 520, 670 530, 700 560 C 720 580, 750 600, 730 630 C 710 660, 630 670, 650 710 C 660 730, 690 740, 700 760 C 710 780, 670 800, 650 830 C 630 860, 680 890, 690 920 C 695 935, 705 945, 710 1000\"\n fill=\"none\"\n stroke=\"#db2777\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n opacity=\"0.9\"\n mask={`url(#${u}-river-fade-mask)`}\n style={{\n strokeDasharray: \"25, 20\",\n animation: \"kzl-phoenix-flow-purple 8s linear infinite\",\n pointerEvents: \"none\",\n filter: \"drop-shadow(0 0 3px #db2777)\",\n }}\n />\n\n {/* Right Gold Flame Trail */}\n <path\n d=\"M 610 340 C 590 370, 630 390, 610 410 C 590 430, 510 440, 530 480 C 550 520, 690 530, 720 560 C 740 580, 770 600, 750 630 C 730 660, 650 670, 670 710 C 680 730, 710 740, 720 760 C 730 780, 690 800, 670 830 C 650 860, 700 890, 710 920 C 715 935, 725 945, 730 1000\"\n fill=\"none\"\n stroke={`url(#${u}-gold-glow)`}\n strokeWidth=\"6\"\n strokeLinecap=\"round\"\n opacity=\"0.6\"\n mask={`url(#${u}-river-fade-mask)`}\n style={{\n filter: \"drop-shadow(0 0 6px rgba(251, 191, 36, 0.4))\",\n }}\n />\n <path\n d=\"M 610 340 C 590 370, 630 390, 610 410 C 590 430, 510 440, 530 480 C 550 520, 690 530, 720 560 C 740 580, 770 600, 750 630 C 730 660, 650 670, 670 710 C 680 730, 710 740, 720 760 C 730 780, 690 800, 670 830 C 650 860, 700 890, 710 920 C 715 935, 725 945, 730 1000\"\n fill=\"none\"\n stroke=\"#fbbf24\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n opacity=\"0.9\"\n mask={`url(#${u}-river-fade-mask)`}\n style={{\n strokeDasharray: \"35, 15\",\n animation: \"kzl-phoenix-flow-gold 6s linear infinite\",\n pointerEvents: \"none\",\n filter: \"drop-shadow(0 0 3px #fbbf24)\",\n }}\n />\n\n {/* Hoverable Cyber-Phoenix Soaring in the Valley Center */}\n <g className=\"kzl-cyber-phoenix\" style={{ cursor: \"pointer\", pointerEvents: \"auto\" }}>\n {/* Main Body diamond capsule */}\n <polygon\n points=\"600,310 608,325 600,345 592,325\"\n fill={`url(#${u}-phoenix-body-grad)`}\n stroke=\"var(--kz-border-strong)\"\n strokeWidth=\"1.2\"\n />\n {/* Glowing Phoenix Core */}\n <circle cx=\"600\" cy=\"325\" r=\"3\" fill=\"#ffef5c\" className=\"kzl-phoenix-core\" />\n\n {/* Head */}\n <circle cx=\"600\" cy=\"302\" r=\"6\" fill={`url(#${u}-phoenix-body-grad)`} stroke=\"var(--kz-border-strong)\" strokeWidth=\"1.2\" />\n {/* Visor */}\n <rect x=\"598\" y=\"300\" width=\"4\" height=\"2\" rx=\"0.5\" fill=\"#00f2fe\" />\n {/* Head Crest */}\n <polygon points=\"600,296 603,290 600,293 597,290\" fill=\"#ff3c00\" />\n\n {/* Left Wing (Purple mechanical fire) */}\n <path\n d=\"M 592 322 C 555 310, 520 325, 498 348 C 525 348, 545 338, 568 340 C 582 341, 588 333, 592 322 Z\"\n fill={`url(#${u}-phoenix-purple-grad)`}\n stroke=\"var(--kz-border-strong)\"\n strokeWidth=\"1\"\n className=\"kzl-phoenix-wing-l\"\n style={{ transformOrigin: \"592px 322px\" }}\n />\n\n {/* Right Wing (Gold mechanical fire) */}\n <path\n d=\"M 608 322 C 645 310, 680 325, 702 348 C 675 348, 655 338, 632 340 C 618 341, 612 333, 608 322 Z\"\n fill={`url(#${u}-phoenix-gold-grad)`}\n stroke=\"var(--kz-border-strong)\"\n strokeWidth=\"1\"\n className=\"kzl-phoenix-wing-r\"\n style={{ transformOrigin: \"608px 322px\" }}\n />\n </g>\n\n </>\n )}\n {/* ─── Cyber Trees & Hexagonal Foliage (Nature + Tech) ─── */}\n {/* Left Tree */}\n <g transform=\"translate(180, 360)\">\n {/* Server trunk */}\n <line x1=\"0\" y1=\"120\" x2=\"0\" y2=\"40\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"4\" />\n <rect x=\"-8\" y=\"50\" width=\"16\" height=\"28\" rx=\"2\" fill=\"var(--kz-surface-2)\" stroke=\"var(--kz-border-subtle)\" />\n {/* LED dots on trunk */}\n <circle cx=\"0\" cy=\"58\" r=\"1.5\" fill=\"var(--kz-accent)\" />\n <circle cx=\"0\" cy=\"66\" r=\"1.5\" fill=\"var(--kz-accent)\" opacity=\"0.6\" />\n {/* Hexagonal foliage */}\n <polygon points=\"0,-10 35,10 35,50 0,70 -35,50 -35,10\" fill={`url(#${u}-tree-grad)`} stroke=\"var(--kz-accent)\" strokeWidth=\"1.2\" opacity=\"0.4\" />\n <polygon points=\"0,-5 25,10 25,40 0,55 -25,40 -25,10\" fill={`url(#${u}-tree-grad)`} stroke=\"var(--kz-accent)\" strokeWidth=\"1.2\" opacity=\"0.6\" />\n </g>\n\n {/* Treehouse Tree (Center-Left) */}\n <g transform=\"translate(420, 320)\">\n {/* Trunk */}\n <line x1=\"0\" y1=\"180\" x2=\"0\" y2=\"60\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"5\" />\n <line x1=\"0\" y1=\"110\" x2=\"35\" y2=\"90\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"3.5\" />\n {/* Foliage */}\n <polygon points=\"0,-20 52,10 52,70 0,100 -52,70 -52,10\" fill={`url(#${u}-tree-grad)`} stroke=\"var(--kz-accent)\" strokeWidth=\"1.2\" opacity=\"0.35\" />\n <polygon points=\"0,-10 38,10 38,55 0,75 -38,55 -38,10\" fill={`url(#${u}-tree-grad)`} stroke=\"var(--kz-accent)\" strokeWidth=\"1.2\" opacity=\"0.5\" />\n\n {/* Hexagonal Treehouse */}\n <g transform=\"translate(0, 50)\" style={{ pointerEvents: \"auto\", cursor: \"pointer\" }} className=\"kzl-cyber-treehouse\">\n <polygon points=\"0,-30 26,-15 26,15 0,30 -26,15 -26,-15\" fill=\"var(--kz-surface-3)\" stroke=\"var(--kz-accent)\" strokeWidth=\"1.5\" />\n {/* Window */}\n <circle cx=\"0\" cy=\"0\" r=\"8\" fill=\"var(--kz-surface-1)\" stroke=\"var(--kz-border-strong)\" />\n <circle cx=\"0\" cy=\"0\" r=\"4\" fill=\"var(--kz-accent)\" className=\"kzl-window-glow\" />\n {/* Ladder */}\n <path d=\"M -6 30 L -6 95 M 6 30 L 6 95 M -6 42 L 6 42 M -6 54 L 6 54 M -6 66 L 6 66 M -6 78 L 6 78 M -6 90 L 6 90\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"1.5\" />\n {/* Animated green local data pulses rising from treehouse */}\n <circle cx=\"0\" cy=\"-45\" r=\"3\" fill=\"#10b981\" className=\"kzl-rising-pulse-1\" />\n <circle cx=\"15\" cy=\"-35\" r=\"2\" fill=\"#10b981\" className=\"kzl-rising-pulse-2\" />\n </g>\n </g>\n\n {/* Right Tree */}\n <g transform=\"translate(1000, 340)\">\n <line x1=\"0\" y1=\"160\" x2=\"0\" y2=\"60\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"4\" />\n <polygon points=\"0,-15 42,10 42,60 0,85 -42,60 -42,10\" fill={`url(#${u}-tree-grad)`} stroke=\"var(--kz-accent)\" strokeWidth=\"1.2\" opacity=\"0.4\" />\n <polygon points=\"0,-5 28,10 28,42 0,60 -28,42 -28,10\" fill={`url(#${u}-tree-grad)`} stroke=\"var(--kz-accent)\" strokeWidth=\"1.2\" opacity=\"0.6\" />\n </g>\n\n {/* ─── Cyber Tech Bench (Center-Right) ─── */}\n <g transform=\"translate(740, 480)\">\n {/* Bench support legs */}\n <line x1=\"20\" y1=\"35\" x2=\"20\" y2=\"60\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"4\" />\n <line x1=\"140\" y1=\"35\" x2=\"140\" y2=\"60\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"4\" />\n {/* Bench seat */}\n <rect x=\"0\" y=\"22\" width=\"160\" height=\"12\" rx=\"4\" fill={`url(#${u}-bench-grad)`} stroke=\"var(--kz-border-default)\" strokeWidth=\"1.2\" />\n {/* Bench backrest */}\n <rect x=\"0\" y=\"0\" width=\"160\" height=\"10\" rx=\"3\" fill={`url(#${u}-bench-grad)`} stroke=\"var(--kz-border-default)\" strokeWidth=\"1.2\" transform=\"rotate(-5, 80, 5)\" />\n {/* Backrest brackets */}\n <line x1=\"15\" y1=\"10\" x2=\"15\" y2=\"24\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"3\" />\n <line x1=\"145\" y1=\"10\" x2=\"145\" y2=\"24\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"3\" />\n </g>\n\n {flock && (\n <>\n {/* ─── MASCOT BIRD 4: Cyber Owl (Teal/Indigo - Left Tree) ─── */}\n <g transform=\"translate(180, 275) scale(1.4)\" className=\"kzl-bird-hitbox kzl-mobile-hide\">\n <rect x=\"-20\" y=\"-15\" width=\"40\" height=\"70\" fill=\"transparent\" style={{ cursor: \"pointer\", pointerEvents: \"all\" }} />\n <g className=\"kzl-bird-graphics kzl-owl-bot\">\n {/* Shadow */}\n <ellipse cx=\"0\" cy=\"50\" rx=\"16\" ry=\"4\" fill=\"rgba(0,0,0,0.15)\" />\n {/* Body */}\n <path\n d=\"M -15,10 C -15,-10, 15,-10, 15,10 C 15,30, 10,45, 0,45 C -10,45, -15,30, -15,10 Z\"\n fill={`url(#${u}-owl-grad)`}\n stroke=\"var(--kz-border-strong)\"\n strokeWidth=\"1.2\"\n />\n {/* Belly plate */}\n <path\n d=\"M -8,15 C -8,5, 8,5, 8,15 C 8,28, 5,35, 0,35 C -5,35, -8,28, -8,15 Z\"\n fill=\"#00f2fe\"\n opacity=\"0.35\"\n />\n {/* Eyes */}\n <circle cx=\"-6\" cy=\"2\" r=\"5\" fill=\"var(--kz-surface-0)\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"1\" />\n <circle cx=\"6\" cy=\"2\" r=\"5\" fill=\"var(--kz-surface-0)\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"1\" />\n <circle cx=\"-6\" cy=\"2\" r=\"2\" fill=\"#00ff66\" className=\"kzl-owl-eye\" />\n <circle cx=\"6\" cy=\"2\" r=\"2\" fill=\"#00ff66\" className=\"kzl-owl-eye\" />\n {/* Beak */}\n <polygon points=\"-2,4 2,4 0,10\" fill=\"#fbbf24\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"1\" />\n {/* Horns / Ears */}\n <polygon points=\"-12,-8 -6,-4 -14,2\" fill=\"#7c3aed\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"1\" />\n <polygon points=\"12,-8 6,-4 14,2\" fill=\"#7c3aed\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"1\" />\n </g>\n </g>\n\n {/* ─── MASCOT BIRD 1: Cyber-Sentry Falcon (Orange - Left) ─── */}\n <g transform=\"translate(120, 360) scale(1.65)\" className=\"kzl-bird-hitbox kzl-mobile-hide\">\n <rect x=\"-10\" y=\"0\" width=\"70\" height=\"90\" fill=\"transparent\" style={{ cursor: \"pointer\", pointerEvents: \"all\" }} />\n <g className=\"kzl-bird-graphics kzl-falcon-bot\">\n {/* Shadow */}\n <ellipse cx=\"25\" cy=\"85\" rx=\"30\" ry=\"6\" fill=\"rgba(0,0,0,0.15)\" />\n \n {/* Legs */}\n <line x1=\"16\" y1=\"65\" x2=\"12\" y2=\"85\" stroke=\"#f97316\" strokeWidth=\"3\" strokeLinecap=\"round\" />\n <line x1=\"34\" y1=\"65\" x2=\"38\" y2=\"85\" stroke=\"#f97316\" strokeWidth=\"3\" strokeLinecap=\"round\" />\n {/* Feet claws */}\n <path d=\"M 6 85 L 14 85 M 34 85 L 44 85\" stroke=\"#f97316\" strokeWidth=\"3\" strokeLinecap=\"round\" />\n\n {/* Body */}\n <path\n d=\"M 5 35 C 5 20, 45 20, 45 35 C 45 58, 38 68, 25 68 C 12 68, 5 58, 5 35 Z\"\n fill={`url(#${u}-falcon-grad)`}\n stroke=\"var(--kz-border-strong)\"\n strokeWidth=\"1.5\"\n />\n {/* Belly plate */}\n <path\n d=\"M 12 38 C 12 28, 38 28, 38 38 C 38 52, 32 58, 25 58 C 18 58, 12 52, 12 38 Z\"\n fill=\"#ff9800\"\n opacity=\"0.85\"\n />\n\n {/* Wings */}\n <path\n d=\"M 2 30 C -8 40, -4 60, 10 58 C 5 50, 4 38, 2 30 Z\"\n fill=\"#d84315\"\n stroke=\"var(--kz-border-strong)\"\n strokeWidth=\"1.2\"\n className=\"kzl-wing-left\"\n style={{ transformOrigin: \"2px 30px\" }}\n />\n <path\n d=\"M 48 30 C 58 40, 54 60, 40 58 C 45 50, 46 38, 48 30 Z\"\n fill=\"#d84315\"\n stroke=\"var(--kz-border-strong)\"\n strokeWidth=\"1.2\"\n className=\"kzl-wing-right\"\n style={{ transformOrigin: \"48px 30px\" }}\n />\n\n {/* Tail feathers */}\n <path d=\"M 20 66 L 15 80 L 25 76 L 35 80 L 30 66\" fill=\"#bf360c\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"1\" />\n\n {/* Head */}\n <g className=\"kzl-head-group\" style={{ transformOrigin: \"25px 28px\" }}>\n <circle cx=\"25\" cy=\"22\" r=\"18\" fill={`url(#${u}-falcon-grad)`} stroke=\"var(--kz-border-strong)\" strokeWidth=\"1.5\" />\n \n {/* Beak */}\n <polygon points=\"21,24 29,24 25,36\" fill=\"#ffb300\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"1.2\" />\n\n {/* Visor */}\n <rect x=\"9\" y=\"10\" width=\"32\" height=\"10\" rx=\"3\" fill=\"var(--kz-surface-0)\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"1.2\" />\n {/* Lenses */}\n <circle cx=\"17\" cy=\"15\" r=\"2.5\" fill=\"#00f2fe\" className=\"kzl-falcon-eye\" />\n <circle cx=\"33\" cy=\"15\" r=\"2.5\" fill=\"#00f2fe\" className=\"kzl-falcon-eye\" />\n {/* Wire */}\n <path d=\"M 41 15 C 44 15, 43 25, 41 28\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"1\" fill=\"none\" />\n </g>\n\n {/* Sentry Scan Laser Overlay */}\n <polygon points=\"25,28 -60,180 110,180\" fill={`url(#${u}-holo-grad)`} className=\"kzl-sentry-laser\" opacity=\"0\" style={{ transformOrigin: \"25px 28px\", pointerEvents: \"none\" }} />\n </g>\n </g>\n\n {/* ─── MASCOT BIRD 2: Developer Duck (Pink - Center Bench) ─── */}\n <g transform=\"translate(750, 355) scale(1.75)\" className=\"kzl-bird-hitbox kzl-mobile-hide\">\n <rect x=\"-10\" y=\"5\" width=\"70\" height=\"75\" fill=\"transparent\" style={{ cursor: \"pointer\", pointerEvents: \"all\" }} />\n <g className=\"kzl-bird-graphics kzl-developer-duck\">\n {/* Sitting body */}\n <path\n d=\"M 5 45 C 5 30, 45 30, 45 45 C 45 62, 38 72, 25 72 C 12 72, 5 62, 5 45 Z\"\n fill={`url(#${u}-duck-grad)`}\n stroke=\"var(--kz-border-strong)\"\n strokeWidth=\"1.5\"\n />\n {/* Belly light */}\n <path\n d=\"M 12 48 C 12 40, 38 40, 38 48 C 38 60, 32 64, 25 64 C 18 64, 12 60, 12 48 Z\"\n fill=\"#f472b6\"\n opacity=\"0.85\"\n />\n\n {/* Wings typing */}\n <path\n d=\"M -2 40 C -8 46, -4 55, 10 52\"\n fill=\"none\"\n stroke=\"#db2777\"\n strokeWidth=\"8\"\n strokeLinecap=\"round\"\n className=\"kzl-wing-left-type\"\n />\n <path\n d=\"M 52 40 C 58 46, 54 55, 40 52\"\n fill=\"none\"\n stroke=\"#db2777\"\n strokeWidth=\"8\"\n strokeLinecap=\"round\"\n className=\"kzl-wing-right-type\"\n />\n\n {/* Head */}\n <g className=\"kzl-head-group\" style={{ transformOrigin: \"25px 32px\" }}>\n <circle cx=\"25\" cy=\"24\" r=\"16\" fill={`url(#${u}-duck-grad)`} stroke=\"var(--kz-border-strong)\" strokeWidth=\"1.5\" />\n {/* Duck Beak */}\n <path\n d=\"M 12 24 C 12 20, 22 18, 25 18 C 28 18, 38 20, 38 24 C 38 28, 28 32, 25 32 C 22 32, 12 28, 12 24 Z\"\n fill=\"#fbbf24\"\n stroke=\"var(--kz-border-strong)\"\n strokeWidth=\"1.2\"\n />\n {/* Eyes */}\n <circle cx=\"19\" cy=\"16\" r=\"2\" fill=\"var(--kz-text-primary)\" className=\"kzl-duck-eye\" />\n <circle cx=\"31\" cy=\"16\" r=\"2\" fill=\"var(--kz-text-primary)\" className=\"kzl-duck-eye\" />\n {/* Glasses */}\n <circle cx=\"19\" cy=\"16\" r=\"4.5\" fill=\"none\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"1.2\" />\n <circle cx=\"31\" cy=\"16\" r=\"4.5\" fill=\"none\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"1.2\" />\n <line x1=\"23.5\" y1=\"16\" x2=\"26.5\" y2=\"16\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"1.2\" />\n </g>\n\n {/* Holographic Laptop */}\n <g transform=\"translate(10, 52)\">\n {/* Base */}\n <polygon points=\"-8,16 38,16 30,22 -14,22\" fill=\"var(--kz-surface-3)\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"1\" />\n {/* Hologram screen */}\n <polygon\n points=\"-4,14 34,14 30,-2 -8,-2\"\n fill=\"var(--kz-accent-soft)\"\n stroke=\"var(--kz-accent)\"\n strokeWidth=\"1\"\n opacity=\"0.8\"\n className=\"kzl-laptop-screen\"\n />\n {/* Glowing prompt line */}\n <line x1=\"-2\" y1=\"4\" x2=\"24\" y2=\"4\" stroke=\"var(--kz-accent)\" strokeWidth=\"1.5\" opacity=\"0.9\" />\n <line x1=\"-2\" y1=\"8\" x2=\"16\" y2=\"8\" stroke=\"var(--kz-accent)\" strokeWidth=\"1.5\" opacity=\"0.6\" />\n \n {/* Holographic Projection */}\n <polygon points=\"12,-2 -40,-80 70,-80\" fill={`url(#${u}-holo-grad)`} opacity=\"0\" className=\"kzl-holo-projection\" style={{ pointerEvents: \"none\" }} />\n {/* Tiny code elements inside hologram */}\n <g className=\"kzl-holo-elements\" opacity=\"0\">\n <rect x=\"-10\" y=\"-45\" width=\"22\" height=\"6\" rx=\"2\" fill=\"var(--kz-surface-3)\" stroke=\"#10b981\" strokeWidth=\"0.5\" />\n <rect x=\"18\" y=\"-35\" width=\"18\" height=\"6\" rx=\"2\" fill=\"var(--kz-surface-3)\" stroke=\"#10b981\" strokeWidth=\"0.5\" />\n </g>\n </g>\n </g>\n </g>\n\n {/* ─── MASCOT BIRD 3: High-Neck Flamingo-Bot (Blue - Right) ─── */}\n <g transform=\"translate(1000, 270) scale(1.75)\" className=\"kzl-bird-hitbox kzl-mobile-hide\">\n <rect x=\"-15\" y=\"0\" width=\"65\" height=\"165\" fill=\"transparent\" style={{ cursor: \"pointer\", pointerEvents: \"all\" }} />\n <g className=\"kzl-bird-graphics kzl-flamingo-bot\">\n {/* Shadow */}\n <ellipse cx=\"20\" cy=\"160\" rx=\"22\" ry=\"5\" fill=\"rgba(0,0,0,0.15)\" />\n\n {/* Long legs */}\n <line x1=\"12\" y1=\"105\" x2=\"12\" y2=\"160\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"2.5\" />\n <line x1=\"26\" y1=\"105\" x2=\"28\" y2=\"160\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"2.5\" />\n {/* Joints */}\n <circle cx=\"12\" cy=\"130\" r=\"2.5\" fill=\"#3e76a8\" />\n <circle cx=\"27\" cy=\"130\" r=\"2.5\" fill=\"#3e76a8\" />\n\n {/* Body */}\n <path\n d=\"M 2 80 C 2 68, 38 68, 38 80 C 38 108, 28 112, 20 112 C 12 112, 2 108, 2 80 Z\"\n fill={`url(#${u}-flamingo-grad)`}\n stroke=\"var(--kz-border-strong)\"\n strokeWidth=\"1.5\"\n />\n\n {/* Wing (Vibrant contrast) */}\n <path\n d=\"M 8 82 L 20 74 L 32 82 L 32 94 L 20 102 L 8 94 Z\"\n fill=\"#ec4899\"\n stroke=\"var(--kz-border-strong)\"\n strokeWidth=\"1\"\n opacity=\"0.95\"\n className=\"kzl-flamingo-wing\"\n />\n\n {/* Curved neck */}\n <path\n d=\"M 20 74 C 20 60, -2 40, 8 18\"\n fill=\"none\"\n stroke={`url(#${u}-flamingo-grad)`}\n strokeWidth=\"6\"\n strokeLinecap=\"round\"\n className=\"kzl-flamingo-neck\"\n />\n\n {/* Head */}\n <g className=\"kzl-head-group\" transform=\"translate(8, 12)\" style={{ transformOrigin: \"0px 0px\" }}>\n <circle cx=\"0\" cy=\"0\" r=\"10\" fill={`url(#${u}-flamingo-grad)`} stroke=\"var(--kz-border-strong)\" strokeWidth=\"1.2\" />\n \n {/* Eye */}\n <circle cx=\"-3\" cy=\"-2\" r=\"1.5\" fill=\"var(--kz-surface-0)\" />\n <circle cx=\"-3\" cy=\"-2\" r=\"0.6\" fill=\"#f43f5e\" className=\"kzl-flamingo-eye\" />\n\n {/* Beak */}\n <path d=\"M -8 -2 C -18 2, -16 14, -22 18 C -14 10, -8 4, -8 -2 Z\" fill=\"#fbbf24\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"1\" />\n\n {/* Hat */}\n <path d=\"M -8 -8 L 8 -8 L 6 -14 L -6 -14 Z\" fill=\"var(--kz-surface-3)\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"1.2\" />\n <ellipse cx=\"0\" cy=\"-8\" rx=\"10\" ry=\"1.5\" fill=\"var(--kz-surface-3)\" stroke=\"var(--kz-border-strong)\" strokeWidth=\"1\" />\n </g>\n </g>\n </g>\n\n </>\n )}\n {/* ─── Floating Glowing Tech Particles ─── */}\n <circle cx=\"340\" cy=\"300\" r=\"6\" fill=\"#00f2fe\" opacity=\"0.75\" className=\"kzl-float-particle-1\" />\n <circle cx=\"520\" cy=\"220\" r=\"5\" fill=\"#a855f7\" opacity=\"0.65\" className=\"kzl-float-particle-2\" />\n <circle cx=\"710\" cy=\"310\" r=\"6.5\" fill=\"#3e76a8\" opacity=\"0.7\" className=\"kzl-float-particle-3\" />\n <circle cx=\"920\" cy=\"250\" r=\"5\" fill=\"#00f2fe\" opacity=\"0.8\" className=\"kzl-float-particle-4\" />\n </g>\n </svg>\n {fade && <div className=\"kzl-fade\" />}\n </div>\n );\n}\n"
|
|
135
135
|
},
|
|
136
136
|
{
|
|
137
137
|
"path": "landscape/meta.ts",
|
package/registry/link-card.json
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
"name": "link-card",
|
|
3
3
|
"type": "primitive",
|
|
4
4
|
"title": "Link card",
|
|
5
|
-
"summary": "An entry point where the whole card is one link: an icon tile, a title, one sentence and the way in — compact, the same on every page
|
|
6
|
-
"description": "An entry point where the whole card is one link: an icon tile, a title, one sentence and the way in — compact, the same on every page
|
|
5
|
+
"summary": "An entry point where the whole card is one link: an icon tile, a title, one sentence and the way in — compact, the same on every page; under the pointer its surface and hairline go one step up, nothing moves.",
|
|
6
|
+
"description": "An entry point where the whole card is one link: an icon tile, a title, one sentence and the way in — compact, the same on every page; under the pointer its surface and hairline go one step up, nothing moves.",
|
|
7
7
|
"status": "beta",
|
|
8
8
|
"deprecated": null,
|
|
9
9
|
"category": "blocks",
|
|
@@ -41,21 +41,20 @@
|
|
|
41
41
|
"Use the product's mark or a signature icon as `icon`, never a placeholder.",
|
|
42
42
|
"Pass the app's router link as `linkAs` (Next's `Link`) so internal links prefetch.",
|
|
43
43
|
"In a row of cards at one height (`CardGrid`), the facts (`extra`) and the way in (`cta`) are pinned to the foot of each card, so they share a line whatever the length of the sentences; `footerAlign=\"top\"` keeps them under the text.",
|
|
44
|
-
"In a hub, keep the default `h3` titles under the section's `h2`; in a list of links, `titleAs=\"span\"`."
|
|
45
|
-
"`hover=\"quiet\"` on a page of reading (a docs hub, a blog's index): no glow, a 2 px lift and a ring on focus, where the default `light` lights the card under the pointer. Set it on `CardGrid` to quiet a whole grid."
|
|
44
|
+
"In a hub, keep the default `h3` titles under the section's `h2`; in a list of links, `titleAs=\"span\"`."
|
|
46
45
|
],
|
|
47
46
|
"accessibility": {
|
|
48
47
|
"keyboard": [
|
|
49
48
|
{
|
|
50
49
|
"keys": "Tab",
|
|
51
|
-
"action": "Focuses the card
|
|
50
|
+
"action": "Focuses the card: a 2 px ring of `--kz-ring` around it."
|
|
52
51
|
}
|
|
53
52
|
],
|
|
54
53
|
"notes": [
|
|
55
54
|
"The card is a single link: its accessible name is its whole text — keep it short.",
|
|
56
55
|
"An absolute address opens in a new tab with `rel=\"noopener noreferrer\"` and the external mark.",
|
|
57
|
-
"The icon and the arrow are decorative; the
|
|
58
|
-
"The
|
|
56
|
+
"The icon and the arrow are decorative; the arrow's lean stops under `prefers-reduced-motion`.",
|
|
57
|
+
"The hover keeps the same text contrast in dark and light: it moves the surface and the hairline one step, never the text below AA. `hover` is deprecated since 3.31 (krizaka-ui#393): there is one hover."
|
|
59
58
|
]
|
|
60
59
|
},
|
|
61
60
|
"related": [
|
|
@@ -74,7 +73,7 @@
|
|
|
74
73
|
},
|
|
75
74
|
{
|
|
76
75
|
"component": "LinkCard",
|
|
77
|
-
"description": "An entry point: the whole card is one link — icon, title, sentence, the way in.
|
|
76
|
+
"description": "An entry point: the whole card is one link — icon, title, sentence, the way in. Its surface and hairline go one step up under the pointer; nothing moves.",
|
|
78
77
|
"props": [
|
|
79
78
|
{
|
|
80
79
|
"name": "href",
|
|
@@ -122,7 +121,7 @@
|
|
|
122
121
|
"name": "hover",
|
|
123
122
|
"type": "CardHover",
|
|
124
123
|
"default": null,
|
|
125
|
-
"description": "
|
|
124
|
+
"description": "@deprecated Since 3.31 (krizaka-ui#393): does nothing — every card has the one quiet hover. Removed in 4.0.",
|
|
126
125
|
"required": false
|
|
127
126
|
},
|
|
128
127
|
{
|
|
@@ -188,21 +187,13 @@
|
|
|
188
187
|
"module": "@krizaka/ui/registry/examples/link-card/external",
|
|
189
188
|
"code": "import { ProductLogo } from \"@krizaka/ui\";\nimport { LinkCard } from \"@krizaka/ui/link-card\";\n\n// An absolute address opens in a new tab and wears the external mark instead of the arrow.\nexport default function LinkCardExternal() {\n return (\n <LinkCard\n className=\"max-w-sm\"\n href=\"https://github.com/krizaka/krizaka-ui\"\n icon={<ProductLogo id=\"krizaka\" size={24} animated={false} />}\n title=\"krizaka-ui on GitHub\"\n description=\"The sources, the issues, the discussions.\"\n cta=\"Open the repository\"\n />\n );\n}\n"
|
|
190
189
|
},
|
|
191
|
-
{
|
|
192
|
-
"name": "hover-light",
|
|
193
|
-
"title": "The light hover",
|
|
194
|
-
"description": "`hover=\"light\"`, the default: the pointer's light and the coloured lift, said explicitly.",
|
|
195
|
-
"path": "examples/link-card/hover-light.tsx",
|
|
196
|
-
"module": "@krizaka/ui/registry/examples/link-card/hover-light",
|
|
197
|
-
"code": "import { ProductLogo } from \"@krizaka/ui\";\nimport { CardGrid } from \"@krizaka/ui/card-grid\";\nimport { LinkCard } from \"@krizaka/ui/link-card\";\n\nconst shortcuts = [\n { id: \"cli\", logo: \"orazaka\", title: \"The CLI\", text: \"npx orazaka install, start, dev — then every command and option.\" },\n { id: \"packs\", logo: \"orazaka\", title: \"Packs & Studios\", text: \"The business offers Orazaka installs without code.\" },\n { id: \"admin\", logo: \"orochia\", title: \"Orochia admin console\", text: \"Verification, moderation, payouts — behind four gates.\" },\n] as const;\n\n// The default hover, said explicitly: the pointer's light and the coloured lift.\nexport default function LinkCardHoverLight() {\n return (\n <CardGrid className=\"w-full max-w-4xl\" min={260} reveal={false}>\n {shortcuts.map((s) => (\n <LinkCard key={s.id} hover=\"light\" href={`#${s.id}`} icon={<ProductLogo id={s.logo} size={24} animated={false} />} title={s.title} description={s.text} cta=\"Open\" />\n ))}\n </CardGrid>\n );\n}\n"
|
|
198
|
-
},
|
|
199
190
|
{
|
|
200
191
|
"name": "hover-quiet",
|
|
201
|
-
"title": "The
|
|
202
|
-
"description": "
|
|
192
|
+
"title": "The hover",
|
|
193
|
+
"description": "One step of surface and border under the pointer, a ring on focus; nothing moves, no light.",
|
|
203
194
|
"path": "examples/link-card/hover-quiet.tsx",
|
|
204
195
|
"module": "@krizaka/ui/registry/examples/link-card/hover-quiet",
|
|
205
|
-
"code": "import { ProductLogo } from \"@krizaka/ui\";\nimport { CardGrid } from \"@krizaka/ui/card-grid\";\nimport { LinkCard } from \"@krizaka/ui/link-card\";\n\nconst shortcuts = [\n { id: \"cli\", logo: \"orazaka\", title: \"The CLI\", text: \"npx orazaka install, start, dev — then every command and option.\" },\n { id: \"packs\", logo: \"orazaka\", title: \"Packs & Studios\", text: \"The business offers Orazaka installs without code.\" },\n { id: \"admin\", logo: \"orochia\", title: \"Orochia admin console\", text: \"Verification, moderation, payouts — behind four gates.\" },\n] as const;\n\n// The quiet hover on a card: no glow, a 2 px lift, one step of surface and border, a ring on focus.\nexport default function LinkCardHoverQuiet() {\n return (\n <CardGrid className=\"w-full max-w-4xl\" min={260} reveal={false}>\n {shortcuts.map((s) => (\n <LinkCard key={s.id}
|
|
196
|
+
"code": "import { ProductLogo } from \"@krizaka/ui\";\nimport { CardGrid } from \"@krizaka/ui/card-grid\";\nimport { LinkCard } from \"@krizaka/ui/link-card\";\n\nconst shortcuts = [\n { id: \"cli\", logo: \"orazaka\", title: \"The CLI\", text: \"npx orazaka install, start, dev — then every command and option.\" },\n { id: \"packs\", logo: \"orazaka\", title: \"Packs & Studios\", text: \"The business offers Orazaka installs without code.\" },\n { id: \"admin\", logo: \"orochia\", title: \"Orochia admin console\", text: \"Verification, moderation, payouts — behind four gates.\" },\n] as const;\n\n// The quiet hover on a card: no glow, a 2 px lift, one step of surface and border, a ring on focus.\nexport default function LinkCardHoverQuiet() {\n return (\n <CardGrid className=\"w-full max-w-4xl\" min={260} reveal={false}>\n {shortcuts.map((s) => (\n <LinkCard key={s.id} href={`#${s.id}`} icon={<ProductLogo id={s.logo} size={24} animated={false} />} title={s.title} description={s.text} cta=\"Open\" />\n ))}\n </CardGrid>\n );\n}\n"
|
|
206
197
|
}
|
|
207
198
|
]
|
|
208
199
|
},
|
|
@@ -222,11 +213,11 @@
|
|
|
222
213
|
},
|
|
223
214
|
{
|
|
224
215
|
"path": "link-card/link-card.tsx",
|
|
225
|
-
"content": "// Server-safe. A card that leads somewhere (blocks.css): the whole card is the link — an icon, a title, one sentence,\n// the way in. Compact, one look for every entry point of a page (a documentation hub, the products, the next step).\nimport type * as React from \"react\";\n\nimport { BlockLink, isExternal, type LinkComponent } from \"../block-link\";\nimport { cn } from \"../cn\";\nimport { ArrowGlyph, ExternalGlyph } from \"../glyphs\";\n\nexport type LinkCardProps = Omit<React.ComponentProps<\"a\">, \"title\" | \"href\"> & {\n /** Where the card leads. An absolute URL opens in a new tab, with the external mark. */\n href: string;\n /** The title: the name of the destination. */\n title: React.ReactNode;\n /** One sentence: what the reader finds there. */\n description?: React.ReactNode;\n /** The icon tile on the left (a product mark, a signature icon): decorative, the title names the link. */\n icon?: React.ReactNode;\n /** A short mono line above the title (a category, a version). */\n meta?: React.ReactNode;\n /** The way in, under the text, with an arrow: `Open`, `Read the guide`. */\n cta?: React.ReactNode;\n /** Under the text, before the way in: facts (`Facts`), badges. Never another link — the card is one. */\n extra?: React.ReactNode;\n /**\n * The title's element: a heading when the cards are the content of a section (a hub), `span` inside a list of links.\n * @default \"h3\"\n */\n titleAs?: \"h2\" | \"h3\" | \"h4\" | \"span\";\n /**\n * `row`: the icon beside the text (compact, the default); `stack`: the icon above it.\n * @default \"row\"\n */\n layout?: \"row\" | \"stack\";\n /**\n * Where the facts (`extra`) and the way in (`cta`) sit when the card is taller than its text — a row of cards at one\n * height: `bottom` pins them to the card's foot, so they share a line across the row; `top` leaves them under the text.\n * @default \"bottom\"\n */\n footerAlign?: \"bottom\" | \"top\";\n /** The app's link component for internal addresses (Next's `Link`); an `<a>` otherwise. */\n linkAs?: LinkComponent;\n
|
|
216
|
+
"content": "// Server-safe. A card that leads somewhere (blocks.css): the whole card is the link — an icon, a title, one sentence,\n// the way in. Compact, one look for every entry point of a page (a documentation hub, the products, the next step).\nimport type * as React from \"react\";\n\nimport { BlockLink, isExternal, type LinkComponent } from \"../block-link\";\nimport { cn } from \"../cn\";\nimport { ArrowGlyph, ExternalGlyph } from \"../glyphs\";\n\nexport type LinkCardProps = Omit<React.ComponentProps<\"a\">, \"title\" | \"href\"> & {\n /** Where the card leads. An absolute URL opens in a new tab, with the external mark. */\n href: string;\n /** The title: the name of the destination. */\n title: React.ReactNode;\n /** One sentence: what the reader finds there. */\n description?: React.ReactNode;\n /** The icon tile on the left (a product mark, a signature icon): decorative, the title names the link. */\n icon?: React.ReactNode;\n /** A short mono line above the title (a category, a version). */\n meta?: React.ReactNode;\n /** The way in, under the text, with an arrow: `Open`, `Read the guide`. */\n cta?: React.ReactNode;\n /** Under the text, before the way in: facts (`Facts`), badges. Never another link — the card is one. */\n extra?: React.ReactNode;\n /**\n * The title's element: a heading when the cards are the content of a section (a hub), `span` inside a list of links.\n * @default \"h3\"\n */\n titleAs?: \"h2\" | \"h3\" | \"h4\" | \"span\";\n /**\n * `row`: the icon beside the text (compact, the default); `stack`: the icon above it.\n * @default \"row\"\n */\n layout?: \"row\" | \"stack\";\n /**\n * Where the facts (`extra`) and the way in (`cta`) sit when the card is taller than its text — a row of cards at one\n * height: `bottom` pins them to the card's foot, so they share a line across the row; `top` leaves them under the text.\n * @default \"bottom\"\n */\n footerAlign?: \"bottom\" | \"top\";\n /** The app's link component for internal addresses (Next's `Link`); an `<a>` otherwise. */\n linkAs?: LinkComponent;\n /** @deprecated Since 3.31 (krizaka-ui#393): does nothing — every card has the one quiet hover. Removed in 4.0. */\n hover?: CardHover;\n};\n\n/** @deprecated Since 3.31 (krizaka-ui#393): a card has one quiet hover; the values are accepted and ignored. */\nexport type CardHover = \"light\" | \"quiet\";\n\n/** @deprecated Since 3.31 (krizaka-ui#393): there is one hover, so no class says it. Always `undefined`. */\nexport function cardHoverClass(_hover?: CardHover): string | undefined {\n return undefined;\n}\n\n/** An entry point: the whole card is one link — icon, title, sentence, the way in. Its surface and hairline go one step up under the pointer; nothing moves. */\nexport function LinkCard({ href, title, description, icon, meta, cta, extra, titleAs: Title = \"h3\", layout = \"row\", footerAlign = \"bottom\", linkAs, hover, className, ...props }: LinkCardProps) {\n const external = isExternal(href);\n return (\n <BlockLink\n href={href}\n linkAs={linkAs}\n external={external}\n className={cn(\"kz-block-card kz-link-card\", cardHoverClass(hover), className)}\n data-layout={layout === \"row\" ? undefined : layout}\n data-footer={footerAlign === \"top\" ? \"top\" : undefined}\n {...props}\n >\n {icon && (\n <span className=\"kz-block-icon\" aria-hidden>\n {icon}\n </span>\n )}\n <div className=\"kz-link-card-body\">\n {meta && <p className=\"kz-link-card-meta\">{meta}</p>}\n <Title className=\"kz-link-card-title\">{title}</Title>\n {description && <p className=\"kz-link-card-text\">{description}</p>}\n {(extra || cta || external) && (\n <div className=\"kz-link-card-foot\">\n {extra && <div className=\"kz-link-card-extra\">{extra}</div>}\n {(cta || external) && (\n <span className=\"kz-link-card-cta\">\n {cta}\n {external ? <ExternalGlyph className=\"h-3.5 w-3.5\" /> : <ArrowGlyph className=\"h-3.5 w-3.5\" />}\n </span>\n )}\n </div>\n )}\n </div>\n </BlockLink>\n );\n}\n"
|
|
226
217
|
},
|
|
227
218
|
{
|
|
228
219
|
"path": "link-card/meta.ts",
|
|
229
|
-
"content": "import type { ComponentMeta } from \"../meta\";\n\nexport const meta = {\n title: \"Link card\",\n summary:\n \"An entry point where the whole card is one link: an icon tile, a title, one sentence and the way in — compact, the same on every page
|
|
220
|
+
"content": "import type { ComponentMeta } from \"../meta\";\n\nexport const meta = {\n title: \"Link card\",\n summary:\n \"An entry point where the whole card is one link: an icon tile, a title, one sentence and the way in — compact, the same on every page; under the pointer its surface and hairline go one step up, nothing moves.\",\n status: \"beta\",\n category: \"blocks\",\n platforms: \"web\",\n parity: { native: { status: \"n/a\", reason: \"A block of a public site's page; an app screen on a phone is built from Screen, Header and Card.\", use: \"card\" }, desktop: { status: \"n/a\", reason: \"A public site's page, not a window of the Mac app.\" } },\n whenToUse: [\n \"The entry points of a hub: a documentation's sections, the products, the next steps of a guide.\",\n \"Any link that deserves more than its words: what the reader finds there, in one sentence.\",\n ],\n whenNotToUse: [\n { when: \"When the card holds several actions: a card that is a link holds no other link.\", use: \"argument-card\" },\n { when: \"For a link inside a sentence or a list of plain links.\", use: \"chip-link\" },\n ],\n bestPractices: [\n \"One sentence of description; the title names the destination, the way in (`cta`) says the action.\",\n \"Use the product's mark or a signature icon as `icon`, never a placeholder.\",\n \"Pass the app's router link as `linkAs` (Next's `Link`) so internal links prefetch.\",\n \"In a row of cards at one height (`CardGrid`), the facts (`extra`) and the way in (`cta`) are pinned to the foot of each card, so they share a line whatever the length of the sentences; `footerAlign=\\\"top\\\"` keeps them under the text.\",\n \"In a hub, keep the default `h3` titles under the section's `h2`; in a list of links, `titleAs=\\\"span\\\"`.\",\n ],\n accessibility: {\n keyboard: [{ keys: \"Tab\", action: \"Focuses the card: a 2 px ring of `--kz-ring` around it.\" }],\n notes: [\n \"The card is a single link: its accessible name is its whole text — keep it short.\",\n \"An absolute address opens in a new tab with `rel=\\\"noopener noreferrer\\\"` and the external mark.\",\n \"The icon and the arrow are decorative; the arrow's lean stops under `prefers-reduced-motion`.\",\n \"The hover keeps the same text contrast in dark and light: it moves the surface and the hairline one step, never the text below AA. `hover` is deprecated since 3.31 (krizaka-ui#393): there is one hover.\",\n ],\n },\n related: [\"card-grid\", \"glow-card\", \"chip-link\"],\n web: {\n imports: [\"LinkCard\"],\n examples: [\n { name: \"docs-hub\", title: \"A documentation hub\", description: \"Three compact cards in a grid: a mark, a title, a sentence, `Open`.\" },\n { name: \"stack\", title: \"Stacked, with facts\", description: \"`layout=\\\"stack\\\"`, a category above the title and facts under the text.\" },\n { name: \"external\", title: \"An external link\", description: \"An absolute address: a new tab and the external mark.\" },\n { name: \"hover-quiet\", title: \"The hover\", description: \"One step of surface and border under the pointer, a ring on focus; nothing moves, no light.\" },\n ],\n },\n} satisfies ComponentMeta;\n"
|
|
230
221
|
},
|
|
231
222
|
{
|
|
232
223
|
"path": "meta.ts",
|
|
@@ -249,7 +240,7 @@
|
|
|
249
240
|
},
|
|
250
241
|
{
|
|
251
242
|
"component": "LinkCard",
|
|
252
|
-
"description": "An entry point: the whole card is one link — icon, title, sentence, the way in.
|
|
243
|
+
"description": "An entry point: the whole card is one link — icon, title, sentence, the way in. Its surface and hairline go one step up under the pointer; nothing moves.",
|
|
253
244
|
"props": [
|
|
254
245
|
{
|
|
255
246
|
"name": "href",
|
|
@@ -297,7 +288,7 @@
|
|
|
297
288
|
"name": "hover",
|
|
298
289
|
"type": "CardHover",
|
|
299
290
|
"default": null,
|
|
300
|
-
"description": "
|
|
291
|
+
"description": "@deprecated Since 3.31 (krizaka-ui#393): does nothing — every card has the one quiet hover. Removed in 4.0.",
|
|
301
292
|
"required": false
|
|
302
293
|
},
|
|
303
294
|
{
|