@dendelion/func-ui 0.1.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/CHANGELOG.md +8 -0
- package/LICENSE +21 -0
- package/README.md +61 -0
- package/dist/components/backdrop/backdrop.d.ts +15 -0
- package/dist/components/backdrop/backdrop.d.ts.map +1 -0
- package/dist/components/backdrop/index.d.ts +3 -0
- package/dist/components/backdrop/index.d.ts.map +1 -0
- package/dist/components/button/button.d.ts +19 -0
- package/dist/components/button/button.d.ts.map +1 -0
- package/dist/components/button/index.d.ts +3 -0
- package/dist/components/button/index.d.ts.map +1 -0
- package/dist/components/card/card.d.ts +20 -0
- package/dist/components/card/card.d.ts.map +1 -0
- package/dist/components/card/index.d.ts +3 -0
- package/dist/components/card/index.d.ts.map +1 -0
- package/dist/components/glass/glass.d.ts +15 -0
- package/dist/components/glass/glass.d.ts.map +1 -0
- package/dist/components/glass/index.d.ts +3 -0
- package/dist/components/glass/index.d.ts.map +1 -0
- package/dist/components/glow/glow.d.ts +16 -0
- package/dist/components/glow/glow.d.ts.map +1 -0
- package/dist/components/glow/index.d.ts +3 -0
- package/dist/components/glow/index.d.ts.map +1 -0
- package/dist/components/grain/grain.d.ts +11 -0
- package/dist/components/grain/grain.d.ts.map +1 -0
- package/dist/components/grain/index.d.ts +3 -0
- package/dist/components/grain/index.d.ts.map +1 -0
- package/dist/components/icon-button/icon-button.d.ts +17 -0
- package/dist/components/icon-button/icon-button.d.ts.map +1 -0
- package/dist/components/icon-button/index.d.ts +3 -0
- package/dist/components/icon-button/index.d.ts.map +1 -0
- package/dist/components/stamp/index.d.ts +3 -0
- package/dist/components/stamp/index.d.ts.map +1 -0
- package/dist/components/stamp/stamp.d.ts +21 -0
- package/dist/components/stamp/stamp.d.ts.map +1 -0
- package/dist/components/toast/index.d.ts +5 -0
- package/dist/components/toast/index.d.ts.map +1 -0
- package/dist/components/toast/toast-context.d.ts +17 -0
- package/dist/components/toast/toast-context.d.ts.map +1 -0
- package/dist/components/toast/toast-provider.d.ts +14 -0
- package/dist/components/toast/toast-provider.d.ts.map +1 -0
- package/dist/components/toast/use-toast.d.ts +2 -0
- package/dist/components/toast/use-toast.d.ts.map +1 -0
- package/dist/components/tooltip/index.d.ts +3 -0
- package/dist/components/tooltip/index.d.ts.map +1 -0
- package/dist/components/tooltip/tooltip.d.ts +17 -0
- package/dist/components/tooltip/tooltip.d.ts.map +1 -0
- package/dist/fonts/KyivTypeSerif-Bold.woff2 +0 -0
- package/dist/fonts/KyivTypeSerif-Heavy.woff2 +0 -0
- package/dist/fonts/KyivTypeSerif-Medium.woff2 +0 -0
- package/dist/fonts/montserrat-alternates-latin-400-normal.woff2 +0 -0
- package/dist/fonts/montserrat-alternates-latin-500-normal.woff2 +0 -0
- package/dist/fonts/montserrat-alternates-latin-600-normal.woff2 +0 -0
- package/dist/fonts/montserrat-alternates-latin-700-normal.woff2 +0 -0
- package/dist/fonts/tiny5-latin-400-normal.woff2 +0 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.css +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.mjs +514 -0
- package/dist/index.mjs.map +1 -0
- package/dist/utils/style-helpers.d.ts +2 -0
- package/dist/utils/style-helpers.d.ts.map +1 -0
- package/package.json +105 -0
- package/postcss.config.js +6 -0
- package/public/fonts/KyivTypeSerif-Bold.woff2 +0 -0
- package/public/fonts/KyivTypeSerif-Heavy.woff2 +0 -0
- package/public/fonts/KyivTypeSerif-Medium.woff2 +0 -0
- package/public/fonts/montserrat-alternates-latin-400-normal.woff2 +0 -0
- package/public/fonts/montserrat-alternates-latin-500-normal.woff2 +0 -0
- package/public/fonts/montserrat-alternates-latin-600-normal.woff2 +0 -0
- package/public/fonts/montserrat-alternates-latin-700-normal.woff2 +0 -0
- package/public/fonts/tiny5-latin-400-normal.woff2 +0 -0
- package/src/globals.scss +133 -0
- package/src/styles/_mixins.scss +30 -0
- package/src/styles/_tokens.scss +46 -0
- package/tailwind.config.js +7 -0
- package/tailwind.ts +66 -0
package/package.json
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@dendelion/func-ui",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Glossy, noisy, cosy React component library — frosted glass, film grain, and lava glow",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"sideEffects": [
|
|
7
|
+
"**/*.css",
|
|
8
|
+
"**/*.scss"
|
|
9
|
+
],
|
|
10
|
+
"packageManager": "pnpm@10.12.1",
|
|
11
|
+
"main": "dist/index.cjs",
|
|
12
|
+
"module": "dist/index.mjs",
|
|
13
|
+
"types": "dist/index.d.ts",
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"import": "./dist/index.mjs",
|
|
18
|
+
"require": "./dist/index.cjs"
|
|
19
|
+
},
|
|
20
|
+
"./tailwind": {
|
|
21
|
+
"types": "./tailwind.ts",
|
|
22
|
+
"import": "./tailwind.ts",
|
|
23
|
+
"require": "./tailwind.ts"
|
|
24
|
+
},
|
|
25
|
+
"./dist/index.css": "./dist/index.css"
|
|
26
|
+
},
|
|
27
|
+
"files": [
|
|
28
|
+
"dist",
|
|
29
|
+
"tailwind.ts",
|
|
30
|
+
"tailwind.config.js",
|
|
31
|
+
"postcss.config.js",
|
|
32
|
+
"src/globals.scss",
|
|
33
|
+
"src/styles",
|
|
34
|
+
"public/fonts",
|
|
35
|
+
"CHANGELOG.md",
|
|
36
|
+
"LICENSE",
|
|
37
|
+
"README.md"
|
|
38
|
+
],
|
|
39
|
+
"scripts": {
|
|
40
|
+
"dev": "vite",
|
|
41
|
+
"build": "vite build",
|
|
42
|
+
"build:showcase": "vite build --config vite.app.config.ts",
|
|
43
|
+
"preview": "vite preview",
|
|
44
|
+
"check-types": "tsc --noEmit",
|
|
45
|
+
"lint": "biome check ./src && stylelint \"src/**/*.scss\"",
|
|
46
|
+
"lint:fix": "biome check ./src --write && stylelint \"src/**/*.scss\"",
|
|
47
|
+
"lint:styles": "stylelint \"src/**/*.scss\"",
|
|
48
|
+
"check-package": "publint",
|
|
49
|
+
"ci": "pnpm run check-types && pnpm run lint && pnpm run build"
|
|
50
|
+
},
|
|
51
|
+
"repository": {
|
|
52
|
+
"type": "git",
|
|
53
|
+
"url": "git+https://github.com/adooone/func-ui.git"
|
|
54
|
+
},
|
|
55
|
+
"homepage": "https://github.com/adooone/func-ui#readme",
|
|
56
|
+
"keywords": [
|
|
57
|
+
"react",
|
|
58
|
+
"components",
|
|
59
|
+
"ui",
|
|
60
|
+
"glass",
|
|
61
|
+
"grain",
|
|
62
|
+
"film",
|
|
63
|
+
"funk",
|
|
64
|
+
"tailwindcss",
|
|
65
|
+
"design-system"
|
|
66
|
+
],
|
|
67
|
+
"author": "Dendelion",
|
|
68
|
+
"license": "MIT",
|
|
69
|
+
"peerDependencies": {
|
|
70
|
+
"react": "^18.0.0",
|
|
71
|
+
"react-dom": "^18.0.0"
|
|
72
|
+
},
|
|
73
|
+
"dependencies": {
|
|
74
|
+
"clsx": "^2.1.1",
|
|
75
|
+
"framer-motion": "^12.40.0",
|
|
76
|
+
"tailwind-merge": "^2.6.0"
|
|
77
|
+
},
|
|
78
|
+
"devDependencies": {
|
|
79
|
+
"@biomejs/biome": "^1.9.4",
|
|
80
|
+
"@dendelion/paper-camp": "^0.13.1",
|
|
81
|
+
"@types/react": "^18.3.12",
|
|
82
|
+
"@types/react-dom": "^18.3.1",
|
|
83
|
+
"@vitejs/plugin-react-swc": "^3.7.1",
|
|
84
|
+
"autoprefixer": "^10.4.20",
|
|
85
|
+
"gsap": "^3.15.0",
|
|
86
|
+
"postcss": "^8.4.47",
|
|
87
|
+
"postcss-scss": "^4.0.9",
|
|
88
|
+
"publint": "^0.3.21",
|
|
89
|
+
"react": "^18.3.1",
|
|
90
|
+
"react-dom": "^18.3.1",
|
|
91
|
+
"sass-embedded": "^1.100.0",
|
|
92
|
+
"stylelint": "^17.14.0",
|
|
93
|
+
"tailwindcss": "^3.4.14",
|
|
94
|
+
"typescript": "^5.6.3",
|
|
95
|
+
"vite": "^5.4.9",
|
|
96
|
+
"vite-plugin-dts": "^4.5.4"
|
|
97
|
+
},
|
|
98
|
+
"pnpm": {
|
|
99
|
+
"onlyBuiltDependencies": [
|
|
100
|
+
"@biomejs/biome",
|
|
101
|
+
"@swc/core",
|
|
102
|
+
"esbuild"
|
|
103
|
+
]
|
|
104
|
+
}
|
|
105
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/src/globals.scss
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
@use './styles/tokens' as *;
|
|
2
|
+
|
|
3
|
+
@tailwind base;
|
|
4
|
+
@tailwind components;
|
|
5
|
+
@tailwind utilities;
|
|
6
|
+
|
|
7
|
+
// ─── Fonts ─────────────────────────────────────────────────────
|
|
8
|
+
// Body — Montserrat Alternates
|
|
9
|
+
@font-face {
|
|
10
|
+
font-family: 'Montserrat Alternates';
|
|
11
|
+
src: url('/fonts/montserrat-alternates-latin-400-normal.woff2') format('woff2');
|
|
12
|
+
font-weight: 400;
|
|
13
|
+
font-style: normal;
|
|
14
|
+
font-display: swap;
|
|
15
|
+
}
|
|
16
|
+
@font-face {
|
|
17
|
+
font-family: 'Montserrat Alternates';
|
|
18
|
+
src: url('/fonts/montserrat-alternates-latin-500-normal.woff2') format('woff2');
|
|
19
|
+
font-weight: 500;
|
|
20
|
+
font-style: normal;
|
|
21
|
+
font-display: swap;
|
|
22
|
+
}
|
|
23
|
+
@font-face {
|
|
24
|
+
font-family: 'Montserrat Alternates';
|
|
25
|
+
src: url('/fonts/montserrat-alternates-latin-600-normal.woff2') format('woff2');
|
|
26
|
+
font-weight: 600;
|
|
27
|
+
font-style: normal;
|
|
28
|
+
font-display: swap;
|
|
29
|
+
}
|
|
30
|
+
@font-face {
|
|
31
|
+
font-family: 'Montserrat Alternates';
|
|
32
|
+
src: url('/fonts/montserrat-alternates-latin-700-normal.woff2') format('woff2');
|
|
33
|
+
font-weight: 700;
|
|
34
|
+
font-style: normal;
|
|
35
|
+
font-display: swap;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Titles — KyivType Serif
|
|
39
|
+
@font-face {
|
|
40
|
+
font-family: 'KyivType Serif';
|
|
41
|
+
src: url('/fonts/KyivTypeSerif-Medium.woff2') format('woff2');
|
|
42
|
+
font-weight: 500;
|
|
43
|
+
font-style: normal;
|
|
44
|
+
font-display: swap;
|
|
45
|
+
}
|
|
46
|
+
@font-face {
|
|
47
|
+
font-family: 'KyivType Serif';
|
|
48
|
+
src: url('/fonts/KyivTypeSerif-Bold.woff2') format('woff2');
|
|
49
|
+
font-weight: 600;
|
|
50
|
+
font-style: normal;
|
|
51
|
+
font-display: swap;
|
|
52
|
+
}
|
|
53
|
+
@font-face {
|
|
54
|
+
font-family: 'KyivType Serif';
|
|
55
|
+
src: url('/fonts/KyivTypeSerif-Heavy.woff2') format('woff2');
|
|
56
|
+
font-weight: 800;
|
|
57
|
+
font-style: normal;
|
|
58
|
+
font-display: swap;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Accents — Tiny5 (pixel)
|
|
62
|
+
@font-face {
|
|
63
|
+
font-family: 'Tiny5';
|
|
64
|
+
src: url('/fonts/tiny5-latin-400-normal.woff2') format('woff2');
|
|
65
|
+
font-weight: 400;
|
|
66
|
+
font-style: normal;
|
|
67
|
+
font-display: swap;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// ─── Theme tokens ──────────────────────────────────────────────
|
|
71
|
+
:root {
|
|
72
|
+
--fui-bg: #{$color-bg-light};
|
|
73
|
+
--fui-text: #{$color-text-light};
|
|
74
|
+
--fui-surface: #{$color-surface-light};
|
|
75
|
+
--fui-scroller: #{$color-scroller-light};
|
|
76
|
+
--fui-accent: #{$color-accent};
|
|
77
|
+
--fui-glow: #{$color-glow};
|
|
78
|
+
--fui-shadow-color: #000;
|
|
79
|
+
--fui-shadow-offset: 5px 5px 0 0 #000;
|
|
80
|
+
--fui-card-bg: rgba(255, 255, 255, 0.35);
|
|
81
|
+
--fui-danger: #c04f4f;
|
|
82
|
+
|
|
83
|
+
// Semantic status pairs (fill + text) — one source of truth for stamps,
|
|
84
|
+
// alerts, toasts, and consumer status maps.
|
|
85
|
+
--fui-status-neutral-fill: rgba(0, 0, 0, 0.08);
|
|
86
|
+
--fui-status-neutral-text: #55555a;
|
|
87
|
+
--fui-status-info-fill: rgba(74, 144, 217, 0.16);
|
|
88
|
+
--fui-status-info-text: #2f6cb0;
|
|
89
|
+
--fui-status-success-fill: rgba(43, 165, 121, 0.16);
|
|
90
|
+
--fui-status-success-text: #1e8460;
|
|
91
|
+
--fui-status-warning-fill: rgba(224, 158, 66, 0.18);
|
|
92
|
+
--fui-status-warning-text: #a66a1f;
|
|
93
|
+
--fui-status-error-fill: rgba(214, 86, 86, 0.16);
|
|
94
|
+
--fui-status-error-text: #b03a3a;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.dark {
|
|
98
|
+
--fui-bg: #{$color-bg-dark};
|
|
99
|
+
--fui-text: #{$color-text-dark};
|
|
100
|
+
--fui-surface: #{$color-surface-dark};
|
|
101
|
+
--fui-scroller: #{$color-scroller-dark};
|
|
102
|
+
--fui-shadow-color: #fff;
|
|
103
|
+
--fui-shadow-offset: 5px 5px 0 0 #fff;
|
|
104
|
+
--fui-card-bg: rgba(38, 38, 38, 0.5);
|
|
105
|
+
--fui-danger: #c25b5b;
|
|
106
|
+
--fui-status-neutral-fill: rgba(255, 255, 255, 0.1);
|
|
107
|
+
--fui-status-neutral-text: #b9b9c0;
|
|
108
|
+
--fui-status-info-fill: rgba(96, 165, 235, 0.2);
|
|
109
|
+
--fui-status-info-text: #8ec2f2;
|
|
110
|
+
--fui-status-success-fill: rgba(54, 206, 145, 0.18);
|
|
111
|
+
--fui-status-success-text: #7de3b6;
|
|
112
|
+
--fui-status-warning-fill: rgba(235, 178, 92, 0.18);
|
|
113
|
+
--fui-status-warning-text: #ecc487;
|
|
114
|
+
--fui-status-error-fill: rgba(226, 106, 106, 0.18);
|
|
115
|
+
--fui-status-error-text: #eda1a1;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// ─── Base ──────────────────────────────────────────────────────
|
|
119
|
+
html,
|
|
120
|
+
body {
|
|
121
|
+
height: 100%;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
body {
|
|
125
|
+
margin: 0;
|
|
126
|
+
font-family: $font-family-sans;
|
|
127
|
+
line-height: 1.6;
|
|
128
|
+
background-color: var(--fui-bg);
|
|
129
|
+
color: var(--fui-text);
|
|
130
|
+
transition:
|
|
131
|
+
background-color 0.3s ease,
|
|
132
|
+
color 0.3s ease;
|
|
133
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
@use 'tokens' as *;
|
|
2
|
+
|
|
3
|
+
// ─── Focus ring ────────────────────────────────────────────────
|
|
4
|
+
@mixin focus-ring {
|
|
5
|
+
outline: 2px solid $color-accent;
|
|
6
|
+
outline-offset: 2px;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
// ─── Frosted glass ─────────────────────────────────────────────
|
|
10
|
+
// The core "glossy transparent" surface: translucent fill behind a
|
|
11
|
+
// heavy backdrop blur. Blur radius is var-backed so consumers can tune it.
|
|
12
|
+
@mixin glass($blur: $blur-glass) {
|
|
13
|
+
background-color: var(--fui-surface);
|
|
14
|
+
backdrop-filter: blur(var(--fui-glass-blur, #{$blur}));
|
|
15
|
+
-webkit-backdrop-filter: blur(var(--fui-glass-blur, #{$blur}));
|
|
16
|
+
box-shadow: $glass-shadow;
|
|
17
|
+
// Follow the body's theme fade instead of snapping on toggle.
|
|
18
|
+
transition: background-color 0.3s ease;
|
|
19
|
+
// Descendants standing on this surface are already frosted — components
|
|
20
|
+
// that read this var (Card, secondary Button) drop their own backdrop
|
|
21
|
+
// blur, which would otherwise re-sample the panel on every scroll tick.
|
|
22
|
+
--fui-nested-backdrop: none;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// ─── Reduced motion ────────────────────────────────────────────
|
|
26
|
+
@mixin reduced-motion {
|
|
27
|
+
@media (prefers-reduced-motion: reduce) {
|
|
28
|
+
@content;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// Canonical source of truth for all design tokens.
|
|
2
|
+
// tailwind.ts derives its values from here — keep them in sync.
|
|
3
|
+
|
|
4
|
+
// ─── Accent ────────────────────────────────────────────────────
|
|
5
|
+
$color-accent: #2ba579;
|
|
6
|
+
$color-accent-light: #34c08d;
|
|
7
|
+
$color-accent-dark: #1e8460;
|
|
8
|
+
$color-glow: #36ce91; // brighter accent used for the lava glow
|
|
9
|
+
|
|
10
|
+
// ─── Dark theme ────────────────────────────────────────────────
|
|
11
|
+
$color-bg-dark: #0e0e10;
|
|
12
|
+
$color-text-dark: #ececec;
|
|
13
|
+
$color-surface-dark: rgba(24, 24, 24, 0.72); // frosted panel
|
|
14
|
+
$color-scroller-dark: #222224;
|
|
15
|
+
|
|
16
|
+
// ─── Light theme ───────────────────────────────────────────────
|
|
17
|
+
$color-bg-light: #fafafa;
|
|
18
|
+
$color-text-light: #0e0e10;
|
|
19
|
+
$color-surface-light: rgba(255, 255, 255, 0.32); // frosted panel
|
|
20
|
+
$color-scroller-light: #eaeaea;
|
|
21
|
+
|
|
22
|
+
// ─── Spacing ───────────────────────────────────────────────────
|
|
23
|
+
$space-1: 0.25rem;
|
|
24
|
+
$space-2: 0.5rem;
|
|
25
|
+
$space-3: 0.75rem;
|
|
26
|
+
$space-4: 1rem;
|
|
27
|
+
$space-5: 1.25rem;
|
|
28
|
+
$space-6: 1.5rem;
|
|
29
|
+
$space-8: 2rem;
|
|
30
|
+
|
|
31
|
+
// ─── Type scale ────────────────────────────────────────────────
|
|
32
|
+
$font-family-sans: 'Montserrat Alternates', sans-serif;
|
|
33
|
+
$font-family-title: 'KyivType Serif', Georgia, serif;
|
|
34
|
+
$font-family-mono: 'Montserrat Alternates', sans-serif;
|
|
35
|
+
|
|
36
|
+
$font-size-sm: 0.875rem;
|
|
37
|
+
$font-size-md: 1rem;
|
|
38
|
+
$font-size-lg: 1.125rem;
|
|
39
|
+
$font-size-xl: 1.25rem;
|
|
40
|
+
$font-size-2xl: 1.5rem;
|
|
41
|
+
|
|
42
|
+
// ─── Effects ───────────────────────────────────────────────────
|
|
43
|
+
$blur-glass: 50px;
|
|
44
|
+
$grain-duration: 8s;
|
|
45
|
+
$glass-shadow: 0 0 50px rgba(0, 0, 0, 0.3);
|
|
46
|
+
$radius-md: 0px; // the film aesthetic uses hard, square edges
|
package/tailwind.ts
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// Color values here must stay in sync with src/styles/_tokens.scss — that file
|
|
2
|
+
// is the canonical source.
|
|
3
|
+
/** @type {import('tailwindcss').Config} */
|
|
4
|
+
export const funcPreset = {
|
|
5
|
+
darkMode: 'class',
|
|
6
|
+
theme: {
|
|
7
|
+
extend: {
|
|
8
|
+
fontFamily: {
|
|
9
|
+
sans: ['"Montserrat Alternates"', 'ui-sans-serif', 'sans-serif'],
|
|
10
|
+
title: ['"KyivType Serif"', 'Georgia', 'serif'],
|
|
11
|
+
serif: ['"KyivType Serif"', 'Georgia', 'serif'],
|
|
12
|
+
mono: ['"Montserrat Alternates"', 'ui-sans-serif', 'sans-serif'],
|
|
13
|
+
},
|
|
14
|
+
colors: {
|
|
15
|
+
// Signature accent — a dark green-teal.
|
|
16
|
+
accent: {
|
|
17
|
+
DEFAULT: '#2BA579',
|
|
18
|
+
light: '#34C08D',
|
|
19
|
+
dark: '#1E8460',
|
|
20
|
+
},
|
|
21
|
+
// Brighter accent used for the lava glow.
|
|
22
|
+
glow: '#36CE91',
|
|
23
|
+
// Semantic, theme-aware colours (driven by the CSS vars in globals.scss).
|
|
24
|
+
bg: 'var(--fui-bg)',
|
|
25
|
+
fg: 'var(--fui-text)',
|
|
26
|
+
surface: 'var(--fui-surface)',
|
|
27
|
+
},
|
|
28
|
+
boxShadow: {
|
|
29
|
+
offset: 'var(--fui-shadow-offset)',
|
|
30
|
+
glow: '0 0 50px rgba(54, 206, 145, 0.25)',
|
|
31
|
+
glass: '0 0 50px rgba(0, 0, 0, 0.3)',
|
|
32
|
+
},
|
|
33
|
+
backdropBlur: {
|
|
34
|
+
glass: '50px',
|
|
35
|
+
},
|
|
36
|
+
keyframes: {
|
|
37
|
+
grain: {
|
|
38
|
+
'0%, 100%': { transform: 'translate(0, 0)' },
|
|
39
|
+
'10%': { transform: 'translate(-5%, -10%)' },
|
|
40
|
+
'20%': { transform: 'translate(-15%, 5%)' },
|
|
41
|
+
'30%': { transform: 'translate(7%, -25%)' },
|
|
42
|
+
'40%': { transform: 'translate(-5%, 25%)' },
|
|
43
|
+
'50%': { transform: 'translate(-15%, 10%)' },
|
|
44
|
+
'60%': { transform: 'translate(15%, 0%)' },
|
|
45
|
+
'70%': { transform: 'translate(0%, 15%)' },
|
|
46
|
+
'80%': { transform: 'translate(3%, -15%)' },
|
|
47
|
+
'90%': { transform: 'translate(-10%, 10%)' },
|
|
48
|
+
},
|
|
49
|
+
'lava-float': {
|
|
50
|
+
from: { transform: 'translateY(0)' },
|
|
51
|
+
to: { transform: 'translateY(240px)' },
|
|
52
|
+
},
|
|
53
|
+
// Seamless loop for content duplicated exactly twice
|
|
54
|
+
marquee: {
|
|
55
|
+
to: { transform: 'translateX(-50%)' },
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
animation: {
|
|
59
|
+
grain: 'grain 8s steps(10) infinite',
|
|
60
|
+
marquee: 'marquee 40s linear infinite',
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
export default funcPreset;
|