@jjlmoya/utils-astronomy 1.14.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jjlmoya/utils-astronomy",
3
- "version": "1.14.0",
3
+ "version": "1.16.0",
4
4
  "type": "module",
5
5
  "main": "./src/index.ts",
6
6
  "types": "./src/index.ts",
@@ -1,5 +1,340 @@
1
1
  .bortle-wrapper {
2
- width: 100%;
3
- max-width: 80rem;
4
- margin: 0 auto;
5
- }
2
+ width: 100%;
3
+ max-width: 80rem;
4
+ margin: 0 auto;
5
+ }
6
+
7
+ .bortle-scene {
8
+ --on-dark: #fff;
9
+
10
+ position: relative;
11
+ width: 100%;
12
+ aspect-ratio: 9 / 16;
13
+ border-radius: 2rem;
14
+ overflow: hidden;
15
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.8);
16
+ background: var(--color-bg-deep, #050b14);
17
+ border: 1px solid rgba(255, 255, 255, 0.05);
18
+ user-select: none;
19
+ }
20
+
21
+ @media (min-width: 768px) {
22
+ .bortle-scene {
23
+ aspect-ratio: 16 / 9;
24
+ }
25
+ }
26
+
27
+ .bortle-bg-gradient {
28
+ position: absolute;
29
+ inset: 0;
30
+ background: linear-gradient(to bottom, #02040a, #0b1026, #1e293b);
31
+ z-index: 0;
32
+ }
33
+
34
+ .bortle-layer {
35
+ position: absolute;
36
+ inset: 0;
37
+ transition: opacity 1s ease-in-out;
38
+ }
39
+
40
+ .layer-stars {
41
+ z-index: 10;
42
+ opacity: 1;
43
+ }
44
+
45
+ .stars-canvas {
46
+ position: absolute;
47
+ inset: 0;
48
+ width: 100%;
49
+ height: 100%;
50
+ }
51
+
52
+ .layer-milkyway {
53
+ z-index: 20;
54
+ mix-blend-mode: screen;
55
+ opacity: 1;
56
+ }
57
+
58
+ .milkyway-image {
59
+ position: absolute;
60
+ inset: 0;
61
+ background-image: url('/images/utilities/dark-sky/milky-way.webp');
62
+ background-size: contain;
63
+ background-position: center;
64
+ background-repeat: no-repeat;
65
+ opacity: 0.8;
66
+ scale: 1.25;
67
+ mask-image: radial-gradient(closest-side, black 40%, transparent 100%);
68
+ }
69
+
70
+ .layer-pollution {
71
+ position: absolute;
72
+ inset-inline: 0;
73
+ bottom: 0;
74
+ top: 25%;
75
+ z-index: 30;
76
+ opacity: 0;
77
+ transition: opacity 1s ease-in-out;
78
+ }
79
+
80
+ .pollution-gradient {
81
+ position: absolute;
82
+ inset: 0;
83
+ background: linear-gradient(to top, var(--color-pollution-warm, #f97316), rgba(251, 191, 36, 0.4), transparent);
84
+ mix-blend-mode: hard-light;
85
+ }
86
+
87
+ .layer-glow {
88
+ z-index: 40;
89
+ background: rgba(219, 234, 254, 0.1);
90
+ opacity: 0;
91
+ pointer-events: none;
92
+ mix-blend-mode: overlay;
93
+ transition: opacity 1s ease-in-out;
94
+ }
95
+
96
+ .landscape-layer {
97
+ position: absolute;
98
+ inset-inline: 0;
99
+ bottom: 0;
100
+ height: 50%;
101
+ z-index: 50;
102
+ pointer-events: none;
103
+ }
104
+
105
+ .landscape-image {
106
+ position: absolute;
107
+ inset: 0;
108
+ background-image: url('/images/utilities/dark-sky/landscape-silhouette.webp');
109
+ background-size: cover;
110
+ background-position: bottom;
111
+ background-repeat: no-repeat;
112
+ }
113
+
114
+ .landscape-fade {
115
+ position: absolute;
116
+ inset-inline: 0;
117
+ bottom: 0;
118
+ height: 50%;
119
+ background: linear-gradient(to top, black, rgba(0, 0, 0, 0.8), transparent);
120
+ }
121
+
122
+ .bortle-info-overlay {
123
+ position: absolute;
124
+ top: 1.5rem;
125
+ inset-inline: 1rem;
126
+ z-index: 60;
127
+ display: flex;
128
+ flex-direction: column;
129
+ align-items: center;
130
+ }
131
+
132
+ @media (min-width: 768px) {
133
+ .bortle-info-overlay {
134
+ top: 2.5rem;
135
+ inset-inline: auto;
136
+ left: 2.5rem;
137
+ align-items: flex-start;
138
+ }
139
+ }
140
+
141
+ .bortle-info-content {
142
+ display: flex;
143
+ flex-direction: column;
144
+ gap: 0.5rem;
145
+ text-align: center;
146
+ }
147
+
148
+ @media (min-width: 768px) {
149
+ .bortle-info-content {
150
+ text-align: left;
151
+ }
152
+ }
153
+
154
+ .bortle-title {
155
+ font-size: clamp(1.5rem, 5vw, 3rem);
156
+ font-weight: 900;
157
+ color: var(--on-dark);
158
+ letter-spacing: -0.02em;
159
+ text-shadow: 0 2px 8px rgba(0, 0, 0, 0.5);
160
+ transition: all 0.3s ease;
161
+ margin: 0;
162
+ }
163
+
164
+ .bortle-badges {
165
+ display: inline-flex;
166
+ align-items: center;
167
+ gap: 1rem;
168
+ background: rgba(0, 0, 0, 0.4);
169
+ backdrop-filter: blur(12px);
170
+ padding: 0.5rem 1rem;
171
+ border-radius: 9999px;
172
+ border: 1px solid rgba(255, 255, 255, 0.1);
173
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);
174
+ }
175
+
176
+ .bortle-class-badge {
177
+ font-size: 0.7rem;
178
+ font-weight: 700;
179
+ color: var(--on-dark);
180
+ border-right: 1px solid rgba(255, 255, 255, 0.2);
181
+ padding-right: 1rem;
182
+ text-transform: uppercase;
183
+ letter-spacing: 0.1em;
184
+ }
185
+
186
+ .bortle-nelm-badge {
187
+ color: var(--color-emerald, #34d399);
188
+ font-weight: 700;
189
+ font-size: 0.875rem;
190
+ }
191
+
192
+ .bortle-description {
193
+ display: none;
194
+ max-width: 24rem;
195
+ font-size: 0.875rem;
196
+ color: rgba(255, 255, 255, 0.8);
197
+ font-weight: 500;
198
+ line-height: 1.6;
199
+ margin: 0;
200
+ text-shadow: 0 1px 4px rgba(0, 0, 0, 0.5);
201
+ }
202
+
203
+ @media (min-width: 768px) {
204
+ .bortle-description {
205
+ display: block;
206
+ }
207
+ }
208
+
209
+ .bortle-description-mobile {
210
+ position: absolute;
211
+ bottom: 7rem;
212
+ inset-inline: 1rem;
213
+ z-index: 70;
214
+ text-align: center;
215
+ font-size: 0.875rem;
216
+ color: rgba(255, 255, 255, 0.9);
217
+ font-weight: 500;
218
+ line-height: 1.6;
219
+ text-shadow: 0 1px 4px rgba(0, 0, 0, 0.5);
220
+ min-height: 3em;
221
+ }
222
+
223
+ @media (min-width: 768px) {
224
+ .bortle-description-mobile {
225
+ display: none;
226
+ }
227
+ }
228
+
229
+ .bortle-controls {
230
+ position: absolute;
231
+ bottom: 2rem;
232
+ inset-inline: 1rem;
233
+ z-index: 70;
234
+ }
235
+
236
+ @media (min-width: 768px) {
237
+ .bortle-controls {
238
+ inset-inline: 3rem;
239
+ }
240
+ }
241
+
242
+ .bortle-slider-track {
243
+ position: relative;
244
+ height: 4rem;
245
+ display: flex;
246
+ align-items: center;
247
+ background: rgba(0, 0, 0, 0.5);
248
+ backdrop-filter: blur(20px);
249
+ border-radius: 9999px;
250
+ border: 1px solid rgba(255, 255, 255, 0.1);
251
+ padding: 0 0.5rem;
252
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
253
+ }
254
+
255
+ .slider-gradient-bar {
256
+ position: absolute;
257
+ inset-inline: 1rem;
258
+ height: 0.5rem;
259
+ border-radius: 9999px;
260
+ background: linear-gradient(to right, var(--color-emerald, #34d399), var(--color-amber, #f59e0b), var(--color-red, #ef4444));
261
+ opacity: 0.8;
262
+ }
263
+
264
+ .bortle-slider-input {
265
+ position: absolute;
266
+ inset: 0;
267
+ width: 100%;
268
+ height: 100%;
269
+ opacity: 0;
270
+ cursor: pointer;
271
+ z-index: 20;
272
+ }
273
+
274
+ .bortle-thumb {
275
+ position: absolute;
276
+ height: 2.5rem;
277
+ width: 2.5rem;
278
+ background: white;
279
+ border: 4px solid var(--color-indigo, #6366f1);
280
+ border-radius: 50%;
281
+ box-shadow: 0 0 20px rgba(255, 255, 255, 0.5);
282
+ pointer-events: none;
283
+ transition: left 0.15s ease-out;
284
+ display: flex;
285
+ align-items: center;
286
+ justify-content: center;
287
+ z-index: 10;
288
+ }
289
+
290
+ .bortle-thumb-dot {
291
+ width: 0.5rem;
292
+ height: 0.5rem;
293
+ background: var(--color-indigo, #6366f1);
294
+ border-radius: 50%;
295
+ }
296
+
297
+ .bortle-tick-marks {
298
+ position: absolute;
299
+ inset-inline: 1rem;
300
+ bottom: 0.5rem;
301
+ top: 0.5rem;
302
+ display: flex;
303
+ justify-content: space-between;
304
+ pointer-events: none;
305
+ z-index: 0;
306
+ }
307
+
308
+ .bortle-tick {
309
+ display: flex;
310
+ flex-direction: column;
311
+ align-items: center;
312
+ justify-content: center;
313
+ height: 100%;
314
+ width: 1rem;
315
+ position: relative;
316
+ }
317
+
318
+ .tick-line {
319
+ width: 1px;
320
+ height: 100%;
321
+ background: rgba(255, 255, 255, 0.1);
322
+ }
323
+
324
+ .tick-label {
325
+ position: absolute;
326
+ font-size: 0.625rem;
327
+ font-weight: 700;
328
+ color: rgba(255, 255, 255, 0.6);
329
+ top: calc(100% + 0.25rem);
330
+ }
331
+
332
+ .bortle-slider-hint {
333
+ text-align: center;
334
+ margin-top: 1.5rem;
335
+ font-size: 0.625rem;
336
+ text-transform: uppercase;
337
+ letter-spacing: 0.2em;
338
+ color: rgba(255, 255, 255, 0.4);
339
+ font-weight: 700;
340
+ }