@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
@@ -25,6 +25,7 @@ const DropdownArrowButton = ({
25
25
  onClick={onClick}
26
26
  tabIndex={-1}
27
27
  disabled={disabled}
28
+ aria-label={isOpen ? "Hide options" : "Show options"}
28
29
  >
29
30
  <FontAwesomeIcon
30
31
  icon={faChevronDown}
@@ -1,21 +1,26 @@
1
1
  /* Generic dropdown arrow toggle — used by Input (dropDown), MultiSelect, etc. */
2
+ /* Spans the field's height and centers the chevron, however tall the field
3
+ grows (MultiSelect with chips). */
2
4
  .k-dropdown-arrow {
3
5
  position: absolute;
6
+ top: 0;
7
+ bottom: 0;
4
8
  right: 0.75rem;
9
+ display: flex;
5
10
  background: none;
6
11
  border: none;
7
12
  cursor: pointer;
8
13
  padding: 0;
9
14
  align-items: center;
10
15
  justify-content: center;
11
- color: var(--text-color-secondary);
16
+ color: var(--k-text-color-secondary);
12
17
  transition:
13
18
  color 0.2s ease-in-out,
14
19
  transform 0.2s ease-in-out;
15
20
  }
16
21
 
17
22
  .k-dropdown-arrow:hover:not(:disabled) {
18
- color: var(--primary-color);
23
+ color: var(--k-primary-color-text);
19
24
  }
20
25
 
21
26
  .k-dropdown-arrow:focus {
@@ -29,17 +34,14 @@
29
34
 
30
35
  .k-dropdown-arrow-sm {
31
36
  font-size: 0.75rem;
32
- top: 0.5rem;
33
37
  }
34
38
 
35
39
  .k-dropdown-arrow-md {
36
40
  font-size: 0.875rem;
37
- top: 0.625rem;
38
41
  }
39
42
 
40
43
  .k-dropdown-arrow-lg {
41
44
  font-size: 1rem;
42
- top: 0.75rem;
43
45
  }
44
46
 
45
47
  .k-dropdown-arrow-open {
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { useState } from "react";
3
+ import { useId, useState } from "react";
4
4
  import "./styles.css";
5
5
 
6
6
  export interface FileDropZoneProps {
@@ -24,6 +24,7 @@ const FileDropZone = ({
24
24
  label = "Drag and drop files here",
25
25
  }: FileDropZoneProps) => {
26
26
  const [isDragging, setIsDragging] = useState(false);
27
+ const inputId = useId();
27
28
 
28
29
  const validateFileType = (file: File): boolean => {
29
30
  if (!accept) return true;
@@ -104,14 +105,14 @@ const FileDropZone = ({
104
105
  >
105
106
  <p>{label}</p>
106
107
  <p>or</p>
107
- <label htmlFor="file-drop-zone-input" className="k-file-drop-zone-button">
108
+ <label htmlFor={inputId} className="k-file-drop-zone-button">
108
109
  Browse Files
109
110
  </label>
110
111
  <input
111
112
  type="file"
112
113
  accept={accept}
113
114
  multiple
114
- id="file-drop-zone-input"
115
+ id={inputId}
115
116
  onChange={handleFileChange}
116
117
  style={{ display: "none" }}
117
118
  />
@@ -1,43 +1,43 @@
1
1
  .k-file-drop-zone {
2
- border: 0.125rem dashed var(--border-color);
2
+ border: 0.125rem dashed var(--k-border-color);
3
3
  border-radius: 0.5rem;
4
4
  padding: 2rem;
5
5
  text-align: center;
6
- background-color: var(--background-color-dark);
6
+ background-color: var(--k-background-color-dark);
7
7
  transition: all 0.2s ease;
8
8
  margin-bottom: 1rem;
9
9
  cursor: pointer;
10
10
  }
11
11
 
12
12
  .k-file-drop-zone:hover {
13
- border-color: var(--primary-color);
14
- background-color: var(--background-color-hover);
13
+ border-color: var(--k-primary-color);
14
+ background-color: var(--k-background-color-hover);
15
15
  }
16
16
 
17
17
  .k-file-drop-zone-dragging {
18
- border-color: var(--primary-color);
19
- background-color: var(--primary-color-light);
18
+ border-color: var(--k-primary-color);
19
+ background-color: var(--k-primary-color-background-light);
20
20
  border-style: solid;
21
21
  }
22
22
 
23
23
  .k-file-drop-zone p {
24
24
  margin: 0.5rem 0;
25
- color: var(--text-color);
26
- font-size: var(--text-size-sm);
25
+ color: var(--k-text-color);
26
+ font-size: var(--k-text-size-sm);
27
27
  }
28
28
 
29
29
  .k-file-drop-zone-button {
30
30
  display: inline-block;
31
31
  padding: 0.5rem 1rem;
32
- background-color: var(--primary-color);
33
- color: var(--text-color-light);
32
+ background-color: var(--k-primary-color);
33
+ color: var(--k-text-color-light);
34
34
  border-radius: 0.5rem;
35
35
  cursor: pointer;
36
- font-size: var(--text-size-sm);
36
+ font-size: var(--k-text-size-sm);
37
37
  font-weight: 600;
38
38
  transition: background-color 0.2s ease;
39
39
  }
40
40
 
41
41
  .k-file-drop-zone-button:hover {
42
- background-color: var(--primary-color-hover);
42
+ background-color: var(--k-primary-color-hover);
43
43
  }
@@ -4,7 +4,7 @@ import MandatoryAsterisk from "../../forms/requiredAsterisk/index.js";
4
4
  import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
5
5
  import { PropsWithSize, PropsWithVariant } from "../../types.js";
6
6
  import IconButton from "../../buttons/iconButton/index.js";
7
- import { useEffect, useRef, useState } from "react";
7
+ import { useEffect, useId, useRef, useState } from "react";
8
8
  import Button from "../../buttons/button/index.js";
9
9
  import Modal from "../../overlays/modal/index.js";
10
10
  import "./styles.css";
@@ -101,8 +101,8 @@ const FileUpload = (props: FileUploadProps) => {
101
101
  maxSize: string;
102
102
  }>({ files: [], maxSize: "" });
103
103
 
104
- const componentId =
105
- props.id || `fileupload-${Math.random().toString(36).substring(2, 9)}`;
104
+ const generatedId = useId();
105
+ const componentId = props.id || `fileupload-${generatedId}`;
106
106
  const directoryId = `${componentId}-dir`;
107
107
 
108
108
  // `webkitdirectory` isn't in React's DOM type map; set it imperatively.
@@ -116,8 +116,11 @@ const FileUpload = (props: FileUploadProps) => {
116
116
  const formatFileSize = (bytes: number): string => {
117
117
  if (bytes === 0) return "0 Bytes";
118
118
  const k = 1024;
119
- const sizes = ["Bytes", "KB", "MB", "GB"];
120
- const i = Math.floor(Math.log(bytes) / Math.log(k));
119
+ const sizes = ["Bytes", "KB", "MB", "GB", "TB"];
120
+ const i = Math.min(
121
+ Math.floor(Math.log(bytes) / Math.log(k)),
122
+ sizes.length - 1
123
+ );
121
124
  return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + " " + sizes[i];
122
125
  };
123
126
 
@@ -134,6 +137,8 @@ const FileUpload = (props: FileUploadProps) => {
134
137
  const fileNames = oversizedFiles.map((f) => f.name);
135
138
  setOversizedFileInfo({ files: fileNames, maxSize: maxSizeFormatted });
136
139
  setShowSizeModal(true);
140
+ // Rejected files must not stay in the input, or a form would submit them.
141
+ event.target.value = "";
137
142
  return;
138
143
  }
139
144
  }
@@ -178,13 +183,6 @@ const FileUpload = (props: FileUploadProps) => {
178
183
  <div className="k-file-list-header">
179
184
  <span>Selected Files ({selectedFiles.length})</span>
180
185
  <div className="k-file-list-actions">
181
- <Button
182
- onClick={() => fileInputRef.current?.click()}
183
- variant={variant}
184
- size={size}
185
- >
186
- Change File{selectedFiles.length > 1 ? "s" : ""}
187
- </Button>
188
186
  <Button onClick={handleClearFiles} variant="danger" size={size}>
189
187
  Clear All
190
188
  </Button>
@@ -203,6 +201,7 @@ const FileUpload = (props: FileUploadProps) => {
203
201
  <IconButton
204
202
  icon={faTrash}
205
203
  onClick={() => handleRemoveFile(index)}
204
+ aria-label={`Remove ${file.name}`}
206
205
  variant="danger"
207
206
  size={size}
208
207
  />
@@ -215,11 +214,12 @@ const FileUpload = (props: FileUploadProps) => {
215
214
  return (
216
215
  <div className={"k-file-upload-container"}>
217
216
  {props.label && (
218
- <label className="k-file-upload-label-text">
217
+ <label htmlFor={componentId} className="k-file-upload-label-text">
219
218
  {props.label}
220
219
  {required && <MandatoryAsterisk />}
221
220
  </label>
222
221
  )}
222
+ {/* Hidden: the buttons below open these, and are the keyboard path. */}
223
223
  <input
224
224
  type="file"
225
225
  accept={props.accept}
@@ -229,6 +229,8 @@ const FileUpload = (props: FileUploadProps) => {
229
229
  className="k-file-upload-input"
230
230
  id={componentId}
231
231
  required={required}
232
+ aria-label={multiple ? "Upload Files" : "Upload File"}
233
+ tabIndex={-1}
232
234
  />
233
235
  {props.allowDirectory && (
234
236
  <input
@@ -238,27 +240,35 @@ const FileUpload = (props: FileUploadProps) => {
238
240
  ref={directoryInputRef}
239
241
  className="k-file-upload-input"
240
242
  id={directoryId}
243
+ aria-label="Upload Folder"
244
+ tabIndex={-1}
241
245
  />
242
246
  )}
243
247
 
244
248
  {fileListPosition === "above" && fileList}
245
249
 
246
- {selectedFiles.length === 0 && (
250
+ {/* A custom renderFiles brings its own controls once files are chosen. */}
251
+ {(selectedFiles.length === 0 || !props.renderFiles) && (
247
252
  <div className="k-file-upload-empty-actions">
248
- <label
249
- htmlFor={componentId}
253
+ <button
254
+ type="button"
255
+ onClick={() => fileInputRef.current?.click()}
250
256
  className={`k-button k-button-${variant} k-button-${size} k-button-center k-file-upload-button`}
251
257
  >
252
- <FontAwesomeIcon icon={faUpload} /> Upload{" "}
253
- {multiple ? "Files" : "File"}
254
- </label>
258
+ <FontAwesomeIcon icon={faUpload} aria-hidden="true" />{" "}
259
+ {selectedFiles.length === 0
260
+ ? `Upload ${multiple ? "Files" : "File"}`
261
+ : `Change File${selectedFiles.length > 1 ? "s" : ""}`}
262
+ </button>
255
263
  {props.allowDirectory && (
256
- <label
257
- htmlFor={directoryId}
264
+ <button
265
+ type="button"
266
+ onClick={() => directoryInputRef.current?.click()}
258
267
  className={`k-button k-button-${variant} k-button-${size} k-button-center k-file-upload-button`}
259
268
  >
260
- <FontAwesomeIcon icon={faFolderOpen} /> Upload Folder
261
- </label>
269
+ <FontAwesomeIcon icon={faFolderOpen} aria-hidden="true" /> Upload
270
+ Folder
271
+ </button>
262
272
  )}
263
273
  </div>
264
274
  )}
@@ -26,16 +26,16 @@
26
26
  margin-bottom: 0.5rem;
27
27
  font-size: 0.875rem;
28
28
  font-weight: 500;
29
- color: var(--text-color);
29
+ color: var(--k-text-color);
30
30
  width: 100%;
31
31
  text-align: left;
32
32
  }
33
33
 
34
34
  .k-file-list {
35
35
  width: 100%;
36
- border: 1px solid var(--border-color);
36
+ border: 1px solid var(--k-border-color);
37
37
  border-radius: 0.375rem;
38
- background-color: var(--light-bg);
38
+ background-color: var(--k-background-color-light);
39
39
  }
40
40
 
41
41
  .k-file-list-header {
@@ -43,8 +43,8 @@
43
43
  justify-content: space-between;
44
44
  align-items: center;
45
45
  padding: 0.75rem 1rem;
46
- border-bottom: 1px solid var(--border-color);
47
- background-color: var(--lighter-bg);
46
+ border-bottom: 1px solid var(--k-border-color);
47
+ background-color: var(--k-background-color-dark);
48
48
  font-weight: 500;
49
49
  }
50
50
 
@@ -66,7 +66,7 @@
66
66
  align-items: center;
67
67
  gap: 0.75rem;
68
68
  padding: 0.75rem 1rem;
69
- border-bottom: 1px solid var(--border-color);
69
+ border-bottom: 1px solid var(--k-border-color);
70
70
  transition: background-color 0.2s;
71
71
  }
72
72
 
@@ -75,7 +75,7 @@
75
75
  }
76
76
 
77
77
  .k-file-list-item:hover {
78
- background-color: var(--lighter-bg);
78
+ background-color: var(--k-background-color-hover);
79
79
  }
80
80
 
81
81
  .k-file-info {
@@ -86,7 +86,7 @@
86
86
  }
87
87
 
88
88
  .k-file-icon {
89
- color: var(--secondary-color);
89
+ color: var(--k-secondary-color);
90
90
  flex-shrink: 0;
91
91
  }
92
92
 
@@ -98,7 +98,7 @@
98
98
  }
99
99
 
100
100
  .k-file-size {
101
- color: var(--text-muted);
101
+ color: var(--k-text-color-secondary);
102
102
  font-size: 0.875rem;
103
103
  flex-shrink: 0;
104
104
  }
@@ -1,11 +1,11 @@
1
1
  "use client";
2
2
 
3
- import { faEye, faEyeSlash } from "@fortawesome/free-solid-svg-icons";
3
+ import { faEye, faEyeSlash, faXmark } from "@fortawesome/free-solid-svg-icons";
4
+ import { ReactNode, useCallback, useId, useRef, useState } from "react";
4
5
  import DropdownArrowButton from "../dropdownArrowButton/index.js";
5
6
  import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
6
7
  import FieldShell from "../../forms/fieldShell/index.js";
7
8
  import { PropsWithSize } from "../../types.js";
8
- import { ReactNode, useState } from "react";
9
9
  import "./styles.css";
10
10
 
11
11
  interface InputProps extends PropsWithSize {
@@ -27,6 +27,8 @@ interface InputProps extends PropsWithSize {
27
27
 
28
28
  /** **_Optional_** if the field is disabled */
29
29
  disabled?: boolean;
30
+ /** **_Optional_** if the field is read-only: unlike `disabled`, it stays focusable and is submitted */
31
+ readOnly?: boolean;
30
32
  /** **_Optional_** if the field is a dropdown */
31
33
  dropDown?: boolean;
32
34
  /** **_Optional_** whether or not the drop down options are open */
@@ -73,6 +75,20 @@ interface InputProps extends PropsWithSize {
73
75
  onKeyDown?: React.KeyboardEventHandler<HTMLInputElement>;
74
76
  /** **_Optional_** function that is called when the input is clicked */
75
77
  onClick?: React.MouseEventHandler<HTMLInputElement>;
78
+ /** **_Optional_** `combobox` when the input drives a popup list of suggestions */
79
+ role?: "combobox";
80
+ /** **_Optional_** with `role="combobox"`, whether its popup is showing */
81
+ "aria-expanded"?: boolean;
82
+ /** **_Optional_** with `role="combobox"`, how suggestions relate to what's typed */
83
+ "aria-autocomplete"?: "list" | "inline" | "both" | "none";
84
+ /** **_Optional_** accessible name when there's no visible `label` */
85
+ "aria-label"?: string;
86
+ /** **_Optional_** id of the element (e.g. a listbox) this input controls */
87
+ "aria-controls"?: string;
88
+ /** **_Optional_** id of the option highlighted in the controlled element, while focus stays in the input */
89
+ "aria-activedescendant"?: string;
90
+ /** **_Optional_** shows an × button at the end of a non-empty field; clear the value here. Sits at the right edge, so don't combine with `suffix` or `type="password"` */
91
+ onClear?: () => void;
76
92
  }
77
93
 
78
94
  const Input = (props: InputProps) => {
@@ -86,9 +102,34 @@ const Input = (props: InputProps) => {
86
102
  suffix,
87
103
  } = props;
88
104
  const [showPassword, setShowPassword] = useState(false);
105
+ const inputRef = useRef<HTMLInputElement | null>(null);
106
+ const { ref: forwardedRef } = props;
89
107
 
90
- const inputId =
91
- props.id || `input-${Math.random().toString(36).substring(2, 9)}`;
108
+ // Keep our own handle on the input (the clear button refocuses it) while
109
+ // still honouring a caller's `ref`.
110
+ const setRefs = useCallback(
111
+ (el: HTMLInputElement | null) => {
112
+ inputRef.current = el;
113
+ if (typeof forwardedRef === "function") forwardedRef(el);
114
+ else if (forwardedRef) forwardedRef.current = el;
115
+ },
116
+ [forwardedRef]
117
+ );
118
+
119
+ const showClear =
120
+ !!props.onClear &&
121
+ String(props.value ?? "") !== "" &&
122
+ !disabled &&
123
+ !props.readOnly;
124
+
125
+ const handleClear = () => {
126
+ props.onClear?.();
127
+ // The button unmounts once the field is empty; keep focus in the field.
128
+ inputRef.current?.focus();
129
+ };
130
+
131
+ const generatedId = useId();
132
+ const inputId = props.id || `input-${generatedId}`;
92
133
 
93
134
  const togglePasswordVisibility = () => {
94
135
  setShowPassword(!showPassword);
@@ -102,6 +143,7 @@ const Input = (props: InputProps) => {
102
143
  "k-input",
103
144
  `k-input-${size}`,
104
145
  type === "password" && "k-input-password",
146
+ props.onClear && "k-input-clearable",
105
147
  hasAddon && "k-input-with-addon",
106
148
  prefix !== undefined && "k-input-with-prefix",
107
149
  suffix !== undefined && "k-input-with-suffix",
@@ -110,9 +152,11 @@ const Input = (props: InputProps) => {
110
152
  .join(" ");
111
153
 
112
154
  const renderAddon = (content: ReactNode, side: "prefix" | "suffix") => (
155
+ // Not aria-hidden: addons can be interactive (PhoneInput's country
156
+ // picker), and text like "$" or "USD" is useful context. Icons hide
157
+ // themselves.
113
158
  <span
114
159
  className={`k-input-addon k-input-addon-${side} k-input-addon-${size}`}
115
- aria-hidden="true"
116
160
  >
117
161
  {content}
118
162
  </span>
@@ -140,7 +184,7 @@ const Input = (props: InputProps) => {
140
184
  >
141
185
  {prefix !== undefined && renderAddon(prefix, "prefix")}
142
186
  <input
143
- ref={props.ref}
187
+ ref={setRefs}
144
188
  id={inputId}
145
189
  name={props.name}
146
190
  type={inputType}
@@ -152,13 +196,30 @@ const Input = (props: InputProps) => {
152
196
  autoFocus={props.autoFocus}
153
197
  autoComplete={props.autoComplete}
154
198
  disabled={disabled}
199
+ readOnly={props.readOnly}
155
200
  onChange={props.onChange}
156
201
  onFocus={props.onFocus}
157
202
  onBlur={props.onBlur}
158
203
  onClick={props.onClick}
159
204
  onKeyDown={props.onKeyDown}
205
+ role={props.role}
206
+ aria-expanded={props["aria-expanded"]}
207
+ aria-autocomplete={props["aria-autocomplete"]}
208
+ aria-label={props["aria-label"]}
209
+ aria-controls={props["aria-controls"]}
210
+ aria-activedescendant={props["aria-activedescendant"]}
160
211
  className={inputClasses}
161
212
  />
213
+ {showClear && (
214
+ <button
215
+ type="button"
216
+ onClick={handleClear}
217
+ className="k-input-clear-button"
218
+ aria-label="Clear"
219
+ >
220
+ <FontAwesomeIcon icon={faXmark} />
221
+ </button>
222
+ )}
162
223
  {suffix !== undefined && renderAddon(suffix, "suffix")}
163
224
  {props.dropDown && (
164
225
  <DropdownArrowButton
@@ -6,10 +6,10 @@
6
6
  }
7
7
 
8
8
  .k-input {
9
- background-color: var(--background-color-light);
10
- border: 0.0625rem solid var(--border-color);
9
+ background-color: var(--k-background-color-light);
10
+ border: 0.0625rem solid var(--k-border-color);
11
11
  border-radius: 0.375rem;
12
- color: var(--text-color);
12
+ color: var(--k-text-color);
13
13
  width: 100%;
14
14
  box-sizing: border-box;
15
15
  transition:
@@ -18,17 +18,17 @@
18
18
  }
19
19
 
20
20
  .k-input-sm {
21
- font-size: var(--text-size-sm);
21
+ font-size: var(--k-text-size-sm);
22
22
  padding: 0.5rem 0.75rem;
23
23
  }
24
24
 
25
25
  .k-input-md {
26
- font-size: var(--text-size-md);
26
+ font-size: var(--k-text-size-md);
27
27
  padding: 0.625rem 1rem;
28
28
  }
29
29
 
30
30
  .k-input-lg {
31
- font-size: var(--text-size-lg);
31
+ font-size: var(--k-text-size-lg);
32
32
  padding: 0.75rem 1.25rem;
33
33
  }
34
34
 
@@ -37,30 +37,74 @@
37
37
  }
38
38
 
39
39
  .k-input::placeholder {
40
- color: var(--text-color-secondary);
40
+ color: var(--k-text-color-secondary);
41
41
  opacity: 0.7;
42
42
  }
43
43
 
44
44
  .k-input[type="date"]:empty {
45
- color: var(--text-color-secondary);
45
+ color: var(--k-text-color-secondary);
46
46
  }
47
47
 
48
48
  .k-input:focus {
49
49
  outline: none;
50
- border-color: var(--border-color-active);
51
- box-shadow: 0 0 0 0.1875rem var(--border-shadow-color-active);
50
+ border-color: var(--k-border-color-active);
51
+ box-shadow: 0 0 0 0.1875rem var(--k-border-shadow-color-active);
52
+ }
53
+
54
+ /* No opacity, unlike disabled: a read-only value keeps full text contrast. */
55
+ .k-input[readonly]:not(:disabled) {
56
+ background-color: var(--k-background-color-dark);
57
+ color: var(--k-text-color-secondary);
58
+ cursor: default;
52
59
  }
53
60
 
54
61
  .k-input:disabled {
55
- background-color: var(--bg-color-disabled);
56
- color: var(--text-color-disabled);
62
+ background-color: var(--k-background-color-disabled);
63
+ color: var(--k-text-color-disabled);
57
64
  cursor: not-allowed;
58
65
  opacity: 0.6;
59
66
  }
60
67
 
68
+ .k-input-clearable {
69
+ padding-right: 2.25rem;
70
+ }
71
+
72
+ .k-input-clear-button {
73
+ position: absolute;
74
+ right: 0.5rem;
75
+ top: 50%;
76
+ transform: translateY(-50%);
77
+ display: flex;
78
+ align-items: center;
79
+ justify-content: center;
80
+ width: 1.5rem;
81
+ height: 1.5rem;
82
+ padding: 0;
83
+ border: none;
84
+ border-radius: 50%;
85
+ background: none;
86
+ color: var(--k-text-color-secondary);
87
+ cursor: pointer;
88
+ transition: color 0.2s ease-in-out;
89
+ }
90
+
91
+ .k-input-clear-button:hover {
92
+ color: var(--k-primary-color-text);
93
+ }
94
+
95
+ .k-input-clear-button:focus-visible {
96
+ outline: none;
97
+ box-shadow: 0 0 0 0.125rem var(--k-border-shadow-color-active);
98
+ }
99
+
61
100
  .k-password-toggle-button {
62
101
  position: absolute;
63
- right: 0.75rem;
102
+ right: 0.5rem;
103
+ top: 50%;
104
+ transform: translateY(-50%);
105
+ /* 24px hit area (WCAG 2.5.8) around the small eye icon. */
106
+ width: 1.5rem;
107
+ height: 1.5rem;
64
108
  background: none;
65
109
  border: none;
66
110
  cursor: pointer;
@@ -68,17 +112,17 @@
68
112
  display: flex;
69
113
  align-items: center;
70
114
  justify-content: center;
71
- color: var(--text-color-secondary);
115
+ color: var(--k-text-color-secondary);
72
116
  transition: color 0.2s ease-in-out;
73
117
  }
74
118
 
75
119
  .k-password-toggle-button:hover {
76
- color: var(--primary-color);
120
+ color: var(--k-primary-color-text);
77
121
  }
78
122
 
79
123
  .k-password-toggle-button:focus {
80
124
  outline: none;
81
- box-shadow: 0 0 0 0.125rem var(--border-shadow-color-active);
125
+ box-shadow: 0 0 0 0.125rem var(--k-border-shadow-color-active);
82
126
  border-radius: 50%;
83
127
  }
84
128
 
@@ -88,7 +132,7 @@
88
132
  }
89
133
 
90
134
  .k-password-toggle-button:disabled:hover {
91
- color: var(--text-color-secondary);
135
+ color: var(--k-text-color-secondary);
92
136
  }
93
137
 
94
138
  .k-input-wrapper-addon {
@@ -112,9 +156,9 @@
112
156
  display: inline-flex;
113
157
  align-items: center;
114
158
  justify-content: center;
115
- background-color: var(--background-color-dark);
116
- border: 0.0625rem solid var(--border-color);
117
- color: var(--text-color-secondary);
159
+ background-color: var(--k-background-color-dark);
160
+ border: 0.0625rem solid var(--k-border-color);
161
+ color: var(--k-text-color-secondary);
118
162
  font-weight: 500;
119
163
  white-space: nowrap;
120
164
  user-select: none;
@@ -133,20 +177,20 @@
133
177
  }
134
178
 
135
179
  .k-input-addon-sm {
136
- font-size: var(--text-size-sm);
180
+ font-size: var(--k-text-size-sm);
137
181
  padding: 0.5rem 0.625rem;
138
182
  }
139
183
 
140
184
  .k-input-addon-md {
141
- font-size: var(--text-size-md);
185
+ font-size: var(--k-text-size-md);
142
186
  padding: 0.625rem 0.75rem;
143
187
  }
144
188
 
145
189
  .k-input-addon-lg {
146
- font-size: var(--text-size-lg);
190
+ font-size: var(--k-text-size-lg);
147
191
  padding: 0.75rem 0.875rem;
148
192
  }
149
193
 
150
194
  .k-input-wrapper-addon:focus-within .k-input-addon {
151
- border-color: var(--border-color-active);
195
+ border-color: var(--k-border-color-active);
152
196
  }