@krizaka/ui 2.9.0 → 3.0.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 (307) hide show
  1. package/README.md +44 -6
  2. package/dist/audio-player.js +1 -1
  3. package/dist/blocks.css +247 -0
  4. package/dist/catalogue-page.d.ts +34 -0
  5. package/dist/catalogue-page.js +26 -0
  6. package/dist/catalogue-page.js.map +1 -0
  7. package/dist/changelog-page.d.ts +50 -0
  8. package/dist/changelog-page.js +27 -0
  9. package/dist/changelog-page.js.map +1 -0
  10. package/dist/{chunk-EUPTXKH7.js → chunk-BRKMQ6JV.js} +2 -1
  11. package/dist/chunk-FDCMBWUU.js +168 -0
  12. package/dist/chunk-FDCMBWUU.js.map +1 -0
  13. package/dist/chunk-HCNOOPZE.js +210 -0
  14. package/dist/chunk-HCNOOPZE.js.map +1 -0
  15. package/dist/{chunk-NOVUREEC.js → chunk-JZPVUJIX.js} +25 -3
  16. package/dist/chunk-JZPVUJIX.js.map +1 -0
  17. package/dist/chunk-KNBYZGSQ.js +11 -0
  18. package/dist/chunk-KNBYZGSQ.js.map +1 -0
  19. package/dist/{chunk-X6TW3X6Y.js → chunk-LCZXS6AK.js} +2 -2
  20. package/dist/chunk-OGJI5X4W.js +157 -0
  21. package/dist/chunk-OGJI5X4W.js.map +1 -0
  22. package/dist/combobox.js +2 -2
  23. package/dist/component-page.d.ts +41 -0
  24. package/dist/component-page.js +17 -0
  25. package/dist/component-page.js.map +1 -0
  26. package/dist/contact-page.d.ts +31 -0
  27. package/dist/contact-page.js +26 -0
  28. package/dist/contact-page.js.map +1 -0
  29. package/dist/data-table.d.ts +284 -24
  30. package/dist/data-table.js +914 -121
  31. package/dist/data-table.js.map +1 -1
  32. package/dist/date-picker.js +1 -1
  33. package/dist/docs-article-page.d.ts +54 -0
  34. package/dist/docs-article-page.js +29 -0
  35. package/dist/docs-article-page.js.map +1 -0
  36. package/dist/docs-hub-page.d.ts +72 -0
  37. package/dist/docs-hub-page.js +45 -0
  38. package/dist/docs-hub-page.js.map +1 -0
  39. package/dist/error-page.d.ts +22 -0
  40. package/dist/error-page.js +23 -0
  41. package/dist/error-page.js.map +1 -0
  42. package/dist/filter-bar.d.ts +12 -12
  43. package/dist/filter-bar.js +9 -145
  44. package/dist/filter-bar.js.map +1 -1
  45. package/dist/gallery-page.d.ts +50 -0
  46. package/dist/gallery-page.js +30 -0
  47. package/dist/gallery-page.js.map +1 -0
  48. package/dist/{geometry-CXrAW34x.d.ts → geometry-CbOU4rtL.d.ts} +4 -4
  49. package/dist/how-it-works-page.d.ts +48 -0
  50. package/dist/how-it-works-page.js +28 -0
  51. package/dist/how-it-works-page.js.map +1 -0
  52. package/dist/image-cropper.js +1 -1
  53. package/dist/index.d.ts +11 -2
  54. package/dist/index.js +93 -5
  55. package/dist/index.js.map +1 -1
  56. package/dist/landing-page.d.ts +58 -0
  57. package/dist/landing-page.js +42 -0
  58. package/dist/landing-page.js.map +1 -0
  59. package/dist/legal-page.d.ts +34 -0
  60. package/dist/legal-page.js +18 -0
  61. package/dist/legal-page.js.map +1 -0
  62. package/dist/longform-page.d.ts +42 -0
  63. package/dist/longform-page.js +29 -0
  64. package/dist/longform-page.js.map +1 -0
  65. package/dist/mascot-quote.d.ts +4 -4
  66. package/dist/mascot-quote.js +23 -1
  67. package/dist/mascot-quote.js.map +1 -1
  68. package/dist/mascot-state.d.ts +2 -2
  69. package/dist/mascot-state.js +1 -1
  70. package/dist/mascot-state.js.map +1 -1
  71. package/dist/mascots.d.ts +4 -4
  72. package/dist/mascots.js +1 -1
  73. package/dist/media-capture.js +1 -1
  74. package/dist/native/list.d.ts +95 -0
  75. package/dist/native/list.js +135 -0
  76. package/dist/native/list.js.map +1 -0
  77. package/dist/native.d.ts +16 -9
  78. package/dist/native.js +183 -74
  79. package/dist/native.js.map +1 -1
  80. package/dist/pricing-page.d.ts +62 -0
  81. package/dist/pricing-page.js +71 -0
  82. package/dist/pricing-page.js.map +1 -0
  83. package/dist/product-page.d.ts +83 -0
  84. package/dist/product-page.js +60 -0
  85. package/dist/product-page.js.map +1 -0
  86. package/dist/search-field.js +6 -160
  87. package/dist/search-field.js.map +1 -1
  88. package/dist/status-page.d.ts +42 -0
  89. package/dist/status-page.js +28 -0
  90. package/dist/status-page.js.map +1 -0
  91. package/dist/tag-input.js +2 -2
  92. package/dist/video-player.js +1 -1
  93. package/dist/video-trimmer.js +1 -1
  94. package/dist/virtual.d.ts +140 -0
  95. package/dist/virtual.js +19 -0
  96. package/dist/virtual.js.map +1 -0
  97. package/package.json +296 -10
  98. package/registry/achievement.json +1 -1
  99. package/registry/action-bar.json +1 -1
  100. package/registry/alert.json +1 -1
  101. package/registry/app-shell.json +1 -1
  102. package/registry/argument-card.json +1 -1
  103. package/registry/audio-player.json +1 -1
  104. package/registry/auth-layout.json +1 -1
  105. package/registry/avatar.json +1 -1
  106. package/registry/badge.json +1 -1
  107. package/registry/button.json +1 -1
  108. package/registry/card-grid.json +1 -1
  109. package/registry/card.json +1 -1
  110. package/registry/catalogue-page.json +240 -0
  111. package/registry/changelog-page.json +226 -0
  112. package/registry/checkbox.json +1 -1
  113. package/registry/chip-link.json +1 -1
  114. package/registry/chip.json +1 -1
  115. package/registry/choice-grid.json +1 -1
  116. package/registry/code-block.json +1 -1
  117. package/registry/combobox.json +1 -1
  118. package/registry/command.json +1 -1
  119. package/registry/component-page.json +227 -0
  120. package/registry/confirm-button.json +1 -1
  121. package/registry/contact-page.json +212 -0
  122. package/registry/continue-prompt.json +1 -1
  123. package/registry/countdown.json +1 -1
  124. package/registry/cta-panel.json +1 -1
  125. package/registry/dashboard-layout.json +1 -1
  126. package/registry/data-table.json +643 -49
  127. package/registry/date-picker.json +1 -1
  128. package/registry/decision-list.json +1 -1
  129. package/registry/detail-layout.json +1 -1
  130. package/registry/dialog.json +1 -1
  131. package/registry/docs-article-page.json +242 -0
  132. package/registry/docs-hub-page.json +270 -0
  133. package/registry/docs-layout.json +1 -1
  134. package/registry/dropdown-menu.json +1 -1
  135. package/registry/empty-state.json +1 -1
  136. package/registry/error-page.json +183 -0
  137. package/registry/examples/catalogue-page/components.d.ts +4 -0
  138. package/registry/examples/catalogue-page/components.js +33 -0
  139. package/registry/examples/catalogue-page/components.tsx +36 -0
  140. package/registry/examples/changelog-page/releases.d.ts +4 -0
  141. package/registry/examples/changelog-page/releases.js +44 -0
  142. package/registry/examples/changelog-page/releases.tsx +39 -0
  143. package/registry/examples/component-page/button.d.ts +4 -0
  144. package/registry/examples/component-page/button.js +33 -0
  145. package/registry/examples/component-page/button.tsx +30 -0
  146. package/registry/examples/contact-page/team.d.ts +4 -0
  147. package/registry/examples/contact-page/team.js +39 -0
  148. package/registry/examples/contact-page/team.tsx +38 -0
  149. package/registry/examples/data-table/details.d.ts +4 -0
  150. package/registry/examples/data-table/details.js +33 -0
  151. package/registry/examples/data-table/details.tsx +31 -0
  152. package/registry/examples/data-table/filters.d.ts +4 -0
  153. package/registry/examples/data-table/filters.js +40 -0
  154. package/registry/examples/data-table/filters.tsx +40 -0
  155. package/registry/examples/data-table/grouped.d.ts +4 -0
  156. package/registry/examples/data-table/grouped.js +24 -0
  157. package/registry/examples/data-table/grouped.tsx +23 -0
  158. package/registry/examples/data-table/paginated.d.ts +4 -0
  159. package/registry/examples/data-table/paginated.js +23 -0
  160. package/registry/examples/data-table/paginated.tsx +22 -0
  161. package/registry/examples/data-table/pinned.d.ts +4 -0
  162. package/registry/examples/data-table/pinned.js +26 -0
  163. package/registry/examples/data-table/pinned.tsx +25 -0
  164. package/registry/examples/data-table/server.d.ts +4 -0
  165. package/registry/examples/data-table/server.js +40 -0
  166. package/registry/examples/data-table/server.tsx +40 -0
  167. package/registry/examples/data-table/virtualized.js +2 -2
  168. package/registry/examples/data-table/virtualized.tsx +3 -3
  169. package/registry/examples/docs-article-page/cli.d.ts +4 -0
  170. package/registry/examples/docs-article-page/cli.js +33 -0
  171. package/registry/examples/docs-article-page/cli.tsx +38 -0
  172. package/registry/examples/docs-hub-page/krizaka.d.ts +4 -0
  173. package/registry/examples/docs-hub-page/krizaka.js +46 -0
  174. package/registry/examples/docs-hub-page/krizaka.tsx +37 -0
  175. package/registry/examples/error-page/not-found.d.ts +4 -0
  176. package/registry/examples/error-page/not-found.js +24 -0
  177. package/registry/examples/error-page/not-found.tsx +19 -0
  178. package/registry/examples/gallery-page/made-here.d.ts +4 -0
  179. package/registry/examples/gallery-page/made-here.js +34 -0
  180. package/registry/examples/gallery-page/made-here.tsx +32 -0
  181. package/registry/examples/how-it-works-page/orazaka.d.ts +4 -0
  182. package/registry/examples/how-it-works-page/orazaka.js +30 -0
  183. package/registry/examples/how-it-works-page/orazaka.tsx +26 -0
  184. package/registry/examples/landing-page/krizaka.d.ts +4 -0
  185. package/registry/examples/landing-page/krizaka.js +44 -0
  186. package/registry/examples/landing-page/krizaka.tsx +44 -0
  187. package/registry/examples/legal-page/privacy.d.ts +4 -0
  188. package/registry/examples/legal-page/privacy.js +24 -0
  189. package/registry/examples/legal-page/privacy.tsx +19 -0
  190. package/registry/examples/list/native/default.d.ts +4 -0
  191. package/registry/examples/list/native/default.dark.png +0 -0
  192. package/registry/examples/list/native/default.js +33 -0
  193. package/registry/examples/list/native/default.light.png +0 -0
  194. package/registry/examples/list/native/default.tsx +31 -0
  195. package/registry/examples/list/native/infinite.d.ts +4 -0
  196. package/registry/examples/list/native/infinite.dark.png +0 -0
  197. package/registry/examples/list/native/infinite.js +30 -0
  198. package/registry/examples/list/native/infinite.light.png +0 -0
  199. package/registry/examples/list/native/infinite.tsx +35 -0
  200. package/registry/examples/list/native/states.d.ts +4 -0
  201. package/registry/examples/list/native/states.dark.png +0 -0
  202. package/registry/examples/list/native/states.js +26 -0
  203. package/registry/examples/list/native/states.light.png +0 -0
  204. package/registry/examples/list/native/states.tsx +21 -0
  205. package/registry/examples/longform-page/story.d.ts +4 -0
  206. package/registry/examples/longform-page/story.js +38 -0
  207. package/registry/examples/longform-page/story.tsx +35 -0
  208. package/registry/examples/mascots/crane.d.ts +4 -0
  209. package/registry/examples/mascots/crane.js +19 -0
  210. package/registry/examples/mascots/crane.tsx +18 -0
  211. package/registry/examples/mascots/flock.tsx +2 -1
  212. package/registry/examples/mascots/native/crane.d.ts +4 -0
  213. package/registry/examples/mascots/native/crane.dark.png +0 -0
  214. package/registry/examples/mascots/native/crane.js +21 -0
  215. package/registry/examples/mascots/native/crane.light.png +0 -0
  216. package/registry/examples/mascots/native/crane.tsx +18 -0
  217. package/registry/examples/pricing-page/credits.d.ts +4 -0
  218. package/registry/examples/pricing-page/credits.js +41 -0
  219. package/registry/examples/pricing-page/credits.tsx +33 -0
  220. package/registry/examples/product-page/orazaka.d.ts +4 -0
  221. package/registry/examples/product-page/orazaka.js +44 -0
  222. package/registry/examples/product-page/orazaka.tsx +36 -0
  223. package/registry/examples/status-page/building.d.ts +4 -0
  224. package/registry/examples/status-page/building.js +29 -0
  225. package/registry/examples/status-page/building.tsx +25 -0
  226. package/registry/examples/status-page/operational.d.ts +4 -0
  227. package/registry/examples/status-page/operational.js +26 -0
  228. package/registry/examples/status-page/operational.tsx +20 -0
  229. package/registry/examples/virtual/feed.d.ts +4 -0
  230. package/registry/examples/virtual/feed.js +26 -0
  231. package/registry/examples/virtual/feed.tsx +24 -0
  232. package/registry/examples/virtual/gallery.d.ts +4 -0
  233. package/registry/examples/virtual/gallery.js +31 -0
  234. package/registry/examples/virtual/gallery.tsx +28 -0
  235. package/registry/examples/virtual/messages.d.ts +4 -0
  236. package/registry/examples/virtual/messages.js +28 -0
  237. package/registry/examples/virtual/messages.tsx +28 -0
  238. package/registry/field.json +1 -1
  239. package/registry/file-upload.json +1 -1
  240. package/registry/filter-bar.json +1 -1
  241. package/registry/gallery-page.json +256 -0
  242. package/registry/glow-card.json +1 -1
  243. package/registry/goal-gauge.json +1 -1
  244. package/registry/how-it-works-page.json +242 -0
  245. package/registry/image-cropper.json +1 -1
  246. package/registry/index.json +356 -9
  247. package/registry/iso.json +1 -1
  248. package/registry/kbd.json +1 -1
  249. package/registry/landing-page.json +242 -0
  250. package/registry/landscape.json +1 -1
  251. package/registry/legal-page.json +199 -0
  252. package/registry/link-card.json +1 -1
  253. package/registry/list.json +249 -0
  254. package/registry/loader.json +1 -1
  255. package/registry/longform-page.json +213 -0
  256. package/registry/marketing-layout.json +1 -1
  257. package/registry/marquee.json +1 -1
  258. package/registry/mascot-quote.json +6 -6
  259. package/registry/mascot-state.json +34 -34
  260. package/registry/mascots.json +41 -21
  261. package/registry/media-capture.json +1 -1
  262. package/registry/meter.json +1 -1
  263. package/registry/nav-bar.json +1 -1
  264. package/registry/number-ticker.json +1 -1
  265. package/registry/page-header.json +1 -1
  266. package/registry/page-hero.json +1 -1
  267. package/registry/page.json +1 -1
  268. package/registry/pagination.json +1 -1
  269. package/registry/pointer-light.json +1 -1
  270. package/registry/popover.json +1 -1
  271. package/registry/pricing-page.json +245 -0
  272. package/registry/product-page.json +319 -0
  273. package/registry/profile-card.json +1 -1
  274. package/registry/progress.json +1 -1
  275. package/registry/promise-card.json +1 -1
  276. package/registry/radio-group.json +1 -1
  277. package/registry/scroll-stage.json +1 -1
  278. package/registry/search-field.json +1 -1
  279. package/registry/section-backdrop.json +1 -1
  280. package/registry/separator.json +1 -1
  281. package/registry/settings-layout.json +1 -1
  282. package/registry/skeleton.json +1 -1
  283. package/registry/slider.json +1 -1
  284. package/registry/slot.json +1 -1
  285. package/registry/spinner.json +1 -1
  286. package/registry/split-view.json +1 -1
  287. package/registry/stage-banner.json +1 -1
  288. package/registry/stat.json +1 -1
  289. package/registry/status-page.json +263 -0
  290. package/registry/stepper.json +1 -1
  291. package/registry/switch.json +1 -1
  292. package/registry/tabs.json +1 -1
  293. package/registry/tag-input.json +1 -1
  294. package/registry/terminal-replay.json +1 -1
  295. package/registry/theme.json +1 -1
  296. package/registry/toast.json +1 -1
  297. package/registry/toc.json +1 -1
  298. package/registry/tooltip.json +1 -1
  299. package/registry/video-player.json +1 -1
  300. package/registry/video-trimmer.json +1 -1
  301. package/registry/virtual.json +569 -0
  302. package/skills/data-table/SKILL.md +56 -0
  303. package/skills/native-list/SKILL.md +39 -0
  304. package/skills/virtual/SKILL.md +35 -0
  305. package/dist/chunk-NOVUREEC.js.map +0 -1
  306. /package/dist/{chunk-EUPTXKH7.js.map → chunk-BRKMQ6JV.js.map} +0 -0
  307. /package/dist/{chunk-X6TW3X6Y.js.map → chunk-LCZXS6AK.js.map} +0 -0
package/dist/tag-input.js CHANGED
@@ -1,12 +1,12 @@
1
1
  "use client";
2
2
  import {
3
3
  Combobox
4
- } from "./chunk-X6TW3X6Y.js";
4
+ } from "./chunk-LCZXS6AK.js";
5
5
  import "./chunk-YH4LMWRU.js";
6
6
  import "./chunk-ZIXB33X7.js";
7
7
  import {
8
8
  useControllable
9
- } from "./chunk-EUPTXKH7.js";
9
+ } from "./chunk-BRKMQ6JV.js";
10
10
  import "./chunk-CPA5CF35.js";
11
11
 
12
12
  // src/tag-input/tag-input.tsx
@@ -8,7 +8,7 @@ import {
8
8
  playSafely,
9
9
  useInView,
10
10
  usePrefersReducedMotion
11
- } from "./chunk-EUPTXKH7.js";
11
+ } from "./chunk-BRKMQ6JV.js";
12
12
  import {
13
13
  CaptionsGlyph,
14
14
  FullscreenGlyph,
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  clamp,
4
4
  formatClock
5
- } from "./chunk-EUPTXKH7.js";
5
+ } from "./chunk-BRKMQ6JV.js";
6
6
 
7
7
  // src/video-trimmer/video-trimmer.tsx
8
8
  import * as React from "react";
@@ -0,0 +1,140 @@
1
+ import * as tailwind_variants from 'tailwind-variants';
2
+ import { ReactVirtualizer, useVirtualizer as useVirtualizer$1, useWindowVirtualizer as useWindowVirtualizer$1 } from '@tanstack/react-virtual';
3
+ export { VirtualItem } from '@tanstack/react-virtual';
4
+ import * as React from 'react';
5
+
6
+ declare const virtual: tailwind_variants.TVReturnType<{
7
+ [key: string]: {
8
+ [key: string]: tailwind_variants.ClassValue | {
9
+ list?: tailwind_variants.ClassValue;
10
+ row?: tailwind_variants.ClassValue;
11
+ item?: tailwind_variants.ClassValue;
12
+ viewport?: tailwind_variants.ClassValue;
13
+ empty?: tailwind_variants.ClassValue;
14
+ };
15
+ };
16
+ } | {
17
+ [x: string]: {
18
+ [x: string]: tailwind_variants.ClassValue | {
19
+ list?: tailwind_variants.ClassValue;
20
+ row?: tailwind_variants.ClassValue;
21
+ item?: tailwind_variants.ClassValue;
22
+ viewport?: tailwind_variants.ClassValue;
23
+ empty?: tailwind_variants.ClassValue;
24
+ };
25
+ };
26
+ } | {}, {
27
+ viewport: string;
28
+ list: string;
29
+ item: string;
30
+ row: string;
31
+ empty: string;
32
+ }, undefined, {
33
+ [key: string]: {
34
+ [key: string]: tailwind_variants.ClassValue | {
35
+ list?: tailwind_variants.ClassValue;
36
+ row?: tailwind_variants.ClassValue;
37
+ item?: tailwind_variants.ClassValue;
38
+ viewport?: tailwind_variants.ClassValue;
39
+ empty?: tailwind_variants.ClassValue;
40
+ };
41
+ };
42
+ } | {}, {
43
+ viewport: string;
44
+ list: string;
45
+ item: string;
46
+ row: string;
47
+ empty: string;
48
+ }, tailwind_variants.TVReturnTypeLike<unknown, {
49
+ viewport: string;
50
+ list: string;
51
+ item: string;
52
+ row: string;
53
+ empty: string;
54
+ }>>;
55
+ /** What a list or a grid can be asked to do from outside (`ref`). */
56
+ type VirtualHandle = {
57
+ /** Scrolls the item at `index` into view — smoothly, unless the person asked for less motion. */
58
+ scrollToIndex: (index: number, align?: "start" | "center" | "end" | "auto") => void;
59
+ };
60
+ /** The window virtualizer of TanStack Virtual (a feed that scrolls the page), re-exported through the facade. */
61
+ declare const useWindowVirtualizer: typeof useWindowVirtualizer$1;
62
+ /** The element virtualizer of TanStack Virtual (anything the components do not cover), re-exported through the facade. */
63
+ declare const useVirtualizer: typeof useVirtualizer$1;
64
+ type Virtualizer<S extends Element | Window = Element, I extends Element = Element> = ReactVirtualizer<S, I>;
65
+ type Size = number | ((index: number) => number);
66
+ type VirtualListProps<T> = {
67
+ /** The items, all of them: only those in view (and `overscan` around) are rendered. */
68
+ items: readonly T[];
69
+ /** Draws one item. */
70
+ renderItem: (item: T, index: number) => React.ReactNode;
71
+ /** A stable key per item (an id): keeps measurements on the right item when the list changes. Default: the index. */
72
+ getKey?: (item: T, index: number) => string | number;
73
+ /** The size of an item in px, or a guess per index; each item is then measured (dynamic sizes). */
74
+ estimateSize: Size;
75
+ /** The accessible name of the list ("Messages", "Events"), passed translated. */
76
+ label: string;
77
+ /** `self` (default): the list scrolls in its own region of `height`. `window`: the page scrolls (a feed). */
78
+ scroll?: "self" | "window";
79
+ /** The height of the scrolling region (`self`): px or any CSS length. Default 400. */
80
+ height?: number | string;
81
+ /** Items rendered beyond the visible ones, on each side. Default 6. */
82
+ overscan?: number;
83
+ /** Space between two items, in px. Default 0. */
84
+ gap?: number;
85
+ /** Called when the end comes near (load the next page): once per length of `items`. */
86
+ onEndReached?: () => void;
87
+ /** How many items before the end `onEndReached` fires. Default 5. */
88
+ endReachedThreshold?: number;
89
+ /** Shown instead of the list when there is no item. */
90
+ empty?: React.ReactNode;
91
+ /** Shown after the last item (a spinner while the next page loads). */
92
+ footer?: React.ReactNode;
93
+ /** `scrollToIndex` from outside. */
94
+ ref?: React.Ref<VirtualHandle>;
95
+ /** Classes merged on the scrolling region (`self`) or the list (`window`). */
96
+ className?: string;
97
+ };
98
+ /**
99
+ * A long list rendered by what is in view: fixed or measured sizes, its own scrolling region or the page's, the end
100
+ * announced for infinite loading, items placed in the whole for assistive technology.
101
+ */
102
+ declare function VirtualList<T>({ items, renderItem, getKey, estimateSize, label, scroll, height, overscan, gap, onEndReached, endReachedThreshold, empty, footer, ref, className, }: VirtualListProps<T>): React.JSX.Element;
103
+ type VirtualGridProps<T> = {
104
+ /** The items, all of them: only the rows in view are rendered. */
105
+ items: readonly T[];
106
+ /** Draws one cell (a card, a thumbnail). */
107
+ renderItem: (item: T, index: number) => React.ReactNode;
108
+ /** A stable key per item. Default: the index. */
109
+ getKey?: (item: T, index: number) => string | number;
110
+ /** The height of a row in px (a guess: rows are measured). */
111
+ estimateRowHeight: number;
112
+ /** The accessible name of the grid of items ("Videos"), passed translated. */
113
+ label: string;
114
+ /** A fixed number of columns. Without it, as many columns of at least `minItemWidth` as the width allows. */
115
+ columns?: number;
116
+ /** The narrowest a cell may be, in px, when `columns` is not set. Default 220. */
117
+ minItemWidth?: number;
118
+ /** The height of the scrolling region: px or any CSS length. Default 480. */
119
+ height?: number | string;
120
+ /** Space between cells, in px. Default 16. */
121
+ gap?: number;
122
+ /** Rows rendered beyond the visible ones. Default 3. */
123
+ overscan?: number;
124
+ /** Called when the last rows come near (load the next page). */
125
+ onEndReached?: () => void;
126
+ /** Shown instead of the grid when there is no item. */
127
+ empty?: React.ReactNode;
128
+ /** Shown after the last row. */
129
+ footer?: React.ReactNode;
130
+ /** `scrollToIndex` (of an item) from outside. */
131
+ ref?: React.Ref<VirtualHandle>;
132
+ /** Classes merged on the scrolling region. */
133
+ className?: string;
134
+ };
135
+ /** The number of columns a width holds at `minItemWidth` each (at least one). */
136
+ declare const columnsFor: (width: number, minItemWidth: number, gap: number) => number;
137
+ /** A gallery rendered by the rows in view: as many columns as the width allows (or a fixed number), measured rows. */
138
+ declare function VirtualGrid<T>({ items, renderItem, getKey, estimateRowHeight, label, columns: fixed, minItemWidth, height, gap, overscan, onEndReached, empty, footer, ref, className, }: VirtualGridProps<T>): React.JSX.Element;
139
+
140
+ export { VirtualGrid, type VirtualGridProps, type VirtualHandle, VirtualList, type VirtualListProps, type Virtualizer, columnsFor, useVirtualizer, useWindowVirtualizer, virtual };
@@ -0,0 +1,19 @@
1
+ "use client";
2
+ import {
3
+ VirtualGrid,
4
+ VirtualList,
5
+ columnsFor,
6
+ useVirtualizer,
7
+ useWindowVirtualizer,
8
+ virtual
9
+ } from "./chunk-HCNOOPZE.js";
10
+ import "./chunk-BRKMQ6JV.js";
11
+ export {
12
+ VirtualGrid,
13
+ VirtualList,
14
+ columnsFor,
15
+ useVirtualizer,
16
+ useWindowVirtualizer,
17
+ virtual
18
+ };
19
+ //# sourceMappingURL=virtual.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "@krizaka/ui",
3
- "version": "2.9.0",
4
- "description": "The Krizaka front-end platform's components: the primitives (button, card, dialog, toast, menu, field, tabs, chip, switch, slider, command palette, theme, countdown…) on the semantic --kz-* tokens, the animated marks (Krizaka, Orazaka, Orochia, Yazakia) and the motion signature — web and /native.",
3
+ "version": "3.0.0",
4
+ "description": "The Krizaka front-end platform's components: the primitives (button, card, dialog, toast, menu, field, tabs, chip, switch, slider, command palette, theme, countdown…) on the semantic --kz-* tokens, the animated marks (Krizaka, Orazaka, Orochia, Yazakia, Yororis) and the motion signature — web and /native.",
5
5
  "keywords": [
6
6
  "krizaka",
7
7
  "orazaka",
8
8
  "orochia",
9
9
  "yazakia",
10
+ "yororis",
10
11
  "react",
11
12
  "logo",
12
13
  "motion",
@@ -24,7 +25,12 @@
24
25
  "page-layout",
25
26
  "layouts",
26
27
  "templates",
27
- "app-shell"
28
+ "app-shell",
29
+ "data-table",
30
+ "virtual-list",
31
+ "flashlist",
32
+ "tanstack",
33
+ "tanstack-intent"
28
34
  ],
29
35
  "homepage": "https://github.com/krizaka/krizaka-ui#readme",
30
36
  "bugs": "https://github.com/krizaka/krizaka-ui/issues",
@@ -232,6 +238,10 @@
232
238
  "types": "./dist/data-table.d.ts",
233
239
  "import": "./dist/data-table.js"
234
240
  },
241
+ "./virtual": {
242
+ "types": "./dist/virtual.d.ts",
243
+ "import": "./dist/virtual.js"
244
+ },
235
245
  "./filter-bar": {
236
246
  "types": "./dist/filter-bar.d.ts",
237
247
  "import": "./dist/filter-bar.js"
@@ -392,6 +402,66 @@
392
402
  "types": "./dist/landscape.d.ts",
393
403
  "import": "./dist/landscape.js"
394
404
  },
405
+ "./landing-page": {
406
+ "types": "./dist/landing-page.d.ts",
407
+ "import": "./dist/landing-page.js"
408
+ },
409
+ "./product-page": {
410
+ "types": "./dist/product-page.d.ts",
411
+ "import": "./dist/product-page.js"
412
+ },
413
+ "./how-it-works-page": {
414
+ "types": "./dist/how-it-works-page.d.ts",
415
+ "import": "./dist/how-it-works-page.js"
416
+ },
417
+ "./gallery-page": {
418
+ "types": "./dist/gallery-page.d.ts",
419
+ "import": "./dist/gallery-page.js"
420
+ },
421
+ "./docs-hub-page": {
422
+ "types": "./dist/docs-hub-page.d.ts",
423
+ "import": "./dist/docs-hub-page.js"
424
+ },
425
+ "./docs-article-page": {
426
+ "types": "./dist/docs-article-page.d.ts",
427
+ "import": "./dist/docs-article-page.js"
428
+ },
429
+ "./component-page": {
430
+ "types": "./dist/component-page.d.ts",
431
+ "import": "./dist/component-page.js"
432
+ },
433
+ "./catalogue-page": {
434
+ "types": "./dist/catalogue-page.d.ts",
435
+ "import": "./dist/catalogue-page.js"
436
+ },
437
+ "./longform-page": {
438
+ "types": "./dist/longform-page.d.ts",
439
+ "import": "./dist/longform-page.js"
440
+ },
441
+ "./changelog-page": {
442
+ "types": "./dist/changelog-page.d.ts",
443
+ "import": "./dist/changelog-page.js"
444
+ },
445
+ "./contact-page": {
446
+ "types": "./dist/contact-page.d.ts",
447
+ "import": "./dist/contact-page.js"
448
+ },
449
+ "./legal-page": {
450
+ "types": "./dist/legal-page.d.ts",
451
+ "import": "./dist/legal-page.js"
452
+ },
453
+ "./status-page": {
454
+ "types": "./dist/status-page.d.ts",
455
+ "import": "./dist/status-page.js"
456
+ },
457
+ "./error-page": {
458
+ "types": "./dist/error-page.d.ts",
459
+ "import": "./dist/error-page.js"
460
+ },
461
+ "./pricing-page": {
462
+ "types": "./dist/pricing-page.d.ts",
463
+ "import": "./dist/pricing-page.js"
464
+ },
395
465
  "./motion.css": "./dist/motion.css",
396
466
  "./blocks.css": "./dist/blocks.css",
397
467
  "./story.css": "./dist/story.css",
@@ -408,6 +478,10 @@
408
478
  "types": "./dist/native/media-capture.d.ts",
409
479
  "import": "./dist/native/media-capture.js"
410
480
  },
481
+ "./native/list": {
482
+ "types": "./dist/native/list.d.ts",
483
+ "import": "./dist/native/list.js"
484
+ },
411
485
  "./registry/examples/*": {
412
486
  "types": "./registry/examples/*.d.ts",
413
487
  "import": "./registry/examples/*.js"
@@ -422,6 +496,7 @@
422
496
  "registry/examples/**/*.js",
423
497
  "registry/examples/**/*.d.ts",
424
498
  "registry/examples/**/*.png",
499
+ "skills",
425
500
  "tailwind.css",
426
501
  "README.md",
427
502
  "LICENSE"
@@ -430,7 +505,9 @@
430
505
  "*.css"
431
506
  ],
432
507
  "peerDependencies": {
433
- "@krizaka/tailwind": ">=2.9.0",
508
+ "@krizaka/query": ">=0.1.0",
509
+ "@krizaka/tailwind": ">=3.0.0",
510
+ "@shopify/flash-list": ">=2",
434
511
  "expo-camera": ">=16",
435
512
  "expo-video": ">=2",
436
513
  "hls.js": ">=1.5",
@@ -446,6 +523,7 @@
446
523
  "@jest/globals": "30.4.1",
447
524
  "@react-native/babel-preset": "0.86.3",
448
525
  "@react-native/jest-preset": "0.86.3",
526
+ "@shopify/flash-list": "2.3.3",
449
527
  "@size-limit/preset-small-lib": "^14.2.0",
450
528
  "@storybook/react-vite": "10.6.1",
451
529
  "@testing-library/dom": "^10.4.0",
@@ -479,8 +557,9 @@
479
557
  "tsup": "^8.5.1",
480
558
  "typescript": "^5.9.0",
481
559
  "vitest": "^4.1.11",
482
- "@krizaka/config": "0.1.0",
483
- "@krizaka/tokens": "2.9.0"
560
+ "@krizaka/config": "0.2.0",
561
+ "@krizaka/query": "0.1.0",
562
+ "@krizaka/tokens": "3.0.0"
484
563
  },
485
564
  "engines": {
486
565
  "node": ">=20"
@@ -489,9 +568,15 @@
489
568
  "access": "public"
490
569
  },
491
570
  "peerDependenciesMeta": {
571
+ "@krizaka/query": {
572
+ "optional": true
573
+ },
492
574
  "@krizaka/tailwind": {
493
575
  "optional": true
494
576
  },
577
+ "@shopify/flash-list": {
578
+ "optional": true
579
+ },
495
580
  "expo-camera": {
496
581
  "optional": true
497
582
  },
@@ -524,7 +609,7 @@
524
609
  {
525
610
  "name": "./native (bundled into the app by Metro, never downloaded: a regression guard, not a budget)",
526
611
  "path": "dist/native.js",
527
- "limit": "18.5 kB",
612
+ "limit": "19.4 kB",
528
613
  "gzip": true
529
614
  },
530
615
  {
@@ -756,7 +841,7 @@
756
841
  {
757
842
  "name": "./mascots",
758
843
  "path": "dist/mascots.js",
759
- "limit": "5.2 kB",
844
+ "limit": "5.5 kB",
760
845
  "gzip": true
761
846
  },
762
847
  {
@@ -980,9 +1065,31 @@
980
1065
  ]
981
1066
  },
982
1067
  {
983
- "name": "./data-table",
1068
+ "name": "./data-table: DataTable (TanStack Table v9, the windowing of TanStack Virtual, Radix Checkbox, the pagination)",
984
1069
  "path": "dist/data-table.js",
985
- "limit": "9.5 kB",
1070
+ "import": "{ DataTable }",
1071
+ "limit": "44 kB",
1072
+ "gzip": true,
1073
+ "ignore": [
1074
+ "tailwind-variants",
1075
+ "clsx"
1076
+ ]
1077
+ },
1078
+ {
1079
+ "name": "./data-table: the toolbar (FilterBar on Radix DropdownMenu, SearchField, the columns menu, the export)",
1080
+ "path": "dist/data-table.js",
1081
+ "import": "{ DataTableFilters, DataTableColumnsMenu, DataTableExport }",
1082
+ "limit": "40 kB",
1083
+ "gzip": true,
1084
+ "ignore": [
1085
+ "tailwind-variants",
1086
+ "clsx"
1087
+ ]
1088
+ },
1089
+ {
1090
+ "name": "./virtual (TanStack Virtual v3)",
1091
+ "path": "dist/virtual.js",
1092
+ "limit": "12 kB",
986
1093
  "gzip": true,
987
1094
  "ignore": [
988
1095
  "tailwind-variants",
@@ -1121,6 +1228,18 @@
1121
1228
  "@krizaka/ui"
1122
1229
  ]
1123
1230
  },
1231
+ {
1232
+ "name": "./native/list (FlashList and @krizaka/query are the app's)",
1233
+ "path": "dist/native/list.js",
1234
+ "limit": "2 kB",
1235
+ "gzip": true,
1236
+ "ignore": [
1237
+ "@shopify/flash-list",
1238
+ "@krizaka/query",
1239
+ "@krizaka/ui",
1240
+ "react-native"
1241
+ ]
1242
+ },
1124
1243
  {
1125
1244
  "name": "./page",
1126
1245
  "path": "dist/page.js",
@@ -1410,10 +1529,177 @@
1410
1529
  "tailwind-variants",
1411
1530
  "clsx"
1412
1531
  ]
1532
+ },
1533
+ {
1534
+ "name": "./landing-page",
1535
+ "path": "dist/landing-page.js",
1536
+ "limit": "1.5 kB",
1537
+ "gzip": true,
1538
+ "ignore": [
1539
+ "tailwind-variants",
1540
+ "clsx",
1541
+ "@krizaka/ui"
1542
+ ]
1543
+ },
1544
+ {
1545
+ "name": "./product-page",
1546
+ "path": "dist/product-page.js",
1547
+ "limit": "1.5 kB",
1548
+ "gzip": true,
1549
+ "ignore": [
1550
+ "tailwind-variants",
1551
+ "clsx",
1552
+ "@krizaka/ui"
1553
+ ]
1554
+ },
1555
+ {
1556
+ "name": "./how-it-works-page",
1557
+ "path": "dist/how-it-works-page.js",
1558
+ "limit": "1.5 kB",
1559
+ "gzip": true,
1560
+ "ignore": [
1561
+ "tailwind-variants",
1562
+ "clsx",
1563
+ "@krizaka/ui"
1564
+ ]
1565
+ },
1566
+ {
1567
+ "name": "./gallery-page",
1568
+ "path": "dist/gallery-page.js",
1569
+ "limit": "1.5 kB",
1570
+ "gzip": true,
1571
+ "ignore": [
1572
+ "tailwind-variants",
1573
+ "clsx",
1574
+ "@krizaka/ui"
1575
+ ]
1576
+ },
1577
+ {
1578
+ "name": "./docs-hub-page",
1579
+ "path": "dist/docs-hub-page.js",
1580
+ "limit": "1.5 kB",
1581
+ "gzip": true,
1582
+ "ignore": [
1583
+ "tailwind-variants",
1584
+ "clsx",
1585
+ "@krizaka/ui"
1586
+ ]
1587
+ },
1588
+ {
1589
+ "name": "./docs-article-page",
1590
+ "path": "dist/docs-article-page.js",
1591
+ "limit": "1.5 kB",
1592
+ "gzip": true,
1593
+ "ignore": [
1594
+ "tailwind-variants",
1595
+ "clsx",
1596
+ "@krizaka/ui"
1597
+ ]
1598
+ },
1599
+ {
1600
+ "name": "./component-page",
1601
+ "path": "dist/component-page.js",
1602
+ "limit": "1.5 kB",
1603
+ "gzip": true,
1604
+ "ignore": [
1605
+ "tailwind-variants",
1606
+ "clsx",
1607
+ "@krizaka/ui"
1608
+ ]
1609
+ },
1610
+ {
1611
+ "name": "./catalogue-page",
1612
+ "path": "dist/catalogue-page.js",
1613
+ "limit": "1.5 kB",
1614
+ "gzip": true,
1615
+ "ignore": [
1616
+ "tailwind-variants",
1617
+ "clsx",
1618
+ "@krizaka/ui"
1619
+ ]
1620
+ },
1621
+ {
1622
+ "name": "./longform-page",
1623
+ "path": "dist/longform-page.js",
1624
+ "limit": "1.5 kB",
1625
+ "gzip": true,
1626
+ "ignore": [
1627
+ "tailwind-variants",
1628
+ "clsx",
1629
+ "@krizaka/ui"
1630
+ ]
1631
+ },
1632
+ {
1633
+ "name": "./changelog-page",
1634
+ "path": "dist/changelog-page.js",
1635
+ "limit": "1.5 kB",
1636
+ "gzip": true,
1637
+ "ignore": [
1638
+ "tailwind-variants",
1639
+ "clsx",
1640
+ "@krizaka/ui"
1641
+ ]
1642
+ },
1643
+ {
1644
+ "name": "./contact-page",
1645
+ "path": "dist/contact-page.js",
1646
+ "limit": "1.5 kB",
1647
+ "gzip": true,
1648
+ "ignore": [
1649
+ "tailwind-variants",
1650
+ "clsx",
1651
+ "@krizaka/ui"
1652
+ ]
1653
+ },
1654
+ {
1655
+ "name": "./legal-page",
1656
+ "path": "dist/legal-page.js",
1657
+ "limit": "1.5 kB",
1658
+ "gzip": true,
1659
+ "ignore": [
1660
+ "tailwind-variants",
1661
+ "clsx",
1662
+ "@krizaka/ui"
1663
+ ]
1664
+ },
1665
+ {
1666
+ "name": "./status-page",
1667
+ "path": "dist/status-page.js",
1668
+ "limit": "1.5 kB",
1669
+ "gzip": true,
1670
+ "ignore": [
1671
+ "tailwind-variants",
1672
+ "clsx",
1673
+ "@krizaka/ui"
1674
+ ]
1675
+ },
1676
+ {
1677
+ "name": "./error-page",
1678
+ "path": "dist/error-page.js",
1679
+ "limit": "1.5 kB",
1680
+ "gzip": true,
1681
+ "ignore": [
1682
+ "tailwind-variants",
1683
+ "clsx",
1684
+ "@krizaka/ui"
1685
+ ]
1686
+ },
1687
+ {
1688
+ "name": "./pricing-page",
1689
+ "path": "dist/pricing-page.js",
1690
+ "limit": "1.5 kB",
1691
+ "gzip": true,
1692
+ "ignore": [
1693
+ "tailwind-variants",
1694
+ "clsx",
1695
+ "@krizaka/ui"
1696
+ ]
1413
1697
  }
1414
1698
  ],
1415
1699
  "dependencies": {
1416
1700
  "@krizaka/intl": "^0.1.0",
1701
+ "@tanstack/react-table": "9.2.8",
1702
+ "@tanstack/react-virtual": "3.14.15",
1417
1703
  "clsx": "^2.1.1",
1418
1704
  "cmdk": "^1.1.1",
1419
1705
  "radix-ui": "^1.7.0",
@@ -193,7 +193,7 @@
193
193
  },
194
194
  {
195
195
  "path": "meta.ts",
196
- "content": "// The documentation of a component, carried by its code: each primitive has a `meta.ts` beside its source\n// (`src/<name>/meta.ts`; a component that exists only in React Native: `src/native/meta/<name>.ts`). Never built into\n// the package: `scripts/build-registry.mjs` reads them into `registry/<name>.json`, which krizaka.com renders as\n// /docs/ui/<name>, and `scripts/registry.test.mjs` fails when one is missing or incomplete.\n//\n// Why a typed module and not JSDoc tags: the fields are lists and links (`related`, `whenNotToUse[].use`, examples),\n// which a type checks and a comment does not; the file is plain data (erasable TypeScript), so Node reads it without a\n// compiler, and an editor completes it.\n\n/** Every documented component: the web primitives (one entry of the package each) and the native-only ones. */\nexport type ComponentName =\n | \"achievement\"\n | \"action-bar\"\n | \"alert\"\n | \"app-shell\"\n | \"argument-card\"\n | \"audio-player\"\n | \"auth-layout\"\n | \"avatar\"\n | \"badge\"\n | \"button\"\n | \"card\"\n | \"card-grid\"\n | \"checkbox\"\n | \"chip\"\n | \"chip-link\"\n | \"choice-grid\"\n | \"cn\"\n | \"code-block\"\n | \"combobox\"\n | \"command\"\n | \"confirm-button\"\n | \"continue-prompt\"\n | \"countdown\"\n | \"cta-panel\"\n | \"dashboard-layout\"\n | \"data-table\"\n | \"date-picker\"\n | \"decision-list\"\n | \"detail-layout\"\n | \"dialog\"\n | \"docs-layout\"\n | \"dropdown-menu\"\n | \"empty-state\"\n | \"field\"\n | \"file-upload\"\n | \"filter-bar\"\n | \"glow-card\"\n | \"goal-gauge\"\n | \"image-cropper\"\n | \"iso\"\n | \"kbd\"\n | \"landscape\"\n | \"link-card\"\n | \"loader\"\n | \"marketing-layout\"\n | \"marquee\"\n | \"mascot-quote\"\n | \"mascot-state\"\n | \"mascots\"\n | \"media-capture\"\n | \"meter\"\n | \"nav-bar\"\n | \"number-ticker\"\n | \"page\"\n | \"page-header\"\n | \"page-hero\"\n | \"pagination\"\n | \"pointer-light\"\n | \"popover\"\n | \"profile-card\"\n | \"progress\"\n | \"promise-card\"\n | \"radio-group\"\n | \"scroll-stage\"\n | \"search-field\"\n | \"section-backdrop\"\n | \"segmented\"\n | \"separator\"\n | \"settings-layout\"\n | \"skeleton\"\n | \"slider\"\n | \"slot\"\n | \"spinner\"\n | \"split-view\"\n | \"stage-banner\"\n | \"stat\"\n | \"stepper\"\n | \"switch\"\n | \"tabs\"\n | \"tag-input\"\n | \"terminal-replay\"\n | \"theme\"\n | \"toast\"\n | \"toc\"\n | \"tooltip\"\n | \"txt\"\n | \"video-player\"\n | \"video-trimmer\";\n\n/** Where a component exists: `@krizaka/ui/<name>` (web), `@krizaka/ui/native` (React Native), or both. */\nexport type Platform = \"web\" | \"native\" | \"both\";\n\n/** `stable`: its API only changes in a major. `beta`: it may still change in a minor. */\nexport type Status = \"stable\" | \"beta\";\n\n/**\n * The group of the catalogue. `media`: video, sound, camera, files, cropping. `blocks`: the page blocks — the frame,\n * the hero, sections, cards that lead or argue, decisions, code, calls to act — that every page of a site is made of.\n * `layouts`: the shells of whole screens — an application, a dashboard, settings, sign-in, an object, a list and its\n * item, a site's page, a documentation page — each with its templates.\n */\nexport type Category = \"actions\" | \"forms\" | \"navigation\" | \"overlays\" | \"feedback\" | \"data-display\" | \"media\" | \"blocks\" | \"layouts\" | \"layout\" | \"foundations\";\n\n/**\n * A named example: the file `registry/examples/<component>/<name>.tsx` (web) or\n * `registry/examples/<component>/native/<name>.tsx` (React Native) — at most 40 lines, imported by the stories and\n * shown (live, with its code) by the documentation.\n */\nexport interface Example {\n /** The file name, kebab-case (`primary`, `icon-button`). */\n readonly name: string;\n /** A short title (`Primary`, `Icon button`). */\n readonly title: string;\n /** One or two sentences: when this variant is the right one. */\n readonly description: string;\n /**\n * A template: a whole screen of a product composed from the platform (a layout and its blocks, real words, its phone\n * version thought out), copied as a starting point — at most 160 lines, listed on krizaka.com/docs/ui/templates.\n */\n readonly template?: boolean;\n}\n\n/** One platform's side of a component. */\nexport interface PlatformDocs {\n /** The names to import (`[\"Button\", \"IconButton\"]`): from `@krizaka/ui/<name>` on the web, `@krizaka/ui/native` in React Native. */\n readonly imports: readonly string[];\n /** The examples, in reading order; the first one is the component's preview. */\n readonly examples: readonly Example[];\n}\n\n/** The React Native side: the same concept, and what differs from the web API. */\nexport interface NativeDocs extends PlatformDocs {\n /**\n * The entry to import from when it is not `@krizaka/ui/native`: a component that needs an Expo module (an optional\n * peer) has its own, `@krizaka/ui/native/<name>`, so an app that does not use it never installs the module.\n */\n readonly entry?: string;\n /** What differs from the web API (`label` instead of children…); empty for a native-only component. */\n readonly differences: readonly string[];\n}\n\nexport interface KeyboardInteraction {\n /** The keys, as written on a keyboard: `Space`, `Enter`, `Arrow keys`, `Esc`, `Tab`. */\n readonly keys: string;\n /** What they do. */\n readonly action: string;\n}\n\nexport interface ComponentMeta {\n /** The display name: `Button`, `Dropdown menu`. */\n readonly title: string;\n /** One sentence: what it is. */\n readonly summary: string;\n readonly status: Status;\n readonly category: Category;\n /** Must match the sides below: `both` ⇔ `web` and `native`. */\n readonly platforms: Platform;\n /** When to reach for it: concrete situations, one per item. */\n readonly whenToUse: readonly string[];\n /** When not to — and what to use instead (`use`), when another component is the answer. */\n readonly whenNotToUse: readonly { readonly when: string; readonly use?: ComponentName }[];\n /** How to use it well: wording, placement, composition. */\n readonly bestPractices: readonly string[];\n readonly accessibility: {\n /** The keyboard, when it does more than Tab and Enter. */\n readonly keyboard: readonly KeyboardInteraction[];\n /** Roles, names and announcements: what the component does, what the app must provide. */\n readonly notes: readonly string[];\n };\n /** The components a reader of this page should know about. */\n readonly related: readonly ComponentName[];\n readonly web?: PlatformDocs;\n readonly native?: NativeDocs;\n}\n"
196
+ "content": "// The documentation of a component, carried by its code: each primitive has a `meta.ts` beside its source\n// (`src/<name>/meta.ts`; a component that exists only in React Native: `src/native/meta/<name>.ts`). Never built into\n// the package: `scripts/build-registry.mjs` reads them into `registry/<name>.json`, which krizaka.com renders as\n// /docs/ui/<name>, and `scripts/registry.test.mjs` fails when one is missing or incomplete.\n//\n// Why a typed module and not JSDoc tags: the fields are lists and links (`related`, `whenNotToUse[].use`, examples),\n// which a type checks and a comment does not; the file is plain data (erasable TypeScript), so Node reads it without a\n// compiler, and an editor completes it.\n\n/** Every documented component: the web primitives (one entry of the package each) and the native-only ones. */\nexport type ComponentName =\n | \"achievement\"\n | \"action-bar\"\n | \"alert\"\n | \"app-shell\"\n | \"argument-card\"\n | \"audio-player\"\n | \"auth-layout\"\n | \"avatar\"\n | \"badge\"\n | \"button\"\n | \"card\"\n | \"card-grid\"\n | \"catalogue-page\"\n | \"changelog-page\"\n | \"checkbox\"\n | \"chip\"\n | \"chip-link\"\n | \"choice-grid\"\n | \"cn\"\n | \"code-block\"\n | \"combobox\"\n | \"command\"\n | \"component-page\"\n | \"confirm-button\"\n | \"contact-page\"\n | \"continue-prompt\"\n | \"countdown\"\n | \"cta-panel\"\n | \"dashboard-layout\"\n | \"data-table\"\n | \"date-picker\"\n | \"decision-list\"\n | \"detail-layout\"\n | \"dialog\"\n | \"docs-article-page\"\n | \"docs-hub-page\"\n | \"docs-layout\"\n | \"dropdown-menu\"\n | \"empty-state\"\n | \"error-page\"\n | \"field\"\n | \"file-upload\"\n | \"filter-bar\"\n | \"gallery-page\"\n | \"glow-card\"\n | \"goal-gauge\"\n | \"how-it-works-page\"\n | \"image-cropper\"\n | \"iso\"\n | \"kbd\"\n | \"landing-page\"\n | \"landscape\"\n | \"legal-page\"\n | \"link-card\"\n | \"list\"\n | \"loader\"\n | \"longform-page\"\n | \"marketing-layout\"\n | \"marquee\"\n | \"mascot-quote\"\n | \"mascot-state\"\n | \"mascots\"\n | \"media-capture\"\n | \"meter\"\n | \"nav-bar\"\n | \"number-ticker\"\n | \"page\"\n | \"page-header\"\n | \"page-hero\"\n | \"pagination\"\n | \"pointer-light\"\n | \"popover\"\n | \"pricing-page\"\n | \"product-page\"\n | \"profile-card\"\n | \"progress\"\n | \"promise-card\"\n | \"radio-group\"\n | \"scroll-stage\"\n | \"search-field\"\n | \"section-backdrop\"\n | \"segmented\"\n | \"separator\"\n | \"settings-layout\"\n | \"skeleton\"\n | \"slider\"\n | \"slot\"\n | \"spinner\"\n | \"split-view\"\n | \"stage-banner\"\n | \"stat\"\n | \"status-page\"\n | \"stepper\"\n | \"switch\"\n | \"tabs\"\n | \"tag-input\"\n | \"terminal-replay\"\n | \"theme\"\n | \"toast\"\n | \"toc\"\n | \"tooltip\"\n | \"txt\"\n | \"video-player\"\n | \"video-trimmer\"\n | \"virtual\";\n\n/** Where a component exists: `@krizaka/ui/<name>` (web), `@krizaka/ui/native` (React Native), or both. */\nexport type Platform = \"web\" | \"native\" | \"both\";\n\n/** `stable`: its API only changes in a major. `beta`: it may still change in a minor. */\nexport type Status = \"stable\" | \"beta\";\n\n/**\n * The group of the catalogue. `media`: video, sound, camera, files, cropping. `blocks`: the page blocks — the frame,\n * the hero, sections, cards that lead or argue, decisions, code, calls to act — that every page of a site is made of.\n * `layouts`: the shells of whole screens — an application, a dashboard, settings, sign-in, an object, a list and its\n * item, a site's page, a documentation page — each with its screens. `templates`: the page templates — whole pages of a\n * site (a landing, a product, a docs hub, a long read, a changelog, pricing, status, an error…), each a distinct\n * composition of the blocks, words and content as props.\n */\nexport type Category = \"actions\" | \"forms\" | \"navigation\" | \"overlays\" | \"feedback\" | \"data-display\" | \"media\" | \"blocks\" | \"layouts\" | \"templates\" | \"layout\" | \"foundations\";\n\n/**\n * A named example: the file `registry/examples/<component>/<name>.tsx` (web) or\n * `registry/examples/<component>/native/<name>.tsx` (React Native) — at most 40 lines, imported by the stories and\n * shown (live, with its code) by the documentation.\n */\nexport interface Example {\n /** The file name, kebab-case (`primary`, `icon-button`). */\n readonly name: string;\n /** A short title (`Primary`, `Icon button`). */\n readonly title: string;\n /** One or two sentences: when this variant is the right one. */\n readonly description: string;\n /**\n * A template: a whole screen of a product composed from the platform (a layout and its blocks, real words, its phone\n * version thought out), copied as a starting point — at most 160 lines, listed on krizaka.com/docs/ui/templates.\n */\n readonly template?: boolean;\n}\n\n/** One platform's side of a component. */\nexport interface PlatformDocs {\n /** The names to import (`[\"Button\", \"IconButton\"]`): from `@krizaka/ui/<name>` on the web, `@krizaka/ui/native` in React Native. */\n readonly imports: readonly string[];\n /** The examples, in reading order; the first one is the component's preview. */\n readonly examples: readonly Example[];\n}\n\n/** The React Native side: the same concept, and what differs from the web API. */\nexport interface NativeDocs extends PlatformDocs {\n /**\n * The entry to import from when it is not `@krizaka/ui/native`: a component that needs an Expo module (an optional\n * peer) has its own, `@krizaka/ui/native/<name>`, so an app that does not use it never installs the module.\n */\n readonly entry?: string;\n /** What differs from the web API (`label` instead of children…); empty for a native-only component. */\n readonly differences: readonly string[];\n}\n\nexport interface KeyboardInteraction {\n /** The keys, as written on a keyboard: `Space`, `Enter`, `Arrow keys`, `Esc`, `Tab`. */\n readonly keys: string;\n /** What they do. */\n readonly action: string;\n}\n\nexport interface ComponentMeta {\n /** The display name: `Button`, `Dropdown menu`. */\n readonly title: string;\n /** One sentence: what it is. */\n readonly summary: string;\n readonly status: Status;\n readonly category: Category;\n /** Must match the sides below: `both` ⇔ `web` and `native`. */\n readonly platforms: Platform;\n /** When to reach for it: concrete situations, one per item. */\n readonly whenToUse: readonly string[];\n /** When not to — and what to use instead (`use`), when another component is the answer. */\n readonly whenNotToUse: readonly { readonly when: string; readonly use?: ComponentName }[];\n /** How to use it well: wording, placement, composition. */\n readonly bestPractices: readonly string[];\n readonly accessibility: {\n /** The keyboard, when it does more than Tab and Enter. */\n readonly keyboard: readonly KeyboardInteraction[];\n /** Roles, names and announcements: what the component does, what the app must provide. */\n readonly notes: readonly string[];\n };\n /** The components a reader of this page should know about. */\n readonly related: readonly ComponentName[];\n readonly web?: PlatformDocs;\n readonly native?: NativeDocs;\n}\n"
197
197
  },
198
198
  {
199
199
  "path": "story-variant.ts",