@kosmeo-ui/react 0.2.0 → 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 (336) hide show
  1. package/README.md +3 -1
  2. package/dist/components/buttons/button/styles.css +43 -43
  3. package/dist/components/buttons/rowActions/index.d.ts.map +1 -1
  4. package/dist/components/buttons/rowActions/index.js +2 -1
  5. package/dist/components/buttons/rowActions/index.js.map +1 -1
  6. package/dist/components/data-display/addressBlock/styles.css +2 -2
  7. package/dist/components/data-display/colorSwatch/index.d.ts +1 -1
  8. package/dist/components/data-display/colorSwatch/index.d.ts.map +1 -1
  9. package/dist/components/data-display/colorSwatch/index.js +1 -1
  10. package/dist/components/data-display/colorSwatch/index.js.map +1 -1
  11. package/dist/components/data-display/colorSwatch/styles.css +1 -1
  12. package/dist/components/data-display/dataTable/index.d.ts.map +1 -1
  13. package/dist/components/data-display/dataTable/index.js +7 -3
  14. package/dist/components/data-display/dataTable/index.js.map +1 -1
  15. package/dist/components/data-display/dataTable/styles.css +3 -2
  16. package/dist/components/data-display/dataTable/utils/parseDataKey.d.ts +8 -1
  17. package/dist/components/data-display/dataTable/utils/parseDataKey.d.ts.map +1 -1
  18. package/dist/components/data-display/dataTable/utils/parseDataKey.js +13 -41
  19. package/dist/components/data-display/dataTable/utils/parseDataKey.js.map +1 -1
  20. package/dist/components/data-display/imagePreview/styles.css +2 -2
  21. package/dist/components/data-display/infiniteScroll/filters/index.d.ts +4 -0
  22. package/dist/components/data-display/infiniteScroll/filters/index.d.ts.map +1 -1
  23. package/dist/components/data-display/infiniteScroll/filters/index.js +12 -2
  24. package/dist/components/data-display/infiniteScroll/filters/index.js.map +1 -1
  25. package/dist/components/data-display/infiniteScroll/filters/listFilter.d.ts.map +1 -1
  26. package/dist/components/data-display/infiniteScroll/filters/listFilter.js +1 -1
  27. package/dist/components/data-display/infiniteScroll/filters/listFilter.js.map +1 -1
  28. package/dist/components/data-display/infiniteScroll/filters/rangeFilter.d.ts +6 -0
  29. package/dist/components/data-display/infiniteScroll/filters/rangeFilter.d.ts.map +1 -1
  30. package/dist/components/data-display/infiniteScroll/filters/rangeFilter.js +55 -46
  31. package/dist/components/data-display/infiniteScroll/filters/rangeFilter.js.map +1 -1
  32. package/dist/components/data-display/infiniteScroll/filters/selectFilter.d.ts.map +1 -1
  33. package/dist/components/data-display/infiniteScroll/filters/selectFilter.js +3 -5
  34. package/dist/components/data-display/infiniteScroll/filters/selectFilter.js.map +1 -1
  35. package/dist/components/data-display/infiniteScroll/filters/styles.css +30 -1
  36. package/dist/components/data-display/infiniteScroll/header/limit.d.ts.map +1 -1
  37. package/dist/components/data-display/infiniteScroll/header/limit.js +1 -1
  38. package/dist/components/data-display/infiniteScroll/header/limit.js.map +1 -1
  39. package/dist/components/data-display/infiniteScroll/header/sortBy.d.ts.map +1 -1
  40. package/dist/components/data-display/infiniteScroll/header/sortBy.js +1 -1
  41. package/dist/components/data-display/infiniteScroll/header/sortBy.js.map +1 -1
  42. package/dist/components/data-display/infiniteScroll/header/sortDirection.d.ts.map +1 -1
  43. package/dist/components/data-display/infiniteScroll/header/sortDirection.js +1 -1
  44. package/dist/components/data-display/infiniteScroll/header/sortDirection.js.map +1 -1
  45. package/dist/components/data-display/infiniteScroll/index.d.ts +8 -0
  46. package/dist/components/data-display/infiniteScroll/index.d.ts.map +1 -1
  47. package/dist/components/data-display/infiniteScroll/index.js +41 -23
  48. package/dist/components/data-display/infiniteScroll/index.js.map +1 -1
  49. package/dist/components/data-display/infiniteScroll/styles.css +2 -2
  50. package/dist/components/data-display/infiniteScroll/tags/index.d.ts.map +1 -1
  51. package/dist/components/data-display/infiniteScroll/tags/index.js +6 -5
  52. package/dist/components/data-display/infiniteScroll/tags/index.js.map +1 -1
  53. package/dist/components/data-display/infiniteScroll/tags/listFilterTag.d.ts.map +1 -1
  54. package/dist/components/data-display/infiniteScroll/tags/listFilterTag.js +6 -6
  55. package/dist/components/data-display/infiniteScroll/tags/listFilterTag.js.map +1 -1
  56. package/dist/components/data-display/infiniteScroll/tags/rangeFilterTag.d.ts.map +1 -1
  57. package/dist/components/data-display/infiniteScroll/tags/rangeFilterTag.js +3 -5
  58. package/dist/components/data-display/infiniteScroll/tags/rangeFilterTag.js.map +1 -1
  59. package/dist/components/data-display/infiniteScroll/utils/generateQueryString.d.ts +6 -0
  60. package/dist/components/data-display/infiniteScroll/utils/generateQueryString.d.ts.map +1 -1
  61. package/dist/components/data-display/infiniteScroll/utils/generateQueryString.js +24 -12
  62. package/dist/components/data-display/infiniteScroll/utils/generateQueryString.js.map +1 -1
  63. package/dist/components/data-display/infiniteScroll/utils/hasPendingChanges.d.ts +11 -1
  64. package/dist/components/data-display/infiniteScroll/utils/hasPendingChanges.d.ts.map +1 -1
  65. package/dist/components/data-display/infiniteScroll/utils/hasPendingChanges.js +37 -18
  66. package/dist/components/data-display/infiniteScroll/utils/hasPendingChanges.js.map +1 -1
  67. package/dist/components/data-display/listCard/styles.css +3 -3
  68. package/dist/components/data-display/listRow/styles.css +2 -2
  69. package/dist/components/data-display/recoveryCodeGrid/styles.css +3 -3
  70. package/dist/components/data-display/secretDisplay/styles.css +4 -4
  71. package/dist/components/data-display/statCard/styles.css +12 -12
  72. package/dist/components/data-display/summaryRow/styles.css +4 -4
  73. package/dist/components/data-display/table/index.d.ts.map +1 -1
  74. package/dist/components/data-display/table/index.js +2 -2
  75. package/dist/components/data-display/table/index.js.map +1 -1
  76. package/dist/components/data-display/table/styles.css +10 -10
  77. package/dist/components/data-display/tableFilters/index.d.ts +30 -0
  78. package/dist/components/data-display/tableFilters/index.d.ts.map +1 -0
  79. package/dist/components/data-display/tableFilters/index.js +67 -0
  80. package/dist/components/data-display/tableFilters/index.js.map +1 -0
  81. package/dist/components/data-display/tagCard/index.d.ts.map +1 -1
  82. package/dist/components/data-display/tagCard/index.js +1 -1
  83. package/dist/components/data-display/tagCard/index.js.map +1 -1
  84. package/dist/components/data-display/tagCard/styles.css +1 -1
  85. package/dist/components/feedback/alert/styles.css +15 -15
  86. package/dist/components/feedback/badge/index.d.ts.map +1 -1
  87. package/dist/components/feedback/badge/index.js +14 -8
  88. package/dist/components/feedback/badge/index.js.map +1 -1
  89. package/dist/components/feedback/badge/styles.css +44 -46
  90. package/dist/components/feedback/emptyState/styles.css +2 -2
  91. package/dist/components/feedback/loadingOverlay/styles.css +1 -1
  92. package/dist/components/feedback/progressBar/styles.css +11 -11
  93. package/dist/components/feedback/spinner/styles.css +14 -11
  94. package/dist/components/feedback/tooltip/styles.css +9 -7
  95. package/dist/components/forms/detailField/styles.css +1 -1
  96. package/dist/components/forms/fieldShell/index.d.ts +3 -1
  97. package/dist/components/forms/fieldShell/index.d.ts.map +1 -1
  98. package/dist/components/forms/fieldShell/index.js +1 -1
  99. package/dist/components/forms/fieldShell/index.js.map +1 -1
  100. package/dist/components/forms/fieldShell/styles.css +5 -5
  101. package/dist/components/forms/form/styles.css +6 -6
  102. package/dist/components/forms/formActions/styles.css +4 -4
  103. package/dist/components/forms/formGrid/styles.css +32 -0
  104. package/dist/components/forms/infoRow/styles.css +2 -2
  105. package/dist/components/forms/optionsGroup/index.d.ts +3 -1
  106. package/dist/components/forms/optionsGroup/index.d.ts.map +1 -1
  107. package/dist/components/forms/optionsGroup/index.js +5 -1
  108. package/dist/components/forms/optionsGroup/index.js.map +1 -1
  109. package/dist/components/forms/optionsGroup/styles.css +1 -1
  110. package/dist/components/forms/requiredAsterisk/index.d.ts.map +1 -1
  111. package/dist/components/forms/requiredAsterisk/index.js +3 -2
  112. package/dist/components/forms/requiredAsterisk/index.js.map +1 -1
  113. package/dist/components/forms/requiredAsterisk/styles.css +1 -1
  114. package/dist/components/index.d.ts +2 -0
  115. package/dist/components/index.d.ts.map +1 -1
  116. package/dist/components/index.js +1 -0
  117. package/dist/components/index.js.map +1 -1
  118. package/dist/components/inputs/checkbox/index.d.ts.map +1 -1
  119. package/dist/components/inputs/checkbox/index.js +3 -1
  120. package/dist/components/inputs/checkbox/index.js.map +1 -1
  121. package/dist/components/inputs/checkbox/styles.css +4 -4
  122. package/dist/components/inputs/colorPicker/index.d.ts.map +1 -1
  123. package/dist/components/inputs/colorPicker/index.js +3 -1
  124. package/dist/components/inputs/colorPicker/index.js.map +1 -1
  125. package/dist/components/inputs/colorPicker/styles.css +3 -3
  126. package/dist/components/inputs/dateInput/index.d.ts +3 -3
  127. package/dist/components/inputs/dateInput/index.d.ts.map +1 -1
  128. package/dist/components/inputs/dateInput/index.js +2 -2
  129. package/dist/components/inputs/dateInput/index.js.map +1 -1
  130. package/dist/components/inputs/dateInput/styles.css +5 -5
  131. package/dist/components/inputs/dateInput/utils.d.ts +0 -1
  132. package/dist/components/inputs/dateInput/utils.d.ts.map +1 -1
  133. package/dist/components/inputs/dateInput/utils.js +13 -8
  134. package/dist/components/inputs/dateInput/utils.js.map +1 -1
  135. package/dist/components/inputs/dropdown/index.js +1 -1
  136. package/dist/components/inputs/dropdown/index.js.map +1 -1
  137. package/dist/components/inputs/dropdown/styles.css +2 -2
  138. package/dist/components/inputs/dropdownArrowButton/styles.css +7 -5
  139. package/dist/components/inputs/fileDropZone/index.d.ts.map +1 -1
  140. package/dist/components/inputs/fileDropZone/index.js +3 -2
  141. package/dist/components/inputs/fileDropZone/index.js.map +1 -1
  142. package/dist/components/inputs/fileDropZone/styles.css +12 -12
  143. package/dist/components/inputs/fileUpload/index.d.ts.map +1 -1
  144. package/dist/components/inputs/fileUpload/index.js +11 -6
  145. package/dist/components/inputs/fileUpload/index.js.map +1 -1
  146. package/dist/components/inputs/fileUpload/styles.css +9 -9
  147. package/dist/components/inputs/input/index.d.ts +12 -0
  148. package/dist/components/inputs/input/index.d.ts.map +1 -1
  149. package/dist/components/inputs/input/index.js +4 -3
  150. package/dist/components/inputs/input/index.js.map +1 -1
  151. package/dist/components/inputs/input/styles.css +28 -28
  152. package/dist/components/inputs/languageSelect/index.d.ts.map +1 -1
  153. package/dist/components/inputs/languageSelect/index.js +15 -4
  154. package/dist/components/inputs/languageSelect/index.js.map +1 -1
  155. package/dist/components/inputs/multiSelect/dropDown.d.ts +7 -0
  156. package/dist/components/inputs/multiSelect/dropDown.d.ts.map +1 -1
  157. package/dist/components/inputs/multiSelect/dropDown.js +19 -12
  158. package/dist/components/inputs/multiSelect/dropDown.js.map +1 -1
  159. package/dist/components/inputs/multiSelect/index.d.ts.map +1 -1
  160. package/dist/components/inputs/multiSelect/index.js +49 -13
  161. package/dist/components/inputs/multiSelect/index.js.map +1 -1
  162. package/dist/components/inputs/multiSelect/styles.css +51 -43
  163. package/dist/components/inputs/multiSelect/utils.d.ts +7 -0
  164. package/dist/components/inputs/multiSelect/utils.d.ts.map +1 -0
  165. package/dist/components/inputs/multiSelect/utils.js +18 -0
  166. package/dist/components/inputs/multiSelect/utils.js.map +1 -0
  167. package/dist/components/inputs/phoneInput/index.d.ts.map +1 -1
  168. package/dist/components/inputs/phoneInput/index.js +11 -3
  169. package/dist/components/inputs/phoneInput/index.js.map +1 -1
  170. package/dist/components/inputs/phoneInput/styles.css +13 -13
  171. package/dist/components/inputs/radioGroup/index.d.ts.map +1 -1
  172. package/dist/components/inputs/radioGroup/index.js +1 -1
  173. package/dist/components/inputs/radioGroup/index.js.map +1 -1
  174. package/dist/components/inputs/richTextEditor/index.d.ts.map +1 -1
  175. package/dist/components/inputs/richTextEditor/index.js +21 -22
  176. package/dist/components/inputs/richTextEditor/index.js.map +1 -1
  177. package/dist/components/inputs/richTextEditor/styles.css +24 -24
  178. package/dist/components/inputs/searchList/index.d.ts +4 -1
  179. package/dist/components/inputs/searchList/index.d.ts.map +1 -1
  180. package/dist/components/inputs/searchList/index.js +46 -31
  181. package/dist/components/inputs/searchList/index.js.map +1 -1
  182. package/dist/components/inputs/searchList/styles.css +22 -22
  183. package/dist/components/inputs/searchSelect/index.d.ts.map +1 -1
  184. package/dist/components/inputs/searchSelect/index.js +8 -2
  185. package/dist/components/inputs/searchSelect/index.js.map +1 -1
  186. package/dist/components/inputs/select/index.js +3 -2
  187. package/dist/components/inputs/select/index.js.map +1 -1
  188. package/dist/components/inputs/select/styles.css +93 -15
  189. package/dist/components/inputs/switch/index.d.ts.map +1 -1
  190. package/dist/components/inputs/switch/index.js +3 -1
  191. package/dist/components/inputs/switch/index.js.map +1 -1
  192. package/dist/components/inputs/switch/styles.css +5 -5
  193. package/dist/components/inputs/textArea/index.d.ts.map +1 -1
  194. package/dist/components/inputs/textArea/index.js +3 -2
  195. package/dist/components/inputs/textArea/index.js.map +1 -1
  196. package/dist/components/inputs/textArea/styles.css +11 -11
  197. package/dist/components/inputs/typeahead/index.d.ts.map +1 -1
  198. package/dist/components/inputs/typeahead/index.js +21 -6
  199. package/dist/components/inputs/typeahead/index.js.map +1 -1
  200. package/dist/components/inputs/typeahead/styles.css +13 -13
  201. package/dist/components/layout/authPage/styles.css +6 -6
  202. package/dist/components/layout/borderedSection/styles.css +3 -3
  203. package/dist/components/layout/card/styles.css +31 -31
  204. package/dist/components/layout/col/styles.css +1 -1
  205. package/dist/components/layout/page/styles.css +25 -5
  206. package/dist/components/layout/sectionHeader/styles.css +3 -3
  207. package/dist/components/navigation/breadcrumbs/styles.css +7 -7
  208. package/dist/components/navigation/pagination/styles.css +15 -15
  209. package/dist/components/navigation/sidebar/styles.css +6 -6
  210. package/dist/components/navigation/stepper/styles.css +14 -14
  211. package/dist/components/navigation/tabButton/styles.css +59 -59
  212. package/dist/components/navigation/tabs/styles.css +5 -5
  213. package/dist/components/overlays/modal/styles.css +19 -19
  214. package/dist/hooks/useInfinite.d.ts +3 -1
  215. package/dist/hooks/useInfinite.d.ts.map +1 -1
  216. package/dist/hooks/useInfinite.js +4 -2
  217. package/dist/hooks/useInfinite.js.map +1 -1
  218. package/dist/hooks/useInfiniteArchivableCursor.d.ts +1 -1
  219. package/dist/hooks/useInfiniteArchivableCursor.d.ts.map +1 -1
  220. package/dist/hooks/useInfiniteArchivableCursor.js +11 -4
  221. package/dist/hooks/useInfiniteArchivableCursor.js.map +1 -1
  222. package/dist/hooks/useInfiniteCursor.d.ts +1 -1
  223. package/dist/hooks/useInfiniteCursor.d.ts.map +1 -1
  224. package/dist/hooks/useInfiniteCursor.js +11 -4
  225. package/dist/hooks/useInfiniteCursor.js.map +1 -1
  226. package/dist/styles.css +142 -127
  227. package/package.json +15 -4
  228. package/src/components/buttons/button/styles.css +43 -43
  229. package/src/components/buttons/rowActions/index.tsx +6 -1
  230. package/src/components/data-display/addressBlock/styles.css +2 -2
  231. package/src/components/data-display/colorSwatch/index.tsx +2 -2
  232. package/src/components/data-display/colorSwatch/styles.css +1 -1
  233. package/src/components/data-display/dataTable/index.tsx +6 -3
  234. package/src/components/data-display/dataTable/styles.css +3 -2
  235. package/src/components/data-display/dataTable/utils/parseDataKey.ts +18 -36
  236. package/src/components/data-display/imagePreview/styles.css +2 -2
  237. package/src/components/data-display/infiniteScroll/filters/index.tsx +18 -1
  238. package/src/components/data-display/infiniteScroll/filters/listFilter.tsx +1 -0
  239. package/src/components/data-display/infiniteScroll/filters/rangeFilter.tsx +77 -33
  240. package/src/components/data-display/infiniteScroll/filters/selectFilter.tsx +11 -17
  241. package/src/components/data-display/infiniteScroll/filters/styles.css +30 -1
  242. package/src/components/data-display/infiniteScroll/header/limit.tsx +1 -0
  243. package/src/components/data-display/infiniteScroll/header/sortBy.tsx +1 -0
  244. package/src/components/data-display/infiniteScroll/header/sortDirection.tsx +1 -0
  245. package/src/components/data-display/infiniteScroll/index.tsx +75 -29
  246. package/src/components/data-display/infiniteScroll/styles.css +2 -2
  247. package/src/components/data-display/infiniteScroll/tags/index.tsx +6 -5
  248. package/src/components/data-display/infiniteScroll/tags/listFilterTag.tsx +20 -13
  249. package/src/components/data-display/infiniteScroll/tags/rangeFilterTag.tsx +4 -3
  250. package/src/components/data-display/infiniteScroll/utils/generateQueryString.ts +28 -13
  251. package/src/components/data-display/infiniteScroll/utils/hasPendingChanges.ts +48 -16
  252. package/src/components/data-display/listCard/styles.css +3 -3
  253. package/src/components/data-display/listRow/styles.css +2 -2
  254. package/src/components/data-display/recoveryCodeGrid/styles.css +3 -3
  255. package/src/components/data-display/secretDisplay/styles.css +4 -4
  256. package/src/components/data-display/statCard/styles.css +12 -12
  257. package/src/components/data-display/summaryRow/styles.css +4 -4
  258. package/src/components/data-display/table/index.tsx +2 -2
  259. package/src/components/data-display/table/styles.css +10 -10
  260. package/src/components/data-display/tableFilters/index.tsx +147 -0
  261. package/src/components/data-display/tagCard/index.tsx +3 -2
  262. package/src/components/data-display/tagCard/styles.css +1 -1
  263. package/src/components/feedback/alert/styles.css +15 -15
  264. package/src/components/feedback/badge/index.tsx +36 -16
  265. package/src/components/feedback/badge/styles.css +44 -46
  266. package/src/components/feedback/emptyState/styles.css +2 -2
  267. package/src/components/feedback/loadingOverlay/styles.css +1 -1
  268. package/src/components/feedback/progressBar/styles.css +11 -11
  269. package/src/components/feedback/spinner/styles.css +14 -11
  270. package/src/components/feedback/tooltip/styles.css +9 -7
  271. package/src/components/forms/detailField/styles.css +1 -1
  272. package/src/components/forms/fieldShell/index.tsx +4 -1
  273. package/src/components/forms/fieldShell/styles.css +5 -5
  274. package/src/components/forms/form/styles.css +6 -6
  275. package/src/components/forms/formActions/styles.css +4 -4
  276. package/src/components/forms/formGrid/styles.css +32 -0
  277. package/src/components/forms/infoRow/styles.css +2 -2
  278. package/src/components/forms/optionsGroup/index.tsx +31 -12
  279. package/src/components/forms/optionsGroup/styles.css +1 -1
  280. package/src/components/forms/requiredAsterisk/index.tsx +5 -1
  281. package/src/components/forms/requiredAsterisk/styles.css +1 -1
  282. package/src/components/index.ts +2 -0
  283. package/src/components/inputs/checkbox/index.tsx +3 -2
  284. package/src/components/inputs/checkbox/styles.css +4 -4
  285. package/src/components/inputs/colorPicker/index.tsx +5 -2
  286. package/src/components/inputs/colorPicker/styles.css +3 -3
  287. package/src/components/inputs/dateInput/index.tsx +4 -5
  288. package/src/components/inputs/dateInput/styles.css +5 -5
  289. package/src/components/inputs/dateInput/utils.ts +12 -8
  290. package/src/components/inputs/dropdown/index.tsx +1 -1
  291. package/src/components/inputs/dropdown/styles.css +2 -2
  292. package/src/components/inputs/dropdownArrowButton/styles.css +7 -5
  293. package/src/components/inputs/fileDropZone/index.tsx +4 -3
  294. package/src/components/inputs/fileDropZone/styles.css +12 -12
  295. package/src/components/inputs/fileUpload/index.tsx +33 -23
  296. package/src/components/inputs/fileUpload/styles.css +9 -9
  297. package/src/components/inputs/input/index.tsx +21 -3
  298. package/src/components/inputs/input/styles.css +28 -28
  299. package/src/components/inputs/languageSelect/index.tsx +19 -4
  300. package/src/components/inputs/multiSelect/dropDown.tsx +83 -35
  301. package/src/components/inputs/multiSelect/index.tsx +87 -30
  302. package/src/components/inputs/multiSelect/styles.css +51 -43
  303. package/src/components/inputs/multiSelect/utils.ts +18 -0
  304. package/src/components/inputs/phoneInput/index.tsx +10 -2
  305. package/src/components/inputs/phoneInput/styles.css +13 -13
  306. package/src/components/inputs/radioGroup/index.tsx +2 -1
  307. package/src/components/inputs/richTextEditor/index.tsx +42 -44
  308. package/src/components/inputs/richTextEditor/styles.css +24 -24
  309. package/src/components/inputs/searchList/index.tsx +121 -109
  310. package/src/components/inputs/searchList/styles.css +22 -22
  311. package/src/components/inputs/searchSelect/index.tsx +8 -2
  312. package/src/components/inputs/select/index.tsx +3 -3
  313. package/src/components/inputs/select/styles.css +93 -15
  314. package/src/components/inputs/switch/index.tsx +3 -2
  315. package/src/components/inputs/switch/styles.css +5 -5
  316. package/src/components/inputs/textArea/index.tsx +3 -3
  317. package/src/components/inputs/textArea/styles.css +11 -11
  318. package/src/components/inputs/typeahead/index.tsx +84 -54
  319. package/src/components/inputs/typeahead/styles.css +13 -13
  320. package/src/components/layout/authPage/styles.css +6 -6
  321. package/src/components/layout/borderedSection/styles.css +3 -3
  322. package/src/components/layout/card/styles.css +31 -31
  323. package/src/components/layout/col/styles.css +1 -1
  324. package/src/components/layout/page/styles.css +25 -5
  325. package/src/components/layout/sectionHeader/styles.css +3 -3
  326. package/src/components/navigation/breadcrumbs/styles.css +7 -7
  327. package/src/components/navigation/pagination/styles.css +15 -15
  328. package/src/components/navigation/sidebar/styles.css +6 -6
  329. package/src/components/navigation/stepper/styles.css +14 -14
  330. package/src/components/navigation/tabButton/styles.css +59 -59
  331. package/src/components/navigation/tabs/styles.css +5 -5
  332. package/src/components/overlays/modal/styles.css +19 -19
  333. package/src/hooks/useInfinite.ts +7 -3
  334. package/src/hooks/useInfiniteArchivableCursor.ts +11 -4
  335. package/src/hooks/useInfiniteCursor.ts +11 -4
  336. package/src/styles.css +142 -127
@@ -7,7 +7,7 @@ export interface ColorSwatchProps {
7
7
  size?: "sm" | "md" | "lg";
8
8
  /** Border around swatch. Defaults to true. */
9
9
  bordered?: boolean;
10
- /** Accessible label (rendered as title attribute). */
10
+ /** Accessible label and tooltip. Defaults to the colour value. */
11
11
  title?: string;
12
12
  }
13
13
 
@@ -15,7 +15,7 @@ const ColorSwatch = ({
15
15
  color,
16
16
  size = "md",
17
17
  bordered = true,
18
- title,
18
+ title = color,
19
19
  }: ColorSwatchProps) => {
20
20
  return (
21
21
  <span
@@ -6,7 +6,7 @@
6
6
  }
7
7
 
8
8
  .k-color-swatch-bordered {
9
- border: 0.0625rem solid var(--border-color);
9
+ border: 0.0625rem solid var(--k-border-color);
10
10
  }
11
11
 
12
12
  .k-color-swatch-sm {
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
 
3
3
  import { TableColumn, TableLeadingColumn, TableRow } from "./types.js";
4
+ import parseDataKey, { cellText } from "./utils/parseDataKey.js";
4
5
  import { useVirtualizer } from "@tanstack/react-virtual";
5
- import parseDataKey from "./utils/parseDataKey.js";
6
6
  import { useMemo, type RefObject } from "react";
7
7
  import "../table/styles.css";
8
8
  import "./styles.css";
@@ -75,6 +75,7 @@ const DataTable = <TData extends object>(props: DataTableProps<TData>) => {
75
75
  );
76
76
  }
77
77
  for (const c of columns) {
78
+ if (c.hidden) continue;
78
79
  const content = c.headerElement ? c.headerElement(c.title) : c.title;
79
80
  const alignClass = c.align ? `k-data-table-align-${c.align}` : "";
80
81
  headers.push(
@@ -105,11 +106,12 @@ const DataTable = <TData extends object>(props: DataTableProps<TData>) => {
105
106
  );
106
107
  }
107
108
  for (const c of columns) {
109
+ if (c.hidden) continue;
108
110
  const alignClass = c.align ? `k-data-table-align-${c.align}` : "";
109
111
  const content = c.cellElement
110
112
  ? c.cellElement(row.data, row.index)
111
113
  : c.dataKey
112
- ? parseDataKey(c.dataKey, row.data)
114
+ ? cellText(parseDataKey(c.dataKey, row.data))
113
115
  : undefined;
114
116
  cells.push(
115
117
  <td
@@ -124,7 +126,8 @@ const DataTable = <TData extends object>(props: DataTableProps<TData>) => {
124
126
  return cells;
125
127
  };
126
128
 
127
- const columnSpan = columns.length + (leadingColumn ? 1 : 0);
129
+ const columnSpan =
130
+ columns.filter((c) => !c.hidden).length + (leadingColumn ? 1 : 0);
128
131
 
129
132
  const body = shouldVirtualize
130
133
  ? (() => {
@@ -24,8 +24,9 @@
24
24
  border: 0;
25
25
  }
26
26
 
27
+ /* Headers follow their column's `align`, so they line up with the cells. */
27
28
  .k-data-table-header-cell {
28
- text-align: center;
29
+ text-align: left;
29
30
  }
30
31
 
31
32
  .k-data-table-row-clickable {
@@ -33,7 +34,7 @@
33
34
  }
34
35
 
35
36
  .k-data-table-row-clickable:hover {
36
- background-color: var(--bg-hover) !important;
37
+ background-color: var(--k-background-color-hover) !important;
37
38
  }
38
39
 
39
40
  /* Alignment classes using flexbox for reliable alignment of any content */
@@ -1,39 +1,21 @@
1
+ import { ReactNode } from "react";
2
+
3
+ /**
4
+ * Reads the value at `dataKey` ("name", "address.city", "tags[1]",
5
+ * "pets[0].name"), or undefined when any part of the path is missing.
6
+ */
1
7
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
2
- const parseDataKey = (dataKey: string, data: any) => {
3
- let value = data;
4
- let more = false;
5
- do {
6
- const dotIndex = dataKey.indexOf(".");
7
- const bracketIndex = dataKey.indexOf("[");
8
- if (bracketIndex === -1 && dotIndex === -1) {
9
- value = value[dataKey];
10
- more = false;
11
- } else if (bracketIndex === -1) {
12
- const key = dataKey.substring(0, dotIndex);
13
- value = value[key];
14
- dataKey = dataKey.substring(dotIndex + 1);
15
- more = true;
16
- } else if (dotIndex === -1) {
17
- const key = dataKey.substring(0, bracketIndex);
18
- const index = dataKey.substring(bracketIndex + 1, dataKey.indexOf("]"));
19
- value = value[key][parseInt(index)];
20
- dataKey = dataKey.substring(dataKey.indexOf("]") + 1);
21
- more = true;
22
- } else if (bracketIndex < dotIndex) {
23
- const key = dataKey.substring(0, bracketIndex);
24
- const index = dataKey.substring(bracketIndex + 1, dataKey.indexOf("]"));
25
- value = value[key][parseInt(index)];
26
- dataKey = dataKey.substring(dataKey.indexOf("]") + 1);
27
- more = true;
28
- } else {
29
- const key = dataKey.substring(0, dotIndex);
30
- value = value[key];
31
- dataKey = dataKey.substring(dotIndex + 1);
32
- more = true;
33
- }
34
- } while (more);
35
- if (value === undefined) throw new Error(`Invalid dataKey: ${dataKey}`);
36
- return value;
37
- };
8
+ const parseDataKey = (dataKey: string, data: any): unknown =>
9
+ dataKey
10
+ .replace(/\[(\d+)\]/g, ".$1")
11
+ .split(".")
12
+ .filter(Boolean)
13
+ .reduce((value, key) => (value == null ? undefined : value[key]), data);
14
+
15
+ /** What a cell shows for a value: the value, or an em dash when there is none. */
16
+ export const cellText = (value: unknown): ReactNode =>
17
+ value === undefined || value === null || value === ""
18
+ ? "—"
19
+ : (value as ReactNode);
38
20
 
39
21
  export default parseDataKey;
@@ -4,7 +4,7 @@
4
4
  align-items: center;
5
5
  gap: 0.5rem;
6
6
  width: 100%;
7
- border: 0.0625rem dashed var(--border-color);
7
+ border: 0.0625rem dashed var(--k-border-color);
8
8
  border-radius: 0.25rem;
9
9
  padding: 0.5rem;
10
10
  }
@@ -23,7 +23,7 @@
23
23
  .k-image-preview-item {
24
24
  object-fit: cover;
25
25
  border-radius: 0.25rem;
26
- box-shadow: 0 0.125rem 0.25rem var(--shadow-color);
26
+ box-shadow: 0 0.125rem 0.25rem var(--k-shadow-color);
27
27
  flex-shrink: 0;
28
28
  }
29
29
 
@@ -13,9 +13,19 @@ interface InfiniteScrollMenuFiltersProps {
13
13
  handleNewPendingFilters: (
14
14
  filters: SetStateAction<InfiniteScrollMenuGeneratedFilter[]>
15
15
  ) => void;
16
+ /** Applies the pending filters; Enter in a filter's text box calls it. Omit when there's nothing to apply. */
17
+ onApply?: () => void;
18
+ /** Range filters keep edits as a draft until their menu's Apply button. */
19
+ rangeApplyInMenu?: boolean;
16
20
  children?: ReactNode;
17
21
  }
18
22
 
23
+ // Enter in a search, number or date box applies, as in a form; checkboxes and
24
+ // buttons keep their own Enter behaviour.
25
+ const isTextEntry = (target: EventTarget) =>
26
+ target instanceof HTMLInputElement &&
27
+ !["checkbox", "radio", "button", "submit"].includes(target.type);
28
+
19
29
  const Filters = (props: InfiniteScrollMenuFiltersProps) => {
20
30
  const handleFilterChange = useCallback(
21
31
  (filter: InfiniteScrollMenuGeneratedFilter) => {
@@ -41,6 +51,7 @@ const Filters = (props: InfiniteScrollMenuFiltersProps) => {
41
51
  key={filter.filterId}
42
52
  filter={filter}
43
53
  onFilterChange={handleFilterChange}
54
+ applyInMenu={props.rangeApplyInMenu}
44
55
  />
45
56
  );
46
57
  } else if (filter.type === "SEARCH") {
@@ -62,8 +73,14 @@ const Filters = (props: InfiniteScrollMenuFiltersProps) => {
62
73
  }
63
74
  };
64
75
 
76
+ const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {
77
+ if (e.key !== "Enter" || !props.onApply || !isTextEntry(e.target)) return;
78
+ e.preventDefault();
79
+ props.onApply();
80
+ };
81
+
65
82
  return (
66
- <div className="k-menu-filters-container">
83
+ <div className="k-menu-filters-container" onKeyDown={handleKeyDown}>
67
84
  <div className="k-menu-filters">
68
85
  {props.pendingFilters.map(getFilter)}
69
86
  </div>
@@ -71,6 +71,7 @@ const ListFilter = (props: InfiniteScrollListFilterProps) => {
71
71
  onChange={handleChange}
72
72
  type="text"
73
73
  onKeyDown={handleKeydown}
74
+ aria-label={`${props.filter.title} values`}
74
75
  />
75
76
  <Button size="sm" disabled={!allowSubmit} onClick={handleSubmit}>
76
77
  Add Filter
@@ -1,7 +1,9 @@
1
1
  "use client";
2
2
 
3
3
  import { useCallback, useEffect, useMemo, useState } from "react";
4
+ import { hasRangeValue } from "../utils/hasPendingChanges.js";
4
5
  import Dropdown from "../../../inputs/dropdown/index.js";
6
+ import Button from "../../../buttons/button/index.js";
5
7
  import Input from "../../../inputs/input/index.js";
6
8
  import { DateTime } from "luxon";
7
9
  import "./styles.css";
@@ -19,8 +21,35 @@ import {
19
21
  interface InfiniteScrollRangeFilterProps {
20
22
  filter: GeneratedRangeFilter;
21
23
  onFilterChange: (filter: InfiniteScrollMenuGeneratedFilter) => void;
24
+ /**
25
+ * Edits stay a draft until the menu's Apply button (or Enter), so both
26
+ * bounds can be typed before anything is fetched. Closing the menu drops
27
+ * the draft. Without it, each edit reports at once.
28
+ */
29
+ applyInMenu?: boolean;
22
30
  }
23
31
 
32
+ // An empty or unparseable box is no bound, never NaN or a thrown error. A DATE
33
+ // range sends the picked calendar day (yyyy-mm-dd): converting local midnight
34
+ // to UTC moved it off the day the user chose.
35
+ const parseRangeInput = (
36
+ rangeType: GeneratedRangeFilter["rangeType"],
37
+ raw: string
38
+ ): RangeValue | undefined => {
39
+ if (raw === "") return undefined;
40
+ if (rangeType === "NUMBER") {
41
+ const n = Number(raw);
42
+ return Number.isNaN(n) ? undefined : n;
43
+ }
44
+ if (rangeType === "DATE") {
45
+ return DateTime.fromISO(raw).isValid ? raw : undefined;
46
+ }
47
+ if (rangeType === "DATETIME") {
48
+ return DateTime.fromISO(raw).toUTC().toISO() ?? undefined;
49
+ }
50
+ return raw;
51
+ };
52
+
24
53
  const RangeFilter = (props: InfiniteScrollRangeFilterProps) => {
25
54
  const [startValue, setStartValue] = useState<RangeValue | undefined>(
26
55
  props.filter.startValue
@@ -29,17 +58,41 @@ const RangeFilter = (props: InfiniteScrollRangeFilterProps) => {
29
58
  props.filter.endValue
30
59
  );
31
60
 
61
+ const [isOpen, setIsOpen] = useState(false);
62
+
63
+ // Follow the filter when it changes from outside (a tag removed, Reset),
64
+ // without undoing a draft in progress.
32
65
  useEffect(() => {
33
- if (props.filter.startValue === startValue) return;
34
66
  setStartValue(props.filter.startValue);
35
- return;
36
- }, [props.filter.startValue, startValue]);
67
+ }, [props.filter.startValue]);
37
68
 
38
69
  useEffect(() => {
39
- if (props.filter.endValue === endValue) return;
40
70
  setEndValue(props.filter.endValue);
41
- return;
42
- }, [props.filter.endValue, endValue]);
71
+ }, [props.filter.endValue]);
72
+
73
+ const isDirty =
74
+ startValue !== props.filter.startValue ||
75
+ endValue !== props.filter.endValue;
76
+
77
+ const commit = () => {
78
+ props.onFilterChange({ ...props.filter, startValue, endValue });
79
+ setIsOpen(false);
80
+ };
81
+
82
+ const handleOpenChange = (open: boolean) => {
83
+ setIsOpen(open);
84
+ if (open || !props.applyInMenu) return;
85
+ setStartValue(props.filter.startValue);
86
+ setEndValue(props.filter.endValue);
87
+ };
88
+
89
+ // Enter applies the draft here instead of reaching the filter bar.
90
+ const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {
91
+ if (!props.applyInMenu || e.key !== "Enter") return;
92
+ e.preventDefault();
93
+ e.stopPropagation();
94
+ if (isDirty) commit();
95
+ };
43
96
 
44
97
  const inputType = useMemo(() => {
45
98
  if (props.filter.rangeType === "NUMBER") {
@@ -62,7 +115,7 @@ const RangeFilter = (props: InfiniteScrollRangeFilterProps) => {
62
115
  }, [props.filter.rangeType]);
63
116
 
64
117
  const formattedStartValue = useMemo((): RangeValue => {
65
- if (!startValue) return "";
118
+ if (!hasRangeValue(startValue)) return "";
66
119
  if (props.filter.rangeType === "DATE") {
67
120
  return DateTime.fromISO(startValue as string).toFormat("yyyy-MM-dd");
68
121
  } else if (props.filter.rangeType === "DATETIME") {
@@ -73,7 +126,7 @@ const RangeFilter = (props: InfiniteScrollRangeFilterProps) => {
73
126
  }, [props.filter.rangeType, startValue]);
74
127
 
75
128
  const formattedEndValue = useMemo((): RangeValue => {
76
- if (!endValue) return "";
129
+ if (!hasRangeValue(endValue)) return "";
77
130
  if (props.filter.rangeType === "DATE") {
78
131
  return DateTime.fromISO(endValue as string).toFormat("yyyy-MM-dd");
79
132
  } else if (props.filter.rangeType === "DATETIME") {
@@ -85,19 +138,9 @@ const RangeFilter = (props: InfiniteScrollRangeFilterProps) => {
85
138
 
86
139
  const handleStartChange = useCallback(
87
140
  (e: React.ChangeEvent<HTMLInputElement>) => {
88
- let newValue: RangeValue;
89
- if (props.filter.rangeType === "NUMBER") {
90
- newValue = parseInt(e.target.value);
91
- } else if (props.filter.rangeType === "DATE") {
92
- const res = DateTime.fromISO(e.target.value).toUTC().toISO();
93
- if (!res) throw new Error("Invalid date");
94
- newValue = res;
95
- } else if (props.filter.rangeType === "DATETIME") {
96
- const res = DateTime.fromISO(e.target.value).toUTC().toISO();
97
- if (!res) throw new Error("Invalid date");
98
- newValue = res;
99
- } else newValue = e.target.value;
141
+ const newValue = parseRangeInput(props.filter.rangeType, e.target.value);
100
142
  setStartValue(newValue);
143
+ if (props.applyInMenu) return;
101
144
  props.onFilterChange({
102
145
  ...props.filter,
103
146
  startValue: newValue,
@@ -109,19 +152,9 @@ const RangeFilter = (props: InfiniteScrollRangeFilterProps) => {
109
152
 
110
153
  const handleEndChange = useCallback(
111
154
  (e: React.ChangeEvent<HTMLInputElement>) => {
112
- let newValue: RangeValue;
113
- if (props.filter.rangeType === "NUMBER") {
114
- newValue = parseInt(e.target.value);
115
- } else if (props.filter.rangeType === "DATE") {
116
- const res = DateTime.fromISO(e.target.value).toUTC().toISO();
117
- if (!res) throw new Error("Invalid date");
118
- newValue = res;
119
- } else if (props.filter.rangeType === "DATETIME") {
120
- const res = DateTime.fromISO(e.target.value).toUTC().toISO();
121
- if (!res) throw new Error("Invalid date");
122
- newValue = res;
123
- } else newValue = e.target.value;
155
+ const newValue = parseRangeInput(props.filter.rangeType, e.target.value);
124
156
  setEndValue(newValue);
157
+ if (props.applyInMenu) return;
125
158
  props.onFilterChange({
126
159
  ...props.filter,
127
160
  startValue,
@@ -138,8 +171,10 @@ const RangeFilter = (props: InfiniteScrollRangeFilterProps) => {
138
171
  label={props.filter.title}
139
172
  icon={iconToUse}
140
173
  align="left"
174
+ isOpen={isOpen}
175
+ onOpenChange={handleOpenChange}
141
176
  >
142
- <div className="k-filter-menu">
177
+ <div className="k-filter-menu" onKeyDown={handleKeyDown}>
143
178
  <div className="k-range-filter-menu-column">
144
179
  <p className="k-range-filter-menu-label">Start</p>
145
180
  <Input
@@ -147,6 +182,7 @@ const RangeFilter = (props: InfiniteScrollRangeFilterProps) => {
147
182
  type={inputType}
148
183
  value={formattedStartValue}
149
184
  onChange={handleStartChange}
185
+ aria-label={`${props.filter.title} start`}
150
186
  max={formattedEndValue}
151
187
  />
152
188
  </div>
@@ -157,9 +193,17 @@ const RangeFilter = (props: InfiniteScrollRangeFilterProps) => {
157
193
  type={inputType}
158
194
  value={formattedEndValue}
159
195
  onChange={handleEndChange}
196
+ aria-label={`${props.filter.title} end`}
160
197
  min={formattedStartValue}
161
198
  />
162
199
  </div>
200
+ {props.applyInMenu && (
201
+ <div className="k-range-filter-menu-actions">
202
+ <Button size="sm" disabled={!isDirty} onClick={commit}>
203
+ Apply
204
+ </Button>
205
+ </div>
206
+ )}
163
207
  </div>
164
208
  </Dropdown>
165
209
  );
@@ -1,15 +1,10 @@
1
1
  "use client";
2
2
 
3
- import { faSquare } from "@fortawesome/free-regular-svg-icons";
4
- import IconButton from "../../../buttons/iconButton/index.js";
3
+ import { faSquareCheck } from "@fortawesome/free-solid-svg-icons";
5
4
  import Dropdown from "../../../inputs/dropdown/index.js";
6
5
  import { useEffect, useMemo, useState } from "react";
7
6
  import Input from "../../../inputs/input/index.js";
8
7
  import "./styles.css";
9
- import {
10
- faCheckSquare,
11
- faSquareCheck,
12
- } from "@fortawesome/free-solid-svg-icons";
13
8
  import {
14
9
  GeneratedSelectFilter,
15
10
  InfiniteScrollMenuFilterOption,
@@ -63,18 +58,16 @@ const SelectFilter = (props: InfiniteScrollSelectFilterProps) => {
63
58
  if (optionSearch === "") return true;
64
59
  return item.name.toLowerCase().includes(optionSearch.toLowerCase());
65
60
  });
66
- return available.map((item, index) => (
67
- <IconButton
68
- size="sm"
69
- variant="light"
70
- align="left"
71
- shadow={false}
72
- key={index}
73
- onClick={() => handleSelect(item.id, !item.selected)}
74
- icon={item.selected ? faCheckSquare : faSquare}
75
- >
61
+ return available.map((item) => (
62
+ <label className="k-select-filter-option" key={item.id}>
63
+ <input
64
+ type="checkbox"
65
+ className="k-select-filter-option-input"
66
+ checked={item.selected}
67
+ onChange={() => handleSelect(item.id, !item.selected)}
68
+ />
76
69
  {item.name}
77
- </IconButton>
70
+ </label>
78
71
  ));
79
72
  }, [options, optionSearch]);
80
73
 
@@ -92,6 +85,7 @@ const SelectFilter = (props: InfiniteScrollSelectFilterProps) => {
92
85
  <Input
93
86
  size="sm"
94
87
  placeholder="Search"
88
+ aria-label={`Search ${props.filter.title} options`}
95
89
  value={optionSearch}
96
90
  onChange={handleSearchOption}
97
91
  />
@@ -35,8 +35,13 @@
35
35
  flex-direction: column;
36
36
  }
37
37
 
38
+ .k-range-filter-menu-actions {
39
+ display: flex;
40
+ justify-content: flex-end;
41
+ }
42
+
38
43
  .k-range-filter-menu-label {
39
- color: var(--text-color-secondary);
44
+ color: var(--k-text-color-secondary);
40
45
  margin-bottom: 0;
41
46
  }
42
47
 
@@ -50,3 +55,27 @@
50
55
  flex-direction: column;
51
56
  overflow-y: auto;
52
57
  }
58
+
59
+ .k-select-filter-option {
60
+ display: flex;
61
+ align-items: center;
62
+ gap: 0.5rem;
63
+ padding: 0.375rem 0.5rem;
64
+ border-radius: 0.25rem;
65
+ font-size: var(--k-text-size-sm);
66
+ color: var(--k-text-color);
67
+ cursor: pointer;
68
+ }
69
+
70
+ .k-select-filter-option:hover,
71
+ .k-select-filter-option:has(:focus-visible) {
72
+ background-color: var(--k-background-color-hover);
73
+ }
74
+
75
+ .k-select-filter-option-input {
76
+ width: 1rem;
77
+ height: 1rem;
78
+ margin: 0;
79
+ accent-color: var(--k-primary-color);
80
+ cursor: pointer;
81
+ }
@@ -39,6 +39,7 @@ const Limit = (props: LimitProps) => {
39
39
  <p>Results Per Page:</p>
40
40
  <Dropdown
41
41
  label={limitOptions.find((o) => o.selected)?.value || "None"}
42
+ aria-label={`Results per page: ${limitOptions.find((o) => o.selected)?.value || "None"}`}
42
43
  align="right"
43
44
  size="sm"
44
45
  variant="secondary"
@@ -31,6 +31,7 @@ const SortBy = (props: SortbyProps) => {
31
31
  size="sm"
32
32
  variant="secondary"
33
33
  label={props.sortBy.find((key) => key.selected)?.displayName || "None"}
34
+ aria-label={`Sort by: ${props.sortBy.find((key) => key.selected)?.displayName || "None"}`}
34
35
  isOpen={isOpen}
35
36
  onOpenChange={setIsOpen}
36
37
  >
@@ -28,6 +28,7 @@ const SortDirection = (props: DirectionSortProps) => {
28
28
  align="right"
29
29
  size="sm"
30
30
  label={props.sortDirection === "asc" ? "Ascending" : "Descending"}
31
+ aria-label={`Sort direction: ${props.sortDirection === "asc" ? "Ascending" : "Descending"}`}
31
32
  isOpen={isOpen}
32
33
  onOpenChange={setIsOpen}
33
34
  >