@fest-lib/veela 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/LICENSE +21 -0
- package/README.md +533 -0
- package/dist/veela.js +878 -0
- package/package.json +83 -0
- package/src/scss/_layers.scss +16 -0
- package/src/scss/advanced/_index.scss +0 -0
- package/src/scss/advanced/animation/_motion.scss +317 -0
- package/src/scss/advanced/color/_color.scss +328 -0
- package/src/scss/advanced/color/_colorize.scss +325 -0
- package/src/scss/advanced/design/_design-tokens.scss +118 -0
- package/src/scss/advanced/design/_effects.scss +275 -0
- package/src/scss/advanced/design/_shadow.scss +359 -0
- package/src/scss/advanced/design/_surfaces.scss +76 -0
- package/src/scss/advanced/effects/_animations.scss +124 -0
- package/src/scss/advanced/effects/_shadows.scss +50 -0
- package/src/scss/advanced/font/_typography.scss +600 -0
- package/src/scss/advanced/index.scss +11 -0
- package/src/scss/advanced/index.ts +35 -0
- package/src/scss/advanced/layout/_content.scss +170 -0
- package/src/scss/advanced/layout/_index.scss +5 -0
- package/src/scss/advanced/layout/_normalize.scss +541 -0
- package/src/scss/advanced/layout/_shared-overlays.scss +162 -0
- package/src/scss/advanced/md3/_md3.scss +596 -0
- package/src/scss/advanced/md3/_utils.scss +114 -0
- package/src/scss/advanced/misc/_config.scss +119 -0
- package/src/scss/advanced/misc/_initials.scss +298 -0
- package/src/scss/advanced/misc/_mixins.scss +179 -0
- package/src/scss/advanced/misc/_queries.scss +34 -0
- package/src/scss/advanced/misc/_rendering.scss +82 -0
- package/src/scss/advanced/misc/_tokens.scss +74 -0
- package/src/scss/advanced/theme/_shared.scss +232 -0
- package/src/scss/advanced/theme/_states.scss +332 -0
- package/src/scss/advanced/theme/_variants.scss +354 -0
- package/src/scss/advanced/tokens/_material-color.scss +120 -0
- package/src/scss/advanced/tokens/_variables.scss +171 -0
- package/src/scss/basic/_layers.scss +0 -0
- package/src/scss/basic/design/_index.scss +3 -0
- package/src/scss/basic/design/_keyframes.scss +163 -0
- package/src/scss/basic/design/_shapes.scss +266 -0
- package/src/scss/basic/design/_wavy-runtime.scss +50 -0
- package/src/scss/basic/index.scss +19 -0
- package/src/scss/basic/index.ts +29 -0
- package/src/scss/basic/misc/_core-layout.scss +272 -0
- package/src/scss/basic/misc/_index.scss +18 -0
- package/src/scss/basic/misc/_layout.scss +1040 -0
- package/src/scss/basic/misc/_mixins.scss +179 -0
- package/src/scss/basic/misc/_motion.scss +28 -0
- package/src/scss/basic/misc/_normalize.scss +765 -0
- package/src/scss/basic/misc/_queries.scss +34 -0
- package/src/scss/basic/misc/_shared.scss +232 -0
- package/src/scss/basic/misc/_states.scss +135 -0
- package/src/scss/basic/misc/_tokens.scss +78 -0
- package/src/scss/basic/misc/_veela.scss +12 -0
- package/src/scss/core/index.scss +1 -0
- package/src/scss/core/interact/_draggable.scss +32 -0
- package/src/scss/core/interact/_position.scss +45 -0
- package/src/scss/core/interact/_ps-anchor.scss +28 -0
- package/src/scss/core/interact/_ps-centered.scss +28 -0
- package/src/scss/core/interact/_ps-cursor.scss +18 -0
- package/src/scss/core/interact/_ps-draggable.scss +25 -0
- package/src/scss/core/interact/_ps-mechanic.scss +0 -0
- package/src/scss/core/interact/_ps-properties.scss +54 -0
- package/src/scss/core/interact/_ps-resizable.scss +61 -0
- package/src/scss/core/interact/_resizable.scss +69 -0
- package/src/scss/core/interact/_viewport.scss +469 -0
- package/src/scss/core/misc/_color-properties.scss +64 -0
- package/src/scss/core/misc/_config.scss +110 -0
- package/src/scss/core/misc/_functions.scss +530 -0
- package/src/scss/core/misc/_icons.scss +109 -0
- package/src/scss/core/misc/_index.scss +6 -0
- package/src/scss/core/misc/_layout.scss +49 -0
- package/src/scss/core/misc/_mixins.scss +744 -0
- package/src/scss/core/misc/_properties.scss +245 -0
- package/src/scss/core/misc/_tokens.scss +947 -0
- package/src/scss/core/misc/_utilities.scss +941 -0
- package/src/scss/core/misc/_utils.scss +17 -0
- package/src/scss/index.scss +18 -0
- package/src/scss/index.ts +105 -0
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
@layer animations {
|
|
2
|
+
@mixin rotate-spin($name) {
|
|
3
|
+
@keyframes #{$name} {
|
|
4
|
+
from {
|
|
5
|
+
transform: rotate(0deg);
|
|
6
|
+
}
|
|
7
|
+
to {
|
|
8
|
+
transform: rotate(360deg);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
@mixin fade-in($name) {
|
|
14
|
+
@keyframes #{$name} {
|
|
15
|
+
from {
|
|
16
|
+
opacity: 0;
|
|
17
|
+
}
|
|
18
|
+
to {
|
|
19
|
+
opacity: 1;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
@mixin fade-in-up($name, $distance: 20px) {
|
|
25
|
+
@keyframes #{$name} {
|
|
26
|
+
from {
|
|
27
|
+
opacity: 0;
|
|
28
|
+
transform: translateY(#{$distance});
|
|
29
|
+
}
|
|
30
|
+
to {
|
|
31
|
+
opacity: 1;
|
|
32
|
+
transform: translateY(0);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
@mixin scale-in($name, $scale: 0.95) {
|
|
38
|
+
@keyframes #{$name} {
|
|
39
|
+
from {
|
|
40
|
+
opacity: 0;
|
|
41
|
+
transform: scale(#{$scale});
|
|
42
|
+
}
|
|
43
|
+
to {
|
|
44
|
+
opacity: 1;
|
|
45
|
+
transform: scale(1);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
@mixin opacity-pulse($name, $max, $min) {
|
|
51
|
+
@keyframes #{$name} {
|
|
52
|
+
0%,
|
|
53
|
+
100% {
|
|
54
|
+
opacity: #{$max};
|
|
55
|
+
}
|
|
56
|
+
50% {
|
|
57
|
+
opacity: #{$min};
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
@mixin slide-in($name, $x, $y) {
|
|
63
|
+
@keyframes #{$name} {
|
|
64
|
+
from {
|
|
65
|
+
opacity: 0;
|
|
66
|
+
transform: translate(#{$x}, #{$y});
|
|
67
|
+
}
|
|
68
|
+
to {
|
|
69
|
+
opacity: 1;
|
|
70
|
+
transform: translate(0, 0);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
@include rotate-spin(spin);
|
|
76
|
+
@include rotate-spin(app-shell-spin);
|
|
77
|
+
@include rotate-spin(viewer-spinner);
|
|
78
|
+
@include rotate-spin(explorer-spin);
|
|
79
|
+
@include rotate-spin(rs-spin);
|
|
80
|
+
@include rotate-spin(airpad-spin);
|
|
81
|
+
@include rotate-spin(view-spin);
|
|
82
|
+
|
|
83
|
+
@include fade-in(fadeIn);
|
|
84
|
+
@include fade-in(viewer-fade-in);
|
|
85
|
+
|
|
86
|
+
@include fade-in-up(fadeInUp);
|
|
87
|
+
@include fade-in-up(viewer-slide-in, 8px);
|
|
88
|
+
@include fade-in-up(slideInUp, 20px);
|
|
89
|
+
|
|
90
|
+
@include scale-in(scaleIn, 0.9);
|
|
91
|
+
|
|
92
|
+
@include opacity-pulse(viewer-pulse, 0.4, 0.8);
|
|
93
|
+
@include opacity-pulse(skeleton-pulse, 0.4, 0.8);
|
|
94
|
+
@include opacity-pulse(pulse, 1, 0.8);
|
|
95
|
+
|
|
96
|
+
@include slide-in(slide-in-top, 0, calc(-1 * var(--slide-distance, 1rem)));
|
|
97
|
+
@include slide-in(slide-in-right, var(--slide-distance, 1rem), 0);
|
|
98
|
+
@include slide-in(slide-in-bottom, 0, var(--slide-distance, 1rem));
|
|
99
|
+
@include slide-in(slide-in-left, calc(-1 * var(--slide-distance, 1rem)), 0);
|
|
100
|
+
|
|
101
|
+
@keyframes app-shell-status-enter {
|
|
102
|
+
from {
|
|
103
|
+
opacity: 0;
|
|
104
|
+
transform: translateX(-50%) translateY(0.5rem);
|
|
105
|
+
}
|
|
106
|
+
to {
|
|
107
|
+
opacity: 1;
|
|
108
|
+
transform: translateX(-50%) translateY(0);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
@keyframes shell-status-fade-in {
|
|
113
|
+
from {
|
|
114
|
+
opacity: 0;
|
|
115
|
+
transform: translateX(-50%) translateY(1rem);
|
|
116
|
+
}
|
|
117
|
+
to {
|
|
118
|
+
opacity: 1;
|
|
119
|
+
transform: translateX(-50%) translateY(0);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
@keyframes viewer-skeleton-shimmer {
|
|
124
|
+
0% {
|
|
125
|
+
background-position: -200% 0;
|
|
126
|
+
}
|
|
127
|
+
100% {
|
|
128
|
+
background-position: 200% 0;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
@keyframes blink {
|
|
133
|
+
0%,
|
|
134
|
+
50% {
|
|
135
|
+
opacity: 1;
|
|
136
|
+
}
|
|
137
|
+
51%,
|
|
138
|
+
100% {
|
|
139
|
+
opacity: 0;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
@keyframes card-pulse {
|
|
144
|
+
0%,
|
|
145
|
+
100% {
|
|
146
|
+
box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-blue) 50%, transparent), var(--card-shadow-base);
|
|
147
|
+
}
|
|
148
|
+
50% {
|
|
149
|
+
box-shadow: 0 0 0 6px color-mix(in oklch, var(--color-blue) 20%, transparent), var(--card-shadow-base);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
@keyframes card-hydrate-in {
|
|
154
|
+
from {
|
|
155
|
+
opacity: 0;
|
|
156
|
+
transform: translateY(8px) scale(0.98);
|
|
157
|
+
}
|
|
158
|
+
to {
|
|
159
|
+
opacity: 1;
|
|
160
|
+
transform: translateY(0) scale(1);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
//@use "veela-lib" as *;
|
|
2
|
+
|
|
3
|
+
//
|
|
4
|
+
@layer ux-shapes {
|
|
5
|
+
|
|
6
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
7
|
+
// Base Shaped Element
|
|
8
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
9
|
+
.shaped {
|
|
10
|
+
// Layout
|
|
11
|
+
display: flex;
|
|
12
|
+
place-content: center;
|
|
13
|
+
place-items: center;
|
|
14
|
+
aspect-ratio: 1 / 1;
|
|
15
|
+
inline-size: stretch;
|
|
16
|
+
block-size: stretch;
|
|
17
|
+
padding: 1.25rem;
|
|
18
|
+
|
|
19
|
+
// Containment & Overflow
|
|
20
|
+
contain: strict;
|
|
21
|
+
overflow: hidden;
|
|
22
|
+
|
|
23
|
+
// Rendering
|
|
24
|
+
border-radius: 1.5rem;
|
|
25
|
+
//clip-path: var(--clip-path, none);
|
|
26
|
+
z-index: 1;
|
|
27
|
+
|
|
28
|
+
// Interaction
|
|
29
|
+
pointer-events: auto;
|
|
30
|
+
user-select: none;
|
|
31
|
+
|
|
32
|
+
// Animation
|
|
33
|
+
transition-behavior: allow-discrete;
|
|
34
|
+
transition: --background-tone-shift 0.2s ease-in-out, --icon-color 0.2s ease-in-out;
|
|
35
|
+
|
|
36
|
+
// Nested elements
|
|
37
|
+
& span, & ui-icon {
|
|
38
|
+
inline-size: stretch;
|
|
39
|
+
block-size: stretch;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
44
|
+
// Dragging State
|
|
45
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
46
|
+
*[data-dragging] {
|
|
47
|
+
z-index: calc(100 + var(--z-index, 0)) !important;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
//
|
|
51
|
+
// Shape Variants: Border-Radius Based (Simple)
|
|
52
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
53
|
+
*:not(:has(.shaped)),
|
|
54
|
+
*:not(.shaped) > *,
|
|
55
|
+
*:not(.shaped) .shaped {
|
|
56
|
+
//--clip-path: none;
|
|
57
|
+
|
|
58
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
59
|
+
// Base Shape Container
|
|
60
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
61
|
+
&[data-shape] {
|
|
62
|
+
contain: strict;
|
|
63
|
+
overflow: hidden;
|
|
64
|
+
aspect-ratio: 1 / 1;
|
|
65
|
+
pointer-events: auto;
|
|
66
|
+
touch-action: none;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
70
|
+
// Shape Variants: Border-Radius Based (Simple)
|
|
71
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
72
|
+
|
|
73
|
+
// Square - minimal rounding
|
|
74
|
+
&[data-shape="square"] {
|
|
75
|
+
--border-radius: var(--radius-md);
|
|
76
|
+
--clip-path: none;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Squircle - iOS-style super-ellipse approximation
|
|
80
|
+
&[data-shape="squircle"] {
|
|
81
|
+
--border-radius: 28%;
|
|
82
|
+
--clip-path: none;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Circle - fully round
|
|
86
|
+
&[data-shape="circle"] {
|
|
87
|
+
--border-radius: 50%;
|
|
88
|
+
--clip-path: none;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Rounded - generous rounding
|
|
92
|
+
&[data-shape="rounded"] {
|
|
93
|
+
--border-radius: var(--radius-xl);
|
|
94
|
+
--clip-path: none;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Blob - organic asymmetric shape
|
|
98
|
+
&[data-shape="blob"] {
|
|
99
|
+
--border-radius: 60% 40% 30% 70% / 60% 30% 70% 40%;
|
|
100
|
+
--clip-path: none;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
104
|
+
// Shape Variants: Clip-Path Based (Polygonal)
|
|
105
|
+
// Uses `polygon(round X, ...)` for smooth rounded corners (Chrome 111+)
|
|
106
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
107
|
+
|
|
108
|
+
// Hexagon - regular 6-sided polygon (flat-top orientation)
|
|
109
|
+
&[data-shape="hexagon"] {
|
|
110
|
+
--border-radius: 0;
|
|
111
|
+
--clip-path: polygon(
|
|
112
|
+
round 0.375rem,
|
|
113
|
+
50% 0%, 93.3% 25%, 93.3% 75%, 50% 100%, 6.7% 75%, 6.7% 25%
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Diamond - rotated square / rhombus
|
|
118
|
+
&[data-shape="diamond"] {
|
|
119
|
+
--border-radius: 0;
|
|
120
|
+
--clip-path: polygon(
|
|
121
|
+
round 0.5rem,
|
|
122
|
+
50% 0%, 100% 50%, 50% 100%, 0% 50%
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Star - 5-pointed star with proper inner/outer radii
|
|
127
|
+
&[data-shape="star"] {
|
|
128
|
+
--border-radius: 0;
|
|
129
|
+
--clip-path: polygon(
|
|
130
|
+
round 0.25rem,
|
|
131
|
+
50% 0%,
|
|
132
|
+
61% 35%, 98% 38%,
|
|
133
|
+
68% 59%, 79% 95%,
|
|
134
|
+
50% 75%,
|
|
135
|
+
21% 95%, 32% 59%,
|
|
136
|
+
2% 38%, 39% 35%
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Badge - shield/pennant shape
|
|
141
|
+
&[data-shape="badge"] {
|
|
142
|
+
--border-radius: 0;
|
|
143
|
+
--clip-path: polygon(
|
|
144
|
+
round 0.375rem,
|
|
145
|
+
0% 0%, 100% 0%, 100% 70%, 50% 100%, 0% 70%
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Heart - smooth heart shape using polygon approximation
|
|
150
|
+
&[data-shape="heart"] {
|
|
151
|
+
--border-radius: 0;
|
|
152
|
+
--clip-path: polygon(
|
|
153
|
+
round 0.25rem,
|
|
154
|
+
50% 100%,
|
|
155
|
+
10% 65%, 0% 45%, 0% 30%,
|
|
156
|
+
5% 15%, 18% 3%, 35% 0%, 50% 12%,
|
|
157
|
+
65% 0%, 82% 3%, 95% 15%,
|
|
158
|
+
100% 30%, 100% 45%, 90% 65%
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Clover - 4-leaf clover / cross-star
|
|
163
|
+
&[data-shape="clover"] {
|
|
164
|
+
--border-radius: 0;
|
|
165
|
+
--clip-path: polygon(
|
|
166
|
+
round 0.375rem,
|
|
167
|
+
50% 0%, 60% 30%, 70% 30%, 100% 50%,
|
|
168
|
+
70% 70%, 60% 70%, 50% 100%,
|
|
169
|
+
40% 70%, 30% 70%, 0% 50%,
|
|
170
|
+
30% 30%, 40% 30%
|
|
171
|
+
);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Flower - 8-petal flower with alternating radii
|
|
175
|
+
&[data-shape="flower"] {
|
|
176
|
+
--border-radius: 0;
|
|
177
|
+
--clip-path: polygon(
|
|
178
|
+
round 0.25rem,
|
|
179
|
+
50% 0%, 58% 25%, 85% 15%, 68% 40%,
|
|
180
|
+
100% 50%, 68% 60%, 85% 85%, 58% 75%,
|
|
181
|
+
50% 100%, 42% 75%, 15% 85%, 32% 60%,
|
|
182
|
+
0% 50%, 32% 40%, 15% 15%, 42% 25%
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// Triangle - equilateral triangle
|
|
187
|
+
&[data-shape="triangle"] {
|
|
188
|
+
--border-radius: 0;
|
|
189
|
+
--clip-path: polygon(
|
|
190
|
+
round 0.5rem,
|
|
191
|
+
50% 0%, 100% 87%, 0% 87%
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Pentagon - regular 5-sided polygon
|
|
196
|
+
&[data-shape="pentagon"] {
|
|
197
|
+
--border-radius: 0;
|
|
198
|
+
--clip-path: polygon(
|
|
199
|
+
round 0.375rem,
|
|
200
|
+
50% 0%, 97.5% 35%, 79.5% 95%, 20.5% 95%, 2.5% 35%
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// Octagon - regular 8-sided polygon
|
|
205
|
+
&[data-shape="octagon"] {
|
|
206
|
+
--border-radius: 0;
|
|
207
|
+
--clip-path: polygon(
|
|
208
|
+
round 0.25rem,
|
|
209
|
+
30% 0%, 70% 0%, 100% 30%, 100% 70%,
|
|
210
|
+
70% 100%, 30% 100%, 0% 70%, 0% 30%
|
|
211
|
+
);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// Cross / Plus - plus sign shape
|
|
215
|
+
&[data-shape="cross"] {
|
|
216
|
+
--border-radius: 0;
|
|
217
|
+
--clip-path: polygon(
|
|
218
|
+
round 0.375rem,
|
|
219
|
+
35% 0%, 65% 0%, 65% 35%, 100% 35%,
|
|
220
|
+
100% 65%, 65% 65%, 65% 100%, 35% 100%,
|
|
221
|
+
35% 65%, 0% 65%, 0% 35%, 35% 35%
|
|
222
|
+
);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// Arrow - right-pointing arrow/chevron
|
|
226
|
+
&[data-shape="arrow"] {
|
|
227
|
+
--border-radius: 0;
|
|
228
|
+
--clip-path: polygon(
|
|
229
|
+
round 0.375rem,
|
|
230
|
+
0% 20%, 60% 20%, 60% 0%, 100% 50%,
|
|
231
|
+
60% 100%, 60% 80%, 0% 80%
|
|
232
|
+
);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
236
|
+
// Shape Variants: Tear/Drop (Asymmetric Radius)
|
|
237
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
238
|
+
|
|
239
|
+
// Tear - teardrop/water drop shape
|
|
240
|
+
&[data-shape="egg"] {
|
|
241
|
+
--border-radius: 50% 50% 50% 50% / 60% 60% 40% 40%;
|
|
242
|
+
--clip-path: none;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
//
|
|
246
|
+
&[data-shape="tear"] {
|
|
247
|
+
--border-radius: 50cqmin 50cqmin 5rem 50cqmin;
|
|
248
|
+
--clip-path: none;
|
|
249
|
+
|
|
250
|
+
border-start-start-radius: 50cqmin;
|
|
251
|
+
border-start-end-radius: 50cqmin;
|
|
252
|
+
border-end-start-radius: 50cqmin;
|
|
253
|
+
border-end-end-radius: 5rem;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
257
|
+
// Shape Variants: Wavy (Procedural)
|
|
258
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
259
|
+
|
|
260
|
+
// Wavy - procedural wavy edge (uses Integrate function)
|
|
261
|
+
&[data-shape="wavy"] {
|
|
262
|
+
--border-radius: calc(var(--icon-size, 100%) * 0.5);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
@use "sass:math";
|
|
2
|
+
@use "sass:list";
|
|
3
|
+
|
|
4
|
+
// if you don't want to use deps...
|
|
5
|
+
@function join($list, $glue: '', $is-nested: false) {
|
|
6
|
+
$result: null;
|
|
7
|
+
@for $i from 1 through length($list) {
|
|
8
|
+
$e: nth($list, $i);
|
|
9
|
+
@if type-of($e) == list {
|
|
10
|
+
$result: $result#{join($e, $glue, true)};
|
|
11
|
+
} @else {
|
|
12
|
+
$result: if(sass($i != length($list) or $is-nested): $result #{$e}#{$glue}; else: $result #{$e});
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
@return $result;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
// F(X):[x,y] where X:[0..1]
|
|
19
|
+
@#{"function --wavy-step(--step <number>)"} {
|
|
20
|
+
--angle: calc((var(--step, 0) * 2) * 1rad * pi);
|
|
21
|
+
--variant: calc(cos(var(--clip-freq, 8) * var(--angle, 0deg)) * 0.5 + 0.5);
|
|
22
|
+
--adjust: calc(var(--variant, 0) * var(--clip-amplitude, 0));
|
|
23
|
+
--x: calc(50% + (cos(var(--angle, 0deg)) * (0.5 - var(--adjust, 0))) * var(--icon-size, 100%));
|
|
24
|
+
--y: calc(50% + (sin(var(--angle, 0deg)) * (0.5 - var(--adjust, 0))) * var(--icon-size, 100%));
|
|
25
|
+
result: #{"var(--x) var(--y)"};
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// F(X):[x,y] where X:[0..1]
|
|
29
|
+
@function ShapeMaker($it: 0, $name: "wavy-step", $steps: 100) {
|
|
30
|
+
$step: math.div($it, $steps);
|
|
31
|
+
@if $it == 0
|
|
32
|
+
{ @return "from --#{$name}(#{$step})"; } @else
|
|
33
|
+
{ @return "line to --#{$name}(#{$step})"; }
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// space cadet or cheater-tale
|
|
37
|
+
@function Integrate($name: "wavy-step", $steps: 100) {
|
|
38
|
+
$points: ();
|
|
39
|
+
@for $i from 0 through $steps { $points: list.append($points, ShapeMaker($i, $name, $steps), $separator: comma); }
|
|
40
|
+
@return "shape(evenodd #{$points}, close)";
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
//
|
|
44
|
+
@mixin wavy-shaped($detail: 100) {
|
|
45
|
+
--clip-amplitude: 0.05;
|
|
46
|
+
--clip-freq: 8;
|
|
47
|
+
--clip-path: #{Integrate("wavy-step", $detail)};
|
|
48
|
+
--icon-size: 100%;
|
|
49
|
+
--corrector: 1.1;
|
|
50
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
@forward "./misc";
|
|
2
|
+
/**
|
|
3
|
+
* Veela CSS - Core Runtime
|
|
4
|
+
*
|
|
5
|
+
* Shared foundation styles for all veela variants.
|
|
6
|
+
* This module provides:
|
|
7
|
+
* - CSS layer definitions
|
|
8
|
+
* - Normalize/reset styles
|
|
9
|
+
* - Core layout utilities
|
|
10
|
+
* - Base tokens and properties
|
|
11
|
+
* - Essential state management
|
|
12
|
+
*
|
|
13
|
+
* Inherited by: basic, advanced, beercss
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
@use "layers" as *;
|
|
17
|
+
@use "misc" as *;
|
|
18
|
+
@use "design" as *;
|
|
19
|
+
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Veela CSS - Core Runtime Loader
|
|
3
|
+
*
|
|
4
|
+
* Provides the shared foundation styles for all veela variants.
|
|
5
|
+
* Use this when you only need the essential normalize and layout utilities.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* import { loadCoreStyles } from "@fest-lib/veela/core";
|
|
10
|
+
* await loadCoreStyles();
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { loadAsAdopted } from "@fest-lib/dom"; //@ts-ignore
|
|
15
|
+
import styles from "./index.scss?inline";
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Load core veela styles (normalize + layout + states)
|
|
19
|
+
*/
|
|
20
|
+
export async function loadBasicStyles(): Promise<void> {
|
|
21
|
+
try {
|
|
22
|
+
await loadAsAdopted(styles);
|
|
23
|
+
console.log("[Veela/Core] Core styles loaded");
|
|
24
|
+
} catch (e) {
|
|
25
|
+
console.warn("[Veela/Core] Failed to load core styles:", e);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export default loadBasicStyles;
|