@jjlmoya/utils-home 1.15.0 → 1.16.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.
@@ -208,362 +208,3 @@ const initial = calculateProjection(100, 16 / 9, 1.5);
208
208
  init();
209
209
  </script>
210
210
 
211
- <style>
212
- .proj-wrapper {
213
- --proj-p: #06b6d4;
214
-
215
- width: 100%;
216
- padding: 1rem 0;
217
- }
218
-
219
- .proj-card {
220
- background: var(--bg-surface);
221
- width: calc(100% - 24px);
222
- max-width: 960px;
223
- margin: 0 auto;
224
- border-radius: 24px;
225
- overflow: hidden;
226
- display: flex;
227
- flex-direction: column;
228
- border: 1px solid var(--border-color);
229
- color: var(--text-main);
230
- }
231
-
232
- @media (min-width: 768px) {
233
- .proj-card {
234
- flex-direction: row;
235
- min-height: 580px;
236
- }
237
- }
238
-
239
- .proj-left {
240
- flex: 0 0 auto;
241
- width: 100%;
242
- padding: 32px;
243
- border-bottom: 1px solid var(--border-color);
244
- display: flex;
245
- flex-direction: column;
246
- gap: 24px;
247
- }
248
-
249
- @media (min-width: 768px) {
250
- .proj-left {
251
- width: 360px;
252
- border-bottom: none;
253
- border-right: 1px solid var(--border-color);
254
- }
255
- }
256
-
257
- .proj-right {
258
- flex: 1;
259
- background: #020617;
260
- position: relative;
261
- overflow: hidden;
262
- display: flex;
263
- flex-direction: column;
264
- min-height: 380px;
265
- }
266
-
267
- .proj-viz-dots {
268
- position: absolute;
269
- inset: 0;
270
- opacity: 0.15;
271
- pointer-events: none;
272
- background-image: radial-gradient(#334155 1px, transparent 1px);
273
- background-size: 30px 30px;
274
- }
275
-
276
- .proj-sim-badge {
277
- position: relative;
278
- z-index: 1;
279
- display: flex;
280
- align-items: center;
281
- gap: 6px;
282
- padding: 16px 20px 0;
283
- font-size: 0.6rem;
284
- font-weight: 900;
285
- text-transform: uppercase;
286
- letter-spacing: 0.18em;
287
- color: #94a3b8;
288
- }
289
-
290
- .proj-sim-dot {
291
- width: 7px;
292
- height: 7px;
293
- border-radius: 50%;
294
- background: var(--proj-p);
295
- animation: proj-pulse 2s infinite;
296
- }
297
-
298
- @keyframes proj-pulse {
299
- 0%, 100% { opacity: 1; }
300
- 50% { opacity: 0.3; }
301
- }
302
-
303
- .proj-lens-pulse {
304
- animation: proj-pulse 2s infinite;
305
- }
306
-
307
- .proj-svg {
308
- flex: 1;
309
- width: 100%;
310
- position: relative;
311
- z-index: 1;
312
- }
313
-
314
- .proj-header {
315
- display: flex;
316
- flex-direction: column;
317
- gap: 4px;
318
- }
319
-
320
- .proj-title {
321
- font-size: 1.25rem;
322
- font-weight: 900;
323
- color: var(--text-main);
324
- margin: 0;
325
- }
326
-
327
- .proj-subtitle {
328
- font-size: 0.8125rem;
329
- color: var(--text-muted);
330
- margin: 0;
331
- }
332
-
333
- .proj-field {
334
- display: flex;
335
- flex-direction: column;
336
- gap: 10px;
337
- }
338
-
339
- .proj-field-header {
340
- display: flex;
341
- justify-content: space-between;
342
- align-items: center;
343
- }
344
-
345
- .proj-label {
346
- font-size: 0.6875rem;
347
- font-weight: 700;
348
- text-transform: uppercase;
349
- letter-spacing: 0.1em;
350
- color: var(--proj-p);
351
- }
352
-
353
- .proj-unit {
354
- font-size: 0.75rem;
355
- color: var(--text-muted);
356
- }
357
-
358
- .proj-slider {
359
- width: 100%;
360
- height: 6px;
361
- accent-color: var(--proj-p);
362
- cursor: pointer;
363
- border-radius: 9999px;
364
- }
365
-
366
- .proj-number-row {
367
- position: relative;
368
- display: flex;
369
- align-items: center;
370
- }
371
-
372
- .proj-number-input {
373
- width: 100%;
374
- font-size: 3rem;
375
- font-weight: 900;
376
- color: var(--text-main);
377
- background: transparent;
378
- border: none;
379
- border-bottom: 2px solid var(--border-color);
380
- padding: 4px 2rem 4px 0;
381
- outline: none;
382
- transition: border-color 0.2s;
383
- }
384
-
385
- .proj-number-input:focus {
386
- border-color: var(--proj-p);
387
- }
388
-
389
- .proj-number-unit {
390
- position: absolute;
391
- right: 4px;
392
- bottom: 8px;
393
- font-size: 1.5rem;
394
- color: var(--text-muted);
395
- font-weight: 300;
396
- }
397
-
398
- .proj-ratio-grid {
399
- display: grid;
400
- grid-template-columns: repeat(3, 1fr);
401
- gap: 8px;
402
- }
403
-
404
- .proj-ratio-btn {
405
- display: flex;
406
- flex-direction: column;
407
- align-items: center;
408
- gap: 4px;
409
- padding: 10px 8px;
410
- border-radius: 12px;
411
- border: 1px solid var(--border-color);
412
- background: var(--bg-surface);
413
- color: var(--text-muted);
414
- font-size: 0.8125rem;
415
- font-weight: 700;
416
- cursor: pointer;
417
- transition: all 0.2s;
418
- }
419
-
420
- .proj-ratio-btn:hover {
421
- border-color: var(--proj-p);
422
- color: var(--text-main);
423
- }
424
-
425
- .proj-ratio-active {
426
- background: var(--proj-p);
427
- color: #fff;
428
- border-color: var(--proj-p);
429
- box-shadow: 0 4px 14px rgba(6, 182, 212, 0.35);
430
- }
431
-
432
- .proj-ratio-icon {
433
- display: block;
434
- border: 2px solid currentcolor;
435
- border-radius: 2px;
436
- opacity: 0.6;
437
- }
438
-
439
- .proj-ratio-active .proj-ratio-icon {
440
- opacity: 1;
441
- border-color: #fff;
442
- }
443
-
444
- .ratio-169 {
445
- width: 28px;
446
- height: 16px;
447
- }
448
-
449
- .ratio-219 {
450
- width: 36px;
451
- height: 14px;
452
- }
453
-
454
- .ratio-43 {
455
- width: 20px;
456
- height: 16px;
457
- }
458
-
459
- .proj-ratio-sub {
460
- font-size: 0.625rem;
461
- font-weight: 500;
462
- opacity: 0.75;
463
- }
464
-
465
- .proj-hint-wrap {
466
- position: relative;
467
- }
468
-
469
- .proj-hint-icon {
470
- width: 16px;
471
- height: 16px;
472
- color: var(--text-muted);
473
- cursor: help;
474
- }
475
-
476
- .proj-hint-tooltip {
477
- position: absolute;
478
- bottom: calc(100% + 6px);
479
- right: 0;
480
- width: 220px;
481
- background: #1e293b;
482
- color: #e2e8f0;
483
- font-size: 0.75rem;
484
- font-weight: 400;
485
- padding: 10px 12px;
486
- border-radius: 10px;
487
- box-shadow: 0 8px 24px rgba(0,0,0,0.3);
488
- opacity: 0;
489
- pointer-events: none;
490
- transition: opacity 0.15s;
491
- z-index: 10;
492
- line-height: 1.5;
493
- }
494
-
495
- .proj-hint-wrap:hover .proj-hint-tooltip {
496
- opacity: 1;
497
- }
498
-
499
- .proj-throw-row {
500
- position: relative;
501
- display: flex;
502
- align-items: center;
503
- }
504
-
505
- .proj-throw-input {
506
- width: 100%;
507
- font-size: 2.5rem;
508
- font-weight: 900;
509
- color: var(--text-main);
510
- background: transparent;
511
- border: none;
512
- border-bottom: 2px solid var(--border-color);
513
- padding: 4px 3rem 4px 0;
514
- outline: none;
515
- transition: border-color 0.2s;
516
- }
517
-
518
- .proj-throw-input:focus {
519
- border-color: var(--proj-p);
520
- }
521
-
522
- .proj-throw-unit {
523
- position: absolute;
524
- right: 4px;
525
- bottom: 10px;
526
- font-size: 1.25rem;
527
- color: var(--text-muted);
528
- }
529
-
530
- .proj-results {
531
- background: rgba(6, 182, 212, 0.06);
532
- border: 1px solid rgba(6, 182, 212, 0.15);
533
- border-radius: 16px;
534
- padding: 18px;
535
- }
536
-
537
- .proj-results-grid {
538
- display: grid;
539
- grid-template-columns: 1fr 1fr;
540
- gap: 12px;
541
- margin-bottom: 14px;
542
- padding-bottom: 14px;
543
- border-bottom: 1px solid rgba(6, 182, 212, 0.15);
544
- }
545
-
546
- .proj-res-label {
547
- font-size: 0.625rem;
548
- font-weight: 900;
549
- text-transform: uppercase;
550
- letter-spacing: 0.12em;
551
- color: var(--proj-p);
552
- margin: 0 0 4px;
553
- }
554
-
555
- .proj-res-val {
556
- font-size: 1.125rem;
557
- font-weight: 700;
558
- color: var(--text-main);
559
- margin: 0;
560
- }
561
-
562
- .proj-distance-val {
563
- font-size: 2.5rem;
564
- font-weight: 900;
565
- color: var(--text-main);
566
- margin: 0;
567
- line-height: 1;
568
- }
569
- </style>
@@ -0,0 +1,357 @@
1
+ .proj-wrapper {
2
+ --proj-p: #06b6d4;
3
+
4
+ width: 100%;
5
+ padding: 1rem 0;
6
+ }
7
+
8
+ .proj-card {
9
+ background: var(--bg-surface);
10
+ width: calc(100% - 24px);
11
+ max-width: 960px;
12
+ margin: 0 auto;
13
+ border-radius: 24px;
14
+ overflow: hidden;
15
+ display: flex;
16
+ flex-direction: column;
17
+ border: 1px solid var(--border-color);
18
+ color: var(--text-main);
19
+ }
20
+
21
+ @media (min-width: 768px) {
22
+ .proj-card {
23
+ flex-direction: row;
24
+ min-height: 580px;
25
+ }
26
+ }
27
+
28
+ .proj-left {
29
+ flex: 0 0 auto;
30
+ width: 100%;
31
+ padding: 32px;
32
+ border-bottom: 1px solid var(--border-color);
33
+ display: flex;
34
+ flex-direction: column;
35
+ gap: 24px;
36
+ }
37
+
38
+ @media (min-width: 768px) {
39
+ .proj-left {
40
+ width: 360px;
41
+ border-bottom: none;
42
+ border-right: 1px solid var(--border-color);
43
+ }
44
+ }
45
+
46
+ .proj-right {
47
+ flex: 1;
48
+ background: #020617;
49
+ position: relative;
50
+ overflow: hidden;
51
+ display: flex;
52
+ flex-direction: column;
53
+ min-height: 380px;
54
+ }
55
+
56
+ .proj-viz-dots {
57
+ position: absolute;
58
+ inset: 0;
59
+ opacity: 0.15;
60
+ pointer-events: none;
61
+ background-image: radial-gradient(#334155 1px, transparent 1px);
62
+ background-size: 30px 30px;
63
+ }
64
+
65
+ .proj-sim-badge {
66
+ position: relative;
67
+ z-index: 1;
68
+ display: flex;
69
+ align-items: center;
70
+ gap: 6px;
71
+ padding: 16px 20px 0;
72
+ font-size: 0.6rem;
73
+ font-weight: 900;
74
+ text-transform: uppercase;
75
+ letter-spacing: 0.18em;
76
+ color: #94a3b8;
77
+ }
78
+
79
+ .proj-sim-dot {
80
+ width: 7px;
81
+ height: 7px;
82
+ border-radius: 50%;
83
+ background: var(--proj-p);
84
+ animation: proj-pulse 2s infinite;
85
+ }
86
+
87
+ @keyframes proj-pulse {
88
+ 0%, 100% { opacity: 1; }
89
+ 50% { opacity: 0.3; }
90
+ }
91
+
92
+ .proj-lens-pulse {
93
+ animation: proj-pulse 2s infinite;
94
+ }
95
+
96
+ .proj-svg {
97
+ flex: 1;
98
+ width: 100%;
99
+ position: relative;
100
+ z-index: 1;
101
+ }
102
+
103
+ .proj-header {
104
+ display: flex;
105
+ flex-direction: column;
106
+ gap: 4px;
107
+ }
108
+
109
+ .proj-title {
110
+ font-size: 1.25rem;
111
+ font-weight: 900;
112
+ color: var(--text-main);
113
+ margin: 0;
114
+ }
115
+
116
+ .proj-subtitle {
117
+ font-size: 0.8125rem;
118
+ color: var(--text-muted);
119
+ margin: 0;
120
+ }
121
+
122
+ .proj-field {
123
+ display: flex;
124
+ flex-direction: column;
125
+ gap: 10px;
126
+ }
127
+
128
+ .proj-field-header {
129
+ display: flex;
130
+ justify-content: space-between;
131
+ align-items: center;
132
+ }
133
+
134
+ .proj-label {
135
+ font-size: 0.6875rem;
136
+ font-weight: 700;
137
+ text-transform: uppercase;
138
+ letter-spacing: 0.1em;
139
+ color: var(--proj-p);
140
+ }
141
+
142
+ .proj-unit {
143
+ font-size: 0.75rem;
144
+ color: var(--text-muted);
145
+ }
146
+
147
+ .proj-slider {
148
+ width: 100%;
149
+ height: 6px;
150
+ accent-color: var(--proj-p);
151
+ cursor: pointer;
152
+ border-radius: 9999px;
153
+ }
154
+
155
+ .proj-number-row {
156
+ position: relative;
157
+ display: flex;
158
+ align-items: center;
159
+ }
160
+
161
+ .proj-number-input {
162
+ width: 100%;
163
+ font-size: 3rem;
164
+ font-weight: 900;
165
+ color: var(--text-main);
166
+ background: transparent;
167
+ border: none;
168
+ border-bottom: 2px solid var(--border-color);
169
+ padding: 4px 2rem 4px 0;
170
+ outline: none;
171
+ transition: border-color 0.2s;
172
+ }
173
+
174
+ .proj-number-input:focus {
175
+ border-color: var(--proj-p);
176
+ }
177
+
178
+ .proj-number-unit {
179
+ position: absolute;
180
+ right: 4px;
181
+ bottom: 8px;
182
+ font-size: 1.5rem;
183
+ color: var(--text-muted);
184
+ font-weight: 300;
185
+ }
186
+
187
+ .proj-ratio-grid {
188
+ display: grid;
189
+ grid-template-columns: repeat(3, 1fr);
190
+ gap: 8px;
191
+ }
192
+
193
+ .proj-ratio-btn {
194
+ display: flex;
195
+ flex-direction: column;
196
+ align-items: center;
197
+ gap: 4px;
198
+ padding: 10px 8px;
199
+ border-radius: 12px;
200
+ border: 1px solid var(--border-color);
201
+ background: var(--bg-surface);
202
+ color: var(--text-muted);
203
+ font-size: 0.8125rem;
204
+ font-weight: 700;
205
+ cursor: pointer;
206
+ transition: all 0.2s;
207
+ }
208
+
209
+ .proj-ratio-btn:hover {
210
+ border-color: var(--proj-p);
211
+ color: var(--text-main);
212
+ }
213
+
214
+ .proj-ratio-active {
215
+ background: var(--proj-p);
216
+ color: #fff;
217
+ border-color: var(--proj-p);
218
+ box-shadow: 0 4px 14px rgba(6, 182, 212, 0.35);
219
+ }
220
+
221
+ .proj-ratio-icon {
222
+ display: block;
223
+ border: 2px solid currentcolor;
224
+ border-radius: 2px;
225
+ opacity: 0.6;
226
+ }
227
+
228
+ .proj-ratio-active .proj-ratio-icon {
229
+ opacity: 1;
230
+ border-color: #fff;
231
+ }
232
+
233
+ .ratio-169 {
234
+ width: 28px;
235
+ height: 16px;
236
+ }
237
+
238
+ .ratio-219 {
239
+ width: 36px;
240
+ height: 14px;
241
+ }
242
+
243
+ .ratio-43 {
244
+ width: 20px;
245
+ height: 16px;
246
+ }
247
+
248
+ .proj-ratio-sub {
249
+ font-size: 0.625rem;
250
+ font-weight: 500;
251
+ opacity: 0.75;
252
+ }
253
+
254
+ .proj-hint-wrap {
255
+ position: relative;
256
+ }
257
+
258
+ .proj-hint-icon {
259
+ width: 16px;
260
+ height: 16px;
261
+ color: var(--text-muted);
262
+ cursor: help;
263
+ }
264
+
265
+ .proj-hint-tooltip {
266
+ position: absolute;
267
+ bottom: calc(100% + 6px);
268
+ right: 0;
269
+ width: 220px;
270
+ background: #1e293b;
271
+ color: #e2e8f0;
272
+ font-size: 0.75rem;
273
+ font-weight: 400;
274
+ padding: 10px 12px;
275
+ border-radius: 10px;
276
+ box-shadow: 0 8px 24px rgba(0,0,0,0.3);
277
+ opacity: 0;
278
+ pointer-events: none;
279
+ transition: opacity 0.15s;
280
+ z-index: 10;
281
+ line-height: 1.5;
282
+ }
283
+
284
+ .proj-hint-wrap:hover .proj-hint-tooltip {
285
+ opacity: 1;
286
+ }
287
+
288
+ .proj-throw-row {
289
+ position: relative;
290
+ display: flex;
291
+ align-items: center;
292
+ }
293
+
294
+ .proj-throw-input {
295
+ width: 100%;
296
+ font-size: 2.5rem;
297
+ font-weight: 900;
298
+ color: var(--text-main);
299
+ background: transparent;
300
+ border: none;
301
+ border-bottom: 2px solid var(--border-color);
302
+ padding: 4px 3rem 4px 0;
303
+ outline: none;
304
+ transition: border-color 0.2s;
305
+ }
306
+
307
+ .proj-throw-input:focus {
308
+ border-color: var(--proj-p);
309
+ }
310
+
311
+ .proj-throw-unit {
312
+ position: absolute;
313
+ right: 4px;
314
+ bottom: 10px;
315
+ font-size: 1.25rem;
316
+ color: var(--text-muted);
317
+ }
318
+
319
+ .proj-results {
320
+ background: rgba(6, 182, 212, 0.06);
321
+ border: 1px solid rgba(6, 182, 212, 0.15);
322
+ border-radius: 16px;
323
+ padding: 18px;
324
+ }
325
+
326
+ .proj-results-grid {
327
+ display: grid;
328
+ grid-template-columns: 1fr 1fr;
329
+ gap: 12px;
330
+ margin-bottom: 14px;
331
+ padding-bottom: 14px;
332
+ border-bottom: 1px solid rgba(6, 182, 212, 0.15);
333
+ }
334
+
335
+ .proj-res-label {
336
+ font-size: 0.625rem;
337
+ font-weight: 900;
338
+ text-transform: uppercase;
339
+ letter-spacing: 0.12em;
340
+ color: var(--proj-p);
341
+ margin: 0 0 4px;
342
+ }
343
+
344
+ .proj-res-val {
345
+ font-size: 1.125rem;
346
+ font-weight: 700;
347
+ color: var(--text-main);
348
+ margin: 0;
349
+ }
350
+
351
+ .proj-distance-val {
352
+ font-size: 2.5rem;
353
+ font-weight: 900;
354
+ color: var(--text-main);
355
+ margin: 0;
356
+ line-height: 1;
357
+ }