@k8ordo/ui 1.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 (425) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +624 -0
  3. package/dist/components/_internal/focus-ring.d.mts +8 -0
  4. package/dist/components/_internal/focus-ring.mjs +8 -0
  5. package/dist/components/ai/_internal/collapsible.d.mts +13 -0
  6. package/dist/components/ai/_internal/collapsible.mjs +49 -0
  7. package/dist/components/ai/_internal/streaming-cursor.d.mts +5 -0
  8. package/dist/components/ai/_internal/streaming-cursor.mjs +8 -0
  9. package/dist/components/ai/conversation/conversation.d.mts +18 -0
  10. package/dist/components/ai/conversation/conversation.mjs +111 -0
  11. package/dist/components/ai/conversation/index.d.mts +2 -0
  12. package/dist/components/ai/conversation/index.mjs +2 -0
  13. package/dist/components/ai/index.d.mts +14 -0
  14. package/dist/components/ai/index.mjs +7 -0
  15. package/dist/components/ai/message/index.d.mts +2 -0
  16. package/dist/components/ai/message/index.mjs +2 -0
  17. package/dist/components/ai/message/message.d.mts +17 -0
  18. package/dist/components/ai/message/message.mjs +34 -0
  19. package/dist/components/ai/prompt-input/index.d.mts +2 -0
  20. package/dist/components/ai/prompt-input/index.mjs +2 -0
  21. package/dist/components/ai/prompt-input/prompt-input.d.mts +27 -0
  22. package/dist/components/ai/prompt-input/prompt-input.mjs +108 -0
  23. package/dist/components/ai/reasoning/index.d.mts +2 -0
  24. package/dist/components/ai/reasoning/index.mjs +2 -0
  25. package/dist/components/ai/reasoning/reasoning.d.mts +12 -0
  26. package/dist/components/ai/reasoning/reasoning.mjs +25 -0
  27. package/dist/components/ai/response/index.d.mts +2 -0
  28. package/dist/components/ai/response/index.mjs +2 -0
  29. package/dist/components/ai/response/response.d.mts +20 -0
  30. package/dist/components/ai/response/response.mjs +57 -0
  31. package/dist/components/ai/suggestion/index.d.mts +2 -0
  32. package/dist/components/ai/suggestion/index.mjs +2 -0
  33. package/dist/components/ai/suggestion/suggestion.d.mts +17 -0
  34. package/dist/components/ai/suggestion/suggestion.mjs +29 -0
  35. package/dist/components/ai/tool-invocation/index.d.mts +2 -0
  36. package/dist/components/ai/tool-invocation/index.mjs +2 -0
  37. package/dist/components/ai/tool-invocation/tool-invocation.d.mts +17 -0
  38. package/dist/components/ai/tool-invocation/tool-invocation.mjs +73 -0
  39. package/dist/components/ai/types.d.mts +5 -0
  40. package/dist/components/ai/types.mjs +1 -0
  41. package/dist/components/buttons/button/button.d.mts +27 -0
  42. package/dist/components/buttons/button/button.mjs +60 -0
  43. package/dist/components/buttons/button/index.d.mts +2 -0
  44. package/dist/components/buttons/button/index.mjs +2 -0
  45. package/dist/components/buttons/icon-button/icon-button.d.mts +29 -0
  46. package/dist/components/buttons/icon-button/icon-button.mjs +84 -0
  47. package/dist/components/buttons/icon-button/index.d.mts +2 -0
  48. package/dist/components/buttons/icon-button/index.mjs +2 -0
  49. package/dist/components/data-display/accordion/accordion-button.d.mts +5 -0
  50. package/dist/components/data-display/accordion/accordion-button.mjs +26 -0
  51. package/dist/components/data-display/accordion/accordion-item.d.mts +9 -0
  52. package/dist/components/data-display/accordion/accordion-item.mjs +20 -0
  53. package/dist/components/data-display/accordion/accordion-panel.d.mts +5 -0
  54. package/dist/components/data-display/accordion/accordion-panel.mjs +18 -0
  55. package/dist/components/data-display/accordion/accordion.d.mts +5 -0
  56. package/dist/components/data-display/accordion/accordion.mjs +8 -0
  57. package/dist/components/data-display/accordion/context.d.mts +14 -0
  58. package/dist/components/data-display/accordion/context.mjs +32 -0
  59. package/dist/components/data-display/accordion/index.d.mts +19 -0
  60. package/dist/components/data-display/accordion/index.mjs +13 -0
  61. package/dist/components/data-display/avatar/avatar.d.mts +14 -0
  62. package/dist/components/data-display/avatar/avatar.mjs +43 -0
  63. package/dist/components/data-display/avatar/index.d.mts +2 -0
  64. package/dist/components/data-display/avatar/index.mjs +2 -0
  65. package/dist/components/data-display/badge/badge.d.mts +21 -0
  66. package/dist/components/data-display/badge/badge.mjs +27 -0
  67. package/dist/components/data-display/badge/index.d.mts +2 -0
  68. package/dist/components/data-display/badge/index.mjs +2 -0
  69. package/dist/components/data-display/card/card.d.mts +10 -0
  70. package/dist/components/data-display/card/card.mjs +10 -0
  71. package/dist/components/data-display/card/index.d.mts +2 -0
  72. package/dist/components/data-display/card/index.mjs +2 -0
  73. package/dist/components/data-display/code/code.d.mts +8 -0
  74. package/dist/components/data-display/code/code.mjs +35 -0
  75. package/dist/components/data-display/code/find-all-colors.d.mts +16 -0
  76. package/dist/components/data-display/code/find-all-colors.mjs +267 -0
  77. package/dist/components/data-display/code/index.d.mts +2 -0
  78. package/dist/components/data-display/code/index.mjs +2 -0
  79. package/dist/components/data-display/heading/heading.d.mts +9 -0
  80. package/dist/components/data-display/heading/heading.mjs +46 -0
  81. package/dist/components/data-display/heading/index.d.mts +2 -0
  82. package/dist/components/data-display/heading/index.mjs +2 -0
  83. package/dist/components/data-display/table/index.d.mts +2 -0
  84. package/dist/components/data-display/table/index.mjs +2 -0
  85. package/dist/components/data-display/table/table.d.mts +33 -0
  86. package/dist/components/data-display/table/table.mjs +62 -0
  87. package/dist/components/feedback/alert/alert.d.mts +19 -0
  88. package/dist/components/feedback/alert/alert.mjs +71 -0
  89. package/dist/components/feedback/alert/index.d.mts +2 -0
  90. package/dist/components/feedback/alert/index.mjs +2 -0
  91. package/dist/components/feedback/progress/index.d.mts +2 -0
  92. package/dist/components/feedback/progress/index.mjs +2 -0
  93. package/dist/components/feedback/progress/progress.d.mts +11 -0
  94. package/dist/components/feedback/progress/progress.mjs +21 -0
  95. package/dist/components/feedback/skeleton/index.d.mts +2 -0
  96. package/dist/components/feedback/skeleton/index.mjs +2 -0
  97. package/dist/components/feedback/skeleton/skeleton.d.mts +10 -0
  98. package/dist/components/feedback/skeleton/skeleton.mjs +10 -0
  99. package/dist/components/feedback/spinner/index.d.mts +2 -0
  100. package/dist/components/feedback/spinner/index.mjs +2 -0
  101. package/dist/components/feedback/spinner/spinner.d.mts +9 -0
  102. package/dist/components/feedback/spinner/spinner.mjs +24 -0
  103. package/dist/components/feedback/toast/context.d.mts +34 -0
  104. package/dist/components/feedback/toast/context.mjs +7 -0
  105. package/dist/components/feedback/toast/index.d.mts +3 -0
  106. package/dist/components/feedback/toast/index.mjs +3 -0
  107. package/dist/components/feedback/toast/provider.d.mts +8 -0
  108. package/dist/components/feedback/toast/provider.mjs +171 -0
  109. package/dist/components/feedback/toast/toast.d.mts +15 -0
  110. package/dist/components/feedback/toast/toast.mjs +32 -0
  111. package/dist/components/form/autocomplete/autocomplete.d.mts +23 -0
  112. package/dist/components/form/autocomplete/autocomplete.mjs +225 -0
  113. package/dist/components/form/autocomplete/index.d.mts +2 -0
  114. package/dist/components/form/autocomplete/index.mjs +2 -0
  115. package/dist/components/form/checkbox/checkbox.d.mts +21 -0
  116. package/dist/components/form/checkbox/checkbox.mjs +59 -0
  117. package/dist/components/form/checkbox/index.d.mts +2 -0
  118. package/dist/components/form/checkbox/index.mjs +2 -0
  119. package/dist/components/form/checkbox-card/checkbox-card.d.mts +29 -0
  120. package/dist/components/form/checkbox-card/checkbox-card.mjs +76 -0
  121. package/dist/components/form/checkbox-card/index.d.mts +2 -0
  122. package/dist/components/form/checkbox-card/index.mjs +2 -0
  123. package/dist/components/form/checkbox-group/checkbox-group.d.mts +29 -0
  124. package/dist/components/form/checkbox-group/checkbox-group.mjs +43 -0
  125. package/dist/components/form/checkbox-group/index.d.mts +34 -0
  126. package/dist/components/form/checkbox-group/index.mjs +9 -0
  127. package/dist/components/form/file-field/file-field.d.mts +27 -0
  128. package/dist/components/form/file-field/file-field.mjs +129 -0
  129. package/dist/components/form/file-field/index.d.mts +2 -0
  130. package/dist/components/form/file-field/index.mjs +2 -0
  131. package/dist/components/form/form/form.d.mts +9 -0
  132. package/dist/components/form/form/form.mjs +11 -0
  133. package/dist/components/form/form/index.d.mts +2 -0
  134. package/dist/components/form/form/index.mjs +2 -0
  135. package/dist/components/form/form-control/form-control.d.mts +23 -0
  136. package/dist/components/form/form-control/form-control.mjs +61 -0
  137. package/dist/components/form/form-control/index.d.mts +2 -0
  138. package/dist/components/form/form-control/index.mjs +2 -0
  139. package/dist/components/form/number-field/cast.d.mts +4 -0
  140. package/dist/components/form/number-field/cast.mjs +32 -0
  141. package/dist/components/form/number-field/index.d.mts +2 -0
  142. package/dist/components/form/number-field/index.mjs +2 -0
  143. package/dist/components/form/number-field/number-field.d.mts +25 -0
  144. package/dist/components/form/number-field/number-field.mjs +115 -0
  145. package/dist/components/form/password-input/index.d.mts +2 -0
  146. package/dist/components/form/password-input/index.mjs +2 -0
  147. package/dist/components/form/password-input/password-input.d.mts +11 -0
  148. package/dist/components/form/password-input/password-input.mjs +36 -0
  149. package/dist/components/form/radio/index.d.mts +2 -0
  150. package/dist/components/form/radio/index.mjs +2 -0
  151. package/dist/components/form/radio/radio.d.mts +24 -0
  152. package/dist/components/form/radio/radio.mjs +51 -0
  153. package/dist/components/form/radio-card/index.d.mts +2 -0
  154. package/dist/components/form/radio-card/index.mjs +2 -0
  155. package/dist/components/form/radio-card/radio-card.d.mts +29 -0
  156. package/dist/components/form/radio-card/radio-card.mjs +74 -0
  157. package/dist/components/form/select/index.d.mts +2 -0
  158. package/dist/components/form/select/index.mjs +2 -0
  159. package/dist/components/form/select/select.d.mts +11 -0
  160. package/dist/components/form/select/select.mjs +33 -0
  161. package/dist/components/form/slider/index.d.mts +2 -0
  162. package/dist/components/form/slider/index.mjs +2 -0
  163. package/dist/components/form/slider/slider.d.mts +23 -0
  164. package/dist/components/form/slider/slider.mjs +50 -0
  165. package/dist/components/form/switch/index.d.mts +2 -0
  166. package/dist/components/form/switch/index.mjs +2 -0
  167. package/dist/components/form/switch/switch.d.mts +21 -0
  168. package/dist/components/form/switch/switch.mjs +50 -0
  169. package/dist/components/form/text-field/index.d.mts +2 -0
  170. package/dist/components/form/text-field/index.mjs +2 -0
  171. package/dist/components/form/text-field/text-field.d.mts +11 -0
  172. package/dist/components/form/text-field/text-field.mjs +19 -0
  173. package/dist/components/form/textarea/index.d.mts +2 -0
  174. package/dist/components/form/textarea/index.mjs +2 -0
  175. package/dist/components/form/textarea/textarea.d.mts +11 -0
  176. package/dist/components/form/textarea/textarea.mjs +38 -0
  177. package/dist/components/icons/base.d.mts +15 -0
  178. package/dist/components/icons/base.mjs +18 -0
  179. package/dist/components/icons/browsers.d.mts +9 -0
  180. package/dist/components/icons/browsers.mjs +891 -0
  181. package/dist/components/icons/color-scale.d.mts +6 -0
  182. package/dist/components/icons/color-scale.mjs +44 -0
  183. package/dist/components/icons/github-mark.d.mts +6 -0
  184. package/dist/components/icons/github-mark.mjs +19 -0
  185. package/dist/components/icons/index.d.mts +10 -0
  186. package/dist/components/icons/index.mjs +9 -0
  187. package/dist/components/icons/logo.d.mts +7 -0
  188. package/dist/components/icons/logo.mjs +29 -0
  189. package/dist/components/icons/lucide-deep.d.mts +9 -0
  190. package/dist/components/icons/lucide-imports.d.mts +65 -0
  191. package/dist/components/icons/lucide-imports.mjs +65 -0
  192. package/dist/components/icons/lucide.d.mts +69 -0
  193. package/dist/components/icons/lucide.mjs +256 -0
  194. package/dist/components/icons/qiita.d.mts +6 -0
  195. package/dist/components/icons/qiita.mjs +28 -0
  196. package/dist/components/icons/twitter.d.mts +6 -0
  197. package/dist/components/icons/twitter.mjs +20 -0
  198. package/dist/components/icons/vertical-writing.d.mts +6 -0
  199. package/dist/components/icons/vertical-writing.mjs +26 -0
  200. package/dist/components/index.d.mts +106 -0
  201. package/dist/components/index.mjs +57 -0
  202. package/dist/components/layout/_shared/gap.d.mts +11 -0
  203. package/dist/components/layout/_shared/gap.mjs +10 -0
  204. package/dist/components/layout/_shared/padding.d.mts +11 -0
  205. package/dist/components/layout/_shared/padding.mjs +10 -0
  206. package/dist/components/layout/grid/grid.d.mts +16 -0
  207. package/dist/components/layout/grid/grid.mjs +35 -0
  208. package/dist/components/layout/grid/index.d.mts +2 -0
  209. package/dist/components/layout/grid/index.mjs +2 -0
  210. package/dist/components/layout/scroll-linked/index.d.mts +2 -0
  211. package/dist/components/layout/scroll-linked/index.mjs +2 -0
  212. package/dist/components/layout/scroll-linked/scroll-linked.d.mts +14 -0
  213. package/dist/components/layout/scroll-linked/scroll-linked.mjs +59 -0
  214. package/dist/components/layout/separator/index.d.mts +2 -0
  215. package/dist/components/layout/separator/index.mjs +2 -0
  216. package/dist/components/layout/separator/separator.d.mts +9 -0
  217. package/dist/components/layout/separator/separator.mjs +14 -0
  218. package/dist/components/layout/stack/index.d.mts +2 -0
  219. package/dist/components/layout/stack/index.mjs +2 -0
  220. package/dist/components/layout/stack/stack.d.mts +15 -0
  221. package/dist/components/layout/stack/stack.mjs +24 -0
  222. package/dist/components/navigation/anchor/anchor.d.mts +20 -0
  223. package/dist/components/navigation/anchor/anchor.mjs +28 -0
  224. package/dist/components/navigation/anchor/index.d.mts +2 -0
  225. package/dist/components/navigation/anchor/index.mjs +2 -0
  226. package/dist/components/navigation/breadcrumb/breadcrumb.d.mts +19 -0
  227. package/dist/components/navigation/breadcrumb/breadcrumb.mjs +43 -0
  228. package/dist/components/navigation/breadcrumb/index.d.mts +14 -0
  229. package/dist/components/navigation/breadcrumb/index.mjs +10 -0
  230. package/dist/components/navigation/pagination/index.d.mts +2 -0
  231. package/dist/components/navigation/pagination/index.mjs +2 -0
  232. package/dist/components/navigation/pagination/pagination.d.mts +15 -0
  233. package/dist/components/navigation/pagination/pagination.mjs +74 -0
  234. package/dist/components/navigation/tabs/index.d.mts +2 -0
  235. package/dist/components/navigation/tabs/index.mjs +2 -0
  236. package/dist/components/navigation/tabs/tabs.d.mts +21 -0
  237. package/dist/components/navigation/tabs/tabs.mjs +130 -0
  238. package/dist/components/overlays/_internal/index.d.mts +4 -0
  239. package/dist/components/overlays/_internal/index.mjs +4 -0
  240. package/dist/components/overlays/_internal/modal-dialog-context.d.mts +14 -0
  241. package/dist/components/overlays/_internal/modal-dialog-context.mjs +13 -0
  242. package/dist/components/overlays/_internal/use-can-hover.d.mts +9 -0
  243. package/dist/components/overlays/_internal/use-can-hover.mjs +20 -0
  244. package/dist/components/overlays/_internal/use-hover-intent.d.mts +25 -0
  245. package/dist/components/overlays/_internal/use-hover-intent.mjs +56 -0
  246. package/dist/components/overlays/_internal/use-list-navigation.d.mts +36 -0
  247. package/dist/components/overlays/_internal/use-list-navigation.mjs +98 -0
  248. package/dist/components/overlays/dialog/dialog.d.mts +19 -0
  249. package/dist/components/overlays/dialog/dialog.mjs +87 -0
  250. package/dist/components/overlays/dialog/index.d.mts +2 -0
  251. package/dist/components/overlays/dialog/index.mjs +2 -0
  252. package/dist/components/overlays/drawer/drawer.d.mts +12 -0
  253. package/dist/components/overlays/drawer/drawer.mjs +60 -0
  254. package/dist/components/overlays/drawer/index.d.mts +2 -0
  255. package/dist/components/overlays/drawer/index.mjs +2 -0
  256. package/dist/components/overlays/dropdown-menu/dropdown-menu.d.mts +34 -0
  257. package/dist/components/overlays/dropdown-menu/dropdown-menu.mjs +85 -0
  258. package/dist/components/overlays/dropdown-menu/hooks.d.mts +24 -0
  259. package/dist/components/overlays/dropdown-menu/hooks.mjs +26 -0
  260. package/dist/components/overlays/dropdown-menu/index.d.mts +2 -0
  261. package/dist/components/overlays/dropdown-menu/index.mjs +2 -0
  262. package/dist/components/overlays/dropdown-menu/shared.d.mts +7 -0
  263. package/dist/components/overlays/dropdown-menu/shared.mjs +8 -0
  264. package/dist/components/overlays/dropdown-menu/sub-menu.d.mts +10 -0
  265. package/dist/components/overlays/dropdown-menu/sub-menu.mjs +143 -0
  266. package/dist/components/overlays/dropdown-menu/use-safe-triangle.d.mts +18 -0
  267. package/dist/components/overlays/dropdown-menu/use-safe-triangle.mjs +57 -0
  268. package/dist/components/overlays/list-box/hooks.d.mts +35 -0
  269. package/dist/components/overlays/list-box/hooks.mjs +43 -0
  270. package/dist/components/overlays/list-box/index.d.mts +2 -0
  271. package/dist/components/overlays/list-box/index.mjs +2 -0
  272. package/dist/components/overlays/list-box/list-box.d.mts +28 -0
  273. package/dist/components/overlays/list-box/list-box.mjs +150 -0
  274. package/dist/components/overlays/modal/index.d.mts +2 -0
  275. package/dist/components/overlays/modal/index.mjs +2 -0
  276. package/dist/components/overlays/modal/modal.d.mts +15 -0
  277. package/dist/components/overlays/modal/modal.mjs +72 -0
  278. package/dist/components/overlays/popover/anchor-positioning.d.mts +26 -0
  279. package/dist/components/overlays/popover/anchor-positioning.mjs +49 -0
  280. package/dist/components/overlays/popover/escape-stack.d.mts +7 -0
  281. package/dist/components/overlays/popover/escape-stack.mjs +34 -0
  282. package/dist/components/overlays/popover/hooks.d.mts +53 -0
  283. package/dist/components/overlays/popover/hooks.mjs +141 -0
  284. package/dist/components/overlays/popover/index.d.mts +3 -0
  285. package/dist/components/overlays/popover/index.mjs +3 -0
  286. package/dist/components/overlays/popover/popover.d.mts +25 -0
  287. package/dist/components/overlays/popover/popover.mjs +90 -0
  288. package/dist/components/overlays/tooltip/bridge.d.mts +5 -0
  289. package/dist/components/overlays/tooltip/bridge.mjs +29 -0
  290. package/dist/components/overlays/tooltip/index.d.mts +2 -0
  291. package/dist/components/overlays/tooltip/index.mjs +2 -0
  292. package/dist/components/overlays/tooltip/tooltip.d.mts +34 -0
  293. package/dist/components/overlays/tooltip/tooltip.mjs +87 -0
  294. package/dist/components/providers/index.d.mts +4 -0
  295. package/dist/components/providers/index.mjs +3 -0
  296. package/dist/components/providers/portal-root.d.mts +8 -0
  297. package/dist/components/providers/portal-root.mjs +12 -0
  298. package/dist/components/providers/ui-provider.d.mts +8 -0
  299. package/dist/components/providers/ui-provider.mjs +11 -0
  300. package/dist/helpers/chain.d.mts +5 -0
  301. package/dist/helpers/chain.mjs +29 -0
  302. package/dist/helpers/cn.d.mts +5 -0
  303. package/dist/helpers/cn.mjs +27 -0
  304. package/dist/helpers/create-safe-context.d.mts +6 -0
  305. package/dist/helpers/create-safe-context.mjs +30 -0
  306. package/dist/helpers/index.d.mts +6 -0
  307. package/dist/helpers/index.mjs +6 -0
  308. package/dist/helpers/merge-props.d.mts +6 -0
  309. package/dist/helpers/merge-props.mjs +56 -0
  310. package/dist/helpers/merge-refs.d.mts +5 -0
  311. package/dist/helpers/merge-refs.mjs +55 -0
  312. package/dist/hooks/breakpoint/index.d.mts +5 -0
  313. package/dist/hooks/breakpoint/index.mjs +24 -0
  314. package/dist/hooks/click-away/index.d.mts +5 -0
  315. package/dist/hooks/click-away/index.mjs +24 -0
  316. package/dist/hooks/client/index.d.mts +4 -0
  317. package/dist/hooks/client/index.mjs +6 -0
  318. package/dist/hooks/clipboard/index.d.mts +7 -0
  319. package/dist/hooks/clipboard/index.mjs +15 -0
  320. package/dist/hooks/controllable-state/index.d.mts +9 -0
  321. package/dist/hooks/controllable-state/index.mjs +21 -0
  322. package/dist/hooks/debounced-transition/index.d.mts +5 -0
  323. package/dist/hooks/debounced-transition/index.mjs +49 -0
  324. package/dist/hooks/deferred-debounce/index.d.mts +4 -0
  325. package/dist/hooks/deferred-debounce/index.mjs +9 -0
  326. package/dist/hooks/disclosure/index.d.mts +10 -0
  327. package/dist/hooks/disclosure/index.mjs +20 -0
  328. package/dist/hooks/focus-trap/index.d.mts +18 -0
  329. package/dist/hooks/focus-trap/index.mjs +51 -0
  330. package/dist/hooks/hash/index.d.mts +4 -0
  331. package/dist/hooks/hash/index.mjs +25 -0
  332. package/dist/hooks/hover/index.d.mts +12 -0
  333. package/dist/hooks/hover/index.mjs +19 -0
  334. package/dist/hooks/index.d.mts +25 -0
  335. package/dist/hooks/index.mjs +24 -0
  336. package/dist/hooks/intersection-observer/index.d.mts +3 -0
  337. package/dist/hooks/intersection-observer/index.mjs +3 -0
  338. package/dist/hooks/intersection-observer/use-in-view.d.mts +11 -0
  339. package/dist/hooks/intersection-observer/use-in-view.mjs +18 -0
  340. package/dist/hooks/intersection-observer/use-intersection-observer.d.mts +11 -0
  341. package/dist/hooks/intersection-observer/use-intersection-observer.mjs +33 -0
  342. package/dist/hooks/interval/index.d.mts +4 -0
  343. package/dist/hooks/interval/index.mjs +19 -0
  344. package/dist/hooks/local-storage/index.d.mts +4 -0
  345. package/dist/hooks/local-storage/index.mjs +46 -0
  346. package/dist/hooks/resize/index.d.mts +8 -0
  347. package/dist/hooks/resize/index.mjs +24 -0
  348. package/dist/hooks/scroll-direction/index.d.mts +13 -0
  349. package/dist/hooks/scroll-direction/index.mjs +67 -0
  350. package/dist/hooks/scroll-lock/index.d.mts +9 -0
  351. package/dist/hooks/scroll-lock/index.mjs +59 -0
  352. package/dist/hooks/session-storage/index.d.mts +4 -0
  353. package/dist/hooks/session-storage/index.mjs +46 -0
  354. package/dist/hooks/step/index.d.mts +15 -0
  355. package/dist/hooks/step/index.mjs +39 -0
  356. package/dist/hooks/timeout/index.d.mts +4 -0
  357. package/dist/hooks/timeout/index.mjs +19 -0
  358. package/dist/hooks/window-resize/index.d.mts +11 -0
  359. package/dist/hooks/window-resize/index.mjs +21 -0
  360. package/dist/hooks/window-size/index.d.mts +8 -0
  361. package/dist/hooks/window-size/index.mjs +31 -0
  362. package/dist/hooks/writing-mode/index.d.mts +6 -0
  363. package/dist/hooks/writing-mode/index.mjs +24 -0
  364. package/dist/i18n/context.d.mts +9 -0
  365. package/dist/i18n/context.mjs +19 -0
  366. package/dist/i18n/en.d.mts +5 -0
  367. package/dist/i18n/en.mjs +64 -0
  368. package/dist/i18n/index.d.mts +5 -0
  369. package/dist/i18n/index.mjs +4 -0
  370. package/dist/i18n/ja.d.mts +5 -0
  371. package/dist/i18n/ja.mjs +64 -0
  372. package/dist/i18n/messages.d.mts +84 -0
  373. package/dist/i18n/messages.mjs +1 -0
  374. package/dist/index.d.mts +94 -0
  375. package/dist/index.mjs +85 -0
  376. package/dist/integrations/_shared/openui-defs.d.mts +18 -0
  377. package/dist/integrations/_shared/openui-defs.mjs +162 -0
  378. package/dist/integrations/_shared/renderers.d.mts +71 -0
  379. package/dist/integrations/_shared/renderers.mjs +679 -0
  380. package/dist/integrations/_shared/schemas.d.mts +718 -0
  381. package/dist/integrations/_shared/schemas.mjs +545 -0
  382. package/dist/integrations/ai-sdk/index.d.mts +3 -0
  383. package/dist/integrations/ai-sdk/index.mjs +2 -0
  384. package/dist/integrations/ai-sdk/map-parts.d.mts +28 -0
  385. package/dist/integrations/ai-sdk/map-parts.mjs +32 -0
  386. package/dist/integrations/json-render/catalog.d.mts +838 -0
  387. package/dist/integrations/json-render/catalog.mjs +311 -0
  388. package/dist/integrations/json-render/registry.d.mts +29 -0
  389. package/dist/integrations/json-render/registry.mjs +159 -0
  390. package/dist/integrations/openui/form-views.d.mts +21 -0
  391. package/dist/integrations/openui/form-views.mjs +66 -0
  392. package/dist/integrations/openui/library.d.mts +151 -0
  393. package/dist/integrations/openui/library.mjs +69 -0
  394. package/dist/integrations/openui/prompt.d.mts +5 -0
  395. package/dist/integrations/openui/prompt.mjs +19 -0
  396. package/dist/internal/clamp.d.mts +4 -0
  397. package/dist/internal/clamp.mjs +15 -0
  398. package/dist/internal/to-precision.d.mts +4 -0
  399. package/dist/internal/to-precision.mjs +15 -0
  400. package/dist/styles/base.css +315 -0
  401. package/dist/styles/index.css +2677 -0
  402. package/dist/styles/tailwind.css +22 -0
  403. package/dist/styles/tokens.css +380 -0
  404. package/dist/styles/tokens.d.mts +2 -0
  405. package/dist/styles/tokens.generated.d.mts +840 -0
  406. package/dist/styles/tokens.generated.mjs +813 -0
  407. package/dist/styles/tokens.mjs +2 -0
  408. package/dist/styles/utilities.css +62 -0
  409. package/dist/types/index.d.mts +2 -0
  410. package/dist/types/index.mjs +1 -0
  411. package/dist/types/variables.d.mts +23 -0
  412. package/dist/types/variables.mjs +1 -0
  413. package/docs/GUIDE.md +324 -0
  414. package/docs/llms.txt +25 -0
  415. package/docs/props.generated.json +3519 -0
  416. package/docs/references/ai-chat.md +354 -0
  417. package/docs/references/color.md +121 -0
  418. package/docs/references/components.md +1466 -0
  419. package/docs/references/generative-ui.md +112 -0
  420. package/docs/references/helpers.md +120 -0
  421. package/docs/references/hooks.md +314 -0
  422. package/docs/references/interaction-design.md +95 -0
  423. package/docs/references/spatial-design.md +137 -0
  424. package/docs/references/typography.md +110 -0
  425. package/package.json +197 -0
@@ -0,0 +1,1466 @@
1
+ # k8ordo UI コンポーネント一覧
2
+
3
+ ## インポート方法
4
+
5
+ ```tsx
6
+ // スタイルシート(必須)。Tailwind CSS 4 のプロジェクトは
7
+ // 代わりに '@k8ordo/ui/tailwind.css' を import する
8
+ import '@k8ordo/ui/styles.css';
9
+
10
+ // プロバイダー(アプリルートで1回)
11
+ import { UIProvider } from '@k8ordo/ui';
12
+
13
+ // コンポーネント(すべてルートからインポート)
14
+ import { Button, Card, TextField } from '@k8ordo/ui';
15
+ ```
16
+
17
+ ## ボタン・リンク
18
+
19
+ ### Button
20
+
21
+ ```tsx
22
+ import { Button } from '@k8ordo/ui';
23
+
24
+ <Button
25
+ size="sm" | "md" | "lg"
26
+ color="primary" | "secondary" | "base"
27
+ variant="solid" | "outline" | "skeleton"
28
+ fullWidth={false}
29
+ startIcon={<Icon />}
30
+ endIcon={<Icon />}
31
+ disabled={false}
32
+ isActive={false}
33
+ >
34
+ ボタン
35
+ </Button>
36
+ ```
37
+
38
+ Props:
39
+
40
+ - `children`: `ReactNode`
41
+ - `color`: `'primary'` | `'secondary'` | `'base'`(既定: `'primary'`)
42
+ - `endIcon`: `ReactNode`
43
+ - `fullWidth`: `boolean`(既定: `false`)
44
+ - `isActive`: `boolean`(既定: `false`)
45
+ - `onAction`: `() => void | Promise<void>`
46
+ - `renderItem`: `(props: { className: string; children: ReactNode }) => ReactNode`
47
+ - `size`: `'sm'` | `'md'` | `'lg'`(既定: `'md'`)
48
+ - `startIcon`: `ReactNode`
49
+ - `type`: `'button'` | `'submit'`(既定: `'button'`)
50
+ - `variant`: `'solid'` | `'outline'` | `'skeleton'`(既定: `'solid'`)
51
+
52
+ リンクとしてレンダーする場合は `renderItem` prop を使う。Next.js の `<Link>` などにも応用できる。
53
+
54
+ ```tsx
55
+ <Button
56
+ color="base"
57
+ variant="outline"
58
+ renderItem={({ className, children }) => (
59
+ <a className={className} href="/page">
60
+ {children}
61
+ </a>
62
+ )}
63
+ >
64
+ リンク
65
+ </Button>
66
+ ```
67
+
68
+ ### IconButton
69
+
70
+ アイコンのみのボタン。`color` prop でスタイルを制御。
71
+
72
+ ```tsx
73
+ import { IconButton } from '@k8ordo/ui';
74
+
75
+ <IconButton label="閉じる" color="transparent" size="md">
76
+ <CloseIcon />
77
+ </IconButton>;
78
+ ```
79
+
80
+ Props:
81
+
82
+ - `label`: `string`(必須)
83
+ - `children`: `ReactNode`
84
+ - `color`: `'transparent'` | `'base'` | `'primary'` | `'secondary'`(既定: `'transparent'`)
85
+ - `onAction`: `() => void | Promise<void>`
86
+ - `renderItem`: `(props: { className: string; children: ReactNode; 'aria-label': string; triggerProps: IconButtonTriggerProps; }) => ReactNode`
87
+ - `size`: `'sm'` | `'md'` | `'lg'`(既定: `'md'`)
88
+ - `tooltipDisabled`: `boolean`(既定: `false`)
89
+ - `tooltipPlacement`: `Placement`(既定: `'top'`)
90
+
91
+ リンクとしてレンダーする場合は `renderItem` prop を使う。`triggerProps` を `<a>` にスプレッドすると hover/focus 時に `label` が Tooltip として表示される。
92
+
93
+ ```tsx
94
+ <IconButton
95
+ color="base"
96
+ label="メール"
97
+ renderItem={({
98
+ className,
99
+ children,
100
+ 'aria-label': ariaLabel,
101
+ triggerProps,
102
+ }) => (
103
+ <a
104
+ aria-label={ariaLabel}
105
+ className={className}
106
+ href="/contact"
107
+ {...triggerProps}
108
+ >
109
+ {children}
110
+ </a>
111
+ )}
112
+ >
113
+ <MailIcon />
114
+ </IconButton>
115
+ ```
116
+
117
+ ### Anchor
118
+
119
+ テキストリンク。外部リンクには自動で新規タブアイコンが付く。
120
+
121
+ ```tsx
122
+ import { Anchor } from '@k8ordo/ui';
123
+
124
+ <Anchor href="https://example.com">外部リンク</Anchor>
125
+ <Anchor href="/about">内部リンク</Anchor>
126
+ <Anchor href="/docs" openInNewTab>新規タブで開く</Anchor>
127
+ ```
128
+
129
+ Props:
130
+
131
+ - `children`: `ReactNode`(必須)
132
+ - `href`: `T`(必須)
133
+ - `openInNewTab`: `boolean`(既定: `false`)
134
+ - `renderAnchor`: `(props: RenderAnchorProps<T>) => ReactNode`(既定: `defaultRenderAnchor`)
135
+
136
+ ## レイアウト・ナビゲーション
137
+
138
+ ### Accordion
139
+
140
+ 折りたたみ可能なセクション。Compound component パターン。
141
+
142
+ ```tsx
143
+ import { Accordion } from '@k8ordo/ui';
144
+
145
+ <Accordion.Root>
146
+ <Accordion.Item>
147
+ <Accordion.Button>セクション1</Accordion.Button>
148
+ <Accordion.Panel>コンテンツ</Accordion.Panel>
149
+ </Accordion.Item>
150
+ </Accordion.Root>;
151
+ ```
152
+
153
+ Props (Accordion.Button):
154
+
155
+ - `children`: `ReactNode`
156
+
157
+ Props (Accordion.Item):
158
+
159
+ - `children`: `ReactNode`
160
+ - `defaultOpen`: `boolean`(既定: `false`)
161
+ - `isOpen`: `boolean`
162
+ - `onChange`: `(isOpen: boolean) => void`
163
+
164
+ Props (Accordion.Panel):
165
+
166
+ - `children`: `ReactNode`
167
+
168
+ Props (Accordion.Root):
169
+
170
+ - `children`: `ReactNode`
171
+
172
+ ### Breadcrumb
173
+
174
+ パンくずリスト。Compound component パターン。
175
+
176
+ ```tsx
177
+ import { Breadcrumb } from '@k8ordo/ui';
178
+
179
+ <Breadcrumb.List>
180
+ <Breadcrumb.Item>
181
+ <Breadcrumb.Link href="/">ホーム</Breadcrumb.Link>
182
+ </Breadcrumb.Item>
183
+ <Breadcrumb.Separator />
184
+ <Breadcrumb.Item>
185
+ <Breadcrumb.Link href="/products">製品</Breadcrumb.Link>
186
+ </Breadcrumb.Item>
187
+ <Breadcrumb.Separator />
188
+ <Breadcrumb.Item>
189
+ <Breadcrumb.Link href="/products/1" current>
190
+ 詳細
191
+ </Breadcrumb.Link>
192
+ </Breadcrumb.Item>
193
+ </Breadcrumb.List>;
194
+ ```
195
+
196
+ Props (Breadcrumb.List):
197
+
198
+ - `children`: `ReactNode`
199
+ - `size`: `'sm'` | `'md'` | `'lg'`(既定: `'md'`)
200
+
201
+ Props (Breadcrumb.Link):
202
+
203
+ - `href`: `T`(必須)
204
+ - `children`: `ReactNode`
205
+ - `current`: `boolean`(既定: `false`)
206
+ - `renderAnchor`: `(props: RenderBreadcrumbAnchorProps<T>) => ReactNode`(既定: `defaultRenderBreadcrumbAnchor`)
207
+
208
+ Props (Breadcrumb.Item):
209
+
210
+ - `children`: `ReactNode`
211
+
212
+ ### Pagination
213
+
214
+ ページ送り。前後ボタンと現在ページの表示のみで、ページ番号のリストは持たない。
215
+
216
+ ```tsx
217
+ import { Pagination } from '@k8ordo/ui';
218
+
219
+ <Pagination currentPage={page} onChange={setPage} totalPages={10} />;
220
+ ```
221
+
222
+ Props:
223
+
224
+ - `currentPage`: `number`(必須)
225
+ - `onChange`: `(page: number) => void`(必須)
226
+ - `totalPages`: `number`(必須)
227
+ - `aria-label`: `string`
228
+ - `disabled`: `boolean`(既定: `false`)
229
+ - `nextLabel`: `string`
230
+ - `prevLabel`: `string`
231
+ - `ref`: `Ref<HTMLElement>`
232
+
233
+ ### Tabs
234
+
235
+ タブ切り替え。Compound component パターン。
236
+
237
+ ```tsx
238
+ import { Tabs } from '@k8ordo/ui';
239
+
240
+ <Tabs.Root ids={['tab1', 'tab2']}>
241
+ <Tabs.List label="タブ">
242
+ <Tabs.Tab id="tab1">タブ1</Tabs.Tab>
243
+ <Tabs.Tab id="tab2">タブ2</Tabs.Tab>
244
+ </Tabs.List>
245
+ <Tabs.Panel id="tab1">パネル1</Tabs.Panel>
246
+ <Tabs.Panel id="tab2">パネル2</Tabs.Panel>
247
+ </Tabs.Root>;
248
+ ```
249
+
250
+ Props (Tabs.Root):
251
+
252
+ - `ids`: `[string, ...string[]]`(必須)
253
+ - `children`: `ReactNode`
254
+ - `defaultSelectedId`: `string` | `null`(既定: `null`)
255
+ - `onChange`: `(id: string) => void`
256
+ - `selectedId`: `string`
257
+
258
+ Props (Tabs.List):
259
+
260
+ - `label`: `string`(必須)
261
+ - `children`: `ReactNode`
262
+
263
+ Props (Tabs.Panel):
264
+
265
+ - `id`: `string`(必須)
266
+ - `children`: `ReactNode`
267
+
268
+ Props (Tabs.Tab):
269
+
270
+ - `id`: `string`(必須)
271
+ - `children`: `ReactNode`
272
+
273
+ ### Card
274
+
275
+ コンテンツをグループ化するカード。
276
+
277
+ ```tsx
278
+ import { Card } from '@k8ordo/ui';
279
+
280
+ // 静的カード
281
+ <Card width="full" variant="shadow">
282
+ <div className="p-6">コンテンツ</div>
283
+ </Card>
284
+
285
+ // クリック可能なカード(hover:scale-[1.02], active:scale-[0.98])
286
+ <Card variant="outline" interactive>
287
+ <div className="p-6">コンテンツ</div>
288
+ </Card>
289
+ ```
290
+
291
+ Props:
292
+
293
+ - `children`: `ReactNode`
294
+ - `interactive`: `boolean`(既定: `false`)
295
+ - `variant`: `'shadow'` | `'outline'`(既定: `'shadow'`)
296
+ - `width`: `'full'` | `'fit'`(既定: `'full'`)
297
+
298
+ ### Separator
299
+
300
+ 区切り線。
301
+
302
+ ```tsx
303
+ import { Separator } from '@k8ordo/ui';
304
+
305
+ <Separator />
306
+ <Separator color="mute" />
307
+ <Separator color="subtle" />
308
+ <Separator orientation="vertical" />
309
+ ```
310
+
311
+ Props:
312
+
313
+ - `color`: `'base'` | `'mute'` | `'subtle'`(既定: `'base'`)
314
+ - `orientation`: `'horizontal'` | `'vertical'`(既定: `'horizontal'`)
315
+
316
+ ### ScrollLinked
317
+
318
+ スクロール進捗をプログレスバーで表示。
319
+
320
+ ```tsx
321
+ import { ScrollLinked } from '@k8ordo/ui';
322
+
323
+ <ScrollLinked />
324
+ <ScrollLinked container={containerRef} />
325
+ ```
326
+
327
+ Props:
328
+
329
+ - `container`: `RefObject<HTMLElement | null>`
330
+
331
+ ### Stack
332
+
333
+ 縦横一方向に並べるレイアウト。`gap` はスペーシングトークンから選ぶ。
334
+
335
+ ```tsx
336
+ import { Stack } from '@k8ordo/ui';
337
+
338
+ <Stack gap="lg">
339
+ <Card>1</Card>
340
+ <Card>2</Card>
341
+ </Stack>
342
+
343
+ <Stack direction="row" justify="between" align="center">
344
+ <Heading level="h2">タイトル</Heading>
345
+ <Button>操作</Button>
346
+ </Stack>
347
+ ```
348
+
349
+ Props:
350
+
351
+ - `align`: `'start'` | `'center'` | `'end'` | `'stretch'`
352
+ - `children`: `ReactNode`
353
+ - `direction`: `'row'` | `'column'`(既定: `'column'`)
354
+ - `gap`: `GapSize`(既定: `'md'`)
355
+ - `justify`: `'start'` | `'center'` | `'end'` | `'between'`
356
+ - `padding`: `PaddingSize`
357
+
358
+ ### Grid
359
+
360
+ グリッドレイアウト。`cols` に `'auto-fill'` / `'auto-fit'` を渡すと `minItemSize` を下限に折り返す。
361
+
362
+ ```tsx
363
+ import { Grid } from '@k8ordo/ui';
364
+
365
+ <Grid cols={3} gap="md">
366
+ <Card>1</Card>
367
+ <Card>2</Card>
368
+ <Card>3</Card>
369
+ </Grid>
370
+
371
+ <Grid cols="auto-fill" minItemSize={64}>
372
+ {items.map((item) => (
373
+ <Card key={item.id}>{item.name}</Card>
374
+ ))}
375
+ </Grid>
376
+ ```
377
+
378
+ Props:
379
+
380
+ - `children`: `ReactNode`
381
+ - `cols`: `1` | `2` | `3` | `4` | `5` | `6` | `'auto-fill'` | `'auto-fit'`(既定: `'auto-fill'`)
382
+ - `gap`: `GapSize`(既定: `'md'`)
383
+ - `minItemSize`: `24` | `32` | `40` | `48` | `64` | `80`(既定: `48`)
384
+
385
+ ## フォーム
386
+
387
+ フォームコンポーネントは `FormControl` の `renderInput` パターンと組み合わせて使用する。各フォームコンポーネントは controlled / uncontrolled の両方に対応。
388
+
389
+ `ref` は実要素(`input` / `textarea` / `select` / `fieldset`)に届く。内部で ref を使う `Textarea` / `FileField` も内部 ref と合成されるため、`react-hook-form` の `register()` などをそのまま渡せる。`Radio`(複数の input を描くグループ)と `FormControl`(ラッパー)は `ref` を受け取らない。
390
+
391
+ ### Form
392
+
393
+ `<form>` のラッパー。`action` には Server Action(`(formData) => …`)も URL 文字列も渡せる。
394
+
395
+ ```tsx
396
+ import { Button, Form, FormControl, TextField } from '@k8ordo/ui';
397
+
398
+ <Form action={submitAction}>
399
+ <FormControl
400
+ label="メール"
401
+ required
402
+ renderInput={(props) => <TextField {...props} name="email" />}
403
+ />
404
+ <Button type="submit">送信</Button>
405
+ </Form>;
406
+ ```
407
+
408
+ Props:
409
+
410
+ - `children`: `ReactNode`(必須)
411
+ - `action`: `((formData: FormData) => void | Promise<void>)` | `string`
412
+
413
+ ### FormControl
414
+
415
+ フォームフィールドのラッパー。ラベル・ヘルプテキスト・エラー表示を統一する。
416
+
417
+ ```tsx
418
+ import { FormControl, TextField } from '@k8ordo/ui';
419
+
420
+ <FormControl
421
+ label="メールアドレス"
422
+ errorText="入力してください"
423
+ helpText="会社のメールアドレスを入力してください"
424
+ required
425
+ renderInput={(props) => (
426
+ <TextField {...props} placeholder="example@mail.com" />
427
+ )}
428
+ />;
429
+ ```
430
+
431
+ Props:
432
+
433
+ - `label`: `string`(必須)
434
+ - `renderInput`: `(props: { id: string; 'aria-describedby': string | undefined; 'aria-labelledby': string; disabled: boolean; invalid: boolean; required: boolean; }) => ReactElement`(必須)
435
+ - `disabled`: `boolean`(既定: `false`)
436
+ - `errorText`: `string`
437
+ - `helpText`: `string`
438
+ - `invalid`: `boolean`(既定: `false`)
439
+ - `labelAs`: `'label'` | `'legend'`(既定: `'label'`)
440
+ - `ref`: `Ref<HTMLElement>`
441
+ - `required`: `boolean`(既定: `false`)
442
+
443
+ `renderInput` は `{ id, 'aria-describedby', 'aria-labelledby', disabled, invalid, required }` を受け取る。
444
+
445
+ ラッパー要素は `labelAs` で変わる。`'label'`(既定)は `<div>` + `<label htmlFor>`、`'legend'` は `<fieldset>` + `<legend>`。単一フィールドを名前の無いグループにしないため、`<fieldset>` は `legend` のときだけ使う。`Radio` / `CheckboxGroup` のようなグループ入力を包むときは `labelAs="legend"` を指定する。
446
+
447
+ ### TextField
448
+
449
+ ```tsx
450
+ import { TextField } from '@k8ordo/ui';
451
+
452
+ // Uncontrolled
453
+ <TextField id="email" defaultValue="" placeholder="example@mail.com"
454
+ invalid={false} disabled={false} required={false} />
455
+
456
+ // Controlled
457
+ <TextField id="email" value={value} onChange={onChange}
458
+ invalid={false} disabled={false} required={false} />
459
+
460
+ // type も渡せる(デフォルト: "text")
461
+ <TextField id="tel" type="tel" inputMode="numeric" />
462
+ ```
463
+
464
+ Props:
465
+
466
+ - `children`: `ReactNode`
467
+ - `invalid`: `boolean`(既定: `false`)
468
+ - `ref`: `Ref<HTMLInputElement>`
469
+ - `type`: `TextInputType`(既定: `'text'`)
470
+
471
+ ### Textarea
472
+
473
+ ```tsx
474
+ import { Textarea } from '@k8ordo/ui';
475
+
476
+ <Textarea
477
+ id="description"
478
+ value={value}
479
+ onChange={onChange}
480
+ invalid={false}
481
+ disabled={false}
482
+ required={false}
483
+ />;
484
+ ```
485
+
486
+ Props:
487
+
488
+ - `autoResize`: `boolean`(既定: `false`)
489
+ - `children`: `ReactNode`
490
+ - `fullHeight`: `boolean`(既定: `false`)
491
+ - `invalid`: `boolean`(既定: `false`)
492
+ - `ref`: `Ref<HTMLTextAreaElement>`
493
+
494
+ ### NumberField
495
+
496
+ ```tsx
497
+ import { NumberField } from '@k8ordo/ui';
498
+
499
+ <NumberField
500
+ id="quantity"
501
+ min={0}
502
+ max={100}
503
+ value={value}
504
+ onChange={onChange}
505
+ invalid={false}
506
+ disabled={false}
507
+ required={false}
508
+ />;
509
+ ```
510
+
511
+ Props:
512
+
513
+ - `defaultValue`: `never`
514
+ - `invalid`: `boolean`(既定: `false`)
515
+ - `max`: `number`(既定: `9_007_199_254_740_991`)
516
+ - `min`: `number`(既定: `-9_007_199_254_740_991`)
517
+ - `onChange`: `(value: number) => void`
518
+ - `precision`: `number`(既定: `0`)
519
+ - `ref`: `Ref<HTMLInputElement>`
520
+ - `step`: `number`(既定: `1`)
521
+ - `value`: `number`
522
+
523
+ ### PasswordInput
524
+
525
+ パスワード入力。表示/非表示トグル付き。
526
+
527
+ ```tsx
528
+ import { PasswordInput } from '@k8ordo/ui';
529
+
530
+ <PasswordInput
531
+ id="password"
532
+ value={value}
533
+ onChange={onChange}
534
+ invalid={false}
535
+ disabled={false}
536
+ required={false}
537
+ showLabel="表示"
538
+ hideLabel="非表示"
539
+ />;
540
+ ```
541
+
542
+ Props:
543
+
544
+ - `children`: `ReactNode`
545
+ - `hideLabel`: `string`
546
+ - `invalid`: `boolean`(既定: `false`)
547
+ - `ref`: `Ref<HTMLInputElement>`
548
+ - `showLabel`: `string`
549
+
550
+ ### Select
551
+
552
+ ```tsx
553
+ import { Select } from '@k8ordo/ui';
554
+
555
+ <Select
556
+ id="category"
557
+ options={[
558
+ { value: '1', label: 'オプション1' },
559
+ { value: '2', label: 'オプション2' },
560
+ ]}
561
+ value={value}
562
+ onChange={onChange}
563
+ invalid={false}
564
+ disabled={false}
565
+ required={false}
566
+ />;
567
+ ```
568
+
569
+ Props:
570
+
571
+ - `options`: `readonly Option[]`(必須)
572
+ - `children`: `ReactNode`
573
+ - `invalid`: `boolean`(既定: `false`)
574
+ - `ref`: `Ref<HTMLSelectElement>`
575
+
576
+ ### Autocomplete
577
+
578
+ 複数選択のオートコンプリート。`value` / `onChange` は `string[]`。
579
+
580
+ ```tsx
581
+ import { Autocomplete } from '@k8ordo/ui';
582
+
583
+ <Autocomplete
584
+ id="tags"
585
+ options={options}
586
+ value={value}
587
+ onChange={onChange}
588
+ invalid={false}
589
+ disabled={false}
590
+ required={false}
591
+ />;
592
+ ```
593
+
594
+ Props:
595
+
596
+ - `id`: `string`(必須)
597
+ - `options`: `readonly Option[]`(必須)
598
+ - `defaultValue`: `never`
599
+ - `invalid`: `boolean`(既定: `false`)
600
+ - `onChange`: `(value: string[]) => void`
601
+ - `ref`: `Ref<HTMLInputElement>`
602
+ - `value`: `string[]`
603
+
604
+ ### Checkbox
605
+
606
+ ラベルは `label` prop で渡す(children ではない)。`onChange` は `(checked, event)`。
607
+
608
+ ```tsx
609
+ import { Checkbox } from '@k8ordo/ui';
610
+
611
+ // Controlled
612
+ <Checkbox checked={checked} label="同意する" onChange={onChange} />
613
+
614
+ // Uncontrolled
615
+ <Checkbox defaultChecked label="同意する" />
616
+ ```
617
+
618
+ Props:
619
+
620
+ - `label`: `string`(必須)
621
+ - `checked`: `boolean`
622
+ - `defaultChecked`: `never`
623
+ - `itemValue`: `string`
624
+ - `onChange`: `(checked: boolean, event: ChangeEvent<HTMLInputElement>) => void`
625
+ - `ref`: `Ref<HTMLInputElement>`
626
+
627
+ ### CheckboxGroup
628
+
629
+ 複数チェックボックスのグループ。子は `CheckboxGroup.Item`(= `Checkbox`)で、`itemValue` が必須。
630
+
631
+ グループの選択状態は `value` / `onChange`(`string[]`)で持つ。単体の `Checkbox` が真偽値を `checked` で持つのとは別物なので、混同しないこと。
632
+
633
+ `fieldset[role="group"]` を描くため `aria-labelledby` が必須。必須入力であることは、参照先のラベル要素(`FormControl` の必須表示など)に含めて伝える。`role="group"` は `aria-required` を許可していないので、グループ側には出さない。
634
+
635
+ ```tsx
636
+ import { CheckboxGroup } from '@k8ordo/ui';
637
+
638
+ <p id="interests-label">興味のある分野</p>
639
+ <CheckboxGroup.Root
640
+ aria-labelledby="interests-label"
641
+ name="interests"
642
+ value={values}
643
+ onChange={setValues}
644
+ >
645
+ <CheckboxGroup.Item itemValue="music" label="音楽" />
646
+ <CheckboxGroup.Item itemValue="movie" label="映画" />
647
+ </CheckboxGroup.Root>;
648
+ ```
649
+
650
+ Props (CheckboxGroup.Item):
651
+
652
+ - `label`: `string`(必須)
653
+ - `checked`: `boolean`
654
+ - `defaultChecked`: `never`
655
+ - `itemValue`: `string`
656
+ - `onChange`: `(checked: boolean, event: ChangeEvent<HTMLInputElement>) => void`
657
+ - `ref`: `Ref<HTMLInputElement>`
658
+
659
+ Props (CheckboxGroup.Root):
660
+
661
+ - `aria-labelledby`: `string`(必須)
662
+ - `name`: `string`(必須)
663
+ - `children`: `ReactNode`
664
+ - `defaultValue`: `never`
665
+ - `invalid`: `boolean`(既定: `false`)
666
+ - `onChange`: `(value: string[]) => void`
667
+ - `ref`: `Ref<HTMLFieldSetElement>`
668
+ - `value`: `string[]`
669
+
670
+ ### CheckboxCard
671
+
672
+ カードスタイルのチェックボックス。
673
+
674
+ ```tsx
675
+ import { CheckboxCard } from '@k8ordo/ui';
676
+
677
+ <CheckboxCard
678
+ name="plan"
679
+ disabled={false}
680
+ options={[
681
+ { value: 'basic', label: 'ベーシック', description: '月額980円' },
682
+ {
683
+ value: 'pro',
684
+ label: 'プロ',
685
+ description: '月額1,980円',
686
+ visual: <Icon />,
687
+ },
688
+ ]}
689
+ value={selected}
690
+ onChange={onChange}
691
+ />;
692
+ ```
693
+
694
+ Props:
695
+
696
+ - `aria-labelledby`: `string`(必須)
697
+ - `options`: `readonly CheckboxCardOption[]`(必須)
698
+ - `defaultValue`: `never`
699
+ - `invalid`: `boolean`(既定: `false`)
700
+ - `onChange`: `(value: string[]) => void`
701
+ - `ref`: `Ref<HTMLFieldSetElement>`
702
+ - `value`: `string[]`
703
+
704
+ ### Radio
705
+
706
+ ```tsx
707
+ import { Radio } from '@k8ordo/ui';
708
+
709
+ <Radio
710
+ aria-labelledby="example-radio"
711
+ name="example"
712
+ onChange={onChange}
713
+ options={[
714
+ { value: 'a', label: '選択肢A' },
715
+ { value: 'b', label: '選択肢B' },
716
+ ]}
717
+ value={value}
718
+ />;
719
+ ```
720
+
721
+ Props:
722
+
723
+ - `aria-labelledby`: `string`(必須)
724
+ - `options`: `readonly Option[]`(必須)
725
+ - `disabled`: `boolean`(既定: `false`)
726
+ - `name`: `string`
727
+ - `onChange`: `(value: string, event: ChangeEvent<HTMLInputElement>) => void`
728
+ - `ref`: `Ref<HTMLDivElement>`
729
+ - `value`: `string`
730
+
731
+ ### RadioCard
732
+
733
+ カードスタイルのラジオボタン。`fieldset[role="radiogroup"]` の中に本物の `input[type="radio"]` を並べるため、矢印キーのローミングと単一選択はブラウザに任せている。テストからは `getByRole('radio', { checked })` で参照する。
734
+
735
+ ```tsx
736
+ import { RadioCard } from '@k8ordo/ui';
737
+
738
+ <RadioCard
739
+ aria-labelledby="plan-radio"
740
+ name="plan"
741
+ disabled={false}
742
+ options={[
743
+ { value: 'basic', label: 'ベーシック', description: '月額980円' },
744
+ {
745
+ value: 'pro',
746
+ label: 'プロ',
747
+ description: '月額1,980円',
748
+ visual: <Icon />,
749
+ },
750
+ ]}
751
+ value={value}
752
+ onChange={onChange}
753
+ />;
754
+ ```
755
+
756
+ Props:
757
+
758
+ - `aria-labelledby`: `string`(必須)
759
+ - `options`: `readonly RadioCardOption[]`(必須)
760
+ - `defaultValue`: `never`
761
+ - `invalid`: `boolean`(既定: `false`)
762
+ - `onChange`: `(value: string) => void`
763
+ - `ref`: `Ref<HTMLFieldSetElement>`
764
+ - `value`: `string`
765
+
766
+ ### Slider
767
+
768
+ レンジスライダー。
769
+
770
+ ```tsx
771
+ import { Slider } from '@k8ordo/ui';
772
+
773
+ <Slider
774
+ min={0}
775
+ max={100}
776
+ step={1}
777
+ value={value}
778
+ onChange={onChange}
779
+ invalid={false}
780
+ disabled={false}
781
+ required={false}
782
+ />;
783
+ ```
784
+
785
+ Props:
786
+
787
+ - `defaultValue`: `never`
788
+ - `invalid`: `boolean`(既定: `false`)
789
+ - `max`: `number`(既定: `100`)
790
+ - `min`: `number`(既定: `0`)
791
+ - `onChange`: `(value: number) => void`
792
+ - `ref`: `Ref<HTMLInputElement>`
793
+ - `step`: `number`(既定: `1`)
794
+ - `value`: `number`
795
+
796
+ ### Switch
797
+
798
+ トグルスイッチ。
799
+
800
+ ```tsx
801
+ import { Switch } from '@k8ordo/ui';
802
+
803
+ <Switch
804
+ checked={checked}
805
+ disabled={false}
806
+ invalid={false}
807
+ label="通知を有効にする"
808
+ onChange={onChange}
809
+ required={false}
810
+ />;
811
+ ```
812
+
813
+ Props:
814
+
815
+ - `label`: `string`(必須)
816
+ - `checked`: `boolean`
817
+ - `defaultChecked`: `never`
818
+ - `invalid`: `boolean`(既定: `false`)
819
+ - `onChange`: `(checked: boolean, event: ChangeEvent<HTMLInputElement>) => void`
820
+ - `ref`: `Ref<HTMLInputElement>`
821
+
822
+ ### FileField
823
+
824
+ コンポジットパターンのファイルアップロード。
825
+
826
+ ```tsx
827
+ import { FileField } from '@k8ordo/ui';
828
+
829
+ <FileField.Root accept="image/*" multiple maxFiles={5}>
830
+ <FileField.Trigger
831
+ renderItem={({ onClick, disabled }) => (
832
+ <Button onClick={onClick} disabled={disabled}>
833
+ ファイルを選択
834
+ </Button>
835
+ )}
836
+ />
837
+ <FileField.ItemList />
838
+ </FileField.Root>;
839
+ ```
840
+
841
+ Props (Root):
842
+
843
+ - `children`: `ReactNode`
844
+ - `defaultValue`: `File[]`
845
+ - `invalid`: `boolean`(既定: `false`)
846
+ - `maxFiles`: `number`
847
+ - `onChange`: `(files: FileList | null, event?: ChangeEvent<HTMLInputElement>) => void`
848
+ - `ref`: `Ref<HTMLInputElement>`
849
+ - `webkitDirectory`: `boolean`(既定: `false`)
850
+
851
+ Props (FileField.ItemList):
852
+
853
+ - `clearable`: `boolean`
854
+ - `showWebkitRelativePath`: `boolean`
855
+
856
+ Props (FileField.Trigger):
857
+
858
+ - `renderItem`: `(props: { onClick: () => void; disabled: boolean; invalid: boolean; }) => ReactElement`(必須)
859
+
860
+ ## データ表示
861
+
862
+ ### Heading
863
+
864
+ セマンティック見出し。`type` prop で HTML 要素を指定。
865
+
866
+ ```tsx
867
+ import { Heading } from '@k8ordo/ui';
868
+
869
+ <Heading level="h1">ページタイトル</Heading>
870
+ <Heading level="h2">セクション見出し</Heading>
871
+ <Heading level="h3">サブセクション</Heading>
872
+ ```
873
+
874
+ Props:
875
+
876
+ - `level`: `'h1'` | `'h2'` | `'h3'` | `'h4'` | `'h5'` | `'h6'`(必須)
877
+ - `children`: `ReactNode`
878
+ - `lineClamp`: `1` | `2` | `3` | `4` | `5` | `6`
879
+
880
+ ### Avatar
881
+
882
+ ユーザーアバター。
883
+
884
+ ```tsx
885
+ import { Avatar } from '@k8ordo/ui';
886
+
887
+ <Avatar src="/avatar.jpg" alt="ユーザー名" size="md" />
888
+ <Avatar name="田中太郎" fallback="田" size="lg" />
889
+ <Avatar color="primary" icon={<AssistantIcon />} name="AI" size="sm" />
890
+ ```
891
+
892
+ Props:
893
+
894
+ - `alt`: `string`
895
+ - `children`: `ReactNode`
896
+ - `color`: `'base'` | `'primary'` | `'secondary'`(既定: `'base'`)
897
+ - `fallback`: `string`
898
+ - `icon`: `ReactNode`
899
+ - `name`: `string`
900
+ - `size`: `'sm'` | `'md'` | `'lg'`(既定: `'md'`)
901
+ - `src`: `string`
902
+
903
+ ### Badge
904
+
905
+ ステータスバッジ。
906
+
907
+ ```tsx
908
+ import { Badge } from '@k8ordo/ui';
909
+
910
+ <Badge label="新着" tone="info" variant="solid" />
911
+ <Badge label="完了" tone="success" variant="outline" />
912
+ <Badge label="フィルター" interactive />
913
+ ```
914
+
915
+ Props:
916
+
917
+ - `label`: `string`(必須)
918
+ - `interactive`: `true`
919
+ - `size`: `Size`
920
+ - `tone`: `Tone`
921
+ - `variant`: `Variant`
922
+
923
+ ### Code
924
+
925
+ インラインコード表示。
926
+
927
+ ```tsx
928
+ import { Code } from '@k8ordo/ui';
929
+
930
+ <Code>{`const x = 1;`}</Code>;
931
+ ```
932
+
933
+ Props:
934
+
935
+ - `children`: `string`(必須)
936
+
937
+ ### Table
938
+
939
+ データテーブル。Compound component パターン。
940
+
941
+ ```tsx
942
+ import { Table } from '@k8ordo/ui';
943
+
944
+ <Table.Root>
945
+ <Table.Head>
946
+ <Table.Row>
947
+ <Table.HeaderCell>名前</Table.HeaderCell>
948
+ <Table.HeaderCell align="right">金額</Table.HeaderCell>
949
+ </Table.Row>
950
+ </Table.Head>
951
+ <Table.Body>
952
+ <Table.Row interactive>
953
+ <Table.Cell>商品A</Table.Cell>
954
+ <Table.Cell align="right">¥1,000</Table.Cell>
955
+ </Table.Row>
956
+ </Table.Body>
957
+ </Table.Root>;
958
+ ```
959
+
960
+ Props (Table.Body):
961
+
962
+ - `children`: `ReactNode`
963
+
964
+ Props (Table.Caption):
965
+
966
+ - `children`: `ReactNode`
967
+
968
+ Props (Table.Cell):
969
+
970
+ - `align`: `CellAlign`(既定: `'left'`)
971
+ - `children`: `ReactNode`
972
+ - `color`: `'base'` | `'mute'`(既定: `'base'`)
973
+
974
+ Props (Table.EmptyState):
975
+
976
+ - `children`: `ReactNode`(必須)
977
+ - `colSpan`: `number`(必須)
978
+
979
+ Props (Table.Head):
980
+
981
+ - `children`: `ReactNode`
982
+
983
+ Props (Table.HeaderCell):
984
+
985
+ - `align`: `CellAlign`(既定: `'left'`)
986
+ - `children`: `ReactNode`
987
+ - `scope`: `'col'` | `'row'` | `'colgroup'` | `'rowgroup'`(既定: `'col'`)
988
+
989
+ Props (Table.Root):
990
+
991
+ - `children`: `ReactNode`
992
+
993
+ Props (Table.Row):
994
+
995
+ - `children`: `ReactNode`
996
+ - `interactive`: `boolean`(既定: `false`)
997
+
998
+ ## フィードバック
999
+
1000
+ ### Alert
1001
+
1002
+ ```tsx
1003
+ import { Alert } from '@k8ordo/ui';
1004
+
1005
+ <Alert tone="info" message="情報メッセージ" />
1006
+ <Alert tone="error" message={['エラー1', 'エラー2']} />
1007
+ ```
1008
+
1009
+ Props:
1010
+
1011
+ - `message`: `string` | `string[]`(必須)
1012
+ - `tone`: `Status`(必須)
1013
+ - `action`: `AlertAction`
1014
+ - `closeLabel`: `string`
1015
+ - `onClose`: `() => void`
1016
+
1017
+ ### Toast
1018
+
1019
+ ```tsx
1020
+ import { useToast } from '@k8ordo/ui';
1021
+
1022
+ const { open, close, closeAll } = useToast();
1023
+
1024
+ open('success', '保存しました');
1025
+ open('error', 'エラーが発生しました');
1026
+ ```
1027
+
1028
+ `ToastProvider` は `UIProvider` に含まれるため、別途ラップ不要。
1029
+
1030
+ `useToast()` の戻り値:
1031
+
1032
+ - `open`: `(tone: Status, message: string, options?: ToastOptions) => void`(`ToastOptions` は `{ duration?: number; action?: ToastAction }`)
1033
+ - `close`: `(id: string) => void`
1034
+ - `closeAll`: `() => void`
1035
+
1036
+ ### ToastProvider
1037
+
1038
+ 出す位置や Portal 先を変えたいときだけ、`UIProvider` の内側で明示的にラップする。
1039
+
1040
+ ```tsx
1041
+ import { ToastProvider } from '@k8ordo/ui';
1042
+
1043
+ <ToastProvider position="absolute" portalRef={containerRef}>
1044
+ {children}
1045
+ </ToastProvider>;
1046
+ ```
1047
+
1048
+ Props:
1049
+
1050
+ - `children`: `ReactNode`
1051
+ - `portalRef`: `RefObject<HTMLElement | null>`(既定: `null`)
1052
+ - `position`: `'fixed'` | `'absolute'`(既定: `'fixed'`)
1053
+
1054
+ ### Progress
1055
+
1056
+ ```tsx
1057
+ import { Progress } from '@k8ordo/ui';
1058
+
1059
+ <Progress value={50} max={100} />
1060
+ <Progress value={50} max={100} min={0} label="進捗" />
1061
+ ```
1062
+
1063
+ Props:
1064
+
1065
+ - `max`: `number`(必須)
1066
+ - `value`: `number`(必須)
1067
+ - `label`: `string`
1068
+ - `min`: `number`(既定: `0`)
1069
+
1070
+ ### Spinner
1071
+
1072
+ ローディングスピナー。
1073
+
1074
+ ```tsx
1075
+ import { Spinner } from '@k8ordo/ui';
1076
+
1077
+ <Spinner size="md" label="読み込み中" />;
1078
+ ```
1079
+
1080
+ Props:
1081
+
1082
+ - `label`: `string`
1083
+ - `size`: `'sm'` | `'md'` | `'lg'`(既定: `'md'`)
1084
+
1085
+ ### Skeleton
1086
+
1087
+ コンテンツプレースホルダー。
1088
+
1089
+ ```tsx
1090
+ import { Skeleton } from '@k8ordo/ui';
1091
+
1092
+ <Skeleton shape="rect" size="md" />
1093
+ <Skeleton shape="circle" size="lg" />
1094
+ <Skeleton shape="rect" size="sm" animate={false} />
1095
+ ```
1096
+
1097
+ Props:
1098
+
1099
+ - `animate`: `boolean`(既定: `true`)
1100
+ - `shape`: `'rect'` | `'circle'`(既定: `'rect'`)
1101
+ - `size`: `'sm'` | `'md'` | `'lg'`(既定: `'md'`)
1102
+
1103
+ ## オーバーレイ
1104
+
1105
+ ### Modal
1106
+
1107
+ ベースのオーバーレイコンポーネント。`<dialog>` 要素を使用。
1108
+
1109
+ ```tsx
1110
+ import { Modal } from '@k8ordo/ui';
1111
+
1112
+ <Modal isOpen={open} onClose={onClose} side="center">
1113
+ コンテンツ
1114
+ </Modal>;
1115
+ ```
1116
+
1117
+ Props:
1118
+
1119
+ - `aria-describedby`: `string`
1120
+ - `aria-label`: `string`
1121
+ - `aria-labelledby`: `string`
1122
+ - `children`: `ReactNode`
1123
+ - `defaultOpen`: `boolean`
1124
+ - `isOpen`: `boolean`
1125
+ - `onClose`: `() => void`
1126
+ - `ref`: `Ref<HTMLDialogElement>`
1127
+ - `side`: `ModalSide`(既定: `'center'`)
1128
+
1129
+ 名前の解決順は `aria-label` / `aria-labelledby` > 中の `Dialog.Root` が登録した見出し。どちらも無ければ無名の dialog になるため、`Dialog` を入れずに直接コンテンツを置くときは `aria-label` を渡す。
1130
+
1131
+ ```tsx
1132
+ <Modal aria-label="画像プレビュー" isOpen={open} onClose={onClose}>
1133
+ <img alt="" src={src} />
1134
+ </Modal>
1135
+ ```
1136
+
1137
+ ### Dialog
1138
+
1139
+ Compound component パターン。Modal と組み合わせて使用。
1140
+
1141
+ ```tsx
1142
+ import { Modal, Dialog } from '@k8ordo/ui';
1143
+
1144
+ <Modal isOpen={open} onClose={onClose}>
1145
+ <Dialog.Root>
1146
+ <Dialog.Header title="確認" onClose={onClose} />
1147
+ <Dialog.Content>コンテンツ</Dialog.Content>
1148
+ </Dialog.Root>
1149
+ </Modal>;
1150
+ ```
1151
+
1152
+ Props (Dialog.Content):
1153
+
1154
+ - `children`: `ReactNode`
1155
+
1156
+ Props (Dialog.Header):
1157
+
1158
+ - `onClose`: `() => void`(必須)
1159
+ - `title`: `ReactNode`(必須)
1160
+
1161
+ Props (Dialog.Root):
1162
+
1163
+ - `children`: `ReactNode`
1164
+ - `id`: `string`
1165
+ - `ref`: `Ref<HTMLElement>`
1166
+ - `role`: `'dialog'` | `'alertdialog'`
1167
+ - `tabIndex`: `number`
1168
+
1169
+ ### Drawer
1170
+
1171
+ サイドパネル。内部で Modal を使用。
1172
+
1173
+ ```tsx
1174
+ import { Drawer } from '@k8ordo/ui';
1175
+
1176
+ <Drawer title="メニュー" isOpen={open} onClose={onClose} side="right">
1177
+ コンテンツ
1178
+ </Drawer>;
1179
+ ```
1180
+
1181
+ Props:
1182
+
1183
+ - `title`: `ReactNode`(必須)
1184
+ - `children`: `ReactNode`
1185
+ - `defaultOpen`: `boolean`
1186
+ - `isOpen`: `boolean`
1187
+ - `onClose`: `() => void`
1188
+ - `side`: `DrawerSide`(既定: `'right'`)
1189
+
1190
+ ### Popover
1191
+
1192
+ CSS Anchor Positioning ベースのポップオーバー。Compound component パターン。
1193
+
1194
+ ```tsx
1195
+ import { Popover } from '@k8ordo/ui';
1196
+
1197
+ <Popover.Root placement="bottom">
1198
+ <Popover.Trigger renderItem={(props) => <Button {...props}>開く</Button>} />
1199
+ <Popover.Content
1200
+ renderItem={(props) => <div {...props}>ポップオーバーコンテンツ</div>}
1201
+ />
1202
+ </Popover.Root>;
1203
+ ```
1204
+
1205
+ Props (Root):
1206
+
1207
+ - `children`: `ReactNode`
1208
+ - `closeOnClickAway`: `boolean`(既定: `true`)
1209
+ - `defaultOpen`: `boolean`(既定: `false`)
1210
+ - `flipDisabled`: `boolean`(既定: `false`)
1211
+ - `isOpen`: `boolean`
1212
+ - `onChange`: `(isOpen: boolean) => void`
1213
+ - `placement`: `Placement`(既定: `'bottom-start'`)
1214
+ - `role`: `'dialog'` | `'menu'` | `'listbox'`(既定: `'menu'`)
1215
+ - `trapFocus`: `boolean`(既定: `true`)
1216
+
1217
+ Escape は入れ子のうち**最も内側の 1 枚だけ**を閉じる。
1218
+
1219
+ Props (Popover.Content):
1220
+
1221
+ - `renderItem`: `(props: PopoverContentProps) => ReactElement`(必須)
1222
+ - `animation`: `'scale'` | `'fade'`(既定: `'scale'`)
1223
+
1224
+ Props (Popover.Trigger):
1225
+
1226
+ - `renderItem`: `(props: PopoverTriggerProps) => ReactElement`(必須)
1227
+
1228
+ ### Tooltip
1229
+
1230
+ ツールチップ。Compound component パターン。
1231
+
1232
+ ```tsx
1233
+ import { Tooltip } from '@k8ordo/ui';
1234
+
1235
+ <Tooltip.Root placement="top">
1236
+ <Tooltip.Trigger renderItem={(props) => <Button {...props}>ホバー</Button>} />
1237
+ <Tooltip.Content>ヒント</Tooltip.Content>
1238
+ </Tooltip.Root>;
1239
+ ```
1240
+
1241
+ Props (Root):
1242
+
1243
+ - `children`: `ReactNode`
1244
+ - `closeDelay`: `number`(既定: `150`)
1245
+ - `defaultOpen`: `boolean`
1246
+ - `isOpen`: `boolean`
1247
+ - `onChange`: `(isOpen: boolean) => void`
1248
+ - `openDelay`: `number`(既定: `0`)
1249
+ - `placement`: `Placement`(既定: `'bottom'`)
1250
+
1251
+ Props (Tooltip.Content):
1252
+
1253
+ - `children`: `ReactNode`
1254
+
1255
+ Props (Tooltip.Trigger):
1256
+
1257
+ - `renderItem`: `(props: TooltipTriggerProps) => ReactElement`(必須)
1258
+
1259
+ ### DropdownMenu
1260
+
1261
+ ドロップダウンメニュー。Compound component パターン。
1262
+
1263
+ ```tsx
1264
+ import { DropdownMenu } from '@k8ordo/ui';
1265
+
1266
+ <DropdownMenu.Root>
1267
+ <DropdownMenu.Trigger label="メニュー" />
1268
+ <DropdownMenu.Content>
1269
+ <DropdownMenu.Item label="アイテム1" onAction={handleClick} />
1270
+ <DropdownMenu.Item label="アイテム2" onAction={handleClick} />
1271
+ </DropdownMenu.Content>
1272
+ </DropdownMenu.Root>;
1273
+ ```
1274
+
1275
+ Props (Root):
1276
+
1277
+ - `children`: `ReactNode`
1278
+ - `defaultOpen`: `boolean`
1279
+ - `isOpen`: `boolean`
1280
+ - `onChange`: `(isOpen: boolean) => void`
1281
+ - `placement`: `Placement`(既定: `'bottom-start'`)
1282
+
1283
+ Trigger バリアント:
1284
+
1285
+ - `DropdownMenu.Trigger`: テキストベース(`label`, `size`, `variant`)
1286
+ - `DropdownMenu.IconTrigger`: アイコンベース(`icon`, `label`)
1287
+
1288
+ Props (DropdownMenu.Content):
1289
+
1290
+ - `children`: `ReactNode`
1291
+
1292
+ Props (DropdownMenu.IconTrigger):
1293
+
1294
+ - `icon`: `ReactNode`(必須)
1295
+ - `label`: `string`(必須)
1296
+
1297
+ Props (DropdownMenu.Item):
1298
+
1299
+ - `label`: `string`(必須)
1300
+ - `onAction`: `() => void`(必須)
1301
+
1302
+ `DropdownMenu.SubMenu` は入れ子メニュー。`label` の行をホバーまたはキーボードで開くと、子要素のメニューが右側に開く。
1303
+
1304
+ Props (DropdownMenu.SubMenu):
1305
+
1306
+ - `label`: `string`(必須)
1307
+ - `children`: `ReactNode`
1308
+
1309
+ Props (DropdownMenu.Trigger):
1310
+
1311
+ - `label`: `string`(必須)
1312
+ - `size`: `ComponentProps<typeof Button>['size']`(既定: `'md'`)
1313
+ - `variant`: `ComponentProps<typeof Button>['variant']`(既定: `'solid'`)
1314
+
1315
+ ### ListBox
1316
+
1317
+ リスト選択。Compound component パターン。選択肢は `Select` と同じ `Option`(`{ value, label }`)。
1318
+
1319
+ ```tsx
1320
+ import { ListBox } from '@k8ordo/ui';
1321
+
1322
+ <ListBox.Root
1323
+ onChange={onChange}
1324
+ options={[
1325
+ { value: '1', label: 'オプション1' },
1326
+ { value: '2', label: 'オプション2' },
1327
+ ]}
1328
+ value={value}
1329
+ >
1330
+ <ListBox.Trigger label="表示件数" size="md" />
1331
+ <ListBox.Content />
1332
+ </ListBox.Root>;
1333
+ ```
1334
+
1335
+ Props (Root):
1336
+
1337
+ - `options`: `readonly Option[]`(必須)
1338
+ - `children`: `ReactNode`
1339
+ - `defaultValue`: `Option['value']`
1340
+ - `onChange`: `(value: Option['value']) => void`
1341
+ - `placement`: `Placement`(既定: `'bottom'`)
1342
+ - `value`: `Option['value']`
1343
+
1344
+ Trigger バリアント:
1345
+
1346
+ - `ListBox.Trigger`: テキストベース(`size`, `label`)
1347
+ - `ListBox.IconTrigger`: アイコンベース(`size`, `icon`, `label`)
1348
+
1349
+ `label` を渡すとトリガーのアクセシブル名が「ラベル + 現在値」になる。省略すると現在値だけになるため、周囲に見出しが無いときは渡す。
1350
+
1351
+ Props (Content):
1352
+
1353
+ - `helpContent`: `ReactElement`
1354
+
1355
+ Props (ListBox.IconTrigger):
1356
+
1357
+ - `icon`: `ReactElement`(必須)
1358
+ - `label`: `string`
1359
+ - `size`: `ComponentProps<typeof Button>['size']`(既定: `'md'`)
1360
+
1361
+ Props (ListBox.Trigger):
1362
+
1363
+ - `label`: `string`
1364
+ - `size`: `ComponentProps<typeof Button>['size']`(既定: `'md'`)
1365
+
1366
+ ## プロバイダー
1367
+
1368
+ ### UIProvider
1369
+
1370
+ アプリのルートで1回ラップする。ToastProvider と文言辞書(下記 i18n)を含む。
1371
+
1372
+ ```tsx
1373
+ import { UIProvider } from '@k8ordo/ui';
1374
+
1375
+ <UIProvider>
1376
+ <App />
1377
+ </UIProvider>;
1378
+ ```
1379
+
1380
+ Props:
1381
+
1382
+ - `children`: `ReactNode`
1383
+ - `messages`: `Partial<Messages>`
1384
+
1385
+ ### PortalRootProvider
1386
+
1387
+ Portal のルート要素を指定する。
1388
+
1389
+ ```tsx
1390
+ import { PortalRootProvider, usePortalRoot } from '@k8ordo/ui';
1391
+
1392
+ <PortalRootProvider value={containerRef}>{children}</PortalRootProvider>;
1393
+ ```
1394
+
1395
+ Props:
1396
+
1397
+ - `children`: `ReactNode`
1398
+ - `value`: `RefObject<HTMLElement | null>`
1399
+
1400
+ ## i18n(文言辞書)
1401
+
1402
+ コンポーネントが内部で持つ文言(閉じる、必須、読み込み中 …)は辞書から引く。**既定は日本語**で、Provider を置かなくても、`messages` を渡さなくても日本語で動く。
1403
+
1404
+ 英語に切り替えるときは `@k8ordo/ui/i18n` の `en` を渡す。
1405
+
1406
+ ```tsx
1407
+ import { UIProvider } from '@k8ordo/ui';
1408
+ import { en } from '@k8ordo/ui/i18n';
1409
+
1410
+ <UIProvider messages={en}>
1411
+ <App />
1412
+ </UIProvider>;
1413
+ ```
1414
+
1415
+ 一部だけ差し替えるときは辞書をスプレッドして上書きする(`Partial<Messages>` なので全キーを埋める必要はない)。
1416
+
1417
+ ```tsx
1418
+ <UIProvider messages={{ ...en, close: 'Dismiss' }}>
1419
+ <App />
1420
+ </UIProvider>
1421
+ ```
1422
+
1423
+ 日本語のまま一部だけ変えるなら、そのキーだけ渡せばよい。
1424
+
1425
+ ```tsx
1426
+ <UIProvider messages={{ close: '閉じる(Esc)' }}>
1427
+ <App />
1428
+ </UIProvider>
1429
+ ```
1430
+
1431
+ ### 優先順位
1432
+
1433
+ **コンポーネントの prop > Provider に渡した辞書 > 既定(日本語)**。
1434
+
1435
+ `Spinner` の `label`、`Alert` の `closeLabel`、`PasswordInput` の `showLabel` / `hideLabel`、`Pagination` の `prevLabel` / `nextLabel` のように個別の文言 prop を持つコンポーネントは、その prop が辞書より優先される。
1436
+
1437
+ ```tsx
1438
+ // 辞書が en でも、この Spinner だけは「保存中」になる
1439
+ <Spinner label="保存中" />
1440
+ ```
1441
+
1442
+ ### エクスポート
1443
+
1444
+ ```tsx
1445
+ import { en, ja, type Messages } from '@k8ordo/ui/i18n';
1446
+ ```
1447
+
1448
+ `ja` / `en` は本体のバンドルに載らないよう、ルートではなく `@k8ordo/ui/i18n` サブパスからのみ export される。
1449
+
1450
+ ### キー一覧
1451
+
1452
+ `Messages` 型の全キー。値はすべて `string`。
1453
+
1454
+ | 分類 | キー |
1455
+ | ------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
1456
+ | 共通 | `close`, `required`, `loading`, `avatar`, `color` |
1457
+ | Alert | `alertSuccess`, `alertInfo`, `alertWarning`, `alertError` |
1458
+ | Toast | `toastRegion` |
1459
+ | Autocomplete | `autocompletePlaceholder`, `autocompleteRemoveTag`, `autocompleteClear`, `autocompleteEmpty` |
1460
+ | FileField | `fileFieldRemove` |
1461
+ | NumberField | `numberFieldIncrement`, `numberFieldDecrement` |
1462
+ | PasswordInput | `passwordShow`, `passwordHide` |
1463
+ | ListBox | `listBoxPlaceholder` |
1464
+ | Breadcrumb | `breadcrumb` |
1465
+ | Pagination | `paginationLabel`, `paginationPrevious`, `paginationNext` |
1466
+ | AI チャット | `chat`, `scrollToLatest`, `reasoning`, `reasoningStreaming`, `suggestions`, `send`, `stop`, `toolInput`, `toolOutput`, `toolError` |