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/bin/mapshaper-gui +3 -2
- package/mapshaper.js +1755 -433
- package/package.json +1 -1
- package/www/index.html +16 -3
- package/www/mapshaper-gui.js +2450 -447
- package/www/mapshaper.js +1755 -433
- package/www/page.css +363 -115
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:
|
|
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.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
|
-
|
|
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-
|
|
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
|
-
|
|
985
|
-
|
|
986
|
-
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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
|
|
2025
|
-
than placing a label or panning the map. */
|
|
2026
|
-
.map-layers.label-
|
|
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:
|
|
2445
|
-
line-height:
|
|
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: #
|
|
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
|
-
/*
|
|
2592
|
-
|
|
2593
|
-
|
|
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
|
|
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:
|
|
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
|
|
3022
|
-
|
|
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
|
-
|
|
3038
|
-
|
|
3039
|
-
|
|
3040
|
-
|
|
3041
|
-
|
|
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 .
|
|
3266
|
+
.label-style-panel .frame-input-cell > span,
|
|
3048
3267
|
.label-style-panel .point-style-note {
|
|
3049
|
-
font-size:
|
|
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:
|
|
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
|
-
/*
|
|
3152
|
-
|
|
3153
|
-
|
|
3154
|
-
|
|
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:
|
|
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
|
-
/*
|
|
3185
|
-
|
|
3186
|
-
|
|
3187
|
-
|
|
3188
|
-
|
|
3189
|
-
|
|
3190
|
-
|
|
3191
|
-
|
|
3192
|
-
|
|
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:
|
|
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
|
|
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: -
|
|
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;
|