mapshaper 0.7.66 → 0.7.68

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/www/page.css CHANGED
@@ -944,46 +944,156 @@ body.sidebar-panels-resizing .sidebar-panels-resize-handle::before,
944
944
  }
945
945
  }
946
946
 
947
+ :root {
948
+ --sidebar-strip-height: 33px;
949
+ }
950
+
951
+ /* Icon buttons for opening the sidebar, shown on the map while the sidebar is
952
+ closed. Sized and styled to mirror the .nav-buttons on the right, and like
953
+ them hidden on the splash screen: body.map-view is set once data is
954
+ imported or the splash popup is dismissed. */
947
955
  .sidebar-tabs {
948
956
  position: absolute;
949
- top: 66px; /* below line intersection repair link */
957
+ top: 35px; /* 29px header + the 6px offset of .nav-buttons */
950
958
  left: 0;
951
959
  z-index: 40;
960
+ padding: 3px;
961
+ background-color: white;
962
+ border-radius: 7px;
952
963
  pointer-events: auto;
953
964
  }
954
965
 
966
+ body:not(.map-view) .sidebar-tabs {
967
+ display: none;
968
+ }
969
+
955
970
  body.sidebar-open .sidebar-tabs {
956
- left: var(--left-sidebar-width);
957
- margin-left: -1.5px;
971
+ display: none;
958
972
  }
959
973
 
960
974
  body.sidebar-tabs-over-popup .sidebar-tabs {
961
975
  z-index: 90;
962
976
  }
963
977
 
978
+ /* keep the line intersection readout clear of the buttons */
979
+ body:not(.sidebar-open) .intersection-display {
980
+ left: 44px;
981
+ }
982
+
964
983
  .sidebar-tab {
965
- border: 1px solid rgba(255,255,255,0.8);
966
- border-right: none; ;
967
- writing-mode: vertical-rl;
968
- transform: rotate(180deg);
969
- background-color: var(--theme-col);
970
- color: white;
971
- padding: 9px 4px;
972
- margin-bottom: 4px;
973
- border-radius: 5px 0 0 5px;
984
+ position: relative;
985
+ padding: 3px 4px;
986
+ line-height: 1;
987
+ cursor: pointer;
988
+ }
989
+
990
+ .sidebar-icon {
991
+ display: block;
992
+ }
993
+
994
+ .sidebar-icon * {
995
+ fill: var(--theme-col);
996
+ }
997
+
998
+ .sidebar-tab.console-tab {
999
+ padding-top: 8px;
1000
+ }
1001
+
1002
+ .sidebar-tab:hover .sidebar-icon * {
1003
+ fill: #166689;
1004
+ }
1005
+
1006
+ /* Tooltip to the right of the button, matching the .nav-btn tooltips */
1007
+ .sidebar-tab[data-tooltip]:hover::after {
1008
+ content: attr(data-tooltip);
1009
+ position: absolute;
1010
+ top: 50%;
1011
+ left: calc(100% + 3px);
1012
+ transform: translateY(-50%);
1013
+ pointer-events: none;
1014
+ background-color: rgba(255, 255, 255, 0.85);
1015
+ color: var(--colored-text);
1016
+ font-size: 12px;
1017
+ line-height: 12px;
1018
+ padding: 3px 6px 4px 6px;
1019
+ white-space: nowrap;
1020
+ }
1021
+
1022
+ /* centre on the icon, which the console button's extra top padding lowers */
1023
+ .sidebar-tab.console-tab[data-tooltip]:hover::after {
1024
+ top: calc(50% + 2px);
1025
+ }
1026
+
1027
+ /* Panel toggles at the top of the open sidebar. Each toggles its own panel,
1028
+ so both can be on at once. */
1029
+ .sidebar-strip {
1030
+ display: none;
1031
+ position: absolute;
1032
+ top: 29px;
1033
+ left: 0;
1034
+ z-index: 30;
1035
+ width: var(--left-sidebar-width);
1036
+ max-width: 100%;
1037
+ height: var(--sidebar-strip-height);
1038
+ box-sizing: border-box;
1039
+ align-items: flex-start;
1040
+ gap: 6px;
1041
+ padding: 7px 10px 0 10px;
1042
+ background-color: white;
1043
+ border-right: 1px solid #c6c6c6;
1044
+ }
1045
+
1046
+ body.sidebar-open .sidebar-strip {
1047
+ display: flex;
1048
+ }
1049
+
1050
+ body.sidebar-open .sidebar-panels {
1051
+ margin-top: calc(29px + var(--sidebar-strip-height));
1052
+ }
1053
+
1054
+ .sidebar-strip-btn {
1055
+ display: flex;
1056
+ align-items: center;
1057
+ gap: 5px;
1058
+ padding: 2px 8px 2px 6px;
1059
+ border: 1px solid #cfdde4;
1060
+ border-radius: 12px;
1061
+ color: var(--theme-col);
974
1062
  font-size: 13px;
975
1063
  font-weight: 500;
1064
+ line-height: 14px;
976
1065
  cursor: pointer;
977
- pointer-events: auto;
1066
+ user-select: none;
1067
+ }
1068
+
1069
+ .sidebar-strip-btn:hover {
1070
+ border-color: var(--theme-col);
1071
+ }
1072
+
1073
+ .sidebar-strip-btn.active {
1074
+ background-color: var(--theme-col);
1075
+ border-color: var(--theme-col);
1076
+ color: white;
978
1077
  }
979
1078
 
980
- .sidebar-tab:hover {
1079
+ .sidebar-strip-btn.active:hover {
981
1080
  background-color: var(--dk-theme-col);
1081
+ border-color: var(--dk-theme-col);
982
1082
  }
983
1083
 
984
- body.layers-open .layer-tab,
985
- body.console-open .console-tab {
986
- background-color: black;
1084
+ .sidebar-strip-btn.active .sidebar-icon * {
1085
+ fill: white;
1086
+ }
1087
+
1088
+ /* matches the × of .label-style-close on the tool panels */
1089
+ .sidebar-hide-btn {
1090
+ margin-left: auto;
1091
+ padding: 3px 0 0 4px;
1092
+ font-size: 16px;
1093
+ line-height: 1;
1094
+ cursor: pointer;
1095
+ user-select: none;
1096
+ color: black;
987
1097
  }
988
1098
 
989
1099
 
@@ -1198,7 +1308,7 @@ body.simplify .layer-control-btn {
1198
1308
  max-height: 500px;
1199
1309
  overflow: hidden;
1200
1310
  overflow-y: auto;
1201
- padding: 9px 14px 10px 14px;
1311
+ padding: 2px 14px 10px 14px;
1202
1312
  pointer-events: auto;
1203
1313
  border-radius: 9px;
1204
1314
  }
@@ -1242,10 +1352,42 @@ body.simplify .layer-control-btn {
1242
1352
  font-size: 13px;
1243
1353
  }
1244
1354
 
1355
+ /* "Add files" and "Draw: labels · points · ..." are two groups, and a narrow
1356
+ sidebar wraps between them, so the second line starts with "Draw:". The dot
1357
+ between them is each group's ::before, hung to the group's left: a group that
1358
+ starts a line has its dot pushed past the left edge of the row and clipped,
1359
+ so no line ends or begins with a stray dot. */
1245
1360
  .layer-add-links {
1246
1361
  margin: 2px 0 2px 0;
1247
1362
  font-size: 13px;
1248
1363
  line-height: 1.2;
1364
+ overflow: hidden;
1365
+ }
1366
+
1367
+ .layer-add-links-inner {
1368
+ display: flex;
1369
+ flex-wrap: wrap;
1370
+ margin-left: -1.6em;
1371
+ }
1372
+
1373
+ /* The padding holds the dot, so that a group long enough to wrap starts its
1374
+ later lines at the row's edge rather than under the clipped dot. */
1375
+ .layer-add-links-group {
1376
+ padding-left: 1.6em;
1377
+ }
1378
+
1379
+ .layer-add-links-group::before {
1380
+ content: "·";
1381
+ display: inline-block;
1382
+ width: 1.6em;
1383
+ margin-left: -1.6em;
1384
+ text-align: center;
1385
+ color: #777;
1386
+ font-weight: bold;
1387
+ }
1388
+
1389
+ .layer-add-links-group:first-child {
1390
+ white-space: nowrap;
1249
1391
  }
1250
1392
 
1251
1393
  .layer-menu-link {
@@ -1301,7 +1443,7 @@ body.simplify .layer-control-btn {
1301
1443
  .map-frame-empty {
1302
1444
  cursor: pointer;
1303
1445
  font-size: 12px;
1304
- padding: 7px 4px 4px;
1446
+ padding: 4px 0;
1305
1447
  }
1306
1448
 
1307
1449
  .pin-all img,
@@ -1401,12 +1543,47 @@ img.eye-btn {
1401
1543
  z-index: 1;
1402
1544
  }
1403
1545
 
1404
- .layer-item .row {
1546
+ /* Name and contents on one line. The contents column has a fixed width, so it
1547
+ lines up from row to row, and the name takes the rest, truncated if long. */
1548
+ .layer-item .layer-row {
1549
+ display: flex;
1550
+ align-items: baseline;
1551
+ gap: 12px;
1552
+ margin-right: 44px; /* room for row controls */
1405
1553
  line-height: 17px;
1406
- margin-bottom: 1px;
1407
1554
  white-space: nowrap;
1408
1555
  }
1409
1556
 
1557
+ .layer-item .layer-name-col {
1558
+ flex: 1 1 auto;
1559
+ min-width: 0;
1560
+ }
1561
+
1562
+ /* wraps a point layer that lists several kinds of feature */
1563
+ .layer-item .layer-contents {
1564
+ flex: none;
1565
+ width: 9em;
1566
+ white-space: normal;
1567
+ font-size: 12.5px;
1568
+ color: #666;
1569
+ }
1570
+
1571
+ /* bar on the left edge of the active layer; a shadow rather than a border, so
1572
+ the row's text keeps its alignment with the other rows */
1573
+ .layer-menu .layer-item.active {
1574
+ box-shadow: inset 5px 0 0 var(--theme-col);
1575
+ }
1576
+
1577
+ /* hints at a tooltip that counts the features with null geometry */
1578
+ .layer-item .layer-contents.has-nulls span {
1579
+ border-bottom: 1px dotted #999;
1580
+ }
1581
+
1582
+ /* a name being edited is shown in full, over the contents column */
1583
+ .layer-item:has(.layer-name.editing) .layer-contents {
1584
+ visibility: hidden;
1585
+ }
1586
+
1410
1587
  .layer-item .layer-name {
1411
1588
  display: inline-block;
1412
1589
  max-width: 100%;
@@ -1446,20 +1623,6 @@ img.eye-btn {
1446
1623
  background-color: #f7f7f7;
1447
1624
  }
1448
1625
 
1449
- .layer-item .row > div {
1450
- display: inline-block;
1451
- }
1452
-
1453
- .layer-item .col1 {
1454
- width: 84px;
1455
- }
1456
-
1457
- .layer-item .row1 .col2 {
1458
- margin-right: 44px; /* room for row controls */
1459
- max-width: calc(100% - 132px);
1460
- vertical-align: top;
1461
- }
1462
-
1463
1626
 
1464
1627
  .layer-item.drag-target:not(.active) {
1465
1628
  background-color: #f7f7f7;
@@ -2021,12 +2184,24 @@ div.basemap-style-btn.active {
2021
2184
  cursor: default;
2022
2185
  }
2023
2186
 
2024
- /* Over a label's knot or anchor handle, where a drag moves the handle rather
2025
- than placing a label or panning the map. */
2026
- .map-layers.label-handle {
2187
+ /* Over a selected label's text, where a drag moves the text (or the whole
2188
+ label) rather than placing a label or panning the map. */
2189
+ .map-layers.label-text-drag {
2027
2190
  cursor: move;
2028
2191
  }
2029
2192
 
2193
+ /* Over one of a selected label's control points -- a knot, its anchor, or a
2194
+ callout handle -- which a drag moves on its own. Not the text's cursor,
2195
+ because the two are often close together or on top of each other. */
2196
+ .map-layers.label-handle {
2197
+ cursor: pointer;
2198
+ }
2199
+
2200
+ /* Over a selected label's width handle, which only moves sideways. */
2201
+ .map-layers.label-resize {
2202
+ cursor: ew-resize;
2203
+ }
2204
+
2030
2205
  .map-layers.ruler-dragging {
2031
2206
  cursor: grabbing;
2032
2207
  }
@@ -2259,6 +2434,43 @@ body.pan.panning .map-layers:not(.drawing) {
2259
2434
  vector-effect: non-scaling-stroke;
2260
2435
  }
2261
2436
 
2437
+ /* A selected text block's column: the width handle's box, drawn fainter than
2438
+ the box around the text, which is the label itself. */
2439
+ .label-cue-column {
2440
+ fill: none;
2441
+ stroke: #3a7ddc;
2442
+ stroke-width: 1px;
2443
+ stroke-dasharray: 3 3;
2444
+ stroke-opacity: 0.6;
2445
+ vector-effect: non-scaling-stroke;
2446
+ }
2447
+
2448
+ /* A selected label's width and callout handles. The callout's end at the text
2449
+ is filled, so that the two ends of the line read differently. */
2450
+ .label-cue-handle {
2451
+ fill: #fff;
2452
+ stroke: #3a7ddc;
2453
+ stroke-width: 1.5px;
2454
+ vector-effect: non-scaling-stroke;
2455
+ }
2456
+
2457
+ .label-cue-attach {
2458
+ fill: #3a7ddc;
2459
+ stroke: #fff;
2460
+ stroke-width: 1px;
2461
+ }
2462
+
2463
+ /* The width being dragged out for a new text block: a line's height, dashed
2464
+ like the other things the tool draws that are not yet a label. */
2465
+ .label-block-guide {
2466
+ fill: none;
2467
+ stroke: #3a7ddc;
2468
+ stroke-width: 1px;
2469
+ stroke-dasharray: 3 2;
2470
+ vector-effect: non-scaling-stroke;
2471
+ pointer-events: none;
2472
+ }
2473
+
2262
2474
  /* The cue for a selection too large to outline label by label -- selecting a
2263
2475
  whole layer to restyle it. A halo in the selection's own blue, the same
2264
2476
  treatment the older styling mode uses in yellow: at that size the question
@@ -2311,6 +2523,18 @@ body.pan.panning .map-layers:not(.drawing) {
2311
2523
  vector-effect: non-scaling-stroke;
2312
2524
  }
2313
2525
 
2526
+ /* A text block's column, the width its text wraps to, behind the box around
2527
+ the text itself. Fainter and dashed, because it is a limit rather than the
2528
+ label: the box is what a callout meets. */
2529
+ .label-edit-column {
2530
+ fill: none;
2531
+ stroke: #cc6acc;
2532
+ stroke-width: 1px;
2533
+ stroke-dasharray: 3 3;
2534
+ stroke-opacity: 0.6;
2535
+ vector-effect: non-scaling-stroke;
2536
+ }
2537
+
2314
2538
  .label-edit-selection {
2315
2539
  fill: #cc6acc;
2316
2540
  fill-opacity: 0.3;
@@ -2441,8 +2665,8 @@ body.pan.panning .map-layers:not(.drawing) {
2441
2665
  pointer-events: none;
2442
2666
  background-color: rgba(255, 255, 255, 0.85);
2443
2667
  color: var(--colored-text);
2444
- font-size: 13px;
2445
- line-height: 13px;
2668
+ font-size: 12px;
2669
+ line-height: 12px;
2446
2670
  padding: 3px 6px 4px 6px;
2447
2671
  white-space: nowrap;
2448
2672
  }
@@ -2533,7 +2757,7 @@ body.pan.panning .map-layers:not(.drawing) {
2533
2757
  and the button beside them are all the same height. */
2534
2758
  --label-field-height: 22px;
2535
2759
  --label-field-radius: 4px;
2536
- --label-field-border: #bbb;
2760
+ --label-field-border: #c6c6c6;
2537
2761
  /* The narrow column of a split row, wide enough for the longest caption
2538
2762
  over it -- "Letter spacing", which measures 71px -- and the same in
2539
2763
  every row of every panel, so that the field edges line up down the
@@ -2588,12 +2812,12 @@ body.pan.panning .map-layers:not(.drawing) {
2588
2812
  width: 100%;
2589
2813
  }
2590
2814
 
2591
- /* Three columns on the appearance rows: the neatline's width sits with the
2592
- colour and opacity it applies to, and the background row leaves the last
2593
- column empty rather than pushing a lone field onto a line of its own. */
2815
+ /* The neatline's width sits beside the colour and opacity it applies to, and
2816
+ the background row leaves the column empty rather than pushing a lone field
2817
+ onto a line of its own. */
2594
2818
  .frame-properties-form .label-split-row {
2595
2819
  column-gap: 8px;
2596
- grid-template-columns: 1fr 54px 54px;
2820
+ grid-template-columns: 1fr 54px;
2597
2821
  }
2598
2822
 
2599
2823
  /* Wide enough for "Aspect ratio", and fixed rather than auto so that the ratio
@@ -2671,9 +2895,6 @@ body.pan.panning .map-layers:not(.drawing) {
2671
2895
  width: 130px;
2672
2896
  }
2673
2897
 
2674
- /* Stretches so that the margin field ends where the fields above it do: the
2675
- row is shorter than they are, and a ragged right edge reads as unfinished
2676
- rather than as deliberate grouping. */
2677
2898
  .frame-create-margin {
2678
2899
  align-items: center;
2679
2900
  display: flex;
@@ -2682,11 +2903,6 @@ body.pan.panning .map-layers:not(.drawing) {
2682
2903
  min-width: 0; /* a flex item defaults to min-width:auto and will not shrink below its field */
2683
2904
  }
2684
2905
 
2685
- .frame-create-margin > span {
2686
- color: #555;
2687
- font-size: 12px;
2688
- }
2689
-
2690
2906
  .frame-create-margin > input {
2691
2907
  box-sizing: border-box;
2692
2908
  flex: 1;
@@ -2723,6 +2939,7 @@ body.pan.panning .map-layers:not(.drawing) {
2723
2939
  grid-template-columns: 1fr 1fr 54px;
2724
2940
  }
2725
2941
 
2942
+ .frame-create-margin > span,
2726
2943
  .frame-input-cell > span {
2727
2944
  color: #555;
2728
2945
  font-size: 12px;
@@ -2777,7 +2994,8 @@ body.pan.panning .map-layers:not(.drawing) {
2777
2994
 
2778
2995
  .label-style-row {
2779
2996
  display: block;
2780
- margin-top: 7px;
2997
+ margin-top: 2px;
2998
+ margin-bottom: 5px;
2781
2999
  }
2782
3000
 
2783
3001
  .label-style-row span,
@@ -3018,8 +3236,9 @@ body.pan.panning .map-layers:not(.drawing) {
3018
3236
  different place.
3019
3237
 
3020
3238
  Bottom-aligned, so that a caption above one control cannot push it out of
3021
- line with the control beside it: the icon size has a "Size" over it and the
3022
- shape buttons beside it have nothing, and the two still have to be level. */
3239
+ line with the control beside it: the frame's neatline width has a "Width"
3240
+ over it and the colour beside it has a longer caption, and the two still
3241
+ have to be level. */
3023
3242
  .label-split-row {
3024
3243
  display: grid;
3025
3244
  grid-template-columns: 1fr var(--label-split-b-width);
@@ -3034,28 +3253,26 @@ body.pan.panning .map-layers:not(.drawing) {
3034
3253
  color: #555;
3035
3254
  }
3036
3255
 
3037
- /* Captions a couple of sizes down from the values they name. They are read
3038
- once, when the panel is first met, and the narrow column of a split row is
3039
- only as wide as the longest of them -- "Letter spacing" is what set it --
3040
- so quieter captions are also a narrower panel. Direct children only: the
3041
- colour picker's H/S/B captions are spans in a row too. */
3256
+ .label-editing-status,
3257
+ .label-style-panel .label-style-row.label-style-selection-row > span {
3258
+ font-size: 12px;
3259
+ color: #555;
3260
+ }
3261
+
3042
3262
  .label-style-panel .label-style-row > span,
3043
- .label-style-panel .label-style-selection-row > span,
3044
3263
  .label-style-panel .label-split-cell > span,
3045
3264
  .label-style-panel .label-style-row > .label-style-row-label,
3046
3265
  .label-style-panel .label-split-cell > .label-style-row-label,
3047
- .label-style-panel .label-icon-size-caption,
3266
+ .label-style-panel .frame-input-cell > span,
3048
3267
  .label-style-panel .point-style-note {
3049
- font-size: 12px;
3268
+ font-size: 11px;
3269
+ color: #555;
3050
3270
  }
3051
3271
 
3052
3272
  .label-split-row .label-split-cell + .label-split-cell {
3053
3273
  white-space: nowrap;
3054
3274
  }
3055
3275
 
3056
- /* Each column's control fills its column: the widths are the grid's to decide
3057
- now, and a control keeping a width of its own would sit inside its cell
3058
- rather than lining up with the one above it. */
3059
3276
  .label-split-cell > select,
3060
3277
  .label-split-cell > .size-field,
3061
3278
  .label-split-cell > input[type="text"] {
@@ -3129,7 +3346,7 @@ body.pan.panning .map-layers:not(.drawing) {
3129
3346
  /* Whitespace and a bold heading separate the sections; a rule as well would be
3130
3347
  a third answer to a question already settled twice. */
3131
3348
  .label-style-panel .label-style-section + .label-style-section {
3132
- margin-top: 12px;
3349
+ margin-top: 10px;
3133
3350
  padding-top: 0;
3134
3351
  border-top: 0;
3135
3352
  }
@@ -3148,18 +3365,17 @@ body.pan.panning .map-layers:not(.drawing) {
3148
3365
  align-self: center;
3149
3366
  }
3150
3367
 
3151
- /* .hidden is one class and the rule above is two, so a heading told to hide
3152
- would go on being laid out. The circle panel hides its Circles heading once
3153
- the points are circles: the panel's title says so, and the section is the
3154
- only thing left in it. */
3368
+ /* A section switched off shows only its heading (see setSectionCollapsed()). */
3369
+ .label-style-panel .label-style-section.collapsed > :not(.label-style-section-title) {
3370
+ display: none;
3371
+ }
3372
+
3155
3373
  .label-style-panel .label-style-section-title.hidden {
3156
3374
  display: none;
3157
3375
  }
3158
3376
 
3159
- /* 15.5px is what the dialogs subhead at (.info-box h4); the weight is the
3160
- sketch's, which wants these read as headings rather than as captions. */
3161
3377
  .label-style-panel .label-style-section-name {
3162
- font-size: 15.5px;
3378
+ font-size: 15px;
3163
3379
  color: #222;
3164
3380
  }
3165
3381
 
@@ -3181,20 +3397,15 @@ body.pan.panning .map-layers:not(.drawing) {
3181
3397
  overflow: hidden;
3182
3398
  }
3183
3399
 
3184
- /* Closer to the heading above it than a row usually is, because that heading
3185
- line carries this row's "Size" caption: the gap between a caption and the
3186
- field it names is 2px everywhere else in the panel. */
3187
- .text-style-panel .label-icon-shapes-row {
3188
- margin-top: 2px;
3189
- }
3190
-
3191
- /* Pushed to the right and given the width of a split row's narrow column, so
3192
- that it sits over the size field a row below it. */
3193
- .text-style-panel .label-icon-size-caption {
3194
- width: var(--label-split-b-width);
3195
- margin-left: auto;
3196
- font-weight: normal;
3197
- color: #555;
3400
+ /* Where text blocks are wrapped (gui-label-wrap.mjs), for the same reason. The
3401
+ wrapping <div> sets its own width, which the clipped box does not limit. */
3402
+ .label-wrap-measure {
3403
+ position: absolute;
3404
+ left: -10000px;
3405
+ top: -10000px;
3406
+ width: 1px;
3407
+ height: 1px;
3408
+ overflow: hidden;
3198
3409
  }
3199
3410
 
3200
3411
  /* Darker than the app's default placeholder. These fields show the value the
@@ -3240,9 +3451,6 @@ body.pan.panning .map-layers:not(.drawing) {
3240
3451
  background: #f0f0f0;
3241
3452
  }
3242
3453
 
3243
- /* A grey fill, not the inverse the panel's other buttons use: the glyph is
3244
- what identifies the choice, and reversing it out makes the selected shape
3245
- the hardest one to read. */
3246
3454
  .label-style-panel .label-btn-group .label-panel-btn.selected {
3247
3455
  background: #dcdcdc;
3248
3456
  color: black;
@@ -3254,6 +3462,7 @@ body.pan.panning .map-layers:not(.drawing) {
3254
3462
  on, some off -- is both halves at once with the knob over the join. */
3255
3463
  .label-toggle {
3256
3464
  position: relative;
3465
+ top: -1px;
3257
3466
  flex: none;
3258
3467
  width: 26px;
3259
3468
  height: 15px;
@@ -3300,7 +3509,7 @@ body.pan.panning .map-layers:not(.drawing) {
3300
3509
  }
3301
3510
 
3302
3511
  .label-style-section-title {
3303
- margin-top: 11px;
3512
+ margin-top: 8px;
3304
3513
  font-weight: 600;
3305
3514
  color: #333;
3306
3515
  }
@@ -3309,9 +3518,6 @@ body.pan.panning .map-layers:not(.drawing) {
3309
3518
  margin-top: 0;
3310
3519
  }
3311
3520
 
3312
- /* The cell a colour field sits in, which is also what its picker hangs from:
3313
- the picker is wider than the panel, so it opens over the map, and anchoring
3314
- it to the cell keeps it on the same side of the panel as its field. */
3315
3521
  .label-color-row {
3316
3522
  position: relative;
3317
3523
  }
@@ -3334,10 +3540,6 @@ body.pan.panning .map-layers:not(.drawing) {
3334
3540
  opacity: 0.45;
3335
3541
  }
3336
3542
 
3337
- /* A button with a word on it: Clear style, Random fills, Create. The same
3338
- shape as Save current in the saved styles row, which is the same kind of
3339
- thing -- a named action, as wide as its name -- and the same height as the
3340
- fields above it. */
3341
3543
  .label-panel-action-btn {
3342
3544
  box-sizing: border-box;
3343
3545
  display: inline-flex;
@@ -3347,6 +3549,7 @@ body.pan.panning .map-layers:not(.drawing) {
3347
3549
  border: 1px solid var(--label-field-border);
3348
3550
  border-radius: var(--label-field-radius);
3349
3551
  background-color: white;
3552
+ font-size: 12px;
3350
3553
  color: var(--normal-text);
3351
3554
  cursor: pointer;
3352
3555
  user-select: none;
@@ -3368,9 +3571,6 @@ body.pan.panning .map-layers:not(.drawing) {
3368
3571
  gap: 4px 6px;
3369
3572
  }
3370
3573
 
3371
- /* A swatch and its hex value inside one border: the pair is one answer to one
3372
- question, and a separate button beside a text box reads as two. The swatch
3373
- keeps its own outline so that white does not disappear into the field. */
3374
3574
  .label-style-panel .label-color-field {
3375
3575
  display: flex;
3376
3576
  align-items: center;
@@ -3391,8 +3591,8 @@ body.pan.panning .map-layers:not(.drawing) {
3391
3591
  width: 13px;
3392
3592
  height: 13px;
3393
3593
  margin-right: 6px;
3394
- border: 1px solid #bbb;
3395
- border-radius: 2px;
3594
+ border: 1px solid rgba(0,0,0,0.22);
3595
+ /* border-radius: 2px; */
3396
3596
  }
3397
3597
 
3398
3598
  /* A swatch for a selection whose colours disagree: split rather than empty,
@@ -3424,6 +3624,23 @@ body.pan.panning .map-layers:not(.drawing) {
3424
3624
  opacity: 0.45;
3425
3625
  }
3426
3626
 
3627
+ /* The opacity at the end of a colour field, behind a divider the height of the
3628
+ field. Wide enough for "100%" and for "mixed", and no wider: the hex value
3629
+ beside it gets the rest. Selectors as specific as the colour field's input
3630
+ rules above, which would otherwise stretch it and take its divider away. */
3631
+ .label-style-panel .label-color-field input.label-opacity-input,
3632
+ .label-style-panel .label-color-field input.label-opacity-input:focus {
3633
+ flex: none;
3634
+ align-self: stretch;
3635
+ width: 44px;
3636
+ height: auto;
3637
+ margin: 0 -3px 0 4px;
3638
+ padding: 0 4px 0 6px;
3639
+ border: none;
3640
+ border-left: 1px solid var(--label-field-border);
3641
+ border-radius: 0;
3642
+ }
3643
+
3427
3644
  .label-color-row .label-color-picker input[type="text"] {
3428
3645
  width: 45px;
3429
3646
  }
@@ -3433,10 +3650,6 @@ body.pan.panning .map-layers:not(.drawing) {
3433
3650
  box-sizing: border-box;
3434
3651
  }
3435
3652
 
3436
- /* What a section of this panel says when there is nothing in it to set: the
3437
- layer is drawn some way this panel cannot edit, or the thing the section is
3438
- for has to be made in the console. Set like a caption, not like a field's
3439
- value. */
3440
3653
  .point-style-note {
3441
3654
  color: #555;
3442
3655
  line-height: 1.3;
@@ -3586,10 +3799,6 @@ body.dragging-color-picker * {
3586
3799
  display: none;
3587
3800
  }
3588
3801
 
3589
- .label-editing-status {
3590
- color: #555;
3591
- }
3592
-
3593
3802
  .label-style-selection-row .label-editing-clear {
3594
3803
  margin-left: 8px;
3595
3804
  color: var(--colored-text);
@@ -3620,7 +3829,7 @@ body.dragging-color-picker * {
3620
3829
  .text-style-panel .label-position-grid {
3621
3830
  grid-template-columns: repeat(3, 10px);
3622
3831
  gap: 3px;
3623
- margin-top: -13px;
3832
+ margin-top: -15px;
3624
3833
  margin-bottom: 3px;
3625
3834
  }
3626
3835
 
@@ -3701,12 +3910,30 @@ body.dragging-color-picker * {
3701
3910
  transform: scale(1.4);
3702
3911
  }
3703
3912
 
3704
- .label-align-buttons .label-panel-btn {
3913
+ .label-align-buttons .label-panel-btn,
3914
+ .label-callout-buttons .label-panel-btn {
3705
3915
  display: flex;
3706
3916
  align-items: center;
3707
3917
  justify-content: center;
3708
3918
  }
3709
3919
 
3920
+ /* Lines like the alignment glyphs, with the arrowhead and the dot filled. */
3921
+ .label-callout-symbol {
3922
+ display: block;
3923
+ width: 16px;
3924
+ height: 16px;
3925
+ fill: none;
3926
+ stroke: currentColor;
3927
+ stroke-width: 1.4;
3928
+ stroke-linecap: round;
3929
+ stroke-linejoin: round;
3930
+ }
3931
+
3932
+ .label-callout-symbol .fill {
3933
+ fill: currentColor;
3934
+ stroke: none;
3935
+ }
3936
+
3710
3937
  /* Drawn larger than the icon symbols above, which share its viewBox but not
3711
3938
  its proportions: three rules across the middle are ink over less than half
3712
3939
  of the box, where a circle or a square fills most of its own, so at the same
@@ -3874,6 +4101,27 @@ body.dragging-color-picker * {
3874
4101
  top: 1px;
3875
4102
  }
3876
4103
 
4104
+ /* Active-layer name at the top of the arrow menu. inline-size containment
4105
+ keeps a long name from widening the menu: the heading takes the width set
4106
+ by the tool names and cuts the layer name short with an ellipsis. */
4107
+ .nav-menu-heading {
4108
+ contain: inline-size;
4109
+ overflow: hidden;
4110
+ text-overflow: ellipsis;
4111
+ white-space: nowrap;
4112
+ margin: 1px 10px 3px 10px;
4113
+ padding: 1px 0 3px 0;
4114
+ border-bottom: 1px solid #e4e4e4;
4115
+ color: #999;
4116
+ font-size: 11px;
4117
+ line-height: 12px;
4118
+ }
4119
+
4120
+ .nav-menu-divider {
4121
+ margin: 4px 10px;
4122
+ border-top: 1px solid #e4e4e4;
4123
+ }
4124
+
3877
4125
  .save-menu {
3878
4126
  text-align: right;
3879
4127
  padding-bottom: 5px;