@empoweredvote/ev-ui 0.7.0 → 0.7.1
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/README.md +111 -111
- package/package.json +45 -47
- package/src/tailwind-preset.js +81 -81
- package/src/tokens.js +415 -415
package/README.md
CHANGED
|
@@ -1,111 +1,111 @@
|
|
|
1
|
-
# @empoweredvote/ev-ui
|
|
2
|
-
|
|
3
|
-
Shared React component library for the [Empowered Vote](https://empowered.vote) civic engagement platform. Used across CompassV2, essentials, read-rank, civic-spaces, and other Empowered Vote apps.
|
|
4
|
-
|
|
5
|
-
[](https://www.npmjs.com/package/@empoweredvote/ev-ui)
|
|
6
|
-
|
|
7
|
-
## Installation
|
|
8
|
-
|
|
9
|
-
```bash
|
|
10
|
-
npm install @empoweredvote/ev-ui
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
The package is on public npm — no auth or `.npmrc` configuration required.
|
|
14
|
-
|
|
15
|
-
### Peer dependencies
|
|
16
|
-
|
|
17
|
-
```bash
|
|
18
|
-
npm install react react-dom @react-spring/web
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
Supported versions: React 17+, `@react-spring/web` 9+.
|
|
22
|
-
|
|
23
|
-
## Usage
|
|
24
|
-
|
|
25
|
-
```jsx
|
|
26
|
-
import { RadarChartCore, PoliticianCard, SiteHeader } from '@empoweredvote/ev-ui';
|
|
27
|
-
import { BallotIcon, CompassIcon } from '@empoweredvote/ev-ui';
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
### Design tokens
|
|
31
|
-
|
|
32
|
-
Design tokens (colors, spacing, typography) are exported separately and can be used directly or via the Tailwind preset:
|
|
33
|
-
|
|
34
|
-
```js
|
|
35
|
-
// tailwind.config.js
|
|
36
|
-
import evPreset from '@empoweredvote/ev-ui/tailwind-preset';
|
|
37
|
-
|
|
38
|
-
export default {
|
|
39
|
-
presets: [evPreset],
|
|
40
|
-
// your config
|
|
41
|
-
};
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
Direct token import:
|
|
45
|
-
```js
|
|
46
|
-
import { colors, spacing } from '@empoweredvote/ev-ui/tokens';
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
## Components
|
|
50
|
-
|
|
51
|
-
### Charts
|
|
52
|
-
- **`RadarChartCore`** — Interactive radar/spider chart with animated transitions, dual dataset overlays (e.g., your compass vs. a politician's), clickable spokes for inversion, and dynamic label wrapping.
|
|
53
|
-
|
|
54
|
-
### Politician Display
|
|
55
|
-
- **`PoliticianCard`** — Politician summary card with photo, title, district
|
|
56
|
-
- **`PoliticianProfile`** — Full profile page with contact, bio, legislative record
|
|
57
|
-
- **`CommitteeTable`** — Committee memberships and leadership roles
|
|
58
|
-
- **`LegislativeInlineSummary`**, **`LegislativeRecord`** — Bill/vote history
|
|
59
|
-
- **`JudicialScorecard`**, **`JudicialRecordDetail`** — Judicial record display
|
|
60
|
-
- **`SocialLinks`** — Social media icon links
|
|
61
|
-
- **`IssueTags`** — Topic/issue tag pills
|
|
62
|
-
- **`StanceAccordion`** — Collapsible stance list by topic
|
|
63
|
-
|
|
64
|
-
### Layout
|
|
65
|
-
- **`SiteHeader`** — Top nav bar with `defaultNavItems`, `defaultCtaButton` helpers
|
|
66
|
-
- **`Header`** — Simpler page header
|
|
67
|
-
- **`FilterSidebar`** — Filterable sidebar for results pages
|
|
68
|
-
- **`CategorySection`**, **`SubGroupSection`**, **`GovernmentBodySection`** — Grouped content sections
|
|
69
|
-
|
|
70
|
-
### Forms
|
|
71
|
-
- **`AuthForm`** — Login/signup form
|
|
72
|
-
|
|
73
|
-
### Icons
|
|
74
|
-
- **`BallotIcon`**, **`CompassIcon`**, **`BranchIcon`**
|
|
75
|
-
|
|
76
|
-
### Hooks
|
|
77
|
-
- **`useMediaQuery(query)`** — Responsive breakpoint hook
|
|
78
|
-
|
|
79
|
-
## Releasing
|
|
80
|
-
|
|
81
|
-
This package uses an **automated publish-and-fan-out pipeline**:
|
|
82
|
-
|
|
83
|
-
```bash
|
|
84
|
-
npm version patch # or minor / major
|
|
85
|
-
git push origin main --follow-tags
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
That's it. The tag push triggers `.github/workflows/publish.yml` which:
|
|
89
|
-
|
|
90
|
-
1. Publishes to npm using **OIDC trusted publishing** (no `NPM_TOKEN` — provenance attestations auto-generated)
|
|
91
|
-
2. Fires `repository_dispatch` to every consumer repo
|
|
92
|
-
3. Each consumer opens a PR bumping the dependency
|
|
93
|
-
4. Patch/minor bumps auto-merge after build-check passes
|
|
94
|
-
5. Render auto-deploys each consumer on merge
|
|
95
|
-
|
|
96
|
-
See [`README-AUTOBUMP.md`](./README-AUTOBUMP.md) for full pipeline details, how to add a new consumer, and debugging tips.
|
|
97
|
-
|
|
98
|
-
## Development
|
|
99
|
-
|
|
100
|
-
```bash
|
|
101
|
-
npm install
|
|
102
|
-
npm run build # tsup produces ESM + CJS bundles to dist/
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
## Design System Viewer
|
|
106
|
-
|
|
107
|
-
Design tokens are also rendered to a design system preview page deployed to GitHub Pages whenever `design-system/` or `src/tokens.js` changes on `main`. See `.github/workflows/deploy-design-system.yml`.
|
|
108
|
-
|
|
109
|
-
## License
|
|
110
|
-
|
|
111
|
-
Internal / Empowered Vote organization. See repository for details.
|
|
1
|
+
# @empoweredvote/ev-ui
|
|
2
|
+
|
|
3
|
+
Shared React component library for the [Empowered Vote](https://empowered.vote) civic engagement platform. Used across CompassV2, essentials, read-rank, civic-spaces, and other Empowered Vote apps.
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/@empoweredvote/ev-ui)
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install @empoweredvote/ev-ui
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
The package is on public npm — no auth or `.npmrc` configuration required.
|
|
14
|
+
|
|
15
|
+
### Peer dependencies
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install react react-dom @react-spring/web
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Supported versions: React 17+, `@react-spring/web` 9+.
|
|
22
|
+
|
|
23
|
+
## Usage
|
|
24
|
+
|
|
25
|
+
```jsx
|
|
26
|
+
import { RadarChartCore, PoliticianCard, SiteHeader } from '@empoweredvote/ev-ui';
|
|
27
|
+
import { BallotIcon, CompassIcon } from '@empoweredvote/ev-ui';
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Design tokens
|
|
31
|
+
|
|
32
|
+
Design tokens (colors, spacing, typography) are exported separately and can be used directly or via the Tailwind preset:
|
|
33
|
+
|
|
34
|
+
```js
|
|
35
|
+
// tailwind.config.js
|
|
36
|
+
import evPreset from '@empoweredvote/ev-ui/tailwind-preset';
|
|
37
|
+
|
|
38
|
+
export default {
|
|
39
|
+
presets: [evPreset],
|
|
40
|
+
// your config
|
|
41
|
+
};
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Direct token import:
|
|
45
|
+
```js
|
|
46
|
+
import { colors, spacing } from '@empoweredvote/ev-ui/tokens';
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Components
|
|
50
|
+
|
|
51
|
+
### Charts
|
|
52
|
+
- **`RadarChartCore`** — Interactive radar/spider chart with animated transitions, dual dataset overlays (e.g., your compass vs. a politician's), clickable spokes for inversion, and dynamic label wrapping.
|
|
53
|
+
|
|
54
|
+
### Politician Display
|
|
55
|
+
- **`PoliticianCard`** — Politician summary card with photo, title, district
|
|
56
|
+
- **`PoliticianProfile`** — Full profile page with contact, bio, legislative record
|
|
57
|
+
- **`CommitteeTable`** — Committee memberships and leadership roles
|
|
58
|
+
- **`LegislativeInlineSummary`**, **`LegislativeRecord`** — Bill/vote history
|
|
59
|
+
- **`JudicialScorecard`**, **`JudicialRecordDetail`** — Judicial record display
|
|
60
|
+
- **`SocialLinks`** — Social media icon links
|
|
61
|
+
- **`IssueTags`** — Topic/issue tag pills
|
|
62
|
+
- **`StanceAccordion`** — Collapsible stance list by topic
|
|
63
|
+
|
|
64
|
+
### Layout
|
|
65
|
+
- **`SiteHeader`** — Top nav bar with `defaultNavItems`, `defaultCtaButton` helpers
|
|
66
|
+
- **`Header`** — Simpler page header
|
|
67
|
+
- **`FilterSidebar`** — Filterable sidebar for results pages
|
|
68
|
+
- **`CategorySection`**, **`SubGroupSection`**, **`GovernmentBodySection`** — Grouped content sections
|
|
69
|
+
|
|
70
|
+
### Forms
|
|
71
|
+
- **`AuthForm`** — Login/signup form
|
|
72
|
+
|
|
73
|
+
### Icons
|
|
74
|
+
- **`BallotIcon`**, **`CompassIcon`**, **`BranchIcon`**
|
|
75
|
+
|
|
76
|
+
### Hooks
|
|
77
|
+
- **`useMediaQuery(query)`** — Responsive breakpoint hook
|
|
78
|
+
|
|
79
|
+
## Releasing
|
|
80
|
+
|
|
81
|
+
This package uses an **automated publish-and-fan-out pipeline**:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
npm version patch # or minor / major
|
|
85
|
+
git push origin main --follow-tags
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
That's it. The tag push triggers `.github/workflows/publish.yml` which:
|
|
89
|
+
|
|
90
|
+
1. Publishes to npm using **OIDC trusted publishing** (no `NPM_TOKEN` — provenance attestations auto-generated)
|
|
91
|
+
2. Fires `repository_dispatch` to every consumer repo
|
|
92
|
+
3. Each consumer opens a PR bumping the dependency
|
|
93
|
+
4. Patch/minor bumps auto-merge after build-check passes
|
|
94
|
+
5. Render auto-deploys each consumer on merge
|
|
95
|
+
|
|
96
|
+
See [`README-AUTOBUMP.md`](./README-AUTOBUMP.md) for full pipeline details, how to add a new consumer, and debugging tips.
|
|
97
|
+
|
|
98
|
+
## Development
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
npm install
|
|
102
|
+
npm run build # tsup produces ESM + CJS bundles to dist/
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Design System Viewer
|
|
106
|
+
|
|
107
|
+
Design tokens are also rendered to a design system preview page deployed to GitHub Pages whenever `design-system/` or `src/tokens.js` changes on `main`. See `.github/workflows/deploy-design-system.yml`.
|
|
108
|
+
|
|
109
|
+
## License
|
|
110
|
+
|
|
111
|
+
Internal / Empowered Vote organization. See repository for details.
|
package/package.json
CHANGED
|
@@ -1,47 +1,45 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@empoweredvote/ev-ui",
|
|
3
|
-
"version": "0.7.
|
|
4
|
-
"private": false,
|
|
5
|
-
"repository": {
|
|
6
|
-
"type": "git",
|
|
7
|
-
"url": "git+https://github.com/EmpoweredVote/ev-ui.git"
|
|
8
|
-
},
|
|
9
|
-
"main": "dist/index.js",
|
|
10
|
-
"module": "dist/index.mjs",
|
|
11
|
-
"exports": {
|
|
12
|
-
".": {
|
|
13
|
-
"import": "./dist/index.mjs",
|
|
14
|
-
"require": "./dist/index.js"
|
|
15
|
-
},
|
|
16
|
-
"./tokens": {
|
|
17
|
-
"import": "./src/tokens.js"
|
|
18
|
-
},
|
|
19
|
-
"./tailwind-preset": {
|
|
20
|
-
"import": "./src/tailwind-preset.js"
|
|
21
|
-
}
|
|
22
|
-
},
|
|
23
|
-
"files": [
|
|
24
|
-
"dist",
|
|
25
|
-
"src/tokens.js",
|
|
26
|
-
"src/tailwind-preset.js"
|
|
27
|
-
],
|
|
28
|
-
"publishConfig": {
|
|
29
|
-
"access": "public"
|
|
30
|
-
},
|
|
31
|
-
"peerDependencies": {
|
|
32
|
-
"react": ">=17",
|
|
33
|
-
"react-dom": ">=17",
|
|
34
|
-
"@react-spring/web": ">=9"
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
}
|
|
47
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@empoweredvote/ev-ui",
|
|
3
|
+
"version": "0.7.1",
|
|
4
|
+
"private": false,
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/EmpoweredVote/ev-ui.git"
|
|
8
|
+
},
|
|
9
|
+
"main": "dist/index.js",
|
|
10
|
+
"module": "dist/index.mjs",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"import": "./dist/index.mjs",
|
|
14
|
+
"require": "./dist/index.js"
|
|
15
|
+
},
|
|
16
|
+
"./tokens": {
|
|
17
|
+
"import": "./src/tokens.js"
|
|
18
|
+
},
|
|
19
|
+
"./tailwind-preset": {
|
|
20
|
+
"import": "./src/tailwind-preset.js"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"files": [
|
|
24
|
+
"dist",
|
|
25
|
+
"src/tokens.js",
|
|
26
|
+
"src/tailwind-preset.js"
|
|
27
|
+
],
|
|
28
|
+
"publishConfig": {
|
|
29
|
+
"access": "public"
|
|
30
|
+
},
|
|
31
|
+
"peerDependencies": {
|
|
32
|
+
"react": ">=17",
|
|
33
|
+
"react-dom": ">=17",
|
|
34
|
+
"@react-spring/web": ">=9"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"tsup": "^8.0.0",
|
|
38
|
+
"typescript": "^5.4.0",
|
|
39
|
+
"@react-spring/web": "^9.7.2"
|
|
40
|
+
},
|
|
41
|
+
"scripts": {
|
|
42
|
+
"build": "tsup",
|
|
43
|
+
"sync-penpot": "node scripts/sync-penpot-tokens.js"
|
|
44
|
+
}
|
|
45
|
+
}
|
package/src/tailwind-preset.js
CHANGED
|
@@ -1,81 +1,81 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Empowered Vote Tailwind CSS Preset
|
|
3
|
-
* Import in any app's tailwind config or CSS:
|
|
4
|
-
*
|
|
5
|
-
* Tailwind v4 (CSS):
|
|
6
|
-
* @import "@empoweredvote/ev-ui/tailwind-preset";
|
|
7
|
-
*
|
|
8
|
-
* Tailwind v3 (config):
|
|
9
|
-
* presets: [require('@empoweredvote/ev-ui/tailwind-preset')]
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import {
|
|
13
|
-
colorScales, colors, fontSizes, fonts, spacing, borderRadius, breakpoints,
|
|
14
|
-
shadows, duration, easing, zIndex, opacity,
|
|
15
|
-
} from './tokens.js';
|
|
16
|
-
|
|
17
|
-
// Flatten color scales for Tailwind: ev-coral-500, ev-teal-050, etc.
|
|
18
|
-
const flatColors = {};
|
|
19
|
-
for (const [hue, shades] of Object.entries(colorScales)) {
|
|
20
|
-
for (const [step, value] of Object.entries(shades)) {
|
|
21
|
-
flatColors[`ev-${hue}-${step}`] = value;
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export default {
|
|
26
|
-
theme: {
|
|
27
|
-
extend: {
|
|
28
|
-
colors: {
|
|
29
|
-
...flatColors,
|
|
30
|
-
'ev-coral': colors.evCoral,
|
|
31
|
-
'ev-muted-blue': colors.evMutedBlue,
|
|
32
|
-
'ev-light-blue': colors.evLightBlue,
|
|
33
|
-
'ev-yellow': colors.evYellow,
|
|
34
|
-
'ev-yellow-light': colors.evYellowLight,
|
|
35
|
-
'ev-yellow-dark': colors.evYellowDark,
|
|
36
|
-
// Legacy aliases
|
|
37
|
-
'ev-teal': colors.evTeal,
|
|
38
|
-
'ev-teal-dark': colors.evTealDark,
|
|
39
|
-
'ev-black': colors.black,
|
|
40
|
-
'ev-bg-light': colors.bgLight,
|
|
41
|
-
// State colors
|
|
42
|
-
'ev-error': colors.error,
|
|
43
|
-
'ev-error-light': colors.errorLight,
|
|
44
|
-
'ev-success': colors.success,
|
|
45
|
-
'ev-success-light': colors.successLight,
|
|
46
|
-
'ev-warning': colors.warning,
|
|
47
|
-
'ev-warning-light': colors.warningLight,
|
|
48
|
-
'ev-info': colors.info,
|
|
49
|
-
'ev-info-light': colors.infoLight,
|
|
50
|
-
},
|
|
51
|
-
fontFamily: {
|
|
52
|
-
manrope: [fonts.primary],
|
|
53
|
-
},
|
|
54
|
-
fontSize: fontSizes,
|
|
55
|
-
spacing,
|
|
56
|
-
borderRadius,
|
|
57
|
-
screens: breakpoints,
|
|
58
|
-
boxShadow: shadows,
|
|
59
|
-
zIndex,
|
|
60
|
-
opacity,
|
|
61
|
-
transitionDuration: duration,
|
|
62
|
-
transitionTimingFunction: easing,
|
|
63
|
-
animation: {
|
|
64
|
-
'fade-in': 'ev-fade-in 200ms cubic-bezier(0, 0, 0.2, 1)',
|
|
65
|
-
'fade-out': 'ev-fade-out 150ms cubic-bezier(0.4, 0, 1, 1)',
|
|
66
|
-
'slide-up': 'ev-slide-up 350ms cubic-bezier(0, 0, 0.2, 1)',
|
|
67
|
-
'slide-down': 'ev-slide-down 350ms cubic-bezier(0, 0, 0.2, 1)',
|
|
68
|
-
'scale-in': 'ev-scale-in 200ms cubic-bezier(0.34, 1.56, 0.64, 1)',
|
|
69
|
-
'skeleton': 'ev-skeleton 1.5s ease-in-out infinite',
|
|
70
|
-
},
|
|
71
|
-
keyframes: {
|
|
72
|
-
'ev-fade-in': { from: { opacity: '0' }, to: { opacity: '1' } },
|
|
73
|
-
'ev-fade-out': { from: { opacity: '1' }, to: { opacity: '0' } },
|
|
74
|
-
'ev-slide-up': { from: { opacity: '0', transform: 'translateY(8px)' }, to: { opacity: '1', transform: 'translateY(0)' } },
|
|
75
|
-
'ev-slide-down': { from: { opacity: '0', transform: 'translateY(-8px)' }, to: { opacity: '1', transform: 'translateY(0)' } },
|
|
76
|
-
'ev-scale-in': { from: { opacity: '0', transform: 'scale(0.95)' }, to: { opacity: '1', transform: 'scale(1)' } },
|
|
77
|
-
'ev-skeleton': { '0%, 100%': { opacity: '0.4' }, '50%': { opacity: '1' } },
|
|
78
|
-
},
|
|
79
|
-
},
|
|
80
|
-
},
|
|
81
|
-
};
|
|
1
|
+
/**
|
|
2
|
+
* Empowered Vote Tailwind CSS Preset
|
|
3
|
+
* Import in any app's tailwind config or CSS:
|
|
4
|
+
*
|
|
5
|
+
* Tailwind v4 (CSS):
|
|
6
|
+
* @import "@empoweredvote/ev-ui/tailwind-preset";
|
|
7
|
+
*
|
|
8
|
+
* Tailwind v3 (config):
|
|
9
|
+
* presets: [require('@empoweredvote/ev-ui/tailwind-preset')]
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import {
|
|
13
|
+
colorScales, colors, fontSizes, fonts, spacing, borderRadius, breakpoints,
|
|
14
|
+
shadows, duration, easing, zIndex, opacity,
|
|
15
|
+
} from './tokens.js';
|
|
16
|
+
|
|
17
|
+
// Flatten color scales for Tailwind: ev-coral-500, ev-teal-050, etc.
|
|
18
|
+
const flatColors = {};
|
|
19
|
+
for (const [hue, shades] of Object.entries(colorScales)) {
|
|
20
|
+
for (const [step, value] of Object.entries(shades)) {
|
|
21
|
+
flatColors[`ev-${hue}-${step}`] = value;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export default {
|
|
26
|
+
theme: {
|
|
27
|
+
extend: {
|
|
28
|
+
colors: {
|
|
29
|
+
...flatColors,
|
|
30
|
+
'ev-coral': colors.evCoral,
|
|
31
|
+
'ev-muted-blue': colors.evMutedBlue,
|
|
32
|
+
'ev-light-blue': colors.evLightBlue,
|
|
33
|
+
'ev-yellow': colors.evYellow,
|
|
34
|
+
'ev-yellow-light': colors.evYellowLight,
|
|
35
|
+
'ev-yellow-dark': colors.evYellowDark,
|
|
36
|
+
// Legacy aliases
|
|
37
|
+
'ev-teal': colors.evTeal,
|
|
38
|
+
'ev-teal-dark': colors.evTealDark,
|
|
39
|
+
'ev-black': colors.black,
|
|
40
|
+
'ev-bg-light': colors.bgLight,
|
|
41
|
+
// State colors
|
|
42
|
+
'ev-error': colors.error,
|
|
43
|
+
'ev-error-light': colors.errorLight,
|
|
44
|
+
'ev-success': colors.success,
|
|
45
|
+
'ev-success-light': colors.successLight,
|
|
46
|
+
'ev-warning': colors.warning,
|
|
47
|
+
'ev-warning-light': colors.warningLight,
|
|
48
|
+
'ev-info': colors.info,
|
|
49
|
+
'ev-info-light': colors.infoLight,
|
|
50
|
+
},
|
|
51
|
+
fontFamily: {
|
|
52
|
+
manrope: [fonts.primary],
|
|
53
|
+
},
|
|
54
|
+
fontSize: fontSizes,
|
|
55
|
+
spacing,
|
|
56
|
+
borderRadius,
|
|
57
|
+
screens: breakpoints,
|
|
58
|
+
boxShadow: shadows,
|
|
59
|
+
zIndex,
|
|
60
|
+
opacity,
|
|
61
|
+
transitionDuration: duration,
|
|
62
|
+
transitionTimingFunction: easing,
|
|
63
|
+
animation: {
|
|
64
|
+
'fade-in': 'ev-fade-in 200ms cubic-bezier(0, 0, 0.2, 1)',
|
|
65
|
+
'fade-out': 'ev-fade-out 150ms cubic-bezier(0.4, 0, 1, 1)',
|
|
66
|
+
'slide-up': 'ev-slide-up 350ms cubic-bezier(0, 0, 0.2, 1)',
|
|
67
|
+
'slide-down': 'ev-slide-down 350ms cubic-bezier(0, 0, 0.2, 1)',
|
|
68
|
+
'scale-in': 'ev-scale-in 200ms cubic-bezier(0.34, 1.56, 0.64, 1)',
|
|
69
|
+
'skeleton': 'ev-skeleton 1.5s ease-in-out infinite',
|
|
70
|
+
},
|
|
71
|
+
keyframes: {
|
|
72
|
+
'ev-fade-in': { from: { opacity: '0' }, to: { opacity: '1' } },
|
|
73
|
+
'ev-fade-out': { from: { opacity: '1' }, to: { opacity: '0' } },
|
|
74
|
+
'ev-slide-up': { from: { opacity: '0', transform: 'translateY(8px)' }, to: { opacity: '1', transform: 'translateY(0)' } },
|
|
75
|
+
'ev-slide-down': { from: { opacity: '0', transform: 'translateY(-8px)' }, to: { opacity: '1', transform: 'translateY(0)' } },
|
|
76
|
+
'ev-scale-in': { from: { opacity: '0', transform: 'scale(0.95)' }, to: { opacity: '1', transform: 'scale(1)' } },
|
|
77
|
+
'ev-skeleton': { '0%, 100%': { opacity: '0.4' }, '50%': { opacity: '1' } },
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
};
|