@jjlmoya/utils-creative 1.3.0 → 1.4.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.
@@ -1,5 +1,4 @@
1
1
  ---
2
- import './style.css';
3
2
  ---
4
3
 
5
4
  <div id="dice-roller-root" class="dr-root">
@@ -228,3 +227,481 @@ import './style.css';
228
227
  historyList.innerHTML = '<p class="dr-history-empty">El historial de tiradas aparecerá aquí</p>';
229
228
  });
230
229
  </script>
230
+
231
+ <style>
232
+ .dr-root {
233
+ --dr-bg: #fff;
234
+ --dr-bg-muted: #f8fafc;
235
+ --dr-bg-card: #fff;
236
+ --dr-text: #0f172a;
237
+ --dr-text-muted: #64748b;
238
+ --dr-border: #e2e8f0;
239
+ --dr-primary: #7c3aed;
240
+ --dr-primary-light: #ede9fe;
241
+ --dr-primary-dark: #5b21b6;
242
+ --dr-accent: #f59e0b;
243
+ --dr-danger: #ef4444;
244
+ --dr-success: #10b981;
245
+ --dr-shadow-sm: 0 1px 3px rgba(0,0,0,0.08);
246
+ --dr-shadow-md: 0 4px 16px rgba(0,0,0,0.1);
247
+ --dr-shadow-lg: 0 8px 32px rgba(0,0,0,0.12);
248
+ --dr-radius: 1rem;
249
+ --dr-radius-sm: 0.5rem;
250
+
251
+ display: grid;
252
+ grid-template-columns: 1fr 1fr;
253
+ gap: 1.5rem;
254
+ max-width: 900px;
255
+ margin: 0 auto;
256
+ padding: 1rem;
257
+ }
258
+
259
+ :global(.theme-dark) .dr-root {
260
+ --dr-bg: #0f172a;
261
+ --dr-bg-muted: #1e293b;
262
+ --dr-bg-card: #1e293b;
263
+ --dr-text: #f1f5f9;
264
+ --dr-text-muted: #94a3b8;
265
+ --dr-border: #334155;
266
+ --dr-primary: #a78bfa;
267
+ --dr-primary-light: #2d1b69;
268
+ --dr-primary-dark: #7c3aed;
269
+ --dr-accent: #fbbf24;
270
+ --dr-shadow-sm: 0 1px 3px rgba(0,0,0,0.3);
271
+ --dr-shadow-md: 0 4px 16px rgba(0,0,0,0.4);
272
+ --dr-shadow-lg: 0 8px 32px rgba(0,0,0,0.5);
273
+ }
274
+
275
+ @media (max-width: 680px) {
276
+ .dr-root {
277
+ grid-template-columns: 1fr;
278
+ }
279
+ }
280
+
281
+ .dr-panel {
282
+ background: var(--dr-bg-card);
283
+ border: 1px solid var(--dr-border);
284
+ border-radius: var(--dr-radius);
285
+ box-shadow: var(--dr-shadow-md);
286
+ padding: 1.5rem;
287
+ display: flex;
288
+ flex-direction: column;
289
+ gap: 1.25rem;
290
+ }
291
+
292
+ .dr-label {
293
+ font-size: 0.75rem;
294
+ font-weight: 600;
295
+ text-transform: uppercase;
296
+ letter-spacing: 0.08em;
297
+ color: var(--dr-text-muted);
298
+ margin: 0 0 0.625rem;
299
+ }
300
+
301
+ .dr-dice-grid {
302
+ display: grid;
303
+ grid-template-columns: repeat(4, 1fr);
304
+ gap: 0.5rem;
305
+ }
306
+
307
+ .dr-die-btn {
308
+ display: flex;
309
+ align-items: center;
310
+ justify-content: center;
311
+ padding: 0.75rem 0.5rem;
312
+ background: var(--dr-bg-muted);
313
+ border: 1px solid var(--dr-border);
314
+ border-radius: var(--dr-radius-sm);
315
+ cursor: pointer;
316
+ transition: background 0.15s, border-color 0.15s, transform 0.1s;
317
+ color: var(--dr-primary);
318
+ font-size: 0.85rem;
319
+ font-weight: 700;
320
+ }
321
+
322
+ .dr-die-btn:hover {
323
+ background: var(--dr-primary-light);
324
+ border-color: var(--dr-primary);
325
+ transform: translateY(-2px);
326
+ }
327
+
328
+ .dr-die-btn:active {
329
+ transform: translateY(0);
330
+ }
331
+
332
+ .dr-pool-section {
333
+ border: 1px solid var(--dr-border);
334
+ border-radius: var(--dr-radius-sm);
335
+ padding: 0.875rem;
336
+ background: var(--dr-bg-muted);
337
+ }
338
+
339
+ .dr-pool-header {
340
+ display: flex;
341
+ justify-content: space-between;
342
+ align-items: center;
343
+ margin-bottom: 0.5rem;
344
+ }
345
+
346
+ .dr-pool-header .dr-label {
347
+ margin-bottom: 0;
348
+ }
349
+
350
+ .dr-clear-btn {
351
+ font-size: 0.7rem;
352
+ font-weight: 600;
353
+ color: var(--dr-text-muted);
354
+ background: none;
355
+ border: 1px solid var(--dr-border);
356
+ border-radius: 0.375rem;
357
+ padding: 0.2rem 0.5rem;
358
+ cursor: pointer;
359
+ transition: color 0.15s, border-color 0.15s;
360
+ }
361
+
362
+ .dr-clear-btn:hover {
363
+ color: var(--dr-danger);
364
+ border-color: var(--dr-danger);
365
+ }
366
+
367
+ .dr-pool-display {
368
+ display: flex;
369
+ flex-wrap: wrap;
370
+ gap: 0.5rem;
371
+ min-height: 2.5rem;
372
+ align-items: center;
373
+ }
374
+
375
+ .dr-pool-empty {
376
+ font-size: 0.8rem;
377
+ color: var(--dr-text-muted);
378
+ font-style: italic;
379
+ }
380
+
381
+ .dr-pool-chip {
382
+ display: flex;
383
+ align-items: center;
384
+ gap: 0.25rem;
385
+ background: var(--dr-primary-light);
386
+ border: 1px solid var(--dr-primary);
387
+ border-radius: 2rem;
388
+ padding: 0.2rem 0.5rem 0.2rem 0.75rem;
389
+ }
390
+
391
+ .dr-chip-label {
392
+ font-size: 0.8rem;
393
+ font-weight: 700;
394
+ color: var(--dr-primary);
395
+ }
396
+
397
+ .dr-chip-remove {
398
+ width: 1.125rem;
399
+ height: 1.125rem;
400
+ border-radius: 50%;
401
+ border: none;
402
+ background: var(--dr-primary);
403
+ color: #fff;
404
+ font-size: 0.8rem;
405
+ line-height: 1;
406
+ cursor: pointer;
407
+ display: flex;
408
+ align-items: center;
409
+ justify-content: center;
410
+ transition: background 0.15s;
411
+ padding: 0;
412
+ }
413
+
414
+ .dr-chip-remove:hover {
415
+ background: var(--dr-primary-dark);
416
+ }
417
+
418
+ .dr-modifier-section {
419
+ display: flex;
420
+ align-items: center;
421
+ justify-content: space-between;
422
+ }
423
+
424
+ .dr-modifier-controls {
425
+ display: flex;
426
+ align-items: center;
427
+ gap: 0.75rem;
428
+ background: var(--dr-bg-muted);
429
+ border: 1px solid var(--dr-border);
430
+ border-radius: 2rem;
431
+ padding: 0.25rem 0.5rem;
432
+ }
433
+
434
+ .dr-mod-btn {
435
+ width: 1.75rem;
436
+ height: 1.75rem;
437
+ border-radius: 50%;
438
+ border: 1px solid var(--dr-border);
439
+ background: var(--dr-bg-card);
440
+ color: var(--dr-text);
441
+ font-size: 1rem;
442
+ font-weight: 700;
443
+ cursor: pointer;
444
+ display: flex;
445
+ align-items: center;
446
+ justify-content: center;
447
+ transition: background 0.15s, border-color 0.15s;
448
+ line-height: 1;
449
+ padding: 0;
450
+ }
451
+
452
+ .dr-mod-btn:hover {
453
+ background: var(--dr-primary-light);
454
+ border-color: var(--dr-primary);
455
+ }
456
+
457
+ .dr-modifier-display {
458
+ min-width: 2rem;
459
+ text-align: center;
460
+ font-weight: 700;
461
+ font-size: 1rem;
462
+ color: var(--dr-text);
463
+ }
464
+
465
+ .dr-roll-btn {
466
+ display: flex;
467
+ align-items: center;
468
+ justify-content: center;
469
+ gap: 0.5rem;
470
+ width: 100%;
471
+ padding: 0.875rem;
472
+ background: linear-gradient(135deg, var(--dr-primary), var(--dr-primary-dark));
473
+ color: #fff;
474
+ border: none;
475
+ border-radius: var(--dr-radius-sm);
476
+ font-size: 1rem;
477
+ font-weight: 700;
478
+ cursor: pointer;
479
+ transition: opacity 0.2s, transform 0.1s;
480
+ box-shadow: 0 4px 12px rgba(124, 58, 237, 0.35);
481
+ margin-top: auto;
482
+ }
483
+
484
+ .dr-roll-btn:disabled {
485
+ opacity: 0.5;
486
+ cursor: not-allowed;
487
+ box-shadow: none;
488
+ }
489
+
490
+ .dr-roll-btn:not(:disabled):hover {
491
+ transform: translateY(-1px);
492
+ box-shadow: 0 6px 18px rgba(124, 58, 237, 0.45);
493
+ }
494
+
495
+ .dr-roll-btn:not(:disabled):active {
496
+ transform: translateY(0);
497
+ }
498
+
499
+ @keyframes dr-shake {
500
+ 0%, 100% { transform: rotate(0deg); }
501
+ 20% { transform: rotate(-15deg); }
502
+ 40% { transform: rotate(15deg); }
503
+ 60% { transform: rotate(-10deg); }
504
+ 80% { transform: rotate(10deg); }
505
+ }
506
+
507
+ .dr-rolling {
508
+ animation: dr-shake 0.4s ease-in-out;
509
+ }
510
+
511
+ .dr-results-panel {
512
+ display: flex;
513
+ flex-direction: column;
514
+ gap: 1.25rem;
515
+ }
516
+
517
+ .dr-result-card {
518
+ background: var(--dr-bg-card);
519
+ border: 1px solid var(--dr-border);
520
+ border-radius: var(--dr-radius);
521
+ box-shadow: var(--dr-shadow-md);
522
+ padding: 1.5rem;
523
+ min-height: 12rem;
524
+ display: flex;
525
+ align-items: center;
526
+ justify-content: center;
527
+ }
528
+
529
+ .dr-result-empty {
530
+ display: flex;
531
+ flex-direction: column;
532
+ align-items: center;
533
+ gap: 0.5rem;
534
+ color: var(--dr-text-muted);
535
+ }
536
+
537
+ .dr-result-empty p {
538
+ font-size: 0.9rem;
539
+ margin: 0;
540
+ }
541
+
542
+ .dr-result-content {
543
+ width: 100%;
544
+ flex-direction: column;
545
+ align-items: center;
546
+ gap: 1rem;
547
+ }
548
+
549
+ .dr-total-area {
550
+ display: flex;
551
+ flex-direction: column;
552
+ align-items: center;
553
+ gap: 0.25rem;
554
+ }
555
+
556
+ .dr-total-label {
557
+ font-size: 0.75rem;
558
+ font-weight: 600;
559
+ text-transform: uppercase;
560
+ letter-spacing: 0.08em;
561
+ color: var(--dr-text-muted);
562
+ }
563
+
564
+ .dr-total-val {
565
+ font-size: 4rem;
566
+ font-weight: 900;
567
+ color: var(--dr-primary);
568
+ line-height: 1;
569
+ }
570
+
571
+ .dr-roll-expr {
572
+ font-size: 0.8rem;
573
+ color: var(--dr-text-muted);
574
+ font-style: italic;
575
+ }
576
+
577
+ .dr-dice-results {
578
+ display: flex;
579
+ flex-wrap: wrap;
580
+ gap: 0.5rem;
581
+ justify-content: center;
582
+ }
583
+
584
+ .dr-result-pip {
585
+ display: flex;
586
+ flex-direction: column;
587
+ align-items: center;
588
+ gap: 0.15rem;
589
+ padding: 0.5rem 0.75rem;
590
+ background: var(--dr-bg-muted);
591
+ border: 2px solid var(--dr-border);
592
+ border-radius: var(--dr-radius-sm);
593
+ min-width: 3rem;
594
+ transition: border-color 0.2s;
595
+ }
596
+
597
+ .dr-pip-max {
598
+ border-color: var(--dr-success);
599
+ background: rgba(16, 185, 129, 0.1);
600
+ }
601
+
602
+ .dr-pip-min {
603
+ border-color: var(--dr-danger);
604
+ background: rgba(239, 68, 68, 0.1);
605
+ }
606
+
607
+ .dr-pip-val {
608
+ font-size: 1.25rem;
609
+ font-weight: 800;
610
+ color: var(--dr-text);
611
+ line-height: 1;
612
+ }
613
+
614
+ .dr-pip-die {
615
+ font-size: 0.65rem;
616
+ color: var(--dr-text-muted);
617
+ font-weight: 600;
618
+ }
619
+
620
+ .dr-history-section {
621
+ background: var(--dr-bg-card);
622
+ border: 1px solid var(--dr-border);
623
+ border-radius: var(--dr-radius);
624
+ box-shadow: var(--dr-shadow-sm);
625
+ padding: 1.25rem;
626
+ flex: 1;
627
+ }
628
+
629
+ .dr-history-header {
630
+ display: flex;
631
+ justify-content: space-between;
632
+ align-items: center;
633
+ margin-bottom: 0.75rem;
634
+ }
635
+
636
+ .dr-history-header .dr-label {
637
+ margin-bottom: 0;
638
+ }
639
+
640
+ .dr-history-list {
641
+ display: flex;
642
+ flex-direction: column;
643
+ gap: 0.375rem;
644
+ max-height: 220px;
645
+ overflow-y: auto;
646
+ }
647
+
648
+ .dr-history-list::-webkit-scrollbar {
649
+ width: 4px;
650
+ }
651
+
652
+ .dr-history-list::-webkit-scrollbar-thumb {
653
+ background: var(--dr-border);
654
+ border-radius: 2px;
655
+ }
656
+
657
+ .dr-history-empty {
658
+ font-size: 0.8rem;
659
+ color: var(--dr-text-muted);
660
+ font-style: italic;
661
+ text-align: center;
662
+ margin: 1rem 0;
663
+ }
664
+
665
+ .dr-history-item {
666
+ display: grid;
667
+ grid-template-columns: 1fr auto auto;
668
+ align-items: center;
669
+ gap: 0.75rem;
670
+ padding: 0.4rem 0.6rem;
671
+ background: var(--dr-bg-muted);
672
+ border-radius: var(--dr-radius-sm);
673
+ font-size: 0.8rem;
674
+ animation: dr-fadein 0.2s ease-out;
675
+ }
676
+
677
+ @keyframes dr-fadein {
678
+ from {
679
+ opacity: 0;
680
+ transform: translate-y(-4px);
681
+ }
682
+
683
+ to {
684
+ opacity: 1;
685
+ transform: translateY(0);
686
+ }
687
+ }
688
+
689
+ .dr-hist-expr {
690
+ color: var(--dr-text-muted);
691
+ font-size: 0.75rem;
692
+ overflow: hidden;
693
+ text-overflow: ellipsis;
694
+ white-space: nowrap;
695
+ }
696
+
697
+ .dr-hist-result {
698
+ font-weight: 800;
699
+ font-size: 1rem;
700
+ color: var(--dr-primary);
701
+ }
702
+
703
+ .dr-hist-time {
704
+ font-size: 0.7rem;
705
+ color: var(--dr-text-muted);
706
+ }
707
+ </style>
@@ -1,6 +1,5 @@
1
1
  ---
2
2
  import type { SynesthesiaPainterUI } from './index';
3
- import './style.css';
4
3
 
5
4
  interface Props {
6
5
  ui: SynesthesiaPainterUI;
@@ -108,3 +107,233 @@ const { ui } = Astro.props;
108
107
  init();
109
108
  document.addEventListener('astro:page-load', init);
110
109
  </script>
110
+
111
+ <style>
112
+ .synesthesia-painter {
113
+ --sp-bg: #fff;
114
+ --sp-bg-muted: #f8fafc;
115
+ --sp-text: #0f172a;
116
+ --sp-text-muted: #475569;
117
+ --sp-text-dim: #64748b;
118
+ --sp-border: #e2e8f0;
119
+ --sp-shadow: rgba(0, 0, 0, 0.08);
120
+ --sp-primary: #6366f1;
121
+ --sp-primary-on: #fff;
122
+ --sp-header-bg: rgba(255, 255, 255, 0.92);
123
+ }
124
+
125
+ :global(.theme-dark) .synesthesia-painter {
126
+ --sp-bg: #0f172a;
127
+ --sp-bg-muted: #1e293b;
128
+ --sp-text: #f8fafc;
129
+ --sp-text-muted: #94a3b8;
130
+ --sp-text-dim: #64748b;
131
+ --sp-border: #334155;
132
+ --sp-shadow: rgba(0, 0, 0, 0.35);
133
+ --sp-primary: #818cf8;
134
+ --sp-header-bg: rgba(30, 41, 59, 0.92);
135
+ }
136
+
137
+ .synesthesia-painter-card {
138
+ position: relative;
139
+ min-height: 420px;
140
+ background-color: var(--sp-bg);
141
+ border-radius: 2rem;
142
+ border: 1px solid var(--sp-border);
143
+ box-shadow: 0 20px 40px -8px var(--sp-shadow);
144
+ display: flex;
145
+ flex-direction: column;
146
+ overflow: hidden;
147
+ }
148
+
149
+ .synesthesia-painter-header {
150
+ position: absolute;
151
+ top: 1rem;
152
+ right: 1rem;
153
+ z-index: 30;
154
+ background-color: var(--sp-header-bg);
155
+ backdrop-filter: blur(8px);
156
+ padding: 0.3rem;
157
+ border-radius: 9999px;
158
+ border: 1px solid var(--sp-border);
159
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.08);
160
+ display: flex;
161
+ gap: 0.2rem;
162
+ }
163
+
164
+ .synesthesia-painter-mode-btn {
165
+ padding: 0.4rem 0.875rem;
166
+ border-radius: 9999px;
167
+ font-size: 0.7rem;
168
+ font-weight: 700;
169
+ text-transform: uppercase;
170
+ letter-spacing: 0.06em;
171
+ transition: background 0.2s, color 0.2s;
172
+ color: var(--sp-text-muted);
173
+ background: none;
174
+ border: none;
175
+ cursor: pointer;
176
+ }
177
+
178
+ .synesthesia-painter-mode-btn:hover {
179
+ background-color: var(--sp-bg-muted);
180
+ color: var(--sp-text);
181
+ }
182
+
183
+ .synesthesia-painter-mode-btn.active {
184
+ background-color: var(--sp-primary);
185
+ color: var(--sp-primary-on);
186
+ box-shadow: 0 2px 8px rgba(99, 102, 241, 0.35);
187
+ }
188
+
189
+ .synesthesia-painter-canvas-wrapper {
190
+ position: relative;
191
+ flex-grow: 1;
192
+ padding: 2rem;
193
+ padding-top: 5rem;
194
+ cursor: text;
195
+ }
196
+
197
+ @media (min-width: 768px) {
198
+ .synesthesia-painter-canvas-wrapper {
199
+ padding: 3rem;
200
+ padding-top: 5rem;
201
+ }
202
+ }
203
+
204
+ .synesthesia-painter-viz-layer {
205
+ word-break: break-all;
206
+ white-space: pre-wrap;
207
+ line-height: 1.625;
208
+ outline: none;
209
+ font-size: 2.5rem;
210
+ min-height: 100%;
211
+ }
212
+
213
+ .synesthesia-painter-input {
214
+ position: absolute;
215
+ inset: 0;
216
+ opacity: 0;
217
+ cursor: text;
218
+ z-index: -10;
219
+ width: 100%;
220
+ height: 100%;
221
+ resize: none;
222
+ border: none;
223
+ background: transparent;
224
+ }
225
+
226
+ .synesthesia-painter-placeholder {
227
+ position: absolute;
228
+ top: 5rem;
229
+ left: 2rem;
230
+ pointer-events: none;
231
+ opacity: 0.35;
232
+ user-select: none;
233
+ }
234
+
235
+ @media (min-width: 768px) {
236
+ .synesthesia-painter-placeholder {
237
+ left: 3rem;
238
+ }
239
+ }
240
+
241
+ .synesthesia-painter-placeholder-text {
242
+ color: var(--sp-text-dim);
243
+ font-size: 2.25rem;
244
+ font-weight: 300;
245
+ font-style: italic;
246
+ }
247
+
248
+ .synesthesia-painter-footer {
249
+ background-color: var(--sp-bg-muted);
250
+ border-top: 1px solid var(--sp-border);
251
+ padding: 0.875rem 2rem;
252
+ display: flex;
253
+ align-items: center;
254
+ justify-content: space-between;
255
+ gap: 1rem;
256
+ }
257
+
258
+ .synesthesia-painter-tooltip {
259
+ font-size: 0.75rem;
260
+ color: var(--sp-text-muted);
261
+ font-weight: 500;
262
+ margin: 0;
263
+ }
264
+
265
+ .synesthesia-painter-clear-btn {
266
+ font-size: 0.7rem;
267
+ font-weight: 700;
268
+ color: var(--sp-text-dim);
269
+ text-transform: uppercase;
270
+ letter-spacing: 0.06em;
271
+ background: none;
272
+ border: none;
273
+ cursor: pointer;
274
+ display: flex;
275
+ align-items: center;
276
+ gap: 0.375rem;
277
+ transition: color 0.2s;
278
+ white-space: nowrap;
279
+ }
280
+
281
+ .synesthesia-painter-clear-btn:hover {
282
+ color: #ef4444;
283
+ }
284
+
285
+ .synesthesia-painter-char {
286
+ display: inline-block;
287
+ color: var(--char-color);
288
+ transition: color 0.3s cubic-bezier(0.4, 0, 0.2, 1);
289
+ animation: sp-fade-in 0.2s ease-out forwards;
290
+ }
291
+
292
+ @keyframes sp-fade-in {
293
+ from {
294
+ opacity: 0;
295
+ transform: translateY(4px);
296
+ }
297
+
298
+ to {
299
+ opacity: 1;
300
+ transform: translateY(0);
301
+ }
302
+ }
303
+
304
+ .synesthesia-painter-viz-layer.dots .synesthesia-painter-char {
305
+ color: transparent;
306
+ font-size: 0;
307
+ width: 1rem;
308
+ height: 1rem;
309
+ border-radius: 50%;
310
+ background-color: var(--char-color);
311
+ margin: 0.25rem;
312
+ box-shadow: 0 0 8px var(--char-color);
313
+ }
314
+
315
+ .synesthesia-painter-viz-layer.aura .synesthesia-painter-char {
316
+ color: rgba(255, 255, 255, 0.15);
317
+ text-shadow: 0 0 18px var(--char-color), 0 0 36px var(--char-color);
318
+ }
319
+
320
+ :global(.theme-dark) .synesthesia-painter-viz-layer.aura .synesthesia-painter-char {
321
+ color: rgba(255, 255, 255, 0.85);
322
+ text-shadow: 0 0 14px var(--char-color), 0 0 28px var(--char-color), 0 0 56px var(--char-color);
323
+ }
324
+
325
+ .synesthesia-painter-cursor {
326
+ display: inline-block;
327
+ width: 2px;
328
+ height: 2.5rem;
329
+ background-color: var(--sp-primary);
330
+ animation: sp-blink 1s step-end infinite;
331
+ vertical-align: text-bottom;
332
+ margin-left: 2px;
333
+ }
334
+
335
+ @keyframes sp-blink {
336
+ 0%, 100% { opacity: 1; }
337
+ 50% { opacity: 0; }
338
+ }
339
+ </style>