@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.
Files changed (285) hide show
  1. package/README.md +1 -0
  2. package/dist/app-shell.d.ts +24 -22
  3. package/dist/app-shell.js +9 -3
  4. package/dist/app-shell.js.map +1 -1
  5. package/dist/chat.js +2 -1
  6. package/dist/chat.js.map +1 -1
  7. package/dist/chunk-3GODX3D6.js +25 -0
  8. package/dist/chunk-3GODX3D6.js.map +1 -0
  9. package/dist/{chunk-F2GKFIYK.js → chunk-CURW36FI.js} +1 -1
  10. package/dist/chunk-JXLDUDTD.js +2 -0
  11. package/dist/chunk-JXLDUDTD.js.map +1 -0
  12. package/dist/{chunk-R6SDS7JM.js → chunk-ND3L5VHT.js} +25 -2
  13. package/dist/chunk-ND3L5VHT.js.map +1 -0
  14. package/dist/chunk-NPF3OHE2.js +2 -0
  15. package/dist/chunk-NPF3OHE2.js.map +1 -0
  16. package/dist/{chunk-ECSCA3CN.js → chunk-UOMP6VOZ.js} +1 -1
  17. package/dist/command.js +1 -1
  18. package/dist/data-table.js +2 -1
  19. package/dist/data-table.js.map +1 -1
  20. package/dist/dialog.js +7 -3
  21. package/dist/dialog.js.map +1 -1
  22. package/dist/loader.d.ts +21 -1
  23. package/dist/loader.js +7 -3
  24. package/dist/loader.js.map +1 -1
  25. package/dist/map.js +7 -1
  26. package/dist/map.js.map +1 -1
  27. package/dist/marketing-layout.d.ts +3 -9
  28. package/dist/marketing-layout.js +24 -7
  29. package/dist/marketing-layout.js.map +1 -1
  30. package/dist/match-dialog.d.ts +3 -1
  31. package/dist/match-dialog.js +29 -5
  32. package/dist/match-dialog.js.map +1 -1
  33. package/dist/native/vertical-video.d.ts +102 -0
  34. package/dist/native/vertical-video.js +163 -0
  35. package/dist/native/vertical-video.js.map +1 -0
  36. package/dist/native.d.ts +65 -2
  37. package/dist/native.js +960 -878
  38. package/dist/native.js.map +1 -1
  39. package/dist/skip-link.d.ts +15 -0
  40. package/dist/skip-link.js +10 -0
  41. package/dist/skip-link.js.map +1 -0
  42. package/dist/tree-view.d.ts +2 -0
  43. package/dist/tree-view.js.map +1 -1
  44. package/dist/vertical-video.d.ts +112 -0
  45. package/dist/vertical-video.js +307 -0
  46. package/dist/vertical-video.js.map +1 -0
  47. package/package.json +56 -8
  48. package/registry/achievement.json +2 -1
  49. package/registry/action-bar.json +2 -1
  50. package/registry/action-sheet.json +1 -0
  51. package/registry/activity-feed.json +2 -1
  52. package/registry/alert.json +2 -1
  53. package/registry/app-shell.json +27 -5
  54. package/registry/argument-card.json +2 -1
  55. package/registry/audio-player.json +2 -1
  56. package/registry/auth-layout.json +7 -2
  57. package/registry/avatar.json +7 -6
  58. package/registry/badge.json +2 -1
  59. package/registry/button.json +2 -1
  60. package/registry/card-grid.json +2 -1
  61. package/registry/card.json +2 -1
  62. package/registry/catalogue-page.json +5 -2
  63. package/registry/changelog-page.json +5 -2
  64. package/registry/chat.json +2 -1
  65. package/registry/checkbox.json +2 -1
  66. package/registry/chip-link.json +2 -1
  67. package/registry/chip.json +2 -1
  68. package/registry/choice-grid.json +2 -1
  69. package/registry/cn.json +1 -0
  70. package/registry/code-block.json +2 -1
  71. package/registry/combobox.json +2 -1
  72. package/registry/command.json +2 -1
  73. package/registry/component-page.json +5 -2
  74. package/registry/confirm-button.json +2 -1
  75. package/registry/contact-page.json +5 -2
  76. package/registry/continue-prompt.json +2 -1
  77. package/registry/countdown.json +2 -1
  78. package/registry/cta-panel.json +2 -1
  79. package/registry/dashboard-layout.json +5 -2
  80. package/registry/data-table.json +2 -1
  81. package/registry/date-picker.json +3 -2
  82. package/registry/decision-list.json +2 -1
  83. package/registry/description-list.json +2 -1
  84. package/registry/detail-layout.json +16 -2
  85. package/registry/dialog.json +10 -4
  86. package/registry/docs-article-page.json +16 -2
  87. package/registry/docs-hub-page.json +5 -2
  88. package/registry/docs-layout.json +2 -1
  89. package/registry/dropdown-menu.json +2 -1
  90. package/registry/empty-state.json +14 -2
  91. package/registry/error-page.json +5 -2
  92. package/registry/examples/avatar/group.js +4 -7
  93. package/registry/examples/avatar/group.tsx +4 -11
  94. package/registry/examples/avatar/native/group.dark.png +0 -0
  95. package/registry/examples/avatar/native/group.js +4 -4
  96. package/registry/examples/avatar/native/group.light.png +0 -0
  97. package/registry/examples/avatar/native/group.tsx +4 -4
  98. package/registry/examples/avatar/native/presence.dark.png +0 -0
  99. package/registry/examples/avatar/native/presence.js +8 -5
  100. package/registry/examples/avatar/native/presence.light.png +0 -0
  101. package/registry/examples/avatar/native/presence.tsx +9 -5
  102. package/registry/examples/avatar/with-image.js +1 -4
  103. package/registry/examples/avatar/with-image.tsx +2 -9
  104. package/registry/examples/detail-layout/checkout.d.ts +4 -0
  105. package/registry/examples/detail-layout/checkout.js +37 -0
  106. package/registry/examples/detail-layout/checkout.tsx +44 -0
  107. package/registry/examples/docs-article-page/faq.d.ts +4 -0
  108. package/registry/examples/docs-article-page/faq.js +31 -0
  109. package/registry/examples/docs-article-page/faq.tsx +40 -0
  110. package/registry/examples/empty-state/library.d.ts +4 -0
  111. package/registry/examples/empty-state/library.js +25 -0
  112. package/registry/examples/empty-state/library.tsx +20 -0
  113. package/registry/examples/loader/branded.d.ts +4 -0
  114. package/registry/examples/loader/branded.js +12 -0
  115. package/registry/examples/loader/branded.tsx +7 -0
  116. package/registry/examples/loader/native/branded.d.ts +4 -0
  117. package/registry/examples/loader/native/branded.dark.png +0 -0
  118. package/registry/examples/loader/native/branded.js +12 -0
  119. package/registry/examples/loader/native/branded.light.png +0 -0
  120. package/registry/examples/loader/native/branded.tsx +11 -0
  121. package/registry/examples/longform-page/case-study.d.ts +4 -0
  122. package/registry/examples/longform-page/case-study.js +41 -0
  123. package/registry/examples/longform-page/case-study.tsx +40 -0
  124. package/registry/examples/profile-card/creator.js +2 -2
  125. package/registry/examples/profile-card/creator.tsx +2 -2
  126. package/registry/examples/profile-card/match.js +2 -2
  127. package/registry/examples/profile-card/match.tsx +2 -2
  128. package/registry/examples/profile-card/native/default.dark.png +0 -0
  129. package/registry/examples/profile-card/native/default.js +2 -2
  130. package/registry/examples/profile-card/native/default.light.png +0 -0
  131. package/registry/examples/profile-card/native/default.tsx +2 -2
  132. package/registry/examples/pull-to-refresh/native/branded.d.ts +4 -0
  133. package/registry/examples/pull-to-refresh/native/branded.dark.png +0 -0
  134. package/registry/examples/pull-to-refresh/native/branded.js +14 -0
  135. package/registry/examples/pull-to-refresh/native/branded.light.png +0 -0
  136. package/registry/examples/pull-to-refresh/native/branded.tsx +23 -0
  137. package/registry/examples/screen/native/app-shell.dark.png +0 -0
  138. package/registry/examples/screen/native/app-shell.js +1 -1
  139. package/registry/examples/screen/native/app-shell.light.png +0 -0
  140. package/registry/examples/screen/native/app-shell.tsx +1 -1
  141. package/registry/examples/screen/native/feed.dark.png +0 -0
  142. package/registry/examples/screen/native/feed.js +31 -14
  143. package/registry/examples/screen/native/feed.light.png +0 -0
  144. package/registry/examples/screen/native/feed.tsx +28 -24
  145. package/registry/examples/screen/native/map.d.ts +4 -0
  146. package/registry/examples/screen/native/map.dark.png +0 -0
  147. package/registry/examples/screen/native/map.js +26 -0
  148. package/registry/examples/screen/native/map.light.png +0 -0
  149. package/registry/examples/screen/native/map.tsx +31 -0
  150. package/registry/examples/screen/native/notifications.d.ts +4 -0
  151. package/registry/examples/screen/native/notifications.dark.png +0 -0
  152. package/registry/examples/screen/native/notifications.js +21 -0
  153. package/registry/examples/screen/native/notifications.light.png +0 -0
  154. package/registry/examples/screen/native/notifications.tsx +21 -0
  155. package/registry/examples/screen/native/profile.dark.png +0 -0
  156. package/registry/examples/screen/native/profile.js +2 -2
  157. package/registry/examples/screen/native/profile.light.png +0 -0
  158. package/registry/examples/screen/native/profile.tsx +2 -2
  159. package/registry/examples/skip-link/default.d.ts +4 -0
  160. package/registry/examples/skip-link/default.js +19 -0
  161. package/registry/examples/skip-link/default.tsx +12 -0
  162. package/registry/examples/splash-handoff/native/default.d.ts +4 -0
  163. package/registry/examples/splash-handoff/native/default.dark.png +0 -0
  164. package/registry/examples/splash-handoff/native/default.js +12 -0
  165. package/registry/examples/splash-handoff/native/default.light.png +0 -0
  166. package/registry/examples/splash-handoff/native/default.tsx +11 -0
  167. package/registry/examples/split-view/nearby.d.ts +4 -0
  168. package/registry/examples/split-view/nearby.js +33 -0
  169. package/registry/examples/split-view/nearby.tsx +45 -0
  170. package/registry/examples/split-view/notifications.d.ts +4 -0
  171. package/registry/examples/split-view/notifications.js +33 -0
  172. package/registry/examples/split-view/notifications.tsx +31 -0
  173. package/registry/examples/status-page/maintenance.d.ts +4 -0
  174. package/registry/examples/status-page/maintenance.js +29 -0
  175. package/registry/examples/status-page/maintenance.tsx +24 -0
  176. package/registry/examples/swipe-deck/discover.js +2 -3
  177. package/registry/examples/swipe-deck/discover.tsx +2 -3
  178. package/registry/examples/swipe-deck/native/discover.dark.png +0 -0
  179. package/registry/examples/swipe-deck/native/discover.js +2 -3
  180. package/registry/examples/swipe-deck/native/discover.light.png +0 -0
  181. package/registry/examples/swipe-deck/native/discover.tsx +2 -3
  182. package/registry/examples/vertical-video/feed.d.ts +4 -0
  183. package/registry/examples/vertical-video/feed.js +40 -0
  184. package/registry/examples/vertical-video/feed.tsx +36 -0
  185. package/registry/examples/vertical-video/native/rail.d.ts +4 -0
  186. package/registry/examples/vertical-video/native/rail.dark.png +0 -0
  187. package/registry/examples/vertical-video/native/rail.js +39 -0
  188. package/registry/examples/vertical-video/native/rail.light.png +0 -0
  189. package/registry/examples/vertical-video/native/rail.tsx +37 -0
  190. package/registry/examples/vertical-video/rail.d.ts +4 -0
  191. package/registry/examples/vertical-video/rail.js +39 -0
  192. package/registry/examples/vertical-video/rail.tsx +39 -0
  193. package/registry/fab.json +1 -0
  194. package/registry/field.json +2 -1
  195. package/registry/file-upload.json +3 -2
  196. package/registry/filter-bar.json +2 -1
  197. package/registry/form.json +3 -2
  198. package/registry/gallery-page.json +5 -2
  199. package/registry/glow-card.json +2 -1
  200. package/registry/goal-gauge.json +2 -1
  201. package/registry/header.json +1 -0
  202. package/registry/how-it-works-page.json +5 -2
  203. package/registry/image-cropper.json +2 -1
  204. package/registry/image-viewer.json +1 -0
  205. package/registry/index.json +492 -22
  206. package/registry/iso.json +2 -1
  207. package/registry/kanban.json +2 -1
  208. package/registry/kbd.json +2 -1
  209. package/registry/landing-page.json +5 -2
  210. package/registry/landscape.json +2 -1
  211. package/registry/legal-page.json +5 -2
  212. package/registry/link-card.json +2 -1
  213. package/registry/list.json +2 -1
  214. package/registry/loader.json +47 -3
  215. package/registry/longform-page.json +16 -2
  216. package/registry/map.json +4 -3
  217. package/registry/marketing-layout.json +13 -4
  218. package/registry/marquee.json +2 -1
  219. package/registry/mascot-quote.json +2 -1
  220. package/registry/mascot-state.json +2 -1
  221. package/registry/mascots.json +2 -1
  222. package/registry/match-dialog.json +17 -2
  223. package/registry/media-capture.json +2 -1
  224. package/registry/media-picker.json +1 -0
  225. package/registry/meter.json +2 -1
  226. package/registry/nav-bar.json +2 -1
  227. package/registry/number-ticker.json +2 -1
  228. package/registry/onboarding.json +1 -0
  229. package/registry/otp-input.json +1 -0
  230. package/registry/page-header.json +2 -1
  231. package/registry/page-hero.json +2 -1
  232. package/registry/page.json +2 -1
  233. package/registry/pagination.json +2 -1
  234. package/registry/permission-prompt.json +1 -0
  235. package/registry/photo-grid.json +2 -1
  236. package/registry/pointer-light.json +2 -1
  237. package/registry/popover.json +2 -1
  238. package/registry/pricing-page.json +5 -2
  239. package/registry/product-page.json +5 -2
  240. package/registry/profile-card.json +6 -5
  241. package/registry/progress.json +2 -1
  242. package/registry/promise-card.json +2 -1
  243. package/registry/pull-to-refresh.json +68 -4
  244. package/registry/radio-group.json +2 -1
  245. package/registry/screen.json +55 -6
  246. package/registry/scroll-stage.json +2 -1
  247. package/registry/search-field.json +2 -1
  248. package/registry/section-backdrop.json +2 -1
  249. package/registry/segmented.json +1 -0
  250. package/registry/separator.json +2 -1
  251. package/registry/settings-layout.json +5 -2
  252. package/registry/skeleton.json +2 -1
  253. package/registry/skip-link.json +122 -0
  254. package/registry/slider.json +2 -1
  255. package/registry/slot.json +2 -1
  256. package/registry/spinner.json +2 -1
  257. package/registry/splash-handoff.json +138 -0
  258. package/registry/split-view.json +27 -2
  259. package/registry/stage-banner.json +2 -1
  260. package/registry/stat.json +2 -1
  261. package/registry/status-page.json +18 -2
  262. package/registry/step-progress.json +2 -1
  263. package/registry/stepper.json +2 -1
  264. package/registry/swipe-deck.json +5 -4
  265. package/registry/swipeable-row.json +1 -0
  266. package/registry/switch.json +2 -1
  267. package/registry/tab-bar.json +1 -0
  268. package/registry/tabs.json +2 -1
  269. package/registry/tag-input.json +2 -1
  270. package/registry/tag-selector.json +2 -1
  271. package/registry/terminal-replay.json +2 -1
  272. package/registry/theme.json +2 -1
  273. package/registry/toast.json +2 -1
  274. package/registry/toc.json +2 -1
  275. package/registry/tooltip.json +2 -1
  276. package/registry/tree-view.json +10 -4
  277. package/registry/txt.json +1 -0
  278. package/registry/verified-badge.json +2 -1
  279. package/registry/vertical-video.json +871 -0
  280. package/registry/video-player.json +2 -1
  281. package/registry/video-trimmer.json +2 -1
  282. package/registry/virtual.json +2 -1
  283. package/dist/chunk-R6SDS7JM.js.map +0 -1
  284. /package/dist/{chunk-F2GKFIYK.js.map → chunk-CURW36FI.js.map} +0 -0
  285. /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
+ }
@@ -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: ["Elena, 29", "Noah, 31", "Mina, 27", "Alex, 33"].map((name) => /* @__PURE__ */ jsxs(View, { style: { gap: 2, paddingHorizontal: 16, paddingVertical: 12 }, 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)) }) });
@@ -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
- {["Elena, 29", "Noah, 31", "Mina, 27", "Alex, 33"].map((name) => (
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>
@@ -1,23 +1,40 @@
1
1
  "use client";
2
2
 
3
3
  // registry/examples/screen/native/feed.tsx
4
- import { Avatar, Card, Header, Screen, Txt } from "@krizaka/ui/native";
4
+ import { ShortFeed, VerticalVideo } from "@krizaka/ui/native/vertical-video";
5
5
  import { View } from "react-native";
6
- import { jsx, jsxs } from "react/jsx-runtime";
7
- var POSTS = [
8
- { id: "1", who: "Elena", what: "Sunset session at Cabo da Roca", when: "2 h" },
9
- { id: "2", who: "Noah", what: "Best ramen in Porto? I have a list.", when: "5 h" },
10
- { id: "3", who: "Mina", what: "Free tickets for the jazz night!", when: "Yesterday" }
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(Screen, { header: /* @__PURE__ */ jsx(Header, { title: "Moments", subtitle: "From people you matched with" }), children: POSTS.map((p) => /* @__PURE__ */ jsx(Card.Root, { children: /* @__PURE__ */ jsxs(Card.Body, { children: [
14
- /* @__PURE__ */ jsxs(View, { style: { flexDirection: "row", alignItems: "center", gap: 10 }, children: [
15
- /* @__PURE__ */ jsx(Avatar, { alt: p.who, size: "sm" }),
16
- /* @__PURE__ */ jsx(Txt, { variant: "label", style: { flex: 1 }, children: p.who }),
17
- /* @__PURE__ */ jsx(Txt, { variant: "caption", tone: "secondary", children: p.when })
18
- ] }),
19
- /* @__PURE__ */ jsx(Txt, { children: p.what })
20
- ] }) }, p.id)) }) });
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
@@ -1,34 +1,38 @@
1
- import { Avatar, Card, Header, Screen, Txt } from "@krizaka/ui/native";
1
+ import { ShortFeed, VerticalVideo } from "@krizaka/ui/native/vertical-video";
2
2
  import { View } from "react-native";
3
3
 
4
- const POSTS = [
5
- { id: "1", who: "Elena", what: "Sunset session at Cabo da Roca", when: "2 h" },
6
- { id: "2", who: "Noah", what: "Best ramen in Porto? I have a list.", when: "5 h" },
7
- { id: "3", who: "Mina", what: "Free tickets for the jazz night!", when: "Yesterday" },
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: a large title, cards under it (a long feed uses the list of `@krizaka/ui/native/list` in `scroll={false}`).
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
- <Screen header={<Header title="Moments" subtitle="From people you matched with" />}>
15
- {POSTS.map((p) => (
16
- <Card.Root key={p.id}>
17
- <Card.Body>
18
- <View style={{ flexDirection: "row", alignItems: "center", gap: 10 }}>
19
- <Avatar alt={p.who} size="sm" />
20
- <Txt variant="label" style={{ flex: 1 }}>
21
- {p.who}
22
- </Txt>
23
- <Txt variant="caption" tone="secondary">
24
- {p.when}
25
- </Txt>
26
- </View>
27
- <Txt>{p.what}</Txt>
28
- </Card.Body>
29
- </Card.Root>
30
- ))}
31
- </Screen>
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
  }
@@ -0,0 +1,4 @@
1
+ import type { ComponentType } from "react";
2
+ /** A named example of the @krizaka/ui registry; `defaultOpen` opens what it opens (a dialog, a menu, toasts) at load. */
3
+ declare const Example: ComponentType<{ defaultOpen?: boolean }>;
4
+ export default Example;
@@ -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
+ };
@@ -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
+ }
@@ -0,0 +1,4 @@
1
+ import type { ComponentType } from "react";
2
+ /** A named example of the @krizaka/ui registry; `defaultOpen` opens what it opens (a dialog, a menu, toasts) at load. */
3
+ declare const Example: ComponentType<{ defaultOpen?: boolean }>;
4
+ export default Example;
@@ -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
+ };
@@ -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
+ }
@@ -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: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAQCAIAAACtAwlQAAABaklEQVR42mWMy24UQQxF7arqlwLhIbJhwZZf5I/4IISEBIsIRSKTMOmZnp7uqrJ9zYIeIeCsrqzjw+vHDwYCCM6wbfy5gABKatsysJqLuoHciZ2dGE4ApSrbnyidVn06lVyQUrweur5pmAJAqVQGSEGnRb79mD5/H6dzuRq6929fv7t5MTSd+6VUK3Zj/XQ7frkblyJ926jwkIab6yZw3Eq58rzaz6nMq1RVA+3nMmd73nMMfCkJiRBA7u5O7g6QCFfhyLyVRJg89U3bxKiGJsQ+te6pCge+lETYPT3rujalotqkNLSdexRhJk6lshjOWXeH+WE6Z1HAi+p+Pr+czuxtG0PKlZesd+P09f5xd5iKqrlX1cfpGCiqhDdXr9Ja8DSX24f9/eG4VDGAiAzIIrvpwJ6C96FUXrId15Ivxm8MKCpzKUvRUCpXJTOHO/2Nu6uhqocqLMr4V9iAkxoHMzZjgP7XnMjBZvQLMEROG5iV3IMAAAAASUVORK5CYII=", alt: "Elena", size: 112, ring: "story" }),
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: "Elena, 29" }),
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" })
@@ -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="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAQCAIAAACtAwlQAAABaklEQVR42mWMy24UQQxF7arqlwLhIbJhwZZf5I/4IISEBIsIRSKTMOmZnp7uqrJ9zYIeIeCsrqzjw+vHDwYCCM6wbfy5gABKatsysJqLuoHciZ2dGE4ApSrbnyidVn06lVyQUrweur5pmAJAqVQGSEGnRb79mD5/H6dzuRq6929fv7t5MTSd+6VUK3Zj/XQ7frkblyJ926jwkIab6yZw3Eq58rzaz6nMq1RVA+3nMmd73nMMfCkJiRBA7u5O7g6QCFfhyLyVRJg89U3bxKiGJsQ+te6pCge+lETYPT3rujalotqkNLSdexRhJk6lshjOWXeH+WE6Z1HAi+p+Pr+czuxtG0PKlZesd+P09f5xd5iKqrlX1cfpGCiqhDdXr9Ja8DSX24f9/eG4VDGAiAzIIrvpwJ6C96FUXrId15Ivxm8MKCpzKUvRUCpXJTOHO/2Nu6uhqocqLMr4V9iAkxoHMzZjgP7XnMjBZvQLMEROG5iV3IMAAAAASUVORK5CYII=" alt="Elena" size={112} ring="story" />
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">Elena, 29</Txt>
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,4 @@
1
+ import type { ComponentType } from "react";
2
+ /** A named example of the @krizaka/ui registry; `defaultOpen` opens what it opens (a dialog, a menu, toasts) at load. */
3
+ declare const Example: ComponentType<{ defaultOpen?: boolean }>;
4
+ export default Example;
@@ -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
+ }
@@ -0,0 +1,4 @@
1
+ import type { ComponentType } from "react";
2
+ /** A named example of the @krizaka/ui registry; `defaultOpen` opens what it opens (a dialog, a menu, toasts) at load. */
3
+ declare const Example: ComponentType<{ defaultOpen?: boolean }>;
4
+ export default Example;
@@ -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
+ };
@@ -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,4 @@
1
+ import type { ComponentType } from "react";
2
+ /** A named example of the @krizaka/ui registry; `defaultOpen` opens what it opens (a dialog, a menu, toasts) at load. */
3
+ declare const Example: ComponentType<{ defaultOpen?: boolean }>;
4
+ export default Example;
@@ -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,4 @@
1
+ import type { ComponentType } from "react";
2
+ /** A named example of the @krizaka/ui registry; `defaultOpen` opens what it opens (a dialog, a menu, toasts) at load. */
3
+ declare const Example: ComponentType<{ defaultOpen?: boolean }>;
4
+ export default Example;
@@ -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,4 @@
1
+ import type { ComponentType } from "react";
2
+ /** A named example of the @krizaka/ui registry; `defaultOpen` opens what it opens (a dialog, a menu, toasts) at load. */
3
+ declare const Example: ComponentType<{ defaultOpen?: boolean }>;
4
+ export default Example;
@@ -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
+ };