@krizaka/ui 3.3.0 → 3.4.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 (352) hide show
  1. package/dist/activity-feed.d.ts +199 -0
  2. package/dist/activity-feed.js +155 -0
  3. package/dist/activity-feed.js.map +1 -0
  4. package/dist/argument-card.js +3 -3
  5. package/dist/chunk-7Z4KHPFC.js +42 -0
  6. package/dist/chunk-7Z4KHPFC.js.map +1 -0
  7. package/dist/data-table.js +98 -131
  8. package/dist/data-table.js.map +1 -1
  9. package/dist/description-list.d.ts +105 -0
  10. package/dist/description-list.js +49 -0
  11. package/dist/description-list.js.map +1 -0
  12. package/dist/index.js +13 -66
  13. package/dist/index.js.map +1 -1
  14. package/dist/kanban.d.ts +132 -0
  15. package/dist/kanban.js +187 -0
  16. package/dist/kanban.js.map +1 -0
  17. package/dist/list.d.ts +153 -0
  18. package/dist/list.js +130 -0
  19. package/dist/list.js.map +1 -0
  20. package/dist/map.d.ts +463 -0
  21. package/dist/map.js +952 -0
  22. package/dist/map.js.map +1 -0
  23. package/dist/motion.css +12 -1
  24. package/dist/native/map.d.ts +200 -0
  25. package/dist/native/map.js +673 -0
  26. package/dist/native/map.js.map +1 -0
  27. package/dist/native/media-picker.d.ts +58 -0
  28. package/dist/native/media-picker.js +63 -0
  29. package/dist/native/media-picker.js.map +1 -0
  30. package/dist/native.d.ts +568 -6
  31. package/dist/native.js +1989 -868
  32. package/dist/native.js.map +1 -1
  33. package/dist/page-hero.js +3 -3
  34. package/dist/stat.d.ts +31 -2
  35. package/dist/stat.js +21 -4
  36. package/dist/stat.js.map +1 -1
  37. package/dist/tree-view.d.ts +111 -0
  38. package/dist/tree-view.js +154 -0
  39. package/dist/tree-view.js.map +1 -0
  40. package/package.json +147 -10
  41. package/registry/achievement.json +1 -1
  42. package/registry/action-bar.json +1 -1
  43. package/registry/action-sheet.json +121 -0
  44. package/registry/activity-feed.json +468 -0
  45. package/registry/alert.json +1 -1
  46. package/registry/app-shell.json +1 -1
  47. package/registry/argument-card.json +1 -1
  48. package/registry/audio-player.json +1 -1
  49. package/registry/auth-layout.json +1 -1
  50. package/registry/avatar.json +58 -3
  51. package/registry/badge.json +1 -1
  52. package/registry/button.json +1 -1
  53. package/registry/card-grid.json +1 -1
  54. package/registry/card.json +1 -1
  55. package/registry/catalogue-page.json +1 -1
  56. package/registry/changelog-page.json +1 -1
  57. package/registry/checkbox.json +1 -1
  58. package/registry/chip-link.json +1 -1
  59. package/registry/chip.json +1 -1
  60. package/registry/choice-grid.json +1 -1
  61. package/registry/code-block.json +1 -1
  62. package/registry/combobox.json +1 -1
  63. package/registry/command.json +1 -1
  64. package/registry/component-page.json +1 -1
  65. package/registry/confirm-button.json +1 -1
  66. package/registry/contact-page.json +1 -1
  67. package/registry/continue-prompt.json +1 -1
  68. package/registry/countdown.json +1 -1
  69. package/registry/cta-panel.json +1 -1
  70. package/registry/dashboard-layout.json +1 -1
  71. package/registry/data-table.json +1 -1
  72. package/registry/date-picker.json +2 -2
  73. package/registry/decision-list.json +1 -1
  74. package/registry/description-list.json +232 -0
  75. package/registry/detail-layout.json +1 -1
  76. package/registry/dialog.json +1 -1
  77. package/registry/docs-article-page.json +1 -1
  78. package/registry/docs-hub-page.json +1 -1
  79. package/registry/docs-layout.json +1 -1
  80. package/registry/dropdown-menu.json +1 -1
  81. package/registry/empty-state.json +1 -1
  82. package/registry/error-page.json +1 -1
  83. package/registry/examples/action-sheet/native/video-actions.d.ts +4 -0
  84. package/registry/examples/action-sheet/native/video-actions.dark.png +0 -0
  85. package/registry/examples/action-sheet/native/video-actions.js +30 -0
  86. package/registry/examples/action-sheet/native/video-actions.light.png +0 -0
  87. package/registry/examples/action-sheet/native/video-actions.tsx +24 -0
  88. package/registry/examples/activity-feed/job-activity.d.ts +4 -0
  89. package/registry/examples/activity-feed/job-activity.js +21 -0
  90. package/registry/examples/activity-feed/job-activity.tsx +17 -0
  91. package/registry/examples/activity-feed/live.d.ts +4 -0
  92. package/registry/examples/activity-feed/live.js +23 -0
  93. package/registry/examples/activity-feed/live.tsx +24 -0
  94. package/registry/examples/activity-feed/native/notifications.d.ts +4 -0
  95. package/registry/examples/activity-feed/native/notifications.dark.png +0 -0
  96. package/registry/examples/activity-feed/native/notifications.js +18 -0
  97. package/registry/examples/activity-feed/native/notifications.light.png +0 -0
  98. package/registry/examples/activity-feed/native/notifications.tsx +18 -0
  99. package/registry/examples/activity-feed/timeline.d.ts +4 -0
  100. package/registry/examples/activity-feed/timeline.js +25 -0
  101. package/registry/examples/activity-feed/timeline.tsx +19 -0
  102. package/registry/examples/avatar/native/presence.d.ts +4 -0
  103. package/registry/examples/avatar/native/presence.dark.png +0 -0
  104. package/registry/examples/avatar/native/presence.js +18 -0
  105. package/registry/examples/avatar/native/presence.light.png +0 -0
  106. package/registry/examples/avatar/native/presence.tsx +15 -0
  107. package/registry/examples/description-list/job-details.d.ts +4 -0
  108. package/registry/examples/description-list/job-details.js +23 -0
  109. package/registry/examples/description-list/job-details.tsx +17 -0
  110. package/registry/examples/description-list/key-value-grid.d.ts +4 -0
  111. package/registry/examples/description-list/key-value-grid.js +22 -0
  112. package/registry/examples/description-list/key-value-grid.tsx +16 -0
  113. package/registry/examples/description-list/native/job-details.d.ts +4 -0
  114. package/registry/examples/description-list/native/job-details.dark.png +0 -0
  115. package/registry/examples/description-list/native/job-details.js +33 -0
  116. package/registry/examples/description-list/native/job-details.light.png +0 -0
  117. package/registry/examples/description-list/native/job-details.tsx +24 -0
  118. package/registry/examples/description-list/receipt.d.ts +4 -0
  119. package/registry/examples/description-list/receipt.js +23 -0
  120. package/registry/examples/description-list/receipt.tsx +17 -0
  121. package/registry/examples/fab/native/extended.d.ts +4 -0
  122. package/registry/examples/fab/native/extended.dark.png +0 -0
  123. package/registry/examples/fab/native/extended.js +18 -0
  124. package/registry/examples/fab/native/extended.light.png +0 -0
  125. package/registry/examples/fab/native/extended.tsx +23 -0
  126. package/registry/examples/header/native/large-title.d.ts +4 -0
  127. package/registry/examples/header/native/large-title.dark.png +0 -0
  128. package/registry/examples/header/native/large-title.js +23 -0
  129. package/registry/examples/header/native/large-title.light.png +0 -0
  130. package/registry/examples/header/native/large-title.tsx +31 -0
  131. package/registry/examples/image-viewer/native/gallery.d.ts +4 -0
  132. package/registry/examples/image-viewer/native/gallery.dark.png +0 -0
  133. package/registry/examples/image-viewer/native/gallery.js +22 -0
  134. package/registry/examples/image-viewer/native/gallery.light.png +0 -0
  135. package/registry/examples/image-viewer/native/gallery.tsx +21 -0
  136. package/registry/examples/kanban/moderation.d.ts +4 -0
  137. package/registry/examples/kanban/moderation.js +35 -0
  138. package/registry/examples/kanban/moderation.tsx +37 -0
  139. package/registry/examples/list/jobs.d.ts +4 -0
  140. package/registry/examples/list/jobs.js +35 -0
  141. package/registry/examples/list/jobs.tsx +33 -0
  142. package/registry/examples/list/selectable.d.ts +4 -0
  143. package/registry/examples/list/selectable.js +33 -0
  144. package/registry/examples/list/selectable.tsx +30 -0
  145. package/registry/examples/list/virtualized.d.ts +4 -0
  146. package/registry/examples/list/virtualized.js +22 -0
  147. package/registry/examples/list/virtualized.tsx +17 -0
  148. package/registry/examples/loader/native/block.d.ts +4 -0
  149. package/registry/examples/loader/native/block.dark.png +0 -0
  150. package/registry/examples/loader/native/block.js +12 -0
  151. package/registry/examples/loader/native/block.light.png +0 -0
  152. package/registry/examples/loader/native/block.tsx +11 -0
  153. package/registry/examples/loader/native/job-wait.d.ts +4 -0
  154. package/registry/examples/loader/native/job-wait.dark.png +0 -0
  155. package/registry/examples/loader/native/job-wait.js +17 -0
  156. package/registry/examples/loader/native/job-wait.light.png +0 -0
  157. package/registry/examples/loader/native/job-wait.tsx +14 -0
  158. package/registry/examples/map/cluster.d.ts +4 -0
  159. package/registry/examples/map/cluster.js +16 -0
  160. package/registry/examples/map/cluster.tsx +18 -0
  161. package/registry/examples/map/location-picker.d.ts +4 -0
  162. package/registry/examples/map/location-picker.js +24 -0
  163. package/registry/examples/map/location-picker.tsx +22 -0
  164. package/registry/examples/map/native/location-picker.d.ts +4 -0
  165. package/registry/examples/map/native/location-picker.dark.png +0 -0
  166. package/registry/examples/map/native/location-picker.js +14 -0
  167. package/registry/examples/map/native/location-picker.light.png +0 -0
  168. package/registry/examples/map/native/location-picker.tsx +13 -0
  169. package/registry/examples/map/native/places.d.ts +4 -0
  170. package/registry/examples/map/native/places.dark.png +0 -0
  171. package/registry/examples/map/native/places.js +25 -0
  172. package/registry/examples/map/native/places.light.png +0 -0
  173. package/registry/examples/map/native/places.tsx +27 -0
  174. package/registry/examples/map/places.d.ts +4 -0
  175. package/registry/examples/map/places.js +28 -0
  176. package/registry/examples/map/places.tsx +28 -0
  177. package/registry/examples/map/static.d.ts +4 -0
  178. package/registry/examples/map/static.js +22 -0
  179. package/registry/examples/map/static.tsx +18 -0
  180. package/registry/examples/media-picker/native/story.d.ts +4 -0
  181. package/registry/examples/media-picker/native/story.dark.png +0 -0
  182. package/registry/examples/media-picker/native/story.js +30 -0
  183. package/registry/examples/media-picker/native/story.light.png +0 -0
  184. package/registry/examples/media-picker/native/story.tsx +26 -0
  185. package/registry/examples/meter/native/credits.d.ts +4 -0
  186. package/registry/examples/meter/native/credits.dark.png +0 -0
  187. package/registry/examples/meter/native/credits.js +15 -0
  188. package/registry/examples/meter/native/credits.light.png +0 -0
  189. package/registry/examples/meter/native/credits.tsx +12 -0
  190. package/registry/examples/meter/native/split-ring.d.ts +4 -0
  191. package/registry/examples/meter/native/split-ring.dark.png +0 -0
  192. package/registry/examples/meter/native/split-ring.js +24 -0
  193. package/registry/examples/meter/native/split-ring.light.png +0 -0
  194. package/registry/examples/meter/native/split-ring.tsx +19 -0
  195. package/registry/examples/number-ticker/native/balance.d.ts +4 -0
  196. package/registry/examples/number-ticker/native/balance.dark.png +0 -0
  197. package/registry/examples/number-ticker/native/balance.js +18 -0
  198. package/registry/examples/number-ticker/native/balance.light.png +0 -0
  199. package/registry/examples/number-ticker/native/balance.tsx +17 -0
  200. package/registry/examples/onboarding/native/first-launch.d.ts +4 -0
  201. package/registry/examples/onboarding/native/first-launch.dark.png +0 -0
  202. package/registry/examples/onboarding/native/first-launch.js +23 -0
  203. package/registry/examples/onboarding/native/first-launch.light.png +0 -0
  204. package/registry/examples/onboarding/native/first-launch.tsx +19 -0
  205. package/registry/examples/otp-input/native/invalid.d.ts +4 -0
  206. package/registry/examples/otp-input/native/invalid.dark.png +0 -0
  207. package/registry/examples/otp-input/native/invalid.js +15 -0
  208. package/registry/examples/otp-input/native/invalid.light.png +0 -0
  209. package/registry/examples/otp-input/native/invalid.tsx +14 -0
  210. package/registry/examples/otp-input/native/verify.d.ts +4 -0
  211. package/registry/examples/otp-input/native/verify.dark.png +0 -0
  212. package/registry/examples/otp-input/native/verify.js +17 -0
  213. package/registry/examples/otp-input/native/verify.light.png +0 -0
  214. package/registry/examples/otp-input/native/verify.tsx +14 -0
  215. package/registry/examples/permission-prompt/native/blocked.d.ts +4 -0
  216. package/registry/examples/permission-prompt/native/blocked.dark.png +0 -0
  217. package/registry/examples/permission-prompt/native/blocked.js +25 -0
  218. package/registry/examples/permission-prompt/native/blocked.light.png +0 -0
  219. package/registry/examples/permission-prompt/native/blocked.tsx +21 -0
  220. package/registry/examples/permission-prompt/native/camera.d.ts +4 -0
  221. package/registry/examples/permission-prompt/native/camera.dark.png +0 -0
  222. package/registry/examples/permission-prompt/native/camera.js +25 -0
  223. package/registry/examples/permission-prompt/native/camera.light.png +0 -0
  224. package/registry/examples/permission-prompt/native/camera.tsx +21 -0
  225. package/registry/examples/pull-to-refresh/native/feed.d.ts +4 -0
  226. package/registry/examples/pull-to-refresh/native/feed.dark.png +0 -0
  227. package/registry/examples/pull-to-refresh/native/feed.js +14 -0
  228. package/registry/examples/pull-to-refresh/native/feed.light.png +0 -0
  229. package/registry/examples/pull-to-refresh/native/feed.tsx +19 -0
  230. package/registry/examples/search-field/native/cancel.d.ts +4 -0
  231. package/registry/examples/search-field/native/cancel.dark.png +0 -0
  232. package/registry/examples/search-field/native/cancel.js +14 -0
  233. package/registry/examples/search-field/native/cancel.light.png +0 -0
  234. package/registry/examples/search-field/native/cancel.tsx +13 -0
  235. package/registry/examples/stat/grid.d.ts +4 -0
  236. package/registry/examples/stat/grid.js +17 -0
  237. package/registry/examples/stat/grid.tsx +14 -0
  238. package/registry/examples/stepper/native/run.d.ts +4 -0
  239. package/registry/examples/stepper/native/run.dark.png +0 -0
  240. package/registry/examples/stepper/native/run.js +24 -0
  241. package/registry/examples/stepper/native/run.light.png +0 -0
  242. package/registry/examples/stepper/native/run.tsx +20 -0
  243. package/registry/examples/swipeable-row/native/conversation.d.ts +4 -0
  244. package/registry/examples/swipeable-row/native/conversation.dark.png +0 -0
  245. package/registry/examples/swipeable-row/native/conversation.js +30 -0
  246. package/registry/examples/swipeable-row/native/conversation.light.png +0 -0
  247. package/registry/examples/swipeable-row/native/conversation.tsx +27 -0
  248. package/registry/examples/tab-bar/native/main-sections.d.ts +4 -0
  249. package/registry/examples/tab-bar/native/main-sections.dark.png +0 -0
  250. package/registry/examples/tab-bar/native/main-sections.js +29 -0
  251. package/registry/examples/tab-bar/native/main-sections.light.png +0 -0
  252. package/registry/examples/tab-bar/native/main-sections.tsx +30 -0
  253. package/registry/examples/tabs/native/sections.d.ts +4 -0
  254. package/registry/examples/tabs/native/sections.dark.png +0 -0
  255. package/registry/examples/tabs/native/sections.js +23 -0
  256. package/registry/examples/tabs/native/sections.light.png +0 -0
  257. package/registry/examples/tabs/native/sections.tsx +19 -0
  258. package/registry/examples/tabs/native/segmented.d.ts +4 -0
  259. package/registry/examples/tabs/native/segmented.dark.png +0 -0
  260. package/registry/examples/tabs/native/segmented.js +22 -0
  261. package/registry/examples/tabs/native/segmented.light.png +0 -0
  262. package/registry/examples/tabs/native/segmented.tsx +18 -0
  263. package/registry/examples/toast/native/snackbar.d.ts +4 -0
  264. package/registry/examples/toast/native/snackbar.dark.png +0 -0
  265. package/registry/examples/toast/native/snackbar.js +23 -0
  266. package/registry/examples/toast/native/snackbar.light.png +0 -0
  267. package/registry/examples/toast/native/snackbar.tsx +21 -0
  268. package/registry/examples/tree-view/docs.d.ts +4 -0
  269. package/registry/examples/tree-view/docs.js +24 -0
  270. package/registry/examples/tree-view/docs.tsx +22 -0
  271. package/registry/examples/tree-view/lazy.d.ts +4 -0
  272. package/registry/examples/tree-view/lazy.js +21 -0
  273. package/registry/examples/tree-view/lazy.tsx +19 -0
  274. package/registry/fab.json +122 -0
  275. package/registry/field.json +1 -1
  276. package/registry/file-upload.json +2 -2
  277. package/registry/filter-bar.json +1 -1
  278. package/registry/form.json +2 -2
  279. package/registry/gallery-page.json +1 -1
  280. package/registry/glow-card.json +1 -1
  281. package/registry/goal-gauge.json +1 -1
  282. package/registry/header.json +137 -0
  283. package/registry/how-it-works-page.json +1 -1
  284. package/registry/image-cropper.json +1 -1
  285. package/registry/image-viewer.json +107 -0
  286. package/registry/index.json +299 -25
  287. package/registry/iso.json +1 -1
  288. package/registry/kanban.json +253 -0
  289. package/registry/kbd.json +1 -1
  290. package/registry/landing-page.json +1 -1
  291. package/registry/landscape.json +1 -1
  292. package/registry/legal-page.json +1 -1
  293. package/registry/link-card.json +1 -1
  294. package/registry/list.json +367 -30
  295. package/registry/loader.json +157 -4
  296. package/registry/longform-page.json +1 -1
  297. package/registry/map.json +1368 -0
  298. package/registry/marketing-layout.json +1 -1
  299. package/registry/marquee.json +1 -1
  300. package/registry/mascot-quote.json +1 -1
  301. package/registry/mascot-state.json +1 -1
  302. package/registry/mascots.json +1 -1
  303. package/registry/media-capture.json +1 -1
  304. package/registry/media-picker.json +129 -0
  305. package/registry/meter.json +136 -4
  306. package/registry/nav-bar.json +1 -1
  307. package/registry/number-ticker.json +96 -4
  308. package/registry/onboarding.json +95 -0
  309. package/registry/otp-input.json +150 -0
  310. package/registry/page-header.json +1 -1
  311. package/registry/page-hero.json +1 -1
  312. package/registry/page.json +1 -1
  313. package/registry/pagination.json +1 -1
  314. package/registry/permission-prompt.json +172 -0
  315. package/registry/pointer-light.json +1 -1
  316. package/registry/popover.json +1 -1
  317. package/registry/pricing-page.json +1 -1
  318. package/registry/product-page.json +1 -1
  319. package/registry/profile-card.json +1 -1
  320. package/registry/progress.json +2 -2
  321. package/registry/promise-card.json +1 -1
  322. package/registry/pull-to-refresh.json +74 -0
  323. package/registry/radio-group.json +1 -1
  324. package/registry/scroll-stage.json +1 -1
  325. package/registry/search-field.json +30 -3
  326. package/registry/section-backdrop.json +1 -1
  327. package/registry/separator.json +1 -1
  328. package/registry/settings-layout.json +1 -1
  329. package/registry/skeleton.json +1 -1
  330. package/registry/slider.json +1 -1
  331. package/registry/slot.json +1 -1
  332. package/registry/spinner.json +1 -1
  333. package/registry/split-view.json +1 -1
  334. package/registry/stage-banner.json +1 -1
  335. package/registry/stat.json +68 -5
  336. package/registry/status-page.json +1 -1
  337. package/registry/stepper.json +75 -4
  338. package/registry/swipeable-row.json +124 -0
  339. package/registry/switch.json +1 -1
  340. package/registry/tab-bar.json +115 -0
  341. package/registry/tabs.json +94 -4
  342. package/registry/tag-input.json +1 -1
  343. package/registry/terminal-replay.json +1 -1
  344. package/registry/theme.json +8 -1
  345. package/registry/toast.json +17 -3
  346. package/registry/toc.json +1 -1
  347. package/registry/tooltip.json +1 -1
  348. package/registry/tree-view.json +291 -0
  349. package/registry/video-player.json +1 -1
  350. package/registry/video-trimmer.json +1 -1
  351. package/registry/virtual.json +1 -1
  352. package/skills/map/SKILL.md +35 -0
@@ -0,0 +1,17 @@
1
+ import { DescriptionList } from "@krizaka/ui/description-list";
2
+
3
+ // Inline: a tip's breakdown, read like a receipt.
4
+ export default function DescriptionListReceipt() {
5
+ return (
6
+ <DescriptionList
7
+ layout="inline"
8
+ className="max-w-sm"
9
+ items={[
10
+ { term: "Tip from @mina", details: "$10.00" },
11
+ { term: "Payment fees", details: "−$0.50" },
12
+ { term: "Platform", details: "−$1.00" },
13
+ { term: "To you", details: "$8.50", hint: "paid on Oct 15" },
14
+ ]}
15
+ />
16
+ );
17
+ }
@@ -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,18 @@
1
+ "use client";
2
+
3
+ // registry/examples/fab/native/extended.tsx
4
+ import { Fab, useTheme } from "@krizaka/ui/native";
5
+ import { View } from "react-native";
6
+ import Svg, { Path } from "react-native-svg";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ function NativeFabExtended() {
9
+ const { theme } = useTheme();
10
+ const plus = /* @__PURE__ */ jsx(Svg, { width: 22, height: 22, viewBox: "0 0 24 24", stroke: theme.onAccent, strokeWidth: 2.4, strokeLinecap: "round", children: /* @__PURE__ */ jsx(Path, { d: "M12 5v14M5 12h14" }) });
11
+ return /* @__PURE__ */ jsxs(View, { style: { width: 360, height: 200, flexDirection: "row" }, children: [
12
+ /* @__PURE__ */ jsx(View, { style: { flex: 1 }, children: /* @__PURE__ */ jsx(Fab, { label: "New challenge", icon: plus, extended: true, onPress: () => void 0 }) }),
13
+ /* @__PURE__ */ jsx(View, { style: { flex: 1 }, children: /* @__PURE__ */ jsx(Fab, { label: "New challenge", icon: plus, onPress: () => void 0 }) })
14
+ ] });
15
+ }
16
+ export {
17
+ NativeFabExtended as default
18
+ };
@@ -0,0 +1,23 @@
1
+ import { Fab, useTheme } from "@krizaka/ui/native";
2
+ import { View } from "react-native";
3
+ import Svg, { Path } from "react-native-svg";
4
+
5
+ // The screen's one main action, floating over the list, above the tab bar (`offset`).
6
+ export default function NativeFabExtended() {
7
+ const { theme } = useTheme();
8
+ const plus = (
9
+ <Svg width={22} height={22} viewBox="0 0 24 24" stroke={theme.onAccent} strokeWidth={2.4} strokeLinecap="round">
10
+ <Path d="M12 5v14M5 12h14" />
11
+ </Svg>
12
+ );
13
+ return (
14
+ <View style={{ width: 360, height: 200, flexDirection: "row" }}>
15
+ <View style={{ flex: 1 }}>
16
+ <Fab label="New challenge" icon={plus} extended onPress={() => undefined} />
17
+ </View>
18
+ <View style={{ flex: 1 }}>
19
+ <Fab label="New challenge" icon={plus} onPress={() => undefined} />
20
+ </View>
21
+ </View>
22
+ );
23
+ }
@@ -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,23 @@
1
+ "use client";
2
+
3
+ // registry/examples/header/native/large-title.tsx
4
+ import { Header, IconButton, SearchField, Txt, useCollapsingHeader, useTheme } from "@krizaka/ui/native";
5
+ import { Animated, View } from "react-native";
6
+ import Svg, { Path } from "react-native-svg";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ var DAYS = ["Today", "Yesterday", "Monday", "Sunday", "Saturday", "Friday", "Thursday"];
9
+ function NativeHeaderLargeTitle() {
10
+ const { scrollY, onScroll } = useCollapsingHeader();
11
+ const { theme } = useTheme();
12
+ const plus = /* @__PURE__ */ jsx(Svg, { width: 20, height: 20, viewBox: "0 0 24 24", stroke: theme.textPrimary, strokeWidth: 2.4, strokeLinecap: "round", children: /* @__PURE__ */ jsx(Path, { d: "M12 5v14M5 12h14" }) });
13
+ return /* @__PURE__ */ jsxs(View, { style: { width: 360, height: 420 }, children: [
14
+ /* @__PURE__ */ jsx(Header, { title: "Earnings", subtitle: "$1,990.40 this year", scrollY, actions: /* @__PURE__ */ jsx(IconButton, { label: "Withdraw", icon: plus, variant: "ghost" }), children: /* @__PURE__ */ jsx(SearchField, { label: "Search payouts", placeholder: "Search payouts", clearLabel: "Clear" }) }),
15
+ /* @__PURE__ */ jsx(Animated.ScrollView, { tabIndex: 0, onScroll, scrollEventThrottle: 16, children: DAYS.map((day) => /* @__PURE__ */ jsxs(View, { style: { flexDirection: "row", justifyContent: "space-between", paddingHorizontal: 16, paddingVertical: 14 }, children: [
16
+ /* @__PURE__ */ jsx(Txt, { variant: "label", children: `Tips \xB7 ${day}` }),
17
+ /* @__PURE__ */ jsx(Txt, { tone: "secondary", children: "$24.00" })
18
+ ] }, day)) })
19
+ ] });
20
+ }
21
+ export {
22
+ NativeHeaderLargeTitle as default
23
+ };
@@ -0,0 +1,31 @@
1
+ import { Header, IconButton, SearchField, Txt, useCollapsingHeader, useTheme } from "@krizaka/ui/native";
2
+ import { Animated, View } from "react-native";
3
+ import Svg, { Path } from "react-native-svg";
4
+
5
+ const DAYS = ["Today", "Yesterday", "Monday", "Sunday", "Saturday", "Friday", "Thursday"];
6
+
7
+ // A large title that folds into the bar as the list scrolls under it.
8
+ export default function NativeHeaderLargeTitle() {
9
+ const { scrollY, onScroll } = useCollapsingHeader();
10
+ const { theme } = useTheme();
11
+ const plus = (
12
+ <Svg width={20} height={20} viewBox="0 0 24 24" stroke={theme.textPrimary} strokeWidth={2.4} strokeLinecap="round">
13
+ <Path d="M12 5v14M5 12h14" />
14
+ </Svg>
15
+ );
16
+ return (
17
+ <View style={{ width: 360, height: 420 }}>
18
+ <Header title="Earnings" subtitle="$1,990.40 this year" scrollY={scrollY} actions={<IconButton label="Withdraw" icon={plus} variant="ghost" />}>
19
+ <SearchField label="Search payouts" placeholder="Search payouts" clearLabel="Clear" />
20
+ </Header>
21
+ <Animated.ScrollView tabIndex={0} onScroll={onScroll} scrollEventThrottle={16}>
22
+ {DAYS.map((day) => (
23
+ <View key={day} style={{ flexDirection: "row", justifyContent: "space-between", paddingHorizontal: 16, paddingVertical: 14 }}>
24
+ <Txt variant="label">{`Tips · ${day}`}</Txt>
25
+ <Txt tone="secondary">$24.00</Txt>
26
+ </View>
27
+ ))}
28
+ </Animated.ScrollView>
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,22 @@
1
+ "use client";
2
+
3
+ // registry/examples/image-viewer/native/gallery.tsx
4
+ import { Button, ImageViewer } from "@krizaka/ui/native";
5
+ import { useState } from "react";
6
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
7
+ var png = (data) => `data:image/png;base64,${data}`;
8
+ var PHOTOS = [
9
+ { uri: png("iVBORw0KGgoAAAANSUhEUgAAABgAAAAQCAIAAACDRijCAAAB90lEQVR42nVU247TMBCdGU/s3CilhdXy0C28sRLfwf//BLtspV6gbZzYjoeHdFOnLNI82Nbo6Nxk/P7xB5EwwesIEzACM2iFRa4Ko0xGKFFCkNATRobpMgEhsCIhAnUZGQ6MoBVWZbb8UCwWRZlnvffnP4092t55kjhuDkMorBVQgj3Q0Qx1yXd39Xq9WK3m72rT2W7ztN/83B33x945upIChUIEA5CMEAPh0qjlovj6ZfHt8f5hvawq3Vo3n+VGwbOE8yFI3w8QF2kErJXQFUWYQDNWOX9alKvV/GG9vP/83hh2LigQb607nqS1oYsEcSRFNEjDiXNaQa6xKnhWm7rSxmRZRohYVaauTJmz0UhBEnWDNIJpaqAJFIgE79qus513noCDC67tQttJ7xkiKiBIUptIu5IS7EN7ara/9puZUYRlqZ1126ftYbN3pwZjYBROnB3NnjaIQEnfnezueZsrCbarau2sO7zsDi9b3zRKeqXSfG5Sw4QXinh/Ppw2Errjucg5+tCezu7cgPcZpvsylYa3ZWWM4p39HaRtG0aEiH3AGBljGnHiEU2lJTVjEIoxdn0IwChEwjghMk3t32YnTWMCpnjli7ebTDKanaZ2A5EqfYPI+H5lpC7b8gbE/4lMmq1oABJFoPD2G7gMptfXM16vRPAXAU4Dl1f5CK8AAAAASUVORK5CYII="), alt: "Elena on stage, backlit", caption: "Sunset session \xB7 Lisbon" },
10
+ { uri: png("iVBORw0KGgoAAAANSUhEUgAAABgAAAAQCAIAAACDRijCAAAB6klEQVR42o2T3W4TQQyF7eOZnexmq2wiaLmgrbgB2ifgjvd/AwrlCokmNEXpNtn/8XCR5q/dApIvrNGx9dnjw6PzzwSwCEQYAhGIEIRYWIQYDGEIi2wTwrNHwDCwDiPiXDRwxlirxI3nVtkzmLHVbEIOAwQYNoYBa0yauNfj5GScDOOobMPtspsvu6INSo+VdMi1l4ABA7Fikcbu9Pjo4ix7/zbLjlxe+G/T1Zeb8ud9UzRBaVtw0IX2R4MxA2ePJ8OL88mnj68uz8ajYZQX3WQUs31ofzxM77vaM/WD7HIjNooH0ckk/XCaXZ6N371JE2fKxhNkUdFsqYu66poQCD0gh0TWRFGSuCx1ozRKnHFWiHk0tFnqkjiykYduNtU34CMRiwSWynNeaV5q2SgTl63mteZVqD0rG5YAQi/IJocJkEZ5vvTXv6rJqCAgi21e+6tZ9X1ez1ehURD4BRCh3R2JbQl3hV5NK5blogrZMMorvZ43X2/b3yV1W5YeENkRQUxglB3f5F1L5WwVhgNbepqv9K7Q0nOA4CWQTRcGDBvLgDKKDrOlX7SNNeoZjXKnrPx3kINlr10iCqlV2obZE4MJIP4XyMH3rxttnsLasfhPkK1y47Ve0Ra776yfLxt7UqAvnnp9bfcnsj/xIr3biGqZngAAAABJRU5ErkJggg=="), alt: "The crowd at the front" },
11
+ { uri: png("iVBORw0KGgoAAAANSUhEUgAAABgAAAAQCAIAAACDRijCAAABrklEQVR42o1Ty3LbMAwEFiCpR5vY1iVOT+2pP9H//5lOHfklmc8ebDmexEpyIQEMZrmLBfnXn98Aq7CAFSy3sUyVmeI1BljPF6b8zSlgAeSTBgZYjQKYfW2OwpWgCiYgYdxvwnuZc9pfGX2RiBFMDRCQTLgAq5WL2k+JGIUzWhk1KqBSKDMV5qKTNOALE7EitbOPbbNo2sqZnOLgx5Mfc44MOks7z+ijiRhB4+zq+8Nz1z0tlk3lQvD/dv1mvzkMh1wiM6m9YTRnTWV00bY/uu7n03q97GpnQ/APTe0M/nIZ/DGXfMf+NyhG0Ti7/NauV8vnVdc9PFrRmCKAlH0IA1EIKX5g/2VHjMCpNM62VdU4a9UowMy1s42ramsGL0zp1f65HTHKIlRKitH7EGKKzJJyCjHE5Imzgkjx3v4LkVtcpuTD0B/6za4W4crYmML28LI/bkMcmbMKXey/8yevuGBw8fHUH3qrSDnUzsXkt4ft/tindBIuLLjazyK4a9w5oJLG03GzKzGO1hgqyccxhBOVbIQZrAJg/ltfU2bKOY6noeSoCmEiSkwZYAAA/wd2L6cjlMdGoAAAAABJRU5ErkJggg=="), alt: "The band packing up" }
12
+ ];
13
+ function NativeImageViewerGallery({ defaultOpen = false }) {
14
+ const [index, setIndex] = useState(defaultOpen ? 0 : null);
15
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
16
+ /* @__PURE__ */ jsx(Button, { label: "Open the photos", onPress: () => setIndex(0) }),
17
+ /* @__PURE__ */ jsx(ImageViewer, { images: PHOTOS, index, onIndexChange: setIndex, closeLabel: "Close", positionLabel: (n, total) => `${n} of ${total}` })
18
+ ] });
19
+ }
20
+ export {
21
+ NativeImageViewerGallery as default
22
+ };
@@ -0,0 +1,21 @@
1
+ import { Button, ImageViewer } from "@krizaka/ui/native";
2
+ import { useState } from "react";
3
+
4
+ // Stand-in photos (an app passes its CDN's URIs): tiny PNGs, so the example runs offline.
5
+ const png = (data: string) => `data:image/png;base64,${data}`;
6
+ const PHOTOS = [
7
+ { uri: png("iVBORw0KGgoAAAANSUhEUgAAABgAAAAQCAIAAACDRijCAAAB90lEQVR42nVU247TMBCdGU/s3CilhdXy0C28sRLfwf//BLtspV6gbZzYjoeHdFOnLNI82Nbo6Nxk/P7xB5EwwesIEzACM2iFRa4Ko0xGKFFCkNATRobpMgEhsCIhAnUZGQ6MoBVWZbb8UCwWRZlnvffnP4092t55kjhuDkMorBVQgj3Q0Qx1yXd39Xq9WK3m72rT2W7ztN/83B33x945upIChUIEA5CMEAPh0qjlovj6ZfHt8f5hvawq3Vo3n+VGwbOE8yFI3w8QF2kErJXQFUWYQDNWOX9alKvV/GG9vP/83hh2LigQb607nqS1oYsEcSRFNEjDiXNaQa6xKnhWm7rSxmRZRohYVaauTJmz0UhBEnWDNIJpaqAJFIgE79qus513noCDC67tQttJ7xkiKiBIUptIu5IS7EN7ara/9puZUYRlqZ1126ftYbN3pwZjYBROnB3NnjaIQEnfnezueZsrCbarau2sO7zsDi9b3zRKeqXSfG5Sw4QXinh/Ppw2Errjucg5+tCezu7cgPcZpvsylYa3ZWWM4p39HaRtG0aEiH3AGBljGnHiEU2lJTVjEIoxdn0IwChEwjghMk3t32YnTWMCpnjli7ebTDKanaZ2A5EqfYPI+H5lpC7b8gbE/4lMmq1oABJFoPD2G7gMptfXM16vRPAXAU4Dl1f5CK8AAAAASUVORK5CYII="), alt: "Elena on stage, backlit", caption: "Sunset session · Lisbon" },
8
+ { uri: png("iVBORw0KGgoAAAANSUhEUgAAABgAAAAQCAIAAACDRijCAAAB6klEQVR42o2T3W4TQQyF7eOZnexmq2wiaLmgrbgB2ifgjvd/AwrlCokmNEXpNtn/8XCR5q/dApIvrNGx9dnjw6PzzwSwCEQYAhGIEIRYWIQYDGEIi2wTwrNHwDCwDiPiXDRwxlirxI3nVtkzmLHVbEIOAwQYNoYBa0yauNfj5GScDOOobMPtspsvu6INSo+VdMi1l4ABA7Fikcbu9Pjo4ix7/zbLjlxe+G/T1Zeb8ud9UzRBaVtw0IX2R4MxA2ePJ8OL88mnj68uz8ajYZQX3WQUs31ofzxM77vaM/WD7HIjNooH0ckk/XCaXZ6N371JE2fKxhNkUdFsqYu66poQCD0gh0TWRFGSuCx1ozRKnHFWiHk0tFnqkjiykYduNtU34CMRiwSWynNeaV5q2SgTl63mteZVqD0rG5YAQi/IJocJkEZ5vvTXv6rJqCAgi21e+6tZ9X1ez1ehURD4BRCh3R2JbQl3hV5NK5blogrZMMorvZ43X2/b3yV1W5YeENkRQUxglB3f5F1L5WwVhgNbepqv9K7Q0nOA4CWQTRcGDBvLgDKKDrOlX7SNNeoZjXKnrPx3kINlr10iCqlV2obZE4MJIP4XyMH3rxttnsLasfhPkK1y47Ve0Ra776yfLxt7UqAvnnp9bfcnsj/xIr3biGqZngAAAABJRU5ErkJggg=="), alt: "The crowd at the front" },
9
+ { uri: png("iVBORw0KGgoAAAANSUhEUgAAABgAAAAQCAIAAACDRijCAAABrklEQVR42o1Ty3LbMAwEFiCpR5vY1iVOT+2pP9H//5lOHfklmc8ebDmexEpyIQEMZrmLBfnXn98Aq7CAFSy3sUyVmeI1BljPF6b8zSlgAeSTBgZYjQKYfW2OwpWgCiYgYdxvwnuZc9pfGX2RiBFMDRCQTLgAq5WL2k+JGIUzWhk1KqBSKDMV5qKTNOALE7EitbOPbbNo2sqZnOLgx5Mfc44MOks7z+ijiRhB4+zq+8Nz1z0tlk3lQvD/dv1mvzkMh1wiM6m9YTRnTWV00bY/uu7n03q97GpnQ/APTe0M/nIZ/DGXfMf+NyhG0Ti7/NauV8vnVdc9PFrRmCKAlH0IA1EIKX5g/2VHjMCpNM62VdU4a9UowMy1s42ramsGL0zp1f65HTHKIlRKitH7EGKKzJJyCjHE5Imzgkjx3v4LkVtcpuTD0B/6za4W4crYmML28LI/bkMcmbMKXey/8yevuGBw8fHUH3qrSDnUzsXkt4ft/tindBIuLLjazyK4a9w5oJLG03GzKzGO1hgqyccxhBOVbIQZrAJg/ltfU2bKOY6noeSoCmEiSkwZYAAA/wd2L6cjlMdGoAAAAABJRU5ErkJggg=="), alt: "The band packing up" },
10
+ ];
11
+
12
+ // Full screen: pinch or double tap to zoom, swipe between photos, swipe down to close.
13
+ export default function NativeImageViewerGallery({ defaultOpen = false }: { defaultOpen?: boolean }) {
14
+ const [index, setIndex] = useState<number | null>(defaultOpen ? 0 : null);
15
+ return (
16
+ <>
17
+ <Button label="Open the photos" onPress={() => setIndex(0)} />
18
+ <ImageViewer images={PHOTOS} index={index} onIndexChange={setIndex} closeLabel="Close" positionLabel={(n, total) => `${n} of ${total}`} />
19
+ </>
20
+ );
21
+ }
@@ -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,35 @@
1
+ "use client";
2
+
3
+ // registry/examples/kanban/moderation.tsx
4
+ import { Badge } from "@krizaka/ui/badge";
5
+ import { Kanban } from "@krizaka/ui/kanban";
6
+ import { useState } from "react";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ var columns = [
9
+ { id: "open", title: "To review", limit: 3 },
10
+ { id: "reviewing", title: "Reviewing" },
11
+ { id: "resolved", title: "Resolved" }
12
+ ];
13
+ function KanbanModeration() {
14
+ const [reports, setReports] = useState([
15
+ { id: "r1", video: "Backflip on the beach", reason: "Dangerous act", status: "open" },
16
+ { id: "r2", video: "Cover of the summer hit", reason: "Copyright", status: "open" },
17
+ { id: "r3", video: "Night drive", reason: "Copyright", status: "reviewing" },
18
+ { id: "r4", video: "Q&A with fans", reason: "Spam", status: "resolved" }
19
+ ]);
20
+ const move = ({ cardId, to, index }) => setReports((all) => {
21
+ const card = { ...all.find((r) => r.id === cardId), status: to };
22
+ const rest = all.filter((r) => r.id !== cardId);
23
+ const before = rest.filter((r) => r.status === to).slice(0, index);
24
+ const at = before.length ? rest.indexOf(before[before.length - 1]) + 1 : rest.findIndex((r) => r.status === to);
25
+ return [...rest.slice(0, Math.max(0, at)), card, ...rest.slice(Math.max(0, at))];
26
+ });
27
+ const render = (r) => /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-start gap-1.5", children: [
28
+ /* @__PURE__ */ jsx("span", { className: "font-semibold", children: r.video }),
29
+ /* @__PURE__ */ jsx(Badge, { tone: r.reason === "Copyright" ? "warning" : "neutral", children: r.reason })
30
+ ] });
31
+ return /* @__PURE__ */ jsx(Kanban, { "aria-label": "Moderation queue", columns, cards: reports, getId: (r) => r.id, getColumn: (r) => r.status, getTitle: (r) => r.video, renderCard: render, onMove: move });
32
+ }
33
+ export {
34
+ KanbanModeration as default
35
+ };
@@ -0,0 +1,37 @@
1
+ "use client";
2
+
3
+ import { Badge } from "@krizaka/ui/badge";
4
+ import { Kanban, type KanbanMove } from "@krizaka/ui/kanban";
5
+ import { useState } from "react";
6
+
7
+ type Report = { id: string; video: string; reason: string; status: string };
8
+ const columns = [
9
+ { id: "open", title: "To review", limit: 3 },
10
+ { id: "reviewing", title: "Reviewing" },
11
+ { id: "resolved", title: "Resolved" },
12
+ ];
13
+
14
+ // The moderation queue: drag a report, or press Space and the arrow keys — every move announced.
15
+ export default function KanbanModeration() {
16
+ const [reports, setReports] = useState<Report[]>([
17
+ { id: "r1", video: "Backflip on the beach", reason: "Dangerous act", status: "open" },
18
+ { id: "r2", video: "Cover of the summer hit", reason: "Copyright", status: "open" },
19
+ { id: "r3", video: "Night drive", reason: "Copyright", status: "reviewing" },
20
+ { id: "r4", video: "Q&A with fans", reason: "Spam", status: "resolved" },
21
+ ]);
22
+ const move = ({ cardId, to, index }: KanbanMove) =>
23
+ setReports((all) => {
24
+ const card = { ...all.find((r) => r.id === cardId)!, status: to };
25
+ const rest = all.filter((r) => r.id !== cardId);
26
+ const before = rest.filter((r) => r.status === to).slice(0, index);
27
+ const at = before.length ? rest.indexOf(before[before.length - 1]!) + 1 : rest.findIndex((r) => r.status === to);
28
+ return [...rest.slice(0, Math.max(0, at)), card, ...rest.slice(Math.max(0, at))];
29
+ });
30
+ const render = (r: Report) => (
31
+ <div className="flex flex-col items-start gap-1.5">
32
+ <span className="font-semibold">{r.video}</span>
33
+ <Badge tone={r.reason === "Copyright" ? "warning" : "neutral"}>{r.reason}</Badge>
34
+ </div>
35
+ );
36
+ return <Kanban aria-label="Moderation queue" columns={columns} cards={reports} getId={(r) => r.id} getColumn={(r) => r.status} getTitle={(r) => r.video} renderCard={render} onMove={move} />;
37
+ }
@@ -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,35 @@
1
+ "use client";
2
+
3
+ // registry/examples/list/jobs.tsx
4
+ import { Badge } from "@krizaka/ui/badge";
5
+ import { List } from "@krizaka/ui/list";
6
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
7
+ var jobs = [
8
+ { id: "j1", name: "Dub \u201CSunset session\u201D into English", studio: "Dubbing studio", status: "running", when: "now" },
9
+ { id: "j2", name: "Transcribe the interview with Elena", studio: "Transcript studio", status: "done", when: "14:02" },
10
+ { id: "j3", name: "Clip the five best moments", studio: "Clips studio", status: "failed", when: "12:15" }
11
+ ];
12
+ var TONE = { running: "accent", done: "success", failed: "danger" };
13
+ function ListJobs() {
14
+ return /* @__PURE__ */ jsx(
15
+ List,
16
+ {
17
+ "aria-label": "Jobs",
18
+ items: jobs,
19
+ getId: (j) => j.id,
20
+ chevrons: true,
21
+ row: (j) => ({
22
+ title: j.name,
23
+ description: j.studio,
24
+ href: `#/jobs/${j.id}`,
25
+ meta: /* @__PURE__ */ jsxs(Fragment, { children: [
26
+ /* @__PURE__ */ jsx(Badge, { tone: TONE[j.status], children: j.status }),
27
+ /* @__PURE__ */ jsx("span", { children: j.when })
28
+ ] })
29
+ })
30
+ }
31
+ );
32
+ }
33
+ export {
34
+ ListJobs as default
35
+ };
@@ -0,0 +1,33 @@
1
+ import { Badge } from "@krizaka/ui/badge";
2
+ import { List } from "@krizaka/ui/list";
3
+
4
+ type Job = { id: string; name: string; studio: string; status: "running" | "done" | "failed"; when: string };
5
+ const jobs: Job[] = [
6
+ { id: "j1", name: "Dub “Sunset session” into English", studio: "Dubbing studio", status: "running", when: "now" },
7
+ { id: "j2", name: "Transcribe the interview with Elena", studio: "Transcript studio", status: "done", when: "14:02" },
8
+ { id: "j3", name: "Clip the five best moments", studio: "Clips studio", status: "failed", when: "12:15" },
9
+ ];
10
+ const TONE = { running: "accent", done: "success", failed: "danger" } as const;
11
+
12
+ // Orazaka's jobs: each row opens its run; the status and the time beside it.
13
+ export default function ListJobs() {
14
+ return (
15
+ <List
16
+ aria-label="Jobs"
17
+ items={jobs}
18
+ getId={(j) => j.id}
19
+ chevrons
20
+ row={(j) => ({
21
+ title: j.name,
22
+ description: j.studio,
23
+ href: `#/jobs/${j.id}`,
24
+ meta: (
25
+ <>
26
+ <Badge tone={TONE[j.status]}>{j.status}</Badge>
27
+ <span>{j.when}</span>
28
+ </>
29
+ ),
30
+ })}
31
+ />
32
+ );
33
+ }
@@ -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/list/selectable.tsx
4
+ import { Avatar } from "@krizaka/ui/avatar";
5
+ import { Button } from "@krizaka/ui/button";
6
+ import { List } from "@krizaka/ui/list";
7
+ import { useState } from "react";
8
+ import { jsx } from "react/jsx-runtime";
9
+ var viewers = [
10
+ { id: "u1", name: "Mina Okafor", handle: "@mina", tipped: "$12" },
11
+ { id: "u2", name: "Alex Moreau", handle: "@alex", tipped: "$5" },
12
+ { id: "u3", name: "Elena Ruiz", handle: "@elena", tipped: "\u2014" }
13
+ ];
14
+ function ListSelectable() {
15
+ const [selected, setSelected] = useState(["u1"]);
16
+ return /* @__PURE__ */ jsx(
17
+ List,
18
+ {
19
+ "aria-label": "Viewers of your story",
20
+ density: "compact",
21
+ items: viewers,
22
+ getId: (v) => v.id,
23
+ selectable: true,
24
+ selected,
25
+ onSelectedChange: setSelected,
26
+ row: (v) => ({ title: v.name, description: v.handle, leading: /* @__PURE__ */ jsx(Avatar, { alt: v.name, fallback: v.name.charAt(0), size: "sm" }), meta: v.tipped }),
27
+ footer: /* @__PURE__ */ jsx(Button, { size: "sm", variant: "primary", disabled: selected.length === 0, children: `Thank ${selected.length}` })
28
+ }
29
+ );
30
+ }
31
+ export {
32
+ ListSelectable as default
33
+ };
@@ -0,0 +1,30 @@
1
+ "use client";
2
+
3
+ import { Avatar } from "@krizaka/ui/avatar";
4
+ import { Button } from "@krizaka/ui/button";
5
+ import { List } from "@krizaka/ui/list";
6
+ import { useState } from "react";
7
+
8
+ const viewers = [
9
+ { id: "u1", name: "Mina Okafor", handle: "@mina", tipped: "$12" },
10
+ { id: "u2", name: "Alex Moreau", handle: "@alex", tipped: "$5" },
11
+ { id: "u3", name: "Elena Ruiz", handle: "@elena", tipped: "—" },
12
+ ];
13
+
14
+ // Compact and selectable: who watched a story, a thank-you for the ones you pick.
15
+ export default function ListSelectable() {
16
+ const [selected, setSelected] = useState<string[]>(["u1"]);
17
+ return (
18
+ <List
19
+ aria-label="Viewers of your story"
20
+ density="compact"
21
+ items={viewers}
22
+ getId={(v) => v.id}
23
+ selectable
24
+ selected={selected}
25
+ onSelectedChange={setSelected}
26
+ row={(v) => ({ title: v.name, description: v.handle, leading: <Avatar alt={v.name} fallback={v.name.charAt(0)} size="sm" />, meta: v.tipped })}
27
+ footer={<Button size="sm" variant="primary" disabled={selected.length === 0}>{`Thank ${selected.length}`}</Button>}
28
+ />
29
+ );
30
+ }
@@ -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,22 @@
1
+ "use client";
2
+
3
+ // registry/examples/list/virtualized.tsx
4
+ import { List } from "@krizaka/ui/list";
5
+ import { jsx } from "react/jsx-runtime";
6
+ var payouts = Array.from({ length: 2e3 }, (_, i) => ({ id: `p${i}`, amount: `$${(120 + i * 37 % 900).toFixed(2)}`, day: `Payout #${2e3 - i}` }));
7
+ function ListVirtualized() {
8
+ return /* @__PURE__ */ jsx(
9
+ List,
10
+ {
11
+ "aria-label": "Payouts",
12
+ density: "compact",
13
+ items: payouts,
14
+ getId: (p) => p.id,
15
+ virtualize: { rowHeight: 44, height: 264 },
16
+ row: (p) => ({ title: p.day, meta: p.amount })
17
+ }
18
+ );
19
+ }
20
+ export {
21
+ ListVirtualized as default
22
+ };
@@ -0,0 +1,17 @@
1
+ import { List } from "@krizaka/ui/list";
2
+
3
+ const payouts = Array.from({ length: 2_000 }, (_, i) => ({ id: `p${i}`, amount: `$${(120 + ((i * 37) % 900)).toFixed(2)}`, day: `Payout #${2_000 - i}` }));
4
+
5
+ // 2,000 payouts: only the rows in view are rendered, in a region the keyboard scrolls.
6
+ export default function ListVirtualized() {
7
+ return (
8
+ <List
9
+ aria-label="Payouts"
10
+ density="compact"
11
+ items={payouts}
12
+ getId={(p) => p.id}
13
+ virtualize={{ rowHeight: 44, height: 264 }}
14
+ row={(p) => ({ title: p.day, meta: p.amount })}
15
+ />
16
+ );
17
+ }
@@ -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/loader/native/block.tsx
4
+ import { Loader } from "@krizaka/ui/native";
5
+ import { View } from "react-native";
6
+ import { jsx } from "react/jsx-runtime";
7
+ function NativeLoaderBlock() {
8
+ return /* @__PURE__ */ jsx(View, { style: { width: 320 }, children: /* @__PURE__ */ jsx(Loader, { variant: "block", label: "Loading your jobs", delay: 0 }) });
9
+ }
10
+ export {
11
+ NativeLoaderBlock as default
12
+ };
@@ -0,0 +1,11 @@
1
+ import { Loader } from "@krizaka/ui/native";
2
+ import { View } from "react-native";
3
+
4
+ // `block`: the centre of a region whose content is on its way (the Jobs tab's first load).
5
+ export default function NativeLoaderBlock() {
6
+ return (
7
+ <View style={{ width: 320 }}>
8
+ <Loader variant="block" label="Loading your jobs" delay={0} />
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,17 @@
1
+ "use client";
2
+
3
+ // registry/examples/loader/native/job-wait.tsx
4
+ import { Button, Loader } from "@krizaka/ui/native";
5
+ import { useState } from "react";
6
+ import { View } from "react-native";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ function NativeLoaderJobWait() {
9
+ const [status, setStatus] = useState("loading");
10
+ return /* @__PURE__ */ jsxs(View, { style: { gap: 16, width: 320 }, children: [
11
+ /* @__PURE__ */ jsx(Loader, { label: "Dubbing your video", value: 0.42, eta: "About 2 min left", status, successLabel: "Dubbing ready", delay: 0 }),
12
+ /* @__PURE__ */ jsx(Button, { label: "Finish", size: "sm", onPress: () => setStatus("success") })
13
+ ] });
14
+ }
15
+ export {
16
+ NativeLoaderJobWait as default
17
+ };
@@ -0,0 +1,14 @@
1
+ import { Button, Loader } from "@krizaka/ui/native";
2
+ import { useState } from "react";
3
+ import { View } from "react-native";
4
+
5
+ // An Orazaka job: shown after 250 ms, never blinking, ending on a check and its words.
6
+ export default function NativeLoaderJobWait() {
7
+ const [status, setStatus] = useState<"loading" | "success">("loading");
8
+ return (
9
+ <View style={{ gap: 16, width: 320 }}>
10
+ <Loader label="Dubbing your video" value={0.42} eta="About 2 min left" status={status} successLabel="Dubbing ready" delay={0} />
11
+ <Button label="Finish" size="sm" onPress={() => setStatus("success")} />
12
+ </View>
13
+ );
14
+ }
@@ -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,16 @@
1
+ "use client";
2
+
3
+ // registry/examples/map/cluster.tsx
4
+ import { Cluster, Map, StaticMap } from "@krizaka/ui/map";
5
+ import { jsx } from "react/jsx-runtime";
6
+ var CREATORS = Array.from({ length: 60 }, (_, i) => ({
7
+ id: String(i),
8
+ label: `Creator ${i + 1}`,
9
+ position: [-73.62 + i * 37 % 60 / 600, 45.48 + i * 53 % 70 / 700]
10
+ }));
11
+ function MapCluster() {
12
+ return /* @__PURE__ */ jsx(Map, { label: "Creators near Montr\xE9al", center: [-73.58, 45.53], zoom: 11, className: "h-80 w-full max-w-xl", fallback: /* @__PURE__ */ jsx(StaticMap, { label: "Creators near Montr\xE9al", center: [-73.58, 45.53], zoom: 11 }), children: /* @__PURE__ */ jsx(Cluster, { points: CREATORS }) });
13
+ }
14
+ export {
15
+ MapCluster as default
16
+ };
@@ -0,0 +1,18 @@
1
+ "use client";
2
+
3
+ import { Cluster, Map, StaticMap } from "@krizaka/ui/map";
4
+
5
+ // 60 creators around Montréal, grouped while they are close; a group opens by zooming in.
6
+ const CREATORS = Array.from({ length: 60 }, (_, i) => ({
7
+ id: String(i),
8
+ label: `Creator ${i + 1}`,
9
+ position: [-73.62 + ((i * 37) % 60) / 600, 45.48 + ((i * 53) % 70) / 700] as const,
10
+ }));
11
+
12
+ export default function MapCluster() {
13
+ return (
14
+ <Map label="Creators near Montréal" center={[-73.58, 45.53]} zoom={11} className="h-80 w-full max-w-xl" fallback={<StaticMap label="Creators near Montréal" center={[-73.58, 45.53]} zoom={11} />}>
15
+ <Cluster points={CREATORS} />
16
+ </Map>
17
+ );
18
+ }
@@ -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;