@krizaka/ui 3.5.0 → 3.6.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 +1 -0
- package/dist/app-shell.d.ts +24 -22
- package/dist/app-shell.js +9 -3
- package/dist/app-shell.js.map +1 -1
- package/dist/chunk-3GODX3D6.js +25 -0
- package/dist/chunk-3GODX3D6.js.map +1 -0
- package/dist/{chunk-R6SDS7JM.js → chunk-ND3L5VHT.js} +25 -2
- package/dist/chunk-ND3L5VHT.js.map +1 -0
- package/dist/command.js +1 -1
- package/dist/dialog.js +7 -3
- package/dist/dialog.js.map +1 -1
- package/dist/loader.d.ts +21 -1
- package/dist/loader.js +7 -3
- package/dist/loader.js.map +1 -1
- package/dist/map.js +7 -1
- package/dist/map.js.map +1 -1
- package/dist/marketing-layout.d.ts +3 -9
- package/dist/marketing-layout.js +24 -7
- package/dist/marketing-layout.js.map +1 -1
- package/dist/match-dialog.d.ts +3 -1
- package/dist/match-dialog.js +25 -3
- package/dist/match-dialog.js.map +1 -1
- package/dist/native.d.ts +65 -2
- package/dist/native.js +960 -878
- package/dist/native.js.map +1 -1
- package/dist/skip-link.d.ts +15 -0
- package/dist/skip-link.js +10 -0
- package/dist/skip-link.js.map +1 -0
- package/dist/tree-view.d.ts +2 -0
- package/dist/tree-view.js.map +1 -1
- package/package.json +22 -8
- package/registry/achievement.json +2 -1
- package/registry/action-bar.json +2 -1
- package/registry/action-sheet.json +1 -0
- package/registry/activity-feed.json +2 -1
- package/registry/alert.json +2 -1
- package/registry/app-shell.json +27 -5
- package/registry/argument-card.json +2 -1
- package/registry/audio-player.json +2 -1
- package/registry/auth-layout.json +7 -2
- package/registry/avatar.json +2 -1
- package/registry/badge.json +2 -1
- package/registry/button.json +2 -1
- package/registry/card-grid.json +2 -1
- package/registry/card.json +2 -1
- package/registry/catalogue-page.json +5 -2
- package/registry/changelog-page.json +5 -2
- package/registry/chat.json +2 -1
- package/registry/checkbox.json +2 -1
- package/registry/chip-link.json +2 -1
- package/registry/chip.json +2 -1
- package/registry/choice-grid.json +2 -1
- package/registry/cn.json +1 -0
- package/registry/code-block.json +2 -1
- package/registry/combobox.json +2 -1
- package/registry/command.json +2 -1
- package/registry/component-page.json +5 -2
- package/registry/confirm-button.json +2 -1
- package/registry/contact-page.json +5 -2
- package/registry/continue-prompt.json +2 -1
- package/registry/countdown.json +2 -1
- package/registry/cta-panel.json +2 -1
- package/registry/dashboard-layout.json +5 -2
- package/registry/data-table.json +2 -1
- package/registry/date-picker.json +3 -2
- package/registry/decision-list.json +2 -1
- package/registry/description-list.json +2 -1
- package/registry/detail-layout.json +16 -2
- package/registry/dialog.json +10 -4
- package/registry/docs-article-page.json +16 -2
- package/registry/docs-hub-page.json +5 -2
- package/registry/docs-layout.json +2 -1
- package/registry/dropdown-menu.json +2 -1
- package/registry/empty-state.json +14 -2
- package/registry/error-page.json +5 -2
- package/registry/examples/detail-layout/checkout.d.ts +4 -0
- package/registry/examples/detail-layout/checkout.js +37 -0
- package/registry/examples/detail-layout/checkout.tsx +44 -0
- package/registry/examples/docs-article-page/faq.d.ts +4 -0
- package/registry/examples/docs-article-page/faq.js +31 -0
- package/registry/examples/docs-article-page/faq.tsx +40 -0
- package/registry/examples/empty-state/library.d.ts +4 -0
- package/registry/examples/empty-state/library.js +25 -0
- package/registry/examples/empty-state/library.tsx +20 -0
- package/registry/examples/loader/branded.d.ts +4 -0
- package/registry/examples/loader/branded.js +12 -0
- package/registry/examples/loader/branded.tsx +7 -0
- package/registry/examples/loader/native/branded.d.ts +4 -0
- package/registry/examples/loader/native/branded.dark.png +0 -0
- package/registry/examples/loader/native/branded.js +12 -0
- package/registry/examples/loader/native/branded.light.png +0 -0
- package/registry/examples/loader/native/branded.tsx +11 -0
- package/registry/examples/longform-page/case-study.d.ts +4 -0
- package/registry/examples/longform-page/case-study.js +41 -0
- package/registry/examples/longform-page/case-study.tsx +40 -0
- package/registry/examples/pull-to-refresh/native/branded.d.ts +4 -0
- package/registry/examples/pull-to-refresh/native/branded.dark.png +0 -0
- package/registry/examples/pull-to-refresh/native/branded.js +14 -0
- package/registry/examples/pull-to-refresh/native/branded.light.png +0 -0
- package/registry/examples/pull-to-refresh/native/branded.tsx +23 -0
- package/registry/examples/screen/native/map.d.ts +4 -0
- package/registry/examples/screen/native/map.dark.png +0 -0
- package/registry/examples/screen/native/map.js +26 -0
- package/registry/examples/screen/native/map.light.png +0 -0
- package/registry/examples/screen/native/map.tsx +31 -0
- package/registry/examples/screen/native/notifications.d.ts +4 -0
- package/registry/examples/screen/native/notifications.dark.png +0 -0
- package/registry/examples/screen/native/notifications.js +21 -0
- package/registry/examples/screen/native/notifications.light.png +0 -0
- package/registry/examples/screen/native/notifications.tsx +21 -0
- package/registry/examples/skip-link/default.d.ts +4 -0
- package/registry/examples/skip-link/default.js +19 -0
- package/registry/examples/skip-link/default.tsx +12 -0
- package/registry/examples/splash-handoff/native/default.d.ts +4 -0
- package/registry/examples/splash-handoff/native/default.dark.png +0 -0
- package/registry/examples/splash-handoff/native/default.js +12 -0
- package/registry/examples/splash-handoff/native/default.light.png +0 -0
- package/registry/examples/splash-handoff/native/default.tsx +11 -0
- package/registry/examples/split-view/nearby.d.ts +4 -0
- package/registry/examples/split-view/nearby.js +33 -0
- package/registry/examples/split-view/nearby.tsx +45 -0
- package/registry/examples/split-view/notifications.d.ts +4 -0
- package/registry/examples/split-view/notifications.js +33 -0
- package/registry/examples/split-view/notifications.tsx +31 -0
- package/registry/examples/status-page/maintenance.d.ts +4 -0
- package/registry/examples/status-page/maintenance.js +29 -0
- package/registry/examples/status-page/maintenance.tsx +24 -0
- package/registry/fab.json +1 -0
- package/registry/field.json +2 -1
- package/registry/file-upload.json +3 -2
- package/registry/filter-bar.json +2 -1
- package/registry/form.json +3 -2
- package/registry/gallery-page.json +5 -2
- package/registry/glow-card.json +2 -1
- package/registry/goal-gauge.json +2 -1
- package/registry/header.json +1 -0
- package/registry/how-it-works-page.json +5 -2
- package/registry/image-cropper.json +2 -1
- package/registry/image-viewer.json +1 -0
- package/registry/index.json +469 -22
- package/registry/iso.json +2 -1
- package/registry/kanban.json +2 -1
- package/registry/kbd.json +2 -1
- package/registry/landing-page.json +5 -2
- package/registry/landscape.json +2 -1
- package/registry/legal-page.json +5 -2
- package/registry/link-card.json +2 -1
- package/registry/list.json +2 -1
- package/registry/loader.json +47 -3
- package/registry/longform-page.json +16 -2
- package/registry/map.json +4 -3
- package/registry/marketing-layout.json +13 -4
- package/registry/marquee.json +2 -1
- package/registry/mascot-quote.json +2 -1
- package/registry/mascot-state.json +2 -1
- package/registry/mascots.json +2 -1
- package/registry/match-dialog.json +17 -2
- package/registry/media-capture.json +2 -1
- package/registry/media-picker.json +1 -0
- package/registry/meter.json +2 -1
- package/registry/nav-bar.json +2 -1
- package/registry/number-ticker.json +2 -1
- package/registry/onboarding.json +1 -0
- package/registry/otp-input.json +1 -0
- package/registry/page-header.json +2 -1
- package/registry/page-hero.json +2 -1
- package/registry/page.json +2 -1
- package/registry/pagination.json +2 -1
- package/registry/permission-prompt.json +1 -0
- package/registry/photo-grid.json +2 -1
- package/registry/pointer-light.json +2 -1
- package/registry/popover.json +2 -1
- package/registry/pricing-page.json +5 -2
- package/registry/product-page.json +5 -2
- package/registry/profile-card.json +2 -1
- package/registry/progress.json +2 -1
- package/registry/promise-card.json +2 -1
- package/registry/pull-to-refresh.json +68 -4
- package/registry/radio-group.json +2 -1
- package/registry/screen.json +51 -2
- package/registry/scroll-stage.json +2 -1
- package/registry/search-field.json +2 -1
- package/registry/section-backdrop.json +2 -1
- package/registry/segmented.json +1 -0
- package/registry/separator.json +2 -1
- package/registry/settings-layout.json +5 -2
- package/registry/skeleton.json +2 -1
- package/registry/skip-link.json +122 -0
- package/registry/slider.json +2 -1
- package/registry/slot.json +2 -1
- package/registry/spinner.json +2 -1
- package/registry/splash-handoff.json +138 -0
- package/registry/split-view.json +27 -2
- package/registry/stage-banner.json +2 -1
- package/registry/stat.json +2 -1
- package/registry/status-page.json +18 -2
- package/registry/step-progress.json +2 -1
- package/registry/stepper.json +2 -1
- package/registry/swipe-deck.json +2 -1
- package/registry/swipeable-row.json +1 -0
- package/registry/switch.json +2 -1
- package/registry/tab-bar.json +1 -0
- package/registry/tabs.json +2 -1
- package/registry/tag-input.json +2 -1
- package/registry/tag-selector.json +2 -1
- package/registry/terminal-replay.json +2 -1
- package/registry/theme.json +2 -1
- package/registry/toast.json +2 -1
- package/registry/toc.json +2 -1
- package/registry/tooltip.json +2 -1
- package/registry/tree-view.json +10 -4
- package/registry/txt.json +1 -0
- package/registry/verified-badge.json +2 -1
- package/registry/video-player.json +2 -1
- package/registry/video-trimmer.json +2 -1
- package/registry/virtual.json +2 -1
- package/dist/chunk-R6SDS7JM.js.map +0 -1
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { Button } from "@krizaka/ui/button";
|
|
4
|
+
import { Chip } from "@krizaka/ui/chip";
|
|
5
|
+
import { DetailLayout } from "@krizaka/ui/detail-layout";
|
|
6
|
+
import { Field, Textarea } from "@krizaka/ui/field";
|
|
7
|
+
import { Stat } from "@krizaka/ui/stat";
|
|
8
|
+
import * as React from "react";
|
|
9
|
+
|
|
10
|
+
const AMOUNTS = [3, 5, 10, 20];
|
|
11
|
+
|
|
12
|
+
// TEMPLATE — tipping a creator (Orochia): who is paid, the amount in one tap, an optional word, the summary beside the
|
|
13
|
+
// action — under the form on a phone, where the pay button stays last. The total is always said before the button.
|
|
14
|
+
export default function DetailLayoutCheckout() {
|
|
15
|
+
const [amount, setAmount] = React.useState("5");
|
|
16
|
+
return (
|
|
17
|
+
<div className="brand-orochia w-full">
|
|
18
|
+
<DetailLayout
|
|
19
|
+
back={<a href="#elena">← Elena's page</a>}
|
|
20
|
+
eyebrow="Tip"
|
|
21
|
+
title="Say thanks to Elena"
|
|
22
|
+
meta="She keeps 90 %. Paid out every Monday."
|
|
23
|
+
aside={
|
|
24
|
+
<div className="flex flex-col gap-4 rounded-xl border border-border-default bg-surface-1 p-4">
|
|
25
|
+
<Stat label="You pay" value={`€${amount}`} hint="no fee added on top" />
|
|
26
|
+
<Button variant="primary" shape="cut" className="w-full">{`Tip €${amount}`}</Button>
|
|
27
|
+
</div>
|
|
28
|
+
}
|
|
29
|
+
>
|
|
30
|
+
<form className="flex max-w-lg flex-col gap-5" onSubmit={(e) => e.preventDefault()}>
|
|
31
|
+
<Chip.Group type="single" label="Amount" value={amount} onValueChange={(v) => v && setAmount(v)} required>
|
|
32
|
+
{AMOUNTS.map((a) => (
|
|
33
|
+
<Chip key={a} value={String(a)}>{`€${a}`}</Chip>
|
|
34
|
+
))}
|
|
35
|
+
</Chip.Group>
|
|
36
|
+
<Field.Root>
|
|
37
|
+
<Field.Label htmlFor="note">A word for her (optional)</Field.Label>
|
|
38
|
+
<Textarea id="note" rows={3} placeholder="The rooftop scene was incredible." />
|
|
39
|
+
</Field.Root>
|
|
40
|
+
</form>
|
|
41
|
+
</DetailLayout>
|
|
42
|
+
</div>
|
|
43
|
+
);
|
|
44
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// registry/examples/docs-article-page/faq.tsx
|
|
4
|
+
import { DocsArticlePage } from "@krizaka/ui/docs-article-page";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
var QUESTIONS = [
|
|
7
|
+
{ id: "cloud", q: "Does anything leave my server?", a: "No. Requests are answered by models on your machine; the only calls out are the ones you configure yourself." },
|
|
8
|
+
{ id: "models", q: "Which models can I run?", a: "Any model your hardware can hold. Orazaka lists the ones that fit before you download them." },
|
|
9
|
+
{ id: "price", q: "How is it priced?", a: "A plan with a monthly credit allowance. Credits are spent per job, and what is left is always shown." }
|
|
10
|
+
];
|
|
11
|
+
function DocsArticlePageFaq() {
|
|
12
|
+
return /* @__PURE__ */ jsx(
|
|
13
|
+
DocsArticlePage,
|
|
14
|
+
{
|
|
15
|
+
className: "brand-orazaka pt-6",
|
|
16
|
+
sidebarLabel: "Pages of the documentation",
|
|
17
|
+
sidebar: /* @__PURE__ */ jsx("nav", { "aria-label": "Orazaka documentation", children: /* @__PURE__ */ jsx("ul", { className: "flex flex-col gap-1 text-sm", children: ["Getting started", "The CLI", "Questions"].map((p) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx("a", { href: `#${p}`, "aria-current": p === "Questions" ? "page" : void 0, className: "block rounded-md px-3 py-2 text-fg-secondary no-underline hover:bg-surface-2 aria-[current=page]:bg-accent-soft aria-[current=page]:text-fg", children: p }) }, p)) }) }),
|
|
18
|
+
breadcrumb: [{ href: "#docs", label: "Docs" }, { href: "#orazaka", label: "Orazaka" }],
|
|
19
|
+
title: "Questions, answered",
|
|
20
|
+
lead: "What people ask before they install.",
|
|
21
|
+
toc: { label: "Questions", items: QUESTIONS.map((x) => ({ id: x.id, label: x.q })) },
|
|
22
|
+
children: QUESTIONS.map((x) => /* @__PURE__ */ jsxs("details", { id: x.id, className: "group border-b border-border-subtle py-3", children: [
|
|
23
|
+
/* @__PURE__ */ jsx("summary", { className: "cursor-pointer rounded-md py-1 font-semibold text-fg focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring", children: x.q }),
|
|
24
|
+
/* @__PURE__ */ jsx("p", { className: "mt-2 text-fg-secondary", children: x.a })
|
|
25
|
+
] }, x.id))
|
|
26
|
+
}
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
export {
|
|
30
|
+
DocsArticlePageFaq as default
|
|
31
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { DocsArticlePage } from "@krizaka/ui/docs-article-page";
|
|
2
|
+
|
|
3
|
+
const QUESTIONS = [
|
|
4
|
+
{ id: "cloud", q: "Does anything leave my server?", a: "No. Requests are answered by models on your machine; the only calls out are the ones you configure yourself." },
|
|
5
|
+
{ id: "models", q: "Which models can I run?", a: "Any model your hardware can hold. Orazaka lists the ones that fit before you download them." },
|
|
6
|
+
{ id: "price", q: "How is it priced?", a: "A plan with a monthly credit allowance. Credits are spent per job, and what is left is always shown." },
|
|
7
|
+
];
|
|
8
|
+
|
|
9
|
+
// TEMPLATE — a FAQ: the questions as a list of disclosures, each answer one short paragraph, the contents beside them.
|
|
10
|
+
// Open by the address (`#price`), reachable by keyboard; one column on a phone.
|
|
11
|
+
export default function DocsArticlePageFaq() {
|
|
12
|
+
return (
|
|
13
|
+
<DocsArticlePage
|
|
14
|
+
className="brand-orazaka pt-6"
|
|
15
|
+
sidebarLabel="Pages of the documentation"
|
|
16
|
+
sidebar={
|
|
17
|
+
<nav aria-label="Orazaka documentation">
|
|
18
|
+
<ul className="flex flex-col gap-1 text-sm">
|
|
19
|
+
{["Getting started", "The CLI", "Questions"].map((p) => (
|
|
20
|
+
<li key={p}>
|
|
21
|
+
<a href={`#${p}`} aria-current={p === "Questions" ? "page" : undefined} className="block rounded-md px-3 py-2 text-fg-secondary no-underline hover:bg-surface-2 aria-[current=page]:bg-accent-soft aria-[current=page]:text-fg">{p}</a>
|
|
22
|
+
</li>
|
|
23
|
+
))}
|
|
24
|
+
</ul>
|
|
25
|
+
</nav>
|
|
26
|
+
}
|
|
27
|
+
breadcrumb={[{ href: "#docs", label: "Docs" }, { href: "#orazaka", label: "Orazaka" }]}
|
|
28
|
+
title="Questions, answered"
|
|
29
|
+
lead="What people ask before they install."
|
|
30
|
+
toc={{ label: "Questions", items: QUESTIONS.map((x) => ({ id: x.id, label: x.q })) }}
|
|
31
|
+
>
|
|
32
|
+
{QUESTIONS.map((x) => (
|
|
33
|
+
<details key={x.id} id={x.id} className="group border-b border-border-subtle py-3">
|
|
34
|
+
<summary className="cursor-pointer rounded-md py-1 font-semibold text-fg focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring">{x.q}</summary>
|
|
35
|
+
<p className="mt-2 text-fg-secondary">{x.a}</p>
|
|
36
|
+
</details>
|
|
37
|
+
))}
|
|
38
|
+
</DocsArticlePage>
|
|
39
|
+
);
|
|
40
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// registry/examples/empty-state/library.tsx
|
|
4
|
+
import { Button } from "@krizaka/ui/button";
|
|
5
|
+
import { EmptyState } from "@krizaka/ui/empty-state";
|
|
6
|
+
import { Mascot } from "@krizaka/ui/mascots";
|
|
7
|
+
import { Page } from "@krizaka/ui/page";
|
|
8
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
function EmptyStateLibrary() {
|
|
10
|
+
return /* @__PURE__ */ jsxs(Page, { className: "brand-orochia", children: [
|
|
11
|
+
/* @__PURE__ */ jsx("h1", { className: "font-display text-2xl font-extrabold tracking-tight text-fg", children: "Library" }),
|
|
12
|
+
/* @__PURE__ */ jsx(
|
|
13
|
+
EmptyState,
|
|
14
|
+
{
|
|
15
|
+
icon: /* @__PURE__ */ jsx(Mascot, { bird: "flamingo", mood: "empty", size: 96 }),
|
|
16
|
+
title: "Nothing here yet",
|
|
17
|
+
description: "Your videos, once published, wait here with their sales. The first one takes about ten minutes.",
|
|
18
|
+
action: /* @__PURE__ */ jsx(Button, { variant: "primary", shape: "cut", children: "Publish a first video" })
|
|
19
|
+
}
|
|
20
|
+
)
|
|
21
|
+
] });
|
|
22
|
+
}
|
|
23
|
+
export {
|
|
24
|
+
EmptyStateLibrary as default
|
|
25
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Button } from "@krizaka/ui/button";
|
|
2
|
+
import { EmptyState } from "@krizaka/ui/empty-state";
|
|
3
|
+
import { Mascot } from "@krizaka/ui/mascots";
|
|
4
|
+
import { Page } from "@krizaka/ui/page";
|
|
5
|
+
|
|
6
|
+
// TEMPLATE — a page with nothing in it yet (a creator's library): the page keeps its title and place, the bird says it is
|
|
7
|
+
// empty, one sentence tells what will fill it, one button does the first thing. Never a blank screen.
|
|
8
|
+
export default function EmptyStateLibrary() {
|
|
9
|
+
return (
|
|
10
|
+
<Page className="brand-orochia">
|
|
11
|
+
<h1 className="font-display text-2xl font-extrabold tracking-tight text-fg">Library</h1>
|
|
12
|
+
<EmptyState
|
|
13
|
+
icon={<Mascot bird="flamingo" mood="empty" size={96} />}
|
|
14
|
+
title="Nothing here yet"
|
|
15
|
+
description="Your videos, once published, wait here with their sales. The first one takes about ten minutes."
|
|
16
|
+
action={<Button variant="primary" shape="cut">Publish a first video</Button>}
|
|
17
|
+
/>
|
|
18
|
+
</Page>
|
|
19
|
+
);
|
|
20
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// registry/examples/loader/branded.tsx
|
|
4
|
+
import { OrochiaLogo } from "@krizaka/ui";
|
|
5
|
+
import { Loader } from "@krizaka/ui/loader";
|
|
6
|
+
import { jsx } from "react/jsx-runtime";
|
|
7
|
+
function LoaderBranded() {
|
|
8
|
+
return /* @__PURE__ */ jsx(Loader, { label: "Loading your videos", delay: 0, variant: "block", mark: /* @__PURE__ */ jsx(OrochiaLogo, { animated: true }) });
|
|
9
|
+
}
|
|
10
|
+
export {
|
|
11
|
+
LoaderBranded as default
|
|
12
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { OrochiaLogo } from "@krizaka/ui";
|
|
2
|
+
import { Loader } from "@krizaka/ui/loader";
|
|
3
|
+
|
|
4
|
+
// The product's mark in place of the Krizaka glyph: Orochia waits with its own animated mark. Words, delay and ending stay.
|
|
5
|
+
export default function LoaderBranded() {
|
|
6
|
+
return <Loader label="Loading your videos" delay={0} variant="block" mark={<OrochiaLogo animated />} />;
|
|
7
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// registry/examples/loader/native/branded.tsx
|
|
4
|
+
import { Loader } from "@krizaka/ui/native";
|
|
5
|
+
import { View } from "react-native";
|
|
6
|
+
import { jsx } from "react/jsx-runtime";
|
|
7
|
+
function NativeLoaderBranded() {
|
|
8
|
+
return /* @__PURE__ */ jsx(View, { style: { width: 340 }, children: /* @__PURE__ */ jsx(Loader, { label: "Loading your videos", product: "orochia", variant: "block", delay: 0 }) });
|
|
9
|
+
}
|
|
10
|
+
export {
|
|
11
|
+
NativeLoaderBranded as default
|
|
12
|
+
};
|
|
Binary file
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Loader } from "@krizaka/ui/native";
|
|
2
|
+
import { View } from "react-native";
|
|
3
|
+
|
|
4
|
+
// The app's own mark waits for you: the animated `ProductMark` of Orochia, still when the system reduces motion.
|
|
5
|
+
export default function NativeLoaderBranded() {
|
|
6
|
+
return (
|
|
7
|
+
<View style={{ width: 340 }}>
|
|
8
|
+
<Loader label="Loading your videos" product="orochia" variant="block" delay={0} />
|
|
9
|
+
</View>
|
|
10
|
+
);
|
|
11
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// registry/examples/longform-page/case-study.tsx
|
|
4
|
+
import { LongformPage } from "@krizaka/ui/longform-page";
|
|
5
|
+
import { Stat } from "@krizaka/ui/stat";
|
|
6
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
function LongformPageCaseStudy() {
|
|
8
|
+
return /* @__PURE__ */ jsx(
|
|
9
|
+
LongformPage,
|
|
10
|
+
{
|
|
11
|
+
brand: "orazaka",
|
|
12
|
+
eyebrow: "Case study \xB7 Notary",
|
|
13
|
+
title: "Eleven leases a day, none of them leaving the office",
|
|
14
|
+
lead: "A four-person firm in Laval summarises contracts with its own AI, on its own server.",
|
|
15
|
+
chapters: [
|
|
16
|
+
{
|
|
17
|
+
id: "before",
|
|
18
|
+
title: "Before",
|
|
19
|
+
pull: "The summary took twenty minutes. The cloud tools took the lease with them.",
|
|
20
|
+
children: /* @__PURE__ */ jsx("p", { children: "Each lease was read twice by hand. Pasting it into a public chatbot was faster, and not an option." })
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
id: "after",
|
|
24
|
+
title: "What changed",
|
|
25
|
+
children: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
26
|
+
/* @__PURE__ */ jsx("p", { children: "Orazaka runs on a Mac mini in the back room. A pack reads the lease and drafts the summary; the notary signs it." }),
|
|
27
|
+
/* @__PURE__ */ jsx("p", { children: "Nothing is sent outside the building, and every request is logged for the audit." })
|
|
28
|
+
] }),
|
|
29
|
+
figure: /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-3", children: [
|
|
30
|
+
/* @__PURE__ */ jsx(Stat, { label: "Per lease", value: "2 min", trend: "down", trendLabel: "was 20 min" }),
|
|
31
|
+
/* @__PURE__ */ jsx(Stat, { label: "Sent outside", value: "0", hint: "all answered locally" }),
|
|
32
|
+
/* @__PURE__ */ jsx(Stat, { label: "Hours a week", value: "14", trend: "up", trendLabel: "given back" })
|
|
33
|
+
] })
|
|
34
|
+
}
|
|
35
|
+
]
|
|
36
|
+
}
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
export {
|
|
40
|
+
LongformPageCaseStudy as default
|
|
41
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { LongformPage } from "@krizaka/ui/longform-page";
|
|
2
|
+
import { Stat } from "@krizaka/ui/stat";
|
|
3
|
+
|
|
4
|
+
// TEMPLATE — a case study (a notary's office on Orazaka): the situation, what was done, the figures that prove it. Chapters
|
|
5
|
+
// in a reading column, the result as a figure that breaks out of the column; one column on a phone.
|
|
6
|
+
export default function LongformPageCaseStudy() {
|
|
7
|
+
return (
|
|
8
|
+
<LongformPage
|
|
9
|
+
brand="orazaka"
|
|
10
|
+
eyebrow="Case study · Notary"
|
|
11
|
+
title="Eleven leases a day, none of them leaving the office"
|
|
12
|
+
lead="A four-person firm in Laval summarises contracts with its own AI, on its own server."
|
|
13
|
+
chapters={[
|
|
14
|
+
{
|
|
15
|
+
id: "before",
|
|
16
|
+
title: "Before",
|
|
17
|
+
pull: "The summary took twenty minutes. The cloud tools took the lease with them.",
|
|
18
|
+
children: <p>Each lease was read twice by hand. Pasting it into a public chatbot was faster, and not an option.</p>,
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
id: "after",
|
|
22
|
+
title: "What changed",
|
|
23
|
+
children: (
|
|
24
|
+
<>
|
|
25
|
+
<p>Orazaka runs on a Mac mini in the back room. A pack reads the lease and drafts the summary; the notary signs it.</p>
|
|
26
|
+
<p>Nothing is sent outside the building, and every request is logged for the audit.</p>
|
|
27
|
+
</>
|
|
28
|
+
),
|
|
29
|
+
figure: (
|
|
30
|
+
<div className="grid grid-cols-1 gap-4 sm:grid-cols-3">
|
|
31
|
+
<Stat label="Per lease" value="2 min" trend="down" trendLabel="was 20 min" />
|
|
32
|
+
<Stat label="Sent outside" value="0" hint="all answered locally" />
|
|
33
|
+
<Stat label="Hours a week" value="14" trend="up" trendLabel="given back" />
|
|
34
|
+
</div>
|
|
35
|
+
),
|
|
36
|
+
},
|
|
37
|
+
]}
|
|
38
|
+
/>
|
|
39
|
+
);
|
|
40
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// registry/examples/pull-to-refresh/native/branded.tsx
|
|
4
|
+
import { BrandedRefresh, Txt } from "@krizaka/ui/native";
|
|
5
|
+
import { useState } from "react";
|
|
6
|
+
import { ScrollView, View } from "react-native";
|
|
7
|
+
import { jsx } from "react/jsx-runtime";
|
|
8
|
+
function NativePullToRefreshBranded() {
|
|
9
|
+
const [refreshing, setRefreshing] = useState(true);
|
|
10
|
+
return /* @__PURE__ */ jsx(View, { style: { width: 360, height: 240 }, children: /* @__PURE__ */ jsx(BrandedRefresh, { product: "orochia", refreshing, onRefresh: () => setRefreshing(true), label: "Refreshing your videos", children: (scroll) => /* @__PURE__ */ jsx(ScrollView, { ...scroll, contentContainerStyle: { paddingTop: 56 }, children: ["Sunset session \xB7 Elena \xB7 2.4K views", "Acoustic dare \xB7 Alex \xB7 918 views"].map((line) => /* @__PURE__ */ jsx(Txt, { style: { padding: 16 }, children: line }, line)) }) }) });
|
|
11
|
+
}
|
|
12
|
+
export {
|
|
13
|
+
NativePullToRefreshBranded as default
|
|
14
|
+
};
|
|
Binary file
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { BrandedRefresh, Txt } from "@krizaka/ui/native";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { ScrollView, View } from "react-native";
|
|
4
|
+
|
|
5
|
+
// The product's mark as the pull: it grows into place as you pull and turns while it refreshes.
|
|
6
|
+
export default function NativePullToRefreshBranded() {
|
|
7
|
+
const [refreshing, setRefreshing] = useState(true);
|
|
8
|
+
return (
|
|
9
|
+
<View style={{ width: 360, height: 240 }}>
|
|
10
|
+
<BrandedRefresh product="orochia" refreshing={refreshing} onRefresh={() => setRefreshing(true)} label="Refreshing your videos">
|
|
11
|
+
{(scroll) => (
|
|
12
|
+
<ScrollView {...scroll} contentContainerStyle={{ paddingTop: 56 }}>
|
|
13
|
+
{["Sunset session · Elena · 2.4K views", "Acoustic dare · Alex · 918 views"].map((line) => (
|
|
14
|
+
<Txt key={line} style={{ padding: 16 }}>
|
|
15
|
+
{line}
|
|
16
|
+
</Txt>
|
|
17
|
+
))}
|
|
18
|
+
</ScrollView>
|
|
19
|
+
)}
|
|
20
|
+
</BrandedRefresh>
|
|
21
|
+
</View>
|
|
22
|
+
);
|
|
23
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// registry/examples/screen/native/map.tsx
|
|
4
|
+
import { Button, Header, Screen, Sheet, Txt } from "@krizaka/ui/native";
|
|
5
|
+
import { Map, Marker } from "@krizaka/ui/native/map";
|
|
6
|
+
import { useState } from "react";
|
|
7
|
+
import { View } from "react-native";
|
|
8
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
var SPOTS = [
|
|
10
|
+
{ id: "olimpico", label: "Caf\xE9 Olimpico", where: "Mile End \xB7 450 m", position: [-73.6005, 45.5229] },
|
|
11
|
+
{ id: "parc", label: "Parc La Fontaine", where: "Plateau \xB7 2 km", position: [-73.5695, 45.5268] },
|
|
12
|
+
{ id: "talon", label: "March\xE9 Jean-Talon", where: "Little Italy \xB7 1.2 km", position: [-73.6147, 45.5363] }
|
|
13
|
+
];
|
|
14
|
+
function NativeScreenMap() {
|
|
15
|
+
const [open, setOpen] = useState(null);
|
|
16
|
+
return /* @__PURE__ */ jsxs(View, { style: { width: 360, height: 640 }, children: [
|
|
17
|
+
/* @__PURE__ */ jsx(Screen, { header: /* @__PURE__ */ jsx(Header, { title: "Pick-up points", subtitle: "Near Mile End" }), scroll: false, padding: 0, children: /* @__PURE__ */ jsx(Map, { label: "Pick-up points in Montr\xE9al", center: [-73.59, 45.527], zoom: 12.5, style: { flex: 1 }, children: SPOTS.map((s) => /* @__PURE__ */ jsx(Marker, { position: s.position, label: s.label, selected: open?.id === s.id, onPress: () => setOpen(s) }, s.id)) }) }),
|
|
18
|
+
/* @__PURE__ */ jsxs(Sheet, { open: Boolean(open), onOpenChange: (o) => !o && setOpen(null), title: open?.label, children: [
|
|
19
|
+
/* @__PURE__ */ jsx(Txt, { tone: "secondary", children: open?.where }),
|
|
20
|
+
/* @__PURE__ */ jsx(Button, { label: "Pick up here", variant: "primary", onPress: () => setOpen(null) })
|
|
21
|
+
] })
|
|
22
|
+
] });
|
|
23
|
+
}
|
|
24
|
+
export {
|
|
25
|
+
NativeScreenMap as default
|
|
26
|
+
};
|
|
Binary file
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Button, Header, Screen, Sheet, Txt } from "@krizaka/ui/native";
|
|
2
|
+
import { Map, Marker } from "@krizaka/ui/native/map";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { View } from "react-native";
|
|
5
|
+
|
|
6
|
+
const SPOTS = [
|
|
7
|
+
{ id: "olimpico", label: "Café Olimpico", where: "Mile End · 450 m", position: [-73.6005, 45.5229] as const },
|
|
8
|
+
{ id: "parc", label: "Parc La Fontaine", where: "Plateau · 2 km", position: [-73.5695, 45.5268] as const },
|
|
9
|
+
{ id: "talon", label: "Marché Jean-Talon", where: "Little Italy · 1.2 km", position: [-73.6147, 45.5363] as const },
|
|
10
|
+
];
|
|
11
|
+
|
|
12
|
+
// A map-centric screen: the map fills the screen under a header, a marker pressed opens its place in a bottom sheet
|
|
13
|
+
// with the one action; every marker is also a named button, so the places are read as a list.
|
|
14
|
+
export default function NativeScreenMap() {
|
|
15
|
+
const [open, setOpen] = useState<(typeof SPOTS)[number] | null>(null);
|
|
16
|
+
return (
|
|
17
|
+
<View style={{ width: 360, height: 640 }}>
|
|
18
|
+
<Screen header={<Header title="Pick-up points" subtitle="Near Mile End" />} scroll={false} padding={0}>
|
|
19
|
+
<Map label="Pick-up points in Montréal" center={[-73.59, 45.527]} zoom={12.5} style={{ flex: 1 }}>
|
|
20
|
+
{SPOTS.map((s) => (
|
|
21
|
+
<Marker key={s.id} position={s.position} label={s.label} selected={open?.id === s.id} onPress={() => setOpen(s)} />
|
|
22
|
+
))}
|
|
23
|
+
</Map>
|
|
24
|
+
</Screen>
|
|
25
|
+
<Sheet open={Boolean(open)} onOpenChange={(o) => !o && setOpen(null)} title={open?.label}>
|
|
26
|
+
<Txt tone="secondary">{open?.where}</Txt>
|
|
27
|
+
<Button label="Pick up here" variant="primary" onPress={() => setOpen(null)} />
|
|
28
|
+
</Sheet>
|
|
29
|
+
</View>
|
|
30
|
+
);
|
|
31
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// registry/examples/screen/native/notifications.tsx
|
|
4
|
+
import { ActivityFeed, Button, Header, Screen } from "@krizaka/ui/native";
|
|
5
|
+
import { View } from "react-native";
|
|
6
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
var EVENTS = [
|
|
8
|
+
{ id: "e1", at: "2026-10-13T09:40:00Z", title: "Mina unlocked \u201CNight shoot, part 2\u201D", tone: "success" },
|
|
9
|
+
{ id: "e2", at: "2026-10-13T08:15:00Z", title: "Your payout of \u20AC120 was sent", tone: "info" },
|
|
10
|
+
{ id: "e3", at: "2026-10-12T19:02:00Z", title: "L\xE9a bid \u20AC25 on the auction", tone: "accent" },
|
|
11
|
+
{ id: "e4", at: "2026-10-12T11:30:00Z", title: "Clip job failed", description: "The source is too short", tone: "danger" }
|
|
12
|
+
];
|
|
13
|
+
function NativeScreenNotifications() {
|
|
14
|
+
return /* @__PURE__ */ jsx(View, { style: { width: 360, height: 640 }, children: /* @__PURE__ */ jsxs(Screen, { header: /* @__PURE__ */ jsx(Header, { title: "Notifications", subtitle: "2 new" }), children: [
|
|
15
|
+
/* @__PURE__ */ jsx(Button, { label: "Mark all as read", variant: "ghost", size: "sm" }),
|
|
16
|
+
/* @__PURE__ */ jsx(ActivityFeed, { "aria-label": "Notifications", events: EVENTS, now: /* @__PURE__ */ new Date("2026-10-13T10:00:00Z") })
|
|
17
|
+
] }) });
|
|
18
|
+
}
|
|
19
|
+
export {
|
|
20
|
+
NativeScreenNotifications as default
|
|
21
|
+
};
|
|
Binary file
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ActivityFeed, Button, Header, Screen } from "@krizaka/ui/native";
|
|
2
|
+
import { View } from "react-native";
|
|
3
|
+
|
|
4
|
+
const EVENTS = [
|
|
5
|
+
{ id: "e1", at: "2026-10-13T09:40:00Z", title: "Mina unlocked “Night shoot, part 2”", tone: "success" as const },
|
|
6
|
+
{ id: "e2", at: "2026-10-13T08:15:00Z", title: "Your payout of €120 was sent", tone: "info" as const },
|
|
7
|
+
{ id: "e3", at: "2026-10-12T19:02:00Z", title: "Léa bid €25 on the auction", tone: "accent" as const },
|
|
8
|
+
{ id: "e4", at: "2026-10-12T11:30:00Z", title: "Clip job failed", description: "The source is too short", tone: "danger" as const },
|
|
9
|
+
];
|
|
10
|
+
|
|
11
|
+
// A notifications centre: what happened, newest first, grouped by day; marking all as read is a button, never a hidden gesture.
|
|
12
|
+
export default function NativeScreenNotifications() {
|
|
13
|
+
return (
|
|
14
|
+
<View style={{ width: 360, height: 640 }}>
|
|
15
|
+
<Screen header={<Header title="Notifications" subtitle="2 new" />}>
|
|
16
|
+
<Button label="Mark all as read" variant="ghost" size="sm" />
|
|
17
|
+
<ActivityFeed aria-label="Notifications" events={EVENTS} now={new Date("2026-10-13T10:00:00Z")} />
|
|
18
|
+
</Screen>
|
|
19
|
+
</View>
|
|
20
|
+
);
|
|
21
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// registry/examples/skip-link/default.tsx
|
|
4
|
+
import { SkipLink } from "@krizaka/ui/skip-link";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
function SkipLinkDefault() {
|
|
7
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3", children: [
|
|
8
|
+
/* @__PURE__ */ jsx(SkipLink, { href: "#skip-link-content", children: "Skip to content" }),
|
|
9
|
+
/* @__PURE__ */ jsxs("nav", { "aria-label": "Main", className: "flex gap-4 text-sm", children: [
|
|
10
|
+
/* @__PURE__ */ jsx("a", { href: "#home", children: "Home" }),
|
|
11
|
+
/* @__PURE__ */ jsx("a", { href: "#docs", children: "Docs" }),
|
|
12
|
+
/* @__PURE__ */ jsx("a", { href: "#contact", children: "Contact" })
|
|
13
|
+
] }),
|
|
14
|
+
/* @__PURE__ */ jsx("main", { id: "skip-link-content", className: "rounded-lg border border-border-default p-4 text-sm text-fg-secondary", children: "The content starts here." })
|
|
15
|
+
] });
|
|
16
|
+
}
|
|
17
|
+
export {
|
|
18
|
+
SkipLinkDefault as default
|
|
19
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { SkipLink } from "@krizaka/ui/skip-link";
|
|
2
|
+
|
|
3
|
+
// Press Tab: the link appears, Enter lands on the content. Put it first in the shell, label already translated.
|
|
4
|
+
export default function SkipLinkDefault() {
|
|
5
|
+
return (
|
|
6
|
+
<div className="flex flex-col gap-3">
|
|
7
|
+
<SkipLink href="#skip-link-content">Skip to content</SkipLink>
|
|
8
|
+
<nav aria-label="Main" className="flex gap-4 text-sm"><a href="#home">Home</a><a href="#docs">Docs</a><a href="#contact">Contact</a></nav>
|
|
9
|
+
<main id="skip-link-content" className="rounded-lg border border-border-default p-4 text-sm text-fg-secondary">The content starts here.</main>
|
|
10
|
+
</div>
|
|
11
|
+
);
|
|
12
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// registry/examples/splash-handoff/native/default.tsx
|
|
4
|
+
import { SplashHandoff } from "@krizaka/ui/native";
|
|
5
|
+
import { View } from "react-native";
|
|
6
|
+
import { jsx } from "react/jsx-runtime";
|
|
7
|
+
function NativeSplashHandoffDefault() {
|
|
8
|
+
return /* @__PURE__ */ jsx(View, { style: { width: 360, height: 640 }, children: /* @__PURE__ */ jsx(SplashHandoff, { product: "orochia", ready: false, label: "Orochia is opening" }) });
|
|
9
|
+
}
|
|
10
|
+
export {
|
|
11
|
+
NativeSplashHandoffDefault as default
|
|
12
|
+
};
|
|
Binary file
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { SplashHandoff } from "@krizaka/ui/native";
|
|
2
|
+
import { View } from "react-native";
|
|
3
|
+
|
|
4
|
+
// Over the app's root: the mark sits where the native splash icon was; `ready` (the session and fonts loaded) dissolves it.
|
|
5
|
+
export default function NativeSplashHandoffDefault() {
|
|
6
|
+
return (
|
|
7
|
+
<View style={{ width: 360, height: 640 }}>
|
|
8
|
+
<SplashHandoff product="orochia" ready={false} label="Orochia is opening" />
|
|
9
|
+
</View>
|
|
10
|
+
);
|
|
11
|
+
}
|