@snack-uikit/tag 0.11.2 → 0.12.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 (47) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +18 -2
  3. package/dist/cjs/components/Tag/Tag.d.ts +5 -20
  4. package/dist/cjs/components/Tag/Tag.js +10 -59
  5. package/dist/cjs/components/TagBase/TagBase.d.ts +8 -0
  6. package/dist/cjs/components/TagBase/TagBase.js +61 -0
  7. package/dist/cjs/components/TagBase/index.d.ts +1 -0
  8. package/dist/cjs/components/TagBase/index.js +25 -0
  9. package/dist/cjs/components/TagLink/TagLink.d.ts +9 -0
  10. package/dist/cjs/components/TagLink/TagLink.js +51 -0
  11. package/dist/cjs/components/TagLink/index.d.ts +1 -0
  12. package/dist/cjs/components/TagLink/index.js +25 -0
  13. package/dist/cjs/components/TagLink/styles.module.css +179 -0
  14. package/dist/cjs/index.d.ts +2 -0
  15. package/dist/cjs/index.js +2 -1
  16. package/dist/cjs/types.d.ts +19 -1
  17. package/dist/esm/components/Tag/Tag.d.ts +5 -20
  18. package/dist/esm/components/Tag/Tag.js +11 -22
  19. package/dist/esm/components/TagBase/TagBase.d.ts +8 -0
  20. package/dist/esm/components/TagBase/TagBase.js +22 -0
  21. package/dist/esm/components/TagBase/index.d.ts +1 -0
  22. package/dist/esm/components/TagBase/index.js +1 -0
  23. package/dist/esm/components/TagLink/TagLink.d.ts +9 -0
  24. package/dist/esm/components/TagLink/TagLink.js +20 -0
  25. package/dist/esm/components/TagLink/index.d.ts +1 -0
  26. package/dist/esm/components/TagLink/index.js +1 -0
  27. package/dist/esm/components/TagLink/styles.module.css +179 -0
  28. package/dist/esm/index.d.ts +2 -0
  29. package/dist/esm/index.js +1 -0
  30. package/dist/esm/types.d.ts +19 -1
  31. package/package.json +2 -2
  32. package/src/components/Tag/Tag.tsx +11 -61
  33. package/src/components/TagBase/TagBase.tsx +55 -0
  34. package/src/components/TagBase/index.ts +1 -0
  35. package/src/components/TagLink/TagLink.tsx +43 -0
  36. package/src/components/TagLink/index.ts +1 -0
  37. package/src/components/TagLink/styles.module.scss +125 -0
  38. package/src/index.ts +2 -0
  39. package/src/types.ts +22 -1
  40. /package/dist/cjs/components/{Tag → TagBase}/constants.d.ts +0 -0
  41. /package/dist/cjs/components/{Tag → TagBase}/constants.js +0 -0
  42. /package/dist/cjs/components/{Tag → TagBase}/styles.module.css +0 -0
  43. /package/dist/esm/components/{Tag → TagBase}/constants.d.ts +0 -0
  44. /package/dist/esm/components/{Tag → TagBase}/constants.js +0 -0
  45. /package/dist/esm/components/{Tag → TagBase}/styles.module.css +0 -0
  46. /package/src/components/{Tag → TagBase}/constants.ts +0 -0
  47. /package/src/components/{Tag → TagBase}/styles.module.scss +0 -0
@@ -0,0 +1,22 @@
1
+ var __rest = (this && this.__rest) || function (s, e) {
2
+ var t = {};
3
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
4
+ t[p] = s[p];
5
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
6
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
8
+ t[p[i]] = s[p[i]];
9
+ }
10
+ return t;
11
+ };
12
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
+ import cn from 'classnames';
14
+ import { CrossSVG } from '@snack-uikit/icons';
15
+ import { extractSupportProps } from '@snack-uikit/utils';
16
+ import { APPEARANCE, SIZE } from '../../constants';
17
+ import { ICON_SIZE } from './constants';
18
+ import styles from './styles.module.css';
19
+ export function TagBase(_a) {
20
+ var { label, size = SIZE.Xs, appearance = APPEARANCE.Neutral, onDelete, className, tabIndex } = _a, rest = __rest(_a, ["label", "size", "appearance", "onDelete", "className", "tabIndex"]);
21
+ return (_jsxs("span", Object.assign({}, extractSupportProps(rest), { className: cn(styles.tag, className), "data-size": size, "data-appearance": appearance, "data-removable": Boolean(onDelete), children: [_jsx("span", { title: label, className: styles.label, children: label }), onDelete && (_jsx("button", { type: 'button', className: styles.tagButton, onClick: onDelete, "data-test-id": 'tag-remove-button', tabIndex: tabIndex, children: size === SIZE.Xs ? (_jsx(CrossSVG, { size: ICON_SIZE[size], className: styles.icon })) : (_jsx(CrossSVG, { size: ICON_SIZE[size], className: styles.icon })) }))] })));
22
+ }
@@ -0,0 +1 @@
1
+ export * from './TagBase';
@@ -0,0 +1 @@
1
+ export * from './TagBase';
@@ -0,0 +1,9 @@
1
+ import { MouseEvent } from 'react';
2
+ import { WithSupportProps } from '@snack-uikit/utils';
3
+ import { CommonTagProps } from '../../types';
4
+ export type TagLinkProps = WithSupportProps<CommonTagProps> & {
5
+ href: string;
6
+ onClick?(e: MouseEvent<HTMLAnchorElement>): void;
7
+ target?: HTMLAnchorElement['target'];
8
+ };
9
+ export declare function TagLink({ label, size, appearance, className, tabIndex, href, onClick, target, ...rest }: TagLinkProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,20 @@
1
+ var __rest = (this && this.__rest) || function (s, e) {
2
+ var t = {};
3
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
4
+ t[p] = s[p];
5
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
6
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
8
+ t[p[i]] = s[p[i]];
9
+ }
10
+ return t;
11
+ };
12
+ import { jsx as _jsx } from "react/jsx-runtime";
13
+ import cn from 'classnames';
14
+ import { extractSupportProps } from '@snack-uikit/utils';
15
+ import { APPEARANCE, SIZE } from '../../constants';
16
+ import styles from './styles.module.css';
17
+ export function TagLink(_a) {
18
+ var { label, size = SIZE.Xs, appearance = APPEARANCE.Neutral, className, tabIndex, href, onClick, target } = _a, rest = __rest(_a, ["label", "size", "appearance", "className", "tabIndex", "href", "onClick", "target"]);
19
+ return (_jsx("a", Object.assign({}, extractSupportProps(rest), { className: cn(styles.tag, className), "data-size": size, "data-appearance": appearance, tabIndex: tabIndex, href: href, target: target, onClick: onClick, children: _jsx("span", { title: label, className: styles.label, children: label }) })));
20
+ }
@@ -0,0 +1 @@
1
+ export * from './TagLink';
@@ -0,0 +1 @@
1
+ export * from './TagLink';
@@ -0,0 +1,179 @@
1
+ .tag{
2
+ display:inline-flex;
3
+ align-items:center;
4
+ box-sizing:border-box;
5
+ max-width:100%;
6
+ text-decoration:none;
7
+ }
8
+ .tag:focus-visible{
9
+ outline-width:var(--border-state-focus-s-border-width, 2px);
10
+ outline-style:var(--border-state-focus-s-border-style, solid);
11
+ outline-color:var(--border-state-focus-s-border-color, );
12
+ outline-color:var(--sys-available-complementary, #1c1c24);
13
+ }
14
+ .tag:active{
15
+ outline:none;
16
+ }
17
+ .tag[data-size=xs]{
18
+ padding-left:var(--space-tag-xs-from-label, 8px);
19
+ padding-right:var(--space-tag-xs-from-label, 8px);
20
+ height:var(--size-tag-xs, 24px);
21
+ border-radius:var(--radius-tag-xs, 4px);
22
+ }
23
+ .tag[data-size=xs] .label{
24
+ font-family:var(--sans-label-s-font-family, SB Sans Interface);
25
+ font-weight:var(--sans-label-s-font-weight, Semibold);
26
+ line-height:var(--sans-label-s-line-height, 14px);
27
+ font-size:var(--sans-label-s-font-size, 11px);
28
+ letter-spacing:var(--sans-label-s-letter-spacing, 0px);
29
+ paragraph-spacing:var(--sans-label-s-paragraph-spacing, 6.05px);
30
+ }
31
+ .tag[data-size=s]{
32
+ padding-left:var(--space-tag-s-from-label, 16px);
33
+ padding-right:var(--space-tag-s-from-label, 16px);
34
+ height:var(--size-tag-s, 32px);
35
+ border-radius:var(--radius-tag-s, 8px);
36
+ }
37
+ .tag[data-size=s] .label{
38
+ font-family:var(--sans-label-m-font-family, SB Sans Interface);
39
+ font-weight:var(--sans-label-m-font-weight, Semibold);
40
+ line-height:var(--sans-label-m-line-height, 16px);
41
+ font-size:var(--sans-label-m-font-size, 12px);
42
+ letter-spacing:var(--sans-label-m-letter-spacing, 0px);
43
+ paragraph-spacing:var(--sans-label-m-paragraph-spacing, 6.6px);
44
+ }
45
+ .tag[data-appearance=neutral]{
46
+ background-color:var(--sys-neutral-decor-default, #dde0ea);
47
+ }
48
+ .tag[data-appearance=neutral] .label{
49
+ overflow:hidden;
50
+ color:var(--sys-neutral-text-support, #6d707f);
51
+ text-overflow:ellipsis;
52
+ white-space:nowrap;
53
+ }
54
+ .tag[data-appearance=neutral]:focus-visible, .tag[data-appearance=neutral]:hover{
55
+ background-color:var(--sys-neutral-decor-hovered, #cfd2dc);
56
+ }
57
+ .tag[data-appearance=neutral]:active{
58
+ background-color:var(--sys-neutral-decor-activated, #bec2cf);
59
+ }
60
+ .tag[data-appearance=primary]{
61
+ background-color:var(--sys-primary-decor-default, #ebdefd);
62
+ }
63
+ .tag[data-appearance=primary] .label{
64
+ overflow:hidden;
65
+ color:var(--sys-primary-text-support, #5b4796);
66
+ text-overflow:ellipsis;
67
+ white-space:nowrap;
68
+ }
69
+ .tag[data-appearance=primary]:focus-visible, .tag[data-appearance=primary]:hover{
70
+ background-color:var(--sys-primary-decor-hovered, #decdfb);
71
+ }
72
+ .tag[data-appearance=primary]:active{
73
+ background-color:var(--sys-primary-decor-activated, #c5b2f1);
74
+ }
75
+ .tag[data-appearance=red]{
76
+ background-color:var(--sys-red-decor-default, #fdd6cd);
77
+ }
78
+ .tag[data-appearance=red] .label{
79
+ overflow:hidden;
80
+ color:var(--sys-red-text-support, #ae514c);
81
+ text-overflow:ellipsis;
82
+ white-space:nowrap;
83
+ }
84
+ .tag[data-appearance=red]:focus-visible, .tag[data-appearance=red]:hover{
85
+ background-color:var(--sys-red-decor-hovered, #fac1b3);
86
+ }
87
+ .tag[data-appearance=red]:active{
88
+ background-color:var(--sys-red-decor-activated, #fbab99);
89
+ }
90
+ .tag[data-appearance=orange]{
91
+ background-color:var(--sys-orange-decor-default, #fed8b8);
92
+ }
93
+ .tag[data-appearance=orange] .label{
94
+ overflow:hidden;
95
+ color:var(--sys-orange-text-support, #bb733e);
96
+ text-overflow:ellipsis;
97
+ white-space:nowrap;
98
+ }
99
+ .tag[data-appearance=orange]:focus-visible, .tag[data-appearance=orange]:hover{
100
+ background-color:var(--sys-orange-decor-hovered, #f8c699);
101
+ }
102
+ .tag[data-appearance=orange]:active{
103
+ background-color:var(--sys-orange-decor-activated, #f5b27b);
104
+ }
105
+ .tag[data-appearance=yellow]{
106
+ background-color:var(--sys-yellow-decor-default, #f0dfb1);
107
+ }
108
+ .tag[data-appearance=yellow] .label{
109
+ overflow:hidden;
110
+ color:var(--sys-yellow-text-support, #b78c32);
111
+ text-overflow:ellipsis;
112
+ white-space:nowrap;
113
+ }
114
+ .tag[data-appearance=yellow]:focus-visible, .tag[data-appearance=yellow]:hover{
115
+ background-color:var(--sys-yellow-decor-hovered, #ead49a);
116
+ }
117
+ .tag[data-appearance=yellow]:active{
118
+ background-color:var(--sys-yellow-decor-activated, #e6c878);
119
+ }
120
+ .tag[data-appearance=green]{
121
+ background-color:var(--sys-green-decor-default, #d2ead0);
122
+ }
123
+ .tag[data-appearance=green] .label{
124
+ overflow:hidden;
125
+ color:var(--sys-green-text-support, #55915a);
126
+ text-overflow:ellipsis;
127
+ white-space:nowrap;
128
+ }
129
+ .tag[data-appearance=green]:focus-visible, .tag[data-appearance=green]:hover{
130
+ background-color:var(--sys-green-decor-hovered, #c0e1ba);
131
+ }
132
+ .tag[data-appearance=green]:active{
133
+ background-color:var(--sys-green-decor-activated, #a8d1a2);
134
+ }
135
+ .tag[data-appearance=blue]{
136
+ background-color:var(--sys-blue-decor-default, #d6e2f4);
137
+ }
138
+ .tag[data-appearance=blue] .label{
139
+ overflow:hidden;
140
+ color:var(--sys-blue-text-support, #4877b0);
141
+ text-overflow:ellipsis;
142
+ white-space:nowrap;
143
+ }
144
+ .tag[data-appearance=blue]:focus-visible, .tag[data-appearance=blue]:hover{
145
+ background-color:var(--sys-blue-decor-hovered, #c5d9f6);
146
+ }
147
+ .tag[data-appearance=blue]:active{
148
+ background-color:var(--sys-blue-decor-activated, #aac4ea);
149
+ }
150
+ .tag[data-appearance=violet]{
151
+ background-color:var(--sys-violet-decor-default, #e6dcf3);
152
+ }
153
+ .tag[data-appearance=violet] .label{
154
+ overflow:hidden;
155
+ color:var(--sys-violet-text-support, #8c639b);
156
+ text-overflow:ellipsis;
157
+ white-space:nowrap;
158
+ }
159
+ .tag[data-appearance=violet]:focus-visible, .tag[data-appearance=violet]:hover{
160
+ background-color:var(--sys-violet-decor-hovered, #e1d0f7);
161
+ }
162
+ .tag[data-appearance=violet]:active{
163
+ background-color:var(--sys-violet-decor-activated, #ceb7e7);
164
+ }
165
+ .tag[data-appearance=pink]{
166
+ background-color:var(--sys-pink-decor-default, #f5d9e1);
167
+ }
168
+ .tag[data-appearance=pink] .label{
169
+ overflow:hidden;
170
+ color:var(--sys-pink-text-support, #ae5e80);
171
+ text-overflow:ellipsis;
172
+ white-space:nowrap;
173
+ }
174
+ .tag[data-appearance=pink]:focus-visible, .tag[data-appearance=pink]:hover{
175
+ background-color:var(--sys-pink-decor-hovered, #f5c9d6);
176
+ }
177
+ .tag[data-appearance=pink]:active{
178
+ background-color:var(--sys-pink-decor-activated, #e8b1c1);
179
+ }
@@ -1 +1,3 @@
1
1
  export * from './components';
2
+ export * from './constants';
3
+ export type { Appearance, Size, TagRowItem } from './types';
package/dist/esm/index.js CHANGED
@@ -1 +1,2 @@
1
1
  export * from './components';
2
+ export * from './constants';
@@ -1,12 +1,30 @@
1
+ import { MouseEvent } from 'react';
1
2
  import { ValueOf } from '@snack-uikit/utils';
2
3
  import { APPEARANCE, SIZE } from './constants';
3
4
  export type Appearance = ValueOf<typeof APPEARANCE>;
4
5
  export type Size = ValueOf<typeof SIZE>;
6
+ export type LinkProps = {
7
+ href: string;
8
+ onClick?(e: MouseEvent<HTMLAnchorElement>): void;
9
+ target?: HTMLAnchorElement['target'];
10
+ };
5
11
  export type TagRowItem = {
6
12
  label: string;
7
13
  appearance?: Appearance;
8
- };
14
+ } & Partial<LinkProps>;
9
15
  export type TagRowItemInner = {
10
16
  label: string;
11
17
  appearance: Appearance;
18
+ } & Partial<LinkProps>;
19
+ export type CommonTagProps = {
20
+ /** Текст */
21
+ label: string;
22
+ /** Размер */
23
+ size?: Size;
24
+ /** Внешний вид */
25
+ appearance?: Appearance;
26
+ /** CSS-класс */
27
+ className?: string;
28
+ /** tabIndex кнопки удаления */
29
+ tabIndex?: number;
12
30
  };
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "access": "public"
5
5
  },
6
6
  "title": "Tag",
7
- "version": "0.11.2",
7
+ "version": "0.12.0",
8
8
  "sideEffects": [
9
9
  "*.css",
10
10
  "*.woff",
@@ -42,5 +42,5 @@
42
42
  "@snack-uikit/utils": "3.5.0",
43
43
  "classnames": "2.5.1"
44
44
  },
45
- "gitHead": "b9670e68c6af5fdd5dfceeae29ef3af8c89e5e6b"
45
+ "gitHead": "ea6bfd43b9837c9b25ac94c96077fdfb2f6b5b9f"
46
46
  }
@@ -1,66 +1,16 @@
1
- import cn from 'classnames';
2
- import { MouseEventHandler } from 'react';
1
+ import { TagBase, TagBaseProps } from '../TagBase';
2
+ import { TagLink, TagLinkProps } from '../TagLink';
3
3
 
4
- import { CrossSVG } from '@snack-uikit/icons';
5
- import { extractSupportProps, WithSupportProps } from '@snack-uikit/utils';
4
+ export type TagProps = TagBaseProps | TagLinkProps;
6
5
 
7
- import { APPEARANCE, SIZE } from '../../constants';
8
- import { Appearance, Size } from '../../types';
9
- import { ICON_SIZE } from './constants';
10
- import styles from './styles.module.scss';
6
+ export function isTagLinkProps(props: TagProps): props is TagLinkProps {
7
+ return 'href' in props && props.href !== undefined;
8
+ }
11
9
 
12
- export type TagProps = WithSupportProps<{
13
- /** Текст */
14
- label: string;
15
- /** Размер */
16
- size?: Size;
17
- /** Внешний вид */
18
- appearance?: Appearance;
19
- /** Коллбэк на удаление */
20
- onDelete?: MouseEventHandler<HTMLButtonElement>;
21
- /** CSS-класс */
22
- className?: string;
23
- /** tabIndex кнопки удаления */
24
- tabIndex?: number;
25
- }>;
10
+ export function Tag(props: TagProps) {
11
+ if (isTagLinkProps(props)) {
12
+ return <TagLink {...props} />;
13
+ }
26
14
 
27
- export function Tag({
28
- label,
29
- size = SIZE.Xs,
30
- appearance = APPEARANCE.Neutral,
31
- onDelete,
32
- className,
33
- tabIndex,
34
- ...rest
35
- }: TagProps) {
36
- return (
37
- <span
38
- {...extractSupportProps(rest)}
39
- className={cn(styles.tag, className)}
40
- data-size={size}
41
- data-appearance={appearance}
42
- data-removable={Boolean(onDelete)}
43
- >
44
- <span title={label} className={styles.label}>
45
- {label}
46
- </span>
47
- {onDelete && (
48
- <button
49
- type='button'
50
- className={styles.tagButton}
51
- onClick={onDelete}
52
- data-test-id='tag-remove-button'
53
- tabIndex={tabIndex}
54
- >
55
- {size === SIZE.Xs ? (
56
- <CrossSVG size={ICON_SIZE[size]} className={styles.icon} />
57
- ) : (
58
- <CrossSVG size={ICON_SIZE[size]} className={styles.icon} />
59
- )}
60
- </button>
61
- )}
62
- </span>
63
- );
15
+ return <TagBase {...props} />;
64
16
  }
65
-
66
- export { APPEARANCE };
@@ -0,0 +1,55 @@
1
+ import cn from 'classnames';
2
+ import { MouseEventHandler } from 'react';
3
+
4
+ import { CrossSVG } from '@snack-uikit/icons';
5
+ import { extractSupportProps, WithSupportProps } from '@snack-uikit/utils';
6
+
7
+ import { APPEARANCE, SIZE } from '../../constants';
8
+ import { CommonTagProps } from '../../types';
9
+ import { ICON_SIZE } from './constants';
10
+ import styles from './styles.module.scss';
11
+
12
+ export type TagBaseProps = WithSupportProps<{
13
+ /** Коллбэк на удаление */
14
+ onDelete?: MouseEventHandler<HTMLButtonElement>;
15
+ }> &
16
+ CommonTagProps;
17
+
18
+ export function TagBase({
19
+ label,
20
+ size = SIZE.Xs,
21
+ appearance = APPEARANCE.Neutral,
22
+ onDelete,
23
+ className,
24
+ tabIndex,
25
+ ...rest
26
+ }: TagBaseProps) {
27
+ return (
28
+ <span
29
+ {...extractSupportProps(rest)}
30
+ className={cn(styles.tag, className)}
31
+ data-size={size}
32
+ data-appearance={appearance}
33
+ data-removable={Boolean(onDelete)}
34
+ >
35
+ <span title={label} className={styles.label}>
36
+ {label}
37
+ </span>
38
+ {onDelete && (
39
+ <button
40
+ type='button'
41
+ className={styles.tagButton}
42
+ onClick={onDelete}
43
+ data-test-id='tag-remove-button'
44
+ tabIndex={tabIndex}
45
+ >
46
+ {size === SIZE.Xs ? (
47
+ <CrossSVG size={ICON_SIZE[size]} className={styles.icon} />
48
+ ) : (
49
+ <CrossSVG size={ICON_SIZE[size]} className={styles.icon} />
50
+ )}
51
+ </button>
52
+ )}
53
+ </span>
54
+ );
55
+ }
@@ -0,0 +1 @@
1
+ export * from './TagBase';
@@ -0,0 +1,43 @@
1
+ import cn from 'classnames';
2
+ import { MouseEvent } from 'react';
3
+
4
+ import { extractSupportProps, WithSupportProps } from '@snack-uikit/utils';
5
+
6
+ import { APPEARANCE, SIZE } from '../../constants';
7
+ import { CommonTagProps } from '../../types';
8
+ import styles from './styles.module.scss';
9
+
10
+ export type TagLinkProps = WithSupportProps<CommonTagProps> & {
11
+ href: string;
12
+ onClick?(e: MouseEvent<HTMLAnchorElement>): void;
13
+ target?: HTMLAnchorElement['target'];
14
+ };
15
+
16
+ export function TagLink({
17
+ label,
18
+ size = SIZE.Xs,
19
+ appearance = APPEARANCE.Neutral,
20
+ className,
21
+ tabIndex,
22
+ href,
23
+ onClick,
24
+ target,
25
+ ...rest
26
+ }: TagLinkProps) {
27
+ return (
28
+ <a
29
+ {...extractSupportProps(rest)}
30
+ className={cn(styles.tag, className)}
31
+ data-size={size}
32
+ data-appearance={appearance}
33
+ tabIndex={tabIndex}
34
+ href={href}
35
+ target={target}
36
+ onClick={onClick}
37
+ >
38
+ <span title={label} className={styles.label}>
39
+ {label}
40
+ </span>
41
+ </a>
42
+ );
43
+ }
@@ -0,0 +1 @@
1
+ export * from './TagLink';
@@ -0,0 +1,125 @@
1
+ @use '@snack-uikit/figma-tokens/build/scss/components/styles-tokens-tag';
2
+ @use '@snack-uikit/figma-tokens/build/scss/components/styles-tokens-element';
3
+
4
+ $sizes: 'xs', 's';
5
+ $label-typography: (
6
+ 'xs': styles-tokens-tag.$sans-label-s,
7
+ 's': styles-tokens-tag.$sans-label-m,
8
+ );
9
+ $appearances: (
10
+ 'neutral': (
11
+ 'container': styles-tokens-tag.$sys-neutral-decor-default,
12
+ 'container-disabled': styles-tokens-tag.$sys-neutral-decor-disabled,
13
+ 'label': styles-tokens-tag.$sys-neutral-text-support,
14
+ 'hovered': styles-tokens-tag.$sys-neutral-decor-hovered,
15
+ 'active': styles-tokens-tag.$sys-neutral-decor-activated,
16
+ ),
17
+ 'primary': (
18
+ 'container': styles-tokens-tag.$sys-primary-decor-default,
19
+ 'container-disabled': styles-tokens-tag.$sys-primary-decor-disabled,
20
+ 'label': styles-tokens-tag.$sys-primary-text-support,
21
+ 'hovered': styles-tokens-tag.$sys-primary-decor-hovered,
22
+ 'active': styles-tokens-tag.$sys-primary-decor-activated,
23
+ ),
24
+ 'red': (
25
+ 'container': styles-tokens-tag.$sys-red-decor-default,
26
+ 'container-disabled': styles-tokens-tag.$sys-red-decor-disabled,
27
+ 'label': styles-tokens-tag.$sys-red-text-support,
28
+ 'hovered': styles-tokens-tag.$sys-red-decor-hovered,
29
+ 'active': styles-tokens-tag.$sys-red-decor-activated,
30
+ ),
31
+ 'orange': (
32
+ 'container': styles-tokens-tag.$sys-orange-decor-default,
33
+ 'container-disabled': styles-tokens-tag.$sys-orange-decor-disabled,
34
+ 'label': styles-tokens-tag.$sys-orange-text-support,
35
+ 'hovered': styles-tokens-tag.$sys-orange-decor-hovered,
36
+ 'active': styles-tokens-tag.$sys-orange-decor-activated,
37
+ ),
38
+ 'yellow': (
39
+ 'container': styles-tokens-tag.$sys-yellow-decor-default,
40
+ 'container-disabled': styles-tokens-tag.$sys-yellow-decor-disabled,
41
+ 'label': styles-tokens-tag.$sys-yellow-text-support,
42
+ 'hovered': styles-tokens-tag.$sys-yellow-decor-hovered,
43
+ 'active': styles-tokens-tag.$sys-yellow-decor-activated,
44
+ ),
45
+ 'green': (
46
+ 'container': styles-tokens-tag.$sys-green-decor-default,
47
+ 'container-disabled': styles-tokens-tag.$sys-green-decor-disabled,
48
+ 'label': styles-tokens-tag.$sys-green-text-support,
49
+ 'hovered': styles-tokens-tag.$sys-green-decor-hovered,
50
+ 'active': styles-tokens-tag.$sys-green-decor-activated,
51
+ ),
52
+ 'blue': (
53
+ 'container': styles-tokens-tag.$sys-blue-decor-default,
54
+ 'container-disabled': styles-tokens-tag.$sys-blue-decor-disabled,
55
+ 'label': styles-tokens-tag.$sys-blue-text-support,
56
+ 'hovered': styles-tokens-tag.$sys-blue-decor-hovered,
57
+ 'active': styles-tokens-tag.$sys-blue-decor-activated,
58
+ ),
59
+ 'violet': (
60
+ 'container': styles-tokens-tag.$sys-violet-decor-default,
61
+ 'container-disabled': styles-tokens-tag.$sys-violet-decor-disabled,
62
+ 'label': styles-tokens-tag.$sys-violet-text-support,
63
+ 'hovered': styles-tokens-tag.$sys-violet-decor-hovered,
64
+ 'active': styles-tokens-tag.$sys-violet-decor-activated,
65
+ ),
66
+ 'pink': (
67
+ 'container': styles-tokens-tag.$sys-pink-decor-default,
68
+ 'container-disabled': styles-tokens-tag.$sys-pink-decor-disabled,
69
+ 'label': styles-tokens-tag.$sys-pink-text-support,
70
+ 'hovered': styles-tokens-tag.$sys-pink-decor-hovered,
71
+ 'active': styles-tokens-tag.$sys-pink-decor-activated,
72
+ ),
73
+ );
74
+
75
+ .tag {
76
+ display: inline-flex;
77
+ align-items: center;
78
+
79
+ box-sizing: border-box;
80
+ max-width: 100%;
81
+
82
+ text-decoration: none;
83
+
84
+ &:focus-visible {
85
+ @include styles-tokens-tag.outline-var(styles-tokens-element.$container-focused-s);
86
+
87
+ outline-color: styles-tokens-element.$sys-available-complementary;
88
+ }
89
+
90
+ &:active {
91
+ outline: none;
92
+ }
93
+
94
+ @each $size in $sizes {
95
+ &[data-size='#{$size}'] {
96
+ @include styles-tokens-tag.composite-var(styles-tokens-tag.$tag, 'container', $size, 'label-only');
97
+
98
+ .label {
99
+ @include styles-tokens-tag.composite-var($label-typography, $size);
100
+ }
101
+ }
102
+ }
103
+
104
+ @each $appearanceKey, $appearance in $appearances {
105
+ &[data-appearance='#{$appearanceKey}'] {
106
+ background-color: styles-tokens-tag.simple-var($appearance, 'container');
107
+
108
+ .label {
109
+ overflow: hidden;
110
+ color: styles-tokens-tag.simple-var($appearance, 'label');
111
+ text-overflow: ellipsis;
112
+ white-space: nowrap;
113
+ }
114
+
115
+ &:focus-visible,
116
+ &:hover {
117
+ background-color: styles-tokens-tag.simple-var($appearance, 'hovered');
118
+ }
119
+
120
+ &:active {
121
+ background-color: styles-tokens-tag.simple-var($appearance, 'active');
122
+ }
123
+ }
124
+ }
125
+ }
package/src/index.ts CHANGED
@@ -1 +1,3 @@
1
1
  export * from './components';
2
+ export * from './constants';
3
+ export type { Appearance, Size, TagRowItem } from './types';
package/src/types.ts CHANGED
@@ -1,3 +1,5 @@
1
+ import { MouseEvent } from 'react';
2
+
1
3
  import { ValueOf } from '@snack-uikit/utils';
2
4
 
3
5
  import { APPEARANCE, SIZE } from './constants';
@@ -6,12 +8,31 @@ export type Appearance = ValueOf<typeof APPEARANCE>;
6
8
 
7
9
  export type Size = ValueOf<typeof SIZE>;
8
10
 
11
+ export type LinkProps = {
12
+ href: string;
13
+ onClick?(e: MouseEvent<HTMLAnchorElement>): void;
14
+ target?: HTMLAnchorElement['target'];
15
+ };
16
+
9
17
  export type TagRowItem = {
10
18
  label: string;
11
19
  appearance?: Appearance;
12
- };
20
+ } & Partial<LinkProps>;
13
21
 
14
22
  export type TagRowItemInner = {
15
23
  label: string;
16
24
  appearance: Appearance;
25
+ } & Partial<LinkProps>;
26
+
27
+ export type CommonTagProps = {
28
+ /** Текст */
29
+ label: string;
30
+ /** Размер */
31
+ size?: Size;
32
+ /** Внешний вид */
33
+ appearance?: Appearance;
34
+ /** CSS-класс */
35
+ className?: string;
36
+ /** tabIndex кнопки удаления */
37
+ tabIndex?: number;
17
38
  };
File without changes