@krizaka/ui 2.9.0 → 3.0.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 +44 -6
- package/dist/audio-player.js +1 -1
- package/dist/blocks.css +247 -0
- package/dist/catalogue-page.d.ts +34 -0
- package/dist/catalogue-page.js +26 -0
- package/dist/catalogue-page.js.map +1 -0
- package/dist/changelog-page.d.ts +50 -0
- package/dist/changelog-page.js +27 -0
- package/dist/changelog-page.js.map +1 -0
- package/dist/{chunk-EUPTXKH7.js → chunk-BRKMQ6JV.js} +2 -1
- package/dist/chunk-FDCMBWUU.js +168 -0
- package/dist/chunk-FDCMBWUU.js.map +1 -0
- package/dist/chunk-HCNOOPZE.js +210 -0
- package/dist/chunk-HCNOOPZE.js.map +1 -0
- package/dist/{chunk-NOVUREEC.js → chunk-JZPVUJIX.js} +25 -3
- package/dist/chunk-JZPVUJIX.js.map +1 -0
- package/dist/chunk-KNBYZGSQ.js +11 -0
- package/dist/chunk-KNBYZGSQ.js.map +1 -0
- package/dist/{chunk-X6TW3X6Y.js → chunk-LCZXS6AK.js} +2 -2
- package/dist/chunk-OGJI5X4W.js +157 -0
- package/dist/chunk-OGJI5X4W.js.map +1 -0
- package/dist/combobox.js +2 -2
- package/dist/component-page.d.ts +41 -0
- package/dist/component-page.js +17 -0
- package/dist/component-page.js.map +1 -0
- package/dist/contact-page.d.ts +31 -0
- package/dist/contact-page.js +26 -0
- package/dist/contact-page.js.map +1 -0
- package/dist/data-table.d.ts +284 -24
- package/dist/data-table.js +914 -121
- package/dist/data-table.js.map +1 -1
- package/dist/date-picker.js +1 -1
- package/dist/docs-article-page.d.ts +54 -0
- package/dist/docs-article-page.js +29 -0
- package/dist/docs-article-page.js.map +1 -0
- package/dist/docs-hub-page.d.ts +72 -0
- package/dist/docs-hub-page.js +45 -0
- package/dist/docs-hub-page.js.map +1 -0
- package/dist/error-page.d.ts +22 -0
- package/dist/error-page.js +23 -0
- package/dist/error-page.js.map +1 -0
- package/dist/filter-bar.d.ts +12 -12
- package/dist/filter-bar.js +9 -145
- package/dist/filter-bar.js.map +1 -1
- package/dist/gallery-page.d.ts +50 -0
- package/dist/gallery-page.js +30 -0
- package/dist/gallery-page.js.map +1 -0
- package/dist/{geometry-CXrAW34x.d.ts → geometry-CbOU4rtL.d.ts} +4 -4
- package/dist/how-it-works-page.d.ts +48 -0
- package/dist/how-it-works-page.js +28 -0
- package/dist/how-it-works-page.js.map +1 -0
- package/dist/image-cropper.js +1 -1
- package/dist/index.d.ts +11 -2
- package/dist/index.js +93 -5
- package/dist/index.js.map +1 -1
- package/dist/landing-page.d.ts +58 -0
- package/dist/landing-page.js +42 -0
- package/dist/landing-page.js.map +1 -0
- package/dist/legal-page.d.ts +34 -0
- package/dist/legal-page.js +18 -0
- package/dist/legal-page.js.map +1 -0
- package/dist/longform-page.d.ts +42 -0
- package/dist/longform-page.js +29 -0
- package/dist/longform-page.js.map +1 -0
- package/dist/mascot-quote.d.ts +4 -4
- package/dist/mascot-quote.js +23 -1
- package/dist/mascot-quote.js.map +1 -1
- package/dist/mascot-state.d.ts +2 -2
- package/dist/mascot-state.js +1 -1
- package/dist/mascot-state.js.map +1 -1
- package/dist/mascots.d.ts +4 -4
- package/dist/mascots.js +1 -1
- package/dist/media-capture.js +1 -1
- package/dist/native/list.d.ts +95 -0
- package/dist/native/list.js +135 -0
- package/dist/native/list.js.map +1 -0
- package/dist/native.d.ts +16 -9
- package/dist/native.js +183 -74
- package/dist/native.js.map +1 -1
- package/dist/pricing-page.d.ts +62 -0
- package/dist/pricing-page.js +71 -0
- package/dist/pricing-page.js.map +1 -0
- package/dist/product-page.d.ts +83 -0
- package/dist/product-page.js +60 -0
- package/dist/product-page.js.map +1 -0
- package/dist/search-field.js +6 -160
- package/dist/search-field.js.map +1 -1
- package/dist/status-page.d.ts +42 -0
- package/dist/status-page.js +28 -0
- package/dist/status-page.js.map +1 -0
- package/dist/tag-input.js +2 -2
- package/dist/video-player.js +1 -1
- package/dist/video-trimmer.js +1 -1
- package/dist/virtual.d.ts +140 -0
- package/dist/virtual.js +19 -0
- package/dist/virtual.js.map +1 -0
- package/package.json +296 -10
- package/registry/achievement.json +1 -1
- package/registry/action-bar.json +1 -1
- package/registry/alert.json +1 -1
- package/registry/app-shell.json +1 -1
- package/registry/argument-card.json +1 -1
- 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/button.json +1 -1
- package/registry/card-grid.json +1 -1
- package/registry/card.json +1 -1
- package/registry/catalogue-page.json +240 -0
- package/registry/changelog-page.json +226 -0
- package/registry/checkbox.json +1 -1
- package/registry/chip-link.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/component-page.json +227 -0
- package/registry/confirm-button.json +1 -1
- package/registry/contact-page.json +212 -0
- package/registry/continue-prompt.json +1 -1
- package/registry/countdown.json +1 -1
- package/registry/cta-panel.json +1 -1
- package/registry/dashboard-layout.json +1 -1
- package/registry/data-table.json +643 -49
- package/registry/date-picker.json +1 -1
- package/registry/decision-list.json +1 -1
- package/registry/detail-layout.json +1 -1
- package/registry/dialog.json +1 -1
- package/registry/docs-article-page.json +242 -0
- package/registry/docs-hub-page.json +270 -0
- package/registry/docs-layout.json +1 -1
- package/registry/dropdown-menu.json +1 -1
- package/registry/empty-state.json +1 -1
- package/registry/error-page.json +183 -0
- package/registry/examples/catalogue-page/components.d.ts +4 -0
- package/registry/examples/catalogue-page/components.js +33 -0
- package/registry/examples/catalogue-page/components.tsx +36 -0
- package/registry/examples/changelog-page/releases.d.ts +4 -0
- package/registry/examples/changelog-page/releases.js +44 -0
- package/registry/examples/changelog-page/releases.tsx +39 -0
- package/registry/examples/component-page/button.d.ts +4 -0
- package/registry/examples/component-page/button.js +33 -0
- package/registry/examples/component-page/button.tsx +30 -0
- package/registry/examples/contact-page/team.d.ts +4 -0
- package/registry/examples/contact-page/team.js +39 -0
- package/registry/examples/contact-page/team.tsx +38 -0
- package/registry/examples/data-table/details.d.ts +4 -0
- package/registry/examples/data-table/details.js +33 -0
- package/registry/examples/data-table/details.tsx +31 -0
- package/registry/examples/data-table/filters.d.ts +4 -0
- package/registry/examples/data-table/filters.js +40 -0
- package/registry/examples/data-table/filters.tsx +40 -0
- package/registry/examples/data-table/grouped.d.ts +4 -0
- package/registry/examples/data-table/grouped.js +24 -0
- package/registry/examples/data-table/grouped.tsx +23 -0
- package/registry/examples/data-table/paginated.d.ts +4 -0
- package/registry/examples/data-table/paginated.js +23 -0
- package/registry/examples/data-table/paginated.tsx +22 -0
- package/registry/examples/data-table/pinned.d.ts +4 -0
- package/registry/examples/data-table/pinned.js +26 -0
- package/registry/examples/data-table/pinned.tsx +25 -0
- package/registry/examples/data-table/server.d.ts +4 -0
- package/registry/examples/data-table/server.js +40 -0
- package/registry/examples/data-table/server.tsx +40 -0
- package/registry/examples/data-table/virtualized.js +2 -2
- package/registry/examples/data-table/virtualized.tsx +3 -3
- package/registry/examples/docs-article-page/cli.d.ts +4 -0
- package/registry/examples/docs-article-page/cli.js +33 -0
- package/registry/examples/docs-article-page/cli.tsx +38 -0
- package/registry/examples/docs-hub-page/krizaka.d.ts +4 -0
- package/registry/examples/docs-hub-page/krizaka.js +46 -0
- package/registry/examples/docs-hub-page/krizaka.tsx +37 -0
- package/registry/examples/error-page/not-found.d.ts +4 -0
- package/registry/examples/error-page/not-found.js +24 -0
- package/registry/examples/error-page/not-found.tsx +19 -0
- package/registry/examples/gallery-page/made-here.d.ts +4 -0
- package/registry/examples/gallery-page/made-here.js +34 -0
- package/registry/examples/gallery-page/made-here.tsx +32 -0
- package/registry/examples/how-it-works-page/orazaka.d.ts +4 -0
- package/registry/examples/how-it-works-page/orazaka.js +30 -0
- package/registry/examples/how-it-works-page/orazaka.tsx +26 -0
- package/registry/examples/landing-page/krizaka.d.ts +4 -0
- package/registry/examples/landing-page/krizaka.js +44 -0
- package/registry/examples/landing-page/krizaka.tsx +44 -0
- package/registry/examples/legal-page/privacy.d.ts +4 -0
- package/registry/examples/legal-page/privacy.js +24 -0
- package/registry/examples/legal-page/privacy.tsx +19 -0
- package/registry/examples/list/native/default.d.ts +4 -0
- package/registry/examples/list/native/default.dark.png +0 -0
- package/registry/examples/list/native/default.js +33 -0
- package/registry/examples/list/native/default.light.png +0 -0
- package/registry/examples/list/native/default.tsx +31 -0
- package/registry/examples/list/native/infinite.d.ts +4 -0
- package/registry/examples/list/native/infinite.dark.png +0 -0
- package/registry/examples/list/native/infinite.js +30 -0
- package/registry/examples/list/native/infinite.light.png +0 -0
- package/registry/examples/list/native/infinite.tsx +35 -0
- package/registry/examples/list/native/states.d.ts +4 -0
- package/registry/examples/list/native/states.dark.png +0 -0
- package/registry/examples/list/native/states.js +26 -0
- package/registry/examples/list/native/states.light.png +0 -0
- package/registry/examples/list/native/states.tsx +21 -0
- package/registry/examples/longform-page/story.d.ts +4 -0
- package/registry/examples/longform-page/story.js +38 -0
- package/registry/examples/longform-page/story.tsx +35 -0
- package/registry/examples/mascots/crane.d.ts +4 -0
- package/registry/examples/mascots/crane.js +19 -0
- package/registry/examples/mascots/crane.tsx +18 -0
- package/registry/examples/mascots/flock.tsx +2 -1
- package/registry/examples/mascots/native/crane.d.ts +4 -0
- package/registry/examples/mascots/native/crane.dark.png +0 -0
- package/registry/examples/mascots/native/crane.js +21 -0
- package/registry/examples/mascots/native/crane.light.png +0 -0
- package/registry/examples/mascots/native/crane.tsx +18 -0
- package/registry/examples/pricing-page/credits.d.ts +4 -0
- package/registry/examples/pricing-page/credits.js +41 -0
- package/registry/examples/pricing-page/credits.tsx +33 -0
- package/registry/examples/product-page/orazaka.d.ts +4 -0
- package/registry/examples/product-page/orazaka.js +44 -0
- package/registry/examples/product-page/orazaka.tsx +36 -0
- package/registry/examples/status-page/building.d.ts +4 -0
- package/registry/examples/status-page/building.js +29 -0
- package/registry/examples/status-page/building.tsx +25 -0
- package/registry/examples/status-page/operational.d.ts +4 -0
- package/registry/examples/status-page/operational.js +26 -0
- package/registry/examples/status-page/operational.tsx +20 -0
- package/registry/examples/virtual/feed.d.ts +4 -0
- package/registry/examples/virtual/feed.js +26 -0
- package/registry/examples/virtual/feed.tsx +24 -0
- package/registry/examples/virtual/gallery.d.ts +4 -0
- package/registry/examples/virtual/gallery.js +31 -0
- package/registry/examples/virtual/gallery.tsx +28 -0
- package/registry/examples/virtual/messages.d.ts +4 -0
- package/registry/examples/virtual/messages.js +28 -0
- package/registry/examples/virtual/messages.tsx +28 -0
- package/registry/field.json +1 -1
- package/registry/file-upload.json +1 -1
- package/registry/filter-bar.json +1 -1
- package/registry/gallery-page.json +256 -0
- package/registry/glow-card.json +1 -1
- package/registry/goal-gauge.json +1 -1
- package/registry/how-it-works-page.json +242 -0
- package/registry/image-cropper.json +1 -1
- package/registry/index.json +356 -9
- package/registry/iso.json +1 -1
- package/registry/kbd.json +1 -1
- package/registry/landing-page.json +242 -0
- package/registry/landscape.json +1 -1
- package/registry/legal-page.json +199 -0
- package/registry/link-card.json +1 -1
- package/registry/list.json +249 -0
- package/registry/loader.json +1 -1
- package/registry/longform-page.json +213 -0
- package/registry/marketing-layout.json +1 -1
- package/registry/marquee.json +1 -1
- package/registry/mascot-quote.json +6 -6
- package/registry/mascot-state.json +34 -34
- package/registry/mascots.json +41 -21
- package/registry/media-capture.json +1 -1
- package/registry/meter.json +1 -1
- package/registry/nav-bar.json +1 -1
- package/registry/number-ticker.json +1 -1
- package/registry/page-header.json +1 -1
- package/registry/page-hero.json +1 -1
- package/registry/page.json +1 -1
- package/registry/pagination.json +1 -1
- package/registry/pointer-light.json +1 -1
- package/registry/popover.json +1 -1
- package/registry/pricing-page.json +245 -0
- package/registry/product-page.json +319 -0
- 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/scroll-stage.json +1 -1
- package/registry/search-field.json +1 -1
- package/registry/section-backdrop.json +1 -1
- package/registry/separator.json +1 -1
- package/registry/settings-layout.json +1 -1
- package/registry/skeleton.json +1 -1
- package/registry/slider.json +1 -1
- package/registry/slot.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 +263 -0
- package/registry/stepper.json +1 -1
- package/registry/switch.json +1 -1
- package/registry/tabs.json +1 -1
- package/registry/tag-input.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/video-player.json +1 -1
- package/registry/video-trimmer.json +1 -1
- package/registry/virtual.json +569 -0
- package/skills/data-table/SKILL.md +56 -0
- package/skills/native-list/SKILL.md +39 -0
- package/skills/virtual/SKILL.md +35 -0
- package/dist/chunk-NOVUREEC.js.map +0 -1
- /package/dist/{chunk-EUPTXKH7.js.map → chunk-BRKMQ6JV.js.map} +0 -0
- /package/dist/{chunk-X6TW3X6Y.js.map → chunk-LCZXS6AK.js.map} +0 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// registry/examples/gallery-page/made-here.tsx
|
|
4
|
+
import { ChipLink } from "@krizaka/ui/chip-link";
|
|
5
|
+
import { cn } from "@krizaka/ui/cn";
|
|
6
|
+
import { GalleryPage } from "@krizaka/ui/gallery-page";
|
|
7
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
var PIECES = [
|
|
9
|
+
{ id: "harbour", title: "Old harbour at dawn", caption: "Flux 1.1 \xB7 seed 4102 \xB7 38 s on a Mac mini", ratio: "aspect-[4/5]" },
|
|
10
|
+
{ id: "loft", title: "A loft studio", caption: "Flux 1.1 \xB7 seed 77 \xB7 41 s", ratio: "aspect-video" },
|
|
11
|
+
{ id: "market", title: "Jean-Talon market", caption: "Flux 1.1 \xB7 seed 905 \xB7 36 s", ratio: "aspect-square" },
|
|
12
|
+
{ id: "snow", title: "First snow, Plateau", caption: "Flux 1.1 \xB7 seed 12 \xB7 39 s", ratio: "aspect-[3/4]" }
|
|
13
|
+
];
|
|
14
|
+
function GalleryPageMadeHere() {
|
|
15
|
+
return /* @__PURE__ */ jsx(
|
|
16
|
+
GalleryPage,
|
|
17
|
+
{
|
|
18
|
+
brand: "orazaka",
|
|
19
|
+
eyebrow: "Made on this Mac",
|
|
20
|
+
title: "Generated by Orazaka itself",
|
|
21
|
+
lead: "Every image here was made locally, with its prompt and its seed \u2014 nothing came from a cloud.",
|
|
22
|
+
filters: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
23
|
+
/* @__PURE__ */ jsx(ChipLink, { href: "#all", selected: true, children: "All" }),
|
|
24
|
+
/* @__PURE__ */ jsx(ChipLink, { href: "#images", children: "Images" }),
|
|
25
|
+
/* @__PURE__ */ jsx(ChipLink, { href: "#voice", children: "Voice" })
|
|
26
|
+
] }),
|
|
27
|
+
galleryLabel: "Pieces",
|
|
28
|
+
items: PIECES.map((p) => ({ id: p.id, title: p.title, caption: p.caption, media: /* @__PURE__ */ jsx("div", { role: "img", "aria-label": p.title, className: cn(p.ratio, "w-full bg-linear-to-br from-accent to-accent-2") }) }))
|
|
29
|
+
}
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
export {
|
|
33
|
+
GalleryPageMadeHere as default
|
|
34
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { ChipLink } from "@krizaka/ui/chip-link";
|
|
2
|
+
import { cn } from "@krizaka/ui/cn";
|
|
3
|
+
import { GalleryPage } from "@krizaka/ui/gallery-page";
|
|
4
|
+
|
|
5
|
+
const PIECES = [
|
|
6
|
+
{ id: "harbour", title: "Old harbour at dawn", caption: "Flux 1.1 · seed 4102 · 38 s on a Mac mini", ratio: "aspect-[4/5]" },
|
|
7
|
+
{ id: "loft", title: "A loft studio", caption: "Flux 1.1 · seed 77 · 41 s", ratio: "aspect-video" },
|
|
8
|
+
{ id: "market", title: "Jean-Talon market", caption: "Flux 1.1 · seed 905 · 36 s", ratio: "aspect-square" },
|
|
9
|
+
{ id: "snow", title: "First snow, Plateau", caption: "Flux 1.1 · seed 12 · 39 s", ratio: "aspect-[3/4]" },
|
|
10
|
+
];
|
|
11
|
+
|
|
12
|
+
// TEMPLATE — a demo gallery (Orazaka's « Made on this Mac »): the filters as links (the address keeps the choice), the
|
|
13
|
+
// pieces in staggered columns with how each was made. One column on a phone.
|
|
14
|
+
export default function GalleryPageMadeHere() {
|
|
15
|
+
return (
|
|
16
|
+
<GalleryPage
|
|
17
|
+
brand="orazaka"
|
|
18
|
+
eyebrow="Made on this Mac"
|
|
19
|
+
title="Generated by Orazaka itself"
|
|
20
|
+
lead="Every image here was made locally, with its prompt and its seed — nothing came from a cloud."
|
|
21
|
+
filters={
|
|
22
|
+
<>
|
|
23
|
+
<ChipLink href="#all" selected>All</ChipLink>
|
|
24
|
+
<ChipLink href="#images">Images</ChipLink>
|
|
25
|
+
<ChipLink href="#voice">Voice</ChipLink>
|
|
26
|
+
</>
|
|
27
|
+
}
|
|
28
|
+
galleryLabel="Pieces"
|
|
29
|
+
items={PIECES.map((p) => ({ id: p.id, title: p.title, caption: p.caption, media: <div role="img" aria-label={p.title} className={cn(p.ratio, "w-full bg-linear-to-br from-accent to-accent-2")} /> }))}
|
|
30
|
+
/>
|
|
31
|
+
);
|
|
32
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// registry/examples/how-it-works-page/orazaka.tsx
|
|
4
|
+
import { CodeBlock } from "@krizaka/ui/code-block";
|
|
5
|
+
import { HowItWorksPage } from "@krizaka/ui/how-it-works-page";
|
|
6
|
+
import { Mascot } from "@krizaka/ui/mascots";
|
|
7
|
+
import { jsx } from "react/jsx-runtime";
|
|
8
|
+
var copy = { copyLabel: "Copy", copiedLabel: "Copied" };
|
|
9
|
+
function HowItWorksPageOrazaka() {
|
|
10
|
+
return /* @__PURE__ */ jsx(
|
|
11
|
+
HowItWorksPage,
|
|
12
|
+
{
|
|
13
|
+
brand: "orazaka",
|
|
14
|
+
back: { href: "#orazaka", label: "Orazaka" },
|
|
15
|
+
eyebrow: "How it works",
|
|
16
|
+
title: "The journey of a request",
|
|
17
|
+
lead: "Six stages, the same for every request \u2014 and none of them leaves your server.",
|
|
18
|
+
aside: /* @__PURE__ */ jsx(Mascot, { bird: "duck", mood: "thinking", size: 112 }),
|
|
19
|
+
stepsLabel: "The steps",
|
|
20
|
+
steps: [
|
|
21
|
+
{ id: "install", title: "Install", text: "One command pulls the engine, the models you choose and the console.", visual: /* @__PURE__ */ jsx(CodeBlock, { code: "npx orazaka install", language: "bash", file: "Terminal", ...copy }) },
|
|
22
|
+
{ id: "guard", title: "Guard", text: "Every request crosses the same interceptors: identity, quotas, the rules of your workspace.", visual: /* @__PURE__ */ jsx(CodeBlock, { code: "orazaka rules add --deny pii-export", language: "bash", file: "Terminal", ...copy }) },
|
|
23
|
+
{ id: "answer", title: "Answer", text: "The best local model answers; the answer is checked before it is shown.", visual: /* @__PURE__ */ jsx(CodeBlock, { code: "orazaka chat --model llama3.3", language: "bash", file: "Terminal", ...copy }) }
|
|
24
|
+
]
|
|
25
|
+
}
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
export {
|
|
29
|
+
HowItWorksPageOrazaka as default
|
|
30
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { CodeBlock } from "@krizaka/ui/code-block";
|
|
2
|
+
import { HowItWorksPage } from "@krizaka/ui/how-it-works-page";
|
|
3
|
+
import { Mascot } from "@krizaka/ui/mascots";
|
|
4
|
+
|
|
5
|
+
const copy = { copyLabel: "Copy", copiedLabel: "Copied" };
|
|
6
|
+
|
|
7
|
+
// TEMPLATE — how a product works, in steps along a line (Orazaka's journey of a request): each step its words beside
|
|
8
|
+
// its visual, the sides alternating on a wide screen, one column on a phone.
|
|
9
|
+
export default function HowItWorksPageOrazaka() {
|
|
10
|
+
return (
|
|
11
|
+
<HowItWorksPage
|
|
12
|
+
brand="orazaka"
|
|
13
|
+
back={{ href: "#orazaka", label: "Orazaka" }}
|
|
14
|
+
eyebrow="How it works"
|
|
15
|
+
title="The journey of a request"
|
|
16
|
+
lead="Six stages, the same for every request — and none of them leaves your server."
|
|
17
|
+
aside={<Mascot bird="duck" mood="thinking" size={112} />}
|
|
18
|
+
stepsLabel="The steps"
|
|
19
|
+
steps={[
|
|
20
|
+
{ id: "install", title: "Install", text: "One command pulls the engine, the models you choose and the console.", visual: <CodeBlock code="npx orazaka install" language="bash" file="Terminal" {...copy} /> },
|
|
21
|
+
{ id: "guard", title: "Guard", text: "Every request crosses the same interceptors: identity, quotas, the rules of your workspace.", visual: <CodeBlock code="orazaka rules add --deny pii-export" language="bash" file="Terminal" {...copy} /> },
|
|
22
|
+
{ id: "answer", title: "Answer", text: "The best local model answers; the answer is checked before it is shown.", visual: <CodeBlock code="orazaka chat --model llama3.3" language="bash" file="Terminal" {...copy} /> },
|
|
23
|
+
]}
|
|
24
|
+
/>
|
|
25
|
+
);
|
|
26
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// registry/examples/landing-page/krizaka.tsx
|
|
4
|
+
import { Button } from "@krizaka/ui/button";
|
|
5
|
+
import { LandingPage } from "@krizaka/ui/landing-page";
|
|
6
|
+
import { Meter } from "@krizaka/ui/meter";
|
|
7
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
function LandingPageKrizaka() {
|
|
9
|
+
return /* @__PURE__ */ jsx(
|
|
10
|
+
LandingPage,
|
|
11
|
+
{
|
|
12
|
+
eyebrow: "Software studio \xB7 Montr\xE9al",
|
|
13
|
+
title: "Products that keep what is yours",
|
|
14
|
+
lead: "Krizaka builds sovereign AI and a platform where creators are paid \u2014 open source, on your servers or ours.",
|
|
15
|
+
actions: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
16
|
+
/* @__PURE__ */ jsx(Button, { variant: "primary", size: "lg", shape: "cut", shimmer: true, children: "See the products" }),
|
|
17
|
+
/* @__PURE__ */ jsx(Button, { variant: "secondary", size: "lg", shape: "cut", children: "Read the docs" })
|
|
18
|
+
] }),
|
|
19
|
+
visualLabel: "orazaka.local \u2014 console",
|
|
20
|
+
visual: /* @__PURE__ */ jsxs("div", { className: "grid gap-3 p-5", children: [
|
|
21
|
+
/* @__PURE__ */ jsx("p", { className: "font-mono text-xs text-fg-secondary", children: "$ npx orazaka install" }),
|
|
22
|
+
/* @__PURE__ */ jsx("p", { className: "font-mono text-xs text-fg-success", children: "\u2713 1,284 answers this week, none left the server" }),
|
|
23
|
+
/* @__PURE__ */ jsx(Meter, { label: "Credits", value: 3800, max: 12e3, valueText: "3,800 of 12,000", showLabel: true })
|
|
24
|
+
] }),
|
|
25
|
+
proofs: [
|
|
26
|
+
{ value: "34", label: "public repositories" },
|
|
27
|
+
{ value: "Apache-2.0", label: "every line" },
|
|
28
|
+
{ value: "0", label: "telemetry calls" }
|
|
29
|
+
],
|
|
30
|
+
featuresHeading: { eyebrow: "What we build", title: "Three products, one way of building" },
|
|
31
|
+
features: [
|
|
32
|
+
{ id: "orazaka", size: "lg", title: "Orazaka \u2014 the AI that never leaves home", text: "Chat, image, voice and video on your own server, one governed pipeline." },
|
|
33
|
+
{ id: "orochia", title: "Orochia", text: "Creators paid 90 % of what fans spend." },
|
|
34
|
+
{ id: "yazakia", title: "Yazakia", text: "Meet by talking first \u2014 coming." },
|
|
35
|
+
{ id: "blocks", size: "md", title: "Open building blocks", text: "Users, billing, notifications \u2014 on Maven Central and npm." },
|
|
36
|
+
{ id: "ui", size: "md", title: "One design system", text: "Krizaka UI, web and mobile, documented from its code." }
|
|
37
|
+
],
|
|
38
|
+
closing: { title: "Something to build together?", body: "Tell us what you need; a person answers within two days.", actions: /* @__PURE__ */ jsx(Button, { variant: "primary", size: "lg", shape: "cut", children: "Contact us" }) }
|
|
39
|
+
}
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
export {
|
|
43
|
+
LandingPageKrizaka as default
|
|
44
|
+
};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Button } from "@krizaka/ui/button";
|
|
2
|
+
import { LandingPage } from "@krizaka/ui/landing-page";
|
|
3
|
+
import { Meter } from "@krizaka/ui/meter";
|
|
4
|
+
|
|
5
|
+
// TEMPLATE — a company's landing (krizaka.com): the promise beside the product alive, a band of proofs, the features
|
|
6
|
+
// as a bento where the main one takes the room, the closing call. On a phone the window follows the words, the bento
|
|
7
|
+
// is one column, the proofs stack.
|
|
8
|
+
export default function LandingPageKrizaka() {
|
|
9
|
+
return (
|
|
10
|
+
<LandingPage
|
|
11
|
+
eyebrow="Software studio · Montréal"
|
|
12
|
+
title="Products that keep what is yours"
|
|
13
|
+
lead="Krizaka builds sovereign AI and a platform where creators are paid — open source, on your servers or ours."
|
|
14
|
+
actions={
|
|
15
|
+
<>
|
|
16
|
+
<Button variant="primary" size="lg" shape="cut" shimmer>See the products</Button>
|
|
17
|
+
<Button variant="secondary" size="lg" shape="cut">Read the docs</Button>
|
|
18
|
+
</>
|
|
19
|
+
}
|
|
20
|
+
visualLabel="orazaka.local — console"
|
|
21
|
+
visual={
|
|
22
|
+
<div className="grid gap-3 p-5">
|
|
23
|
+
<p className="font-mono text-xs text-fg-secondary">$ npx orazaka install</p>
|
|
24
|
+
<p className="font-mono text-xs text-fg-success">✓ 1,284 answers this week, none left the server</p>
|
|
25
|
+
<Meter label="Credits" value={3800} max={12000} valueText="3,800 of 12,000" showLabel />
|
|
26
|
+
</div>
|
|
27
|
+
}
|
|
28
|
+
proofs={[
|
|
29
|
+
{ value: "34", label: "public repositories" },
|
|
30
|
+
{ value: "Apache-2.0", label: "every line" },
|
|
31
|
+
{ value: "0", label: "telemetry calls" },
|
|
32
|
+
]}
|
|
33
|
+
featuresHeading={{ eyebrow: "What we build", title: "Three products, one way of building" }}
|
|
34
|
+
features={[
|
|
35
|
+
{ id: "orazaka", size: "lg", title: "Orazaka — the AI that never leaves home", text: "Chat, image, voice and video on your own server, one governed pipeline." },
|
|
36
|
+
{ id: "orochia", title: "Orochia", text: "Creators paid 90 % of what fans spend." },
|
|
37
|
+
{ id: "yazakia", title: "Yazakia", text: "Meet by talking first — coming." },
|
|
38
|
+
{ id: "blocks", size: "md", title: "Open building blocks", text: "Users, billing, notifications — on Maven Central and npm." },
|
|
39
|
+
{ id: "ui", size: "md", title: "One design system", text: "Krizaka UI, web and mobile, documented from its code." },
|
|
40
|
+
]}
|
|
41
|
+
closing={{ title: "Something to build together?", body: "Tell us what you need; a person answers within two days.", actions: <Button variant="primary" size="lg" shape="cut">Contact us</Button> }}
|
|
42
|
+
/>
|
|
43
|
+
);
|
|
44
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// registry/examples/legal-page/privacy.tsx
|
|
4
|
+
import { LegalPage } from "@krizaka/ui/legal-page";
|
|
5
|
+
import { jsx } from "react/jsx-runtime";
|
|
6
|
+
function LegalPagePrivacy() {
|
|
7
|
+
return /* @__PURE__ */ jsx(
|
|
8
|
+
LegalPage,
|
|
9
|
+
{
|
|
10
|
+
title: "Privacy policy",
|
|
11
|
+
updated: "Last updated: October 2026",
|
|
12
|
+
summary: "In short: we collect what you send us, keep it in Qu\xE9bec, never sell it, and delete it when you ask.",
|
|
13
|
+
tocLabel: "On this page",
|
|
14
|
+
sections: [
|
|
15
|
+
{ id: "collect", title: "What we collect", children: /* @__PURE__ */ jsx("p", { children: "Your email and your message, when you write to us." }) },
|
|
16
|
+
{ id: "keep", title: "Where it is kept", children: /* @__PURE__ */ jsx("p", { children: "On servers in Qu\xE9bec, encrypted at rest." }) },
|
|
17
|
+
{ id: "rights", title: "Your rights", children: /* @__PURE__ */ jsx("p", { children: "Ask for a copy or for deletion at any time; we answer within 30 days." }) }
|
|
18
|
+
]
|
|
19
|
+
}
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
export {
|
|
23
|
+
LegalPagePrivacy as default
|
|
24
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { LegalPage } from "@krizaka/ui/legal-page";
|
|
2
|
+
|
|
3
|
+
// TEMPLATE — a policy: the date in force, the short version in plain words, then the sections with their contents
|
|
4
|
+
// beside them (chips on a phone).
|
|
5
|
+
export default function LegalPagePrivacy() {
|
|
6
|
+
return (
|
|
7
|
+
<LegalPage
|
|
8
|
+
title="Privacy policy"
|
|
9
|
+
updated="Last updated: October 2026"
|
|
10
|
+
summary="In short: we collect what you send us, keep it in Québec, never sell it, and delete it when you ask."
|
|
11
|
+
tocLabel="On this page"
|
|
12
|
+
sections={[
|
|
13
|
+
{ id: "collect", title: "What we collect", children: <p>Your email and your message, when you write to us.</p> },
|
|
14
|
+
{ id: "keep", title: "Where it is kept", children: <p>On servers in Québec, encrypted at rest.</p> },
|
|
15
|
+
{ id: "rights", title: "Your rights", children: <p>Ask for a copy or for deletion at any time; we answer within 30 days.</p> },
|
|
16
|
+
]}
|
|
17
|
+
/>
|
|
18
|
+
);
|
|
19
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// registry/examples/list/native/default.tsx
|
|
4
|
+
import { Avatar, Txt } from "@krizaka/ui/native";
|
|
5
|
+
import { List } from "@krizaka/ui/native/list";
|
|
6
|
+
import { View } from "react-native";
|
|
7
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
var notifications = [
|
|
9
|
+
{ id: "n1", who: "Elena Varga", what: "tipped your video \u201CSunset over Montr\xE9al\u201D", when: "2 min" },
|
|
10
|
+
{ id: "n2", who: "Noah Petit", what: "started following you", when: "1 h" },
|
|
11
|
+
{ id: "n3", who: "Maya Chen", what: "commented: \u201CThe drone shot!\u201D", when: "3 h" }
|
|
12
|
+
];
|
|
13
|
+
function NativeListDefault() {
|
|
14
|
+
return /* @__PURE__ */ jsx(
|
|
15
|
+
List,
|
|
16
|
+
{
|
|
17
|
+
label: "Notifications",
|
|
18
|
+
data: notifications,
|
|
19
|
+
keyExtractor: (n) => n.id,
|
|
20
|
+
separator: "inset",
|
|
21
|
+
renderItem: (n) => /* @__PURE__ */ jsxs(View, { style: { flexDirection: "row", alignItems: "center", gap: 12, paddingHorizontal: 16, paddingVertical: 12 }, children: [
|
|
22
|
+
/* @__PURE__ */ jsx(Avatar, { alt: n.who, size: "md" }),
|
|
23
|
+
/* @__PURE__ */ jsxs(View, { style: { flex: 1 }, children: [
|
|
24
|
+
/* @__PURE__ */ jsx(Txt, { children: `${n.who} ${n.what}` }),
|
|
25
|
+
/* @__PURE__ */ jsx(Txt, { variant: "caption", tone: "secondary", children: n.when })
|
|
26
|
+
] })
|
|
27
|
+
] })
|
|
28
|
+
}
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
export {
|
|
32
|
+
NativeListDefault as default
|
|
33
|
+
};
|
|
Binary file
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Avatar, Txt } from "@krizaka/ui/native";
|
|
2
|
+
import { List } from "@krizaka/ui/native/list";
|
|
3
|
+
import { View } from "react-native";
|
|
4
|
+
|
|
5
|
+
type Notification = { id: string; who: string; what: string; when: string };
|
|
6
|
+
const notifications: Notification[] = [
|
|
7
|
+
{ id: "n1", who: "Elena Varga", what: "tipped your video “Sunset over Montréal”", when: "2 min" },
|
|
8
|
+
{ id: "n2", who: "Noah Petit", what: "started following you", when: "1 h" },
|
|
9
|
+
{ id: "n3", who: "Maya Chen", what: "commented: “The drone shot!”", when: "3 h" },
|
|
10
|
+
];
|
|
11
|
+
|
|
12
|
+
// A FlashList v2 with the theme's separators, inset after the avatar.
|
|
13
|
+
export default function NativeListDefault() {
|
|
14
|
+
return (
|
|
15
|
+
<List
|
|
16
|
+
label="Notifications"
|
|
17
|
+
data={notifications}
|
|
18
|
+
keyExtractor={(n) => n.id}
|
|
19
|
+
separator="inset"
|
|
20
|
+
renderItem={(n) => (
|
|
21
|
+
<View style={{ flexDirection: "row", alignItems: "center", gap: 12, paddingHorizontal: 16, paddingVertical: 12 }}>
|
|
22
|
+
<Avatar alt={n.who} size="md" />
|
|
23
|
+
<View style={{ flex: 1 }}>
|
|
24
|
+
<Txt>{`${n.who} ${n.what}`}</Txt>
|
|
25
|
+
<Txt variant="caption" tone="secondary">{n.when}</Txt>
|
|
26
|
+
</View>
|
|
27
|
+
</View>
|
|
28
|
+
)}
|
|
29
|
+
/>
|
|
30
|
+
);
|
|
31
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// registry/examples/list/native/infinite.tsx
|
|
4
|
+
import { configureKrizakaFetch, krizakaFetch, KrizakaQueryProvider } from "@krizaka/query";
|
|
5
|
+
import { Txt } from "@krizaka/ui/native";
|
|
6
|
+
import { List, useInfiniteList } from "@krizaka/ui/native/list";
|
|
7
|
+
import { useState } from "react";
|
|
8
|
+
import { jsx } from "react/jsx-runtime";
|
|
9
|
+
async function fakeApi(input) {
|
|
10
|
+
const cursor = Number(new URL(String(input), "https://api.example").searchParams.get("cursor"));
|
|
11
|
+
const items = Array.from({ length: 20 }, (_, i) => ({ id: `v${cursor + i}`, title: `Video ${cursor + i + 1}` }));
|
|
12
|
+
return Response.json({ items, next: cursor + 20 < 100 ? cursor + 20 : null });
|
|
13
|
+
}
|
|
14
|
+
function Videos() {
|
|
15
|
+
const { listProps, error } = useInfiniteList({
|
|
16
|
+
queryKey: ["videos", "feed"],
|
|
17
|
+
queryFn: ({ pageParam, signal }) => krizakaFetch("/api/videos", { query: { cursor: pageParam }, signal }),
|
|
18
|
+
initialPageParam: 0,
|
|
19
|
+
getNextPageParam: (last) => last.next,
|
|
20
|
+
getItems: (page) => page.items
|
|
21
|
+
});
|
|
22
|
+
return /* @__PURE__ */ jsx(List, { label: "Videos", ...listProps, error: error ? /* @__PURE__ */ jsx(Txt, { children: "Could not load the videos." }) : void 0, keyExtractor: (v) => v.id, renderItem: (v) => /* @__PURE__ */ jsx(Txt, { style: { padding: 16 }, children: v.title }) });
|
|
23
|
+
}
|
|
24
|
+
function NativeListInfinite() {
|
|
25
|
+
useState(() => configureKrizakaFetch({ fetch: fakeApi }));
|
|
26
|
+
return /* @__PURE__ */ jsx(KrizakaQueryProvider, { children: /* @__PURE__ */ jsx(Videos, {}) });
|
|
27
|
+
}
|
|
28
|
+
export {
|
|
29
|
+
NativeListInfinite as default
|
|
30
|
+
};
|
|
Binary file
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { configureKrizakaFetch, krizakaFetch, KrizakaQueryProvider } from "@krizaka/query";
|
|
2
|
+
import { Txt } from "@krizaka/ui/native";
|
|
3
|
+
import { List, useInfiniteList } from "@krizaka/ui/native/list";
|
|
4
|
+
import { useState } from "react";
|
|
5
|
+
|
|
6
|
+
type Page = { items: { id: string; title: string }[]; next: number | null };
|
|
7
|
+
// The API, faked in the screen: 20 videos per page, 5 pages.
|
|
8
|
+
async function fakeApi(input: RequestInfo | URL) {
|
|
9
|
+
const cursor = Number(new URL(String(input), "https://api.example").searchParams.get("cursor"));
|
|
10
|
+
const items = Array.from({ length: 20 }, (_, i) => ({ id: `v${cursor + i}`, title: `Video ${cursor + i + 1}` }));
|
|
11
|
+
return Response.json({ items, next: cursor + 20 < 100 ? cursor + 20 : null } satisfies Page);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function Videos() {
|
|
15
|
+
const { listProps, error } = useInfiniteList({
|
|
16
|
+
queryKey: ["videos", "feed"],
|
|
17
|
+
queryFn: ({ pageParam, signal }) => krizakaFetch("/api/videos", { query: { cursor: pageParam }, signal }) as Promise<Page>,
|
|
18
|
+
initialPageParam: 0,
|
|
19
|
+
getNextPageParam: (last) => last.next,
|
|
20
|
+
getItems: (page) => page.items,
|
|
21
|
+
});
|
|
22
|
+
return (
|
|
23
|
+
<List label="Videos" {...listProps} error={error ? <Txt>Could not load the videos.</Txt> : undefined} keyExtractor={(v) => v.id} renderItem={(v) => <Txt style={{ padding: 16 }}>{v.title}</Txt>} />
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// A paginated API as a list: the next page near the end, pull to refresh, the query of @krizaka/query.
|
|
28
|
+
export default function NativeListInfinite() {
|
|
29
|
+
useState(() => configureKrizakaFetch({ fetch: fakeApi as typeof fetch }));
|
|
30
|
+
return (
|
|
31
|
+
<KrizakaQueryProvider>
|
|
32
|
+
<Videos />
|
|
33
|
+
</KrizakaQueryProvider>
|
|
34
|
+
);
|
|
35
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// registry/examples/list/native/states.tsx
|
|
4
|
+
import { Button } from "@krizaka/ui/native";
|
|
5
|
+
import { List } from "@krizaka/ui/native/list";
|
|
6
|
+
import { View } from "react-native";
|
|
7
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
var NONE = [];
|
|
9
|
+
function NativeListStates() {
|
|
10
|
+
return /* @__PURE__ */ jsxs(View, { style: { gap: 24, width: "100%" }, children: [
|
|
11
|
+
/* @__PURE__ */ jsx(List, { label: "Messages", data: NONE, keyExtractor: (m) => m.id, renderItem: () => null, loading: true, loadingRows: 3 }),
|
|
12
|
+
/* @__PURE__ */ jsx(
|
|
13
|
+
List,
|
|
14
|
+
{
|
|
15
|
+
label: "Messages",
|
|
16
|
+
data: NONE,
|
|
17
|
+
keyExtractor: (m) => m.id,
|
|
18
|
+
renderItem: () => null,
|
|
19
|
+
empty: { title: "No message yet", description: "Say hello to a creator you follow.", action: /* @__PURE__ */ jsx(Button, { label: "Find creators", size: "sm" }) }
|
|
20
|
+
}
|
|
21
|
+
)
|
|
22
|
+
] });
|
|
23
|
+
}
|
|
24
|
+
export {
|
|
25
|
+
NativeListStates as default
|
|
26
|
+
};
|
|
Binary file
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Button } from "@krizaka/ui/native";
|
|
2
|
+
import { List } from "@krizaka/ui/native/list";
|
|
3
|
+
import { View } from "react-native";
|
|
4
|
+
|
|
5
|
+
const NONE: { id: string }[] = [];
|
|
6
|
+
|
|
7
|
+
// While the first page loads: skeleton rows. Nothing yet: the empty state and what to do next.
|
|
8
|
+
export default function NativeListStates() {
|
|
9
|
+
return (
|
|
10
|
+
<View style={{ gap: 24, width: "100%" }}>
|
|
11
|
+
<List label="Messages" data={NONE} keyExtractor={(m) => m.id} renderItem={() => null} loading loadingRows={3} />
|
|
12
|
+
<List
|
|
13
|
+
label="Messages"
|
|
14
|
+
data={NONE}
|
|
15
|
+
keyExtractor={(m) => m.id}
|
|
16
|
+
renderItem={() => null}
|
|
17
|
+
empty={{ title: "No message yet", description: "Say hello to a creator you follow.", action: <Button label="Find creators" size="sm" /> }}
|
|
18
|
+
/>
|
|
19
|
+
</View>
|
|
20
|
+
);
|
|
21
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// registry/examples/longform-page/story.tsx
|
|
4
|
+
import { LongformPage } from "@krizaka/ui/longform-page";
|
|
5
|
+
import { MascotQuote } from "@krizaka/ui/mascot-quote";
|
|
6
|
+
import { Mascot } from "@krizaka/ui/mascots";
|
|
7
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
function LongformPageStory() {
|
|
9
|
+
return /* @__PURE__ */ jsx(
|
|
10
|
+
LongformPage,
|
|
11
|
+
{
|
|
12
|
+
eyebrow: "Our story",
|
|
13
|
+
title: "Why a studio in Montr\xE9al builds its own AI",
|
|
14
|
+
lead: "Three products, one rule: what is yours stays yours.",
|
|
15
|
+
aside: /* @__PURE__ */ jsx(Mascot, { bird: "owl", mood: "welcome", size: 112 }),
|
|
16
|
+
chapters: [
|
|
17
|
+
{
|
|
18
|
+
id: "start",
|
|
19
|
+
title: "It started with a lease",
|
|
20
|
+
pull: "The prompt crossed the ocean before the answer came back.",
|
|
21
|
+
children: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
22
|
+
/* @__PURE__ */ jsx("p", { children: "A notary asked a chatbot to summarise a lease. The answer was good; the lease was now on someone else's server." }),
|
|
23
|
+
/* @__PURE__ */ jsx("p", { children: "We built Orazaka so that question never has to leave the office." })
|
|
24
|
+
] })
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
id: "creators",
|
|
28
|
+
title: "Then came the creators",
|
|
29
|
+
children: /* @__PURE__ */ jsx("p", { children: "Orochia pays creators 90 % of what their fans spend, every Monday \u2014 no algorithm in between." }),
|
|
30
|
+
figure: /* @__PURE__ */ jsx(MascotQuote, { bird: "flamingo", label: "The flamingo's rule", children: "Whoever does the work gets paid first." })
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
}
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
export {
|
|
37
|
+
LongformPageStory as default
|
|
38
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { LongformPage } from "@krizaka/ui/longform-page";
|
|
2
|
+
import { MascotQuote } from "@krizaka/ui/mascot-quote";
|
|
3
|
+
import { Mascot } from "@krizaka/ui/mascots";
|
|
4
|
+
|
|
5
|
+
// TEMPLATE — a long read (Krizaka's story): numbered chapters in a reading column, a sentence pulled into the margin,
|
|
6
|
+
// a bird's quote breaking out under the text. Editorial, not cards; one column on a phone.
|
|
7
|
+
export default function LongformPageStory() {
|
|
8
|
+
return (
|
|
9
|
+
<LongformPage
|
|
10
|
+
eyebrow="Our story"
|
|
11
|
+
title="Why a studio in Montréal builds its own AI"
|
|
12
|
+
lead="Three products, one rule: what is yours stays yours."
|
|
13
|
+
aside={<Mascot bird="owl" mood="welcome" size={112} />}
|
|
14
|
+
chapters={[
|
|
15
|
+
{
|
|
16
|
+
id: "start",
|
|
17
|
+
title: "It started with a lease",
|
|
18
|
+
pull: "The prompt crossed the ocean before the answer came back.",
|
|
19
|
+
children: (
|
|
20
|
+
<>
|
|
21
|
+
<p>A notary asked a chatbot to summarise a lease. The answer was good; the lease was now on someone else's server.</p>
|
|
22
|
+
<p>We built Orazaka so that question never has to leave the office.</p>
|
|
23
|
+
</>
|
|
24
|
+
),
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
id: "creators",
|
|
28
|
+
title: "Then came the creators",
|
|
29
|
+
children: <p>Orochia pays creators 90 % of what their fans spend, every Monday — no algorithm in between.</p>,
|
|
30
|
+
figure: <MascotQuote bird="flamingo" label="The flamingo's rule">Whoever does the work gets paid first.</MascotQuote>,
|
|
31
|
+
},
|
|
32
|
+
]}
|
|
33
|
+
/>
|
|
34
|
+
);
|
|
35
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// registry/examples/mascots/crane.tsx
|
|
4
|
+
import { Button } from "@krizaka/ui/button";
|
|
5
|
+
import { Mascot } from "@krizaka/ui/mascots";
|
|
6
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
function MascotCrane() {
|
|
8
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex w-96 items-center gap-4 rounded-xl border border-border-default bg-surface-1 p-4", children: [
|
|
9
|
+
/* @__PURE__ */ jsx(Mascot, { bird: "crane", mood: "welcome", size: 88 }),
|
|
10
|
+
/* @__PURE__ */ jsxs("div", { className: "flex-1", children: [
|
|
11
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-fg", children: "Take your time" }),
|
|
12
|
+
/* @__PURE__ */ jsx("p", { className: "mt-1 text-sm text-fg-secondary", children: "Say it in your own words. One question at a time." }),
|
|
13
|
+
/* @__PURE__ */ jsx(Button, { variant: "primary", size: "sm", className: "mt-3", children: "Begin" })
|
|
14
|
+
] })
|
|
15
|
+
] });
|
|
16
|
+
}
|
|
17
|
+
export {
|
|
18
|
+
MascotCrane as default
|
|
19
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Button } from "@krizaka/ui/button";
|
|
2
|
+
import { Mascot } from "@krizaka/ui/mascots";
|
|
3
|
+
|
|
4
|
+
// The crane listens: posed and unhurried — a calm opening, the words and one action beside it.
|
|
5
|
+
export default function MascotCrane() {
|
|
6
|
+
return (
|
|
7
|
+
<div className="flex w-96 items-center gap-4 rounded-xl border border-border-default bg-surface-1 p-4">
|
|
8
|
+
<Mascot bird="crane" mood="welcome" size={88} />
|
|
9
|
+
<div className="flex-1">
|
|
10
|
+
<p className="text-sm font-medium text-fg">Take your time</p>
|
|
11
|
+
<p className="mt-1 text-sm text-fg-secondary">Say it in your own words. One question at a time.</p>
|
|
12
|
+
<Button variant="primary" size="sm" className="mt-3">
|
|
13
|
+
Begin
|
|
14
|
+
</Button>
|
|
15
|
+
</div>
|
|
16
|
+
</div>
|
|
17
|
+
);
|
|
18
|
+
}
|