glideshow 0.1.2__py3-none-any.whl

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 (103) hide show
  1. glideshow/__init__.py +15 -0
  2. glideshow/__main__.py +3 -0
  3. glideshow/agent.py +681 -0
  4. glideshow/build.py +54 -0
  5. glideshow/cli.py +320 -0
  6. glideshow/comments.py +35 -0
  7. glideshow/decks.py +230 -0
  8. glideshow/docs/agents.md +223 -0
  9. glideshow/docs/deck-format.md +125 -0
  10. glideshow/editor/.assetsignore +5 -0
  11. glideshow/editor/apple-touch-icon.png +0 -0
  12. glideshow/editor/data/font-metrics.json +1 -0
  13. glideshow/editor/data/fonts.json +1 -0
  14. glideshow/editor/data/icons.json +1 -0
  15. glideshow/editor/data/symbols.js +42 -0
  16. glideshow/editor/data/themes.js +15 -0
  17. glideshow/editor/deck/base.css +92 -0
  18. glideshow/editor/deck/present.js +222 -0
  19. glideshow/editor/deck/shapes.js +377 -0
  20. glideshow/editor/deck/template.html +37 -0
  21. glideshow/editor/editor.css +657 -0
  22. glideshow/editor/glideshow-1024.png +0 -0
  23. glideshow/editor/glideshow.svg +10 -0
  24. glideshow/editor/globals.d.ts +21 -0
  25. glideshow/editor/home.html +358 -0
  26. glideshow/editor/index.html +386 -0
  27. glideshow/editor/js/arrange.js +122 -0
  28. glideshow/editor/js/boot.js +66 -0
  29. glideshow/editor/js/boxes.js +25 -0
  30. glideshow/editor/js/comments.js +85 -0
  31. glideshow/editor/js/context-menus.js +93 -0
  32. glideshow/editor/js/dialogs.js +168 -0
  33. glideshow/editor/js/dock.js +22 -0
  34. glideshow/editor/js/draw.js +107 -0
  35. glideshow/editor/js/file.js +318 -0
  36. glideshow/editor/js/find.js +72 -0
  37. glideshow/editor/js/format-panel.js +101 -0
  38. glideshow/editor/js/geometry.js +153 -0
  39. glideshow/editor/js/guides.js +37 -0
  40. glideshow/editor/js/insert.js +73 -0
  41. glideshow/editor/js/keyboard.js +256 -0
  42. glideshow/editor/js/live.js +48 -0
  43. glideshow/editor/js/menubar.js +290 -0
  44. glideshow/editor/js/menus.js +93 -0
  45. glideshow/editor/js/motion.js +148 -0
  46. glideshow/editor/js/notes.js +63 -0
  47. glideshow/editor/js/objects.js +202 -0
  48. glideshow/editor/js/people.js +73 -0
  49. glideshow/editor/js/phone-comments.js +43 -0
  50. glideshow/editor/js/phone-edit.js +253 -0
  51. glideshow/editor/js/phone-home.js +51 -0
  52. glideshow/editor/js/phone-mode.js +73 -0
  53. glideshow/editor/js/phone-sheets.js +153 -0
  54. glideshow/editor/js/phone-touch.js +145 -0
  55. glideshow/editor/js/phone-view.js +150 -0
  56. glideshow/editor/js/pointer.js +407 -0
  57. glideshow/editor/js/render.js +353 -0
  58. glideshow/editor/js/shortcuts.js +67 -0
  59. glideshow/editor/js/slides.js +120 -0
  60. glideshow/editor/js/spacing.js +23 -0
  61. glideshow/editor/js/state.js +58 -0
  62. glideshow/editor/js/storage.js +250 -0
  63. glideshow/editor/js/text.js +366 -0
  64. glideshow/editor/js/theme-toggle.js +41 -0
  65. glideshow/editor/js/theme.js +173 -0
  66. glideshow/editor/js/toolbar-groups.js +109 -0
  67. glideshow/editor/js/toolbar.js +372 -0
  68. glideshow/editor/lib/browser-db.js +47 -0
  69. glideshow/editor/lib/library.js +612 -0
  70. glideshow/editor/lib/merge.js +174 -0
  71. glideshow/editor/lib/move-local.js +51 -0
  72. glideshow/editor/lib/onefile.js +108 -0
  73. glideshow/editor/lib/store-browser.js +75 -0
  74. glideshow/editor/lib/store-folder.js +109 -0
  75. glideshow/editor/local/sw.js +66 -0
  76. glideshow/editor/local/tsconfig.json +5 -0
  77. glideshow/editor/looks/glider.svg +9 -0
  78. glideshow/editor/looks/thermal-phone.css +144 -0
  79. glideshow/editor/looks/thermal.css +268 -0
  80. glideshow/editor/manifest.json +23 -0
  81. glideshow/editor/phone.css +345 -0
  82. glideshow/editor/share/share.css +124 -0
  83. glideshow/editor/share/share.js +256 -0
  84. glideshow/editor/share/speaker.html +88 -0
  85. glideshow/editor/tsconfig.json +6 -0
  86. glideshow/figure.py +33 -0
  87. glideshow/fonts.py +63 -0
  88. glideshow/gslides.py +1065 -0
  89. glideshow/history.py +210 -0
  90. glideshow/merge.py +210 -0
  91. glideshow/osutil.py +44 -0
  92. glideshow/pptx_export.py +207 -0
  93. glideshow/pptx_import.py +115 -0
  94. glideshow/publish.py +106 -0
  95. glideshow/render.py +288 -0
  96. glideshow/server.py +549 -0
  97. glideshow/service.py +65 -0
  98. glideshow/skills/glideshow/SKILL.md +85 -0
  99. glideshow-0.1.2.dist-info/METADATA +69 -0
  100. glideshow-0.1.2.dist-info/RECORD +103 -0
  101. glideshow-0.1.2.dist-info/WHEEL +4 -0
  102. glideshow-0.1.2.dist-info/entry_points.txt +2 -0
  103. glideshow-0.1.2.dist-info/licenses/LICENSE +662 -0
@@ -0,0 +1,657 @@
1
+ /* Editor chrome. Design tokens follow Google Slides; use them instead of literal values. */
2
+ :root {
3
+ --font: Roboto, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Arial, sans-serif;
4
+ --blue: #1a73e8; --blue-hover: #1765cc; --hover: #e9eef6; --selected: #d3e3fd;
5
+ --ink: #202124; --muted: #5f6368; --divider: #dadce0;
6
+ --chrome: #f8fafd; --surface: #ffffff; --stage: #f8fafd; --toolbar: #f0f5f9; --guide: #b0413e; --spacing: #3fa9b8; --tip: #3c4043; --skipped: #f9ab00;
7
+ --slide-shadow: 0 0 0 1px #c7c7c9; /* Slides: a thin grey edge, no shadow */
8
+ --menu-shadow: 0 2px 6px rgba(60, 64, 67, .15), 0 1px 2px rgba(60, 64, 67, .3);
9
+ --ctl-h: 28px; --radius: 4px; --gutter: 8px;
10
+ --icon: #444746; --outline: #c4c7c5;
11
+ }
12
+ /* Dark chrome (View → Dark mode, or the system setting when not chosen): only the editor around the slide changes. */
13
+ body.dark {
14
+ --ink: #e3e3e3; --muted: #c4c7c5; --divider: #444746; --icon: #c4c7c5; --outline: #5e5e5e;
15
+ --chrome: #1b1b1b; --surface: #2b2b2b; --stage: #131314; --toolbar: #282a2c; --hover: #333537; --selected: #004a77; --tip: #e3e3e3;
16
+ --slide-shadow: 0 0 0 1px #444746;
17
+ --menu-shadow: 0 2px 6px rgba(0, 0, 0, .5), 0 1px 2px rgba(0, 0, 0, .6);
18
+ color-scheme: dark;
19
+ }
20
+ body.dark .tip { color: #1f1f1f; }
21
+ * { box-sizing: border-box; }
22
+ html, body { margin: 0; height: 100%; }
23
+ body { display: flex; flex-direction: column; background: var(--stage); color: var(--ink); font: 13px var(--font); }
24
+ :where(span.icon) { display: inline-block; width: 1em; overflow: hidden; } /* before the icon font loads, a name like "format_bold" must not widen the toolbar */
25
+ .icon { font-family: "Material Symbols Outlined"; font-weight: normal; font-style: normal; font-size: 20px; line-height: 1; letter-spacing: normal; text-transform: none; white-space: nowrap; direction: ltr; -webkit-font-smoothing: antialiased; font-feature-settings: "liga"; }
26
+
27
+ #ed-bar { background: var(--chrome); }
28
+ #ed-top { display: flex; align-items: center; gap: var(--gutter); padding: 6px 16px 0 12px; }
29
+ #ed-app-icon { display: block; flex: none; }
30
+ #ed-app-icon img { display: block; width: 36px; height: 36px; } /* the mascot: a slide on a paraglider (glideshow.svg) */
31
+ #ed-app-icon { position: relative; }
32
+ #ed-app-icon .stage { position: absolute; left: 50%; bottom: -7px; translate: -50% 0; padding: 0 4px; border-radius: 999px; background: var(--blue); color: #fff; font: 600 8px/13px var(--font, sans-serif); letter-spacing: .05em; text-transform: uppercase; pointer-events: none; box-shadow: 0 0 0 1.5px var(--bg, #fff); } /* alpha */
33
+ html.phone #ed-app-icon .stage { display: none; }
34
+ #ed-title-col { display: flex; flex-direction: column; min-width: 0; }
35
+ #ed-title-row { display: flex; align-items: center; gap: var(--gutter); }
36
+ /* the deck's date, as a quiet chip beside the title */
37
+ input#ed-date { height: 26px; padding: 0 8px; border: 1px solid transparent; border-radius: 13px; background: var(--toolbar); color: var(--muted); font: inherit; font-size: 13px; }
38
+ input#ed-date:hover, input#ed-date:focus { border-color: var(--divider); color: var(--ink); outline: none; }
39
+
40
+ input#ed-title { font-family: inherit; font-size: 18px; font-weight: 400; border: 1px solid transparent; border-radius: var(--radius); padding: 2px 6px; field-sizing: content; min-width: 120px; max-width: 480px; color: var(--ink); background: none; }
41
+ input#ed-title:hover, input#ed-title:focus { border-color: var(--divider); outline: none; }
42
+ #ed-menubar { display: flex; margin-left: 1px; }
43
+ #ed-menubar button { height: 24px; padding: 0 7px; font-size: 14px; color: var(--ink); }
44
+ #ed-menubar button.open { background: var(--selected); }
45
+ #ed-slideshow { margin-left: auto; }
46
+ #ed-comments-btn { position: relative; display: grid; place-items: center; width: 40px; height: 40px; margin-left: auto; margin-right: 8px; padding: 0; border-radius: 50%; }
47
+ #ed-comments-btn ~ #ed-slideshow { margin-left: 0; } #ed-comments-btn.on { background: var(--selected); }
48
+ #ed-comments-n { position: absolute; top: 2px; right: 0; min-width: 16px; height: 16px; padding: 0 4px; border-radius: 8px; background: #fbbc04; color: #000; font-size: 11px; line-height: 16px; }
49
+ #ed-comments-n:empty { display: none; }
50
+ #ed-comments:not([hidden]) { display: flex; flex-direction: column; }
51
+ #ed-comments .cm-tools { display: flex; align-items: center; justify-content: space-between; padding: 10px 12px 6px 16px; }
52
+ #ed-comments .cm-tools .tonal { display: flex; align-items: center; gap: 6px; } #ed-comments .cm-res { display: flex; align-items: center; gap: 6px; font-size: 13px; color: var(--muted); }
53
+ #ed-cm-list { flex: 1; overflow-y: auto; padding: 4px 12px 16px; display: flex; flex-direction: column; gap: 10px; }
54
+ .cm-card { border: 1px solid var(--divider); border-radius: 10px; padding: 10px 12px; display: grid; gap: 6px; font-size: 13px; cursor: pointer; background: var(--surface); }
55
+ .cm-card:hover { box-shadow: 0 1px 3px rgba(0, 0, 0, .15); } .cm-card.here { border-color: #fbbc04; box-shadow: inset 3px 0 0 #fbbc04; } .cm-card.done { opacity: .6; }
56
+ .cm-card .cm-top { display: flex; justify-content: space-between; color: var(--muted); font-size: 12px; } .cm-card .cm-by { font-weight: 500; color: var(--ink); }
57
+ .cm-card .cm-quote { border-left: 3px solid #fbbc04; padding-left: 8px; color: var(--muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
58
+ .cm-card .cm-text { white-space: pre-wrap; overflow-wrap: anywhere; color: var(--ink); }
59
+ .cm-card .cm-reply { border-top: 1px solid var(--divider); padding-top: 6px; overflow-wrap: anywhere; } .cm-card .cm-reply.event { color: var(--muted); font-size: 12px; }
60
+ .cm-card .cm-acts { display: flex; align-items: center; gap: 4px; } .cm-card .cm-acts button { height: 28px; padding: 0 8px; color: var(--blue); font-weight: 500; }
61
+ .cm-card input, .cm-card textarea { flex: 1; min-width: 0; font: inherit; color: var(--ink); background: none; border: 1px solid var(--divider); border-radius: var(--radius); padding: 5px 8px; }
62
+ .cm-card textarea { resize: vertical; } .cm-empty { color: var(--muted); font-size: 13px; padding: 8px 4px; }
63
+ .cm-pin { position: absolute; z-index: 5; width: 28px; height: 28px; margin-top: -28px; border-radius: 14px 14px 14px 0; background: #fbbc04; color: #000; font: 600 13px/28px Roboto, sans-serif; text-align: center; box-shadow: 0 1px 4px rgba(0, 0, 0, .3); cursor: pointer; pointer-events: auto; }
64
+ .split { display: flex; }
65
+ .split > button { height: 36px; border: 1px solid var(--divider); background: var(--chrome); font-weight: 500; color: var(--ink); }
66
+ .split > button:first-child { border-radius: 18px 0 0 18px; padding: 0 12px 0 16px; }
67
+ .split > button:last-child { border-radius: 0 18px 18px 0; border-left: 0; padding: 0 6px; }
68
+ .split > button:hover, .split > button.open { background: var(--hover); }
69
+ /* Share, as Slides' blue pill beside Slideshow; its dialog publishes the deck to the web */
70
+ #ed-share { display: flex; align-items: center; gap: 6px; height: 36px; margin-left: 8px; padding: 0 16px 0 12px; border: 0; border-radius: 18px; background: var(--selected); color: var(--ink); font-weight: 500; }
71
+ #ed-share:hover { background: var(--hover); box-shadow: inset 0 0 0 1px var(--divider); }
72
+ #ed-share .icon { font-size: 18px; }
73
+ #ed-share.on .icon { color: var(--blue); }
74
+ .share-dialog { width: 480px; }
75
+ .bg-row[hidden] { display: none; } /* its display: flex would otherwise show a hidden row (the share link before there is one) */
76
+ .share-dialog .bg-row > .share-exp { flex-direction: row; padding-right: 0; } /* the date and its × side by side, not stacked as the row's text is */
77
+ .share-dialog .bg-row > span { display: flex; flex-direction: column; gap: 4px; padding-right: 16px; }
78
+ .share-dialog small { color: var(--muted); font-size: 12px; line-height: 16px; }
79
+ .share-dialog .share-link { gap: 8px; } .share-dialog .share-link .outlined { display: flex; align-items: center; gap: 6px; padding: 0 14px; }
80
+ .share-dialog .share-access select { height: 36px; }
81
+ .share-dialog .share-people { flex-direction: column; align-items: stretch; gap: 4px; padding-bottom: 8px; }
82
+ .share-dialog .people-box { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; min-height: 42px; padding: 5px 8px; border: 1px solid var(--divider); border-radius: var(--radius); cursor: text; box-sizing: border-box; }
83
+ .share-dialog .people-box:focus-within { outline: 2px solid var(--blue); outline-offset: -1px; }
84
+ .share-dialog .people-box input { flex: 1; min-width: 160px; height: 30px; padding: 0 2px; border: 0; outline: 0; background: none; font: inherit; color: var(--ink); }
85
+ .share-dialog .person { display: inline-flex; align-items: center; gap: 2px; max-width: 100%; height: 28px; padding: 0 2px 0 10px; border-radius: 14px; background: var(--selected); color: var(--ink); font-size: 13px; }
86
+ .share-dialog .person > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
87
+ .share-dialog .person button.icon { flex: none; display: grid; place-items: center; width: 22px; height: 22px; padding: 0; border: 0; border-radius: 50%; background: none; color: var(--muted); font-size: 16px; }
88
+ .share-dialog .person button.icon:hover { background: rgba(0, 0, 0, .08); color: var(--ink); }
89
+ .share-dialog .person.bad { background: none; box-shadow: inset 0 0 0 1px #d93025; color: #d93025; }
90
+ .share-dialog .share-exp { display: flex; align-items: center; gap: 4px; } .share-dialog .share-exp input { font: inherit; color: var(--ink); background: none; border: 1px solid var(--divider); border-radius: var(--radius); height: 36px; padding: 0 8px; }
91
+ .share-dialog .share-status { min-height: 0; padding-top: 4px; font-size: 13px; color: var(--muted); } .share-dialog .share-status.err { color: #d93025; }
92
+ input.switch { appearance: none; position: relative; flex: none; width: 36px; height: 20px; margin: 0; border-radius: 10px; background: var(--divider); cursor: pointer; transition: background .15s; }
93
+ input.switch::after { content: ""; position: absolute; left: 2px; top: 2px; width: 16px; height: 16px; border-radius: 50%; background: var(--surface); box-shadow: 0 1px 2px rgba(0, 0, 0, .3); transition: left .15s; }
94
+ input.switch:checked { background: var(--blue); } input.switch:checked::after { left: 18px; }
95
+ input.switch:disabled { opacity: .5; cursor: progress; }
96
+
97
+ #ed-toolbar { display: flex; align-items: center; gap: 2px; margin: 4px 8px 6px; padding: 1px 6px; min-height: 34px; background: var(--toolbar); border-radius: 18px; white-space: nowrap; overflow: hidden; }
98
+ #ed-toolbar > .grp:first-child { border-left: 0; }
99
+ #ed-more-wrap { margin-left: auto; }
100
+ #ed-more-wrap[hidden] { display: none; }
101
+ #ed-more-pop { display: none; position: fixed; right: 12px; z-index: 20; flex-wrap: wrap; gap: 4px; max-width: min(720px, 90vw); padding: 6px; background: var(--surface); border-radius: var(--radius); box-shadow: var(--menu-shadow); }
102
+ #ed-more-pop.open { display: flex; }
103
+ #ed-more-pop > .grp { border-left: 0; }
104
+ .menu { position: fixed; z-index: 30; min-width: 220px; padding: 6px 0; background: var(--surface); border-radius: 8px; box-shadow: var(--menu-shadow); }
105
+ .menu-item { display: flex; width: 100%; height: 36px; align-items: center; gap: 12px; padding: 0 12px; border-radius: 0; text-align: left; font-size: 14px; color: var(--ink); }
106
+ .menu-item:hover:not(:disabled), .menu-item:focus-visible, .menu-item.has-sub:focus { background: var(--hover); outline: none; }
107
+ .menu-item:disabled { color: var(--muted); opacity: .5; }
108
+ .menu-icon { width: 20px; font-size: 18px; color: var(--icon); text-align: center; }
109
+ .menu-label { flex: 1; white-space: nowrap; }
110
+ .menu-key { margin-left: 24px; color: var(--muted); font-size: 13px; }
111
+ .menu-key.icon { margin-left: 8px; font-size: 20px; }
112
+ #ed-toolbar .font-pick { justify-content: space-between; width: 116px; padding: 0 2px 0 8px; font-size: 14px; }
113
+ #ed-toolbar .font-pick .font-name { overflow: hidden; text-overflow: ellipsis; }
114
+ .menu-sep { height: 1px; margin: 6px 0; background: var(--divider); }
115
+ .grp { display: flex; align-items: center; gap: 2px; padding: 0 var(--gutter); border-left: 1px solid var(--divider); }
116
+ body:not(.has-sel) .sel-only, body.has-sel .nosel-only { display: none !important; }
117
+ body:not(.sel-line) .line-only { display: none !important; }
118
+ body:not(.sel-image) .image-only { display: none !important; }
119
+ .menu-label svg { display: block; }
120
+ body.sel-notext :is(.swatch[data-for=fill], .grp[data-i="3"] > :not(#ed-link), .grp[data-i="4"], #ed-clear-fmt) { display: none !important; }
121
+ button, select, input[type=number] { font: inherit; color: var(--ink); background: none; border: 1px solid transparent; border-radius: var(--radius); height: var(--ctl-h); padding: 0 var(--gutter); cursor: pointer; }
122
+ button:hover, select:hover { background: var(--hover); }
123
+ button.on { background: var(--selected); color: var(--blue); }
124
+ button:disabled { opacity: 0.35; cursor: default; background: none; }
125
+ button.primary { background: var(--blue); color: #fff; font-weight: 500; }
126
+ button.primary:hover { background: var(--blue-hover); }
127
+ select { border-color: var(--divider); }
128
+ input[type=number] { width: 58px; border-color: var(--divider); padding: 0 4px; cursor: text; }
129
+ .swatch { position: relative; display: flex; flex-direction: column; align-items: center; justify-content: center; height: var(--ctl-h); min-width: var(--ctl-h); padding: 0 4px; border-radius: var(--radius); color: var(--ink); cursor: pointer; }
130
+ .swatch:hover { background: var(--hover); }
131
+ .swatch .icon { font-size: 18px; }
132
+ .swatch .bar { display: block; width: 18px; height: 4px; margin-top: 1px; border-radius: 1px; box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .12); }
133
+ .color-input { position: absolute; width: 0; height: 0; padding: 0; border: 0; opacity: 0; pointer-events: none; }
134
+ #ed-toolbar .swatch { gap: 0; }
135
+ .swatch.text { flex-direction: row; gap: 6px; padding: 0 var(--gutter); }
136
+ .swatch.text input { position: static; width: 22px; height: 18px; opacity: 1; padding: 0; border: 1px solid var(--divider); border-radius: 2px; background: none; }
137
+ #ed-toolbar button { min-width: var(--ctl-h); padding: 0 4px; display: inline-flex; align-items: center; justify-content: center; color: var(--ink); }
138
+ #ed-toolbar button .icon { font-size: 20px; }
139
+ .palette { padding: 8px 0; min-width: 0; }
140
+ .palette .transparent { gap: 8px; padding-left: 12px; }
141
+ .palette .transparent .icon { font-size: 18px; color: var(--muted); }
142
+ .cells { display: grid; grid-template-columns: repeat(10, 18px); gap: 3px; padding: 4px 12px; }
143
+ .cell { width: 18px; height: 18px; min-width: 0; padding: 0; border: 0; border-radius: 50%; box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .12); cursor: pointer; }
144
+ .cell:hover { box-shadow: 0 0 0 2px var(--surface), 0 0 0 3px var(--muted); }
145
+ .cell.on { box-shadow: 0 0 0 2px var(--surface), 0 0 0 4px var(--blue); }
146
+ .cell.plus { display: flex; align-items: center; justify-content: center; background: var(--surface); color: var(--muted); }
147
+ .cell.plus .icon { font-size: 16px; }
148
+ .palette-head { padding: 8px 12px 2px; font-size: 11px; font-weight: 500; letter-spacing: .08em; color: var(--muted); }
149
+ .tip { position: fixed; z-index: 40; pointer-events: none; padding: 4px 8px; border-radius: var(--radius); background: var(--tip); color: #fff; font-size: 12px; line-height: 16px; white-space: nowrap; pointer-events: none; }
150
+ #ed-status { display: inline-flex; align-items: center; gap: 6px; color: var(--muted); white-space: nowrap; font-size: 13px; }
151
+ #ed-status .icon { font-size: 18px; }
152
+ #ed-status .icon:empty { display: none; }
153
+
154
+ main { flex: 1; display: flex; min-height: 0; }
155
+ #ed-side { width: 200px; flex: none; display: flex; flex-direction: column; background: var(--chrome); }
156
+ #ed-thumbs { flex: 1; overflow-y: auto; padding: 12px 12px 12px 4px; scrollbar-width: thin; scrollbar-color: var(--divider) transparent; }
157
+ #ed-thumbs::-webkit-scrollbar { width: 8px; }
158
+ #ed-thumbs::-webkit-scrollbar-thumb { background: var(--divider); border-radius: 4px; }
159
+ .thumb { display: flex; gap: 6px; margin-bottom: 16px; cursor: default; }
160
+ .thumb .num { display: flex; flex-direction: column; align-items: flex-end; gap: 4px; width: 20px; color: var(--muted); font-size: 12px; line-height: 16px; }
161
+ .thumb .skipped { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; background: rgb(255 255 255 / .6); }
162
+ .thumb .skipped .icon { font-size: 28px; color: var(--ink); }
163
+ .thumb .has-trans { font-size: 16px; color: var(--muted); }
164
+ .thumb-view { position: relative; width: 158px; aspect-ratio: var(--slide-ar, 16 / 9); overflow: hidden; border-radius: 8px; box-shadow: 0 0 0 1px var(--divider);
165
+ content-visibility: auto; } /* drawn (and its pictures decoded) only near the screen: a deck of big photos stays light */
166
+ .thumb:hover .thumb-view { box-shadow: 0 0 0 1px var(--muted); }
167
+ .thumb.active .thumb-view, .thumb.picked .thumb-view { box-shadow: 0 0 0 2px var(--blue); }
168
+ #ed-thumbs:not(:focus) .thumb.picked:not(.active) .thumb-view { box-shadow: 0 0 0 2px var(--selected), 0 0 0 3px var(--blue); }
169
+ .thumb-canvas { position: absolute; left: 0; top: 0; width: var(--slide-w, 1920px); height: var(--slide-h, 1080px); transform-origin: 0 0; pointer-events: none; }
170
+ .thumb-canvas > section, #ed-canvas > section { position: absolute; left: 0; top: 0; width: var(--slide-w, 1920px); height: var(--slide-h, 1080px); display: block; }
171
+ #ed-slide-ops { display: flex; flex-wrap: wrap; gap: 2px; padding: 6px; border-top: 1px solid var(--divider); }
172
+
173
+ #ed-work { flex: 1; min-width: 0; display: flex; flex-direction: column; }
174
+ .panel { flex: none; width: 300px; overflow-y: auto; background: var(--surface); border-left: 1px solid var(--divider); }
175
+ .panel[hidden] { display: none; }
176
+ .panel > header { display: flex; align-items: center; justify-content: space-between; height: 48px; padding: 0 8px 0 16px; font-size: 16px; border-bottom: 1px solid var(--divider); }
177
+ .panel details { border-bottom: 1px solid var(--divider); }
178
+ .panel summary { display: flex; align-items: center; height: 44px; padding: 0 16px; font-weight: 500; cursor: pointer; list-style: none; }
179
+ .panel summary::before { content: "chevron_right"; font-family: "Material Symbols Outlined"; font-size: 20px; margin-right: 8px; color: var(--muted); transition: rotate .15s; }
180
+ .panel details[open] summary::before { rotate: 90deg; }
181
+ .panel details > :not(summary) { margin: 0 16px 12px 44px; }
182
+ #ed-fmt details > :not(summary) { margin: 0 20px 12px; } /* Slides: Format options bodies start at the panel edge, not under the chevron */
183
+ .panel h4 { margin-bottom: 8px; font-size: 14px; font-weight: 500; color: var(--ink); }
184
+ .panel .unit { display: flex; align-items: center; gap: 8px; color: var(--muted); font-size: 12px; }
185
+ .panel .unit input { width: 80px; border: 0; border-bottom: 1px solid var(--divider); border-radius: 0; background: none; padding: 4px 2px; }
186
+ .panel input.short { width: 64px; }
187
+ .panel .radios { display: flex; flex-direction: column; gap: 10px; }
188
+ .panel input[type=radio] { accent-color: var(--blue); }
189
+ .panel .row { display: flex; align-items: flex-end; gap: var(--gutter); }
190
+ .panel label { display: flex; flex-direction: column; gap: 4px; color: var(--muted); font-size: 12px; }
191
+ .panel label.chk { flex-direction: row; align-items: center; color: var(--ink); font-size: 13px; }
192
+ .panel input[type=number] { width: 96px; }
193
+ .panel button { display: inline-flex; align-items: center; justify-content: center; min-width: var(--ctl-h); padding: 0 4px; }
194
+ #ed-toolbar button.text { padding: 0 var(--gutter); }
195
+ #ed-toolbar .grp > button.text ~ button.text { position: relative; margin-left: 1px; }
196
+ #ed-toolbar .grp > button.text ~ button.text::before { content: ""; position: absolute; left: -1px; top: 8px; bottom: 8px; width: 1px; background: var(--divider); } /* Slides: dividers between text buttons */
197
+ #ed-splitter { flex: none; height: 12px; cursor: row-resize; background: var(--chrome); }
198
+ #ed-notes { flex: none; height: 110px; overflow-y: auto; margin: 0 16px 8px 8px; padding: 6px 8px; border-radius: 8px; background: var(--toolbar); font-size: 15px; line-height: 1.2; color: var(--ink); outline: none; } /* Slides: a tinted rounded card */
199
+ #ed-notes:empty::before { content: attr(data-placeholder); color: var(--ink); }
200
+ body.notes-off #ed-notes { display: none; }
201
+ #ed-canvas aside.notes, .thumb-canvas aside.notes { display: none; }
202
+ #ed-stage-wrap { flex: 1; min-height: 0; position: relative; display: flex; }
203
+ /* The insert bar: a pill in its own row under the stage (View → Show insert bar), so it never covers the slide */
204
+ #ed-dock { flex: none; align-self: center; margin: 0 0 10px; display: flex; align-items: center; gap: 2px;
205
+ padding: 4px 6px; background: var(--surface); border-radius: 24px; box-shadow: var(--menu-shadow); }
206
+ #ed-dock[hidden] { display: none; }
207
+ #ed-dock button { width: 36px; height: 36px; display: inline-flex; align-items: center; justify-content: center; border-radius: 18px; color: var(--ink); }
208
+ #ed-dock button .icon { font-size: 20px; } /* the toolbar's size: Material Symbols' 20 px design, not scaled (22 px clipped the shapes glyph) */
209
+ #ed-dock button.on, #ed-dock button.open { background: var(--selected); color: var(--blue); }
210
+ #ed-dock .sep { width: 1px; height: 22px; margin: 0 4px; background: var(--divider); }
211
+ #ed-stage { flex: 1; position: relative; display: flex; overflow: hidden; padding: 32px; }
212
+ /* Rulers, as Slides: inches along the top and left of the stage; the slide's span is white, the selection's shaded */
213
+ .ruler { position: absolute; z-index: 2; cursor: default; }
214
+ #ed-ruler-h { top: 0; left: 20px; width: calc(100% - 20px); height: 20px; cursor: row-resize; }
215
+ #ed-ruler-v { top: 20px; left: 0; width: 20px; height: calc(100% - 20px); cursor: col-resize; }
216
+ body.ruler-off .ruler { display: none; }
217
+ #ed-stage.zoomed { overflow: auto; }
218
+ #ed-stage > #ed-frame { margin: auto; flex: none; } /* centred when it fits, scrollable from the edge when it doesn't */
219
+ #ed-toolbar .zoom-pick { justify-content: space-between; width: 68px; padding: 0 2px 0 8px; font-size: 14px; }
220
+ #ed-frame { position: relative; background: #fff; box-shadow: var(--slide-shadow); }
221
+ #ed-canvas { position: absolute; left: 0; top: 0; width: var(--slide-w, 1920px); height: var(--slide-h, 1080px); transform-origin: 0 0; }
222
+ #ed-canvas .box { cursor: move; }
223
+ #ed-canvas .box > .content[contenteditable] { cursor: text; }
224
+ #ed-canvas .box[data-shape$="line"]::before { content: ""; position: absolute; inset: -14px; }
225
+ #ed-ui, #ed-guides, #ed-pins, #ed-flash { position: absolute; inset: 0; pointer-events: none; }
226
+ .flash-box { position: absolute; box-shadow: 0 0 0 calc(3 * var(--k, 1px)) #fbbc04; border-radius: calc(2 * var(--k, 1px)); animation: flash-out 2.4s ease-in forwards; } /* changed on disk (live.js) */
227
+ @keyframes flash-out { 0%, 60% { opacity: 1; } 100% { opacity: 0; } }
228
+ /* --k is one screen pixel in canvas units (set from JS); strokes are box-shadows so they stay crisp at 1px. */
229
+ .sel-box { position: absolute; box-shadow: 0 0 0 calc(var(--k, 1px) * 2) var(--blue); }
230
+ .sel-frame { position: absolute; } /* repeats a group's box so its members' outlines and handles line up */
231
+ .sel-box.scope { box-shadow: none; outline: var(--k, 1px) dashed var(--muted); }
232
+ .sel-box.thin { box-shadow: 0 0 0 var(--k, 1px) var(--blue); opacity: .55; } /* each object in a multi-selection */
233
+ .hover-box { position: absolute; box-shadow: 0 0 0 var(--k, 1px) var(--blue); opacity: .5; pointer-events: none; }
234
+ .sel-box.editing { box-shadow: none; outline: calc(var(--k, 1px) * 2) dashed var(--blue); }
235
+ .sel-wrap { position: absolute; }
236
+ .handle { position: absolute; background: #fff; box-shadow: inset 0 0 0 calc(var(--k, 1px) * 1.5) var(--blue); border-radius: 50%; pointer-events: auto; }
237
+ .handle.side { border-radius: 999px; }
238
+ .handle.on { background: var(--blue); }
239
+
240
+ .handle::before { content: ""; position: absolute; inset: calc(var(--k, 1px) * -5); } /* a hit area 5 px beyond the handle: six times
241
+ its size (as before 2026-10-22) covered a small box whole, which then couldn't be dragged, only resized or rotated */
242
+ html.phone .handle::before { inset: -150%; } /* (a finger needs more) */
243
+ .handle.rotate { border-radius: 50%; cursor: grab; background: var(--blue); box-shadow: none; color: #fff; display: flex; align-items: center; justify-content: center; }
244
+ .handle.rotate .icon { font-size: inherit; }
245
+ .handle.rotate:active { cursor: grabbing; }
246
+ .rot-stem { position: absolute; background: var(--blue); }
247
+ .guide { position: absolute; background: var(--guide); }
248
+ .measure { position: absolute; background: var(--guide); }
249
+ .space { position: absolute; background: var(--spacing); } /* equal-spacing / equal-size brackets */
250
+ .rot-ghost { pointer-events: none; background: none !important; box-shadow: 0 0 0 calc(var(--k) * 1px) #5f6368; filter: none; }
251
+ .rot-ghost > *:not(svg) { visibility: hidden; }
252
+ .rot-ghost:has(> svg.shape) { box-shadow: none; }
253
+ .rot-ghost svg.shape * { fill: none !important; stroke: #5f6368 !important; stroke-width: calc(var(--k) * 1px) !important; vector-effect: non-scaling-stroke; }
254
+ .rot-label { position: absolute; color: #000; font-family: var(--font); font-weight: 700; line-height: 1.3; white-space: nowrap; } /* Slides' angle readout */
255
+ .measure-label { position: absolute; background: var(--guide); color: #fff; font-family: var(--font); line-height: 1.3; white-space: nowrap; }
256
+ .marquee { position: absolute; border: 1px solid #1b7f97; } /* Slides: a thin teal outline, no fill */
257
+ .drop-hint #ed-frame { outline: 3px dashed var(--blue); outline-offset: 6px; }
258
+
259
+ .backdrop { position: fixed; inset: 0; z-index: 50; display: flex; align-items: center; justify-content: center; background: rgba(32, 33, 36, .6); }
260
+ .backdrop[hidden] { display: none; }
261
+ .dialog { display: flex; flex-direction: column; width: min(880px, 92vw); max-height: 82vh; background: var(--surface); border-radius: 8px; box-shadow: var(--menu-shadow); }
262
+ .dialog > header { display: flex; align-items: center; gap: 16px; padding: 20px 16px 12px 24px; border-bottom: 1px solid var(--divider); }
263
+ .dialog h2 { flex: 1; margin: 0; font-size: 22px; font-weight: 400; }
264
+ .dialog input[type=search] { width: 280px; height: 36px; padding: 0 12px; font: inherit; border: 1px solid var(--divider); border-radius: var(--radius); }
265
+ .dialog .sc-close { display: inline-flex; align-items: center; justify-content: center; width: 36px; height: 36px; padding: 0; border-radius: 50%; } /* no padding: the 20px icon stays centred in its circle */
266
+ .sc-body { overflow-y: auto; padding: 8px 24px 24px; columns: 2; column-gap: 40px; }
267
+ .sc-section { break-inside: avoid; padding-top: 16px; }
268
+ .sc-section h3 { margin: 0 0 8px; font-size: 14px; font-weight: 500; color: var(--ink); }
269
+ .sc-row { display: flex; justify-content: space-between; gap: 16px; padding: 5px 0; border-bottom: 1px solid var(--hover); font-size: 13px; }
270
+ .sc-row kbd { font: inherit; color: var(--muted); white-space: nowrap; }
271
+ .sc-empty { padding: 24px 0; color: var(--muted); }
272
+ body.painting #ed-canvas, body.painting #ed-canvas .box { cursor: copy; } /* paint format armed */
273
+ .align-pop { min-width: 0; padding: 6px; }
274
+ .align-row { display: flex; gap: 2px; }
275
+ .align-btn { display: inline-flex; align-items: center; justify-content: center; width: 32px; height: 32px; padding: 0; border-radius: var(--radius); color: var(--ink); }
276
+ .align-btn:hover { background: var(--hover); }
277
+ .align-btn.on { background: var(--selected); color: var(--blue); }
278
+ #ed-toolbar button.dropdown { padding: 0 0 0 4px; }
279
+ #ed-toolbar #ed-new-slide-more { width: 16px; min-width: 0; padding: 0; margin-left: -4px; } /* the ▾ half of Slides' + ▾ */
280
+ #ed-toolbar #ed-new-slide-more .icon { font-size: 18px; color: var(--muted); }
281
+
282
+ #ed-toolbar button.dropdown .caret { font-size: 18px; margin-left: -2px; color: var(--muted); }
283
+ .find { position: fixed; top: 120px; right: 24px; z-index: 45; display: flex; flex-direction: column; gap: 10px; width: 360px; padding: 16px; background: var(--surface); border-radius: 8px; box-shadow: var(--menu-shadow); }
284
+ .find[hidden] { display: none; }
285
+ .find header { display: flex; align-items: center; justify-content: space-between; }
286
+ .find h2 { margin: 0; font-size: 16px; font-weight: 500; }
287
+ .find-row { display: flex; align-items: center; gap: 4px; }
288
+ .find input:not([type=checkbox]) { flex: 1; min-width: 0; height: 32px; padding: 0 8px; font: inherit; border: 1px solid var(--divider); border-radius: var(--radius); }
289
+ .find input:focus { outline: 2px solid var(--blue); outline-offset: -1px; }
290
+ .find .find-count { color: var(--muted); font-size: 12px; white-space: nowrap; }
291
+ .find button { display: inline-flex; align-items: center; justify-content: center; min-width: var(--ctl-h); }
292
+ .find .chk { display: flex; align-items: center; gap: 6px; }
293
+ .find-actions { display: flex; justify-content: flex-end; gap: 8px; }
294
+ .find-actions button { border: 1px solid var(--divider); padding: 0 12px; }
295
+ ::highlight(find) { background-color: #fde293; }
296
+ ::highlight(find-current) { background-color: #f9ab00; }
297
+ .find > input:not([type=checkbox]) { flex: none; }
298
+ body.compact #ed-top { display: none; } /* ⌃⇧F */
299
+ #ed-status.flash { animation: status-flash .9s ease; }
300
+ @keyframes status-flash { 0%, 40% { color: var(--blue); } 100% { color: var(--muted); } }
301
+ #ed-thumbs:focus { outline: none; }
302
+ #ed-show { position: fixed; inset: 0; z-index: 60; background: #000; } /* presenting in place */
303
+ #ed-show[hidden] { display: none; }
304
+ #ed-show iframe { width: 100%; height: 100%; border: 0; display: block; }
305
+ .panel .range { display: flex; align-items: center; gap: 8px; color: var(--muted); font-size: 12px; }
306
+ .panel .range input { flex: 1; }
307
+ .panel .actions { display: flex; gap: 8px; }
308
+ .panel .actions button { border: 1px solid var(--divider); padding: 0 12px; }
309
+ #ed-anim-list { display: flex; flex-direction: column; gap: 4px; }
310
+ .anim-row { display: flex; align-items: center; gap: 6px; padding: 4px; border: 1px solid var(--divider); border-radius: var(--radius); background: var(--surface); cursor: grab; }
311
+ .anim-row.on { border-color: var(--blue); background: var(--selected); }
312
+ .anim-row .n { width: 18px; color: var(--muted); font-size: 12px; text-align: right; }
313
+ .anim-row .what { flex: 1; min-width: 0; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
314
+ .anim-row select { width: 130px; height: 26px; }
315
+ .anim-row button { min-width: 24px !important; height: 24px; padding: 0; }
316
+ .anim-row.drop { box-shadow: 0 -2px 0 var(--blue); }
317
+
318
+ /* Google Slides' chrome */
319
+ #ed-menus { display: inline-flex; align-items: center; gap: 4px; height: 28px; margin-right: 4px; padding: 0 10px 0 8px; border-radius: 14px; background: var(--surface); color: var(--muted); cursor: text; }
320
+ #ed-menus .icon { font-size: 18px; }
321
+ #ed-menus input { width: 58px; border: 0; outline: none; background: none; font: inherit; color: var(--ink); }
322
+ #ed-menus:focus-within input { width: 160px; }
323
+ #ed-toolbar .zoom-pick { width: 78px; gap: 2px; }
324
+ #ed-toolbar .zoom-pick .zoom-glyph { font-size: 18px; }
325
+ #ed-toolbar button.text { color: var(--ink); }
326
+ #ed-toolbar > .grp + .grp, #ed-toolbar .grp.nosel-only button + button { border-left: 1px solid var(--divider); }
327
+ #ed-collapse { margin-left: auto; }
328
+ #ed-more-wrap:not([hidden]) + #ed-collapse { margin-left: 0; }
329
+ #ed-film-foot { display: flex; align-items: center; height: 40px; padding: 0 8px; }
330
+ body.film-off #ed-side { width: 44px; }
331
+ body.film-off #ed-thumbs { display: none; }
332
+ body.film-off #ed-film-toggle .icon { rotate: 180deg; }
333
+ body.film-off #ed-film-foot { flex-direction: column; align-items: center; height: auto; padding: 4px 0; gap: 4px; } /* 44 px wide: stack the two buttons so the reopen arrow isn't under the stage */
334
+ body.film-off #ed-grid-zoom { display: none; }
335
+ #ed-film-foot { margin-top: auto; }
336
+ body.notes-off #ed-splitter { display: block; }
337
+ #ed-splitter::after { content: ""; position: absolute; left: 50%; top: 5px; width: 48px; height: 2px; margin-left: -24px; border-radius: 1px; background: var(--icon); } /* Slides' short dark grip */
338
+ #ed-splitter { position: relative; }
339
+ #ed-slide-ops[hidden] { display: none; }
340
+ .font-menu { width: 300px; padding: 8px 0 0; display: flex; flex-direction: column; }
341
+ .font-search { margin: 0 12px 6px; height: 32px; padding: 0 10px; font: inherit; font-size: 14px; color: var(--ink); background: var(--surface); border: 1px solid var(--divider); border-radius: var(--radius); }
342
+ .font-cats { display: flex; flex-wrap: wrap; gap: 4px; padding: 0 12px 6px; border-bottom: 1px solid var(--divider); }
343
+ .font-cat { height: 24px; padding: 0 8px; font-size: 12px; border: 1px solid var(--divider); border-radius: 12px; color: var(--muted); }
344
+ .font-cat.on { background: var(--selected); border-color: transparent; color: var(--ink); }
345
+ .font-list { height: 420px; overflow-y: auto; position: relative; }
346
+ .font-pad { position: relative; }
347
+ .font-pad > * { position: absolute; left: 0; right: 0; height: 32px; }
348
+ .font-pad > .menu-item .menu-label { font-size: 15px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
349
+ .menu-head { padding: 10px 16px 4px; font-size: 11px; font-weight: 500; letter-spacing: .08em; color: var(--muted); }
350
+ #ed-size { cursor: pointer; text-align: center; width: 44px; padding: 0 2px; -moz-appearance: textfield; } /* room for 16.5, no spinner (Slides has −/+ beside it) */
351
+ #ed-size::-webkit-inner-spin-button, #ed-size::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; }
352
+ /* Fidelity pass 5: panels are white rounded cards on the chrome, as Slides' side panels. */
353
+ .panel { margin: 0 8px 8px 0; border-left: 0; border-radius: 16px; }
354
+ .panel > header { gap: 10px; justify-content: flex-start; }
355
+ .panel > header > button { margin-left: auto; }
356
+ .panel .head-icon { font-size: 22px; }
357
+ .panel .head-icon.fmt { color: #f9ab00; }
358
+ .panel .head-icon.motion { color: #e8710a; }
359
+ .panel > h3 { margin: 0; padding: 16px 16px 12px; font-size: 15px; font-weight: 500; border-bottom: 1px solid var(--divider); }
360
+ .panel summary input[type=checkbox] { margin-left: auto; width: 16px; height: 16px; }
361
+ .panel .hint { margin: 0 20px 12px; color: var(--muted); font-size: 12px; }
362
+ .panel textarea { font: inherit; border: 1px solid var(--divider); border-radius: var(--radius); padding: 6px 8px; resize: vertical; }
363
+ .panel .thumbmark { width: 26px; height: 18px; margin-right: 10px; border: 2px solid #5f6368; border-radius: 3px; }
364
+ .panel .actions.pad { margin: 12px 16px; }
365
+ .panel button.add { gap: 4px; border: 1px solid var(--divider); color: var(--ink); }
366
+ .panel button.add .icon { color: #e8710a; font-size: 18px; }
367
+ .panel button.play { height: 34px; padding: 0 22px; border: 0; border-radius: 4px; background: #fbbc04; color: #202124; font-weight: 500; }
368
+ .panel button.play:disabled { background: none; color: var(--muted); } /* Slides greys Play out when there is nothing to play */
369
+ #ed-trans.no-trans .range { display: none; } /* no speed for None */
370
+ .anim-row { display: block; padding: 0; border: 0; border-bottom: 1px solid var(--divider); border-radius: 0; cursor: default; }
371
+ .anim-row.on { background: none; }
372
+ .anim-head { display: flex; align-items: center; gap: 6px; height: 48px; padding: 0 8px; cursor: pointer; }
373
+ .anim-head .n { color: var(--outline); font-size: 18px; cursor: grab; }
374
+ .anim-head .chev { font-size: 20px; color: var(--muted); }
375
+ .anim-row.open .anim-head .chev { rotate: 90deg; }
376
+ .anim-head .eff { white-space: pre; }
377
+ .anim-head .what { flex: 1; min-width: 0; color: var(--muted); font-size: 12px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
378
+ .anim-body { display: none; flex-direction: column; gap: 10px; padding: 4px 16px 16px 40px; }
379
+ .anim-row.open .anim-body { display: flex; }
380
+ .anim-body select { width: 100%; height: 36px; }
381
+ #ed-fmt details { border-bottom: 0; }
382
+ /* Fidelity pass 6: find and replace as Slides' Material dialog, over the middle of the slide area. */
383
+ .find { top: 160px; left: calc(50% - 160px); right: auto; width: 400px; gap: 14px; padding: 24px; border-radius: 28px; }
384
+ .find h2 { font-size: 24px; font-weight: 400; }
385
+ .find input:not([type=checkbox]) { height: 48px; padding: 0 14px; font-size: 16px; border: 1px solid var(--outline); border-radius: 4px; }
386
+ .find input:focus { outline: 2px solid var(--blue); outline-offset: -2px; border-color: transparent; }
387
+ .find .chk { align-items: flex-start; gap: 14px; font-size: 14px; line-height: 20px; }
388
+ .find .chk input { width: 18px; height: 18px; margin: 1px 0 0; accent-color: var(--blue); }
389
+ .find-actions { gap: 4px; margin-top: 4px; }
390
+ .find-actions button { border: 0; padding: 0 12px; height: 40px; border-radius: 20px; color: var(--blue); font-weight: 500; }
391
+ .find-actions button.tonal { background: var(--selected); color: #041e49; padding: 0 20px; }
392
+ .find-actions button.primary { background: none; color: var(--blue); }
393
+ .find .find-row { position: relative; }
394
+ .find .find-count { position: absolute; right: 14px; }
395
+ /* Fidelity pass 6: shortcuts dialog as Slides — one column, tinted surface, pill search, keycaps. */
396
+ #ed-shortcuts .dialog { width: min(600px, 92vw); max-height: 84vh; background: var(--toolbar); border-radius: 28px; }
397
+ #ed-shortcuts .dialog > header { border-bottom: 0; padding: 22px 16px 8px 24px; }
398
+ #ed-shortcuts h2 { font-size: 28px; }
399
+ #ed-shortcuts .sc-search { display: flex; align-items: center; gap: 12px; margin: 8px 24px 4px; height: 52px; padding: 0 18px; border-radius: 26px; background: #f8fafd; }
400
+ #ed-shortcuts .sc-search .icon { color: var(--muted); }
401
+ #ed-shortcuts .sc-search input { flex: 1; width: auto; height: 40px; border: 0; background: none; font: inherit; font-size: 18px; outline: none; }
402
+ #ed-shortcuts .sc-body { columns: 1; padding: 0 24px 24px; }
403
+ #ed-shortcuts .sc-section h3 { margin: 18px 0 4px; font-size: 16px; font-weight: 500; color: var(--icon); }
404
+ #ed-shortcuts .sc-row { align-items: center; min-height: 52px; padding: 8px 0; border-bottom: 1px solid var(--outline); font-size: 15px; }
405
+ #ed-shortcuts .sc-row kbd { display: inline-block; min-width: 20px; margin-left: 3px; padding: 1px 5px; border: 1px solid var(--icon); border-radius: 4px;
406
+ font: 13px ui-monospace, Menlo, monospace; color: var(--ink); text-align: center; }
407
+ #ed-shortcuts .sc-row .or { margin: 0 4px; color: var(--ink); }
408
+
409
+ /* Background dialog (Slide → Change background), as Slides: label left, control right, yellow Done */
410
+ .bg-dialog { width: 366px; padding: 0 0 24px; }
411
+ .bg-dialog > header { border-bottom: 0; padding: 24px 20px 12px 24px; }
412
+ .bg-dialog h2 { font-size: 22px; }
413
+ .bg-dialog .sc-close { width: 32px; height: 32px; color: var(--muted); }
414
+ .dlg-sub { padding: 12px 24px 0; font-size: 14px; font-weight: 500; color: var(--ink); }
415
+ .bg-row { display: flex; align-items: center; justify-content: space-between; min-height: 52px; padding: 0 24px; font-size: 14px; color: var(--ink); }
416
+ .bg-dialog .outlined { height: 36px; padding: 0 24px; border: 1px solid var(--divider); border-radius: 4px; background: var(--surface); font-size: 14px; font-weight: 500; }
417
+ .bg-dialog .outlined:disabled { color: var(--muted); }
418
+ .bg-swatch { display: inline-flex; align-items: center; height: 36px; padding: 0 2px 0 10px; border: 1px solid var(--divider); border-radius: 4px; background: var(--surface); }
419
+ .bg-swatch .chip { width: 20px; height: 20px; border-radius: 50%; box-shadow: inset 0 0 0 1px var(--divider); }
420
+ .bg-dialog footer { display: flex; justify-content: flex-end; gap: 12px; padding: 20px 24px 0; }
421
+ .bg-dialog .done { height: 36px; padding: 0 24px; border: 0; border-radius: 4px; background: #fbbc04; color: #202124; font-size: 14px; font-weight: 500; }
422
+ .bg-dialog .primary { height: 36px; padding: 0 24px; border: 0; border-radius: 4px; font-size: 14px; } /* a blue primary where the action isn't Slides' yellow Done */
423
+
424
+ /* View → Guides: thin dark lines with a wider invisible grab area, as Slides */
425
+ #ed-rules { position: absolute; inset: 0; pointer-events: none; }
426
+ .rule { position: absolute; pointer-events: auto; }
427
+ .rule.v { cursor: col-resize; } .rule.h { cursor: row-resize; }
428
+ .rule::after { content: ""; position: absolute; background: #5f6368; }
429
+ .rule.v::after { left: 50%; top: 0; bottom: 0; width: var(--k); translate: -50% 0; }
430
+ .rule.h::after { top: 50%; left: 0; right: 0; height: var(--k); translate: 0 -50%; }
431
+ .rule.new::after { background: var(--blue); } /* a guide being dragged out of the ruler: blue, with where it is */
432
+ .rule.new.off::after { background: #9aa0a6; }
433
+ .rule-at { position: absolute; padding: calc(var(--k) * 2) calc(var(--k) * 6); border-radius: calc(var(--k) * 4); background: var(--blue); color: #fff;
434
+ font: 500 calc(var(--k) * 11)/1.3 var(--font, sans-serif); white-space: nowrap; pointer-events: none; }
435
+ .rule.h .rule-at { left: calc(var(--k) * 8); top: calc(50% + var(--k) * 6); } .rule.v .rule-at { top: calc(var(--k) * 8); left: calc(50% + var(--k) * 6); }
436
+ .rule.new.off .rule-at { background: #5f6368; }
437
+ .end-pic .l { fill: none; stroke: var(--ink); stroke-width: 2px; stroke-linecap: round; stroke-linejoin: round; }
438
+ .end-pic .h { fill: var(--ink); }
439
+ .end-pic .hit { display: none; }
440
+ .menu.pics { min-width: 0; }
441
+ .menu.pics .menu-key { display: none; }
442
+ .menu.pics .menu-item { padding-right: 16px; }
443
+ .handle.adjust { background: #fbbc04; border-radius: 1px; rotate: 45deg; box-shadow: 0 0 0 var(--k) #b06000; cursor: default; } /* Slides' yellow diamond */
444
+ #ed-fmt:not(.is-image) .img-only { display: none; }
445
+ .panel .unit.slider input[type=range] { flex: 1; accent-color: var(--blue); border: 0; }
446
+ .panel .outlined { height: 36px; padding: 0 24px; border: 1px solid var(--divider); border-radius: 4px; background: var(--surface); font-weight: 500; }
447
+ .palette-alpha { display: flex; align-items: center; gap: 8px; padding: 6px 12px 2px; font-size: 12px; color: var(--muted); }
448
+ .palette-alpha input { flex: 1; accent-color: var(--blue); }
449
+ .palette-alpha .pct { width: 34px; text-align: right; }
450
+ #ed-fmt.is-image .text-only { display: none; }
451
+ .panel .row.between { justify-content: space-between; align-items: center; }
452
+ .panel .lbl { color: var(--muted); font-size: 12px; }
453
+ .panel .color-chip { width: 48px; height: 32px; padding: 2px 4px; border: 1px solid var(--divider); border-radius: 4px; background: var(--surface); }
454
+ .menu.cell-grid { display: grid; grid-template-columns: repeat(12, 29px); gap: 1px; padding: 8px; min-width: 0; } /* Slides: 12 per row */
455
+ .menu.cell-grid .menu-item { width: 29px; height: 29px; padding: 0; justify-content: center; border-radius: 4px; }
456
+ .menu.cell-grid .menu-icon, .menu.cell-grid .menu-key { display: none; }
457
+ .menu.cell-grid .menu-sep { grid-column: 1 / -1; }
458
+ .menu.cell-grid .menu-label { flex: none; }
459
+ .shape-pic .f { fill: none; stroke: var(--ink); stroke-width: 1.3px; stroke-linejoin: round; }
460
+ body.drawing #ed-stage, body.drawing #ed-stage * { cursor: crosshair !important; }
461
+ .draw-preview { position: absolute; inset: 0; width: 100%; height: 100%; overflow: visible; pointer-events: none; }
462
+ .draw-preview polyline { fill: none; stroke: #333; stroke-width: 4px; stroke-linejoin: round; stroke-linecap: round; }
463
+ .handle.linked { background: var(--blue); }
464
+ .conn { position: absolute; border-radius: 50%; background: #fff; box-shadow: 0 0 0 var(--k) #5f6368; }
465
+ .conn.on { background: var(--blue); box-shadow: 0 0 0 var(--k) var(--blue); scale: 1.5; } /* Slides' connection points */
466
+ #ed-canvas .box[data-shape="wordart"] > .content[contenteditable] { opacity: 1; } /* while editing, show the real text */
467
+ #ed-canvas .box[data-shape="wordart"]:has(> .content[contenteditable]) > svg.shape { visibility: hidden; }
468
+ #ed-fmt:not(.is-video) .video-only { display: none; }
469
+ #ed-fmt.is-video .text-only { display: none; }
470
+ /* In the editor a video is its poster with a play badge, as Slides; it plays when presenting. */
471
+ #ed-canvas .box.video video, .thumb-canvas .box.video video { pointer-events: none; }
472
+ #ed-canvas .box.video video::-webkit-media-controls { display: none !important; }
473
+ #ed-canvas .box.video::after { content: "play_arrow"; font-family: "Material Symbols Outlined"; position: absolute; left: 50%; top: 50%; width: 72px; height: 72px; margin: -36px 0 0 -36px;
474
+ display: flex; align-items: center; justify-content: center; border-radius: 50%; background: rgb(0 0 0 / .55); color: #fff; font-size: 48px; pointer-events: none; }
475
+ /* Crop marks, as Slides: black L-shaped corners and short bars on the sides */
476
+ .handle.crop { background: none; box-shadow: none; border-radius: 0; border: 0 solid #000; }
477
+ .handle.crop.nw { border-width: calc(var(--k) * 4) 0 0 calc(var(--k) * 4); } .handle.crop.ne { border-width: calc(var(--k) * 4) calc(var(--k) * 4) 0 0; }
478
+ .handle.crop.sw { border-width: 0 0 calc(var(--k) * 4) calc(var(--k) * 4); } .handle.crop.se { border-width: 0 calc(var(--k) * 4) calc(var(--k) * 4) 0; }
479
+ .handle.crop.n { border-top-width: calc(var(--k) * 4); } .handle.crop.s { border-bottom-width: calc(var(--k) * 4); }
480
+ .handle.crop.w { border-left-width: calc(var(--k) * 4); } .handle.crop.e { border-right-width: calc(var(--k) * 4); }
481
+ /* Stacks as a tree: sub-slides at 72 %, indented under a 2 px rail from the main slide's left edge, a tick to each. A
482
+ thumbnail is drawn for THUMB_W (state.js), so a sub-slide's picture is zoomed to its smaller frame; the number column
483
+ is wide enough for "13.1" in any look's font */
484
+ .thumb { position: relative; }
485
+ .thumb.sub { padding-left: 32px; }
486
+ .thumb.sub .num { width: 32px; white-space: nowrap; }
487
+ .thumb.sub .thumb-view { width: 114px; }
488
+ .thumb.sub .thumb-canvas { zoom: calc(114 / 158); }
489
+ .thumb.sub::before { content: ""; position: absolute; left: 28px; top: -16px; bottom: 0; width: 2px; background: var(--outline); }
490
+ .thumb.sub.stack-last::before { bottom: auto; height: calc(16px + 50%); }
491
+ .thumb.sub::after { content: ""; position: absolute; left: 28px; top: 50%; width: 6px; height: 2px; background: var(--outline); }
492
+ .thumb.folded { display: none; }
493
+ .thumb .fold { width: 20px; height: 20px; padding: 0; margin-right: -4px; border: 0; border-radius: 50%; background: none; color: var(--icon); font-size: 20px; cursor: pointer; }
494
+ .thumb .fold:hover { background: var(--hover); }
495
+ .thumb .fold-count { font-size: 11px; color: var(--muted); }
496
+
497
+ /* Filmstrip drag, as Slides: grab cursors, a ghost of the slide, a blue line where it will land */
498
+ .thumb .thumb-view { cursor: grab; }
499
+ body.thumb-dragging, body.thumb-dragging * { cursor: grabbing !important; }
500
+ #ed-thumbs { position: relative; }
501
+ .thumb-drop { position: absolute; left: 26px; right: 12px; height: 3px; margin-top: -1px; border-radius: 2px; background: var(--blue); pointer-events: none; }
502
+ .thumb-ghost { position: fixed; z-index: 70; width: 120px; opacity: .85; box-shadow: var(--menu-shadow); pointer-events: none; }
503
+ .thumb.dragged .thumb-view { opacity: .35; }
504
+ /* Placeholders, as Slides: grey prompt text in an empty layout box, with a faint outline */
505
+ #ed-canvas .box[data-placeholder] > .content[data-ph]::before { content: attr(data-ph); color: inherit; } /* the prompt uses the box's theme colour: black titles, grey body, as Slides */
506
+ #ed-canvas .box[data-placeholder]:has(> .content[data-ph]) { display: flex; outline: 2px solid #dadce0; } /* base.css hides unfilled placeholders in decks; the editor shows them */
507
+ .menu.tile-grid { display: grid; grid-template-columns: repeat(3, 132px); gap: 8px 6px; padding: 10px; min-width: 0; }
508
+ .menu.tile-grid .menu-item { height: auto; padding: 4px; flex-direction: column; border-radius: 6px; }
509
+ .menu.tile-grid .menu-icon, .menu.tile-grid .menu-key { display: none; }
510
+ .menu.tile-grid .menu-label { display: flex; flex-direction: column; align-items: center; gap: 4px; font-size: 12px; white-space: normal; text-align: center; }
511
+ .menu.tile-grid .menu-item.on svg rect:first-child { stroke: var(--blue); }
512
+ /* Themes panel: preview cards, as Slides */
513
+ #ed-theme-list { display: flex; flex-direction: column; gap: 14px; padding: 12px 16px; }
514
+ .theme-card { cursor: pointer; font-size: 12px; color: var(--ink); }
515
+ .theme-pic { aspect-ratio: 16 / 9; border-radius: 8px; box-shadow: 0 0 0 1px var(--divider); display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 4px; margin-bottom: 6px; }
516
+ .theme-pic b { font-size: 16px; font-weight: 400; } .theme-pic small { font-size: 8px; }
517
+ .theme-card.on .theme-pic { box-shadow: 0 0 0 2px var(--blue); }
518
+ /* Grid view: the filmstrip takes over the slide area as a grid of large thumbnails, numbers below, as Slides */
519
+ #ed-grid-zoom { display: none; }
520
+ body.grid-mode #ed-work { display: none; }
521
+ body.grid-mode #ed-side { flex: 1; width: auto; }
522
+ body.grid-mode #ed-thumbs { display: grid; grid-template-columns: repeat(var(--cols, 3), var(--grid-w, 300px)); align-content: start; gap: 28px 24px; padding: 32px 40px; }
523
+
524
+ body.grid-mode .thumb { flex-direction: column-reverse; gap: 8px; margin: 0; }
525
+ body.grid-mode .thumb .num { flex-direction: row; align-items: center; width: auto; font-size: 14px; color: var(--ink); }
526
+ body.grid-mode .thumb-view { width: var(--grid-w, 300px); }
527
+ /* A stack in grid view: the sub-slides at 70 % in the main slide's own cell, one under another (--v = 1, 2, …), so the
528
+ row grows only as much as its deepest stack and the other cells stay at the top. Each item is the picture + 8 px + a
529
+ 20 px label. */
530
+ body.grid-mode .thumb { align-self: start; --cell-h: calc(var(--grid-w, 300px) / (var(--slide-ar, 16 / 9)) + 28px);
531
+ --sub-h: calc(var(--grid-w, 300px) * .7 / (var(--slide-ar, 16 / 9)) + 28px + 8px); }
532
+ body.grid-mode .thumb .num { height: 20px; }
533
+ body.grid-mode .thumb.sub { padding-left: calc(var(--grid-w, 300px) * .3); margin-top: calc(var(--cell-h) + 8px + (var(--v) - 1) * var(--sub-h)); }
534
+ body.grid-mode .thumb.sub .thumb-view { width: calc(var(--grid-w, 300px) * .7); }
535
+ body.grid-mode .thumb.sub .thumb-canvas { zoom: .7; }
536
+ body.grid-mode .thumb.sub .num { width: auto; }
537
+ body.grid-mode .thumb.sub::before { left: calc(var(--grid-w, 300px) * .12); top: -8px; }
538
+ body.grid-mode .thumb.sub.stack-last::before { height: calc(8px + var(--grid-w, 300px) * .35 / (var(--slide-ar, 16 / 9))); }
539
+ body.grid-mode .thumb.sub::after { left: calc(var(--grid-w, 300px) * .12); top: calc(var(--grid-w, 300px) * .35 / (var(--slide-ar, 16 / 9))); width: calc(var(--grid-w, 300px) * .14); }
540
+
541
+
542
+ body.grid-mode #ed-film-toggle { display: none; }
543
+ body.grid-mode #ed-grid-zoom { display: flex; align-items: center; gap: 4px; margin: 0 auto; padding: 2px 6px; border-radius: 18px; background: var(--toolbar); }
544
+ body.grid-mode .thumb-drop { width: 3px; right: auto; margin: 0 0 0 -1px; }
545
+ /* Edit theme, as Slides' theme builder: dark chrome around the master / layout being edited */
546
+ #ed-load-bar { display: flex; align-items: center; gap: 12px; min-height: 44px; padding: 0 12px 0 16px; background: #fef7e0; color: #3c4043; font-size: 14px; border-bottom: 1px solid #fbd872; }
547
+ #ed-load-bar[hidden] { display: none; }
548
+ #ed-load-bar.paused { background: #fce8e6; border-bottom-color: #f6aea9; } #ed-load-bar > .icon { color: #b06000; } #ed-load-bar.paused > .icon { color: #d93025; }
549
+ #ed-load-what { flex: 1; } #ed-load-bar button { height: 28px; border: 0; border-radius: 4px; background: none; padding: 0 4px; } #ed-load-bar button .icon { color: #3c4043; }
550
+ #ed-merge-bar { display: flex; align-items: center; gap: 12px; min-height: 44px; padding: 0 12px 0 16px; background: #fce8e6; color: #3c4043; font-size: 14px; border-bottom: 1px solid #f6aea9; }
551
+ #ed-merge-bar[hidden] { display: none; }
552
+ #ed-merge-bar > .icon { color: #d93025; } #ed-merge-what { flex: 1; }
553
+ #ed-merge-bar button { height: 28px; padding: 0 12px; border: 0; border-radius: 4px; background: #d93025; color: #fff; }
554
+ #ed-merge-bar #ed-merge-close { background: none; padding: 0 4px; } #ed-merge-close .icon { color: #3c4043; }
555
+ #ed-theme-bar { display: flex; align-items: center; gap: 12px; height: 44px; padding: 0 12px 0 16px; background: #3c4043; color: #fff; font-size: 14px; }
556
+ #ed-theme-bar[hidden] { display: none; }
557
+ #ed-theme-what { flex: 1; } #ed-theme-what .muted { color: #bdc1c6; }
558
+ #ed-theme-bar button { height: 28px; padding: 0 12px; border: 0; border-radius: 4px; background: var(--blue); color: #fff; }
559
+ #ed-theme-bar #ed-theme-done { background: none; padding: 0 4px; } #ed-theme-done .icon { color: #fff; }
560
+ body.theme-mode #ed-stage, body.theme-mode #ed-side { background: #3c4043; }
561
+ body.theme-mode .thumb.active .thumb-view { box-shadow: 0 0 0 2px #fbbc04; }
562
+ body.theme-mode #ed-notes, body.theme-mode #ed-splitter { display: none !important; }
563
+ .chars-dialog { width: 610px; }
564
+ .chars-body { display: flex; gap: 12px; padding: 12px 24px 24px; }
565
+ .chars-left { display: flex; flex-direction: column; gap: 8px; }
566
+ .chars-left select { width: 160px; height: 36px; border: 1px solid var(--divider); }
567
+ .chars-grid { display: grid; grid-template-columns: repeat(11, 25px); grid-auto-rows: 25px; width: 278px; height: 300px; overflow-y: auto; border: 1px solid var(--divider); align-content: start; }
568
+ .chars-grid button { width: 25px; height: 25px; padding: 0; border: 0; border-radius: 0; box-shadow: 0 0 0 .5px var(--divider); font-size: 15px; color: var(--ink); }
569
+ .chars-grid button:hover { background: var(--hover); }
570
+ .chars-grid .chars-sep { grid-column: 1 / -1; padding: 4px 4px 0; font-size: 11px; color: var(--muted); }
571
+ .chars-right { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 8px; }
572
+ .chars-search { display: flex; align-items: center; gap: 6px; height: 36px; padding: 0 8px; border: 1px solid var(--blue); border-radius: var(--radius); }
573
+ .dialog .chars-search input { flex: 1; width: auto; min-width: 0; height: 32px; padding: 0; border: 0; outline: 0; font: inherit; background: none; color: var(--ink); }
574
+ .chars-pick { flex: 1; display: flex; align-items: center; justify-content: center; font-size: 72px; color: var(--ink); border: 1px dashed var(--divider); border-radius: var(--radius); }
575
+ .chars-pick small { display: block; font-size: 12px; color: var(--muted); text-align: center; }
576
+ .icons-dialog { width: 640px; }
577
+ .icons-dialog .chars-search { flex: 1; }
578
+ .icons-grid { display: grid; grid-template-columns: repeat(auto-fill, 48px); gap: 4px; height: 420px; overflow-y: auto; padding: 12px 24px 24px; align-content: start; }
579
+ .icons-grid button { width: 48px; height: 48px; padding: 0; border-radius: 8px; font-size: 28px; color: var(--icon); }
580
+ .icons-grid button:hover { background: var(--hover); }
581
+ .table-pick { padding: 8px 10px 4px; }
582
+ .table-grid { display: grid; grid-template-columns: repeat(10, 16px); gap: 2px; }
583
+ .tg-cell { width: 16px; height: 16px; border: 1px solid var(--divider); border-radius: 2px; cursor: pointer; }
584
+ .tg-cell.on { background: var(--selected); border-color: var(--blue); }
585
+ .table-cap { padding: 6px 0 2px; text-align: center; font-size: 13px; color: var(--ink); }
586
+ .url-in { flex: 1; height: 40px; padding: 0 12px; font: inherit; font-size: 14px; color: var(--ink); background: var(--surface); border: 1px solid var(--divider); border-radius: var(--radius); }
587
+ .url-in:focus { outline: 2px solid var(--blue); outline-offset: -1px; }
588
+ #ed-canvas .box.embed iframe, .thumb-canvas .box.embed iframe, #ed-canvas .box.live iframe { pointer-events: none; } /* the editor moves it; the slideshow uses it */
589
+ .live-still { display: grid; place-items: center; width: 100%; height: 100%; background: repeating-linear-gradient(135deg, #f3f5f9 0 24px, #e9edf4 24px 48px); color: #7a869c; }
590
+ .live-still .icon { font-size: 160px; }
591
+ .live-dialog { width: min(820px, 92vw); } .live-dialog .live-code { padding-top: 8px; }
592
+ .live-dialog textarea { width: 100%; height: 50vh; font: 13px/1.5 ui-monospace, Menlo, monospace; color: var(--ink); background: var(--surface); border: 1px solid var(--divider); border-radius: var(--radius); padding: 10px 12px; resize: vertical; tab-size: 2; }
593
+ .anim-body .para { display: flex; align-items: center; gap: 6px; font-size: 13px; color: var(--ink); } .anim-body .para[hidden] { display: none; }
594
+ a#ed-app-icon { text-decoration: none; cursor: pointer; } /* the mascot goes home */
595
+ #ed-history select { margin: 8px 16px; height: 40px; border: 1px solid var(--divider); }
596
+ #ed-hist-list { flex: 1; overflow-y: auto; padding: 0 8px; }
597
+ .hist-row { padding: 10px 12px; border-radius: 8px; cursor: pointer; }
598
+ .hist-row:hover { background: var(--hover); }
599
+ .hist-row.on { background: var(--selected); }
600
+ .hist-row b { display: block; font-size: 14px; font-weight: 500; color: var(--ink); }
601
+ .hist-row small { display: block; margin-top: 2px; font-size: 12px; color: var(--muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
602
+ .hist-none { padding: 12px; font-size: 13px; color: var(--muted); }
603
+ .hist-foot { padding: 12px 16px; }
604
+ body.history-mode #ed-canvas, body.history-mode #ed-ui { pointer-events: none; } /* a version is shown, not edited */
605
+ body.history-mode #ed-toolbar { opacity: .4; pointer-events: none; }
606
+ #ed-history:not([hidden]) { display: flex; flex-direction: column; }
607
+ .hist-foot button { height: 36px; padding: 0 24px; border: 0; border-radius: 18px; background: var(--blue); color: #fff; font-weight: 500; }
608
+ .hist-row .who { display: flex; align-items: center; gap: 6px; margin-top: 4px; font-size: 12px; font-style: normal; color: var(--ink); }
609
+ .hist-row .who::before { content: ''; width: 8px; height: 8px; border-radius: 50%; background: var(--spacing); }
610
+ .hist-row { position: relative; }
611
+ .hist-more { position: absolute; right: 6px; top: 8px; width: 28px; height: 28px; padding: 0; border-radius: 50%; color: var(--icon); }
612
+ .hist-more:hover { background: var(--hover); }
613
+ #ed-history .hist-hl { display: flex; flex-direction: row; justify-content: flex-start; align-items: center; gap: 8px; margin-top: 12px; font-size: 14px; color: var(--ink); }
614
+ .hist-hl input { width: 18px; height: 18px; accent-color: var(--blue); }
615
+ .box.hist-changed { outline: calc(6px) solid #6fc2b5; outline-offset: -3px; } /* Version history → Highlight changes, Slides' teal */
616
+ .drag-ghost { position: absolute; box-shadow: inset 0 0 0 var(--k) #9aa0a6; pointer-events: none; } /* the box's place before the drag */
617
+ #ed-canvas .box.note, .thumb-canvas .box.note { display: flex; background: #fff3a8; box-shadow: 0 2px 6px rgba(60, 64, 67, .3); } /* a Note for AI: shown only here */
618
+ #ed-canvas .box.note > .content, .thumb-canvas .box.note > .content { font-size: 32px; color: #3c4043; }
619
+ body.stickies-off #ed-canvas .box.note, body.stickies-off .thumb-canvas .box.note { display: none; } /* View → Show sticky notes, off */
620
+ #ed-ai-notes { display: flex; flex-wrap: wrap; gap: 6px; padding: 6px 16px 0; }
621
+ #ed-ai-notes[hidden] { display: none; }
622
+ .ai-note { display: flex; align-items: center; gap: 6px; max-width: 420px; height: 28px; padding: 0 10px; border-radius: 14px; background: #fff3a8; color: #3c4043; font-size: 13px; cursor: pointer; }
623
+ .ai-note span:nth-child(2) { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
624
+ .ai-note small { color: #80868b; white-space: nowrap; }
625
+ .ai-note .icon { font-size: 16px; }
626
+
627
+ /* The light / dark switch (js/theme-toggle.js): the new theme is revealed in a circle from the button, its icon turning in */
628
+ ::view-transition-old(root), ::view-transition-new(root) { animation: none; mix-blend-mode: normal; }
629
+ @keyframes theme-turn { from { transform: rotate(-120deg) scale(.5); opacity: 0; } to { transform: none; opacity: 1; } }
630
+ html.theme-turning #theme-toggle .icon { animation: theme-turn .7s cubic-bezier(.65, 0, .35, 1); }
631
+ #theme-toggle { display: inline-grid; place-items: center; }
632
+ .hm-end { display: flex; align-items: center; gap: 2px; margin-left: auto; justify-self: end; }
633
+ .hm-end #hm-app-more { margin-left: 0; }
634
+ html.phone #theme-toggle { display: none; }
635
+
636
+ /* A video or web page behind the slide (Background): the canvas plays it; thumbnails show a still frame or a placeholder */
637
+ .bg-media { position: absolute; inset: 0; z-index: 0; overflow: hidden; pointer-events: none; display: grid; place-items: center; background: #1d2433; color: #8d99b3; }
638
+ .bg-media video, .bg-media iframe { width: 100%; height: 100%; object-fit: cover; border: 0; display: block; }
639
+ .bg-media .icon { font-size: 200px; }
640
+ #ed-frame > #ed-canvas, .thumb-canvas > section { z-index: 1; } /* above the background video or page (both are positioned already) */
641
+
642
+ /* A collaborator's editor (glideshow.org/e/…): no Share, no theme of its own (both stay the owner's) */
643
+ html.collab #ed-share, html.collab #ed-theme-btn { display: none !important; }
644
+ /* Who else is here (people.js): initials by Share, a dot on their slide in the filmstrip, a ring round their boxes */
645
+ #ed-people { display: flex; align-items: center; margin-left: 8px; }
646
+ #ed-people[hidden] { display: none; }
647
+ #ed-people .person { width: 30px; height: 30px; margin-left: -6px; border: 2px solid var(--chrome, #fff); border-radius: 50%; padding: 0;
648
+ background: var(--c); color: #fff; font-family: inherit; font-size: 12px; font-weight: 600; line-height: 26px; text-align: center; cursor: pointer; }
649
+ #ed-people .person:first-child { margin-left: 0; }
650
+ #ed-people .person:hover { position: relative; z-index: 1; box-shadow: 0 0 0 2px var(--c); }
651
+ .thumb-people { position: absolute; top: 4px; right: 4px; display: flex; gap: 2px; pointer-events: none; z-index: 2; }
652
+ .thumb-people .person { width: 18px; height: 18px; border-radius: 50%; background: var(--c); color: #fff; font-family: inherit; font-size: 9px; font-weight: 600; line-height: 18px; text-align: center; box-shadow: 0 0 0 1.5px #fff; }
653
+ #ed-people-on { position: absolute; inset: 0; pointer-events: none; }
654
+ .person-ring { position: absolute; box-shadow: 0 0 0 calc(2 * var(--k, 1px)) var(--c); border-radius: calc(2 * var(--k, 1px)); }
655
+ .person-ring.typing { z-index: 1; box-shadow: 0 0 0 calc(3 * var(--k, 1px)) var(--c); }
656
+ .person-tag { position: absolute; left: calc(-3 * var(--k, 1px)); bottom: 100%; margin-bottom: calc(3 * var(--k, 1px)); padding: 0 calc(6 * var(--k, 1px));
657
+ background: var(--c); color: #fff; font-family: inherit; font-size: calc(12 * var(--k, 1px)); font-weight: 500; line-height: calc(20 * var(--k, 1px)); white-space: nowrap; border-radius: calc(3 * var(--k, 1px)) calc(3 * var(--k, 1px)) calc(3 * var(--k, 1px)) 0; }