@moltenagentic/human-elements 0.1.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,558 @@
1
+ /*
2
+ * Molten Shared Utilities
3
+ * Common visual classes used across all human-facing interfaces.
4
+ * Consumers import this alongside their own Tailwind setup.
5
+ */
6
+
7
+ /* ── HalfHero mobile spacing ─────────────────────────── */
8
+ @media (max-width: 639px) {
9
+ .he-nav-spacing { padding-bottom: 16px; }
10
+ .he-content-spacing { padding-bottom: 24px; }
11
+ }
12
+
13
+ /* ── Molten gradient text ────────────────────────────── */
14
+ .molten-text {
15
+ background: linear-gradient(
16
+ 180deg,
17
+ #ffd700 0%,
18
+ #fb9f0d 25%,
19
+ #ed6314 55%,
20
+ #da3816 78%,
21
+ #ab1b1d 100%
22
+ );
23
+ -webkit-background-clip: text;
24
+ -webkit-text-fill-color: transparent;
25
+ background-clip: text;
26
+ }
27
+
28
+ /* ── Glass card ──────────────────────────────────────── */
29
+ .glass-card {
30
+ background: rgba(12, 12, 12, 0.75);
31
+ backdrop-filter: blur(14px);
32
+ border: 1px solid rgba(255, 255, 255, 0.15);
33
+ }
34
+
35
+ .glass-card-subtle {
36
+ background: rgba(24, 24, 27, 0.4);
37
+ backdrop-filter: blur(12px);
38
+ border: 1px solid rgba(255, 255, 255, 0.05);
39
+ border-radius: 20px;
40
+ }
41
+
42
+ .glass-card-minimal {
43
+ background: rgba(24, 24, 27, 0.2);
44
+ backdrop-filter: blur(8px);
45
+ border: 1px solid rgba(255, 255, 255, 0.03);
46
+ }
47
+
48
+ /* ── Corner bracket frame ────────────────────────────── */
49
+ .corner-frame::after {
50
+ content: '';
51
+ position: absolute;
52
+ inset: -1px;
53
+ border: 2.5px solid rgba(255, 255, 255, 0.55);
54
+ border-radius: 16px;
55
+ pointer-events: none;
56
+ z-index: 1;
57
+ -webkit-mask-image:
58
+ linear-gradient(#fff, #fff),
59
+ linear-gradient(#fff, #fff),
60
+ linear-gradient(#fff, #fff),
61
+ linear-gradient(#fff, #fff);
62
+ -webkit-mask-position: 0 0, 100% 0, 0 100%, 100% 100%;
63
+ -webkit-mask-size: 28px 28px;
64
+ -webkit-mask-repeat: no-repeat;
65
+ mask-image:
66
+ linear-gradient(#fff, #fff),
67
+ linear-gradient(#fff, #fff),
68
+ linear-gradient(#fff, #fff),
69
+ linear-gradient(#fff, #fff);
70
+ mask-position: 0 0, 100% 0, 0 100%, 100% 100%;
71
+ mask-size: 28px 28px;
72
+ mask-repeat: no-repeat;
73
+ }
74
+
75
+ /* ── Molten wave keyframes ───────────────────────────── */
76
+ @keyframes molten-wave {
77
+ 0% { background-position: 0% 50%; }
78
+ 100% { background-position: 200% 50%; }
79
+ }
80
+
81
+ /* ── Molten wave animated border for cards ───────────── */
82
+ .molten-wave-card {
83
+ position: relative;
84
+ transition: box-shadow 0.4s ease;
85
+ }
86
+
87
+ .molten-wave-card::before {
88
+ content: '';
89
+ position: absolute;
90
+ inset: -1px;
91
+ border-radius: 16px;
92
+ padding: 1px;
93
+ background: var(--molten-gradient);
94
+ background-size: 200% 100%;
95
+ animation: molten-wave 3s linear infinite;
96
+ opacity: 0;
97
+ transition: opacity 0.4s ease;
98
+ -webkit-mask:
99
+ linear-gradient(#fff 0 0) content-box,
100
+ linear-gradient(#fff 0 0);
101
+ mask:
102
+ linear-gradient(#fff 0 0) content-box,
103
+ linear-gradient(#fff 0 0);
104
+ -webkit-mask-composite: xor;
105
+ mask-composite: exclude;
106
+ z-index: -1;
107
+ }
108
+
109
+ .molten-wave-card:hover::before {
110
+ opacity: 1;
111
+ }
112
+
113
+ .molten-wave-card:hover {
114
+ box-shadow:
115
+ 0 0 24px rgba(251, 159, 13, 0.12),
116
+ 0 0 60px rgba(171, 27, 29, 0.06);
117
+ }
118
+
119
+ /* ── Molten wave text (animated gradient on hover) ───── */
120
+ .molten-wave-text {
121
+ transition: all 0.4s ease;
122
+ }
123
+
124
+ .group:hover .molten-wave-text {
125
+ background: var(--molten-gradient);
126
+ background-size: 200% 100%;
127
+ -webkit-background-clip: text;
128
+ -webkit-text-fill-color: transparent;
129
+ background-clip: text;
130
+ animation: molten-wave 3s linear infinite;
131
+ }
132
+
133
+ /* ── Molten card glow (breathing halo) ───────────────── */
134
+ .molten-card-glow {
135
+ box-shadow:
136
+ 0 0 30px rgba(251, 159, 13, 0.06),
137
+ 0 0 60px rgba(171, 27, 29, 0.04);
138
+ animation: molten-breathe 4s ease-in-out infinite;
139
+ }
140
+
141
+ @keyframes molten-breathe {
142
+ 0%, 100% {
143
+ box-shadow:
144
+ 0 0 30px rgba(251, 159, 13, 0.06),
145
+ 0 0 60px rgba(171, 27, 29, 0.04);
146
+ }
147
+ 50% {
148
+ box-shadow:
149
+ 0 0 40px rgba(251, 159, 13, 0.12),
150
+ 0 0 80px rgba(171, 27, 29, 0.07),
151
+ 0 0 120px rgba(251, 159, 13, 0.03);
152
+ }
153
+ }
154
+
155
+ /* ── Rainbow border keyframes ────────────────────────── */
156
+ @keyframes rainbow-rotate {
157
+ 0% { background-position: 0% 50%; }
158
+ 100% { background-position: 200% 50%; }
159
+ }
160
+
161
+ /* ── Rainbow border for buttons ──────────────────────── */
162
+ .rainbow-border-button {
163
+ position: relative;
164
+ background: transparent;
165
+ }
166
+
167
+ .rainbow-border-button::after {
168
+ content: '';
169
+ position: absolute;
170
+ inset: -6px;
171
+ border-radius: 14px;
172
+ background: rgba(24, 24, 27, 0.9);
173
+ z-index: -2;
174
+ }
175
+
176
+ [data-theme="night"] .rainbow-border-button {
177
+ background: transparent !important;
178
+ color: #71717a !important;
179
+ }
180
+
181
+ [data-theme="night"] .rainbow-border-button::after {
182
+ display: none;
183
+ }
184
+
185
+ .rainbow-border-button::before {
186
+ content: '';
187
+ position: absolute;
188
+ inset: -1.5px;
189
+ border-radius: 10px;
190
+ padding: 1.5px;
191
+ background: var(--molten-gradient);
192
+ background-size: 200% 100%;
193
+ animation: rainbow-rotate 2s linear infinite;
194
+ -webkit-mask:
195
+ linear-gradient(#fff 0 0) content-box,
196
+ linear-gradient(#fff 0 0);
197
+ mask:
198
+ linear-gradient(#fff 0 0) content-box,
199
+ linear-gradient(#fff 0 0);
200
+ -webkit-mask-composite: xor;
201
+ mask-composite: exclude;
202
+ z-index: -1;
203
+ }
204
+
205
+ /* ── Rainbow border for cards ────────────────────────── */
206
+ .rainbow-border-card {
207
+ position: relative;
208
+ }
209
+
210
+ .rainbow-border-card::before {
211
+ content: '';
212
+ position: absolute;
213
+ inset: -6px;
214
+ border-radius: 26px;
215
+ padding: 1.5px;
216
+ background: var(--molten-gradient);
217
+ background-size: 200% 100%;
218
+ animation: rainbow-rotate 2s linear infinite;
219
+ -webkit-mask:
220
+ linear-gradient(#fff 0 0) content-box,
221
+ linear-gradient(#fff 0 0);
222
+ mask:
223
+ linear-gradient(#fff 0 0) content-box,
224
+ linear-gradient(#fff 0 0);
225
+ -webkit-mask-composite: xor;
226
+ mask-composite: exclude;
227
+ z-index: 0;
228
+ pointer-events: none;
229
+ }
230
+
231
+ /* ── Rainbow border for circular elements ────────────── */
232
+ .rainbow-border-thin {
233
+ position: relative;
234
+ background: transparent;
235
+ }
236
+
237
+ .rainbow-border-thin::before {
238
+ content: '';
239
+ position: absolute;
240
+ inset: -2px;
241
+ border-radius: 50%;
242
+ padding: 2px;
243
+ background: var(--molten-gradient);
244
+ background-size: 200% 100%;
245
+ animation: rainbow-rotate 2s linear infinite;
246
+ -webkit-mask:
247
+ linear-gradient(#fff 0 0) content-box,
248
+ linear-gradient(#fff 0 0);
249
+ mask:
250
+ linear-gradient(#fff 0 0) content-box,
251
+ linear-gradient(#fff 0 0);
252
+ -webkit-mask-composite: xor;
253
+ mask-composite: exclude;
254
+ }
255
+
256
+ /* ── Rainbow animated text ───────────────────────────── */
257
+ .rainbow-text-animated {
258
+ background: var(--molten-gradient);
259
+ background-size: 200% 100%;
260
+ animation: rainbow-rotate 2s linear infinite;
261
+ -webkit-background-clip: text;
262
+ background-clip: text;
263
+ -webkit-text-fill-color: transparent;
264
+ }
265
+
266
+ /* ── Sphere ambient glow ─────────────────────────────── */
267
+ .sphere-glow {
268
+ position: absolute;
269
+ width: 600px;
270
+ height: 600px;
271
+ top: 30%;
272
+ left: 50%;
273
+ transform: translate(-50%, -50%);
274
+ background: radial-gradient(
275
+ circle,
276
+ rgba(251, 159, 13, 0.09) 0%,
277
+ rgba(218, 56, 22, 0.04) 40%,
278
+ transparent 70%
279
+ );
280
+ filter: blur(60px);
281
+ pointer-events: none;
282
+ }
283
+
284
+ /* ── Scanlines (subtle CRT feel) ─────────────────────── */
285
+ .scanlines::after {
286
+ content: '';
287
+ position: fixed;
288
+ inset: 0;
289
+ background: repeating-linear-gradient(
290
+ 0deg,
291
+ transparent,
292
+ transparent 2px,
293
+ rgba(0, 0, 0, 0.03) 2px,
294
+ rgba(0, 0, 0, 0.03) 4px
295
+ );
296
+ pointer-events: none;
297
+ z-index: 100;
298
+ }
299
+
300
+ /* ── Vignette ────────────────────────────────────────── */
301
+ .vignette {
302
+ background: radial-gradient(
303
+ ellipse at center,
304
+ transparent 0%,
305
+ transparent 55%,
306
+ rgba(0, 0, 0, 0.55) 100%
307
+ );
308
+ }
309
+
310
+ /* ── Radial gradient utility ─────────────────────────── */
311
+ .bg-gradient-radial {
312
+ background: radial-gradient(circle at center, var(--tw-gradient-stops));
313
+ }
314
+
315
+ /* ── Row fade in animation ───────────────────────────── */
316
+ @keyframes fadeInRow {
317
+ from {
318
+ opacity: 0;
319
+ transform: translateY(10px);
320
+ }
321
+ to {
322
+ opacity: 1;
323
+ transform: translateY(0);
324
+ }
325
+ }
326
+
327
+ /* ── ASCII art lava effect ───────────────────────────── */
328
+ .ascii-art-lava {
329
+ position: relative;
330
+ filter: brightness(1.5);
331
+ }
332
+
333
+ .ascii-art-lava table,
334
+ .ascii-art-lava td {
335
+ background: transparent !important;
336
+ }
337
+
338
+ .ascii-art-lava td {
339
+ background: var(--molten-gradient) !important;
340
+ background-size: 200% 100% !important;
341
+ animation: molten-wave 2s linear infinite !important;
342
+ -webkit-background-clip: text !important;
343
+ background-clip: text !important;
344
+ -webkit-text-fill-color: transparent !important;
345
+ }
346
+
347
+ /* ── Molten field (warm saturated surface) ────────────── */
348
+ .molten-field {
349
+ background: var(--molten-field-gradient);
350
+ }
351
+
352
+ .molten-field-intense {
353
+ background: radial-gradient(
354
+ ellipse at 50% 40%,
355
+ var(--molten-field-hot, #f86820) 0%,
356
+ var(--molten-field-bright) 25%,
357
+ var(--molten-field-base) 50%,
358
+ var(--molten-field-deep) 80%,
359
+ var(--molten-field-shadow) 100%
360
+ );
361
+ }
362
+
363
+ .molten-field-subtle {
364
+ background: radial-gradient(
365
+ ellipse at 50% 45%,
366
+ var(--molten-field-base) 0%,
367
+ var(--molten-field-deep) 50%,
368
+ var(--molten-field-shadow) 85%,
369
+ var(--molten-field-abyss) 100%
370
+ );
371
+ }
372
+
373
+ .molten-field-flat {
374
+ background: var(--molten-field-base);
375
+ }
376
+
377
+ .molten-field-vignette {
378
+ background: radial-gradient(
379
+ ellipse at 50% 40%,
380
+ var(--molten-field-bright) 0%,
381
+ var(--molten-field-base) 30%,
382
+ var(--molten-field-deep) 60%,
383
+ var(--molten-field-abyss) 100%
384
+ );
385
+ }
386
+
387
+ /* ── Product nav bar ─────────────────────────────────── */
388
+ .product-nav-bar {
389
+ background: rgba(0, 0, 0, 0.55);
390
+ backdrop-filter: blur(24px) saturate(1.4);
391
+ border: 1px solid rgba(251, 159, 13, 0.08);
392
+ border-radius: 2px;
393
+ position: relative;
394
+ box-shadow:
395
+ 0 0 0 1px rgba(0, 0, 0, 0.4),
396
+ 0 2px 12px rgba(0, 0, 0, 0.3),
397
+ inset 0 1px 0 rgba(255, 255, 255, 0.04);
398
+ }
399
+
400
+ .product-nav-bar::after {
401
+ content: '';
402
+ position: absolute;
403
+ bottom: -1px;
404
+ left: 20%;
405
+ right: 20%;
406
+ height: 1px;
407
+ background: linear-gradient(
408
+ 90deg,
409
+ transparent,
410
+ rgba(251, 159, 13, 0.25),
411
+ rgba(237, 99, 20, 0.35),
412
+ rgba(251, 159, 13, 0.25),
413
+ transparent
414
+ );
415
+ pointer-events: none;
416
+ }
417
+
418
+ .product-nav-bar::before {
419
+ content: '';
420
+ position: absolute;
421
+ inset: -1px;
422
+ border: 1px solid rgba(255, 255, 255, 0.06);
423
+ border-radius: 2px;
424
+ pointer-events: none;
425
+ -webkit-mask-image:
426
+ linear-gradient(#fff, #fff),
427
+ linear-gradient(#fff, #fff),
428
+ linear-gradient(#fff, #fff),
429
+ linear-gradient(#fff, #fff);
430
+ -webkit-mask-position: 0 0, 100% 0, 0 100%, 100% 100%;
431
+ -webkit-mask-size: 10px 10px;
432
+ -webkit-mask-repeat: no-repeat;
433
+ mask-image:
434
+ linear-gradient(#fff, #fff),
435
+ linear-gradient(#fff, #fff),
436
+ linear-gradient(#fff, #fff),
437
+ linear-gradient(#fff, #fff);
438
+ mask-position: 0 0, 100% 0, 0 100%, 100% 100%;
439
+ mask-size: 10px 10px;
440
+ mask-repeat: no-repeat;
441
+ }
442
+
443
+ .product-nav-action {
444
+ display: flex;
445
+ align-items: center;
446
+ justify-content: center;
447
+ width: 34px;
448
+ height: 34px;
449
+ border: none;
450
+ border-radius: 2px;
451
+ color: rgba(255, 255, 255, 0.45);
452
+ background: rgba(255, 255, 255, 0.03);
453
+ cursor: pointer;
454
+ transition: all 0.2s ease;
455
+ font-family: inherit;
456
+ padding: 0;
457
+ position: relative;
458
+ }
459
+
460
+ .product-nav-action::after {
461
+ content: '';
462
+ position: absolute;
463
+ inset: 0;
464
+ border-radius: 2px;
465
+ border: 1px solid rgba(255, 255, 255, 0.06);
466
+ pointer-events: none;
467
+ transition: border-color 0.2s ease;
468
+ }
469
+
470
+ .product-nav-action:hover {
471
+ color: #fff;
472
+ background: rgba(251, 159, 13, 0.06);
473
+ }
474
+
475
+ .product-nav-action:hover::after {
476
+ border-color: rgba(251, 159, 13, 0.2);
477
+ }
478
+
479
+ .product-nav-dropdown {
480
+ background: rgba(0, 0, 0, 0.88);
481
+ backdrop-filter: blur(24px) saturate(1.3);
482
+ border: 1px solid rgba(251, 159, 13, 0.08);
483
+ border-radius: 2px;
484
+ box-shadow:
485
+ 0 8px 32px rgba(0, 0, 0, 0.5),
486
+ 0 0 0 1px rgba(0, 0, 0, 0.3);
487
+ }
488
+
489
+ .product-nav-dropdown::after {
490
+ content: '';
491
+ position: absolute;
492
+ top: -1px;
493
+ left: 12px;
494
+ right: 12px;
495
+ height: 1px;
496
+ background: linear-gradient(
497
+ 90deg,
498
+ transparent,
499
+ rgba(251, 159, 13, 0.15),
500
+ transparent
501
+ );
502
+ pointer-events: none;
503
+ }
504
+
505
+ /* ── Stamped hero content (flat black on field) ──────── */
506
+ .stamped-heading {
507
+ color: #000;
508
+ font-weight: 900;
509
+ letter-spacing: -0.03em;
510
+ line-height: 0.9;
511
+ }
512
+
513
+ .stamped-subtext {
514
+ color: rgba(0, 0, 0, 0.5);
515
+ font-weight: 400;
516
+ letter-spacing: 0.12em;
517
+ text-transform: uppercase;
518
+ }
519
+
520
+ .stamped-card {
521
+ background: transparent;
522
+ border: 1.5px solid #000;
523
+ border-radius: 0;
524
+ color: #000;
525
+ }
526
+
527
+ .stamped-card-filled {
528
+ background: #000;
529
+ border: 1.5px solid #000;
530
+ border-radius: 0;
531
+ color: #fff;
532
+ }
533
+
534
+ .stamped-code {
535
+ background: rgba(0, 0, 0, 0.08);
536
+ border: 1px solid rgba(0, 0, 0, 0.2);
537
+ border-radius: 0;
538
+ color: #000;
539
+ font-family: monospace;
540
+ }
541
+
542
+ /* ── Custom scrollbar ────────────────────────────────── */
543
+ ::-webkit-scrollbar { width: 8px; }
544
+ ::-webkit-scrollbar-track { background: #111; }
545
+ ::-webkit-scrollbar-thumb { background: #333; border-radius: 4px; }
546
+ ::-webkit-scrollbar-thumb:hover { background: #555; }
547
+
548
+ .custom-scrollbar::-webkit-scrollbar { width: 6px; }
549
+ .custom-scrollbar::-webkit-scrollbar-track { background: transparent; }
550
+ .custom-scrollbar::-webkit-scrollbar-thumb { background: rgba(63, 63, 70, 0.5); border-radius: 3px; }
551
+ .custom-scrollbar::-webkit-scrollbar-thumb:hover { background: rgba(82, 82, 91, 0.7); }
552
+ .custom-scrollbar { scrollbar-width: thin; scrollbar-color: rgba(63, 63, 70, 0.5) transparent; }
553
+
554
+ .scrollbar-hide {
555
+ -ms-overflow-style: none;
556
+ scrollbar-width: none;
557
+ }
558
+ .scrollbar-hide::-webkit-scrollbar { display: none; }
package/package.json ADDED
@@ -0,0 +1,68 @@
1
+ {
2
+ "name": "@moltenagentic/human-elements",
3
+ "version": "0.1.0",
4
+ "description": "Shared design system and UI components for Molten's human-facing interfaces",
5
+ "type": "module",
6
+ "packageManager": "pnpm@9.15.0",
7
+ "main": "./dist/index.js",
8
+ "module": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "import": "./dist/index.js",
13
+ "types": "./dist/index.d.ts"
14
+ },
15
+ "./styles": "./dist/styles/index.css",
16
+ "./styles/tokens": "./dist/styles/tokens.css",
17
+ "./styles/utilities": "./dist/styles/utilities.css",
18
+ "./dist/*": "./dist/*",
19
+ "./assets/*": "./assets/*",
20
+ "./fonts": {
21
+ "import": "./dist/fonts/index.js",
22
+ "types": "./dist/fonts/index.d.ts"
23
+ }
24
+ },
25
+ "files": [
26
+ "dist",
27
+ "assets"
28
+ ],
29
+ "publishConfig": {
30
+ "access": "public"
31
+ },
32
+ "scripts": {
33
+ "build": "tsup && pnpm run copy:styles",
34
+ "copy:styles": "mkdir -p dist/styles && cp src/styles/*.css dist/styles/",
35
+ "dev": "tsup --watch",
36
+ "visualize": "npx tsx showcase/server.ts",
37
+ "lint": "eslint",
38
+ "typecheck": "tsc --noEmit"
39
+ },
40
+ "peerDependencies": {
41
+ "react": ">=18",
42
+ "react-dom": ">=18",
43
+ "@react-three/fiber": ">=9",
44
+ "three": ">=0.160",
45
+ "gsap": ">=3",
46
+ "@gsap/react": ">=2"
47
+ },
48
+ "peerDependenciesMeta": {
49
+ "@react-three/fiber": { "optional": true },
50
+ "three": { "optional": true },
51
+ "gsap": { "optional": true },
52
+ "@gsap/react": { "optional": true }
53
+ },
54
+ "devDependencies": {
55
+ "@gsap/react": "^2.1.2",
56
+ "@react-three/fiber": "^9.5.0",
57
+ "@types/node": "^20",
58
+ "@types/react": "^19",
59
+ "@types/react-dom": "^19",
60
+ "@types/three": "^0.183.1",
61
+ "gsap": "^3.14.2",
62
+ "react": "19.2.4",
63
+ "react-dom": "19.2.4",
64
+ "three": "^0.183.2",
65
+ "tsup": "^8",
66
+ "typescript": "^5"
67
+ }
68
+ }