@cloud-ru/ds-site-card-vacancy 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,177 @@
1
+ @charset "UTF-8";
2
+ .background{
3
+ pointer-events:none;
4
+ position:absolute;
5
+ inset:0;
6
+ overflow:hidden;
7
+ border-radius:inherit;
8
+ }
9
+
10
+ .stateLayer{
11
+ pointer-events:none;
12
+ position:absolute;
13
+ inset:0;
14
+ border-radius:inherit;
15
+ }
16
+
17
+ .content{
18
+ position:relative;
19
+ z-index:1;
20
+ display:flex;
21
+ flex:1 0 0;
22
+ flex-direction:column;
23
+ align-items:flex-start;
24
+ justify-content:space-between;
25
+ min-width:0;
26
+ overflow-wrap:break-word;
27
+ }
28
+
29
+ .title{
30
+ overflow:hidden;
31
+ display:-webkit-box;
32
+ -webkit-box-orient:vertical;
33
+ -webkit-line-clamp:2;
34
+ width:100%;
35
+ min-width:0;
36
+ text-overflow:ellipsis;
37
+ }
38
+
39
+ .description{
40
+ overflow:hidden;
41
+ width:100%;
42
+ min-width:0;
43
+ text-overflow:ellipsis;
44
+ white-space:nowrap;
45
+ }
46
+
47
+ .cardVacancy{
48
+ cursor:pointer;
49
+ position:relative;
50
+ display:flex;
51
+ box-sizing:border-box;
52
+ width:100%;
53
+ min-height:160px;
54
+ margin:0;
55
+ padding:var(--sn-primitive-dimension-24, 24px);
56
+ border:none;
57
+ font-family:inherit;
58
+ text-align:left;
59
+ text-decoration:none;
60
+ background:transparent;
61
+ outline:0;
62
+ outline-offset:0;
63
+ }
64
+ .cardVacancy[data-mobile]{
65
+ min-height:120px;
66
+ }
67
+ .cardVacancy:focus-visible{
68
+ outline:var(--sn-primitive-strokeWeight-strokeSemiBold, 2px) solid var(--sn-theme-color-available-complementary, #000000);
69
+ outline-offset:calc(var(--sn-primitive-strokeWeight-strokeSemiBold, 2px) * -1);
70
+ }
71
+ .cardVacancy:active{
72
+ outline:none;
73
+ }
74
+ .cardVacancy[data-appearance=neutral]{
75
+ color:var(--sn-theme-color-available-version-textMain, var(--sn-brand-color-text-version-main, #41424e));
76
+ }
77
+ .cardVacancy[data-appearance=neutral] .background{
78
+ background-color:var(--sn-theme-color-neutral-decorTransparent, var(--sn-brand-color-neutral-transparent-forLightMode, rgba(124, 131, 182, 0.0784313725)));
79
+ }
80
+ .cardVacancy[data-appearance=neutral] .description{
81
+ color:var(--sn-theme-color-available-version-textDisabled, var(--sn-brand-color-text-version-disabled, rgba(65, 66, 78, 0.3490196078)));
82
+ }
83
+ .cardVacancy[data-appearance=primary]{
84
+ color:var(--sn-theme-color-primary-onAccent, var(--sn-brand-color-primary-onAccentLight, var(--sn-brandRole-color-brandA-onAccentLight, var(--sn-primitive-color-brandA-99, #fbfffc))));
85
+ }
86
+ .cardVacancy[data-appearance=primary] .background{
87
+ background-color:var(--sn-theme-color-primary-accent, var(--sn-brand-color-primary-55, var(--sn-brandRole-color-brandA-55, var(--sn-primitive-color-brandA-55, #389f74))));
88
+ }
89
+ .cardVacancy[data-appearance=primary] .background::after{
90
+ content:"";
91
+ position:absolute;
92
+ inset:0;
93
+ background-image:repeating-radial-gradient(circle at 0% calc(100% + var(--sn-primitive-dimension-24, 24px)), transparent 0, transparent calc(var(--sn-primitive-dimension-32, 32px) - var(--sn-primitive-strokeWeight-strokeBold, 3px)), var(--sn-theme-color-primary-text, var(--sn-brand-color-primary-45, var(--sn-brandRole-color-brandA-45, var(--sn-primitive-color-brandA-45, #22775b)))) calc(var(--sn-primitive-dimension-32, 32px) - var(--sn-primitive-strokeWeight-strokeBold, 3px)), var(--sn-theme-color-primary-text, var(--sn-brand-color-primary-45, var(--sn-brandRole-color-brandA-45, var(--sn-primitive-color-brandA-45, #22775b)))) var(--sn-primitive-dimension-32, 32px));
94
+ }
95
+ .cardVacancy .stateLayer{
96
+ position:absolute;
97
+ inset:0;
98
+ border-radius:inherit;
99
+ }
100
+ .cardVacancy .stateLayer[data-state=borderOnBackground]{
101
+ border-color:var(--sn-theme-color-material-stateLayer-neutral-border-default-borderColor, var(--sn-brand-color-state-neutralBorder-forLightMode-default-borderColor, rgba(159, 166, 198, 0.3019607843)));
102
+ border-style:solid;
103
+ border-width:var(--sn-primitive-strokeWeight-strokeRegular, 1px);
104
+ }
105
+ .cardVacancy .stateLayer[data-state=emptyNeutralOnBackground]{
106
+ background:var(--sn-theme-color-material-stateLayer-neutral-onBackground-defaultEmpty-filled, var(--sn-brand-color-state-neutral-forLightMode-default-background, rgba(120, 123, 138, 0)));
107
+ }
108
+ .cardVacancy .stateLayer[data-state=activatedOnBackground]{
109
+ background:var(--sn-theme-color-material-stateLayer-activated-default-filled, var(--sn-brand-color-state-activated-default-background, var(--sn-brandRole-color-brandA-backgroundActivatedDefault, rgba(56, 159, 116, 0.1490196078))));
110
+ }
111
+ .cardVacancy .stateLayer[data-state=versionOnColor]{
112
+ background:var(--sn-theme-color-material-stateLayer-versionOnColor-default-filled, rgba(0, 0, 0, 0.0509803922));
113
+ }
114
+ .cardVacancy .stateLayer[data-state=emptyVersionOnColor]{
115
+ background:var(--sn-theme-color-material-stateLayer-versionOnColor-defaultEmpty-filled, rgba(0, 0, 0, 0));
116
+ }
117
+ .cardVacancy .stateLayer[data-state=inversionOnColor]{
118
+ background:var(--sn-theme-color-material-stateLayer-inversionOnColor-default-filled, rgba(255, 255, 255, 0.1019607843));
119
+ }
120
+ .cardVacancy .stateLayer[data-state=emptyInversionOnColor]{
121
+ background:var(--sn-theme-color-material-stateLayer-inversionOnColor-defaultEmpty-filled, rgba(255, 255, 255, 0));
122
+ }
123
+ .cardVacancy .stateLayer[data-state=emptyDarkOnAccent]{
124
+ background:var(--sn-theme-color-material-stateLayer-darkOnAccent-defaultEmpty-filled, rgba(0, 0, 0, 0));
125
+ }
126
+ @media (hover: hover){
127
+ .cardVacancy:hover:not([data-disabled], [data-loading]) .stateLayer[data-state=borderOnBackground]{
128
+ border-color:var(--sn-theme-color-material-stateLayer-neutral-border-hovered-borderColor, var(--sn-brand-color-state-neutralBorder-forLightMode-hovered-borderColor, rgba(159, 166, 198, 0.6509803922)));
129
+ }
130
+ .cardVacancy:hover:not([data-disabled], [data-loading]) .stateLayer[data-state=emptyNeutralOnBackground]{
131
+ background:var(--sn-theme-color-material-stateLayer-neutral-onBackground-hovered-filled, var(--sn-brand-color-state-neutral-forLightMode-hovered-background, rgba(188, 195, 220, 0.1490196078)));
132
+ }
133
+ .cardVacancy:hover:not([data-disabled], [data-loading]) .stateLayer[data-state=activatedOnBackground]{
134
+ background:var(--sn-theme-color-material-stateLayer-activated-hovered-filled, var(--sn-brand-color-state-activated-hovered-background, var(--sn-brandRole-color-brandA-backgroundActivatedHovered, rgba(56, 159, 116, 0.3490196078))));
135
+ }
136
+ .cardVacancy:hover:not([data-disabled], [data-loading]) .stateLayer[data-state=versionOnColor]{
137
+ background:var(--sn-theme-color-material-stateLayer-versionOnColor-hovered-filled, rgba(0, 0, 0, 0.1019607843));
138
+ }
139
+ .cardVacancy:hover:not([data-disabled], [data-loading]) .stateLayer[data-state=emptyVersionOnColor]{
140
+ background:var(--sn-theme-color-material-stateLayer-versionOnColor-hovered-filled, rgba(0, 0, 0, 0.1019607843));
141
+ }
142
+ .cardVacancy:hover:not([data-disabled], [data-loading]) .stateLayer[data-state=inversionOnColor]{
143
+ background:var(--sn-theme-color-material-stateLayer-inversionOnColor-hovered-filled, rgba(255, 255, 255, 0.1490196078));
144
+ }
145
+ .cardVacancy:hover:not([data-disabled], [data-loading]) .stateLayer[data-state=emptyInversionOnColor]{
146
+ background:var(--sn-theme-color-material-stateLayer-inversionOnColor-hovered-filled, rgba(255, 255, 255, 0.1490196078));
147
+ }
148
+ .cardVacancy:hover:not([data-disabled], [data-loading]) .stateLayer[data-state=emptyDarkOnAccent]{
149
+ background:var(--sn-theme-color-material-stateLayer-darkOnAccent-hovered-filled, rgba(0, 0, 0, 0.0588235294));
150
+ }
151
+ }
152
+ .cardVacancy{
153
+ }
154
+ .cardVacancy[data-loading] .stateLayer[data-state=borderOnBackground], .cardVacancy:active:not([data-disabled], [data-loading]) .stateLayer[data-state=borderOnBackground], .cardVacancy[data-pressed=true]:not([data-disabled], [data-loading]) .stateLayer[data-state=borderOnBackground]{
155
+ border-color:var(--sn-theme-color-material-stateLayer-neutral-border-pressed-borderColor, var(--sn-brand-color-state-neutralBorder-forLightMode-pressed-borderColor, rgba(159, 166, 198, 0.8)));
156
+ }
157
+ .cardVacancy[data-loading] .stateLayer[data-state=emptyNeutralOnBackground], .cardVacancy:active:not([data-disabled], [data-loading]) .stateLayer[data-state=emptyNeutralOnBackground], .cardVacancy[data-pressed=true]:not([data-disabled], [data-loading]) .stateLayer[data-state=emptyNeutralOnBackground]{
158
+ background:var(--sn-theme-color-material-stateLayer-neutral-onBackground-pressed-filled, var(--sn-brand-color-state-neutral-forLightMode-pressed-background, rgba(188, 195, 220, 0.3019607843)));
159
+ }
160
+ .cardVacancy[data-loading] .stateLayer[data-state=activatedOnBackground], .cardVacancy:active:not([data-disabled], [data-loading]) .stateLayer[data-state=activatedOnBackground], .cardVacancy[data-pressed=true]:not([data-disabled], [data-loading]) .stateLayer[data-state=activatedOnBackground]{
161
+ background:var(--sn-theme-color-material-stateLayer-activated-pressed-filled, var(--sn-brand-color-state-activated-pressed-background, var(--sn-brandRole-color-brandA-backgroundActivatedPressed, rgba(56, 159, 116, 0.4509803922))));
162
+ }
163
+ .cardVacancy[data-loading] .stateLayer[data-state=versionOnColor], .cardVacancy:active:not([data-disabled], [data-loading]) .stateLayer[data-state=versionOnColor], .cardVacancy[data-pressed=true]:not([data-disabled], [data-loading]) .stateLayer[data-state=versionOnColor]{
164
+ background:var(--sn-theme-color-material-stateLayer-versionOnColor-pressed-filled, rgba(0, 0, 0, 0.1490196078));
165
+ }
166
+ .cardVacancy[data-loading] .stateLayer[data-state=emptyVersionOnColor], .cardVacancy:active:not([data-disabled], [data-loading]) .stateLayer[data-state=emptyVersionOnColor], .cardVacancy[data-pressed=true]:not([data-disabled], [data-loading]) .stateLayer[data-state=emptyVersionOnColor]{
167
+ background:var(--sn-theme-color-material-stateLayer-versionOnColor-pressed-filled, rgba(0, 0, 0, 0.1490196078));
168
+ }
169
+ .cardVacancy[data-loading] .stateLayer[data-state=inversionOnColor], .cardVacancy:active:not([data-disabled], [data-loading]) .stateLayer[data-state=inversionOnColor], .cardVacancy[data-pressed=true]:not([data-disabled], [data-loading]) .stateLayer[data-state=inversionOnColor]{
170
+ background:var(--sn-theme-color-material-stateLayer-inversionOnColor-pressed-filled, rgba(255, 255, 255, 0.0509803922));
171
+ }
172
+ .cardVacancy[data-loading] .stateLayer[data-state=emptyInversionOnColor], .cardVacancy:active:not([data-disabled], [data-loading]) .stateLayer[data-state=emptyInversionOnColor], .cardVacancy[data-pressed=true]:not([data-disabled], [data-loading]) .stateLayer[data-state=emptyInversionOnColor]{
173
+ background:var(--sn-theme-color-material-stateLayer-inversionOnColor-pressed-filled, rgba(255, 255, 255, 0.0509803922));
174
+ }
175
+ .cardVacancy[data-loading] .stateLayer[data-state=emptyDarkOnAccent], .cardVacancy:active:not([data-disabled], [data-loading]) .stateLayer[data-state=emptyDarkOnAccent], .cardVacancy[data-pressed=true]:not([data-disabled], [data-loading]) .stateLayer[data-state=emptyDarkOnAccent]{
176
+ background:var(--sn-theme-color-material-stateLayer-darkOnAccent-pressed-filled, rgba(0, 0, 0, 0.1215686275));
177
+ }
@@ -0,0 +1,29 @@
1
+ import { ValueOf, WithSupportProps } from '@cloud-ru/ds-utils';
2
+ import { ComponentPropsWithoutRef, ComponentPropsWithRef, ElementType } from 'react';
3
+ import { APPEARANCE } from './constants';
4
+ export type PolymorphicRef<T extends ElementType> = ComponentPropsWithRef<T>['ref'];
5
+ export type Appearance = ValueOf<typeof APPEARANCE>;
6
+ type BaseCardVacancyProps = {
7
+ /** Заголовок вакансии. Обрезается многоточием, если не помещается в одну строку. */
8
+ title?: string;
9
+ /** Описание под заголовком. Обрезается многоточием, если не помещается в одну строку. */
10
+ description?: string;
11
+ /**
12
+ * Визуальный вид карточки:
13
+ *
14
+ * - `neutral` — нейтральный полупрозрачный фон, тёмный заголовок.
15
+ * - `primary` — акцентный фон `primary` с декоративным паттерном, текст `onAccent`.
16
+ */
17
+ appearance?: Appearance;
18
+ /** Компактная мобильная версия — меньшая высота и более мелкая типографика. */
19
+ mobile?: boolean;
20
+ /** CSS-класс корневого элемента. */
21
+ className?: string;
22
+ };
23
+ export type CardVacancyProps<T extends ElementType = 'a'> = WithSupportProps<BaseCardVacancyProps & {
24
+ /** Полиморфный тег корня — `'a'` по умолчанию (карточка-ссылка), либо роутерный `Link` / `'button'` / `'div'`. */
25
+ as?: T;
26
+ /** Ref на корневой элемент. */
27
+ innerRef?: PolymorphicRef<T>;
28
+ } & Omit<ComponentPropsWithoutRef<T>, keyof BaseCardVacancyProps | 'as' | 'ref'>>;
29
+ export {};
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,3 @@
1
+ import { ElementType } from 'react';
2
+ import { CardVacancyProps } from './types.js';
3
+ export declare function CardVacancy<T extends ElementType = 'a'>({ as: asProp, innerRef, className, appearance, mobile, title, description, ...rest }: CardVacancyProps<T>): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,15 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Typography } from '@cloud-ru/ds-typography';
3
+ import { withInnerRefSupport } from '@cloud-ru/ds-utils';
4
+ import cn from 'classnames';
5
+ import { APPEARANCE, TEST_IDS } from './constants.js';
6
+ import styles from './styles.module.css';
7
+ export function CardVacancy({ as: asProp, innerRef, className, appearance = APPEARANCE.Neutral, mobile = false, title, description, ...rest }) {
8
+ const Tag = asProp ?? 'a';
9
+ const restProps = rest;
10
+ const isAnchor = !asProp || asProp === 'a';
11
+ const isExternal = isAnchor && restProps.target === '_blank';
12
+ const rel = isExternal ? 'noopener noreferrer' : restProps.rel;
13
+ return (_jsxs(Tag, { ...restProps, rel: rel, ref: innerRef, className: cn(styles.cardVacancy, className), "data-test-id": restProps['data-test-id'] ?? TEST_IDS.root, "data-appearance": appearance, "data-mobile": mobile || undefined, children: [_jsx("span", { className: styles.background, "aria-hidden": true }), _jsx("span", { className: styles.stateLayer, "data-state": 'emptyNeutralOnBackground', "aria-hidden": true }), _jsxs("span", { className: styles.content, children: [_jsx(Typography, { as: 'span', className: styles.title, variant: 'title', size: mobile ? 'm' : 'l', "data-test-id": TEST_IDS.title, children: title }), _jsx(Typography, { as: 'span', className: styles.description, variant: 'body', size: mobile ? 's' : 'm', "data-test-id": TEST_IDS.description, children: description })] })] }));
14
+ }
15
+ withInnerRefSupport(CardVacancy);
@@ -0,0 +1,9 @@
1
+ export declare const APPEARANCE: {
2
+ readonly Neutral: "neutral";
3
+ readonly Primary: "primary";
4
+ };
5
+ export declare const TEST_IDS: {
6
+ readonly root: "card-vacancy";
7
+ readonly title: "card-vacancy__title";
8
+ readonly description: "card-vacancy__description";
9
+ };
@@ -0,0 +1,10 @@
1
+ const PREFIX = 'card-vacancy';
2
+ export const APPEARANCE = {
3
+ Neutral: 'neutral',
4
+ Primary: 'primary',
5
+ };
6
+ export const TEST_IDS = {
7
+ root: PREFIX,
8
+ title: `${PREFIX}__title`,
9
+ description: `${PREFIX}__description`,
10
+ };
@@ -0,0 +1,3 @@
1
+ export * from './CardVacancy.js';
2
+ export * from './constants.js';
3
+ export * from './types.js';
@@ -0,0 +1,3 @@
1
+ export * from './CardVacancy.js';
2
+ export * from './constants.js';
3
+ export * from './types.js';
@@ -0,0 +1,177 @@
1
+ @charset "UTF-8";
2
+ .background{
3
+ pointer-events:none;
4
+ position:absolute;
5
+ inset:0;
6
+ overflow:hidden;
7
+ border-radius:inherit;
8
+ }
9
+
10
+ .stateLayer{
11
+ pointer-events:none;
12
+ position:absolute;
13
+ inset:0;
14
+ border-radius:inherit;
15
+ }
16
+
17
+ .content{
18
+ position:relative;
19
+ z-index:1;
20
+ display:flex;
21
+ flex:1 0 0;
22
+ flex-direction:column;
23
+ align-items:flex-start;
24
+ justify-content:space-between;
25
+ min-width:0;
26
+ overflow-wrap:break-word;
27
+ }
28
+
29
+ .title{
30
+ overflow:hidden;
31
+ display:-webkit-box;
32
+ -webkit-box-orient:vertical;
33
+ -webkit-line-clamp:2;
34
+ width:100%;
35
+ min-width:0;
36
+ text-overflow:ellipsis;
37
+ }
38
+
39
+ .description{
40
+ overflow:hidden;
41
+ width:100%;
42
+ min-width:0;
43
+ text-overflow:ellipsis;
44
+ white-space:nowrap;
45
+ }
46
+
47
+ .cardVacancy{
48
+ cursor:pointer;
49
+ position:relative;
50
+ display:flex;
51
+ box-sizing:border-box;
52
+ width:100%;
53
+ min-height:160px;
54
+ margin:0;
55
+ padding:var(--sn-primitive-dimension-24, 24px);
56
+ border:none;
57
+ font-family:inherit;
58
+ text-align:left;
59
+ text-decoration:none;
60
+ background:transparent;
61
+ outline:0;
62
+ outline-offset:0;
63
+ }
64
+ .cardVacancy[data-mobile]{
65
+ min-height:120px;
66
+ }
67
+ .cardVacancy:focus-visible{
68
+ outline:var(--sn-primitive-strokeWeight-strokeSemiBold, 2px) solid var(--sn-theme-color-available-complementary, #000000);
69
+ outline-offset:calc(var(--sn-primitive-strokeWeight-strokeSemiBold, 2px) * -1);
70
+ }
71
+ .cardVacancy:active{
72
+ outline:none;
73
+ }
74
+ .cardVacancy[data-appearance=neutral]{
75
+ color:var(--sn-theme-color-available-version-textMain, var(--sn-brand-color-text-version-main, #41424e));
76
+ }
77
+ .cardVacancy[data-appearance=neutral] .background{
78
+ background-color:var(--sn-theme-color-neutral-decorTransparent, var(--sn-brand-color-neutral-transparent-forLightMode, rgba(124, 131, 182, 0.0784313725)));
79
+ }
80
+ .cardVacancy[data-appearance=neutral] .description{
81
+ color:var(--sn-theme-color-available-version-textDisabled, var(--sn-brand-color-text-version-disabled, rgba(65, 66, 78, 0.3490196078)));
82
+ }
83
+ .cardVacancy[data-appearance=primary]{
84
+ color:var(--sn-theme-color-primary-onAccent, var(--sn-brand-color-primary-onAccentLight, var(--sn-brandRole-color-brandA-onAccentLight, var(--sn-primitive-color-brandA-99, #fbfffc))));
85
+ }
86
+ .cardVacancy[data-appearance=primary] .background{
87
+ background-color:var(--sn-theme-color-primary-accent, var(--sn-brand-color-primary-55, var(--sn-brandRole-color-brandA-55, var(--sn-primitive-color-brandA-55, #389f74))));
88
+ }
89
+ .cardVacancy[data-appearance=primary] .background::after{
90
+ content:"";
91
+ position:absolute;
92
+ inset:0;
93
+ background-image:repeating-radial-gradient(circle at 0% calc(100% + var(--sn-primitive-dimension-24, 24px)), transparent 0, transparent calc(var(--sn-primitive-dimension-32, 32px) - var(--sn-primitive-strokeWeight-strokeBold, 3px)), var(--sn-theme-color-primary-text, var(--sn-brand-color-primary-45, var(--sn-brandRole-color-brandA-45, var(--sn-primitive-color-brandA-45, #22775b)))) calc(var(--sn-primitive-dimension-32, 32px) - var(--sn-primitive-strokeWeight-strokeBold, 3px)), var(--sn-theme-color-primary-text, var(--sn-brand-color-primary-45, var(--sn-brandRole-color-brandA-45, var(--sn-primitive-color-brandA-45, #22775b)))) var(--sn-primitive-dimension-32, 32px));
94
+ }
95
+ .cardVacancy .stateLayer{
96
+ position:absolute;
97
+ inset:0;
98
+ border-radius:inherit;
99
+ }
100
+ .cardVacancy .stateLayer[data-state=borderOnBackground]{
101
+ border-color:var(--sn-theme-color-material-stateLayer-neutral-border-default-borderColor, var(--sn-brand-color-state-neutralBorder-forLightMode-default-borderColor, rgba(159, 166, 198, 0.3019607843)));
102
+ border-style:solid;
103
+ border-width:var(--sn-primitive-strokeWeight-strokeRegular, 1px);
104
+ }
105
+ .cardVacancy .stateLayer[data-state=emptyNeutralOnBackground]{
106
+ background:var(--sn-theme-color-material-stateLayer-neutral-onBackground-defaultEmpty-filled, var(--sn-brand-color-state-neutral-forLightMode-default-background, rgba(120, 123, 138, 0)));
107
+ }
108
+ .cardVacancy .stateLayer[data-state=activatedOnBackground]{
109
+ background:var(--sn-theme-color-material-stateLayer-activated-default-filled, var(--sn-brand-color-state-activated-default-background, var(--sn-brandRole-color-brandA-backgroundActivatedDefault, rgba(56, 159, 116, 0.1490196078))));
110
+ }
111
+ .cardVacancy .stateLayer[data-state=versionOnColor]{
112
+ background:var(--sn-theme-color-material-stateLayer-versionOnColor-default-filled, rgba(0, 0, 0, 0.0509803922));
113
+ }
114
+ .cardVacancy .stateLayer[data-state=emptyVersionOnColor]{
115
+ background:var(--sn-theme-color-material-stateLayer-versionOnColor-defaultEmpty-filled, rgba(0, 0, 0, 0));
116
+ }
117
+ .cardVacancy .stateLayer[data-state=inversionOnColor]{
118
+ background:var(--sn-theme-color-material-stateLayer-inversionOnColor-default-filled, rgba(255, 255, 255, 0.1019607843));
119
+ }
120
+ .cardVacancy .stateLayer[data-state=emptyInversionOnColor]{
121
+ background:var(--sn-theme-color-material-stateLayer-inversionOnColor-defaultEmpty-filled, rgba(255, 255, 255, 0));
122
+ }
123
+ .cardVacancy .stateLayer[data-state=emptyDarkOnAccent]{
124
+ background:var(--sn-theme-color-material-stateLayer-darkOnAccent-defaultEmpty-filled, rgba(0, 0, 0, 0));
125
+ }
126
+ @media (hover: hover){
127
+ .cardVacancy:hover:not([data-disabled], [data-loading]) .stateLayer[data-state=borderOnBackground]{
128
+ border-color:var(--sn-theme-color-material-stateLayer-neutral-border-hovered-borderColor, var(--sn-brand-color-state-neutralBorder-forLightMode-hovered-borderColor, rgba(159, 166, 198, 0.6509803922)));
129
+ }
130
+ .cardVacancy:hover:not([data-disabled], [data-loading]) .stateLayer[data-state=emptyNeutralOnBackground]{
131
+ background:var(--sn-theme-color-material-stateLayer-neutral-onBackground-hovered-filled, var(--sn-brand-color-state-neutral-forLightMode-hovered-background, rgba(188, 195, 220, 0.1490196078)));
132
+ }
133
+ .cardVacancy:hover:not([data-disabled], [data-loading]) .stateLayer[data-state=activatedOnBackground]{
134
+ background:var(--sn-theme-color-material-stateLayer-activated-hovered-filled, var(--sn-brand-color-state-activated-hovered-background, var(--sn-brandRole-color-brandA-backgroundActivatedHovered, rgba(56, 159, 116, 0.3490196078))));
135
+ }
136
+ .cardVacancy:hover:not([data-disabled], [data-loading]) .stateLayer[data-state=versionOnColor]{
137
+ background:var(--sn-theme-color-material-stateLayer-versionOnColor-hovered-filled, rgba(0, 0, 0, 0.1019607843));
138
+ }
139
+ .cardVacancy:hover:not([data-disabled], [data-loading]) .stateLayer[data-state=emptyVersionOnColor]{
140
+ background:var(--sn-theme-color-material-stateLayer-versionOnColor-hovered-filled, rgba(0, 0, 0, 0.1019607843));
141
+ }
142
+ .cardVacancy:hover:not([data-disabled], [data-loading]) .stateLayer[data-state=inversionOnColor]{
143
+ background:var(--sn-theme-color-material-stateLayer-inversionOnColor-hovered-filled, rgba(255, 255, 255, 0.1490196078));
144
+ }
145
+ .cardVacancy:hover:not([data-disabled], [data-loading]) .stateLayer[data-state=emptyInversionOnColor]{
146
+ background:var(--sn-theme-color-material-stateLayer-inversionOnColor-hovered-filled, rgba(255, 255, 255, 0.1490196078));
147
+ }
148
+ .cardVacancy:hover:not([data-disabled], [data-loading]) .stateLayer[data-state=emptyDarkOnAccent]{
149
+ background:var(--sn-theme-color-material-stateLayer-darkOnAccent-hovered-filled, rgba(0, 0, 0, 0.0588235294));
150
+ }
151
+ }
152
+ .cardVacancy{
153
+ }
154
+ .cardVacancy[data-loading] .stateLayer[data-state=borderOnBackground], .cardVacancy:active:not([data-disabled], [data-loading]) .stateLayer[data-state=borderOnBackground], .cardVacancy[data-pressed=true]:not([data-disabled], [data-loading]) .stateLayer[data-state=borderOnBackground]{
155
+ border-color:var(--sn-theme-color-material-stateLayer-neutral-border-pressed-borderColor, var(--sn-brand-color-state-neutralBorder-forLightMode-pressed-borderColor, rgba(159, 166, 198, 0.8)));
156
+ }
157
+ .cardVacancy[data-loading] .stateLayer[data-state=emptyNeutralOnBackground], .cardVacancy:active:not([data-disabled], [data-loading]) .stateLayer[data-state=emptyNeutralOnBackground], .cardVacancy[data-pressed=true]:not([data-disabled], [data-loading]) .stateLayer[data-state=emptyNeutralOnBackground]{
158
+ background:var(--sn-theme-color-material-stateLayer-neutral-onBackground-pressed-filled, var(--sn-brand-color-state-neutral-forLightMode-pressed-background, rgba(188, 195, 220, 0.3019607843)));
159
+ }
160
+ .cardVacancy[data-loading] .stateLayer[data-state=activatedOnBackground], .cardVacancy:active:not([data-disabled], [data-loading]) .stateLayer[data-state=activatedOnBackground], .cardVacancy[data-pressed=true]:not([data-disabled], [data-loading]) .stateLayer[data-state=activatedOnBackground]{
161
+ background:var(--sn-theme-color-material-stateLayer-activated-pressed-filled, var(--sn-brand-color-state-activated-pressed-background, var(--sn-brandRole-color-brandA-backgroundActivatedPressed, rgba(56, 159, 116, 0.4509803922))));
162
+ }
163
+ .cardVacancy[data-loading] .stateLayer[data-state=versionOnColor], .cardVacancy:active:not([data-disabled], [data-loading]) .stateLayer[data-state=versionOnColor], .cardVacancy[data-pressed=true]:not([data-disabled], [data-loading]) .stateLayer[data-state=versionOnColor]{
164
+ background:var(--sn-theme-color-material-stateLayer-versionOnColor-pressed-filled, rgba(0, 0, 0, 0.1490196078));
165
+ }
166
+ .cardVacancy[data-loading] .stateLayer[data-state=emptyVersionOnColor], .cardVacancy:active:not([data-disabled], [data-loading]) .stateLayer[data-state=emptyVersionOnColor], .cardVacancy[data-pressed=true]:not([data-disabled], [data-loading]) .stateLayer[data-state=emptyVersionOnColor]{
167
+ background:var(--sn-theme-color-material-stateLayer-versionOnColor-pressed-filled, rgba(0, 0, 0, 0.1490196078));
168
+ }
169
+ .cardVacancy[data-loading] .stateLayer[data-state=inversionOnColor], .cardVacancy:active:not([data-disabled], [data-loading]) .stateLayer[data-state=inversionOnColor], .cardVacancy[data-pressed=true]:not([data-disabled], [data-loading]) .stateLayer[data-state=inversionOnColor]{
170
+ background:var(--sn-theme-color-material-stateLayer-inversionOnColor-pressed-filled, rgba(255, 255, 255, 0.0509803922));
171
+ }
172
+ .cardVacancy[data-loading] .stateLayer[data-state=emptyInversionOnColor], .cardVacancy:active:not([data-disabled], [data-loading]) .stateLayer[data-state=emptyInversionOnColor], .cardVacancy[data-pressed=true]:not([data-disabled], [data-loading]) .stateLayer[data-state=emptyInversionOnColor]{
173
+ background:var(--sn-theme-color-material-stateLayer-inversionOnColor-pressed-filled, rgba(255, 255, 255, 0.0509803922));
174
+ }
175
+ .cardVacancy[data-loading] .stateLayer[data-state=emptyDarkOnAccent], .cardVacancy:active:not([data-disabled], [data-loading]) .stateLayer[data-state=emptyDarkOnAccent], .cardVacancy[data-pressed=true]:not([data-disabled], [data-loading]) .stateLayer[data-state=emptyDarkOnAccent]{
176
+ background:var(--sn-theme-color-material-stateLayer-darkOnAccent-pressed-filled, rgba(0, 0, 0, 0.1215686275));
177
+ }
@@ -0,0 +1,177 @@
1
+ @charset "UTF-8";
2
+ .background{
3
+ pointer-events:none;
4
+ position:absolute;
5
+ inset:0;
6
+ overflow:hidden;
7
+ border-radius:inherit;
8
+ }
9
+
10
+ .stateLayer{
11
+ pointer-events:none;
12
+ position:absolute;
13
+ inset:0;
14
+ border-radius:inherit;
15
+ }
16
+
17
+ .content{
18
+ position:relative;
19
+ z-index:1;
20
+ display:flex;
21
+ flex:1 0 0;
22
+ flex-direction:column;
23
+ align-items:flex-start;
24
+ justify-content:space-between;
25
+ min-width:0;
26
+ overflow-wrap:break-word;
27
+ }
28
+
29
+ .title{
30
+ overflow:hidden;
31
+ display:-webkit-box;
32
+ -webkit-box-orient:vertical;
33
+ -webkit-line-clamp:2;
34
+ width:100%;
35
+ min-width:0;
36
+ text-overflow:ellipsis;
37
+ }
38
+
39
+ .description{
40
+ overflow:hidden;
41
+ width:100%;
42
+ min-width:0;
43
+ text-overflow:ellipsis;
44
+ white-space:nowrap;
45
+ }
46
+
47
+ .cardVacancy{
48
+ cursor:pointer;
49
+ position:relative;
50
+ display:flex;
51
+ box-sizing:border-box;
52
+ width:100%;
53
+ min-height:160px;
54
+ margin:0;
55
+ padding:var(--sn-primitive-dimension-24, 24px);
56
+ border:none;
57
+ font-family:inherit;
58
+ text-align:left;
59
+ text-decoration:none;
60
+ background:transparent;
61
+ outline:0;
62
+ outline-offset:0;
63
+ }
64
+ .cardVacancy[data-mobile]{
65
+ min-height:120px;
66
+ }
67
+ .cardVacancy:focus-visible{
68
+ outline:var(--sn-primitive-strokeWeight-strokeSemiBold, 2px) solid var(--sn-theme-color-available-complementary, #000000);
69
+ outline-offset:calc(var(--sn-primitive-strokeWeight-strokeSemiBold, 2px) * -1);
70
+ }
71
+ .cardVacancy:active{
72
+ outline:none;
73
+ }
74
+ .cardVacancy[data-appearance=neutral]{
75
+ color:var(--sn-theme-color-available-version-textMain, var(--sn-brand-color-text-version-main, #41424e));
76
+ }
77
+ .cardVacancy[data-appearance=neutral] .background{
78
+ background-color:var(--sn-theme-color-neutral-decorTransparent, var(--sn-brand-color-neutral-transparent-forLightMode, rgba(124, 131, 182, 0.0784313725)));
79
+ }
80
+ .cardVacancy[data-appearance=neutral] .description{
81
+ color:var(--sn-theme-color-available-version-textDisabled, var(--sn-brand-color-text-version-disabled, rgba(65, 66, 78, 0.3490196078)));
82
+ }
83
+ .cardVacancy[data-appearance=primary]{
84
+ color:var(--sn-theme-color-primary-onAccent, var(--sn-brand-color-primary-onAccentLight, var(--sn-brandRole-color-brandA-onAccentLight, var(--sn-primitive-color-brandA-99, #fbfffc))));
85
+ }
86
+ .cardVacancy[data-appearance=primary] .background{
87
+ background-color:var(--sn-theme-color-primary-accent, var(--sn-brand-color-primary-55, var(--sn-brandRole-color-brandA-55, var(--sn-primitive-color-brandA-55, #389f74))));
88
+ }
89
+ .cardVacancy[data-appearance=primary] .background::after{
90
+ content:"";
91
+ position:absolute;
92
+ inset:0;
93
+ background-image:repeating-radial-gradient(circle at 0% calc(100% + var(--sn-primitive-dimension-24, 24px)), transparent 0, transparent calc(var(--sn-primitive-dimension-32, 32px) - var(--sn-primitive-strokeWeight-strokeBold, 3px)), var(--sn-theme-color-primary-text, var(--sn-brand-color-primary-45, var(--sn-brandRole-color-brandA-45, var(--sn-primitive-color-brandA-45, #22775b)))) calc(var(--sn-primitive-dimension-32, 32px) - var(--sn-primitive-strokeWeight-strokeBold, 3px)), var(--sn-theme-color-primary-text, var(--sn-brand-color-primary-45, var(--sn-brandRole-color-brandA-45, var(--sn-primitive-color-brandA-45, #22775b)))) var(--sn-primitive-dimension-32, 32px));
94
+ }
95
+ .cardVacancy .stateLayer{
96
+ position:absolute;
97
+ inset:0;
98
+ border-radius:inherit;
99
+ }
100
+ .cardVacancy .stateLayer[data-state=borderOnBackground]{
101
+ border-color:var(--sn-theme-color-material-stateLayer-neutral-border-default-borderColor, var(--sn-brand-color-state-neutralBorder-forLightMode-default-borderColor, rgba(159, 166, 198, 0.3019607843)));
102
+ border-style:solid;
103
+ border-width:var(--sn-primitive-strokeWeight-strokeRegular, 1px);
104
+ }
105
+ .cardVacancy .stateLayer[data-state=emptyNeutralOnBackground]{
106
+ background:var(--sn-theme-color-material-stateLayer-neutral-onBackground-defaultEmpty-filled, var(--sn-brand-color-state-neutral-forLightMode-default-background, rgba(120, 123, 138, 0)));
107
+ }
108
+ .cardVacancy .stateLayer[data-state=activatedOnBackground]{
109
+ background:var(--sn-theme-color-material-stateLayer-activated-default-filled, var(--sn-brand-color-state-activated-default-background, var(--sn-brandRole-color-brandA-backgroundActivatedDefault, rgba(56, 159, 116, 0.1490196078))));
110
+ }
111
+ .cardVacancy .stateLayer[data-state=versionOnColor]{
112
+ background:var(--sn-theme-color-material-stateLayer-versionOnColor-default-filled, rgba(0, 0, 0, 0.0509803922));
113
+ }
114
+ .cardVacancy .stateLayer[data-state=emptyVersionOnColor]{
115
+ background:var(--sn-theme-color-material-stateLayer-versionOnColor-defaultEmpty-filled, rgba(0, 0, 0, 0));
116
+ }
117
+ .cardVacancy .stateLayer[data-state=inversionOnColor]{
118
+ background:var(--sn-theme-color-material-stateLayer-inversionOnColor-default-filled, rgba(255, 255, 255, 0.1019607843));
119
+ }
120
+ .cardVacancy .stateLayer[data-state=emptyInversionOnColor]{
121
+ background:var(--sn-theme-color-material-stateLayer-inversionOnColor-defaultEmpty-filled, rgba(255, 255, 255, 0));
122
+ }
123
+ .cardVacancy .stateLayer[data-state=emptyDarkOnAccent]{
124
+ background:var(--sn-theme-color-material-stateLayer-darkOnAccent-defaultEmpty-filled, rgba(0, 0, 0, 0));
125
+ }
126
+ @media (hover: hover){
127
+ .cardVacancy:hover:not([data-disabled], [data-loading]) .stateLayer[data-state=borderOnBackground]{
128
+ border-color:var(--sn-theme-color-material-stateLayer-neutral-border-hovered-borderColor, var(--sn-brand-color-state-neutralBorder-forLightMode-hovered-borderColor, rgba(159, 166, 198, 0.6509803922)));
129
+ }
130
+ .cardVacancy:hover:not([data-disabled], [data-loading]) .stateLayer[data-state=emptyNeutralOnBackground]{
131
+ background:var(--sn-theme-color-material-stateLayer-neutral-onBackground-hovered-filled, var(--sn-brand-color-state-neutral-forLightMode-hovered-background, rgba(188, 195, 220, 0.1490196078)));
132
+ }
133
+ .cardVacancy:hover:not([data-disabled], [data-loading]) .stateLayer[data-state=activatedOnBackground]{
134
+ background:var(--sn-theme-color-material-stateLayer-activated-hovered-filled, var(--sn-brand-color-state-activated-hovered-background, var(--sn-brandRole-color-brandA-backgroundActivatedHovered, rgba(56, 159, 116, 0.3490196078))));
135
+ }
136
+ .cardVacancy:hover:not([data-disabled], [data-loading]) .stateLayer[data-state=versionOnColor]{
137
+ background:var(--sn-theme-color-material-stateLayer-versionOnColor-hovered-filled, rgba(0, 0, 0, 0.1019607843));
138
+ }
139
+ .cardVacancy:hover:not([data-disabled], [data-loading]) .stateLayer[data-state=emptyVersionOnColor]{
140
+ background:var(--sn-theme-color-material-stateLayer-versionOnColor-hovered-filled, rgba(0, 0, 0, 0.1019607843));
141
+ }
142
+ .cardVacancy:hover:not([data-disabled], [data-loading]) .stateLayer[data-state=inversionOnColor]{
143
+ background:var(--sn-theme-color-material-stateLayer-inversionOnColor-hovered-filled, rgba(255, 255, 255, 0.1490196078));
144
+ }
145
+ .cardVacancy:hover:not([data-disabled], [data-loading]) .stateLayer[data-state=emptyInversionOnColor]{
146
+ background:var(--sn-theme-color-material-stateLayer-inversionOnColor-hovered-filled, rgba(255, 255, 255, 0.1490196078));
147
+ }
148
+ .cardVacancy:hover:not([data-disabled], [data-loading]) .stateLayer[data-state=emptyDarkOnAccent]{
149
+ background:var(--sn-theme-color-material-stateLayer-darkOnAccent-hovered-filled, rgba(0, 0, 0, 0.0588235294));
150
+ }
151
+ }
152
+ .cardVacancy{
153
+ }
154
+ .cardVacancy[data-loading] .stateLayer[data-state=borderOnBackground], .cardVacancy:active:not([data-disabled], [data-loading]) .stateLayer[data-state=borderOnBackground], .cardVacancy[data-pressed=true]:not([data-disabled], [data-loading]) .stateLayer[data-state=borderOnBackground]{
155
+ border-color:var(--sn-theme-color-material-stateLayer-neutral-border-pressed-borderColor, var(--sn-brand-color-state-neutralBorder-forLightMode-pressed-borderColor, rgba(159, 166, 198, 0.8)));
156
+ }
157
+ .cardVacancy[data-loading] .stateLayer[data-state=emptyNeutralOnBackground], .cardVacancy:active:not([data-disabled], [data-loading]) .stateLayer[data-state=emptyNeutralOnBackground], .cardVacancy[data-pressed=true]:not([data-disabled], [data-loading]) .stateLayer[data-state=emptyNeutralOnBackground]{
158
+ background:var(--sn-theme-color-material-stateLayer-neutral-onBackground-pressed-filled, var(--sn-brand-color-state-neutral-forLightMode-pressed-background, rgba(188, 195, 220, 0.3019607843)));
159
+ }
160
+ .cardVacancy[data-loading] .stateLayer[data-state=activatedOnBackground], .cardVacancy:active:not([data-disabled], [data-loading]) .stateLayer[data-state=activatedOnBackground], .cardVacancy[data-pressed=true]:not([data-disabled], [data-loading]) .stateLayer[data-state=activatedOnBackground]{
161
+ background:var(--sn-theme-color-material-stateLayer-activated-pressed-filled, var(--sn-brand-color-state-activated-pressed-background, var(--sn-brandRole-color-brandA-backgroundActivatedPressed, rgba(56, 159, 116, 0.4509803922))));
162
+ }
163
+ .cardVacancy[data-loading] .stateLayer[data-state=versionOnColor], .cardVacancy:active:not([data-disabled], [data-loading]) .stateLayer[data-state=versionOnColor], .cardVacancy[data-pressed=true]:not([data-disabled], [data-loading]) .stateLayer[data-state=versionOnColor]{
164
+ background:var(--sn-theme-color-material-stateLayer-versionOnColor-pressed-filled, rgba(0, 0, 0, 0.1490196078));
165
+ }
166
+ .cardVacancy[data-loading] .stateLayer[data-state=emptyVersionOnColor], .cardVacancy:active:not([data-disabled], [data-loading]) .stateLayer[data-state=emptyVersionOnColor], .cardVacancy[data-pressed=true]:not([data-disabled], [data-loading]) .stateLayer[data-state=emptyVersionOnColor]{
167
+ background:var(--sn-theme-color-material-stateLayer-versionOnColor-pressed-filled, rgba(0, 0, 0, 0.1490196078));
168
+ }
169
+ .cardVacancy[data-loading] .stateLayer[data-state=inversionOnColor], .cardVacancy:active:not([data-disabled], [data-loading]) .stateLayer[data-state=inversionOnColor], .cardVacancy[data-pressed=true]:not([data-disabled], [data-loading]) .stateLayer[data-state=inversionOnColor]{
170
+ background:var(--sn-theme-color-material-stateLayer-inversionOnColor-pressed-filled, rgba(255, 255, 255, 0.0509803922));
171
+ }
172
+ .cardVacancy[data-loading] .stateLayer[data-state=emptyInversionOnColor], .cardVacancy:active:not([data-disabled], [data-loading]) .stateLayer[data-state=emptyInversionOnColor], .cardVacancy[data-pressed=true]:not([data-disabled], [data-loading]) .stateLayer[data-state=emptyInversionOnColor]{
173
+ background:var(--sn-theme-color-material-stateLayer-inversionOnColor-pressed-filled, rgba(255, 255, 255, 0.0509803922));
174
+ }
175
+ .cardVacancy[data-loading] .stateLayer[data-state=emptyDarkOnAccent], .cardVacancy:active:not([data-disabled], [data-loading]) .stateLayer[data-state=emptyDarkOnAccent], .cardVacancy[data-pressed=true]:not([data-disabled], [data-loading]) .stateLayer[data-state=emptyDarkOnAccent]{
176
+ background:var(--sn-theme-color-material-stateLayer-darkOnAccent-pressed-filled, rgba(0, 0, 0, 0.1215686275));
177
+ }
@@ -0,0 +1,29 @@
1
+ import { ValueOf, WithSupportProps } from '@cloud-ru/ds-utils';
2
+ import { ComponentPropsWithoutRef, ComponentPropsWithRef, ElementType } from 'react';
3
+ import { APPEARANCE } from './constants.js';
4
+ export type PolymorphicRef<T extends ElementType> = ComponentPropsWithRef<T>['ref'];
5
+ export type Appearance = ValueOf<typeof APPEARANCE>;
6
+ type BaseCardVacancyProps = {
7
+ /** Заголовок вакансии. Обрезается многоточием, если не помещается в одну строку. */
8
+ title?: string;
9
+ /** Описание под заголовком. Обрезается многоточием, если не помещается в одну строку. */
10
+ description?: string;
11
+ /**
12
+ * Визуальный вид карточки:
13
+ *
14
+ * - `neutral` — нейтральный полупрозрачный фон, тёмный заголовок.
15
+ * - `primary` — акцентный фон `primary` с декоративным паттерном, текст `onAccent`.
16
+ */
17
+ appearance?: Appearance;
18
+ /** Компактная мобильная версия — меньшая высота и более мелкая типографика. */
19
+ mobile?: boolean;
20
+ /** CSS-класс корневого элемента. */
21
+ className?: string;
22
+ };
23
+ export type CardVacancyProps<T extends ElementType = 'a'> = WithSupportProps<BaseCardVacancyProps & {
24
+ /** Полиморфный тег корня — `'a'` по умолчанию (карточка-ссылка), либо роутерный `Link` / `'button'` / `'div'`. */
25
+ as?: T;
26
+ /** Ref на корневой элемент. */
27
+ innerRef?: PolymorphicRef<T>;
28
+ } & Omit<ComponentPropsWithoutRef<T>, keyof BaseCardVacancyProps | 'as' | 'ref'>>;
29
+ export {};
@@ -0,0 +1 @@
1
+ export {};