dsh-global-todo 0.4.3 → 0.4.5

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.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.4.5] — 2026-10-19
11
+
12
+ Polishing where the side detail sits, now that it exists.
13
+
14
+ - **The card is bracketed between the toolbar and the footer**, so it no longer covers the dir
15
+ controls or the store line; the toolbar keeps its full width and only the list gives way; the
16
+ card scrolls as one column instead of pushing the footer around. Same CSS-only mechanism, no
17
+ markup change.
18
+ ## [0.4.4] — 2026-10-19
19
+
20
+ Opening a todo on a wide screen used to push the list down and leave half the window unused.
21
+
22
+ - **The open row's detail is now a card beside the list**, above a 1100px viewport: it sits at
23
+ the panel's right edge, the list keeps its own column, and the card scrolls on its own. Narrow
24
+ windows keep the familiar inline expansion. The change is CSS-only over the existing markup —
25
+ `.gt-root[data-wide-detail]` plus one media query — so there is still exactly one detail
26
+ implementation; a second wide-screen render path would drift from the inline one at the first
27
+ field change.
10
28
  ## [0.4.3] — 2026-10-19
11
29
 
12
30
  The list is meant to live in a synced folder; a change from another machine should not be
package/docs/DESIGN.md CHANGED
@@ -57,6 +57,16 @@ $DSH_HOME/global-todo/todos.json ← { version: 1, todos: [ … ] }
57
57
  version, and a future migration step would run before the first write, keeping the old
58
58
  file as a backup.
59
59
 
60
+ ## On a wide window, the detail stands beside the list
61
+
62
+ Expanding a row inline is right on a narrow window and wrong on a wide one: the list jumps, the
63
+ row you were reading slides away, and the rest of the screen sits empty. Above 1100px the open
64
+ row's detail is lifted out of the flow into a card bracketed between the toolbar and the footer
65
+ at the panel's right edge; only the list gives way (the toolbar keeps full width), and the list gets
66
+ padding equal to that card. This is a CSS-only override over unchanged markup
67
+ (`.gt-root[data-wide-detail]` plus one media query) precisely so there is still exactly one
68
+ detail implementation — a second render path for wide screens would drift from the inline one at
69
+ the first field change.
60
70
  ## A shared file changes without asking
61
71
 
62
72
  The list is deliberately portable — a notes repo, a synced folder, a NAS — so another machine
package/docs/ROADMAP.md CHANGED
@@ -110,6 +110,9 @@ in `skipped[]`, and archived/cancelled rows deliberately do not block a new one.
110
110
  counts a disagreement once (`externalChanges`, `lastExternalAt` in `lib/store.js`; surfaced by
111
111
  `/health.store`). The panel shows a one-line notice instead of letting a synced folder change the
112
112
  list silently.
113
+ **Side detail on wide windows** — above 1100px the open row's detail becomes a card at the
114
+ panel's right edge instead of pushing the list down (CSS-only over the same markup; one detail
115
+ implementation), while narrow windows keep the inline expansion.
113
116
  ### Partly landed
114
117
 
115
118
  - **Batch and multi-select** — the selection mode, its per-row markers and the batch
Binary file
Binary file
Binary file
package/lib/client.js CHANGED
@@ -50,7 +50,7 @@ window.__ModuleLoader__.load({
50
50
  * different mechanisms (restart vs. hot reload), so "which one am I looking
51
51
  * at" needs an answer that the bundle itself carries.
52
52
  */
53
- const UI_REV = 'ui26'
53
+ const UI_REV = 'ui28'
54
54
  /** Last language resolved for the shell; module-level so a fetch failure can be worded too. */
55
55
  let activeLang = 'zh'
56
56
 
@@ -1008,6 +1008,23 @@ button.gt-chip[data-on="1"] { color: var(--dsw-alias-label-primary); border-colo
1008
1008
  .gt-menu button[data-danger="1"] { color: var(--dsw-alias-state-error-primary); }
1009
1009
  .gt-detail { display: flex; flex-direction: column; gap: 10px; border-top: 1px solid var(--dsw-alias-border-l1);
1010
1010
  padding-top: 10px; margin-top: 2px; }
1011
+ /* Wide screens: the open row's detail becomes a card on the right instead of pushing the list
1012
+ down. Deliberately CSS-only over unchanged markup: one detail implementation, and it only
1013
+ applies where there is room for a second column. */
1014
+ @media (min-width: 1100px) {
1015
+ /* Only the list gives way: the title row and the toolbar keep their full width, so the
1016
+ controls never wrap or hide behind the card. */
1017
+ .gt-root[data-wide-detail="1"] .gt-groups { padding-right: 400px; }
1018
+ .gt-root[data-wide-detail="1"] .gt-item[data-open="1"] .gt-detail {
1019
+ /* Aligned to the panel's own right edge (centred, capped at 980px) and bracketed between
1020
+ the toolbar and the footer, so it reads as a second column rather than a floating
1021
+ dialog. */
1022
+ position: fixed; top: 208px; bottom: 64px;
1023
+ right: max(24px, calc(50vw - 466px)); width: 360px;
1024
+ overflow: auto; padding: 16px; margin: 0; border: 1px solid var(--dsw-alias-border-l2);
1025
+ border-radius: 12px; background: var(--dsw-alias-bg-overlay); z-index: 30;
1026
+ }
1027
+ }
1011
1028
  .gt-section { display: flex; flex-direction: column; gap: 5px; }
1012
1029
  .gt-completion { white-space: pre-wrap; word-break: break-word; line-height: 1.5; }
1013
1030
  .gt-section-title { color: var(--dsw-alias-label-secondary); font-size: 11.5px; text-transform: uppercase;
@@ -2760,7 +2777,7 @@ button.gt-chip[data-on="1"] { color: var(--dsw-alias-label-primary); border-colo
2760
2777
 
2761
2778
  return h(
2762
2779
  'div',
2763
- { className: 'gt-root' },
2780
+ { className: 'gt-root', 'data-wide-detail': expandedId === '' ? '0' : '1' },
2764
2781
  h(
2765
2782
  'div',
2766
2783
  { className: 'gt-inner' },
package/lib/index.js CHANGED
@@ -35,7 +35,7 @@ import { createStore, resolveStorePath } from './store.js'
35
35
  import { createTools } from './tools.js'
36
36
 
37
37
  /** Must equal `package.json`'s version; `npm run check` enforces that. */
38
- export const VERSION = '0.4.3'
38
+ export const VERSION = '0.4.5'
39
39
 
40
40
  /** Plugin id. Also the Loader row id in `cordis.patch.yml`. */
41
41
  export const name = 'dsh-global-todo'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-global-todo",
3
- "version": "0.4.3",
3
+ "version": "0.4.5",
4
4
  "icon": "./docs/icon.svg",
5
5
  "description": "Global, cross-session todos for DeepSeek Harness: one list owned by the human and the agent together, with creation time, attached documents and links, and one-click hand-off to an agent session. 全局待办:跨会话一份清单,记录加入时间,可挂文档与地址,可一键交给 Agent 继续干。",
6
6
  "type": "module",