tandem-editor 0.11.2 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +3 -3
  3. package/CHANGELOG.md +201 -72
  4. package/README.md +141 -238
  5. package/dist/channel/index.js +211 -81
  6. package/dist/channel/index.js.map +1 -1
  7. package/dist/cli/index.js +749 -170
  8. package/dist/cli/index.js.map +1 -1
  9. package/dist/client/assets/CoworkSettings-BOYbyKul.js +3 -0
  10. package/dist/client/assets/event-CNdo2oXa.js +1 -0
  11. package/dist/client/assets/index-D8uS4cj7.css +1 -0
  12. package/dist/client/assets/index-Dm_QtxGQ.js +1 -0
  13. package/dist/client/assets/index-g-KwmRn9.js +271 -0
  14. package/dist/client/assets/webview-KiZyy_pC.js +1 -0
  15. package/dist/client/assets/window-DePn7tLG.js +1 -0
  16. package/dist/client/fonts/OFL-Hanuman.txt +93 -0
  17. package/dist/client/fonts/OFL-InterTight.txt +93 -0
  18. package/dist/client/fonts/OFL-JetBrainsMono.txt +93 -0
  19. package/dist/client/fonts/OFL-SNPro.txt +93 -0
  20. package/dist/client/fonts/OFL-Sono.txt +93 -0
  21. package/dist/client/fonts/OFL-SourceSerif4.txt +93 -0
  22. package/dist/client/fonts/hanuman-latin.woff2 +0 -0
  23. package/dist/client/fonts/jetbrains-mono-latin.woff2 +0 -0
  24. package/dist/client/fonts/sn-pro-latin.woff2 +0 -0
  25. package/dist/client/fonts/sono-latin.woff2 +0 -0
  26. package/dist/client/fonts/source-serif-4-latin.woff2 +0 -0
  27. package/dist/client/index.html +206 -17
  28. package/dist/client/logo.png +0 -0
  29. package/dist/monitor/index.js +241 -160
  30. package/dist/monitor/index.js.map +1 -1
  31. package/dist/server/index.js +22828 -19659
  32. package/dist/server/index.js.map +1 -1
  33. package/package.json +12 -4
  34. package/sample/welcome.md +6 -6
  35. package/skills/tandem/SKILL.md +15 -0
  36. package/dist/client/assets/CoworkSettings-DK3jjdwK.js +0 -3
  37. package/dist/client/assets/index-CfT503n4.js +0 -297
  38. package/dist/client/assets/index-DeJe09pn.css +0 -1
  39. package/dist/client/assets/webview-Ben21ZLJ.js +0 -1
  40. package/dist/client/assets/window-BxBvHL5k.js +0 -1
@@ -34,6 +34,13 @@
34
34
  font-display: swap;
35
35
  src: url("/fonts/source-serif-4-latin.woff2") format("woff2");
36
36
  }
37
+ @font-face {
38
+ font-family: "Hanuman";
39
+ font-style: normal;
40
+ font-weight: 400 700;
41
+ font-display: swap;
42
+ src: url("/fonts/hanuman-latin.woff2") format("woff2");
43
+ }
37
44
  @font-face {
38
45
  font-family: "JetBrains Mono";
39
46
  font-style: normal;
@@ -41,10 +48,24 @@
41
48
  font-display: swap;
42
49
  src: url("/fonts/jetbrains-mono-latin.woff2") format("woff2");
43
50
  }
51
+ @font-face {
52
+ font-family: "Sono";
53
+ font-style: normal;
54
+ font-weight: 200 800;
55
+ font-display: swap;
56
+ src: url("/fonts/sono-latin.woff2") format("woff2");
57
+ }
58
+ @font-face {
59
+ font-family: "SN Pro";
60
+ font-style: normal;
61
+ font-weight: 400 700;
62
+ font-display: swap;
63
+ src: url("/fonts/sn-pro-latin.woff2") format("woff2");
64
+ }
44
65
  :root {
45
- --tandem-font-sans: "Inter Tight", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
46
- --tandem-font-serif: "Source Serif 4", "Source Serif Pro", Charter, "Iowan Old Style", Georgia, serif;
47
- --tandem-font-mono: "JetBrains Mono", ui-monospace, "SF Mono", Menlo, monospace;
66
+ --tandem-font-sans: "SN Pro", "Inter Tight", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
67
+ --tandem-font-serif: "Hanuman", "Source Serif 4", "Source Serif Pro", Charter, "Iowan Old Style", Georgia, serif;
68
+ --tandem-font-mono: "Sono", "JetBrains Mono", ui-monospace, "SF Mono", Menlo, monospace;
48
69
  --tandem-bg: oklch(0.985 0.004 80);
49
70
  --tandem-fg: oklch(0.22 0.012 280);
50
71
  --tandem-surface: oklch(1 0 0);
@@ -91,7 +112,8 @@
91
112
  --tandem-suggestion-bg: color-mix(in srgb, var(--tandem-suggestion) 10%, var(--tandem-surface));
92
113
  --tandem-suggestion-border: color-mix(in srgb, var(--tandem-suggestion) 40%, var(--tandem-border));
93
114
  --tandem-accent-border: oklch(0.84 0.10 var(--tandem-accent-h));
94
- --tandem-editor-font-family: var(--tandem-font-serif);
115
+ --tandem-selection-blurred-bg: color-mix(in srgb, var(--tandem-accent) 22%, transparent);
116
+ --tandem-editor-font-family: var(--tandem-font-sans);
95
117
  --tandem-editor-font-size: 17px;
96
118
  --tandem-scrollbar-track: oklch(0.96 0.006 80);
97
119
  --tandem-scrollbar-thumb: oklch(0.82 0.005 280);
@@ -131,6 +153,13 @@
131
153
  --tandem-shadow-2: 0 8px 24px rgba(0, 0, 0, 0.12);
132
154
  --tandem-shadow-3: 0 20px 60px rgba(0, 0, 0, 0.2);
133
155
  --tandem-shadow-4: 0 16px 48px rgba(0, 0, 0, 0.18);
156
+ /* Directional rail shadows — cast inward toward the editor only. The
157
+ rails sit flush to the window edge; an isotropic shadow would be
158
+ clipped on the outer side. Light theme. Dark-theme override below. */
159
+ --tandem-rail-shadow-left: 4px 0 16px -8px rgba(0, 0, 0, 0.18),
160
+ 1px 0 1px rgba(0, 0, 0, 0.03);
161
+ --tandem-rail-shadow-right: -4px 0 16px -8px rgba(0, 0, 0, 0.18),
162
+ -1px 0 1px rgba(0, 0, 0, 0.03);
134
163
  --tandem-z-base: 1;
135
164
  --tandem-z-dropdown: 10;
136
165
  --tandem-z-sticky: 100;
@@ -138,20 +167,140 @@
138
167
  --tandem-z-modal: 1000;
139
168
  --tandem-z-toast: 1100;
140
169
  --tandem-z-tooltip: 10000;
170
+ /* v7 floating chrome clearance/position vars — consumed by W2-W6
171
+ rails, fmtbar, status pill. W4a maximalist lifted DocumentTabs
172
+ into the floating TitleBar (44px tall, no in-flow tabs row), so
173
+ these drop to 52px per the calm-v7.css target. The fmtbar pill is
174
+ fixed-positioned at top: 52px, height 36px → bottom at viewport
175
+ y=88. Editor-scroll lives below the titlebar in the flex column,
176
+ so its top edge is at viewport y=44; an editor padding-top of at
177
+ least 52px (max(--tandem-space-7, 52px)) lands content at y≥96,
178
+ clearing the fmtbar with ≥8px breathing. Rails use
179
+ rail-top-clearance as margin-top inside the editor row → rail top
180
+ also at y=96, in line with the editor content. */
181
+ --tandem-fmtbar-top: 52px;
182
+ --tandem-rail-top-clearance: 52px;
183
+ --tandem-status-clearance: 36px;
184
+ /* Bottom inset that any "hugs-content" rail (outline) reserves
185
+ below itself so the floating status pill (W5) renders into
186
+ clear space. Sum of pill chrome (status-clearance) + a comfy
187
+ 24px margin. Consumed by PanelSlot's outline branch in W6. */
188
+ --tandem-status-clearance-total: calc(var(--tandem-status-clearance) + var(--tandem-space-5, 24px));
189
+ /* Light-mode floating-pill stack (matches v7 calm-v7.css). Warm/dark
190
+ override --c7-pill-shadow inside their own theme blocks. */
191
+ --c7-pill-shadow:
192
+ 0 1px 1px rgba(0, 0, 0, 0.04),
193
+ 0 6px 14px -6px rgba(0, 0, 0, 0.10),
194
+ 0 22px 38px -22px rgba(0, 0, 0, 0.16);
195
+ }
196
+
197
+ /* Shared white-mode floating-pill recipe. Applied to every floating
198
+ chrome surface introduced by Waves 3-6: fmtbar, titlebar clusters,
199
+ tab pills, +/add pill, mode segment, status pill, mini-toolbar,
200
+ wincontrols. Surfaces only need .tandem-floating-pill + a sensible
201
+ border-radius (pill or 14px). Surface-specific overrides (padding,
202
+ max-width, drag-region) layer on top. */
203
+ .tandem-floating-pill {
204
+ background: var(--tandem-surface);
205
+ border: 1px solid var(--tandem-border);
206
+ border-radius: var(--tandem-r-pill);
207
+ box-shadow: var(--c7-pill-shadow);
208
+ backdrop-filter: saturate(140%) blur(8px);
209
+ -webkit-backdrop-filter: saturate(140%) blur(8px);
210
+ }
211
+ [data-theme="dark"] .tandem-floating-pill {
212
+ --c7-pill-shadow:
213
+ 0 1px 1px rgba(0, 0, 0, 0.30),
214
+ 0 6px 14px -6px rgba(0, 0, 0, 0.40),
215
+ 0 22px 38px -22px rgba(0, 0, 0, 0.50);
216
+ }
217
+
218
+ /* `filter: opacity()` is used instead of plain `opacity:` so the fade
219
+ composes with cards that already carry an inline opacity (e.g.
220
+ accepted cards at 0.6) rather than being clamped by it. Highlights
221
+ are intentionally excluded — they're user-owned color flags. */
222
+ [data-tandem-mode="solo"] [data-annotation-type="comment"],
223
+ [data-tandem-mode="solo"] [data-annotation-type="note"],
224
+ [data-tandem-mode="solo"] [data-testid="margin-column-left"] .margin-bubble,
225
+ [data-tandem-mode="solo"] [data-testid="margin-column-right"] .margin-bubble {
226
+ filter: opacity(0.45);
227
+ transition: filter 200ms ease;
228
+ }
229
+
230
+ /* Fade the in-editor underline decorations to match the side-panel card
231
+ fade above — keeps the visual weight of comments/notes consistent
232
+ between the editor and the panel in solo mode. */
233
+ [data-tandem-mode="solo"] .tandem-comment,
234
+ [data-tandem-mode="solo"] .tandem-note {
235
+ opacity: 0.45;
236
+ transition: opacity 200ms ease;
237
+ }
238
+
239
+ /* Slash command menu — v7 floating-card variant.
240
+ Inherits floating-pill bg/border/shadow then overrides border-radius
241
+ to a card shape (menus aren't pill-shaped) and stacks an item list
242
+ with a keyboard-hint footer. */
243
+ .tandem-slash-menu {
244
+ border-radius: var(--tandem-r-4);
245
+ min-width: 200px;
246
+ padding: var(--tandem-space-1);
247
+ z-index: var(--tandem-z-popover, 1100);
248
+ }
249
+ .tandem-slash-menu__item {
250
+ display: flex;
251
+ align-items: center;
252
+ width: 100%;
253
+ padding: var(--tandem-space-1) var(--tandem-space-3);
254
+ border: 1px solid transparent;
255
+ border-radius: var(--tandem-r-2);
256
+ background: transparent;
257
+ color: var(--tandem-fg);
258
+ font: inherit;
259
+ font-size: var(--tandem-text-sm);
260
+ text-align: left;
261
+ cursor: pointer;
262
+ white-space: nowrap;
263
+ }
264
+ .tandem-slash-menu__item:hover {
265
+ background: color-mix(in srgb, var(--tandem-fg) 5%, transparent);
266
+ }
267
+ .tandem-slash-menu__item[aria-selected="true"] {
268
+ background: var(--tandem-accent-bg);
269
+ color: var(--tandem-accent-fg-strong);
270
+ border-color: var(--tandem-accent-border);
271
+ }
272
+ .tandem-slash-menu__hint {
273
+ display: flex;
274
+ gap: var(--tandem-space-3);
275
+ padding: var(--tandem-space-1) var(--tandem-space-3);
276
+ margin-top: var(--tandem-space-1);
277
+ border-top: 1px solid var(--tandem-border);
278
+ font-size: var(--tandem-text-2xs);
279
+ color: var(--tandem-fg-faint);
280
+ }
281
+ .tandem-slash-menu__hint kbd {
282
+ font-family: var(--tandem-font-mono);
283
+ font-size: var(--tandem-text-2xs);
284
+ padding: 0 4px;
285
+ border: 1px solid var(--tandem-border);
286
+ border-radius: var(--tandem-r-1);
287
+ background: var(--tandem-surface-muted);
288
+ color: var(--tandem-fg-subtle);
141
289
  }
142
290
 
143
291
  [data-theme="dark"] {
144
- --tandem-bg: oklch(0.18 0.012 270);
145
- --tandem-fg: oklch(0.94 0.005 80);
146
- --tandem-surface: oklch(0.22 0.012 270);
147
- --tandem-surface-muted: oklch(0.20 0.012 270);
148
- --tandem-surface-sunk: oklch(0.16 0.012 270);
149
- --tandem-border: oklch(0.30 0.012 270);
150
- --tandem-border-strong: oklch(0.38 0.014 270);
151
- --tandem-fg-muted: oklch(0.72 0.008 80);
152
- /* Lightened from 0.55 → 0.70 to meet WCAG AA 4.5:1 on --tandem-surface-muted (0.20) */
153
- --tandem-fg-subtle: oklch(0.70 0.008 80);
154
- --tandem-fg-faint: oklch(0.58 0.010 270);
292
+ /* Tracks the calm-v7 dark canon at hue 280°. */
293
+ --tandem-bg: oklch(0.22 0.012 280);
294
+ --tandem-fg: oklch(0.94 0.006 280);
295
+ --tandem-surface: oklch(0.27 0.012 280);
296
+ --tandem-surface-muted: oklch(0.25 0.012 280);
297
+ --tandem-surface-sunk: oklch(0.20 0.012 280);
298
+ --tandem-border: oklch(0.34 0.010 280);
299
+ --tandem-border-strong: oklch(0.42 0.012 280);
300
+ --tandem-fg-muted: oklch(0.74 0.008 280);
301
+ /* 0.70 keeps WCAG AA 4.5:1 against --tandem-surface-muted (0.25). */
302
+ --tandem-fg-subtle: oklch(0.70 0.008 280);
303
+ --tandem-fg-faint: oklch(0.58 0.008 280);
155
304
  --tandem-accent-h: 275deg;
156
305
  --tandem-accent: oklch(0.72 0.14 var(--tandem-accent-h));
157
306
  --tandem-accent-fg: oklch(0.15 0.01 var(--tandem-accent-h));
@@ -187,6 +336,7 @@
187
336
  --tandem-suggestion-bg: #2e1065;
188
337
  --tandem-suggestion-border: #4c1d95;
189
338
  --tandem-accent-border: oklch(0.45 0.14 var(--tandem-accent-h));
339
+ --tandem-selection-blurred-bg: color-mix(in srgb, var(--tandem-accent) 32%, transparent);
190
340
  --tandem-scrollbar-track: oklch(0.16 0.012 270);
191
341
  --tandem-scrollbar-thumb: oklch(0.38 0.014 270);
192
342
  --tandem-highlight-yellow: rgba(255, 220, 0, 0.38);
@@ -196,6 +346,45 @@
196
346
  --tandem-page-bg: #2a2a2a;
197
347
  --tandem-page-paper: #1a1a1a;
198
348
  --tandem-page-shadow: 0 2px 12px rgba(0, 0, 0, 0.4);
349
+ --tandem-rail-shadow-left: 4px 0 18px -6px rgba(0, 0, 0, 0.55),
350
+ 1px 0 1px rgba(0, 0, 0, 0.25);
351
+ --tandem-rail-shadow-right: -4px 0 18px -6px rgba(0, 0, 0, 0.55),
352
+ -1px 0 1px rgba(0, 0, 0, 0.25);
353
+ }
354
+
355
+ /* Warm canvas theme — v7 floating chrome. OKLCH values come straight
356
+ from calm-v7.css. Foundational tokens only: surface family + border
357
+ + scrollbars + page metaphor + the shared pill-shadow used by every
358
+ floating-pill surface (titlebar clusters, fmtbar, tabs, status,
359
+ rails, wincontrols). Component-level adoption happens in W3-W6. */
360
+ [data-theme="warm"] {
361
+ --tandem-bg: oklch(0.945 0.012 70);
362
+ --tandem-fg: oklch(0.22 0.012 280);
363
+ --tandem-surface: oklch(0.975 0.005 75);
364
+ --tandem-surface-muted: oklch(0.960 0.010 75);
365
+ --tandem-surface-sunk: oklch(0.920 0.014 65);
366
+ --tandem-border: oklch(0.91 0.006 75);
367
+ --tandem-border-strong: oklch(0.84 0.008 75);
368
+ --tandem-fg-muted: oklch(0.48 0.008 280);
369
+ --tandem-fg-subtle: oklch(0.54 0.008 280);
370
+ --tandem-fg-faint: oklch(0.64 0.005 280);
371
+ --tandem-scrollbar-track: oklch(0.94 0.012 70);
372
+ --tandem-scrollbar-thumb: oklch(0.78 0.010 75);
373
+ --tandem-page-bg: oklch(0.925 0.012 70);
374
+ --tandem-page-paper: oklch(0.985 0.005 75);
375
+ --tandem-page-shadow: 0 2px 8px oklch(0 0 0 / 0.12);
376
+ /* Floating-pill shadow stack — consumed by the shared
377
+ .tandem-floating-pill class introduced in W3. Three light/dark
378
+ variants of the same shape are exposed so each surface can pick
379
+ the right contrast against its canvas. */
380
+ --c7-pill-shadow:
381
+ 0 1px 1px oklch(0 0 0 / 0.03),
382
+ 0 4px 10px -4px oklch(0 0 0 / 0.10),
383
+ 0 16px 30px -18px oklch(0 0 0 / 0.18);
384
+ --c7-pill-shadow-white:
385
+ 0 1px 1px oklch(0 0 0 / 0.04),
386
+ 0 6px 14px -6px oklch(0 0 0 / 0.10),
387
+ 0 22px 38px -22px oklch(0 0 0 / 0.16);
199
388
  }
200
389
 
201
390
  /* density spacing scale — cozy is the default (matches :root values) */
@@ -289,8 +478,8 @@
289
478
  scrollbar-color: var(--tandem-scrollbar-thumb) var(--tandem-scrollbar-track);
290
479
  }
291
480
  </style>
292
- <script type="module" crossorigin src="/assets/index-CfT503n4.js"></script>
293
- <link rel="stylesheet" crossorigin href="/assets/index-DeJe09pn.css">
481
+ <script type="module" crossorigin src="/assets/index-g-KwmRn9.js"></script>
482
+ <link rel="stylesheet" crossorigin href="/assets/index-D8uS4cj7.css">
294
483
  </head>
295
484
  <body>
296
485
  <div id="root"></div>
Binary file