thurview 0.5.1 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -20
- package/dist/cli.js +72 -4
- package/dist/cli.js.map +1 -1
- package/dist/document/compile.js +81 -1
- package/dist/document/compile.js.map +1 -1
- package/dist/document/schema.js +25 -0
- package/dist/document/schema.js.map +1 -1
- package/dist/interfaces.js +241 -0
- package/dist/interfaces.js.map +1 -0
- package/dist/ui/app.css +211 -5
- package/dist/ui/app.js +367 -143
- package/dist/ui/app.js.map +4 -4
- package/package.json +1 -1
- package/skills/thurview/SKILL.md +34 -9
- package/skills/thurview/references/components.md +34 -0
- package/skills/thurview/references/document-authoring.md +34 -1
- package/skills/thurview/references/software-map.md +71 -10
package/dist/ui/app.css
CHANGED
|
@@ -854,7 +854,48 @@ kbd {
|
|
|
854
854
|
font-size: 12.5px;
|
|
855
855
|
}
|
|
856
856
|
|
|
857
|
-
/* Map
|
|
857
|
+
/* Map. The tab opens with what it is for, because a reader who has to guess
|
|
858
|
+
reads it once and never returns. */
|
|
859
|
+
.map-intro {
|
|
860
|
+
max-width: 72ch;
|
|
861
|
+
margin-bottom: 18px;
|
|
862
|
+
}
|
|
863
|
+
.map-intro h2 {
|
|
864
|
+
font-family: var(--font-mono);
|
|
865
|
+
font-size: 15px;
|
|
866
|
+
margin: 0 0 5px;
|
|
867
|
+
}
|
|
868
|
+
.map-intro p {
|
|
869
|
+
margin: 0;
|
|
870
|
+
color: var(--fg2);
|
|
871
|
+
font-size: 13px;
|
|
872
|
+
line-height: 1.55;
|
|
873
|
+
}
|
|
874
|
+
.map-route {
|
|
875
|
+
display: flex;
|
|
876
|
+
flex-wrap: wrap;
|
|
877
|
+
align-items: center;
|
|
878
|
+
gap: 8px;
|
|
879
|
+
margin-top: 12px;
|
|
880
|
+
font-size: 12px;
|
|
881
|
+
}
|
|
882
|
+
.map-group {
|
|
883
|
+
margin-bottom: 22px;
|
|
884
|
+
}
|
|
885
|
+
.map-group h3,
|
|
886
|
+
.map-edges h3 {
|
|
887
|
+
font-family: var(--font-mono);
|
|
888
|
+
font-size: 11px;
|
|
889
|
+
font-weight: 700;
|
|
890
|
+
text-transform: uppercase;
|
|
891
|
+
letter-spacing: 0.08em;
|
|
892
|
+
color: var(--muted);
|
|
893
|
+
margin: 0 0 10px;
|
|
894
|
+
}
|
|
895
|
+
.map-note {
|
|
896
|
+
font-size: 12px;
|
|
897
|
+
margin-bottom: 10px;
|
|
898
|
+
}
|
|
858
899
|
.map-layout {
|
|
859
900
|
display: flex;
|
|
860
901
|
height: 100%;
|
|
@@ -929,22 +970,41 @@ kbd {
|
|
|
929
970
|
font-size: 12.5px;
|
|
930
971
|
color: var(--fg2);
|
|
931
972
|
}
|
|
932
|
-
.map-node .
|
|
973
|
+
.map-node .meta {
|
|
933
974
|
font-family: var(--font-mono);
|
|
934
975
|
font-size: 11px;
|
|
935
976
|
color: var(--muted);
|
|
936
|
-
margin-top:
|
|
977
|
+
margin-top: 10px;
|
|
978
|
+
display: flex;
|
|
979
|
+
flex-wrap: wrap;
|
|
980
|
+
align-items: center;
|
|
981
|
+
gap: 6px 10px;
|
|
982
|
+
}
|
|
983
|
+
.map-node .meta .warn-text {
|
|
984
|
+
color: var(--warn);
|
|
985
|
+
}
|
|
986
|
+
.map-node .meta button.drill {
|
|
987
|
+
padding: 3px 8px;
|
|
988
|
+
font-size: 11px;
|
|
937
989
|
}
|
|
938
990
|
.map-node.added {
|
|
939
991
|
border-color: var(--ok);
|
|
940
992
|
}
|
|
941
993
|
.map-node.removed {
|
|
942
994
|
border-color: var(--del);
|
|
943
|
-
opacity: 0.7;
|
|
944
995
|
}
|
|
945
996
|
.map-node.changed {
|
|
946
997
|
border-color: var(--warn);
|
|
947
998
|
}
|
|
999
|
+
/* Untouched parts stay on the board - they are the context that makes the
|
|
1000
|
+
change readable - but they must not compete with it for attention. */
|
|
1001
|
+
.map-node.quiet {
|
|
1002
|
+
opacity: 0.6;
|
|
1003
|
+
background: transparent;
|
|
1004
|
+
}
|
|
1005
|
+
.map-node.quiet:hover {
|
|
1006
|
+
opacity: 1;
|
|
1007
|
+
}
|
|
948
1008
|
.map-node .status {
|
|
949
1009
|
position: absolute;
|
|
950
1010
|
top: 8px;
|
|
@@ -955,17 +1015,43 @@ kbd {
|
|
|
955
1015
|
font-size: 13px;
|
|
956
1016
|
}
|
|
957
1017
|
.map-edges .edge {
|
|
958
|
-
padding: 5px 0;
|
|
1018
|
+
padding: 5px 0 5px 10px;
|
|
959
1019
|
border-top: 1px solid var(--line);
|
|
1020
|
+
border-left: 2px solid transparent;
|
|
960
1021
|
display: flex;
|
|
1022
|
+
flex-wrap: wrap;
|
|
961
1023
|
gap: 8px;
|
|
962
1024
|
font-family: var(--font-mono);
|
|
963
1025
|
font-size: 12px;
|
|
964
1026
|
}
|
|
1027
|
+
/* A link into a changed part is the seam a reviewer has to check; one between
|
|
1028
|
+
two untouched parts is only there to place it. */
|
|
1029
|
+
.map-edges .edge.hot {
|
|
1030
|
+
border-left-color: var(--warn);
|
|
1031
|
+
}
|
|
1032
|
+
.map-edges .edge:not(.hot) {
|
|
1033
|
+
opacity: 0.6;
|
|
1034
|
+
}
|
|
965
1035
|
.map-edges .edge b {
|
|
966
1036
|
cursor: pointer;
|
|
967
1037
|
color: var(--link);
|
|
968
1038
|
}
|
|
1039
|
+
.map-side .neighbours {
|
|
1040
|
+
font-size: 12px;
|
|
1041
|
+
}
|
|
1042
|
+
.map-side .neighbour {
|
|
1043
|
+
display: flex;
|
|
1044
|
+
flex-wrap: wrap;
|
|
1045
|
+
align-items: center;
|
|
1046
|
+
gap: 6px;
|
|
1047
|
+
padding: 4px 0;
|
|
1048
|
+
border-top: 1px solid var(--line);
|
|
1049
|
+
}
|
|
1050
|
+
.map-side .neighbour .nb {
|
|
1051
|
+
font-family: var(--font-mono);
|
|
1052
|
+
color: var(--link);
|
|
1053
|
+
cursor: pointer;
|
|
1054
|
+
}
|
|
969
1055
|
.map-side .file {
|
|
970
1056
|
font-family: var(--font-mono);
|
|
971
1057
|
font-size: 12px;
|
|
@@ -1341,6 +1427,118 @@ kbd {
|
|
|
1341
1427
|
font-family: var(--font-mono);
|
|
1342
1428
|
font-size: 13px;
|
|
1343
1429
|
}
|
|
1430
|
+
/* An empty state that explains itself runs to a paragraph, and a paragraph the
|
|
1431
|
+
width of the viewport is unreadable. */
|
|
1432
|
+
.empty-state p {
|
|
1433
|
+
max-width: 62ch;
|
|
1434
|
+
margin: 0 auto 8px;
|
|
1435
|
+
line-height: 1.6;
|
|
1436
|
+
}
|
|
1437
|
+
|
|
1438
|
+
/* ---- Interface delta ----
|
|
1439
|
+
Above the document, because "what does this let us do now" is the reader's
|
|
1440
|
+
first question and today they reconstruct it from the diff. Derived at
|
|
1441
|
+
publish, so the empty state carries as much weight as a removal: a refactor
|
|
1442
|
+
says so in the verdict line rather than showing an empty box. Removed rows
|
|
1443
|
+
read first and warmest, changed next, added last. */
|
|
1444
|
+
.ifd {
|
|
1445
|
+
max-width: 1200px;
|
|
1446
|
+
margin: 20px auto 0;
|
|
1447
|
+
padding: 0 24px;
|
|
1448
|
+
}
|
|
1449
|
+
.ifd .block-actions {
|
|
1450
|
+
position: static;
|
|
1451
|
+
opacity: 1;
|
|
1452
|
+
}
|
|
1453
|
+
.ifd-head {
|
|
1454
|
+
display: flex;
|
|
1455
|
+
align-items: center;
|
|
1456
|
+
gap: 8px;
|
|
1457
|
+
padding: 8px 12px;
|
|
1458
|
+
background: var(--bg2);
|
|
1459
|
+
border: 1px solid var(--line);
|
|
1460
|
+
border-radius: var(--radius) var(--radius) 0 0;
|
|
1461
|
+
font-size: 12px;
|
|
1462
|
+
}
|
|
1463
|
+
.ifd-head .t {
|
|
1464
|
+
font-family: var(--font-display);
|
|
1465
|
+
font-weight: 600;
|
|
1466
|
+
text-transform: var(--heading-transform);
|
|
1467
|
+
color: var(--fg);
|
|
1468
|
+
}
|
|
1469
|
+
.ifd-head .spacer {
|
|
1470
|
+
flex: 1;
|
|
1471
|
+
}
|
|
1472
|
+
.ifd-head .heading-toggle {
|
|
1473
|
+
margin-left: 0;
|
|
1474
|
+
}
|
|
1475
|
+
.ifd-body {
|
|
1476
|
+
border: 1px solid var(--line);
|
|
1477
|
+
border-top: 0;
|
|
1478
|
+
border-radius: 0 0 var(--radius) var(--radius);
|
|
1479
|
+
background: var(--bg-code);
|
|
1480
|
+
padding: 4px 0 8px;
|
|
1481
|
+
}
|
|
1482
|
+
.ifd-body > button {
|
|
1483
|
+
margin: 4px 12px;
|
|
1484
|
+
}
|
|
1485
|
+
.ifd-verdict {
|
|
1486
|
+
margin: 8px 12px;
|
|
1487
|
+
color: var(--fg2);
|
|
1488
|
+
font-size: 13px;
|
|
1489
|
+
}
|
|
1490
|
+
.ifd-entry {
|
|
1491
|
+
display: flex;
|
|
1492
|
+
align-items: baseline;
|
|
1493
|
+
gap: 10px;
|
|
1494
|
+
padding: 7px 12px;
|
|
1495
|
+
border-top: 1px solid var(--line2);
|
|
1496
|
+
cursor: pointer;
|
|
1497
|
+
}
|
|
1498
|
+
.ifd-entry:hover {
|
|
1499
|
+
background: var(--bg3);
|
|
1500
|
+
}
|
|
1501
|
+
.ifd-entry > .badge {
|
|
1502
|
+
flex: 0 0 auto;
|
|
1503
|
+
min-width: 66px;
|
|
1504
|
+
justify-content: center;
|
|
1505
|
+
}
|
|
1506
|
+
.ifd-removed {
|
|
1507
|
+
background: var(--del-bg);
|
|
1508
|
+
}
|
|
1509
|
+
.ifd-added {
|
|
1510
|
+
background: var(--add-bg);
|
|
1511
|
+
}
|
|
1512
|
+
.ifd-what {
|
|
1513
|
+
flex: 1;
|
|
1514
|
+
min-width: 0;
|
|
1515
|
+
}
|
|
1516
|
+
.ifd-name {
|
|
1517
|
+
font-family: var(--font-mono);
|
|
1518
|
+
font-size: 12.5px;
|
|
1519
|
+
color: var(--fg);
|
|
1520
|
+
overflow-wrap: anywhere;
|
|
1521
|
+
}
|
|
1522
|
+
.ifd-was {
|
|
1523
|
+
font-size: 12px;
|
|
1524
|
+
color: var(--muted);
|
|
1525
|
+
text-decoration: line-through;
|
|
1526
|
+
overflow-wrap: anywhere;
|
|
1527
|
+
}
|
|
1528
|
+
.ifd-cap {
|
|
1529
|
+
font-size: 12.5px;
|
|
1530
|
+
color: var(--fg2);
|
|
1531
|
+
margin-top: 3px;
|
|
1532
|
+
}
|
|
1533
|
+
.ifd-where {
|
|
1534
|
+
flex: 0 1 auto;
|
|
1535
|
+
min-width: 0;
|
|
1536
|
+
overflow: hidden;
|
|
1537
|
+
text-overflow: ellipsis;
|
|
1538
|
+
white-space: nowrap;
|
|
1539
|
+
font-size: 11.5px;
|
|
1540
|
+
color: var(--muted);
|
|
1541
|
+
}
|
|
1344
1542
|
|
|
1345
1543
|
/* ---- Small screens ----
|
|
1346
1544
|
One column below 900px: the table-of-contents rail, the split diff and the
|
|
@@ -1382,6 +1580,14 @@ kbd {
|
|
|
1382
1580
|
padding: 5px 7px;
|
|
1383
1581
|
}
|
|
1384
1582
|
|
|
1583
|
+
.ifd {
|
|
1584
|
+
padding: 0 14px;
|
|
1585
|
+
}
|
|
1586
|
+
/* the path is the first thing to go: the declaration is what the reader needs */
|
|
1587
|
+
.ifd-where {
|
|
1588
|
+
display: none;
|
|
1589
|
+
}
|
|
1590
|
+
|
|
1385
1591
|
/* The rail is dropped rather than squeezed; headings stay reachable by scrolling. */
|
|
1386
1592
|
.doc-layout {
|
|
1387
1593
|
grid-template-columns: minmax(0, 1fr);
|