@krizaka/ui 3.38.0 → 3.40.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/dist/bird-plate.js +1 -1
- package/dist/blocks.css +72 -6
- package/dist/chip-link.js +1 -1
- package/dist/chip-row.js +1 -1
- package/dist/{chunk-IANSFIVC.js → chunk-7JFHTPI3.js} +13 -3
- package/dist/chunk-7JFHTPI3.js.map +1 -0
- package/dist/{chunk-RE5WJ4QP.js → chunk-ADRUEPYC.js} +4 -4
- package/dist/chunk-ADRUEPYC.js.map +1 -0
- package/dist/{chunk-BCVLLY3R.js → chunk-EZC54B5C.js} +89 -22
- package/dist/chunk-EZC54B5C.js.map +1 -0
- package/dist/{chunk-BTTDIVVJ.js → chunk-F2UZ2WWL.js} +2 -2
- package/dist/chunk-F2UZ2WWL.js.map +1 -0
- package/dist/{chunk-JFJECOZ2.js → chunk-M4DBVG43.js} +87 -22
- package/dist/chunk-M4DBVG43.js.map +1 -0
- package/dist/flock.d.ts +40 -0
- package/dist/flock.js +198 -0
- package/dist/flock.js.map +1 -0
- package/dist/image-cropper.js +1 -1
- package/dist/kanban.js +1 -1
- package/dist/kanban.js.map +1 -1
- package/dist/map.js +2 -2
- package/dist/map.js.map +1 -1
- package/dist/mascot-quote.js +1 -1
- package/dist/mascot-state.js +1 -1
- package/dist/mascots.d.ts +32 -2
- package/dist/mascots.js +3 -1
- package/dist/mascots.js.map +1 -1
- package/dist/motion.css +1 -1
- package/dist/native/vertical-video.js +1 -1
- package/dist/native/vertical-video.js.map +1 -1
- package/dist/native.d.ts +1 -1
- package/dist/native.js +11 -11
- package/dist/native.js.map +1 -1
- package/dist/nav-bar.d.ts +1 -1
- package/dist/nav-bar.js +1 -1
- package/dist/photo-grid.js +1 -1
- package/dist/photo-grid.js.map +1 -1
- package/dist/site-footer.d.ts +5 -17
- package/dist/site-footer.js +33 -29
- package/dist/site-footer.js.map +1 -1
- package/dist/{sites-B4sYlfPQ.d.ts → sites-inztN_Bv.d.ts} +8 -0
- package/dist/sites.d.ts +11 -1
- package/dist/sites.js +12 -2
- package/dist/sites.js.map +1 -1
- package/dist/slider.js +3 -3
- package/dist/slider.js.map +1 -1
- package/dist/step-showcase.js +1 -1
- package/dist/step-showcase.js.map +1 -1
- package/dist/story.css +3 -3
- package/dist/video-player.js +1 -1
- package/dist/video-trimmer.js +1 -1
- package/dist/video-trimmer.js.map +1 -1
- package/package.json +24 -10
- package/registry/account-menu.json +1 -1
- package/registry/achievement.json +1 -1
- package/registry/action-bar.json +4 -4
- package/registry/activity-feed.json +1 -1
- package/registry/alert.json +1 -1
- package/registry/anatomy-plate.json +1 -1
- package/registry/app-header.json +1 -1
- package/registry/app-shell.json +1 -1
- package/registry/argument-card.json +3 -3
- package/registry/audio-player.json +1 -1
- package/registry/auth-layout.json +1 -1
- package/registry/avatar.json +1 -1
- package/registry/badge.json +1 -1
- package/registry/bird-plate.json +1 -1
- package/registry/button.json +1 -1
- package/registry/captcha.json +1 -1
- package/registry/card-grid.json +1 -1
- package/registry/card.json +1 -1
- package/registry/catalogue-page.json +1 -1
- package/registry/changelog-page.json +1 -1
- package/registry/chat.json +1 -1
- package/registry/checkbox.json +1 -1
- package/registry/chip-link.json +2 -2
- package/registry/chip-row.json +1 -1
- package/registry/chip.json +1 -1
- package/registry/choice-grid.json +1 -1
- package/registry/code-block.json +1 -1
- package/registry/combobox.json +1 -1
- package/registry/command.json +1 -1
- package/registry/comparison-table.json +1 -1
- package/registry/component-page.json +1 -1
- package/registry/confirm-button.json +1 -1
- package/registry/contact-page.json +3 -3
- package/registry/continue-prompt.json +1 -1
- package/registry/countdown.json +1 -1
- package/registry/cover-hero.json +1 -1
- package/registry/cta-panel.json +3 -3
- package/registry/dashboard-layout.json +1 -1
- package/registry/data-table.json +1 -1
- package/registry/date-picker.json +1 -1
- package/registry/decision-list.json +1 -1
- package/registry/description-list.json +1 -1
- package/registry/detail-layout.json +1 -1
- package/registry/dialog.json +1 -1
- package/registry/docs-article-page.json +1 -1
- package/registry/docs-hub-page.json +1 -1
- package/registry/docs-layout.json +1 -1
- package/registry/docs-nav.json +1 -1
- package/registry/document-viewer.json +1 -1
- package/registry/dropdown-menu.json +1 -1
- package/registry/empty-state.json +1 -1
- package/registry/engine-flow.json +1 -1
- package/registry/error-page.json +1 -1
- package/registry/examples/action-bar/buttons.js +2 -2
- package/registry/examples/action-bar/buttons.tsx +2 -2
- package/registry/examples/action-bar/icons.js +1 -1
- package/registry/examples/action-bar/icons.tsx +1 -1
- package/registry/examples/argument-card/building-block.js +1 -1
- package/registry/examples/argument-card/building-block.tsx +1 -1
- package/registry/examples/contact-page/team.js +1 -1
- package/registry/examples/contact-page/team.tsx +1 -1
- package/registry/examples/cta-panel/discuss.js +2 -2
- package/registry/examples/cta-panel/discuss.tsx +2 -2
- package/registry/examples/flock/pair.d.ts +4 -0
- package/registry/examples/flock/pair.js +22 -0
- package/registry/examples/flock/pair.tsx +16 -0
- package/registry/examples/flock/ridge.d.ts +4 -0
- package/registry/examples/flock/ridge.js +24 -0
- package/registry/examples/flock/ridge.tsx +19 -0
- package/registry/examples/search-field/global.js +13 -10
- package/registry/examples/search-field/global.tsx +11 -7
- package/registry/examples/site-footer/company.js +0 -4
- package/registry/examples/site-footer/company.tsx +3 -7
- package/registry/field.json +1 -1
- package/registry/file-upload.json +1 -1
- package/registry/filter-bar.json +1 -1
- package/registry/flock.json +226 -0
- package/registry/footnote.json +1 -1
- package/registry/force-update-screen.json +1 -1
- package/registry/form.json +1 -1
- package/registry/gallery-page.json +1 -1
- package/registry/genui.json +1 -1
- package/registry/glow-card.json +1 -1
- package/registry/goal-gauge.json +1 -1
- package/registry/how-it-works-page.json +1 -1
- package/registry/image-cropper.json +1 -1
- package/registry/index.json +39 -7
- package/registry/iso.json +1 -1
- package/registry/kanban.json +2 -2
- package/registry/kbd.json +1 -1
- package/registry/landing-page.json +1 -1
- package/registry/landscape.json +1 -1
- package/registry/language-switch.json +1 -1
- package/registry/legal-page.json +1 -1
- package/registry/link-card.json +1 -1
- package/registry/list.json +1 -1
- package/registry/loader.json +1 -1
- package/registry/longform-page.json +1 -1
- package/registry/maintenance-screen.json +1 -1
- package/registry/map.json +3 -3
- package/registry/markdown.json +1 -1
- package/registry/marketing-layout.json +1 -1
- package/registry/marquee.json +1 -1
- package/registry/mascot-quote.json +1 -1
- package/registry/mascot-state.json +1 -1
- package/registry/mascots.json +91 -3
- package/registry/match-dialog.json +1 -1
- package/registry/media-capture.json +1 -1
- package/registry/media-gallery.json +1 -1
- package/registry/media-grid.json +1 -1
- package/registry/meta-row.json +1 -1
- package/registry/meter.json +1 -1
- package/registry/nav-bar.json +2 -2
- package/registry/number-ticker.json +1 -1
- package/registry/opening-hours.json +1 -1
- package/registry/page-header.json +1 -1
- package/registry/page-hero.json +1 -1
- package/registry/page-index.json +1 -1
- package/registry/page.json +1 -1
- package/registry/pagination.json +1 -1
- package/registry/photo-grid.json +2 -2
- package/registry/pointer-light.json +1 -1
- package/registry/popover.json +1 -1
- package/registry/pricing-page.json +1 -1
- package/registry/product-page.json +1 -1
- package/registry/profile-card.json +1 -1
- package/registry/progress.json +1 -1
- package/registry/promise-card.json +1 -1
- package/registry/radio-group.json +1 -1
- package/registry/rail-nav.json +2 -2
- package/registry/recipes.json +1 -1
- package/registry/scroll-stage.json +1 -1
- package/registry/search-field.json +3 -3
- package/registry/section-backdrop.json +3 -3
- package/registry/separator.json +1 -1
- package/registry/service-card.json +1 -1
- package/registry/settings-layout.json +1 -1
- package/registry/showcase.json +1 -1
- package/registry/site-footer.json +11 -11
- package/registry/sites.json +3 -3
- package/registry/skeleton.json +1 -1
- package/registry/skip-link.json +1 -1
- package/registry/slider.json +2 -2
- package/registry/slot-picker.json +1 -1
- package/registry/slot.json +1 -1
- package/registry/specimen-tag.json +1 -1
- package/registry/spinner.json +1 -1
- package/registry/split-view.json +1 -1
- package/registry/stage-banner.json +1 -1
- package/registry/stat.json +1 -1
- package/registry/status-page.json +1 -1
- package/registry/step-progress.json +1 -1
- package/registry/step-showcase.json +2 -2
- package/registry/stepper.json +1 -1
- package/registry/sticky-action.json +1 -1
- package/registry/swipe-deck.json +1 -1
- package/registry/switch.json +1 -1
- package/registry/tabs.json +1 -1
- package/registry/tag-input.json +1 -1
- package/registry/tag-selector.json +1 -1
- package/registry/terminal-replay.json +1 -1
- package/registry/theme.json +1 -1
- package/registry/toast.json +1 -1
- package/registry/toc.json +1 -1
- package/registry/tooltip.json +1 -1
- package/registry/tree-view.json +1 -1
- package/registry/update-prompt.json +1 -1
- package/registry/verified-badge.json +1 -1
- package/registry/vertical-video.json +1 -1
- package/registry/video-player.json +1 -1
- package/registry/video-trimmer.json +2 -2
- package/registry/virtual.json +1 -1
- package/registry/waveform.json +1 -1
- package/dist/chunk-BCVLLY3R.js.map +0 -1
- package/dist/chunk-BTTDIVVJ.js.map +0 -1
- package/dist/chunk-IANSFIVC.js.map +0 -1
- package/dist/chunk-JFJECOZ2.js.map +0 -1
- package/dist/chunk-RE5WJ4QP.js.map +0 -1
package/dist/bird-plate.js
CHANGED
package/dist/blocks.css
CHANGED
|
@@ -446,7 +446,7 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
|
|
|
446
446
|
/* ─── DecisionList: one card per decision — what was chosen, large; refused · because · what it costs, side by side ─── */
|
|
447
447
|
.kz-decisions { margin: 0; padding: 0; list-style: none; display: grid; gap: 14px; }
|
|
448
448
|
.kz-decision { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 18px; padding: 20px 22px; border-radius: 0; background: var(--kz-surface-1); border: 1px solid var(--kz-border-default); }
|
|
449
|
-
.kz-decision-n { font-family: var(--kz-font-display); font-size: 28px; font-weight: 400; line-height: 1; letter-spacing: -0.01em; font-variant-numeric: tabular-nums; color: var(--kz-hue-text, var(--kz-accent-text)); }
|
|
449
|
+
.kz-decision-n { font-family: var(--kz-font-display); font-size: 28px; font-weight: 400; line-height: 1; letter-spacing: -0.01em; font-variant-numeric: var(--kz-figures, lining-nums tabular-nums); color: var(--kz-hue-text, var(--kz-accent-text)); }
|
|
450
450
|
.kz-decision-body { display: grid; gap: 14px; min-width: 0; }
|
|
451
451
|
.kz-decision-part p:not(.kz-label) { margin: 6px 0 0; font-size: 14px; line-height: 1.6; color: var(--kz-text-secondary); }
|
|
452
452
|
.kz-decision-part[data-part="chose"] .kz-label { color: var(--kz-success-text); }
|
|
@@ -649,7 +649,7 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
|
|
|
649
649
|
.kz-tpl-band { margin: 0; display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 180px), 1fr)); border-block: 1px solid var(--kz-border-subtle); }
|
|
650
650
|
.kz-tpl-band > div { padding: 20px 18px; border-left: 1px solid var(--kz-border-subtle); }
|
|
651
651
|
.kz-tpl-band > div:first-child { border-left: 0; }
|
|
652
|
-
.kz-tpl-band dt { font-family: var(--kz-font-display); font-size: clamp(1.6rem, 3vw, 2.2rem); font-weight: 400; letter-spacing: -0.01em; color: var(--kz-text-primary); }
|
|
652
|
+
.kz-tpl-band dt { font-variant-numeric: var(--kz-figures, lining-nums tabular-nums); font-family: var(--kz-font-display); font-size: clamp(1.6rem, 3vw, 2.2rem); font-weight: 400; letter-spacing: -0.01em; color: var(--kz-text-primary); }
|
|
653
653
|
.kz-tpl-band dd { margin: 4px 0 0; font-size: 13px; color: var(--kz-text-secondary); }
|
|
654
654
|
@media (max-width: 560px) { .kz-tpl-band > div { border-left: 0; border-top: 1px solid var(--kz-border-subtle); } .kz-tpl-band > div:first-child { border-top: 0; } }
|
|
655
655
|
|
|
@@ -776,7 +776,7 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
|
|
|
776
776
|
/* A long read: chapters with their big numbers, pull quotes in the margin, figures that break out. */
|
|
777
777
|
.kz-tpl-chapters { display: grid; gap: clamp(40px, 7vw, 88px); }
|
|
778
778
|
.kz-tpl-chapter { display: grid; grid-template-columns: minmax(0, 9rem) minmax(0, 42rem) minmax(0, 1fr); gap: 24px 32px; }
|
|
779
|
-
.kz-tpl-chapter-n { font-family: var(--kz-font-display); font-size: clamp(2.4rem, 6vw, 4.2rem); font-weight: 400; line-height: 0.9; letter-spacing: -0.01em;
|
|
779
|
+
.kz-tpl-chapter-n { font-variant-numeric: var(--kz-figures, lining-nums tabular-nums); font-family: var(--kz-font-display); font-size: clamp(2.4rem, 6vw, 4.2rem); font-weight: 400; line-height: 0.9; letter-spacing: -0.01em;
|
|
780
780
|
color: transparent; -webkit-text-stroke: 1.5px var(--kz-hue, var(--kz-accent)); }
|
|
781
781
|
.kz-tpl-chapter h2 { margin: 0 0 14px; font-family: var(--kz-font-display); font-size: clamp(1.5rem, 3vw, 2.1rem); font-weight: 400; letter-spacing: -0.01em; line-height: 1.15;
|
|
782
782
|
color: var(--kz-text-primary); scroll-margin-top: var(--kz-anchor-offset, 96px); }
|
|
@@ -843,7 +843,7 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
|
|
|
843
843
|
|
|
844
844
|
/* An error: the code, huge and drawn in outline, the bird beside it, the ways out under it. */
|
|
845
845
|
.kz-tpl-error { display: grid; justify-items: center; gap: 16px; padding-block: calc(var(--kz-hero-top, 120px) - 16px) clamp(48px, 8vw, 96px); text-align: center; }
|
|
846
|
-
.kz-tpl-error .kz-tpl-error-code { margin: 0; max-width: none; display: flex; align-items: center; gap: 8px; font-family: var(--kz-font-display); font-size: clamp(5rem, 18vw, 10rem); font-weight: 400;
|
|
846
|
+
.kz-tpl-error .kz-tpl-error-code { font-variant-numeric: var(--kz-figures, lining-nums tabular-nums); margin: 0; max-width: none; display: flex; align-items: center; gap: 8px; font-family: var(--kz-font-display); font-size: clamp(5rem, 18vw, 10rem); font-weight: 400;
|
|
847
847
|
line-height: 0.9; letter-spacing: -0.01em; color: transparent; -webkit-text-stroke: 2px var(--kz-hue, var(--kz-accent)); }
|
|
848
848
|
.kz-tpl-error h1 { margin: 0; font-family: var(--kz-font-display); font-size: clamp(1.6rem, 4vw, 2.3rem); font-weight: 400; letter-spacing: -0.01em; color: var(--kz-text-primary); }
|
|
849
849
|
.kz-tpl-error p:not(.kz-tpl-error-code) { margin: 0; max-width: 34rem; font-size: 16px; line-height: 1.65; color: var(--kz-text-secondary); }
|
|
@@ -856,7 +856,7 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
|
|
|
856
856
|
.kz-tpl-plan[data-featured] { border-color: var(--kz-accent); background: linear-gradient(170deg, color-mix(in srgb, var(--kz-accent) 12%, var(--kz-surface-1)), var(--kz-surface-1) 60%);
|
|
857
857
|
box-shadow: var(--kz-shadow-md); }
|
|
858
858
|
.kz-tpl-plan :is(h2, h3) { margin: 0; font-family: var(--kz-font-display); font-size: 18px; font-weight: 400; color: var(--kz-text-primary); }
|
|
859
|
-
.kz-tpl-price { margin: 0; font-family: var(--kz-font-display); font-size: 2.6rem; font-weight: 400; letter-spacing: -0.01em; line-height: 1; color: var(--kz-text-primary); }
|
|
859
|
+
.kz-tpl-price { font-variant-numeric: var(--kz-figures, lining-nums tabular-nums); margin: 0; font-family: var(--kz-font-display); font-size: 2.6rem; font-weight: 400; letter-spacing: -0.01em; line-height: 1; color: var(--kz-text-primary); }
|
|
860
860
|
.kz-tpl-price small { display: block; margin-top: 6px; font-family: var(--kz-font-text, inherit); font-size: 13px; font-weight: 500; letter-spacing: 0; color: var(--kz-text-secondary); }
|
|
861
861
|
.kz-tpl-plan ul { margin: 0; padding: 0; list-style: none; display: grid; gap: 8px; font-size: 14px; color: var(--kz-text-secondary); }
|
|
862
862
|
.kz-tpl-plan ul li { display: grid; grid-template-columns: 18px minmax(0, 1fr); gap: 8px; }
|
|
@@ -1024,7 +1024,7 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
|
|
|
1024
1024
|
.kz-index-entry:focus-visible { outline: var(--kz-ring-width, 2px) solid var(--kz-ring); outline-offset: 2px; }
|
|
1025
1025
|
.kz-index-label { min-width: 0; }
|
|
1026
1026
|
.kz-index-leader { flex: 1; min-width: 12px; border-bottom: 1.5px dotted var(--kz-text-muted); transform: translateY(-4px); }
|
|
1027
|
-
.kz-index-page { font-family: var(--kz-font-mono); font-size: 12.5px; color: var(--kz-text-secondary); font-variant-numeric: tabular-nums; }
|
|
1027
|
+
.kz-index-page { font-family: var(--kz-font-mono); font-size: 12.5px; color: var(--kz-text-secondary); font-variant-numeric: var(--kz-figures, lining-nums tabular-nums); }
|
|
1028
1028
|
.kz-index-entry[aria-current="page"] { color: var(--kz-text-primary); font-weight: 700; }
|
|
1029
1029
|
.kz-index-entry[aria-current="page"]::before { content: "→"; position: absolute; left: -20px; color: var(--kz-paper-rule-margin); font-weight: 400; }
|
|
1030
1030
|
|
|
@@ -1038,3 +1038,69 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
|
|
|
1038
1038
|
.kz-footnotes ol { margin: 0; padding-left: 1.6em; display: grid; gap: 6px; }
|
|
1039
1039
|
.kz-footnotes li::marker { font-family: var(--kz-font-mono); color: var(--kz-paper-rule-margin); }
|
|
1040
1040
|
.kz-fn-back { color: var(--kz-accent-text); text-decoration: none; }
|
|
1041
|
+
|
|
1042
|
+
/* Mascot life — the Flock's birds at ease, in character (Mascot `life`). */
|
|
1043
|
+
/* mascot-life:begin — generated by scripts/gen-mascot-life.mjs from src/mascots/life.ts; do not edit */
|
|
1044
|
+
@keyframes kzb-breathe{0%,100%{transform:scale(1,1)}50%{transform:scale(.996,1.018)}}
|
|
1045
|
+
@keyframes kzb-sway{0%,100%{transform:rotate(-2.5deg)}50%{transform:rotate(2.5deg)}}
|
|
1046
|
+
@keyframes kzb-flap{from{transform:rotate(calc(var(--kzb-s)*-8deg))}to{transform:rotate(calc(var(--kzb-s)*46deg))}}
|
|
1047
|
+
@keyframes kzb-poke{0%{transform:translateY(0)}35%{transform:translateY(-5px)}70%{transform:translateY(0)}85%{transform:translateY(-1px)}100%{transform:translateY(0)}}
|
|
1048
|
+
.kzb-hop,.kzb-look,.kzb-head,.kzb-pupil,.kzb-parcel{transform-box:view-box}
|
|
1049
|
+
.kzb-hop{transform-origin:60px 108px}.kzb-parcel{transform-origin:60px 99px}.kzb-look,.kzb-head{transform-origin:var(--kzb-pivot,60px 52px)}
|
|
1050
|
+
.kzb-wing-l{--kzb-s:1}.kzb-wing-r{--kzb-s:-1}
|
|
1051
|
+
[data-animated][data-life] .kzb-bird{animation:kzb-breathe 4.2s ease-in-out infinite;animation-delay:calc(var(--kzb-ph)*-4.2s)}
|
|
1052
|
+
[data-animated][data-life] .kzb-blink{animation:var(--kzb-lid-a);animation-delay:calc(var(--kzb-ph)*var(--kzb-lid-d))}
|
|
1053
|
+
[data-animated][data-life] .kzb-head{animation:var(--kzb-head-a);animation-delay:calc(var(--kzb-ph)*var(--kzb-head-d))}
|
|
1054
|
+
[data-animated][data-life][data-mood] .kzb-wing{animation:var(--kzb-wing-a);animation-delay:calc(var(--kzb-ph)*var(--kzb-wing-d))}
|
|
1055
|
+
[data-animated][data-life] .kzb-hop{animation:var(--kzb-hop-a,none);animation-delay:calc(var(--kzb-ph)*var(--kzb-hop-d,0s))}
|
|
1056
|
+
[data-animated][data-life] .kzb-parcel{animation:var(--kzb-parcel-a,none);animation-delay:calc(var(--kzb-ph)*-3.2s)}
|
|
1057
|
+
[data-animated][data-life] .kzb-look{transition:transform .5s cubic-bezier(.3,.9,.3,1)}
|
|
1058
|
+
[data-animated][data-life] .kzb-pupil{transition:transform .4s cubic-bezier(.3,.9,.3,1)}
|
|
1059
|
+
[data-animated][data-look="left"] .kzb-look{transform:translateX(-1.5px) rotate(-8deg)}[data-animated][data-look="right"] .kzb-look{transform:translateX(1.5px) rotate(8deg)}[data-animated][data-look="up"] .kzb-look{transform:translateY(-2px) rotate(0)}
|
|
1060
|
+
[data-animated][data-look="left"] .kzb-pupil{transform:translateX(-1.6px)}[data-animated][data-look="right"] .kzb-pupil{transform:translateX(1.6px)}[data-animated][data-look="up"] .kzb-pupil{transform:translateY(-1.8px)}
|
|
1061
|
+
[data-animated][data-life][data-poked] .kzb-hop{animation:kzb-poke .55s ease-out 1}
|
|
1062
|
+
[data-animated][data-life][data-flying] .kzb-wing{animation:kzb-flap .17s ease-in-out infinite alternate;animation-delay:0s}
|
|
1063
|
+
[data-animated][data-life][data-flying] .kzb-bird{animation:none;transform:rotate(calc(var(--kzb-bank,0)*7deg))}
|
|
1064
|
+
[data-animated][data-life][data-flying] :is(.kzb-head,.kzb-hop){animation:none}
|
|
1065
|
+
@media (prefers-reduced-motion:reduce){.kzb-hop,.kzb-head,.kzb-parcel{animation:none!important}}
|
|
1066
|
+
@keyframes kzb-falcon-head{0%,100%{transform:translate(0px,0px) rotate(0deg)}12%,30%{transform:translate(-1px,0px) rotate(-6deg)}38%,56%{transform:translate(1px,0px) rotate(5deg)}64%{transform:translate(0px,0px) rotate(0deg)}78%,88%{transform:translate(0px,-1.6px) rotate(0deg)}}
|
|
1067
|
+
@keyframes kzb-falcon-lid{0%,90%,100%{transform:scaleY(1)}94%{transform:scaleY(.08)}}
|
|
1068
|
+
@keyframes kzb-falcon-flutter{0%,78%,88%,100%{transform:rotate(0)}80.5%{transform:rotate(calc(var(--kzb-s)*9deg))}83%{transform:rotate(calc(var(--kzb-s)*1.8deg))}85.5%{transform:rotate(calc(var(--kzb-s)*8.1deg))}}
|
|
1069
|
+
svg[data-bird="falcon"]{--kzb-pivot:60px 54px;--kzb-head-a:kzb-falcon-head 9s ease-in-out infinite;--kzb-head-d:-9s;--kzb-lid-a:kzb-falcon-lid 7.5s ease-in-out infinite;--kzb-lid-d:-7.5s;--kzb-wing-a:kzb-falcon-flutter 15s ease-out infinite;--kzb-wing-d:-15s}
|
|
1070
|
+
@keyframes kzb-owl-head{0%,100%{transform:translate(0px,0px) rotate(0deg)}18%,36%{transform:translate(-1px,0px) rotate(-10deg)}44%{transform:translate(0px,0px) rotate(0deg)}52%{transform:translate(0px,1.6px) rotate(0deg)}58%{transform:translate(0px,0px) rotate(0deg)}68%,82%{transform:translate(1px,0px) rotate(7deg)}90%{transform:translate(0px,0px) rotate(0deg)}}
|
|
1071
|
+
@keyframes kzb-owl-lid{0%,80%,100%{transform:scaleY(1)}83%{transform:scaleY(.08)}86%{transform:scaleY(1)}89%{transform:scaleY(.08)}93%{transform:scaleY(1)}}
|
|
1072
|
+
@keyframes kzb-owl-flutter{0%,66%,76%,100%{transform:rotate(0)}68.5%{transform:rotate(calc(var(--kzb-s)*10deg))}71%{transform:rotate(calc(var(--kzb-s)*2deg))}73.5%{transform:rotate(calc(var(--kzb-s)*9deg))}}
|
|
1073
|
+
svg[data-bird="owl"]{--kzb-pivot:60px 52px;--kzb-head-a:kzb-owl-head 11s ease-in-out infinite;--kzb-head-d:-11s;--kzb-lid-a:kzb-owl-lid 8s ease-in-out infinite;--kzb-lid-d:-8s;--kzb-wing-a:kzb-owl-flutter 14s ease-out infinite;--kzb-wing-d:-14s}
|
|
1074
|
+
@keyframes kzb-duck-head{0%,48%,100%{transform:translate(0px,0px) rotate(0deg)}51%,59%,67%{transform:translate(0px,2px) rotate(2deg)}55%,63%,71%{transform:translate(0px,0px) rotate(0deg)}}
|
|
1075
|
+
@keyframes kzb-duck-lid{0%,90%,100%{transform:scaleY(1)}94%{transform:scaleY(.08)}}
|
|
1076
|
+
@keyframes kzb-duck-flutter{0%,80%,90%,100%{transform:rotate(0)}82.5%{transform:rotate(calc(var(--kzb-s)*14deg))}85%{transform:rotate(calc(var(--kzb-s)*2.8deg))}87.5%{transform:rotate(calc(var(--kzb-s)*12.6deg))}}
|
|
1077
|
+
@keyframes kzb-duck-leap{0%,86%,100%{transform:translateY(0)}90%{transform:translateY(-7px)}94%{transform:translateY(0)}96.5%{transform:translateY(-2.1px)}98.5%{transform:translateY(0)}}
|
|
1078
|
+
svg[data-bird="duck"]{--kzb-pivot:60px 60px;--kzb-head-a:kzb-duck-head 7s ease-in-out infinite;--kzb-head-d:-7s;--kzb-lid-a:kzb-duck-lid 4.6s ease-in-out infinite;--kzb-lid-d:-4.6s;--kzb-wing-a:kzb-duck-flutter 10s ease-out infinite;--kzb-wing-d:-10s;--kzb-hop-a:kzb-duck-leap 13s ease-out infinite;--kzb-hop-d:-13s}
|
|
1079
|
+
@keyframes kzb-flamingo-head{0%,100%{transform:translate(0px,0px) rotate(0deg)}25%{transform:translate(-1px,0px) rotate(-4deg)}50%{transform:translate(1px,0px) rotate(3deg)}75%{transform:translate(0px,0px) rotate(-2deg)}}
|
|
1080
|
+
@keyframes kzb-flamingo-lid{0%,90%,100%{transform:scaleY(1)}94%{transform:scaleY(.08)}}
|
|
1081
|
+
@keyframes kzb-flamingo-flutter{0%,72%,82%,100%{transform:rotate(0)}74.5%{transform:rotate(calc(var(--kzb-s)*13deg))}77%{transform:rotate(calc(var(--kzb-s)*2.6deg))}79.5%{transform:rotate(calc(var(--kzb-s)*11.7deg))}}
|
|
1082
|
+
svg[data-bird="flamingo"]{--kzb-pivot:58px 60px;--kzb-head-a:kzb-flamingo-head 8s ease-in-out infinite;--kzb-head-d:-8s;--kzb-lid-a:kzb-flamingo-lid 5.6s ease-in-out infinite;--kzb-lid-d:-5.6s;--kzb-wing-a:kzb-flamingo-flutter 11s ease-out infinite;--kzb-wing-d:-11s}
|
|
1083
|
+
@keyframes kzb-pigeon-head{0%,30%,100%{transform:translate(0px,0px) rotate(0deg)}8%{transform:translate(-2.2px,1px) rotate(-1deg)}16%{transform:translate(1.4px,0px) rotate(0deg)}24%{transform:translate(0px,0px) rotate(0deg)}}
|
|
1084
|
+
@keyframes kzb-pigeon-lid{0%,90%,100%{transform:scaleY(1)}94%{transform:scaleY(.08)}}
|
|
1085
|
+
@keyframes kzb-pigeon-flutter{0%,74%,84%,100%{transform:rotate(0)}76.5%{transform:rotate(calc(var(--kzb-s)*18deg))}79%{transform:rotate(calc(var(--kzb-s)*3.6deg))}81.5%{transform:rotate(calc(var(--kzb-s)*16.2deg))}}
|
|
1086
|
+
@keyframes kzb-pigeon-leap{0%,86%,100%{transform:translateY(0)}90%{transform:translateY(-6px)}94%{transform:translateY(0)}96.5%{transform:translateY(-1.8px)}98.5%{transform:translateY(0)}}
|
|
1087
|
+
svg[data-bird="pigeon"]{--kzb-pivot:60px 50px;--kzb-head-a:kzb-pigeon-head 3.1s ease-in-out infinite;--kzb-head-d:-3.1s;--kzb-lid-a:kzb-pigeon-lid 4.2s ease-in-out infinite;--kzb-lid-d:-4.2s;--kzb-wing-a:kzb-pigeon-flutter 9s ease-out infinite;--kzb-wing-d:-9s;--kzb-hop-a:kzb-pigeon-leap 11s ease-out infinite;--kzb-hop-d:-11s;--kzb-parcel-a:kzb-sway 3.2s ease-in-out infinite}
|
|
1088
|
+
@keyframes kzb-lovebird-head{0%,100%{transform:translate(0px,0px) rotate(0deg)}25%{transform:translate(0px,0px) rotate(-5deg)}45%{transform:translate(0px,0px) rotate(-5deg)}60%{transform:translate(0px,0px) rotate(4deg)}80%{transform:translate(0px,0px) rotate(4deg)}}
|
|
1089
|
+
@keyframes kzb-lovebird-lid{0%,90%,100%{transform:scaleY(1)}94%{transform:scaleY(.08)}}
|
|
1090
|
+
@keyframes kzb-lovebird-flutter{0%,70%,80%,100%{transform:rotate(0)}72.5%{transform:rotate(calc(var(--kzb-s)*16deg))}75%{transform:rotate(calc(var(--kzb-s)*3.2deg))}77.5%{transform:rotate(calc(var(--kzb-s)*14.4deg))}}
|
|
1091
|
+
@keyframes kzb-lovebird-leap{0%,86%,100%{transform:translateY(0)}90%{transform:translateY(-6px)}94%{transform:translateY(0)}96.5%{transform:translateY(-1.8px)}98.5%{transform:translateY(0)}}
|
|
1092
|
+
svg[data-bird="lovebird"]{--kzb-pivot:60px 52px;--kzb-head-a:kzb-lovebird-head 10s ease-in-out infinite;--kzb-head-d:-10s;--kzb-lid-a:kzb-lovebird-lid 5.2s ease-in-out infinite;--kzb-lid-d:-5.2s;--kzb-wing-a:kzb-lovebird-flutter 9s ease-out infinite;--kzb-wing-d:-9s;--kzb-hop-a:kzb-lovebird-leap 12s ease-out infinite;--kzb-hop-d:-12s}
|
|
1093
|
+
@keyframes kzb-crane-head{0%,100%{transform:translate(0px,0px) rotate(0deg)}30%,50%{transform:translate(-1px,0px) rotate(-3deg)}}
|
|
1094
|
+
@keyframes kzb-crane-lid{0%,80%,100%{transform:scaleY(1)}83%{transform:scaleY(.08)}86%{transform:scaleY(1)}89%{transform:scaleY(.08)}93%{transform:scaleY(1)}}
|
|
1095
|
+
@keyframes kzb-crane-flutter{0%,70%,80%,100%{transform:rotate(0)}72.5%{transform:rotate(calc(var(--kzb-s)*12deg))}75%{transform:rotate(calc(var(--kzb-s)*2.4deg))}77.5%{transform:rotate(calc(var(--kzb-s)*10.8deg))}}
|
|
1096
|
+
svg[data-bird="crane"]{--kzb-pivot:52px 62px;--kzb-head-a:kzb-crane-head 14s ease-in-out infinite;--kzb-head-d:-14s;--kzb-lid-a:kzb-crane-lid 9s ease-in-out infinite;--kzb-lid-d:-9s;--kzb-wing-a:kzb-crane-flutter 12s ease-out infinite;--kzb-wing-d:-12s}
|
|
1097
|
+
@keyframes kzb-magpie-head{0%,100%{transform:translate(0px,0px) rotate(0deg)}20%{transform:translate(-1px,0px) rotate(-7deg)}30%{transform:translate(1px,0px) rotate(6deg)}42%{transform:translate(0px,0px) rotate(-4deg)}55%{transform:translate(0px,0px) rotate(0deg)}}
|
|
1098
|
+
@keyframes kzb-magpie-lid{0%,90%,100%{transform:scaleY(1)}94%{transform:scaleY(.08)}}
|
|
1099
|
+
@keyframes kzb-magpie-flutter{0%,70%,80%,100%{transform:rotate(0)}72.5%{transform:rotate(calc(var(--kzb-s)*12deg))}75%{transform:rotate(calc(var(--kzb-s)*2.4deg))}77.5%{transform:rotate(calc(var(--kzb-s)*10.8deg))}}
|
|
1100
|
+
@keyframes kzb-magpie-leap{0%,86%,100%{transform:translateY(0)}90%{transform:translateY(-6px)}94%{transform:translateY(0)}96.5%{transform:translateY(-1.8px)}98.5%{transform:translateY(0)}}
|
|
1101
|
+
svg[data-bird="magpie"]{--kzb-pivot:58px 50px;--kzb-head-a:kzb-magpie-head 6s ease-in-out infinite;--kzb-head-d:-6s;--kzb-lid-a:kzb-magpie-lid 5.2s ease-in-out infinite;--kzb-lid-d:-5.2s;--kzb-wing-a:kzb-magpie-flutter 12s ease-out infinite;--kzb-wing-d:-12s;--kzb-hop-a:kzb-magpie-leap 10s ease-out infinite;--kzb-hop-d:-10s}
|
|
1102
|
+
@keyframes kzb-beaver-head{0%,100%{transform:translate(0px,0px) rotate(0deg)}25%{transform:translate(0px,0px) rotate(-5deg)}45%{transform:translate(0px,0px) rotate(-5deg)}60%{transform:translate(0px,0px) rotate(4deg)}80%{transform:translate(0px,0px) rotate(4deg)}}
|
|
1103
|
+
@keyframes kzb-beaver-lid{0%,90%,100%{transform:scaleY(1)}94%{transform:scaleY(.08)}}
|
|
1104
|
+
@keyframes kzb-beaver-flutter{0%,75%,85%,100%{transform:rotate(0)}77.5%{transform:rotate(calc(var(--kzb-s)*8deg))}80%{transform:rotate(calc(var(--kzb-s)*1.6deg))}82.5%{transform:rotate(calc(var(--kzb-s)*7.2deg))}}
|
|
1105
|
+
svg[data-bird="beaver"]{--kzb-pivot:60px 56px;--kzb-head-a:kzb-beaver-head 10s ease-in-out infinite;--kzb-head-d:-10s;--kzb-lid-a:kzb-beaver-lid 5.2s ease-in-out infinite;--kzb-lid-d:-5.2s;--kzb-wing-a:kzb-beaver-flutter 13s ease-out infinite;--kzb-wing-d:-13s}
|
|
1106
|
+
/* mascot-life:end */
|
package/dist/chip-link.js
CHANGED
package/dist/chip-row.js
CHANGED
|
@@ -39,6 +39,11 @@ function siteById(id) {
|
|
|
39
39
|
function sitesByGroup() {
|
|
40
40
|
return siteGroups.map((group) => ({ group, sites: sites.filter((s) => s.group === group) })).filter((g) => g.sites.length > 0);
|
|
41
41
|
}
|
|
42
|
+
var companyLinks = [
|
|
43
|
+
{ id: "story", url: { en: "https://www.krizaka.com/story", fr: "https://www.krizaka.com/fr/story" } },
|
|
44
|
+
{ id: "blog", url: { en: "https://blog.krizaka.com", fr: "https://blog.krizaka.com" } },
|
|
45
|
+
{ id: "contact", url: { en: "https://www.krizaka.com/contact", fr: "https://www.krizaka.com/fr/contact" } }
|
|
46
|
+
];
|
|
42
47
|
var familyLabels = {
|
|
43
48
|
en: {
|
|
44
49
|
family: "Krizaka family",
|
|
@@ -61,7 +66,9 @@ var familyLabels = {
|
|
|
61
66
|
},
|
|
62
67
|
signature: { company: "A Krizaka company", product: "A Krizaka product", "open-source": "A Krizaka open-source project" },
|
|
63
68
|
place: "Made in Montr\xE9al",
|
|
64
|
-
version: "Version"
|
|
69
|
+
version: "Version",
|
|
70
|
+
lang: "en",
|
|
71
|
+
company: { story: "Our story", blog: "Blog", contact: "Contact us" }
|
|
65
72
|
},
|
|
66
73
|
fr: {
|
|
67
74
|
family: "Famille Krizaka",
|
|
@@ -84,7 +91,9 @@ var familyLabels = {
|
|
|
84
91
|
},
|
|
85
92
|
signature: { company: "Une compagnie Krizaka", product: "Un produit Krizaka", "open-source": "Un projet open source de Krizaka" },
|
|
86
93
|
place: "Fait \xE0 Montr\xE9al",
|
|
87
|
-
version: "Version"
|
|
94
|
+
version: "Version",
|
|
95
|
+
lang: "fr",
|
|
96
|
+
company: { story: "Notre histoire", blog: "Blogue", contact: "Nous \xE9crire" }
|
|
88
97
|
}
|
|
89
98
|
};
|
|
90
99
|
|
|
@@ -93,6 +102,7 @@ export {
|
|
|
93
102
|
FamilyMark,
|
|
94
103
|
siteById,
|
|
95
104
|
sitesByGroup,
|
|
105
|
+
companyLinks,
|
|
96
106
|
familyLabels
|
|
97
107
|
};
|
|
98
|
-
//# sourceMappingURL=chunk-
|
|
108
|
+
//# sourceMappingURL=chunk-7JFHTPI3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/family-mark.tsx","../src/sites/sites.ts"],"sourcesContent":["// The mark of a site of the family (`@krizaka/ui/sites`): its brand's `ProductLogo`, still (a list of marks never\n// moves), or GitHub's, in the text colour. Shared by `NavBar.Family` and `SiteFooter` — not an entry of its own.\nimport type * as React from \"react\";\n\nimport { ProductLogo } from \"./marks/ProductLogo\";\nimport type { SiteMark } from \"./sites/sites\";\n\n/** GitHub's mark, in the text colour (both themes). */\nexport function GitHubGlyph({ size = 16, className }: { size?: number; className?: string }) {\n return (\n <svg viewBox=\"0 0 16 16\" width={size} height={size} fill=\"currentColor\" aria-hidden className={className}>\n <path d=\"M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8Z\" />\n </svg>\n );\n}\n\n/** A site's mark, decorative (its name is always written beside it). */\nexport function FamilyMark({ mark, size }: { mark: SiteMark; size: number }): React.ReactElement {\n if (mark === \"github\") return <GitHubGlyph size={Math.round(size * 0.8)} />;\n return <ProductLogo id={mark} size={size} animated={false} />;\n}\n","// Server-safe: plain data. The Krizaka family — every site Krizaka runs, once. The family switcher of the bar\n// (`NavBar.Family`) and the common footer (`SiteFooter`) both read it, so adding a site is one release of this package:\n// every bar and every footer of the family follow.\n//\n// The words of the family (a site's one line, the groups, the statuses, the footer's signature) are brand data, written\n// here in English and French (`familyLabels`) — a site passes the set of its locale, or its own translation.\n\n/** A site of the family. */\nexport type SiteId = \"krizaka\" | \"orazaka\" | \"orochia\" | \"yasakia\" | \"yororis\" | \"yomizaka\" | \"kachizaka\" | \"akinaza\" | \"ui\" | \"java\" | \"motion\" | \"github\";\n\n/** What a site is: the company, a product, or an open-source project. It chooses the footer's signature line. */\nexport type SiteKind = \"company\" | \"product\" | \"open-source\";\n\n/**\n * `released`: open to visit. `upcoming`: announced, not released yet (said \"Coming soon\"). `construction`: under\n * construction — nothing offered (a QA-only app may run; the public page says so). `development`: being built in the\n * open, with a dev site (said \"In development\"). A site with none yet would use its repository as its address.\n */\nexport type SiteStatus = \"released\" | \"upcoming\" | \"construction\" | \"development\";\n\n/** The groups of the family, in reading order: Krizaka · Products · Open source · GitHub. */\nexport type SiteGroup = \"krizaka\" | \"products\" | \"open-source\" | \"github\";\n\n/** The mark a site wears: a brand of `ProductLogo` (Krizaka UI and Krizaka Java wear Krizaka's), or GitHub's. */\nexport type SiteMark = \"krizaka\" | \"orazaka\" | \"orochia\" | \"yasakia\" | \"yororis\" | \"yomizaka\" | \"kachizaka\" | \"akinaza\" | \"github\";\n\nexport interface Site {\n readonly id: SiteId;\n /** The name, never translated. */\n readonly name: string;\n /** The address of the site (its home). */\n readonly url: string;\n /** The address without the scheme, as people say it (`ui.krizaka.com`). */\n readonly host: string;\n readonly kind: SiteKind;\n readonly group: SiteGroup;\n readonly status: SiteStatus;\n readonly mark: SiteMark;\n /** The repository the site is built from. */\n readonly repo: string;\n}\n\nconst site = (s: Omit<Site, \"host\">): Site => ({ ...s, host: s.url.replace(/^https?:\\/\\//, \"\").replace(/\\/$/, \"\") });\n\n/** Every site of the family, in reading order (the group order, then the order inside each group). */\nexport const sites: readonly Site[] = [\n site({ id: \"krizaka\", name: \"Krizaka\", url: \"https://www.krizaka.com\", kind: \"company\", group: \"krizaka\", status: \"released\", mark: \"krizaka\", repo: \"https://github.com/krizaka/krizaka-com\" }),\n site({ id: \"orazaka\", name: \"Orazaka\", url: \"https://dev.orazaka.com\", kind: \"product\", group: \"products\", status: \"released\", mark: \"orazaka\", repo: \"https://github.com/krizaka/orazaka\" }),\n site({ id: \"orochia\", name: \"Orochia\", url: \"https://dev.orochia.com\", kind: \"product\", group: \"products\", status: \"released\", mark: \"orochia\", repo: \"https://github.com/krizaka/orochia\" }),\n site({ id: \"yasakia\", name: \"Yasakia\", url: \"https://dev.yasakia.com\", kind: \"product\", group: \"products\", status: \"development\", mark: \"yasakia\", repo: \"https://github.com/krizaka/yasakia\" }),\n site({ id: \"yororis\", name: \"Yororis\", url: \"https://dev.yororis.com\", kind: \"product\", group: \"products\", status: \"construction\", mark: \"yororis\", repo: \"https://github.com/krizaka/yororis\" }),\n site({ id: \"yomizaka\", name: \"Yomizaka\", url: \"https://dev.yomizaka.com\", kind: \"product\", group: \"products\", status: \"development\", mark: \"yomizaka\", repo: \"https://github.com/krizaka/yomizaka\" }),\n site({ id: \"kachizaka\", name: \"Kachizaka\", url: \"https://dev.kachizaka.com\", kind: \"product\", group: \"products\", status: \"development\", mark: \"kachizaka\", repo: \"https://github.com/krizaka/kachizaka\" }),\n site({ id: \"akinaza\", name: \"Akinaza\", url: \"https://dev.akinaza.com\", kind: \"product\", group: \"products\", status: \"development\", mark: \"akinaza\", repo: \"https://github.com/krizaka/akinaza\" }),\n site({ id: \"ui\", name: \"Krizaka UI\", url: \"https://ui.krizaka.com\", kind: \"open-source\", group: \"open-source\", status: \"released\", mark: \"krizaka\", repo: \"https://github.com/krizaka/krizaka-ui\" }),\n site({ id: \"java\", name: \"Krizaka Java\", url: \"https://java.krizaka.com\", kind: \"open-source\", group: \"open-source\", status: \"released\", mark: \"krizaka\", repo: \"https://github.com/krizaka/krizaka-build\" }),\n // The motion lab: built in the open on GitHub Pages; what proves itself there moves into Krizaka UI.\n site({ id: \"motion\", name: \"Krizaka Motion\", url: \"https://krizaka.github.io/krizaka-motion\", kind: \"open-source\", group: \"open-source\", status: \"development\", mark: \"krizaka\", repo: \"https://github.com/krizaka/krizaka-motion\" }),\n site({ id: \"github\", name: \"GitHub\", url: \"https://github.com/krizaka\", kind: \"open-source\", group: \"github\", status: \"released\", mark: \"github\", repo: \"https://github.com/krizaka\" }),\n];\n\n/** The groups, in reading order. */\nexport const siteGroups: readonly SiteGroup[] = [\"krizaka\", \"products\", \"open-source\", \"github\"];\n\n/** A site by id. */\nexport function siteById(id: SiteId): Site {\n const found = sites.find((s) => s.id === id);\n if (!found) throw new Error(`Unknown Krizaka site \"${id}\".`);\n return found;\n}\n\n/** The family grouped, in reading order: `[{ group, sites }]`, empty groups left out. */\nexport function sitesByGroup(): { group: SiteGroup; sites: Site[] }[] {\n return siteGroups.map((group) => ({ group, sites: sites.filter((s) => s.group === group) })).filter((g) => g.sites.length > 0);\n}\n\n/** The languages the family's words are written in. */\nexport type SiteLocale = \"en\" | \"fr\";\n\n/** The company's own pages, the footer's « Krizaka » column (the brand's home is the signature line's link). */\nexport type CompanyLinkId = \"story\" | \"blog\" | \"contact\";\nexport const companyLinks: readonly { id: CompanyLinkId; url: Record<SiteLocale, string> }[] = [\n { id: \"story\", url: { en: \"https://www.krizaka.com/story\", fr: \"https://www.krizaka.com/fr/story\" } },\n { id: \"blog\", url: { en: \"https://blog.krizaka.com\", fr: \"https://blog.krizaka.com\" } },\n { id: \"contact\", url: { en: \"https://www.krizaka.com/contact\", fr: \"https://www.krizaka.com/fr/contact\" } },\n];\n\n/** The words of the family: the switcher, the footer, each site's one line. */\nexport interface FamilyLabels {\n /** The family's name: the switcher's navigation and its button, the footer's navigation (“Krizaka family”). */\n family: string;\n /** The heading of each group. */\n groups: Record<SiteGroup, string>;\n /** The badge of a site that is not released. */\n status: Record<Exclude<SiteStatus, \"released\">, string>;\n /** Says which site is the current one (“You are here”). */\n current: string;\n /** One line per site: what it is. */\n descriptions: Record<SiteId, string>;\n /** The footer's signature, by the kind of the current site (“A Krizaka product”). */\n signature: Record<SiteKind, string>;\n /** The footer's place line (“Made in Montréal”). */\n place: string;\n /** The accessible name of the version (“Version”). */\n version: string;\n /** The language of these words: the company links open in it. @default \"en\" */\n lang?: SiteLocale;\n /** The company's pages in the footer's « Krizaka » column. @default the English words */\n company?: Record<CompanyLinkId, string>;\n}\n\n/** The family's words in English and French. Pass `familyLabels[locale]`, or your own translation of the same shape. */\nexport const familyLabels: Record<SiteLocale, FamilyLabels> = {\n en: {\n family: \"Krizaka family\",\n groups: { krizaka: \"Krizaka\", products: \"Products\", \"open-source\": \"Open source\", github: \"GitHub\" },\n status: { upcoming: \"Coming soon\", construction: \"Under construction\", development: \"In development\" },\n current: \"You are here\",\n descriptions: {\n krizaka: \"The company: our products, our open source, our story.\",\n orazaka: \"Sovereign AI on your own servers: chat, documents, images and video — and the engine under the other products.\",\n orochia: \"A video platform for creators.\",\n yasakia: \"Meet real people: introductions, and photos checked before you see them.\",\n yororis: \"A listening space with a face and a voice.\",\n yomizaka: \"Yomizaka reads your leases, contracts and invoices.\",\n kachizaka: \"Predictions among friends — live data, in real time.\",\n akinaza: \"Running a shop in Québec, for less — Loi 25 by design.\",\n ui: \"Components, tokens, icons and charts — web and React Native.\",\n java: \"Spring Boot building blocks on Maven Central.\",\n motion: \"The motion lab: the kit's motion, played live with its knobs.\",\n github: \"Every repository, in the open.\",\n },\n signature: { company: \"A Krizaka company\", product: \"A Krizaka product\", \"open-source\": \"A Krizaka open-source project\" },\n place: \"Made in Montréal\",\n version: \"Version\",\n lang: \"en\",\n company: { story: \"Our story\", blog: \"Blog\", contact: \"Contact us\" },\n },\n fr: {\n family: \"Famille Krizaka\",\n groups: { krizaka: \"Krizaka\", products: \"Produits\", \"open-source\": \"Open source\", github: \"GitHub\" },\n status: { upcoming: \"Bientôt\", construction: \"En construction\", development: \"En développement\" },\n current: \"Vous êtes ici\",\n descriptions: {\n krizaka: \"La compagnie : nos produits, notre open source, notre histoire.\",\n orazaka: \"L’IA souveraine sur vos propres serveurs : conversation, documents, images et vidéo — et le moteur des autres produits.\",\n orochia: \"Une plateforme vidéo pour les créateurs.\",\n yasakia: \"Rencontrez de vraies personnes : des présentations, et des photos vérifiées avant que vous les voyiez.\",\n yororis: \"Un espace d’écoute avec un visage et une voix.\",\n yomizaka: \"Yomizaka lit vos baux, contrats et factures.\",\n kachizaka: \"Les pronostics entre amis — des données en direct.\",\n akinaza: \"Tenir une boutique au Québec, pour moins cher — Loi 25 dès la conception.\",\n ui: \"Composants, jetons, icônes et graphiques — web et React Native.\",\n java: \"Des briques Spring Boot sur Maven Central.\",\n motion: \"Le labo du mouvement : le mouvement du kit, joué en direct, avec ses réglages.\",\n github: \"Tous les dépôts, au grand jour.\",\n },\n signature: { company: \"Une compagnie Krizaka\", product: \"Un produit Krizaka\", \"open-source\": \"Un projet open source de Krizaka\" },\n place: \"Fait à Montréal\",\n version: \"Version\",\n lang: \"fr\",\n company: { story: \"Notre histoire\", blog: \"Blogue\", contact: \"Nous écrire\" },\n },\n};\n"],"mappings":"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","names":[]}
|
|
@@ -13,14 +13,14 @@ var slider = tv({
|
|
|
13
13
|
header: "flex items-baseline justify-between gap-3 text-xs font-semibold text-fg-secondary",
|
|
14
14
|
value: "font-mono text-[11px] tabular-nums text-fg-secondary",
|
|
15
15
|
control: "relative flex touch-none select-none items-center data-disabled:cursor-not-allowed data-disabled:opacity-40 data-[orientation=horizontal]:h-6 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-40 data-[orientation=vertical]:w-6 data-[orientation=vertical]:flex-col",
|
|
16
|
-
track: "relative grow overflow-hidden rounded-
|
|
17
|
-
range: "absolute rounded-
|
|
16
|
+
track: "relative grow overflow-hidden rounded-sm bg-surface-3 inset-shadow-well data-[orientation=horizontal]:h-1.5 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-1.5",
|
|
17
|
+
range: "absolute rounded-sm data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full",
|
|
18
18
|
thumb: "group/thumb relative block h-5 w-5 cursor-grab rounded-full border-2 border-accent bg-fg-on-media shadow-raised transition-[box-shadow,scale] duration-150 hover:ring-4 hover:ring-accent/15 focus-visible:outline-hidden focus-visible:focus-ring active:scale-110 active:cursor-grabbing motion-reduce:transition-none motion-reduce:active:scale-100",
|
|
19
19
|
// The value over the thumb: shown while the thumb is hovered, focused or held.
|
|
20
20
|
bubble: "pointer-events-none absolute bottom-full left-1/2 mb-2.5 -translate-x-1/2 whitespace-nowrap rounded-lg bg-fg px-2 py-1 font-mono text-[11px] font-semibold tabular-nums text-surface-0 opacity-0 shadow-floating transition-opacity duration-150 after:absolute after:left-1/2 after:top-full after:-translate-x-1/2 after:border-4 after:border-transparent after:border-t-fg group-hover/thumb:opacity-100 group-focus-visible/thumb:opacity-100 group-active/thumb:opacity-100 data-[always]:opacity-100 motion-reduce:transition-none",
|
|
21
21
|
bubbleVertical: "bottom-auto left-full top-1/2 mb-0 ml-3 -translate-x-0 -translate-y-1/2 after:hidden",
|
|
22
22
|
ticks: "pointer-events-none absolute inset-0",
|
|
23
|
-
tick: "absolute rounded-
|
|
23
|
+
tick: "absolute rounded-sm bg-border-strong data-[on]:bg-on-accent/70 data-[orientation=horizontal]:top-1/2 data-[orientation=horizontal]:h-1 data-[orientation=horizontal]:w-px data-[orientation=horizontal]:-translate-x-1/2 data-[orientation=horizontal]:-translate-y-1/2 data-[orientation=vertical]:left-1/2 data-[orientation=vertical]:h-px data-[orientation=vertical]:w-1 data-[orientation=vertical]:-translate-x-1/2 data-[orientation=vertical]:translate-y-1/2",
|
|
24
24
|
marks: "relative h-4 w-full text-[11px] font-medium tabular-nums text-fg-secondary",
|
|
25
25
|
mark: "absolute top-0 -translate-x-1/2 whitespace-nowrap first:translate-x-0 last:-translate-x-full"
|
|
26
26
|
},
|
|
@@ -132,4 +132,4 @@ function Slider({
|
|
|
132
132
|
export {
|
|
133
133
|
Slider
|
|
134
134
|
};
|
|
135
|
-
//# sourceMappingURL=chunk-
|
|
135
|
+
//# sourceMappingURL=chunk-ADRUEPYC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/slider/slider.tsx"],"sourcesContent":["// Client. Radix Slider: role=\"slider\" on each thumb, arrows / Page Up / Page Down / Home / End, a range with two\n// thumbs, horizontal or vertical. The words arrive as props: `label` names the thumb(s), `formatValue` gives the\n// aria-valuetext and the value shown (above the track, or floating over the thumb while it is touched). `ticks` draws the\n// graduations of the steps (and `marks` their words under the track); `tone` fills with the brand's gradient or its\n// accent alone.\nimport { Slider as SliderPrimitive } from \"radix-ui\";\nimport * as React from \"react\";\n\nimport { tv } from \"../tv\";\n\nexport const slider = tv({\n slots: {\n root: \"flex flex-col gap-2 data-[orientation=vertical]:h-full data-[orientation=vertical]:items-center\",\n header: \"flex items-baseline justify-between gap-3 text-xs font-semibold text-fg-secondary\",\n value: \"font-mono text-[11px] tabular-nums text-fg-secondary\",\n control:\n \"relative flex touch-none select-none items-center data-disabled:cursor-not-allowed data-disabled:opacity-40 \" +\n \"data-[orientation=horizontal]:h-6 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-40 data-[orientation=vertical]:w-6 data-[orientation=vertical]:flex-col\",\n track:\n \"relative grow overflow-hidden rounded-sm bg-surface-3 inset-shadow-well \" +\n \"data-[orientation=horizontal]:h-1.5 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-1.5\",\n range: \"absolute rounded-sm data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full\",\n thumb:\n \"group/thumb relative block h-5 w-5 cursor-grab rounded-full border-2 border-accent bg-fg-on-media shadow-raised transition-[box-shadow,scale] duration-150 \" +\n \"hover:ring-4 hover:ring-accent/15 focus-visible:outline-hidden focus-visible:focus-ring active:scale-110 active:cursor-grabbing motion-reduce:transition-none motion-reduce:active:scale-100\",\n // The value over the thumb: shown while the thumb is hovered, focused or held.\n bubble:\n \"pointer-events-none absolute bottom-full left-1/2 mb-2.5 -translate-x-1/2 whitespace-nowrap rounded-lg bg-fg px-2 py-1 font-mono text-[11px] font-semibold tabular-nums text-surface-0 opacity-0 shadow-floating \" +\n \"transition-opacity duration-150 after:absolute after:left-1/2 after:top-full after:-translate-x-1/2 after:border-4 after:border-transparent after:border-t-fg \" +\n \"group-hover/thumb:opacity-100 group-focus-visible/thumb:opacity-100 group-active/thumb:opacity-100 data-[always]:opacity-100 motion-reduce:transition-none\",\n bubbleVertical: \"bottom-auto left-full top-1/2 mb-0 ml-3 -translate-x-0 -translate-y-1/2 after:hidden\",\n ticks: \"pointer-events-none absolute inset-0\",\n tick: \"absolute rounded-sm bg-border-strong data-[on]:bg-on-accent/70 data-[orientation=horizontal]:top-1/2 data-[orientation=horizontal]:h-1 data-[orientation=horizontal]:w-px data-[orientation=horizontal]:-translate-x-1/2 data-[orientation=horizontal]:-translate-y-1/2 data-[orientation=vertical]:left-1/2 data-[orientation=vertical]:h-px data-[orientation=vertical]:w-1 data-[orientation=vertical]:-translate-x-1/2 data-[orientation=vertical]:translate-y-1/2\",\n marks: \"relative h-4 w-full text-[11px] font-medium tabular-nums text-fg-secondary\",\n mark: \"absolute top-0 -translate-x-1/2 whitespace-nowrap first:translate-x-0 last:-translate-x-full\",\n },\n variants: {\n tone: {\n /** The brand's signature: accent → accent-2, a glow under it. */\n gradient: { range: \"bg-linear-to-r from-accent to-accent-2 shadow-glow data-[orientation=vertical]:bg-linear-to-t\" },\n /** The accent alone. */\n solid: { range: \"bg-accent\" },\n },\n size: {\n md: {},\n lg: {\n track: \"data-[orientation=horizontal]:h-2.5 data-[orientation=vertical]:w-2.5\",\n thumb: \"h-6 w-6\",\n control: \"data-[orientation=horizontal]:h-8 data-[orientation=vertical]:w-8\",\n },\n },\n },\n defaultVariants: { tone: \"gradient\", size: \"md\" },\n});\n\nexport type SliderValue = number | [number, number];\n\nexport type SliderMark = {\n /** Where the mark stands. */\n value: number;\n /** Its words under the track (\"0\", \"50 %\", \"Max\"), passed translated. */\n label: string;\n};\n\nexport type SliderProps<V extends SliderValue = number> = Omit<\n React.ComponentProps<typeof SliderPrimitive.Root>,\n \"value\" | \"defaultValue\" | \"onValueChange\" | \"onValueCommit\" | \"children\"\n> & {\n /** One number (a thumb) or two (a range). Controlled with `onValueChange`. */\n value?: V;\n /** The value at first, uncontrolled: one number, or two for a range. */\n defaultValue?: V;\n /** Called on every move, with one number or two. */\n onValueChange?: (value: V) => void;\n /** Called once the drag or the key press ends. */\n onValueCommit?: (value: V) => void;\n /** The accessible name — of the thumb, or of both thumbs of a range — passed translated. */\n label: string;\n /** For a range: each thumb's own name ([\"Minimum\", \"Maximum\"]), passed translated. */\n thumbLabels?: [string, string];\n /** The value as words (aria-valuetext) and as shown: \"1.5×\", \"−12 %\", \"3 min\". */\n formatValue?: (value: number) => string;\n /** Shows the label and the value above the track. Without it, `label` only names the thumb. */\n showLabel?: boolean;\n /** Shows the value floating over the thumb while it is hovered, focused or held (`\"always\"`: at all times). */\n floatingValue?: boolean | \"always\";\n /** Fills from this value instead of the minimum (a ±range from 0: brightness, balance). One horizontal thumb only. */\n origin?: number;\n /** Draws a graduation at every step (`true`, up to 40 of them) or at the values given. */\n ticks?: boolean | readonly number[];\n /** Words under the track at some values (`[{ value: 0, label: \"0\" }, { value: 100, label: \"100\" }]`). Horizontal only. */\n marks?: readonly SliderMark[];\n /**\n * `gradient` (the brand's accent → accent-2, a glow) or `solid` (the accent alone).\n * @default \"gradient\"\n */\n tone?: \"gradient\" | \"solid\";\n /**\n * md · lg (a thicker track and thumb: a hero control, a touch screen).\n * @default \"md\"\n */\n size?: \"md\" | \"lg\";\n};\n\nconst toArray = (v: SliderValue | undefined) => (v === undefined ? undefined : typeof v === \"number\" ? [v] : v);\n\n/** A slider on one value or a range: `value`/`defaultValue` + `onValueChange`, `min`, `max`, `step`, `orientation`. */\nexport function Slider<V extends SliderValue = number>({\n value,\n defaultValue,\n onValueChange,\n onValueCommit,\n label,\n thumbLabels,\n formatValue = String,\n showLabel,\n floatingValue,\n origin,\n ticks,\n marks,\n tone,\n size,\n min = 0,\n max = 100,\n step = 1,\n orientation = \"horizontal\",\n className,\n ...props\n}: SliderProps<V>) {\n const s = slider({ tone, size });\n const range = Array.isArray(value ?? defaultValue);\n const vertical = orientation === \"vertical\";\n const [inner, setInner] = React.useState(() => toArray(defaultValue) ?? [min]);\n const current = toArray(value) ?? inner;\n const out = (next: number[]) => (range ? next : next[0]) as V;\n const pct = (v: number) => ((v - min) / (max - min || 1)) * 100;\n const fill =\n origin !== undefined && !range && !vertical\n ? { left: `${Math.min(pct(origin), pct(current[0]!))}%`, right: `${100 - Math.max(pct(origin), pct(current[0]!))}%` }\n : undefined;\n const lo = range ? Math.min(...current) : (origin ?? min);\n const hi = range ? Math.max(...current) : current[0]!;\n const tickValues = ticks === true ? (max - min) / step <= 40 ? Array.from({ length: Math.round((max - min) / step) + 1 }, (_, i) => min + i * step) : [] : ticks ? [...ticks] : [];\n const id = React.useId();\n return (\n <div className={s.root({ className })} data-range={range ? \"\" : undefined} data-orientation={orientation}>\n {showLabel && (\n <div className={s.header()}>\n <span id={`${id}-label`}>{label}</span>\n <span className={s.value()} aria-hidden>\n {current.map(formatValue).join(\" – \")}\n </span>\n </div>\n )}\n <SliderPrimitive.Root\n min={min}\n max={max}\n step={step}\n orientation={orientation}\n value={current}\n onValueChange={(next) => {\n if (value === undefined) setInner(next);\n onValueChange?.(out(next));\n }}\n onValueCommit={onValueCommit && ((next) => onValueCommit(out(next)))}\n className={s.control()}\n {...props}\n >\n <SliderPrimitive.Track className={s.track()}>\n {fill ? <span data-origin=\"\" data-orientation={orientation} className={s.range()} style={fill} /> : <SliderPrimitive.Range className={s.range()} />}\n {tickValues.length ? (\n <span aria-hidden className={s.ticks()}>\n {tickValues.map((t) => (\n <span\n key={t}\n data-orientation={orientation}\n data-on={t > lo && t < hi ? \"\" : undefined}\n className={s.tick()}\n style={vertical ? { bottom: `${pct(t)}%` } : { left: `${pct(t)}%` }}\n />\n ))}\n </span>\n ) : null}\n </SliderPrimitive.Track>\n {current.map((v, i) => (\n <SliderPrimitive.Thumb\n key={i}\n aria-label={range ? (thumbLabels?.[i] ?? label) : showLabel ? undefined : label}\n aria-labelledby={!range && showLabel ? `${id}-label` : undefined}\n aria-valuetext={formatValue(v)}\n className={s.thumb()}\n >\n {floatingValue ? (\n <span aria-hidden data-always={floatingValue === \"always\" ? \"\" : undefined} className={s.bubble({ className: vertical ? s.bubbleVertical() : undefined })}>\n {formatValue(v)}\n </span>\n ) : null}\n </SliderPrimitive.Thumb>\n ))}\n </SliderPrimitive.Root>\n {marks?.length && !vertical ? (\n <div aria-hidden className={s.marks()}>\n {marks.map((m) => (\n <span key={m.value} className={s.mark()} style={{ left: `${pct(m.value)}%` }}>\n {m.label}\n </span>\n ))}\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -201,6 +201,60 @@ var LIGHT = "#ffffff";
|
|
|
201
201
|
var SHADE = "#000000";
|
|
202
202
|
var PARCEL = ["#f59e0b", "#d97706", "#b45309"];
|
|
203
203
|
|
|
204
|
+
// src/mascots/life.ts
|
|
205
|
+
var MASCOT_LOOKS = ["center", "left", "right", "up"];
|
|
206
|
+
var SINGLE = "0%,90%,100%{transform:scaleY(1)}94%{transform:scaleY(.08)}";
|
|
207
|
+
var DOUBLE = "0%,80%,100%{transform:scaleY(1)}83%{transform:scaleY(.08)}86%{transform:scaleY(1)}89%{transform:scaleY(.08)}93%{transform:scaleY(1)}";
|
|
208
|
+
var pose = (rotate, x = 0, y = 0) => `transform:translate(${x}px,${y}px) rotate(${rotate}deg)`;
|
|
209
|
+
var DEFAULT = {
|
|
210
|
+
head: { seconds: 10, frames: `0%,100%{${pose(0)}}25%{${pose(-5)}}45%{${pose(-5)}}60%{${pose(4)}}80%{${pose(4)}}` },
|
|
211
|
+
blink: { seconds: 5.2, frames: SINGLE },
|
|
212
|
+
flutter: { seconds: 12, at: 0.7, angle: 12 },
|
|
213
|
+
hop: { seconds: 0, height: 0 }
|
|
214
|
+
};
|
|
215
|
+
var CHARACTERS = {
|
|
216
|
+
// Watches: a slow scan left, then right, a look up — it blinks rarely.
|
|
217
|
+
falcon: {
|
|
218
|
+
head: { seconds: 9, frames: `0%,100%{${pose(0)}}12%,30%{${pose(-6, -1)}}38%,56%{${pose(5, 1)}}64%{${pose(0)}}78%,88%{${pose(0, 0, -1.6)}}` },
|
|
219
|
+
blink: { seconds: 7.5, frames: SINGLE },
|
|
220
|
+
flutter: { seconds: 15, at: 0.78, angle: 9 },
|
|
221
|
+
hop: { seconds: 0, height: 0 }
|
|
222
|
+
},
|
|
223
|
+
// Reads: the head tilts to a page, a slow double blink, a small nod at the end of a line.
|
|
224
|
+
owl: {
|
|
225
|
+
head: { seconds: 11, frames: `0%,100%{${pose(0)}}18%,36%{${pose(-10, -1)}}44%{${pose(0)}}52%{${pose(0, 0, 1.6)}}58%{${pose(0)}}68%,82%{${pose(7, 1)}}90%{${pose(0)}}` },
|
|
226
|
+
blink: { seconds: 8, frames: DOUBLE },
|
|
227
|
+
flutter: { seconds: 14, at: 0.66, angle: 10 },
|
|
228
|
+
hop: { seconds: 0, height: 0 }
|
|
229
|
+
},
|
|
230
|
+
// Builds: quick nods in a burst, like typing, and an excited hop when a block fits.
|
|
231
|
+
duck: {
|
|
232
|
+
head: { seconds: 7, frames: `0%,48%,100%{${pose(0)}}51%,59%,67%{${pose(2, 0, 2)}}55%,63%,71%{${pose(0)}}` },
|
|
233
|
+
blink: { seconds: 4.6, frames: SINGLE },
|
|
234
|
+
flutter: { seconds: 10, at: 0.8, angle: 14 },
|
|
235
|
+
hop: { seconds: 13, height: 7 }
|
|
236
|
+
},
|
|
237
|
+
// Answers: the neck sways towards you, the head tilts as it listens, a flick of a wing.
|
|
238
|
+
flamingo: {
|
|
239
|
+
head: { seconds: 8, frames: `0%,100%{${pose(0)}}25%{${pose(-4, -1)}}50%{${pose(3, 1)}}75%{${pose(-2)}}` },
|
|
240
|
+
blink: { seconds: 5.6, frames: SINGLE },
|
|
241
|
+
flutter: { seconds: 11, at: 0.72, angle: 13 },
|
|
242
|
+
hop: { seconds: 0, height: 0 }
|
|
243
|
+
},
|
|
244
|
+
// Delivers: the head bobs as it walks, the wings shake out, a hop on the doorstep.
|
|
245
|
+
pigeon: {
|
|
246
|
+
head: { seconds: 3.1, frames: `0%,30%,100%{${pose(0)}}8%{${pose(-1, -2.2, 1)}}16%{${pose(0, 1.4)}}24%{${pose(0)}}` },
|
|
247
|
+
blink: { seconds: 4.2, frames: SINGLE },
|
|
248
|
+
flutter: { seconds: 9, at: 0.74, angle: 18 },
|
|
249
|
+
hop: { seconds: 11, height: 6 }
|
|
250
|
+
},
|
|
251
|
+
lovebird: { ...DEFAULT, flutter: { seconds: 9, at: 0.7, angle: 16 }, hop: { seconds: 12, height: 6 } },
|
|
252
|
+
crane: { ...DEFAULT, head: { seconds: 14, frames: `0%,100%{${pose(0)}}30%,50%{${pose(-3, -1)}}` }, blink: { seconds: 9, frames: DOUBLE } },
|
|
253
|
+
magpie: { ...DEFAULT, head: { seconds: 6, frames: `0%,100%{${pose(0)}}20%{${pose(-7, -1)}}30%{${pose(6, 1)}}42%{${pose(-4)}}55%{${pose(0)}}` }, hop: { seconds: 10, height: 6 } },
|
|
254
|
+
beaver: { ...DEFAULT, flutter: { seconds: 13, at: 0.75, angle: 8 } }
|
|
255
|
+
};
|
|
256
|
+
var phaseOf = (seed) => [...seed].reduce((h, c) => (h * 31 + c.charCodeAt(0)) % 997, 7) / 997;
|
|
257
|
+
|
|
204
258
|
// src/mascots/mascot.tsx
|
|
205
259
|
import { useId } from "react";
|
|
206
260
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
@@ -230,7 +284,8 @@ var CSS = `
|
|
|
230
284
|
@keyframes kzb-shake { 0%, 100% { transform: translateX(0); } 25% { transform: translateX(-3px); } 75% { transform: translateX(3px); } }
|
|
231
285
|
@keyframes kzb-sway { 0%, 100% { transform: rotate(0); } 50% { transform: rotate(-2deg); } }
|
|
232
286
|
@media (prefers-reduced-motion: reduce) {
|
|
233
|
-
.kzb-bird, .kzb-blink, .kzb-wing-r, .kzb-dot, .kzb-badge, .kzb-sparkle { animation: none !important; }
|
|
287
|
+
.kzb-bird, .kzb-blink, .kzb-wing, .kzb-wing-r, .kzb-hop, .kzb-head, .kzb-parcel, .kzb-dot, .kzb-badge, .kzb-sparkle { animation: none !important; }
|
|
288
|
+
.kzb-look, .kzb-pupil { transition: none !important; transform: none !important; }
|
|
234
289
|
}
|
|
235
290
|
`;
|
|
236
291
|
var BRAND = {
|
|
@@ -243,15 +298,17 @@ var BRAND = {
|
|
|
243
298
|
};
|
|
244
299
|
var OUTLINE = "var(--kz-border-strong, color-mix(in srgb, currentColor 35%, transparent))";
|
|
245
300
|
var SURFACE = "var(--kz-surface-0)";
|
|
246
|
-
function Mascot({ bird = "owl", mood = "welcome", tone = "brand", size = 96, animated = true, title, className, ...props }) {
|
|
301
|
+
function Mascot({ bird = "owl", mood = "welcome", tone = "brand", size = 96, animated = true, title, life = false, phase, look, flying, bank, poked, className, style, ...props }) {
|
|
247
302
|
const uid = useId().replace(/[^a-zA-Z0-9_-]/g, "");
|
|
248
303
|
const g = BIRDS[bird];
|
|
304
|
+
const alive = life && mood === "welcome";
|
|
305
|
+
const ph = phase ?? phaseOf(uid);
|
|
249
306
|
const p = tone === "own" ? OWN_PALETTES[bird] : BRAND;
|
|
250
307
|
const body = `url(#kzb-${uid})`;
|
|
251
308
|
const line = { stroke: OUTLINE, strokeWidth: 1.4, strokeLinejoin: "round" };
|
|
252
309
|
const eyeR = g.eyes.white || g.eyes.pupil * 1.2;
|
|
253
310
|
const eyes = g.eyes.at.map((at, i) => {
|
|
254
|
-
const
|
|
311
|
+
const glance = mood === "thinking" ? 1.4 : 0;
|
|
255
312
|
if (mood === "success") return /* @__PURE__ */ jsx("path", { d: archEye(at, eyeR * 0.85), stroke: g.visor ? p.eye : OUTLINE, strokeWidth: 2.2, strokeLinecap: "round", fill: "none" }, i);
|
|
256
313
|
if (mood === "empty" && g.eyes.white > 0)
|
|
257
314
|
return /* @__PURE__ */ jsxs("g", { children: [
|
|
@@ -262,8 +319,10 @@ function Mascot({ bird = "owl", mood = "welcome", tone = "brand", size = 96, ani
|
|
|
262
319
|
if (mood === "empty") return /* @__PURE__ */ jsx("path", { d: lidEye(at, eyeR * 0.8), stroke: g.visor ? p.eye : OUTLINE, strokeWidth: 2.2, strokeLinecap: "round", fill: "none" }, i);
|
|
263
320
|
return /* @__PURE__ */ jsxs("g", { className: "kzb-eye kzb-blink", children: [
|
|
264
321
|
g.eyes.white > 0 && /* @__PURE__ */ jsx("circle", { cx: at[0], cy: at[1], r: g.eyes.white, fill: LIGHT, ...line }),
|
|
265
|
-
/* @__PURE__ */
|
|
266
|
-
|
|
322
|
+
/* @__PURE__ */ jsxs("g", { className: "kzb-pupil", children: [
|
|
323
|
+
/* @__PURE__ */ jsx("circle", { cx: at[0] + glance, cy: at[1] - glance, r: g.eyes.pupil, fill: g.visor ? p.eye : SHADE }),
|
|
324
|
+
g.eyes.white > 0 && /* @__PURE__ */ jsx("circle", { cx: at[0] + glance - g.eyes.pupil * 0.35, cy: at[1] - glance - g.eyes.pupil * 0.35, r: g.eyes.pupil * 0.35, fill: LIGHT })
|
|
325
|
+
] })
|
|
267
326
|
] }, i);
|
|
268
327
|
});
|
|
269
328
|
const [wl, wr] = g.wings;
|
|
@@ -278,7 +337,12 @@ function Mascot({ bird = "owl", mood = "welcome", tone = "brand", size = 96, ani
|
|
|
278
337
|
"data-bird": bird,
|
|
279
338
|
"data-mood": mood,
|
|
280
339
|
"data-animated": animated ? "" : void 0,
|
|
340
|
+
"data-life": alive ? "" : void 0,
|
|
341
|
+
"data-look": alive && look && look !== "center" ? look : void 0,
|
|
342
|
+
"data-flying": alive && flying ? "" : void 0,
|
|
343
|
+
"data-poked": alive && poked ? "" : void 0,
|
|
281
344
|
className,
|
|
345
|
+
style: alive ? { "--kzb-ph": ph, "--kzb-bank": bank ?? 0, ...style } : style,
|
|
282
346
|
...title ? { role: "img", "aria-label": title } : { "aria-hidden": true },
|
|
283
347
|
...props,
|
|
284
348
|
children: [
|
|
@@ -289,31 +353,33 @@ function Mascot({ bird = "owl", mood = "welcome", tone = "brand", size = 96, ani
|
|
|
289
353
|
] }) }),
|
|
290
354
|
/* @__PURE__ */ jsx("ellipse", { cx: g.shadow[0], cy: g.shadow[1], rx: g.shadow[2], ry: g.shadow[3], fill: SHADE, opacity: 0.14 }),
|
|
291
355
|
mood === "empty" && /* @__PURE__ */ jsx("path", { d: MOOD_PARTS.tray, stroke: OUTLINE, strokeWidth: 1.6, strokeDasharray: "3 3", strokeLinejoin: "round" }),
|
|
292
|
-
/* @__PURE__ */ jsxs("g", { className: "kzb-bird", children: [
|
|
356
|
+
/* @__PURE__ */ jsx("g", { className: "kzb-hop", children: /* @__PURE__ */ jsxs("g", { className: "kzb-bird", children: [
|
|
293
357
|
g.legs.map((d) => /* @__PURE__ */ jsx("path", { d, stroke: p.beak, strokeWidth: 2.6, strokeLinecap: "round" }, d)),
|
|
294
358
|
g.back?.map((d) => d.endsWith("Z") ? /* @__PURE__ */ jsx("path", { d, fill: p.detail, ...line }, d) : /* @__PURE__ */ jsx("path", { d, stroke: OUTLINE, strokeWidth: 1.4 }, d)),
|
|
295
|
-
g.parcel && /* @__PURE__ */ jsx("g", { ...line, children: g.parcel.map((d, i) => /* @__PURE__ */ jsx("path", { d, fill: PARCEL[i] }, d)) }),
|
|
359
|
+
g.parcel && /* @__PURE__ */ jsx("g", { className: "kzb-parcel", ...line, children: g.parcel.map((d, i) => /* @__PURE__ */ jsx("path", { d, fill: PARCEL[i] }, d)) }),
|
|
296
360
|
/* @__PURE__ */ jsx("path", { d: g.body, fill: body, ...line }),
|
|
297
361
|
/* @__PURE__ */ jsx("path", { d: g.belly, fill: LIGHT, opacity: 0.28 }),
|
|
298
362
|
[wl, wr].map((w, i) => {
|
|
299
|
-
const turn = mood === "success" ? i === 0 ? 28 : -28 : mood === "welcome" && i === 1 ? -20 : 0;
|
|
300
|
-
return /* @__PURE__ */ jsxs("g", { className: i === 1 ? "kzb-wing kzb-wing-r" : "kzb-wing", style: { transformOrigin: `${w.pivot[0]}px ${w.pivot[1]}px`, transform: turn ? `rotate(${turn}deg)` : void 0 }, children: [
|
|
363
|
+
const turn = mood === "success" ? i === 0 ? 28 : -28 : mood === "welcome" && i === 1 && !alive ? -20 : 0;
|
|
364
|
+
return /* @__PURE__ */ jsxs("g", { className: i === 1 ? "kzb-wing kzb-wing-r" : "kzb-wing kzb-wing-l", style: { transformOrigin: `${w.pivot[0]}px ${w.pivot[1]}px`, transform: turn ? `rotate(${turn}deg)` : void 0 }, children: [
|
|
301
365
|
/* @__PURE__ */ jsx("path", { d: w.d, fill: p.wing, ...line }),
|
|
302
366
|
/* @__PURE__ */ jsx("path", { d: w.d, fill: SHADE, opacity: 0.16 })
|
|
303
367
|
] }, i);
|
|
304
368
|
}),
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
g.
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
369
|
+
/* @__PURE__ */ jsx("g", { className: "kzb-look", children: /* @__PURE__ */ jsxs("g", { className: "kzb-head", children: [
|
|
370
|
+
g.neck && /* @__PURE__ */ jsx("path", { d: g.neck.d, stroke: body, strokeWidth: g.neck.width, strokeLinecap: "round" }),
|
|
371
|
+
g.head.r > 0 && /* @__PURE__ */ jsx("circle", { cx: g.head.cx, cy: g.head.cy, r: g.head.r, fill: body, ...line }),
|
|
372
|
+
g.details.map((d) => /* @__PURE__ */ jsx("path", { d, fill: p.detail, ...line }, d)),
|
|
373
|
+
g.visor && /* @__PURE__ */ jsx("rect", { x: g.visor.x, y: g.visor.y, width: g.visor.w, height: g.visor.h, rx: 4, fill: SURFACE, ...line }),
|
|
374
|
+
eyes,
|
|
375
|
+
g.glasses && /* @__PURE__ */ jsxs("g", { stroke: OUTLINE, strokeWidth: 1.3, children: [
|
|
376
|
+
g.eyes.at.map(([x, y]) => /* @__PURE__ */ jsx("circle", { cx: x, cy: y, r: 6.5, fill: LIGHT, fillOpacity: 0.12 }, x)),
|
|
377
|
+
/* @__PURE__ */ jsx("path", { d: `M${g.eyes.at[0][0] + 6.5} ${g.eyes.at[0][1]} L${g.eyes.at[1][0] - 6.5} ${g.eyes.at[1][1]}` })
|
|
378
|
+
] }),
|
|
379
|
+
mood === "error" && g.eyes.at.map((at, i) => /* @__PURE__ */ jsx("path", { d: brow(at, eyeR, g.eyes.at.length === 1 ? 1 : i === 0 ? -1 : 1), stroke: OUTLINE, strokeWidth: 2, strokeLinecap: "round" }, i)),
|
|
380
|
+
/* @__PURE__ */ jsx("path", { d: g.beak, fill: p.beak, ...line })
|
|
381
|
+
] }) })
|
|
382
|
+
] }) }),
|
|
317
383
|
mood === "thinking" && /* @__PURE__ */ jsx("g", { children: MOOD_PARTS.dots.map(([cx, cy, r]) => /* @__PURE__ */ jsx("circle", { className: "kzb-dot", cx, cy, r, fill: "var(--kz-text-secondary)" }, cx)) }),
|
|
318
384
|
mood === "success" && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
319
385
|
MOOD_PARTS.sparkles.map((d) => /* @__PURE__ */ jsx("path", { className: "kzb-sparkle", d, fill: p.from }, d)),
|
|
@@ -335,6 +401,7 @@ function Mascot({ bird = "owl", mood = "welcome", tone = "brand", size = 96, ani
|
|
|
335
401
|
export {
|
|
336
402
|
MASCOT_BIRDS,
|
|
337
403
|
MASCOT_MOODS,
|
|
404
|
+
MASCOT_LOOKS,
|
|
338
405
|
Mascot
|
|
339
406
|
};
|
|
340
|
-
//# sourceMappingURL=chunk-
|
|
407
|
+
//# sourceMappingURL=chunk-EZC54B5C.js.map
|