@jjlmoya/utils-tabletop 1.29.0 → 1.30.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 (38) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +2 -0
  3. package/src/entries.ts +4 -0
  4. package/src/tests/locale_completeness.test.ts +2 -9
  5. package/src/tests/tool_validation.test.ts +1 -2
  6. package/src/tool/rpg-settlement-exploration-map-generator/.keep +1 -0
  7. package/src/tool/rpg-settlement-exploration-map-generator/bibliography.astro +11 -0
  8. package/src/tool/rpg-settlement-exploration-map-generator/bibliography.ts +7 -0
  9. package/src/tool/rpg-settlement-exploration-map-generator/component.astro +66 -0
  10. package/src/tool/rpg-settlement-exploration-map-generator/controller.ts +231 -0
  11. package/src/tool/rpg-settlement-exploration-map-generator/dom-views.ts +174 -0
  12. package/src/tool/rpg-settlement-exploration-map-generator/editor.ts +85 -0
  13. package/src/tool/rpg-settlement-exploration-map-generator/entry.ts +27 -0
  14. package/src/tool/rpg-settlement-exploration-map-generator/evaluator.ts +8 -0
  15. package/src/tool/rpg-settlement-exploration-map-generator/i18n/de.ts +152 -0
  16. package/src/tool/rpg-settlement-exploration-map-generator/i18n/en.ts +63 -0
  17. package/src/tool/rpg-settlement-exploration-map-generator/i18n/es.ts +233 -0
  18. package/src/tool/rpg-settlement-exploration-map-generator/i18n/fr.ts +152 -0
  19. package/src/tool/rpg-settlement-exploration-map-generator/i18n/id.ts +152 -0
  20. package/src/tool/rpg-settlement-exploration-map-generator/i18n/it.ts +152 -0
  21. package/src/tool/rpg-settlement-exploration-map-generator/i18n/ja.ts +152 -0
  22. package/src/tool/rpg-settlement-exploration-map-generator/i18n/ko.ts +152 -0
  23. package/src/tool/rpg-settlement-exploration-map-generator/i18n/nl.ts +152 -0
  24. package/src/tool/rpg-settlement-exploration-map-generator/i18n/pl.ts +152 -0
  25. package/src/tool/rpg-settlement-exploration-map-generator/i18n/pt.ts +152 -0
  26. package/src/tool/rpg-settlement-exploration-map-generator/i18n/ru.ts +152 -0
  27. package/src/tool/rpg-settlement-exploration-map-generator/i18n/sv.ts +152 -0
  28. package/src/tool/rpg-settlement-exploration-map-generator/i18n/tr.ts +152 -0
  29. package/src/tool/rpg-settlement-exploration-map-generator/i18n/zh.ts +152 -0
  30. package/src/tool/rpg-settlement-exploration-map-generator/index.ts +4 -0
  31. package/src/tool/rpg-settlement-exploration-map-generator/logic.test.ts +65 -0
  32. package/src/tool/rpg-settlement-exploration-map-generator/logic.ts +288 -0
  33. package/src/tool/rpg-settlement-exploration-map-generator/rpg-settlement-exploration-map-generator.css +885 -0
  34. package/src/tool/rpg-settlement-exploration-map-generator/seo.astro +11 -0
  35. package/src/tool/rpg-settlement-exploration-map-generator/storage.test.ts +12 -0
  36. package/src/tool/rpg-settlement-exploration-map-generator/storage.ts +24 -0
  37. package/src/tool/rpg-settlement-exploration-map-generator/ui.ts +81 -0
  38. package/src/tools.ts +2 -0
@@ -0,0 +1,885 @@
1
+ .rsm {
2
+ --n-ink: #3b2b25;
3
+ --n-muted: #7a675a;
4
+ --n-paper: #f8f0df;
5
+ --n-paper-deep: #eadcc3;
6
+ --n-line: #c9b79b;
7
+ --n-accent: #c66443;
8
+ --n-accent-deep: #8d3f2f;
9
+ --n-water: #568f99;
10
+ --n-wild: #a58157;
11
+ --n-house: #f4dfb8;
12
+ --n-roof: #9e5742;
13
+ --n-plaza: #d8bd8b;
14
+ --n-white: #fff;
15
+ --n-shadow: #5d443322;
16
+ --n-mountain-paper: #ded3bd;
17
+ --n-house-timber: #ead2a7;
18
+ --n-roof-timber: #9e5742;
19
+ --n-house-stone: #d7c8ad;
20
+ --n-roof-stone: #78665d;
21
+ --n-house-coastal: #e8d7b8;
22
+ --n-roof-coastal: #668b91;
23
+ --n-house-highland: #dfc69c;
24
+ --n-roof-highland: #734c43;
25
+ --n-house-medieval: #e2cfaa;
26
+ --n-roof-medieval: #69504a;
27
+ --n-house-edo: #e7d8bc;
28
+ --n-roof-edo: #413b3a;
29
+ --n-house-sahelian: #d9ad76;
30
+ --n-roof-sahelian: #a66d45;
31
+ --n-tree-coastal-fill: #6f9b82;
32
+ --n-tree-coastal-stroke: #416c60;
33
+ --n-tree-highland-fill: #718b68;
34
+ --n-tree-highland-stroke: #4d6652;
35
+ --n-tree-edo-fill: #6f896c;
36
+ --n-tree-edo-stroke: #4b624f;
37
+ --n-tree-edo-pink-fill: #d99aa9;
38
+ --n-tree-edo-pink-stroke: #9f6678;
39
+ --n-tree-edo-green-fill: #8eaf83;
40
+ --n-tree-edo-green-stroke: #5d795d;
41
+ --n-tree-sahelian-fill: #b58a55;
42
+ --n-tree-sahelian-stroke: #8b6540;
43
+ --n-tree-medieval-fill: #7f8d65;
44
+ --n-tree-medieval-stroke: #5c684d;
45
+ --n-house-frame-stroke: #6f4e3f;
46
+ --n-house-slats-stroke: #77564a;
47
+ --n-house-masonry-stroke: #947d69;
48
+ --n-sunband-stroke: #8d583d;
49
+ --n-dark-house-body-stroke: #a89278;
50
+ --n-dark-house-roof-stroke: #b6a087;
51
+ --n-dark-window-fill: #79a5a3;
52
+ --n-dark-window-stroke: #342d29;
53
+ --n-dark-door-fill: #c77c62;
54
+ --n-dark-door-stroke: #342d29;
55
+ --n-dark-plaque-fill: #332b27;
56
+ --n-dark-plaque-stroke: #c4ab8d;
57
+ --n-dark-glyph-fill: #f1dfc3;
58
+ --n-dark-glyph-stroke: #332b27;
59
+
60
+ color: var(--n-ink);
61
+ background: var(--n-paper);
62
+ border: 1px solid var(--n-line);
63
+ border-radius: 1.2rem;
64
+ box-shadow: 0 1rem 2.8rem var(--n-shadow);
65
+ overflow: hidden;
66
+ }
67
+ .theme-dark .rsm {
68
+ --n-ink: #f3e5ce;
69
+ --n-muted: #c0aa92;
70
+ --n-paper: #2c2521;
71
+ --n-paper-deep: #3a3029;
72
+ --n-line: #725c4b;
73
+ --n-accent: #db7854;
74
+ --n-accent-deep: #f0a27c;
75
+ --n-water: #7bb1b2;
76
+ --n-wild: #d1aa75;
77
+ --n-house: #e2cda8;
78
+ --n-roof: #b86b4e;
79
+ --n-plaza: #6b5140;
80
+ --n-white: #211b18;
81
+ --n-shadow: #0008;
82
+ --n-mountain-paper-dark: #4a3b31;
83
+ --n-house-timber: #655344;
84
+ --n-roof-timber: #593c36;
85
+ --n-house-stone: #5b534a;
86
+ --n-roof-stone: #3c3938;
87
+ --n-house-coastal: #4e625f;
88
+ --n-roof-coastal: #324f52;
89
+ --n-house-highland: #5e513e;
90
+ --n-roof-highland: #463433;
91
+ --n-house-medieval: #5a4b3f;
92
+ --n-roof-medieval: #3b302d;
93
+ --n-house-edo: #61584f;
94
+ --n-roof-edo: #252b2b;
95
+ --n-house-sahelian: #74543c;
96
+ --n-roof-sahelian: #6e4636;
97
+
98
+ }
99
+ .rsm-studio {
100
+ display: grid;
101
+ grid-template-columns: minmax(18rem, 0.75fr) minmax(28rem, 1.5fr);
102
+ min-height: 35rem;
103
+ }
104
+ .rsm-controls,
105
+ .rsm-map-column {
106
+ padding: clamp(1.15rem, 2.5vw, 2.1rem);
107
+ }
108
+ .rsm-controls {
109
+ display: flex;
110
+ flex-direction: column;
111
+ gap: 1.1rem;
112
+ border-right: 1px solid var(--n-line);
113
+ background: var(--n-paper-deep);
114
+ }
115
+ .rsm-intro {
116
+ max-width: 32rem;
117
+ color: var(--n-muted);
118
+ font-size: 0.9rem;
119
+ line-height: 1.55;
120
+ }
121
+ .rsm-separator {
122
+ height: 1px;
123
+ background: var(--n-line);
124
+ }
125
+ .rsm-field,
126
+ .rsm-services {
127
+ display: flex;
128
+ flex-direction: column;
129
+ gap: 0.55rem;
130
+ margin: 0;
131
+ padding: 0;
132
+ border: 0;
133
+ }
134
+ .rsm-field label,
135
+ .rsm-label,
136
+ .rsm-services legend {
137
+ display: flex;
138
+ justify-content: space-between;
139
+ gap: 0.7rem;
140
+ color: var(--n-ink);
141
+ font-size: 0.74rem;
142
+ font-weight: 700;
143
+ letter-spacing: 0.08em;
144
+ text-transform: uppercase;
145
+ }
146
+ .rsm-field small {
147
+ color: var(--n-muted);
148
+ font-size: 0.74rem;
149
+ line-height: 1.4;
150
+ }
151
+ .rsm-seed-row {
152
+ display: flex;
153
+ gap: 0.45rem;
154
+ }
155
+ .rsm input[type="text"],
156
+ .rsm-service-picker {
157
+ min-width: 0;
158
+ border: 1px solid var(--n-line);
159
+ border-radius: 0.55rem;
160
+ background: var(--n-paper);
161
+ color: var(--n-ink);
162
+ font: inherit;
163
+ }
164
+ .rsm input[type="text"] {
165
+ width: 100%;
166
+ padding: 0.68rem 0.75rem;
167
+ }
168
+ .rsm input:focus-visible,
169
+ .rsm button:focus-visible {
170
+ outline: 3px solid var(--n-accent);
171
+ outline-offset: 2px;
172
+ }
173
+ .rsm button {
174
+ cursor: pointer;
175
+ }
176
+ .rsm-icon-button {
177
+ flex: 0 0 2.65rem;
178
+ border: 1px solid var(--n-line);
179
+ border-radius: 0.55rem;
180
+ background: var(--n-paper);
181
+ color: var(--n-accent-deep);
182
+ font-size: 1.2rem;
183
+ }
184
+ .rsm-choice-row,
185
+ .rsm-service-row,
186
+ .rsm-tool-group,
187
+ .rsm-actions,
188
+ .rsm-legend {
189
+ display: flex;
190
+ flex-wrap: wrap;
191
+ gap: 0.45rem;
192
+ }
193
+ .rsm-choice,
194
+ .rsm-tool,
195
+ .rsm-actions button,
196
+ .rsm-data-menu summary {
197
+ border: 1px solid var(--n-line);
198
+ border-radius: 999px;
199
+ background: var(--n-paper);
200
+ color: var(--n-ink);
201
+ font: inherit;
202
+ font-size: 0.78rem;
203
+ }
204
+ .rsm-choice {
205
+ padding: 0.55rem 0.7rem;
206
+ }
207
+ .rsm-choice.is-active,
208
+ .rsm-tool.is-active,
209
+ .rsm-action-primary {
210
+ border-color: var(--n-accent-deep);
211
+ background: var(--n-accent);
212
+ color: var(--n-white);
213
+ }
214
+ .rsm-size-row {
215
+ display: grid;
216
+ grid-template-columns: repeat(3, 1fr);
217
+ gap: 0.45rem;
218
+ }
219
+ .rsm-size-button {
220
+ display: flex;
221
+ min-height: 4.1rem;
222
+ flex-direction: column;
223
+ justify-content: center;
224
+ gap: 0.2rem;
225
+ border: 1px solid var(--n-line);
226
+ border-radius: 0.65rem;
227
+ background: var(--n-paper);
228
+ color: var(--n-ink);
229
+ font: inherit;
230
+ text-align: left;
231
+ }
232
+ .rsm-size-button strong,
233
+ .rsm-size-button span,
234
+ .rsm-size-button small {
235
+ padding-inline: 0.65rem;
236
+ }
237
+ .rsm-size-button span {
238
+ color: var(--n-muted);
239
+ font-size: 0.7rem;
240
+ }
241
+ .rsm-size-button small {
242
+ color: var(--n-muted);
243
+ font-size: 0.64rem;
244
+ }
245
+ .rsm-size-button.is-active {
246
+ border-color: var(--n-accent-deep);
247
+ box-shadow: inset 0 -0.22rem var(--n-accent);
248
+ }
249
+ .rsm-home-field output {
250
+ color: var(--n-accent-deep);
251
+ font-variant-numeric: tabular-nums;
252
+ }
253
+ .rsm input[type="range"] {
254
+ width: 100%;
255
+ accent-color: var(--n-accent);
256
+ }
257
+ .rsm-service-chip {
258
+ position: relative;
259
+ display: block;
260
+ cursor: pointer;
261
+ }
262
+ .rsm-service-entry {
263
+ display: inline-flex;
264
+ align-items: center;
265
+ gap: 0.15rem;
266
+ }
267
+ .rsm-remove-service {
268
+ width: 1.35rem;
269
+ height: 1.35rem;
270
+ padding: 0;
271
+ border: 1px solid var(--n-line);
272
+ border-radius: 50%;
273
+ background: var(--n-paper);
274
+ color: var(--n-muted);
275
+ font: inherit;
276
+ font-size: 0.7rem;
277
+ line-height: 1;
278
+ }
279
+ .rsm-remove-service:hover,
280
+ .rsm-remove-service:focus-visible {
281
+ border-color: var(--n-accent-deep);
282
+ color: var(--n-accent-deep);
283
+ }
284
+ .rsm-service-chip input {
285
+ position: absolute;
286
+ opacity: 0;
287
+ }
288
+ .rsm-service-chip span {
289
+ display: block;
290
+ padding: 0.48rem 0.65rem;
291
+ border: 1px solid var(--n-line);
292
+ border-radius: 999px;
293
+ background: var(--n-paper);
294
+ color: var(--n-muted);
295
+ font-size: 0.74rem;
296
+ }
297
+ .rsm-service-chip input:checked + span {
298
+ border-color: var(--n-accent-deep);
299
+ background: var(--n-accent-deep);
300
+ color: var(--n-white);
301
+ }
302
+ .rsm-add-service {
303
+ display: grid;
304
+ grid-template-columns: 1fr auto;
305
+ gap: 0.4rem;
306
+ }
307
+ .rsm-add-service button {
308
+ padding: 0.55rem 0.7rem;
309
+ border: 1px solid var(--n-line);
310
+ border-radius: 0.55rem;
311
+ background: var(--n-paper);
312
+ color: var(--n-ink);
313
+ font: inherit;
314
+ font-size: 0.72rem;
315
+ }
316
+ .rsm-generate {
317
+ display: flex;
318
+ align-items: center;
319
+ justify-content: space-between;
320
+ margin-top: auto;
321
+ padding: 0.9rem 1rem;
322
+ border: 1px solid var(--n-accent-deep);
323
+ border-radius: 0.7rem;
324
+ background: var(--n-accent);
325
+ color: var(--n-white);
326
+ font: inherit;
327
+ font-weight: 700;
328
+ }
329
+ .rsm-map-column {
330
+ min-width: 0;
331
+ background: var(--n-paper);
332
+ }
333
+ .rsm-map-heading,
334
+ .rsm-stats,
335
+ .rsm-map-tools,
336
+ .rsm-actions {
337
+ display: flex;
338
+ align-items: center;
339
+ justify-content: space-between;
340
+ gap: 0.8rem;
341
+ }
342
+ .rsm-map-heading {
343
+ margin-bottom: 0.95rem;
344
+ }
345
+ .rsm-map-heading > div {
346
+ display: grid;
347
+ gap: 0.22rem;
348
+ }
349
+ .rsm-eyebrow {
350
+ color: var(--n-muted);
351
+ font-size: 0.68rem;
352
+ letter-spacing: 0.13em;
353
+ text-transform: uppercase;
354
+ }
355
+ .rsm-badge {
356
+ padding: 0.4rem 0.65rem;
357
+ border: 1px solid var(--n-wild);
358
+ border-radius: 999px;
359
+ color: var(--n-wild);
360
+ font-size: 0.7rem;
361
+ font-weight: 700;
362
+ white-space: nowrap;
363
+ }
364
+ .rsm-map-frame {
365
+ position: relative;
366
+ overflow: hidden;
367
+ border: 1px solid var(--n-line);
368
+ border-radius: 0.9rem;
369
+ background: var(--n-paper-deep);
370
+ }
371
+ .rsm-map-host {
372
+ aspect-ratio: 1.5;
373
+ min-height: 18rem;
374
+ touch-action: none;
375
+ }
376
+ .rsm-map-svg {
377
+ display: block;
378
+ width: 100%;
379
+ height: 100%;
380
+ cursor: crosshair;
381
+ shape-rendering: geometricprecision;
382
+ }
383
+ .rsm-paper {
384
+ fill: var(--n-paper);
385
+ }
386
+ .rsm-grid {
387
+ fill: none;
388
+ stroke: var(--n-line);
389
+ stroke-width: 0.035;
390
+ opacity: 0.35;
391
+ }
392
+ .rsm-water-component {
393
+ fill: var(--n-water);
394
+ opacity: 0.82;
395
+ }
396
+ .rsm-water-component rect {
397
+ stroke: var(--n-water);
398
+ stroke-width: 0.06;
399
+ }
400
+ .rsm-water-river {
401
+ opacity: 0.72;
402
+ }
403
+ .rsm-water-pond {
404
+ opacity: 0.8;
405
+ }
406
+ .rsm-water-lake {
407
+ opacity: 0.88;
408
+ }
409
+ .rsm-road-base,
410
+ .rsm-road-line {
411
+ fill: none;
412
+ stroke-linecap: round;
413
+ stroke-linejoin: round;
414
+ }
415
+ .rsm-road-base {
416
+ stroke: var(--n-line);
417
+ stroke-width: 0.78;
418
+ }
419
+ .rsm-road-line {
420
+ stroke: var(--n-accent);
421
+ stroke-dasharray: 0.18 0.16;
422
+ stroke-width: 0.16;
423
+ }
424
+ .rsm-plaza rect {
425
+ fill: var(--n-plaza);
426
+ stroke: var(--n-line);
427
+ stroke-width: 0.12;
428
+ }
429
+ .rsm-plaza path {
430
+ fill: none;
431
+ stroke: var(--n-line);
432
+ stroke-width: 0.1;
433
+ }
434
+ .rsm-tree path:first-child {
435
+ stroke: var(--n-roof);
436
+ stroke-linecap: round;
437
+ stroke-width: 0.13;
438
+ }
439
+ .rsm-tree path:not(:first-child) {
440
+ fill: var(--n-wild);
441
+ stroke: var(--n-roof);
442
+ stroke-width: 0.08;
443
+ }
444
+ .rsm-tree-coastal path:not(:first-child) {
445
+ fill: var(--n-tree-coastal-fill);
446
+ stroke: var(--n-tree-coastal-stroke);
447
+ }
448
+ .rsm-tree-highland path:not(:first-child) {
449
+ fill: var(--n-tree-highland-fill);
450
+ stroke: var(--n-tree-highland-stroke);
451
+ }
452
+ .rsm-tree-edo path:not(:first-child) {
453
+ fill: var(--n-tree-edo-fill);
454
+ stroke: var(--n-tree-edo-stroke);
455
+ }
456
+ .rsm-tree-edo-pink path:not(:first-child) {
457
+ fill: var(--n-tree-edo-pink-fill);
458
+ stroke: var(--n-tree-edo-pink-stroke);
459
+ }
460
+ .rsm-tree-edo-green path:not(:first-child) {
461
+ fill: var(--n-tree-edo-green-fill);
462
+ stroke: var(--n-tree-edo-green-stroke);
463
+ }
464
+ .rsm-tree-sahelian path:not(:first-child) {
465
+ fill: var(--n-tree-sahelian-fill);
466
+ stroke: var(--n-tree-sahelian-stroke);
467
+ }
468
+ .rsm-tree-medieval path:not(:first-child) {
469
+ fill: var(--n-tree-medieval-fill);
470
+ stroke: var(--n-tree-medieval-stroke);
471
+ }
472
+ .rsm-building .rsm-house-body {
473
+ fill: var(--n-house);
474
+ stroke: var(--n-ink);
475
+ stroke-width: 0.12;
476
+ }
477
+ .rsm-building .rsm-house-roof {
478
+ fill: var(--n-roof);
479
+ stroke: var(--n-ink);
480
+ stroke-width: 0.1;
481
+ }
482
+ .rsm-house-window {
483
+ fill: var(--n-water);
484
+ stroke: var(--n-ink);
485
+ stroke-width: 0.07;
486
+ }
487
+ .rsm-house-door {
488
+ fill: var(--n-accent-deep);
489
+ stroke: var(--n-ink);
490
+ stroke-width: 0.07;
491
+ }
492
+ .rsm-house-beam,
493
+ .rsm-house-stone,
494
+ .rsm-house-frame,
495
+ .rsm-house-wood-slats,
496
+ .rsm-house-masonry,
497
+ .rsm-house-awning,
498
+ .rsm-house-chimney,
499
+ .rsm-house-sunband {
500
+ fill: none;
501
+ stroke: var(--n-ink);
502
+ stroke-linecap: round;
503
+ stroke-width: 0.08;
504
+ }
505
+ .rsm-house-frame {
506
+ stroke: var(--n-house-frame-stroke);
507
+ stroke-width: 0.12;
508
+ }
509
+ .rsm-house-wood-slats {
510
+ stroke: var(--n-house-slats-stroke);
511
+ stroke-width: 0.07;
512
+ opacity: 0.8;
513
+ }
514
+ .rsm-house-masonry {
515
+ stroke: var(--n-house-masonry-stroke);
516
+ stroke-width: 0.07;
517
+ stroke-dasharray: 0.55 0.12;
518
+ opacity: 0.78;
519
+ }
520
+ .rsm-service-plaque {
521
+ fill: var(--n-paper);
522
+ stroke: var(--n-ink);
523
+ stroke-width: 0.05;
524
+ opacity: 0.94;
525
+ }
526
+ .rsm-house-style-timber .rsm-house-body {
527
+ fill: var(--n-house-timber);
528
+ }
529
+ .rsm-house-style-timber .rsm-house-roof {
530
+ fill: var(--n-roof-timber);
531
+ }
532
+ .rsm-house-style-stone .rsm-house-body {
533
+ fill: var(--n-house-stone);
534
+ }
535
+ .rsm-house-style-stone .rsm-house-roof {
536
+ fill: var(--n-roof-stone);
537
+ }
538
+ .rsm-house-style-coastal .rsm-house-body {
539
+ fill: var(--n-house-coastal);
540
+ }
541
+ .rsm-house-style-coastal .rsm-house-roof {
542
+ fill: var(--n-roof-coastal);
543
+ }
544
+ .rsm-house-style-highland .rsm-house-body {
545
+ fill: var(--n-house-highland);
546
+ }
547
+ .rsm-house-style-highland .rsm-house-roof {
548
+ fill: var(--n-roof-highland);
549
+ }
550
+ .rsm-house-style-highland .rsm-house-chimney {
551
+ stroke-width: 0.14;
552
+ }
553
+ .rsm-house-style-medieval .rsm-house-body {
554
+ fill: var(--n-house-medieval);
555
+ }
556
+ .rsm-house-style-medieval .rsm-house-roof {
557
+ fill: var(--n-roof-medieval);
558
+ }
559
+ .rsm-house-style-edo .rsm-house-body {
560
+ fill: var(--n-house-edo);
561
+ }
562
+ .rsm-house-style-edo .rsm-house-roof {
563
+ fill: var(--n-roof-edo);
564
+ }
565
+ .rsm-house-style-edo .rsm-house-beam {
566
+ stroke-width: 0.12;
567
+ }
568
+ .rsm-house-style-sahelian .rsm-house-body {
569
+ fill: var(--n-house-sahelian);
570
+ }
571
+ .rsm-house-style-sahelian .rsm-house-roof {
572
+ fill: var(--n-roof-sahelian);
573
+ }
574
+ .rsm-house-style-sahelian .rsm-house-sunband {
575
+ stroke: var(--n-sunband-stroke);
576
+ stroke-width: 0.14;
577
+ }
578
+ .rsm-building-glyph {
579
+ fill: var(--n-ink);
580
+ font-weight: 800;
581
+ paint-order: stroke;
582
+ stroke: var(--n-paper);
583
+ stroke-width: 0.035;
584
+ text-anchor: middle;
585
+ }
586
+ .rsm-service-sign {
587
+ overflow: visible;
588
+ }
589
+ .rsm-service-sign .rsm-building-glyph {
590
+ font-weight: 900;
591
+ letter-spacing: 0;
592
+ dominant-baseline: middle;
593
+ }
594
+ .rsm-service-stem {
595
+ fill: none;
596
+ stroke: var(--n-line);
597
+ stroke-width: 0.07;
598
+ }
599
+ .theme-dark .rsm-building .rsm-house-body {
600
+ stroke: var(--n-dark-house-body-stroke);
601
+ }
602
+ .theme-dark .rsm-building .rsm-house-roof {
603
+ stroke: var(--n-dark-house-roof-stroke);
604
+ }
605
+ .theme-dark .rsm-house-window {
606
+ fill: var(--n-dark-window-fill);
607
+ stroke: var(--n-dark-window-stroke);
608
+ }
609
+ .theme-dark .rsm-house-door {
610
+ fill: var(--n-dark-door-fill);
611
+ stroke: var(--n-dark-door-stroke);
612
+ }
613
+ .theme-dark .rsm-service-plaque {
614
+ fill: var(--n-dark-plaque-fill);
615
+ stroke: var(--n-dark-plaque-stroke);
616
+ }
617
+ .theme-dark .rsm-service-stem {
618
+ stroke: var(--n-dark-plaque-stroke);
619
+ }
620
+ .theme-dark .rsm-service-sign .rsm-building-glyph {
621
+ fill: var(--n-dark-glyph-fill);
622
+ stroke: var(--n-dark-glyph-stroke);
623
+ }
624
+ .rsm-building:hover .rsm-house-body {
625
+ fill: var(--n-paper);
626
+ }
627
+ .rsm-environment-mountain .rsm-paper {
628
+ fill: var(--n-mountain-paper);
629
+ }
630
+ .theme-dark .rsm-environment-mountain .rsm-paper {
631
+ fill: var(--n-mountain-paper-dark);
632
+ }
633
+ .rsm-context-menu[hidden] {
634
+ display: none;
635
+ }
636
+ .rsm-context-menu {
637
+ position: fixed;
638
+ z-index: 20;
639
+ display: grid;
640
+ min-width: 9rem;
641
+ max-width: calc(100vw - 1rem);
642
+ max-height: min(22rem, calc(100vh - 1rem));
643
+ box-sizing: border-box;
644
+ overflow-y: auto;
645
+ gap: 0.2rem;
646
+ padding: 0.4rem;
647
+ border: 1px solid var(--n-line);
648
+ border-radius: 0.6rem;
649
+ background: var(--n-paper);
650
+ box-shadow: 0 0.7rem 1.5rem var(--n-shadow);
651
+ }
652
+ .rsm-context-menu button {
653
+ padding: 0.5rem 0.65rem;
654
+ border: 0;
655
+ background: transparent;
656
+ color: var(--n-ink);
657
+ font: inherit;
658
+ font-size: 0.74rem;
659
+ text-align: left;
660
+ }
661
+ .rsm-context-menu button:hover {
662
+ background: var(--n-paper-deep);
663
+ }
664
+ .rsm-map-help {
665
+ position: absolute;
666
+ right: 0.65rem;
667
+ bottom: 0.65rem;
668
+ padding: 0.35rem 0.5rem;
669
+ border: 1px solid var(--n-line);
670
+ border-radius: 0.35rem;
671
+ background: var(--n-paper);
672
+ color: var(--n-muted);
673
+ font-size: 0.68rem;
674
+ }
675
+ .rsm-stats {
676
+ align-items: stretch;
677
+ margin-block: 0.85rem;
678
+ padding-block: 0.65rem;
679
+ border-block: 1px solid var(--n-line);
680
+ }
681
+ .rsm-stats div {
682
+ display: grid;
683
+ gap: 0.18rem;
684
+ min-width: 0;
685
+ }
686
+ .rsm-stats span {
687
+ color: var(--n-muted);
688
+ font-size: 0.67rem;
689
+ text-transform: uppercase;
690
+ }
691
+ .rsm-stats strong {
692
+ font-size: 1.1rem;
693
+ font-variant-numeric: tabular-nums;
694
+ }
695
+ .rsm-tool-group {
696
+ gap: 0.25rem;
697
+ }
698
+ .rsm-tool {
699
+ padding: 0.48rem 0.6rem;
700
+ }
701
+ .rsm-service-picker {
702
+ position: relative;
703
+ display: flex;
704
+ align-items: center;
705
+ gap: 0.45rem;
706
+ padding: 0.25rem 0.35rem 0.25rem 0.6rem;
707
+ color: var(--n-muted);
708
+ font-size: 0.7rem;
709
+ }
710
+ .rsm-service-picker > button {
711
+ display: flex;
712
+ align-items: center;
713
+ gap: 0.5rem;
714
+ padding: 0.3rem 0.4rem;
715
+ border: 0;
716
+ background: transparent;
717
+ color: var(--n-ink);
718
+ font: inherit;
719
+ font-size: 0.72rem;
720
+ }
721
+ .rsm-service-picker > button b {
722
+ width: 0.45rem;
723
+ height: 0.45rem;
724
+ border-right: 1px solid var(--n-ink);
725
+ border-bottom: 1px solid var(--n-ink);
726
+ transform: rotate(45deg) translateY(-0.1rem);
727
+ }
728
+ .rsm-service-options[hidden] {
729
+ display: none;
730
+ }
731
+ .rsm-service-options {
732
+ position: absolute;
733
+ right: 0;
734
+ top: calc(100% + 0.35rem);
735
+ z-index: 3;
736
+ display: grid;
737
+ min-width: 9rem;
738
+ gap: 0.2rem;
739
+ padding: 0.4rem;
740
+ border: 1px solid var(--n-line);
741
+ border-radius: 0.55rem;
742
+ background: var(--n-paper);
743
+ box-shadow: 0 0.6rem 1.2rem var(--n-shadow);
744
+ }
745
+ .rsm-service-options button {
746
+ padding: 0.45rem 0.55rem;
747
+ border: 0;
748
+ background: transparent;
749
+ color: var(--n-ink);
750
+ font: inherit;
751
+ font-size: 0.72rem;
752
+ text-align: left;
753
+ }
754
+ .rsm-service-options button:hover {
755
+ background: var(--n-paper-deep);
756
+ }
757
+ .rsm-legend {
758
+ margin-top: 0.75rem;
759
+ color: var(--n-muted);
760
+ font-size: 0.68rem;
761
+ }
762
+ .rsm-legend span {
763
+ display: inline-flex;
764
+ align-items: center;
765
+ gap: 0.28rem;
766
+ }
767
+ .rsm-legend i {
768
+ display: inline-grid;
769
+ width: 0.8rem;
770
+ height: 0.8rem;
771
+ place-items: center;
772
+ font-style: normal;
773
+ font-weight: 800;
774
+ }
775
+ .rsm-legend-home {
776
+ border: 1px solid var(--n-ink);
777
+ background: var(--n-paper-deep);
778
+ }
779
+ .rsm-legend-service {
780
+ color: var(--n-accent-deep);
781
+ }
782
+ .rsm-legend i.rsm-legend-path {
783
+ height: 0.22rem;
784
+ border-block: 2px dashed var(--n-accent);
785
+ }
786
+ .rsm-legend i.rsm-legend-water {
787
+ height: 0.22rem;
788
+ border-block: 2px solid var(--n-water);
789
+ }
790
+ .rsm-legend-wild {
791
+ color: var(--n-wild);
792
+ }
793
+ .rsm-actions {
794
+ justify-content: flex-start;
795
+ margin-top: 1rem;
796
+ }
797
+ .rsm-actions button,
798
+ .rsm-data-menu summary {
799
+ padding: 0.52rem 0.68rem;
800
+ }
801
+ .rsm-actions button {
802
+ font-size: 0.72rem;
803
+ }
804
+ .rsm-data-menu {
805
+ position: relative;
806
+ }
807
+ .rsm-data-menu summary {
808
+ cursor: pointer;
809
+ list-style: none;
810
+ }
811
+ .rsm-data-menu summary::-webkit-details-marker {
812
+ display: none;
813
+ }
814
+ .rsm-data-menu[open] > div {
815
+ display: grid;
816
+ }
817
+ .rsm-data-menu > div {
818
+ position: absolute;
819
+ right: 0;
820
+ z-index: 2;
821
+ display: none;
822
+ min-width: 9rem;
823
+ gap: 0.35rem;
824
+ margin-top: 0.35rem;
825
+ padding: 0.45rem;
826
+ border: 1px solid var(--n-line);
827
+ border-radius: 0.55rem;
828
+ background: var(--n-paper);
829
+ box-shadow: 0 0.6rem 1.2rem var(--n-shadow);
830
+ }
831
+ .rsm-data-menu label {
832
+ display: block;
833
+ color: var(--n-ink);
834
+ font-size: 0.72rem;
835
+ }
836
+ .rsm-data-menu input {
837
+ width: 100%;
838
+ margin-top: 0.35rem;
839
+ font-size: 0.68rem;
840
+ }
841
+ .rsm-status {
842
+ min-height: 1.1rem;
843
+ margin: 0.55rem 0 0;
844
+ color: var(--n-accent-deep);
845
+ font-size: 0.75rem;
846
+ }
847
+
848
+ @media (max-width: 850px) {
849
+ .rsm-studio {
850
+ grid-template-columns: 1fr;
851
+ }
852
+ .rsm-controls {
853
+ border-right: 0;
854
+ border-bottom: 1px solid var(--n-line);
855
+ }
856
+ }
857
+
858
+ @media (max-width: 560px) {
859
+ .rsm-controls,
860
+ .rsm-map-column {
861
+ padding: 1rem;
862
+ }
863
+ .rsm-map-host {
864
+ min-height: 14rem;
865
+ }
866
+ .rsm-map-tools,
867
+ .rsm-actions {
868
+ align-items: stretch;
869
+ flex-direction: column;
870
+ }
871
+ .rsm-tool-group {
872
+ justify-content: center;
873
+ }
874
+ .rsm-service-picker {
875
+ justify-content: space-between;
876
+ }
877
+ .rsm-actions button,
878
+ .rsm-data-menu,
879
+ .rsm-data-menu summary {
880
+ width: 100%;
881
+ }
882
+ .rsm-data-menu > div {
883
+ position: static;
884
+ }
885
+ }