@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.
Files changed (78) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +533 -0
  3. package/dist/veela.js +878 -0
  4. package/package.json +83 -0
  5. package/src/scss/_layers.scss +16 -0
  6. package/src/scss/advanced/_index.scss +0 -0
  7. package/src/scss/advanced/animation/_motion.scss +317 -0
  8. package/src/scss/advanced/color/_color.scss +328 -0
  9. package/src/scss/advanced/color/_colorize.scss +325 -0
  10. package/src/scss/advanced/design/_design-tokens.scss +118 -0
  11. package/src/scss/advanced/design/_effects.scss +275 -0
  12. package/src/scss/advanced/design/_shadow.scss +359 -0
  13. package/src/scss/advanced/design/_surfaces.scss +76 -0
  14. package/src/scss/advanced/effects/_animations.scss +124 -0
  15. package/src/scss/advanced/effects/_shadows.scss +50 -0
  16. package/src/scss/advanced/font/_typography.scss +600 -0
  17. package/src/scss/advanced/index.scss +11 -0
  18. package/src/scss/advanced/index.ts +35 -0
  19. package/src/scss/advanced/layout/_content.scss +170 -0
  20. package/src/scss/advanced/layout/_index.scss +5 -0
  21. package/src/scss/advanced/layout/_normalize.scss +541 -0
  22. package/src/scss/advanced/layout/_shared-overlays.scss +162 -0
  23. package/src/scss/advanced/md3/_md3.scss +596 -0
  24. package/src/scss/advanced/md3/_utils.scss +114 -0
  25. package/src/scss/advanced/misc/_config.scss +119 -0
  26. package/src/scss/advanced/misc/_initials.scss +298 -0
  27. package/src/scss/advanced/misc/_mixins.scss +179 -0
  28. package/src/scss/advanced/misc/_queries.scss +34 -0
  29. package/src/scss/advanced/misc/_rendering.scss +82 -0
  30. package/src/scss/advanced/misc/_tokens.scss +74 -0
  31. package/src/scss/advanced/theme/_shared.scss +232 -0
  32. package/src/scss/advanced/theme/_states.scss +332 -0
  33. package/src/scss/advanced/theme/_variants.scss +354 -0
  34. package/src/scss/advanced/tokens/_material-color.scss +120 -0
  35. package/src/scss/advanced/tokens/_variables.scss +171 -0
  36. package/src/scss/basic/_layers.scss +0 -0
  37. package/src/scss/basic/design/_index.scss +3 -0
  38. package/src/scss/basic/design/_keyframes.scss +163 -0
  39. package/src/scss/basic/design/_shapes.scss +266 -0
  40. package/src/scss/basic/design/_wavy-runtime.scss +50 -0
  41. package/src/scss/basic/index.scss +19 -0
  42. package/src/scss/basic/index.ts +29 -0
  43. package/src/scss/basic/misc/_core-layout.scss +272 -0
  44. package/src/scss/basic/misc/_index.scss +18 -0
  45. package/src/scss/basic/misc/_layout.scss +1040 -0
  46. package/src/scss/basic/misc/_mixins.scss +179 -0
  47. package/src/scss/basic/misc/_motion.scss +28 -0
  48. package/src/scss/basic/misc/_normalize.scss +765 -0
  49. package/src/scss/basic/misc/_queries.scss +34 -0
  50. package/src/scss/basic/misc/_shared.scss +232 -0
  51. package/src/scss/basic/misc/_states.scss +135 -0
  52. package/src/scss/basic/misc/_tokens.scss +78 -0
  53. package/src/scss/basic/misc/_veela.scss +12 -0
  54. package/src/scss/core/index.scss +1 -0
  55. package/src/scss/core/interact/_draggable.scss +32 -0
  56. package/src/scss/core/interact/_position.scss +45 -0
  57. package/src/scss/core/interact/_ps-anchor.scss +28 -0
  58. package/src/scss/core/interact/_ps-centered.scss +28 -0
  59. package/src/scss/core/interact/_ps-cursor.scss +18 -0
  60. package/src/scss/core/interact/_ps-draggable.scss +25 -0
  61. package/src/scss/core/interact/_ps-mechanic.scss +0 -0
  62. package/src/scss/core/interact/_ps-properties.scss +54 -0
  63. package/src/scss/core/interact/_ps-resizable.scss +61 -0
  64. package/src/scss/core/interact/_resizable.scss +69 -0
  65. package/src/scss/core/interact/_viewport.scss +469 -0
  66. package/src/scss/core/misc/_color-properties.scss +64 -0
  67. package/src/scss/core/misc/_config.scss +110 -0
  68. package/src/scss/core/misc/_functions.scss +530 -0
  69. package/src/scss/core/misc/_icons.scss +109 -0
  70. package/src/scss/core/misc/_index.scss +6 -0
  71. package/src/scss/core/misc/_layout.scss +49 -0
  72. package/src/scss/core/misc/_mixins.scss +744 -0
  73. package/src/scss/core/misc/_properties.scss +245 -0
  74. package/src/scss/core/misc/_tokens.scss +947 -0
  75. package/src/scss/core/misc/_utilities.scss +941 -0
  76. package/src/scss/core/misc/_utils.scss +17 -0
  77. package/src/scss/index.scss +18 -0
  78. 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;