@snack-uikit/link 0.17.20 → 0.18.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.
- package/CHANGELOG.md +11 -0
- package/README.md +3 -2
- package/dist/cjs/components/Link.d.ts +1 -1
- package/dist/cjs/components/Link.js +3 -2
- package/dist/cjs/components/types.d.ts +37 -14
- package/dist/esm/components/Link.d.ts +1 -1
- package/dist/esm/components/Link.js +2 -2
- package/dist/esm/components/types.d.ts +37 -14
- package/package.json +2 -2
- package/src/components/Link.tsx +2 -1
- package/src/components/types.ts +54 -27
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,17 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# 0.18.0 (2026-04-03)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* **PDS-3679:** added truncateMaxLines prop in Link ([ff25bd3](https://github.com/cloud-ru-tech/snack-uikit/commit/ff25bd3703e9d911a93bc657368ded03fa24ecaf))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
6
17
|
## 0.17.20 (2026-03-27)
|
|
7
18
|
|
|
8
19
|
### Only dependencies have been changed
|
package/README.md
CHANGED
|
@@ -51,8 +51,9 @@ import { Link as ReactRouterLink } from 'react-router-dom';
|
|
|
51
51
|
| appearance | enum Appearance: `"invert-neutral"`, `"neutral"`, `"primary"`, `"red"`, `"orange"`, `"yellow"`, `"green"`, `"blue"`, `"violet"`, `"pink"` | primary | Стилизует ссылку для размещения на цветном фоне |
|
|
52
52
|
| textMode | enum TextMode: `"default"`, `"accent"`, `"on-accent"` | default | Тип поверхности, на которой размещена ссылка |
|
|
53
53
|
| insideText | `boolean` | - | Находится ли ссылка внутри текста (и можно ли её переносить) |
|
|
54
|
-
| truncateVariant | "end" \| "middle" | - | Вариант обрезания строки:
|
|
55
|
-
|
|
|
54
|
+
| truncateVariant | "end" \| "middle" | - | Вариант обрезания строки: - `end` — с конца; - `middle` — посередине |
|
|
55
|
+
| truncateMaxLines | `number` | 1 | Максимальное кол-во строк, до которого может сворачиваться текст ссылки. @remarks Применяется только при `truncateVariant === 'end'`. |
|
|
56
|
+
| as | `ComponentType \| ElementType` | 'a' | Полиморфный компонент. Оформить переданный компонент или html элемент в стиль ссылки. Список атрибутов, которые переданный компонент должен принять: - `className` - `data-size` - `data-text-mode` - `data-appearance` - `data-inside-text` |
|
|
56
57
|
|
|
57
58
|
|
|
58
59
|
[//]: DOCUMENTATION_SECTION_END
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { ElementType } from 'react';
|
|
2
2
|
import { LinkProps } from './types';
|
|
3
3
|
/** Компонент ссылка */
|
|
4
|
-
export declare function Link<T extends ElementType = 'a'>({ text, className, textMode, size, purpose, appearance, insideText, truncateVariant, as, ...rest }: LinkProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
4
|
+
export declare function Link<T extends ElementType = 'a'>({ text, className, textMode, size, purpose, appearance, insideText, truncateVariant, truncateMaxLines, as, ...rest }: LinkProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -35,9 +35,10 @@ function Link(_a) {
|
|
|
35
35
|
appearance = constants_1.APPEARANCE.Primary,
|
|
36
36
|
insideText = false,
|
|
37
37
|
truncateVariant,
|
|
38
|
+
truncateMaxLines = 1,
|
|
38
39
|
as
|
|
39
40
|
} = _a,
|
|
40
|
-
rest = __rest(_a, ["text", "className", "textMode", "size", "purpose", "appearance", "insideText", "truncateVariant", "as"]);
|
|
41
|
+
rest = __rest(_a, ["text", "className", "textMode", "size", "purpose", "appearance", "insideText", "truncateVariant", "truncateMaxLines", "as"]);
|
|
41
42
|
const Component = as || 'a';
|
|
42
43
|
let fallbackProps;
|
|
43
44
|
if (Component === 'a') {
|
|
@@ -64,7 +65,7 @@ function Link(_a) {
|
|
|
64
65
|
"data-inside-text": insideText || undefined,
|
|
65
66
|
children: insideText ? text : (0, jsx_runtime_1.jsx)(truncate_string_1.TruncateString, {
|
|
66
67
|
text: text,
|
|
67
|
-
maxLines:
|
|
68
|
+
maxLines: truncateMaxLines,
|
|
68
69
|
variant: truncateVariant
|
|
69
70
|
})
|
|
70
71
|
}));
|
|
@@ -6,6 +6,32 @@ export type Appearance = ValueOf<typeof APPEARANCE>;
|
|
|
6
6
|
export type Size = ValueOf<typeof SIZE>;
|
|
7
7
|
export type Purpose = ValueOf<typeof PURPOSE>;
|
|
8
8
|
export type TextMode = ValueOf<typeof TEXT_MODE>;
|
|
9
|
+
type TruncateEndProps = {
|
|
10
|
+
/**
|
|
11
|
+
* Вариант обрезания строки:
|
|
12
|
+
*
|
|
13
|
+
* - `end` — с конца;
|
|
14
|
+
* - `middle` — посередине
|
|
15
|
+
*/
|
|
16
|
+
truncateVariant?: Extract<TruncateStringProps['variant'], 'end'>;
|
|
17
|
+
/**
|
|
18
|
+
* Максимальное кол-во строк, до которого может сворачиваться текст ссылки.
|
|
19
|
+
* @remarks Применяется только при `truncateVariant === 'end'`.
|
|
20
|
+
* @default 1
|
|
21
|
+
*/
|
|
22
|
+
truncateMaxLines?: number;
|
|
23
|
+
};
|
|
24
|
+
type TruncateMiddleProps = {
|
|
25
|
+
/**
|
|
26
|
+
* Вариант обрезания строки:
|
|
27
|
+
*
|
|
28
|
+
* - `end` — с конца;
|
|
29
|
+
* - `middle` — посередине
|
|
30
|
+
*/
|
|
31
|
+
truncateVariant?: Extract<TruncateStringProps['variant'], 'middle'>;
|
|
32
|
+
truncateMaxLines?: never;
|
|
33
|
+
};
|
|
34
|
+
type TruncateProps = TruncateEndProps | TruncateMiddleProps;
|
|
9
35
|
export type BaseProps = WithSupportProps<{
|
|
10
36
|
/** Текст ссылки */
|
|
11
37
|
text?: string;
|
|
@@ -27,14 +53,8 @@ export type BaseProps = WithSupportProps<{
|
|
|
27
53
|
textMode?: TextMode;
|
|
28
54
|
/** Находится ли ссылка внутри текста (и можно ли её переносить) */
|
|
29
55
|
insideText?: boolean;
|
|
30
|
-
/**
|
|
31
|
-
* Вариант обрезания строки:
|
|
32
|
-
* <br> - `end` - с конца;
|
|
33
|
-
* <br> - `middle` - по середине
|
|
34
|
-
* */
|
|
35
|
-
truncateVariant?: TruncateStringProps['variant'];
|
|
36
56
|
}>;
|
|
37
|
-
export type LinkProps<T extends ElementType = 'a'> = BaseProps & {
|
|
57
|
+
export type LinkProps<T extends ElementType = 'a'> = BaseProps & TruncateProps & {
|
|
38
58
|
/**
|
|
39
59
|
*
|
|
40
60
|
* Полиморфный компонент.
|
|
@@ -42,16 +62,19 @@ export type LinkProps<T extends ElementType = 'a'> = BaseProps & {
|
|
|
42
62
|
* Оформить переданный компонент или html элемент в стиль ссылки.
|
|
43
63
|
*
|
|
44
64
|
* Список атрибутов, которые переданный компонент должен принять:
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
65
|
+
* - `className`
|
|
66
|
+
* - `data-size`
|
|
67
|
+
* - `data-text-mode`
|
|
68
|
+
* - `data-appearance`
|
|
69
|
+
* - `data-inside-text`
|
|
50
70
|
*
|
|
51
71
|
* @type ComponentType | ElementType
|
|
52
72
|
* @default 'a'
|
|
53
73
|
*
|
|
54
|
-
|
|
74
|
+
*/
|
|
55
75
|
as?: T;
|
|
56
76
|
} & Omit<ComponentPropsWithoutRef<ElementType extends T ? 'a' : T>, keyof BaseProps>;
|
|
57
|
-
|
|
77
|
+
/** Сохраняет дискриминацию union при выборе полей (в отличие от `Pick` по union). */
|
|
78
|
+
type DistributivePick<T, K extends keyof T> = T extends unknown ? Pick<T, K> : never;
|
|
79
|
+
export type PickLinkProps<T extends ElementType, SelectedKeys extends keyof LinkProps<T>> = DistributivePick<LinkProps<T>, SelectedKeys> & Omit<ComponentPropsWithoutRef<ElementType extends T ? 'a' : T>, keyof BaseProps>;
|
|
80
|
+
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { ElementType } from 'react';
|
|
2
2
|
import { LinkProps } from './types';
|
|
3
3
|
/** Компонент ссылка */
|
|
4
|
-
export declare function Link<T extends ElementType = 'a'>({ text, className, textMode, size, purpose, appearance, insideText, truncateVariant, as, ...rest }: LinkProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
4
|
+
export declare function Link<T extends ElementType = 'a'>({ text, className, textMode, size, purpose, appearance, insideText, truncateVariant, truncateMaxLines, as, ...rest }: LinkProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -18,7 +18,7 @@ import styles from './styles.module.css';
|
|
|
18
18
|
/** Компонент ссылка */
|
|
19
19
|
export function Link(_a) {
|
|
20
20
|
var _b, _c;
|
|
21
|
-
var { text = '', className, textMode = TEXT_MODE.Default, size = SIZE.S, purpose = PURPOSE.Body, appearance = APPEARANCE.Primary, insideText = false, truncateVariant, as } = _a, rest = __rest(_a, ["text", "className", "textMode", "size", "purpose", "appearance", "insideText", "truncateVariant", "as"]);
|
|
21
|
+
var { text = '', className, textMode = TEXT_MODE.Default, size = SIZE.S, purpose = PURPOSE.Body, appearance = APPEARANCE.Primary, insideText = false, truncateVariant, truncateMaxLines = 1, as } = _a, rest = __rest(_a, ["text", "className", "textMode", "size", "purpose", "appearance", "insideText", "truncateVariant", "truncateMaxLines", "as"]);
|
|
22
22
|
const Component = as || 'a';
|
|
23
23
|
let fallbackProps;
|
|
24
24
|
if (Component === 'a') {
|
|
@@ -31,5 +31,5 @@ export function Link(_a) {
|
|
|
31
31
|
else {
|
|
32
32
|
fallbackProps = rest;
|
|
33
33
|
}
|
|
34
|
-
return (_jsx(Component, Object.assign({ className: cn(styles.link, className) }, fallbackProps, { "data-size": size, "data-purpose": purpose, "data-text-mode": textMode, "data-appearance": appearance, "data-inside-text": insideText || undefined, children: insideText ? text : _jsx(TruncateString, { text: text, maxLines:
|
|
34
|
+
return (_jsx(Component, Object.assign({ className: cn(styles.link, className) }, fallbackProps, { "data-size": size, "data-purpose": purpose, "data-text-mode": textMode, "data-appearance": appearance, "data-inside-text": insideText || undefined, children: insideText ? text : _jsx(TruncateString, { text: text, maxLines: truncateMaxLines, variant: truncateVariant }) })));
|
|
35
35
|
}
|
|
@@ -6,6 +6,32 @@ export type Appearance = ValueOf<typeof APPEARANCE>;
|
|
|
6
6
|
export type Size = ValueOf<typeof SIZE>;
|
|
7
7
|
export type Purpose = ValueOf<typeof PURPOSE>;
|
|
8
8
|
export type TextMode = ValueOf<typeof TEXT_MODE>;
|
|
9
|
+
type TruncateEndProps = {
|
|
10
|
+
/**
|
|
11
|
+
* Вариант обрезания строки:
|
|
12
|
+
*
|
|
13
|
+
* - `end` — с конца;
|
|
14
|
+
* - `middle` — посередине
|
|
15
|
+
*/
|
|
16
|
+
truncateVariant?: Extract<TruncateStringProps['variant'], 'end'>;
|
|
17
|
+
/**
|
|
18
|
+
* Максимальное кол-во строк, до которого может сворачиваться текст ссылки.
|
|
19
|
+
* @remarks Применяется только при `truncateVariant === 'end'`.
|
|
20
|
+
* @default 1
|
|
21
|
+
*/
|
|
22
|
+
truncateMaxLines?: number;
|
|
23
|
+
};
|
|
24
|
+
type TruncateMiddleProps = {
|
|
25
|
+
/**
|
|
26
|
+
* Вариант обрезания строки:
|
|
27
|
+
*
|
|
28
|
+
* - `end` — с конца;
|
|
29
|
+
* - `middle` — посередине
|
|
30
|
+
*/
|
|
31
|
+
truncateVariant?: Extract<TruncateStringProps['variant'], 'middle'>;
|
|
32
|
+
truncateMaxLines?: never;
|
|
33
|
+
};
|
|
34
|
+
type TruncateProps = TruncateEndProps | TruncateMiddleProps;
|
|
9
35
|
export type BaseProps = WithSupportProps<{
|
|
10
36
|
/** Текст ссылки */
|
|
11
37
|
text?: string;
|
|
@@ -27,14 +53,8 @@ export type BaseProps = WithSupportProps<{
|
|
|
27
53
|
textMode?: TextMode;
|
|
28
54
|
/** Находится ли ссылка внутри текста (и можно ли её переносить) */
|
|
29
55
|
insideText?: boolean;
|
|
30
|
-
/**
|
|
31
|
-
* Вариант обрезания строки:
|
|
32
|
-
* <br> - `end` - с конца;
|
|
33
|
-
* <br> - `middle` - по середине
|
|
34
|
-
* */
|
|
35
|
-
truncateVariant?: TruncateStringProps['variant'];
|
|
36
56
|
}>;
|
|
37
|
-
export type LinkProps<T extends ElementType = 'a'> = BaseProps & {
|
|
57
|
+
export type LinkProps<T extends ElementType = 'a'> = BaseProps & TruncateProps & {
|
|
38
58
|
/**
|
|
39
59
|
*
|
|
40
60
|
* Полиморфный компонент.
|
|
@@ -42,16 +62,19 @@ export type LinkProps<T extends ElementType = 'a'> = BaseProps & {
|
|
|
42
62
|
* Оформить переданный компонент или html элемент в стиль ссылки.
|
|
43
63
|
*
|
|
44
64
|
* Список атрибутов, которые переданный компонент должен принять:
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
65
|
+
* - `className`
|
|
66
|
+
* - `data-size`
|
|
67
|
+
* - `data-text-mode`
|
|
68
|
+
* - `data-appearance`
|
|
69
|
+
* - `data-inside-text`
|
|
50
70
|
*
|
|
51
71
|
* @type ComponentType | ElementType
|
|
52
72
|
* @default 'a'
|
|
53
73
|
*
|
|
54
|
-
|
|
74
|
+
*/
|
|
55
75
|
as?: T;
|
|
56
76
|
} & Omit<ComponentPropsWithoutRef<ElementType extends T ? 'a' : T>, keyof BaseProps>;
|
|
57
|
-
|
|
77
|
+
/** Сохраняет дискриминацию union при выборе полей (в отличие от `Pick` по union). */
|
|
78
|
+
type DistributivePick<T, K extends keyof T> = T extends unknown ? Pick<T, K> : never;
|
|
79
|
+
export type PickLinkProps<T extends ElementType, SelectedKeys extends keyof LinkProps<T>> = DistributivePick<LinkProps<T>, SelectedKeys> & Omit<ComponentPropsWithoutRef<ElementType extends T ? 'a' : T>, keyof BaseProps>;
|
|
80
|
+
export {};
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
6
|
"title": "Link",
|
|
7
|
-
"version": "0.
|
|
7
|
+
"version": "0.18.0",
|
|
8
8
|
"sideEffects": [
|
|
9
9
|
"*.css",
|
|
10
10
|
"*.woff",
|
|
@@ -40,5 +40,5 @@
|
|
|
40
40
|
"@snack-uikit/utils": "4.0.1",
|
|
41
41
|
"classnames": "2.5.1"
|
|
42
42
|
},
|
|
43
|
-
"gitHead": "
|
|
43
|
+
"gitHead": "5c39afb3bd0a8cf9cd69992e1d390791c1434531"
|
|
44
44
|
}
|
package/src/components/Link.tsx
CHANGED
|
@@ -18,6 +18,7 @@ export function Link<T extends ElementType = 'a'>({
|
|
|
18
18
|
appearance = APPEARANCE.Primary,
|
|
19
19
|
insideText = false,
|
|
20
20
|
truncateVariant,
|
|
21
|
+
truncateMaxLines = 1,
|
|
21
22
|
as,
|
|
22
23
|
...rest
|
|
23
24
|
}: LinkProps<T>) {
|
|
@@ -48,7 +49,7 @@ export function Link<T extends ElementType = 'a'>({
|
|
|
48
49
|
data-appearance={appearance}
|
|
49
50
|
data-inside-text={insideText || undefined}
|
|
50
51
|
>
|
|
51
|
-
{insideText ? text : <TruncateString text={text} maxLines={
|
|
52
|
+
{insideText ? text : <TruncateString text={text} maxLines={truncateMaxLines} variant={truncateVariant} />}
|
|
52
53
|
</Component>
|
|
53
54
|
);
|
|
54
55
|
}
|
package/src/components/types.ts
CHANGED
|
@@ -13,6 +13,35 @@ export type Purpose = ValueOf<typeof PURPOSE>;
|
|
|
13
13
|
|
|
14
14
|
export type TextMode = ValueOf<typeof TEXT_MODE>;
|
|
15
15
|
|
|
16
|
+
type TruncateEndProps = {
|
|
17
|
+
/**
|
|
18
|
+
* Вариант обрезания строки:
|
|
19
|
+
*
|
|
20
|
+
* - `end` — с конца;
|
|
21
|
+
* - `middle` — посередине
|
|
22
|
+
*/
|
|
23
|
+
truncateVariant?: Extract<TruncateStringProps['variant'], 'end'>;
|
|
24
|
+
/**
|
|
25
|
+
* Максимальное кол-во строк, до которого может сворачиваться текст ссылки.
|
|
26
|
+
* @remarks Применяется только при `truncateVariant === 'end'`.
|
|
27
|
+
* @default 1
|
|
28
|
+
*/
|
|
29
|
+
truncateMaxLines?: number;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
type TruncateMiddleProps = {
|
|
33
|
+
/**
|
|
34
|
+
* Вариант обрезания строки:
|
|
35
|
+
*
|
|
36
|
+
* - `end` — с конца;
|
|
37
|
+
* - `middle` — посередине
|
|
38
|
+
*/
|
|
39
|
+
truncateVariant?: Extract<TruncateStringProps['variant'], 'middle'>;
|
|
40
|
+
truncateMaxLines?: never;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
type TruncateProps = TruncateEndProps | TruncateMiddleProps;
|
|
44
|
+
|
|
16
45
|
export type BaseProps = WithSupportProps<{
|
|
17
46
|
/** Текст ссылки */
|
|
18
47
|
text?: string;
|
|
@@ -34,36 +63,34 @@ export type BaseProps = WithSupportProps<{
|
|
|
34
63
|
textMode?: TextMode;
|
|
35
64
|
/** Находится ли ссылка внутри текста (и можно ли её переносить) */
|
|
36
65
|
insideText?: boolean;
|
|
37
|
-
/**
|
|
38
|
-
* Вариант обрезания строки:
|
|
39
|
-
* <br> - `end` - с конца;
|
|
40
|
-
* <br> - `middle` - по середине
|
|
41
|
-
* */
|
|
42
|
-
truncateVariant?: TruncateStringProps['variant'];
|
|
43
66
|
}>;
|
|
44
67
|
|
|
45
|
-
export type LinkProps<T extends ElementType = 'a'> = BaseProps &
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
68
|
+
export type LinkProps<T extends ElementType = 'a'> = BaseProps &
|
|
69
|
+
TruncateProps & {
|
|
70
|
+
/**
|
|
71
|
+
*
|
|
72
|
+
* Полиморфный компонент.
|
|
73
|
+
*
|
|
74
|
+
* Оформить переданный компонент или html элемент в стиль ссылки.
|
|
75
|
+
*
|
|
76
|
+
* Список атрибутов, которые переданный компонент должен принять:
|
|
77
|
+
* - `className`
|
|
78
|
+
* - `data-size`
|
|
79
|
+
* - `data-text-mode`
|
|
80
|
+
* - `data-appearance`
|
|
81
|
+
* - `data-inside-text`
|
|
82
|
+
*
|
|
83
|
+
* @type ComponentType | ElementType
|
|
84
|
+
* @default 'a'
|
|
85
|
+
*
|
|
86
|
+
*/
|
|
87
|
+
as?: T;
|
|
88
|
+
} & Omit<ComponentPropsWithoutRef<ElementType extends T ? 'a' : T>, keyof BaseProps>;
|
|
89
|
+
|
|
90
|
+
/** Сохраняет дискриминацию union при выборе полей (в отличие от `Pick` по union). */
|
|
91
|
+
type DistributivePick<T, K extends keyof T> = T extends unknown ? Pick<T, K> : never;
|
|
65
92
|
|
|
66
|
-
export type PickLinkProps<T extends ElementType, SelectedKeys extends keyof LinkProps<T>> =
|
|
93
|
+
export type PickLinkProps<T extends ElementType, SelectedKeys extends keyof LinkProps<T>> = DistributivePick<
|
|
67
94
|
LinkProps<T>,
|
|
68
95
|
SelectedKeys
|
|
69
96
|
> &
|