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