mapshaper 0.7.67 → 0.7.69

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,160 @@ 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.layer-tab {
999
+ padding-bottom: 6px;
1000
+ }
1001
+
1002
+ .sidebar-tab.console-tab {
1003
+ padding-top: 7px;
1004
+ }
1005
+
1006
+ .sidebar-tab:hover .sidebar-icon * {
1007
+ fill: #166689;
1008
+ }
1009
+
1010
+ /* Tooltip to the right of the button, matching the .nav-btn tooltips */
1011
+ .sidebar-tab[data-tooltip]:hover::after {
1012
+ content: attr(data-tooltip);
1013
+ position: absolute;
1014
+ top: 50%;
1015
+ left: calc(100% + 3px);
1016
+ transform: translateY(-50%);
1017
+ pointer-events: none;
1018
+ background-color: rgba(255, 255, 255, 0.85);
1019
+ color: var(--colored-text);
1020
+ font-size: 12px;
1021
+ line-height: 12px;
1022
+ padding: 3px 6px 4px 6px;
1023
+ white-space: nowrap;
1024
+ }
1025
+
1026
+ /* centre on the icon, which the console button's extra top padding lowers */
1027
+ .sidebar-tab.console-tab[data-tooltip]:hover::after {
1028
+ top: calc(50% + 2px);
1029
+ }
1030
+
1031
+ /* Panel toggles at the top of the open sidebar. Each toggles its own panel,
1032
+ so both can be on at once. */
1033
+ .sidebar-strip {
1034
+ display: none;
1035
+ position: absolute;
1036
+ top: 29px;
1037
+ left: 0;
1038
+ z-index: 30;
1039
+ width: var(--left-sidebar-width);
1040
+ max-width: 100%;
1041
+ height: var(--sidebar-strip-height);
1042
+ box-sizing: border-box;
1043
+ align-items: flex-start;
1044
+ gap: 6px;
1045
+ padding: 7px 10px 0 10px;
1046
+ background-color: white;
1047
+ border-right: 1px solid #c6c6c6;
1048
+ }
1049
+
1050
+ body.sidebar-open .sidebar-strip {
1051
+ display: flex;
1052
+ }
1053
+
1054
+ body.sidebar-open .sidebar-panels {
1055
+ margin-top: calc(29px + var(--sidebar-strip-height));
1056
+ }
1057
+
1058
+ .sidebar-strip-btn {
1059
+ display: flex;
1060
+ align-items: center;
1061
+ gap: 5px;
1062
+ padding: 2px 8px 2px 6px;
1063
+ border: 1px solid #cfdde4;
1064
+ border-radius: 12px;
1065
+ color: var(--theme-col);
974
1066
  font-size: 13px;
975
1067
  font-weight: 500;
1068
+ line-height: 14px;
976
1069
  cursor: pointer;
977
- pointer-events: auto;
1070
+ user-select: none;
978
1071
  }
979
1072
 
980
- .sidebar-tab:hover {
1073
+ .sidebar-strip-btn:hover {
1074
+ border-color: var(--theme-col);
1075
+ }
1076
+
1077
+ .sidebar-strip-btn.active {
1078
+ background-color: var(--theme-col);
1079
+ border-color: var(--theme-col);
1080
+ color: white;
1081
+ }
1082
+
1083
+ .sidebar-strip-btn.active:hover {
981
1084
  background-color: var(--dk-theme-col);
1085
+ border-color: var(--dk-theme-col);
982
1086
  }
983
1087
 
984
- body.layers-open .layer-tab,
985
- body.console-open .console-tab {
986
- background-color: black;
1088
+ .sidebar-strip-btn.active .sidebar-icon * {
1089
+ fill: white;
1090
+ }
1091
+
1092
+ /* matches the × of .label-style-close on the tool panels */
1093
+ .sidebar-hide-btn {
1094
+ margin-left: auto;
1095
+ padding: 3px 0 0 4px;
1096
+ font-size: 16px;
1097
+ line-height: 1;
1098
+ cursor: pointer;
1099
+ user-select: none;
1100
+ color: black;
987
1101
  }
988
1102
 
989
1103
 
@@ -1198,7 +1312,7 @@ body.simplify .layer-control-btn {
1198
1312
  max-height: 500px;
1199
1313
  overflow: hidden;
1200
1314
  overflow-y: auto;
1201
- padding: 9px 14px 10px 14px;
1315
+ padding: 2px 14px 10px 14px;
1202
1316
  pointer-events: auto;
1203
1317
  border-radius: 9px;
1204
1318
  }
@@ -1242,10 +1356,42 @@ body.simplify .layer-control-btn {
1242
1356
  font-size: 13px;
1243
1357
  }
1244
1358
 
1359
+ /* "Add files" and "Draw: labels · points · ..." are two groups, and a narrow
1360
+ sidebar wraps between them, so the second line starts with "Draw:". The dot
1361
+ between them is each group's ::before, hung to the group's left: a group that
1362
+ starts a line has its dot pushed past the left edge of the row and clipped,
1363
+ so no line ends or begins with a stray dot. */
1245
1364
  .layer-add-links {
1246
1365
  margin: 2px 0 2px 0;
1247
1366
  font-size: 13px;
1248
1367
  line-height: 1.2;
1368
+ overflow: hidden;
1369
+ }
1370
+
1371
+ .layer-add-links-inner {
1372
+ display: flex;
1373
+ flex-wrap: wrap;
1374
+ margin-left: -1.6em;
1375
+ }
1376
+
1377
+ /* The padding holds the dot, so that a group long enough to wrap starts its
1378
+ later lines at the row's edge rather than under the clipped dot. */
1379
+ .layer-add-links-group {
1380
+ padding-left: 1.6em;
1381
+ }
1382
+
1383
+ .layer-add-links-group::before {
1384
+ content: "·";
1385
+ display: inline-block;
1386
+ width: 1.6em;
1387
+ margin-left: -1.6em;
1388
+ text-align: center;
1389
+ color: #777;
1390
+ font-weight: bold;
1391
+ }
1392
+
1393
+ .layer-add-links-group:first-child {
1394
+ white-space: nowrap;
1249
1395
  }
1250
1396
 
1251
1397
  .layer-menu-link {
@@ -1301,7 +1447,7 @@ body.simplify .layer-control-btn {
1301
1447
  .map-frame-empty {
1302
1448
  cursor: pointer;
1303
1449
  font-size: 12px;
1304
- padding: 7px 4px 4px;
1450
+ padding: 4px 0;
1305
1451
  }
1306
1452
 
1307
1453
  .pin-all img,
@@ -1401,12 +1547,47 @@ img.eye-btn {
1401
1547
  z-index: 1;
1402
1548
  }
1403
1549
 
1404
- .layer-item .row {
1550
+ /* Name and contents on one line. The contents column has a fixed width, so it
1551
+ lines up from row to row, and the name takes the rest, truncated if long. */
1552
+ .layer-item .layer-row {
1553
+ display: flex;
1554
+ align-items: baseline;
1555
+ gap: 12px;
1556
+ margin-right: 44px; /* room for row controls */
1405
1557
  line-height: 17px;
1406
- margin-bottom: 1px;
1407
1558
  white-space: nowrap;
1408
1559
  }
1409
1560
 
1561
+ .layer-item .layer-name-col {
1562
+ flex: 1 1 auto;
1563
+ min-width: 0;
1564
+ }
1565
+
1566
+ /* wraps a point layer that lists several kinds of feature */
1567
+ .layer-item .layer-contents {
1568
+ flex: none;
1569
+ width: 9em;
1570
+ white-space: normal;
1571
+ font-size: 12.5px;
1572
+ color: #666;
1573
+ }
1574
+
1575
+ /* bar on the left edge of the active layer; a shadow rather than a border, so
1576
+ the row's text keeps its alignment with the other rows */
1577
+ .layer-menu .layer-item.active {
1578
+ box-shadow: inset 5px 0 0 var(--theme-col);
1579
+ }
1580
+
1581
+ /* hints at a tooltip that counts the features with null geometry */
1582
+ .layer-item .layer-contents.has-nulls span {
1583
+ border-bottom: 1px dotted #999;
1584
+ }
1585
+
1586
+ /* a name being edited is shown in full, over the contents column */
1587
+ .layer-item:has(.layer-name.editing) .layer-contents {
1588
+ visibility: hidden;
1589
+ }
1590
+
1410
1591
  .layer-item .layer-name {
1411
1592
  display: inline-block;
1412
1593
  max-width: 100%;
@@ -1446,20 +1627,6 @@ img.eye-btn {
1446
1627
  background-color: #f7f7f7;
1447
1628
  }
1448
1629
 
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
1630
 
1464
1631
  .layer-item.drag-target:not(.active) {
1465
1632
  background-color: #f7f7f7;
@@ -2451,7 +2618,7 @@ body.pan.panning .map-layers:not(.drawing) {
2451
2618
  }
2452
2619
 
2453
2620
  .pointer-btn .nav-sub-menu {
2454
- top: -3px;
2621
+ top: -2px;
2455
2622
  }
2456
2623
 
2457
2624
  .nav-btn.open .nav-sub-menu {
@@ -2649,12 +2816,12 @@ body.pan.panning .map-layers:not(.drawing) {
2649
2816
  width: 100%;
2650
2817
  }
2651
2818
 
2652
- /* Three columns on the appearance rows: the neatline's width sits with the
2653
- colour and opacity it applies to, and the background row leaves the last
2654
- column empty rather than pushing a lone field onto a line of its own. */
2819
+ /* The neatline's width sits beside the colour and opacity it applies to, and
2820
+ the background row leaves the column empty rather than pushing a lone field
2821
+ onto a line of its own. */
2655
2822
  .frame-properties-form .label-split-row {
2656
2823
  column-gap: 8px;
2657
- grid-template-columns: 1fr 54px 54px;
2824
+ grid-template-columns: 1fr 54px;
2658
2825
  }
2659
2826
 
2660
2827
  /* Wide enough for "Aspect ratio", and fixed rather than auto so that the ratio
@@ -2680,6 +2847,69 @@ body.pan.panning .map-layers:not(.drawing) {
2680
2847
  width: 264px;
2681
2848
  }
2682
2849
 
2850
+ .scalebar-properties-popup {
2851
+ width: 264px;
2852
+ }
2853
+
2854
+ .scalebar-properties-form.label-style-panel {
2855
+ background: transparent;
2856
+ border: 0;
2857
+ border-radius: 0;
2858
+ box-shadow: none;
2859
+ box-sizing: border-box;
2860
+ max-height: none;
2861
+ overflow: visible;
2862
+ padding: 0;
2863
+ position: static;
2864
+ width: 100%;
2865
+ }
2866
+
2867
+ .label-style-row.scalebar-row {
2868
+ align-items: end;
2869
+ display: grid;
2870
+ gap: 6px;
2871
+ }
2872
+
2873
+ .scalebar-two-col {
2874
+ grid-template-columns: 1fr 1fr;
2875
+ }
2876
+
2877
+ .scalebar-row select {
2878
+ box-sizing: border-box;
2879
+ min-width: 0;
2880
+ width: 100%;
2881
+ }
2882
+
2883
+ .scalebar-row > * {
2884
+ min-width: 0;
2885
+ }
2886
+
2887
+ /* The bottom padding puts the text on the baseline of the menu beside it.
2888
+ Baseline alignment doesn't: Chrome puts a select's baseline 2px above the
2889
+ text it shows. */
2890
+ .scalebar-checkbox {
2891
+ align-items: center;
2892
+ display: flex;
2893
+ padding-bottom: 2px;
2894
+ font-size: 12px;
2895
+ gap: 4px;
2896
+ white-space: nowrap;
2897
+ }
2898
+
2899
+ /* centered on the menu, which the text's baseline alignment leaves it below */
2900
+ .scalebar-checkbox input {
2901
+ margin: 0;
2902
+ position: relative;
2903
+ top: -2px;
2904
+ width: auto;
2905
+ }
2906
+
2907
+ .scalebar-properties-note {
2908
+ color: #a33;
2909
+ font-size: 12px;
2910
+ margin-bottom: 8px;
2911
+ }
2912
+
2683
2913
  /* The field tips are drawn above the "?" that opens them, which the box's own
2684
2914
  overflow would clip. The dialog is three rows and two buttons and never has
2685
2915
  anything to scroll. */
@@ -2732,9 +2962,6 @@ body.pan.panning .map-layers:not(.drawing) {
2732
2962
  width: 130px;
2733
2963
  }
2734
2964
 
2735
- /* Stretches so that the margin field ends where the fields above it do: the
2736
- row is shorter than they are, and a ragged right edge reads as unfinished
2737
- rather than as deliberate grouping. */
2738
2965
  .frame-create-margin {
2739
2966
  align-items: center;
2740
2967
  display: flex;
@@ -2743,11 +2970,6 @@ body.pan.panning .map-layers:not(.drawing) {
2743
2970
  min-width: 0; /* a flex item defaults to min-width:auto and will not shrink below its field */
2744
2971
  }
2745
2972
 
2746
- .frame-create-margin > span {
2747
- color: #555;
2748
- font-size: 12px;
2749
- }
2750
-
2751
2973
  .frame-create-margin > input {
2752
2974
  box-sizing: border-box;
2753
2975
  flex: 1;
@@ -2784,6 +3006,7 @@ body.pan.panning .map-layers:not(.drawing) {
2784
3006
  grid-template-columns: 1fr 1fr 54px;
2785
3007
  }
2786
3008
 
3009
+ .frame-create-margin > span,
2787
3010
  .frame-input-cell > span {
2788
3011
  color: #555;
2789
3012
  font-size: 12px;
@@ -3080,8 +3303,9 @@ body.pan.panning .map-layers:not(.drawing) {
3080
3303
  different place.
3081
3304
 
3082
3305
  Bottom-aligned, so that a caption above one control cannot push it out of
3083
- line with the control beside it: the icon size has a "Size" over it and the
3084
- shape buttons beside it have nothing, and the two still have to be level. */
3306
+ line with the control beside it: the frame's neatline width has a "Width"
3307
+ over it and the colour beside it has a longer caption, and the two still
3308
+ have to be level. */
3085
3309
  .label-split-row {
3086
3310
  display: grid;
3087
3311
  grid-template-columns: 1fr var(--label-split-b-width);
@@ -3096,28 +3320,57 @@ body.pan.panning .map-layers:not(.drawing) {
3096
3320
  color: #555;
3097
3321
  }
3098
3322
 
3099
- /* Captions a couple of sizes down from the values they name. They are read
3100
- once, when the panel is first met, and the narrow column of a split row is
3101
- only as wide as the longest of them -- "Letter spacing" is what set it --
3102
- so quieter captions are also a narrower panel. Direct children only: the
3103
- colour picker's H/S/B captions are spans in a row too. */
3323
+ .label-editing-status,
3324
+ .label-style-panel .label-style-row.label-style-selection-row > span {
3325
+ font-size: 12px;
3326
+ color: #555;
3327
+ }
3328
+
3104
3329
  .label-style-panel .label-style-row > span,
3105
- .label-style-panel .label-style-selection-row > span,
3106
3330
  .label-style-panel .label-split-cell > span,
3107
3331
  .label-style-panel .label-style-row > .label-style-row-label,
3108
3332
  .label-style-panel .label-split-cell > .label-style-row-label,
3109
- .label-style-panel .label-icon-size-caption,
3333
+ .label-style-panel .frame-input-cell > span,
3110
3334
  .label-style-panel .point-style-note {
3335
+ font-size: 11px;
3336
+ color: #555;
3337
+ }
3338
+
3339
+ /* A "?" just after its caption rather than floated to the far edge of the row,
3340
+ and in the caption's size, so it reads as part of the caption. */
3341
+ .label-style-panel .label-style-row-label > .tip-button {
3342
+ float: none;
3343
+ margin: 0 0 0 4px;
3111
3344
  font-size: 12px;
3345
+ font-weight: bold;
3346
+ }
3347
+
3348
+ /* The panel sits at the top of the map, where a bubble drawn above its "?"
3349
+ would go under the page header, so these open downward, tail pointing up. */
3350
+ .label-style-panel .label-style-row-label > .tip-button .tip-anchor {
3351
+ bottom: auto;
3352
+ top: 22px;
3353
+ }
3354
+
3355
+ .label-style-panel .label-style-row-label > .tip-button .tip:after,
3356
+ .label-style-panel .label-style-row-label > .tip-button .tip:before {
3357
+ top: auto;
3358
+ bottom: 100%;
3359
+ border-top-color: transparent;
3360
+ }
3361
+
3362
+ .label-style-panel .label-style-row-label > .tip-button .tip:after {
3363
+ border-bottom-color: #fff;
3364
+ }
3365
+
3366
+ .label-style-panel .label-style-row-label > .tip-button .tip:before {
3367
+ border-bottom-color: #999;
3112
3368
  }
3113
3369
 
3114
3370
  .label-split-row .label-split-cell + .label-split-cell {
3115
3371
  white-space: nowrap;
3116
3372
  }
3117
3373
 
3118
- /* Each column's control fills its column: the widths are the grid's to decide
3119
- now, and a control keeping a width of its own would sit inside its cell
3120
- rather than lining up with the one above it. */
3121
3374
  .label-split-cell > select,
3122
3375
  .label-split-cell > .size-field,
3123
3376
  .label-split-cell > input[type="text"] {
@@ -3191,7 +3444,7 @@ body.pan.panning .map-layers:not(.drawing) {
3191
3444
  /* Whitespace and a bold heading separate the sections; a rule as well would be
3192
3445
  a third answer to a question already settled twice. */
3193
3446
  .label-style-panel .label-style-section + .label-style-section {
3194
- margin-top: 12px;
3447
+ margin-top: 10px;
3195
3448
  padding-top: 0;
3196
3449
  border-top: 0;
3197
3450
  }
@@ -3210,25 +3463,17 @@ body.pan.panning .map-layers:not(.drawing) {
3210
3463
  align-self: center;
3211
3464
  }
3212
3465
 
3213
- /* A section switched off shows only its heading (see setSectionCollapsed()),
3214
- including the caption the Icon heading carries over its size column. */
3215
- .label-style-panel .label-style-section.collapsed > :not(.label-style-section-title),
3216
- .label-style-panel .label-style-section.collapsed .label-icon-size-caption {
3466
+ /* A section switched off shows only its heading (see setSectionCollapsed()). */
3467
+ .label-style-panel .label-style-section.collapsed > :not(.label-style-section-title) {
3217
3468
  display: none;
3218
3469
  }
3219
3470
 
3220
- /* .hidden is one class and the rule above is two, so a heading told to hide
3221
- would go on being laid out. The circle panel hides its Circles heading once
3222
- the points are circles: the panel's title says so, and the section is the
3223
- only thing left in it. */
3224
3471
  .label-style-panel .label-style-section-title.hidden {
3225
3472
  display: none;
3226
3473
  }
3227
3474
 
3228
- /* 15.5px is what the dialogs subhead at (.info-box h4); the weight is the
3229
- sketch's, which wants these read as headings rather than as captions. */
3230
3475
  .label-style-panel .label-style-section-name {
3231
- font-size: 15.5px;
3476
+ font-size: 15px;
3232
3477
  color: #222;
3233
3478
  }
3234
3479
 
@@ -3261,22 +3506,6 @@ body.pan.panning .map-layers:not(.drawing) {
3261
3506
  overflow: hidden;
3262
3507
  }
3263
3508
 
3264
- /* Closer to the heading above it than a row usually is, because that heading
3265
- line carries this row's "Size" caption: the gap between a caption and the
3266
- field it names is 2px everywhere else in the panel. */
3267
- .text-style-panel .label-icon-shapes-row {
3268
- margin-top: 2px;
3269
- }
3270
-
3271
- /* Pushed to the right and given the width of a split row's narrow column, so
3272
- that it sits over the size field a row below it. */
3273
- .text-style-panel .label-icon-size-caption {
3274
- width: var(--label-split-b-width);
3275
- margin-left: auto;
3276
- font-weight: normal;
3277
- color: #555;
3278
- }
3279
-
3280
3509
  /* Darker than the app's default placeholder. These fields show the value the
3281
3510
  renderer will use when the property is absent -- 0 and auto are true of the
3282
3511
  label, they are just not stored on it -- so at #aaa they read as a control
@@ -3320,9 +3549,6 @@ body.pan.panning .map-layers:not(.drawing) {
3320
3549
  background: #f0f0f0;
3321
3550
  }
3322
3551
 
3323
- /* A grey fill, not the inverse the panel's other buttons use: the glyph is
3324
- what identifies the choice, and reversing it out makes the selected shape
3325
- the hardest one to read. */
3326
3552
  .label-style-panel .label-btn-group .label-panel-btn.selected {
3327
3553
  background: #dcdcdc;
3328
3554
  color: black;
@@ -3390,9 +3616,6 @@ body.pan.panning .map-layers:not(.drawing) {
3390
3616
  margin-top: 0;
3391
3617
  }
3392
3618
 
3393
- /* The cell a colour field sits in, which is also what its picker hangs from:
3394
- the picker is wider than the panel, so it opens over the map, and anchoring
3395
- it to the cell keeps it on the same side of the panel as its field. */
3396
3619
  .label-color-row {
3397
3620
  position: relative;
3398
3621
  }
@@ -3415,10 +3638,6 @@ body.pan.panning .map-layers:not(.drawing) {
3415
3638
  opacity: 0.45;
3416
3639
  }
3417
3640
 
3418
- /* A button with a word on it: Clear style, Random fills, Create. The same
3419
- shape as Save current in the saved styles row, which is the same kind of
3420
- thing -- a named action, as wide as its name -- and the same height as the
3421
- fields above it. */
3422
3641
  .label-panel-action-btn {
3423
3642
  box-sizing: border-box;
3424
3643
  display: inline-flex;
@@ -3428,6 +3647,7 @@ body.pan.panning .map-layers:not(.drawing) {
3428
3647
  border: 1px solid var(--label-field-border);
3429
3648
  border-radius: var(--label-field-radius);
3430
3649
  background-color: white;
3650
+ font-size: 12px;
3431
3651
  color: var(--normal-text);
3432
3652
  cursor: pointer;
3433
3653
  user-select: none;
@@ -3449,9 +3669,6 @@ body.pan.panning .map-layers:not(.drawing) {
3449
3669
  gap: 4px 6px;
3450
3670
  }
3451
3671
 
3452
- /* A swatch and its hex value inside one border: the pair is one answer to one
3453
- question, and a separate button beside a text box reads as two. The swatch
3454
- keeps its own outline so that white does not disappear into the field. */
3455
3672
  .label-style-panel .label-color-field {
3456
3673
  display: flex;
3457
3674
  align-items: center;
@@ -3472,8 +3689,8 @@ body.pan.panning .map-layers:not(.drawing) {
3472
3689
  width: 13px;
3473
3690
  height: 13px;
3474
3691
  margin-right: 6px;
3475
- border: 1px solid #bbb;
3476
- border-radius: 2px;
3692
+ border: 1px solid rgba(0,0,0,0.22);
3693
+ /* border-radius: 2px; */
3477
3694
  }
3478
3695
 
3479
3696
  /* A swatch for a selection whose colours disagree: split rather than empty,
@@ -3505,6 +3722,23 @@ body.pan.panning .map-layers:not(.drawing) {
3505
3722
  opacity: 0.45;
3506
3723
  }
3507
3724
 
3725
+ /* The opacity at the end of a colour field, behind a divider the height of the
3726
+ field. Wide enough for "100%" and for "mixed", and no wider: the hex value
3727
+ beside it gets the rest. Selectors as specific as the colour field's input
3728
+ rules above, which would otherwise stretch it and take its divider away. */
3729
+ .label-style-panel .label-color-field input.label-opacity-input,
3730
+ .label-style-panel .label-color-field input.label-opacity-input:focus {
3731
+ flex: none;
3732
+ align-self: stretch;
3733
+ width: 44px;
3734
+ height: auto;
3735
+ margin: 0 -3px 0 4px;
3736
+ padding: 0 4px 0 6px;
3737
+ border: none;
3738
+ border-left: 1px solid var(--label-field-border);
3739
+ border-radius: 0;
3740
+ }
3741
+
3508
3742
  .label-color-row .label-color-picker input[type="text"] {
3509
3743
  width: 45px;
3510
3744
  }
@@ -3514,10 +3748,6 @@ body.pan.panning .map-layers:not(.drawing) {
3514
3748
  box-sizing: border-box;
3515
3749
  }
3516
3750
 
3517
- /* What a section of this panel says when there is nothing in it to set: the
3518
- layer is drawn some way this panel cannot edit, or the thing the section is
3519
- for has to be made in the console. Set like a caption, not like a field's
3520
- value. */
3521
3751
  .point-style-note {
3522
3752
  color: #555;
3523
3753
  line-height: 1.3;
@@ -3667,10 +3897,6 @@ body.dragging-color-picker * {
3667
3897
  display: none;
3668
3898
  }
3669
3899
 
3670
- .label-editing-status {
3671
- color: #555;
3672
- }
3673
-
3674
3900
  .label-style-selection-row .label-editing-clear {
3675
3901
  margin-left: 8px;
3676
3902
  color: var(--colored-text);
@@ -3701,7 +3927,7 @@ body.dragging-color-picker * {
3701
3927
  .text-style-panel .label-position-grid {
3702
3928
  grid-template-columns: repeat(3, 10px);
3703
3929
  gap: 3px;
3704
- margin-top: -13px;
3930
+ margin-top: -15px;
3705
3931
  margin-bottom: 3px;
3706
3932
  }
3707
3933
 
@@ -3973,6 +4199,27 @@ body.dragging-color-picker * {
3973
4199
  top: 1px;
3974
4200
  }
3975
4201
 
4202
+ /* Active-layer name at the top of the arrow menu. inline-size containment
4203
+ keeps a long name from widening the menu: the heading takes the width set
4204
+ by the tool names and cuts the layer name short with an ellipsis. */
4205
+ .nav-menu-heading {
4206
+ contain: inline-size;
4207
+ overflow: hidden;
4208
+ text-overflow: ellipsis;
4209
+ white-space: nowrap;
4210
+ margin: 1px 10px 3px 10px;
4211
+ padding: 1px 0 3px 0;
4212
+ border-bottom: 1px solid #e4e4e4;
4213
+ color: #999;
4214
+ font-size: 11px;
4215
+ line-height: 12px;
4216
+ }
4217
+
4218
+ .nav-menu-divider {
4219
+ margin: 4px 10px;
4220
+ border-top: 1px solid #e4e4e4;
4221
+ }
4222
+
3976
4223
  .save-menu {
3977
4224
  text-align: right;
3978
4225
  padding-bottom: 5px;
@@ -4347,7 +4594,7 @@ body.dragging-color-picker * {
4347
4594
 
4348
4595
  .simplify-control .handle {
4349
4596
  position: absolute;
4350
- top: -3px;
4597
+ top: -2px;
4351
4598
  }
4352
4599
 
4353
4600
  .simplify-control .handle img {