@konce-pt/react 0.12.0 → 0.15.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 (378) hide show
  1. package/README.md +122 -64
  2. package/dist/accordion/accordion.d.ts +14 -6
  3. package/dist/accordion/accordion.js +14 -7
  4. package/dist/accordion/llms.txt +22 -10
  5. package/dist/alert/alert.d.ts +2 -2
  6. package/dist/alert/alert.js +2 -2
  7. package/dist/alert/llms.txt +10 -10
  8. package/dist/app-shell/app-shell.d.ts +14 -14
  9. package/dist/app-shell/app-shell.js +11 -11
  10. package/dist/app-shell/llms.txt +13 -13
  11. package/dist/auth/auth-types.d.ts +6 -6
  12. package/dist/auth/auth.d.ts +2 -2
  13. package/dist/auth/auth.js +7 -7
  14. package/dist/auth/llms.txt +9 -9
  15. package/dist/autocomplete/autocomplete.d.ts +19 -6
  16. package/dist/autocomplete/autocomplete.js +23 -10
  17. package/dist/autocomplete/llms.txt +16 -5
  18. package/dist/avatar/avatar.d.ts +6 -6
  19. package/dist/avatar/avatar.js +5 -5
  20. package/dist/avatar/llms.txt +10 -10
  21. package/dist/avatar-group/avatar-group.d.ts +4 -4
  22. package/dist/avatar-group/avatar-group.js +3 -3
  23. package/dist/avatar-group/llms.txt +8 -8
  24. package/dist/backdrop/backdrop.d.ts +7 -7
  25. package/dist/backdrop/backdrop.js +16 -16
  26. package/dist/backdrop/llms.txt +27 -27
  27. package/dist/badge/badge.d.ts +3 -3
  28. package/dist/badge/badge.js +1 -1
  29. package/dist/badge/llms.txt +11 -11
  30. package/dist/bottom-sheet/bottom-sheet.d.ts +4 -4
  31. package/dist/bottom-sheet/bottom-sheet.js +2 -2
  32. package/dist/bottom-sheet/llms.txt +9 -9
  33. package/dist/breadcrumb/breadcrumb.d.ts +2 -2
  34. package/dist/breadcrumb/breadcrumb.js +3 -3
  35. package/dist/breadcrumb/llms.txt +3 -3
  36. package/dist/button/button.d.ts +3 -3
  37. package/dist/button/button.js +8 -8
  38. package/dist/button/llms.txt +27 -19
  39. package/dist/button-group/button-group.d.ts +9 -9
  40. package/dist/button-group/button-group.js +30 -8
  41. package/dist/button-group/llms.txt +20 -14
  42. package/dist/card/card.d.ts +8 -8
  43. package/dist/card/card.js +6 -6
  44. package/dist/card/llms.txt +20 -20
  45. package/dist/carousel/carousel.d.ts +6 -6
  46. package/dist/carousel/carousel.js +4 -4
  47. package/dist/carousel/llms.txt +10 -10
  48. package/dist/charts/chart-legend.d.ts +3 -3
  49. package/dist/charts/chart-legend.js +1 -1
  50. package/dist/charts/chart-tooltip.d.ts +3 -3
  51. package/dist/charts/chart-tooltip.js +1 -1
  52. package/dist/charts/chart.d.ts +1 -1
  53. package/dist/charts/chart.js +8 -8
  54. package/dist/charts/llms.txt +6 -6
  55. package/dist/charts-entry/public-api.js +2 -2
  56. package/dist/chat/chat.d.ts +17 -10
  57. package/dist/chat/chat.js +42 -18
  58. package/dist/chat/llms.txt +32 -17
  59. package/dist/chat-composer/chat-composer.d.ts +17 -7
  60. package/dist/chat-composer/chat-composer.js +21 -8
  61. package/dist/chat-composer/llms.txt +20 -11
  62. package/dist/chat-dock/chat-dock.d.ts +11 -4
  63. package/dist/chat-dock/chat-dock.js +9 -6
  64. package/dist/chat-dock/llms.txt +15 -14
  65. package/dist/chat-entry/public-api.js +1 -1
  66. package/dist/chat-message/chat-message.d.ts +12 -5
  67. package/dist/chat-message/chat-message.js +17 -7
  68. package/dist/chat-message/llms.txt +16 -15
  69. package/dist/chat-typing/chat-typing.d.ts +2 -2
  70. package/dist/chat-typing/chat-typing.js +3 -3
  71. package/dist/chat-typing/llms.txt +6 -6
  72. package/dist/checkbox/checkbox.d.ts +13 -6
  73. package/dist/checkbox/checkbox.js +26 -7
  74. package/dist/checkbox/llms.txt +24 -12
  75. package/dist/chip/chip.d.ts +4 -4
  76. package/dist/chip/chip.js +2 -2
  77. package/dist/chip/llms.txt +11 -11
  78. package/dist/chips-input/chips-input.d.ts +4 -4
  79. package/dist/chips-input/chips-input.js +35 -9
  80. package/dist/chips-input/llms.txt +15 -8
  81. package/dist/clock/clock.d.ts +4 -4
  82. package/dist/clock/clock.js +7 -7
  83. package/dist/clock/llms.txt +8 -8
  84. package/dist/color-picker/color-picker.d.ts +6 -6
  85. package/dist/color-picker/color-picker.js +3 -3
  86. package/dist/color-picker/llms.txt +5 -5
  87. package/dist/confirm/confirm-container.d.ts +3 -3
  88. package/dist/confirm/confirm-container.js +5 -5
  89. package/dist/confirm/confirm-store.d.ts +4 -4
  90. package/dist/confirm/confirm-store.js +7 -7
  91. package/dist/confirm/llms.txt +6 -6
  92. package/dist/context-menu/context-menu.d.ts +1 -1
  93. package/dist/context-menu/context-menu.js +5 -5
  94. package/dist/context-menu/llms.txt +7 -7
  95. package/dist/data-table/data-table-types.d.ts +5 -5
  96. package/dist/data-table/data-table.d.ts +29 -8
  97. package/dist/data-table/data-table.js +340 -95
  98. package/dist/data-table/export-csv.d.ts +3 -3
  99. package/dist/data-table/export-csv.js +4 -4
  100. package/dist/data-table/llms.txt +127 -94
  101. package/dist/data-view/data-view.d.ts +13 -5
  102. package/dist/data-view/data-view.js +67 -6
  103. package/dist/data-view/llms.txt +29 -10
  104. package/dist/date-range/date-range.d.ts +9 -9
  105. package/dist/date-range/date-range.js +24 -24
  106. package/dist/date-range/llms.txt +20 -20
  107. package/dist/datepicker/datepicker.d.ts +10 -10
  108. package/dist/datepicker/datepicker.js +29 -29
  109. package/dist/datepicker/llms.txt +24 -24
  110. package/dist/dialog/dialog.d.ts +12 -7
  111. package/dist/dialog/dialog.js +4 -4
  112. package/dist/dialog/llms.txt +14 -11
  113. package/dist/divider/divider.d.ts +1 -1
  114. package/dist/divider/llms.txt +4 -4
  115. package/dist/drawer/drawer.d.ts +5 -5
  116. package/dist/drawer/drawer.js +2 -2
  117. package/dist/drawer/llms.txt +11 -11
  118. package/dist/empty/empty.d.ts +2 -2
  119. package/dist/empty/empty.js +1 -1
  120. package/dist/empty/llms.txt +9 -9
  121. package/dist/fab/fab.d.ts +1 -1
  122. package/dist/fab/fab.js +1 -1
  123. package/dist/fab/llms.txt +10 -6
  124. package/dist/fieldset/fieldset.d.ts +18 -4
  125. package/dist/fieldset/fieldset.js +9 -6
  126. package/dist/fieldset/llms.txt +26 -9
  127. package/dist/file-upload/file-upload.d.ts +3 -3
  128. package/dist/file-upload/file-upload.js +7 -7
  129. package/dist/file-upload/llms.txt +7 -7
  130. package/dist/form-field/form-field-context.d.ts +4 -4
  131. package/dist/form-field/form-field.d.ts +12 -4
  132. package/dist/form-field/form-field.js +26 -6
  133. package/dist/form-field/llms.txt +25 -11
  134. package/dist/galleria/galleria.d.ts +3 -3
  135. package/dist/galleria/galleria.js +5 -5
  136. package/dist/galleria/llms.txt +7 -7
  137. package/dist/grid/col.d.ts +4 -4
  138. package/dist/grid/col.js +2 -2
  139. package/dist/grid/flex.d.ts +3 -3
  140. package/dist/grid/flex.js +1 -1
  141. package/dist/grid/grid.d.ts +7 -7
  142. package/dist/grid/grid.js +3 -3
  143. package/dist/grid/layout.d.ts +2 -2
  144. package/dist/grid/layout.js +2 -2
  145. package/dist/grid/llms.txt +15 -15
  146. package/dist/grid-entry/public-api.js +1 -1
  147. package/dist/i18n/i18n-context.d.ts +3 -3
  148. package/dist/i18n/i18n-context.js +7 -7
  149. package/dist/icon/icon-registry.d.ts +3 -3
  150. package/dist/icon/icon-registry.js +3 -3
  151. package/dist/icon/icon.d.ts +4 -4
  152. package/dist/icon/icon.js +6 -6
  153. package/dist/icon/llms.txt +13 -13
  154. package/dist/icon-button/icon-button.d.ts +2 -2
  155. package/dist/icon-button/icon-button.js +1 -1
  156. package/dist/icon-button/llms.txt +9 -5
  157. package/dist/icons-entry/public-api.d.ts +2 -2
  158. package/dist/icons-entry/public-api.js +3 -3
  159. package/dist/image/image.js +1 -1
  160. package/dist/image/llms.txt +13 -13
  161. package/dist/input/input.d.ts +18 -5
  162. package/dist/input/input.js +21 -6
  163. package/dist/input/llms.txt +25 -11
  164. package/dist/input-mask/input-mask.d.ts +1 -1
  165. package/dist/input-mask/input-mask.js +2 -2
  166. package/dist/input-mask/llms.txt +5 -5
  167. package/dist/input-number/input-number.d.ts +9 -9
  168. package/dist/input-number/input-number.js +11 -11
  169. package/dist/input-number/llms.txt +14 -14
  170. package/dist/input-otp/input-otp.d.ts +6 -6
  171. package/dist/input-otp/input-otp.js +10 -10
  172. package/dist/input-otp/llms.txt +9 -9
  173. package/dist/internal/calendar-focus.d.ts +1 -1
  174. package/dist/internal/calendar-focus.js +3 -3
  175. package/dist/internal/cn.d.ts +1 -1
  176. package/dist/internal/mask.d.ts +2 -2
  177. package/dist/internal/mask.js +4 -4
  178. package/dist/internal/option-key.d.ts +2 -2
  179. package/dist/internal/option-key.js +2 -2
  180. package/dist/internal/option-nav.d.ts +4 -4
  181. package/dist/internal/option-nav.js +5 -5
  182. package/dist/internal/overlay-container.js +1 -1
  183. package/dist/internal/overlay.d.ts +3 -3
  184. package/dist/internal/overlay.js +8 -8
  185. package/dist/internal/password-strength.d.ts +2 -2
  186. package/dist/internal/password-strength.js +6 -6
  187. package/dist/internal/roving.d.ts +2 -2
  188. package/dist/internal/roving.js +3 -3
  189. package/dist/internal/scroll-lock.d.ts +1 -1
  190. package/dist/internal/scroll-lock.js +2 -2
  191. package/dist/internal/slot-children.d.ts +3 -3
  192. package/dist/internal/slot-children.js +4 -4
  193. package/dist/internal/slot.d.ts +3 -3
  194. package/dist/internal/slot.js +2 -2
  195. package/dist/internal/step.d.ts +3 -3
  196. package/dist/internal/step.js +4 -4
  197. package/dist/internal/tween.d.ts +5 -5
  198. package/dist/internal/tween.js +5 -5
  199. package/dist/internal/types.d.ts +2 -2
  200. package/dist/internal/use-breakpoint.d.ts +2 -2
  201. package/dist/internal/use-breakpoint.js +4 -4
  202. package/dist/internal/use-controllable-state.d.ts +1 -1
  203. package/dist/internal/use-controllable-state.js +3 -3
  204. package/dist/internal/use-id.d.ts +2 -2
  205. package/dist/internal/use-id.js +2 -2
  206. package/dist/internal/use-modal-focus.d.ts +1 -1
  207. package/dist/internal/use-modal-focus.js +3 -3
  208. package/dist/knob/knob.d.ts +4 -4
  209. package/dist/knob/knob.js +14 -10
  210. package/dist/knob/llms.txt +17 -12
  211. package/dist/listbox/listbox.d.ts +6 -6
  212. package/dist/listbox/listbox.js +9 -9
  213. package/dist/listbox/llms.txt +10 -10
  214. package/dist/loader/llms.txt +56 -0
  215. package/dist/loader/loader.d.ts +49 -0
  216. package/dist/loader/loader.js +68 -0
  217. package/dist/map/llms.txt +25 -22
  218. package/dist/map/map-create-dialog.d.ts +4 -4
  219. package/dist/map/map-create-dialog.js +10 -10
  220. package/dist/map/map-hours-field.d.ts +4 -4
  221. package/dist/map/map-hours-field.js +7 -7
  222. package/dist/map/map-image-field.d.ts +2 -2
  223. package/dist/map/map-image-field.js +4 -4
  224. package/dist/map/map-legend.d.ts +4 -4
  225. package/dist/map/map-legend.js +2 -2
  226. package/dist/map/map-poi-card.d.ts +3 -3
  227. package/dist/map/map-poi-card.js +9 -9
  228. package/dist/map/map-search.d.ts +17 -6
  229. package/dist/map/map-search.js +21 -18
  230. package/dist/map/map.d.ts +21 -14
  231. package/dist/map/map.js +30 -29
  232. package/dist/map/ports.d.ts +9 -9
  233. package/dist/map/ports.js +6 -6
  234. package/dist/map-entry/public-api.js +2 -2
  235. package/dist/megamenu/llms.txt +9 -9
  236. package/dist/megamenu/megamenu.d.ts +6 -6
  237. package/dist/megamenu/megamenu.js +10 -10
  238. package/dist/mention/llms.txt +15 -15
  239. package/dist/mention/mention.d.ts +5 -5
  240. package/dist/mention/mention.js +2 -2
  241. package/dist/mention/mentions.d.ts +1 -1
  242. package/dist/mention/mentions.js +1 -1
  243. package/dist/menu/llms.txt +12 -12
  244. package/dist/menu/menu-item.d.ts +4 -4
  245. package/dist/menu/menu-keys.d.ts +2 -2
  246. package/dist/menu/menu-keys.js +5 -5
  247. package/dist/menu/menu.d.ts +2 -2
  248. package/dist/menu/menu.js +6 -6
  249. package/dist/menubar/llms.txt +10 -10
  250. package/dist/menubar/menubar.d.ts +5 -5
  251. package/dist/menubar/menubar.js +10 -10
  252. package/dist/meter-group/llms.txt +12 -12
  253. package/dist/meter-group/meter-group.d.ts +2 -2
  254. package/dist/meter-group/meter-group.js +1 -1
  255. package/dist/motion/motion-context.d.ts +22 -0
  256. package/dist/motion/motion-context.js +28 -0
  257. package/dist/order-list/llms.txt +22 -10
  258. package/dist/order-list/order-list.d.ts +12 -4
  259. package/dist/order-list/order-list.js +104 -21
  260. package/dist/paginator/llms.txt +8 -8
  261. package/dist/paginator/paginator.js +1 -1
  262. package/dist/panel/llms.txt +25 -13
  263. package/dist/panel/panel.d.ts +11 -3
  264. package/dist/panel/panel.js +7 -4
  265. package/dist/password/llms.txt +16 -8
  266. package/dist/password/password.d.ts +2 -2
  267. package/dist/password/password.js +24 -3
  268. package/dist/peek/llms.txt +10 -10
  269. package/dist/peek/peek.d.ts +6 -6
  270. package/dist/peek/peek.js +7 -7
  271. package/dist/pick-list/llms.txt +33 -13
  272. package/dist/pick-list/pick-list.d.ts +12 -4
  273. package/dist/pick-list/pick-list.js +111 -23
  274. package/dist/popover/llms.txt +11 -11
  275. package/dist/popover/popover.d.ts +4 -4
  276. package/dist/popover/popover.js +5 -5
  277. package/dist/progress/llms.txt +17 -17
  278. package/dist/progress/progress.d.ts +7 -7
  279. package/dist/progress/progress.js +6 -6
  280. package/dist/public-api.d.ts +15 -3
  281. package/dist/public-api.js +13 -7
  282. package/dist/radio-group/llms.txt +13 -6
  283. package/dist/radio-group/radio-group.d.ts +11 -4
  284. package/dist/radio-group/radio-group.js +15 -7
  285. package/dist/rating/llms.txt +20 -13
  286. package/dist/rating/rating-pointer.d.ts +16 -0
  287. package/dist/rating/rating-pointer.js +26 -0
  288. package/dist/rating/rating.d.ts +6 -6
  289. package/dist/rating/rating.js +76 -12
  290. package/dist/rich-text/lists.d.ts +2 -2
  291. package/dist/rich-text/lists.js +7 -7
  292. package/dist/rich-text/llms.txt +26 -17
  293. package/dist/rich-text/rich-text.d.ts +12 -7
  294. package/dist/rich-text/rich-text.js +78 -54
  295. package/dist/rich-text/sanitize.d.ts +3 -3
  296. package/dist/rich-text/sanitize.js +12 -12
  297. package/dist/rich-text/tables.d.ts +3 -3
  298. package/dist/rich-text/tables.js +3 -3
  299. package/dist/roadmap/llms.txt +15 -15
  300. package/dist/roadmap/roadmap.d.ts +6 -6
  301. package/dist/roadmap/roadmap.js +19 -19
  302. package/dist/roadmap-entry/public-api.js +2 -2
  303. package/dist/scroll-top/llms.txt +6 -6
  304. package/dist/scroll-top/scroll-top.d.ts +1 -1
  305. package/dist/scroll-top/scroll-top.js +1 -1
  306. package/dist/select/llms.txt +19 -12
  307. package/dist/select/select.d.ts +8 -8
  308. package/dist/select/select.js +47 -21
  309. package/dist/shared/types.d.ts +5 -5
  310. package/dist/shared/types.js +1 -1
  311. package/dist/sidenav/llms.txt +9 -9
  312. package/dist/sidenav/sidenav.d.ts +1 -1
  313. package/dist/sidenav/sidenav.js +1 -1
  314. package/dist/skeleton/llms.txt +3 -3
  315. package/dist/skeleton/skeleton.d.ts +1 -1
  316. package/dist/skeleton/skeleton.js +1 -1
  317. package/dist/slider/llms.txt +32 -13
  318. package/dist/slider/slider-drag.d.ts +26 -0
  319. package/dist/slider/slider-drag.js +79 -0
  320. package/dist/slider/slider.d.ts +6 -5
  321. package/dist/slider/slider.js +27 -8
  322. package/dist/speech/llms.txt +97 -0
  323. package/dist/speech/speech-button.d.ts +44 -0
  324. package/dist/speech/speech-button.js +86 -0
  325. package/dist/speech/speech-wave.d.ts +19 -0
  326. package/dist/speech/speech-wave.js +16 -0
  327. package/dist/speech/use-speech-recognition.d.ts +81 -0
  328. package/dist/speech/use-speech-recognition.js +179 -0
  329. package/dist/speed-dial/llms.txt +14 -8
  330. package/dist/speed-dial/speed-dial.d.ts +1 -1
  331. package/dist/speed-dial/speed-dial.js +1 -1
  332. package/dist/spinner/llms.txt +7 -7
  333. package/dist/spinner/spinner.d.ts +1 -1
  334. package/dist/spinner/spinner.js +1 -1
  335. package/dist/split-button/llms.txt +21 -15
  336. package/dist/split-button/split-button.d.ts +2 -2
  337. package/dist/split-button/split-button.js +4 -4
  338. package/dist/splitter/llms.txt +11 -11
  339. package/dist/splitter/splitter.d.ts +3 -3
  340. package/dist/splitter/splitter.js +5 -5
  341. package/dist/stepper/llms.txt +33 -14
  342. package/dist/stepper/stepper.d.ts +6 -6
  343. package/dist/stepper/stepper.js +53 -10
  344. package/dist/switch/llms.txt +12 -5
  345. package/dist/switch/switch.d.ts +10 -3
  346. package/dist/switch/switch.js +12 -5
  347. package/dist/switch-group/llms.txt +9 -9
  348. package/dist/switch-group/switch-group.d.ts +4 -4
  349. package/dist/switch-group/switch-group.js +4 -4
  350. package/dist/tabs/llms.txt +10 -10
  351. package/dist/tabs/tabs.d.ts +5 -5
  352. package/dist/tabs/tabs.js +8 -8
  353. package/dist/textarea/llms.txt +23 -12
  354. package/dist/textarea/textarea.d.ts +19 -6
  355. package/dist/textarea/textarea.js +21 -7
  356. package/dist/timeline/llms.txt +4 -4
  357. package/dist/timeline/timeline.d.ts +1 -1
  358. package/dist/timeline/timeline.js +1 -1
  359. package/dist/toast/llms.txt +47 -17
  360. package/dist/toast/toast-container.d.ts +9 -3
  361. package/dist/toast/toast-container.js +17 -9
  362. package/dist/toast/toast-store.d.ts +40 -4
  363. package/dist/toast/toast-store.js +36 -1
  364. package/dist/toolbar/llms.txt +7 -7
  365. package/dist/toolbar/toolbar.d.ts +3 -3
  366. package/dist/toolbar/toolbar.js +2 -2
  367. package/dist/tooltip/llms.txt +10 -10
  368. package/dist/tooltip/tooltip.d.ts +3 -3
  369. package/dist/tooltip/tooltip.js +18 -18
  370. package/dist/tree/llms.txt +25 -12
  371. package/dist/tree/tree-keys.d.ts +5 -5
  372. package/dist/tree/tree-keys.js +7 -7
  373. package/dist/tree/tree.d.ts +14 -7
  374. package/dist/tree/tree.js +53 -18
  375. package/dist/update/llms.txt +54 -0
  376. package/dist/update/update.d.ts +49 -0
  377. package/dist/update/update.js +82 -0
  378. package/package.json +15 -13
package/README.md CHANGED
@@ -1,11 +1,11 @@
1
1
  <div align="center">
2
2
 
3
- <img src="https://ui.konce.pt/images/koncept_ui_lib.png" alt="Koncept UI — React component library" width="100%" />
3
+ <img src="https://ui.konce.pt/images/koncept_ui_lib.png" alt="Koncept UI - React component library" width="100%" />
4
4
 
5
- # Koncept UI — React
5
+ # Koncept UI - React
6
6
 
7
7
  **Open-source React 19 component library on the Koncept UI design system.**
8
- 80+ components sharing the exact CSS layer with the Angular port — zero runtime dependencies.
8
+ 80+ components sharing the exact CSS layer with the Angular port - zero runtime dependencies.
9
9
 
10
10
  [![npm version](https://img.shields.io/npm/v/@konce-pt/react?color=%233b82f6&label=npm)](https://www.npmjs.com/package/@konce-pt/react)
11
11
  [![npm downloads](https://img.shields.io/npm/dm/@konce-pt/react?color=%233b82f6)](https://www.npmjs.com/package/@konce-pt/react)
@@ -24,25 +24,25 @@
24
24
 
25
25
  ## Why Koncept UI React
26
26
 
27
- **Koncept UI** is a free, MIT-licensed design system. This package is its **React 19** port — not a
27
+ **Koncept UI** is a free, MIT-licensed design system. This package is its **React 19** port - not a
28
28
  lookalike, but the same rendering contract:
29
29
 
30
- - 🎯 **One CSS layer for both ports** — the same `kpt-*` classes, the same `--kpt-*` tokens, the same
30
+ - **One CSS layer for both ports** - the same `kpt-*` classes, the same `--kpt-*` tokens, the same
31
31
  `@layer kpt.*` ordering. The DOM tree matches the Angular port node for node, so an app can mix
32
32
  the two and nothing shifts by a pixel.
33
- - 📦 **Zero runtime dependencies** — no `clsx`, no `radix`, no CSS-in-JS. `cn`, `Slot` and
33
+ - **Zero runtime dependencies** - no `clsx`, no `radix`, no CSS-in-JS. `cn`, `Slot` and
34
34
  `composeRefs` ship with the package.
35
- - ⚛️ **React 19 native** — `ref` is a plain prop (no `forwardRef`), and every form control renders a
36
- native `name`/`form`, so `<form action={…}>` Actions and React Hook Form's `register()` work
35
+ - **React 19 native** - `ref` is a plain prop (no `forwardRef`), and every form control renders a
36
+ native `name`/`form`, so `<form action={...}>` Actions and React Hook Form's `register()` work
37
37
  **without an adapter**. Controls are usable controlled *and* uncontrolled.
38
- - 📊 **Flagship data table** — sorting, global and per-column filters, pagination, virtual scroll
38
+ - **Flagship data table** - sorting, global and per-column filters, pagination, virtual scroll
39
39
  (5000+ rows), selection, column reorder & freeze, inline editing, summary row, CSV export.
40
- - 🎨 **100% tokenized** — every style is a `var(--kpt-*)` custom property. Light/dark theme, neutral
40
+ - **100% tokenized** - every style is a `var(--kpt-*)` custom property. Light/dark theme, neutral
41
41
  OKLCH palette. Rebrand by swapping one token layer.
42
- - ♿ **Native elements first** — `<button>`, `<input>`, `<label>` wherever one exists, so keyboard and
42
+ - **Native elements first** - `<button>`, `<input>`, `<label>` wherever one exists, so keyboard and
43
43
  screen-reader behaviour comes from the platform. Invalid state travels on `aria-invalid`, never on
44
44
  a class.
45
- - 🌍 **i18n built in** — English (default) & Polish out of the box, runtime locale switch, add any
45
+ - **i18n built in** - English (default) & Polish out of the box, runtime locale switch, add any
46
46
  language with one JSON.
47
47
 
48
48
  ## Installation
@@ -54,11 +54,11 @@ npm i @konce-pt/react @konce-pt/tokens @konce-pt/styles
54
54
 
55
55
  `react` and `react-dom` (`^19.2`) are peers you already have. Optional extras:
56
56
 
57
- - [`@konce-pt/grid`](https://www.npmjs.com/package/@konce-pt/grid) — the mobile-first layout system;
57
+ - [`@konce-pt/grid`](https://www.npmjs.com/package/@konce-pt/grid) - the mobile-first layout system;
58
58
  its React components live in `@konce-pt/react/grid`.
59
- - [`@konce-pt/validators`](https://www.npmjs.com/package/@konce-pt/validators) — Polish-market
59
+ - [`@konce-pt/validators`](https://www.npmjs.com/package/@konce-pt/validators) - Polish-market
60
60
  validators (NIP, REGON, PESEL, IBAN, postal code).
61
- - `leaflet` (`^1.9`) — an **optional** peer, needed only by `@konce-pt/react/map`, loaded through a
61
+ - `leaflet` (`^1.9`) - an **optional** peer, needed only by `@konce-pt/react/map`, loaded through a
62
62
  dynamic `import()`.
63
63
 
64
64
  ## Setup
@@ -69,8 +69,8 @@ The package ships **JavaScript only**. Load the shared CSS layer once, in your a
69
69
  import '@konce-pt/tokens/css';
70
70
  import '@konce-pt/tokens/css/dark';
71
71
  import '@konce-pt/styles'; // reset, @layer ordering, theme
72
- import '@konce-pt/styles/components'; // the component layer — REQUIRED, this is what styles kpt-*
73
- import '@konce-pt/grid'; // optional — only if you use the layout classes
72
+ import '@konce-pt/styles/components'; // the component layer - REQUIRED, this is what styles kpt-*
73
+ import '@konce-pt/grid'; // optional - only if you use the layout classes
74
74
  ```
75
75
 
76
76
  `@konce-pt/styles/components` is generated from the same SCSS the Angular port compiles into its own
@@ -80,17 +80,17 @@ runtime; React has no other source for them, so this import is not optional.
80
80
  Dark theme: set `<html data-theme="dark">` (or rely on `prefers-color-scheme`).
81
81
 
82
82
  **Next.js App Router / Server Components:** every interactive component module starts with
83
- `'use client'`, so you can import components directly into a server component — no wrapper file.
83
+ `'use client'`, so you can import components directly into a server component - no wrapper file.
84
84
 
85
85
  > **No CDK here.** Components with a floating panel (`KptSelect`, `KptPopover`, `KptMenu`,
86
- > `KptAutocomplete`, `KptDatepicker`…) portal into `document.body` through the internal
87
- > `KptOverlay`, so `@angular/cdk/overlay-prebuilt.css` is **not** needed — positioning lives in the
86
+ > `KptAutocomplete`, `KptDatepicker`...) portal into `document.body` through the internal
87
+ > `KptOverlay`, so `@angular/cdk/overlay-prebuilt.css` is **not** needed - positioning lives in the
88
88
  > component, the look in `@konce-pt/styles/components`. Inside an open `KptDialog` those panels
89
89
  > portal into the `<dialog>` instead, because `showModal()` moves it to the browser top layer.
90
90
 
91
91
  ## Quick start
92
92
 
93
- A login form — controlled values, the error gated on touch, no form library required:
93
+ A login form - controlled values, the error gated on touch, no form library required:
94
94
 
95
95
  ```tsx
96
96
  import { useState } from 'react';
@@ -142,7 +142,7 @@ export function Login() {
142
142
 
143
143
  `KptFormField` generates the control id and publishes it through context, so `label[for]` and
144
144
  `input[id]` match with no configuration. Drop `value`/`onValueChange` and the field becomes
145
- uncontrolled — the value lives in the DOM, and a native `<form action={…}>` or React Hook Form's
145
+ uncontrolled - the value lives in the DOM, and a native `<form action={...}>` or React Hook Form's
146
146
  `register()` picks it up as-is.
147
147
 
148
148
  Data table with sorting, filtering, pagination and a custom cell:
@@ -168,7 +168,7 @@ Data table with sorting, filtering, pagination and a custom cell:
168
168
  | --- | --- |
169
169
  | **Forms** | `KptInput`, `KptTextarea`, `KptSelect`, `KptAutocomplete`, `KptCheckbox`, `KptSwitch`, `KptSwitchGroup`, `KptRadioGroup`, `KptSlider`, `KptRating`, `KptDatepicker`, `KptDateRange`, `KptClock`, `KptColorPicker`, `KptFileUpload`, `KptInputNumber`, `KptPassword`, `KptInputOtp`, `KptChipsInput`, `KptInputMask`, `KptListbox`, `KptKnob`, `KptRichText`, `KptFormField` |
170
170
  | **Buttons & actions** | `KptButton`, `KptIconButton`, `KptButtonGroup`, `KptFab`, `KptSplitButton`, `KptSpeedDial` |
171
- | **Layout** | `KptAppShell`, `KptToolbar`, `KptSidenav`, `KptCard` (+ `Header`, `Footer`, `Media`, `Title`…), `KptDivider`, `KptPanel`, `KptFieldset`, `KptSplitter`, `KptScrollTop` |
171
+ | **Layout** | `KptAppShell`, `KptToolbar`, `KptSidenav`, `KptCard` (+ `Header`, `Footer`, `Media`, `Title`...), `KptDivider`, `KptPanel`, `KptFieldset`, `KptSplitter`, `KptScrollTop` |
172
172
  | **Navigation** | `KptTabs`, `KptAccordion`, `KptBreadcrumb`, `KptStepper`, `KptMenu`, `KptMenubar`, `KptMegamenu`, `KptContextMenu` |
173
173
  | **Data** | `KptDataTable`, `KptPaginator`, `KptTree`, `KptTimeline`, `KptCarousel`, `KptDataView`, `KptPickList`, `KptOrderList`, `KptGalleria`, `KptMeterGroup` |
174
174
  | **Feedback & overlay** | `KptAlert`, `KptDialog`, `kptToast` + `KptToastContainer`, `KptTooltip`, `KptPopover`, `KptDrawer`, `KptBottomSheet`, `kptConfirm`, `KptBadge`, `KptChip`, `KptAvatar`, `KptAvatarGroup`, `KptSpinner`, `KptProgress`, `KptSkeleton`, `KptEmpty`, `KptImage`, `KptAuth` |
@@ -179,7 +179,7 @@ entry point stays small. Every component ships an `llms.txt` API sheet next to i
179
179
 
180
180
  ## Theming
181
181
 
182
- All visuals are driven by `var(--kpt-*)` tokens (three tiers: primitives → semantic → component).
182
+ All visuals are driven by `var(--kpt-*)` tokens (three tiers: primitives -> semantic -> component).
183
183
  Override them in a stylesheet imported **after** `@konce-pt/styles`:
184
184
 
185
185
  ```css
@@ -192,41 +192,41 @@ Override them in a stylesheet imported **after** `@konce-pt/styles`:
192
192
  }
193
193
  ```
194
194
 
195
- **Common token names:** surfaces `--kpt-color-surface`, `--kpt-color-surface-sunken|raised|variant|hover|selected`; text `--kpt-color-on-surface`, `--kpt-color-on-surface-muted` (aliases `--kpt-color-text`, `--kpt-color-text-muted|subtle|inverse`); borders `--kpt-color-border`, `--kpt-color-border-strong`; accent roles in full — `{primary,danger,success,warning,info}` each with `-hover`, `-contrast`, `-subtle`, `-border`; radii `--kpt-radius-sm|md|lg|xl|full|none`; elevation `--kpt-elevation-1..4` (aliases `--kpt-shadow-sm|md|lg`). There is no `--kpt-color-bg`.
195
+ **Common token names:** surfaces `--kpt-color-surface`, `--kpt-color-surface-sunken|raised|variant|hover|selected`; text `--kpt-color-on-surface`, `--kpt-color-on-surface-muted` (aliases `--kpt-color-text`, `--kpt-color-text-muted|subtle|inverse`); borders `--kpt-color-border`, `--kpt-color-border-strong`; accent roles in full - `{primary,danger,success,warning,info}` each with `-hover`, `-contrast`, `-subtle`, `-border`; radii `--kpt-radius-sm|md|lg|xl|full|none`; elevation `--kpt-elevation-1..4` (aliases `--kpt-shadow-sm|md|lg`). There is no `--kpt-color-bg`.
196
196
 
197
197
  Variants and sizes travel on `data-*` attributes (`data-variant`, `data-size`), never on modifier
198
- classes — that is what the SCSS reads.
198
+ classes - that is what the SCSS reads.
199
199
 
200
200
  ## Icons
201
201
 
202
- **84 icons are built in and need no configuration** — what the components themselves draw plus the
202
+ **84 icons are built in and need no configuration** - what the components themselves draw plus the
203
203
  staples of an application shell (`sun`, `moon`, `bell`, `settings`, `users`, `logout`,
204
- `layout-dashboard`, `home`, `activity`, `chart-bar`, `brand-github` …). A typical admin panel needs
204
+ `layout-dashboard`, `home`, `activity`, `chart-bar`, `brand-github` ...). A typical admin panel needs
205
205
  nothing else.
206
206
 
207
207
  For the full **Tabler Icons** set (MIT, 5130 icons) there are two paths, and the difference is the
208
208
  bundle. Every icon is its own export, so importing by name lets the bundler keep just those:
209
209
 
210
210
  ```tsx
211
- // Production — two icons reach the bundle.
211
+ // Production - two icons reach the bundle.
212
212
  import { LayoutDashboard, Rocket } from '@konce-pt/react/icons';
213
213
  import { registerKptIcons } from '@konce-pt/react';
214
214
  registerKptIcons([LayoutDashboard, Rocket]);
215
215
 
216
- // Prototype — every icon, about 1.2 MB.
216
+ // Prototype - every icon, about 1.2 MB.
217
217
  import { registerKptTablerIcons } from '@konce-pt/react/icons';
218
218
  registerKptTablerIcons();
219
219
  ```
220
220
 
221
221
  `registerKptIcons` is the one that shrinks: it takes the data as an argument and imports nothing from
222
222
  the Tabler subpath. For the same reason `registerKptIcons(tabler)` with a namespace import
223
- (`import * as tabler`) registers everything — a namespace object handed to a function blocks static
223
+ (`import * as tabler`) registers everything - a namespace object handed to a function blocks static
224
224
  analysis. The registry is global, so one call at the app entry is enough; no provider needed.
225
225
 
226
226
  ## Internationalization (i18n)
227
227
 
228
228
  Component labels ship in **English (default)** and **Polish**. Without a provider everything renders
229
- in English — a missing provider is never an error. `KptI18nProvider` sets the language for a subtree:
229
+ in English - a missing provider is never an error. `KptI18nProvider` sets the language for a subtree:
230
230
 
231
231
  ```tsx
232
232
  import { KptI18nProvider, useKptI18n } from '@konce-pt/react';
@@ -258,7 +258,7 @@ English):
258
258
  ```tsx
259
259
  import de from './i18n/de.json';
260
260
 
261
- <KptI18nProvider locale="de" messages={{ de }}>…</KptI18nProvider>
261
+ <KptI18nProvider locale="de" messages={{ de }}>...</KptI18nProvider>
262
262
  ```
263
263
 
264
264
  Any component with labels also accepts `locale` and `dictionary` props, which take priority over the
@@ -266,19 +266,52 @@ provider. Calendar weekday/month names come from the browser's `Intl` API. The c
266
266
  dictionaries live in [`@konce-pt/i18n`](https://www.npmjs.com/package/@konce-pt/i18n), shared with
267
267
  the Angular port.
268
268
 
269
+ ## Motion
270
+
271
+ Components animate out of the box - springs, smooth layout changes, enter and exit - with **no provider**.
272
+ `KptMotionProvider` sets app-wide defaults: whether motion is on at all and which kind each group of
273
+ components gets. Every prop is optional; it writes to `<html>`, so overlays in portals follow it too.
274
+
275
+ ```tsx
276
+ import { KptMotionProvider } from '@konce-pt/react';
277
+
278
+ export function App() {
279
+ return (
280
+ <KptMotionProvider layout="arc" enter="fade">
281
+ <Routes />
282
+ </KptMotionProvider>
283
+ );
284
+ }
285
+
286
+ // <KptMotionProvider enabled={false}> - no motion at all (visual tests, kiosk)
287
+ ```
288
+
289
+ | Key | Values | Components (per-component input) |
290
+ | --- | --- | --- |
291
+ | `enabled` | `true` \| `false` | All. `false` also zeroes CSS durations (`data-kpt-motion="off"`, `--kpt-motion-scale: 0` on `<html>`); loading indicators slow down instead of stopping |
292
+ | `layout` | `spring` \| `arc` \| `morph` \| `none` | DataView, PickList, OrderList (`layoutMotion`) |
293
+ | `collapse` | `spring` \| `fade` \| `none` | Accordion, Fieldset, Panel, Tree (`collapseMotion`) |
294
+ | `enter` | `spring` \| `fade` \| `none` | Chat, ChatMessage, ChatDock, FormField (`enterMotion`); Password meter, ChipsInput and Select chips |
295
+ | `toggle` | `spring` \| `fade` \| `none` | Checkbox, RadioGroup, Switch (`toggleMotion`); Rating stars, ButtonGroup selection |
296
+
297
+ Precedence: `enabled: false` always wins, then the component's own prop, then the provider value,
298
+ then `spring`. Small reactions (button press, field focus and error, slider handle) are plain CSS and follow
299
+ only `enabled`. The system "reduce motion" setting is always respected. The same springs and FLIP helpers
300
+ are available for your own views in [`@konce-pt/motion`](https://www.npmjs.com/package/@konce-pt/motion).
301
+
269
302
  ## Helpers
270
303
 
271
- - `cn(...values)` — class-name joining (the `clsx` role, no dependency).
272
- - `Slot` + the `asChild` prop — render as another element while keeping classes and attributes.
273
- - `composeRefs(...refs)` — merge several refs into one callback.
304
+ - `cn(...values)` - class-name joining (the `clsx` role, no dependency).
305
+ - `Slot` + the `asChild` prop - render as another element while keeping classes and attributes.
306
+ - `composeRefs(...refs)` - merge several refs into one callback.
274
307
 
275
308
  ## Documentation
276
309
 
277
- - **Playground** — live demos with copyable code: [ui.konce.pt/react](https://ui.konce.pt/react).
278
- - **`llms.txt`** — LLM-friendly API sheets per component, shipped inside the package; the
310
+ - **Playground** - live demos with copyable code: [ui.konce.pt/react](https://ui.konce.pt/react).
311
+ - **`llms.txt`** - LLM-friendly API sheets per component, shipped inside the package; the
279
312
  package-wide sheet lives at [ui.konce.pt/llms/react/llms.txt](https://ui.konce.pt/llms/react/llms.txt)
280
313
  (PL mirror: [llms-pl.txt](https://ui.konce.pt/llms/react/llms-pl.txt)).
281
- - **Security scanners** — Socket.dev and similar tools flag i18n keys as domain names
314
+ - **Security scanners** - Socket.dev and similar tools flag i18n keys as domain names
282
315
  (`.email`, `.today` and friends are real TLDs) and the map's default endpoints; the
283
316
  [project sheet](https://ui.konce.pt/llms.txt) explains each alert under "Security scanners".
284
317
  - Repository: [gitlab.com/konce-pt/koncept-ui](https://gitlab.com/konce-pt/koncept-ui)
@@ -291,24 +324,24 @@ MIT © konce.pt
291
324
 
292
325
  <div align="center">
293
326
 
294
- ## 🇵🇱 Wersja polska
327
+ ## Wersja polska
295
328
 
296
329
  </div>
297
330
 
298
331
  **Koncept UI** to darmowy system projektowy na licencji **MIT**. Ta paczka to jego port na
299
- **Reacta 19** — nie podobnie wyglądający zamiennik, tylko ten sam kontrakt renderowania.
332
+ **Reacta 19** - nie podobnie wyglądający zamiennik, tylko ten sam kontrakt renderowania.
300
333
 
301
- - 🎯 **Jedna warstwa CSS dla obu portów** — te same klasy `kpt-*`, te same tokeny `--kpt-*`, ta sama
334
+ - **Jedna warstwa CSS dla obu portów** - te same klasy `kpt-*`, te same tokeny `--kpt-*`, ta sama
302
335
  kolejność `@layer kpt.*`. Drzewo DOM odpowiada wersji Angulara węzeł w węzeł.
303
- - 📦 **Zero zależności runtime** — `cn`, `Slot` i `composeRefs` są w paczce.
304
- - ⚛️ **React 19** — `ref` jako zwykły prop (bez `forwardRef`), kontrolki działają kontrolowane
336
+ - **Zero zależności runtime** - `cn`, `Slot` i `composeRefs` są w paczce.
337
+ - **React 19** - `ref` jako zwykły prop (bez `forwardRef`), kontrolki działają kontrolowane
305
338
  i niekontrolowane, z natywnym `name`/`form` (React 19 Actions i React Hook Form bez adaptera).
306
- - 📊 **Flagowa tabela danych** — sortowanie, filtry globalne i kolumnowe, paginacja, virtual scroll,
339
+ - **Flagowa tabela danych** - sortowanie, filtry globalne i kolumnowe, paginacja, virtual scroll,
307
340
  zaznaczanie, przestawianie i zamrażanie kolumn, edycja w miejscu, podsumowanie, eksport CSV.
308
- - 🎨 **100% na tokenach** — każdy styl to `var(--kpt-*)`. Motyw jasny/ciemny, neutralna paleta OKLCH.
309
- - ♿ **Natywne elementy** — `<button>`, `<input>`, `<label>` wszędzie tam, gdzie istnieją; stan błędu
341
+ - **100% na tokenach** - każdy styl to `var(--kpt-*)`. Motyw jasny/ciemny, neutralna paleta OKLCH.
342
+ - **Natywne elementy** - `<button>`, `<input>`, `<label>` wszędzie tam, gdzie istnieją; stan błędu
310
343
  na `aria-invalid`, nie na klasie.
311
- - 🌍 **Wbudowane i18n** — angielski (domyślny) i polski, przełączanie w runtime, dowolny język
344
+ - **Wbudowane i18n** - angielski (domyślny) i polski, przełączanie w runtime, dowolny język
312
345
  jednym plikiem JSON.
313
346
 
314
347
  ### Instalacja
@@ -319,7 +352,7 @@ npm i @konce-pt/react @konce-pt/tokens @konce-pt/styles
319
352
 
320
353
  `react` i `react-dom` (`^19.2`) to peery, które masz już w aplikacji. Opcjonalnie:
321
354
  `@konce-pt/grid` (układ; komponenty w `@konce-pt/react/grid`), `@konce-pt/validators`
322
- (walidatory PL: NIP, REGON, PESEL, IBAN, kod pocztowy) oraz `leaflet` (`^1.9`) — **opcjonalny**
355
+ (walidatory PL: NIP, REGON, PESEL, IBAN, kod pocztowy) oraz `leaflet` (`^1.9`) - **opcjonalny**
323
356
  peer, potrzebny wyłącznie dla `@konce-pt/react/map`.
324
357
 
325
358
  ### Konfiguracja
@@ -330,55 +363,55 @@ Paczka wysyła **sam JavaScript**. CSS ładujesz raz, w wejściu aplikacji:
330
363
  import '@konce-pt/tokens/css';
331
364
  import '@konce-pt/tokens/css/dark';
332
365
  import '@konce-pt/styles'; // reset, kolejność warstw, motyw
333
- import '@konce-pt/styles/components'; // warstwa komponentów — WYMAGANE, to ona styluje kpt-*
334
- import '@konce-pt/grid'; // opcjonalnie — klasy układu
366
+ import '@konce-pt/styles/components'; // warstwa komponentów - WYMAGANE, to ona styluje kpt-*
367
+ import '@konce-pt/grid'; // opcjonalnie - klasy układu
335
368
  ```
336
369
 
337
370
  `@konce-pt/styles/components` powstaje z tego samego SCSS-a, który port Angulara kompiluje do
338
- własnego bundla — stąd identyczny wygląd obu portów. Angular wstrzykuje te style w runtime, React
371
+ własnego bundla - stąd identyczny wygląd obu portów. Angular wstrzykuje te style w runtime, React
339
372
  nie ma dla nich innego źródła, więc ten import nie jest opcjonalny.
340
373
 
341
374
  Motyw ciemny: `<html data-theme="dark">` (albo `prefers-color-scheme`). Nadpisania `--kpt-color-*`
342
375
  w arkuszu importowanym **po** `@konce-pt/styles`.
343
376
 
344
377
  **Next.js App Router / Server Components:** każdy moduł interaktywnego komponentu zaczyna się od
345
- `'use client'`, więc komponenty importujesz wprost do komponentu serwerowego — bez pliku-opakowania.
378
+ `'use client'`, więc komponenty importujesz wprost do komponentu serwerowego - bez pliku-opakowania.
346
379
 
347
380
  > **CDK nie jest tu potrzebny.** Komponenty z panelem (`KptSelect`, `KptPopover`, `KptMenu`,
348
- > `KptAutocomplete`, `KptDatepicker`…) renderują go przez wewnętrzny `KptOverlay` do portalu na
381
+ > `KptAutocomplete`, `KptDatepicker`...) renderują go przez wewnętrzny `KptOverlay` do portalu na
349
382
  > `document.body`, więc `@angular/cdk/overlay-prebuilt.css` nie jest wymagany. W otwartym
350
383
  > `KptDialog` panel trafia do `<dialog>`, bo `showModal()` przenosi go do górnej warstwy przeglądarki.
351
384
 
352
385
  ### Ikony
353
386
 
354
- **84 ikony są wbudowane i nie wymagają konfiguracji** — to, co rysują same komponenty, plus staple
387
+ **84 ikony są wbudowane i nie wymagają konfiguracji** - to, co rysują same komponenty, plus staple
355
388
  powłoki aplikacji (`sun`, `moon`, `bell`, `settings`, `users`, `logout`, `layout-dashboard`,
356
- `home`, `activity`, `chart-bar`, `brand-github`…). Typowy panel administracyjny nie potrzebuje nic
389
+ `home`, `activity`, `chart-bar`, `brand-github`...). Typowy panel administracyjny nie potrzebuje nic
357
390
  więcej.
358
391
 
359
392
  Pełny zestaw **Tabler Icons** (MIT, 5130 ikon) ma dwie ścieżki, a różnica jest w bundlu. Każda ikona
360
393
  jest osobnym eksportem, więc import po nazwie zostawia w bundlu wyłącznie użyte:
361
394
 
362
395
  ```tsx
363
- // Produkcja — do bundla wchodzą dwie ikony.
396
+ // Produkcja - do bundla wchodzą dwie ikony.
364
397
  import { LayoutDashboard, Rocket } from '@konce-pt/react/icons';
365
398
  import { registerKptIcons } from '@konce-pt/react';
366
399
  registerKptIcons([LayoutDashboard, Rocket]);
367
400
 
368
- // Prototyp — wszystkie ikony, około 1,2 MB.
401
+ // Prototyp - wszystkie ikony, około 1,2 MB.
369
402
  import { registerKptTablerIcons } from '@konce-pt/react/icons';
370
403
  registerKptTablerIcons();
371
404
  ```
372
405
 
373
406
  To `registerKptIcons` odchudza, bo przyjmuje dane argumentem i sam nie importuje pełnego zestawu.
374
407
  Z tego samego powodu `registerKptIcons(tabler)` z importem przestrzeni nazw (`import * as tabler`)
375
- rejestruje komplet — namespace przekazany do funkcji blokuje analizę statyczną. Rejestr jest
408
+ rejestruje komplet - namespace przekazany do funkcji blokuje analizę statyczną. Rejestr jest
376
409
  globalny, więc wystarczy jedno wywołanie w wejściu aplikacji.
377
410
 
378
411
  ### Internacjonalizacja (i18n)
379
412
 
380
413
  Etykiety są dostępne po **angielsku (domyślnie)** i **polsku**. Bez providera wszystko renderuje się
381
- po angielsku — brak providera nigdy nie jest błędem. `<KptI18nProvider locale="pl">` ustawia język
414
+ po angielsku - brak providera nigdy nie jest błędem. `<KptI18nProvider locale="pl">` ustawia język
382
415
  dla poddrzewa, `useKptI18n()` zwraca `{ locale, setLocale, messages, messagesFor, t }`, a
383
416
  `t('paginator.range', { start: 1, end: 10, total: 42 })` interpoluje `{nazwa}` i spada na EN, potem
384
417
  na sam klucz.
@@ -389,17 +422,42 @@ na EN):
389
422
  ```tsx
390
423
  import de from './i18n/de.json';
391
424
 
392
- <KptI18nProvider locale="de" messages={{ de }}>…</KptI18nProvider>
425
+ <KptI18nProvider locale="de" messages={{ de }}>...</KptI18nProvider>
393
426
  ```
394
427
 
395
428
  Propsy `locale` i `dictionary` na komponencie mają priorytet nad providerem. Nazwy dni i miesięcy
396
429
  w kalendarzach pochodzą z `Intl`. Kontrakt i słowniki żyją w `@konce-pt/i18n`, wspólnym z portem
397
430
  Angulara.
398
431
 
432
+ ### Animacje
433
+
434
+ Komponenty animują się od razu - sprężyny, płynne zmiany układu, wejścia i wyjścia - **bez providera**.
435
+ `KptMotionProvider` ustawia wartości domyślne dla całej aplikacji: czy ruch w ogóle jest włączony i jaki
436
+ rodzaj dostaje każda grupa komponentów. Każdy prop jest opcjonalny; provider pisze do `<html>`, więc
437
+ nakładki w portalach też go słuchają.
438
+
439
+ ```tsx
440
+ <KptMotionProvider layout="arc" enter="fade">...</KptMotionProvider>
441
+ <KptMotionProvider enabled={false}>...</KptMotionProvider> {/* bez ruchu (testy wizualne, kiosk) */}
442
+ ```
443
+
444
+ | Klucz | Wartości | Komponenty (input per komponent) |
445
+ | --- | --- | --- |
446
+ | `enabled` | `true` \| `false` | Wszystkie. `false` zeruje też czasy w CSS (`data-kpt-motion="off"`, `--kpt-motion-scale: 0` na `<html>`); wskaźniki ładowania zwalniają zamiast stanąć |
447
+ | `layout` | `spring` \| `arc` \| `morph` \| `none` | DataView, PickList, OrderList (`layoutMotion`) |
448
+ | `collapse` | `spring` \| `fade` \| `none` | Accordion, Fieldset, Panel, Tree (`collapseMotion`) |
449
+ | `enter` | `spring` \| `fade` \| `none` | Chat, ChatMessage, ChatDock, FormField (`enterMotion`); miernik hasła, chipy ChipsInput i Select |
450
+ | `toggle` | `spring` \| `fade` \| `none` | Checkbox, RadioGroup, Switch (`toggleMotion`); gwiazdki Rating, wybór ButtonGroup |
451
+
452
+ Pierwszeństwo: `enabled: false` wygrywa zawsze, potem prop samego komponentu, potem wartość z providera,
453
+ a na końcu `spring`. Drobne reakcje (wciśnięcie przycisku, fokus i błąd pola, uchwyt suwaka) to czysty CSS
454
+ i idą tylko za `enabled`. Systemowe "ogranicz ruch" jest respektowane zawsze. Te same sprężyny i pomocniki
455
+ FLIP dla własnych widoków są w [`@konce-pt/motion`](https://www.npmjs.com/package/@konce-pt/motion).
456
+
399
457
  ### Komponenty (80+)
400
458
 
401
459
  Formularze, przyciski i akcje, layout, nawigacja, dane (z flagową `KptDataTable`), feedback
402
- i overlay — pełna lista w tabeli powyżej. Ciężkie rzeczy (wykresy, czat, roadmapa, mapy, pełny Tabler)
460
+ i overlay - pełna lista w tabeli powyżej. Ciężkie rzeczy (wykresy, czat, roadmapa, mapy, pełny Tabler)
403
461
  siedzą w subpathach `@konce-pt/react/{charts,chat,roadmap,grid,map,icons}`, żeby nie obciążać rdzenia.
404
462
  Każdy komponent ma obok źródła plik `llms.txt` z opisem API.
405
463
 
@@ -410,8 +468,8 @@ Playground z demami: [ui.konce.pt/react](https://ui.konce.pt/react). Opisy API d
410
468
  [`llms-pl.txt`](https://ui.konce.pt/llms/react/llms-pl.txt) (PL). Repozytorium:
411
469
  [gitlab.com/konce-pt/koncept-ui](https://gitlab.com/konce-pt/koncept-ui).
412
470
 
413
- Alerty skanerów łańcucha dostaw (Socket.dev i podobne) — klucze i18n czytane jak domeny
414
- oraz domyślne endpointy mapy — omawia sekcja „Skanery bezpieczeństwa" w
471
+ Alerty skanerów łańcucha dostaw (Socket.dev i podobne) - klucze i18n czytane jak domeny
472
+ oraz domyślne endpointy mapy - omawia sekcja "Skanery bezpieczeństwa" w
415
473
  [arkuszu projektu](https://ui.konce.pt/llms-pl.txt).
416
474
 
417
475
  ### Licencja
@@ -1,9 +1,17 @@
1
1
  import { type ComponentPropsWithRef, type ReactNode } from 'react';
2
+ import { type KptCollapseMotion } from '@konce-pt/motion';
2
3
  export interface KptAccordionProps extends ComponentPropsWithRef<'div'> {
3
4
  /** Pozwala trzymać otwartych wiele paneli naraz. */
4
5
  multi?: boolean;
5
6
  animated?: boolean;
6
7
  animationDuration?: number;
8
+ /**
9
+ * Ruch zwijania: `spring` - wysokość na sprężynie, treść wjeżdża i wyostrza się, przy zwijaniu
10
+ * najpierw gaśnie; `fade` - treść się przenika; `none` - bez ruchu. Bez wartości bierze `collapse`
11
+ * z `KptMotionProvider` (domyślnie `spring`); `animated={false}`, `enabled={false}` i systemowe
12
+ * "ogranicz ruch" wyłączają go zawsze.
13
+ */
14
+ collapseMotion?: KptCollapseMotion;
7
15
  /** Indeksy otwartych paneli. */
8
16
  openIndexes?: number[];
9
17
  defaultOpenIndexes?: number[];
@@ -11,19 +19,19 @@ export interface KptAccordionProps extends ComponentPropsWithRef<'div'> {
11
19
  children?: ReactNode;
12
20
  }
13
21
  /**
14
- * Akordeon — grupa rozwijanych paneli. `multi` pozwala otworzyć wiele naraz.
22
+ * Akordeon - grupa rozwijanych paneli. `multi` pozwala otworzyć wiele naraz.
15
23
  *
16
- * Stan otwarcia trzyma akordeon, a panele dostają swój indeks przez klonowanie — inaczej
24
+ * Stan otwarcia trzyma akordeon, a panele dostają swój indeks przez klonowanie - inaczej
17
25
  * pojedynczy tryb nie miałby jak zamknąć rodzeństwa. Panel użyty samodzielnie, poza akordeonem,
18
26
  * zarządza sobą sam.
19
27
  *
20
28
  * @example
21
29
  * <KptAccordion>
22
- * <KptAccordion.Panel title="Sekcja 1">…</KptAccordion.Panel>
23
- * <KptAccordion.Panel title="Sekcja 2">…</KptAccordion.Panel>
30
+ * <KptAccordion.Panel title="Sekcja 1">...</KptAccordion.Panel>
31
+ * <KptAccordion.Panel title="Sekcja 2">...</KptAccordion.Panel>
24
32
  * </KptAccordion>
25
33
  */
26
- export declare function KptAccordion({ multi, animated, animationDuration, openIndexes, defaultOpenIndexes, onOpenIndexesChange, className, children, ...rest }: Readonly<KptAccordionProps>): import("react").JSX.Element;
34
+ export declare function KptAccordion({ multi, animated, animationDuration, collapseMotion, openIndexes, defaultOpenIndexes, onOpenIndexesChange, className, children, ...rest }: Readonly<KptAccordionProps>): import("react").JSX.Element;
27
35
  export declare namespace KptAccordion {
28
36
  var Panel: typeof KptAccordionPanel;
29
37
  }
@@ -34,7 +42,7 @@ export interface KptAccordionPanelProps extends Omit<ComponentPropsWithRef<'div'
34
42
  expanded?: boolean;
35
43
  defaultExpanded?: boolean;
36
44
  onExpandedChange?: (expanded: boolean) => void;
37
- /** Wstawiany przez akordeon — nie podawaj ręcznie. */
45
+ /** Wstawiany przez akordeon - nie podawaj ręcznie. */
38
46
  index?: number;
39
47
  children?: ReactNode;
40
48
  }
@@ -6,21 +6,24 @@ import { slotChildren } from "../internal/slot-children.js";
6
6
  import { useControllableState } from "../internal/use-controllable-state.js";
7
7
  import { useKptId } from "../internal/use-id.js";
8
8
  import { KptIcon } from "../icon/icon.js";
9
+ import { resolveCollapseMotion } from '@konce-pt/motion';
10
+ import { useKptMotion } from "../motion/motion-context.js";
9
11
  const AccordionContext = createContext(null);
10
12
  /**
11
- * Akordeon — grupa rozwijanych paneli. `multi` pozwala otworzyć wiele naraz.
13
+ * Akordeon - grupa rozwijanych paneli. `multi` pozwala otworzyć wiele naraz.
12
14
  *
13
- * Stan otwarcia trzyma akordeon, a panele dostają swój indeks przez klonowanie — inaczej
15
+ * Stan otwarcia trzyma akordeon, a panele dostają swój indeks przez klonowanie - inaczej
14
16
  * pojedynczy tryb nie miałby jak zamknąć rodzeństwa. Panel użyty samodzielnie, poza akordeonem,
15
17
  * zarządza sobą sam.
16
18
  *
17
19
  * @example
18
20
  * <KptAccordion>
19
- * <KptAccordion.Panel title="Sekcja 1">…</KptAccordion.Panel>
20
- * <KptAccordion.Panel title="Sekcja 2">…</KptAccordion.Panel>
21
+ * <KptAccordion.Panel title="Sekcja 1">...</KptAccordion.Panel>
22
+ * <KptAccordion.Panel title="Sekcja 2">...</KptAccordion.Panel>
21
23
  * </KptAccordion>
22
24
  */
23
- export function KptAccordion({ multi = false, animated = true, animationDuration = 500, openIndexes, defaultOpenIndexes = [], onOpenIndexesChange, className, children, ...rest }) {
25
+ export function KptAccordion({ multi = false, animated = true, animationDuration = 500, collapseMotion, openIndexes, defaultOpenIndexes = [], onOpenIndexesChange, className, children, ...rest }) {
26
+ const motionConfig = useKptMotion();
24
27
  const [open, setOpen] = useControllableState({
25
28
  value: openIndexes,
26
29
  defaultValue: defaultOpenIndexes,
@@ -35,6 +38,7 @@ export function KptAccordion({ multi = false, animated = true, animationDuration
35
38
  setOpen(multi ? [...open, index] : [index]);
36
39
  },
37
40
  animMs: `${animated ? animationDuration : 0}ms`,
41
+ motion: resolveCollapseMotion(collapseMotion, motionConfig, animated),
38
42
  };
39
43
  // Indeks panelu = liczba paneli przed nim; fragmenty rozwinięte, więc panel z warunku też się liczy.
40
44
  const items = slotChildren(children);
@@ -48,6 +52,9 @@ export function KptAccordion({ multi = false, animated = true, animationDuration
48
52
  /** Panel akordeonu. Umieszczaj w `<KptAccordion>` albo używaj samodzielnie. */
49
53
  export function KptAccordionPanel({ title, disabled = false, expanded, defaultExpanded = false, onExpandedChange, index, className, style, children, ...rest }) {
50
54
  const accordion = useContext(AccordionContext);
55
+ const motionConfig = useKptMotion();
56
+ // Panel poza akordeonem zachowuje się jak w akordeonie z domyślną konfiguracją.
57
+ const motion = accordion?.motion ?? resolveCollapseMotion(undefined, motionConfig);
51
58
  const uid = useKptId(undefined, 'kpt-accordion');
52
59
  const headerId = `${uid}-header`;
53
60
  const bodyId = `${uid}-body`;
@@ -68,8 +75,8 @@ export function KptAccordionPanel({ title, disabled = false, expanded, defaultEx
68
75
  setStandalone(willOpen);
69
76
  onExpandedChange?.(willOpen);
70
77
  };
71
- return (_jsx("div", { className: cn('kpt-accordion-panel-host', className), style: { ['--kpt-anim-duration']: accordion?.animMs ?? '500ms', ...style }, ...rest, children: _jsxs("div", { className: cn('kpt-accordion-panel', isOpen && 'is-open'), children: [_jsxs("button", { type: "button", className: "kpt-accordion-panel__header", id: headerId, "aria-expanded": isOpen, "aria-controls": bodyId, disabled: disabled, onClick: toggle, children: [_jsx("span", { className: "kpt-accordion-panel__title", children: title }), _jsx(KptIcon, { name: "chevron-down", className: cn('kpt-accordion-panel__chevron', isOpen && 'is-open') })] }), _jsx("div", { className: cn('kpt-accordion-panel__collapse', isOpen && 'is-open'),
72
- // Treść to region nazwany nagłówkiem — czytnik ogłasza nie tylko stan, ale i to, czego dotyczy.
78
+ return (_jsx("div", { className: cn('kpt-accordion-panel-host', className), style: { ['--kpt-anim-duration']: accordion?.animMs ?? '500ms', ...style }, ...rest, children: _jsxs("div", { className: cn('kpt-accordion-panel', isOpen && 'is-open'), "data-motion": motion, children: [_jsxs("button", { type: "button", className: "kpt-accordion-panel__header", id: headerId, "aria-expanded": isOpen, "aria-controls": bodyId, disabled: disabled, onClick: toggle, children: [_jsx("span", { className: "kpt-accordion-panel__title", children: title }), _jsx(KptIcon, { name: "chevron-down", className: cn('kpt-accordion-panel__chevron', isOpen && 'is-open') })] }), _jsx("div", { className: cn('kpt-accordion-panel__collapse', isOpen && 'is-open'),
79
+ // Treść to region nazwany nagłówkiem - czytnik ogłasza nie tylko stan, ale i to, czego dotyczy.
73
80
  role: "region", id: bodyId, "aria-labelledby": headerId, inert: !isOpen, children: _jsx("div", { className: "kpt-accordion-panel__collapse-inner", children: _jsx("div", { className: "kpt-accordion-panel__body", children: children }) }) })] }) }));
74
81
  }
75
82
  KptAccordionPanel.kptAccordionSlot = 'panel';
@@ -1,6 +1,6 @@
1
1
  # KptAccordion (@konce-pt/react)
2
2
 
3
- An accordion — a group of expandable panels. `multi` allows several open at once.
3
+ An accordion - a group of expandable panels. `multi` allows several open at once.
4
4
  Import: `import { KptAccordion } from '@konce-pt/react';`
5
5
 
6
6
  ## DOM
@@ -10,12 +10,12 @@ Import: `import { KptAccordion } from '@konce-pt/react';`
10
10
  <button class="kpt-accordion-panel__header" id="kpt-accordion-r1-header"
11
11
  aria-expanded="true" aria-controls="kpt-accordion-r1-body">
12
12
  <span class="kpt-accordion-panel__title">Section 1</span>
13
- <span class="kpt-icon-host kpt-accordion-panel__chevron is-open">…</span>
13
+ <span class="kpt-icon-host kpt-accordion-panel__chevron is-open">...</span>
14
14
  </button>
15
15
  <div class="kpt-accordion-panel__collapse is-open" role="region" id="kpt-accordion-r1-body"
16
16
  aria-labelledby="kpt-accordion-r1-header">
17
17
  <div class="kpt-accordion-panel__collapse-inner">
18
- <div class="kpt-accordion-panel__body">…children…</div>
18
+ <div class="kpt-accordion-panel__body">...children...</div>
19
19
  </div>
20
20
  </div>
21
21
  </div>
@@ -23,17 +23,18 @@ Import: `import { KptAccordion } from '@konce-pt/react';`
23
23
  </div>
24
24
 
25
25
  ## KptAccordion props
26
- - `multi`: boolean — several panels open at once
27
- - `openIndexes` / `defaultOpenIndexes` / `onOpenIndexesChange` — the open state, by index
26
+ - `multi`: boolean - several panels open at once
27
+ - `openIndexes` / `defaultOpenIndexes` / `onOpenIndexesChange` - the open state, by index
28
28
  - `animated`: boolean (default true), `animationDuration`: number (ms, default 500)
29
+ - `collapseMotion`: `'spring' | 'fade' | 'none'` (default from `KptMotionProvider`, else `spring`) - see "Collapse motion"
29
30
 
30
31
  ## KptAccordion.Panel props
31
32
  - `title` (required), `disabled`
32
- - `expanded` / `defaultExpanded` / `onExpandedChange` — used when the panel stands alone
33
+ - `expanded` / `defaultExpanded` / `onExpandedChange` - used when the panel stands alone
33
34
  - `children`
34
35
 
35
36
  ## Who owns the state
36
- The accordion owns it, and panels receive their index by cloning — without that, single mode would
37
+ The accordion owns it, and panels receive their index by cloning - without that, single mode would
37
38
  have no way to close its siblings. A panel used outside an accordion falls back to its own state, so
38
39
  it works standalone with no extra wrapper.
39
40
 
@@ -43,11 +44,22 @@ nothing inside takes focus or reaches a screen reader.
43
44
 
44
45
  ## Examples
45
46
  <KptAccordion defaultOpenIndexes={[0]}>
46
- <KptAccordion.Panel title="Section 1">…</KptAccordion.Panel>
47
- <KptAccordion.Panel title="Section 2">…</KptAccordion.Panel>
47
+ <KptAccordion.Panel title="Section 1">...</KptAccordion.Panel>
48
+ <KptAccordion.Panel title="Section 2">...</KptAccordion.Panel>
48
49
  </KptAccordion>
49
50
 
50
- <KptAccordion multi openIndexes={open} onOpenIndexesChange={setOpen}>…</KptAccordion>
51
+ <KptAccordion multi openIndexes={open} onOpenIndexesChange={setOpen}>...</KptAccordion>
52
+
53
+ ## Collapse motion
54
+ - `spring` - the height opens on a soft spring, the content slides in from above and sharpens out
55
+ of a blur; when collapsing, the content fades first and only then the section closes. The chevron
56
+ turns on a spring.
57
+ - `fade` - the height on the standard curve, the content cross-fades.
58
+ - `none` - the state changes without motion.
59
+
60
+ With no value it takes `collapse` from `KptMotionProvider` (default `spring`). `animated={false}` on the accordion, `enabled: false`
61
+ in the config and the system "reduce motion" setting always turn it off. `animationDuration` sets
62
+ the time of every kind. Pure CSS: the kind sits in `data-motion` on the component root.
51
63
 
52
64
  ## Tokens
53
65
  `--kpt-color-border`, `--kpt-color-surface`, `--kpt-motion-easing-standard`, plus
@@ -22,10 +22,10 @@ export interface KptAlertProps extends Omit<ComponentPropsWithRef<'div'>, 'title
22
22
  * go. `visible`/`onVisibleChange` pozwalają pokazać go ponownie z zewnątrz.
23
23
  *
24
24
  * Rola idzie za wagą komunikatu: `info` i `success` to `role="status"` (czytnik ogłosi je uprzejmie,
25
- * nie przerywając), `warning` i `danger` — `role="alert"` (natychmiast).
25
+ * nie przerywając), `warning` i `danger` - `role="alert"` (natychmiast).
26
26
  *
27
27
  * @example
28
28
  * <KptAlert variant="success" title="Zapisano">Zmiany zostały zapisane.</KptAlert>
29
- * <KptAlert variant="warning" dismissible onClosed={onClosed}>Uwaga…</KptAlert>
29
+ * <KptAlert variant="warning" dismissible onClosed={onClosed}>Uwaga...</KptAlert>
30
30
  */
31
31
  export declare function KptAlert({ variant, title, dismissible, onClosed, visible, defaultVisible, onVisibleChange, locale, dictionary, className, children, ...rest }: Readonly<KptAlertProps>): import("react").JSX.Element;
@@ -17,11 +17,11 @@ const ICONS = {
17
17
  * go. `visible`/`onVisibleChange` pozwalają pokazać go ponownie z zewnątrz.
18
18
  *
19
19
  * Rola idzie za wagą komunikatu: `info` i `success` to `role="status"` (czytnik ogłosi je uprzejmie,
20
- * nie przerywając), `warning` i `danger` — `role="alert"` (natychmiast).
20
+ * nie przerywając), `warning` i `danger` - `role="alert"` (natychmiast).
21
21
  *
22
22
  * @example
23
23
  * <KptAlert variant="success" title="Zapisano">Zmiany zostały zapisane.</KptAlert>
24
- * <KptAlert variant="warning" dismissible onClosed={onClosed}>Uwaga…</KptAlert>
24
+ * <KptAlert variant="warning" dismissible onClosed={onClosed}>Uwaga...</KptAlert>
25
25
  */
26
26
  export function KptAlert({ variant = 'info', title = '', dismissible = false, onClosed, visible, defaultVisible = true, onVisibleChange, locale, dictionary, className, children, ...rest }) {
27
27
  const { t } = useKptMessages({ locale, dictionary });