rcf-lite 0.32.5 → 0.33.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.
Files changed (88) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/fixtures/canary-manifest.json +9 -9
  3. package/guidance/discovery/discovery-viewer-command-page-1-layout.html +191 -0
  4. package/guidance/discovery/discovery-viewer-command-page-2-coverage.html +193 -0
  5. package/guidance/discovery/discovery-viewer-command-page-3-trace-matrix.html +195 -0
  6. package/guidance/discovery/discovery-viewer-command-page-4-tables.html +196 -0
  7. package/guidance/discovery/discovery-viewer-command-page-5-subtabs.html +224 -0
  8. package/guidance/discovery/discovery-viewer-command-page-6-one-page.html +280 -0
  9. package/guidance/discovery/discovery-viewer-command-page.md +301 -0
  10. package/package.json +1 -1
  11. package/rcf/adrs/adr-4139-readiness-tables-read-only-no-commands.json +30 -0
  12. package/rcf/adrs/adr-4140-view-query-routes-per-pivot-matrix-no-mermaid.json +30 -0
  13. package/rcf/adrs/adr-4141-verify-modes.json +25 -0
  14. package/rcf/code-nodes/cn-771.json +3 -2
  15. package/rcf/code-nodes/cn-779.json +19 -0
  16. package/rcf/code-nodes/cn-780.json +14 -0
  17. package/rcf/code-nodes/cn-781.json +14 -0
  18. package/rcf/code-nodes/cn-782.json +15 -0
  19. package/rcf/code-nodes/cn-783.json +17 -0
  20. package/rcf/code-nodes/cn-784.json +20 -0
  21. package/rcf/code-nodes/cn-785.json +14 -0
  22. package/rcf/code-nodes/cn-786.json +14 -0
  23. package/rcf/code-nodes/cn-787.json +18 -0
  24. package/rcf/code-nodes/cn-788.json +14 -0
  25. package/rcf/code-nodes/cn-789.json +14 -0
  26. package/rcf/code-nodes/cn-790.json +15 -0
  27. package/rcf/code-nodes/cn-791.json +14 -0
  28. package/rcf/code-nodes/cn-792.json +17 -0
  29. package/rcf/code-nodes/cn-793.json +17 -0
  30. package/rcf/code-nodes/cn-794.json +18 -0
  31. package/rcf/code-nodes/cn-795.json +15 -0
  32. package/rcf/code-nodes/cn-796.json +14 -0
  33. package/rcf/code-nodes/cn-797.json +14 -0
  34. package/rcf/code-nodes/cn-798.json +14 -0
  35. package/rcf/define/brief-ledger.json +47 -0
  36. package/rcf/define/decisions-ledger.json +113 -0
  37. package/rcf/fbs/fbs-204.json +46 -0
  38. package/rcf/fbs/fbs-205.json +46 -0
  39. package/rcf/fbs/fbs-206.json +49 -0
  40. package/rcf/fbs/fbs-207.json +43 -0
  41. package/rcf/fbs/fbs-208.json +47 -0
  42. package/rcf/fbs/fbs-209.json +22 -0
  43. package/rcf/requirements/req-002.json +5 -2
  44. package/rcf/requirements/req-180.json +6 -3
  45. package/rcf/tacs/tac-4127-readiness-view.json +2 -2
  46. package/rcf/tacs/tac-4133-readiness-po-layer.json +2 -2
  47. package/rcf/tacs/tac-4135-readiness-command-page.json +94 -0
  48. package/rcf/tacs/tac-4136-view-query-routes.json +68 -0
  49. package/rcf/tacs/tac-4141-verify-modes.json +25 -0
  50. package/rcf/test-suites/ts-223.json +7 -7
  51. package/rcf/test-suites/ts-237.json +78 -0
  52. package/rcf/test-suites/ts-238.json +70 -0
  53. package/rcf/test-suites/ts-239.json +78 -0
  54. package/rcf/test-suites/ts-240.json +70 -0
  55. package/rcf/test-suites/ts-241.json +70 -0
  56. package/rcf/test-suites/ts-242.json +46 -0
  57. package/rcf/user-stories/us-16503.json +51 -0
  58. package/rcf/user-stories/us-18001.json +4 -4
  59. package/rcf/user-stories/us-18003.json +79 -0
  60. package/rcf/user-stories/us-18004.json +70 -0
  61. package/rcf/user-stories/us-18005.json +79 -0
  62. package/rcf/user-stories/us-208.json +74 -0
  63. package/rcf/user-stories/us-209.json +70 -0
  64. package/releases/releases.yaml +10 -1
  65. package/src/cli/finalise.js +141 -2
  66. package/src/cli/view.js +13 -1
  67. package/src/finalise/spawn.js +2 -0
  68. package/src/server/index.js +104 -39
  69. package/src/server/routes.js +169 -0
  70. package/src/verify/cli/run.js +40 -0
  71. package/src/verify/engine/deterministic.js +150 -0
  72. package/src/verify/engine/index.js +27 -4
  73. package/src/view/doc-renderers/req.js +11 -9
  74. package/src/view/html-page.js +15 -11
  75. package/src/view/index.js +7 -1
  76. package/src/view/live-client.js +4 -0
  77. package/src/view/page-init.js +842 -1
  78. package/src/view/readiness/composite-id.js +35 -0
  79. package/src/view/readiness/coverage-summary.js +293 -0
  80. package/src/view/readiness/delta-counts.js +156 -0
  81. package/src/view/readiness/grid.js +175 -0
  82. package/src/view/readiness/po-layer.js +110 -220
  83. package/src/view/readiness/tables.js +500 -0
  84. package/src/view/readiness/thin-reqs.js +237 -0
  85. package/src/view/readiness/trace-matrix.js +392 -0
  86. package/src/view/readiness.js +359 -370
  87. package/src/view/style.css +594 -0
  88. package/src/watch/index.js +75 -17
@@ -2880,3 +2880,597 @@ html[data-rcf-lookup-open] { overflow: hidden; }
2880
2880
  outline: 2px solid var(--sv-focus);
2881
2881
  outline-offset: 1px;
2882
2882
  }
2883
+
2884
+ /* FBS-204 (ADR-4139): command-page tables for the Readiness tab.
2885
+ Two tables (questions, blocking) share the shape and tokens; the
2886
+ wrapper lets the register-ordered first paint control which comes
2887
+ first. All colors come from existing --sv-* tokens so the contrast
2888
+ audit (AC-207-1/2) stays green in both themes. No new tokens. */
2889
+ .rcf-cmd-tables {
2890
+ display: flex;
2891
+ flex-direction: column;
2892
+ gap: 1rem;
2893
+ }
2894
+ .rcf-cmd-table {
2895
+ border: 1px solid var(--sv-border);
2896
+ border-radius: 10px;
2897
+ background: var(--sv-surface);
2898
+ color: var(--sv-ink);
2899
+ padding: 0.9rem 1rem;
2900
+ }
2901
+ .rcf-cmd-table__head {
2902
+ display: flex;
2903
+ align-items: baseline;
2904
+ gap: 0.6rem;
2905
+ margin-bottom: 0.35rem;
2906
+ }
2907
+ .rcf-cmd-table__head h3 {
2908
+ margin: 0;
2909
+ font-size: 1.05rem;
2910
+ }
2911
+ .rcf-cmd-table__table {
2912
+ width: 100%;
2913
+ border-collapse: collapse;
2914
+ font-size: 0.9rem;
2915
+ margin-top: 0.35rem;
2916
+ }
2917
+ .rcf-cmd-table__table th,
2918
+ .rcf-cmd-table__table td {
2919
+ text-align: left;
2920
+ padding: 0.4rem 0.5rem;
2921
+ border-bottom: 1px solid var(--sv-border);
2922
+ vertical-align: top;
2923
+ }
2924
+ .rcf-cmd-table__table th {
2925
+ color: var(--sv-muted);
2926
+ font-weight: 700;
2927
+ font-size: 0.75rem;
2928
+ text-transform: uppercase;
2929
+ letter-spacing: 0.05em;
2930
+ }
2931
+ .rcf-cmd-table__table tr[hidden] {
2932
+ display: none;
2933
+ }
2934
+ .rcf-cmd-table__fragment {
2935
+ color: var(--sv-muted);
2936
+ font-family: var(--sv-mono);
2937
+ margin-left: 0.1rem;
2938
+ }
2939
+ .rcf-cmd-filterbar {
2940
+ display: flex;
2941
+ gap: 0.75rem;
2942
+ flex-wrap: wrap;
2943
+ margin: 0.4rem 0 0.2rem;
2944
+ }
2945
+ .rcf-cmd-filterbar__field {
2946
+ display: flex;
2947
+ flex-direction: column;
2948
+ font-size: 0.75rem;
2949
+ color: var(--sv-muted);
2950
+ gap: 0.15rem;
2951
+ }
2952
+ .rcf-cmd-filterbar__field select {
2953
+ color: var(--sv-ink);
2954
+ background: var(--sv-surface);
2955
+ border: 1px solid var(--sv-control);
2956
+ border-radius: 6px;
2957
+ padding: 0.2rem 0.4rem;
2958
+ font-size: 0.85rem;
2959
+ }
2960
+ .rcf-cmd-copy {
2961
+ background: var(--sv-surface);
2962
+ color: var(--sv-ink);
2963
+ border: 1px solid var(--sv-border);
2964
+ border-radius: 6px;
2965
+ padding: 0.2rem 0.55rem;
2966
+ font-size: 0.8rem;
2967
+ cursor: pointer;
2968
+ }
2969
+ .rcf-cmd-copy:hover,
2970
+ .rcf-cmd-copy:focus-visible {
2971
+ background: var(--sv-active);
2972
+ color: var(--sv-ink);
2973
+ border-color: var(--sv-control);
2974
+ }
2975
+ .rcf-cmd-copy:focus-visible { outline: 3px solid var(--sv-focus); outline-offset: 2px; }
2976
+ .rcf-sr-only {
2977
+ position: absolute;
2978
+ width: 1px;
2979
+ height: 1px;
2980
+ padding: 0;
2981
+ margin: -1px;
2982
+ overflow: hidden;
2983
+ clip: rect(0 0 0 0);
2984
+ white-space: nowrap;
2985
+ border: 0;
2986
+ }
2987
+ .rcf-readiness-freeze-state {
2988
+ border: 1px solid var(--sv-border);
2989
+ border-radius: 10px;
2990
+ background: var(--sv-surface);
2991
+ color: var(--sv-ink);
2992
+ padding: 0.9rem 1rem;
2993
+ margin-top: 0.5rem;
2994
+ }
2995
+ .rcf-readiness-freeze-state h3 {
2996
+ margin: 0 0 0.35rem;
2997
+ font-size: 1.05rem;
2998
+ }
2999
+ .rcf-readiness-freeze-state p {
3000
+ margin: 0;
3001
+ }
3002
+
3003
+ /* Stacked rows under 720px: each table row collapses to a labelled
3004
+ stack so the command page stays readable on phone widths (plan
3005
+ rule 2.4). The row still carries every cell; the th label is the
3006
+ data-rcf-col attribute on the td via a generated-content attr(). */
3007
+ @media (max-width: 720px) {
3008
+ .rcf-cmd-table__table thead { display: none; }
3009
+ .rcf-cmd-table__table,
3010
+ .rcf-cmd-table__table tbody,
3011
+ .rcf-cmd-table__table tr,
3012
+ .rcf-cmd-table__table td { display: block; width: 100%; }
3013
+ .rcf-cmd-table__table tr {
3014
+ border-bottom: 1px solid var(--sv-border);
3015
+ padding: 0.3rem 0;
3016
+ }
3017
+ .rcf-cmd-table__table td {
3018
+ border-bottom: 0;
3019
+ padding: 0.15rem 0.2rem;
3020
+ }
3021
+ .rcf-cmd-table__table td[data-rcf-col]:before {
3022
+ content: attr(data-rcf-col) ": ";
3023
+ color: var(--sv-muted);
3024
+ font-size: 0.7rem;
3025
+ text-transform: uppercase;
3026
+ letter-spacing: 0.05em;
3027
+ margin-right: 0.3rem;
3028
+ }
3029
+ }
3030
+
3031
+ /* FBS-205 (ADR-4139): coverage sub-view and the thin-requirements table.
3032
+ The sub-view reads totals + unresolvedTestPointers from
3033
+ `coverage.tree` and renders them as a stat line, one stacked bar and
3034
+ family tiles. The bar uses --sv-success, --sv-warning and --sv-danger
3035
+ over --sv-surface so the contrast audit (AC-207-1/2) stays green;
3036
+ no new tokens are introduced. */
3037
+ .rcf-cov-summary {
3038
+ margin-top: 1.25rem;
3039
+ background: var(--sv-surface);
3040
+ border: 1px solid var(--sv-border);
3041
+ border-radius: 10px;
3042
+ padding: 0.9rem 1rem;
3043
+ }
3044
+ .rcf-cov-summary__head { margin: 0 0 0.5rem; }
3045
+ .rcf-cov-summary__head h3 { margin: 0; font-size: 1.05rem; }
3046
+ .rcf-cov-summary__totals {
3047
+ display: flex;
3048
+ gap: 1rem;
3049
+ flex-wrap: wrap;
3050
+ margin: 0 0 0.5rem;
3051
+ color: var(--sv-ink);
3052
+ font-size: 0.95rem;
3053
+ }
3054
+ .rcf-cov-summary__totals--unavailable { color: var(--sv-muted); }
3055
+ .rcf-cov-summary__slot { white-space: nowrap; }
3056
+ .rcf-cov-summary__slot[data-rcf-slot="percentCovered"] {
3057
+ margin-left: auto;
3058
+ color: var(--sv-muted);
3059
+ }
3060
+ .rcf-cov-summary__bar {
3061
+ display: flex;
3062
+ width: 100%;
3063
+ height: 0.9rem;
3064
+ background: var(--sv-surface);
3065
+ border: 1px solid var(--sv-border);
3066
+ border-radius: 999px;
3067
+ overflow: hidden;
3068
+ margin: 0 0 0.6rem;
3069
+ }
3070
+ .rcf-cov-summary__bar[data-rcf-bar-empty="yes"] {
3071
+ background: var(--sv-raised);
3072
+ }
3073
+ .rcf-cov-summary__bar-seg { display: block; height: 100%; }
3074
+ .rcf-cov-summary__bar-seg--covered { background: var(--sv-success); }
3075
+ .rcf-cov-summary__bar-seg--unresolved { background: var(--sv-warning); }
3076
+ .rcf-cov-summary__bar-seg--uncovered { background: var(--sv-danger); }
3077
+ .rcf-cov-summary__tiles {
3078
+ list-style: none;
3079
+ padding: 0;
3080
+ margin: 0;
3081
+ display: grid;
3082
+ grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
3083
+ gap: 0.5rem;
3084
+ }
3085
+ .rcf-cov-summary__tile {
3086
+ background: var(--sv-raised);
3087
+ border: 1px solid var(--sv-border);
3088
+ border-radius: 8px;
3089
+ padding: 0.5rem 0.6rem;
3090
+ display: flex;
3091
+ flex-direction: column;
3092
+ gap: 0.1rem;
3093
+ }
3094
+ .rcf-cov-summary__tile[data-rcf-unavailable="yes"] { color: var(--sv-muted); }
3095
+ .rcf-cov-summary__tile-count {
3096
+ font-size: 1.2rem;
3097
+ font-weight: 700;
3098
+ color: var(--sv-ink);
3099
+ }
3100
+ .rcf-cov-summary__tile-label {
3101
+ font-size: 0.75rem;
3102
+ color: var(--sv-muted);
3103
+ text-transform: uppercase;
3104
+ letter-spacing: 0.04em;
3105
+ }
3106
+ .rcf-cov-summary__unresolved { margin-top: 0.8rem; }
3107
+ .rcf-cov-summary__unresolved h4 {
3108
+ margin: 0 0 0.3rem;
3109
+ font-size: 0.95rem;
3110
+ }
3111
+ .rcf-cov-summary__unresolved-table {
3112
+ width: 100%;
3113
+ border-collapse: collapse;
3114
+ font-size: 0.9rem;
3115
+ }
3116
+ .rcf-cov-summary__unresolved-table th,
3117
+ .rcf-cov-summary__unresolved-table td {
3118
+ text-align: left;
3119
+ padding: 0.4rem 0.5rem;
3120
+ border-bottom: 1px solid var(--sv-border);
3121
+ vertical-align: top;
3122
+ }
3123
+ .rcf-cov-summary__unresolved-table th {
3124
+ color: var(--sv-muted);
3125
+ font-weight: 700;
3126
+ font-size: 0.75rem;
3127
+ text-transform: uppercase;
3128
+ letter-spacing: 0.05em;
3129
+ }
3130
+
3131
+ .rcf-thin-reqs {
3132
+ margin-top: 1.25rem;
3133
+ background: var(--sv-surface);
3134
+ border: 1px solid var(--sv-border);
3135
+ border-radius: 10px;
3136
+ padding: 0.9rem 1rem;
3137
+ }
3138
+ .rcf-thin-reqs__head {
3139
+ display: flex;
3140
+ align-items: baseline;
3141
+ gap: 0.5rem;
3142
+ margin-bottom: 0.3rem;
3143
+ }
3144
+ .rcf-thin-reqs__head h3 { margin: 0; font-size: 1.05rem; }
3145
+ .rcf-thin-reqs__hint { margin: 0 0 0.4rem; }
3146
+ .rcf-thin-reqs__table {
3147
+ width: 100%;
3148
+ border-collapse: collapse;
3149
+ font-size: 0.9rem;
3150
+ margin-top: 0.3rem;
3151
+ }
3152
+ .rcf-thin-reqs__table th,
3153
+ .rcf-thin-reqs__table td {
3154
+ text-align: left;
3155
+ padding: 0.45rem 0.5rem;
3156
+ border-bottom: 1px solid var(--sv-border);
3157
+ vertical-align: top;
3158
+ }
3159
+ .rcf-thin-reqs__table th {
3160
+ color: var(--sv-muted);
3161
+ font-weight: 700;
3162
+ font-size: 0.75rem;
3163
+ text-transform: uppercase;
3164
+ letter-spacing: 0.05em;
3165
+ }
3166
+ .rcf-thin-reqs__id {
3167
+ color: var(--sv-link);
3168
+ font-family: var(--sv-mono);
3169
+ }
3170
+ .rcf-thin-reqs__trace { margin-left: 0.4rem; }
3171
+ .rcf-thin-reqs__empty {
3172
+ padding: 1rem;
3173
+ border: 1px dashed var(--sv-control);
3174
+ border-radius: 0.5rem;
3175
+ color: var(--sv-muted);
3176
+ text-align: center;
3177
+ margin: 0.3rem 0 0;
3178
+ }
3179
+
3180
+ .rcf-po-verdict__count-link {
3181
+ color: var(--sv-link);
3182
+ text-decoration: underline;
3183
+ }
3184
+ .rcf-po-verdict__count-link:hover,
3185
+ .rcf-po-verdict__count-link:focus { color: var(--sv-hover); }
3186
+ .rcf-po-verdict__next { margin: 0.3rem 0 0; color: var(--sv-ink); }
3187
+
3188
+ @media (max-width: 720px) {
3189
+ .rcf-cov-summary__totals { gap: 0.5rem; }
3190
+ .rcf-cov-summary__slot[data-rcf-slot="percentCovered"] { margin-left: 0; }
3191
+ .rcf-cov-summary__tiles { grid-template-columns: repeat(2, 1fr); }
3192
+ .rcf-cov-summary__unresolved-table thead { display: none; }
3193
+ .rcf-cov-summary__unresolved-table tr {
3194
+ display: block;
3195
+ border-bottom: 1px solid var(--sv-border);
3196
+ padding: 0.3rem 0;
3197
+ }
3198
+ .rcf-cov-summary__unresolved-table td { display: block; padding: 0.15rem 0; }
3199
+ .rcf-thin-reqs__table thead { display: none; }
3200
+ .rcf-thin-reqs__table tr {
3201
+ display: block;
3202
+ border-bottom: 1px solid var(--sv-border);
3203
+ padding: 0.3rem 0;
3204
+ }
3205
+ .rcf-thin-reqs__table td { display: block; padding: 0.15rem 0; }
3206
+ }
3207
+ [data-embed="1"] .rcf-cov-summary__tiles { grid-template-columns: repeat(2, 1fr); }
3208
+
3209
+ /* --------------------------------------------------------------------
3210
+ * Readiness SubTabStrip, stage grid, delta counts (FBS-206, TAC-4135)
3211
+ * -------------------------------------------------------------------- */
3212
+
3213
+ .rcf-readiness-panel { display: block; }
3214
+ .rcf-readiness-subpanel { display: block; margin-top: 0.6rem; }
3215
+ .rcf-readiness-subpanel[hidden] { display: none; }
3216
+
3217
+ .rcf-readiness-grid {
3218
+ margin: 1rem 0;
3219
+ }
3220
+ .rcf-readiness-grid__table {
3221
+ width: 100%;
3222
+ border-collapse: collapse;
3223
+ background: var(--sv-surface);
3224
+ border: 1px solid var(--sv-border);
3225
+ border-radius: 0.4rem;
3226
+ overflow: hidden;
3227
+ }
3228
+ .rcf-readiness-grid__table th,
3229
+ .rcf-readiness-grid__table td {
3230
+ padding: 0.4rem 0.7rem;
3231
+ text-align: left;
3232
+ border-bottom: 1px solid var(--sv-border);
3233
+ }
3234
+ .rcf-readiness-grid__table th { font-weight: 600; }
3235
+ .rcf-readiness-grid__table tr:last-child th,
3236
+ .rcf-readiness-grid__table tr:last-child td { border-bottom: none; }
3237
+ .rcf-readiness-grid__stage-id { font-weight: 600; }
3238
+ .rcf-readiness-grid__cell--passed { color: var(--sv-success); }
3239
+ .rcf-readiness-grid__cell--failing { color: var(--sv-danger); }
3240
+ .rcf-readiness-grid__cell--acknowledged { color: var(--sv-warning); }
3241
+ .rcf-readiness-grid__cell--notApplicable { color: var(--sv-muted); }
3242
+ .rcf-readiness-grid__counts { font-variant-numeric: tabular-nums; }
3243
+ .rcf-readiness-grid__failing {
3244
+ margin-left: 0.4rem;
3245
+ color: var(--sv-danger);
3246
+ text-decoration: underline;
3247
+ }
3248
+ .rcf-readiness-grid__failing:hover,
3249
+ .rcf-readiness-grid__failing:focus { color: var(--sv-hover); }
3250
+
3251
+ .rcf-readiness-delta-counts {
3252
+ margin: 1rem 0;
3253
+ }
3254
+ .rcf-readiness-delta-counts__tiles {
3255
+ display: grid;
3256
+ grid-template-columns: repeat(6, minmax(0, 1fr));
3257
+ gap: 0.5rem;
3258
+ margin: 0.4rem 0 0.6rem;
3259
+ }
3260
+ .rcf-readiness-delta-counts__tile {
3261
+ background: var(--sv-surface);
3262
+ border: 1px solid var(--sv-border);
3263
+ border-radius: 0.4rem;
3264
+ padding: 0.5rem 0.7rem;
3265
+ display: flex;
3266
+ flex-direction: column;
3267
+ align-items: start;
3268
+ min-width: 0;
3269
+ }
3270
+ .rcf-readiness-delta-counts__tile--empty { opacity: 0.6; }
3271
+ .rcf-readiness-delta-counts__n {
3272
+ font-size: 1.4rem;
3273
+ font-weight: 600;
3274
+ font-variant-numeric: tabular-nums;
3275
+ line-height: 1.1;
3276
+ }
3277
+ .rcf-readiness-delta-counts__label {
3278
+ font-size: 0.82rem;
3279
+ color: var(--sv-muted);
3280
+ margin-top: 0.15rem;
3281
+ }
3282
+ .rcf-readiness-delta-counts__details {
3283
+ margin-top: 0.3rem;
3284
+ border: 1px solid var(--sv-border);
3285
+ border-radius: 0.4rem;
3286
+ padding: 0.4rem 0.7rem;
3287
+ background: var(--sv-surface);
3288
+ }
3289
+ .rcf-readiness-delta-counts__details > summary {
3290
+ cursor: pointer;
3291
+ color: var(--sv-link);
3292
+ }
3293
+
3294
+ .rcf-readiness-freeze-state__gates {
3295
+ margin: 0.3rem 0 0;
3296
+ padding-left: 1.1rem;
3297
+ }
3298
+ .rcf-readiness-freeze-state__gates li { margin: 0.15rem 0; }
3299
+
3300
+ @media (max-width: 720px) {
3301
+ .rcf-readiness-delta-counts__tiles { grid-template-columns: repeat(2, minmax(0, 1fr)); }
3302
+ .rcf-readiness-grid__table thead { display: none; }
3303
+ .rcf-readiness-grid__table tr {
3304
+ display: block;
3305
+ border-bottom: 1px solid var(--sv-border);
3306
+ padding: 0.3rem 0;
3307
+ }
3308
+ .rcf-readiness-grid__table th[scope="row"],
3309
+ .rcf-readiness-grid__table td {
3310
+ display: block;
3311
+ padding: 0.15rem 0.7rem;
3312
+ }
3313
+ .rcf-readiness-grid__table td::before {
3314
+ content: attr(data-rcf-cell-scope) ": ";
3315
+ color: var(--sv-muted);
3316
+ margin-right: 0.3rem;
3317
+ text-transform: capitalize;
3318
+ }
3319
+ /* Keep the SubTabStrip inside the readiness panel at narrow widths
3320
+ * (AC-18005-7): a horizontal scroll on the strip only, not on the
3321
+ * page. The .rcf-subtabs block already wraps buttons; we add
3322
+ * overflow-x: auto so a long strip scrolls on its own. */
3323
+ #tab-readiness .rcf-subtabs {
3324
+ overflow-x: auto;
3325
+ flex-wrap: nowrap;
3326
+ white-space: nowrap;
3327
+ }
3328
+ }
3329
+
3330
+ [data-embed="1"] .rcf-readiness-delta-counts__tiles {
3331
+ grid-template-columns: repeat(2, minmax(0, 1fr));
3332
+ }
3333
+ [data-embed="1"] #tab-readiness .rcf-subtabs {
3334
+ overflow-x: auto;
3335
+ flex-wrap: nowrap;
3336
+ white-space: nowrap;
3337
+ }
3338
+ [data-embed="1"] .rcf-readiness-grid__table thead { display: none; }
3339
+ [data-embed="1"] .rcf-readiness-grid__table tr {
3340
+ display: block;
3341
+ border-bottom: 1px solid var(--sv-border);
3342
+ padding: 0.3rem 0;
3343
+ }
3344
+ [data-embed="1"] .rcf-readiness-grid__table th[scope="row"],
3345
+ [data-embed="1"] .rcf-readiness-grid__table td {
3346
+ display: block;
3347
+ padding: 0.15rem 0.7rem;
3348
+ }
3349
+ [data-embed="1"] .rcf-readiness-grid__table td::before {
3350
+ content: attr(data-rcf-cell-scope) ": ";
3351
+ color: var(--sv-muted);
3352
+ margin-right: 0.3rem;
3353
+ text-transform: capitalize;
3354
+ }
3355
+
3356
+ /* FBS-208 (AC-209-1..7): the Readiness Trace matrix. Cells use
3357
+ * existing --sv-* tokens only; no new palette entry is introduced. */
3358
+ .rcf-trace-matrix {
3359
+ margin: 0.8rem 0;
3360
+ }
3361
+ .rcf-trace-matrix__head {
3362
+ display: flex;
3363
+ align-items: baseline;
3364
+ gap: 0.5rem;
3365
+ margin-bottom: 0.4rem;
3366
+ }
3367
+ .rcf-trace-matrix__head h3 {
3368
+ margin: 0;
3369
+ }
3370
+ .rcf-trace-matrix__filter {
3371
+ margin-bottom: 0.5rem;
3372
+ }
3373
+ .rcf-trace-matrix__filter input {
3374
+ width: 100%;
3375
+ max-width: 24rem;
3376
+ padding: 0.25rem 0.4rem;
3377
+ background: var(--sv-surface);
3378
+ border: 1px solid var(--sv-control);
3379
+ border-radius: 4px;
3380
+ }
3381
+ .rcf-trace-matrix__table {
3382
+ width: 100%;
3383
+ border-collapse: collapse;
3384
+ background: var(--sv-surface);
3385
+ }
3386
+ .rcf-trace-matrix__table th,
3387
+ .rcf-trace-matrix__table td {
3388
+ border: 1px solid var(--sv-border);
3389
+ padding: 0.3rem 0.5rem;
3390
+ vertical-align: top;
3391
+ text-align: left;
3392
+ }
3393
+ .rcf-trace-matrix__table tr[data-rcf-row-kind="us"] th[scope="row"] {
3394
+ font-weight: 600;
3395
+ }
3396
+ .rcf-trace-matrix__table tr[data-rcf-row-kind="ac"] th[scope="row"] {
3397
+ padding-left: 1.4rem;
3398
+ }
3399
+ .rcf-trace-matrix__table td[data-rcf-cell-resolution="resolving"] {
3400
+ background: var(--sv-successbg);
3401
+ color: var(--sv-success);
3402
+ }
3403
+ .rcf-trace-matrix__table td[data-rcf-cell-resolution="unresolved"] {
3404
+ background: var(--sv-warningbg);
3405
+ color: var(--sv-warning);
3406
+ }
3407
+ .rcf-trace-matrix__table td[data-rcf-cell-resolution="none"] {
3408
+ color: var(--sv-muted);
3409
+ }
3410
+ .rcf-trace-matrix__cell-ids {
3411
+ font-variant-numeric: tabular-nums;
3412
+ }
3413
+ .rcf-trace-matrix__row-title {
3414
+ color: var(--sv-muted);
3415
+ font-weight: normal;
3416
+ }
3417
+ .rcf-trace-matrix__stale {
3418
+ color: var(--sv-warning);
3419
+ }
3420
+ .rcf-trace-matrix--empty {
3421
+ padding: 0.4rem 0;
3422
+ }
3423
+ .rcf-trace-matrix__lookup {
3424
+ background: var(--sv-surface);
3425
+ border: 1px solid var(--sv-border);
3426
+ border-radius: 4px;
3427
+ padding: 0.3rem 0.6rem;
3428
+ cursor: pointer;
3429
+ }
3430
+ .rcf-trace-action {
3431
+ color: var(--sv-link);
3432
+ }
3433
+ .rcf-trace-action--na {
3434
+ color: var(--sv-muted);
3435
+ cursor: default;
3436
+ }
3437
+
3438
+ @media (max-width: 720px) {
3439
+ .rcf-trace-matrix__table thead { display: none; }
3440
+ .rcf-trace-matrix__table tr {
3441
+ display: block;
3442
+ border-bottom: 1px solid var(--sv-border);
3443
+ padding: 0.3rem 0;
3444
+ }
3445
+ .rcf-trace-matrix__table th[scope="row"],
3446
+ .rcf-trace-matrix__table td {
3447
+ display: block;
3448
+ padding: 0.15rem 0.7rem;
3449
+ border: 0;
3450
+ }
3451
+ .rcf-trace-matrix__table td::before {
3452
+ content: attr(data-rcf-trace-col) ": ";
3453
+ color: var(--sv-muted);
3454
+ margin-right: 0.3rem;
3455
+ text-transform: capitalize;
3456
+ }
3457
+ }
3458
+
3459
+ [data-embed="1"] .rcf-trace-matrix__table thead { display: none; }
3460
+ [data-embed="1"] .rcf-trace-matrix__table tr {
3461
+ display: block;
3462
+ border-bottom: 1px solid var(--sv-border);
3463
+ padding: 0.3rem 0;
3464
+ }
3465
+ [data-embed="1"] .rcf-trace-matrix__table th[scope="row"],
3466
+ [data-embed="1"] .rcf-trace-matrix__table td {
3467
+ display: block;
3468
+ padding: 0.15rem 0.7rem;
3469
+ border: 0;
3470
+ }
3471
+ [data-embed="1"] .rcf-trace-matrix__table td::before {
3472
+ content: attr(data-rcf-trace-col) ": ";
3473
+ color: var(--sv-muted);
3474
+ margin-right: 0.3rem;
3475
+ text-transform: capitalize;
3476
+ }