@krizaka/ui 3.4.0 → 3.5.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 (244) hide show
  1. package/dist/argument-card.js +3 -3
  2. package/dist/chat.d.ts +187 -0
  3. package/dist/chat.js +132 -0
  4. package/dist/chat.js.map +1 -0
  5. package/dist/chunk-ECSCA3CN.js +128 -0
  6. package/dist/chunk-ECSCA3CN.js.map +1 -0
  7. package/dist/chunk-F2GKFIYK.js +47 -0
  8. package/dist/chunk-F2GKFIYK.js.map +1 -0
  9. package/dist/data-table.js +20 -134
  10. package/dist/data-table.js.map +1 -1
  11. package/dist/match-dialog.d.ts +30 -0
  12. package/dist/match-dialog.js +146 -0
  13. package/dist/match-dialog.js.map +1 -0
  14. package/dist/native.d.ts +421 -106
  15. package/dist/native.js +1535 -973
  16. package/dist/native.js.map +1 -1
  17. package/dist/page-hero.js +3 -3
  18. package/dist/photo-grid.d.ts +122 -0
  19. package/dist/photo-grid.js +94 -0
  20. package/dist/photo-grid.js.map +1 -0
  21. package/dist/step-progress.d.ts +20 -0
  22. package/dist/step-progress.js +17 -0
  23. package/dist/step-progress.js.map +1 -0
  24. package/dist/swipe-deck.d.ts +183 -0
  25. package/dist/swipe-deck.js +144 -0
  26. package/dist/swipe-deck.js.map +1 -0
  27. package/dist/tag-selector.d.ts +26 -0
  28. package/dist/tag-selector.js +21 -0
  29. package/dist/tag-selector.js.map +1 -0
  30. package/dist/verified-badge.d.ts +16 -0
  31. package/dist/verified-badge.js +23 -0
  32. package/dist/verified-badge.js.map +1 -0
  33. package/package.json +105 -7
  34. package/registry/achievement.json +1 -1
  35. package/registry/action-bar.json +1 -1
  36. package/registry/activity-feed.json +1 -1
  37. package/registry/alert.json +1 -1
  38. package/registry/app-shell.json +1 -1
  39. package/registry/argument-card.json +1 -1
  40. package/registry/audio-player.json +1 -1
  41. package/registry/auth-layout.json +1 -1
  42. package/registry/avatar.json +1 -1
  43. package/registry/badge.json +1 -1
  44. package/registry/button.json +1 -1
  45. package/registry/card-grid.json +1 -1
  46. package/registry/card.json +1 -1
  47. package/registry/catalogue-page.json +1 -1
  48. package/registry/changelog-page.json +1 -1
  49. package/registry/chat.json +917 -0
  50. package/registry/checkbox.json +1 -1
  51. package/registry/chip-link.json +1 -1
  52. package/registry/chip.json +1 -1
  53. package/registry/choice-grid.json +1 -1
  54. package/registry/code-block.json +1 -1
  55. package/registry/combobox.json +1 -1
  56. package/registry/command.json +1 -1
  57. package/registry/component-page.json +1 -1
  58. package/registry/confirm-button.json +1 -1
  59. package/registry/contact-page.json +1 -1
  60. package/registry/continue-prompt.json +1 -1
  61. package/registry/countdown.json +1 -1
  62. package/registry/cta-panel.json +1 -1
  63. package/registry/dashboard-layout.json +1 -1
  64. package/registry/data-table.json +1 -1
  65. package/registry/date-picker.json +1 -1
  66. package/registry/decision-list.json +1 -1
  67. package/registry/description-list.json +1 -1
  68. package/registry/detail-layout.json +1 -1
  69. package/registry/dialog.json +1 -1
  70. package/registry/docs-article-page.json +1 -1
  71. package/registry/docs-hub-page.json +1 -1
  72. package/registry/docs-layout.json +1 -1
  73. package/registry/dropdown-menu.json +1 -1
  74. package/registry/empty-state.json +1 -1
  75. package/registry/error-page.json +1 -1
  76. package/registry/examples/chat/conversation.d.ts +4 -0
  77. package/registry/examples/chat/conversation.js +22 -0
  78. package/registry/examples/chat/conversation.tsx +21 -0
  79. package/registry/examples/chat/inbox.d.ts +4 -0
  80. package/registry/examples/chat/inbox.js +15 -0
  81. package/registry/examples/chat/inbox.tsx +12 -0
  82. package/registry/examples/chat/native/conversation.d.ts +4 -0
  83. package/registry/examples/chat/native/conversation.dark.png +0 -0
  84. package/registry/examples/chat/native/conversation.js +23 -0
  85. package/registry/examples/chat/native/conversation.light.png +0 -0
  86. package/registry/examples/chat/native/conversation.tsx +20 -0
  87. package/registry/examples/chat/native/inbox.d.ts +4 -0
  88. package/registry/examples/chat/native/inbox.dark.png +0 -0
  89. package/registry/examples/chat/native/inbox.js +16 -0
  90. package/registry/examples/chat/native/inbox.light.png +0 -0
  91. package/registry/examples/chat/native/inbox.tsx +13 -0
  92. package/registry/examples/match-dialog/its-a-match.d.ts +4 -0
  93. package/registry/examples/match-dialog/its-a-match.js +29 -0
  94. package/registry/examples/match-dialog/its-a-match.tsx +25 -0
  95. package/registry/examples/match-dialog/native/its-a-match.d.ts +4 -0
  96. package/registry/examples/match-dialog/native/its-a-match.dark.png +0 -0
  97. package/registry/examples/match-dialog/native/its-a-match.js +28 -0
  98. package/registry/examples/match-dialog/native/its-a-match.light.png +0 -0
  99. package/registry/examples/match-dialog/native/its-a-match.tsx +22 -0
  100. package/registry/examples/photo-grid/native/profile-photos.d.ts +4 -0
  101. package/registry/examples/photo-grid/native/profile-photos.dark.png +0 -0
  102. package/registry/examples/photo-grid/native/profile-photos.js +27 -0
  103. package/registry/examples/photo-grid/native/profile-photos.light.png +0 -0
  104. package/registry/examples/photo-grid/native/profile-photos.tsx +24 -0
  105. package/registry/examples/photo-grid/profile-photos.d.ts +4 -0
  106. package/registry/examples/photo-grid/profile-photos.js +28 -0
  107. package/registry/examples/photo-grid/profile-photos.tsx +25 -0
  108. package/registry/examples/screen/native/app-shell.d.ts +4 -0
  109. package/registry/examples/screen/native/app-shell.dark.png +0 -0
  110. package/registry/examples/screen/native/app-shell.js +25 -0
  111. package/registry/examples/screen/native/app-shell.light.png +0 -0
  112. package/registry/examples/screen/native/app-shell.tsx +33 -0
  113. package/registry/examples/screen/native/auth.d.ts +4 -0
  114. package/registry/examples/screen/native/auth.dark.png +0 -0
  115. package/registry/examples/screen/native/auth.js +24 -0
  116. package/registry/examples/screen/native/auth.light.png +0 -0
  117. package/registry/examples/screen/native/auth.tsx +20 -0
  118. package/registry/examples/screen/native/chat.d.ts +4 -0
  119. package/registry/examples/screen/native/chat.dark.png +0 -0
  120. package/registry/examples/screen/native/chat.js +27 -0
  121. package/registry/examples/screen/native/chat.light.png +0 -0
  122. package/registry/examples/screen/native/chat.tsx +22 -0
  123. package/registry/examples/screen/native/feed.d.ts +4 -0
  124. package/registry/examples/screen/native/feed.dark.png +0 -0
  125. package/registry/examples/screen/native/feed.js +24 -0
  126. package/registry/examples/screen/native/feed.light.png +0 -0
  127. package/registry/examples/screen/native/feed.tsx +34 -0
  128. package/registry/examples/screen/native/profile.d.ts +4 -0
  129. package/registry/examples/screen/native/profile.dark.png +0 -0
  130. package/registry/examples/screen/native/profile.js +29 -0
  131. package/registry/examples/screen/native/profile.light.png +0 -0
  132. package/registry/examples/screen/native/profile.tsx +27 -0
  133. package/registry/examples/screen/native/settings.d.ts +4 -0
  134. package/registry/examples/screen/native/settings.dark.png +0 -0
  135. package/registry/examples/screen/native/settings.js +20 -0
  136. package/registry/examples/screen/native/settings.light.png +0 -0
  137. package/registry/examples/screen/native/settings.tsx +19 -0
  138. package/registry/examples/step-progress/native/sign-up.d.ts +4 -0
  139. package/registry/examples/step-progress/native/sign-up.dark.png +0 -0
  140. package/registry/examples/step-progress/native/sign-up.js +12 -0
  141. package/registry/examples/step-progress/native/sign-up.light.png +0 -0
  142. package/registry/examples/step-progress/native/sign-up.tsx +11 -0
  143. package/registry/examples/step-progress/sign-up.d.ts +4 -0
  144. package/registry/examples/step-progress/sign-up.js +22 -0
  145. package/registry/examples/step-progress/sign-up.tsx +16 -0
  146. package/registry/examples/swipe-deck/discover.d.ts +4 -0
  147. package/registry/examples/swipe-deck/discover.js +41 -0
  148. package/registry/examples/swipe-deck/discover.tsx +37 -0
  149. package/registry/examples/swipe-deck/native/discover.d.ts +4 -0
  150. package/registry/examples/swipe-deck/native/discover.dark.png +0 -0
  151. package/registry/examples/swipe-deck/native/discover.js +39 -0
  152. package/registry/examples/swipe-deck/native/discover.light.png +0 -0
  153. package/registry/examples/swipe-deck/native/discover.tsx +35 -0
  154. package/registry/examples/tag-selector/interests.d.ts +4 -0
  155. package/registry/examples/tag-selector/interests.js +14 -0
  156. package/registry/examples/tag-selector/interests.tsx +12 -0
  157. package/registry/examples/tag-selector/native/interests.d.ts +4 -0
  158. package/registry/examples/tag-selector/native/interests.dark.png +0 -0
  159. package/registry/examples/tag-selector/native/interests.js +15 -0
  160. package/registry/examples/tag-selector/native/interests.light.png +0 -0
  161. package/registry/examples/tag-selector/native/interests.tsx +15 -0
  162. package/registry/examples/verified-badge/native/verified.d.ts +4 -0
  163. package/registry/examples/verified-badge/native/verified.dark.png +0 -0
  164. package/registry/examples/verified-badge/native/verified.js +18 -0
  165. package/registry/examples/verified-badge/native/verified.light.png +0 -0
  166. package/registry/examples/verified-badge/native/verified.tsx +15 -0
  167. package/registry/examples/verified-badge/verified.d.ts +4 -0
  168. package/registry/examples/verified-badge/verified.js +17 -0
  169. package/registry/examples/verified-badge/verified.tsx +13 -0
  170. package/registry/field.json +1 -1
  171. package/registry/file-upload.json +1 -1
  172. package/registry/filter-bar.json +1 -1
  173. package/registry/form.json +1 -1
  174. package/registry/gallery-page.json +1 -1
  175. package/registry/glow-card.json +1 -1
  176. package/registry/goal-gauge.json +1 -1
  177. package/registry/how-it-works-page.json +1 -1
  178. package/registry/image-cropper.json +1 -1
  179. package/registry/index.json +144 -2
  180. package/registry/iso.json +1 -1
  181. package/registry/kanban.json +1 -1
  182. package/registry/kbd.json +1 -1
  183. package/registry/landing-page.json +1 -1
  184. package/registry/landscape.json +1 -1
  185. package/registry/legal-page.json +1 -1
  186. package/registry/link-card.json +1 -1
  187. package/registry/list.json +1 -1
  188. package/registry/loader.json +1 -1
  189. package/registry/longform-page.json +1 -1
  190. package/registry/map.json +2 -2
  191. package/registry/marketing-layout.json +1 -1
  192. package/registry/marquee.json +1 -1
  193. package/registry/mascot-quote.json +1 -1
  194. package/registry/mascot-state.json +1 -1
  195. package/registry/mascots.json +1 -1
  196. package/registry/match-dialog.json +300 -0
  197. package/registry/media-capture.json +1 -1
  198. package/registry/meter.json +1 -1
  199. package/registry/nav-bar.json +1 -1
  200. package/registry/number-ticker.json +1 -1
  201. package/registry/page-header.json +1 -1
  202. package/registry/page-hero.json +1 -1
  203. package/registry/page.json +1 -1
  204. package/registry/pagination.json +1 -1
  205. package/registry/photo-grid.json +302 -0
  206. package/registry/pointer-light.json +1 -1
  207. package/registry/popover.json +1 -1
  208. package/registry/pricing-page.json +1 -1
  209. package/registry/product-page.json +1 -1
  210. package/registry/profile-card.json +1 -1
  211. package/registry/progress.json +1 -1
  212. package/registry/promise-card.json +1 -1
  213. package/registry/radio-group.json +1 -1
  214. package/registry/screen.json +184 -0
  215. package/registry/scroll-stage.json +1 -1
  216. package/registry/search-field.json +1 -1
  217. package/registry/section-backdrop.json +1 -1
  218. package/registry/separator.json +1 -1
  219. package/registry/settings-layout.json +1 -1
  220. package/registry/skeleton.json +1 -1
  221. package/registry/slider.json +1 -1
  222. package/registry/slot.json +1 -1
  223. package/registry/spinner.json +1 -1
  224. package/registry/split-view.json +1 -1
  225. package/registry/stage-banner.json +1 -1
  226. package/registry/stat.json +1 -1
  227. package/registry/status-page.json +1 -1
  228. package/registry/step-progress.json +255 -0
  229. package/registry/stepper.json +1 -1
  230. package/registry/swipe-deck.json +512 -0
  231. package/registry/switch.json +1 -1
  232. package/registry/tabs.json +1 -1
  233. package/registry/tag-input.json +1 -1
  234. package/registry/tag-selector.json +276 -0
  235. package/registry/terminal-replay.json +1 -1
  236. package/registry/theme.json +1 -1
  237. package/registry/toast.json +1 -1
  238. package/registry/toc.json +1 -1
  239. package/registry/tooltip.json +1 -1
  240. package/registry/tree-view.json +1 -1
  241. package/registry/verified-badge.json +202 -0
  242. package/registry/video-player.json +1 -1
  243. package/registry/video-trimmer.json +1 -1
  244. package/registry/virtual.json +1 -1
@@ -0,0 +1,28 @@
1
+ "use client";
2
+
3
+ // registry/examples/photo-grid/profile-photos.tsx
4
+ import { PhotoGrid } from "@krizaka/ui/photo-grid";
5
+ import { useState } from "react";
6
+ import { jsx } from "react/jsx-runtime";
7
+ var png = (data) => `data:image/png;base64,${data}`;
8
+ function PhotoGridProfilePhotos() {
9
+ const [photos, setPhotos] = useState([
10
+ { id: "1", src: png("iVBORw0KGgoAAAANSUhEUgAAAAwAAAAQCAIAAACtAwlQAAABaklEQVR42mWMy24UQQxF7arqlwLhIbJhwZZf5I/4IISEBIsIRSKTMOmZnp7uqrJ9zYIeIeCsrqzjw+vHDwYCCM6wbfy5gABKatsysJqLuoHciZ2dGE4ApSrbnyidVn06lVyQUrweur5pmAJAqVQGSEGnRb79mD5/H6dzuRq6929fv7t5MTSd+6VUK3Zj/XQ7frkblyJ926jwkIab6yZw3Eq58rzaz6nMq1RVA+3nMmd73nMMfCkJiRBA7u5O7g6QCFfhyLyVRJg89U3bxKiGJsQ+te6pCge+lETYPT3rujalotqkNLSdexRhJk6lshjOWXeH+WE6Z1HAi+p+Pr+czuxtG0PKlZesd+P09f5xd5iKqrlX1cfpGCiqhDdXr9Ja8DSX24f9/eG4VDGAiAzIIrvpwJ6C96FUXrId15Ivxm8MKCpzKUvRUCpXJTOHO/2Nu6uhqocqLMr4V9iAkxoHMzZjgP7XnMjBZvQLMEROG5iV3IMAAAAASUVORK5CYII="), alt: "Elena at the beach" },
11
+ { id: "2", src: png("iVBORw0KGgoAAAANSUhEUgAAAAwAAAAQCAIAAACtAwlQAAABZklEQVR42m3MzW4TUQyGYZ8zZzJpwp8UiQ0SEvfMLXETICqoKrXQdDohyZwZ258/FpPCAryyrUdv6j99ZDAiSALLFhFkULhcLAAWFEEA7ggEhYkiImQwWNx84WY+Vh0OZzVvcn657bq25MQIFlOLYCDOY/1+23/59uN0mrZX3Yf3u3dvX6+7VvhcMvXH/vT5+u7rzcM02XrVOvyqbXZvNjmlYmoMqtpY5+EwjqOae4CHX7XWWTerktOl5OYwR5AkKSSXp6sxP5fcPJHrVWlLA0Rpctc2iYQ5/5RgEHLTlbY0qt6WZrsuQrp5SlJMzRG16r4/98M4qyM4m/eH+mqzyilWTVNUfZr0bn+8vn16eDqqeZDm2A9jEgawe7Eu8zQPx+nmfrh/PNbZERQRBCf1n0NtkhQym/lU59N5nu0ilkFQDaeqddLsamZwB/+Cy5CEhzuym8M9KP8iEQkSjgwAAP9LhCQB/AYQ5Y+kAv/RXgAAAABJRU5ErkJggg=="), alt: "Elena with her guitar" },
12
+ { id: "3", src: png("iVBORw0KGgoAAAANSUhEUgAAAAwAAAAQCAIAAACtAwlQAAABaUlEQVR42mWRzW5TQRSDZ+bOTdMoFMGCFWx4SR6OF0EgQVWECmqbNOnNvTPnHNssIn6kemVZn+yF84eP30mKFEWCZwMmnROKrAAIShSIAOECKaWUkhIlkTXMzxDdbT614z7M8jCsNi+G8UI5nyEjKKKfpuOP6931Z5uO4+X26t377Zu3w2otqYY5SZjNu/uHr5/2N1+it7paR0QZLy9evs651DAjCes2n9ph58uMcIH9+Njn07De5jL8bXJ4kJSUJEkU4BFmuQzVzUTCXUplXJdhJFCGWuqFlMIjJ1aYE0SEpLrelDpmtzKMw2ojJpinnGuYMcLavOzv2+MDrItAdHvatc3VKqUyjDV697YsD7fT7bf2eIewJCK8H+6VMoBx86paa/1pP/26WXY/oy+JSCklAt774U65kLm4mS/N5+k8lP5IBMJimaK1AnO6E5HOf/0vSQGElzBHhEilZ1ASRXgUAAD0vOYfhd832o14udpJswAAAABJRU5ErkJggg=="), alt: "Elena at a concert" }
13
+ ]);
14
+ return /* @__PURE__ */ jsx(
15
+ PhotoGrid,
16
+ {
17
+ className: "max-w-sm",
18
+ value: photos,
19
+ onValueChange: setPhotos,
20
+ onAdd: () => void 0,
21
+ required: 2,
22
+ labels: { add: "Add a photo", main: "Main", photo: (n) => `Photo ${n}`, moveEarlier: "Move earlier", moveLater: "Move later", remove: "Remove", moved: (n) => `Moved to place ${n}` }
23
+ }
24
+ );
25
+ }
26
+ export {
27
+ PhotoGridProfilePhotos as default
28
+ };
@@ -0,0 +1,25 @@
1
+ "use client";
2
+
3
+ import { type GridPhoto, PhotoGrid } from "@krizaka/ui/photo-grid";
4
+ import { useState } from "react";
5
+
6
+ const png = (data: string) => `data:image/png;base64,${data}`;
7
+
8
+ // A profile's photos: drag one onto another, or its buttons; the first is the main one.
9
+ export default function PhotoGridProfilePhotos() {
10
+ const [photos, setPhotos] = useState<GridPhoto[]>([
11
+ { id: "1", src: png("iVBORw0KGgoAAAANSUhEUgAAAAwAAAAQCAIAAACtAwlQAAABaklEQVR42mWMy24UQQxF7arqlwLhIbJhwZZf5I/4IISEBIsIRSKTMOmZnp7uqrJ9zYIeIeCsrqzjw+vHDwYCCM6wbfy5gABKatsysJqLuoHciZ2dGE4ApSrbnyidVn06lVyQUrweur5pmAJAqVQGSEGnRb79mD5/H6dzuRq6929fv7t5MTSd+6VUK3Zj/XQ7frkblyJ926jwkIab6yZw3Eq58rzaz6nMq1RVA+3nMmd73nMMfCkJiRBA7u5O7g6QCFfhyLyVRJg89U3bxKiGJsQ+te6pCge+lETYPT3rujalotqkNLSdexRhJk6lshjOWXeH+WE6Z1HAi+p+Pr+czuxtG0PKlZesd+P09f5xd5iKqrlX1cfpGCiqhDdXr9Ja8DSX24f9/eG4VDGAiAzIIrvpwJ6C96FUXrId15Ivxm8MKCpzKUvRUCpXJTOHO/2Nu6uhqocqLMr4V9iAkxoHMzZjgP7XnMjBZvQLMEROG5iV3IMAAAAASUVORK5CYII="), alt: "Elena at the beach" },
12
+ { id: "2", src: png("iVBORw0KGgoAAAANSUhEUgAAAAwAAAAQCAIAAACtAwlQAAABZklEQVR42m3MzW4TUQyGYZ8zZzJpwp8UiQ0SEvfMLXETICqoKrXQdDohyZwZ258/FpPCAryyrUdv6j99ZDAiSALLFhFkULhcLAAWFEEA7ggEhYkiImQwWNx84WY+Vh0OZzVvcn657bq25MQIFlOLYCDOY/1+23/59uN0mrZX3Yf3u3dvX6+7VvhcMvXH/vT5+u7rzcM02XrVOvyqbXZvNjmlYmoMqtpY5+EwjqOae4CHX7XWWTerktOl5OYwR5AkKSSXp6sxP5fcPJHrVWlLA0Rpctc2iYQ5/5RgEHLTlbY0qt6WZrsuQrp5SlJMzRG16r4/98M4qyM4m/eH+mqzyilWTVNUfZr0bn+8vn16eDqqeZDm2A9jEgawe7Eu8zQPx+nmfrh/PNbZERQRBCf1n0NtkhQym/lU59N5nu0ilkFQDaeqddLsamZwB/+Cy5CEhzuym8M9KP8iEQkSjgwAAP9LhCQB/AYQ5Y+kAv/RXgAAAABJRU5ErkJggg=="), alt: "Elena with her guitar" },
13
+ { id: "3", src: png("iVBORw0KGgoAAAANSUhEUgAAAAwAAAAQCAIAAACtAwlQAAABaUlEQVR42mWRzW5TQRSDZ+bOTdMoFMGCFWx4SR6OF0EgQVWECmqbNOnNvTPnHNssIn6kemVZn+yF84eP30mKFEWCZwMmnROKrAAIShSIAOECKaWUkhIlkTXMzxDdbT614z7M8jCsNi+G8UI5nyEjKKKfpuOP6931Z5uO4+X26t377Zu3w2otqYY5SZjNu/uHr5/2N1+it7paR0QZLy9evs651DAjCes2n9ph58uMcIH9+Njn07De5jL8bXJ4kJSUJEkU4BFmuQzVzUTCXUplXJdhJFCGWuqFlMIjJ1aYE0SEpLrelDpmtzKMw2ojJpinnGuYMcLavOzv2+MDrItAdHvatc3VKqUyjDV697YsD7fT7bf2eIewJCK8H+6VMoBx86paa/1pP/26WXY/oy+JSCklAt774U65kLm4mS/N5+k8lP5IBMJimaK1AnO6E5HOf/0vSQGElzBHhEilZ1ASRXgUAAD0vOYfhd832o14udpJswAAAABJRU5ErkJggg=="), alt: "Elena at a concert" },
14
+ ]);
15
+ return (
16
+ <PhotoGrid
17
+ className="max-w-sm"
18
+ value={photos}
19
+ onValueChange={setPhotos}
20
+ onAdd={() => undefined}
21
+ required={2}
22
+ labels={{ add: "Add a photo", main: "Main", photo: (n) => `Photo ${n}`, moveEarlier: "Move earlier", moveLater: "Move later", remove: "Remove", moved: (n) => `Moved to place ${n}` }}
23
+ />
24
+ );
25
+ }
@@ -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,25 @@
1
+ "use client";
2
+
3
+ // registry/examples/screen/native/app-shell.tsx
4
+ import { Header, Screen, TabBar, Txt } from "@krizaka/ui/native";
5
+ import { useState } from "react";
6
+ import { View } from "react-native";
7
+ import Svg, { Path } from "react-native-svg";
8
+ import { jsx, jsxs } from "react/jsx-runtime";
9
+ var icon = (d) => (on, color) => /* @__PURE__ */ jsx(Svg, { width: 24, height: 24, viewBox: "0 0 24 24", fill: on ? color : "none", stroke: color, strokeWidth: 2, strokeLinejoin: "round", children: /* @__PURE__ */ jsx(Path, { d }) });
10
+ var TABS = [
11
+ { value: "discover", label: "Discover", icon: icon("M12 3l2.6 6.4L21 12l-6.4 2.6L12 21l-2.6-6.4L3 12l6.4-2.6z") },
12
+ { value: "likes", label: "Likes", badge: 4, badgeLabel: "4 new", icon: icon("M12 20s-7-4.4-7-10a4 4 0 0 1 7-2.6A4 4 0 0 1 19 10c0 5.6-7 10-7 10z") },
13
+ { value: "chats", label: "Chats", badge: 2, badgeLabel: "2 unread", icon: icon("M4 5h16v11H8l-4 4z") },
14
+ { value: "me", label: "Me", icon: icon("M12 12a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM4 21a8 8 0 0 1 16 0") }
15
+ ];
16
+ function NativeScreenAppShell() {
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: [
19
+ /* @__PURE__ */ jsx(Txt, { variant: "label", children: name }),
20
+ /* @__PURE__ */ jsx(Txt, { variant: "caption", tone: "secondary", children: "Liked you today" })
21
+ ] }, name)) }) });
22
+ }
23
+ export {
24
+ NativeScreenAppShell as default
25
+ };
@@ -0,0 +1,33 @@
1
+ import { Header, Screen, TabBar, Txt } from "@krizaka/ui/native";
2
+ import { useState } from "react";
3
+ import { View } from "react-native";
4
+ import Svg, { Path } from "react-native-svg";
5
+
6
+ const icon = (d: string) => (on: boolean, color: string) => (
7
+ <Svg width={24} height={24} viewBox="0 0 24 24" fill={on ? color : "none"} stroke={color} strokeWidth={2} strokeLinejoin="round">
8
+ <Path d={d} />
9
+ </Svg>
10
+ );
11
+ const TABS = [
12
+ { value: "discover", label: "Discover", icon: icon("M12 3l2.6 6.4L21 12l-6.4 2.6L12 21l-2.6-6.4L3 12l6.4-2.6z") },
13
+ { value: "likes", label: "Likes", badge: 4, badgeLabel: "4 new", icon: icon("M12 20s-7-4.4-7-10a4 4 0 0 1 7-2.6A4 4 0 0 1 19 10c0 5.6-7 10-7 10z") },
14
+ { value: "chats", label: "Chats", badge: 2, badgeLabel: "2 unread", icon: icon("M4 5h16v11H8l-4 4z") },
15
+ { value: "me", label: "Me", icon: icon("M12 12a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM4 21a8 8 0 0 1 16 0") },
16
+ ];
17
+
18
+ // The app shell: a header with its large title, the section's content, the tab bar clear of the home indicator.
19
+ export default function NativeScreenAppShell() {
20
+ const [tab, setTab] = useState("likes");
21
+ return (
22
+ <View style={{ width: 360, height: 640 }}>
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) => (
25
+ <View key={name} style={{ gap: 2, paddingHorizontal: 16, paddingVertical: 12 }}>
26
+ <Txt variant="label">{name}</Txt>
27
+ <Txt variant="caption" tone="secondary">Liked you today</Txt>
28
+ </View>
29
+ ))}
30
+ </Screen>
31
+ </View>
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,24 @@
1
+ "use client";
2
+
3
+ // registry/examples/screen/native/auth.tsx
4
+ import { Button, KrizakaMark, Screen, TextField, Txt } from "@krizaka/ui/native";
5
+ import { View } from "react-native";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ function NativeScreenAuth() {
8
+ return /* @__PURE__ */ jsx(View, { style: { width: 360, height: 640 }, children: /* @__PURE__ */ jsxs(Screen, { footer: /* @__PURE__ */ jsxs(View, { style: { padding: 16, gap: 8 }, children: [
9
+ /* @__PURE__ */ jsx(Button, { label: "Sign in", variant: "gradient", size: "lg" }),
10
+ /* @__PURE__ */ jsx(Button, { label: "Create an account", variant: "ghost" })
11
+ ] }), children: [
12
+ /* @__PURE__ */ jsxs(View, { style: { alignItems: "center", gap: 8, marginVertical: 24 }, children: [
13
+ /* @__PURE__ */ jsx(KrizakaMark, { size: 64 }),
14
+ /* @__PURE__ */ jsx(Txt, { variant: "display", children: "Welcome back" }),
15
+ /* @__PURE__ */ jsx(Txt, { tone: "secondary", style: { textAlign: "center" }, children: "Meet people who like what you like." })
16
+ ] }),
17
+ /* @__PURE__ */ jsx(TextField, { label: "Email", autoComplete: "email", keyboardType: "email-address", placeholder: "you@example.com" }),
18
+ /* @__PURE__ */ jsx(TextField, { label: "Password", hint: "At least 12 characters", autoComplete: "current-password", secureTextEntry: true }),
19
+ /* @__PURE__ */ jsx(Txt, { variant: "caption", tone: "secondary", style: { textAlign: "center" }, children: "By continuing you accept the terms and the privacy policy." })
20
+ ] }) });
21
+ }
22
+ export {
23
+ NativeScreenAuth as default
24
+ };
@@ -0,0 +1,20 @@
1
+ import { Button, KrizakaMark, Screen, TextField, Txt } from "@krizaka/ui/native";
2
+ import { View } from "react-native";
3
+
4
+ // Sign in: the mark, the promise, two fields, the main action pinned above the keyboard, the legal words.
5
+ export default function NativeScreenAuth() {
6
+ return (
7
+ <View style={{ width: 360, height: 640 }}>
8
+ <Screen footer={<View style={{ padding: 16, gap: 8 }}><Button label="Sign in" variant="gradient" size="lg" /><Button label="Create an account" variant="ghost" /></View>}>
9
+ <View style={{ alignItems: "center", gap: 8, marginVertical: 24 }}>
10
+ <KrizakaMark size={64} />
11
+ <Txt variant="display">Welcome back</Txt>
12
+ <Txt tone="secondary" style={{ textAlign: "center" }}>Meet people who like what you like.</Txt>
13
+ </View>
14
+ <TextField label="Email" autoComplete="email" keyboardType="email-address" placeholder="you@example.com" />
15
+ <TextField label="Password" hint="At least 12 characters" autoComplete="current-password" secureTextEntry />
16
+ <Txt variant="caption" tone="secondary" style={{ textAlign: "center" }}>By continuing you accept the terms and the privacy policy.</Txt>
17
+ </Screen>
18
+ </View>
19
+ );
20
+ }
@@ -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,27 @@
1
+ "use client";
2
+
3
+ // registry/examples/screen/native/chat.tsx
4
+ import { Avatar, Header, MessageBubble, MessageComposer, Screen, TypingIndicator } 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 NativeScreenChat() {
9
+ const [draft, setDraft] = useState("");
10
+ return /* @__PURE__ */ jsx(View, { style: { width: 360, height: 640 }, children: /* @__PURE__ */ jsxs(
11
+ Screen,
12
+ {
13
+ header: /* @__PURE__ */ jsx(Header, { size: "inline", title: "Elena", backLabel: "Chats", onBack: () => void 0, actions: /* @__PURE__ */ jsx(Avatar, { alt: "Elena, online", size: "sm", presence: "online", presenceLabel: "online" }) }),
14
+ footer: /* @__PURE__ */ jsx(MessageComposer, { value: draft, onValueChange: setDraft, onSend: () => setDraft(""), placeholder: "Message", sendLabel: "Send" }),
15
+ contentStyle: { gap: 4, justifyContent: "flex-end", flexGrow: 1 },
16
+ children: [
17
+ /* @__PURE__ */ jsx(MessageBubble, { text: "Hey! Loved your sunset photo \u{1F305}", time: "19:02" }),
18
+ /* @__PURE__ */ jsx(MessageBubble, { mine: true, text: "Thanks! Cabo da Roca, last Sunday", time: "19:05", grouped: "first" }),
19
+ /* @__PURE__ */ jsx(MessageBubble, { mine: true, text: "We should go together", time: "19:05", grouped: "last", status: "delivered", showStatus: true }),
20
+ /* @__PURE__ */ jsx(TypingIndicator, { label: "Elena is typing" })
21
+ ]
22
+ }
23
+ ) });
24
+ }
25
+ export {
26
+ NativeScreenChat as default
27
+ };
@@ -0,0 +1,22 @@
1
+ import { Avatar, Header, MessageBubble, MessageComposer, Screen, TypingIndicator } from "@krizaka/ui/native";
2
+ import { useState } from "react";
3
+ import { View } from "react-native";
4
+
5
+ // A chat: the person in the header with their presence, the messages, the composer above the keyboard.
6
+ export default function NativeScreenChat() {
7
+ const [draft, setDraft] = useState("");
8
+ return (
9
+ <View style={{ width: 360, height: 640 }}>
10
+ <Screen
11
+ header={<Header size="inline" title="Elena" backLabel="Chats" onBack={() => undefined} actions={<Avatar alt="Elena, online" size="sm" presence="online" presenceLabel="online" />} />}
12
+ footer={<MessageComposer value={draft} onValueChange={setDraft} onSend={() => setDraft("")} placeholder="Message" sendLabel="Send" />}
13
+ contentStyle={{ gap: 4, justifyContent: "flex-end", flexGrow: 1 }}
14
+ >
15
+ <MessageBubble text="Hey! Loved your sunset photo 🌅" time="19:02" />
16
+ <MessageBubble mine text="Thanks! Cabo da Roca, last Sunday" time="19:05" grouped="first" />
17
+ <MessageBubble mine text="We should go together" time="19:05" grouped="last" status="delivered" showStatus />
18
+ <TypingIndicator label="Elena is typing" />
19
+ </Screen>
20
+ </View>
21
+ );
22
+ }
@@ -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,24 @@
1
+ "use client";
2
+
3
+ // registry/examples/screen/native/feed.tsx
4
+ import { Avatar, Card, Header, Screen, Txt } from "@krizaka/ui/native";
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" }
11
+ ];
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)) }) });
21
+ }
22
+ export {
23
+ NativeScreenFeed as default
24
+ };
@@ -0,0 +1,34 @@
1
+ import { Avatar, Card, Header, Screen, Txt } from "@krizaka/ui/native";
2
+ import { View } from "react-native";
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" },
8
+ ];
9
+
10
+ // A feed: a large title, cards under it (a long feed uses the list of `@krizaka/ui/native/list` in `scroll={false}`).
11
+ export default function NativeScreenFeed() {
12
+ return (
13
+ <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>
32
+ </View>
33
+ );
34
+ }
@@ -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/screen/native/profile.tsx
4
+ import { Avatar, Button, Chip, Screen, Txt, VerifiedBadge } from "@krizaka/ui/native";
5
+ import { View } from "react-native";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ function NativeScreenProfile() {
8
+ return /* @__PURE__ */ jsx(View, { style: { width: 360, height: 640 }, children: /* @__PURE__ */ jsxs(Screen, { footer: /* @__PURE__ */ jsxs(View, { style: { flexDirection: "row", gap: 8, padding: 16 }, children: [
9
+ /* @__PURE__ */ jsx(Button, { label: "Edit profile", style: { flex: 1 } }),
10
+ /* @__PURE__ */ jsx(Button, { label: "Preview", variant: "outline", style: { flex: 1 } })
11
+ ] }), children: [
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" }),
14
+ /* @__PURE__ */ jsxs(View, { style: { flexDirection: "row", alignItems: "center", gap: 6 }, children: [
15
+ /* @__PURE__ */ jsx(Txt, { variant: "title", children: "Elena, 29" }),
16
+ /* @__PURE__ */ jsx(VerifiedBadge, { label: "Verified", size: 18 })
17
+ ] }),
18
+ /* @__PURE__ */ jsx(Txt, { tone: "secondary", children: "Lisbon \xB7 Sound engineer" })
19
+ ] }),
20
+ /* @__PURE__ */ jsxs(View, { style: { flexDirection: "row", justifyContent: "center", gap: 32 }, children: [
21
+ /* @__PURE__ */ jsx(Txt, { variant: "label", children: "128 likes" }),
22
+ /* @__PURE__ */ jsx(Txt, { variant: "label", children: "14 matches" })
23
+ ] }),
24
+ /* @__PURE__ */ jsx(View, { style: { flexDirection: "row", flexWrap: "wrap", gap: 8 }, children: ["Music", "Surf", "Travel", "Vinyl"].map((t) => /* @__PURE__ */ jsx(Chip, { children: t }, t)) })
25
+ ] }) });
26
+ }
27
+ export {
28
+ NativeScreenProfile as default
29
+ };
@@ -0,0 +1,27 @@
1
+ import { Avatar, Button, Chip, Screen, Txt, VerifiedBadge } from "@krizaka/ui/native";
2
+ import { View } from "react-native";
3
+
4
+ // A profile: the photo with its story ring, the name and seal, the facts, the interests, the actions.
5
+ export default function NativeScreenProfile() {
6
+ return (
7
+ <View style={{ width: 360, height: 640 }}>
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
+ <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" />
11
+ <View style={{ flexDirection: "row", alignItems: "center", gap: 6 }}>
12
+ <Txt variant="title">Elena, 29</Txt>
13
+ <VerifiedBadge label="Verified" size={18} />
14
+ </View>
15
+ <Txt tone="secondary">Lisbon · Sound engineer</Txt>
16
+ </View>
17
+ <View style={{ flexDirection: "row", justifyContent: "center", gap: 32 }}>
18
+ <Txt variant="label">128 likes</Txt>
19
+ <Txt variant="label">14 matches</Txt>
20
+ </View>
21
+ <View style={{ flexDirection: "row", flexWrap: "wrap", gap: 8 }}>
22
+ {["Music", "Surf", "Travel", "Vinyl"].map((t) => <Chip key={t}>{t}</Chip>)}
23
+ </View>
24
+ </Screen>
25
+ </View>
26
+ );
27
+ }
@@ -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,20 @@
1
+ "use client";
2
+
3
+ // registry/examples/screen/native/settings.tsx
4
+ import { Header, Screen, Switch, Txt } from "@krizaka/ui/native";
5
+ import { View } from "react-native";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ function NativeScreenSettings() {
8
+ return /* @__PURE__ */ jsx(View, { style: { width: 360, height: 640 }, children: /* @__PURE__ */ jsxs(Screen, { header: /* @__PURE__ */ jsx(Header, { size: "inline", title: "Settings", backLabel: "Me", onBack: () => void 0 }), children: [
9
+ /* @__PURE__ */ jsx(Txt, { variant: "caption", tone: "secondary", role: "heading", children: "DISCOVERY" }),
10
+ /* @__PURE__ */ jsx(Switch, { label: "Show me in Discover", defaultChecked: true }),
11
+ /* @__PURE__ */ jsx(Txt, { variant: "caption", tone: "secondary", role: "heading", children: "NOTIFICATIONS" }),
12
+ /* @__PURE__ */ jsx(Switch, { label: "New likes", defaultChecked: true }),
13
+ /* @__PURE__ */ jsx(Switch, { label: "Messages", description: "Even when the app is closed", defaultChecked: true }),
14
+ /* @__PURE__ */ jsx(Txt, { variant: "caption", tone: "secondary", role: "heading", children: "ACCOUNT" }),
15
+ /* @__PURE__ */ jsx(Switch, { label: "Show my distance", description: "Rounded to the kilometre" })
16
+ ] }) });
17
+ }
18
+ export {
19
+ NativeScreenSettings as default
20
+ };
@@ -0,0 +1,19 @@
1
+ import { Header, Screen, Switch, Txt } from "@krizaka/ui/native";
2
+ import { View } from "react-native";
3
+
4
+ // Settings: sections with their headings, switches that apply at once.
5
+ export default function NativeScreenSettings() {
6
+ return (
7
+ <View style={{ width: 360, height: 640 }}>
8
+ <Screen header={<Header size="inline" title="Settings" backLabel="Me" onBack={() => undefined} />}>
9
+ <Txt variant="caption" tone="secondary" role="heading">DISCOVERY</Txt>
10
+ <Switch label="Show me in Discover" defaultChecked />
11
+ <Txt variant="caption" tone="secondary" role="heading">NOTIFICATIONS</Txt>
12
+ <Switch label="New likes" defaultChecked />
13
+ <Switch label="Messages" description="Even when the app is closed" defaultChecked />
14
+ <Txt variant="caption" tone="secondary" role="heading">ACCOUNT</Txt>
15
+ <Switch label="Show my distance" description="Rounded to the kilometre" />
16
+ </Screen>
17
+ </View>
18
+ );
19
+ }
@@ -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/step-progress/native/sign-up.tsx
4
+ import { Button, StepProgress } from "@krizaka/ui/native";
5
+ import { View } from "react-native";
6
+ import { jsx } from "react/jsx-runtime";
7
+ function NativeStepProgressSignUp() {
8
+ return /* @__PURE__ */ jsx(View, { style: { width: 360 }, children: /* @__PURE__ */ jsx(StepProgress, { step: 2, total: 5, label: (n, total) => `Step ${n} of ${total}`, backLabel: "Back", onBack: () => void 0, trailing: /* @__PURE__ */ jsx(Button, { label: "Skip", variant: "ghost", size: "sm" }) }) });
9
+ }
10
+ export {
11
+ NativeStepProgressSignUp as default
12
+ };
@@ -0,0 +1,11 @@
1
+ import { Button, StepProgress } from "@krizaka/ui/native";
2
+ import { View } from "react-native";
3
+
4
+ // The head of the sign-up: back, five segments, the position in words, Skip.
5
+ export default function NativeStepProgressSignUp() {
6
+ return (
7
+ <View style={{ width: 360 }}>
8
+ <StepProgress step={2} total={5} label={(n, total) => `Step ${n} of ${total}`} backLabel="Back" onBack={() => undefined} trailing={<Button label="Skip" variant="ghost" size="sm" />} />
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,22 @@
1
+ "use client";
2
+
3
+ // registry/examples/step-progress/sign-up.tsx
4
+ import { Button } from "@krizaka/ui/button";
5
+ import { StepProgress } from "@krizaka/ui/step-progress";
6
+ import { jsx } from "react/jsx-runtime";
7
+ function StepProgressSignUp() {
8
+ return /* @__PURE__ */ jsx(
9
+ StepProgress,
10
+ {
11
+ className: "max-w-md",
12
+ step: 2,
13
+ total: 5,
14
+ label: (n, total) => `Step ${n} of ${total}`,
15
+ back: /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", children: "Back" }),
16
+ trailing: /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", children: "Skip" })
17
+ }
18
+ );
19
+ }
20
+ export {
21
+ StepProgressSignUp as default
22
+ };
@@ -0,0 +1,16 @@
1
+ import { Button } from "@krizaka/ui/button";
2
+ import { StepProgress } from "@krizaka/ui/step-progress";
3
+
4
+ // The head of the sign-up: back, five segments, the position in words, Skip.
5
+ export default function StepProgressSignUp() {
6
+ return (
7
+ <StepProgress
8
+ className="max-w-md"
9
+ step={2}
10
+ total={5}
11
+ label={(n, total) => `Step ${n} of ${total}`}
12
+ back={<Button variant="ghost" size="sm">Back</Button>}
13
+ trailing={<Button variant="ghost" size="sm">Skip</Button>}
14
+ />
15
+ );
16
+ }
@@ -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,41 @@
1
+ "use client";
2
+
3
+ // registry/examples/swipe-deck/discover.tsx
4
+ import { Badge } from "@krizaka/ui/badge";
5
+ import { PersonCard, SwipeDeck } from "@krizaka/ui/swipe-deck";
6
+ import { VerifiedBadge } from "@krizaka/ui/verified-badge";
7
+ import { useState } from "react";
8
+ import { jsx } from "react/jsx-runtime";
9
+ var png = (data) => `data:image/png;base64,${data}`;
10
+ var PEOPLE = [
11
+ { id: "e", name: "Elena", age: 29, km: 3.2, bio: "Sunsets, vinyl and long walks.", tags: ["Music", "Surf"], photos: [png("iVBORw0KGgoAAAANSUhEUgAAAAwAAAAQCAIAAACtAwlQAAABaklEQVR42mWMy24UQQxF7arqlwLhIbJhwZZf5I/4IISEBIsIRSKTMOmZnp7uqrJ9zYIeIeCsrqzjw+vHDwYCCM6wbfy5gABKatsysJqLuoHciZ2dGE4ApSrbnyidVn06lVyQUrweur5pmAJAqVQGSEGnRb79mD5/H6dzuRq6929fv7t5MTSd+6VUK3Zj/XQ7frkblyJ926jwkIab6yZw3Eq58rzaz6nMq1RVA+3nMmd73nMMfCkJiRBA7u5O7g6QCFfhyLyVRJg89U3bxKiGJsQ+te6pCge+lETYPT3rujalotqkNLSdexRhJk6lshjOWXeH+WE6Z1HAi+p+Pr+czuxtG0PKlZesd+P09f5xd5iKqrlX1cfpGCiqhDdXr9Ja8DSX24f9/eG4VDGAiAzIIrvpwJ6C96FUXrId15Ivxm8MKCpzKUvRUCpXJTOHO/2Nu6uhqocqLMr4V9iAkxoHMzZjgP7XnMjBZvQLMEROG5iV3IMAAAAASUVORK5CYII="), png("iVBORw0KGgoAAAANSUhEUgAAAAwAAAAQCAIAAACtAwlQAAABZklEQVR42m3MzW4TUQyGYZ8zZzJpwp8UiQ0SEvfMLXETICqoKrXQdDohyZwZ258/FpPCAryyrUdv6j99ZDAiSALLFhFkULhcLAAWFEEA7ggEhYkiImQwWNx84WY+Vh0OZzVvcn657bq25MQIFlOLYCDOY/1+23/59uN0mrZX3Yf3u3dvX6+7VvhcMvXH/vT5+u7rzcM02XrVOvyqbXZvNjmlYmoMqtpY5+EwjqOae4CHX7XWWTerktOl5OYwR5AkKSSXp6sxP5fcPJHrVWlLA0Rpctc2iYQ5/5RgEHLTlbY0qt6WZrsuQrp5SlJMzRG16r4/98M4qyM4m/eH+mqzyilWTVNUfZr0bn+8vn16eDqqeZDm2A9jEgawe7Eu8zQPx+nmfrh/PNbZERQRBCf1n0NtkhQym/lU59N5nu0ilkFQDaeqddLsamZwB/+Cy5CEhzuym8M9KP8iEQkSjgwAAP9LhCQB/AYQ5Y+kAv/RXgAAAABJRU5ErkJggg==")] },
12
+ { id: "n", name: "Noah", age: 31, km: 12, bio: "Cook, climber, bad puns.", tags: ["Climbing"], photos: [png("iVBORw0KGgoAAAANSUhEUgAAAAwAAAAQCAIAAACtAwlQAAABaUlEQVR42mWRzW5TQRSDZ+bOTdMoFMGCFWx4SR6OF0EgQVWECmqbNOnNvTPnHNssIn6kemVZn+yF84eP30mKFEWCZwMmnROKrAAIShSIAOECKaWUkhIlkTXMzxDdbT614z7M8jCsNi+G8UI5nyEjKKKfpuOP6931Z5uO4+X26t377Zu3w2otqYY5SZjNu/uHr5/2N1+it7paR0QZLy9evs651DAjCes2n9ph58uMcIH9+Njn07De5jL8bXJ4kJSUJEkU4BFmuQzVzUTCXUplXJdhJFCGWuqFlMIjJ1aYE0SEpLrelDpmtzKMw2ojJpinnGuYMcLavOzv2+MDrItAdHvatc3VKqUyjDV697YsD7fT7bf2eIewJCK8H+6VMoBx86paa/1pP/26WXY/oy+JSCklAt774U65kLm4mS/N5+k8lP5IBMJimaK1AnO6E5HOf/0vSQGElzBHhEilZ1ASRXgUAAD0vOYfhd832o14udpJswAAAABJRU5ErkJggg==")] }
13
+ ];
14
+ function SwipeDeckDiscover() {
15
+ const [people, setPeople] = useState(PEOPLE);
16
+ return /* @__PURE__ */ jsx(
17
+ SwipeDeck,
18
+ {
19
+ items: people,
20
+ getId: (p) => p.id,
21
+ getName: (p) => p.name,
22
+ onSwipe: (p) => setPeople((all) => all.filter((x) => x.id !== p.id)),
23
+ labels: { like: "Like", pass: "Pass", deck: "Profiles. Right arrow to like, left arrow to pass.", likeStamp: "Like", passStamp: "Nope" },
24
+ renderCard: (p) => /* @__PURE__ */ jsx(
25
+ PersonCard,
26
+ {
27
+ photos: p.photos.map((src) => ({ src })),
28
+ name: p.name,
29
+ age: p.age,
30
+ badge: /* @__PURE__ */ jsx(VerifiedBadge, { label: "Verified", onMedia: true, size: "lg" }),
31
+ meta: /* @__PURE__ */ jsx("span", { className: "text-xs font-semibold", children: `${p.km} km away` }),
32
+ bio: p.bio,
33
+ footer: p.tags.map((t) => /* @__PURE__ */ jsx(Badge, { tone: "scrim", children: t }, t))
34
+ }
35
+ )
36
+ }
37
+ );
38
+ }
39
+ export {
40
+ SwipeDeckDiscover as default
41
+ };