dsh-sidebar-scroll-flow 0.0.0-stage → 1.0.1
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 +21 -0
- package/README.md +41 -2
- package/client.js +145 -0
- package/cordis.patch.yml +5 -0
- package/icon.svg +17 -0
- package/index.js +2 -0
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +44 -4
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
|
-
#
|
|
1
|
+
# dsh-sidebar-scroll-flow
|
|
2
2
|
|
|
3
|
-
|
|
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
|
+
});
|
package/cordis.patch.yml
ADDED
package/icon.svg
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path d="M10 8.8H26C27.1 8.8 28 9.7 28 10.8V25.2C28 26.3 27.1 27.2 26 27.2H10C8.9 27.2 8 26.3 8 25.2V10.8C8 9.7 8.9 8.8 10 8.8Z" fill="url(#sidebar-frame)" fill-opacity="0.2" />
|
|
3
|
+
<path d="M14.7 9.9V26.1" stroke="url(#sidebar-details)" stroke-width="2.1" stroke-linecap="round" />
|
|
4
|
+
<path d="M10.8 13H12.5M10.8 17H12.5M10.8 21H12.5" stroke="url(#sidebar-details)" stroke-width="1.8" stroke-linecap="round" />
|
|
5
|
+
<path d="M21 13.8V22.2M21 22.2L17.7 18.9M21 22.2L24.3 18.9" stroke="url(#sidebar-details)" stroke-width="2.1" stroke-linecap="round" stroke-linejoin="round" />
|
|
6
|
+
<path d="M10 8.8H26C27.1 8.8 28 9.7 28 10.8V25.2C28 26.3 27.1 27.2 26 27.2H10C8.9 27.2 8 26.3 8 25.2V10.8C8 9.7 8.9 8.8 10 8.8Z" fill="none" stroke="url(#sidebar-frame)" stroke-width="2" />
|
|
7
|
+
<defs>
|
|
8
|
+
<linearGradient id="sidebar-frame" x1="9" y1="9" x2="27" y2="27" gradientUnits="userSpaceOnUse">
|
|
9
|
+
<stop stop-color="#7AC2FF" />
|
|
10
|
+
<stop offset="1" stop-color="#5269E1" />
|
|
11
|
+
</linearGradient>
|
|
12
|
+
<linearGradient id="sidebar-details" x1="10" y1="10" x2="26" y2="26" gradientUnits="userSpaceOnUse">
|
|
13
|
+
<stop stop-color="#3F77D8" />
|
|
14
|
+
<stop offset="1" stop-color="#2F9CC6" />
|
|
15
|
+
</linearGradient>
|
|
16
|
+
</defs>
|
|
17
|
+
</svg>
|
package/index.js
ADDED
package/locale/en.json
ADDED
package/locale/zh.json
ADDED
package/package.json
CHANGED
|
@@ -1,6 +1,46 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-sidebar-scroll-flow",
|
|
3
|
-
"version": "
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "Increases the display area for the conversation list in the sidebar.",
|
|
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
|
+
}
|