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/mapshaper.js +1200 -462
- package/package.json +1 -1
- package/www/index.html +10 -3
- package/www/mapshaper-gui.js +1258 -369
- package/www/mapshaper.js +1200 -462
- package/www/page.css +360 -113
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:
|
|
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
|
-
|
|
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
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
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
|
-
|
|
1070
|
+
user-select: none;
|
|
978
1071
|
}
|
|
979
1072
|
|
|
980
|
-
.sidebar-
|
|
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
|
-
|
|
985
|
-
|
|
986
|
-
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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: -
|
|
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
|
-
/*
|
|
2653
|
-
|
|
2654
|
-
|
|
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
|
|
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
|
|
3084
|
-
|
|
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
|
-
|
|
3100
|
-
|
|
3101
|
-
|
|
3102
|
-
|
|
3103
|
-
|
|
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 .
|
|
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:
|
|
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
|
-
|
|
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:
|
|
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
|
|
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: -
|
|
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: -
|
|
4597
|
+
top: -2px;
|
|
4351
4598
|
}
|
|
4352
4599
|
|
|
4353
4600
|
.simplify-control .handle img {
|