@drivenets/design-system 0.1.0 → 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 (170) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/components/ds-avatar/ds-avatar.cjs +98 -0
  3. package/dist/components/ds-avatar/ds-avatar.d.cts +12 -0
  4. package/dist/components/ds-avatar/ds-avatar.d.cts.map +1 -0
  5. package/dist/components/ds-avatar/ds-avatar.d.ts +12 -0
  6. package/dist/components/ds-avatar/ds-avatar.d.ts.map +1 -0
  7. package/dist/components/ds-avatar/ds-avatar.js +97 -0
  8. package/dist/components/ds-avatar/ds-avatar.js.map +1 -0
  9. package/dist/components/ds-avatar/ds-avatar.module.cjs +17 -0
  10. package/dist/components/ds-avatar/ds-avatar.module.js +17 -0
  11. package/dist/components/ds-avatar/ds-avatar.module.js.map +1 -0
  12. package/dist/components/ds-avatar/ds-avatar.types.d.cts +44 -0
  13. package/dist/components/ds-avatar/ds-avatar.types.d.cts.map +1 -0
  14. package/dist/components/ds-avatar/ds-avatar.types.d.ts +44 -0
  15. package/dist/components/ds-avatar/ds-avatar.types.d.ts.map +1 -0
  16. package/dist/components/ds-avatar/index.cjs +1 -0
  17. package/dist/components/ds-avatar/index.d.ts +2 -0
  18. package/dist/components/ds-avatar/index.js +1 -0
  19. package/dist/components/ds-avatar-group/ds-avatar-group.cjs +93 -0
  20. package/dist/components/ds-avatar-group/ds-avatar-group.d.cts +12 -0
  21. package/dist/components/ds-avatar-group/ds-avatar-group.d.cts.map +1 -0
  22. package/dist/components/ds-avatar-group/ds-avatar-group.d.ts +12 -0
  23. package/dist/components/ds-avatar-group/ds-avatar-group.d.ts.map +1 -0
  24. package/dist/components/ds-avatar-group/ds-avatar-group.js +92 -0
  25. package/dist/components/ds-avatar-group/ds-avatar-group.js.map +1 -0
  26. package/dist/components/ds-avatar-group/ds-avatar-group.module.cjs +19 -0
  27. package/dist/components/ds-avatar-group/ds-avatar-group.module.js +19 -0
  28. package/dist/components/ds-avatar-group/ds-avatar-group.module.js.map +1 -0
  29. package/dist/components/ds-avatar-group/ds-avatar-group.types.d.cts +31 -0
  30. package/dist/components/ds-avatar-group/ds-avatar-group.types.d.cts.map +1 -0
  31. package/dist/components/ds-avatar-group/ds-avatar-group.types.d.ts +32 -0
  32. package/dist/components/ds-avatar-group/ds-avatar-group.types.d.ts.map +1 -0
  33. package/dist/components/ds-avatar-group/index.cjs +1 -0
  34. package/dist/components/ds-avatar-group/index.d.ts +2 -0
  35. package/dist/components/ds-avatar-group/index.js +1 -0
  36. package/dist/components/ds-button/ds-button.d.ts +2 -2
  37. package/dist/components/ds-button/ds-button.d.ts.map +1 -1
  38. package/dist/components/ds-chip/ds-chip.cjs +2 -1
  39. package/dist/components/ds-chip/ds-chip.d.cts +2 -1
  40. package/dist/components/ds-chip/ds-chip.d.cts.map +1 -1
  41. package/dist/components/ds-chip/ds-chip.d.ts +2 -1
  42. package/dist/components/ds-chip/ds-chip.d.ts.map +1 -1
  43. package/dist/components/ds-chip/ds-chip.js +2 -1
  44. package/dist/components/ds-chip/ds-chip.js.map +1 -1
  45. package/dist/components/ds-chip/ds-chip.types.d.cts +13 -0
  46. package/dist/components/ds-chip/ds-chip.types.d.cts.map +1 -1
  47. package/dist/components/ds-chip/ds-chip.types.d.ts +13 -0
  48. package/dist/components/ds-chip/ds-chip.types.d.ts.map +1 -1
  49. package/dist/components/ds-chip-group/ds-chip-group.cjs +2 -2
  50. package/dist/components/ds-chip-group/ds-chip-group.d.cts +2 -2
  51. package/dist/components/ds-chip-group/ds-chip-group.d.ts +2 -2
  52. package/dist/components/ds-chip-group/ds-chip-group.js +2 -2
  53. package/dist/components/ds-chip-group/ds-chip-group.js.map +1 -1
  54. package/dist/components/ds-chip-group/ds-chip-group.types.d.cts +9 -0
  55. package/dist/components/ds-chip-group/ds-chip-group.types.d.cts.map +1 -1
  56. package/dist/components/ds-chip-group/ds-chip-group.types.d.ts +9 -0
  57. package/dist/components/ds-chip-group/ds-chip-group.types.d.ts.map +1 -1
  58. package/dist/components/ds-confirmation/ds-confirmation.d.cts +8 -8
  59. package/dist/components/ds-confirmation/ds-confirmation.d.ts +8 -8
  60. package/dist/components/ds-date-input/ds-date-input.d.cts +2 -2
  61. package/dist/components/ds-date-input/ds-date-input.d.cts.map +1 -1
  62. package/dist/components/ds-date-input/ds-date-input.d.ts +2 -2
  63. package/dist/components/ds-date-input/ds-date-input.js +2 -2
  64. package/dist/components/ds-date-input/ds-date-input.js.map +1 -1
  65. package/dist/components/ds-drawer/ds-drawer.d.cts +9 -9
  66. package/dist/components/ds-drawer/ds-drawer.d.ts +9 -9
  67. package/dist/components/ds-drawer/ds-drawer.js +2 -2
  68. package/dist/components/ds-dropdown-menu/ds-dropdown-menu.js +3 -3
  69. package/dist/components/ds-dropdown-menu/ds-dropdown-menu.js.map +1 -1
  70. package/dist/components/ds-expandable-text-input/ds-expandable-text-input.d.cts +2 -2
  71. package/dist/components/ds-expandable-text-input/ds-expandable-text-input.d.ts +2 -2
  72. package/dist/components/ds-file-upload/components/file-upload-item/file-upload-item.cjs +2 -2
  73. package/dist/components/ds-file-upload/components/file-upload-item/file-upload-item.js +2 -2
  74. package/dist/components/ds-form-control/ds-form-control.d.cts +8 -8
  75. package/dist/components/ds-modal/ds-modal.d.cts +8 -8
  76. package/dist/components/ds-panel/ds-panel.d.cts +2 -2
  77. package/dist/components/ds-panel/ds-panel.d.ts +2 -2
  78. package/dist/components/ds-select/ds-select.d.cts +2 -2
  79. package/dist/components/ds-select/ds-select.d.ts +2 -2
  80. package/dist/components/ds-smart-tabs/ds-smart-tabs.d.cts +2 -2
  81. package/dist/components/ds-smart-tabs/ds-smart-tabs.d.ts +2 -2
  82. package/dist/components/ds-smart-tabs/ds-smart-tabs.d.ts.map +1 -1
  83. package/dist/components/ds-stepper/components/ds-step-content.d.cts +2 -2
  84. package/dist/components/ds-stepper/components/ds-step-content.d.ts +2 -2
  85. package/dist/components/ds-stepper/components/ds-step-next-button.d.cts +2 -2
  86. package/dist/components/ds-stepper/components/ds-step-next-button.d.ts +2 -2
  87. package/dist/components/ds-stepper/components/ds-step.d.cts +2 -2
  88. package/dist/components/ds-stepper/components/ds-step.d.ts +2 -2
  89. package/dist/components/ds-stepper/ds-stepper.d.cts +2 -2
  90. package/dist/components/ds-stepper/ds-stepper.d.ts +2 -2
  91. package/dist/components/ds-table/ds-table.d.cts +2 -2
  92. package/dist/components/ds-table/ds-table.d.ts +2 -2
  93. package/dist/components/ds-tag/ds-tag.cjs +254 -0
  94. package/dist/components/ds-tag/ds-tag.d.cts +25 -0
  95. package/dist/components/ds-tag/ds-tag.d.cts.map +1 -0
  96. package/dist/components/ds-tag/ds-tag.d.ts +25 -0
  97. package/dist/components/ds-tag/ds-tag.d.ts.map +1 -0
  98. package/dist/components/ds-tag/ds-tag.js +253 -0
  99. package/dist/components/ds-tag/ds-tag.js.map +1 -0
  100. package/dist/components/ds-tag/ds-tag.module.cjs +17 -0
  101. package/dist/components/ds-tag/ds-tag.module.js +17 -0
  102. package/dist/components/ds-tag/ds-tag.module.js.map +1 -0
  103. package/dist/components/ds-tag/ds-tag.types.d.cts +68 -0
  104. package/dist/components/ds-tag/ds-tag.types.d.cts.map +1 -0
  105. package/dist/components/ds-tag/ds-tag.types.d.ts +68 -0
  106. package/dist/components/ds-tag/ds-tag.types.d.ts.map +1 -0
  107. package/dist/components/ds-tag/index.cjs +1 -0
  108. package/dist/components/ds-tag/index.d.ts +2 -0
  109. package/dist/components/ds-tag/index.js +1 -0
  110. package/dist/components/ds-tag-filter/ds-tag-filter.cjs +325 -0
  111. package/dist/components/ds-tag-filter/ds-tag-filter.d.cts +24 -0
  112. package/dist/components/ds-tag-filter/ds-tag-filter.d.cts.map +1 -0
  113. package/dist/components/ds-tag-filter/ds-tag-filter.d.ts +24 -0
  114. package/dist/components/ds-tag-filter/ds-tag-filter.d.ts.map +1 -0
  115. package/dist/components/ds-tag-filter/ds-tag-filter.js +324 -0
  116. package/dist/components/ds-tag-filter/ds-tag-filter.js.map +1 -0
  117. package/dist/components/ds-tag-filter/ds-tag-filter.module.cjs +17 -0
  118. package/dist/components/ds-tag-filter/ds-tag-filter.module.js +17 -0
  119. package/dist/components/ds-tag-filter/ds-tag-filter.module.js.map +1 -0
  120. package/dist/components/ds-tag-filter/ds-tag-filter.types.d.cts +71 -0
  121. package/dist/components/ds-tag-filter/ds-tag-filter.types.d.cts.map +1 -0
  122. package/dist/components/ds-tag-filter/ds-tag-filter.types.d.ts +72 -0
  123. package/dist/components/ds-tag-filter/ds-tag-filter.types.d.ts.map +1 -0
  124. package/dist/components/ds-tag-filter/hooks/use-tag-overflow-calculation.cjs +137 -0
  125. package/dist/components/ds-tag-filter/hooks/use-tag-overflow-calculation.js +137 -0
  126. package/dist/components/ds-tag-filter/hooks/use-tag-overflow-calculation.js.map +1 -0
  127. package/dist/components/ds-tag-filter/index.cjs +1 -0
  128. package/dist/components/ds-tag-filter/index.d.ts +2 -0
  129. package/dist/components/ds-tag-filter/index.js +1 -0
  130. package/dist/components/ds-tag-filter/utils.cjs +54 -0
  131. package/dist/components/ds-tag-filter/utils.js +52 -0
  132. package/dist/components/ds-tag-filter/utils.js.map +1 -0
  133. package/dist/components/ds-text-input/ds-text-input.js +2 -2
  134. package/dist/components/ds-toggle/ds-toggle.d.cts +2 -2
  135. package/dist/components/ds-toggle/ds-toggle.d.ts +2 -2
  136. package/dist/components/ds-vertical-tabs/ds-vertical-tabs.d.cts +5 -5
  137. package/dist/components/ds-vertical-tabs/ds-vertical-tabs.d.ts +5 -5
  138. package/dist/index.cjs +14 -2
  139. package/dist/index.d.cts +9 -1
  140. package/dist/index.d.ts +13 -1
  141. package/dist/index.js +11 -3
  142. package/dist/index.min.css +1 -1
  143. package/package.json +6 -2
  144. package/src/components/ds-avatar/_mixins.scss +45 -0
  145. package/src/components/ds-avatar/ds-avatar.module.scss +52 -0
  146. package/src/components/ds-avatar/ds-avatar.tsx +42 -0
  147. package/src/components/ds-avatar/ds-avatar.types.ts +41 -0
  148. package/src/components/ds-avatar/index.ts +2 -0
  149. package/src/components/ds-avatar-group/ds-avatar-group.module.scss +70 -0
  150. package/src/components/ds-avatar-group/ds-avatar-group.tsx +51 -0
  151. package/src/components/ds-avatar-group/ds-avatar-group.types.ts +27 -0
  152. package/src/components/ds-avatar-group/index.ts +2 -0
  153. package/src/components/ds-chip/ds-chip.tsx +2 -1
  154. package/src/components/ds-chip/ds-chip.types.tsx +13 -0
  155. package/src/components/ds-chip/index.tsx +8 -0
  156. package/src/components/ds-chip-group/ds-chip-group.tsx +2 -2
  157. package/src/components/ds-chip-group/ds-chip-group.types.ts +8 -0
  158. package/src/components/ds-chip-group/index.ts +1 -0
  159. package/src/components/ds-tag/ds-tag.module.scss +112 -0
  160. package/src/components/ds-tag/ds-tag.tsx +124 -0
  161. package/src/components/ds-tag/ds-tag.types.tsx +67 -0
  162. package/src/components/ds-tag/index.tsx +2 -0
  163. package/src/components/ds-tag-filter/ds-tag-filter.module.scss +72 -0
  164. package/src/components/ds-tag-filter/ds-tag-filter.tsx +178 -0
  165. package/src/components/ds-tag-filter/ds-tag-filter.types.ts +68 -0
  166. package/src/components/ds-tag-filter/hooks/use-tag-overflow-calculation.ts +135 -0
  167. package/src/components/ds-tag-filter/index.ts +2 -0
  168. package/src/components/ds-tag-filter/utils.test.ts +401 -0
  169. package/src/components/ds-tag-filter/utils.ts +65 -0
  170. package/src/index.ts +4 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@drivenets/design-system",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.cts",
@@ -58,7 +58,8 @@
58
58
  },
59
59
  "peerDependencies": {
60
60
  "@internationalized/date": "^3.0.0",
61
- "react": "^19"
61
+ "react": "^19",
62
+ "react-dom": "^19"
62
63
  },
63
64
  "devDependencies": {
64
65
  "@arethetypeswrong/cli": "^0.18.2",
@@ -75,6 +76,7 @@
75
76
  "@tanstack/react-router": "^1.141.2",
76
77
  "@types/eslint-plugin-jsx-a11y": "^6.10.1",
77
78
  "@types/react": "^19.2.7",
79
+ "@types/react-dom": "^19.2.3",
78
80
  "@vitest/browser": "^4.0.16",
79
81
  "@vitest/browser-playwright": "^4.0.15",
80
82
  "babel-plugin-react-compiler": "^1.0.0",
@@ -83,11 +85,13 @@
83
85
  "eslint-plugin-react": "^7.37.5",
84
86
  "eslint-plugin-react-hooks": "^7.0.1",
85
87
  "eslint-plugin-storybook": "^10.1.9",
88
+ "jsdom": "^25.0.1",
86
89
  "playwright": "^1.57.0",
87
90
  "postcss": "^8.5.6",
88
91
  "postcss-modules": "^6.0.1",
89
92
  "publint": "^0.3.16",
90
93
  "react": "^19.2.3",
94
+ "react-dom": "^19.2.3",
91
95
  "react-hook-form": "^7.55.0",
92
96
  "rollup-plugin-sass": "^1.15.3",
93
97
  "sass-embedded": "^1.97.0",
@@ -0,0 +1,45 @@
1
+ $avatar-size-xsm: 18px;
2
+ $avatar-size-sm: 24px;
3
+ $avatar-size-regular: 32px;
4
+ $avatar-size-md: 48px;
5
+ $avatar-size-lg: 80px;
6
+ $avatar-size-xl: 144px;
7
+
8
+ $avatar-border-width: var(--spacing-4xs);
9
+ $avatar-border-radius-small: var(--spacing-3xs);
10
+ $avatar-border-radius-large: var(--spacing-xs);
11
+ $avatar-overlap-xsm: -4px;
12
+ $avatar-overlap-sm: -6px;
13
+ $avatar-overlap-default: -8px;
14
+
15
+ @mixin avatar-size($size, $font-size) {
16
+ width: $size;
17
+ height: $size;
18
+ font-size: $font-size;
19
+ }
20
+
21
+ @mixin avatar-sizes {
22
+ &.xsm {
23
+ @include avatar-size($avatar-size-xsm, 8px);
24
+ }
25
+
26
+ &.sm {
27
+ @include avatar-size($avatar-size-sm, 10px);
28
+ }
29
+
30
+ &.regular {
31
+ @include avatar-size($avatar-size-regular, var(--font-size-xs));
32
+ }
33
+
34
+ &.md {
35
+ @include avatar-size($avatar-size-md, var(--font-size-md));
36
+ }
37
+
38
+ &.lg {
39
+ @include avatar-size($avatar-size-lg, var(--font-size-2xl));
40
+ }
41
+
42
+ &.xl {
43
+ @include avatar-size($avatar-size-xl, var(--font-size-3xl));
44
+ }
45
+ }
@@ -0,0 +1,52 @@
1
+ @import './mixins';
2
+
3
+ .avatar {
4
+ display: inline-flex;
5
+ align-items: center;
6
+ justify-content: center;
7
+ position: relative;
8
+ overflow: hidden;
9
+ background-color: var(--color-background-deselected);
10
+ color: var(--color-font-on-action);
11
+ flex-shrink: 0;
12
+ user-select: none;
13
+
14
+ &.circle {
15
+ border-radius: 50%;
16
+ }
17
+
18
+ &.rounded {
19
+ &.xsm,
20
+ &.sm {
21
+ border-radius: $avatar-border-radius-small;
22
+ }
23
+ &.regular,
24
+ &.md,
25
+ &.lg,
26
+ &.xl {
27
+ border-radius: $avatar-border-radius-large;
28
+ }
29
+ }
30
+
31
+ @include avatar-sizes;
32
+
33
+ img {
34
+ position: absolute;
35
+ top: 0;
36
+ left: 0;
37
+ width: 100%;
38
+ height: 100%;
39
+ object-fit: cover;
40
+ display: block;
41
+ }
42
+
43
+ .fallback {
44
+ display: flex;
45
+ align-items: center;
46
+ justify-content: center;
47
+ width: 100%;
48
+ height: 100%;
49
+ font-weight: var(--font-weight-medium);
50
+ text-transform: uppercase;
51
+ }
52
+ }
@@ -0,0 +1,42 @@
1
+ import type { FC } from 'react';
2
+ import { Avatar } from '@ark-ui/react/avatar';
3
+ import classNames from 'classnames';
4
+ import styles from './ds-avatar.module.scss';
5
+ import type { DsAvatarProps } from './ds-avatar.types';
6
+ import { DsTooltip } from '../ds-tooltip';
7
+
8
+ /**
9
+ * DsAvatar component for displaying user profile pictures or initials
10
+ */
11
+ export const DsAvatar: FC<DsAvatarProps> = ({
12
+ src,
13
+ alt,
14
+ name,
15
+ size = 'regular',
16
+ type = 'circle',
17
+ className,
18
+ style,
19
+ onStatusChange,
20
+ }) => {
21
+ const getInitials = (name: string) =>
22
+ name
23
+ .trim()
24
+ .split(' ')
25
+ .map((w) => w[0])
26
+ .join('');
27
+
28
+ return (
29
+ <DsTooltip content={name}>
30
+ {
31
+ <Avatar.Root
32
+ onStatusChange={(details) => onStatusChange?.(details.status)}
33
+ className={classNames(styles.avatar, styles[size], styles[type], className)}
34
+ style={style}
35
+ >
36
+ <Avatar.Fallback className={styles.fallback}>{getInitials(name)}</Avatar.Fallback>
37
+ {src && <Avatar.Image src={src} alt={alt || name} />}
38
+ </Avatar.Root>
39
+ }
40
+ </DsTooltip>
41
+ );
42
+ };
@@ -0,0 +1,41 @@
1
+ import type { CSSProperties } from 'react';
2
+
3
+ export type DsAvatarSize = 'xsm' | 'sm' | 'regular' | 'md' | 'lg' | 'xl';
4
+ export type DsAvatarType = 'circle' | 'rounded';
5
+
6
+ export interface DsAvatarProps {
7
+ /**
8
+ * Image source URL
9
+ */
10
+ src?: string;
11
+ /**
12
+ * Alt text for the image
13
+ */
14
+ alt?: string;
15
+ /**
16
+ * Name to display in tooltip and as initials if image fails
17
+ */
18
+ name: string;
19
+ /**
20
+ * Size of the avatar
21
+ * @default 'regular'
22
+ */
23
+ size?: DsAvatarSize;
24
+ /**
25
+ * Shape of the avatar
26
+ * @default 'circle'
27
+ */
28
+ type?: DsAvatarType;
29
+ /**
30
+ * Custom class name
31
+ */
32
+ className?: string;
33
+ /**
34
+ * Custom inline styles
35
+ */
36
+ style?: CSSProperties;
37
+ /**
38
+ * Callback when the status of the image changes
39
+ */
40
+ onStatusChange?: (status: 'error' | 'loaded') => void;
41
+ }
@@ -0,0 +1,2 @@
1
+ export * from './ds-avatar';
2
+ export * from './ds-avatar.types';
@@ -0,0 +1,70 @@
1
+ @import '../ds-avatar/mixins';
2
+
3
+ .avatarGroup {
4
+ display: flex;
5
+ align-items: center;
6
+
7
+ .avatarItem {
8
+ border: $avatar-border-width solid var(--color-background);
9
+
10
+ &:not(:first-child) {
11
+ margin-left: $avatar-overlap-default;
12
+ }
13
+
14
+ &.xsm:not(:first-child) {
15
+ margin-left: $avatar-overlap-xsm;
16
+ }
17
+
18
+ &.sm:not(:first-child) {
19
+ margin-left: $avatar-overlap-sm;
20
+ }
21
+ }
22
+
23
+ .moreAvatar {
24
+ display: flex;
25
+ align-items: center;
26
+ justify-content: center;
27
+ background-color: var(--color-background);
28
+ color: var(--color-font-action);
29
+ border: $avatar-border-width solid var(--color-background);
30
+ margin-left: $avatar-overlap-default;
31
+ font-weight: var(--font-weight-medium);
32
+ z-index: 1;
33
+ cursor: default;
34
+ flex-shrink: 0;
35
+
36
+ &.circle {
37
+ border-radius: 50%;
38
+ }
39
+
40
+ &.rounded {
41
+ &.xsm,
42
+ &.sm {
43
+ border-radius: $avatar-border-radius-small;
44
+ }
45
+ &.regular,
46
+ &.md,
47
+ &.lg,
48
+ &.xl {
49
+ border-radius: $avatar-border-radius-large;
50
+ }
51
+ }
52
+
53
+ @include avatar-sizes;
54
+
55
+ &.xsm {
56
+ margin-left: $avatar-overlap-xsm;
57
+ }
58
+
59
+ &.sm {
60
+ margin-left: $avatar-overlap-sm;
61
+ }
62
+ }
63
+
64
+ .tooltipList {
65
+ display: flex;
66
+ flex-direction: column;
67
+ gap: var(--spacing-3xs);
68
+ padding: var(--spacing-3xs) 0;
69
+ }
70
+ }
@@ -0,0 +1,51 @@
1
+ import type { FC } from 'react';
2
+ import classNames from 'classnames';
3
+ import styles from './ds-avatar-group.module.scss';
4
+ import type { DsAvatarGroupProps } from './ds-avatar-group.types';
5
+ import { DsAvatar } from '../ds-avatar';
6
+ import { DsTooltip } from '../ds-tooltip';
7
+ import { DsTypography } from '../ds-typography';
8
+
9
+ /**
10
+ * DsAvatarGroup component for displaying a list of avatars with overlap
11
+ */
12
+ export const DsAvatarGroup: FC<DsAvatarGroupProps> = ({
13
+ avatars,
14
+ size = 'regular',
15
+ type = 'circle',
16
+ max = 5,
17
+ className,
18
+ }) => {
19
+ const visibleAvatars = avatars.slice(0, max);
20
+ const hiddenAvatars = avatars.slice(max);
21
+ const remainingCount = avatars.length - max;
22
+
23
+ return (
24
+ <div className={classNames(styles.avatarGroup, className)}>
25
+ {visibleAvatars.map((avatar, index) => (
26
+ <DsAvatar
27
+ key={`${avatar.name}-${String(index)}`}
28
+ {...avatar}
29
+ size={size}
30
+ type={type}
31
+ className={styles.avatarItem}
32
+ />
33
+ ))}
34
+ {remainingCount > 0 && (
35
+ <DsTooltip
36
+ content={
37
+ <div className={styles.tooltipList}>
38
+ {hiddenAvatars.map((avatar, index) => (
39
+ <div key={`${avatar.name}-${String(index)}`}>
40
+ <DsTypography variant="body-xs-reg">{avatar.name}</DsTypography>
41
+ </div>
42
+ ))}
43
+ </div>
44
+ }
45
+ >
46
+ <div className={classNames(styles.moreAvatar, styles[size], styles[type])}>+{remainingCount}</div>
47
+ </DsTooltip>
48
+ )}
49
+ </div>
50
+ );
51
+ };
@@ -0,0 +1,27 @@
1
+ import type { DsAvatarProps, DsAvatarSize, DsAvatarType } from '../ds-avatar';
2
+
3
+ export interface DsAvatarGroupProps {
4
+ /**
5
+ * Array of avatar items
6
+ */
7
+ avatars: Omit<DsAvatarProps, 'size' | 'type'>[];
8
+ /**
9
+ * Size of the avatars in the group
10
+ * @default 'regular'
11
+ */
12
+ size?: DsAvatarSize;
13
+ /**
14
+ * Shape of the avatars in the group
15
+ * @default 'circle'
16
+ */
17
+ type?: DsAvatarType;
18
+ /**
19
+ * Maximum number of avatars to show before collapsing
20
+ * @default 5
21
+ */
22
+ max?: number;
23
+ /**
24
+ * Custom class name
25
+ */
26
+ className?: string;
27
+ }
@@ -0,0 +1,2 @@
1
+ export * from './ds-avatar-group';
2
+ export * from './ds-avatar-group.types';
@@ -6,7 +6,8 @@ import { DsIcon } from '../ds-icon';
6
6
  import { DsTypography } from '../ds-typography';
7
7
 
8
8
  /**
9
- * Design system Chip component
9
+ * @deprecated This component is deprecated. Use `DsTag` instead.
10
+ * @see {@link ../ds-tag} for the replacement component.
10
11
  */
11
12
  const DsChip: React.FC<DsChipProps> = ({
12
13
  ref,
@@ -1,9 +1,22 @@
1
1
  import type { CSSProperties, KeyboardEvent, MouseEvent, Ref } from 'react';
2
2
  import type { IconType } from '../ds-icon';
3
3
 
4
+ /**
5
+ * @deprecated This type is deprecated. Use `DsTag` instead.
6
+ * @see {@link ../ds-tag} for the replacement component.
7
+ */
4
8
  export const chipSizes = ['medium', 'small'] as const;
9
+
10
+ /**
11
+ * @deprecated This type is deprecated. Use `DsTag` instead.
12
+ * @see {@link ../ds-tag} for the replacement component.
13
+ */
5
14
  export type ChipSize = (typeof chipSizes)[number];
6
15
 
16
+ /**
17
+ * @deprecated This interface is deprecated. Use `DsTagProps` from `ds-tag` instead.
18
+ * @see {@link ../ds-tag/ds-tag.types} for the replacement interface.
19
+ */
7
20
  export interface DsChipProps {
8
21
  /**
9
22
  * Ref to the chip element
@@ -1,2 +1,10 @@
1
+ /**
2
+ * @deprecated DsChip is deprecated. Use DsTag instead.
3
+ * @see {@link ../ds-tag} for the replacement component.
4
+ */
1
5
  export { default as DsChip } from './ds-chip';
6
+ /**
7
+ * @deprecated These types are deprecated. Use DsTag types instead.
8
+ * @see {@link ../ds-tag} for the replacement types.
9
+ */
2
10
  export type { ChipSize, DsChipProps } from './ds-chip.types';
@@ -13,8 +13,8 @@ import { DsButton } from '../ds-button';
13
13
  import { DsIcon } from '../ds-icon';
14
14
 
15
15
  /**
16
- * Design system chip group component displays a collection of chips with overflow handling
17
- * Used for displaying filters, selected items, tags, etc.
16
+ * @deprecated This component is deprecated. Use `DsTagFilter` instead.
17
+ * @see {@link ../ds-tag-filter} for the replacement component.
18
18
  */
19
19
  const DsChipGroup: React.FC<DsChipGroupProps> = ({
20
20
  items,
@@ -1,5 +1,9 @@
1
1
  import type { CSSProperties } from 'react';
2
2
 
3
+ /**
4
+ * @deprecated This interface is deprecated. Use `DsTagFilter` types instead.
5
+ * @see {@link ../ds-tag-filter} for the replacement types.
6
+ */
3
7
  export interface ChipItem {
4
8
  /**
5
9
  * Unique identifier for the chip
@@ -19,6 +23,10 @@ export interface ChipItem {
19
23
  selected?: boolean;
20
24
  }
21
25
 
26
+ /**
27
+ * @deprecated This interface is deprecated. Use `DsTagFilterProps` from `ds-tag-filter` instead.
28
+ * @see {@link ../ds-tag-filter/ds-tag-filter.types} for the replacement interface.
29
+ */
22
30
  export interface DsChipGroupProps {
23
31
  /**
24
32
  * Array of chip items to display
@@ -1,2 +1,3 @@
1
1
  export { default as DsChipGroup } from './ds-chip-group';
2
+
2
3
  export type { DsChipGroupProps, ChipItem } from './ds-chip-group.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
+ }