@drivenets/design-system 0.0.5 → 0.2.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 (340) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/components/ds-alert-banner/ds-alert-banner.d.ts +5 -5
  3. package/dist/components/ds-alert-banner/ds-alert-banner.d.ts.map +1 -1
  4. package/dist/components/ds-avatar/ds-avatar.cjs +98 -0
  5. package/dist/components/ds-avatar/ds-avatar.d.cts +12 -0
  6. package/dist/components/ds-avatar/ds-avatar.d.cts.map +1 -0
  7. package/dist/components/ds-avatar/ds-avatar.d.ts +12 -0
  8. package/dist/components/ds-avatar/ds-avatar.d.ts.map +1 -0
  9. package/dist/components/ds-avatar/ds-avatar.js +97 -0
  10. package/dist/components/ds-avatar/ds-avatar.js.map +1 -0
  11. package/dist/components/ds-avatar/ds-avatar.module.cjs +17 -0
  12. package/dist/components/ds-avatar/ds-avatar.module.js +17 -0
  13. package/dist/components/ds-avatar/ds-avatar.module.js.map +1 -0
  14. package/dist/components/ds-avatar/ds-avatar.types.d.cts +44 -0
  15. package/dist/components/ds-avatar/ds-avatar.types.d.cts.map +1 -0
  16. package/dist/components/ds-avatar/ds-avatar.types.d.ts +44 -0
  17. package/dist/components/ds-avatar/ds-avatar.types.d.ts.map +1 -0
  18. package/dist/components/ds-avatar/index.cjs +1 -0
  19. package/dist/components/ds-avatar/index.d.ts +2 -0
  20. package/dist/components/ds-avatar/index.js +1 -0
  21. package/dist/components/ds-avatar-group/ds-avatar-group.cjs +93 -0
  22. package/dist/components/ds-avatar-group/ds-avatar-group.d.cts +12 -0
  23. package/dist/components/ds-avatar-group/ds-avatar-group.d.cts.map +1 -0
  24. package/dist/components/ds-avatar-group/ds-avatar-group.d.ts +12 -0
  25. package/dist/components/ds-avatar-group/ds-avatar-group.d.ts.map +1 -0
  26. package/dist/components/ds-avatar-group/ds-avatar-group.js +92 -0
  27. package/dist/components/ds-avatar-group/ds-avatar-group.js.map +1 -0
  28. package/dist/components/ds-avatar-group/ds-avatar-group.module.cjs +19 -0
  29. package/dist/components/ds-avatar-group/ds-avatar-group.module.js +19 -0
  30. package/dist/components/ds-avatar-group/ds-avatar-group.module.js.map +1 -0
  31. package/dist/components/ds-avatar-group/ds-avatar-group.types.d.cts +31 -0
  32. package/dist/components/ds-avatar-group/ds-avatar-group.types.d.cts.map +1 -0
  33. package/dist/components/ds-avatar-group/ds-avatar-group.types.d.ts +32 -0
  34. package/dist/components/ds-avatar-group/ds-avatar-group.types.d.ts.map +1 -0
  35. package/dist/components/ds-avatar-group/index.cjs +1 -0
  36. package/dist/components/ds-avatar-group/index.d.ts +2 -0
  37. package/dist/components/ds-avatar-group/index.js +1 -0
  38. package/dist/components/ds-button/ds-button.d.cts +2 -2
  39. package/dist/components/ds-button/ds-button.d.ts +2 -2
  40. package/dist/components/ds-button/ds-button.d.ts.map +1 -1
  41. package/dist/components/ds-button/versions/ds-button-new/ds-button-new.module.cjs +18 -18
  42. package/dist/components/ds-button/versions/ds-button-new/ds-button-new.module.js +18 -18
  43. package/dist/components/ds-button/versions/ds-button-new/ds-button-new.module.js.map +1 -1
  44. package/dist/components/ds-chip/ds-chip.cjs +2 -1
  45. package/dist/components/ds-chip/ds-chip.d.cts +2 -1
  46. package/dist/components/ds-chip/ds-chip.d.cts.map +1 -1
  47. package/dist/components/ds-chip/ds-chip.d.ts +2 -1
  48. package/dist/components/ds-chip/ds-chip.d.ts.map +1 -1
  49. package/dist/components/ds-chip/ds-chip.js +2 -1
  50. package/dist/components/ds-chip/ds-chip.js.map +1 -1
  51. package/dist/components/ds-chip/ds-chip.types.d.cts +13 -0
  52. package/dist/components/ds-chip/ds-chip.types.d.cts.map +1 -1
  53. package/dist/components/ds-chip/ds-chip.types.d.ts +13 -0
  54. package/dist/components/ds-chip/ds-chip.types.d.ts.map +1 -1
  55. package/dist/components/ds-chip-group/ds-chip-group.cjs +2 -2
  56. package/dist/components/ds-chip-group/ds-chip-group.d.cts +2 -2
  57. package/dist/components/ds-chip-group/ds-chip-group.d.ts +2 -2
  58. package/dist/components/ds-chip-group/ds-chip-group.js +2 -2
  59. package/dist/components/ds-chip-group/ds-chip-group.js.map +1 -1
  60. package/dist/components/ds-chip-group/ds-chip-group.types.d.cts +9 -0
  61. package/dist/components/ds-chip-group/ds-chip-group.types.d.cts.map +1 -1
  62. package/dist/components/ds-chip-group/ds-chip-group.types.d.ts +9 -0
  63. package/dist/components/ds-chip-group/ds-chip-group.types.d.ts.map +1 -1
  64. package/dist/components/ds-confirmation/ds-confirmation.d.cts +8 -8
  65. package/dist/components/ds-confirmation/ds-confirmation.d.cts.map +1 -1
  66. package/dist/components/ds-confirmation/ds-confirmation.d.ts +8 -8
  67. package/dist/components/ds-date-input/ds-date-input.cjs +352 -0
  68. package/dist/components/ds-date-input/ds-date-input.d.cts +31 -0
  69. package/dist/components/ds-date-input/ds-date-input.d.cts.map +1 -0
  70. package/dist/components/ds-date-input/ds-date-input.d.ts +31 -0
  71. package/dist/components/ds-date-input/ds-date-input.d.ts.map +1 -0
  72. package/dist/components/ds-date-input/ds-date-input.js +351 -0
  73. package/dist/components/ds-date-input/ds-date-input.js.map +1 -0
  74. package/dist/components/ds-date-input/ds-date-input.module.cjs +29 -0
  75. package/dist/components/ds-date-input/ds-date-input.module.js +29 -0
  76. package/dist/components/ds-date-input/ds-date-input.module.js.map +1 -0
  77. package/dist/components/ds-date-input/ds-date-input.types.d.cts +92 -0
  78. package/dist/components/ds-date-input/ds-date-input.types.d.cts.map +1 -0
  79. package/dist/components/ds-date-input/ds-date-input.types.d.ts +92 -0
  80. package/dist/components/ds-date-input/ds-date-input.types.d.ts.map +1 -0
  81. package/dist/components/ds-date-input/ds-date-input.utils.cjs +169 -0
  82. package/dist/components/ds-date-input/ds-date-input.utils.js +164 -0
  83. package/dist/components/ds-date-input/ds-date-input.utils.js.map +1 -0
  84. package/dist/components/ds-date-input/index.cjs +1 -0
  85. package/dist/components/ds-date-input/index.d.ts +2 -0
  86. package/dist/components/ds-date-input/index.js +1 -0
  87. package/dist/components/ds-divider/ds-divider.cjs +47 -0
  88. package/dist/components/ds-divider/ds-divider.d.cts +8 -0
  89. package/dist/components/ds-divider/ds-divider.d.cts.map +1 -0
  90. package/dist/components/ds-divider/ds-divider.d.ts +8 -0
  91. package/dist/components/ds-divider/ds-divider.d.ts.map +1 -0
  92. package/dist/components/ds-divider/ds-divider.js +46 -0
  93. package/dist/components/ds-divider/ds-divider.js.map +1 -0
  94. package/dist/components/ds-divider/ds-divider.module.cjs +10 -0
  95. package/dist/components/ds-divider/ds-divider.module.js +10 -0
  96. package/dist/components/ds-divider/ds-divider.module.js.map +1 -0
  97. package/dist/components/ds-divider/ds-divider.types.d.cts +25 -0
  98. package/dist/components/ds-divider/ds-divider.types.d.cts.map +1 -0
  99. package/dist/components/ds-divider/ds-divider.types.d.ts +25 -0
  100. package/dist/components/ds-divider/ds-divider.types.d.ts.map +1 -0
  101. package/dist/components/ds-divider/index.cjs +1 -0
  102. package/dist/components/ds-divider/index.d.ts +2 -0
  103. package/dist/components/ds-divider/index.js +1 -0
  104. package/dist/components/ds-drawer/ds-drawer.d.ts +9 -9
  105. package/dist/components/ds-drawer/ds-drawer.js +2 -2
  106. package/dist/components/ds-dropdown-menu/ds-dropdown-menu.cjs +80 -24
  107. package/dist/components/ds-dropdown-menu/ds-dropdown-menu.d.cts +1 -0
  108. package/dist/components/ds-dropdown-menu/ds-dropdown-menu.d.cts.map +1 -1
  109. package/dist/components/ds-dropdown-menu/ds-dropdown-menu.d.ts +1 -0
  110. package/dist/components/ds-dropdown-menu/ds-dropdown-menu.d.ts.map +1 -1
  111. package/dist/components/ds-dropdown-menu/ds-dropdown-menu.js +83 -27
  112. package/dist/components/ds-dropdown-menu/ds-dropdown-menu.js.map +1 -1
  113. package/dist/components/ds-dropdown-menu/ds-dropdown-menu.module.cjs +20 -18
  114. package/dist/components/ds-dropdown-menu/ds-dropdown-menu.module.js +20 -18
  115. package/dist/components/ds-dropdown-menu/ds-dropdown-menu.module.js.map +1 -1
  116. package/dist/components/ds-dropdown-menu/ds-dropdown-menu.types.d.cts +5 -1
  117. package/dist/components/ds-dropdown-menu/ds-dropdown-menu.types.d.cts.map +1 -1
  118. package/dist/components/ds-dropdown-menu/ds-dropdown-menu.types.d.ts +5 -1
  119. package/dist/components/ds-dropdown-menu/ds-dropdown-menu.types.d.ts.map +1 -1
  120. package/dist/components/ds-dropdown-menu/index.d.ts +1 -1
  121. package/dist/components/ds-expandable-text-input/ds-expandable-text-input.d.cts +2 -2
  122. package/dist/components/ds-expandable-text-input/ds-expandable-text-input.d.ts +2 -2
  123. package/dist/components/ds-file-upload/components/file-upload-item/file-upload-item.cjs +2 -2
  124. package/dist/components/ds-file-upload/components/file-upload-item/file-upload-item.js +2 -2
  125. package/dist/components/ds-form-control/ds-form-control.cjs +3 -0
  126. package/dist/components/ds-form-control/ds-form-control.d.cts +9 -7
  127. package/dist/components/ds-form-control/ds-form-control.d.cts.map +1 -1
  128. package/dist/components/ds-form-control/ds-form-control.d.ts +10 -7
  129. package/dist/components/ds-form-control/ds-form-control.d.ts.map +1 -1
  130. package/dist/components/ds-form-control/ds-form-control.js +3 -0
  131. package/dist/components/ds-form-control/ds-form-control.js.map +1 -1
  132. package/dist/components/ds-modal/ds-modal.d.cts +8 -8
  133. package/dist/components/ds-modal/ds-modal.d.cts.map +1 -1
  134. package/dist/components/ds-modal/ds-modal.d.ts +8 -8
  135. package/dist/components/ds-modal/ds-modal.d.ts.map +1 -1
  136. package/dist/components/ds-panel/ds-panel.d.cts +2 -2
  137. package/dist/components/ds-panel/ds-panel.d.ts +2 -2
  138. package/dist/components/ds-radio-group/ds-radio-group.types.d.cts +1 -1
  139. package/dist/components/ds-radio-group/ds-radio-group.types.d.cts.map +1 -1
  140. package/dist/components/ds-radio-group/ds-radio-group.types.d.ts +1 -1
  141. package/dist/components/ds-radio-group/ds-radio-group.types.d.ts.map +1 -1
  142. package/dist/components/ds-select/ds-select.d.cts +2 -2
  143. package/dist/components/ds-select/ds-select.d.ts +2 -2
  144. package/dist/components/ds-smart-tabs/ds-smart-tabs.d.cts +2 -2
  145. package/dist/components/ds-smart-tabs/ds-smart-tabs.d.ts +2 -2
  146. package/dist/components/ds-smart-tabs/ds-smart-tabs.d.ts.map +1 -1
  147. package/dist/components/ds-stepper/components/ds-step-content.d.cts +2 -2
  148. package/dist/components/ds-stepper/components/ds-step-content.d.ts +2 -2
  149. package/dist/components/ds-stepper/components/ds-step-next-button.d.cts +2 -2
  150. package/dist/components/ds-stepper/components/ds-step-next-button.d.ts +2 -2
  151. package/dist/components/ds-stepper/components/ds-step.d.cts +2 -2
  152. package/dist/components/ds-stepper/components/ds-step.d.ts +2 -2
  153. package/dist/components/ds-stepper/ds-stepper.d.cts +2 -2
  154. package/dist/components/ds-stepper/ds-stepper.d.ts +2 -2
  155. package/dist/components/ds-table/components/ds-table-cell/ds-table-cell.types.d.cts +1 -0
  156. package/dist/components/ds-table/components/ds-table-cell/ds-table-cell.types.d.cts.map +1 -1
  157. package/dist/components/ds-table/components/ds-table-cell/ds-table-cell.types.d.ts +1 -1
  158. package/dist/components/ds-table/ds-table.d.cts +2 -2
  159. package/dist/components/ds-table/ds-table.d.ts +2 -2
  160. package/dist/components/ds-table/filters/adapters/create-checkbox-filter-adapter.cjs +55 -0
  161. package/dist/components/ds-table/filters/adapters/create-checkbox-filter-adapter.d.cts +49 -0
  162. package/dist/components/ds-table/filters/adapters/create-checkbox-filter-adapter.d.cts.map +1 -0
  163. package/dist/components/ds-table/filters/adapters/create-checkbox-filter-adapter.d.ts +50 -0
  164. package/dist/components/ds-table/filters/adapters/create-checkbox-filter-adapter.d.ts.map +1 -0
  165. package/dist/components/ds-table/filters/adapters/create-checkbox-filter-adapter.js +55 -0
  166. package/dist/components/ds-table/filters/adapters/create-checkbox-filter-adapter.js.map +1 -0
  167. package/dist/components/ds-table/filters/adapters/create-dual-range-filter-adapter.cjs +87 -0
  168. package/dist/components/ds-table/filters/adapters/create-dual-range-filter-adapter.d.cts +44 -0
  169. package/dist/components/ds-table/filters/adapters/create-dual-range-filter-adapter.d.cts.map +1 -0
  170. package/dist/components/ds-table/filters/adapters/create-dual-range-filter-adapter.d.ts +44 -0
  171. package/dist/components/ds-table/filters/adapters/create-dual-range-filter-adapter.d.ts.map +1 -0
  172. package/dist/components/ds-table/filters/adapters/create-dual-range-filter-adapter.js +87 -0
  173. package/dist/components/ds-table/filters/adapters/create-dual-range-filter-adapter.js.map +1 -0
  174. package/dist/components/ds-table/filters/adapters/create-filter-adapter.cjs +83 -0
  175. package/dist/components/ds-table/filters/adapters/create-filter-adapter.d.cts +111 -0
  176. package/dist/components/ds-table/filters/adapters/create-filter-adapter.d.cts.map +1 -0
  177. package/dist/components/ds-table/filters/adapters/create-filter-adapter.d.ts +111 -0
  178. package/dist/components/ds-table/filters/adapters/create-filter-adapter.d.ts.map +1 -0
  179. package/dist/components/ds-table/filters/adapters/create-filter-adapter.js +83 -0
  180. package/dist/components/ds-table/filters/adapters/create-filter-adapter.js.map +1 -0
  181. package/dist/components/ds-table/filters/adapters/index.cjs +3 -0
  182. package/dist/components/ds-table/filters/adapters/index.d.ts +3 -0
  183. package/dist/components/ds-table/filters/adapters/index.js +3 -0
  184. package/dist/components/ds-table/filters/components/checkbox-filter/checkbox-filter.cjs +22 -0
  185. package/dist/components/ds-table/filters/components/checkbox-filter/checkbox-filter.d.cts +17 -0
  186. package/dist/components/ds-table/filters/components/checkbox-filter/checkbox-filter.d.cts.map +1 -0
  187. package/dist/components/ds-table/filters/components/checkbox-filter/checkbox-filter.d.ts +18 -0
  188. package/dist/components/ds-table/filters/components/checkbox-filter/checkbox-filter.d.ts.map +1 -0
  189. package/dist/components/ds-table/filters/components/checkbox-filter/checkbox-filter.js +22 -0
  190. package/dist/components/ds-table/filters/components/checkbox-filter/checkbox-filter.js.map +1 -0
  191. package/dist/components/ds-table/filters/components/checkbox-filter/index.cjs +1 -0
  192. package/dist/components/ds-table/filters/components/checkbox-filter/index.d.ts +1 -0
  193. package/dist/components/ds-table/filters/components/checkbox-filter/index.js +1 -0
  194. package/dist/components/ds-table/filters/components/range-filter/index.cjs +1 -0
  195. package/dist/components/ds-table/filters/components/range-filter/index.d.ts +1 -0
  196. package/dist/components/ds-table/filters/components/range-filter/index.js +1 -0
  197. package/dist/components/ds-table/filters/components/range-filter/range-filter.cjs +177 -0
  198. package/dist/components/ds-table/filters/components/range-filter/range-filter.d.cts +14 -0
  199. package/dist/components/ds-table/filters/components/range-filter/range-filter.d.cts.map +1 -0
  200. package/dist/components/ds-table/filters/components/range-filter/range-filter.d.ts +16 -0
  201. package/dist/components/ds-table/filters/components/range-filter/range-filter.d.ts.map +1 -0
  202. package/dist/components/ds-table/filters/components/range-filter/range-filter.js +177 -0
  203. package/dist/components/ds-table/filters/components/range-filter/range-filter.js.map +1 -0
  204. package/dist/components/ds-table/filters/components/range-filter/range-filter.module.cjs +11 -0
  205. package/dist/components/ds-table/filters/components/range-filter/range-filter.module.js +11 -0
  206. package/dist/components/ds-table/filters/components/range-filter/range-filter.module.js.map +1 -0
  207. package/dist/components/ds-table/filters/hooks/index.cjs +1 -0
  208. package/dist/components/ds-table/filters/hooks/index.d.ts +1 -0
  209. package/dist/components/ds-table/filters/hooks/index.js +1 -0
  210. package/dist/components/ds-table/filters/hooks/use-table-filters.cjs +211 -0
  211. package/dist/components/ds-table/filters/hooks/use-table-filters.d.cts +65 -0
  212. package/dist/components/ds-table/filters/hooks/use-table-filters.d.cts.map +1 -0
  213. package/dist/components/ds-table/filters/hooks/use-table-filters.d.ts +66 -0
  214. package/dist/components/ds-table/filters/hooks/use-table-filters.d.ts.map +1 -0
  215. package/dist/components/ds-table/filters/hooks/use-table-filters.js +211 -0
  216. package/dist/components/ds-table/filters/hooks/use-table-filters.js.map +1 -0
  217. package/dist/components/ds-table/filters/index.cjs +6 -0
  218. package/dist/components/ds-table/filters/index.d.ts +11 -0
  219. package/dist/components/ds-table/filters/index.js +6 -0
  220. package/dist/components/ds-table/filters/types/filter-adapter.types.d.cts +101 -0
  221. package/dist/components/ds-table/filters/types/filter-adapter.types.d.cts.map +1 -0
  222. package/dist/components/ds-table/filters/types/filter-adapter.types.d.ts +102 -0
  223. package/dist/components/ds-table/filters/types/filter-adapter.types.d.ts.map +1 -0
  224. package/dist/components/ds-table/index.cjs +5 -0
  225. package/dist/components/ds-table/index.d.ts +8 -0
  226. package/dist/components/ds-table/index.js +5 -0
  227. package/dist/components/ds-tag/ds-tag.cjs +254 -0
  228. package/dist/components/ds-tag/ds-tag.d.cts +25 -0
  229. package/dist/components/ds-tag/ds-tag.d.cts.map +1 -0
  230. package/dist/components/ds-tag/ds-tag.d.ts +25 -0
  231. package/dist/components/ds-tag/ds-tag.d.ts.map +1 -0
  232. package/dist/components/ds-tag/ds-tag.js +253 -0
  233. package/dist/components/ds-tag/ds-tag.js.map +1 -0
  234. package/dist/components/ds-tag/ds-tag.module.cjs +17 -0
  235. package/dist/components/ds-tag/ds-tag.module.js +17 -0
  236. package/dist/components/ds-tag/ds-tag.module.js.map +1 -0
  237. package/dist/components/ds-tag/ds-tag.types.d.cts +68 -0
  238. package/dist/components/ds-tag/ds-tag.types.d.cts.map +1 -0
  239. package/dist/components/ds-tag/ds-tag.types.d.ts +68 -0
  240. package/dist/components/ds-tag/ds-tag.types.d.ts.map +1 -0
  241. package/dist/components/ds-tag/index.cjs +1 -0
  242. package/dist/components/ds-tag/index.d.ts +2 -0
  243. package/dist/components/ds-tag/index.js +1 -0
  244. package/dist/components/ds-tag-filter/ds-tag-filter.cjs +325 -0
  245. package/dist/components/ds-tag-filter/ds-tag-filter.d.cts +24 -0
  246. package/dist/components/ds-tag-filter/ds-tag-filter.d.cts.map +1 -0
  247. package/dist/components/ds-tag-filter/ds-tag-filter.d.ts +24 -0
  248. package/dist/components/ds-tag-filter/ds-tag-filter.d.ts.map +1 -0
  249. package/dist/components/ds-tag-filter/ds-tag-filter.js +324 -0
  250. package/dist/components/ds-tag-filter/ds-tag-filter.js.map +1 -0
  251. package/dist/components/ds-tag-filter/ds-tag-filter.module.cjs +17 -0
  252. package/dist/components/ds-tag-filter/ds-tag-filter.module.js +17 -0
  253. package/dist/components/ds-tag-filter/ds-tag-filter.module.js.map +1 -0
  254. package/dist/components/ds-tag-filter/ds-tag-filter.types.d.cts +71 -0
  255. package/dist/components/ds-tag-filter/ds-tag-filter.types.d.cts.map +1 -0
  256. package/dist/components/ds-tag-filter/ds-tag-filter.types.d.ts +72 -0
  257. package/dist/components/ds-tag-filter/ds-tag-filter.types.d.ts.map +1 -0
  258. package/dist/components/ds-tag-filter/hooks/use-tag-overflow-calculation.cjs +137 -0
  259. package/dist/components/ds-tag-filter/hooks/use-tag-overflow-calculation.js +137 -0
  260. package/dist/components/ds-tag-filter/hooks/use-tag-overflow-calculation.js.map +1 -0
  261. package/dist/components/ds-tag-filter/index.cjs +1 -0
  262. package/dist/components/ds-tag-filter/index.d.ts +2 -0
  263. package/dist/components/ds-tag-filter/index.js +1 -0
  264. package/dist/components/ds-tag-filter/utils.cjs +54 -0
  265. package/dist/components/ds-tag-filter/utils.js +52 -0
  266. package/dist/components/ds-tag-filter/utils.js.map +1 -0
  267. package/dist/components/ds-text-input/ds-text-input.js +2 -2
  268. package/dist/components/ds-toggle/ds-toggle.cjs +192 -0
  269. package/dist/components/ds-toggle/ds-toggle.d.cts +24 -0
  270. package/dist/components/ds-toggle/ds-toggle.d.cts.map +1 -0
  271. package/dist/components/ds-toggle/ds-toggle.d.ts +24 -0
  272. package/dist/components/ds-toggle/ds-toggle.d.ts.map +1 -0
  273. package/dist/components/ds-toggle/ds-toggle.js +191 -0
  274. package/dist/components/ds-toggle/ds-toggle.js.map +1 -0
  275. package/dist/components/ds-toggle/ds-toggle.module.cjs +13 -0
  276. package/dist/components/ds-toggle/ds-toggle.module.js +13 -0
  277. package/dist/components/ds-toggle/ds-toggle.module.js.map +1 -0
  278. package/dist/components/ds-toggle/ds-toggle.types.d.cts +67 -0
  279. package/dist/components/ds-toggle/ds-toggle.types.d.cts.map +1 -0
  280. package/dist/components/ds-toggle/ds-toggle.types.d.ts +67 -0
  281. package/dist/components/ds-toggle/ds-toggle.types.d.ts.map +1 -0
  282. package/dist/components/ds-toggle/index.cjs +1 -0
  283. package/dist/components/ds-toggle/index.d.ts +2 -0
  284. package/dist/components/ds-toggle/index.js +1 -0
  285. package/dist/components/ds-vertical-tabs/ds-vertical-tabs.d.cts +5 -5
  286. package/dist/components/ds-vertical-tabs/ds-vertical-tabs.d.ts +5 -5
  287. package/dist/index.cjs +31 -2
  288. package/dist/index.d.cts +23 -2
  289. package/dist/index.d.ts +30 -2
  290. package/dist/index.js +21 -3
  291. package/dist/index.min.css +1 -1
  292. package/package.json +7 -2
  293. package/src/components/ds-avatar/_mixins.scss +45 -0
  294. package/src/components/ds-avatar/ds-avatar.module.scss +52 -0
  295. package/src/components/ds-avatar/ds-avatar.tsx +42 -0
  296. package/src/components/ds-avatar/ds-avatar.types.ts +41 -0
  297. package/src/components/ds-avatar/index.ts +2 -0
  298. package/src/components/ds-avatar-group/ds-avatar-group.module.scss +70 -0
  299. package/src/components/ds-avatar-group/ds-avatar-group.tsx +51 -0
  300. package/src/components/ds-avatar-group/ds-avatar-group.types.ts +27 -0
  301. package/src/components/ds-avatar-group/index.ts +2 -0
  302. package/src/components/ds-button/versions/ds-button-new/ds-button-new.module.scss +0 -1
  303. package/src/components/ds-chip/ds-chip.tsx +2 -1
  304. package/src/components/ds-chip/ds-chip.types.tsx +13 -0
  305. package/src/components/ds-chip/index.tsx +8 -0
  306. package/src/components/ds-chip-group/ds-chip-group.tsx +2 -2
  307. package/src/components/ds-chip-group/ds-chip-group.types.ts +8 -0
  308. package/src/components/ds-chip-group/index.ts +1 -0
  309. package/src/components/ds-date-input/ds-date-input.module.scss +246 -0
  310. package/src/components/ds-date-input/ds-date-input.tsx +309 -0
  311. package/src/components/ds-date-input/ds-date-input.types.tsx +104 -0
  312. package/src/components/ds-date-input/ds-date-input.utils.ts +242 -0
  313. package/src/components/ds-date-input/index.ts +2 -0
  314. package/src/components/ds-divider/ds-divider.module.scss +21 -0
  315. package/src/components/ds-divider/ds-divider.tsx +22 -0
  316. package/src/components/ds-divider/ds-divider.types.ts +21 -0
  317. package/src/components/ds-divider/index.ts +2 -0
  318. package/src/components/ds-dropdown-menu/ds-dropdown-menu.module.scss +11 -3
  319. package/src/components/ds-dropdown-menu/ds-dropdown-menu.tsx +17 -1
  320. package/src/components/ds-dropdown-menu/ds-dropdown-menu.types.tsx +5 -0
  321. package/src/components/ds-form-control/ds-form-control.tsx +2 -0
  322. package/src/components/ds-radio-group/ds-radio-group.types.tsx +1 -1
  323. package/src/components/ds-table/filters/hooks/index.ts +1 -0
  324. package/src/components/ds-table/index.ts +2 -0
  325. package/src/components/ds-tag/ds-tag.module.scss +112 -0
  326. package/src/components/ds-tag/ds-tag.tsx +124 -0
  327. package/src/components/ds-tag/ds-tag.types.tsx +67 -0
  328. package/src/components/ds-tag/index.tsx +2 -0
  329. package/src/components/ds-tag-filter/ds-tag-filter.module.scss +72 -0
  330. package/src/components/ds-tag-filter/ds-tag-filter.tsx +178 -0
  331. package/src/components/ds-tag-filter/ds-tag-filter.types.ts +68 -0
  332. package/src/components/ds-tag-filter/hooks/use-tag-overflow-calculation.ts +135 -0
  333. package/src/components/ds-tag-filter/index.ts +2 -0
  334. package/src/components/ds-tag-filter/utils.test.ts +401 -0
  335. package/src/components/ds-tag-filter/utils.ts +65 -0
  336. package/src/components/ds-toggle/ds-toggle.module.scss +154 -0
  337. package/src/components/ds-toggle/ds-toggle.tsx +78 -0
  338. package/src/components/ds-toggle/ds-toggle.types.tsx +76 -0
  339. package/src/components/ds-toggle/index.tsx +2 -0
  340. package/src/index.ts +7 -0
@@ -0,0 +1,242 @@
1
+ import { type DateValue } from '@ark-ui/react/date-picker';
2
+ import { CalendarDate, parseDate } from '@internationalized/date';
3
+
4
+ /**
5
+ * Validation result for date input
6
+ */
7
+ interface DateInputValidation {
8
+ isValid: boolean;
9
+ error?: string;
10
+ }
11
+
12
+ /**
13
+ * Parsed date range result
14
+ */
15
+ interface ParsedDateRange {
16
+ start: string | null;
17
+ end: string | null;
18
+ isValid: boolean;
19
+ }
20
+
21
+ /**
22
+ * Convert ISO date string to DateValue
23
+ */
24
+ export const isoStringToDateValue = (isoDate: string): DateValue | undefined => {
25
+ try {
26
+ return parseDate(isoDate) as unknown as DateValue;
27
+ } catch {
28
+ return undefined;
29
+ }
30
+ };
31
+
32
+ /**
33
+ * Convert string or tuple to DateValue array (for internal use with Ark UI)
34
+ */
35
+ export const stringToDateValue = (dates: string | [string, string]): DateValue[] => {
36
+ const dateArray = Array.isArray(dates) ? dates : [dates];
37
+
38
+ return dateArray.map(isoStringToDateValue).filter((d) => !!d);
39
+ };
40
+
41
+ /**
42
+ * Convert DateValue array to string or tuple (for public API)
43
+ */
44
+ export const dateValuesToStrings = (dates: DateValue[], range: boolean): string | [string, string] => {
45
+ const values = dates.map((date) => date.toString());
46
+
47
+ return range ? [values[0], values[1]] : values[0];
48
+ };
49
+
50
+ /**
51
+ * Format a DateValue to string (MM/DD/YYYY)
52
+ */
53
+ const formatDateValue = (date: DateValue): string => {
54
+ const paddedMonth = String(date.month).padStart(2, '0');
55
+ const paddedDay = String(date.day).padStart(2, '0');
56
+
57
+ return `${paddedMonth}/${paddedDay}/${String(date.year)}`;
58
+ };
59
+
60
+ /**
61
+ * Format an array of DateValues to a unified string
62
+ * Single: "12/25/2024"
63
+ * Range: "12/01/2024 - 12/31/2024"
64
+ */
65
+ export const formatDateInputValue = (value: DateValue[], range: boolean): string => {
66
+ if (value.length === 0) {
67
+ return '';
68
+ }
69
+ const newValue = value.map(formatDateValue);
70
+
71
+ return range ? newValue.join(' - ') : newValue[0];
72
+ };
73
+
74
+ /**
75
+ * Parse a date string (MM/DD/YYYY) to DateValue
76
+ */
77
+ const parseDateString = (dateStr: string): DateValue | null => {
78
+ if (!dateStr || !dateStr.trim()) {
79
+ return null;
80
+ }
81
+
82
+ // Try MM/DD/YYYY format
83
+ const match = dateStr.trim().match(/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/);
84
+ if (!match) {
85
+ return null;
86
+ }
87
+
88
+ const [, month, day, year] = match;
89
+ const monthNum = parseInt(month, 10);
90
+ const dayNum = parseInt(day, 10);
91
+ const yearNum = parseInt(year, 10);
92
+
93
+ // Use native Date for proper validation (handles leap years, month lengths, etc.)
94
+ // Note: Date months are 0-indexed, so subtract 1
95
+ const date = new Date(yearNum, monthNum - 1, dayNum);
96
+
97
+ // Check if the date is valid and matches what we parsed
98
+ // (e.g., 02/31/2024 would roll over to 03/02/2024, so we detect that)
99
+ if (date.getFullYear() !== yearNum || date.getMonth() !== monthNum - 1 || date.getDate() !== dayNum) {
100
+ return null;
101
+ }
102
+
103
+ return new CalendarDate(yearNum, monthNum, dayNum) as unknown as DateValue;
104
+ };
105
+
106
+ /**
107
+ * Parse a range input string (MM/DD/YYYY - MM/DD/YYYY)
108
+ */
109
+ const parseRangeInput = (text: string): ParsedDateRange => {
110
+ if (!text.trim()) {
111
+ return { start: null, end: null, isValid: true }; // Empty is valid
112
+ }
113
+
114
+ // Check if it contains a dash separator
115
+ if (!text.includes('-')) {
116
+ // Single date format, treat as incomplete range
117
+ const date = parseDateString(text.trim());
118
+ return {
119
+ start: date ? formatDateValue(date) : null,
120
+ end: null,
121
+ isValid: false, // Incomplete range
122
+ };
123
+ }
124
+
125
+ // Split by dash
126
+ const parts = text.split('-').map((p) => p.trim());
127
+ if (parts.length !== 2) {
128
+ return { start: null, end: null, isValid: false };
129
+ }
130
+
131
+ const [startStr, endStr] = parts;
132
+ const startDate = parseDateString(startStr);
133
+ const endDate = parseDateString(endStr);
134
+
135
+ // Both must be valid dates
136
+ if (!startDate || !endDate) {
137
+ return {
138
+ start: startDate ? formatDateValue(startDate) : null,
139
+ end: endDate ? formatDateValue(endDate) : null,
140
+ isValid: false,
141
+ };
142
+ }
143
+
144
+ return {
145
+ start: formatDateValue(startDate),
146
+ end: formatDateValue(endDate),
147
+ isValid: true,
148
+ };
149
+ };
150
+
151
+ /**
152
+ * Parse input text based on range flag
153
+ */
154
+ export const parseInputText = (text: string, range: boolean): DateValue[] => {
155
+ if (!range) {
156
+ const date = parseDateString(text);
157
+ return date ? [date] : [];
158
+ }
159
+
160
+ // Range mode
161
+ const parsed = parseRangeInput(text);
162
+ if (!parsed.isValid || !parsed.start || !parsed.end) {
163
+ return [];
164
+ }
165
+
166
+ const startDate = parseDateString(parsed.start);
167
+ const endDate = parseDateString(parsed.end);
168
+
169
+ if (!startDate || !endDate) {
170
+ return [];
171
+ }
172
+
173
+ return [startDate, endDate];
174
+ };
175
+
176
+ /**
177
+ * Validate date input
178
+ */
179
+ export const validateDateString = ({
180
+ text,
181
+ range,
182
+ min,
183
+ max,
184
+ }: {
185
+ text: string;
186
+ range: boolean;
187
+ min?: DateValue;
188
+ max?: DateValue;
189
+ }): DateInputValidation => {
190
+ if (!text.trim()) {
191
+ return { isValid: true }; // Empty is valid (let required validation handle it)
192
+ }
193
+
194
+ if (!range) {
195
+ const date = parseDateString(text);
196
+ if (!date) {
197
+ return { isValid: false, error: 'Invalid date format. Use MM/DD/YYYY' };
198
+ }
199
+
200
+ // Check min/max
201
+ if (min && date.compare(min) < 0) {
202
+ return { isValid: false, error: 'Date is before minimum allowed date' };
203
+ }
204
+ if (max && date.compare(max) > 0) {
205
+ return { isValid: false, error: 'Date is after maximum allowed date' };
206
+ }
207
+
208
+ return { isValid: true };
209
+ }
210
+
211
+ // Range mode validation
212
+ const parsed = parseRangeInput(text);
213
+ if (!parsed.isValid) {
214
+ return { isValid: false, error: 'Invalid date range format. Use MM/DD/YYYY - MM/DD/YYYY' };
215
+ }
216
+
217
+ if (!parsed.start || !parsed.end) {
218
+ return { isValid: false, error: 'Both start and end dates are required' };
219
+ }
220
+
221
+ const startDate = parseDateString(parsed.start);
222
+ const endDate = parseDateString(parsed.end);
223
+
224
+ if (!startDate || !endDate) {
225
+ return { isValid: false, error: 'Invalid date format. Use MM/DD/YYYY' };
226
+ }
227
+
228
+ // Validate start <= end
229
+ if (startDate.compare(endDate) > 0) {
230
+ return { isValid: false, error: 'Start date must be before or equal to end date' };
231
+ }
232
+
233
+ // Check min/max
234
+ if (min && startDate.compare(min) < 0) {
235
+ return { isValid: false, error: 'Start date is before minimum allowed date' };
236
+ }
237
+ if (max && endDate.compare(max) > 0) {
238
+ return { isValid: false, error: 'End date is after maximum allowed date' };
239
+ }
240
+
241
+ return { isValid: true };
242
+ };
@@ -0,0 +1,2 @@
1
+ export { default as DsDateInput } from './ds-date-input';
2
+ export type { DsDateInputProps } from './ds-date-input.types';
@@ -0,0 +1,21 @@
1
+ .divider {
2
+ display: block;
3
+
4
+ border: 0;
5
+ padding: 0;
6
+ color: transparent;
7
+
8
+ background-color: var(--color-border-secondary);
9
+ flex-shrink: 0;
10
+ }
11
+
12
+ .horizontal {
13
+ width: 100%;
14
+ height: 1px;
15
+ }
16
+
17
+ .vertical {
18
+ width: 1px;
19
+ height: auto;
20
+ align-self: stretch;
21
+ }
@@ -0,0 +1,22 @@
1
+ import type React from 'react';
2
+ import classNames from 'classnames';
3
+ import styles from './ds-divider.module.scss';
4
+ import { type DsDividerProps } from './ds-divider.types';
5
+
6
+ const DsDivider: React.FC<DsDividerProps> = ({ orientation = 'horizontal', component, style, className }) => {
7
+ const isVertical = orientation === 'vertical';
8
+ const Component = component ?? (isVertical ? 'div' : 'hr');
9
+
10
+ const classes = classNames(
11
+ styles.divider,
12
+ {
13
+ [styles.vertical]: isVertical,
14
+ [styles.horizontal]: !isVertical,
15
+ },
16
+ className,
17
+ );
18
+
19
+ return <Component role="separator" aria-orientation={orientation} className={classes} style={style} />;
20
+ };
21
+
22
+ export default DsDivider;
@@ -0,0 +1,21 @@
1
+ import type React from 'react';
2
+
3
+ export interface DsDividerProps {
4
+ /**
5
+ * Controls orientation of the divider. Horizontal by default.
6
+ */
7
+ orientation?: 'horizontal' | 'vertical';
8
+ /**
9
+ * Underlying element/component to render.
10
+ * Examples: "hr", "div", "span", Link, etc.
11
+ */
12
+ component?: React.ElementType;
13
+ /**
14
+ * Additional CSS styles.
15
+ */
16
+ style?: React.CSSProperties;
17
+ /**
18
+ * Additional CSS classes.
19
+ */
20
+ className?: string;
21
+ }
@@ -0,0 +1,2 @@
1
+ export { default as DsDivider } from './ds-divider';
2
+ export * from './ds-divider.types';
@@ -8,6 +8,7 @@
8
8
  max-height: var(--available-height, 400px);
9
9
  overflow-y: auto;
10
10
  width: auto;
11
+ z-index: var(--layer-index);
11
12
 
12
13
  &:focus-visible {
13
14
  outline-offset: 2px;
@@ -29,9 +30,12 @@
29
30
 
30
31
  .item {
31
32
  @include dropdown.dropdown-item;
32
- display: flex;
33
- align-items: center;
34
- gap: var(--spacing-xs);
33
+
34
+ .triggerItem {
35
+ display: flex;
36
+ align-items: center;
37
+ gap: var(--spacing-xs);
38
+ }
35
39
 
36
40
  &.selected {
37
41
  .indicator {
@@ -105,6 +109,10 @@
105
109
  }
106
110
  }
107
111
 
112
+ .triggerItemIcon {
113
+ margin-left: auto;
114
+ }
115
+
108
116
  /** Legacy classes */
109
117
  .contentLegacy {
110
118
  @include dropdown.dropdown-content;
@@ -21,6 +21,7 @@ import type {
21
21
  DsDropdownMenuPositioning,
22
22
  DsDropdownMenuRootProps,
23
23
  DsDropdownMenuSeparatorProps,
24
+ DsDropdownMenuTriggerItemProps,
24
25
  DsDropdownMenuTriggerProps,
25
26
  } from './ds-dropdown-menu.types';
26
27
 
@@ -195,7 +196,7 @@ const ItemGroup: React.FC<DsDropdownMenuItemGroupProps> = ({
195
196
 
196
197
  return (
197
198
  <GroupContext.Provider value={{ collapsed, toggle }}>
198
- <Menu.ItemGroup className={classNames(styles.group, className)} style={style}>
199
+ <Menu.ItemGroup className={className} style={style}>
199
200
  {children}
200
201
  </Menu.ItemGroup>
201
202
  </GroupContext.Provider>
@@ -264,6 +265,20 @@ const Separator: React.FC<DsDropdownMenuSeparatorProps> = ({ className, style })
264
265
  return <Menu.Separator className={classNames(styles.separator, className)} style={style} />;
265
266
  };
266
267
 
268
+ /**
269
+ * TriggerItem component - triggers a nested submenu
270
+ */
271
+ const TriggerItem: React.FC<DsDropdownMenuTriggerItemProps> = ({ className, style, children, ...props }) => {
272
+ return (
273
+ <Menu.TriggerItem className={styles.item} {...props}>
274
+ <div className={classNames(styles.triggerItem, className)} style={style}>
275
+ {children}
276
+ </div>
277
+ <DsIcon className={styles.triggerItemIcon} icon="keyboard_arrow_right" />
278
+ </Menu.TriggerItem>
279
+ );
280
+ };
281
+
267
282
  /**
268
283
  * DEPRECATED: Legacy DsDropdownMenu component with options array
269
284
  * Use compound component pattern instead
@@ -387,6 +402,7 @@ export const DsDropdownMenu = {
387
402
  Content,
388
403
  Item,
389
404
  ItemIndicator,
405
+ TriggerItem,
390
406
  Header,
391
407
  Actions,
392
408
  ItemGroup,
@@ -260,3 +260,8 @@ export interface DsDropdownMenuItemGroupContentProps {
260
260
  * Props for the DsDropdownMenu Separator component
261
261
  */
262
262
  export type DsDropdownMenuSeparatorProps = Menu.SeparatorProps;
263
+
264
+ /**
265
+ * Props for the DsDropdownMenu TriggerItem component (for nested submenus)
266
+ */
267
+ export type DsDropdownMenuTriggerItemProps = Menu.TriggerItemProps;
@@ -9,6 +9,7 @@ import { DsNumberInput } from '../ds-number-input';
9
9
  import { DsPasswordInput } from '../ds-password-input';
10
10
  import type { DsFormControlDescriptionProps, DsFormControlProps } from './ds-form-control.types';
11
11
  import styles from './ds-form-control.module.scss';
12
+ import { DsDateInput } from '../ds-date-input';
12
13
 
13
14
  const FormControlContext = createContext<{ controlId: string } | null>(null);
14
15
 
@@ -87,6 +88,7 @@ const DsFormControl = ({
87
88
  DsFormControl.TextInput = controlify(DsTextInput);
88
89
  DsFormControl.NumberInput = controlify(DsNumberInput);
89
90
  DsFormControl.PasswordInput = controlify(DsPasswordInput);
91
+ DsFormControl.DateInput = controlify(DsDateInput);
90
92
  DsFormControl.Textarea = controlify(DsTextarea);
91
93
  DsFormControl.Select = controlify(DsSelect);
92
94
  DsFormControl.Description = DsFormControlDescription;
@@ -7,7 +7,7 @@ import { type RadioGroupItemProps, type RadioGroupRootProps } from '@ark-ui/reac
7
7
  */
8
8
  export interface DsRadioGroupRootProps extends Pick<
9
9
  RadioGroupRootProps,
10
- 'value' | 'defaultValue' | 'disabled' | 'name' | 'className' | 'style' | 'orientation' | 'children'
10
+ 'id' | 'value' | 'defaultValue' | 'disabled' | 'name' | 'className' | 'style' | 'orientation' | 'children'
11
11
  > {
12
12
  /**
13
13
  * Event handler called when the selected value changes
@@ -1 +1,2 @@
1
+ export { useTableFilters } from './use-table-filters';
1
2
  export type { UseTableFiltersResult } from './use-table-filters';
@@ -1,4 +1,6 @@
1
1
  export type { SecondaryRowAction, RowAction } from './components/ds-table-cell';
2
2
 
3
+ export * from './filters';
4
+
3
5
  export { default as DsTable } from './ds-table';
4
6
  export * from './ds-table.types';
@@ -0,0 +1,112 @@
1
+ @use '../../styles/typography';
2
+
3
+ .tag {
4
+ --transition-duration: 200ms;
5
+
6
+ display: inline-flex;
7
+ outline: 2px solid transparent;
8
+ align-items: center;
9
+ border-radius: 4px;
10
+ cursor: default;
11
+ overflow: hidden;
12
+ position: relative;
13
+ padding: var(--spacing-3xs) var(--spacing-xs);
14
+ background: var(--color-background);
15
+ border: 1px solid var(--color-border-contrast);
16
+ transition-property:
17
+ background, border-color, width, max-width, color, fill, stroke, opacity, transform, outline-color,
18
+ opacity, visibility;
19
+ transition-timing-function: ease-out;
20
+ transition-duration: var(--transition-duration);
21
+
22
+ &.clickable {
23
+ cursor: pointer;
24
+
25
+ &:hover {
26
+ background: var(--color-background-secondary);
27
+ border-color: var(--color-border-action-secondary-hover);
28
+ }
29
+
30
+ &:focus-visible {
31
+ outline-color: var(--color-border-action-secondary);
32
+ }
33
+ }
34
+
35
+ &.selected {
36
+ background: var(--color-background-selected-weak) !important;
37
+ border-color: var(--color-border-action-primary) !important;
38
+
39
+ &:focus-visible {
40
+ outline-color: var(--color-border-action-primary);
41
+ }
42
+
43
+ .deleteButton {
44
+ outline-color: var(--color-border-action-primary);
45
+ }
46
+ }
47
+
48
+ &.include {
49
+ .variantIcon {
50
+ color: var(--color-icon-secondary);
51
+ }
52
+ }
53
+
54
+ &.exclude {
55
+ .variantIcon {
56
+ color: var(--color-icon-danger);
57
+ }
58
+ }
59
+
60
+ &.disabled {
61
+ cursor: not-allowed;
62
+ color: var(--color-font-disabled);
63
+ background: var(--color-background);
64
+ border-color: var(--color-border-contrast);
65
+
66
+ .label {
67
+ color: var(--color-font-disabled);
68
+ }
69
+
70
+ .variantIcon {
71
+ color: var(--color-font-disabled);
72
+ }
73
+ }
74
+
75
+ .deleteButton {
76
+ opacity: 0;
77
+ visibility: hidden;
78
+ max-width: 0;
79
+ display: flex;
80
+ outline-color: var(--color-border-action-secondary);
81
+ user-select: none;
82
+ transition-property:
83
+ background, border-color, width, max-width, color, fill, stroke, opacity, transform, outline-color,
84
+ visibility, margin-left;
85
+ transition-timing-function: ease-out;
86
+ transition-duration: var(--transition-duration);
87
+ color: var(--color-icon-secondary);
88
+
89
+ &:hover {
90
+ background: var(--color-background-action-secondary-hover);
91
+ }
92
+ }
93
+
94
+ &:hover:not(.disabled) .deleteButton,
95
+ &:focus-within:not(.disabled) .deleteButton,
96
+ &.selected:not(.disabled) .deleteButton {
97
+ opacity: 1;
98
+ visibility: visible;
99
+ max-width: 50px;
100
+ margin-left: var(--spacing-3xs);
101
+ }
102
+ }
103
+
104
+ .label {
105
+ @include typography.ellipsis;
106
+ }
107
+
108
+ .icon {
109
+ flex-shrink: 0;
110
+ display: flex;
111
+ margin-right: var(--spacing-3xs);
112
+ }
@@ -0,0 +1,124 @@
1
+ import { type KeyboardEvent, type MouseEvent, type Ref } from 'react';
2
+ import classNames from 'classnames';
3
+ import styles from './ds-tag.module.scss';
4
+ import type { DsTagProps } from './ds-tag.types';
5
+ import { DsIcon } from '../ds-icon';
6
+ import { DsTypography } from '../ds-typography';
7
+
8
+ /**
9
+ * Design system Tag component
10
+ */
11
+ const DsTag = ({
12
+ ref,
13
+ label,
14
+ className,
15
+ style = {},
16
+ size = 'medium',
17
+ selected = false,
18
+ variant = 'default',
19
+ disabled = false,
20
+ locale = {},
21
+ onClick,
22
+ onDelete,
23
+ slots,
24
+ ...rest
25
+ }: DsTagProps) => {
26
+ const tagClass = classNames(
27
+ styles.tag,
28
+ {
29
+ [styles.clickable]: onClick !== undefined && !disabled,
30
+ [styles.selected]: selected && !disabled,
31
+ [styles.include]: variant === 'include',
32
+ [styles.exclude]: variant === 'exclude',
33
+ [styles.disabled]: disabled,
34
+ },
35
+ className,
36
+ );
37
+
38
+ const handleDeleteClick = (event: MouseEvent<HTMLElement>) => {
39
+ event.stopPropagation();
40
+ onDelete?.(event);
41
+ };
42
+
43
+ const handleKeyDownTag = (event: KeyboardEvent<HTMLElement>) => {
44
+ if (onClick && (event.key === 'Enter' || event.key === ' ')) {
45
+ event.preventDefault();
46
+ onClick(event as KeyboardEvent<HTMLDivElement>);
47
+
48
+ return;
49
+ }
50
+
51
+ if (onDelete && (event.key === 'Backspace' || event.key === 'Delete')) {
52
+ event.preventDefault();
53
+ onDelete(event);
54
+ }
55
+ };
56
+
57
+ const handleKeyDownDelete = (event: KeyboardEvent<HTMLElement>) => {
58
+ event.stopPropagation();
59
+
60
+ if (onDelete && (event.key === 'Enter' || event.key === ' ')) {
61
+ event.preventDefault();
62
+ onDelete(event);
63
+ }
64
+ };
65
+
66
+ const handleClick = (event: MouseEvent<HTMLElement>) => {
67
+ if (onClick) {
68
+ event.preventDefault();
69
+ onClick(event as MouseEvent<HTMLDivElement>);
70
+ }
71
+ };
72
+
73
+ let iconVariant: 'do_not_disturb_on' | 'check_circle' | null = null;
74
+
75
+ if (variant === 'include') {
76
+ iconVariant = 'check_circle';
77
+ }
78
+
79
+ if (variant === 'exclude') {
80
+ iconVariant = 'do_not_disturb_on';
81
+ }
82
+
83
+ return (
84
+ <div
85
+ ref={ref as Ref<HTMLDivElement>}
86
+ className={tagClass}
87
+ style={style}
88
+ onClick={disabled ? undefined : handleClick}
89
+ onKeyDown={disabled ? undefined : handleKeyDownTag}
90
+ role={onClick || onDelete ? 'button' : undefined}
91
+ tabIndex={disabled || (!onClick && !onDelete) ? undefined : 0}
92
+ aria-label={typeof label === 'string' ? label : undefined}
93
+ aria-pressed={onClick && selected && !disabled ? 'true' : undefined}
94
+ aria-disabled={disabled}
95
+ {...rest}
96
+ >
97
+ {(slots?.icon || iconVariant) && (
98
+ <span className={classNames(styles.icon)}>
99
+ {slots?.icon ??
100
+ (iconVariant && (
101
+ <DsIcon icon={iconVariant} size="tiny" className={classNames(styles.variantIcon)} />
102
+ ))}
103
+ </span>
104
+ )}
105
+ <DsTypography variant={size === 'small' ? 'body-xs-reg' : 'body-sm-reg'} className={styles.label}>
106
+ {label}
107
+ </DsTypography>
108
+ {onDelete && !disabled && (
109
+ <button
110
+ type="button"
111
+ className={styles.deleteButton}
112
+ onClick={handleDeleteClick}
113
+ onKeyDown={handleKeyDownDelete}
114
+ aria-label={locale.deleteAriaLabel ?? 'Delete tag'}
115
+ tabIndex={0}
116
+ >
117
+ <DsIcon icon="close" size="tiny" />
118
+ </button>
119
+ )}
120
+ </div>
121
+ );
122
+ };
123
+
124
+ export default DsTag;