@kosmeo-ui/react 0.1.1 → 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 (418) hide show
  1. package/README.md +3 -1
  2. package/dist/components/buttons/button/index.d.ts +2 -0
  3. package/dist/components/buttons/button/index.d.ts.map +1 -1
  4. package/dist/components/buttons/button/index.js +2 -2
  5. package/dist/components/buttons/button/index.js.map +1 -1
  6. package/dist/components/buttons/button/styles.css +45 -43
  7. package/dist/components/buttons/rowActions/index.d.ts.map +1 -1
  8. package/dist/components/buttons/rowActions/index.js +2 -1
  9. package/dist/components/buttons/rowActions/index.js.map +1 -1
  10. package/dist/components/buttons/rowActions/styles.css +7 -0
  11. package/dist/components/data-display/addressBlock/styles.css +2 -4
  12. package/dist/components/data-display/colorSwatch/index.d.ts +1 -1
  13. package/dist/components/data-display/colorSwatch/index.d.ts.map +1 -1
  14. package/dist/components/data-display/colorSwatch/index.js +1 -1
  15. package/dist/components/data-display/colorSwatch/index.js.map +1 -1
  16. package/dist/components/data-display/colorSwatch/styles.css +1 -1
  17. package/dist/components/data-display/dataTable/index.d.ts.map +1 -1
  18. package/dist/components/data-display/dataTable/index.js +7 -3
  19. package/dist/components/data-display/dataTable/index.js.map +1 -1
  20. package/dist/components/data-display/dataTable/styles.css +18 -2
  21. package/dist/components/data-display/dataTable/utils/parseDataKey.d.ts +8 -1
  22. package/dist/components/data-display/dataTable/utils/parseDataKey.d.ts.map +1 -1
  23. package/dist/components/data-display/dataTable/utils/parseDataKey.js +13 -41
  24. package/dist/components/data-display/dataTable/utils/parseDataKey.js.map +1 -1
  25. package/dist/components/data-display/imagePreview/styles.css +2 -2
  26. package/dist/components/data-display/infiniteScroll/filters/index.d.ts +4 -0
  27. package/dist/components/data-display/infiniteScroll/filters/index.d.ts.map +1 -1
  28. package/dist/components/data-display/infiniteScroll/filters/index.js +12 -2
  29. package/dist/components/data-display/infiniteScroll/filters/index.js.map +1 -1
  30. package/dist/components/data-display/infiniteScroll/filters/listFilter.d.ts.map +1 -1
  31. package/dist/components/data-display/infiniteScroll/filters/listFilter.js +1 -1
  32. package/dist/components/data-display/infiniteScroll/filters/listFilter.js.map +1 -1
  33. package/dist/components/data-display/infiniteScroll/filters/rangeFilter.d.ts +6 -0
  34. package/dist/components/data-display/infiniteScroll/filters/rangeFilter.d.ts.map +1 -1
  35. package/dist/components/data-display/infiniteScroll/filters/rangeFilter.js +55 -46
  36. package/dist/components/data-display/infiniteScroll/filters/rangeFilter.js.map +1 -1
  37. package/dist/components/data-display/infiniteScroll/filters/searchFilter.d.ts.map +1 -1
  38. package/dist/components/data-display/infiniteScroll/filters/searchFilter.js +4 -35
  39. package/dist/components/data-display/infiniteScroll/filters/searchFilter.js.map +1 -1
  40. package/dist/components/data-display/infiniteScroll/filters/selectFilter.d.ts.map +1 -1
  41. package/dist/components/data-display/infiniteScroll/filters/selectFilter.js +3 -5
  42. package/dist/components/data-display/infiniteScroll/filters/selectFilter.js.map +1 -1
  43. package/dist/components/data-display/infiniteScroll/filters/styles.css +34 -1
  44. package/dist/components/data-display/infiniteScroll/header/deleteButton.d.ts.map +1 -1
  45. package/dist/components/data-display/infiniteScroll/header/deleteButton.js +1 -1
  46. package/dist/components/data-display/infiniteScroll/header/deleteButton.js.map +1 -1
  47. package/dist/components/data-display/infiniteScroll/header/index.d.ts.map +1 -1
  48. package/dist/components/data-display/infiniteScroll/header/index.js +1 -1
  49. package/dist/components/data-display/infiniteScroll/header/index.js.map +1 -1
  50. package/dist/components/data-display/infiniteScroll/header/limit.d.ts.map +1 -1
  51. package/dist/components/data-display/infiniteScroll/header/limit.js +1 -1
  52. package/dist/components/data-display/infiniteScroll/header/limit.js.map +1 -1
  53. package/dist/components/data-display/infiniteScroll/header/sortBy.d.ts.map +1 -1
  54. package/dist/components/data-display/infiniteScroll/header/sortBy.js +1 -1
  55. package/dist/components/data-display/infiniteScroll/header/sortBy.js.map +1 -1
  56. package/dist/components/data-display/infiniteScroll/header/sortDirection.d.ts.map +1 -1
  57. package/dist/components/data-display/infiniteScroll/header/sortDirection.js +1 -1
  58. package/dist/components/data-display/infiniteScroll/header/sortDirection.js.map +1 -1
  59. package/dist/components/data-display/infiniteScroll/index.d.ts +8 -0
  60. package/dist/components/data-display/infiniteScroll/index.d.ts.map +1 -1
  61. package/dist/components/data-display/infiniteScroll/index.js +41 -23
  62. package/dist/components/data-display/infiniteScroll/index.js.map +1 -1
  63. package/dist/components/data-display/infiniteScroll/styles.css +2 -2
  64. package/dist/components/data-display/infiniteScroll/table/index.d.ts.map +1 -1
  65. package/dist/components/data-display/infiniteScroll/table/index.js +2 -2
  66. package/dist/components/data-display/infiniteScroll/table/index.js.map +1 -1
  67. package/dist/components/data-display/infiniteScroll/tags/index.d.ts.map +1 -1
  68. package/dist/components/data-display/infiniteScroll/tags/index.js +7 -11
  69. package/dist/components/data-display/infiniteScroll/tags/index.js.map +1 -1
  70. package/dist/components/data-display/infiniteScroll/tags/listFilterTag.d.ts.map +1 -1
  71. package/dist/components/data-display/infiniteScroll/tags/listFilterTag.js +8 -8
  72. package/dist/components/data-display/infiniteScroll/tags/listFilterTag.js.map +1 -1
  73. package/dist/components/data-display/infiniteScroll/tags/rangeFilterTag.d.ts.map +1 -1
  74. package/dist/components/data-display/infiniteScroll/tags/rangeFilterTag.js +6 -18
  75. package/dist/components/data-display/infiniteScroll/tags/rangeFilterTag.js.map +1 -1
  76. package/dist/components/data-display/infiniteScroll/tags/selectFilterTag.d.ts.map +1 -1
  77. package/dist/components/data-display/infiniteScroll/tags/selectFilterTag.js +3 -5
  78. package/dist/components/data-display/infiniteScroll/tags/selectFilterTag.js.map +1 -1
  79. package/dist/components/data-display/infiniteScroll/tags/styles.css +1 -29
  80. package/dist/components/data-display/infiniteScroll/utils/generateQueryString.d.ts +6 -0
  81. package/dist/components/data-display/infiniteScroll/utils/generateQueryString.d.ts.map +1 -1
  82. package/dist/components/data-display/infiniteScroll/utils/generateQueryString.js +24 -12
  83. package/dist/components/data-display/infiniteScroll/utils/generateQueryString.js.map +1 -1
  84. package/dist/components/data-display/infiniteScroll/utils/hasPendingChanges.d.ts +11 -1
  85. package/dist/components/data-display/infiniteScroll/utils/hasPendingChanges.d.ts.map +1 -1
  86. package/dist/components/data-display/infiniteScroll/utils/hasPendingChanges.js +37 -18
  87. package/dist/components/data-display/infiniteScroll/utils/hasPendingChanges.js.map +1 -1
  88. package/dist/components/data-display/listCard/styles.css +3 -3
  89. package/dist/components/data-display/listRow/styles.css +2 -2
  90. package/dist/components/data-display/recoveryCodeGrid/styles.css +3 -4
  91. package/dist/components/data-display/secretDisplay/styles.css +4 -4
  92. package/dist/components/data-display/statCard/styles.css +12 -12
  93. package/dist/components/data-display/summaryRow/styles.css +4 -4
  94. package/dist/components/data-display/table/index.d.ts.map +1 -1
  95. package/dist/components/data-display/table/index.js +2 -2
  96. package/dist/components/data-display/table/index.js.map +1 -1
  97. package/dist/components/data-display/table/styles.css +22 -11
  98. package/dist/components/data-display/tableFilters/index.d.ts +30 -0
  99. package/dist/components/data-display/tableFilters/index.d.ts.map +1 -0
  100. package/dist/components/data-display/tableFilters/index.js +67 -0
  101. package/dist/components/data-display/tableFilters/index.js.map +1 -0
  102. package/dist/components/data-display/tagCard/index.d.ts.map +1 -1
  103. package/dist/components/data-display/tagCard/index.js +1 -1
  104. package/dist/components/data-display/tagCard/index.js.map +1 -1
  105. package/dist/components/data-display/tagCard/styles.css +1 -1
  106. package/dist/components/feedback/alert/styles.css +15 -15
  107. package/dist/components/feedback/badge/index.d.ts.map +1 -1
  108. package/dist/components/feedback/badge/index.js +14 -8
  109. package/dist/components/feedback/badge/index.js.map +1 -1
  110. package/dist/components/feedback/badge/styles.css +45 -45
  111. package/dist/components/feedback/emptyState/styles.css +2 -4
  112. package/dist/components/feedback/loadingOverlay/styles.css +1 -1
  113. package/dist/components/feedback/progressBar/index.d.ts.map +1 -1
  114. package/dist/components/feedback/progressBar/index.js +7 -2
  115. package/dist/components/feedback/progressBar/index.js.map +1 -1
  116. package/dist/components/feedback/progressBar/styles.css +25 -16
  117. package/dist/components/feedback/spinner/styles.css +14 -24
  118. package/dist/components/feedback/tooltip/styles.css +9 -7
  119. package/dist/components/forms/detailField/styles.css +1 -1
  120. package/dist/components/forms/fieldShell/index.d.ts +3 -1
  121. package/dist/components/forms/fieldShell/index.d.ts.map +1 -1
  122. package/dist/components/forms/fieldShell/index.js +1 -1
  123. package/dist/components/forms/fieldShell/index.js.map +1 -1
  124. package/dist/components/forms/fieldShell/styles.css +5 -5
  125. package/dist/components/forms/form/styles.css +6 -6
  126. package/dist/components/forms/formActions/styles.css +4 -4
  127. package/dist/components/forms/formGrid/styles.css +32 -0
  128. package/dist/components/forms/infoRow/styles.css +2 -3
  129. package/dist/components/forms/optionsGroup/index.d.ts +3 -1
  130. package/dist/components/forms/optionsGroup/index.d.ts.map +1 -1
  131. package/dist/components/forms/optionsGroup/index.js +5 -1
  132. package/dist/components/forms/optionsGroup/index.js.map +1 -1
  133. package/dist/components/forms/optionsGroup/styles.css +1 -1
  134. package/dist/components/forms/requiredAsterisk/index.d.ts.map +1 -1
  135. package/dist/components/forms/requiredAsterisk/index.js +3 -2
  136. package/dist/components/forms/requiredAsterisk/index.js.map +1 -1
  137. package/dist/components/forms/requiredAsterisk/styles.css +1 -1
  138. package/dist/components/index.d.ts +4 -0
  139. package/dist/components/index.d.ts.map +1 -1
  140. package/dist/components/index.js +2 -0
  141. package/dist/components/index.js.map +1 -1
  142. package/dist/components/inputs/checkbox/index.d.ts +6 -1
  143. package/dist/components/inputs/checkbox/index.d.ts.map +1 -1
  144. package/dist/components/inputs/checkbox/index.js +12 -3
  145. package/dist/components/inputs/checkbox/index.js.map +1 -1
  146. package/dist/components/inputs/checkbox/styles.css +11 -3
  147. package/dist/components/inputs/colorPicker/index.d.ts.map +1 -1
  148. package/dist/components/inputs/colorPicker/index.js +3 -1
  149. package/dist/components/inputs/colorPicker/index.js.map +1 -1
  150. package/dist/components/inputs/colorPicker/styles.css +3 -3
  151. package/dist/components/inputs/dateInput/index.d.ts +6 -6
  152. package/dist/components/inputs/dateInput/index.d.ts.map +1 -1
  153. package/dist/components/inputs/dateInput/index.js +15 -5
  154. package/dist/components/inputs/dateInput/index.js.map +1 -1
  155. package/dist/components/inputs/dateInput/styles.css +5 -5
  156. package/dist/components/inputs/dateInput/utils.d.ts +0 -1
  157. package/dist/components/inputs/dateInput/utils.d.ts.map +1 -1
  158. package/dist/components/inputs/dateInput/utils.js +13 -8
  159. package/dist/components/inputs/dateInput/utils.js.map +1 -1
  160. package/dist/components/inputs/dropdown/index.d.ts +2 -0
  161. package/dist/components/inputs/dropdown/index.d.ts.map +1 -1
  162. package/dist/components/inputs/dropdown/index.js +2 -2
  163. package/dist/components/inputs/dropdown/index.js.map +1 -1
  164. package/dist/components/inputs/dropdown/styles.css +2 -2
  165. package/dist/components/inputs/dropdownArrowButton/index.d.ts.map +1 -1
  166. package/dist/components/inputs/dropdownArrowButton/index.js +1 -1
  167. package/dist/components/inputs/dropdownArrowButton/index.js.map +1 -1
  168. package/dist/components/inputs/dropdownArrowButton/styles.css +7 -5
  169. package/dist/components/inputs/fileDropZone/index.d.ts.map +1 -1
  170. package/dist/components/inputs/fileDropZone/index.js +3 -2
  171. package/dist/components/inputs/fileDropZone/index.js.map +1 -1
  172. package/dist/components/inputs/fileDropZone/styles.css +12 -12
  173. package/dist/components/inputs/fileUpload/index.d.ts.map +1 -1
  174. package/dist/components/inputs/fileUpload/index.js +11 -6
  175. package/dist/components/inputs/fileUpload/index.js.map +1 -1
  176. package/dist/components/inputs/fileUpload/styles.css +9 -9
  177. package/dist/components/inputs/input/index.d.ts +17 -1
  178. package/dist/components/inputs/input/index.d.ts.map +1 -1
  179. package/dist/components/inputs/input/index.js +27 -5
  180. package/dist/components/inputs/input/index.js.map +1 -1
  181. package/dist/components/inputs/input/styles.css +68 -24
  182. package/dist/components/inputs/languageSelect/index.d.ts.map +1 -1
  183. package/dist/components/inputs/languageSelect/index.js +15 -4
  184. package/dist/components/inputs/languageSelect/index.js.map +1 -1
  185. package/dist/components/inputs/multiSelect/dropDown.d.ts +7 -0
  186. package/dist/components/inputs/multiSelect/dropDown.d.ts.map +1 -1
  187. package/dist/components/inputs/multiSelect/dropDown.js +19 -12
  188. package/dist/components/inputs/multiSelect/dropDown.js.map +1 -1
  189. package/dist/components/inputs/multiSelect/index.d.ts.map +1 -1
  190. package/dist/components/inputs/multiSelect/index.js +49 -13
  191. package/dist/components/inputs/multiSelect/index.js.map +1 -1
  192. package/dist/components/inputs/multiSelect/styles.css +51 -43
  193. package/dist/components/inputs/multiSelect/utils.d.ts +7 -0
  194. package/dist/components/inputs/multiSelect/utils.d.ts.map +1 -0
  195. package/dist/components/inputs/multiSelect/utils.js +18 -0
  196. package/dist/components/inputs/multiSelect/utils.js.map +1 -0
  197. package/dist/components/inputs/phoneInput/index.d.ts.map +1 -1
  198. package/dist/components/inputs/phoneInput/index.js +11 -3
  199. package/dist/components/inputs/phoneInput/index.js.map +1 -1
  200. package/dist/components/inputs/phoneInput/styles.css +13 -13
  201. package/dist/components/inputs/radioGroup/index.d.ts.map +1 -1
  202. package/dist/components/inputs/radioGroup/index.js +1 -1
  203. package/dist/components/inputs/radioGroup/index.js.map +1 -1
  204. package/dist/components/inputs/richTextEditor/index.d.ts.map +1 -1
  205. package/dist/components/inputs/richTextEditor/index.js +30 -20
  206. package/dist/components/inputs/richTextEditor/index.js.map +1 -1
  207. package/dist/components/inputs/richTextEditor/styles.css +24 -24
  208. package/dist/components/inputs/searchList/index.d.ts +4 -1
  209. package/dist/components/inputs/searchList/index.d.ts.map +1 -1
  210. package/dist/components/inputs/searchList/index.js +46 -31
  211. package/dist/components/inputs/searchList/index.js.map +1 -1
  212. package/dist/components/inputs/searchList/styles.css +22 -22
  213. package/dist/components/inputs/searchSelect/index.d.ts.map +1 -1
  214. package/dist/components/inputs/searchSelect/index.js +8 -2
  215. package/dist/components/inputs/searchSelect/index.js.map +1 -1
  216. package/dist/components/inputs/select/index.js +3 -2
  217. package/dist/components/inputs/select/index.js.map +1 -1
  218. package/dist/components/inputs/select/styles.css +93 -15
  219. package/dist/components/inputs/switch/index.d.ts.map +1 -1
  220. package/dist/components/inputs/switch/index.js +3 -1
  221. package/dist/components/inputs/switch/index.js.map +1 -1
  222. package/dist/components/inputs/switch/styles.css +5 -5
  223. package/dist/components/inputs/textArea/index.d.ts.map +1 -1
  224. package/dist/components/inputs/textArea/index.js +3 -2
  225. package/dist/components/inputs/textArea/index.js.map +1 -1
  226. package/dist/components/inputs/textArea/styles.css +11 -11
  227. package/dist/components/inputs/typeahead/index.d.ts.map +1 -1
  228. package/dist/components/inputs/typeahead/index.js +21 -6
  229. package/dist/components/inputs/typeahead/index.js.map +1 -1
  230. package/dist/components/inputs/typeahead/styles.css +13 -13
  231. package/dist/components/layout/authPage/styles.css +6 -6
  232. package/dist/components/layout/borderedSection/index.d.ts +3 -1
  233. package/dist/components/layout/borderedSection/index.d.ts.map +1 -1
  234. package/dist/components/layout/borderedSection/index.js +2 -2
  235. package/dist/components/layout/borderedSection/index.js.map +1 -1
  236. package/dist/components/layout/borderedSection/styles.css +3 -3
  237. package/dist/components/layout/card/styles.css +53 -31
  238. package/dist/components/layout/col/styles.css +1 -1
  239. package/dist/components/layout/page/styles.css +25 -5
  240. package/dist/components/layout/sectionHeader/styles.css +3 -4
  241. package/dist/components/navigation/breadcrumbs/styles.css +7 -7
  242. package/dist/components/navigation/pagination/index.d.ts +23 -0
  243. package/dist/components/navigation/pagination/index.d.ts.map +1 -0
  244. package/dist/components/navigation/pagination/index.js +29 -0
  245. package/dist/components/navigation/pagination/index.js.map +1 -0
  246. package/dist/components/navigation/pagination/styles.css +113 -0
  247. package/dist/components/navigation/pagination/utils.d.ts +9 -0
  248. package/dist/components/navigation/pagination/utils.d.ts.map +1 -0
  249. package/dist/components/navigation/pagination/utils.js +25 -0
  250. package/dist/components/navigation/pagination/utils.js.map +1 -0
  251. package/dist/components/navigation/sidebar/styles.css +13 -5
  252. package/dist/components/navigation/stepper/styles.css +14 -14
  253. package/dist/components/navigation/tabButton/styles.css +59 -59
  254. package/dist/components/navigation/tabs/styles.css +5 -5
  255. package/dist/components/overlays/confirmationModal/index.d.ts +5 -0
  256. package/dist/components/overlays/confirmationModal/index.d.ts.map +1 -1
  257. package/dist/components/overlays/confirmationModal/index.js +23 -4
  258. package/dist/components/overlays/confirmationModal/index.js.map +1 -1
  259. package/dist/components/overlays/confirmationModal/styles.css +3 -0
  260. package/dist/components/overlays/modal/index.d.ts +2 -0
  261. package/dist/components/overlays/modal/index.d.ts.map +1 -1
  262. package/dist/components/overlays/modal/index.js +13 -4
  263. package/dist/components/overlays/modal/index.js.map +1 -1
  264. package/dist/components/overlays/modal/styles.css +19 -19
  265. package/dist/hooks/index.d.ts +1 -0
  266. package/dist/hooks/index.d.ts.map +1 -1
  267. package/dist/hooks/index.js +1 -0
  268. package/dist/hooks/index.js.map +1 -1
  269. package/dist/hooks/useInfinite.d.ts +3 -1
  270. package/dist/hooks/useInfinite.d.ts.map +1 -1
  271. package/dist/hooks/useInfinite.js +4 -2
  272. package/dist/hooks/useInfinite.js.map +1 -1
  273. package/dist/hooks/useInfiniteArchivableCursor.d.ts +1 -1
  274. package/dist/hooks/useInfiniteArchivableCursor.d.ts.map +1 -1
  275. package/dist/hooks/useInfiniteArchivableCursor.js +11 -4
  276. package/dist/hooks/useInfiniteArchivableCursor.js.map +1 -1
  277. package/dist/hooks/useInfiniteCursor.d.ts +1 -1
  278. package/dist/hooks/useInfiniteCursor.d.ts.map +1 -1
  279. package/dist/hooks/useInfiniteCursor.js +11 -4
  280. package/dist/hooks/useInfiniteCursor.js.map +1 -1
  281. package/dist/hooks/usePaginated.d.ts +43 -0
  282. package/dist/hooks/usePaginated.d.ts.map +1 -0
  283. package/dist/hooks/usePaginated.js +60 -0
  284. package/dist/hooks/usePaginated.js.map +1 -0
  285. package/dist/styles.css +161 -123
  286. package/package.json +15 -4
  287. package/src/components/buttons/button/index.tsx +14 -5
  288. package/src/components/buttons/button/styles.css +45 -43
  289. package/src/components/buttons/rowActions/index.tsx +6 -1
  290. package/src/components/buttons/rowActions/styles.css +7 -0
  291. package/src/components/data-display/addressBlock/styles.css +2 -4
  292. package/src/components/data-display/colorSwatch/index.tsx +2 -2
  293. package/src/components/data-display/colorSwatch/styles.css +1 -1
  294. package/src/components/data-display/dataTable/index.tsx +6 -3
  295. package/src/components/data-display/dataTable/styles.css +18 -2
  296. package/src/components/data-display/dataTable/utils/parseDataKey.ts +18 -36
  297. package/src/components/data-display/imagePreview/styles.css +2 -2
  298. package/src/components/data-display/infiniteScroll/filters/index.tsx +18 -1
  299. package/src/components/data-display/infiniteScroll/filters/listFilter.tsx +1 -0
  300. package/src/components/data-display/infiniteScroll/filters/rangeFilter.tsx +77 -33
  301. package/src/components/data-display/infiniteScroll/filters/searchFilter.tsx +16 -65
  302. package/src/components/data-display/infiniteScroll/filters/selectFilter.tsx +11 -17
  303. package/src/components/data-display/infiniteScroll/filters/styles.css +34 -1
  304. package/src/components/data-display/infiniteScroll/header/deleteButton.tsx +1 -0
  305. package/src/components/data-display/infiniteScroll/header/index.tsx +4 -0
  306. package/src/components/data-display/infiniteScroll/header/limit.tsx +1 -0
  307. package/src/components/data-display/infiniteScroll/header/sortBy.tsx +1 -0
  308. package/src/components/data-display/infiniteScroll/header/sortDirection.tsx +1 -0
  309. package/src/components/data-display/infiniteScroll/index.tsx +75 -29
  310. package/src/components/data-display/infiniteScroll/styles.css +2 -2
  311. package/src/components/data-display/infiniteScroll/table/index.tsx +2 -0
  312. package/src/components/data-display/infiniteScroll/tags/index.tsx +7 -16
  313. package/src/components/data-display/infiniteScroll/tags/listFilterTag.tsx +31 -28
  314. package/src/components/data-display/infiniteScroll/tags/rangeFilterTag.tsx +8 -25
  315. package/src/components/data-display/infiniteScroll/tags/selectFilterTag.tsx +4 -11
  316. package/src/components/data-display/infiniteScroll/tags/styles.css +1 -29
  317. package/src/components/data-display/infiniteScroll/utils/generateQueryString.ts +28 -13
  318. package/src/components/data-display/infiniteScroll/utils/hasPendingChanges.ts +48 -16
  319. package/src/components/data-display/listCard/styles.css +3 -3
  320. package/src/components/data-display/listRow/styles.css +2 -2
  321. package/src/components/data-display/recoveryCodeGrid/styles.css +3 -4
  322. package/src/components/data-display/secretDisplay/styles.css +4 -4
  323. package/src/components/data-display/statCard/styles.css +12 -12
  324. package/src/components/data-display/summaryRow/styles.css +4 -4
  325. package/src/components/data-display/table/index.tsx +2 -2
  326. package/src/components/data-display/table/styles.css +22 -11
  327. package/src/components/data-display/tableFilters/index.tsx +147 -0
  328. package/src/components/data-display/tagCard/index.tsx +7 -4
  329. package/src/components/data-display/tagCard/styles.css +1 -1
  330. package/src/components/feedback/alert/styles.css +15 -15
  331. package/src/components/feedback/badge/index.tsx +36 -16
  332. package/src/components/feedback/badge/styles.css +45 -45
  333. package/src/components/feedback/emptyState/styles.css +2 -4
  334. package/src/components/feedback/loadingOverlay/styles.css +1 -1
  335. package/src/components/feedback/progressBar/index.tsx +14 -8
  336. package/src/components/feedback/progressBar/styles.css +25 -16
  337. package/src/components/feedback/spinner/styles.css +14 -24
  338. package/src/components/feedback/tooltip/styles.css +9 -7
  339. package/src/components/forms/detailField/styles.css +1 -1
  340. package/src/components/forms/fieldShell/index.tsx +4 -1
  341. package/src/components/forms/fieldShell/styles.css +5 -5
  342. package/src/components/forms/form/styles.css +6 -6
  343. package/src/components/forms/formActions/styles.css +4 -4
  344. package/src/components/forms/formGrid/styles.css +32 -0
  345. package/src/components/forms/infoRow/styles.css +2 -3
  346. package/src/components/forms/optionsGroup/index.tsx +31 -12
  347. package/src/components/forms/optionsGroup/styles.css +1 -1
  348. package/src/components/forms/requiredAsterisk/index.tsx +5 -1
  349. package/src/components/forms/requiredAsterisk/styles.css +1 -1
  350. package/src/components/index.ts +4 -0
  351. package/src/components/inputs/checkbox/index.tsx +27 -6
  352. package/src/components/inputs/checkbox/styles.css +11 -3
  353. package/src/components/inputs/colorPicker/index.tsx +5 -2
  354. package/src/components/inputs/colorPicker/styles.css +3 -3
  355. package/src/components/inputs/dateInput/index.tsx +17 -9
  356. package/src/components/inputs/dateInput/styles.css +5 -5
  357. package/src/components/inputs/dateInput/utils.ts +12 -8
  358. package/src/components/inputs/dropdown/index.tsx +5 -1
  359. package/src/components/inputs/dropdown/styles.css +2 -2
  360. package/src/components/inputs/dropdownArrowButton/index.tsx +1 -0
  361. package/src/components/inputs/dropdownArrowButton/styles.css +7 -5
  362. package/src/components/inputs/fileDropZone/index.tsx +4 -3
  363. package/src/components/inputs/fileDropZone/styles.css +12 -12
  364. package/src/components/inputs/fileUpload/index.tsx +33 -23
  365. package/src/components/inputs/fileUpload/styles.css +9 -9
  366. package/src/components/inputs/input/index.tsx +67 -6
  367. package/src/components/inputs/input/styles.css +68 -24
  368. package/src/components/inputs/languageSelect/index.tsx +19 -4
  369. package/src/components/inputs/multiSelect/dropDown.tsx +83 -35
  370. package/src/components/inputs/multiSelect/index.tsx +87 -29
  371. package/src/components/inputs/multiSelect/styles.css +51 -43
  372. package/src/components/inputs/multiSelect/utils.ts +18 -0
  373. package/src/components/inputs/phoneInput/index.tsx +16 -4
  374. package/src/components/inputs/phoneInput/styles.css +13 -13
  375. package/src/components/inputs/radioGroup/index.tsx +2 -1
  376. package/src/components/inputs/richTextEditor/index.tsx +59 -37
  377. package/src/components/inputs/richTextEditor/styles.css +24 -24
  378. package/src/components/inputs/searchList/index.tsx +121 -109
  379. package/src/components/inputs/searchList/styles.css +22 -22
  380. package/src/components/inputs/searchSelect/index.tsx +8 -2
  381. package/src/components/inputs/select/index.tsx +3 -3
  382. package/src/components/inputs/select/styles.css +93 -15
  383. package/src/components/inputs/switch/index.tsx +3 -2
  384. package/src/components/inputs/switch/styles.css +5 -5
  385. package/src/components/inputs/textArea/index.tsx +3 -3
  386. package/src/components/inputs/textArea/styles.css +11 -11
  387. package/src/components/inputs/typeahead/index.tsx +84 -54
  388. package/src/components/inputs/typeahead/styles.css +13 -13
  389. package/src/components/layout/authPage/styles.css +6 -6
  390. package/src/components/layout/borderedSection/index.tsx +4 -1
  391. package/src/components/layout/borderedSection/styles.css +3 -3
  392. package/src/components/layout/card/styles.css +53 -31
  393. package/src/components/layout/col/styles.css +1 -1
  394. package/src/components/layout/page/styles.css +25 -5
  395. package/src/components/layout/sectionHeader/styles.css +3 -4
  396. package/src/components/navigation/breadcrumbs/styles.css +7 -7
  397. package/src/components/navigation/pagination/index.tsx +134 -0
  398. package/src/components/navigation/pagination/styles.css +113 -0
  399. package/src/components/navigation/pagination/utils.ts +32 -0
  400. package/src/components/navigation/sidebar/styles.css +13 -5
  401. package/src/components/navigation/stepper/styles.css +14 -14
  402. package/src/components/navigation/tabButton/styles.css +59 -59
  403. package/src/components/navigation/tabs/styles.css +5 -5
  404. package/src/components/overlays/confirmationModal/index.tsx +37 -1
  405. package/src/components/overlays/confirmationModal/styles.css +3 -0
  406. package/src/components/overlays/modal/index.tsx +23 -4
  407. package/src/components/overlays/modal/styles.css +19 -19
  408. package/src/hooks/index.ts +4 -0
  409. package/src/hooks/useInfinite.ts +7 -3
  410. package/src/hooks/useInfiniteArchivableCursor.ts +11 -4
  411. package/src/hooks/useInfiniteCursor.ts +11 -4
  412. package/src/hooks/usePaginated.ts +123 -0
  413. package/src/styles.css +161 -123
  414. package/dist/components/data-display/infiniteScroll/tags/searchFilterTag.d.ts +0 -10
  415. package/dist/components/data-display/infiniteScroll/tags/searchFilterTag.d.ts.map +0 -1
  416. package/dist/components/data-display/infiniteScroll/tags/searchFilterTag.js +0 -22
  417. package/dist/components/data-display/infiniteScroll/tags/searchFilterTag.js.map +0 -1
  418. package/src/components/data-display/infiniteScroll/tags/searchFilterTag.tsx +0 -41
@@ -33,11 +33,13 @@
33
33
 
34
34
  .k-tooltip-content {
35
35
  position: relative;
36
- background-color: var(--text-color);
37
- color: var(--text-color-light);
36
+ background-color: var(--k-text-color);
37
+ /* An inverted surface, so the text takes the page background, not a fixed
38
+ light color that disappears on the dark theme's light tooltip. */
39
+ color: var(--k-background-color);
38
40
  padding: 0.5rem 0.75rem;
39
41
  border-radius: 0.25rem;
40
- font-size: var(--text-size-sm);
42
+ font-size: var(--k-text-size-sm);
41
43
  white-space: normal;
42
44
  max-width: 12.5rem;
43
45
  text-align: center;
@@ -59,26 +61,26 @@
59
61
  bottom: -0.625rem; /* Double the border-width to ensure visibility */
60
62
  left: 50%;
61
63
  transform: translateX(-50%);
62
- border-color: var(--text-color) transparent transparent transparent;
64
+ border-color: var(--k-text-color) transparent transparent transparent;
63
65
  }
64
66
 
65
67
  .k-tooltip-bottom .k-tooltip-content::after {
66
68
  top: -0.625rem; /* Double the border-width to ensure visibility */
67
69
  left: 50%;
68
70
  transform: translateX(-50%);
69
- border-color: transparent transparent var(--text-color) transparent;
71
+ border-color: transparent transparent var(--k-text-color) transparent;
70
72
  }
71
73
 
72
74
  .k-tooltip-left .k-tooltip-content::after {
73
75
  right: -0.625rem; /* Double the border-width to ensure visibility */
74
76
  top: 50%;
75
77
  transform: translateY(-50%);
76
- border-color: transparent transparent transparent var(--text-color);
78
+ border-color: transparent transparent transparent var(--k-text-color);
77
79
  }
78
80
 
79
81
  .k-tooltip-right .k-tooltip-content::after {
80
82
  left: -0.625rem; /* Double the border-width to ensure visibility */
81
83
  top: 50%;
82
84
  transform: translateY(-50%);
83
- border-color: transparent var(--text-color) transparent transparent;
85
+ border-color: transparent var(--k-text-color) transparent transparent;
84
86
  }
@@ -10,7 +10,7 @@
10
10
  font-weight: 600;
11
11
  text-transform: uppercase;
12
12
  letter-spacing: 0.04em;
13
- color: var(--text-color-secondary);
13
+ color: var(--k-text-color-secondary);
14
14
  }
15
15
 
16
16
  .k-detail-field-value {
@@ -11,6 +11,8 @@ interface FieldShellProps {
11
11
  required?: boolean;
12
12
  /** `htmlFor` target id, used when label is a string. */
13
13
  htmlFor?: string;
14
+ /** Id for the label element, for a control named with `aria-labelledby` (a `<label>` can't target a non-form element). */
15
+ labelId?: string;
14
16
  /** Optional right-aligned annotation in the label row (e.g. char count). */
15
17
  labelAside?: ReactNode;
16
18
  /** Optional error message rendered below the input. */
@@ -28,6 +30,7 @@ const FieldShell = ({
28
30
  label,
29
31
  required,
30
32
  htmlFor,
33
+ labelId,
31
34
  labelAside,
32
35
  error,
33
36
  helperText,
@@ -38,7 +41,7 @@ const FieldShell = ({
38
41
  {(label || labelAside) && (
39
42
  <div className="k-field-shell-label-row">
40
43
  {label && (
41
- <label htmlFor={htmlFor} className="k-field-shell-label">
44
+ <label id={labelId} htmlFor={htmlFor} className="k-field-shell-label">
42
45
  {typeof label === "string" ? (
43
46
  <>
44
47
  {label}
@@ -15,24 +15,24 @@
15
15
  display: block;
16
16
  font-size: 0.875rem;
17
17
  font-weight: 500;
18
- color: var(--text-color);
18
+ color: var(--k-text-color);
19
19
  }
20
20
 
21
21
  .k-field-shell-aside {
22
22
  font-weight: 500;
23
- font-size: var(--text-size-sm);
24
- color: var(--text-color-secondary);
23
+ font-size: var(--k-text-size-sm);
24
+ color: var(--k-text-color-secondary);
25
25
  margin-left: 0.5rem;
26
26
  }
27
27
 
28
28
  .k-field-shell-error {
29
29
  margin-top: 0.25rem;
30
30
  font-size: 0.8125rem;
31
- color: var(--danger-color);
31
+ color: var(--k-danger-color-text);
32
32
  }
33
33
 
34
34
  .k-field-shell-helper {
35
35
  margin-top: 0.25rem;
36
36
  font-size: 0.8125rem;
37
- color: var(--text-color-secondary);
37
+ color: var(--k-text-color-secondary);
38
38
  }
@@ -9,19 +9,19 @@
9
9
  }
10
10
 
11
11
  .k-form-validating .k-input-invalid {
12
- border-color: var(--danger-color);
12
+ border-color: var(--k-danger-color);
13
13
  }
14
14
 
15
15
  .k-form-validating .k-input-invalid:focus {
16
- border-color: var(--danger-color);
17
- box-shadow: 0 0 0 0.1875rem var(--shadow-color-hover);
16
+ border-color: var(--k-danger-color);
17
+ box-shadow: 0 0 0 0.1875rem var(--k-shadow-color-hover);
18
18
  }
19
19
 
20
20
  .k-form-validating .k-input-valid {
21
- border-color: var(--success-color);
21
+ border-color: var(--k-success-color);
22
22
  }
23
23
 
24
24
  .k-form-validating .k-input-valid:focus {
25
- border-color: var(--success-color);
26
- box-shadow: 0 0 0 0.1875rem var(--shadow-color-hover);
25
+ border-color: var(--k-success-color);
26
+ box-shadow: 0 0 0 0.1875rem var(--k-shadow-color-hover);
27
27
  }
@@ -39,11 +39,11 @@
39
39
  .k-form-error {
40
40
  background-color: color-mix(
41
41
  in srgb,
42
- var(--danger-color) 12%,
43
- var(--background-color)
42
+ var(--k-danger-color) 12%,
43
+ var(--k-background-color)
44
44
  );
45
- color: var(--danger-color);
46
- border: 0.0625rem solid var(--danger-color);
45
+ color: var(--k-danger-color-text);
46
+ border: 0.0625rem solid var(--k-danger-color);
47
47
  border-radius: 0.375rem;
48
48
  padding: 0.5rem 0.75rem;
49
49
  font-size: 0.875rem;
@@ -39,3 +39,35 @@
39
39
  grid-template-columns: 1fr;
40
40
  }
41
41
  }
42
+
43
+ /* Each item spans three rows (label, control, message) and fields share them
44
+ through subgrid, so controls in a row stay level when one label wraps or
45
+ one field shows helper or error text. Non-field items span the same three
46
+ rows so auto-placement stays one item per cell. */
47
+ .k-form-grid > * {
48
+ grid-row: span 3;
49
+ }
50
+
51
+ .k-form-grid > .k-field-shell,
52
+ .k-form-grid > * > .k-field-shell,
53
+ .k-form-grid > :has(> .k-field-shell) {
54
+ display: grid;
55
+ grid-template-rows: subgrid;
56
+ grid-row: span 3;
57
+ row-gap: 0;
58
+ }
59
+
60
+ :is(.k-form-grid > .k-field-shell, .k-form-grid > * > .k-field-shell) > * {
61
+ grid-row: 2;
62
+ }
63
+
64
+ :is(.k-form-grid > .k-field-shell, .k-form-grid > * > .k-field-shell)
65
+ > .k-field-shell-label-row {
66
+ grid-row: 1;
67
+ align-self: end;
68
+ }
69
+
70
+ :is(.k-form-grid > .k-field-shell, .k-form-grid > * > .k-field-shell)
71
+ > :is(.k-field-shell-error, .k-field-shell-helper) {
72
+ grid-row: 3;
73
+ }
@@ -2,7 +2,7 @@
2
2
  display: flex;
3
3
  gap: 0.75rem;
4
4
  padding: 0.5rem 0;
5
- border-bottom: 0.0625rem solid var(--border-color);
5
+ border-bottom: 0.0625rem solid var(--k-border-color);
6
6
  }
7
7
 
8
8
  .k-info-row:last-child {
@@ -22,8 +22,7 @@
22
22
 
23
23
  .k-info-row-label {
24
24
  font-weight: 500;
25
- color: var(--text-color);
26
- opacity: 0.7;
25
+ color: var(--k-text-color-secondary);
27
26
  }
28
27
 
29
28
  .k-info-row-value {
@@ -1,26 +1,45 @@
1
1
  "use client";
2
2
 
3
3
  import MandatoryAsterisk from "../requiredAsterisk/index.js";
4
- import { ReactNode } from "react";
4
+ import { ReactNode, useId } from "react";
5
5
  import "./styles.css";
6
6
 
7
7
  interface OptionsGroupProps {
8
8
  label?: string;
9
9
  required?: boolean;
10
+ /** `radiogroup` for radios; `group` (the default) for checkboxes. */
11
+ role?: "group" | "radiogroup";
10
12
  children: ReactNode;
11
13
  }
12
14
 
13
15
  /** Internal shell for CheckboxGroup / RadioGroup — label + option list. */
14
- const OptionsGroup = ({ label, required, children }: OptionsGroupProps) => (
15
- <div className="k-options-group">
16
- {label && (
17
- <label className="k-options-group-label">
18
- {label}
19
- {required && <MandatoryAsterisk />}
20
- </label>
21
- )}
22
- <div className="k-options-group-options">{children}</div>
23
- </div>
24
- );
16
+ const OptionsGroup = ({
17
+ label,
18
+ required,
19
+ role = "group",
20
+ children,
21
+ }: OptionsGroupProps) => {
22
+ const labelId = useId();
23
+ return (
24
+ <div
25
+ className="k-options-group"
26
+ role={role}
27
+ aria-labelledby={label ? labelId : undefined}
28
+ aria-required={(role === "radiogroup" && required) || undefined}
29
+ >
30
+ {label && (
31
+ <label id={labelId} className="k-options-group-label">
32
+ {label}
33
+ {required && <MandatoryAsterisk />}
34
+ {/* ARIA can't mark a checkbox group required, so say it. */}
35
+ {required && role === "group" && (
36
+ <span className="k-sr-only"> (required)</span>
37
+ )}
38
+ </label>
39
+ )}
40
+ <div className="k-options-group-options">{children}</div>
41
+ </div>
42
+ );
43
+ };
25
44
 
26
45
  export default OptionsGroup;
@@ -7,7 +7,7 @@
7
7
  .k-options-group-label {
8
8
  font-weight: 600;
9
9
  font-size: 0.875rem;
10
- color: var(--text-color);
10
+ color: var(--k-text-color);
11
11
  }
12
12
 
13
13
  .k-options-group-options {
@@ -2,8 +2,12 @@
2
2
 
3
3
  import "./styles.css";
4
4
 
5
+ // Hidden from assistive tech, which reads "required" from the field itself.
5
6
  const MandatoryAsterisk = () => (
6
- <span className="k-mandatory-asterisk"> *</span>
7
+ <span className="k-mandatory-asterisk" aria-hidden="true">
8
+ {" "}
9
+ *
10
+ </span>
7
11
  );
8
12
 
9
13
  export default MandatoryAsterisk;
@@ -1,3 +1,3 @@
1
1
  .k-mandatory-asterisk {
2
- color: var(--danger-color);
2
+ color: var(--k-danger-color-text);
3
3
  }
@@ -1,6 +1,7 @@
1
1
  export { default as RecoveryCodeGrid } from "./data-display/recoveryCodeGrid/index.js";
2
2
  export { default as ConfirmationModal } from "./overlays/confirmationModal/index.js";
3
3
  export { default as InfiniteScroll } from "./data-display/infiniteScroll/index.js";
4
+ export { default as TableFilters } from "./data-display/tableFilters/index.js";
4
5
  export {
5
6
  DateInput,
6
7
  DateTimeInput,
@@ -39,6 +40,7 @@ export { default as RadioGroup } from "./inputs/radioGroup/index.js";
39
40
  export { default as ListRow } from "./data-display/listRow/index.js";
40
41
  export { default as TagCard } from "./data-display/tagCard/index.js";
41
42
  export { default as Stepper } from "./navigation/stepper/index.js";
43
+ export { default as Pagination } from "./navigation/pagination/index.js";
42
44
  export { default as Typeahead } from "./inputs/typeahead/index.js";
43
45
  export { default as AuthPage } from "./layout/authPage/index.js";
44
46
  export { default as Checkbox } from "./inputs/checkbox/index.js";
@@ -120,6 +122,8 @@ export type {
120
122
  AddressBlockProps,
121
123
  AddressBlockAddress,
122
124
  } from "./data-display/addressBlock/index.js";
125
+ export type { PaginationProps } from "./navigation/pagination/index.js";
126
+ export type { TableFiltersProps } from "./data-display/tableFilters/index.js";
123
127
  export type {
124
128
  StepperProps,
125
129
  StepperStep,
@@ -1,27 +1,45 @@
1
1
  "use client";
2
2
 
3
3
  import MandatoryAsterisk from "../../forms/requiredAsterisk/index.js";
4
+ import { useId } from "react";
4
5
  import "./styles.css";
5
6
 
6
7
  interface CheckboxProps {
7
8
  label?: string | React.ReactNode;
8
9
  labelLocation?: "top" | "right" | "bottom" | "left";
9
10
  checked: boolean;
10
- onChange: (event: React.ChangeEvent<HTMLInputElement>) => void;
11
+ /** **_Optional_** only when `readOnly`, which never calls it */
12
+ onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void;
11
13
  onClick?: (event: React.MouseEvent<HTMLInputElement>) => void;
12
14
  /** **_Optional_** whether the field is required (shows red asterisk and enables validation) */
13
15
  required?: boolean;
14
16
  /** **_Optional_** if the checkbox is disabled */
15
17
  disabled?: boolean;
18
+ /** **_Optional_** if the checkbox is read-only: unlike `disabled`, it stays focusable and is announced as read-only */
19
+ readOnly?: boolean;
16
20
  /** **_Optional_** ID of the field. If one is not provided, it will be randomly generated */
17
21
  id?: string;
22
+ /** **_Optional_** accessible name when there's no visible `label` (e.g. a row-select checkbox) */
23
+ "aria-label"?: string;
18
24
  }
19
25
 
20
26
  const Checkbox = (props: CheckboxProps) => {
21
- const { labelLocation = "top", disabled = false, required = false } = props;
27
+ const {
28
+ labelLocation = "top",
29
+ disabled = false,
30
+ required = false,
31
+ readOnly = false,
32
+ } = props;
22
33
 
23
- const inputId =
24
- props.id || `checkbox-${Math.random().toString(36).substring(2, 9)}`;
34
+ const generatedId = useId();
35
+ const inputId = props.id || `checkbox-${generatedId}`;
36
+
37
+ // Browsers ignore `readonly` on checkboxes, so a click (or Space) is
38
+ // cancelled here instead; aria-readonly tells assistive tech why.
39
+ const handleClick = (event: React.MouseEvent<HTMLInputElement>) => {
40
+ if (readOnly) event.preventDefault();
41
+ props.onClick?.(event);
42
+ };
25
43
 
26
44
  return (
27
45
  <div className={`k-checkbox-container k-${labelLocation}`}>
@@ -42,8 +60,11 @@ const Checkbox = (props: CheckboxProps) => {
42
60
  type="checkbox"
43
61
  required={required}
44
62
  checked={props.checked}
45
- onClick={props.onClick}
46
- onChange={props.onChange}
63
+ onClick={handleClick}
64
+ onChange={readOnly ? undefined : props.onChange}
65
+ readOnly={readOnly}
66
+ aria-readonly={readOnly || undefined}
67
+ aria-label={props["aria-label"]}
47
68
  className="k-checkbox"
48
69
  disabled={disabled}
49
70
  />
@@ -25,7 +25,7 @@
25
25
  height: 1.25rem;
26
26
  width: 1.25rem;
27
27
  border-radius: 0.25rem;
28
- border-color: var(--border-color);
28
+ border-color: var(--k-border-color);
29
29
  }
30
30
 
31
31
  .k-checkbox-label {
@@ -33,7 +33,15 @@
33
33
  margin-bottom: 0.1rem;
34
34
  font-size: 0.875rem;
35
35
  font-weight: 500;
36
- color: var(--text-color);
36
+ color: var(--k-text-color);
37
+ }
38
+
39
+ .k-checkbox[aria-readonly="true"] {
40
+ cursor: default;
41
+ }
42
+
43
+ .k-checkbox-label:has(+ .k-checkbox[aria-readonly="true"]) {
44
+ color: var(--k-text-color-secondary);
37
45
  }
38
46
 
39
47
  .k-checkbox:disabled {
@@ -43,6 +51,6 @@
43
51
 
44
52
  .k-checkbox:disabled + .k-checkbox-label,
45
53
  .k-checkbox-label:has(+ .k-checkbox:disabled) {
46
- color: var(--text-color-disabled);
54
+ color: var(--k-text-color-disabled);
47
55
  cursor: not-allowed;
48
56
  }
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
 
3
+ import { ChangeEvent, useId } from "react";
3
4
  import Input from "../input/index.js";
4
- import { ChangeEvent } from "react";
5
5
  import "./styles.css";
6
6
 
7
7
  export interface ColorPickerProps {
@@ -30,6 +30,7 @@ const ColorPicker = ({
30
30
  required,
31
31
  invalidMessage = DEFAULT_INVALID_MESSAGE,
32
32
  }: ColorPickerProps) => {
33
+ const inputId = useId();
33
34
  const trimmed = value.trim();
34
35
  const isEmpty = trimmed === "";
35
36
  const isValid = HEX_RE.test(trimmed);
@@ -46,7 +47,7 @@ const ColorPicker = ({
46
47
  return (
47
48
  <div className="k-color-picker">
48
49
  {label && (
49
- <label className="k-color-picker-label">
50
+ <label className="k-color-picker-label" htmlFor={inputId}>
50
51
  {label}
51
52
  {required && <span aria-hidden> *</span>}
52
53
  </label>
@@ -61,9 +62,11 @@ const ColorPicker = ({
61
62
  />
62
63
  <div className="k-color-picker-input">
63
64
  <Input
65
+ id={inputId}
64
66
  value={value}
65
67
  onChange={(e) => onChange(e.target.value)}
66
68
  placeholder={placeholder}
69
+ required={required}
67
70
  />
68
71
  </div>
69
72
  </div>
@@ -7,7 +7,7 @@
7
7
  .k-color-picker-label {
8
8
  font-size: 0.875rem;
9
9
  font-weight: 500;
10
- color: var(--text-color);
10
+ color: var(--k-text-color);
11
11
  }
12
12
 
13
13
  .k-color-picker-row {
@@ -21,7 +21,7 @@
21
21
  -webkit-appearance: none;
22
22
  width: 2.5rem;
23
23
  height: 2.5rem;
24
- border: 0.0625rem solid var(--border-color);
24
+ border: 0.0625rem solid var(--k-border-color);
25
25
  border-radius: 0.375rem;
26
26
  padding: 0;
27
27
  cursor: pointer;
@@ -48,5 +48,5 @@
48
48
 
49
49
  .k-color-picker-error {
50
50
  font-size: 0.8125rem;
51
- color: var(--danger-color);
51
+ color: var(--k-danger-color-text);
52
52
  }
@@ -1,10 +1,9 @@
1
1
  "use client";
2
2
 
3
3
  import FieldShell from "../../forms/fieldShell/index.js";
4
- import { ChangeEvent } from "react";
4
+ import { ChangeEvent, useId } from "react";
5
5
  import "./styles.css";
6
6
  import {
7
- dateInputToIso,
8
7
  dateTimeLocalToIso,
9
8
  toDateInputValue,
10
9
  toDateTimeLocalValue,
@@ -23,10 +22,10 @@ export interface DateInputBaseProps {
23
22
  }
24
23
 
25
24
  export interface DateInputProps extends DateInputBaseProps {
26
- /** Accepts an ISO string or `Date`. Empty string and null both mean "no value". */
25
+ /** Accepts a `yyyy-mm-dd` date, an ISO string or `Date`. Empty string and null both mean "no value". */
27
26
  value: string | Date | null;
28
- /** Fires with an ISO date-time string (start-of-day) or `null` when cleared. */
29
- onChange: (iso: string | null) => void;
27
+ /** Fires with the picked calendar day as `yyyy-mm-dd`, or `null` when cleared. */
28
+ onChange: (date: string | null) => void;
30
29
  }
31
30
 
32
31
  export interface DateTimeInputProps extends DateInputBaseProps {
@@ -50,11 +49,14 @@ export const DateInput = ({
50
49
  disabled,
51
50
  min,
52
51
  max,
53
- id,
52
+ id: idProp,
54
53
  name,
55
54
  }: DateInputProps) => {
55
+ // Without an id the label isn't linked to the input.
56
+ const fallbackId = useId();
57
+ const id = idProp ?? fallbackId;
56
58
  const handle = (e: ChangeEvent<HTMLInputElement>) =>
57
- onChange(dateInputToIso(e.target.value));
59
+ onChange(e.target.value || null);
58
60
  return (
59
61
  <FieldShell
60
62
  label={label}
@@ -89,9 +91,12 @@ export const DateTimeInput = ({
89
91
  disabled,
90
92
  min,
91
93
  max,
92
- id,
94
+ id: idProp,
93
95
  name,
94
96
  }: DateTimeInputProps) => {
97
+ // Without an id the label isn't linked to the input.
98
+ const fallbackId = useId();
99
+ const id = idProp ?? fallbackId;
95
100
  const handle = (e: ChangeEvent<HTMLInputElement>) =>
96
101
  onChange(dateTimeLocalToIso(e.target.value));
97
102
  return (
@@ -128,9 +133,12 @@ export const TimeInput = ({
128
133
  disabled,
129
134
  min,
130
135
  max,
131
- id,
136
+ id: idProp,
132
137
  name,
133
138
  }: TimeInputProps) => {
139
+ // Without an id the label isn't linked to the input.
140
+ const fallbackId = useId();
141
+ const id = idProp ?? fallbackId;
134
142
  const handle = (e: ChangeEvent<HTMLInputElement>) =>
135
143
  onChange(e.target.value || null);
136
144
  return (
@@ -1,19 +1,19 @@
1
1
  .k-date-input-field {
2
- border: 0.0625rem solid var(--border-color);
2
+ border: 0.0625rem solid var(--k-border-color);
3
3
  border-radius: 0.375rem;
4
4
  padding: 0.5rem 0.625rem;
5
5
  font-size: 0.9375rem;
6
- background-color: var(--background-color);
7
- color: var(--text-color);
6
+ background-color: var(--k-background-color);
7
+ color: var(--k-text-color);
8
8
  width: 100%;
9
9
  box-sizing: border-box;
10
10
  }
11
11
 
12
12
  .k-date-input-field:focus {
13
13
  outline: none;
14
- border-color: var(--primary-color);
14
+ border-color: var(--k-primary-color);
15
15
  box-shadow: 0 0 0 0.125rem
16
- color-mix(in srgb, var(--primary-color) 30%, transparent);
16
+ color-mix(in srgb, var(--k-primary-color) 30%, transparent);
17
17
  }
18
18
 
19
19
  .k-date-input-field:disabled {
@@ -1,10 +1,20 @@
1
1
  const pad = (n: number) => n.toString().padStart(2, "0");
2
2
 
3
+ // `new Date("2024-01-05")` is UTC midnight, which is the previous day west of
4
+ // UTC; a date-only string means that calendar day locally.
5
+ const toDate = (value: string | Date): Date => {
6
+ if (value instanceof Date) return value;
7
+ const dateOnly = /^(\d{4})-(\d{2})-(\d{2})$/.exec(value);
8
+ if (!dateOnly) return new Date(value);
9
+ const [, y, m, d] = dateOnly.map(Number);
10
+ return new Date(y, m - 1, d);
11
+ };
12
+
3
13
  export const toDateInputValue = (
4
14
  value: string | Date | null | undefined
5
15
  ): string => {
6
16
  if (value == null || value === "") return "";
7
- const d = value instanceof Date ? value : new Date(value);
17
+ const d = toDate(value);
8
18
  if (Number.isNaN(d.getTime())) return "";
9
19
  return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;
10
20
  };
@@ -13,19 +23,13 @@ export const toDateTimeLocalValue = (
13
23
  value: string | Date | null | undefined
14
24
  ): string => {
15
25
  if (value == null || value === "") return "";
16
- const d = value instanceof Date ? value : new Date(value);
26
+ const d = toDate(value);
17
27
  if (Number.isNaN(d.getTime())) return "";
18
28
  return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(
19
29
  d.getHours()
20
30
  )}:${pad(d.getMinutes())}`;
21
31
  };
22
32
 
23
- export const dateInputToIso = (value: string): string | null => {
24
- if (!value) return null;
25
- const d = new Date(`${value}T00:00:00`);
26
- return Number.isNaN(d.getTime()) ? null : d.toISOString();
27
- };
28
-
29
33
  export const dateTimeLocalToIso = (value: string): string | null => {
30
34
  if (!value) return null;
31
35
  const d = new Date(value);
@@ -23,6 +23,8 @@ export interface DropdownProps extends PropsWithSize, PropsWithVariant {
23
23
  isOpen?: boolean;
24
24
  /** Controlled mode: callback when open state changes */
25
25
  onOpenChange?: (isOpen: boolean) => void;
26
+ /** Accessible name for the trigger. Required when it shows only an `icon`. */
27
+ "aria-label"?: string;
26
28
  }
27
29
 
28
30
  const Dropdown = (props: DropdownProps) => {
@@ -44,7 +46,7 @@ const Dropdown = (props: DropdownProps) => {
44
46
  setIsOpen(!isOpen);
45
47
  };
46
48
 
47
- useOutsideClick([dropdownRef], () => setIsOpen(false));
49
+ useOutsideClick([dropdownRef], () => setIsOpen(false), isOpen);
48
50
 
49
51
  const label = (
50
52
  <div className="k-dropdown-label-container">
@@ -63,6 +65,7 @@ const Dropdown = (props: DropdownProps) => {
63
65
  variant={props.variant}
64
66
  icon={props.icon}
65
67
  onClick={handleTriggerClick}
68
+ aria-label={props["aria-label"]}
66
69
  >
67
70
  {props.label && label}
68
71
  </IconButton>
@@ -71,6 +74,7 @@ const Dropdown = (props: DropdownProps) => {
71
74
  size={props.size}
72
75
  variant={props.variant}
73
76
  onClick={handleTriggerClick}
77
+ aria-label={props["aria-label"]}
74
78
  >
75
79
  {props.label && label}
76
80
  </Button>
@@ -7,9 +7,9 @@
7
7
  .k-dropdown-menu {
8
8
  position: absolute;
9
9
  top: 100%;
10
- background-color: var(--background-color);
10
+ background-color: var(--k-background-color);
11
11
  border-radius: 0.5rem;
12
- box-shadow: 0 0.375rem 1.25rem var(--shadow-color);
12
+ box-shadow: 0 0.375rem 1.25rem var(--k-shadow-color);
13
13
  overflow: hidden;
14
14
  transform: translateY(-0.625rem);
15
15
  opacity: 0;