@jjlmoya/utils-aquarium 1.58.0 → 1.59.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.
Files changed (36) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +2 -1
  3. package/src/entries.ts +4 -1
  4. package/src/tests/i18n_coverage.test.ts +1 -1
  5. package/src/tests/tool_validation.test.ts +4 -3
  6. package/src/tool/aquariumLightingPhotoperiodPlanner/aquarium-lighting-photoperiod-planner.css +667 -0
  7. package/src/tool/aquariumLightingPhotoperiodPlanner/bibliography.astro +6 -0
  8. package/src/tool/aquariumLightingPhotoperiodPlanner/bibliography.ts +12 -0
  9. package/src/tool/aquariumLightingPhotoperiodPlanner/component.astro +92 -0
  10. package/src/tool/aquariumLightingPhotoperiodPlanner/controller.ts +179 -0
  11. package/src/tool/aquariumLightingPhotoperiodPlanner/dom-views.test.ts +26 -0
  12. package/src/tool/aquariumLightingPhotoperiodPlanner/dom-views.ts +187 -0
  13. package/src/tool/aquariumLightingPhotoperiodPlanner/entry.ts +29 -0
  14. package/src/tool/aquariumLightingPhotoperiodPlanner/evaluator.ts +47 -0
  15. package/src/tool/aquariumLightingPhotoperiodPlanner/i18n/de.ts +125 -0
  16. package/src/tool/aquariumLightingPhotoperiodPlanner/i18n/en.ts +125 -0
  17. package/src/tool/aquariumLightingPhotoperiodPlanner/i18n/es.ts +110 -0
  18. package/src/tool/aquariumLightingPhotoperiodPlanner/i18n/fr.ts +110 -0
  19. package/src/tool/aquariumLightingPhotoperiodPlanner/i18n/id.ts +110 -0
  20. package/src/tool/aquariumLightingPhotoperiodPlanner/i18n/it.ts +110 -0
  21. package/src/tool/aquariumLightingPhotoperiodPlanner/i18n/ja.ts +110 -0
  22. package/src/tool/aquariumLightingPhotoperiodPlanner/i18n/ko.ts +110 -0
  23. package/src/tool/aquariumLightingPhotoperiodPlanner/i18n/nl.ts +110 -0
  24. package/src/tool/aquariumLightingPhotoperiodPlanner/i18n/pl.ts +110 -0
  25. package/src/tool/aquariumLightingPhotoperiodPlanner/i18n/pt.ts +110 -0
  26. package/src/tool/aquariumLightingPhotoperiodPlanner/i18n/ru.ts +110 -0
  27. package/src/tool/aquariumLightingPhotoperiodPlanner/i18n/sv.ts +110 -0
  28. package/src/tool/aquariumLightingPhotoperiodPlanner/i18n/tr.ts +110 -0
  29. package/src/tool/aquariumLightingPhotoperiodPlanner/i18n/zh.ts +110 -0
  30. package/src/tool/aquariumLightingPhotoperiodPlanner/index.ts +11 -0
  31. package/src/tool/aquariumLightingPhotoperiodPlanner/logic.test.ts +115 -0
  32. package/src/tool/aquariumLightingPhotoperiodPlanner/logic.ts +248 -0
  33. package/src/tool/aquariumLightingPhotoperiodPlanner/seo.astro +13 -0
  34. package/src/tool/aquariumLightingPhotoperiodPlanner/storage.ts +39 -0
  35. package/src/tool/aquariumLightingPhotoperiodPlanner/ui.ts +44 -0
  36. package/src/tools.ts +6 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jjlmoya/utils-aquarium",
3
- "version": "1.58.0",
3
+ "version": "1.59.0",
4
4
  "type": "module",
5
5
  "main": "./src/index.ts",
6
6
  "types": "./src/index.ts",
@@ -1,10 +1,11 @@
1
1
  import type { AquariumCategoryEntry } from '../types';
2
2
  import { aquariumTankVolumeWaterChangeCalculator } from '../tool/aquariumTankVolumeWaterChangeCalculator/entry';
3
3
  import { aquariumFilterTurnoverStockingPlanner } from '../tool/aquariumFilterTurnoverStockingPlanner/entry';
4
+ import { aquariumLightingPhotoperiodPlanner } from '../tool/aquariumLightingPhotoperiodPlanner/entry';
4
5
 
5
6
  export const aquariumCategory: AquariumCategoryEntry = {
6
7
  icon: 'mdi:fishbowl-outline',
7
- tools: [aquariumTankVolumeWaterChangeCalculator, aquariumFilterTurnoverStockingPlanner],
8
+ tools: [aquariumTankVolumeWaterChangeCalculator, aquariumFilterTurnoverStockingPlanner, aquariumLightingPhotoperiodPlanner],
8
9
  i18n: {
9
10
  en: () => import('./i18n/en').then((m) => m.content),
10
11
  es: () => import('./i18n/es').then((m) => m.content),
package/src/entries.ts CHANGED
@@ -2,9 +2,12 @@ export { aquariumTankVolumeWaterChangeCalculator } from './tool/aquariumTankVolu
2
2
  export type { AquariumTankVolumeWaterChangeCalculatorLocaleContent } from './tool/aquariumTankVolumeWaterChangeCalculator/entry';
3
3
  export { aquariumFilterTurnoverStockingPlanner } from './tool/aquariumFilterTurnoverStockingPlanner/entry';
4
4
  export type { AquariumFilterTurnoverStockingPlannerLocaleContent } from './tool/aquariumFilterTurnoverStockingPlanner/entry';
5
+ export { aquariumLightingPhotoperiodPlanner } from './tool/aquariumLightingPhotoperiodPlanner/entry';
6
+ export type { AquariumLightingPhotoperiodPlannerLocaleContent } from './tool/aquariumLightingPhotoperiodPlanner/entry';
5
7
  export { aquariumCategory } from './category';
6
8
 
7
9
  import { aquariumTankVolumeWaterChangeCalculator } from './tool/aquariumTankVolumeWaterChangeCalculator/entry';
8
10
  import { aquariumFilterTurnoverStockingPlanner } from './tool/aquariumFilterTurnoverStockingPlanner/entry';
11
+ import { aquariumLightingPhotoperiodPlanner } from './tool/aquariumLightingPhotoperiodPlanner/entry';
9
12
 
10
- export const ALL_ENTRIES = [aquariumTankVolumeWaterChangeCalculator, aquariumFilterTurnoverStockingPlanner];
13
+ export const ALL_ENTRIES = [aquariumTankVolumeWaterChangeCalculator, aquariumFilterTurnoverStockingPlanner, aquariumLightingPhotoperiodPlanner];
@@ -2,7 +2,7 @@ import { describe, expect, it } from 'vitest';
2
2
  import { ALL_TOOLS } from '../tools';
3
3
 
4
4
  const EXPECTED_LOCALES = ['de', 'en', 'es', 'fr', 'id', 'it', 'ja', 'ko', 'nl', 'pl', 'pt', 'ru', 'sv', 'tr', 'zh'];
5
- const ENGLISH_FIRST_TOOL_IDS = new Set<string>();
5
+ const ENGLISH_FIRST_TOOL_IDS = new Set<string>([]);
6
6
 
7
7
  describe('I18n Coverage Validation', () => {
8
8
  ALL_TOOLS.forEach(({ entry }) => {
@@ -3,12 +3,13 @@ import { ALL_TOOLS } from '../tools';
3
3
  import { aquariumCategory } from '../data';
4
4
 
5
5
  describe('Tool Validation Suite', () => {
6
- it('registers exactly two aquarium production tools', () => {
7
- expect(ALL_TOOLS.length).toBe(2);
8
- expect(aquariumCategory.tools).toHaveLength(2);
6
+ it('registers exactly three aquarium production tools', () => {
7
+ expect(ALL_TOOLS.length).toBe(3);
8
+ expect(aquariumCategory.tools).toHaveLength(3);
9
9
  expect(aquariumCategory.tools.map((tool) => tool.id)).toEqual([
10
10
  'aquarium-tank-volume-water-change-calculator',
11
11
  'aquarium-filter-turnover-stocking-planner',
12
+ 'aquarium-lighting-photoperiod-schedule-planner',
12
13
  ]);
13
14
  });
14
15
  });
@@ -0,0 +1,667 @@
1
+ .aqlp-shell {
2
+ --aqlp-paper: #f5f1e8;
3
+ --aqlp-panel: #fffdf8;
4
+ --aqlp-visual: #e7f0ec;
5
+ --aqlp-ink: #263b3d;
6
+ --aqlp-muted: #687b7a;
7
+ --aqlp-line: #ccd8d1;
8
+ --aqlp-teal: #237f7b;
9
+ --aqlp-teal-dark: #175d5a;
10
+ --aqlp-sun: #e7ad4c;
11
+ --aqlp-coral: #ca7059;
12
+ --aqlp-night: #33475d;
13
+ --aqlp-status-bg: #dcece5;
14
+ --aqlp-choice-bg: #e6f2ec;
15
+ --aqlp-co2-bg: #fff6df;
16
+ --aqlp-co2-line: #e8d19a;
17
+ --aqlp-chart-grid: #bed2c9;
18
+ --aqlp-chart-tick: #b4cbc2;
19
+ --aqlp-chart-fill: #74bda2;
20
+ --aqlp-shadow: rgba(33, 47, 48, 0.1);
21
+
22
+ display: grid;
23
+ grid-template-columns: minmax(0, 1.55fr) minmax(290px, 0.78fr);
24
+ max-width: 1120px;
25
+ margin: 0 auto;
26
+ overflow: hidden;
27
+ color: var(--aqlp-ink);
28
+ background: var(--aqlp-paper);
29
+ border: 1px solid #d5d4ca;
30
+ border-radius: 28px;
31
+ box-shadow: 0 18px 50px var(--aqlp-shadow);
32
+ }
33
+
34
+ .theme-dark .aqlp-shell {
35
+ --aqlp-paper: #172728;
36
+ --aqlp-panel: #1c3031;
37
+ --aqlp-visual: #213b3a;
38
+ --aqlp-ink: #f1eee4;
39
+ --aqlp-muted: #b5c6bf;
40
+ --aqlp-line: #41605b;
41
+ --aqlp-teal: #79c8aa;
42
+ --aqlp-teal-dark: #a8e4c5;
43
+ --aqlp-sun: #f0c15e;
44
+ --aqlp-coral: #f19a78;
45
+ --aqlp-night: #0f1e2d;
46
+ --aqlp-status-bg: #25443c;
47
+ --aqlp-choice-bg: #23483f;
48
+ --aqlp-co2-bg: #3d3423;
49
+ --aqlp-co2-line: #806b3d;
50
+ --aqlp-chart-grid: #4a6b63;
51
+ --aqlp-chart-tick: #52736b;
52
+ --aqlp-chart-fill: #4f9b83;
53
+ --aqlp-shadow: rgba(0, 0, 0, 0.28);
54
+
55
+ border-color: #35504d;
56
+ }
57
+
58
+ .aqlp-shell *,
59
+ .aqlp-shell *::before,
60
+ .aqlp-shell *::after {
61
+ box-sizing: border-box;
62
+ }
63
+
64
+ .aqlp-shell p,
65
+ .aqlp-shell fieldset {
66
+ margin: 0;
67
+ }
68
+
69
+ .aqlp-output,
70
+ .aqlp-controls {
71
+ min-width: 0;
72
+ padding: clamp(25px, 3vw, 40px);
73
+ }
74
+
75
+ .aqlp-output {
76
+ background: var(--aqlp-paper);
77
+ }
78
+
79
+ .aqlp-controls {
80
+ background: var(--aqlp-panel);
81
+ border-left: 1px solid var(--aqlp-line);
82
+ }
83
+
84
+ .aqlp-output-header {
85
+ display: flex;
86
+ align-items: flex-start;
87
+ justify-content: space-between;
88
+ gap: 20px;
89
+ }
90
+
91
+ .aqlp-answer-copy {
92
+ display: grid;
93
+ gap: 7px;
94
+ }
95
+
96
+ .aqlp-overline {
97
+ color: var(--aqlp-teal-dark);
98
+ font-size: 0.72rem;
99
+ font-weight: 850;
100
+ letter-spacing: 0.13em;
101
+ text-transform: uppercase;
102
+ }
103
+
104
+ .aqlp-window-answer {
105
+ color: var(--aqlp-ink);
106
+ font-size: clamp(2.7rem, 5.7vw, 4.55rem);
107
+ font-weight: 850;
108
+ letter-spacing: -0.075em;
109
+ line-height: 0.9;
110
+ white-space: nowrap;
111
+ }
112
+
113
+ .aqlp-answer-subline {
114
+ color: var(--aqlp-muted);
115
+ font-size: 0.86rem;
116
+ }
117
+
118
+ .aqlp-answer-subline strong {
119
+ color: var(--aqlp-teal-dark);
120
+ }
121
+
122
+ .aqlp-status {
123
+ flex: 0 0 auto;
124
+ padding: 9px 12px;
125
+ color: var(--aqlp-teal-dark);
126
+ background: var(--aqlp-status-bg);
127
+ border: 1px solid #a5cabb;
128
+ border-radius: 999px;
129
+ font-size: 0.72rem;
130
+ font-weight: 800;
131
+ white-space: nowrap;
132
+ }
133
+
134
+ .aqlp-visual-card {
135
+ margin-top: 32px;
136
+ padding: 20px 20px 17px;
137
+ background: var(--aqlp-visual);
138
+ border: 1px solid #cbdcd4;
139
+ border-radius: 20px;
140
+ }
141
+
142
+ .aqlp-timeline-heading {
143
+ display: flex;
144
+ align-items: center;
145
+ justify-content: space-between;
146
+ gap: 12px;
147
+ margin-bottom: 16px;
148
+ }
149
+
150
+ .aqlp-timeline-heading strong {
151
+ font-size: 1rem;
152
+ }
153
+
154
+ .aqlp-timeline-heading span {
155
+ color: var(--aqlp-muted);
156
+ font-size: 0.75rem;
157
+ }
158
+
159
+ .aqlp-chart-wrap {
160
+ overflow: hidden;
161
+ margin: 0 -7px;
162
+ }
163
+
164
+ .aqlp-chart {
165
+ display: block;
166
+ width: 100%;
167
+ height: 235px;
168
+ overflow: visible;
169
+ }
170
+
171
+ .aqlp-chart-grid {
172
+ stroke: var(--aqlp-chart-grid);
173
+ stroke-width: 1;
174
+ stroke-dasharray: 3 7;
175
+ }
176
+
177
+ .aqlp-chart-tick {
178
+ stroke: var(--aqlp-chart-tick);
179
+ stroke-width: 1;
180
+ }
181
+
182
+ .aqlp-chart-fill {
183
+ fill: var(--aqlp-chart-fill);
184
+ opacity: 0.42;
185
+ }
186
+
187
+ .aqlp-chart-line {
188
+ fill: none;
189
+ stroke: var(--aqlp-teal);
190
+ stroke-linecap: round;
191
+ stroke-linejoin: round;
192
+ stroke-width: 7;
193
+ }
194
+
195
+ .aqlp-chart-marker {
196
+ stroke: var(--aqlp-visual);
197
+ stroke-width: 4;
198
+ }
199
+
200
+ .aqlp-chart-marker-edge {
201
+ fill: var(--aqlp-sun);
202
+ }
203
+
204
+ .aqlp-chart-marker-full {
205
+ fill: var(--aqlp-teal-dark);
206
+ }
207
+
208
+ .aqlp-chart-y-label,
209
+ .aqlp-chart-x-label {
210
+ fill: var(--aqlp-muted);
211
+ font-size: 15px;
212
+ }
213
+
214
+ .aqlp-event-row {
215
+ display: grid;
216
+ grid-template-columns: repeat(3, minmax(0, 1fr));
217
+ gap: 10px;
218
+ margin-top: 7px;
219
+ }
220
+
221
+ .aqlp-event-row span {
222
+ display: flex;
223
+ align-items: center;
224
+ gap: 7px;
225
+ min-width: 0;
226
+ color: var(--aqlp-ink);
227
+ font-size: 0.7rem;
228
+ }
229
+
230
+ .aqlp-event-row span:nth-child(2) {
231
+ justify-content: center;
232
+ }
233
+
234
+ .aqlp-event-row span:last-child {
235
+ justify-content: flex-end;
236
+ }
237
+
238
+ .aqlp-event-row strong {
239
+ overflow: hidden;
240
+ text-overflow: ellipsis;
241
+ white-space: nowrap;
242
+ }
243
+
244
+ .aqlp-event-dot {
245
+ flex: 0 0 9px;
246
+ width: 9px;
247
+ height: 9px;
248
+ border-radius: 50%;
249
+ }
250
+
251
+ .aqlp-event-start,
252
+ .aqlp-event-end {
253
+ background: var(--aqlp-sun);
254
+ }
255
+
256
+ .aqlp-event-full {
257
+ background: var(--aqlp-teal-dark);
258
+ }
259
+
260
+ .aqlp-summary-row {
261
+ display: grid;
262
+ grid-template-columns: repeat(2, minmax(0, 1fr));
263
+ gap: 24px;
264
+ margin-top: 22px;
265
+ padding: 14px 0;
266
+ border-top: 1px solid var(--aqlp-line);
267
+ border-bottom: 1px solid var(--aqlp-line);
268
+ }
269
+
270
+ .aqlp-summary-row div {
271
+ display: grid;
272
+ gap: 4px;
273
+ }
274
+
275
+ .aqlp-summary-row div + div {
276
+ padding-left: 24px;
277
+ border-left: 1px solid var(--aqlp-line);
278
+ }
279
+
280
+ .aqlp-summary-row span {
281
+ color: var(--aqlp-muted);
282
+ font-size: 0.72rem;
283
+ }
284
+
285
+ .aqlp-summary-row strong {
286
+ color: var(--aqlp-ink);
287
+ font-size: 1rem;
288
+ }
289
+
290
+ .aqlp-co2-row {
291
+ display: grid;
292
+ grid-template-columns: auto minmax(0, 1fr) auto;
293
+ align-items: center;
294
+ gap: 12px;
295
+ margin-top: 17px;
296
+ padding: 13px 15px;
297
+ background: var(--aqlp-co2-bg);
298
+ border: 1px solid var(--aqlp-co2-line);
299
+ border-radius: 12px;
300
+ }
301
+
302
+ .aqlp-co2-row[hidden] {
303
+ display: none;
304
+ }
305
+
306
+ .aqlp-co2-mark {
307
+ color: var(--aqlp-coral);
308
+ font-size: 0.9rem;
309
+ font-weight: 850;
310
+ }
311
+
312
+ .aqlp-co2-row span:nth-child(2) {
313
+ display: grid;
314
+ gap: 2px;
315
+ }
316
+
317
+ .aqlp-co2-row strong {
318
+ font-size: 0.8rem;
319
+ }
320
+
321
+ .aqlp-co2-row small {
322
+ color: var(--aqlp-muted);
323
+ font-size: 0.68rem;
324
+ }
325
+
326
+ .aqlp-co2-row > strong:last-child {
327
+ color: var(--aqlp-coral);
328
+ white-space: nowrap;
329
+ }
330
+
331
+ .aqlp-signal {
332
+ display: flex;
333
+ align-items: flex-start;
334
+ gap: 9px;
335
+ margin-top: 14px;
336
+ color: var(--aqlp-teal-dark);
337
+ font-size: 0.79rem;
338
+ line-height: 1.45;
339
+ }
340
+
341
+ .aqlp-signal-mark {
342
+ flex: 0 0 8px;
343
+ width: 8px;
344
+ height: 8px;
345
+ margin-top: 5px;
346
+ background: var(--aqlp-sun);
347
+ border-radius: 50%;
348
+ }
349
+
350
+ .aqlp-legend {
351
+ display: flex;
352
+ flex-wrap: wrap;
353
+ gap: 12px;
354
+ margin-top: 16px;
355
+ color: var(--aqlp-muted);
356
+ font-size: 0.68rem;
357
+ }
358
+
359
+ .aqlp-legend span {
360
+ display: inline-flex;
361
+ align-items: center;
362
+ gap: 5px;
363
+ }
364
+
365
+ .aqlp-legend-swatch {
366
+ width: 18px;
367
+ height: 5px;
368
+ border-radius: 5px;
369
+ }
370
+
371
+ .aqlp-legend-ramp {
372
+ background: var(--aqlp-sun);
373
+ }
374
+
375
+ .aqlp-legend-full {
376
+ background: var(--aqlp-teal);
377
+ }
378
+
379
+ .aqlp-legend-dark {
380
+ background: var(--aqlp-night);
381
+ }
382
+
383
+ .aqlp-footnote {
384
+ margin-top: 11px;
385
+ color: var(--aqlp-muted);
386
+ font-size: 0.7rem;
387
+ line-height: 1.4;
388
+ }
389
+
390
+ .aqlp-controls-heading {
391
+ padding-bottom: 20px;
392
+ border-bottom: 1px solid var(--aqlp-line);
393
+ }
394
+
395
+ .aqlp-control-stack {
396
+ display: grid;
397
+ gap: 25px;
398
+ padding-top: 25px;
399
+ }
400
+
401
+ .aqlp-control {
402
+ min-width: 0;
403
+ }
404
+
405
+ .aqlp-choice-control {
406
+ padding: 0;
407
+ border: 0;
408
+ }
409
+
410
+ .aqlp-choice-control legend,
411
+ .aqlp-control > label,
412
+ .aqlp-label-line label {
413
+ display: block;
414
+ padding: 0;
415
+ color: var(--aqlp-ink);
416
+ font-size: 0.82rem;
417
+ font-weight: 850;
418
+ }
419
+
420
+ .aqlp-choice-group {
421
+ display: grid;
422
+ gap: 7px;
423
+ margin-top: 10px;
424
+ }
425
+
426
+ .aqlp-choice {
427
+ position: relative;
428
+ display: flex;
429
+ align-items: center;
430
+ width: 100%;
431
+ min-height: 46px;
432
+ padding: 9px 12px 9px 36px;
433
+ color: var(--aqlp-muted);
434
+ text-align: left;
435
+ background: transparent;
436
+ border: 1px solid var(--aqlp-line);
437
+ border-radius: 10px;
438
+ cursor: pointer;
439
+ font: inherit;
440
+ font-size: 0.77rem;
441
+ font-weight: 750;
442
+ }
443
+
444
+ .aqlp-choice::before {
445
+ position: absolute;
446
+ left: 13px;
447
+ width: 11px;
448
+ height: 11px;
449
+ border: 2px solid var(--aqlp-line);
450
+ border-radius: 50%;
451
+ content: "";
452
+ }
453
+
454
+ .aqlp-choice:hover,
455
+ .aqlp-choice:focus-visible,
456
+ .aqlp-choice[aria-pressed="true"] {
457
+ color: var(--aqlp-teal-dark);
458
+ border-color: var(--aqlp-teal);
459
+ outline: none;
460
+ }
461
+
462
+ .aqlp-choice[aria-pressed="true"] {
463
+ background: var(--aqlp-choice-bg);
464
+ }
465
+
466
+ .aqlp-choice[aria-pressed="true"]::before {
467
+ background: var(--aqlp-teal);
468
+ border-color: var(--aqlp-teal);
469
+ box-shadow: inset 0 0 0 3px var(--aqlp-choice-bg);
470
+ }
471
+
472
+ .aqlp-input {
473
+ box-sizing: border-box;
474
+ width: 100%;
475
+ min-height: 46px;
476
+ margin-top: 10px;
477
+ padding: 9px 12px;
478
+ color: var(--aqlp-ink);
479
+ background: var(--aqlp-panel);
480
+ border: 1px solid var(--aqlp-line);
481
+ border-radius: 10px;
482
+ font: inherit;
483
+ }
484
+
485
+ .aqlp-label-line {
486
+ display: flex;
487
+ align-items: center;
488
+ justify-content: space-between;
489
+ gap: 14px;
490
+ }
491
+
492
+ .aqlp-range-control output {
493
+ color: var(--aqlp-teal-dark);
494
+ font-size: 0.78rem;
495
+ font-weight: 850;
496
+ white-space: nowrap;
497
+ }
498
+
499
+ .aqlp-range-control input {
500
+ width: 100%;
501
+ margin-top: 15px;
502
+ accent-color: var(--aqlp-teal);
503
+ cursor: pointer;
504
+ }
505
+
506
+ .aqlp-advanced {
507
+ margin-top: 28px;
508
+ padding-top: 19px;
509
+ border-top: 1px solid var(--aqlp-line);
510
+ }
511
+
512
+ .aqlp-details-summary {
513
+ display: flex;
514
+ align-items: center;
515
+ justify-content: space-between;
516
+ gap: 12px;
517
+ color: var(--aqlp-ink);
518
+ cursor: pointer;
519
+ font-size: 0.8rem;
520
+ font-weight: 850;
521
+ list-style: none;
522
+ }
523
+
524
+ .aqlp-details-summary::-webkit-details-marker {
525
+ display: none;
526
+ }
527
+
528
+ .aqlp-details-summary::after {
529
+ flex: 0 0 8px;
530
+ width: 8px;
531
+ height: 8px;
532
+ border-right: 2px solid var(--aqlp-teal);
533
+ border-bottom: 2px solid var(--aqlp-teal);
534
+ content: "";
535
+ transform: rotate(45deg) translateY(-2px);
536
+ }
537
+
538
+ .aqlp-advanced[open] .aqlp-details-summary::after {
539
+ transform: rotate(225deg) translate(-2px, -2px);
540
+ }
541
+
542
+ .aqlp-details-summary span {
543
+ margin-left: auto;
544
+ color: var(--aqlp-muted);
545
+ font-size: 0.68rem;
546
+ font-weight: 500;
547
+ }
548
+
549
+ .aqlp-ramp-grid {
550
+ display: grid;
551
+ gap: 22px;
552
+ padding-top: 22px;
553
+ }
554
+
555
+ .aqlp-input:focus-visible,
556
+ .aqlp-choice:focus-visible,
557
+ .aqlp-range-control input:focus-visible,
558
+ .aqlp-details-summary:focus-visible {
559
+ outline: 3px solid var(--aqlp-sun);
560
+ outline-offset: 3px;
561
+ }
562
+
563
+ @media (max-width: 880px) {
564
+ .aqlp-shell {
565
+ grid-template-columns: 1fr;
566
+ }
567
+
568
+ .aqlp-controls {
569
+ border-top: 1px solid var(--aqlp-line);
570
+ border-left: 0;
571
+ }
572
+
573
+ .aqlp-control-stack {
574
+ grid-template-columns: repeat(2, minmax(0, 1fr));
575
+ }
576
+
577
+ .aqlp-choice-control {
578
+ grid-column: span 2;
579
+ }
580
+ }
581
+
582
+ @media (max-width: 540px) {
583
+ .aqlp-output,
584
+ .aqlp-controls {
585
+ padding: 24px 18px;
586
+ }
587
+
588
+ .aqlp-output-header {
589
+ display: grid;
590
+ gap: 15px;
591
+ }
592
+
593
+ .aqlp-status {
594
+ justify-self: start;
595
+ }
596
+
597
+ .aqlp-window-answer {
598
+ font-size: clamp(2.55rem, 13vw, 3.8rem);
599
+ }
600
+
601
+ .aqlp-visual-card {
602
+ margin-top: 25px;
603
+ padding: 16px 12px 14px;
604
+ }
605
+
606
+ .aqlp-timeline-heading {
607
+ align-items: flex-start;
608
+ flex-direction: column;
609
+ gap: 5px;
610
+ }
611
+
612
+ .aqlp-chart {
613
+ height: 190px;
614
+ }
615
+
616
+ .aqlp-event-row {
617
+ gap: 5px;
618
+ }
619
+
620
+ .aqlp-event-row span {
621
+ display: grid;
622
+ grid-template-columns: auto minmax(0, 1fr);
623
+ gap: 5px;
624
+ font-size: 0.63rem;
625
+ }
626
+
627
+ .aqlp-event-row span:nth-child(2) {
628
+ justify-content: initial;
629
+ }
630
+
631
+ .aqlp-event-row span:last-child {
632
+ justify-content: initial;
633
+ text-align: right;
634
+ }
635
+
636
+ .aqlp-summary-row {
637
+ gap: 12px;
638
+ }
639
+
640
+ .aqlp-summary-row div + div {
641
+ padding-left: 12px;
642
+ }
643
+
644
+ .aqlp-co2-row {
645
+ grid-template-columns: auto minmax(0, 1fr);
646
+ }
647
+
648
+ .aqlp-co2-row > strong:last-child {
649
+ grid-column: 2;
650
+ }
651
+
652
+ .aqlp-control-stack {
653
+ grid-template-columns: 1fr;
654
+ }
655
+
656
+ .aqlp-choice-control {
657
+ grid-column: auto;
658
+ }
659
+
660
+ .aqlp-details-summary {
661
+ align-items: flex-start;
662
+ }
663
+
664
+ .aqlp-details-summary span {
665
+ text-align: right;
666
+ }
667
+ }