calliope-ts 0.0.4 → 0.1.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 (183) hide show
  1. package/README.md +69 -3
  2. package/dist/calliope/bracketing.d.ts.map +1 -1
  3. package/dist/calliope/bracketing.js +59 -5
  4. package/dist/calliope/deps.d.ts +5 -1
  5. package/dist/calliope/deps.d.ts.map +1 -1
  6. package/dist/calliope/deps.js +53 -3
  7. package/dist/calliope/engine.d.ts.map +1 -1
  8. package/dist/calliope/engine.js +6 -1
  9. package/dist/calliope/relstress.d.ts.map +1 -1
  10. package/dist/calliope/relstress.js +411 -15
  11. package/dist/calliope/syntax.d.ts +33 -0
  12. package/dist/calliope/syntax.d.ts.map +1 -1
  13. package/dist/calliope/syntax.js +199 -0
  14. package/dist/data/en_common_words.json +1 -0
  15. package/dist/display.d.ts +15 -1
  16. package/dist/display.d.ts.map +1 -1
  17. package/dist/display.js +112 -10
  18. package/dist/fabbhalle.d.ts +54 -0
  19. package/dist/fabbhalle.d.ts.map +1 -0
  20. package/dist/fabbhalle.js +404 -0
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +86 -33
  23. package/dist/phonological.d.ts.map +1 -1
  24. package/dist/phonological.js +7 -1
  25. package/dist/rewriteEn.d.ts +14 -0
  26. package/dist/rewriteEn.d.ts.map +1 -0
  27. package/dist/rewriteEn.js +392 -0
  28. package/dist/rhyme.d.ts +35 -3
  29. package/dist/rhyme.d.ts.map +1 -1
  30. package/dist/rhyme.js +176 -11
  31. package/dist/russian/accentuator.d.ts +31 -0
  32. package/dist/russian/accentuator.d.ts.map +1 -0
  33. package/dist/russian/accentuator.js +546 -0
  34. package/dist/russian/collocations.d.ts +7 -0
  35. package/dist/russian/collocations.d.ts.map +1 -0
  36. package/dist/russian/collocations.js +38 -0
  37. package/dist/russian/compounds.d.ts +6 -0
  38. package/dist/russian/compounds.d.ts.map +1 -0
  39. package/dist/russian/compounds.js +81 -0
  40. package/dist/russian/download.d.ts +23 -0
  41. package/dist/russian/download.d.ts.map +1 -0
  42. package/dist/russian/download.js +117 -0
  43. package/dist/russian/engine.d.ts +6 -0
  44. package/dist/russian/engine.d.ts.map +1 -0
  45. package/dist/russian/engine.js +1424 -0
  46. package/dist/russian/parser.d.ts +8 -0
  47. package/dist/russian/parser.d.ts.map +1 -0
  48. package/dist/russian/parser.js +92 -0
  49. package/dist/russian/paths.d.ts +55 -0
  50. package/dist/russian/paths.d.ts.map +1 -0
  51. package/dist/russian/paths.js +114 -0
  52. package/dist/russian/rewrite.d.ts +6 -0
  53. package/dist/russian/rewrite.d.ts.map +1 -0
  54. package/dist/russian/rewrite.js +400 -0
  55. package/dist/russian/rhyme.d.ts +18 -0
  56. package/dist/russian/rhyme.d.ts.map +1 -0
  57. package/dist/russian/rhyme.js +230 -0
  58. package/dist/russian/syllabifier.d.ts +14 -0
  59. package/dist/russian/syllabifier.d.ts.map +1 -0
  60. package/dist/russian/syllabifier.js +475 -0
  61. package/dist/russian/types.d.ts +94 -0
  62. package/dist/russian/types.d.ts.map +1 -0
  63. package/dist/russian/types.js +27 -0
  64. package/dist/scandroidNative/constants.d.ts +16 -0
  65. package/dist/scandroidNative/constants.d.ts.map +1 -0
  66. package/dist/scandroidNative/constants.js +60 -0
  67. package/dist/scandroidNative/deduceParameters.d.ts +16 -0
  68. package/dist/scandroidNative/deduceParameters.d.ts.map +1 -0
  69. package/dist/scandroidNative/deduceParameters.js +69 -0
  70. package/dist/scandroidNative/dictionary-data.d.ts +2 -0
  71. package/dist/scandroidNative/dictionary-data.d.ts.map +1 -0
  72. package/dist/scandroidNative/dictionary-data.js +744 -0
  73. package/dist/scandroidNative/dictionary.d.ts +12 -0
  74. package/dist/scandroidNative/dictionary.d.ts.map +1 -0
  75. package/dist/scandroidNative/dictionary.js +50 -0
  76. package/dist/scandroidNative/engine.d.ts +41 -0
  77. package/dist/scandroidNative/engine.d.ts.map +1 -0
  78. package/dist/scandroidNative/engine.js +119 -0
  79. package/dist/scandroidNative/machine.d.ts +93 -0
  80. package/dist/scandroidNative/machine.d.ts.map +1 -0
  81. package/dist/scandroidNative/machine.js +795 -0
  82. package/dist/scandroidNative/positioner.d.ts +32 -0
  83. package/dist/scandroidNative/positioner.d.ts.map +1 -0
  84. package/dist/scandroidNative/positioner.js +208 -0
  85. package/dist/scandroidNative/syllabizer.d.ts +3 -0
  86. package/dist/scandroidNative/syllabizer.d.ts.map +1 -0
  87. package/dist/scandroidNative/syllabizer.js +215 -0
  88. package/dist/scandroidNative/utilities.d.ts +37 -0
  89. package/dist/scandroidNative/utilities.d.ts.map +1 -0
  90. package/dist/scandroidNative/utilities.js +86 -0
  91. package/dist/scansion.d.ts.map +1 -1
  92. package/dist/scansion.js +118 -14
  93. package/dist/stress.d.ts +1 -0
  94. package/dist/stress.d.ts.map +1 -1
  95. package/dist/stress.js +502 -42
  96. package/dist/types.d.ts +3 -0
  97. package/dist/types.d.ts.map +1 -1
  98. package/package.json +27 -6
  99. package/tools/fetch-russian-data.mjs +30 -0
  100. package/webapp/public/app.js +2418 -0
  101. package/webapp/public/assets/GithubLogo.png +0 -0
  102. package/webapp/public/assets/NPM2.png +0 -0
  103. package/webapp/public/assets/fonts/MurenaBold-webfont.woff2 +0 -0
  104. package/webapp/public/assets/fonts/MurenaItalic-webfont.woff2 +0 -0
  105. package/webapp/public/assets/fonts/MurenaRegular-webfont.woff2 +0 -0
  106. package/webapp/public/assets/fonts/Myra_4F_Caps_Bold-webfont.woff2 +0 -0
  107. package/webapp/public/assets/fonts/SinkinSans-700Bold.otf +0 -0
  108. package/webapp/public/assets/fonts/butterflies.ttf +0 -0
  109. package/webapp/public/assets/fonts/midcase_blackline-webfont.woff2 +0 -0
  110. package/webapp/public/assets/fonts/neueral-bold-webfont.woff2 +0 -0
  111. package/webapp/public/assets/fonts/neueral-regular-webfont.woff2 +0 -0
  112. package/webapp/public/assets/fonts/popelka-webfont.woff2 +0 -0
  113. package/webapp/public/assets/fonts/vremenagrotesk-webfont.woff +0 -0
  114. package/webapp/public/assets/fonts/wicky_javick_bold-webfont.woff2 +0 -0
  115. package/webapp/public/assets/logos/Logo_Var_10_Celtic_Knot_SVG.svg +116 -0
  116. package/webapp/public/assets/logos/Logo_Var_11_Graph_SVG.svg +313 -0
  117. package/webapp/public/assets/logos/Logo_Var_12_Limacon_Knot_SVG.svg +3942 -0
  118. package/webapp/public/assets/logos/Logo_Var_13_Crescents_SVG.svg +1030 -0
  119. package/webapp/public/assets/logos/Logo_Var_1_Spiral_SVG.svg +1491 -0
  120. package/webapp/public/assets/logos/Logo_Var_2_Tunnel_SVG.svg +12 -0
  121. package/webapp/public/assets/logos/Logo_Var_3_Triskelion_SVG.svg +10 -0
  122. package/webapp/public/assets/logos/Logo_Var_4_Quinquetra_PNG.png +0 -0
  123. package/webapp/public/assets/logos/Logo_Var_5_Penrose_Pentagram_SVG.svg +37 -0
  124. package/webapp/public/assets/logos/Logo_Var_6_Triskelion2_SVG.svg +10 -0
  125. package/webapp/public/assets/logos/Logo_Var_7_SixfoldSpirals_SVG.svg +20 -0
  126. package/webapp/public/assets/logos/Logo_Var_8_Radial_Labyrinth_SVG.svg +163 -0
  127. package/webapp/public/assets/logos/Logo_Var_9_Radial_Labyrinth_2_SVG.svg +106 -0
  128. package/webapp/public/index.html +316 -0
  129. package/webapp/public/styles.css +1114 -0
  130. package/webapp/server.mjs +680 -0
  131. package/src/caesura.ts +0 -201
  132. package/src/calliope/boundaries.ts +0 -190
  133. package/src/calliope/bracketing.ts +0 -390
  134. package/src/calliope/deps.ts +0 -160
  135. package/src/calliope/engine.ts +0 -77
  136. package/src/calliope/feats.ts +0 -46
  137. package/src/calliope/names.ts +0 -44
  138. package/src/calliope/postag.ts +0 -253
  139. package/src/calliope/prosodic.ts +0 -262
  140. package/src/calliope/relstress.ts +0 -645
  141. package/src/calliope/stressrules.ts +0 -147
  142. package/src/calliope/syntax.ts +0 -218
  143. package/src/calliope/udpos.ts +0 -152
  144. package/src/calliope_src_contents.md +0 -19049
  145. package/src/clio/caesura.ts +0 -145
  146. package/src/clio/depfix.ts +0 -88
  147. package/src/clio/display.ts +0 -1042
  148. package/src/clio/engine.ts +0 -38
  149. package/src/clio/parser.ts +0 -845
  150. package/src/clio/phonological.ts +0 -849
  151. package/src/clio/phrasestress.ts +0 -108
  152. package/src/clio/pipeline.ts +0 -154
  153. package/src/clio/rhyme.ts +0 -740
  154. package/src/clio/scandroid.ts +0 -434
  155. package/src/clio/scansion.ts +0 -1130
  156. package/src/clio/semantics.ts +0 -134
  157. package/src/clio/stress.ts +0 -1731
  158. package/src/clio/tagfix.ts +0 -104
  159. package/src/depfix.ts +0 -88
  160. package/src/display.ts +0 -1138
  161. package/src/engine.ts +0 -22
  162. package/src/index.ts +0 -690
  163. package/src/parser.ts +0 -501
  164. package/src/phonological.ts +0 -917
  165. package/src/phrasestress.ts +0 -108
  166. package/src/rhyme.ts +0 -748
  167. package/src/scandroid.ts +0 -434
  168. package/src/scansion.ts +0 -1174
  169. package/src/semantics.ts +0 -134
  170. package/src/stress.ts +0 -2111
  171. package/src/tagfix.ts +0 -104
  172. package/src/types.ts +0 -265
  173. package/tests/DataForHayesLinesOnly.txt +0 -364
  174. package/tests/DataForHayesStressSymbolsRevised.txt +0 -728
  175. package/tests/basic.test.ts +0 -1102
  176. package/tests/bench-hayes.mjs +0 -72
  177. package/tests/epg64.meter.train.txt +0 -8139
  178. package/tests/litlab-sample-2016.txt +0 -1738
  179. package/tests/prosodic.meter.train.txt +0 -13192
  180. package/tests/wagner-stress.test.ts +0 -188
  181. package/tsconfig.json +0 -29
  182. package/vitest.config.d.ts +0 -2
  183. package/vitest.config.js +0 -14
@@ -0,0 +1,1114 @@
1
+ /* ═══════════════════════════════════════════════════════════════════
2
+ CALLIOPE — a constructivist alchemical instrument on parchment & gilt
3
+ Registers: Bebas Neue → bars, verdicts, machine-labels
4
+ Cormorant Garamond → the verse, the prose, the voice
5
+ IBM Plex Mono → measurements, phones, maps
6
+ Ground: near-black oxblood. Content: parchment cartouches.
7
+ ═══════════════════════════════════════════════════════════════════ */
8
+
9
+ /* ── the type case: user-curated webfonts ─────────────────── */
10
+ @font-face { font-family: 'Murena'; src: url('assets/fonts/MurenaRegular-webfont.woff2') format('woff2'); font-weight: 400; font-style: normal; font-display: swap; }
11
+ @font-face { font-family: 'Murena'; src: url('assets/fonts/MurenaItalic-webfont.woff2') format('woff2'); font-weight: 400; font-style: italic; font-display: swap; }
12
+ @font-face { font-family: 'Murena'; src: url('assets/fonts/MurenaBold-webfont.woff2') format('woff2'); font-weight: 700; font-style: normal; font-display: swap; }
13
+ @font-face { font-family: 'Popelka'; src: url('assets/fonts/popelka-webfont.woff2') format('woff2'); font-display: swap; }
14
+ @font-face { font-family: 'Vremena Grotesk'; src: url('assets/fonts/vremenagrotesk-webfont.woff') format('woff'); font-display: swap; }
15
+ @font-face { font-family: 'Myra 4F Caps'; src: url('assets/fonts/Myra_4F_Caps_Bold-webfont.woff2') format('woff2'); font-display: swap; }
16
+ @font-face { font-family: 'Midcase'; src: url('assets/fonts/midcase_blackline-webfont.woff2') format('woff2'); font-display: swap; }
17
+ @font-face { font-family: 'Neueral'; src: url('assets/fonts/neueral-regular-webfont.woff2') format('woff2'); font-weight: 400; font-display: swap; }
18
+ @font-face { font-family: 'Neueral'; src: url('assets/fonts/neueral-bold-webfont.woff2') format('woff2'); font-weight: 700; font-display: swap; }
19
+ @font-face { font-family: 'Wicky Javick'; src: url('assets/fonts/wicky_javick_bold-webfont.woff2') format('woff2'); font-display: swap; }
20
+ @font-face { font-family: 'Sinkin Sans'; src: url('assets/fonts/SinkinSans-700Bold.otf') format('opentype'); font-weight: 700; font-display: swap; }
21
+ @font-face { font-family: 'Butterflies'; src: url('assets/fonts/butterflies.ttf') format('truetype'); font-display: swap; }
22
+
23
+ :root {
24
+ /* ground & frames */
25
+ --void: #1c0d11;
26
+ --void-2: #2a1414;
27
+ --oxblood: #6e1f1a;
28
+ --vermilion: #c1272d;
29
+ --vermilion-hi: #e04a3a;
30
+ --gilt: #c9a227;
31
+ --gilt-dim: #8a6a2a;
32
+ --black-bar: #131013;
33
+
34
+ /* parchment */
35
+ --parch: #f9f3e0;
36
+ --parch-2: #f0e7cd;
37
+ --parch-3: #e3d6b4;
38
+ --ink: #2a2118;
39
+ --ink-soft: #443826;
40
+ --sepia: #5e4f33;
41
+ --rubric: #a02c22;
42
+
43
+ /* the trio + companions, ink-strength for parchment */
44
+ --viridian: #1f6b47;
45
+ --viridian-hi: #2e8a5c;
46
+ --heliotrope: #5d3f8e;
47
+ --heliotrope-hi: #7a55b5;
48
+ --madder: #a02c22;
49
+ --blue: #2f5e9e;
50
+ --rose: #a04a78;
51
+ --teal: #0f7a8a;
52
+ --amber: #a06818;
53
+
54
+ /* stress tiers — a rubricator's rising scale (x → s) */
55
+ --tier-x: #7f6d47;
56
+ --tier-w: #4e3e87;
57
+ --tier-n: #176644;
58
+ --tier-m: #9a5210;
59
+ --tier-s: #c1272d;
60
+
61
+ /* light lettering on black bars — must NOT flip with the theme */
62
+ --bar-ink: #ebe0c6;
63
+
64
+ --serif: "Cormorant Garamond", "Iowan Old Style", Georgia, serif;
65
+ --bars: "Bebas Neue", "Arial Narrow", sans-serif;
66
+ --mono: "IBM Plex Mono", ui-monospace, Menlo, monospace;
67
+ --caption: "Murena", "Iowan Old Style", Georgia, serif;
68
+ --ui: "Neueral", "Sinkin Sans", "Avenir Next", sans-serif;
69
+ }
70
+
71
+ * { box-sizing: border-box; }
72
+ html { scroll-behavior: smooth; font-size: 17px; }
73
+ [hidden] { display: none !important; }
74
+
75
+ body {
76
+ margin: 0; min-height: 100vh;
77
+ background:
78
+ radial-gradient(900px 480px at 88% -5%, rgba(193, 39, 45, .16), transparent 62%),
79
+ radial-gradient(760px 540px at -8% 22%, rgba(93, 63, 142, .14), transparent 58%),
80
+ radial-gradient(1100px 800px at 55% 118%, rgba(31, 107, 71, .12), transparent 60%),
81
+ repeating-conic-gradient(from 0deg at 50% -40%, transparent 0deg 5.6deg, rgba(201, 162, 39, .022) 5.6deg 6deg),
82
+ var(--void);
83
+ color: var(--ink);
84
+ font-family: var(--serif);
85
+ font-size: 1rem; line-height: 1.5;
86
+ overflow-x: hidden;
87
+ }
88
+
89
+ ::selection { background: rgba(193, 39, 45, .3); }
90
+ h1, h2, h3, h4 { margin: 0; }
91
+ button { cursor: pointer; }
92
+
93
+ .whisper { color: var(--sepia); font-size: 1.08rem; font-family: var(--serif); font-style: italic; font-weight: 600; }
94
+ .whisper.dark { color: #c2ab85; }
95
+
96
+ /* ── the black-bar / wedge vocabulary ─────────────────────── */
97
+ .bar-title {
98
+ font-family: var(--bars); font-weight: 400; letter-spacing: .18em;
99
+ font-size: 1.15rem; color: var(--bar-ink);
100
+ background: var(--black-bar);
101
+ display: inline-block; padding: .18rem .9rem .1rem;
102
+ clip-path: polygon(0 0, 100% 0, calc(100% - 12px) 100%, 0 100%);
103
+ transform: rotate(-1.2deg);
104
+ }
105
+
106
+ .ghost-btn {
107
+ font-family: var(--bars); letter-spacing: .12em; font-size: .85rem;
108
+ background: none; border: 1px solid var(--gilt-dim); color: var(--gilt);
109
+ padding: .3rem .9rem .18rem;
110
+ transition: background .2s, color .2s;
111
+ }
112
+ .ghost-btn:hover { background: rgba(201, 162, 39, .12); color: #e8c95a; }
113
+ .ghost-btn.dark { border-color: var(--gilt-dim); }
114
+ /* the four workhorse buttons read larger: masthead tools + the edit strip */
115
+ #btn-legend, #btn-settings, #btn-reopen, #btn-copymap {
116
+ font-size: 1.05rem;
117
+ padding: .5rem 1.35rem .36rem;
118
+ }
119
+
120
+ /* ── masthead: constructivist band ────────────────────────── */
121
+ .masthead {
122
+ position: relative; overflow: visible; /* hidden clipped the settings popover */
123
+ display: flex; align-items: center; justify-content: space-between; gap: 1rem;
124
+ padding: 1rem 2.2rem .8rem;
125
+ background: var(--black-bar);
126
+ border-bottom: 3px solid var(--vermilion);
127
+ flex-wrap: wrap;
128
+ }
129
+ .mast-wedge {
130
+ position: absolute; top: 0; bottom: 0; left: -60px; width: 46%;
131
+ background: linear-gradient(100deg, var(--vermilion), var(--oxblood) 90%);
132
+ clip-path: polygon(0 100%, 14% 0, 100% 100%);
133
+ opacity: .5; pointer-events: none;
134
+ animation: wedge-in .9s cubic-bezier(.2, .8, .2, 1) both;
135
+ }
136
+ @keyframes wedge-in { from { transform: translateX(-40%) } to { transform: none } }
137
+ .brand { position: relative; display: flex; align-items: baseline; gap: .6rem; z-index: 1; }
138
+ .brand-burst {
139
+ position: absolute; left: -34px; top: 50%; width: 120px; height: 120px;
140
+ transform: translateY(-50%); border-radius: 50%;
141
+ background: repeating-conic-gradient(from 0deg, rgba(201,162,39,.35) 0deg 4deg, transparent 4deg 15deg);
142
+ -webkit-mask-image: radial-gradient(circle, black 30%, transparent 70%);
143
+ mask-image: radial-gradient(circle, black 30%, transparent 70%);
144
+ animation: slow-rotate 40s linear infinite; pointer-events: none;
145
+ }
146
+ @keyframes slow-rotate { to { transform: translateY(-50%) rotate(360deg); } }
147
+ .brand h1 {
148
+ font-family: var(--bars); font-weight: 400; font-size: 3rem; line-height: .9;
149
+ letter-spacing: .12em; color: var(--bar-ink);
150
+ text-shadow: 3px 3px 0 var(--vermilion);
151
+ }
152
+ .brand-ts {
153
+ font-family: var(--bars); font-size: 1rem; color: var(--black-bar);
154
+ background: var(--gilt); padding: .12rem .45rem 0;
155
+ transform: rotate(-8deg) translateY(-14px); display: inline-block;
156
+ }
157
+ .brand-sub {
158
+ font-family: var(--bars); font-size: .8rem; letter-spacing: .34em;
159
+ color: #d8b5a8; text-transform: uppercase;
160
+ border-top: 1px solid var(--oxblood); padding-top: .25rem;
161
+ }
162
+ .masthead-tools { display: flex; align-items: center; gap: .8rem; z-index: 1; }
163
+ .engine-switch { display: inline-flex; border: 1px solid var(--gilt-dim); }
164
+ .engine-opt {
165
+ font-family: var(--bars); letter-spacing: .14em; font-size: .85rem;
166
+ background: none; border: none; color: #9c8a6a; padding: .34rem .9rem .2rem;
167
+ }
168
+ .engine-opt.is-active { background: var(--vermilion); color: var(--bar-ink); }
169
+
170
+ .mast-rule {
171
+ height: 10px;
172
+ background:
173
+ linear-gradient(90deg, var(--gilt-dim) 0 30%, transparent 30% 32%, var(--gilt-dim) 32% 100%) top/100% 1px no-repeat,
174
+ repeating-linear-gradient(-45deg, var(--gilt-dim) 0 1px, transparent 1px 9px) center/100% 5px no-repeat;
175
+ opacity: .5;
176
+ }
177
+
178
+ /* ── frame & parchment panels ─────────────────────────────── */
179
+ .frame { max-width: 1920px; margin: 0 auto; padding: 1.6rem 2rem 3rem; }
180
+
181
+ .panel {
182
+ position: relative;
183
+ background:
184
+ radial-gradient(120% 90% at 50% 0%, rgba(255, 250, 235, .55), transparent 55%),
185
+ repeating-linear-gradient(0deg, transparent 0 26px, rgba(122, 106, 78, .05) 26px 27px),
186
+ var(--parch);
187
+ border: 1px solid var(--gilt-dim);
188
+ box-shadow:
189
+ inset 0 0 0 4px var(--parch), inset 0 0 0 5px rgba(160, 44, 34, .5),
190
+ inset 0 0 60px rgba(122, 106, 78, .18),
191
+ 0 0 0 4px #1c0d10, 0 0 0 5px var(--gilt-dim),
192
+ 0 26px 60px -24px rgba(0, 0, 0, .9);
193
+ }
194
+ .corner { position: absolute; width: 44px; height: 44px; pointer-events: none; z-index: 2; }
195
+ .corner use { stroke: var(--gilt-dim); fill: var(--rubric); }
196
+ .corner.tl { top: 6px; left: 6px; }
197
+ .corner.tr { top: 6px; right: 6px; transform: rotate(90deg); }
198
+ .corner.br { bottom: 6px; right: 6px; transform: rotate(180deg); }
199
+ .corner.bl { bottom: 6px; left: 6px; transform: rotate(270deg); }
200
+
201
+ /* ── scriptorium ──────────────────────────────────────────── */
202
+ .scriptorium { max-width: 800px; margin: 1.8rem auto 0; padding: 1.8rem 2rem 1.5rem; }
203
+ .scriptorium-head .whisper { margin: .7rem 0 1rem; max-width: 62ch; display: block; }
204
+ #poem-input {
205
+ width: 100%; min-height: 210px; resize: vertical;
206
+ background: rgba(255, 251, 240, .6); color: var(--ink);
207
+ border: 1px solid var(--gilt-dim); outline: none;
208
+ box-shadow: inset 0 2px 8px rgba(122, 106, 78, .25);
209
+ font-family: var(--serif); font-size: 1.18rem; line-height: 1.65;
210
+ padding: 1rem 1.1rem;
211
+ }
212
+ #poem-input:focus { border-color: var(--rubric); }
213
+ #poem-input::placeholder { color: var(--sepia); font-style: italic; }
214
+ .scriptorium-foot { display: flex; justify-content: space-between; align-items: center; margin-top: 1.1rem; gap: 1rem; flex-wrap: wrap; }
215
+ .sample-picker { display: flex; align-items: center; gap: .5rem; color: var(--ink-soft); font-family: var(--serif); font-style: italic; font-size: .95rem; }
216
+ .lang-picker { display: flex; align-items: center; gap: .5rem; color: var(--ink-soft); font-family: var(--serif); font-style: italic; font-size: .95rem; }
217
+ select {
218
+ background: var(--parch-2); color: var(--ink); border: 1px solid var(--gilt-dim);
219
+ padding: .3rem .5rem; font-family: var(--serif); font-size: .9rem;
220
+ }
221
+ .analyze-btn {
222
+ font-family: var(--bars); font-size: 1.25rem; letter-spacing: .16em;
223
+ color: var(--bar-ink); background: linear-gradient(100deg, var(--vermilion), var(--oxblood));
224
+ border: none; padding: .5rem 2rem .34rem 1.4rem;
225
+ clip-path: polygon(0 0, 100% 0, calc(100% - 18px) 100%, 0 100%);
226
+ box-shadow: 4px 4px 0 var(--black-bar);
227
+ transition: transform .12s, box-shadow .12s, filter .2s;
228
+ }
229
+ .analyze-btn:hover { filter: brightness(1.12); transform: translate(-2px, -2px); box-shadow: 6px 6px 0 var(--black-bar); }
230
+ .analyze-btn:active { transform: translate(2px, 2px); box-shadow: 1px 1px 0 var(--black-bar); }
231
+ .analyze-btn[disabled] { filter: grayscale(.6) brightness(.75); cursor: wait; }
232
+
233
+ /* ── edit strip ───────────────────────────────────────────── */
234
+ .edit-strip { display: flex; justify-content: space-between; align-items: center; gap: 1rem; margin: .5rem 0 1.2rem; flex-wrap: wrap; }
235
+ .view-toggles { display: flex; align-items: center; gap: 1.1rem; flex-wrap: wrap; }
236
+ .toggle-label, .check-label { color: #c8b28e; font-family: var(--bars); letter-spacing: .1em; font-size: .82rem; display: flex; align-items: center; gap: .45rem; }
237
+ .check-label input { accent-color: var(--vermilion); }
238
+
239
+ /* ── stage & rail ─────────────────────────────────────────── */
240
+ .stage-and-rail { display: grid; grid-template-columns: minmax(0, 1fr) 350px; gap: 1.7rem; align-items: start; }
241
+ @media (max-width: 1080px) { .stage-and-rail { grid-template-columns: 1fr; } .rail { order: 2; position: static; max-height: none; } }
242
+
243
+ /* ── the codex ────────────────────────────────────────────── */
244
+ .codex { padding: 2rem 1.6rem 1.7rem 1.1rem; overflow-x: auto; }
245
+ .codex::before { /* the rubricator's margin rule */
246
+ content: ""; position: absolute; top: 14px; bottom: 14px; left: 34px;
247
+ border-left: 1px solid rgba(160, 44, 34, .35); pointer-events: none;
248
+ }
249
+ .stanza { margin-bottom: 2rem; }
250
+ .stanza:last-child { margin-bottom: .4rem; }
251
+ .stanza-head { display: flex; align-items: center; gap: .9rem; margin: 0 0 .8rem -0.6rem; }
252
+ .stanza-no {
253
+ font-family: var(--bars); font-size: .8rem; letter-spacing: .22em;
254
+ color: var(--bar-ink); background: var(--black-bar);
255
+ padding: .14rem .6rem .04rem; transform: rotate(-1.6deg);
256
+ }
257
+ .form-note { font-family: var(--serif); font-style: italic; font-weight: 600; font-size: .95rem; color: var(--viridian); }
258
+ .form-note::before { content: "❡ "; color: var(--rubric); }
259
+
260
+ .vline { padding: .16rem .4rem .16rem 0; transition: background .18s; }
261
+ .vline:hover { background: rgba(160, 44, 34, .05); }
262
+ .vline-main { display: flex; align-items: baseline; gap: .9rem; }
263
+ .vline-no {
264
+ font-family: var(--mono); font-size: .68rem; color: var(--sepia);
265
+ min-width: 2.2rem; text-align: right; user-select: none; flex-shrink: 0;
266
+ transform: translateY(-2px);
267
+ }
268
+ .vline-text { flex: 1 1 auto; font-size: 1.5rem; line-height: 1.5; font-weight: 500; min-width: 0; }
269
+ .vline-text .gap { color: var(--ink-soft); }
270
+ .vline-text .word { transition: background .15s; cursor: pointer; }
271
+ .vline-text .word:hover { background: rgba(201, 162, 39, .25); }
272
+ .vline-text .word.pinned { outline: 1.5px dashed var(--rubric); outline-offset: 2px; background: rgba(201,162,39,.18); }
273
+
274
+ /* stress tints on parchment */
275
+ .tint-rel .chunk.t-x { color: var(--tier-x); }
276
+ .tint-rel .chunk.t-w { color: var(--tier-w); }
277
+ .tint-rel .chunk.t-n { color: var(--tier-n); }
278
+ .tint-rel .chunk.t-m { color: var(--tier-m); }
279
+ .tint-rel .chunk.t-s { color: var(--tier-s); font-weight: 600; }
280
+ .tint-lex .chunk.l-0 { color: #5c6da0; }
281
+ .tint-lex .chunk.l-1 { color: #7a4fa0; }
282
+ .tint-lex .chunk.l-2 { color: #b3402e; }
283
+ .tint-lex .chunk.l-3 { color: #8c1015; font-weight: 600; }
284
+ .tint-class .word.is-content .chunk { color: var(--ink); }
285
+ .tint-class .word.is-function .chunk { color: #9c8c6c; }
286
+ .tint-off .chunk { color: var(--ink); }
287
+ .chunk.hl { background: rgba(201, 162, 39, .45); box-shadow: 0 0 0 2px rgba(201, 162, 39, .3); }
288
+
289
+ .footmark { color: var(--sepia); font-family: var(--mono); font-size: .75em; padding: 0 .08em; opacity: .9; user-select: none; }
290
+ .caesmark { font-family: var(--mono); font-weight: 700; padding: 0 .1em; user-select: none; }
291
+
292
+ /* per-line verdict slots (HoMM inventory feel) */
293
+ .vline-chips {
294
+ display: flex; align-items: center; gap: .4rem; flex-shrink: 0;
295
+ cursor: pointer; user-select: none; padding: .1rem .2rem;
296
+ }
297
+ .meter-chip {
298
+ display: inline-flex; align-items: baseline; gap: .4rem;
299
+ font-family: var(--bars); font-size: .88rem; letter-spacing: .08em;
300
+ color: var(--ink);
301
+ background: var(--parch-2);
302
+ border: 1px solid var(--gilt-dim);
303
+ box-shadow: inset 0 1px 0 rgba(255, 250, 235, .8), inset 0 -1px 0 rgba(122, 106, 78, .4);
304
+ padding: .12rem .55rem .02rem; white-space: nowrap;
305
+ transition: box-shadow .15s;
306
+ }
307
+ .vline-chips:hover .meter-chip { box-shadow: inset 0 0 0 1px var(--gilt), 0 0 8px rgba(201, 162, 39, .4); }
308
+ .meter-dot { width: 8px; height: 8px; display: inline-block; transform: rotate(45deg); flex-shrink: 0; align-self: center; }
309
+ .fit-pct { color: var(--sepia); font-family: var(--mono); font-size: .64rem; }
310
+ .rhyme-chip {
311
+ font-family: var(--mono); font-size: .72rem; font-weight: 600;
312
+ padding: .1rem .4rem; border: 1px solid; white-space: nowrap;
313
+ background: rgba(255, 251, 240, .5);
314
+ }
315
+ .rhyme-chip.unrhymed { color: var(--sepia); border-color: var(--parch-3); }
316
+ .note-glyph { font-size: .85rem; }
317
+ .lab-caret { color: var(--sepia); font-size: .75rem; transition: transform .2s; }
318
+ .vline.is-open .lab-caret { transform: rotate(90deg); color: var(--vermilion); }
319
+ .vline-noparse { color: var(--sepia); font-style: italic; font-size: .85rem; }
320
+
321
+ /* ── line laboratory: the alchemical bench ────────────────── */
322
+ .lab {
323
+ margin: .6rem 0 1rem 2.4rem;
324
+ background:
325
+ radial-gradient(100% 60% at 50% 0%, rgba(255, 250, 235, .4), transparent 60%),
326
+ var(--parch-2);
327
+ border: 1px solid var(--gilt-dim);
328
+ border-left: 4px solid var(--vermilion);
329
+ box-shadow: inset 0 0 34px rgba(122, 106, 78, .22), 4px 4px 0 rgba(19, 16, 19, .5);
330
+ padding: 1.1rem 1.4rem 1.2rem;
331
+ overflow-x: auto;
332
+ animation: lab-open .25s ease-out;
333
+ }
334
+ @keyframes lab-open { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; } }
335
+ .lab h4 {
336
+ font-family: var(--bars); font-weight: 400; font-size: .95rem; letter-spacing: .26em;
337
+ color: var(--rubric); margin: 1.3rem 0 .55rem;
338
+ display: flex; align-items: center; gap: .7rem; white-space: nowrap;
339
+ }
340
+ .lab h4::before { content: "◆"; font-size: .6rem; color: var(--gilt-dim); }
341
+ .lab h4::after { content: ""; flex: 1; border-top: 1px solid var(--gilt-dim); opacity: .5; }
342
+ .lab h4:first-child { margin-top: 0; }
343
+ .lab h4 .whisper { letter-spacing: .02em; white-space: normal; font-size: .85rem; }
344
+
345
+ /* verdict strip */
346
+ .verdict { display: flex; flex-wrap: wrap; align-items: center; gap: 1rem; }
347
+ .verdict-meter { font-family: var(--bars); font-size: 1.5rem; letter-spacing: .06em; }
348
+ .verdict-meter .foot-ct { color: var(--sepia); font-size: .85rem; margin-left: .5rem; font-family: var(--mono); }
349
+ .fitbar { flex: 0 0 160px; height: 10px; background: rgba(19, 16, 19, .15); border: 1px solid var(--gilt-dim); overflow: hidden; }
350
+ .fitbar > i { display: block; height: 100%; background: repeating-linear-gradient(-45deg, var(--vermilion) 0 6px, var(--oxblood) 6px 12px); }
351
+ .fit-label { font-family: var(--mono); font-size: .74rem; color: var(--ink-soft); }
352
+ .verdict-notes { flex-basis: 100%; display: flex; flex-direction: column; gap: .2rem; }
353
+ .verdict-note { font-family: var(--serif); font-style: italic; font-size: 1rem; color: var(--ink-soft); }
354
+ .verdict-note b { color: var(--ink); font-weight: 600; }
355
+ .verdict-note.rhythm { color: var(--heliotrope); }
356
+ .verdict-note.hedge { color: var(--sepia); }
357
+
358
+ /* candidate ranking — constructivist wedges */
359
+ .ranking { display: flex; flex-direction: column; gap: .35rem; max-width: 460px; }
360
+ .rank-row { display: grid; grid-template-columns: 118px 1fr 52px; align-items: center; gap: .6rem; }
361
+ .rank-name { font-family: var(--bars); font-size: .95rem; letter-spacing: .1em; text-align: right; }
362
+ .rank-bar { height: 12px; position: relative; }
363
+ .rank-bar > i {
364
+ display: block; height: 100%;
365
+ clip-path: polygon(0 0, 100% 50%, 0 100%);
366
+ box-shadow: none;
367
+ }
368
+ .rank-score { font-family: var(--mono); font-size: .7rem; color: var(--sepia); }
369
+
370
+ /* feet track — inventory slots */
371
+ .feet-track { display: flex; align-items: stretch; gap: .4rem; flex-wrap: wrap; }
372
+ .foot-cell {
373
+ border: 1px solid var(--gilt-dim);
374
+ background: linear-gradient(170deg, rgba(255, 251, 240, .75), rgba(216, 199, 159, .55));
375
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, .7), inset 0 -2px 4px rgba(122, 106, 78, .3), 2px 2px 0 rgba(19, 16, 19, .35);
376
+ padding: .35rem .6rem .3rem;
377
+ display: flex; gap: .55rem; align-items: flex-end;
378
+ }
379
+ .foot-syl { display: flex; flex-direction: column; align-items: center; gap: .02rem; }
380
+ .foot-syl .fs-text { font-family: var(--serif); font-size: 1.12rem; font-weight: 600; }
381
+ .foot-syl .fs-mark { font-family: var(--mono); font-size: .66rem; }
382
+ .foot-syl.silent .fs-text { color: var(--sepia); }
383
+ .foot-sep { align-self: center; color: var(--sepia); font-family: var(--mono); }
384
+ .caes-cell { align-self: center; font-family: var(--mono); font-weight: 700; font-size: 1.05rem; padding: 0 .15rem; }
385
+
386
+ /* syllable matrix — the engraved register */
387
+ .matrix-wrap { overflow-x: auto; }
388
+ table.matrix { border-collapse: collapse; font-size: .8rem; background: rgba(255, 251, 240, .45); }
389
+ .matrix th, .matrix td { border: 1px solid rgba(138, 106, 42, .5); padding: .26rem .5rem; text-align: center; white-space: nowrap; }
390
+ .matrix th.rowlab {
391
+ text-align: right; font-family: var(--bars); font-weight: 400; font-size: .74rem;
392
+ letter-spacing: .14em; color: var(--rubric); padding-right: .7rem;
393
+ border: none; background: none;
394
+ }
395
+ .matrix .wordhead { font-family: var(--serif); font-size: 1rem; font-weight: 600; background: rgba(201, 162, 39, .14); }
396
+ .matrix .wordhead .pos { font-family: var(--mono); font-size: .6rem; color: var(--heliotrope); display: block; font-weight: 400; }
397
+ .matrix td { font-family: var(--mono); color: var(--ink-soft); }
398
+ .matrix td.syltext { font-family: var(--serif); font-size: 1rem; color: var(--ink); }
399
+ .matrix td.phones { font-size: .66rem; }
400
+ .matrix td.hl { background: rgba(201, 162, 39, .35); }
401
+
402
+ /* phrasing brackets */
403
+ .bracketing { font-family: var(--serif); font-size: 1.2rem; line-height: 2; }
404
+ .bracketing .br { font-family: var(--mono); font-weight: 700; font-size: .92em; padding: 0 .05em; }
405
+ .hier-tree { font-family: var(--serif); font-size: .92rem; margin-top: .5rem; }
406
+ .hier-tree .iu-row { margin: .3rem 0; }
407
+ .unit-tag {
408
+ font-family: var(--bars); font-size: .72rem; letter-spacing: .1em;
409
+ padding: .08rem .4rem 0; margin-right: .45rem; border: 1px solid;
410
+ }
411
+ .unit-tag.iu { color: var(--viridian); border-color: var(--viridian); background: rgba(31, 107, 71, .08); }
412
+ .unit-tag.pp { color: var(--blue); border-color: var(--blue); background: rgba(47, 94, 158, .08); }
413
+ .unit-tag.cp { color: var(--rose); border-color: var(--rose); background: rgba(160, 74, 120, .08); }
414
+ .hier-tree .pp-row { margin-left: 1.5rem; }
415
+ .hier-tree .cp-inline { margin-left: .2rem; font-size: 1rem; }
416
+ .hier-tree .cp-inline .cw { padding: 0 .14rem; }
417
+
418
+ /* key stresses */
419
+ .keystress-row { display: flex; flex-wrap: wrap; gap: .4rem; }
420
+ .ks-chip {
421
+ font-family: var(--mono); font-size: .74rem; padding: .22rem .55rem;
422
+ border: 1px solid var(--gilt-dim); background: rgba(255, 251, 240, .6); cursor: default;
423
+ box-shadow: 1px 1px 0 rgba(19, 16, 19, .3);
424
+ transition: background .15s;
425
+ }
426
+ .ks-chip:hover { background: rgba(201, 162, 39, .28); }
427
+ .ks-chip .kst { font-family: var(--bars); font-size: .8rem; letter-spacing: .1em; margin-right: .4rem; }
428
+ .ks-chip .ksw { color: var(--sepia); margin-left: .35rem; }
429
+
430
+ /* dependency arcs */
431
+ .dep-stage { position: relative; }
432
+ .dep-svg { display: block; overflow: visible; }
433
+ .dep-words { display: flex; gap: 1.4rem; padding: .2rem .4rem 0; flex-wrap: nowrap; }
434
+ .dep-word { display: flex; flex-direction: column; align-items: center; gap: .05rem; flex-shrink: 0; }
435
+ .dep-word .dw-text { font-family: var(--serif); font-size: 1.12rem; font-weight: 600; }
436
+ .dep-word .dw-pos { font-family: var(--mono); font-size: .6rem; color: var(--heliotrope); letter-spacing: .04em; }
437
+ .dep-word.is-function .dw-text { color: var(--sepia); font-weight: 500; }
438
+ .dep-arc { fill: none; stroke-width: 1.3; opacity: .85; }
439
+ .dep-arc-label { font-family: var(--mono); font-size: 9.5px; }
440
+ .dep-root-mark { font-family: var(--bars); font-size: 11px; letter-spacing: .1em; fill: var(--viridian); }
441
+
442
+ /* scandroid */
443
+ .scandroid-rows { font-family: var(--mono); font-size: .82rem; color: var(--ink-soft); display: flex; flex-direction: column; gap: .25rem; }
444
+ .scandroid-rows b { color: var(--heliotrope); font-weight: 500; }
445
+ .scandroid-marks { padding-left: 1rem; opacity: .75; font-size: .78rem; }
446
+ .scandroid-fail { color: var(--rubric); font-weight: 600; }
447
+
448
+ /* ── rail cartouches ──────────────────────────────────────── */
449
+ .rail { display: flex; flex-direction: column; gap: 1.3rem; position: sticky; top: 1rem; max-height: calc(100vh - 2rem); overflow-y: auto; scrollbar-width: thin; }
450
+ .rail-card { padding: 1.15rem 1.3rem 1.2rem; }
451
+ .rail-title {
452
+ font-family: var(--bars); font-weight: 400; font-size: 1rem; letter-spacing: .26em;
453
+ color: var(--bar-ink); background: var(--black-bar);
454
+ display: inline-block; padding: .16rem .8rem .04rem;
455
+ clip-path: polygon(0 0, 100% 0, calc(100% - 10px) 100%, 0 100%);
456
+ transform: rotate(-1.2deg);
457
+ margin: -.2rem 0 .8rem;
458
+ }
459
+ .rail-title.violet { background: var(--heliotrope); }
460
+ .synopsis-row { display: grid; grid-template-columns: 106px 1fr; gap: .6rem; padding: .32rem 0; border-bottom: 1px dotted var(--gilt-dim); font-size: .92rem; align-items: baseline; }
461
+ .synopsis-row:last-child { border-bottom: none; }
462
+ .synopsis-row .lab-l { font-family: var(--bars); font-size: .78rem; letter-spacing: .12em; color: var(--rubric); }
463
+ .synopsis-row .lab-v { font-family: var(--serif); color: var(--ink-soft); font-weight: 500; }
464
+ .synopsis-row .lab-v .pct { color: var(--oxblood); font-family: var(--mono); font-size: .8rem; font-weight: 600; }
465
+
466
+ .phono-group { margin-bottom: .8rem; }
467
+ .phono-group:last-child { margin-bottom: 0; }
468
+ .phono-label { font-family: var(--bars); font-size: .76rem; letter-spacing: .16em; color: var(--rubric); margin-bottom: .3rem; }
469
+ .phono-items { display: flex; flex-direction: column; gap: .3rem; }
470
+ .rhyme-rel { font-size: .92rem; font-family: var(--serif); }
471
+ .rhyme-rel .rw { color: var(--ink); font-weight: 600; }
472
+ .rhyme-rel .rmeta { font-family: var(--mono); font-size: .64rem; color: var(--sepia); }
473
+ .rhyme-rel .rletter { font-family: var(--mono); font-weight: 700; font-size: .74rem; }
474
+ .rhyme-rel .rtype { font-style: italic; font-size: .8rem; color: var(--sepia); }
475
+
476
+ /* inspector word anatomy */
477
+ .inspector-word h4 { font-family: var(--serif); font-size: 1.7rem; font-style: italic; font-weight: 600; margin-bottom: .2rem; color: var(--ink); }
478
+ .badge-row { display: flex; flex-wrap: wrap; gap: .3rem; margin: .35rem 0 .6rem; }
479
+ .badge {
480
+ font-family: var(--bars); font-size: .72rem; letter-spacing: .08em;
481
+ padding: .12rem .45rem 0; border: 1px solid var(--gilt-dim);
482
+ color: var(--ink-soft); background: rgba(255, 251, 240, .55);
483
+ }
484
+ .badge.content { color: var(--viridian); border-color: var(--viridian); }
485
+ .badge.function { color: var(--sepia); }
486
+ .badge.pos-badge { color: var(--blue); border-color: var(--blue); }
487
+ .badge.flag { color: var(--oxblood); border-color: var(--oxblood); }
488
+ .insp-section { margin-top: .7rem; }
489
+ .insp-label { font-family: var(--bars); font-size: .74rem; letter-spacing: .18em; color: var(--rubric); margin-bottom: .25rem; }
490
+ .insp-text { font-family: var(--serif); font-size: .95rem; color: var(--ink-soft); }
491
+ .insp-text .mono { font-family: var(--mono); font-size: .74rem; }
492
+ .feat-chips { display: flex; flex-wrap: wrap; gap: .3rem; }
493
+ .feat-chip { font-family: var(--serif); font-size: .82rem; border: 1px solid var(--gilt-dim); padding: .08rem .5rem; color: var(--ink-soft); background: rgba(255,251,240,.5); }
494
+ .feat-chip b { color: var(--heliotrope); font-weight: 600; }
495
+ table.syl-mini { border-collapse: collapse; font-size: .74rem; width: 100%; margin-top: .2rem; }
496
+ .syl-mini th { font-family: var(--bars); font-weight: 400; font-size: .68rem; letter-spacing: .12em; color: var(--rubric); padding: .15rem .4rem; text-align: left; border-bottom: 1px solid var(--gilt-dim); }
497
+ .syl-mini td { font-family: var(--mono); padding: .22rem .4rem; border-bottom: 1px dotted var(--gilt-dim); color: var(--ink-soft); }
498
+ .syl-mini td.stx { font-family: var(--serif); font-size: 1rem; font-weight: 600; }
499
+ .unpin-btn { margin-top: .8rem; }
500
+
501
+ /* nounsing dossier */
502
+ .dossier { margin-top: 1rem; border-top: 3px double var(--gilt-dim); padding-top: .7rem; }
503
+ .dossier-title {
504
+ font-family: var(--bars); font-size: .9rem; letter-spacing: .2em;
505
+ color: var(--bar-ink); background: var(--heliotrope);
506
+ display: inline-block; padding: .14rem .7rem .02rem;
507
+ clip-path: polygon(0 0, 100% 0, calc(100% - 10px) 100%, 0 100%);
508
+ margin-bottom: .6rem;
509
+ }
510
+ .dossier-foot {
511
+ display: flex; align-items: baseline; gap: .6rem; flex-wrap: wrap; margin: .2rem 0 .5rem;
512
+ }
513
+ .dossier-foot .df-label { font-family: var(--bars); font-size: 1.3rem; letter-spacing: .1em; color: var(--madder); }
514
+ .dossier-foot .df-pattern { font-family: var(--mono); font-size: .8rem; color: var(--ink-soft); }
515
+ .dossier-grid { display: grid; grid-template-columns: 1fr; gap: .1rem; }
516
+ .dossier-row { display: grid; grid-template-columns: 104px 1fr; gap: .5rem; padding: .18rem 0; border-bottom: 1px dotted rgba(138,106,42,.4); font-size: .84rem; align-items: baseline; }
517
+ .dossier-row .dr-k { font-family: var(--bars); font-size: .7rem; letter-spacing: .1em; color: var(--heliotrope); }
518
+ .dossier-row .dr-v { font-family: var(--mono); font-size: .74rem; color: var(--ink-soft); overflow-wrap: anywhere; }
519
+ .dossier-row .dr-v .serif { font-family: var(--serif); font-size: .92rem; }
520
+ .rhyme-cloud { display: flex; flex-wrap: wrap; gap: .25rem; margin-top: .2rem; }
521
+ .rhyme-cloud .rc { font-family: var(--serif); font-size: .88rem; font-style: italic; border: 1px solid var(--gilt-dim); padding: .02rem .45rem; background: rgba(255,251,240,.6); }
522
+ .inset-feet { display: flex; flex-direction: column; gap: .25rem; margin-top: .2rem; }
523
+ .inset-row { display: flex; align-items: baseline; gap: .5rem; flex-wrap: wrap; }
524
+ .inset-row .if-name { font-family: var(--bars); font-size: .78rem; letter-spacing: .12em; }
525
+ .inset-row .if-syls { font-family: var(--mono); font-size: .72rem; color: var(--ink-soft); }
526
+ .dossier-oov { font-family: var(--serif); font-style: italic; color: var(--sepia); font-size: .9rem; }
527
+
528
+ /* ── empty hint: a small constructivist manifesto ─────────── */
529
+ .empty-hint { display: flex; justify-content: center; margin: 3.4rem auto 1rem; }
530
+ .manifesto { position: relative; text-align: center; max-width: 620px; padding: 1rem 2rem 0; }
531
+ .mani-bar {
532
+ font-family: var(--bars); font-size: 2rem; letter-spacing: .3em;
533
+ color: var(--bar-ink); background: var(--vermilion);
534
+ display: inline-block; padding: .2rem 1.2rem .05rem;
535
+ transform: rotate(-2.4deg);
536
+ box-shadow: 5px 5px 0 var(--black-bar);
537
+ }
538
+ .mani-wedge {
539
+ position: absolute; top: -16px; right: 8%;
540
+ width: 0; height: 0; border-left: 22px solid transparent; border-right: 22px solid transparent;
541
+ border-bottom: 38px solid var(--gilt); opacity: .8; transform: rotate(18deg);
542
+ }
543
+ .manifesto p:nth-of-type(1) { font-size: 1.35rem; color: #d8c9a8; line-height: 1.7; margin-top: 1.6rem; }
544
+ .manifesto em { color: #e6b83c; }
545
+
546
+ /* ── tooltip: a small parchment card ──────────────────────── */
547
+ .tooltip {
548
+ position: fixed; z-index: 60; max-width: 390px; pointer-events: none;
549
+ background: var(--parch);
550
+ border: 1px solid var(--gilt-dim);
551
+ box-shadow: inset 0 0 0 3px var(--parch), inset 0 0 0 4px rgba(160,44,34,.5), 6px 6px 0 rgba(19,16,19,.55);
552
+ padding: .7rem .95rem .75rem; font-size: .84rem; color: var(--ink);
553
+ animation: tipin .12s ease-out;
554
+ }
555
+ @keyframes tipin { from { opacity: 0; transform: translateY(3px); } to { opacity: 1; } }
556
+ .tooltip .tip-title { font-family: var(--serif); font-size: 1.3rem; font-style: italic; font-weight: 600; margin-bottom: .1rem; }
557
+ .tooltip .tip-sub { font-family: var(--serif); font-size: .84rem; color: var(--sepia); margin-bottom: .4rem; }
558
+ .tooltip .tip-row { display: flex; gap: .5rem; align-items: baseline; padding: .1rem 0; }
559
+ .tooltip .tip-k { font-family: var(--bars); font-size: .7rem; letter-spacing: .12em; color: var(--rubric); min-width: 82px; }
560
+ .tooltip .tip-v { font-family: var(--serif); color: var(--ink-soft); font-size: .88rem; }
561
+ .tooltip .tip-v .mono { font-family: var(--mono); font-size: .72rem; }
562
+ .tooltip .tip-syls { display: flex; gap: .35rem; flex-wrap: wrap; margin-top: .4rem; }
563
+ .tooltip .tip-syl { border: 1px solid var(--gilt-dim); background: rgba(255,251,240,.6); padding: .18rem .4rem; text-align: center; }
564
+ .tooltip .tip-syl .t { font-family: var(--serif); font-size: 1rem; font-weight: 600; display: block; }
565
+ .tooltip .tip-syl .p { font-family: var(--mono); font-size: .6rem; color: var(--sepia); display: block; }
566
+ .tooltip .tip-hint { margin-top: .45rem; font-family: var(--serif); font-style: italic; font-size: .76rem; color: var(--sepia); }
567
+
568
+ /* ── veil: the apparatus at work ──────────────────────────── */
569
+ .veil {
570
+ position: fixed; inset: 0; z-index: 80; display: flex; align-items: center; justify-content: center;
571
+ background: rgba(16, 7, 10, .84); backdrop-filter: blur(3px);
572
+ }
573
+ .veil-inner { text-align: center; }
574
+ .veil-apparatus { position: relative; width: 130px; height: 130px; margin: 0 auto; }
575
+ .veil-burst {
576
+ position: absolute; inset: 0; border-radius: 50%;
577
+ background: repeating-conic-gradient(from 0deg, rgba(193, 39, 45, .55) 0deg 5deg, transparent 5deg 16deg);
578
+ -webkit-mask-image: radial-gradient(circle, transparent 26%, black 30%, black 62%, transparent 68%);
579
+ mask-image: radial-gradient(circle, transparent 26%, black 30%, black 62%, transparent 68%);
580
+ animation: slow-rotate-c 7s linear infinite;
581
+ }
582
+ @keyframes slow-rotate-c { to { transform: rotate(360deg); } }
583
+ .veil-ring {
584
+ position: absolute; inset: 18px; border-radius: 50%;
585
+ border: 1px solid var(--gilt); opacity: .7;
586
+ animation: ring-pulse 1.5s ease-in-out infinite;
587
+ }
588
+ @keyframes ring-pulse { 0%, 100% { transform: scale(.92); opacity: .4; } 50% { transform: scale(1.02); opacity: .9; } }
589
+ .veil-glyph {
590
+ position: absolute; inset: 0; display: flex; align-items: center; justify-content: center;
591
+ color: var(--gilt); font-size: 1.6rem;
592
+ animation: ring-pulse 1.5s ease-in-out infinite;
593
+ }
594
+ #veil-text { font-family: var(--bars); font-size: 1.1rem; letter-spacing: .3em; color: var(--bar-ink); margin-top: 1rem; text-transform: uppercase; }
595
+
596
+ /* ── legend overlay ───────────────────────────────────────── */
597
+ .legend-overlay {
598
+ position: fixed; inset: 0; z-index: 70; overflow-y: auto;
599
+ background: rgba(16, 7, 10, .85); backdrop-filter: blur(4px);
600
+ padding: 3rem 1.5rem;
601
+ }
602
+ .legend-panel { max-width: 900px; margin: 0 auto; padding: 1.8rem 2.2rem 2.2rem; }
603
+ .legend-head { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 1.1rem; }
604
+ .legend-body h3 {
605
+ font-family: var(--bars); font-weight: 400; font-size: .95rem; letter-spacing: .26em;
606
+ color: var(--rubric); margin: 1.7rem 0 .6rem;
607
+ display: flex; align-items: center; gap: .7rem;
608
+ }
609
+ .legend-body h3::after { content: ""; flex: 1; border-top: 1px solid var(--gilt-dim); opacity: .5; }
610
+ .legend-body h3:first-child { margin-top: 0; }
611
+ .legend-body p { font-family: var(--serif); font-size: 1.02rem; color: var(--ink-soft); max-width: 74ch; }
612
+ .legend-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(270px, 1fr)); gap: .5rem 1.6rem; }
613
+ .legend-item { display: block; font-size: .95rem; font-family: var(--serif); padding: .2rem 0; }
614
+ .legend-item .li-key { font-family: var(--mono); font-weight: 600; display: inline-block; margin-right: .55em; }
615
+ .legend-item .li-name { color: var(--ink-soft); }
616
+ .legend-item .li-eg { color: var(--sepia); font-style: italic; font-size: .9rem; font-weight: 600; }
617
+ .tier-dot { display: inline-block; width: 11px; height: 11px; transform: rotate(45deg) translateY(1px); margin-right: .5em; }
618
+
619
+ /* ── toast & colophon ─────────────────────────────────────── */
620
+ .toast {
621
+ position: fixed; bottom: 1.4rem; left: 50%; transform: translateX(-50%) rotate(-1deg); z-index: 90;
622
+ background: var(--vermilion); color: var(--bar-ink);
623
+ font-family: var(--bars); letter-spacing: .1em; font-size: 1rem;
624
+ padding: .55rem 1.3rem .4rem; box-shadow: 4px 4px 0 var(--black-bar);
625
+ }
626
+ .colophon {
627
+ display: flex; justify-content: space-between; gap: 1rem; flex-wrap: wrap;
628
+ padding: 1.1rem 2.2rem 1.5rem; border-top: 1px solid var(--gilt-dim);
629
+ color: #b09a72; font-family: var(--bars); letter-spacing: .12em; font-size: .78rem;
630
+ }
631
+
632
+ @media (max-width: 720px) {
633
+ .frame { padding: 1rem .9rem 2.5rem; }
634
+ .masthead { padding: .9rem 1rem .7rem; }
635
+ .brand h1 { font-size: 2.2rem; }
636
+ .codex { padding: 1.3rem 1rem 1.2rem 1.6rem; }
637
+ .codex::before { left: 34px; }
638
+ .vline-text { font-size: 1.22rem; }
639
+ .vline-chips { flex-wrap: wrap; }
640
+ .lab { margin-left: .5rem; }
641
+ }
642
+
643
+ @media (prefers-reduced-motion: reduce) {
644
+ *, *::before, *::after { animation: none !important; transition: none !important; }
645
+ }
646
+
647
+ /* ═══ legibility raises for small italics ═══ */
648
+ .tooltip .tip-sub { font-size: .95rem; font-weight: 600; }
649
+ .tooltip .tip-hint { font-size: .88rem; font-weight: 600; }
650
+ .lab h4 .whisper { font-size: .98rem; }
651
+ .verdict-note { font-size: 1.08rem; font-weight: 600; }
652
+ .dossier-oov { font-size: 1rem; font-weight: 600; }
653
+ .rhyme-rel .rtype { font-size: .9rem; font-weight: 600; }
654
+ .synopsis-row .lab-v { font-size: 1rem; }
655
+ .mono-inline { font-family: var(--mono); font-size: .85em; background: rgba(201,162,39,.18); padding: 0 .3em; }
656
+
657
+ /* ═══ mode tabs ═══ */
658
+ .mode-tabs {
659
+ display: flex; gap: .5rem; padding: .9rem 2.2rem 0; max-width: 1480px; margin: 0 auto;
660
+ flex-wrap: wrap;
661
+ }
662
+ .mode-tab {
663
+ font-family: var(--bars); font-size: 1.05rem; letter-spacing: .18em;
664
+ color: #b09a72; background: rgba(235, 224, 198, .06);
665
+ border: 1px solid var(--gilt-dim); border-bottom: none;
666
+ padding: .42rem 1.4rem .26rem;
667
+ clip-path: polygon(0 0, calc(100% - 12px) 0, 100% 100%, 0 100%);
668
+ transition: background .2s, color .2s;
669
+ }
670
+ .mode-tab:hover { color: var(--bar-ink); background: rgba(193, 39, 45, .25); }
671
+ .mode-tab.is-active {
672
+ color: var(--bar-ink); background: var(--vermilion);
673
+ box-shadow: 3px 0 0 var(--black-bar);
674
+ }
675
+
676
+ /* ═══ settings popover ═══ */
677
+ .masthead-tools { position: relative; }
678
+ .settings-pop {
679
+ position: absolute; top: calc(100% + 12px); right: 0; z-index: 50; width: 340px;
680
+ background: var(--parch); color: var(--ink);
681
+ border: 1px solid var(--gilt-dim);
682
+ box-shadow: inset 0 0 0 3px var(--parch), inset 0 0 0 4px rgba(160,44,34,.5), 8px 8px 0 rgba(19,16,19,.6);
683
+ padding: 1rem 1.1rem 1.1rem;
684
+ }
685
+ .settings-pop h3 { font-family: var(--bars); font-weight: 400; letter-spacing: .2em; font-size: 1rem; color: var(--rubric); margin-bottom: .6rem; }
686
+ .set-label { font-family: var(--bars); font-size: .8rem; letter-spacing: .14em; color: var(--heliotrope); display: block; margin-bottom: .4rem; }
687
+ .set-radio { display: block; font-family: var(--serif); font-size: .98rem; color: var(--ink-soft); padding: .3rem 0; cursor: pointer; }
688
+ .set-radio b { color: var(--ink); }
689
+ .set-radio input { accent-color: var(--vermilion); margin-right: .45rem; }
690
+ .set-note { font-family: var(--serif); font-style: italic; font-weight: 600; font-size: .9rem; color: var(--sepia); margin-top: .5rem; }
691
+
692
+ /* ═══ tool panels (forge · rewrites · syntax) ═══ */
693
+ .tool-panel { max-width: 940px; margin: 1.8rem auto 0; padding: 1.8rem 2rem 1.7rem; }
694
+ .tool-panel .whisper { display: block; margin: .7rem 0 1rem; max-width: 72ch; }
695
+ .bar-title.small { font-size: .95rem; }
696
+ .analyze-btn.small { font-size: 1.05rem; padding: .4rem 1.6rem .26rem 1.1rem; }
697
+ .forge-controls, .rw-controls { display: flex; gap: 1.2rem; align-items: flex-end; flex-wrap: wrap; margin: .6rem 0 1rem; }
698
+ .tool-field { display: flex; flex-direction: column; gap: .3rem; font-family: var(--bars); font-size: .8rem; letter-spacing: .12em; color: var(--rubric); }
699
+ .tool-field input[type="text"], .tool-field select {
700
+ background: rgba(255, 251, 240, .7); color: var(--ink); border: 1px solid var(--gilt-dim);
701
+ font-family: var(--serif); font-size: 1.1rem; padding: .4rem .6rem; min-width: 180px;
702
+ box-shadow: inset 0 2px 6px rgba(122, 106, 78, .25); outline: none;
703
+ }
704
+ .tool-field input:focus { border-color: var(--rubric); }
705
+ .tool-field.slider { min-width: 220px; }
706
+ .tool-field.slider b { color: var(--ink); font-family: var(--mono); }
707
+ .tool-field input[type="range"] { accent-color: var(--vermilion); }
708
+ .rw-fuzzy-field { flex-direction: row; align-items: center; gap: .5rem; padding-bottom: .35rem; cursor: pointer; }
709
+ .rw-fuzzy-field input[type="checkbox"] { accent-color: var(--vermilion); width: 1rem; height: 1rem; cursor: pointer; }
710
+ .slider-hints { display: flex; justify-content: space-between; font-family: var(--serif); font-style: italic; font-size: .78rem; letter-spacing: 0; color: var(--sepia); }
711
+ #rw-input, #syn-input {
712
+ width: 100%; min-height: 130px; resize: vertical;
713
+ background: rgba(255, 251, 240, .6); color: var(--ink);
714
+ border: 1px solid var(--gilt-dim); outline: none;
715
+ box-shadow: inset 0 2px 8px rgba(122, 106, 78, .25);
716
+ font-family: var(--serif); font-size: 1.15rem; line-height: 1.6; padding: .9rem 1rem;
717
+ }
718
+ .tool-out { min-height: 1rem; }
719
+ .tool-out .word-cloud { display: flex; flex-wrap: wrap; gap: .35rem; margin: .5rem 0; }
720
+ .tool-out .word-cloud .rc {
721
+ font-family: var(--serif); font-size: 1.05rem; border: 1px solid var(--gilt-dim);
722
+ padding: .06rem .55rem; background: rgba(255,251,240,.65); cursor: pointer;
723
+ transition: background .15s;
724
+ }
725
+ .tool-out .word-cloud .rc:hover { background: rgba(201, 162, 39, .3); }
726
+ .tool-out .tool-note { font-family: var(--serif); font-style: italic; font-weight: 600; color: var(--sepia); font-size: .95rem; }
727
+ .rw-out .rw-result {
728
+ font-family: var(--serif); font-size: 1.3rem; line-height: 1.6; white-space: pre-wrap;
729
+ border-left: 4px solid var(--heliotrope); background: rgba(255,251,240,.55);
730
+ padding: .8rem 1.1rem; margin-top: .6rem;
731
+ }
732
+ .syn-line { margin-bottom: 1.6rem; }
733
+ .syn-line .syn-raw { font-family: var(--serif); font-size: 1.3rem; font-weight: 600; margin: .6rem 0 .4rem; }
734
+ table.syn-table { border-collapse: collapse; font-size: .85rem; background: rgba(255,251,240,.5); margin-top: .5rem; }
735
+ .syn-table th {
736
+ font-family: var(--bars); font-weight: 400; letter-spacing: .12em; font-size: .78rem;
737
+ color: var(--rubric); border: 1px solid rgba(138,106,42,.5); padding: .3rem .6rem;
738
+ }
739
+ .syn-table td { border: 1px solid rgba(138,106,42,.5); padding: .3rem .6rem; font-family: var(--mono); font-size: .78rem; color: var(--ink-soft); }
740
+ .syn-table td.w { font-family: var(--serif); font-size: 1.02rem; font-weight: 600; color: var(--ink); }
741
+ .syn-table td .feat-chip { font-size: .78rem; margin: 0 .15rem .15rem 0; display: inline-block; }
742
+ .syn-table abbr { text-decoration: underline dotted; cursor: help; }
743
+
744
+ /* ═══ colophon rework ═══ */
745
+ .colophon { align-items: center; }
746
+ .colo-left { display: flex; flex-direction: column; gap: .28rem; }
747
+ .colo-title { font-family: var(--bars); letter-spacing: .12em; font-size: .82rem; color: #c2ab85; }
748
+ .colo-fine { font-family: var(--serif); font-style: italic; font-weight: 600; font-size: .92rem; letter-spacing: .01em; color: #b09a72; }
749
+ .colophon a { color: #e0be62; text-decoration: none; border-bottom: 1px dotted #8a6a2a; }
750
+ .colophon a:hover { color: #f5d87e; }
751
+ .colo-links { display: flex; gap: .9rem; align-items: center; }
752
+ .colo-links img { height: 34px; width: auto; display: block; filter: sepia(.3) brightness(1.05); transition: transform .15s, filter .15s; }
753
+ .colo-links a:hover img { transform: translateY(-2px) rotate(-2deg); filter: none; }
754
+ .colo-links a { border-bottom: none; }
755
+
756
+ /* ═══ file:// warning banner ═══ */
757
+ .file-warning {
758
+ position: fixed; left: 50%; top: 18%; transform: translateX(-50%) rotate(-1deg); z-index: 95;
759
+ max-width: 560px; background: var(--parch); color: var(--ink);
760
+ border: 1px solid var(--gilt-dim);
761
+ box-shadow: inset 0 0 0 3px var(--parch), inset 0 0 0 4px rgba(160,44,34,.6), 8px 8px 0 rgba(19,16,19,.7);
762
+ font-family: var(--serif); font-size: 1.05rem; line-height: 1.55;
763
+ padding: 1.1rem 1.4rem;
764
+ }
765
+ .file-warning b { color: var(--rubric); }
766
+ .file-warning code { font-family: var(--mono); background: rgba(201,162,39,.25); padding: 0 .35em; font-size: .9em; }
767
+ .file-warning a { color: var(--heliotrope); font-weight: 600; }
768
+
769
+ /* ═══ enriched tooltip additions ═══ */
770
+ .tip-nounsing { margin-top: .45rem; border-top: 1px dashed var(--gilt-dim); padding-top: .4rem; }
771
+ .tip-nounsing .tn-line { font-family: var(--serif); font-size: .92rem; color: var(--ink-soft); padding: .06rem 0; }
772
+ .tip-nounsing .tn-line b { color: var(--heliotrope); font-weight: 700; }
773
+ .tip-nounsing .tn-line .mono { font-family: var(--mono); font-size: .74rem; }
774
+ .tip-role { display: inline-block; font-family: var(--bars); font-size: .72rem; letter-spacing: .1em; border: 1px solid; padding: .06rem .4rem 0; margin: 0 .25rem .2rem 0; }
775
+ .tip-sylcard { margin-top: .4rem; border: 1px solid var(--gilt-dim); background: rgba(255,251,240,.6); padding: .45rem .6rem; }
776
+ .tip-sylcard .tsc-head { font-family: var(--bars); letter-spacing: .14em; font-size: .8rem; color: var(--rubric); margin-bottom: .2rem; }
777
+ .tip-sylcard .tsc-row { font-family: var(--serif); font-size: .9rem; color: var(--ink-soft); }
778
+ .tip-sylcard .tsc-row b { font-family: var(--mono); font-size: .8rem; color: var(--ink); }
779
+
780
+ /* ═══ round 4 — legibility & polish per the marked-up screenshots ═══ */
781
+
782
+ /* justified prose blocks — no more orphans and ragged line-lengths */
783
+ .whisper, .legend-body p, .legend-item, .verdict-note, .tool-note, .set-radio,
784
+ .manifesto p, .tip-hint, .file-warning, .insp-text, .dossier-oov {
785
+ text-align: justify; text-justify: inter-word;
786
+ hyphens: manual; text-wrap: pretty; /* no mid-word splits */
787
+ }
788
+ .colo-fine { text-wrap: pretty; }
789
+ .whisper { font-size: 1.15rem; }
790
+
791
+ /* headings & titles, a notch up */
792
+ .bar-title { font-size: 1.3rem; }
793
+ .bar-title.small { font-size: 1.1rem; }
794
+ .brand-sub { font-size: .95rem; }
795
+ .ghost-btn { font-size: .92rem; }
796
+ .mode-tab { font-size: 1.12rem; }
797
+ .lab h4 { font-size: 1.12rem; }
798
+ .legend-body h3 { font-size: 1.15rem; }
799
+ .legend-body p { font-size: 1.12rem; }
800
+ .rail-title { font-size: 1.12rem; }
801
+ .dossier-title { font-size: 1rem; }
802
+ .insp-label { font-size: .95rem; letter-spacing: .16em; }
803
+ .phono-label { font-size: .92rem; }
804
+ .synopsis-row { grid-template-columns: 122px 1fr; font-size: 1.02rem; }
805
+ .synopsis-row .lab-l { font-size: .92rem; }
806
+ .synopsis-row .lab-v { font-size: 1.05rem; }
807
+ .synopsis-row .lab-v .pct { font-size: .92rem; }
808
+ .rhyme-rel .rmeta { font-size: .74rem; }
809
+ .rhyme-rel { font-size: 1.02rem; }
810
+
811
+ /* the key: wider cells so each entry settles into ~2 even lines */
812
+ .legend-grid { grid-template-columns: repeat(auto-fill, minmax(360px, 1fr)); gap: .7rem 2rem; }
813
+ .legend-item { font-size: 1.08rem; }
814
+ .legend-item .li-eg { font-size: 1rem; }
815
+ .legend-item .li-name { color: var(--ink); }
816
+
817
+ /* the mono data registers — formerly “way too small” */
818
+ .dossier-row { font-size: 1rem; grid-template-columns: 128px 1fr; }
819
+ .dossier-row .dr-k { font-size: .88rem; }
820
+ .dossier-row .dr-v { font-size: .95rem; color: var(--ink); }
821
+ .dossier-row .dr-v .serif { font-size: 1.05rem; }
822
+ .dossier-row:nth-child(4n+1) .dr-k { color: var(--heliotrope); }
823
+ .dossier-row:nth-child(4n+2) .dr-k { color: var(--viridian); }
824
+ .dossier-row:nth-child(4n+3) .dr-k { color: var(--blue); }
825
+ .dossier-row:nth-child(4n) .dr-k { color: var(--madder); }
826
+ .dossier-foot .df-pattern { font-size: .95rem; }
827
+ .inset-row .if-name { font-size: .92rem; }
828
+ .inset-row .if-syls { font-size: .9rem; color: var(--ink); }
829
+ .rhyme-cloud .rc { font-size: 1.05rem; }
830
+ .tool-note { font-size: 1.1rem; }
831
+ .tool-field { font-size: .95rem; }
832
+ .slider-hints { font-size: .9rem; }
833
+ .mono-inline { font-size: .95em; }
834
+
835
+ /* verdict chips & the laboratory button — no longer missable */
836
+ .meter-chip { font-size: 1rem; padding: .16rem .65rem .06rem; }
837
+ .fit-pct { font-size: .74rem; }
838
+ .rhyme-chip { font-size: .82rem; }
839
+ .lab-caret {
840
+ font-family: var(--bars); font-size: .85rem; letter-spacing: .1em;
841
+ color: var(--bar-ink); background: linear-gradient(100deg, var(--vermilion), var(--oxblood));
842
+ padding: .14rem .55rem .04rem; clip-path: polygon(0 0, 100% 0, calc(100% - 8px) 100%, 0 100%);
843
+ box-shadow: 2px 2px 0 rgba(19, 16, 19, .4);
844
+ }
845
+ .vline.is-open .lab-caret { transform: none; background: var(--black-bar); color: var(--gilt); }
846
+
847
+ /* laboratory registers */
848
+ table.matrix { font-size: .9rem; }
849
+ .matrix th.rowlab { font-size: .85rem; }
850
+ .matrix td.phones { font-size: .76rem; }
851
+ .scandroid-rows { font-size: .94rem; }
852
+ .verdict-meter .foot-ct { font-size: .95rem; }
853
+ .fit-label { font-size: .85rem; }
854
+ .rank-name { font-size: 1.05rem; }
855
+ .rank-score { font-size: .8rem; }
856
+ .ks-chip { font-size: .85rem; }
857
+ .ks-chip .kst { font-size: .9rem; }
858
+ .unit-tag { font-size: .8rem; }
859
+ .hier-tree { font-size: 1rem; }
860
+
861
+ /* tooltip & inspector */
862
+ .tooltip { font-size: .95rem; max-width: 420px; }
863
+ .tooltip .tip-k { font-size: .8rem; min-width: 92px; }
864
+ .tooltip .tip-v { font-size: .98rem; }
865
+ .tooltip .tip-v .mono { font-size: .82rem; }
866
+ .tooltip .tip-syl .p { font-size: .7rem; }
867
+ .tip-nounsing .tn-line { font-size: 1rem; }
868
+ .tip-nounsing .tn-line .mono { font-size: .82rem; }
869
+ .tip-role { font-size: .8rem; }
870
+ .tip-sylcard .tsc-head { font-size: .88rem; }
871
+ .tip-sylcard .tsc-row { font-size: .98rem; }
872
+ .tip-sylcard .tsc-row b { font-size: .88rem; }
873
+ .badge { font-size: .82rem; }
874
+ .feat-chip { font-size: .95rem; }
875
+ table.syl-mini { font-size: .85rem; }
876
+ .syl-mini th { font-size: .78rem; }
877
+ .insp-text { font-size: 1.05rem; }
878
+ .insp-text .mono { font-size: .82rem; }
879
+
880
+ /* syntax register */
881
+ table.syn-table { font-size: .95rem; }
882
+ .syn-table th { font-size: .88rem; }
883
+ .syn-table td { font-size: .9rem; }
884
+ .syn-table td .feat-chip { font-size: .86rem; }
885
+ .syn-line { overflow-x: auto; }
886
+
887
+ /* codex fine print & controls */
888
+ .stanza-no { font-size: .9rem; }
889
+ .form-note { font-size: 1.05rem; }
890
+ .vline-no { font-size: .78rem; }
891
+ .toggle-label, .check-label { font-size: .92rem; }
892
+ .check-label.on-parch { color: var(--ink-soft); font-size: .98rem; }
893
+ .sample-picker { font-size: 1.02rem; }
894
+ select { font-size: 1rem; }
895
+ .set-label { font-size: .9rem; }
896
+ .set-radio { font-size: 1.05rem; }
897
+ .settings-pop { z-index: 130; width: 380px; }
898
+ .engine-opt { font-size: .9rem; }
899
+
900
+ /* colophon */
901
+ .colo-title { font-size: .9rem; }
902
+ .colo-fine { font-size: 1rem; }
903
+ .colophon { font-size: .85rem; }
904
+
905
+ /* darker functional tints — were too faint on parchment */
906
+ .tint-class .word.is-function .chunk { color: #6f5e3c; }
907
+ .tint-lex .chunk.l-0 { color: #46588f; }
908
+
909
+ /* ═══ round 5 — the terminal instrument (CLI clarity) + structural fixes ═══ */
910
+
911
+ /* dotted leader fills the gap between verse and its tags */
912
+ .vline-text { flex: 0 1 auto; }
913
+ .vline-lead {
914
+ flex: 1 1 1.5rem; min-width: 1.2rem; height: .82em; align-self: baseline;
915
+ border-bottom: 1px dotted rgba(147, 144, 127, .5); margin: 0 .7rem 0 .55rem;
916
+ }
917
+
918
+ /* tag boxes align into true columns */
919
+ .vline-chips { gap: .45rem; }
920
+ .meter-chip { width: 240px; }
921
+ .meter-chip .fit-pct:last-of-type { margin-left: auto; }
922
+ .rhyme-cluster { display: inline-flex; gap: .3rem; min-width: 2.5em; justify-content: center; }
923
+ .note-cluster { display: inline-flex; gap: .25rem; min-width: 1.1em; }
924
+
925
+ /* the scan button — sober, no wedge */
926
+ .lab-caret {
927
+ font-family: var(--bars); font-size: .85rem; letter-spacing: .12em;
928
+ color: var(--gilt); background: var(--black-bar);
929
+ border: 1px solid var(--gilt-dim);
930
+ padding: .12rem .5rem .02rem; clip-path: none; box-shadow: none;
931
+ }
932
+ .vline.is-open .lab-caret { transform: none; background: var(--gilt); color: var(--black-bar); }
933
+
934
+ /* rhyme-scheme strings never overflow their card */
935
+ .scheme-letters { font-family: var(--mono); letter-spacing: .14em; font-size: .95rem; overflow-wrap: anywhere; min-width: 0; }
936
+ .synopsis-row .lab-v { min-width: 0; overflow-wrap: anywhere; }
937
+
938
+ /* dependency arcs: clear air above the words, haloed labels */
939
+ .dep-words { padding-top: .4rem; }
940
+ .dep-arc { stroke-width: 1.5; }
941
+ .dep-arc-label { paint-order: stroke; stroke: var(--parch); stroke-width: 3.5px; font-size: 10.5px; }
942
+
943
+ /* ── the terminal theme itself ── */
944
+ body.theme-terminal {
945
+ --serif: "IBM Plex Mono", ui-monospace, Menlo, monospace;
946
+ --parch: #121315;
947
+ --parch-2: #1b1c1f;
948
+ --parch-3: #27282c;
949
+ --ink: #e9e6dd;
950
+ --ink-soft: #cac6ba;
951
+ --sepia: #94917f;
952
+ --rubric: #ff6b5e;
953
+ --madder: #ff6b5e;
954
+ --viridian: #3fd07f; --viridian-hi: #5ee69a;
955
+ --heliotrope: #b39df1; --heliotrope-hi: #cabbf7;
956
+ --blue: #57a7ff; --rose: #ff85c0; --teal: #3ecfe0; --amber: #f0a848;
957
+ --tier-x: #9a9a9a;
958
+ --tier-w: #56c7e8;
959
+ --tier-n: #46d17e;
960
+ --tier-m: #f5a63c;
961
+ --tier-s: #ff4b3e;
962
+ --gilt-dim: #6e6236;
963
+ }
964
+ body.theme-terminal .panel {
965
+ background: var(--parch);
966
+ border-color: #36373c;
967
+ box-shadow: 0 0 0 1px #000, 0 24px 50px -30px #000;
968
+ }
969
+ body.theme-terminal .corner { display: none; }
970
+ body.theme-terminal .codex::before { border-left-color: #313237; }
971
+ body.theme-terminal .lab { background: #17181b; box-shadow: none; }
972
+ body.theme-terminal .fitbar { background: #27282c; }
973
+
974
+ /* mono verse metrics — tight, CLI-flat */
975
+ body.theme-terminal .vline-text { font-size: 1.04rem; font-weight: 500; line-height: 1.85; }
976
+ body.theme-terminal .vline { padding: .05rem .4rem .05rem 0; }
977
+ body.theme-terminal .tint-rel .chunk.t-s { font-weight: 700; }
978
+ body.theme-terminal .tint-lex .chunk.l-0 { color: #9a9a9a; }
979
+ body.theme-terminal .tint-lex .chunk.l-1 { color: #56c7e8; }
980
+ body.theme-terminal .tint-lex .chunk.l-2 { color: #f5a63c; }
981
+ body.theme-terminal .tint-lex .chunk.l-3 { color: #ff4b3e; font-weight: 700; }
982
+ body.theme-terminal .tint-class .word.is-function .chunk { color: #9a9a9a; }
983
+ body.theme-terminal .tint-class .word.is-content .chunk { color: var(--ink); }
984
+
985
+ /* mono is wide — rein in the display sizes; kill italics (terminals have none) */
986
+ body.theme-terminal .whisper, body.theme-terminal .verdict-note, body.theme-terminal .tool-note,
987
+ body.theme-terminal .form-note, body.theme-terminal .set-radio, body.theme-terminal .dossier-oov,
988
+ body.theme-terminal .rhyme-rel .rtype, body.theme-terminal .legend-item .li-eg,
989
+ body.theme-terminal .sample-picker, body.theme-terminal .slider-hints,
990
+ body.theme-terminal #poem-input::placeholder { font-style: normal; }
991
+ body.theme-terminal .whisper { font-size: .95rem; }
992
+ body.theme-terminal .legend-body p { font-size: .98rem; }
993
+ body.theme-terminal .legend-item { font-size: .95rem; }
994
+ body.theme-terminal .manifesto p:nth-of-type(1) { font-size: 1rem; }
995
+ body.theme-terminal .inspector-word h4,
996
+ body.theme-terminal .tooltip .tip-title { font-style: normal; font-size: 1.2rem; }
997
+ body.theme-terminal .bracketing { font-size: 1rem; line-height: 2; }
998
+ body.theme-terminal #poem-input, body.theme-terminal #rw-input, body.theme-terminal #syn-input { font-size: .98rem; }
999
+ body.theme-terminal .rw-out .rw-result { font-size: 1.02rem; }
1000
+ body.theme-terminal .syn-line .syn-raw { font-size: 1.05rem; }
1001
+ body.theme-terminal .foot-syl .fs-text, body.theme-terminal .dep-word .dw-text,
1002
+ body.theme-terminal .matrix td.syltext, body.theme-terminal .matrix .wordhead { font-size: .95rem; }
1003
+ body.theme-terminal .synopsis-row .lab-v { font-size: .95rem; }
1004
+ body.theme-terminal .rhyme-rel { font-size: .92rem; }
1005
+
1006
+ /* dark surfaces for the sub-components */
1007
+ body.theme-terminal :is(.meter-chip, table.matrix, .foot-cell, .ks-chip, .rhyme-chip, .badge,
1008
+ .feat-chip, .tooltip .tip-syl, .tip-sylcard, .rhyme-cloud .rc, .tool-out .word-cloud .rc,
1009
+ .rw-out .rw-result, table.syn-table, #poem-input, #rw-input, #syn-input,
1010
+ .tool-field input[type="text"], .tool-field select, select) {
1011
+ background: #1b1c1f; border-color: #3c3d42; box-shadow: none; color: var(--ink-soft);
1012
+ }
1013
+ body.theme-terminal .matrix th, body.theme-terminal .matrix td,
1014
+ body.theme-terminal .syn-table th, body.theme-terminal .syn-table td { border-color: #3c3d42; }
1015
+ body.theme-terminal .tooltip, body.theme-terminal .settings-pop, body.theme-terminal .file-warning {
1016
+ border-color: #46474d;
1017
+ box-shadow: 0 0 0 1px #000, 7px 7px 0 rgba(0, 0, 0, .65);
1018
+ }
1019
+ body.theme-terminal .dep-arc-label { stroke: #121315; }
1020
+ body.theme-terminal ::selection { background: rgba(86, 199, 232, .35); }
1021
+
1022
+ /* ═══ round 6 — the type case, the cycling sigil, the butterflies ═══ */
1023
+
1024
+ /* captions: Murena, brighter, everywhere the voice explains itself */
1025
+ .whisper { font-family: var(--caption); color: var(--ink-soft); font-size: 1.05rem; font-weight: 400; }
1026
+ .whisper.dark { color: #d3c3a2; }
1027
+ body.theme-terminal .whisper { font-family: var(--caption); font-size: 1rem; color: #c6c2b4; }
1028
+ .verdict-note, .tool-note, .dossier-oov, .set-note, .slider-hints, .legend-item .li-eg { font-family: var(--caption); }
1029
+ body.theme-terminal .set-radio { font-family: var(--caption); }
1030
+ .colo-fine { font-family: var(--caption); color: #c2ab85; }
1031
+
1032
+ /* small controls: Neueral, not Bebas */
1033
+ .ghost-btn, .engine-opt, .toggle-label, .check-label, .set-label, .tool-field,
1034
+ .analyze-btn.small, .sample-picker, .stanza-no { font-family: var(--ui); font-weight: 700; }
1035
+ .ghost-btn { font-size: .8rem; letter-spacing: .09em; }
1036
+ .toggle-label, .check-label { font-size: .8rem; letter-spacing: .06em; }
1037
+ .tool-field { font-size: .82rem; letter-spacing: .07em; }
1038
+ .analyze-btn.small { font-size: .92rem; letter-spacing: .1em; }
1039
+ .sample-picker { font-style: normal; font-size: .85rem; font-weight: 400; }
1040
+ .stanza-no { font-size: .78rem; letter-spacing: .14em; }
1041
+ .check-label .cl-desc { font-family: var(--caption); font-weight: 400; font-size: .95em; opacity: .85; letter-spacing: 0; }
1042
+
1043
+ /* unselected tabs & switches: brighter */
1044
+ .mode-tab { color: #d9c9a4; }
1045
+ .engine-opt { color: #cbb27e; }
1046
+
1047
+ /* per-instrument title faces — context aligned with style */
1048
+ #mode-scansion .bar-title { font-family: 'Popelka', var(--serif); font-size: 1.6rem; letter-spacing: .04em; padding: .1rem 1rem .18rem; }
1049
+ #mode-forge .bar-title { font-family: 'Myra 4F Caps', var(--bars); font-size: 1.35rem; letter-spacing: .12em; }
1050
+ #mode-rewrites .bar-title { font-family: 'Wicky Javick', var(--bars); font-size: 1.4rem; letter-spacing: .04em; }
1051
+ #mode-syntax .bar-title { font-family: 'Midcase', var(--bars); font-size: 1.4rem; letter-spacing: .06em; }
1052
+ .rail-title { font-family: 'Sinkin Sans', var(--ui); font-size: .88rem; letter-spacing: .18em; padding: .28rem .8rem .22rem; }
1053
+ .dossier-title { font-family: 'Sinkin Sans', var(--ui); font-size: .82rem; letter-spacing: .14em; padding: .26rem .7rem .2rem; }
1054
+ .legend-body h3 { font-family: 'Vremena Grotesk', var(--bars); font-weight: 700; font-size: 1.05rem; letter-spacing: .2em; text-transform: uppercase; }
1055
+
1056
+ /* tighter approach to the main panel */
1057
+ .mode-tabs { padding: .55rem 2.2rem 0; }
1058
+ .frame { padding: .8rem 2rem 2.6rem; }
1059
+ .scriptorium, .tool-panel { margin-top: .8rem; }
1060
+
1061
+ /* brighter placeholders — legible before the first keystroke */
1062
+ #poem-input::placeholder, #rw-input::placeholder, #syn-input::placeholder { color: #8f8a76; font-style: normal; }
1063
+ body.theme-terminal :is(#poem-input, #rw-input, #syn-input)::placeholder { color: #a3a091; }
1064
+
1065
+ /* ── the cycling sigil (thirteen figures, no two alike) ───── */
1066
+ .brand-sigil {
1067
+ width: 62px; height: 62px; display: inline-block; position: relative;
1068
+ align-self: center; margin-right: .4rem; flex-shrink: 0;
1069
+ }
1070
+ .brand-sigil img { width: 100%; height: 100%; object-fit: contain; display: block; opacity: 1; transition: opacity .45s ease; }
1071
+ .brand-sigil.disc::before {
1072
+ content: ""; position: absolute; inset: -3px; border-radius: 50%;
1073
+ background: radial-gradient(circle, #efe6cd 0 61%, transparent 62%);
1074
+ }
1075
+ .brand-sigil.disc img { position: relative; }
1076
+ @keyframes sg-spin { to { transform: rotate(360deg); } }
1077
+ @keyframes sg-spin-rev { to { transform: rotate(-360deg); } }
1078
+ @keyframes sg-vortex { 0% { transform: rotate(0) scale(1); } 50% { transform: rotate(180deg) scale(.84); } 100% { transform: rotate(360deg) scale(1); } }
1079
+ @keyframes sg-breathe { 0%, 100% { transform: scale(.92); } 50% { transform: scale(1.06); } }
1080
+ @keyframes sg-sway { 0%, 100% { transform: rotate(-9deg); } 50% { transform: rotate(9deg); } }
1081
+ .sg-spin img { animation: sg-spin 24s linear infinite; }
1082
+ .sg-spin-slow img { animation: sg-spin 48s linear infinite; }
1083
+ .sg-spin-rev img { animation: sg-spin-rev 32s linear infinite; }
1084
+ .sg-vortex img { animation: sg-vortex 12s linear infinite; }
1085
+ .sg-breathe img { animation: sg-breathe 5.5s ease-in-out infinite; }
1086
+ .sg-sway img { animation: sg-sway 7s ease-in-out infinite; }
1087
+
1088
+ /* the wordmark shifts its dress with the sigil */
1089
+ #brand-word.bw-popelka { font-family: 'Popelka', var(--serif); letter-spacing: .05em; text-shadow: 3px 3px 0 var(--gilt-dim); }
1090
+ #brand-word.bw-myra { font-family: 'Myra 4F Caps', var(--bars); text-shadow: 3px 3px 0 #431f2c; color: #e8c95a; }
1091
+ #brand-word.bw-wicky { font-family: 'Wicky Javick', var(--bars); letter-spacing: .03em; text-shadow: 2px 2px 0 var(--vermilion); }
1092
+ #brand-word.bw-midcase { font-family: 'Midcase', var(--bars); letter-spacing: .06em; color: #e6e2d6; text-shadow: none; }
1093
+ #brand-word.bw-vremena { font-family: 'Vremena Grotesk', var(--bars); font-weight: 700; letter-spacing: .1em; text-shadow: 3px 3px 0 var(--oxblood); }
1094
+
1095
+ /* ── butterflies: two per instrument, drifting behind the panels ── */
1096
+ .mode { position: relative; }
1097
+ .bfly {
1098
+ position: absolute; z-index: 0; pointer-events: none; user-select: none;
1099
+ font-family: 'Butterflies'; color: var(--gilt); opacity: .09;
1100
+ font-size: 8.5rem; line-height: 1;
1101
+ animation: bfly-float 14s ease-in-out infinite;
1102
+ }
1103
+ .bfly.b2 { font-size: 6rem; animation-duration: 19s; animation-delay: -7s; }
1104
+ @keyframes bfly-float {
1105
+ 0%, 100% { transform: translateY(0) rotate(-7deg); }
1106
+ 50% { transform: translateY(-30px) rotate(6deg); }
1107
+ }
1108
+ .bfly.flap { animation: bfly-flap .9s ease-out; }
1109
+ @keyframes bfly-flap {
1110
+ 0% { transform: scale(1); opacity: .09; }
1111
+ 35% { transform: scale(1.22) rotate(4deg); opacity: .2; }
1112
+ 70% { transform: scale(.9) rotate(-4deg); }
1113
+ 100% { transform: scale(1); opacity: .09; }
1114
+ }