@sutrata/editor 0.1.0 → 0.1.2

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 (152) hide show
  1. package/README.md +87 -0
  2. package/dist/ai/generated-providers.json +1 -1
  3. package/package.json +36 -9
  4. package/scripts/copy-assets.mjs +0 -16
  5. package/scripts/generate-providers.mjs +0 -127
  6. package/src/ai/OnboardingDialog.tsx +0 -390
  7. package/src/ai/VoiceConfirmDialog.tsx +0 -137
  8. package/src/ai/VoiceToolbar.tsx +0 -321
  9. package/src/ai/ai-client.ts +0 -596
  10. package/src/ai/commands.ts +0 -164
  11. package/src/ai/generated-providers.json +0 -3696
  12. package/src/ai/prompts.ts +0 -62
  13. package/src/ai/voice-service.ts +0 -96
  14. package/src/autocomplete/AutocompletePlugin.ts +0 -21
  15. package/src/autocomplete/suggestions.ts +0 -147
  16. package/src/context/DocumentContext.tsx +0 -648
  17. package/src/desktop-api.d.ts +0 -40
  18. package/src/editor/EditorView.tsx +0 -82
  19. package/src/editor/SelectionMenu.tsx +0 -152
  20. package/src/editor/attr-pencil-plugin.ts +0 -172
  21. package/src/editor/character-decoration-plugin.ts +0 -104
  22. package/src/editor/editor-bus.ts +0 -51
  23. package/src/editor/find-highlight-plugin.ts +0 -68
  24. package/src/editor/frontmatter-field-view.ts +0 -52
  25. package/src/editor/frontmatter-field.ts +0 -115
  26. package/src/editor/grapheme-cursor.ts +0 -99
  27. package/src/editor/ime-plugin.ts +0 -85
  28. package/src/editor/insert-helper.ts +0 -43
  29. package/src/editor/keymap.ts +0 -124
  30. package/src/editor/language-class-plugin.ts +0 -91
  31. package/src/editor/plugins.ts +0 -26
  32. package/src/editor/prosemirror-to-sutra.ts +0 -192
  33. package/src/editor/scene-heading-view.ts +0 -147
  34. package/src/editor/schema.ts +0 -156
  35. package/src/editor/sutra-to-prosemirror.ts +0 -156
  36. package/src/extensions/storage-adapter.ts +0 -65
  37. package/src/extensions/types.ts +0 -60
  38. package/src/file/docx-exporter.ts +0 -585
  39. package/src/file/docx-importer.ts +0 -313
  40. package/src/file/print-paginator.ts +0 -301
  41. package/src/file/templates.ts +0 -73
  42. package/src/file/workflow-reports.ts +0 -820
  43. package/src/findreplace/FindReplace.tsx +0 -242
  44. package/src/findreplace/find-engine.ts +0 -97
  45. package/src/findreplace/scroll-to-match.ts +0 -89
  46. package/src/fonts/tofu-detect.ts +0 -53
  47. package/src/i18n/LanguageContext.tsx +0 -207
  48. package/src/i18n/language-detect.ts +0 -73
  49. package/src/i18n/useTranslation.tsx +0 -74
  50. package/src/index.ts +0 -27
  51. package/src/locales/bn.json +0 -143
  52. package/src/locales/en.json +0 -143
  53. package/src/locales/gu.json +0 -143
  54. package/src/locales/hi.json +0 -143
  55. package/src/locales/kn.json +0 -143
  56. package/src/locales/ml.json +0 -143
  57. package/src/locales/mr.json +0 -143
  58. package/src/locales/or.json +0 -143
  59. package/src/locales/pa.json +0 -143
  60. package/src/locales/si.json +0 -143
  61. package/src/locales/ta.json +0 -143
  62. package/src/locales/te.json +0 -143
  63. package/src/navigator/SceneNavigator.tsx +0 -844
  64. package/src/navigator/StatisticsDialog.tsx +0 -249
  65. package/src/navigator/scene-list.ts +0 -84
  66. package/src/settings/SettingsDialog.tsx +0 -303
  67. package/src/shell/AppBar.tsx +0 -354
  68. package/src/shell/AppShell.tsx +0 -71
  69. package/src/shell/ConfirmDialog.tsx +0 -71
  70. package/src/shell/ElementToolbar.tsx +0 -175
  71. package/src/shell/LanguageStatus.tsx +0 -101
  72. package/src/shell/StatusBar.tsx +0 -135
  73. package/src/shell/SutrataLogo.tsx +0 -89
  74. package/src/shell/Toast.tsx +0 -46
  75. package/src/shell/ToolbarButton.tsx +0 -30
  76. package/src/shell/VersionHistory.tsx +0 -212
  77. package/src/shell/Watermark.tsx +0 -9
  78. package/src/shell/fonts/fonts.css +0 -1133
  79. package/src/shell/icons.tsx +0 -335
  80. package/src/shell/toolbar-actions.ts +0 -59
  81. package/src/source/SourceView.tsx +0 -111
  82. package/src/source/find-highlight-source.ts +0 -57
  83. package/src/source/sutra-lang.ts +0 -121
  84. package/src/spellcheck/dictionaries.ts +0 -21
  85. package/src/spellcheck/hunspell.ts +0 -110
  86. package/src/spellcheck/spellcheck-plugin.ts +0 -83
  87. package/src/styles/StyleDialog.tsx +0 -148
  88. package/src/styles/builtin-styles.ts +0 -139
  89. package/src/styles/css-adapter.ts +0 -76
  90. package/src/styles/docx-adapter.ts +0 -109
  91. package/src/styles/embed-fonts.ts +0 -81
  92. package/src/styles/pagination.ts +0 -27
  93. package/src/styles/print-adapter.ts +0 -288
  94. package/src/styles/registry.ts +0 -20
  95. package/src/styles/screenplay.css +0 -3006
  96. package/src/styles/script-ranges.ts +0 -17
  97. package/src/styles/types.ts +0 -104
  98. package/src/styles/validate.ts +0 -114
  99. package/src/templates/templates.ts +0 -194
  100. package/src/titlepage/ExportDialog.tsx +0 -494
  101. package/src/titlepage/TitlePageDialog.tsx +0 -312
  102. package/src/titlepage/frontmatter-form.ts +0 -280
  103. package/src/titlepage/languages.ts +0 -37
  104. package/src/types.ts +0 -7
  105. package/tests/AppBar.test.tsx +0 -35
  106. package/tests/AppShell.test.tsx +0 -22
  107. package/tests/ElementToolbar.test.tsx +0 -36
  108. package/tests/LanguageStatus.test.tsx +0 -129
  109. package/tests/SelectionMenu.test.tsx +0 -71
  110. package/tests/ToolbarButton.test.tsx +0 -24
  111. package/tests/ai-onboarding.test.ts +0 -102
  112. package/tests/ai-status.test.tsx +0 -72
  113. package/tests/ai-structured.test.ts +0 -94
  114. package/tests/autocomplete/AutocompletePlugin.test.ts +0 -20
  115. package/tests/autocomplete/suggestions.test.ts +0 -106
  116. package/tests/document-context.test.tsx +0 -565
  117. package/tests/docx-importer.test.ts +0 -160
  118. package/tests/editor/character-decoration-plugin.test.ts +0 -101
  119. package/tests/editor/character-extension.test.ts +0 -44
  120. package/tests/editor/grapheme-cursor.test.ts +0 -118
  121. package/tests/editor/ime-plugin.test.ts +0 -72
  122. package/tests/editor/inline-note-bridge.test.ts +0 -32
  123. package/tests/editor/language-class-plugin.test.ts +0 -265
  124. package/tests/editor/title-page.test.ts +0 -124
  125. package/tests/embed-fonts.test.ts +0 -17
  126. package/tests/exporters.test.ts +0 -365
  127. package/tests/findreplace/FindReplace.test.tsx +0 -391
  128. package/tests/findreplace/find-engine.test.ts +0 -86
  129. package/tests/findreplace/scroll-to-match.test.ts +0 -50
  130. package/tests/fonts/tofu-detect.test.ts +0 -122
  131. package/tests/i18n/LanguageContext.test.tsx +0 -146
  132. package/tests/i18n/language-detect.test.ts +0 -54
  133. package/tests/i18n/locale-parity.test.ts +0 -25
  134. package/tests/i18n/useTranslation.test.tsx +0 -45
  135. package/tests/keymap.test.ts +0 -18
  136. package/tests/navigator/SceneNavigator.test.tsx +0 -177
  137. package/tests/navigator/StatisticsDialog.test.tsx +0 -63
  138. package/tests/navigator/scene-list.test.ts +0 -71
  139. package/tests/print-paginator.test.ts +0 -82
  140. package/tests/shell/VersionHistory.test.tsx +0 -129
  141. package/tests/spellcheck/hunspell.test.ts +0 -82
  142. package/tests/spellcheck/spellcheck-plugin.test.ts +0 -56
  143. package/tests/styles.test.ts +0 -315
  144. package/tests/templates/templates.test.ts +0 -83
  145. package/tests/titlepage/TitlePageDialog.test.tsx +0 -90
  146. package/tests/titlepage/apply-title-page.test.ts +0 -61
  147. package/tests/titlepage/frontmatter-form.test.ts +0 -115
  148. package/tests/toolbar-actions.test.ts +0 -93
  149. package/tests/voice-commands.test.ts +0 -58
  150. package/tsconfig.json +0 -17
  151. package/vitest.config.ts +0 -11
  152. package/vitest.setup.ts +0 -65
@@ -1,3006 +0,0 @@
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
- }