dsh-sidebar-scroll-flow 0.0.0-stage → 1.0.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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 agoudbg
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,42 @@
1
- # Temporary Holding Version
1
+ # dsh-sidebar-scroll-flow
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Scrolls the whole **web sidebar** as one column in the DSH Web UI.
4
+
5
+ The shipped layout keeps the global panel rows (Temporary tasks, Plugins, Automated tasks, More) fixed above the browsing region, so only the session list scrolls. This plugin moves the scroll boundary to the sidebar column itself:
6
+
7
+ - The panel rows scroll away together with the session list.
8
+ - The brand row, the New Session button, and the settings foot stay pinned (`position: sticky`) with opaque backdrops, so rows slide beneath them unseen.
9
+ - A hairline above the New Session button fades in over the first pixels of scrolling (scroll-driven animation).
10
+ - The collapsed rail keeps its own layout and never scrolls.
11
+ - Windows titlebar mode keeps its shorter 40px brand row, with pinned offsets adjusted.
12
+
13
+ The plugin is a style-only overlay: selectors anchor on the readable suffixes of the shipped CSS-module class tokens (`..._panelList`, `..._regionArea`, ...), so rebuilds that change the hashes keep working. A DSH update that renames those class suffixes or restructures the sidebar needs the style sheet updated.
14
+
15
+ ## Requirements
16
+
17
+ - DSH `>=0.2.1-rc.5`
18
+ - The DSH Web UI (the plugin's client half targets the `web` platform)
19
+
20
+ ## Install
21
+
22
+ From npm, into the profile you boot:
23
+
24
+ ```sh
25
+ dsh plugin --profile <profile> add dsh-sidebar-scroll-flow
26
+ ```
27
+
28
+ Remove it the same way:
29
+
30
+ ```sh
31
+ dsh plugin --profile <profile> remove dsh-sidebar-scroll-flow
32
+ ```
33
+
34
+ From a local clone of [agou-dsh-plugins](https://github.com/agoudbg/agou-dsh-plugins), install this package directory through the DSH Plugin Manager instead:
35
+
36
+ ```
37
+ R:\path\to\agou-dsh-plugins\packages\dsh-sidebar-scroll-flow
38
+ ```
39
+
40
+ ## License
41
+
42
+ [MIT](./LICENSE)
package/client.js ADDED
@@ -0,0 +1,145 @@
1
+ window.__ModuleLoader__.load({
2
+ id: 'dsh-sidebar-scroll-flow',
3
+ factory(require) {
4
+ const React = require('react');
5
+ const h = React.createElement;
6
+
7
+ /**
8
+ * Sidebar scroll restructure.
9
+ *
10
+ * Shipped layout (ui-sidebar SidebarRoot): the column is a fixed-height flex
11
+ * column; the global panel rows (`nav` with `panelList` — Temporary tasks,
12
+ * Plugins, Automated tasks, More) sit above the browsing region and never
13
+ * move, while only the session list (WorkspaceBrowser `list`) scrolls.
14
+ *
15
+ * This sheet moves the scroll boundary to the column itself, so the panel
16
+ * rows scroll away together with the session list. The brand row, the
17
+ * New Session button and the foot (settings) stay where they are today via
18
+ * `position: sticky`, so nothing the user relies on disappears.
19
+ *
20
+ * Selectors anchor on the readable suffix of the shipped CSS-module class
21
+ * tokens (`hHd-Xa_panelList`, `bhn1Oq_list`, ...) instead of full hashed
22
+ * names, so a rebuild that changes the hashes keeps working.
23
+ */
24
+ const CSS = [
25
+ /* The whole sidebar column becomes the single scroll container, so the
26
+ panel rows scroll away together with the session list. Scoped to the
27
+ wide column: the collapsed rail keeps its own padding and never
28
+ scrolls. */
29
+ 'div:has(> [class*="panelList"]):has(> [class*="regionArea"]):not([class*="collapsed"]) { overflow-y: auto !important; padding-top: 0 !important; padding-bottom: 0 !important; }',
30
+
31
+ /* Brand row pinned at the top, widened to the full column; the 4px
32
+ shadow band covers the seam down to the New Session button. */
33
+ 'div:has(> [class*="panelList"]):has(> [class*="regionArea"]):not([class*="collapsed"]) > [class*="logoRow"] {',
34
+ ' position: sticky !important;',
35
+ ' top: 0 !important;',
36
+ ' z-index: 3;',
37
+ ' margin-left: -12px !important;',
38
+ ' margin-right: -12px !important;',
39
+ ' height: 66px !important;',
40
+ ' padding-top: 14px !important;',
41
+ ' padding-left: 16px !important;',
42
+ ' padding-right: 12px !important;',
43
+ ' background: var(--dsw-specific-sidebar-fill);',
44
+ ' box-shadow: 0 4px 0 0 var(--dsw-specific-sidebar-fill);',
45
+ ' /* the seam backdrop below is a pseudo of this row */',
46
+ ' overflow: visible !important;',
47
+ '}',
48
+ /* Opaque backdrop behind the pinned New Session button: it stacks under
49
+ the button but over the session rows, so rows scrolling underneath
50
+ stay hidden, and its hairline is the line rows disappear at. */
51
+ /* The hairline shows only while scrolled: a scroll-driven animation
52
+ fades it in over the first pixels of scrolling. */
53
+ '@keyframes sidebar-scroll-flow-line {',
54
+ ' 0% { border-bottom-color: transparent; }',
55
+ ' 8% { border-bottom-color: var(--dsw-alias-border-l3); }',
56
+ ' 100% { border-bottom-color: var(--dsw-alias-border-l3); }',
57
+ '}',
58
+ 'div:has(> [class*="panelList"]):has(> [class*="regionArea"]):not([class*="collapsed"]) > [class*="logoRow"]::after {',
59
+ " content: '';",
60
+ ' position: absolute;',
61
+ ' top: 70px;',
62
+ ' left: 0;',
63
+ ' right: 0;',
64
+ ' box-sizing: border-box;',
65
+ ' height: 50px;',
66
+ ' background: var(--dsw-specific-sidebar-fill);',
67
+ ' border-bottom: .5px solid var(--dsw-alias-border-l3);',
68
+ ' animation: sidebar-scroll-flow-line linear both;',
69
+ ' animation-timeline: scroll(nearest block);',
70
+ ' animation-range: 0 12px;',
71
+ ' pointer-events: none;',
72
+ '}',
73
+ /* Titlebar mode: the band starts below the 40px brand row. */
74
+ '[data-windows-titlebar] div:has(> [class*="panelList"]):has(> [class*="regionArea"]):not([class*="collapsed"]) > [class*="logoRow"]::after { top: 44px; height: 54px; }',
75
+ /* Titlebar mode keeps its own 40px brand row. */
76
+ '[data-windows-titlebar] div:has(> [class*="panelList"]):has(> [class*="regionArea"]):not([class*="collapsed"]) > [class*="logoRow"] { height: 40px !important; padding-top: 0 !important; padding-left: 0 !important; padding-right: 0 !important; }',
77
+
78
+ /* New Session button pinned right below the brand row. */
79
+ 'div:has(> [class*="panelList"]):has(> [class*="regionArea"]):not([class*="collapsed"]) > [class*="newSession"] {',
80
+ ' position: sticky !important;',
81
+ ' top: 70px !important;',
82
+ ' z-index: 3;',
83
+ '}',
84
+ /* Titlebar mode: the button starts below the 40px brand row. */
85
+ '[data-windows-titlebar] div:has(> [class*="panelList"]):has(> [class*="regionArea"]):not([class*="collapsed"]) > [class*="newSession"] { top: 48px !important; }',
86
+
87
+ /* The browsing region sizes to its content instead of clipping it. */
88
+ '[class*="regionArea"] { flex: none !important; overflow: visible !important; }',
89
+
90
+ /* WorkspaceBrowser internals stop managing their own scroll, so the
91
+ session list renders at full height for the column to scroll. */
92
+ '[class*="regionArea"] [class*="_root"] { flex: none !important; }',
93
+ '[class*="regionArea"] [class*="_listArea"],',
94
+ '[class*="regionArea"] [class*="_treeBody"] { flex: none !important; min-height: 0 !important; }',
95
+ '[class*="regionArea"] [class*="_list"] { flex: none !important; overflow-y: visible !important; }',
96
+
97
+ /* The bottom fade belongs to the inner scroll viewport; hide it. */
98
+ '[class*="regionArea"] [class*="_fade"] { display: none !important; }',
99
+
100
+ /* The foot stays pinned at the bottom with a full-width opaque
101
+ backdrop, so rows slide beneath it unseen. */
102
+ 'div:has(> [class*="panelList"]):has(> [class*="regionArea"]):not([class*="collapsed"]) > [class*="footArea"] {',
103
+ ' position: sticky !important;',
104
+ ' bottom: 0 !important;',
105
+ ' z-index: 3;',
106
+ ' margin-left: -12px !important;',
107
+ ' margin-right: -12px !important;',
108
+ ' padding-left: 12px !important;',
109
+ ' padding-right: 12px !important;',
110
+ ' padding-bottom: 6px !important;',
111
+ ' background: var(--dsw-specific-sidebar-fill);',
112
+ '}',
113
+ /* Official fade above the foot: the shipped 24px fade gradient. */
114
+ 'div:has(> [class*="panelList"]):has(> [class*="regionArea"]):not([class*="collapsed"]) > [class*="footArea"]::after {',
115
+ " content: '';",
116
+ ' position: absolute;',
117
+ ' left: 0;',
118
+ ' right: 0;',
119
+ ' bottom: 100%;',
120
+ ' height: 24px;',
121
+ ' background: linear-gradient(to bottom, transparent, var(--dsw-specific-sidebar-fill));',
122
+ ' pointer-events: none;',
123
+ '}',
124
+ ].join('\n');
125
+
126
+ /** Renders only a stylesheet; unmounting the slot entry removes it. */
127
+ function SidebarScrollFlowStyle() {
128
+ return h('style', {
129
+ 'data-plugin': 'dsh-sidebar-scroll-flow',
130
+ 'data-plugin-css': 'dsh-sidebar-scroll-flow/sidebar.css',
131
+ }, CSS);
132
+ }
133
+
134
+ return {
135
+ inject: ['slots'],
136
+ apply(ctx) {
137
+ ctx.slots.inject('shell.overlay', () => ctx.slots.register({
138
+ name: 'shell.overlay',
139
+ id: 'sidebar-scroll-flow',
140
+ order: 1000,
141
+ }, SidebarScrollFlowStyle));
142
+ },
143
+ };
144
+ },
145
+ });
@@ -0,0 +1,5 @@
1
+ # Insert the sidebar-scroll-flow Client plugin (style-only web overlay).
2
+ - insert:
3
+ - id: sidebar-scroll-flow
4
+ name: dsh-sidebar-scroll-flow
5
+ config: {}
package/icon.svg ADDED
@@ -0,0 +1,6 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
2
+ <rect x="8" y="8" width="48" height="48" rx="10" fill="none" stroke="#5b6472" stroke-width="3"/>
3
+ <line x1="26" y1="8" x2="26" y2="56" stroke="#5b6472" stroke-width="3"/>
4
+ <path d="M14 23h6M14 31h6M14 39h6" stroke="#247bbf" stroke-width="3" stroke-linecap="round"/>
5
+ <path d="M40 24v16m0 0-7-7m7 7 7-7" fill="none" stroke="#247bbf" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
6
+ </svg>
package/index.js ADDED
@@ -0,0 +1,2 @@
1
+ /** Host half of the bundle; the Client module owns the page-side style injection. */
2
+ export function apply() {}
package/locale/en.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "meta": {
3
+ "title": "Sidebar Scroll Flow",
4
+ "description": "Lets the sidebar panel rows (Temporary tasks, Plugins, Automated tasks, More) scroll together with the session list instead of staying fixed."
5
+ }
6
+ }
package/locale/zh.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "meta": {
3
+ "title": "侧边栏整体滚动",
4
+ "description": "让侧边栏的面板行(临时任务、插件、自动化任务、更多)随会话列表一起滚动,不再固定在顶部。"
5
+ }
6
+ }
package/package.json CHANGED
@@ -1,6 +1,46 @@
1
1
  {
2
2
  "name": "dsh-sidebar-scroll-flow",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "1.0.0",
4
+ "description": "Scrolls the web sidebar as one column: the panel rows scroll away with the session list while brand, New Session, and foot stay pinned.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "author": "agoudbg",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/agoudbg/agou-dsh-plugins.git",
11
+ "directory": "packages/dsh-sidebar-scroll-flow"
12
+ },
13
+ "keywords": [
14
+ "dsh",
15
+ "dsh-plugin",
16
+ "deepseek-harness",
17
+ "web-ui",
18
+ "sidebar"
19
+ ],
20
+ "engines": {
21
+ "dsh": ">=0.2.1-rc.5"
22
+ },
23
+ "exports": {
24
+ ".": "./index.js",
25
+ "./client": "./client.js",
26
+ "./locale/*.json": "./locale/*.json",
27
+ "./icon": "./icon.svg"
28
+ },
29
+ "files": [
30
+ "index.js",
31
+ "client.js",
32
+ "cordis.patch.yml",
33
+ "locale/*.json",
34
+ "icon.svg"
35
+ ],
36
+ "dsh": {
37
+ "bundle": {
38
+ "patch": "./cordis.patch.yml"
39
+ },
40
+ "client": {
41
+ "platform": "web",
42
+ "immediately": true,
43
+ "inject": ["@deepseek-ai/dsh-client-ui-layout"]
44
+ }
45
+ }
46
+ }