@krizaka/ui 3.5.0 → 3.7.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/chat.js +2 -1
- package/dist/chat.js.map +1 -1
- package/dist/chunk-3GODX3D6.js +25 -0
- package/dist/chunk-3GODX3D6.js.map +1 -0
- package/dist/{chunk-F2GKFIYK.js → chunk-CURW36FI.js} +1 -1
- package/dist/chunk-JXLDUDTD.js +2 -0
- package/dist/chunk-JXLDUDTD.js.map +1 -0
- package/dist/{chunk-R6SDS7JM.js → chunk-ND3L5VHT.js} +25 -2
- package/dist/chunk-ND3L5VHT.js.map +1 -0
- package/dist/chunk-NPF3OHE2.js +2 -0
- package/dist/chunk-NPF3OHE2.js.map +1 -0
- package/dist/{chunk-ECSCA3CN.js → chunk-UOMP6VOZ.js} +1 -1
- package/dist/command.js +1 -1
- package/dist/data-table.js +2 -1
- package/dist/data-table.js.map +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 +29 -5
- package/dist/match-dialog.js.map +1 -1
- package/dist/native/vertical-video.d.ts +102 -0
- package/dist/native/vertical-video.js +163 -0
- package/dist/native/vertical-video.js.map +1 -0
- 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/dist/vertical-video.d.ts +112 -0
- package/dist/vertical-video.js +307 -0
- package/dist/vertical-video.js.map +1 -0
- package/package.json +56 -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 +7 -6
- 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/avatar/group.js +4 -7
- package/registry/examples/avatar/group.tsx +4 -11
- package/registry/examples/avatar/native/group.dark.png +0 -0
- package/registry/examples/avatar/native/group.js +4 -4
- package/registry/examples/avatar/native/group.light.png +0 -0
- package/registry/examples/avatar/native/group.tsx +4 -4
- package/registry/examples/avatar/native/presence.dark.png +0 -0
- package/registry/examples/avatar/native/presence.js +8 -5
- package/registry/examples/avatar/native/presence.light.png +0 -0
- package/registry/examples/avatar/native/presence.tsx +9 -5
- package/registry/examples/avatar/with-image.js +1 -4
- package/registry/examples/avatar/with-image.tsx +2 -9
- 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/profile-card/creator.js +2 -2
- package/registry/examples/profile-card/creator.tsx +2 -2
- package/registry/examples/profile-card/match.js +2 -2
- package/registry/examples/profile-card/match.tsx +2 -2
- package/registry/examples/profile-card/native/default.dark.png +0 -0
- package/registry/examples/profile-card/native/default.js +2 -2
- package/registry/examples/profile-card/native/default.light.png +0 -0
- package/registry/examples/profile-card/native/default.tsx +2 -2
- 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/app-shell.dark.png +0 -0
- package/registry/examples/screen/native/app-shell.js +1 -1
- package/registry/examples/screen/native/app-shell.light.png +0 -0
- package/registry/examples/screen/native/app-shell.tsx +1 -1
- package/registry/examples/screen/native/feed.dark.png +0 -0
- package/registry/examples/screen/native/feed.js +31 -14
- package/registry/examples/screen/native/feed.light.png +0 -0
- package/registry/examples/screen/native/feed.tsx +28 -24
- 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/screen/native/profile.dark.png +0 -0
- package/registry/examples/screen/native/profile.js +2 -2
- package/registry/examples/screen/native/profile.light.png +0 -0
- package/registry/examples/screen/native/profile.tsx +2 -2
- 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/examples/swipe-deck/discover.js +2 -3
- package/registry/examples/swipe-deck/discover.tsx +2 -3
- package/registry/examples/swipe-deck/native/discover.dark.png +0 -0
- package/registry/examples/swipe-deck/native/discover.js +2 -3
- package/registry/examples/swipe-deck/native/discover.light.png +0 -0
- package/registry/examples/swipe-deck/native/discover.tsx +2 -3
- package/registry/examples/vertical-video/feed.d.ts +4 -0
- package/registry/examples/vertical-video/feed.js +40 -0
- package/registry/examples/vertical-video/feed.tsx +36 -0
- package/registry/examples/vertical-video/native/rail.d.ts +4 -0
- package/registry/examples/vertical-video/native/rail.dark.png +0 -0
- package/registry/examples/vertical-video/native/rail.js +39 -0
- package/registry/examples/vertical-video/native/rail.light.png +0 -0
- package/registry/examples/vertical-video/native/rail.tsx +37 -0
- package/registry/examples/vertical-video/rail.d.ts +4 -0
- package/registry/examples/vertical-video/rail.js +39 -0
- package/registry/examples/vertical-video/rail.tsx +39 -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 +492 -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 +6 -5
- 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 +55 -6
- 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 +5 -4
- 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/vertical-video.json +871 -0
- 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
- /package/dist/{chunk-F2GKFIYK.js.map → chunk-CURW36FI.js.map} +0 -0
- /package/dist/{chunk-ECSCA3CN.js.map → chunk-UOMP6VOZ.js.map} +0 -0
|
@@ -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
|
|
@@ -15,7 +15,7 @@ var TABS = [
|
|
|
15
15
|
];
|
|
16
16
|
function NativeScreenAppShell() {
|
|
17
17
|
const [tab, setTab] = useState("likes");
|
|
18
|
-
return /* @__PURE__ */ jsx(View, { style: { width: 360, height: 640 }, children: /* @__PURE__ */ jsx(Screen, { header: /* @__PURE__ */ jsx(Header, { title: "Likes", subtitle: "4 people liked you" }), footer: /* @__PURE__ */ jsx(TabBar, { "aria-label": "Main sections", items: TABS, value: tab, onValueChange: setTab }), padding: 0, children: ["
|
|
18
|
+
return /* @__PURE__ */ jsx(View, { style: { width: 360, height: 640 }, children: /* @__PURE__ */ jsx(Screen, { header: /* @__PURE__ */ jsx(Header, { title: "Likes", subtitle: "4 people liked you" }), footer: /* @__PURE__ */ jsx(TabBar, { "aria-label": "Main sections", items: TABS, value: tab, onValueChange: setTab }), padding: 0, children: ["Camille, 29", "Tom\xE1s, 31", "Noor, 27", "Ada, 33"].map((name) => /* @__PURE__ */ jsxs(View, { style: { gap: 2, paddingHorizontal: 16, paddingVertical: 12 }, children: [
|
|
19
19
|
/* @__PURE__ */ jsx(Txt, { variant: "label", children: name }),
|
|
20
20
|
/* @__PURE__ */ jsx(Txt, { variant: "caption", tone: "secondary", children: "Liked you today" })
|
|
21
21
|
] }, name)) }) });
|
|
Binary file
|
|
@@ -21,7 +21,7 @@ export default function NativeScreenAppShell() {
|
|
|
21
21
|
return (
|
|
22
22
|
<View style={{ width: 360, height: 640 }}>
|
|
23
23
|
<Screen header={<Header title="Likes" subtitle="4 people liked you" />} footer={<TabBar aria-label="Main sections" items={TABS} value={tab} onValueChange={setTab} />} padding={0}>
|
|
24
|
-
{["
|
|
24
|
+
{["Camille, 29", "Tomás, 31", "Noor, 27", "Ada, 33"].map((name) => (
|
|
25
25
|
<View key={name} style={{ gap: 2, paddingHorizontal: 16, paddingVertical: 12 }}>
|
|
26
26
|
<Txt variant="label">{name}</Txt>
|
|
27
27
|
<Txt variant="caption" tone="secondary">Liked you today</Txt>
|
|
Binary file
|
|
@@ -1,23 +1,40 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
3
|
// registry/examples/screen/native/feed.tsx
|
|
4
|
-
import {
|
|
4
|
+
import { ShortFeed, VerticalVideo } from "@krizaka/ui/native/vertical-video";
|
|
5
5
|
import { View } from "react-native";
|
|
6
|
-
import { jsx
|
|
7
|
-
var
|
|
8
|
-
|
|
9
|
-
{ id: "
|
|
10
|
-
{ id: "
|
|
6
|
+
import { jsx } from "react/jsx-runtime";
|
|
7
|
+
var CDN = "https://krizaka-assets.b-cdn.net/site/people/ui";
|
|
8
|
+
var CLIPS = [
|
|
9
|
+
{ id: "1", who: "Camille", face: `${CDN}/camille-256.dc2943029a.webp`, poster: `${CDN}/camille-512.9573eaa0b8.webp`, caption: "Sunset session at Cabo da Roca." },
|
|
10
|
+
{ id: "2", who: "Tom\xE1s", face: `${CDN}/tomas-256.7eaab80903.webp`, poster: `${CDN}/tomas-512.dd7c4fd230.webp`, caption: "Best ramen in Porto? I have a list." }
|
|
11
11
|
];
|
|
12
12
|
function NativeScreenFeed() {
|
|
13
|
-
return /* @__PURE__ */ jsx(View, { style: { width: 360, height: 640 }, children: /* @__PURE__ */ jsx(
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
13
|
+
return /* @__PURE__ */ jsx(View, { style: { width: 360, height: 640 }, children: /* @__PURE__ */ jsx(
|
|
14
|
+
ShortFeed,
|
|
15
|
+
{
|
|
16
|
+
label: "Moments",
|
|
17
|
+
height: 640,
|
|
18
|
+
items: CLIPS,
|
|
19
|
+
getId: (clip) => clip.id,
|
|
20
|
+
renderItem: (clip, { active }) => /* @__PURE__ */ jsx(
|
|
21
|
+
VerticalVideo,
|
|
22
|
+
{
|
|
23
|
+
title: `Video by ${clip.who}`,
|
|
24
|
+
active,
|
|
25
|
+
posterUri: clip.poster,
|
|
26
|
+
creator: { name: clip.who, avatarUri: clip.face },
|
|
27
|
+
caption: clip.caption,
|
|
28
|
+
likes: 1200,
|
|
29
|
+
comments: 48,
|
|
30
|
+
onLike: () => void 0,
|
|
31
|
+
onComment: () => void 0,
|
|
32
|
+
onShare: () => void 0,
|
|
33
|
+
style: { height: 640, aspectRatio: void 0 }
|
|
34
|
+
}
|
|
35
|
+
)
|
|
36
|
+
}
|
|
37
|
+
) });
|
|
21
38
|
}
|
|
22
39
|
export {
|
|
23
40
|
NativeScreenFeed as default
|
|
Binary file
|
|
@@ -1,34 +1,38 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ShortFeed, VerticalVideo } from "@krizaka/ui/native/vertical-video";
|
|
2
2
|
import { View } from "react-native";
|
|
3
3
|
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
{ id: "
|
|
7
|
-
{ id: "
|
|
4
|
+
const CDN = "https://krizaka-assets.b-cdn.net/site/people/ui";
|
|
5
|
+
const CLIPS = [
|
|
6
|
+
{ id: "1", who: "Camille", face: `${CDN}/camille-256.dc2943029a.webp`, poster: `${CDN}/camille-512.9573eaa0b8.webp`, caption: "Sunset session at Cabo da Roca." },
|
|
7
|
+
{ id: "2", who: "Tomás", face: `${CDN}/tomas-256.7eaab80903.webp`, poster: `${CDN}/tomas-512.dd7c4fd230.webp`, caption: "Best ramen in Porto? I have a list." },
|
|
8
8
|
];
|
|
9
9
|
|
|
10
|
-
// A feed:
|
|
10
|
+
// A feed in the vertical format: one clip per screen with the action rail on the right and the caption bottom-left; the one
|
|
11
|
+
// in view plays and the others pause (`uri` is your clip — here the poster stands for it).
|
|
11
12
|
export default function NativeScreenFeed() {
|
|
12
13
|
return (
|
|
13
14
|
<View style={{ width: 360, height: 640 }}>
|
|
14
|
-
<
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
15
|
+
<ShortFeed
|
|
16
|
+
label="Moments"
|
|
17
|
+
height={640}
|
|
18
|
+
items={CLIPS}
|
|
19
|
+
getId={(clip) => clip.id}
|
|
20
|
+
renderItem={(clip, { active }) => (
|
|
21
|
+
<VerticalVideo
|
|
22
|
+
title={`Video by ${clip.who}`}
|
|
23
|
+
active={active}
|
|
24
|
+
posterUri={clip.poster}
|
|
25
|
+
creator={{ name: clip.who, avatarUri: clip.face }}
|
|
26
|
+
caption={clip.caption}
|
|
27
|
+
likes={1200}
|
|
28
|
+
comments={48}
|
|
29
|
+
onLike={() => undefined}
|
|
30
|
+
onComment={() => undefined}
|
|
31
|
+
onShare={() => undefined}
|
|
32
|
+
style={{ height: 640, aspectRatio: undefined }}
|
|
33
|
+
/>
|
|
34
|
+
)}
|
|
35
|
+
/>
|
|
32
36
|
</View>
|
|
33
37
|
);
|
|
34
38
|
}
|
|
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
|
+
}
|
|
Binary file
|
|
@@ -10,9 +10,9 @@ function NativeScreenProfile() {
|
|
|
10
10
|
/* @__PURE__ */ jsx(Button, { label: "Preview", variant: "outline", style: { flex: 1 } })
|
|
11
11
|
] }), children: [
|
|
12
12
|
/* @__PURE__ */ jsxs(View, { style: { alignItems: "center", gap: 6 }, children: [
|
|
13
|
-
/* @__PURE__ */ jsx(Avatar, { src: "
|
|
13
|
+
/* @__PURE__ */ jsx(Avatar, { src: "https://krizaka-assets.b-cdn.net/site/people/ui/camille-512.9573eaa0b8.webp", alt: "Camille", size: 112, ring: "story" }),
|
|
14
14
|
/* @__PURE__ */ jsxs(View, { style: { flexDirection: "row", alignItems: "center", gap: 6 }, children: [
|
|
15
|
-
/* @__PURE__ */ jsx(Txt, { variant: "title", children: "
|
|
15
|
+
/* @__PURE__ */ jsx(Txt, { variant: "title", children: "Camille, 29" }),
|
|
16
16
|
/* @__PURE__ */ jsx(VerifiedBadge, { label: "Verified", size: 18 })
|
|
17
17
|
] }),
|
|
18
18
|
/* @__PURE__ */ jsx(Txt, { tone: "secondary", children: "Lisbon \xB7 Sound engineer" })
|
|
Binary file
|
|
@@ -7,9 +7,9 @@ export default function NativeScreenProfile() {
|
|
|
7
7
|
<View style={{ width: 360, height: 640 }}>
|
|
8
8
|
<Screen footer={<View style={{ flexDirection: "row", gap: 8, padding: 16 }}><Button label="Edit profile" style={{ flex: 1 }} /><Button label="Preview" variant="outline" style={{ flex: 1 }} /></View>}>
|
|
9
9
|
<View style={{ alignItems: "center", gap: 6 }}>
|
|
10
|
-
<Avatar src="
|
|
10
|
+
<Avatar src="https://krizaka-assets.b-cdn.net/site/people/ui/camille-512.9573eaa0b8.webp" alt="Camille" size={112} ring="story" />
|
|
11
11
|
<View style={{ flexDirection: "row", alignItems: "center", gap: 6 }}>
|
|
12
|
-
<Txt variant="title">
|
|
12
|
+
<Txt variant="title">Camille, 29</Txt>
|
|
13
13
|
<VerifiedBadge label="Verified" size={18} />
|
|
14
14
|
</View>
|
|
15
15
|
<Txt tone="secondary">Lisbon · Sound engineer</Txt>
|
|
@@ -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
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// registry/examples/split-view/nearby.tsx
|
|
4
|
+
import { Map, Marker, StaticMap } from "@krizaka/ui/map";
|
|
5
|
+
import { SplitView } from "@krizaka/ui/split-view";
|
|
6
|
+
import * as React from "react";
|
|
7
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
var SPOTS = [
|
|
9
|
+
{ id: "olimpico", label: "Caf\xE9 Olimpico", where: "Mile End \xB7 450 m", position: [-73.6005, 45.5229] },
|
|
10
|
+
{ id: "jean-talon", label: "March\xE9 Jean-Talon", where: "Little Italy \xB7 1.2 km", position: [-73.6147, 45.5363] },
|
|
11
|
+
{ id: "parc", label: "Parc La Fontaine", where: "Plateau \xB7 2 km", position: [-73.5695, 45.5268] }
|
|
12
|
+
];
|
|
13
|
+
function SplitViewNearby() {
|
|
14
|
+
const [chosen, setChosen] = React.useState("olimpico");
|
|
15
|
+
return /* @__PURE__ */ jsx(
|
|
16
|
+
SplitView,
|
|
17
|
+
{
|
|
18
|
+
className: "w-full",
|
|
19
|
+
listTitle: "Pick-up points",
|
|
20
|
+
showDetail: true,
|
|
21
|
+
back: /* @__PURE__ */ jsx("a", { href: "#list", className: "text-sm font-medium text-fg-secondary", children: "\u2190 Pick-up points" }),
|
|
22
|
+
list: /* @__PURE__ */ jsx("ul", { children: SPOTS.map((s) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs("button", { type: "button", "aria-pressed": s.id === chosen, onClick: () => setChosen(s.id), className: "flex w-full flex-col items-start gap-0.5 border-b border-border-subtle px-4 py-3 text-left text-sm hover:bg-surface-2 aria-pressed:bg-accent-soft", children: [
|
|
23
|
+
/* @__PURE__ */ jsx("span", { className: "font-semibold text-fg", children: s.label }),
|
|
24
|
+
/* @__PURE__ */ jsx("span", { className: "text-fg-secondary", children: s.where })
|
|
25
|
+
] }) }, s.id)) }),
|
|
26
|
+
detailHead: /* @__PURE__ */ jsx("span", { className: "text-sm font-bold text-fg", children: "Map" }),
|
|
27
|
+
detail: /* @__PURE__ */ jsx(Map, { label: "Pick-up points in Montr\xE9al", center: [-73.592, 45.528], zoom: 12.5, className: "h-96 w-full", fallback: /* @__PURE__ */ jsx(StaticMap, { label: "Pick-up points in Montr\xE9al", center: [-73.592, 45.528], zoom: 12.5, places: SPOTS }), children: SPOTS.map((s) => /* @__PURE__ */ jsx(Marker, { position: s.position, label: s.label, selected: s.id === chosen, onPress: () => setChosen(s.id) }, s.id)) })
|
|
28
|
+
}
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
export {
|
|
32
|
+
SplitViewNearby as default
|
|
33
|
+
};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { Map, Marker, StaticMap } from "@krizaka/ui/map";
|
|
4
|
+
import { SplitView } from "@krizaka/ui/split-view";
|
|
5
|
+
import * as React from "react";
|
|
6
|
+
|
|
7
|
+
const SPOTS = [
|
|
8
|
+
{ id: "olimpico", label: "Café Olimpico", where: "Mile End · 450 m", position: [-73.6005, 45.5229] as const },
|
|
9
|
+
{ id: "jean-talon", label: "Marché Jean-Talon", where: "Little Italy · 1.2 km", position: [-73.6147, 45.5363] as const },
|
|
10
|
+
{ id: "parc", label: "Parc La Fontaine", where: "Plateau · 2 km", position: [-73.5695, 45.5268] as const },
|
|
11
|
+
];
|
|
12
|
+
|
|
13
|
+
// TEMPLATE — find a place near you: the map is the page, the list beside it says the same in words (a screen reader reads
|
|
14
|
+
// the list); choosing in one moves the other. On a phone the list replaces the map with the way back.
|
|
15
|
+
export default function SplitViewNearby() {
|
|
16
|
+
const [chosen, setChosen] = React.useState("olimpico");
|
|
17
|
+
return (
|
|
18
|
+
<SplitView
|
|
19
|
+
className="w-full"
|
|
20
|
+
listTitle="Pick-up points"
|
|
21
|
+
showDetail
|
|
22
|
+
back={<a href="#list" className="text-sm font-medium text-fg-secondary">← Pick-up points</a>}
|
|
23
|
+
list={
|
|
24
|
+
<ul>
|
|
25
|
+
{SPOTS.map((s) => (
|
|
26
|
+
<li key={s.id}>
|
|
27
|
+
<button type="button" aria-pressed={s.id === chosen} onClick={() => setChosen(s.id)} className="flex w-full flex-col items-start gap-0.5 border-b border-border-subtle px-4 py-3 text-left text-sm hover:bg-surface-2 aria-pressed:bg-accent-soft">
|
|
28
|
+
<span className="font-semibold text-fg">{s.label}</span>
|
|
29
|
+
<span className="text-fg-secondary">{s.where}</span>
|
|
30
|
+
</button>
|
|
31
|
+
</li>
|
|
32
|
+
))}
|
|
33
|
+
</ul>
|
|
34
|
+
}
|
|
35
|
+
detailHead={<span className="text-sm font-bold text-fg">Map</span>}
|
|
36
|
+
detail={
|
|
37
|
+
<Map label="Pick-up points in Montréal" center={[-73.592, 45.528]} zoom={12.5} className="h-96 w-full" fallback={<StaticMap label="Pick-up points in Montréal" center={[-73.592, 45.528]} zoom={12.5} places={SPOTS} />}>
|
|
38
|
+
{SPOTS.map((s) => (
|
|
39
|
+
<Marker key={s.id} position={s.position} label={s.label} selected={s.id === chosen} onPress={() => setChosen(s.id)} />
|
|
40
|
+
))}
|
|
41
|
+
</Map>
|
|
42
|
+
}
|
|
43
|
+
/>
|
|
44
|
+
);
|
|
45
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// registry/examples/split-view/notifications.tsx
|
|
4
|
+
import { ActivityFeed } from "@krizaka/ui/activity-feed";
|
|
5
|
+
import { Button } from "@krizaka/ui/button";
|
|
6
|
+
import { SplitView } from "@krizaka/ui/split-view";
|
|
7
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
var NOW = /* @__PURE__ */ new Date("2026-10-13T10:00:00Z");
|
|
9
|
+
var EVENTS = [
|
|
10
|
+
{ id: "n1", at: "2026-10-13T09:40:00Z", title: "Mina unlocked \u201CNight shoot, part 2\u201D", tone: "success" },
|
|
11
|
+
{ id: "n2", at: "2026-10-13T08:15:00Z", title: "Your payout of \u20AC120 was sent", tone: "info" },
|
|
12
|
+
{ id: "n3", at: "2026-10-12T19:02:00Z", title: "L\xE9a bid \u20AC25 on the auction", tone: "accent" }
|
|
13
|
+
];
|
|
14
|
+
function SplitViewNotifications() {
|
|
15
|
+
return /* @__PURE__ */ jsx(
|
|
16
|
+
SplitView,
|
|
17
|
+
{
|
|
18
|
+
className: "brand-orochia w-full",
|
|
19
|
+
listTitle: "Notifications",
|
|
20
|
+
showDetail: false,
|
|
21
|
+
back: /* @__PURE__ */ jsx("a", { href: "#notifications", className: "text-sm font-medium text-fg-secondary", children: "\u2190 Notifications" }),
|
|
22
|
+
list: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3 p-3", children: [
|
|
23
|
+
/* @__PURE__ */ jsx(Button, { size: "sm", variant: "ghost", className: "w-fit", children: "Mark all as read" }),
|
|
24
|
+
/* @__PURE__ */ jsx(ActivityFeed, { "aria-label": "Notifications", events: EVENTS, now: NOW, ticking: false })
|
|
25
|
+
] }),
|
|
26
|
+
detailHead: /* @__PURE__ */ jsx("span", { className: "text-sm font-bold text-fg", children: "Mina unlocked \u201CNight shoot, part 2\u201D" }),
|
|
27
|
+
detail: /* @__PURE__ */ jsx("p", { className: "text-sm text-fg-secondary", children: "\u20AC4.99 unlocked at 09:40. Your share, \u20AC4.49, is paid out on Monday." })
|
|
28
|
+
}
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
export {
|
|
32
|
+
SplitViewNotifications as default
|
|
33
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { ActivityFeed } from "@krizaka/ui/activity-feed";
|
|
2
|
+
import { Button } from "@krizaka/ui/button";
|
|
3
|
+
import { SplitView } from "@krizaka/ui/split-view";
|
|
4
|
+
|
|
5
|
+
const NOW = new Date("2026-10-13T10:00:00Z");
|
|
6
|
+
const EVENTS = [
|
|
7
|
+
{ id: "n1", at: "2026-10-13T09:40:00Z", title: "Mina unlocked “Night shoot, part 2”", tone: "success" as const },
|
|
8
|
+
{ id: "n2", at: "2026-10-13T08:15:00Z", title: "Your payout of €120 was sent", tone: "info" as const },
|
|
9
|
+
{ id: "n3", at: "2026-10-12T19:02:00Z", title: "Léa bid €25 on the auction", tone: "accent" as const },
|
|
10
|
+
];
|
|
11
|
+
|
|
12
|
+
// TEMPLATE — a notifications centre: what happened, newest first, grouped by day; the selected one opens beside the list
|
|
13
|
+
// (a screen of its own on a phone). Marking all as read is one button, never a hidden gesture.
|
|
14
|
+
export default function SplitViewNotifications() {
|
|
15
|
+
return (
|
|
16
|
+
<SplitView
|
|
17
|
+
className="brand-orochia w-full"
|
|
18
|
+
listTitle="Notifications"
|
|
19
|
+
showDetail={false}
|
|
20
|
+
back={<a href="#notifications" className="text-sm font-medium text-fg-secondary">← Notifications</a>}
|
|
21
|
+
list={
|
|
22
|
+
<div className="flex flex-col gap-3 p-3">
|
|
23
|
+
<Button size="sm" variant="ghost" className="w-fit">Mark all as read</Button>
|
|
24
|
+
<ActivityFeed aria-label="Notifications" events={EVENTS} now={NOW} ticking={false} />
|
|
25
|
+
</div>
|
|
26
|
+
}
|
|
27
|
+
detailHead={<span className="text-sm font-bold text-fg">Mina unlocked “Night shoot, part 2”</span>}
|
|
28
|
+
detail={<p className="text-sm text-fg-secondary">€4.99 unlocked at 09:40. Your share, €4.49, is paid out on Monday.</p>}
|
|
29
|
+
/>
|
|
30
|
+
);
|
|
31
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// registry/examples/status-page/maintenance.tsx
|
|
4
|
+
import { Mascot } from "@krizaka/ui/mascots";
|
|
5
|
+
import { StatusPage } from "@krizaka/ui/status-page";
|
|
6
|
+
import { jsx } from "react/jsx-runtime";
|
|
7
|
+
function StatusPageMaintenance() {
|
|
8
|
+
return /* @__PURE__ */ jsx(
|
|
9
|
+
StatusPage,
|
|
10
|
+
{
|
|
11
|
+
eyebrow: "Maintenance",
|
|
12
|
+
title: "Back at 06:00",
|
|
13
|
+
lead: "We are moving the database to a bigger machine. Nothing is lost; writes are paused.",
|
|
14
|
+
aside: /* @__PURE__ */ jsx(Mascot, { bird: "pigeon", mood: "empty", size: 112 }),
|
|
15
|
+
state: "degraded",
|
|
16
|
+
stateLabel: "Planned maintenance",
|
|
17
|
+
checked: "Until 06:00 (Montr\xE9al)",
|
|
18
|
+
servicesLabel: "Services",
|
|
19
|
+
services: [
|
|
20
|
+
{ id: "watch", name: "Watching videos", state: "operational", label: "Works" },
|
|
21
|
+
{ id: "unlock", name: "Unlocks and tips", state: "degraded", label: "Paused" },
|
|
22
|
+
{ id: "upload", name: "Uploads", state: "degraded", label: "Paused" }
|
|
23
|
+
]
|
|
24
|
+
}
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
export {
|
|
28
|
+
StatusPageMaintenance as default
|
|
29
|
+
};
|