@sutrata/editor 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 (337) hide show
  1. package/LICENSE +674 -0
  2. package/dist/ai/OnboardingDialog.d.ts +6 -0
  3. package/dist/ai/OnboardingDialog.js +115 -0
  4. package/dist/ai/VoiceConfirmDialog.d.ts +9 -0
  5. package/dist/ai/VoiceConfirmDialog.js +37 -0
  6. package/dist/ai/VoiceToolbar.d.ts +2 -0
  7. package/dist/ai/VoiceToolbar.js +177 -0
  8. package/dist/ai/ai-client.d.ts +71 -0
  9. package/dist/ai/ai-client.js +494 -0
  10. package/dist/ai/commands.d.ts +12 -0
  11. package/dist/ai/commands.js +140 -0
  12. package/dist/ai/generated-providers.json +3696 -0
  13. package/dist/ai/prompts.d.ts +25 -0
  14. package/dist/ai/prompts.js +59 -0
  15. package/dist/ai/voice-service.d.ts +15 -0
  16. package/dist/ai/voice-service.js +81 -0
  17. package/dist/autocomplete/AutocompletePlugin.d.ts +2 -0
  18. package/dist/autocomplete/AutocompletePlugin.js +19 -0
  19. package/dist/autocomplete/suggestions.d.ts +25 -0
  20. package/dist/autocomplete/suggestions.js +126 -0
  21. package/dist/context/DocumentContext.d.ts +68 -0
  22. package/dist/context/DocumentContext.js +605 -0
  23. package/dist/desktop-api.d.ts +40 -0
  24. package/dist/editor/EditorView.d.ts +2 -0
  25. package/dist/editor/EditorView.js +78 -0
  26. package/dist/editor/SelectionMenu.d.ts +2 -0
  27. package/dist/editor/SelectionMenu.js +102 -0
  28. package/dist/editor/attr-pencil-plugin.d.ts +17 -0
  29. package/dist/editor/attr-pencil-plugin.js +158 -0
  30. package/dist/editor/character-decoration-plugin.d.ts +26 -0
  31. package/dist/editor/character-decoration-plugin.js +77 -0
  32. package/dist/editor/character-view.d.ts +35 -0
  33. package/dist/editor/character-view.js +112 -0
  34. package/dist/editor/editor-bus.d.ts +14 -0
  35. package/dist/editor/editor-bus.js +39 -0
  36. package/dist/editor/find-highlight-plugin.d.ts +7 -0
  37. package/dist/editor/find-highlight-plugin.js +57 -0
  38. package/dist/editor/frontmatter-field-view.d.ts +10 -0
  39. package/dist/editor/frontmatter-field-view.js +48 -0
  40. package/dist/editor/frontmatter-field.d.ts +21 -0
  41. package/dist/editor/frontmatter-field.js +116 -0
  42. package/dist/editor/grapheme-cursor.d.ts +10 -0
  43. package/dist/editor/grapheme-cursor.js +104 -0
  44. package/dist/editor/ime-plugin.d.ts +18 -0
  45. package/dist/editor/ime-plugin.js +71 -0
  46. package/dist/editor/insert-helper.d.ts +1 -0
  47. package/dist/editor/insert-helper.js +42 -0
  48. package/dist/editor/keymap.d.ts +3 -0
  49. package/dist/editor/keymap.js +131 -0
  50. package/dist/editor/language-class-plugin.d.ts +7 -0
  51. package/dist/editor/language-class-plugin.js +75 -0
  52. package/dist/editor/plugins.d.ts +1 -0
  53. package/dist/editor/plugins.js +25 -0
  54. package/dist/editor/prosemirror-to-sutra.d.ts +2 -0
  55. package/dist/editor/prosemirror-to-sutra.js +208 -0
  56. package/dist/editor/scene-heading-view.d.ts +27 -0
  57. package/dist/editor/scene-heading-view.js +136 -0
  58. package/dist/editor/schema.d.ts +3 -0
  59. package/dist/editor/schema.js +135 -0
  60. package/dist/editor/sutra-to-prosemirror.d.ts +3 -0
  61. package/dist/editor/sutra-to-prosemirror.js +154 -0
  62. package/dist/editor/transliterate-input.d.ts +10 -0
  63. package/dist/editor/transliterate-input.js +88 -0
  64. package/dist/extensions/storage-adapter.d.ts +59 -0
  65. package/dist/extensions/storage-adapter.js +9 -0
  66. package/dist/extensions/types.d.ts +73 -0
  67. package/dist/extensions/types.js +12 -0
  68. package/dist/file/docx-exporter.d.ts +8 -0
  69. package/dist/file/docx-exporter.js +494 -0
  70. package/dist/file/docx-importer.d.ts +10 -0
  71. package/dist/file/docx-importer.js +283 -0
  72. package/dist/file/print-paginator.d.ts +29 -0
  73. package/dist/file/print-paginator.js +289 -0
  74. package/dist/file/templates.d.ts +2 -0
  75. package/dist/file/templates.js +66 -0
  76. package/dist/file/workflow-reports.d.ts +34 -0
  77. package/dist/file/workflow-reports.js +719 -0
  78. package/dist/findreplace/FindReplace.d.ts +2 -0
  79. package/dist/findreplace/FindReplace.js +164 -0
  80. package/dist/findreplace/find-engine.d.ts +29 -0
  81. package/dist/findreplace/find-engine.js +69 -0
  82. package/dist/findreplace/scroll-to-match.d.ts +29 -0
  83. package/dist/findreplace/scroll-to-match.js +74 -0
  84. package/dist/fonts/tofu-detect.d.ts +1 -0
  85. package/dist/fonts/tofu-detect.js +48 -0
  86. package/dist/i18n/LanguageContext.d.ts +10 -0
  87. package/dist/i18n/LanguageContext.js +174 -0
  88. package/dist/i18n/language-detect.d.ts +1 -0
  89. package/dist/i18n/language-detect.js +58 -0
  90. package/dist/i18n/useTranslation.d.ts +11 -0
  91. package/dist/i18n/useTranslation.js +60 -0
  92. package/dist/index.d.ts +11 -0
  93. package/dist/index.js +5 -0
  94. package/dist/locales/bn.json +143 -0
  95. package/dist/locales/en.json +143 -0
  96. package/dist/locales/gu.json +143 -0
  97. package/dist/locales/hi.json +143 -0
  98. package/dist/locales/kn.json +143 -0
  99. package/dist/locales/ml.json +143 -0
  100. package/dist/locales/mr.json +143 -0
  101. package/dist/locales/or.json +143 -0
  102. package/dist/locales/pa.json +143 -0
  103. package/dist/locales/si.json +143 -0
  104. package/dist/locales/ta.json +143 -0
  105. package/dist/locales/te.json +143 -0
  106. package/dist/navigator/SceneNavigator.d.ts +2 -0
  107. package/dist/navigator/SceneNavigator.js +612 -0
  108. package/dist/navigator/StatisticsDialog.d.ts +6 -0
  109. package/dist/navigator/StatisticsDialog.js +146 -0
  110. package/dist/navigator/scene-list.d.ts +16 -0
  111. package/dist/navigator/scene-list.js +70 -0
  112. package/dist/settings/SettingsDialog.d.ts +6 -0
  113. package/dist/settings/SettingsDialog.js +147 -0
  114. package/dist/shell/AppBar.d.ts +2 -0
  115. package/dist/shell/AppBar.js +34 -0
  116. package/dist/shell/AppShell.d.ts +2 -0
  117. package/dist/shell/AppShell.js +30 -0
  118. package/dist/shell/ConfirmDialog.d.ts +16 -0
  119. package/dist/shell/ConfirmDialog.js +23 -0
  120. package/dist/shell/ElementToolbar.d.ts +2 -0
  121. package/dist/shell/ElementToolbar.js +30 -0
  122. package/dist/shell/LanguageStatus.d.ts +2 -0
  123. package/dist/shell/LanguageStatus.js +65 -0
  124. package/dist/shell/StatusBar.d.ts +2 -0
  125. package/dist/shell/StatusBar.js +54 -0
  126. package/dist/shell/SutrataLogo.d.ts +8 -0
  127. package/dist/shell/SutrataLogo.js +7 -0
  128. package/dist/shell/Toast.d.ts +12 -0
  129. package/dist/shell/Toast.js +21 -0
  130. package/dist/shell/ToolbarButton.d.ts +11 -0
  131. package/dist/shell/ToolbarButton.js +4 -0
  132. package/dist/shell/VersionHistory.d.ts +12 -0
  133. package/dist/shell/VersionHistory.js +89 -0
  134. package/dist/shell/Watermark.d.ts +3 -0
  135. package/dist/shell/Watermark.js +10 -0
  136. package/dist/shell/fonts/fonts.css +1133 -0
  137. package/dist/shell/icons.d.ts +45 -0
  138. package/dist/shell/icons.js +51 -0
  139. package/dist/shell/toolbar-actions.d.ts +6 -0
  140. package/dist/shell/toolbar-actions.js +58 -0
  141. package/dist/source/SourceView.d.ts +1 -0
  142. package/dist/source/SourceView.js +106 -0
  143. package/dist/source/find-highlight-source.d.ts +14 -0
  144. package/dist/source/find-highlight-source.js +47 -0
  145. package/dist/source/sutra-lang.d.ts +2 -0
  146. package/dist/source/sutra-lang.js +97 -0
  147. package/dist/spellcheck/dictionaries.d.ts +9 -0
  148. package/dist/spellcheck/dictionaries.js +16 -0
  149. package/dist/spellcheck/hunspell.d.ts +23 -0
  150. package/dist/spellcheck/hunspell.js +94 -0
  151. package/dist/spellcheck/spellcheck-plugin.d.ts +18 -0
  152. package/dist/spellcheck/spellcheck-plugin.js +75 -0
  153. package/dist/styles/StyleDialog.d.ts +6 -0
  154. package/dist/styles/StyleDialog.js +63 -0
  155. package/dist/styles/builtin-styles.d.ts +43 -0
  156. package/dist/styles/builtin-styles.js +131 -0
  157. package/dist/styles/css-adapter.d.ts +32 -0
  158. package/dist/styles/css-adapter.js +71 -0
  159. package/dist/styles/docx-adapter.d.ts +7 -0
  160. package/dist/styles/docx-adapter.js +84 -0
  161. package/dist/styles/embed-fonts.d.ts +20 -0
  162. package/dist/styles/embed-fonts.js +81 -0
  163. package/dist/styles/pagination.d.ts +19 -0
  164. package/dist/styles/pagination.js +22 -0
  165. package/dist/styles/print-adapter.d.ts +6 -0
  166. package/dist/styles/print-adapter.js +288 -0
  167. package/dist/styles/registry.d.ts +6 -0
  168. package/dist/styles/registry.js +14 -0
  169. package/dist/styles/screenplay.css +3006 -0
  170. package/dist/styles/script-ranges.d.ts +6 -0
  171. package/dist/styles/script-ranges.js +17 -0
  172. package/dist/styles/types.d.ts +93 -0
  173. package/dist/styles/types.js +18 -0
  174. package/dist/styles/validate.d.ts +12 -0
  175. package/dist/styles/validate.js +105 -0
  176. package/dist/templates/templates.d.ts +10 -0
  177. package/dist/templates/templates.js +181 -0
  178. package/dist/titlepage/ExportDialog.d.ts +1 -0
  179. package/dist/titlepage/ExportDialog.js +152 -0
  180. package/dist/titlepage/TitlePageDialog.d.ts +6 -0
  181. package/dist/titlepage/TitlePageDialog.js +96 -0
  182. package/dist/titlepage/frontmatter-form.d.ts +56 -0
  183. package/dist/titlepage/frontmatter-form.js +245 -0
  184. package/dist/titlepage/languages.d.ts +10 -0
  185. package/dist/titlepage/languages.js +31 -0
  186. package/dist/types.d.ts +6 -0
  187. package/dist/types.js +1 -0
  188. package/package.json +47 -0
  189. package/scripts/copy-assets.mjs +16 -0
  190. package/scripts/generate-providers.mjs +127 -0
  191. package/src/ai/OnboardingDialog.tsx +390 -0
  192. package/src/ai/VoiceConfirmDialog.tsx +137 -0
  193. package/src/ai/VoiceToolbar.tsx +321 -0
  194. package/src/ai/ai-client.ts +596 -0
  195. package/src/ai/commands.ts +164 -0
  196. package/src/ai/generated-providers.json +3696 -0
  197. package/src/ai/prompts.ts +62 -0
  198. package/src/ai/voice-service.ts +96 -0
  199. package/src/autocomplete/AutocompletePlugin.ts +21 -0
  200. package/src/autocomplete/suggestions.ts +147 -0
  201. package/src/context/DocumentContext.tsx +648 -0
  202. package/src/desktop-api.d.ts +40 -0
  203. package/src/editor/EditorView.tsx +82 -0
  204. package/src/editor/SelectionMenu.tsx +152 -0
  205. package/src/editor/attr-pencil-plugin.ts +172 -0
  206. package/src/editor/character-decoration-plugin.ts +104 -0
  207. package/src/editor/editor-bus.ts +51 -0
  208. package/src/editor/find-highlight-plugin.ts +68 -0
  209. package/src/editor/frontmatter-field-view.ts +52 -0
  210. package/src/editor/frontmatter-field.ts +115 -0
  211. package/src/editor/grapheme-cursor.ts +99 -0
  212. package/src/editor/ime-plugin.ts +85 -0
  213. package/src/editor/insert-helper.ts +43 -0
  214. package/src/editor/keymap.ts +124 -0
  215. package/src/editor/language-class-plugin.ts +91 -0
  216. package/src/editor/plugins.ts +26 -0
  217. package/src/editor/prosemirror-to-sutra.ts +192 -0
  218. package/src/editor/scene-heading-view.ts +147 -0
  219. package/src/editor/schema.ts +156 -0
  220. package/src/editor/sutra-to-prosemirror.ts +156 -0
  221. package/src/extensions/storage-adapter.ts +65 -0
  222. package/src/extensions/types.ts +60 -0
  223. package/src/file/docx-exporter.ts +585 -0
  224. package/src/file/docx-importer.ts +313 -0
  225. package/src/file/print-paginator.ts +301 -0
  226. package/src/file/templates.ts +73 -0
  227. package/src/file/workflow-reports.ts +820 -0
  228. package/src/findreplace/FindReplace.tsx +242 -0
  229. package/src/findreplace/find-engine.ts +97 -0
  230. package/src/findreplace/scroll-to-match.ts +89 -0
  231. package/src/fonts/tofu-detect.ts +53 -0
  232. package/src/i18n/LanguageContext.tsx +207 -0
  233. package/src/i18n/language-detect.ts +73 -0
  234. package/src/i18n/useTranslation.tsx +74 -0
  235. package/src/index.ts +27 -0
  236. package/src/locales/bn.json +143 -0
  237. package/src/locales/en.json +143 -0
  238. package/src/locales/gu.json +143 -0
  239. package/src/locales/hi.json +143 -0
  240. package/src/locales/kn.json +143 -0
  241. package/src/locales/ml.json +143 -0
  242. package/src/locales/mr.json +143 -0
  243. package/src/locales/or.json +143 -0
  244. package/src/locales/pa.json +143 -0
  245. package/src/locales/si.json +143 -0
  246. package/src/locales/ta.json +143 -0
  247. package/src/locales/te.json +143 -0
  248. package/src/navigator/SceneNavigator.tsx +844 -0
  249. package/src/navigator/StatisticsDialog.tsx +249 -0
  250. package/src/navigator/scene-list.ts +84 -0
  251. package/src/settings/SettingsDialog.tsx +303 -0
  252. package/src/shell/AppBar.tsx +354 -0
  253. package/src/shell/AppShell.tsx +71 -0
  254. package/src/shell/ConfirmDialog.tsx +71 -0
  255. package/src/shell/ElementToolbar.tsx +175 -0
  256. package/src/shell/LanguageStatus.tsx +101 -0
  257. package/src/shell/StatusBar.tsx +135 -0
  258. package/src/shell/SutrataLogo.tsx +89 -0
  259. package/src/shell/Toast.tsx +46 -0
  260. package/src/shell/ToolbarButton.tsx +30 -0
  261. package/src/shell/VersionHistory.tsx +212 -0
  262. package/src/shell/Watermark.tsx +9 -0
  263. package/src/shell/fonts/fonts.css +1133 -0
  264. package/src/shell/icons.tsx +335 -0
  265. package/src/shell/toolbar-actions.ts +59 -0
  266. package/src/source/SourceView.tsx +111 -0
  267. package/src/source/find-highlight-source.ts +57 -0
  268. package/src/source/sutra-lang.ts +121 -0
  269. package/src/spellcheck/dictionaries.ts +21 -0
  270. package/src/spellcheck/hunspell.ts +110 -0
  271. package/src/spellcheck/spellcheck-plugin.ts +83 -0
  272. package/src/styles/StyleDialog.tsx +148 -0
  273. package/src/styles/builtin-styles.ts +139 -0
  274. package/src/styles/css-adapter.ts +76 -0
  275. package/src/styles/docx-adapter.ts +109 -0
  276. package/src/styles/embed-fonts.ts +81 -0
  277. package/src/styles/pagination.ts +27 -0
  278. package/src/styles/print-adapter.ts +288 -0
  279. package/src/styles/registry.ts +20 -0
  280. package/src/styles/screenplay.css +3006 -0
  281. package/src/styles/script-ranges.ts +17 -0
  282. package/src/styles/types.ts +104 -0
  283. package/src/styles/validate.ts +114 -0
  284. package/src/templates/templates.ts +194 -0
  285. package/src/titlepage/ExportDialog.tsx +494 -0
  286. package/src/titlepage/TitlePageDialog.tsx +312 -0
  287. package/src/titlepage/frontmatter-form.ts +280 -0
  288. package/src/titlepage/languages.ts +37 -0
  289. package/src/types.ts +7 -0
  290. package/tests/AppBar.test.tsx +35 -0
  291. package/tests/AppShell.test.tsx +22 -0
  292. package/tests/ElementToolbar.test.tsx +36 -0
  293. package/tests/LanguageStatus.test.tsx +129 -0
  294. package/tests/SelectionMenu.test.tsx +71 -0
  295. package/tests/ToolbarButton.test.tsx +24 -0
  296. package/tests/ai-onboarding.test.ts +102 -0
  297. package/tests/ai-status.test.tsx +72 -0
  298. package/tests/ai-structured.test.ts +94 -0
  299. package/tests/autocomplete/AutocompletePlugin.test.ts +20 -0
  300. package/tests/autocomplete/suggestions.test.ts +106 -0
  301. package/tests/document-context.test.tsx +565 -0
  302. package/tests/docx-importer.test.ts +160 -0
  303. package/tests/editor/character-decoration-plugin.test.ts +101 -0
  304. package/tests/editor/character-extension.test.ts +44 -0
  305. package/tests/editor/grapheme-cursor.test.ts +118 -0
  306. package/tests/editor/ime-plugin.test.ts +72 -0
  307. package/tests/editor/inline-note-bridge.test.ts +32 -0
  308. package/tests/editor/language-class-plugin.test.ts +265 -0
  309. package/tests/editor/title-page.test.ts +124 -0
  310. package/tests/embed-fonts.test.ts +17 -0
  311. package/tests/exporters.test.ts +365 -0
  312. package/tests/findreplace/FindReplace.test.tsx +391 -0
  313. package/tests/findreplace/find-engine.test.ts +86 -0
  314. package/tests/findreplace/scroll-to-match.test.ts +50 -0
  315. package/tests/fonts/tofu-detect.test.ts +122 -0
  316. package/tests/i18n/LanguageContext.test.tsx +146 -0
  317. package/tests/i18n/language-detect.test.ts +54 -0
  318. package/tests/i18n/locale-parity.test.ts +25 -0
  319. package/tests/i18n/useTranslation.test.tsx +45 -0
  320. package/tests/keymap.test.ts +18 -0
  321. package/tests/navigator/SceneNavigator.test.tsx +177 -0
  322. package/tests/navigator/StatisticsDialog.test.tsx +63 -0
  323. package/tests/navigator/scene-list.test.ts +71 -0
  324. package/tests/print-paginator.test.ts +82 -0
  325. package/tests/shell/VersionHistory.test.tsx +129 -0
  326. package/tests/spellcheck/hunspell.test.ts +82 -0
  327. package/tests/spellcheck/spellcheck-plugin.test.ts +56 -0
  328. package/tests/styles.test.ts +315 -0
  329. package/tests/templates/templates.test.ts +83 -0
  330. package/tests/titlepage/TitlePageDialog.test.tsx +90 -0
  331. package/tests/titlepage/apply-title-page.test.ts +61 -0
  332. package/tests/titlepage/frontmatter-form.test.ts +115 -0
  333. package/tests/toolbar-actions.test.ts +93 -0
  334. package/tests/voice-commands.test.ts +58 -0
  335. package/tsconfig.json +17 -0
  336. package/vitest.config.ts +11 -0
  337. package/vitest.setup.ts +65 -0
@@ -0,0 +1,3006 @@
1
+ :root {
2
+ /* UI Surface & Backgrounds */
3
+ --cs-ui-bg-app: #141413;
4
+ --cs-ui-bg-app-bar: #191917;
5
+ --cs-ui-bg-toolbar: #f3f1e9;
6
+ --cs-ui-bg-panel: #fcfbfa;
7
+ --cs-ui-bg-panel-subtle: #f4f2ea;
8
+ --cs-ui-bg-card: #ffffff;
9
+ --cs-ui-bg-editor: #ffffff;
10
+
11
+ /* Borders & Dividers */
12
+ --cs-ui-border-dark: rgba(255, 255, 255, 0.16);
13
+ --cs-ui-border-dark-subtle: rgba(255, 255, 255, 0.08);
14
+ --cs-ui-border-light: #e2e0d6;
15
+ --cs-ui-border-light-subtle: #eeece4;
16
+ --cs-ui-border-focus: #d97706;
17
+
18
+ /* Text Colors */
19
+ --cs-ui-text-dark-primary: #f5f4ee;
20
+ --cs-ui-text-dark-secondary: #a8a69d;
21
+ --cs-ui-text-dark-muted: #737168;
22
+ --cs-ui-text-light-primary: #1c1b18;
23
+ --cs-ui-text-light-secondary: #59574f;
24
+ --cs-ui-text-light-muted: #8c897f;
25
+
26
+ /* Cinema Gold / Amber Accent */
27
+ --cs-ui-accent: #c4760a;
28
+ --cs-ui-accent-hover: #a35f04;
29
+ --cs-ui-accent-subtle: #fef3c7;
30
+ --cs-ui-accent-active: #92400e;
31
+ --cs-ui-accent-badge: #d97706;
32
+ --cs-ui-accent-border: #fcd34d;
33
+
34
+ /* Screenplay note tokens */
35
+ --cs-note-bg: #fffbeb;
36
+ --cs-note-border-color: #d97706;
37
+ }
38
+
39
+ /* Base shell */
40
+ html, body, #root { height: 100%; margin: 0; padding: 0; overflow: hidden; }
41
+
42
+ /* Thin position-indicator scrollbars — Chromium/Electron only */
43
+ .cs-main::-webkit-scrollbar,
44
+ .cs-nav-list::-webkit-scrollbar { width: 4px; }
45
+ .cs-main::-webkit-scrollbar-track,
46
+ .cs-nav-list::-webkit-scrollbar-track { background: transparent; }
47
+ .cs-main::-webkit-scrollbar-thumb,
48
+ .cs-nav-list::-webkit-scrollbar-thumb { background: rgba(0,0,0,0.18); border-radius: 2px; }
49
+ .cs-main::-webkit-scrollbar-thumb:hover,
50
+ .cs-shell {
51
+ display: flex;
52
+ flex-direction: column;
53
+ height: 100vh;
54
+ height: 100dvh;
55
+ padding-top: env(safe-area-inset-top, 0);
56
+ padding-bottom: env(safe-area-inset-bottom, 0);
57
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
58
+ overflow: clip;
59
+ }
60
+ .cs-toolbar-title { font-weight: 600; }
61
+ .cs-toolbar-spacer { flex: 1; }
62
+ .cs-dirty-indicator { color: var(--cs-ui-accent, #e07b00); }
63
+ .cs-mode-btn { padding: 4px 10px; border: 1px solid #ccc; border-radius: 4px; cursor: pointer; background: #fff; }
64
+ .cs-mode-btn.active { background: #1a1a1a; color: #fff; border-color: #1a1a1a; }
65
+ .cs-main { flex: 1; overflow-y: auto; display: block; padding: 40px 16px; box-sizing: border-box; }
66
+
67
+ /* Shell body layout (navigator + editor side-by-side) */
68
+ .cs-shell-body {
69
+ display: flex;
70
+ flex: 1;
71
+ overflow: hidden;
72
+ }
73
+
74
+ .cs-editor-area {
75
+ flex: 1;
76
+ display: flex;
77
+ flex-direction: column;
78
+ overflow: hidden;
79
+ }
80
+
81
+ /* Scene Navigator panel */
82
+ .cs-navigator {
83
+ width: min(33%,400px);
84
+ min-width: 180px;
85
+ max-width: 480px;
86
+ background: #f8f8f6;
87
+ border-right: 1px solid #ddd;
88
+ display: flex;
89
+ flex-direction: column;
90
+ overflow: hidden;
91
+ flex-shrink: 0;
92
+ }
93
+
94
+ .cs-nav-count {
95
+ background: #e0e0dd;
96
+ border-radius: 10px;
97
+ padding: 1px 6px;
98
+ font-size: 10px;
99
+ color: #666;
100
+ }
101
+
102
+ /* Shared style for both section headers (Title Page + Scenes) */
103
+ .cs-nav-section-header {
104
+ display: flex;
105
+ align-items: center;
106
+ justify-content: space-between;
107
+ padding: 10px 12px 8px;
108
+ border-bottom: 1px solid #e0e0dd;
109
+ font-size: 11px;
110
+ font-weight: 600;
111
+ text-transform: uppercase;
112
+ letter-spacing: 0.6px;
113
+ color: #888;
114
+ }
115
+
116
+ /* Title Page header is also a button */
117
+ .cs-nav-frontmatter-btn {
118
+ width: 100%;
119
+ background: none;
120
+ border: none;
121
+ border-bottom: 1px solid #e0e0dd;
122
+ cursor: pointer;
123
+ text-align: left;
124
+ transition: background-color 0.1s;
125
+ }
126
+ .cs-nav-frontmatter-btn:hover { background: #eeeeed; color: #555; }
127
+
128
+ /* Scenes header sits between Title Page and scene items */
129
+ .cs-nav-scenes-header {
130
+ margin-top: 2px;
131
+ }
132
+
133
+ .cs-nav-list {
134
+ flex: 1;
135
+ overflow-y: auto;
136
+ padding: 0;
137
+ }
138
+
139
+ .cs-nav-item {
140
+ display: flex;
141
+ align-items: flex-start;
142
+ gap: 8px;
143
+ padding: 8px 12px;
144
+ cursor: pointer;
145
+ border-bottom: 1px solid transparent;
146
+ transition: background-color 0.1s;
147
+ user-select: none;
148
+ }
149
+
150
+ .cs-nav-item:hover {
151
+ background: #eeeeed;
152
+ }
153
+
154
+ .cs-nav-dragging {
155
+ opacity: 0.5;
156
+ }
157
+
158
+ .cs-nav-drop-target {
159
+ background: #e3f2fd;
160
+ border-bottom-color: #1976d2;
161
+ }
162
+
163
+ .cs-nav-scene-num {
164
+ font-size: 12px;
165
+ font-weight: 600;
166
+ color: #333;
167
+ flex-shrink: 0;
168
+ align-self: flex-start;
169
+ padding-left: 8px;
170
+ }
171
+
172
+ .cs-nav-scene-info {
173
+ flex: 1;
174
+ min-width: 0;
175
+ }
176
+
177
+ .cs-nav-heading {
178
+ font-size: 12px;
179
+ font-weight: 600;
180
+ color: #333;
181
+ white-space: nowrap;
182
+ overflow: hidden;
183
+ text-overflow: ellipsis;
184
+ }
185
+
186
+ .cs-nav-scene-synopsis {
187
+ font-size: 11px;
188
+ color: var(--cs-ui-text-light-secondary, #777);
189
+ margin-top: 2px;
190
+ line-height: 1.3;
191
+ }
192
+ .cs-nav-synopsis-placeholder {
193
+ color: var(--cs-ui-text-light-muted, #8c897f);
194
+ font-style: italic;
195
+ font-size: 11px;
196
+ cursor: pointer;
197
+ padding: 1px 2px;
198
+ }
199
+ .cs-nav-synopsis-placeholder:hover {
200
+ color: var(--cs-ui-accent, #c4760a);
201
+ }
202
+ .cs-nav-synopsis-input {
203
+ width: 100%;
204
+ box-sizing: border-box;
205
+ font-size: 11px;
206
+ padding: 2px 4px;
207
+ border: 1px solid var(--cs-ui-border-light, #e2e0d6);
208
+ border-radius: 3px;
209
+ background: #ffffff;
210
+ color: var(--cs-ui-text-light-primary, #1c1b18);
211
+ }
212
+ .cs-nav-synopsis-input:focus {
213
+ outline: none;
214
+ border-color: var(--cs-ui-accent, #c4760a);
215
+ }
216
+ .cs-nav-synopsis-row {
217
+ display: flex;
218
+ align-items: flex-start;
219
+ gap: 2px;
220
+ }
221
+ .cs-nav-synopsis-ai-btn {
222
+ flex-shrink: 0;
223
+ opacity: 0.55;
224
+ }
225
+ .cs-nav-synopsis-row:hover .cs-nav-synopsis-ai-btn {
226
+ opacity: 1;
227
+ }
228
+
229
+ .cs-nav-status {
230
+ display: inline-block;
231
+ font-size: 9px;
232
+ font-weight: 600;
233
+ text-transform: uppercase;
234
+ letter-spacing: 0.4px;
235
+ padding: 1px 4px;
236
+ border-radius: 2px;
237
+ margin-top: 3px;
238
+ background: #e8e8e5;
239
+ color: #666;
240
+ }
241
+
242
+ .cs-nav-status.cs-status-done { background: #e8f5e9; color: #388e3c; }
243
+ .cs-nav-status.cs-status-wip { background: #fff8e1; color: #f57f17; }
244
+ .cs-nav-status.cs-status-todo { background: #fce4ec; color: #c62828; }
245
+
246
+ .cs-nav-empty {
247
+ padding: 20px 12px;
248
+ font-size: 12px;
249
+ color: #aaa;
250
+ text-align: center;
251
+ line-height: 1.4;
252
+ }
253
+
254
+ /* ─── Page container ────────────────────────────────────────────────────────
255
+ .cs-editor-mount is the single page column capped at 960 px.
256
+ Percentage margins on element types scale with the column so they
257
+ degrade gracefully on narrow screens instead of overflowing.
258
+ ─────────────────────────────────────────────────────────────────────── */
259
+
260
+ /* Editor mount: fills cs-main up to 960 px, centered via auto margins */
261
+ .cs-editor-mount { width: 100%; max-width: 960px; margin: 0 auto; outline: none; }
262
+ .ProseMirror { outline: none; }
263
+
264
+ /* Source view — CodeMirror container, same column as formatted editor.
265
+ No fixed height: the editor grows to content and .cs-main scrolls it. */
266
+ .cs-source-view {
267
+ width: 100%; max-width: 960px; margin: 0 auto;
268
+ }
269
+
270
+ /* ─── Screenplay element styles ─────────────────────────────────────────────
271
+ Every value below is a CSS custom property: `styles/css-adapter.ts` sets
272
+ `--cs-<element>-<prop>` on `.cs-editor-mount` from the document's resolved
273
+ ScreenplayStyleDefinition (styles/registry.ts). Most fallbacks here are
274
+ exactly 'classic''s value, so the page renders correctly even before that
275
+ JS effect runs. `color` is the one exception — its fallback is always
276
+ `inherit`, never a hardcoded hex: a style with no color for an element
277
+ (e.g. a monochrome style) clears the property rather than setting it, so
278
+ `inherit` (not classic's color) must be what's left standing, permanently,
279
+ not just before mount. (Also: never set a custom property's value to the
280
+ literal 'inherit' from JS — that's a CSS-wide keyword that makes the
281
+ property inherit from *its own* parent, not store "inherit" for
282
+ descendants to read; see css-adapter.ts.) Margins are percentages of the
283
+ 960 px column; on narrow viewports the percentages shrink with the
284
+ column, and max(%, 8px) ensures text never butts against the edge.
285
+ ─────────────────────────────────────────────────────────────────────── */
286
+
287
+ .cs-scene-heading, .cs-action, .cs-character, .cs-parenthetical,
288
+ .cs-dialogue, .cs-transition, .cs-centered, .cs-lyrics,
289
+ .cs-scene-synopsis, .cs-scene-metadata, .cs-note, .cs-comment, .cs-section {
290
+ font-family: var(--cs-body-font-family, 'Noto Sans'), sans-serif;
291
+ box-sizing: border-box;
292
+ }
293
+
294
+ .cs-scene-heading {
295
+ font-size: var(--cs-scene-heading-font-size, 13pt);
296
+ color: var(--cs-scene-heading-color, inherit);
297
+ font-weight: var(--cs-scene-heading-font-weight, bold);
298
+ font-style: var(--cs-scene-heading-font-style, normal);
299
+ text-decoration: var(--cs-scene-heading-text-decoration, none);
300
+ margin-left: max(var(--cs-scene-heading-margin-left, 10%), 8px);
301
+ margin-right: max(var(--cs-scene-heading-margin-right, 8%), 8px);
302
+ text-transform: uppercase;
303
+ margin-top: var(--cs-scene-heading-margin-top, 1em);
304
+ display: flex;
305
+ align-items: baseline;
306
+ gap: 0.75em;
307
+ }
308
+
309
+ .cs-scene-heading-text {
310
+ flex: 1;
311
+ min-width: 0;
312
+ }
313
+
314
+ .cs-scene-id-input {
315
+ flex-shrink: 0;
316
+ width: 4em;
317
+ min-width: 2em;
318
+ max-width: 8em;
319
+ border: none;
320
+ border-bottom: 1px solid transparent;
321
+ background: transparent;
322
+ font: inherit;
323
+ font-weight: bold;
324
+ text-transform: none;
325
+ text-align: right;
326
+ color: inherit;
327
+ opacity: 0.45;
328
+ padding: 0;
329
+ outline: none;
330
+ cursor: default;
331
+ }
332
+
333
+ .cs-scene-id-input::placeholder {
334
+ opacity: 0.25;
335
+ font-weight: normal;
336
+ text-transform: none;
337
+ font-size: 0.75em;
338
+ }
339
+
340
+ .cs-scene-id-input:focus {
341
+ opacity: 1;
342
+ border-bottom-color: currentColor;
343
+ cursor: text;
344
+ width: auto;
345
+ min-width: 3em;
346
+ }
347
+
348
+ .cs-action {
349
+ font-size: var(--cs-action-font-size, 12pt);
350
+ color: var(--cs-action-color, inherit);
351
+ font-weight: var(--cs-action-font-weight, normal);
352
+ font-style: var(--cs-action-font-style, normal);
353
+ text-decoration: var(--cs-action-text-decoration, none);
354
+ text-align: var(--cs-action-text-align, left);
355
+ margin-left: max(var(--cs-action-margin-left, 10%), 8px);
356
+ margin-right: max(var(--cs-action-margin-right, 8%), 8px);
357
+ margin-top: var(--cs-action-margin-top, 0.5em);
358
+ }
359
+
360
+ .cs-character {
361
+ font-size: var(--cs-character-font-size, 13pt);
362
+ color: var(--cs-character-color, inherit);
363
+ font-weight: var(--cs-character-font-weight, bold);
364
+ font-style: var(--cs-character-font-style, normal);
365
+ text-decoration: var(--cs-character-text-decoration, none);
366
+ margin-left: max(var(--cs-character-margin-left, 17%), 8px);
367
+ margin-top: var(--cs-character-margin-top, 0.5em);
368
+ }
369
+
370
+ /* Trailing "(V.O.)"/"(O.S.)" extension and dual-dialogue "^" marker —
371
+ detected live from the text by character-decoration-plugin.ts, not a
372
+ separate control. Styled like .cs-parenthetical: not bold, since the
373
+ character name around it is. */
374
+ .cs-character-extension {
375
+ font-weight: normal;
376
+ font-size: var(--cs-parenthetical-font-size, 13pt);
377
+ color: var(--cs-parenthetical-color, inherit);
378
+ }
379
+
380
+ .cs-character-dual-marker {
381
+ font-weight: normal;
382
+ opacity: 0.6;
383
+ }
384
+
385
+ .cs-parenthetical {
386
+ font-size: var(--cs-parenthetical-font-size, 13pt);
387
+ color: var(--cs-parenthetical-color, inherit);
388
+ margin-left: max(var(--cs-parenthetical-margin-left, 17%), 8px);
389
+ margin-right: max(var(--cs-parenthetical-margin-right, 20%), 8px);
390
+ }
391
+
392
+ /* Parens are presentational: the node stores only the inner text, so the
393
+ surrounding ( ) are painted here and stay out of selection/editing. */
394
+ .cs-parenthetical::before { content: '('; }
395
+ .cs-parenthetical::after { content: ')'; }
396
+
397
+ .cs-dialogue {
398
+ font-size: var(--cs-dialogue-font-size, 12pt);
399
+ color: var(--cs-dialogue-color, inherit);
400
+ font-weight: var(--cs-dialogue-font-weight, normal);
401
+ font-style: var(--cs-dialogue-font-style, normal);
402
+ text-decoration: var(--cs-dialogue-text-decoration, none);
403
+ margin-left: max(var(--cs-dialogue-margin-left, 17%), 8px);
404
+ margin-right: max(var(--cs-dialogue-margin-right, 17%), 8px);
405
+ }
406
+
407
+ .cs-transition {
408
+ font-size: var(--cs-transition-font-size, 13pt);
409
+ color: var(--cs-transition-color, inherit);
410
+ text-align: var(--cs-transition-text-align, right);
411
+ margin-right: max(var(--cs-transition-margin-right, 8%), 8px);
412
+ margin-top: var(--cs-transition-margin-top, 0.5em);
413
+ }
414
+
415
+ .cs-centered {
416
+ font-size: var(--cs-centered-font-size, 13pt);
417
+ color: var(--cs-centered-color, inherit);
418
+ text-align: var(--cs-centered-text-align, center);
419
+ margin-top: var(--cs-centered-margin-top, 0.5em);
420
+ }
421
+
422
+ .cs-lyrics {
423
+ font-size: var(--cs-lyrics-font-size, 13pt);
424
+ color: var(--cs-lyrics-color, inherit);
425
+ font-style: var(--cs-lyrics-font-style, italic);
426
+ text-decoration: var(--cs-lyrics-text-decoration, none);
427
+ margin-left: max(var(--cs-lyrics-margin-left, 10%), 8px);
428
+ margin-right: max(var(--cs-lyrics-margin-right, 8%), 8px);
429
+ }
430
+
431
+ .cs-scene-metadata {
432
+ font-size: 9pt;
433
+ color: #888;
434
+ margin-left: max(10%, 8px);
435
+ }
436
+
437
+ /* Synopsis renders as italic prose, visually distinct from key-value metadata */
438
+ .cs-scene-metadata[data-key="synopsis"] {
439
+ font-size: 10pt;
440
+ font-style: italic;
441
+ color: #555;
442
+ }
443
+ .cs-scene-metadata[data-key="synopsis"]::before {
444
+ display: none;
445
+ }
446
+
447
+ .cs-note {
448
+ background: var(--cs-note-bg, #fffbeb);
449
+ border-left: 2px solid var(--cs-note-border-color, #d97706);
450
+ padding: 3px 8px;
451
+ font-size: var(--cs-note-font-size, 10pt);
452
+ color: var(--cs-note-color, inherit);
453
+ margin-left: max(var(--cs-note-margin-left, 10%), 8px);
454
+ margin-right: max(var(--cs-note-margin-right, 8%), 8px);
455
+ }
456
+
457
+ /* Inline [[ ]] production note (note_mark) — embedded mid-line, so a subtle
458
+ highlight rather than the block-level .cs-note's background/border. */
459
+ .cs-inline-note {
460
+ background: var(--cs-note-bg, #fffbeb);
461
+ color: var(--cs-note-border-color, #d97706);
462
+ border-radius: 2px;
463
+ padding: 0 2px;
464
+ }
465
+
466
+ .cs-comment {
467
+ font-size: var(--cs-comment-font-size, 10pt);
468
+ color: var(--cs-comment-color, inherit);
469
+ font-style: var(--cs-comment-font-style, italic);
470
+ margin-left: max(var(--cs-comment-margin-left, 10%), 8px);
471
+ }
472
+
473
+ .cs-page-break {
474
+ border-top: 1px dashed #ccc;
475
+ margin: 1em 0;
476
+ }
477
+
478
+ /* Watermark — hidden in screen UI, only displayed in print */
479
+ .cs-watermark {
480
+ display: none;
481
+ }
482
+
483
+ @media print {
484
+ .cs-watermark {
485
+ display: block;
486
+ position: fixed;
487
+ top: 50%;
488
+ left: 50%;
489
+ transform: translate(-50%, -50%) rotate(-45deg);
490
+ z-index: -1;
491
+ font-family: var(--cs-body-font-family, 'Noto Sans'), sans-serif;
492
+ font-size: 60pt;
493
+ font-weight: 700;
494
+ color: rgba(0, 0, 0, 0.08);
495
+ white-space: nowrap;
496
+ pointer-events: none;
497
+ user-select: none;
498
+ }
499
+ }
500
+
501
+ .cs-section {
502
+ font-size: var(--cs-section-font-size, 14pt);
503
+ color: var(--cs-section-color, inherit);
504
+ font-weight: var(--cs-section-font-weight, bold);
505
+ margin-left: max(var(--cs-section-margin-left, 10%), 8px);
506
+ margin-top: var(--cs-section-margin-top, 1.5em);
507
+ text-transform: uppercase;
508
+ }
509
+
510
+ /* ─── Mobile: reduce outer padding and tighten element margins ──────────── */
511
+ @media (max-width: 640px) {
512
+ .cs-main { padding: 12px 4px; }
513
+ .cs-scene-heading { margin-left: max(2%, 4px); margin-right: max(2%, 4px); }
514
+ .cs-action { margin-left: max(2%, 4px); margin-right: max(2%, 4px); }
515
+ .cs-character { margin-left: max(22%, 4px); }
516
+ .cs-parenthetical{ margin-left: max(14%, 4px); margin-right: max(10%, 4px); }
517
+ .cs-dialogue { margin-left: max(10%, 4px); margin-right: max(10%, 4px); }
518
+ .cs-lyrics { margin-left: max(6%, 4px); margin-right: max(4%, 4px); }
519
+ .cs-note { margin-left: max(6%, 4px); margin-right: max(4%, 4px); }
520
+ .cs-scene-synopsis { margin-left: max(6%, 4px); }
521
+ .cs-scene-metadata { margin-left: max(6%, 4px); }
522
+ .cs-comment { margin-left: max(6%, 4px); }
523
+ .cs-section { margin-left: max(6%, 4px); }
524
+ }
525
+
526
+ /* Toolbar buttons + tooltip */
527
+ .cs-tb-btn { position: relative; display: inline-flex; align-items: center; justify-content: center; width: 32px; height: 28px; border: 1px solid transparent; border-radius: 4px; background: transparent; color: #3d3d38; cursor: pointer; }
528
+ .cs-tb-btn:hover { background: #fff; border-color: #d8d6cc; }
529
+ .cs-tb-active { background: #1a1a18; border-color: #1a1a18; color: #fff; }
530
+ .cs-tb-active:hover { background: #2e2e2a; border-color: #2e2e2a; }
531
+ .cs-tb-tip { pointer-events: none; position: absolute; top: calc(100% + 7px); left: 50%; transform: translateX(-50%); background: #1a1a18; color: #f0ede4; padding: 6px 10px; border: 1px solid rgba(255,255,255,0.16); border-radius: 4px; white-space: nowrap; font-size: 12px; display: flex; gap: 8px; align-items: center; opacity: 0; transition: opacity 0.15s 0.25s; z-index: 400; box-shadow: 0 4px 12px rgba(0,0,0,0.45); }
532
+ .cs-tb-btn:hover .cs-tb-tip { opacity: 1; }
533
+ .cs-tb-sigil { font-family: monospace; color: rgba(240,237,228,0.45); font-size: 11px; }
534
+ .cs-tb-key { color: rgba(240,237,228,0.55); font-size: 11px; }
535
+
536
+ .cs-element-toolbar {
537
+ position: relative;
538
+ z-index: 30;
539
+ display: flex;
540
+ align-items: center;
541
+ gap: 2px;
542
+ padding: 4px 12px;
543
+ background: #efede5;
544
+ border-bottom: 1px solid #d8d6cc;
545
+ overflow: visible;
546
+ }
547
+ .cs-tb-sep { width: 1px; height: 20px; background: #d8d6cc; margin: 0 4px; flex-shrink: 0; }
548
+ .cs-tb-overflow { display: none; align-items: center; justify-content: center; width: 30px; height: 28px; margin-left: auto; border: 1px solid #d8d6cc; border-radius: 4px; background: #fff; color: #3d3d38; cursor: pointer; }
549
+ @media (max-width: 640px) {
550
+ .cs-tb-tip { display: none; }
551
+ .cs-element-toolbar {
552
+ padding: 4px 8px;
553
+ gap: 4px;
554
+ overflow-x: auto;
555
+ overflow-y: hidden;
556
+ -webkit-overflow-scrolling: touch;
557
+ scrollbar-width: none;
558
+ }
559
+ .cs-element-toolbar::-webkit-scrollbar { display: none; }
560
+ .cs-tb-btn {
561
+ width: 36px;
562
+ height: 34px;
563
+ flex-shrink: 0;
564
+ }
565
+ .cs-tb-overflow {
566
+ display: inline-flex;
567
+ flex-shrink: 0;
568
+ position: sticky;
569
+ right: 0;
570
+ z-index: 10;
571
+ background: #efede5;
572
+ box-shadow: -4px 0 8px rgba(0, 0, 0, 0.08);
573
+ width: 34px;
574
+ height: 34px;
575
+ }
576
+ }
577
+
578
+ /* AppBar */
579
+ .cs-app-bar {
580
+ display: flex;
581
+ align-items: center;
582
+ gap: 4px;
583
+ padding: 4px 12px;
584
+ background: var(--cs-ui-bg-app-bar, #191917);
585
+ border-bottom: 1px solid rgba(0, 0, 0, 0.85);
586
+ overflow: visible;
587
+ height: 40px;
588
+ box-sizing: border-box;
589
+ }
590
+ .cs-ab-brand {
591
+ display: inline-flex;
592
+ align-items: center;
593
+ gap: 7px;
594
+ padding: 2px 8px 2px 2px;
595
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
596
+ font-weight: 700;
597
+ font-size: 11px;
598
+ letter-spacing: 1.2px;
599
+ color: var(--cs-ui-accent-badge, #d97706);
600
+ text-transform: uppercase;
601
+ user-select: none;
602
+ }
603
+ .cs-ab-brand-mark {
604
+ display: inline-flex;
605
+ align-items: center;
606
+ justify-content: center;
607
+ width: 20px;
608
+ height: 20px;
609
+ background: linear-gradient(135deg, #d97706, #92400e);
610
+ color: #ffffff;
611
+ border-radius: 4px;
612
+ font-size: 12px;
613
+ font-weight: 800;
614
+ letter-spacing: 0;
615
+ box-shadow: 0 1px 3px rgba(0,0,0,0.3);
616
+ }
617
+ .cs-ab-group {
618
+ display: inline-flex;
619
+ align-items: center;
620
+ gap: 3px;
621
+ }
622
+ .cs-ab-file-pill {
623
+ display: inline-flex;
624
+ align-items: center;
625
+ gap: 6px;
626
+ padding: 3px 10px;
627
+ background: rgba(255, 255, 255, 0.06);
628
+ border: 1px solid rgba(255, 255, 255, 0.1);
629
+ border-radius: 14px;
630
+ font-family: monospace;
631
+ font-size: 12px;
632
+ color: var(--cs-ui-text-dark-primary, #f5f4ee);
633
+ transition: all 0.15s ease;
634
+ }
635
+ .cs-ab-file-pill:hover {
636
+ background: rgba(255, 255, 255, 0.1);
637
+ border-color: rgba(255, 255, 255, 0.18);
638
+ }
639
+ .cs-ab-btn {
640
+ position: relative;
641
+ display: inline-flex;
642
+ align-items: center;
643
+ justify-content: center;
644
+ height: 28px;
645
+ min-width: 28px;
646
+ padding: 0 4px;
647
+ border: 1px solid transparent;
648
+ border-radius: 4px;
649
+ background: transparent;
650
+ color: rgba(232,229,220,0.9);
651
+ cursor: pointer;
652
+ overflow: visible;
653
+ transition: background 0.15s, border-color 0.15s;
654
+ }
655
+ .cs-ab-btn .cs-tb-tip { bottom: auto; top: calc(100% + 7px); }
656
+ .cs-ab-btn:hover .cs-tb-tip { opacity: 1; }
657
+ .cs-ab-btn:hover { background: rgba(232,229,220,0.12); border-color: rgba(232,229,220,0.18); }
658
+ .cs-ab-active { background: rgba(232,229,220,0.18); border-color: rgba(232,229,220,0.3); }
659
+ .cs-ab-btn-primary {
660
+ background: var(--cs-ui-accent, #c4760a) !important;
661
+ color: #ffffff !important;
662
+ border-color: var(--cs-ui-accent-border, #fcd34d) !important;
663
+ font-weight: 600;
664
+ padding: 0 10px;
665
+ gap: 5px;
666
+ }
667
+ .cs-ab-btn-primary:hover {
668
+ background: var(--cs-ui-accent-hover, #a35f04) !important;
669
+ box-shadow: 0 1px 6px rgba(0, 0, 0, 0.35);
670
+ }
671
+ .cs-ab-btn-secondary {
672
+ border-color: rgba(255, 255, 255, 0.16) !important;
673
+ padding: 0 8px;
674
+ gap: 5px;
675
+ }
676
+ .cs-ab-btn-secondary:hover {
677
+ background: rgba(255, 255, 255, 0.14) !important;
678
+ }
679
+ .cs-ab-sep { width: 1px; height: 18px; background: rgba(255, 255, 255, 0.18); margin: 0 4px; }
680
+ .cs-ab-spacer { flex: 1; }
681
+ .cs-ab-filename { font-family: monospace; font-size: 13px; color: rgba(232,229,220,0.9); display: inline-flex; align-items: center; gap: 6px; }
682
+ .cs-ab-dirty { width: 6px; height: 6px; border-radius: 50%; background: #e07b00; }
683
+
684
+ /* Mobile AppBar & Controls */
685
+ .cs-ab-mobile-controls { display: none; }
686
+ .cs-ab-file-name {
687
+ max-width: 220px;
688
+ overflow: hidden;
689
+ text-overflow: ellipsis;
690
+ white-space: nowrap;
691
+ }
692
+ @media (max-width: 768px) {
693
+ .cs-app-bar {
694
+ padding: 4px 8px;
695
+ justify-content: space-between;
696
+ }
697
+ .cs-ab-desktop-only,
698
+ .cs-ab-desktop-group {
699
+ display: none !important;
700
+ }
701
+ .cs-ab-mobile-controls {
702
+ display: inline-flex;
703
+ align-items: center;
704
+ gap: 4px;
705
+ margin-left: auto;
706
+ }
707
+ .cs-ab-left {
708
+ flex: 1;
709
+ min-width: 0;
710
+ overflow: hidden;
711
+ }
712
+ .cs-ab-file-pill {
713
+ max-width: 140px;
714
+ padding: 2px 8px;
715
+ font-size: 11px;
716
+ }
717
+ .cs-ab-file-name {
718
+ max-width: 110px;
719
+ }
720
+ .cs-ab-brand-title {
721
+ display: none;
722
+ }
723
+ }
724
+ @media (min-width: 480px) and (max-width: 768px) {
725
+ .cs-ab-brand-title {
726
+ display: inline;
727
+ }
728
+ }
729
+
730
+ /* Mobile Menu Drawer & Backdrop */
731
+ .cs-mobile-menu-backdrop {
732
+ position: fixed;
733
+ inset: 0;
734
+ background: rgba(0, 0, 0, 0.55);
735
+ z-index: 2500;
736
+ backdrop-filter: blur(3px);
737
+ animation: csFadeIn 0.2s ease-out;
738
+ }
739
+ .cs-mobile-menu-drawer {
740
+ position: fixed;
741
+ top: 0;
742
+ right: 0;
743
+ bottom: 0;
744
+ width: min(85vw, 340px);
745
+ background: #1c1c1a;
746
+ color: #f5f4ee;
747
+ z-index: 2600;
748
+ box-shadow: -4px 0 24px rgba(0, 0, 0, 0.45);
749
+ display: flex;
750
+ flex-direction: column;
751
+ overflow-y: auto;
752
+ -webkit-overflow-scrolling: touch;
753
+ animation: csSlideInRight 0.22s cubic-bezier(0.16, 1, 0.3, 1);
754
+ padding-bottom: env(safe-area-inset-bottom, 16px);
755
+ }
756
+ @keyframes csSlideInRight {
757
+ from { transform: translateX(100%); }
758
+ to { transform: translateX(0); }
759
+ }
760
+ @keyframes csSlideInLeft {
761
+ from { transform: translateX(-100%); }
762
+ to { transform: translateX(0); }
763
+ }
764
+ .cs-mm-header {
765
+ display: flex;
766
+ align-items: center;
767
+ justify-content: space-between;
768
+ padding: 14px 16px;
769
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
770
+ }
771
+ .cs-mm-brand {
772
+ display: flex;
773
+ align-items: center;
774
+ gap: 8px;
775
+ font-weight: 700;
776
+ font-size: 13px;
777
+ letter-spacing: 1px;
778
+ text-transform: uppercase;
779
+ color: var(--cs-ui-accent-badge, #d97706);
780
+ }
781
+ .cs-mm-close {
782
+ display: flex;
783
+ align-items: center;
784
+ justify-content: center;
785
+ width: 32px;
786
+ height: 32px;
787
+ border-radius: 4px;
788
+ background: transparent;
789
+ border: none;
790
+ color: rgba(255, 255, 255, 0.7);
791
+ cursor: pointer;
792
+ }
793
+ .cs-mm-close:hover {
794
+ background: rgba(255, 255, 255, 0.1);
795
+ color: #fff;
796
+ }
797
+ .cs-mm-file-info {
798
+ padding: 10px 16px;
799
+ background: rgba(0, 0, 0, 0.2);
800
+ border-bottom: 1px solid rgba(255, 255, 255, 0.08);
801
+ display: flex;
802
+ align-items: center;
803
+ gap: 8px;
804
+ font-family: monospace;
805
+ font-size: 12px;
806
+ color: rgba(255, 255, 255, 0.85);
807
+ }
808
+ .cs-mm-section {
809
+ padding: 10px 12px;
810
+ border-bottom: 1px solid rgba(255, 255, 255, 0.06);
811
+ }
812
+ .cs-mm-section-title {
813
+ font-size: 10px;
814
+ font-weight: 700;
815
+ text-transform: uppercase;
816
+ letter-spacing: 1px;
817
+ color: rgba(255, 255, 255, 0.4);
818
+ margin-bottom: 6px;
819
+ padding: 0 6px;
820
+ }
821
+ .cs-mm-item {
822
+ width: 100%;
823
+ display: flex;
824
+ align-items: center;
825
+ gap: 12px;
826
+ padding: 10px 12px;
827
+ border: none;
828
+ border-radius: 6px;
829
+ background: transparent;
830
+ color: rgba(255, 255, 255, 0.9);
831
+ font-size: 13px;
832
+ font-weight: 500;
833
+ cursor: pointer;
834
+ text-align: left;
835
+ transition: background 0.15s;
836
+ min-height: 44px;
837
+ box-sizing: border-box;
838
+ }
839
+ .cs-mm-item:active,
840
+ .cs-mm-item:hover {
841
+ background: rgba(255, 255, 255, 0.08);
842
+ color: #fff;
843
+ }
844
+ .cs-mm-item.cs-mm-active {
845
+ background: rgba(217, 119, 6, 0.15);
846
+ color: #fbbf24;
847
+ font-weight: 600;
848
+ }
849
+ .cs-mm-item.cs-mm-primary {
850
+ background: var(--cs-ui-accent, #c4760a);
851
+ color: #ffffff;
852
+ margin-top: 4px;
853
+ margin-bottom: 4px;
854
+ }
855
+ .cs-mm-item.cs-mm-primary:active,
856
+ .cs-mm-item.cs-mm-primary:hover {
857
+ background: var(--cs-ui-accent-hover, #a35f04);
858
+ }
859
+
860
+ /* Mobile Toolbar Overflow Bottom Sheet */
861
+ .cs-tb-overflow-backdrop {
862
+ position: fixed;
863
+ inset: 0;
864
+ background: rgba(0, 0, 0, 0.45);
865
+ z-index: 2200;
866
+ backdrop-filter: blur(2px);
867
+ animation: csFadeIn 0.15s ease-out;
868
+ }
869
+ .cs-tb-overflow-sheet {
870
+ position: fixed;
871
+ bottom: 0;
872
+ left: 0;
873
+ right: 0;
874
+ max-height: 80vh;
875
+ background: #ffffff;
876
+ border-top-left-radius: 12px;
877
+ border-top-right-radius: 12px;
878
+ box-shadow: 0 -8px 32px rgba(0, 0, 0, 0.25);
879
+ z-index: 2300;
880
+ display: flex;
881
+ flex-direction: column;
882
+ overflow-y: auto;
883
+ -webkit-overflow-scrolling: touch;
884
+ padding: 16px;
885
+ padding-bottom: calc(16px + env(safe-area-inset-bottom, 0));
886
+ animation: csSlideUp 0.2s cubic-bezier(0.16, 1, 0.3, 1);
887
+ }
888
+ @keyframes csSlideUp {
889
+ from { transform: translateY(100%); }
890
+ to { transform: translateY(0); }
891
+ }
892
+ .cs-tb-overflow-header {
893
+ display: flex;
894
+ align-items: center;
895
+ justify-content: space-between;
896
+ margin-bottom: 8px;
897
+ padding-bottom: 8px;
898
+ border-bottom: 1px solid #e8e8e4;
899
+ }
900
+ .cs-tb-overflow-title {
901
+ font-size: 14px;
902
+ font-weight: 700;
903
+ color: #1a1a18;
904
+ }
905
+ .cs-tb-overflow-close {
906
+ display: flex;
907
+ align-items: center;
908
+ justify-content: center;
909
+ width: 32px;
910
+ height: 32px;
911
+ background: transparent;
912
+ border: none;
913
+ border-radius: 4px;
914
+ cursor: pointer;
915
+ color: #666;
916
+ }
917
+ .cs-tb-overflow-section-label {
918
+ font-size: 11px;
919
+ font-weight: 700;
920
+ text-transform: uppercase;
921
+ letter-spacing: 0.6px;
922
+ color: #888;
923
+ margin: 10px 0 6px;
924
+ }
925
+ .cs-tb-overflow-inline-grid {
926
+ display: grid;
927
+ grid-template-columns: repeat(5, 1fr);
928
+ gap: 6px;
929
+ margin-bottom: 8px;
930
+ }
931
+ .cs-tb-overflow-item {
932
+ display: flex;
933
+ flex-direction: column;
934
+ align-items: center;
935
+ justify-content: center;
936
+ gap: 4px;
937
+ padding: 8px 4px;
938
+ background: #f4f2ea;
939
+ border: 1px solid #e2e0d6;
940
+ border-radius: 6px;
941
+ font-size: 11px;
942
+ color: #1a1a18;
943
+ cursor: pointer;
944
+ min-height: 44px;
945
+ }
946
+ .cs-tb-overflow-item:active { background: #e2e0d6; }
947
+ .cs-tb-overflow-list {
948
+ display: flex;
949
+ flex-direction: column;
950
+ gap: 4px;
951
+ }
952
+ .cs-tb-overflow-list-item {
953
+ display: flex;
954
+ align-items: center;
955
+ gap: 12px;
956
+ padding: 10px 12px;
957
+ background: #fbfbfa;
958
+ border: 1px solid #eeece4;
959
+ border-radius: 6px;
960
+ cursor: pointer;
961
+ text-align: left;
962
+ min-height: 44px;
963
+ }
964
+ .cs-tb-overflow-list-item:active { background: #f0ede4; }
965
+ .cs-tb-overflow-item-active {
966
+ border-color: var(--cs-ui-accent, #c4760a);
967
+ background: #fff8ee;
968
+ }
969
+ .cs-tb-overflow-list-icon {
970
+ display: flex;
971
+ align-items: center;
972
+ justify-content: center;
973
+ width: 24px;
974
+ height: 24px;
975
+ color: #1a1a18;
976
+ }
977
+ .cs-tb-overflow-list-text {
978
+ flex: 1;
979
+ display: flex;
980
+ flex-direction: column;
981
+ }
982
+ .cs-tb-overflow-list-name {
983
+ font-size: 13px;
984
+ font-weight: 600;
985
+ color: #1a1a18;
986
+ }
987
+ .cs-tb-overflow-list-sigil {
988
+ font-size: 11px;
989
+ font-family: monospace;
990
+ color: #888;
991
+ }
992
+ .cs-tb-overflow-current-badge {
993
+ font-size: 10px;
994
+ font-weight: 700;
995
+ text-transform: uppercase;
996
+ color: var(--cs-ui-accent, #c4760a);
997
+ background: #fef3c7;
998
+ padding: 2px 6px;
999
+ border-radius: 4px;
1000
+ }
1001
+
1002
+ /* Mobile Navigator Drawer */
1003
+ .cs-nav-mobile-bar { display: none; }
1004
+ @media (max-width: 640px) {
1005
+ .cs-nav-backdrop {
1006
+ display: block;
1007
+ position: fixed;
1008
+ inset: 0;
1009
+ background: rgba(0, 0, 0, 0.45);
1010
+ z-index: 1100;
1011
+ backdrop-filter: blur(2px);
1012
+ animation: csFadeIn 0.2s ease-out;
1013
+ }
1014
+ .cs-navigator {
1015
+ position: fixed;
1016
+ top: 0;
1017
+ bottom: 0;
1018
+ left: 0;
1019
+ width: min(85vw, 360px);
1020
+ z-index: 1200;
1021
+ box-shadow: 4px 0 24px rgba(0, 0, 0, 0.35);
1022
+ animation: csSlideInLeft 0.22s cubic-bezier(0.16, 1, 0.3, 1);
1023
+ padding-bottom: env(safe-area-inset-bottom, 16px);
1024
+ }
1025
+ .cs-nav-mobile-bar {
1026
+ display: flex;
1027
+ align-items: center;
1028
+ justify-content: space-between;
1029
+ padding: 10px 12px;
1030
+ border-bottom: 1px solid #ddd;
1031
+ background: #efede5;
1032
+ }
1033
+ .cs-nav-mobile-title {
1034
+ font-weight: 700;
1035
+ font-size: 13px;
1036
+ color: #1a1a18;
1037
+ }
1038
+ .cs-nav-mobile-close {
1039
+ display: flex;
1040
+ align-items: center;
1041
+ justify-content: center;
1042
+ width: 32px;
1043
+ height: 32px;
1044
+ border-radius: 4px;
1045
+ background: transparent;
1046
+ border: none;
1047
+ color: #666;
1048
+ cursor: pointer;
1049
+ }
1050
+ .cs-nav-item {
1051
+ min-height: 44px;
1052
+ }
1053
+ }
1054
+
1055
+ /* Per-script font and line-height optimization.
1056
+ Every stack starts with `--cs-lang-<code>-font-family` — a style's explicit
1057
+ per-script override (styles/types.ts's `complexScriptFontOverrides`, e.g.
1058
+ Traditional's Tamil -> Noto Serif Tamil), unset for styles that don't need one.
1059
+ Next is the resolved style's own body font: if that font actually has glyphs for
1060
+ the script, the browser's normal per-glyph font-stack fallback picks it up with
1061
+ no CSS needed. If neither applies (e.g. Classic's Noto Sans has no Tamil glyphs,
1062
+ Industry Courier's Courier Prime has none of these scripts), the browser
1063
+ transparently skips to the script-specific Noto Sans variant that always follows —
1064
+ a pure opt-in with zero risk to styles that don't care about a given script. */
1065
+
1066
+ .cs-lang-hi { /* Devanagari (Hindi, Marathi, Sanskrit) */
1067
+ font-family: var(--cs-lang-hi-font-family, var(--cs-body-font-family, 'Noto Sans')), 'Noto Sans Devanagari', 'Noto Sans', sans-serif;
1068
+ line-height: 1.7;
1069
+ }
1070
+
1071
+ .cs-lang-ta { /* Tamil */
1072
+ font-family: var(--cs-lang-ta-font-family, var(--cs-body-font-family, 'Noto Sans')), 'Noto Sans Tamil', 'Noto Sans', sans-serif;
1073
+ line-height: 1.7;
1074
+ }
1075
+
1076
+ .cs-lang-te { /* Telugu */
1077
+ font-family: var(--cs-lang-te-font-family, var(--cs-body-font-family, 'Noto Sans')), 'Noto Sans Telugu', 'Noto Sans', sans-serif;
1078
+ line-height: 1.7;
1079
+ }
1080
+
1081
+ .cs-lang-kn { /* Kannada */
1082
+ font-family: var(--cs-lang-kn-font-family, var(--cs-body-font-family, 'Noto Sans')), 'Noto Sans Kannada', 'Noto Sans', sans-serif;
1083
+ line-height: 1.7;
1084
+ }
1085
+
1086
+ .cs-lang-ml { /* Malayalam */
1087
+ font-family: var(--cs-lang-ml-font-family, var(--cs-body-font-family, 'Noto Sans')), 'Noto Sans Malayalam', 'Noto Sans', sans-serif;
1088
+ line-height: 1.7;
1089
+ }
1090
+
1091
+ .cs-lang-bn { /* Bengali */
1092
+ font-family: var(--cs-lang-bn-font-family, var(--cs-body-font-family, 'Noto Sans')), 'Noto Sans Bengali', 'Noto Sans', sans-serif;
1093
+ line-height: 1.7;
1094
+ }
1095
+
1096
+ .cs-lang-gu { /* Gujarati */
1097
+ font-family: var(--cs-lang-gu-font-family, var(--cs-body-font-family, 'Noto Sans')), 'Noto Sans Gujarati', 'Noto Sans', sans-serif;
1098
+ line-height: 1.7;
1099
+ }
1100
+
1101
+ .cs-lang-pa { /* Gurmukhi (Punjabi) */
1102
+ font-family: var(--cs-lang-pa-font-family, var(--cs-body-font-family, 'Noto Sans')), 'Noto Sans Gurmukhi', 'Noto Sans', sans-serif;
1103
+ line-height: 1.7;
1104
+ }
1105
+
1106
+ .cs-lang-or { /* Odia */
1107
+ font-family: var(--cs-lang-or-font-family, var(--cs-body-font-family, 'Noto Sans')), 'Noto Sans Oriya', 'Noto Sans', sans-serif;
1108
+ line-height: 1.7;
1109
+ }
1110
+
1111
+ .cs-lang-en { /* Latin (English, default) */
1112
+ font-family: var(--cs-body-font-family, 'Noto Sans'), sans-serif;
1113
+ line-height: 1.5;
1114
+ }
1115
+
1116
+ /* Forced-italic scripts (styles/types.ts's `italicScripts`, e.g. Traditional's Tamil).
1117
+ A toggled class on .cs-editor-mount rather than a plain --cs-lang-<code>-font-style
1118
+ var: a var here would unconditionally set font-style and win the cascade over
1119
+ .cs-lyrics/.cs-comment's own italic on styles that DON'T force this, since those
1120
+ rules are declared earlier. The class is only present at all when a style asks for
1121
+ it, so styles that don't are completely unaffected. */
1122
+ .cs-editor-mount.cs-force-italic-hi .cs-lang-hi,
1123
+ .cs-editor-mount.cs-force-italic-ta .cs-lang-ta,
1124
+ .cs-editor-mount.cs-force-italic-te .cs-lang-te,
1125
+ .cs-editor-mount.cs-force-italic-kn .cs-lang-kn,
1126
+ .cs-editor-mount.cs-force-italic-ml .cs-lang-ml,
1127
+ .cs-editor-mount.cs-force-italic-bn .cs-lang-bn,
1128
+ .cs-editor-mount.cs-force-italic-gu .cs-lang-gu,
1129
+ .cs-editor-mount.cs-force-italic-pa .cs-lang-pa,
1130
+ .cs-editor-mount.cs-force-italic-or .cs-lang-or,
1131
+ .cs-editor-mount.cs-force-italic-si .cs-lang-si {
1132
+ font-style: italic;
1133
+ }
1134
+
1135
+ /* On a forced-italic script, normal text is already italic (above), so
1136
+ content that's *actually* meant to stand out as italic — the italic mark
1137
+ (plain <em>, no class — schema.ts) and lyrics lines (.cs-lyrics, italic
1138
+ by default in screenplay.css/builtin-styles.ts) — would be visually
1139
+ indistinguishable from it. Flip those to the upright/regular face instead,
1140
+ so emphasis and lyrics still read as visually distinct from surrounding
1141
+ body text. Higher specificity than both rules above, so this always wins
1142
+ without needing !important. */
1143
+ .cs-editor-mount.cs-force-italic-hi .cs-lang-hi em, .cs-editor-mount.cs-force-italic-hi .cs-lang-hi.cs-lyrics,
1144
+ .cs-editor-mount.cs-force-italic-ta .cs-lang-ta em, .cs-editor-mount.cs-force-italic-ta .cs-lang-ta.cs-lyrics,
1145
+ .cs-editor-mount.cs-force-italic-te .cs-lang-te em, .cs-editor-mount.cs-force-italic-te .cs-lang-te.cs-lyrics,
1146
+ .cs-editor-mount.cs-force-italic-kn .cs-lang-kn em, .cs-editor-mount.cs-force-italic-kn .cs-lang-kn.cs-lyrics,
1147
+ .cs-editor-mount.cs-force-italic-ml .cs-lang-ml em, .cs-editor-mount.cs-force-italic-ml .cs-lang-ml.cs-lyrics,
1148
+ .cs-editor-mount.cs-force-italic-bn .cs-lang-bn em, .cs-editor-mount.cs-force-italic-bn .cs-lang-bn.cs-lyrics,
1149
+ .cs-editor-mount.cs-force-italic-gu .cs-lang-gu em, .cs-editor-mount.cs-force-italic-gu .cs-lang-gu.cs-lyrics,
1150
+ .cs-editor-mount.cs-force-italic-pa .cs-lang-pa em, .cs-editor-mount.cs-force-italic-pa .cs-lang-pa.cs-lyrics,
1151
+ .cs-editor-mount.cs-force-italic-or .cs-lang-or em, .cs-editor-mount.cs-force-italic-or .cs-lang-or.cs-lyrics,
1152
+ .cs-editor-mount.cs-force-italic-si .cs-lang-si em, .cs-editor-mount.cs-force-italic-si .cs-lang-si.cs-lyrics {
1153
+ font-style: normal;
1154
+ }
1155
+
1156
+ /* Status bar */
1157
+ .cs-status-bar {
1158
+ display: flex;
1159
+ align-items: center;
1160
+ justify-content: space-between;
1161
+ height: 28px;
1162
+ padding: 0 12px;
1163
+ background: var(--cs-ui-bg-panel, #fcfbfa);
1164
+ border-top: 1px solid var(--cs-ui-border-light, #e2e0d6);
1165
+ font-size: 11px;
1166
+ color: var(--cs-ui-text-light-secondary, #59574f);
1167
+ user-select: none;
1168
+ box-sizing: border-box;
1169
+ }
1170
+
1171
+ @media (max-width: 640px) {
1172
+ .cs-status-bar {
1173
+ height: 32px;
1174
+ padding: 0 8px;
1175
+ font-size: 10.5px;
1176
+ }
1177
+ .cs-sb-left, .cs-sb-center, .cs-sb-right {
1178
+ gap: 4px;
1179
+ }
1180
+ .cs-sb-metric-words,
1181
+ .cs-sb-words-sep,
1182
+ .cs-sb-metric-label {
1183
+ display: none;
1184
+ }
1185
+ .cs-ai-status-indicator span:last-child {
1186
+ display: none;
1187
+ }
1188
+ }
1189
+
1190
+ .cs-sb-left, .cs-sb-center, .cs-sb-right {
1191
+ display: inline-flex;
1192
+ align-items: center;
1193
+ gap: 8px;
1194
+ }
1195
+
1196
+ .cs-sb-metric {
1197
+ display: inline-flex;
1198
+ align-items: center;
1199
+ gap: 4px;
1200
+ }
1201
+
1202
+ .cs-sb-metric strong {
1203
+ color: var(--cs-ui-text-light-primary, #1c1b18);
1204
+ font-weight: 600;
1205
+ }
1206
+
1207
+ .cs-sb-sep {
1208
+ color: var(--cs-ui-text-light-muted, #8c897f);
1209
+ opacity: 0.5;
1210
+ }
1211
+
1212
+ .cs-sb-save {
1213
+ display: inline-flex;
1214
+ align-items: center;
1215
+ gap: 5px;
1216
+ font-size: 11px;
1217
+ }
1218
+
1219
+ .cs-sb-save-dirty {
1220
+ color: var(--cs-ui-accent-active, #b45309);
1221
+ font-weight: 500;
1222
+ }
1223
+
1224
+ .cs-sb-save-clean {
1225
+ color: #059669;
1226
+ font-weight: 500;
1227
+ }
1228
+
1229
+ .cs-sb-dot {
1230
+ width: 6px;
1231
+ height: 6px;
1232
+ border-radius: 50%;
1233
+ }
1234
+ .cs-sb-dot-dirty { background: var(--cs-ui-accent-badge, #d97706); }
1235
+ .cs-sb-dot-clean { background: #10b981; }
1236
+
1237
+ .cs-lang-status {
1238
+ position: relative;
1239
+ display: inline-flex;
1240
+ align-items: center;
1241
+ }
1242
+
1243
+ .cs-lang-status-btn,
1244
+ .cs-lang-pill {
1245
+ display: inline-flex;
1246
+ align-items: center;
1247
+ gap: 5px;
1248
+ background: var(--cs-ui-bg-panel-subtle, #f4f2ea);
1249
+ border: 1px solid var(--cs-ui-border-light, #e2e0d6);
1250
+ border-radius: 12px;
1251
+ padding: 2px 8px;
1252
+ font-size: 11px;
1253
+ font-weight: 600;
1254
+ color: var(--cs-ui-text-light-primary, #1c1b18);
1255
+ cursor: pointer;
1256
+ transition: all 0.15s ease;
1257
+ }
1258
+
1259
+ .cs-lang-status-btn:hover,
1260
+ .cs-lang-pill:hover {
1261
+ background: var(--cs-ui-accent-subtle, #fef3c7);
1262
+ border-color: var(--cs-ui-accent-border, #fcd34d);
1263
+ color: var(--cs-ui-accent-active, #92400e);
1264
+ }
1265
+
1266
+ .cs-lang-code {
1267
+ font-family: monospace;
1268
+ letter-spacing: 0.5px;
1269
+ font-weight: 700;
1270
+ }
1271
+
1272
+ .cs-lang-menu {
1273
+ position: absolute;
1274
+ bottom: calc(100% + 4px);
1275
+ right: 0;
1276
+ background: #ffffff;
1277
+ border: 1px solid var(--cs-ui-border-light, #e2e0d6);
1278
+ border-radius: 6px;
1279
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
1280
+ z-index: 1000;
1281
+ min-width: 190px;
1282
+ max-height: 300px;
1283
+ overflow-y: auto;
1284
+ padding: 4px;
1285
+ }
1286
+
1287
+ .cs-lang-option {
1288
+ display: flex;
1289
+ align-items: center;
1290
+ justify-content: space-between;
1291
+ width: 100%;
1292
+ padding: 6px 10px;
1293
+ background: transparent;
1294
+ border: none;
1295
+ text-align: left;
1296
+ font-size: 12px;
1297
+ color: var(--cs-ui-text-light-primary, #1c1b18);
1298
+ border-radius: 4px;
1299
+ cursor: pointer;
1300
+ box-sizing: border-box;
1301
+ transition: background-color 0.1s;
1302
+ }
1303
+
1304
+ .cs-lang-option:hover {
1305
+ background: var(--cs-ui-bg-panel-subtle, #f4f2ea);
1306
+ }
1307
+
1308
+ .cs-lang-option.cs-lang-active {
1309
+ background: var(--cs-ui-accent-subtle, #fef3c7);
1310
+ font-weight: 600;
1311
+ color: var(--cs-ui-accent-active, #92400e);
1312
+ }
1313
+
1314
+ /* Statistics Dialog */
1315
+ .cs-stats-summary-grid {
1316
+ display: grid;
1317
+ grid-template-columns: repeat(3, 1fr);
1318
+ gap: 14px;
1319
+ margin-bottom: 24px;
1320
+ }
1321
+ .cs-stats-card {
1322
+ background: var(--cs-ui-bg-panel, #fcfbfa);
1323
+ border: 1px solid var(--cs-ui-border-light, #e2e0d6);
1324
+ border-radius: 6px;
1325
+ padding: 14px 12px;
1326
+ text-align: center;
1327
+ transition: border-color 0.15s ease;
1328
+ }
1329
+ .cs-stats-card:hover {
1330
+ border-color: var(--cs-ui-accent-border, #fcd34d);
1331
+ }
1332
+ .cs-stats-card-val {
1333
+ font-size: 24px;
1334
+ font-weight: 700;
1335
+ color: var(--cs-ui-text-light-primary, #1c1b18);
1336
+ }
1337
+ .cs-stats-card-lbl {
1338
+ font-size: 11px;
1339
+ text-transform: uppercase;
1340
+ letter-spacing: 0.5px;
1341
+ color: var(--cs-ui-text-light-muted, #8c897f);
1342
+ margin-top: 4px;
1343
+ font-weight: 600;
1344
+ }
1345
+ .cs-stats-section-hdr {
1346
+ font-size: 13px;
1347
+ font-weight: 600;
1348
+ color: var(--cs-ui-text-light-primary, #1c1b18);
1349
+ margin-bottom: 12px;
1350
+ padding-bottom: 6px;
1351
+ border-bottom: 1px solid var(--cs-ui-border-light-subtle, #eeece4);
1352
+ }
1353
+ .cs-stats-table {
1354
+ width: 100%;
1355
+ border-collapse: collapse;
1356
+ font-size: 12px;
1357
+ }
1358
+ .cs-stats-table th {
1359
+ padding: 8px 10px;
1360
+ background: var(--cs-ui-bg-panel-subtle, #f4f2ea);
1361
+ border-bottom: 2px solid var(--cs-ui-border-light, #e2e0d6);
1362
+ color: var(--cs-ui-text-light-secondary, #59574f);
1363
+ font-weight: 600;
1364
+ }
1365
+ .cs-stats-table td {
1366
+ padding: 6px 10px;
1367
+ border-bottom: 1px solid var(--cs-ui-border-light-subtle, #eeece4);
1368
+ }
1369
+ .cs-stats-actor-input {
1370
+ width: 100%;
1371
+ border: 1px solid transparent;
1372
+ background: transparent;
1373
+ padding: 4px 8px;
1374
+ font-size: 12px;
1375
+ border-radius: 4px;
1376
+ box-sizing: border-box;
1377
+ color: var(--cs-ui-text-light-primary, #1c1b18);
1378
+ transition: all 0.15s ease;
1379
+ }
1380
+ .cs-stats-actor-input:hover {
1381
+ border-color: var(--cs-ui-border-light, #e2e0d6);
1382
+ background: #ffffff;
1383
+ }
1384
+ .cs-stats-actor-input:focus {
1385
+ outline: none;
1386
+ border-color: var(--cs-ui-accent, #c4760a);
1387
+ background: #ffffff;
1388
+ box-shadow: 0 0 0 2px var(--cs-ui-accent-subtle, #fef3c7);
1389
+ }
1390
+
1391
+ /* In-App Confirm Dialog */
1392
+ .cs-confirm-overlay {
1393
+ position: fixed;
1394
+ inset: 0;
1395
+ background: rgba(0, 0, 0, 0.45);
1396
+ display: flex;
1397
+ align-items: center;
1398
+ justify-content: center;
1399
+ z-index: 3000;
1400
+ backdrop-filter: blur(2px);
1401
+ }
1402
+ .cs-confirm-dialog {
1403
+ background: #ffffff;
1404
+ border: 1px solid var(--cs-ui-border-light, #e2e0d6);
1405
+ border-radius: 8px;
1406
+ box-shadow: 0 12px 32px rgba(0, 0, 0, 0.2);
1407
+ width: min(92vw, 420px);
1408
+ padding: 20px;
1409
+ box-sizing: border-box;
1410
+ }
1411
+ .cs-confirm-title {
1412
+ font-size: 15px;
1413
+ font-weight: 600;
1414
+ color: var(--cs-ui-text-light-primary, #1c1b18);
1415
+ margin-bottom: 8px;
1416
+ }
1417
+ .cs-confirm-msg {
1418
+ font-size: 13px;
1419
+ color: var(--cs-ui-text-light-secondary, #59574f);
1420
+ line-height: 1.5;
1421
+ margin-bottom: 20px;
1422
+ }
1423
+ .cs-confirm-actions {
1424
+ display: flex;
1425
+ justify-content: flex-end;
1426
+ gap: 10px;
1427
+ }
1428
+ .cs-confirm-btn-cancel {
1429
+ padding: 6px 14px;
1430
+ background: transparent;
1431
+ border: 1px solid var(--cs-ui-border-light, #e2e0d6);
1432
+ border-radius: 4px;
1433
+ font-size: 12px;
1434
+ color: var(--cs-ui-text-light-primary, #1c1b18);
1435
+ cursor: pointer;
1436
+ }
1437
+ .cs-confirm-btn-cancel:hover {
1438
+ background: var(--cs-ui-bg-panel-subtle, #f4f2ea);
1439
+ }
1440
+ .cs-confirm-btn-danger {
1441
+ padding: 6px 14px;
1442
+ background: #dc2626;
1443
+ border: 1px solid #b91c1c;
1444
+ border-radius: 4px;
1445
+ font-size: 12px;
1446
+ font-weight: 600;
1447
+ color: #ffffff;
1448
+ cursor: pointer;
1449
+ }
1450
+ .cs-confirm-btn-danger:hover {
1451
+ background: #b91c1c;
1452
+ }
1453
+ .cs-confirm-btn-primary {
1454
+ padding: 6px 14px;
1455
+ background: var(--cs-ui-accent, #c4760a);
1456
+ border: 1px solid var(--cs-ui-accent-hover, #a35f04);
1457
+ border-radius: 4px;
1458
+ font-size: 12px;
1459
+ font-weight: 600;
1460
+ color: #ffffff;
1461
+ cursor: pointer;
1462
+ }
1463
+ .cs-confirm-btn-primary:hover {
1464
+ background: var(--cs-ui-accent-hover, #a35f04);
1465
+ }
1466
+
1467
+ /* Toast notifications */
1468
+ .cs-toast-container {
1469
+ position: fixed;
1470
+ bottom: 38px;
1471
+ right: 18px;
1472
+ display: flex;
1473
+ flex-direction: column;
1474
+ gap: 8px;
1475
+ z-index: 3500;
1476
+ pointer-events: none;
1477
+ }
1478
+ .cs-toast {
1479
+ pointer-events: auto;
1480
+ display: flex;
1481
+ align-items: center;
1482
+ gap: 8px;
1483
+ padding: 8px 14px;
1484
+ background: #1e1e1c;
1485
+ color: #f5f4ee;
1486
+ border-radius: 6px;
1487
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.25);
1488
+ font-size: 12px;
1489
+ border: 1px solid rgba(255, 255, 255, 0.1);
1490
+ animation: cs-toast-in 0.2s ease-out;
1491
+ }
1492
+ .cs-toast-success { border-color: rgba(16, 185, 129, 0.45); }
1493
+ .cs-toast-warn { border-color: rgba(245, 158, 11, 0.45); }
1494
+ .cs-toast-error { border-color: rgba(239, 68, 68, 0.45); }
1495
+ .cs-toast-info { border-color: rgba(217, 119, 6, 0.45); }
1496
+
1497
+ @keyframes cs-toast-in {
1498
+ from { opacity: 0; transform: translateY(8px); }
1499
+ to { opacity: 1; transform: translateY(0); }
1500
+ }
1501
+
1502
+ /* Redesigned Export Dialog */
1503
+ .cs-export-segmented {
1504
+ display: flex;
1505
+ background: var(--cs-ui-bg-panel-subtle, #f4f2ea);
1506
+ border-radius: 6px;
1507
+ padding: 3px;
1508
+ margin-bottom: 16px;
1509
+ gap: 3px;
1510
+ }
1511
+ .cs-export-seg-btn {
1512
+ flex: 1;
1513
+ padding: 6px 12px;
1514
+ border: none;
1515
+ background: transparent;
1516
+ font-size: 12px;
1517
+ font-weight: 500;
1518
+ color: var(--cs-ui-text-light-secondary, #59574f);
1519
+ border-radius: 4px;
1520
+ cursor: pointer;
1521
+ transition: all 0.15s ease;
1522
+ }
1523
+ .cs-export-seg-btn:hover {
1524
+ color: var(--cs-ui-text-light-primary, #1c1b18);
1525
+ }
1526
+ .cs-export-seg-btn-active {
1527
+ background: #ffffff;
1528
+ color: var(--cs-ui-text-light-primary, #1c1b18);
1529
+ font-weight: 600;
1530
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);
1531
+ }
1532
+ .cs-export-card-grid {
1533
+ display: flex;
1534
+ flex-direction: column;
1535
+ gap: 10px;
1536
+ margin-bottom: 16px;
1537
+ }
1538
+ .cs-export-format-card {
1539
+ display: flex;
1540
+ align-items: flex-start;
1541
+ gap: 12px;
1542
+ padding: 12px;
1543
+ border: 1px solid var(--cs-ui-border-light, #e2e0d6);
1544
+ border-radius: 6px;
1545
+ cursor: pointer;
1546
+ background: #ffffff;
1547
+ transition: all 0.15s ease;
1548
+ }
1549
+ .cs-export-format-card:hover {
1550
+ border-color: var(--cs-ui-accent-border, #fcd34d);
1551
+ background: var(--cs-ui-bg-panel, #fcfbfa);
1552
+ }
1553
+ .cs-export-format-card-selected {
1554
+ border-color: var(--cs-ui-accent, #c4760a);
1555
+ background: var(--cs-ui-accent-subtle, #fef3c7);
1556
+ box-shadow: 0 0 0 1px var(--cs-ui-accent, #c4760a);
1557
+ }
1558
+ .cs-export-report-box {
1559
+ border: 1px solid var(--cs-ui-border-light, #e2e0d6);
1560
+ border-radius: 6px;
1561
+ padding: 12px;
1562
+ margin-bottom: 10px;
1563
+ background: #ffffff;
1564
+ }
1565
+ .cs-export-report-header {
1566
+ display: flex;
1567
+ align-items: center;
1568
+ justify-content: space-between;
1569
+ margin-bottom: 8px;
1570
+ }
1571
+ .cs-export-report-title {
1572
+ font-weight: 600;
1573
+ font-size: 13px;
1574
+ color: var(--cs-ui-text-light-primary, #1c1b18);
1575
+ }
1576
+ .cs-export-chips {
1577
+ display: flex;
1578
+ gap: 6px;
1579
+ }
1580
+ .cs-export-chip {
1581
+ padding: 4px 10px;
1582
+ border: 1px solid var(--cs-ui-border-light, #e2e0d6);
1583
+ border-radius: 12px;
1584
+ background: var(--cs-ui-bg-panel-subtle, #f4f2ea);
1585
+ font-size: 11px;
1586
+ font-weight: 600;
1587
+ color: var(--cs-ui-text-light-secondary, #59574f);
1588
+ cursor: pointer;
1589
+ transition: all 0.15s ease;
1590
+ }
1591
+ .cs-export-chip:hover {
1592
+ background: var(--cs-ui-accent-subtle, #fef3c7);
1593
+ border-color: var(--cs-ui-accent, #c4760a);
1594
+ color: var(--cs-ui-accent-active, #92400e);
1595
+ }
1596
+ .cs-export-chip-active {
1597
+ background: var(--cs-ui-accent, #c4760a);
1598
+ border-color: var(--cs-ui-accent-hover, #a35f04);
1599
+ color: #ffffff;
1600
+ }
1601
+
1602
+ .cs-nav-action-btn {
1603
+ background: transparent;
1604
+ border: none;
1605
+ cursor: pointer;
1606
+ color: var(--cs-ui-text-light-secondary, #666);
1607
+ padding: 3px;
1608
+ display: inline-flex;
1609
+ align-items: center;
1610
+ justify-content: center;
1611
+ border-radius: 4px;
1612
+ transition: background 0.15s ease, color 0.15s ease;
1613
+ }
1614
+ .cs-nav-action-btn:hover {
1615
+ background: var(--cs-ui-bg-panel-subtle, #eeece5);
1616
+ color: var(--cs-ui-text-light-primary, #1a1a18);
1617
+ }
1618
+
1619
+ /* Autocomplete popup */
1620
+ .cs-autocomplete-popup {
1621
+ display: none;
1622
+ position: fixed;
1623
+ z-index: 2000;
1624
+ background: white;
1625
+ border: 1px solid #ccc;
1626
+ border-radius: 4px;
1627
+ box-shadow: 0 4px 12px rgba(0,0,0,0.12);
1628
+ min-width: 180px;
1629
+ max-width: 300px;
1630
+ overflow: hidden;
1631
+ }
1632
+
1633
+ .cs-ac-item {
1634
+ padding: 6px 12px;
1635
+ font-size: 13px;
1636
+ cursor: pointer;
1637
+ white-space: nowrap;
1638
+ overflow: hidden;
1639
+ text-overflow: ellipsis;
1640
+ color: #333;
1641
+ }
1642
+
1643
+ .cs-ac-item:hover,
1644
+ .cs-ac-selected {
1645
+ background: #e3f2fd;
1646
+ color: #1565c0;
1647
+ }
1648
+
1649
+ /* Find & Replace panel */
1650
+ .cs-find-replace {
1651
+ position: fixed;
1652
+ top: 80px;
1653
+ right: 20px;
1654
+ z-index: 1500;
1655
+ background: white;
1656
+ border: 1px solid #ccc;
1657
+ border-radius: 6px;
1658
+ box-shadow: 0 4px 16px rgba(0,0,0,0.12);
1659
+ padding: 12px;
1660
+ width: 320px;
1661
+ }
1662
+
1663
+ @media (max-width: 640px) {
1664
+ .cs-find-replace {
1665
+ top: auto;
1666
+ bottom: 36px;
1667
+ left: 8px;
1668
+ right: 8px;
1669
+ width: auto;
1670
+ max-width: calc(100vw - 16px);
1671
+ box-shadow: 0 -4px 20px rgba(0, 0, 0, 0.2);
1672
+ box-sizing: border-box;
1673
+ }
1674
+ }
1675
+
1676
+ .cs-fr-header {
1677
+ display: flex;
1678
+ align-items: flex-end;
1679
+ justify-content: space-between;
1680
+ margin-bottom: 10px;
1681
+ border-bottom: 2px solid #e0e0e0;
1682
+ padding-bottom: 0;
1683
+ }
1684
+
1685
+ .cs-fr-mode-tabs {
1686
+ display: flex;
1687
+ gap: 0;
1688
+ }
1689
+
1690
+ .cs-fr-tab {
1691
+ padding: 4px 12px 6px;
1692
+ font-size: 12px;
1693
+ border: none;
1694
+ border-bottom: 2px solid transparent;
1695
+ margin-bottom: -2px;
1696
+ background: transparent;
1697
+ color: #888;
1698
+ cursor: pointer;
1699
+ font-weight: 400;
1700
+ }
1701
+
1702
+ .cs-fr-tab:hover {
1703
+ color: #444;
1704
+ }
1705
+
1706
+ .cs-fr-tab-active {
1707
+ color: #1976d2;
1708
+ border-bottom-color: #1976d2;
1709
+ font-weight: 600;
1710
+ }
1711
+
1712
+ .cs-fr-close {
1713
+ background: transparent;
1714
+ border: none;
1715
+ font-size: 18px;
1716
+ cursor: pointer;
1717
+ color: #999;
1718
+ line-height: 1;
1719
+ padding: 0 0 6px 4px;
1720
+ align-self: flex-end;
1721
+ }
1722
+
1723
+ .cs-fr-close:hover {
1724
+ color: #333;
1725
+ }
1726
+
1727
+ .cs-fr-row {
1728
+ display: flex;
1729
+ align-items: stretch;
1730
+ gap: 4px;
1731
+ margin-bottom: 6px;
1732
+ }
1733
+
1734
+ .cs-fr-input {
1735
+ flex: 1;
1736
+ padding: 5px 8px;
1737
+ font-size: 13px;
1738
+ border: 1px solid #ccc;
1739
+ border-radius: 4px;
1740
+ outline: none;
1741
+ min-height: 0;
1742
+ box-sizing: border-box;
1743
+ }
1744
+
1745
+ .cs-fr-input:focus {
1746
+ border-color: #1976d2;
1747
+ box-shadow: 0 0 0 2px rgba(25,118,210,0.15);
1748
+ }
1749
+
1750
+ .cs-fr-toggle {
1751
+ display: flex;
1752
+ align-items: center;
1753
+ padding: 0 8px;
1754
+ font-size: 12px;
1755
+ border: 1px solid #ccc;
1756
+ border-radius: 4px;
1757
+ cursor: pointer;
1758
+ background: transparent;
1759
+ color: #666;
1760
+ white-space: nowrap;
1761
+ box-sizing: border-box;
1762
+ }
1763
+
1764
+ .cs-fr-toggle.cs-fr-active {
1765
+ background: #e3f2fd;
1766
+ border-color: #1976d2;
1767
+ color: #1976d2;
1768
+ }
1769
+
1770
+ .cs-fr-count {
1771
+ font-size: 11px;
1772
+ color: #666;
1773
+ margin-bottom: 6px;
1774
+ padding: 0 2px;
1775
+ }
1776
+
1777
+ .cs-fr-nomatch {
1778
+ color: #c62828;
1779
+ }
1780
+
1781
+ .cs-fr-nav-btn {
1782
+ display: flex;
1783
+ align-items: center;
1784
+ justify-content: center;
1785
+ background: transparent;
1786
+ border: 1px solid #ccc;
1787
+ border-radius: 4px;
1788
+ padding: 0 7px;
1789
+ font-size: 10px;
1790
+ cursor: pointer;
1791
+ color: #555;
1792
+ flex-shrink: 0;
1793
+ box-sizing: border-box;
1794
+ }
1795
+
1796
+ .cs-fr-nav-btn:hover:not(:disabled) {
1797
+ background: #f0f0f0;
1798
+ }
1799
+
1800
+ .cs-fr-nav-btn:disabled {
1801
+ color: #ccc;
1802
+ border-color: #e8e8e8;
1803
+ cursor: not-allowed;
1804
+ }
1805
+
1806
+ .cs-fr-status {
1807
+ min-height: 18px;
1808
+ margin-bottom: 4px;
1809
+ padding: 0 2px;
1810
+ }
1811
+
1812
+ .cs-fr-nav-count {
1813
+ font-size: 11px;
1814
+ color: #666;
1815
+ }
1816
+
1817
+ .cs-fr-actions {
1818
+ display: flex;
1819
+ align-items: center;
1820
+ gap: 6px;
1821
+ margin-top: 4px;
1822
+ }
1823
+
1824
+ .cs-fr-scope {
1825
+ padding: 5px 8px;
1826
+ font-size: 12px;
1827
+ border: 1px solid #ccc;
1828
+ border-radius: 4px;
1829
+ background: white;
1830
+ }
1831
+
1832
+ .cs-fr-btn {
1833
+ flex: 1;
1834
+ padding: 6px 12px;
1835
+ font-size: 12px;
1836
+ background: #1976d2;
1837
+ color: white;
1838
+ border: none;
1839
+ border-radius: 4px;
1840
+ cursor: pointer;
1841
+ font-weight: 500;
1842
+ }
1843
+
1844
+ .cs-fr-btn:disabled {
1845
+ background: #ccc;
1846
+ cursor: not-allowed;
1847
+ }
1848
+
1849
+ .cs-fr-btn:not(:disabled):hover {
1850
+ background: #1565c0;
1851
+ }
1852
+
1853
+ /* Find & Replace match highlights */
1854
+ .cs-find-match {
1855
+ background: #ffeb3b;
1856
+ border-radius: 2px;
1857
+ }
1858
+
1859
+ .cs-find-active {
1860
+ background: #ff9800;
1861
+ border-radius: 2px;
1862
+ }
1863
+
1864
+ /* Spellcheck underline */
1865
+ .cs-spell-error {
1866
+ text-decoration: underline wavy #e53935;
1867
+ text-underline-offset: 2px;
1868
+ }
1869
+
1870
+ /* Shared panel chrome (used by Export dialog) */
1871
+ .cs-panel-header {
1872
+ display: flex;
1873
+ align-items: center;
1874
+ justify-content: space-between;
1875
+ padding: 10px 14px 8px;
1876
+ border-bottom: 1px solid #e8e8e5;
1877
+ background: #f2f2ef;
1878
+ flex-shrink: 0;
1879
+ }
1880
+
1881
+ .cs-panel-title {
1882
+ font-size: 13px;
1883
+ font-weight: 600;
1884
+ color: #333;
1885
+ letter-spacing: 0.2px;
1886
+ }
1887
+
1888
+ .cs-panel-close {
1889
+ background: transparent;
1890
+ border: none;
1891
+ font-size: 18px;
1892
+ line-height: 1;
1893
+ color: #888;
1894
+ cursor: pointer;
1895
+ padding: 0 2px;
1896
+ }
1897
+
1898
+ .cs-panel-close:hover { color: #333; }
1899
+
1900
+ .cs-panel-body {
1901
+ padding: 12px 14px;
1902
+ display: flex;
1903
+ flex-direction: column;
1904
+ gap: 8px;
1905
+ }
1906
+
1907
+ .cs-form-section-label {
1908
+ font-size: 11px;
1909
+ font-weight: 600;
1910
+ color: #999;
1911
+ text-transform: uppercase;
1912
+ letter-spacing: 0.5px;
1913
+ margin-top: 4px;
1914
+ }
1915
+
1916
+ /* Shared dialog overlay + chrome */
1917
+ .cs-dialog-overlay {
1918
+ position: fixed;
1919
+ inset: 0;
1920
+ background: rgba(0, 0, 0, 0.35);
1921
+ z-index: 200;
1922
+ display: flex;
1923
+ align-items: center;
1924
+ justify-content: center;
1925
+ }
1926
+ .cs-dialog {
1927
+ background: white;
1928
+ border-radius: 8px;
1929
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.18);
1930
+ min-width: 340px;
1931
+ max-width: 480px;
1932
+ width: 100%;
1933
+ overflow: hidden;
1934
+ }
1935
+
1936
+ @media (max-width: 640px) {
1937
+ .cs-dialog,
1938
+ .cs-export-dialog,
1939
+ .cs-settings-dialog,
1940
+ .cs-confirm-dialog {
1941
+ min-width: 0 !important;
1942
+ width: calc(100vw - 16px) !important;
1943
+ max-width: calc(100vw - 16px) !important;
1944
+ max-height: calc(100dvh - 24px) !important;
1945
+ margin: 8px;
1946
+ }
1947
+ }
1948
+ .cs-dialog-header {
1949
+ display: flex;
1950
+ align-items: center;
1951
+ justify-content: space-between;
1952
+ padding: 14px 16px 12px;
1953
+ border-bottom: 1px solid #e8e8e4;
1954
+ }
1955
+ .cs-dialog-title {
1956
+ font-size: 15px;
1957
+ font-weight: 600;
1958
+ color: #1a1a18;
1959
+ }
1960
+
1961
+ /* Version history dialog (power-user feature, opened from the status bar) */
1962
+ .cs-version-body {
1963
+ display: flex;
1964
+ flex: 1;
1965
+ min-height: 260px;
1966
+ max-height: 50vh;
1967
+ overflow: hidden;
1968
+ }
1969
+ .cs-version-list {
1970
+ width: 150px;
1971
+ flex-shrink: 0;
1972
+ overflow-y: auto;
1973
+ border-right: 1px solid var(--cs-ui-border-light-subtle, #eeece4);
1974
+ }
1975
+ .cs-version-list-item {
1976
+ display: block;
1977
+ width: 100%;
1978
+ text-align: left;
1979
+ padding: 10px 12px;
1980
+ background: transparent;
1981
+ border: none;
1982
+ border-bottom: 1px solid var(--cs-ui-border-light-subtle, #eeece4);
1983
+ cursor: pointer;
1984
+ font-size: 12px;
1985
+ }
1986
+ .cs-version-list-item:hover {
1987
+ background: var(--cs-ui-bg-panel-subtle, #f4f2ea);
1988
+ }
1989
+ .cs-version-list-item-active {
1990
+ background: var(--cs-ui-accent-subtle, #fbebd4);
1991
+ }
1992
+ .cs-version-list-item-label {
1993
+ font-weight: 600;
1994
+ color: var(--cs-ui-text-light-primary, #1c1b18);
1995
+ }
1996
+ .cs-version-list-item-date {
1997
+ font-size: 11px;
1998
+ color: var(--cs-ui-text-light-muted, #8c897f);
1999
+ margin-top: 2px;
2000
+ }
2001
+ .cs-version-diff-wrap {
2002
+ flex: 1;
2003
+ display: flex;
2004
+ min-width: 0;
2005
+ }
2006
+ .cs-version-diff {
2007
+ flex: 1;
2008
+ overflow-y: auto;
2009
+ padding: 12px 14px;
2010
+ font-family: var(--cs-mono-font, ui-monospace, 'SFMono-Regular', Consolas, monospace);
2011
+ font-size: 12px;
2012
+ line-height: 1.6;
2013
+ }
2014
+ .cs-version-diff-content {
2015
+ white-space: pre-wrap;
2016
+ word-break: break-word;
2017
+ }
2018
+ .cs-version-diff-removed {
2019
+ color: #b91c1c;
2020
+ text-decoration: line-through;
2021
+ background: rgba(220, 38, 38, 0.1);
2022
+ }
2023
+ .cs-version-diff-added {
2024
+ color: #15803d;
2025
+ background: rgba(21, 128, 61, 0.12);
2026
+ text-decoration: none;
2027
+ }
2028
+ /* Scrollbar-side change indicator — a mini "minimap" gutter so a single-word
2029
+ change doesn't get lost scrolling through a long screenplay. */
2030
+ .cs-version-diff-minimap {
2031
+ position: relative;
2032
+ width: 10px;
2033
+ flex-shrink: 0;
2034
+ background: var(--cs-ui-bg-panel-subtle, #f4f2ea);
2035
+ border-left: 1px solid var(--cs-ui-border-light-subtle, #eeece4);
2036
+ }
2037
+ .cs-version-diff-marker {
2038
+ position: absolute;
2039
+ left: 2px;
2040
+ right: 2px;
2041
+ height: 3px;
2042
+ margin-top: -1px;
2043
+ padding: 0;
2044
+ border: none;
2045
+ border-radius: 1px;
2046
+ cursor: pointer;
2047
+ }
2048
+ .cs-version-diff-marker-removed { background: #dc2626; }
2049
+ .cs-version-diff-marker-added { background: #16a34a; }
2050
+ .cs-version-diff-marker:hover {
2051
+ height: 5px;
2052
+ margin-top: -2px;
2053
+ left: 1px;
2054
+ right: 1px;
2055
+ }
2056
+ .cs-version-empty {
2057
+ color: var(--cs-ui-text-light-muted, #8c897f);
2058
+ font-style: italic;
2059
+ font-size: 12px;
2060
+ padding: 16px 4px;
2061
+ }
2062
+ .cs-version-footer {
2063
+ display: flex;
2064
+ align-items: center;
2065
+ justify-content: space-between;
2066
+ padding: 12px 14px;
2067
+ border-top: 1px solid var(--cs-ui-border-light-subtle, #eeece4);
2068
+ background: var(--cs-ui-bg-panel-subtle, #f4f2ea);
2069
+ }
2070
+ .cs-version-clear-btn {
2071
+ color: #b91c1c;
2072
+ border-color: rgba(185, 28, 28, 0.35);
2073
+ }
2074
+ .cs-version-clear-btn:hover {
2075
+ background: rgba(220, 38, 38, 0.08);
2076
+ }
2077
+ .cs-version-clear-btn:disabled {
2078
+ color: var(--cs-ui-text-light-muted, #8c897f);
2079
+ border-color: var(--cs-ui-border-light, #e2e0d6);
2080
+ cursor: not-allowed;
2081
+ background: transparent;
2082
+ }
2083
+
2084
+ /* Settings dialog */
2085
+ .cs-settings-body {
2086
+ padding: 16px;
2087
+ display: flex;
2088
+ flex-direction: column;
2089
+ gap: 12px;
2090
+ }
2091
+ .cs-settings-section-label {
2092
+ font-size: 11px;
2093
+ font-weight: 600;
2094
+ text-transform: uppercase;
2095
+ letter-spacing: 0.5px;
2096
+ color: #888;
2097
+ margin-bottom: 4px;
2098
+ }
2099
+ .cs-settings-row {
2100
+ display: flex;
2101
+ align-items: center;
2102
+ justify-content: space-between;
2103
+ gap: 16px;
2104
+ }
2105
+ .cs-settings-label {
2106
+ font-size: 13px;
2107
+ color: #333;
2108
+ }
2109
+ .cs-settings-select {
2110
+ font-size: 13px;
2111
+ padding: 5px 8px;
2112
+ border: 1px solid #ccc;
2113
+ border-radius: 4px;
2114
+ background: #fff;
2115
+ color: #1a1a18;
2116
+ cursor: pointer;
2117
+ min-width: 160px;
2118
+ }
2119
+ .cs-settings-select:focus { outline: 2px solid #1976d2; outline-offset: 1px; }
2120
+
2121
+ /* Export Dialog overlay + dialog */
2122
+ .cs-export-overlay {
2123
+ position: fixed;
2124
+ inset: 0;
2125
+ background: rgba(0, 0, 0, 0.35);
2126
+ z-index: 2000;
2127
+ display: flex;
2128
+ align-items: center;
2129
+ justify-content: center;
2130
+ }
2131
+
2132
+ .cs-export-dialog {
2133
+ background: white;
2134
+ border-radius: 8px;
2135
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.18);
2136
+ width: 380px;
2137
+ max-width: 95vw;
2138
+ display: flex;
2139
+ flex-direction: column;
2140
+ overflow: hidden;
2141
+ }
2142
+
2143
+ .cs-export-option {
2144
+ display: flex;
2145
+ align-items: flex-start;
2146
+ gap: 10px;
2147
+ padding: 8px 0;
2148
+ cursor: pointer;
2149
+ }
2150
+
2151
+ .cs-export-option input[type="radio"] {
2152
+ margin-top: 3px;
2153
+ flex-shrink: 0;
2154
+ }
2155
+
2156
+ .cs-export-option-label {
2157
+ display: flex;
2158
+ flex-direction: column;
2159
+ gap: 2px;
2160
+ }
2161
+
2162
+ .cs-export-option-desc {
2163
+ font-size: 12px;
2164
+ color: #666;
2165
+ }
2166
+
2167
+ .cs-export-note {
2168
+ font-size: 12px;
2169
+ color: #666;
2170
+ padding: 8px 10px;
2171
+ border-radius: 4px;
2172
+ margin-top: 4px;
2173
+ }
2174
+
2175
+ .cs-export-note-stub {
2176
+ background: #fff8e1;
2177
+ color: #8a6000;
2178
+ border: 1px solid #ffe082;
2179
+ }
2180
+
2181
+ .cs-export-warnings {
2182
+ background: #fff3e0;
2183
+ border: 1px solid #ffcc02;
2184
+ border-radius: 4px;
2185
+ padding: 8px 10px;
2186
+ margin-top: 4px;
2187
+ }
2188
+
2189
+ .cs-export-warn-title {
2190
+ font-size: 11px;
2191
+ font-weight: 600;
2192
+ color: #e65100;
2193
+ margin-bottom: 4px;
2194
+ }
2195
+
2196
+ .cs-export-warn-item {
2197
+ font-size: 12px;
2198
+ color: #bf360c;
2199
+ }
2200
+
2201
+ .cs-export-actions {
2202
+ display: flex;
2203
+ gap: 8px;
2204
+ justify-content: flex-end;
2205
+ margin-top: 12px;
2206
+ }
2207
+
2208
+ .cs-export-btn-cancel {
2209
+ padding: 7px 16px;
2210
+ font-size: 13px;
2211
+ background: transparent;
2212
+ border: 1px solid #ccc;
2213
+ border-radius: 4px;
2214
+ cursor: pointer;
2215
+ color: #444;
2216
+ }
2217
+
2218
+ .cs-export-btn-cancel:hover { background: #f5f5f5; }
2219
+
2220
+ .cs-export-btn-primary {
2221
+ padding: 7px 16px;
2222
+ font-size: 13px;
2223
+ background: #1976d2;
2224
+ color: white;
2225
+ border: none;
2226
+ border-radius: 4px;
2227
+ cursor: pointer;
2228
+ font-weight: 500;
2229
+ }
2230
+
2231
+ .cs-export-btn-primary:hover { background: #1565c0; }
2232
+
2233
+ /* ── Inline attribute editing (title page card + scene attribute lines) ── */
2234
+
2235
+ /* Title page card at the top of the document */
2236
+ .cs-title-page-block {
2237
+ position: relative;
2238
+ width: 100%;
2239
+ max-width: 720px;
2240
+ box-sizing: border-box;
2241
+ margin: 0 auto 32px;
2242
+ padding: 20px 28px 16px;
2243
+ background: #fbfaf7;
2244
+ border: 1px solid #e2e0d8;
2245
+ border-radius: 8px;
2246
+ }
2247
+
2248
+ .cs-fm-field {
2249
+ font-family: 'Noto Sans', sans-serif;
2250
+ font-size: 13px;
2251
+ color: #333;
2252
+ padding: 2px 0;
2253
+ line-height: 1.6;
2254
+ }
2255
+
2256
+ .cs-fm-field[data-key="title"] {
2257
+ font-size: 20px;
2258
+ font-weight: 600;
2259
+ color: #1a1a18;
2260
+ }
2261
+
2262
+ .cs-fm-field[data-key^="title."] {
2263
+ font-size: 17px;
2264
+ font-weight: 600;
2265
+ color: #1a1a18;
2266
+ }
2267
+
2268
+ /* Key badges — non-editable pseudo-content labels before the value */
2269
+ .cs-fm-field::before,
2270
+ .cs-scene-metadata::before {
2271
+ content: attr(data-key);
2272
+ display: inline-block;
2273
+ margin-right: 8px;
2274
+ padding: 0 6px;
2275
+ font-size: 10px;
2276
+ font-weight: 600;
2277
+ font-family: 'Noto Sans', sans-serif;
2278
+ letter-spacing: 0.4px;
2279
+ color: #8a887f;
2280
+ background: #f0efe9;
2281
+ border: 1px solid #e2e0d8;
2282
+ border-radius: 9px;
2283
+ vertical-align: middle;
2284
+ line-height: 16px;
2285
+ user-select: none;
2286
+ }
2287
+
2288
+
2289
+ /* Pencil widget — appears on hover of its parent block */
2290
+ .cs-attr-pencil {
2291
+ display: inline-flex;
2292
+ align-items: center;
2293
+ justify-content: center;
2294
+ width: 20px;
2295
+ height: 20px;
2296
+ margin-left: 8px;
2297
+ padding: 0;
2298
+ font-size: 12px;
2299
+ line-height: 1;
2300
+ color: #aaa;
2301
+ background: transparent;
2302
+ border: none;
2303
+ border-radius: 4px;
2304
+ cursor: pointer;
2305
+ opacity: 0;
2306
+ transition: opacity 0.12s, color 0.12s;
2307
+ vertical-align: middle;
2308
+ user-select: none;
2309
+ }
2310
+
2311
+ .cs-scene-heading:hover .cs-attr-pencil,
2312
+ .cs-title-page-block:hover .cs-attr-pencil {
2313
+ opacity: 1;
2314
+ }
2315
+
2316
+ .cs-attr-pencil:hover { color: #1976d2; background: #e3f2fd; }
2317
+
2318
+ /* Title page pencil floats top-right of the card */
2319
+ .cs-tp-pencil {
2320
+ position: absolute;
2321
+ top: 8px;
2322
+ right: 8px;
2323
+ margin-left: 0;
2324
+ }
2325
+
2326
+ /* Attribute add-menu dropdown */
2327
+ .cs-attr-menu {
2328
+ position: fixed;
2329
+ z-index: 2500;
2330
+ min-width: 150px;
2331
+ background: white;
2332
+ border: 1px solid #ccc;
2333
+ border-radius: 6px;
2334
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.14);
2335
+ padding: 4px 0;
2336
+ overflow: hidden;
2337
+ }
2338
+
2339
+ .cs-attr-menu-item {
2340
+ display: block;
2341
+ width: 100%;
2342
+ padding: 6px 14px;
2343
+ font-size: 13px;
2344
+ font-family: 'Noto Sans', sans-serif;
2345
+ text-align: left;
2346
+ color: #333;
2347
+ background: transparent;
2348
+ border: none;
2349
+ cursor: pointer;
2350
+ }
2351
+
2352
+ .cs-attr-menu-item:hover { background: #e3f2fd; color: #1565c0; }
2353
+
2354
+ .cs-attr-menu-custom {
2355
+ padding: 6px 10px 4px;
2356
+ border-top: 1px solid #eee;
2357
+ margin-top: 4px;
2358
+ }
2359
+
2360
+ .cs-attr-menu-custom input {
2361
+ width: 100%;
2362
+ box-sizing: border-box;
2363
+ padding: 4px 8px;
2364
+ font-size: 12px;
2365
+ border: 1px solid #ccc;
2366
+ border-radius: 4px;
2367
+ outline: none;
2368
+ }
2369
+
2370
+ .cs-attr-menu-custom input:focus { border-color: #1976d2; }
2371
+
2372
+ /* Hide scene metadata in editor */
2373
+ .cs-hide-metadata .cs-scene-metadata {
2374
+ display: none !important;
2375
+ }
2376
+
2377
+ /* Form Card Styling for Inline Metadata */
2378
+ .cs-scene-metadata {
2379
+ font-size: 9.5pt;
2380
+ color: #333;
2381
+ margin-left: max(10%, 8px);
2382
+ margin-right: max(10%, 8px);
2383
+ background: #fafaf9;
2384
+ border: 1px solid #e5e4de;
2385
+ border-top: none; /* stack them */
2386
+ padding: 6px 12px;
2387
+ font-family: 'Noto Sans', sans-serif;
2388
+ display: flex;
2389
+ align-items: center;
2390
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.8);
2391
+ }
2392
+
2393
+ /* Make the first metadata line under heading have a top border and rounded corners */
2394
+ .cs-scene-heading + .cs-scene-metadata {
2395
+ border-top: 1px solid #e5e4de;
2396
+ border-top-left-radius: 6px;
2397
+ border-top-right-radius: 6px;
2398
+ margin-top: 6px;
2399
+ }
2400
+
2401
+ /* Last metadata node gets rounded bottom corners */
2402
+ .cs-scene-metadata:not(:has(+ .cs-scene-metadata)) {
2403
+ border-bottom-left-radius: 6px;
2404
+ border-bottom-right-radius: 6px;
2405
+ margin-bottom: 12px;
2406
+ }
2407
+
2408
+ /* Status Badge color codings */
2409
+ .cs-scene-metadata[data-key="status"]::before {
2410
+ background: #e6f4ea;
2411
+ color: #137333;
2412
+ border-color: #ceead6;
2413
+ }
2414
+ .cs-scene-metadata[data-key="actors"]::before {
2415
+ background: #e8f5e9;
2416
+ color: #1b5e20;
2417
+ border-color: #c8e6c9;
2418
+ }
2419
+ .cs-scene-metadata[data-key="tags"]::before {
2420
+ background: #f3e5f5;
2421
+ color: #4a148c;
2422
+ border-color: #e1bee7;
2423
+ }
2424
+ .cs-scene-metadata[data-key="est-duration"]::before {
2425
+ background: #fff3e0;
2426
+ color: #e65100;
2427
+ border-color: #ffe0b2;
2428
+ }
2429
+
2430
+ .cs-fm-logline-counter {
2431
+ font-size: 10px;
2432
+ font-family: 'Noto Sans', sans-serif;
2433
+ color: #8a887f;
2434
+ margin-left: 10px;
2435
+ background: #f0efe9;
2436
+ border: 1px solid #e2e0d8;
2437
+ padding: 1px 6px;
2438
+ border-radius: 4px;
2439
+ vertical-align: middle;
2440
+ display: inline-block;
2441
+ user-select: none;
2442
+ font-weight: 600;
2443
+ }
2444
+
2445
+ /* ── Voice Dictation Toolbar ── */
2446
+ .cs-voice-toolbar {
2447
+ display: flex;
2448
+ flex-direction: column;
2449
+ gap: 8px;
2450
+ padding: 10px 16px;
2451
+ background: var(--cs-ui-bg-app-bar, #191917);
2452
+ color: var(--cs-ui-text-dark-primary, #f5f4ee);
2453
+ border-bottom: 1px solid var(--cs-ui-border-dark, rgba(255, 255, 255, 0.16));
2454
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
2455
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);
2456
+ animation: csFadeIn 0.15s ease-out;
2457
+ }
2458
+ @keyframes csFadeIn {
2459
+ from { opacity: 0; transform: translateY(-4px); }
2460
+ to { opacity: 1; transform: translateY(0); }
2461
+ }
2462
+ .cs-voice-toolbar-row {
2463
+ display: flex;
2464
+ align-items: center;
2465
+ gap: 10px;
2466
+ flex-wrap: wrap;
2467
+ }
2468
+ .cs-voice-toolbar-badge {
2469
+ display: inline-flex;
2470
+ align-items: center;
2471
+ gap: 6px;
2472
+ font-weight: 700;
2473
+ font-size: 12px;
2474
+ text-transform: uppercase;
2475
+ letter-spacing: 0.8px;
2476
+ color: var(--cs-ui-accent-badge, #d97706);
2477
+ }
2478
+ .cs-voice-select {
2479
+ padding: 4px 8px;
2480
+ background: #242421;
2481
+ color: var(--cs-ui-text-dark-primary, #f5f4ee);
2482
+ border: 1px solid var(--cs-ui-border-dark, rgba(255, 255, 255, 0.16));
2483
+ border-radius: 4px;
2484
+ font-size: 12px;
2485
+ cursor: pointer;
2486
+ }
2487
+ .cs-voice-select:focus {
2488
+ outline: 2px solid var(--cs-ui-accent, #c4760a);
2489
+ outline-offset: 1px;
2490
+ }
2491
+ .cs-voice-actions-group,
2492
+ .cs-voice-listening-group {
2493
+ display: inline-flex;
2494
+ align-items: center;
2495
+ gap: 8px;
2496
+ }
2497
+ .cs-voice-btn-primary {
2498
+ display: inline-flex;
2499
+ align-items: center;
2500
+ gap: 6px;
2501
+ padding: 5px 12px;
2502
+ background: var(--cs-ui-accent, #c4760a);
2503
+ border: 1px solid var(--cs-ui-accent-border, #fcd34d);
2504
+ border-radius: 4px;
2505
+ color: #ffffff;
2506
+ font-size: 12px;
2507
+ font-weight: 600;
2508
+ cursor: pointer;
2509
+ transition: all 0.15s ease;
2510
+ }
2511
+ .cs-voice-btn-primary:hover:not(:disabled) {
2512
+ background: var(--cs-ui-accent-hover, #a35f04);
2513
+ }
2514
+ .cs-voice-btn-primary:disabled {
2515
+ opacity: 0.5;
2516
+ cursor: not-allowed;
2517
+ }
2518
+ .cs-voice-btn-secondary {
2519
+ padding: 5px 10px;
2520
+ background: rgba(255, 255, 255, 0.08);
2521
+ border: 1px solid var(--cs-ui-border-dark, rgba(255, 255, 255, 0.16));
2522
+ border-radius: 4px;
2523
+ color: var(--cs-ui-text-dark-primary, #f5f4ee);
2524
+ font-size: 12px;
2525
+ cursor: pointer;
2526
+ }
2527
+ .cs-voice-btn-secondary:hover:not(:disabled) {
2528
+ background: rgba(255, 255, 255, 0.14);
2529
+ }
2530
+ .cs-voice-btn-ghost {
2531
+ padding: 5px 8px;
2532
+ background: transparent;
2533
+ border: 1px solid transparent;
2534
+ border-radius: 4px;
2535
+ color: var(--cs-ui-text-dark-secondary, #a8a69d);
2536
+ font-size: 12px;
2537
+ cursor: pointer;
2538
+ }
2539
+ .cs-voice-btn-ghost:hover {
2540
+ background: rgba(255, 255, 255, 0.08);
2541
+ color: var(--cs-ui-text-dark-primary, #f5f4ee);
2542
+ }
2543
+ .cs-voice-btn-danger {
2544
+ padding: 5px 12px;
2545
+ background: #dc2626;
2546
+ border: 1px solid #ef4444;
2547
+ border-radius: 4px;
2548
+ color: #ffffff;
2549
+ font-size: 12px;
2550
+ font-weight: 600;
2551
+ cursor: pointer;
2552
+ }
2553
+ .cs-voice-btn-danger:hover {
2554
+ background: #b91c1c;
2555
+ }
2556
+ .cs-voice-waveform {
2557
+ background: #141413;
2558
+ border: 1px solid var(--cs-ui-border-dark, rgba(255, 255, 255, 0.16));
2559
+ border-radius: 4px;
2560
+ }
2561
+ .cs-voice-warning {
2562
+ color: #f87171;
2563
+ font-size: 12px;
2564
+ }
2565
+ .cs-voice-transcript-box {
2566
+ background: #141413;
2567
+ border: 1px solid var(--cs-ui-border-dark, rgba(255, 255, 255, 0.16));
2568
+ padding: 8px 12px;
2569
+ border-radius: 4px;
2570
+ font-size: 13px;
2571
+ color: var(--cs-ui-text-dark-primary, #f5f4ee);
2572
+ min-height: 24px;
2573
+ line-height: 1.4;
2574
+ white-space: pre-wrap;
2575
+ }
2576
+ .cs-voice-interim {
2577
+ color: var(--cs-ui-accent-border, #fcd34d);
2578
+ font-style: italic;
2579
+ }
2580
+ .cs-voice-placeholder {
2581
+ color: var(--cs-ui-text-dark-muted, #737168);
2582
+ }
2583
+ .cs-voice-textarea {
2584
+ width: 100%;
2585
+ box-sizing: border-box;
2586
+ background: #242421;
2587
+ border: 1px solid var(--cs-ui-border-dark, rgba(255, 255, 255, 0.16));
2588
+ padding: 8px 12px;
2589
+ border-radius: 4px;
2590
+ font-size: 13px;
2591
+ color: var(--cs-ui-text-dark-primary, #f5f4ee);
2592
+ min-height: 54px;
2593
+ line-height: 1.4;
2594
+ font-family: 'Courier Prime', Courier, monospace;
2595
+ resize: vertical;
2596
+ }
2597
+ .cs-voice-textarea:focus {
2598
+ outline: 2px solid var(--cs-ui-accent, #c4760a);
2599
+ outline-offset: 1px;
2600
+ }
2601
+ .cs-voice-error {
2602
+ color: #f87171;
2603
+ font-size: 12px;
2604
+ }
2605
+ .cs-voice-cheatsheet {
2606
+ display: flex;
2607
+ gap: 6px;
2608
+ flex-wrap: wrap;
2609
+ align-items: center;
2610
+ font-size: 11px;
2611
+ color: var(--cs-ui-text-dark-muted, #737168);
2612
+ }
2613
+ .cs-voice-cheatsheet-title {
2614
+ font-weight: 600;
2615
+ }
2616
+ .cs-voice-tag {
2617
+ background: #242421;
2618
+ padding: 2px 6px;
2619
+ border-radius: 3px;
2620
+ border: 1px solid var(--cs-ui-border-dark-subtle, rgba(255, 255, 255, 0.08));
2621
+ }
2622
+ .cs-voice-tag-type {
2623
+ color: var(--cs-ui-accent-badge, #d97706);
2624
+ font-weight: 600;
2625
+ }
2626
+ .cs-voice-tag-bypass {
2627
+ color: var(--cs-ui-text-dark-secondary, #a8a69d);
2628
+ }
2629
+
2630
+ /* ── Voice Confirm Dialog ── */
2631
+ .cs-voice-confirm-dialog {
2632
+ max-width: 780px !important;
2633
+ width: 90vw !important;
2634
+ }
2635
+ .cs-voice-confirm-body {
2636
+ padding: 16px;
2637
+ display: flex;
2638
+ flex-direction: column;
2639
+ gap: 14px;
2640
+ }
2641
+ .cs-voice-loading-state {
2642
+ display: flex;
2643
+ flex-direction: column;
2644
+ align-items: center;
2645
+ justify-content: center;
2646
+ min-height: 180px;
2647
+ gap: 14px;
2648
+ }
2649
+ .cs-voice-grid {
2650
+ display: grid;
2651
+ grid-template-columns: 1fr 1fr;
2652
+ gap: 14px;
2653
+ }
2654
+ @media (max-width: 640px) {
2655
+ .cs-voice-grid {
2656
+ grid-template-columns: 1fr;
2657
+ }
2658
+ }
2659
+ .cs-voice-column {
2660
+ display: flex;
2661
+ flex-direction: column;
2662
+ gap: 6px;
2663
+ }
2664
+ .cs-voice-col-title {
2665
+ font-size: 11px;
2666
+ font-weight: 600;
2667
+ text-transform: uppercase;
2668
+ letter-spacing: 0.5px;
2669
+ color: var(--cs-ui-text-light-secondary, #59574f);
2670
+ }
2671
+ .cs-voice-box-raw {
2672
+ background: var(--cs-ui-bg-panel-subtle, #f4f2ea);
2673
+ border: 1px solid var(--cs-ui-border-light, #e2e0d6);
2674
+ border-radius: 4px;
2675
+ padding: 10px 12px;
2676
+ font-size: 13px;
2677
+ color: var(--cs-ui-text-light-primary, #1c1b18);
2678
+ min-height: 140px;
2679
+ line-height: 1.5;
2680
+ white-space: pre-wrap;
2681
+ }
2682
+ .cs-voice-box-formatted {
2683
+ width: 100%;
2684
+ box-sizing: border-box;
2685
+ background: #ffffff;
2686
+ border: 1px solid var(--cs-ui-border-light, #e2e0d6);
2687
+ border-radius: 4px;
2688
+ padding: 10px 12px;
2689
+ font-size: 13px;
2690
+ font-family: 'Courier Prime', Courier, monospace;
2691
+ color: var(--cs-ui-text-light-primary, #1c1b18);
2692
+ min-height: 140px;
2693
+ line-height: 1.4;
2694
+ resize: vertical;
2695
+ }
2696
+ .cs-voice-box-formatted:focus {
2697
+ outline: 2px solid var(--cs-ui-accent, #c4760a);
2698
+ outline-offset: 1px;
2699
+ }
2700
+ .cs-voice-checkbox-label {
2701
+ display: inline-flex;
2702
+ align-items: center;
2703
+ gap: 8px;
2704
+ font-size: 12px;
2705
+ color: var(--cs-ui-text-light-secondary, #59574f);
2706
+ cursor: pointer;
2707
+ }
2708
+
2709
+ /* ── Selection Floating Menu ── */
2710
+ .cs-selection-menu {
2711
+ position: fixed;
2712
+ transform: translate(-50%, -100%);
2713
+ z-index: 300;
2714
+ background: var(--cs-ui-bg-app-bar, #191917);
2715
+ border: 1px solid var(--cs-ui-border-dark, rgba(255, 255, 255, 0.16));
2716
+ border-radius: 6px;
2717
+ padding: 3px 5px;
2718
+ display: inline-flex;
2719
+ align-items: center;
2720
+ gap: 4px;
2721
+ box-shadow: 0 4px 14px rgba(0, 0, 0, 0.35);
2722
+ animation: csFadeIn 0.12s ease-out;
2723
+ }
2724
+ .cs-selection-btn {
2725
+ display: inline-flex;
2726
+ align-items: center;
2727
+ gap: 5px;
2728
+ background: transparent;
2729
+ border: none;
2730
+ color: var(--cs-ui-text-dark-secondary, #a8a69d);
2731
+ font-size: 12px;
2732
+ font-weight: 500;
2733
+ padding: 4px 8px;
2734
+ cursor: pointer;
2735
+ border-radius: 4px;
2736
+ transition: all 0.12s ease;
2737
+ }
2738
+ .cs-selection-btn:hover {
2739
+ background: rgba(255, 255, 255, 0.12);
2740
+ color: var(--cs-ui-text-dark-primary, #f5f4ee);
2741
+ }
2742
+ .cs-selection-btn-format {
2743
+ color: var(--cs-ui-accent-badge, #d97706);
2744
+ font-weight: 600;
2745
+ }
2746
+ .cs-selection-btn-format:hover {
2747
+ background: rgba(217, 119, 6, 0.18);
2748
+ color: var(--cs-ui-accent-border, #fcd34d);
2749
+ }
2750
+ .cs-selection-sep {
2751
+ width: 1px;
2752
+ height: 14px;
2753
+ background: var(--cs-ui-border-dark, rgba(255, 255, 255, 0.16));
2754
+ }
2755
+
2756
+ /* ── Onboarding Dialog ── */
2757
+ .cs-onboarding-dialog {
2758
+ max-width: 580px !important;
2759
+ }
2760
+ .cs-tabs-header {
2761
+ display: flex;
2762
+ border-bottom: 1px solid var(--cs-ui-border-light, #e8e8e4);
2763
+ background: var(--cs-ui-bg-panel-subtle, #f4f2ea);
2764
+ }
2765
+ .cs-tab-btn {
2766
+ flex: 1;
2767
+ padding: 10px 14px;
2768
+ background: transparent;
2769
+ border: none;
2770
+ border-bottom: 2px solid transparent;
2771
+ font-size: 13px;
2772
+ font-weight: 500;
2773
+ color: var(--cs-ui-text-light-secondary, #59574f);
2774
+ cursor: pointer;
2775
+ transition: all 0.15s ease;
2776
+ }
2777
+ .cs-tab-btn:hover {
2778
+ color: var(--cs-ui-text-light-primary, #1c1b18);
2779
+ }
2780
+ .cs-tab-btn.active {
2781
+ color: var(--cs-ui-accent, #c4760a);
2782
+ border-bottom-color: var(--cs-ui-accent, #c4760a);
2783
+ background: #ffffff;
2784
+ font-weight: 600;
2785
+ }
2786
+ .cs-onboarding-body {
2787
+ padding: 20px;
2788
+ }
2789
+ .cs-onboarding-section {
2790
+ display: flex;
2791
+ flex-direction: column;
2792
+ }
2793
+ .cs-onboarding-h3 {
2794
+ margin: 0 0 8px 0;
2795
+ font-size: 15px;
2796
+ font-weight: 600;
2797
+ color: var(--cs-ui-text-light-primary, #1c1b18);
2798
+ }
2799
+ .cs-onboarding-desc {
2800
+ margin: 0 0 16px 0;
2801
+ font-size: 13px;
2802
+ line-height: 1.5;
2803
+ color: var(--cs-ui-text-light-secondary, #59574f);
2804
+ }
2805
+ .cs-onboarding-card {
2806
+ display: flex;
2807
+ flex-direction: column;
2808
+ gap: 12px;
2809
+ background: var(--cs-ui-bg-panel-subtle, #f4f2ea);
2810
+ border: 1px solid var(--cs-ui-border-light, #e2e0d6);
2811
+ border-radius: 6px;
2812
+ padding: 14px;
2813
+ margin-bottom: 8px;
2814
+ }
2815
+ .cs-onboarding-step {
2816
+ display: flex;
2817
+ align-items: flex-start;
2818
+ gap: 10px;
2819
+ font-size: 13px;
2820
+ line-height: 1.4;
2821
+ color: var(--cs-ui-text-light-primary, #1c1b18);
2822
+ }
2823
+ .cs-onboarding-step-num {
2824
+ width: 20px;
2825
+ height: 20px;
2826
+ border-radius: 50%;
2827
+ background: var(--cs-ui-accent, #c4760a);
2828
+ color: #ffffff;
2829
+ font-size: 11px;
2830
+ font-weight: 700;
2831
+ display: flex;
2832
+ align-items: center;
2833
+ justify-content: center;
2834
+ flex-shrink: 0;
2835
+ }
2836
+
2837
+
2838
+
2839
+
2840
+ /* ── Title page form ─────────────────────────────────────────────────────── */
2841
+ .cs-tp-dialog {
2842
+ width: 760px;
2843
+ max-width: calc(100vw - 32px);
2844
+ max-height: 90vh;
2845
+ }
2846
+ /* Vertical tabs on the left, the active section on the right. The body has a fixed
2847
+ height so switching tabs never resizes the dialog. */
2848
+ .cs-tp-body {
2849
+ display: flex;
2850
+ height: min(440px, calc(90vh - 120px));
2851
+ min-height: 0;
2852
+ }
2853
+ .cs-tp-tabs {
2854
+ flex: 0 0 176px;
2855
+ display: flex;
2856
+ flex-direction: column;
2857
+ gap: 2px;
2858
+ padding: 12px 8px;
2859
+ border-right: 1px solid var(--cs-ui-border-light-subtle, #eeece4);
2860
+ background: var(--cs-ui-bg-panel-subtle, #f4f2ea);
2861
+ overflow-y: auto;
2862
+ }
2863
+ .cs-tp-tab {
2864
+ text-align: left;
2865
+ font: inherit;
2866
+ font-size: 13px;
2867
+ line-height: 1.3;
2868
+ padding: 8px 10px;
2869
+ border: none;
2870
+ border-radius: 6px;
2871
+ background: none;
2872
+ color: var(--cs-ui-text-light-secondary, #59574f);
2873
+ cursor: pointer;
2874
+ }
2875
+ .cs-tp-tab:hover { background: rgba(0, 0, 0, 0.04); color: var(--cs-ui-text-light-primary, #1c1b18); }
2876
+ .cs-tp-tab:focus-visible { outline: 2px solid #1976d2; outline-offset: -2px; }
2877
+ .cs-tp-tab-active,
2878
+ .cs-tp-tab-active:hover {
2879
+ background: #fff;
2880
+ color: var(--cs-ui-text-light-primary, #1c1b18);
2881
+ font-weight: 600;
2882
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
2883
+ }
2884
+ .cs-tp-form {
2885
+ flex: 1;
2886
+ min-width: 0;
2887
+ overflow-y: auto;
2888
+ padding: 16px;
2889
+ }
2890
+ .cs-tp-panel {
2891
+ display: grid;
2892
+ gap: 10px;
2893
+ align-content: start;
2894
+ }
2895
+ .cs-tp-panel[hidden] { display: none; }
2896
+ .cs-tp-field {
2897
+ display: grid;
2898
+ grid-template-columns: 150px 1fr;
2899
+ align-items: start;
2900
+ gap: 12px;
2901
+ }
2902
+ .cs-tp-label {
2903
+ font-size: 13px;
2904
+ color: var(--cs-ui-text-light-primary, #1c1b18);
2905
+ padding-top: 6px;
2906
+ }
2907
+ .cs-tp-input {
2908
+ width: 100%;
2909
+ box-sizing: border-box;
2910
+ font: inherit;
2911
+ font-size: 13px;
2912
+ padding: 6px 8px;
2913
+ border: 1px solid var(--cs-ui-border-light, #ccc);
2914
+ border-radius: 4px;
2915
+ background: #fff;
2916
+ color: #1a1a18;
2917
+ resize: vertical;
2918
+ }
2919
+ .cs-tp-input:focus { outline: 2px solid #1976d2; outline-offset: 1px; }
2920
+ .cs-tp-row {
2921
+ display: grid;
2922
+ grid-template-columns: 150px 1fr auto;
2923
+ gap: 12px;
2924
+ align-items: center;
2925
+ }
2926
+ .cs-tp-lang-select, .cs-tp-key { min-width: 0; width: 100%; }
2927
+ .cs-tp-remove {
2928
+ border: none;
2929
+ background: none;
2930
+ font-size: 18px;
2931
+ line-height: 1;
2932
+ color: var(--cs-ui-text-light-secondary, #59574f);
2933
+ cursor: pointer;
2934
+ padding: 4px 6px;
2935
+ }
2936
+ .cs-tp-remove:hover { color: #c5221f; }
2937
+ .cs-tp-add, .cs-tp-link {
2938
+ justify-self: start;
2939
+ border: none;
2940
+ background: none;
2941
+ padding: 2px 0;
2942
+ font-size: 12px;
2943
+ color: var(--cs-ui-accent, #c4760a);
2944
+ cursor: pointer;
2945
+ }
2946
+ .cs-tp-add { margin-left: 162px; }
2947
+ .cs-tp-add:hover, .cs-tp-link:hover { text-decoration: underline; }
2948
+ .cs-tp-date { display: flex; align-items: center; gap: 10px; }
2949
+ .cs-tp-date .cs-tp-input { max-width: 220px; }
2950
+ .cs-tp-chips { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
2951
+ .cs-tp-chip {
2952
+ display: inline-flex;
2953
+ align-items: center;
2954
+ gap: 4px;
2955
+ font-size: 12px;
2956
+ padding: 3px 4px 3px 10px;
2957
+ border-radius: 12px;
2958
+ background: var(--cs-ui-bg-panel-subtle, #f4f2ea);
2959
+ border: 1px solid var(--cs-ui-border-light-subtle, #e2e0d8);
2960
+ }
2961
+ .cs-tp-chip button {
2962
+ border: none;
2963
+ background: none;
2964
+ cursor: pointer;
2965
+ font-size: 14px;
2966
+ line-height: 1;
2967
+ color: var(--cs-ui-text-light-secondary, #59574f);
2968
+ padding: 0 4px;
2969
+ }
2970
+ .cs-tp-count, .cs-tp-count-warn, .cs-tp-count-bad {
2971
+ display: block;
2972
+ font-size: 11px;
2973
+ margin-top: 2px;
2974
+ }
2975
+ .cs-tp-count { color: #8a887f; }
2976
+ .cs-tp-count-warn { color: #b06000; }
2977
+ .cs-tp-count-bad { color: #c5221f; }
2978
+ .cs-tp-note {
2979
+ margin: 0;
2980
+ font-size: 12px;
2981
+ color: var(--cs-ui-text-light-secondary, #59574f);
2982
+ }
2983
+ .cs-tp-actions {
2984
+ border-top: 1px solid var(--cs-ui-border-light-subtle, #eeece4);
2985
+ padding: 12px 16px;
2986
+ display: flex;
2987
+ justify-content: flex-end;
2988
+ gap: 8px;
2989
+ background: var(--cs-ui-bg-panel-subtle, #f4f2ea);
2990
+ }
2991
+ @media (max-width: 560px) {
2992
+ .cs-tp-body { flex-direction: column; height: min(520px, calc(90vh - 120px)); }
2993
+ .cs-tp-tabs {
2994
+ flex: 0 0 auto;
2995
+ flex-direction: row;
2996
+ overflow-x: auto;
2997
+ border-right: none;
2998
+ border-bottom: 1px solid var(--cs-ui-border-light-subtle, #eeece4);
2999
+ padding: 6px 8px;
3000
+ }
3001
+ .cs-tp-tab { white-space: nowrap; }
3002
+ .cs-tp-field, .cs-tp-row { grid-template-columns: 1fr; gap: 4px; }
3003
+ .cs-tp-row { grid-template-columns: 1fr auto; }
3004
+ .cs-tp-row > :first-child { grid-column: 1 / -1; }
3005
+ .cs-tp-add { margin-left: 0; }
3006
+ }