matefluency 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,562 @@
1
+ /*!
2
+ * MateFluency Design System v1.0.0
3
+ * EcoWestern Naturalism Design Language
4
+ * Copyright (c) 2026 EcoWestern. All rights reserved.
5
+ * https://ecowestern.net
6
+ *
7
+ * Proprietary license — free to use, no derivatives or redistribution.
8
+ * See LICENSE or https://ecowestern.net/matefluency/license for full terms.
9
+ */
10
+
11
+ /**
12
+ * MateFluency Design System — Base Layer
13
+ *
14
+ * Foundational body styles, CSS custom properties (design tokens),
15
+ * resets, and the signature fractal noise texture.
16
+ */
17
+
18
+ /* ─── Design Tokens ──────────────────────────── */
19
+
20
+ :root {
21
+ /* Brand colors */
22
+ --mf-green: #086d00;
23
+ --mf-green-focus: #1db100;
24
+ --mf-green-hover: #065a00;
25
+
26
+ /* Neutrals */
27
+ --mf-ink: #1d1d1f;
28
+ --mf-text-2: #515154;
29
+ --mf-text-3: #6e6e73;
30
+ --mf-separator: #e8e8ed;
31
+ --mf-canvas: #f7f7f2;
32
+
33
+ /* Typography */
34
+ --mf-font: "Google Sans", system-ui, -apple-system, BlinkMacSystemFont,
35
+ "Segoe UI", Roboto, sans-serif;
36
+ --mf-font-mono: source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace;
37
+
38
+ /* Easing — "release" feel: fast start, very soft landing */
39
+ --mf-ease: cubic-bezier(0.25, 1, 0.5, 1);
40
+
41
+ /* Radius */
42
+ --mf-radius-organic: 2rem;
43
+
44
+ /* Noise texture (inline SVG — no external request needed) */
45
+ --mf-noise: url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.03'/%3E%3C/svg%3E");
46
+ --mf-noise-surface: url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.5' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
47
+ }
48
+
49
+ /* ─── Document ──────────────────────────────── */
50
+
51
+ html {
52
+ scroll-behavior: smooth;
53
+ box-sizing: border-box;
54
+ }
55
+
56
+ *,
57
+ *::before,
58
+ *::after {
59
+ box-sizing: inherit;
60
+ }
61
+
62
+ /* ─── Body ───────────────────────────────────── */
63
+
64
+ body {
65
+ font-family: var(--mf-font);
66
+ font-weight: 400;
67
+ -webkit-font-smoothing: antialiased;
68
+ -moz-osx-font-smoothing: grayscale;
69
+ line-height: 1.6;
70
+ color: var(--mf-ink);
71
+ background-color: var(--mf-canvas);
72
+ background-image: var(--mf-noise);
73
+ }
74
+
75
+ /* ─── Focus & Accessibility ──────────────────── */
76
+
77
+ button:focus-visible,
78
+ a:focus-visible,
79
+ input:focus-visible,
80
+ textarea:focus-visible,
81
+ select:focus-visible {
82
+ outline: 2px solid var(--mf-green-focus);
83
+ outline-offset: 2px;
84
+ }
85
+
86
+ button:focus,
87
+ a:focus {
88
+ outline: 2px solid var(--mf-green-focus);
89
+ outline-offset: 2px;
90
+ }
91
+
92
+ /* ─── Resets ─────────────────────────────────── */
93
+
94
+ code,
95
+ pre,
96
+ kbd,
97
+ samp {
98
+ font-family: var(--mf-font-mono);
99
+ }
100
+
101
+ ul,
102
+ ol {
103
+ list-style: none;
104
+ padding: 0;
105
+ margin: 0;
106
+ }
107
+
108
+ a {
109
+ text-decoration: none;
110
+ color: inherit;
111
+ }
112
+
113
+ img,
114
+ video,
115
+ svg {
116
+ display: block;
117
+ max-width: 100%;
118
+ }
119
+
120
+ h1,
121
+ h2,
122
+ h3,
123
+ h4,
124
+ h5,
125
+ h6 {
126
+ margin: 0;
127
+ line-height: 1.1;
128
+ }
129
+
130
+ p {
131
+ margin: 0;
132
+ }
133
+
134
+ /**
135
+ * MateFluency Design System — Components Layer
136
+ *
137
+ * The core MateFluency surface system (.biodegradable),
138
+ * buttons, and geometry helpers. No Tailwind required —
139
+ * these are plain CSS classes that work in any framework.
140
+ */
141
+
142
+ /* ─── Surfaces ───────────────────────────────── */
143
+
144
+ /**
145
+ * .biodegradable
146
+ * The signature MateFluency surface. Frosted glass, but
147
+ * warmer and more grounded — like sunlight through paper.
148
+ *
149
+ * Usage: apply to any card, panel, navbar, or hero section.
150
+ */
151
+ .biodegradable {
152
+ background-color: rgba(255, 255, 255, 0.82);
153
+ backdrop-filter: blur(32px) saturate(110%);
154
+ -webkit-backdrop-filter: blur(32px) saturate(110%);
155
+
156
+ border: 1px solid rgba(0, 0, 0, 0.04);
157
+ box-shadow:
158
+ 0 2px 4px -1px rgba(0, 0, 0, 0.01),
159
+ inset 0 0 0 1px rgba(255, 255, 255, 0.5);
160
+ /* Tactile physical edge */
161
+
162
+ transition: all 0.5s var(--mf-ease, cubic-bezier(0.25, 1, 0.5, 1));
163
+ position: relative;
164
+ overflow: hidden;
165
+ /* Clips the ::before noise overlay */
166
+ }
167
+
168
+ /* Physical texture overlay — layered fractal noise on every surface */
169
+ .biodegradable::before {
170
+ content: "";
171
+ position: absolute;
172
+ inset: 0;
173
+ pointer-events: none;
174
+ opacity: 0.02;
175
+ background-image: var(--mf-noise-surface,
176
+ url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.5' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E"));
177
+ z-index: 0;
178
+ }
179
+
180
+ /* Ensure direct children sit above the texture overlay */
181
+ .biodegradable>* {
182
+ position: relative;
183
+ z-index: 1;
184
+ }
185
+
186
+ .biodegradable:hover {
187
+ background-color: rgba(255, 255, 255, 0.9);
188
+ border-color: rgba(0, 0, 0, 0.08);
189
+ transform: translateY(-2px);
190
+ }
191
+
192
+ /**
193
+ * .biodegradable-dark
194
+ * Dark variant for sidebars, modals, and dark-mode surfaces.
195
+ */
196
+ .biodegradable-dark {
197
+ background-color: rgba(29, 29, 31, 0.85);
198
+ backdrop-filter: blur(30px);
199
+ -webkit-backdrop-filter: blur(30px);
200
+ border: 1px solid rgba(255, 255, 255, 0.1);
201
+ color: #ffffff;
202
+ position: relative;
203
+ overflow: hidden;
204
+ transition: all 0.5s var(--mf-ease, cubic-bezier(0.25, 1, 0.5, 1));
205
+ }
206
+
207
+ .biodegradable-dark::before {
208
+ content: "";
209
+ position: absolute;
210
+ inset: 0;
211
+ pointer-events: none;
212
+ opacity: 0.03;
213
+ background-image: var(--mf-noise-surface,
214
+ url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.5' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E"));
215
+ z-index: 0;
216
+ }
217
+
218
+ .biodegradable-dark>* {
219
+ position: relative;
220
+ z-index: 1;
221
+ }
222
+
223
+ /* ─── Geometry ───────────────────────────────── */
224
+
225
+ /**
226
+ * .rounded-organic
227
+ * The signature leaf-like corner radius (2rem).
228
+ * Pair with .biodegradable on every card and panel.
229
+ */
230
+ .rounded-organic {
231
+ border-radius: var(--mf-radius-organic, 2rem);
232
+ }
233
+
234
+ /* ─── Buttons ────────────────────────────────── */
235
+
236
+ /**
237
+ * .mate-button
238
+ * Base button styles. Always pair with a variant:
239
+ * .mate-button-primary — brand green CTA
240
+ * .mate-button-secondary — neutral grey action
241
+ */
242
+ .mate-button {
243
+ display: inline-flex;
244
+ align-items: center;
245
+ justify-content: center;
246
+ gap: 0.5rem;
247
+ padding: 0.625rem 1.5rem;
248
+ /* py-2.5 px-6 */
249
+ border-radius: 9999px;
250
+ /* pill shape */
251
+ font-size: 0.875rem;
252
+ /* text-sm */
253
+ font-weight: 600;
254
+ font-family: var(--mf-font, inherit);
255
+ border: none;
256
+ cursor: pointer;
257
+ text-decoration: none;
258
+ transition: all 0.2s ease;
259
+ white-space: nowrap;
260
+ }
261
+
262
+ .mate-button-primary {
263
+ background-color: var(--mf-green, #086d00);
264
+ color: #ffffff;
265
+ }
266
+
267
+ .mate-button-primary:hover {
268
+ background-color: var(--mf-green-hover, #065a00);
269
+ transform: scale(1.02);
270
+ }
271
+
272
+ .mate-button-secondary {
273
+ background-color: #e5e7eb;
274
+ color: var(--mf-ink, #1d1d1f);
275
+ }
276
+
277
+ .mate-button-secondary:hover {
278
+ background-color: #d1d5db;
279
+ transform: scale(1.02);
280
+ }
281
+
282
+ /* ─── Accent Bar ─────────────────────────────── */
283
+
284
+ /**
285
+ * .mate-accent-bar
286
+ * The animated green bar used on feature cards.
287
+ * Grows from 3rem → 6rem when a parent has .group:hover
288
+ * (Tailwind) OR when a parent has the .is-hovered class.
289
+ *
290
+ * For Tailwind v4 users: use group-hover:w-24 inline.
291
+ */
292
+ .mate-accent-bar {
293
+ height: 0.375rem;
294
+ /* h-1.5 */
295
+ width: 3rem;
296
+ /* w-12 */
297
+ background-color: var(--mf-green, #086d00);
298
+ border-radius: 9999px;
299
+ transition: width 0.5s var(--mf-ease, cubic-bezier(0.25, 1, 0.5, 1));
300
+ }
301
+
302
+ /* Works when a parent container gains .is-hovered on mouseenter */
303
+ .is-hovered .mate-accent-bar,
304
+ :hover>.mate-accent-bar {
305
+ width: 6rem;
306
+ /* w-24 */
307
+ }
308
+
309
+ /**
310
+ * MateFluency Design System — Utilities & Motion Layer
311
+ *
312
+ * Animation keyframes, utility classes, and the full animation
313
+ * vocabulary used across the MateFluency design language.
314
+ */
315
+
316
+ /* ─── Keyframes ──────────────────────────────── */
317
+
318
+ @keyframes mf-fade-in-up {
319
+ from {
320
+ opacity: 0;
321
+ transform: translateY(20px);
322
+ }
323
+
324
+ to {
325
+ opacity: 1;
326
+ transform: translateY(0);
327
+ }
328
+ }
329
+
330
+ @keyframes mf-scroll {
331
+ 0% {
332
+ transform: translateX(0);
333
+ }
334
+
335
+ 100% {
336
+ transform: translateX(-50%);
337
+ }
338
+ }
339
+
340
+ @keyframes mf-scroll-reverse {
341
+ 0% {
342
+ transform: translateX(-50%);
343
+ }
344
+
345
+ 100% {
346
+ transform: translateX(0);
347
+ }
348
+ }
349
+
350
+ @keyframes mf-blob {
351
+ 0% {
352
+ transform: translate(0px, 0px) scale(1);
353
+ }
354
+
355
+ 33% {
356
+ transform: translate(30px, -50px) scale(1.1);
357
+ }
358
+
359
+ 66% {
360
+ transform: translate(-20px, 20px) scale(0.9);
361
+ }
362
+
363
+ 100% {
364
+ transform: translate(0px, 0px) scale(1);
365
+ }
366
+ }
367
+
368
+ @keyframes mf-float {
369
+ 0% {
370
+ transform: translateY(0px);
371
+ }
372
+
373
+ 50% {
374
+ transform: translateY(-20px);
375
+ }
376
+
377
+ 100% {
378
+ transform: translateY(0px);
379
+ }
380
+ }
381
+
382
+ @keyframes mf-breathe {
383
+
384
+ 0%,
385
+ 100% {
386
+ transform: scale(1);
387
+ }
388
+
389
+ 50% {
390
+ transform: scale(1.05);
391
+ }
392
+ }
393
+
394
+ /* ─── Animation Utility Classes ──────────────── */
395
+
396
+ /**
397
+ * .mf-animate-in
398
+ * Page-entry animation — fades content up from 20px.
399
+ * Apply to the first visible section on each page.
400
+ */
401
+ .mf-animate-in {
402
+ animation: mf-fade-in-up 0.8s cubic-bezier(0.16, 1, 0.3, 1) forwards;
403
+ }
404
+
405
+ /**
406
+ * .mf-scroll / .mf-scroll-reverse
407
+ * Infinite marquee strip. Apply to TWO duplicate containers
408
+ * inside a parent with overflow: hidden; display: flex.
409
+ * Both children must have the same class to avoid a reset flash.
410
+ */
411
+ .mf-scroll {
412
+ animation: mf-scroll 20s linear infinite;
413
+ }
414
+
415
+ .mf-scroll-reverse {
416
+ animation: mf-scroll-reverse 20s linear infinite;
417
+ }
418
+
419
+ /**
420
+ * .mf-blob
421
+ * Ambient background blob drift. Use on large blurred circles
422
+ * behind hero sections.
423
+ */
424
+ .mf-blob {
425
+ animation: mf-blob 7s infinite;
426
+ }
427
+
428
+ /**
429
+ * .mf-float
430
+ * Slow vertical float. Great for illustration SVGs or product
431
+ * images in hero sections.
432
+ */
433
+ .mf-float {
434
+ animation: mf-float 6s ease-in-out infinite;
435
+ }
436
+
437
+ /**
438
+ * .mf-breathe
439
+ * Subtle scale pulse. Use on ambient background shapes to make
440
+ * them feel alive.
441
+ */
442
+ .mf-breathe {
443
+ animation: mf-breathe 4s ease-in-out infinite;
444
+ }
445
+
446
+ /* ─── Text Utilities ─────────────────────────── */
447
+
448
+ /**
449
+ * .mf-text-balance
450
+ * Prevents awkward single-word last lines in headings.
451
+ * Especially useful on H1/H2 copy.
452
+ */
453
+ .mf-text-balance {
454
+ text-wrap: balance;
455
+ }
456
+
457
+ /* ─── Layout Utilities ───────────────────────── */
458
+
459
+ /**
460
+ * .mf-container
461
+ * The standard MateFluency page container.
462
+ * max-width: 72rem (1152px), centered, with responsive horizontal padding.
463
+ */
464
+ .mf-container {
465
+ max-width: 72rem;
466
+ margin-left: auto;
467
+ margin-right: auto;
468
+ padding-left: 1.5rem;
469
+ /* px-6 */
470
+ padding-right: 1.5rem;
471
+ }
472
+
473
+ @media (min-width: 768px) {
474
+ .mf-container {
475
+ padding-left: 2.5rem;
476
+ /* md:px-10 */
477
+ padding-right: 2.5rem;
478
+ }
479
+ }
480
+
481
+ /* ─── Typography Presets ─────────────────────── */
482
+
483
+ /**
484
+ * These classes mirror the canonical MateFluency type scale.
485
+ * You don't have to use them — they're provided as a convenience
486
+ * for non-Tailwind projects.
487
+ */
488
+
489
+ .mf-eyebrow {
490
+ font-size: 0.65rem;
491
+ font-weight: 700;
492
+ text-transform: uppercase;
493
+ letter-spacing: 0.3em;
494
+ color: var(--mf-green, #086d00);
495
+ }
496
+
497
+ @media (min-width: 768px) {
498
+ .mf-eyebrow {
499
+ font-size: 0.75rem;
500
+ }
501
+ }
502
+
503
+ .mf-h1 {
504
+ font-size: 2.25rem;
505
+ /* text-4xl */
506
+ font-weight: 800;
507
+ letter-spacing: -0.025em;
508
+ line-height: 1.05;
509
+ color: var(--mf-ink, #1d1d1f);
510
+ text-wrap: balance;
511
+ }
512
+
513
+ @media (min-width: 640px) {
514
+ .mf-h1 {
515
+ font-size: 3rem;
516
+ }
517
+ }
518
+
519
+ /* sm:text-5xl */
520
+ @media (min-width: 768px) {
521
+ .mf-h1 {
522
+ font-size: 4.5rem;
523
+ }
524
+ }
525
+
526
+ /* md:text-7xl */
527
+
528
+ .mf-h2 {
529
+ font-size: 1.875rem;
530
+ /* text-3xl */
531
+ font-weight: 700;
532
+ letter-spacing: -0.025em;
533
+ color: var(--mf-ink, #1d1d1f);
534
+ }
535
+
536
+ .mf-h3 {
537
+ font-size: 1.5rem;
538
+ /* text-2xl */
539
+ font-weight: 700;
540
+ color: var(--mf-ink, #1d1d1f);
541
+ }
542
+
543
+ .mf-body {
544
+ font-size: 1rem;
545
+ font-weight: 500;
546
+ line-height: 1.75;
547
+ color: var(--mf-text-2, #515154);
548
+ text-wrap: balance;
549
+ }
550
+
551
+ @media (min-width: 768px) {
552
+ .mf-body {
553
+ font-size: 1.25rem;
554
+ /* md:text-xl */
555
+ }
556
+ }
557
+
558
+ .mf-meta {
559
+ font-size: 0.75rem;
560
+ font-weight: 600;
561
+ color: var(--mf-text-3, #6e6e73);
562
+ }
@@ -0,0 +1,18 @@
1
+ /*!
2
+ * MateFluency — Tailwind CSS v4 Add-on v1.0.0
3
+ * Import this file in your globals.css (before or after @import "tailwindcss")
4
+ */
5
+
6
+ @import "./matefluency.css";
7
+
8
+ @theme {
9
+ --font-sans: var(--mf-font);
10
+ --font-display: var(--mf-font);
11
+
12
+ --animate-scroll: mf-scroll 20s linear infinite;
13
+ --animate-scroll-reverse: mf-scroll-reverse 20s linear infinite;
14
+ --animate-blob: mf-blob 7s infinite;
15
+ --animate-float: mf-float 6s ease-in-out infinite;
16
+ --animate-breathe: mf-breathe 4s ease-in-out infinite;
17
+ --animate-in-up: mf-fade-in-up 0.8s cubic-bezier(0.16, 1, 0.3, 1) forwards;
18
+ }