@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
@@ -5,16 +5,19 @@ import useDebouncedValue from "../../../hooks/useDebouncedValue.js";
5
5
  import useScrollIntoView from "../../../hooks/useScrollIntoView.js";
6
6
  import useListKeyboard from "../../../hooks/useListKeyboard.js";
7
7
  import useOutsideClick from "../../../hooks/useOutsideClick.js";
8
+ import { useEffect, useId, useState, useRef } from "react";
8
9
  import { UseQueryResult } from "@tanstack/react-query";
9
10
  import Spinner from "../../feedback/spinner/index.js";
10
- import { useEffect, useState, useRef } from "react";
11
11
  import Portal from "../../overlays/portal/index.js";
12
12
  import { PropsWithSize } from "../../types.js";
13
13
  import Input from "../input/index.js";
14
14
  import "./styles.css";
15
15
 
16
16
  interface SearchListProps<T> extends PropsWithSize {
17
- /** **_Optional_** the selected value for this component */
17
+ /**
18
+ * **_Optional_** the selected value, for a controlled SearchList (`null`
19
+ * for none). Leave it out and SearchList keeps track of the pick itself.
20
+ */
18
21
  value?: T | null;
19
22
  /** The useQuery function that is used to retrieve the data from the server */
20
23
  queryFn: (
@@ -63,11 +66,17 @@ const SearchList = <T,>(props: SearchListProps<T>) => {
63
66
  props.value ? String(props.value[props.labelKey]) : ""
64
67
  );
65
68
  const [searchValue, setSearchValue] = useState<string>("");
69
+ // Without a `value` prop, the pick is held here instead.
70
+ const isControlled = props.value !== undefined;
71
+ const [ownValue, setOwnValue] = useState<T | null>(null);
72
+ const selected = isControlled ? props.value : ownValue;
66
73
  const [isOpen, setIsOpen] = useState(false);
67
74
  const [highlightedIndex, setHighlightedIndex] = useState(-1);
68
75
  const dropdownRef = useRef<HTMLDivElement>(null);
69
76
  const listRef = useRef<HTMLUListElement>(null);
70
77
  const optionRefs = useRef<(HTMLLIElement | null)[]>([]);
78
+ const listboxId = `${useId()}-listbox`;
79
+ const optionId = (index: number) => `${listboxId}-option-${index}`;
71
80
  const { anchorRef: inputWrapperRef, position: dropdownPos } =
72
81
  useFloatingPosition({ isOpen });
73
82
 
@@ -91,12 +100,13 @@ const SearchList = <T,>(props: SearchListProps<T>) => {
91
100
 
92
101
  useEffect(() => {
93
102
  if (inputValue.length === 0) {
103
+ setOwnValue(null);
94
104
  props.onSelect(null);
95
105
  if (!isOpen) setSearchValue("");
96
106
  return;
97
107
  }
98
108
  if (inputValue.length < 3) return;
99
- if (props.value && inputValue === String(props.value[props.labelKey])) {
109
+ if (selected && inputValue === String(selected[props.labelKey])) {
100
110
  setSearchValue("");
101
111
  setIsOpen(false);
102
112
  return;
@@ -109,7 +119,7 @@ const SearchList = <T,>(props: SearchListProps<T>) => {
109
119
  setSearchValue("");
110
120
  return;
111
121
  }
112
- if (props.value && debouncedInput === String(props.value[props.labelKey])) {
122
+ if (selected && debouncedInput === String(selected[props.labelKey])) {
113
123
  setSearchValue("");
114
124
  return;
115
125
  }
@@ -122,23 +132,32 @@ const SearchList = <T,>(props: SearchListProps<T>) => {
122
132
 
123
133
  const handleOptionClick = (option: T, event?: React.MouseEvent) => {
124
134
  setInputValue(String(option[props.labelKey]));
135
+ if (!isControlled) setOwnValue(option);
125
136
  props.onSelect(option, event);
126
137
  setIsOpen(false);
127
138
  setHighlightedIndex(-1);
128
139
  };
129
140
 
130
- const activeOptions =
131
- searchValue === "" && inputValue.length < 3
132
- ? props.initialOptions
133
- : query.data;
141
+ const isLoading = isTyping || query.isLoading;
142
+ const showsInitial = searchValue === "" && inputValue.length < 3;
143
+ // The options on screen; the keyboard works only through these, never
144
+ // through stale results hidden behind the spinner.
145
+ const options =
146
+ (isLoading
147
+ ? undefined
148
+ : showsInitial
149
+ ? props.initialOptions
150
+ : query.data) ?? [];
151
+ const showList = isOpen && !!dropdownPos;
152
+ const hasOptions = options.length > 0;
134
153
 
135
154
  const handleKeyDown = useListKeyboard({
136
- isOpen: isOpen && !!activeOptions,
137
- length: activeOptions?.length ?? 0,
155
+ isOpen: isOpen && hasOptions,
156
+ length: options.length,
138
157
  highlightedIndex,
139
158
  setHighlightedIndex,
140
159
  onSelect: (index) => {
141
- if (activeOptions?.[index]) handleOptionClick(activeOptions[index]);
160
+ if (options[index]) handleOptionClick(options[index]);
142
161
  },
143
162
  onClose: () => setIsOpen(false),
144
163
  });
@@ -156,9 +175,9 @@ const SearchList = <T,>(props: SearchListProps<T>) => {
156
175
  const handleInputBlur = () => {
157
176
  setTimeout(() => {
158
177
  if (isOpen) return;
159
- if (props.value) {
160
- setInputValue(String(props.value[props.labelKey]));
161
- props.onSelect(props.value);
178
+ if (selected) {
179
+ setInputValue(String(selected[props.labelKey]));
180
+ props.onSelect(selected);
162
181
  } else {
163
182
  setInputValue("");
164
183
  }
@@ -167,110 +186,93 @@ const SearchList = <T,>(props: SearchListProps<T>) => {
167
186
 
168
187
  optionRefs.current = [];
169
188
 
170
- const dropdownList =
171
- isOpen && dropdownPos ? (
172
- <ul
173
- ref={listRef}
174
- className={`k-search-list-dropdown k-search-list-dropdown-portal ${
175
- longDropDown
176
- ? "k-search-list-dropdown-large"
177
- : "k-search-list-dropdown-small"
178
- }`}
179
- style={{
180
- position: "fixed",
181
- top: dropdownPos.top,
182
- left: dropdownPos.left,
183
- width: dropdownPos.width,
184
- }}
185
- >
186
- {isTyping || query.isLoading ? (
187
- <li className="k-search-list-loading">
188
- <Spinner size="sm" />
189
- </li>
190
- ) : searchValue === "" && inputValue.length < 3 ? (
191
- props.initialOptions && props.initialOptions.length > 0 ? (
192
- <>
193
- {props.initialOptions.map((option, index) => {
194
- const rendered = props.renderOption
195
- ? props.renderOption(option)
196
- : null;
197
- return (
198
- <li
199
- ref={(el) => {
200
- optionRefs.current[index] = el;
201
- }}
202
- key={index}
203
- className={`k-search-list-option k-search-list-option-${size} ${
204
- index === highlightedIndex
205
- ? "k-search-list-option-highlighted"
206
- : ""
207
- }`}
208
- onMouseDown={(e) => {
209
- e.preventDefault();
210
- handleOptionClick(option, e);
211
- }}
212
- onMouseOver={() => setHighlightedIndex(index)}
213
- >
214
- {rendered ? rendered.node : String(option[props.labelKey])}
215
- </li>
216
- );
217
- })}
218
- <li className={`k-search-list-info k-search-list-info-${size}`}>
219
- Type to filter
189
+ const status = isLoading ? (
190
+ <Spinner size="sm" />
191
+ ) : showsInitial ? (
192
+ "Start typing to search"
193
+ ) : (
194
+ "No results found"
195
+ );
196
+
197
+ const dropdownList = showList ? (
198
+ <ul
199
+ ref={listRef}
200
+ // With no options the popup only holds a status message.
201
+ {...(hasOptions
202
+ ? {
203
+ id: listboxId,
204
+ role: "listbox",
205
+ "aria-label": props.label ?? props.placeholder ?? "Type to search",
206
+ }
207
+ : { role: "presentation" })}
208
+ className={`k-search-list-dropdown k-search-list-dropdown-portal ${
209
+ longDropDown
210
+ ? "k-search-list-dropdown-large"
211
+ : "k-search-list-dropdown-small"
212
+ }`}
213
+ style={{
214
+ position: "fixed",
215
+ top: dropdownPos.top,
216
+ left: dropdownPos.left,
217
+ width: dropdownPos.width,
218
+ }}
219
+ >
220
+ {hasOptions ? (
221
+ <>
222
+ {options.map((option, index) => {
223
+ const rendered = props.renderOption
224
+ ? props.renderOption(option)
225
+ : null;
226
+ return (
227
+ <li
228
+ ref={(el) => {
229
+ optionRefs.current[index] = el;
230
+ }}
231
+ key={index}
232
+ id={optionId(index)}
233
+ role="option"
234
+ aria-selected={index === highlightedIndex}
235
+ className={`k-search-list-option k-search-list-option-${size} ${
236
+ index === highlightedIndex
237
+ ? "k-search-list-option-highlighted"
238
+ : ""
239
+ }`}
240
+ onMouseDown={(e) => {
241
+ e.preventDefault();
242
+ handleOptionClick(option, e);
243
+ }}
244
+ onMouseOver={() => setHighlightedIndex(index)}
245
+ >
246
+ {rendered ? rendered.node : String(option[props.labelKey])}
220
247
  </li>
221
- </>
222
- ) : (
223
- <li
224
- className={`k-search-list-no-results k-search-list-no-results-${size}`}
225
- >
226
- Start typing to search
227
- </li>
228
- )
229
- ) : query.data && query.data.length > 0 ? (
230
- <>
231
- {query.data.map((option, index) => {
232
- const rendered = props.renderOption
233
- ? props.renderOption(option)
234
- : null;
235
- return (
236
- <li
237
- ref={(el) => {
238
- optionRefs.current[index] = el;
239
- }}
240
- key={index}
241
- className={`k-search-list-option k-search-list-option-${size} ${
242
- index === highlightedIndex
243
- ? "k-search-list-option-highlighted"
244
- : ""
245
- }`}
246
- onMouseDown={(e) => {
247
- e.preventDefault();
248
- handleOptionClick(option, e);
249
- }}
250
- onMouseOver={() => setHighlightedIndex(index)}
251
- >
252
- {rendered ? rendered.node : String(option[props.labelKey])}
253
- </li>
254
- );
255
- })}
256
- <li className={`k-search-list-info k-search-list-info-${size}`}>
257
- Continue typing to filter
258
- </li>
259
- </>
260
- ) : (
248
+ );
249
+ })}
250
+ {/* A visual hint; a listbox may only contain options. */}
261
251
  <li
262
- className={`k-search-list-no-results k-search-list-no-results-${size}`}
252
+ className={`k-search-list-info k-search-list-info-${size}`}
253
+ aria-hidden="true"
263
254
  >
264
- No results found
255
+ {showsInitial ? "Type to filter" : "Continue typing to filter"}
265
256
  </li>
266
- )}
267
- </ul>
268
- ) : null;
257
+ </>
258
+ ) : isLoading ? (
259
+ <li className="k-search-list-loading">{status}</li>
260
+ ) : (
261
+ <li
262
+ role="status"
263
+ className={`k-search-list-no-results k-search-list-no-results-${size}`}
264
+ >
265
+ {status}
266
+ </li>
267
+ )}
268
+ </ul>
269
+ ) : null;
269
270
 
270
271
  return (
271
272
  <div className="k-search-list-container" ref={dropdownRef}>
272
273
  <div ref={inputWrapperRef}>
273
274
  <Input
275
+ id={props.id}
274
276
  label={props.label}
275
277
  required={required}
276
278
  disabled={disabled}
@@ -278,6 +280,7 @@ const SearchList = <T,>(props: SearchListProps<T>) => {
278
280
  onChange={(e) => {
279
281
  const newValue = e.target.value;
280
282
  setInputValue(newValue);
283
+ setHighlightedIndex(-1);
281
284
  }}
282
285
  onKeyDown={handleKeyDown}
283
286
  onFocus={handleInputFocus}
@@ -286,6 +289,15 @@ const SearchList = <T,>(props: SearchListProps<T>) => {
286
289
  dropDown={true}
287
290
  isOpen={isOpen}
288
291
  size={size}
292
+ role="combobox"
293
+ aria-autocomplete="list"
294
+ aria-expanded={showList}
295
+ aria-controls={showList && hasOptions ? listboxId : undefined}
296
+ aria-activedescendant={
297
+ showList && hasOptions && highlightedIndex > -1
298
+ ? optionId(highlightedIndex)
299
+ : undefined
300
+ }
289
301
  />
290
302
  </div>
291
303
  <Portal>{dropdownList}</Portal>
@@ -9,8 +9,8 @@
9
9
  left: 0;
10
10
  right: 0;
11
11
  z-index: 10000;
12
- background-color: var(--background-color-light);
13
- border: 0.0625rem solid var(--border-color);
12
+ background-color: var(--k-background-color-light);
13
+ border: 0.0625rem solid var(--k-border-color);
14
14
  border-top: none;
15
15
  border-radius: 0 0 0.25rem 0.25rem;
16
16
  overflow-y: auto;
@@ -19,14 +19,14 @@
19
19
  padding: 0;
20
20
  margin: 0;
21
21
  box-shadow:
22
- 0 0.25rem 0.375rem -0.0625rem var(--shadow-color),
23
- 0 0.125rem 0.25rem -0.125rem var(--shadow-color);
22
+ 0 0.25rem 0.375rem -0.0625rem var(--k-shadow-color),
23
+ 0 0.125rem 0.25rem -0.125rem var(--k-shadow-color);
24
24
  }
25
25
 
26
26
  .k-search-list-option {
27
27
  cursor: pointer;
28
28
  text-align: left;
29
- color: var(--text-color);
29
+ color: var(--k-text-color);
30
30
  }
31
31
  .k-search-list-dropdown-large {
32
32
  max-height: 30rem;
@@ -38,77 +38,77 @@
38
38
 
39
39
  .k-search-list-option:hover,
40
40
  .k-search-list-option:focus {
41
- background-color: var(--background-color-dark);
41
+ background-color: var(--k-background-color-dark);
42
42
  }
43
43
 
44
44
  .k-search-list-option-highlighted {
45
- background-color: var(--background-color-dark);
45
+ background-color: var(--k-background-color-dark);
46
46
  cursor: pointer;
47
47
  }
48
48
 
49
49
  .k-search-list-option-sm {
50
- font-size: var(--text-size-sm);
50
+ font-size: var(--k-text-size-sm);
51
51
  padding: 0.5rem 0.75rem;
52
52
  }
53
53
 
54
54
  .k-search-list-option-md {
55
- font-size: var(--text-size-md);
55
+ font-size: var(--k-text-size-md);
56
56
  padding: 0.75rem 1rem;
57
57
  }
58
58
 
59
59
  .k-search-list-option-lg {
60
- font-size: var(--text-size-lg);
60
+ font-size: var(--k-text-size-lg);
61
61
  padding: 1rem 1.25rem;
62
62
  }
63
63
 
64
64
  .k-search-list-loading {
65
65
  text-align: center;
66
- color: var(--text-color-secondary);
66
+ color: var(--k-text-color-secondary);
67
67
  font-style: italic;
68
68
  padding: 0.75rem 1rem;
69
- font-size: var(--text-size-sm);
69
+ font-size: var(--k-text-size-sm);
70
70
  }
71
71
 
72
72
  .k-search-list-info {
73
73
  text-align: center;
74
- color: var(--text-color-secondary);
74
+ color: var(--k-text-color-secondary);
75
75
  font-style: italic;
76
- /* border-top: 0.0625rem solid var(--border-color); */
77
- background-color: var(--background-color-light);
76
+ /* border-top: 0.0625rem solid var(--k-border-color); */
77
+ background-color: var(--k-background-color-light);
78
78
  }
79
79
 
80
80
  .k-search-list-info-sm {
81
- font-size: var(--text-size-sm);
81
+ font-size: var(--k-text-size-sm);
82
82
  padding: 0.5rem 0.75rem;
83
83
  }
84
84
 
85
85
  .k-search-list-info-md {
86
- font-size: var(--text-size-md);
86
+ font-size: var(--k-text-size-md);
87
87
  padding: 0.75rem 1rem;
88
88
  }
89
89
 
90
90
  .k-search-list-info-lg {
91
- font-size: var(--text-size-lg);
91
+ font-size: var(--k-text-size-lg);
92
92
  padding: 1rem 1.25rem;
93
93
  }
94
94
 
95
95
  .k-search-list-no-results {
96
96
  text-align: center;
97
- color: var(--text-color-secondary);
97
+ color: var(--k-text-color-secondary);
98
98
  font-style: italic;
99
99
  }
100
100
 
101
101
  .k-search-list-no-results-sm {
102
- font-size: var(--text-size-sm);
102
+ font-size: var(--k-text-size-sm);
103
103
  padding: 0.75rem 1rem;
104
104
  }
105
105
 
106
106
  .k-search-list-no-results-md {
107
- font-size: var(--text-size-md);
107
+ font-size: var(--k-text-size-md);
108
108
  padding: 1rem 1.25rem;
109
109
  }
110
110
 
111
111
  .k-search-list-no-results-lg {
112
- font-size: var(--text-size-lg);
112
+ font-size: var(--k-text-size-lg);
113
113
  padding: 1.25rem 1.5rem;
114
114
  }
@@ -51,6 +51,7 @@ const SearchSelect = <T,>(props: SearchSelectProps<T>) => {
51
51
  const dropdownRef = useRef<HTMLDivElement>(null);
52
52
  const listRef = useRef<HTMLUListElement>(null);
53
53
  const optionRefs = useRef<(HTMLLIElement | null)[]>([]);
54
+ const blurTimerRef = useRef<ReturnType<typeof setTimeout>>(undefined);
54
55
  const { anchorRef: inputWrapperRef, position: dropdownPos } =
55
56
  useFloatingPosition({ isOpen });
56
57
 
@@ -74,6 +75,7 @@ const SearchSelect = <T,>(props: SearchSelectProps<T>) => {
74
75
  };
75
76
 
76
77
  useOutsideClick([dropdownRef, listRef], restore);
78
+ useEffect(() => () => clearTimeout(blurTimerRef.current), []);
77
79
  useScrollIntoView(optionRefs, highlightedIndex, isOpen);
78
80
 
79
81
  const choose = (option: T) => {
@@ -156,11 +158,15 @@ const SearchSelect = <T,>(props: SearchSelectProps<T>) => {
156
158
  setInputValue(e.target.value);
157
159
  setFiltering(true);
158
160
  setIsOpen(true);
161
+ setHighlightedIndex(-1);
159
162
  }}
160
163
  onKeyDown={handleKeyDown}
161
- onFocus={() => setIsOpen(true)}
164
+ onFocus={() => {
165
+ clearTimeout(blurTimerRef.current);
166
+ setIsOpen(true);
167
+ }}
162
168
  onBlur={() => {
163
- setTimeout(restore, 100);
169
+ blurTimerRef.current = setTimeout(restore, 100);
164
170
  }}
165
171
  placeholder={props.placeholder || "Select..."}
166
172
  dropDown={true}
@@ -2,7 +2,7 @@
2
2
 
3
3
  import FieldShell from "../../forms/fieldShell/index.js";
4
4
  import { PropsWithSize } from "../../types.js";
5
- import { useLayoutEffect } from "react";
5
+ import { useId, useLayoutEffect } from "react";
6
6
  import "./styles.css";
7
7
 
8
8
  export interface SelectOption<T = string> {
@@ -36,8 +36,8 @@ interface SelectProps<T = string> extends PropsWithSize {
36
36
  const Select = <T extends string = string>(props: SelectProps<T>) => {
37
37
  const { size = "md", disabled = false, required = false } = props;
38
38
 
39
- const selectId =
40
- props.id || `select-${Math.random().toString(36).substring(2, 9)}`;
39
+ const generatedId = useId();
40
+ const selectId = props.id || `select-${generatedId}`;
41
41
 
42
42
  const selectClasses = ["k-select", `k-select-${size}`]
43
43
  .filter(Boolean)
@@ -10,57 +10,135 @@
10
10
  }
11
11
 
12
12
  .k-select {
13
- border: 0.0625rem solid var(--border-color);
13
+ border: 0.0625rem solid var(--k-border-color);
14
14
  border-radius: 0.375rem;
15
- color: var(--text-color);
15
+ color: var(--k-text-color);
16
16
  width: 100%;
17
17
  box-sizing: border-box;
18
18
  line-height: 1.5;
19
19
  transition:
20
20
  border-color 0.2s ease-in-out,
21
21
  box-shadow 0.2s ease-in-out;
22
- background-color: var(--background-color-light);
22
+ background-color: var(--k-background-color-light);
23
23
  cursor: pointer;
24
24
  }
25
25
 
26
26
  .k-select-sm {
27
- font-size: var(--text-size-sm);
27
+ font-size: var(--k-text-size-sm);
28
28
  padding: 0.69rem 0.75rem;
29
29
  }
30
30
 
31
31
  .k-select-md {
32
- font-size: var(--text-size-md);
32
+ font-size: var(--k-text-size-md);
33
33
  padding: 0.84rem 1rem;
34
34
  }
35
35
 
36
36
  .k-select-lg {
37
- font-size: var(--text-size-lg);
37
+ font-size: var(--k-text-size-lg);
38
38
  padding: 0.98rem 1.25rem;
39
39
  }
40
40
 
41
41
  .k-select:focus {
42
42
  outline: none;
43
- border-color: var(--primary-color);
44
- box-shadow: 0 0 0 2px var(--border-shadow-color-active);
43
+ border-color: var(--k-primary-color);
44
+ box-shadow: 0 0 0 2px var(--k-border-shadow-color-active);
45
45
  }
46
46
 
47
47
  .k-select:disabled {
48
- background-color: var(--background-color-disabled);
49
- color: var(--text-color-disabled);
48
+ background-color: var(--k-background-color-disabled);
49
+ color: var(--k-text-color-disabled);
50
50
  cursor: not-allowed;
51
- border-color: var(--border-color-disabled);
51
+ border-color: var(--k-border-color-disabled);
52
52
  }
53
53
 
54
54
  .k-select option {
55
- color: var(--text-color);
56
- background-color: var(--background-color);
55
+ color: var(--k-text-color);
56
+ background-color: var(--k-background-color);
57
57
  padding: 0.5rem;
58
58
  }
59
59
 
60
60
  .k-select:invalid {
61
- border-color: var(--danger-color);
61
+ border-color: var(--k-danger-color);
62
62
  }
63
63
 
64
64
  .k-select:hover:not(:disabled) {
65
- border-color: var(--border-color-hover);
65
+ border-color: var(--k-border-color-hover);
66
+ }
67
+
68
+ /* A native picker opens wherever the OS puts it (macOS lays the selected
69
+ option over the field). Where customizable <select> is supported, the
70
+ picker opens below the field and takes the theme instead; elsewhere the
71
+ native picker remains. */
72
+ @supports (appearance: base-select) {
73
+ .k-select,
74
+ .k-select::picker(select) {
75
+ appearance: base-select;
76
+ }
77
+
78
+ /* The browser's filled triangle, swapped for the chevron MultiSelect and
79
+ SearchSelect show (FontAwesome chevron-down), sized and colored alike. */
80
+ .k-select::picker-icon {
81
+ content: "";
82
+ align-self: center;
83
+ width: 0.875em;
84
+ height: 1em;
85
+ background-color: var(--k-text-color-secondary);
86
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'%3E%3Cpath d='M201.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 338.7 54.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z'/%3E%3C/svg%3E")
87
+ center / contain no-repeat;
88
+ transition:
89
+ background-color 0.2s ease-in-out,
90
+ rotate 0.2s ease-in-out;
91
+ }
92
+
93
+ .k-select-sm::picker-icon {
94
+ font-size: 0.75rem;
95
+ }
96
+
97
+ .k-select-md::picker-icon {
98
+ font-size: 0.875rem;
99
+ }
100
+
101
+ .k-select-lg::picker-icon {
102
+ font-size: 1rem;
103
+ }
104
+
105
+ .k-select:hover:not(:disabled)::picker-icon {
106
+ background-color: var(--k-primary-color-text);
107
+ }
108
+
109
+ .k-select:open::picker-icon {
110
+ rotate: 180deg;
111
+ }
112
+
113
+ .k-select::picker(select) {
114
+ margin-top: 0.25rem;
115
+ padding: 0.25rem 0;
116
+ border: 0.0625rem solid var(--k-border-color);
117
+ border-radius: 0.375rem;
118
+ background-color: var(--k-background-color-light);
119
+ box-shadow:
120
+ 0 0.25rem 0.375rem -0.0625rem var(--k-shadow-color),
121
+ 0 0.125rem 0.25rem -0.125rem var(--k-shadow-color);
122
+ }
123
+
124
+ .k-select option {
125
+ padding: 0.5rem 1rem;
126
+ background-color: transparent;
127
+ cursor: pointer;
128
+ }
129
+
130
+ .k-select option:hover,
131
+ .k-select option:focus-visible {
132
+ outline: none;
133
+ background-color: var(--k-background-color-hover);
134
+ }
135
+
136
+ .k-select option:checked {
137
+ background-color: var(--k-primary-color-background-light);
138
+ }
139
+
140
+ .k-select option:disabled {
141
+ color: var(--k-text-color-disabled);
142
+ cursor: default;
143
+ }
66
144
  }
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
 
3
+ import { useId } from "react";
3
4
  import "./styles.css";
4
5
 
5
6
  interface SwitchProps {
@@ -21,8 +22,8 @@ const Switch = (props: SwitchProps) => {
21
22
  size = "md",
22
23
  } = props;
23
24
 
24
- const inputId =
25
- props.id || `switch-${Math.random().toString(36).substring(2, 9)}`;
25
+ const generatedId = useId();
26
+ const inputId = props.id || `switch-${generatedId}`;
26
27
 
27
28
  return (
28
29
  <div className={`k-switch-container k-switch-${labelLocation}`}>