dsh-global-todo 0.4.3 → 0.4.4

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,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.4.4] — 2026-10-19
11
+
12
+ Opening a todo on a wide screen used to push the list down and leave half the window unused.
13
+
14
+ - **The open row's detail is now a card beside the list**, above a 1100px viewport: it sits at
15
+ the panel's right edge, the list keeps its own column, and the card scrolls on its own. Narrow
16
+ windows keep the familiar inline expansion. The change is CSS-only over the existing markup —
17
+ `.gt-root[data-wide-detail]` plus one media query — so there is still exactly one detail
18
+ implementation; a second wide-screen render path would drift from the inline one at the first
19
+ field change.
10
20
  ## [0.4.3] — 2026-10-19
11
21
 
12
22
  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,15 @@ $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 at the panel's right edge, and the list gets
65
+ right padding equal to that card. This is a CSS-only override over unchanged markup
66
+ (`.gt-root[data-wide-detail]` plus one media query) precisely so there is still exactly one
67
+ detail implementation — a second render path for wide screens would drift from the inline one at
68
+ the first field change.
60
69
  ## A shared file changes without asking
61
70
 
62
71
  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 = 'ui27'
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,19 @@ 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
+ .gt-root[data-wide-detail="1"] .gt-inner { padding-right: 408px; }
1016
+ .gt-root[data-wide-detail="1"] .gt-item[data-open="1"] .gt-detail {
1017
+ /* Follow the panel's own right edge (it is centred and capped at 980px) instead of the
1018
+ viewport's, so the card stays attached to the list on ultra-wide screens. */
1019
+ position: fixed; top: 96px; right: max(24px, calc(50vw - 466px)); width: 360px; max-height: calc(100vh - 140px);
1020
+ overflow: auto; padding: 16px; margin: 0; border: 1px solid var(--dsw-alias-border-l2);
1021
+ border-radius: 12px; background: var(--dsw-alias-bg-overlay); z-index: 30;
1022
+ }
1023
+ }
1011
1024
  .gt-section { display: flex; flex-direction: column; gap: 5px; }
1012
1025
  .gt-completion { white-space: pre-wrap; word-break: break-word; line-height: 1.5; }
1013
1026
  .gt-section-title { color: var(--dsw-alias-label-secondary); font-size: 11.5px; text-transform: uppercase;
@@ -2760,7 +2773,7 @@ button.gt-chip[data-on="1"] { color: var(--dsw-alias-label-primary); border-colo
2760
2773
 
2761
2774
  return h(
2762
2775
  'div',
2763
- { className: 'gt-root' },
2776
+ { className: 'gt-root', 'data-wide-detail': expandedId === '' ? '0' : '1' },
2764
2777
  h(
2765
2778
  'div',
2766
2779
  { 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.4'
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.4",
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",