@rse/specbook 1.2.4 → 1.2.6
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 +21 -3
- package/dst/specbook-cmd-lint.js +25 -1
- package/dst/specbook-config.js +18 -17
- package/dst/specbook-coverage.d.ts +17 -0
- package/dst/specbook-coverage.js +106 -0
- package/dst/specbook-diagram.js +163 -21
- package/dst/specbook-export-ast.js +11 -1
- package/dst/specbook-export-html.css +236 -5
- package/dst/specbook-export-html.js +312 -7
- package/dst/specbook-export-pdf.js +30 -6
- package/dst/specbook-format-schema.d.ts +12 -0
- package/dst/specbook-format-schema.js +13 -1
- package/dst/specbook-format.md +110 -10
- package/dst/specbook-format.yaml +354 -173
- package/dst/specbook-parse-semantic.js +6 -42
- package/dst/specbook-parse.d.ts +1 -1
- package/dst/specbook-parse.js +1 -1
- package/package.json +5 -5
|
@@ -96,6 +96,9 @@ html.theme-light {
|
|
|
96
96
|
--gradia-color-group-name: var(--theme-color-accent-18);
|
|
97
97
|
--gradia-color-group-box: var(--theme-color-accent-32);
|
|
98
98
|
--gradia-color-group-border: var(--theme-color-accent-26);
|
|
99
|
+
--gradia-color-container-name: var(--theme-color-base-12);
|
|
100
|
+
--gradia-color-container-box: var(--theme-color-base-31);
|
|
101
|
+
--gradia-color-container-border: var(--theme-color-base-24);
|
|
99
102
|
--gradia-color-edge-line: var(--theme-color-base-22);
|
|
100
103
|
--gradia-color-edge-name: var(--theme-color-base-5);
|
|
101
104
|
--gradia-color-edge-arity: var(--theme-color-base-5);
|
|
@@ -138,6 +141,9 @@ html.theme-light {
|
|
|
138
141
|
--gradia-color-group-name: var(--theme-color-accent-15);
|
|
139
142
|
--gradia-color-group-box: var(--theme-color-accent-1);
|
|
140
143
|
--gradia-color-group-border: var(--theme-color-accent-7);
|
|
144
|
+
--gradia-color-container-name: var(--theme-color-base-24);
|
|
145
|
+
--gradia-color-container-box: var(--theme-color-base-4);
|
|
146
|
+
--gradia-color-container-border: var(--theme-color-base-16);
|
|
141
147
|
--gradia-color-edge-line: var(--theme-color-base-20);
|
|
142
148
|
--gradia-color-edge-name: var(--theme-color-base-29);
|
|
143
149
|
--gradia-color-edge-arity: var(--theme-color-base-29);
|
|
@@ -395,6 +401,179 @@ div.info-popup.spec a.link-compact::before {
|
|
|
395
401
|
display: none;
|
|
396
402
|
}
|
|
397
403
|
}
|
|
404
|
+
/* the folding tab (screen-only): the tab riding right of the brand
|
|
405
|
+
bar between the search tab and the table of contents tab (as wide
|
|
406
|
+
as those, fixed independent of the content scrolling), showing a
|
|
407
|
+
fold icon (drawn like the search icon), which slides the two
|
|
408
|
+
controls out to the right (and back in), where the tab follows the
|
|
409
|
+
bar when the table of contents panel shifts it aside; the controls
|
|
410
|
+
fold and unfold all diagrams and all over-long cell texts of the
|
|
411
|
+
content at once and carry, like the fold icon itself, the mark
|
|
412
|
+
colors in a rounded box while anything of their kind is folded */
|
|
413
|
+
div.fold-switch {
|
|
414
|
+
position: fixed;
|
|
415
|
+
top: 10.66rem;
|
|
416
|
+
left: calc(0.6rem - 1px);
|
|
417
|
+
z-index: 30;
|
|
418
|
+
display: flex;
|
|
419
|
+
align-items: center;
|
|
420
|
+
border-radius: 0 0.3rem 0.3rem 0;
|
|
421
|
+
color: var(--theme-color-specbook-background);
|
|
422
|
+
background-color: var(--theme-color-specbook-accent);
|
|
423
|
+
transition: left 0.3s ease;
|
|
424
|
+
}
|
|
425
|
+
body:has(nav.toc-panel.open) div.fold-switch {
|
|
426
|
+
left: calc(31rem - 1px);
|
|
427
|
+
box-shadow: 0.2rem 0 0.6rem rgba(0,0,0,0.3);
|
|
428
|
+
}
|
|
429
|
+
div.fold-switch div.fold-toggle {
|
|
430
|
+
padding: 0.65rem 0.1rem;
|
|
431
|
+
line-height: 0;
|
|
432
|
+
border-radius: 0 0.3rem 0.3rem 0;
|
|
433
|
+
cursor: pointer;
|
|
434
|
+
}
|
|
435
|
+
div.fold-switch div.fold-toggle:hover {
|
|
436
|
+
background-color: var(--theme-color-specbook-accent-soft);
|
|
437
|
+
}
|
|
438
|
+
div.fold-switch svg.fold-icon {
|
|
439
|
+
width: 1.1rem;
|
|
440
|
+
height: 1.1rem;
|
|
441
|
+
padding: 0.25rem;
|
|
442
|
+
border-radius: 0.3rem;
|
|
443
|
+
margin-right: 0.15rem;
|
|
444
|
+
}
|
|
445
|
+
div.fold-switch.folded svg.fold-icon {
|
|
446
|
+
color: var(--theme-color-specbook-mark-text);
|
|
447
|
+
background-color: var(--theme-color-specbook-mark-back);
|
|
448
|
+
}
|
|
449
|
+
div.fold-switch div.fold-controls {
|
|
450
|
+
display: flex;
|
|
451
|
+
align-items: center;
|
|
452
|
+
gap: 0.3rem;
|
|
453
|
+
overflow: hidden;
|
|
454
|
+
max-width: 0;
|
|
455
|
+
padding: 0;
|
|
456
|
+
transition: max-width 0.3s ease, padding 0.3s ease;
|
|
457
|
+
}
|
|
458
|
+
div.fold-switch.open div.fold-controls {
|
|
459
|
+
max-width: 6rem;
|
|
460
|
+
padding: 0 0.5rem 0 0.2rem;
|
|
461
|
+
}
|
|
462
|
+
div.fold-switch div.fold-controls > div {
|
|
463
|
+
padding: 0.25rem;
|
|
464
|
+
line-height: 0;
|
|
465
|
+
border-radius: 0.3rem;
|
|
466
|
+
cursor: pointer;
|
|
467
|
+
-webkit-user-select: none;
|
|
468
|
+
user-select: none;
|
|
469
|
+
}
|
|
470
|
+
div.fold-switch div.fold-controls > div:hover {
|
|
471
|
+
background-color: var(--theme-color-specbook-accent-soft);
|
|
472
|
+
}
|
|
473
|
+
div.fold-switch div.fold-controls > div.folded {
|
|
474
|
+
color: var(--theme-color-specbook-mark-text);
|
|
475
|
+
background-color: var(--theme-color-specbook-mark-back);
|
|
476
|
+
}
|
|
477
|
+
div.fold-switch div.fold-controls svg {
|
|
478
|
+
width: 1.1rem;
|
|
479
|
+
height: 1.1rem;
|
|
480
|
+
}
|
|
481
|
+
@media print {
|
|
482
|
+
div.fold-switch {
|
|
483
|
+
display: none;
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
/* the folding of the diagrams and the over-long table cells
|
|
487
|
+
(screen-only): a diagram sits in a fold container carrying a chevron
|
|
488
|
+
mark in the muted symbol color of the anchors at its top left corner
|
|
489
|
+
-- in the page margin beside the content, and in a flex row left of
|
|
490
|
+
the diagram inside a table cell, where no margin is left -- while an
|
|
491
|
+
over-long cell carries its own chevron in a rounded grey box behind
|
|
492
|
+
the last still shown word; a folded diagram leaves the icon of its
|
|
493
|
+
tab control behind in the muted color, and a running search unfolds
|
|
494
|
+
everything, so no match hides inside */
|
|
495
|
+
div.fold {
|
|
496
|
+
position: relative;
|
|
497
|
+
}
|
|
498
|
+
span.fold-mark,
|
|
499
|
+
span.fold-more {
|
|
500
|
+
color: var(--theme-color-specbook-symbol);
|
|
501
|
+
line-height: 0;
|
|
502
|
+
cursor: pointer;
|
|
503
|
+
-webkit-user-select: none;
|
|
504
|
+
user-select: none;
|
|
505
|
+
}
|
|
506
|
+
span.fold-mark:hover,
|
|
507
|
+
span.fold-more:hover {
|
|
508
|
+
color: var(--theme-color-specbook-accent);
|
|
509
|
+
}
|
|
510
|
+
span.fold-mark {
|
|
511
|
+
position: absolute;
|
|
512
|
+
top: 0.35rem;
|
|
513
|
+
left: -1.15rem;
|
|
514
|
+
}
|
|
515
|
+
span.fold-more {
|
|
516
|
+
display: inline-block;
|
|
517
|
+
margin-left: 0.2rem;
|
|
518
|
+
padding: 0.1rem 0.25rem;
|
|
519
|
+
vertical-align: -0.05em;
|
|
520
|
+
border: 1px solid var(--theme-color-specbook-border);
|
|
521
|
+
border-radius: 0.25rem;
|
|
522
|
+
}
|
|
523
|
+
span.fold-more:hover {
|
|
524
|
+
border-color: var(--theme-color-specbook-accent);
|
|
525
|
+
}
|
|
526
|
+
span.fold-mark svg,
|
|
527
|
+
span.fold-more svg {
|
|
528
|
+
width: 0.8rem;
|
|
529
|
+
height: 0.8rem;
|
|
530
|
+
}
|
|
531
|
+
div.fold.folded > span.fold-mark svg,
|
|
532
|
+
td.folded span.fold-more svg {
|
|
533
|
+
transform: rotate(-90deg);
|
|
534
|
+
}
|
|
535
|
+
span.fold-label {
|
|
536
|
+
display: none;
|
|
537
|
+
line-height: 0;
|
|
538
|
+
margin-bottom: 1rem;
|
|
539
|
+
color: var(--theme-color-specbook-muted);
|
|
540
|
+
}
|
|
541
|
+
span.fold-label svg {
|
|
542
|
+
width: 1.1rem;
|
|
543
|
+
height: 1.1rem;
|
|
544
|
+
}
|
|
545
|
+
@media screen {
|
|
546
|
+
td div.fold {
|
|
547
|
+
display: flex;
|
|
548
|
+
align-items: flex-start;
|
|
549
|
+
}
|
|
550
|
+
td div.fold > span.fold-mark {
|
|
551
|
+
position: static;
|
|
552
|
+
flex: 0 0 auto;
|
|
553
|
+
margin: 0.3rem 0.3rem 0 0;
|
|
554
|
+
}
|
|
555
|
+
td div.fold > div.diagram {
|
|
556
|
+
flex: 1 1 auto;
|
|
557
|
+
min-width: 0;
|
|
558
|
+
}
|
|
559
|
+
body:not(.searching) div.fold.folded > span.fold-label {
|
|
560
|
+
display: block;
|
|
561
|
+
}
|
|
562
|
+
body:not(.searching) td div.fold.folded > span.fold-label {
|
|
563
|
+
display: block;
|
|
564
|
+
margin: 0.15rem 0 0 0;
|
|
565
|
+
}
|
|
566
|
+
body:not(.searching) div.fold.folded > div.diagram,
|
|
567
|
+
body:not(.searching) td.folded .fold-rest {
|
|
568
|
+
display: none;
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
@media print {
|
|
572
|
+
span.fold-mark,
|
|
573
|
+
span.fold-more {
|
|
574
|
+
display: none;
|
|
575
|
+
}
|
|
576
|
+
}
|
|
398
577
|
/* the connection status tab of the live preview (screen-only): the
|
|
399
578
|
bottommost tab riding right of the brand bar below the table of
|
|
400
579
|
contents tab (sized like the search tab, fixed independent of the
|
|
@@ -406,7 +585,7 @@ div.info-popup.spec a.link-compact::before {
|
|
|
406
585
|
for 2s (toggling every 250ms) after a content reload */
|
|
407
586
|
div.realtime-status {
|
|
408
587
|
position: fixed;
|
|
409
|
-
top:
|
|
588
|
+
top: 17.12rem;
|
|
410
589
|
left: calc(0.6rem - 2px);
|
|
411
590
|
z-index: 30;
|
|
412
591
|
padding: 0.65rem 0.1rem;
|
|
@@ -506,7 +685,7 @@ div.scroll-progress svg.scroll-icon {
|
|
|
506
685
|
left of the brand bar and to shift it aside when slid out, with its
|
|
507
686
|
tab (a menu icon drawn like the search icon, as none of the bundled
|
|
508
687
|
fonts carries the U+2630 glyph, and sized like the search tab)
|
|
509
|
-
riding right of the bar below the
|
|
688
|
+
riding right of the bar below the folding tab */
|
|
510
689
|
nav.toc-panel {
|
|
511
690
|
position: fixed;
|
|
512
691
|
top: 0;
|
|
@@ -536,7 +715,7 @@ nav.toc-panel.open div.toc-tab {
|
|
|
536
715
|
}
|
|
537
716
|
nav.toc-panel div.toc-tab {
|
|
538
717
|
position: absolute;
|
|
539
|
-
top:
|
|
718
|
+
top: 13.89rem;
|
|
540
719
|
left: calc(100% - 1px);
|
|
541
720
|
padding: 0.9rem 0.35rem;
|
|
542
721
|
line-height: 0;
|
|
@@ -930,6 +1109,58 @@ table.objects td section {
|
|
|
930
1109
|
table.objects td section h6 {
|
|
931
1110
|
margin: 0.5rem 0 0.25rem 0;
|
|
932
1111
|
}
|
|
1112
|
+
/* the reference coverage tables of the coverage-configured objects:
|
|
1113
|
+
the headers like the "Properties" and "Diagram" headers of the
|
|
1114
|
+
compact tables (as they name neither object kinds nor properties),
|
|
1115
|
+
the counts in narrow columns, the ratio as a bar in the accent
|
|
1116
|
+
color over the remaining width, followed by its percentage */
|
|
1117
|
+
table.coverage {
|
|
1118
|
+
border-collapse: collapse;
|
|
1119
|
+
margin: 1rem 0;
|
|
1120
|
+
width: 100%;
|
|
1121
|
+
}
|
|
1122
|
+
table.coverage th,
|
|
1123
|
+
table.coverage td {
|
|
1124
|
+
border: 0;
|
|
1125
|
+
border-left: 1px solid var(--theme-color-specbook-border);
|
|
1126
|
+
padding: 0.3rem 0.6rem;
|
|
1127
|
+
text-align: left;
|
|
1128
|
+
vertical-align: top;
|
|
1129
|
+
white-space: nowrap;
|
|
1130
|
+
}
|
|
1131
|
+
table.coverage th:first-child,
|
|
1132
|
+
table.coverage td:first-child {
|
|
1133
|
+
border-left: 0;
|
|
1134
|
+
}
|
|
1135
|
+
table.coverage td:first-child {
|
|
1136
|
+
font-weight: 600;
|
|
1137
|
+
}
|
|
1138
|
+
table.coverage th {
|
|
1139
|
+
background-color: var(--theme-color-specbook-tint);
|
|
1140
|
+
font-weight: normal;
|
|
1141
|
+
color: var(--theme-color-specbook-accent);
|
|
1142
|
+
}
|
|
1143
|
+
table.coverage tbody tr.even td {
|
|
1144
|
+
background-color: var(--theme-color-specbook-stripe);
|
|
1145
|
+
}
|
|
1146
|
+
table.coverage th.ratio,
|
|
1147
|
+
table.coverage td.ratio {
|
|
1148
|
+
width: 100%;
|
|
1149
|
+
}
|
|
1150
|
+
table.coverage span.bar {
|
|
1151
|
+
display: inline-block;
|
|
1152
|
+
vertical-align: middle;
|
|
1153
|
+
width: 12rem;
|
|
1154
|
+
height: 0.6rem;
|
|
1155
|
+
border-radius: 0.3rem;
|
|
1156
|
+
background-color: var(--theme-color-specbook-tint-deep);
|
|
1157
|
+
overflow: hidden;
|
|
1158
|
+
}
|
|
1159
|
+
table.coverage span.bar > span {
|
|
1160
|
+
display: block;
|
|
1161
|
+
height: 100%;
|
|
1162
|
+
background-color: var(--theme-color-specbook-accent);
|
|
1163
|
+
}
|
|
933
1164
|
/* the object descriptions and their embedded images */
|
|
934
1165
|
p.description,
|
|
935
1166
|
div.description {
|
|
@@ -1042,8 +1273,8 @@ div.titlepage table.meta td {
|
|
|
1042
1273
|
text-align: left;
|
|
1043
1274
|
}
|
|
1044
1275
|
/* the fuzzy search tab (screen-only): the middle tab riding right of
|
|
1045
|
-
the brand bar between the info tab and the
|
|
1046
|
-
|
|
1276
|
+
the brand bar between the info tab and the folding
|
|
1277
|
+
tab (as wide as those, fixed independent of the content
|
|
1047
1278
|
scrolling), showing the search icon, which slides the input field
|
|
1048
1279
|
and its clear symbol out to the right (and back in), where the tab
|
|
1049
1280
|
follows the bar when the table of contents panel shifts it aside
|