@prettier-ai/dsh-client-ui-sidebar 0.1.2-alpha.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 ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 DeepSeek
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.
@@ -0,0 +1,6 @@
1
+ # Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
2
+ # side as of the last confirmed-consistent state. Both languages carry equal authority;
3
+ # after editing either side, bring the other along and re-record with:
4
+ # pnpm run verify-translation-pairing --write packages/client/ui-sidebar/README.md
5
+ README.md: 64f75a46a7e372fcf96cdd0594ef694ee2c59bce
6
+ README.zh.md: 16708765480bdb5c4190a67e85bc7f5aad48fad0
package/README.md ADDED
@@ -0,0 +1,101 @@
1
+ ---
2
+ description: "Sidebar shell plugin for the dsh web client: brand row, New Session action, collapse control, scroll-aware region seat, and bottom-pinned Settings seat."
3
+ kind: "package-reference"
4
+ ---
5
+
6
+ # @deepseek-ai/dsh-client-ui-sidebar
7
+
8
+ English | [中文](README.zh.md)
9
+
10
+ ## Summary
11
+
12
+ `dsh-client-ui-sidebar` is the sidebar shell of the dsh web client: users see the brand row, start new sessions, collapse into the layout-owned 56px rail, and reach Settings from the bottom-pinned seat, while the scroll-aware region seat hosts the Workspace and Session browser. The Workspace and Session browser rendered into `sidebar.workspaces` belongs to ui-workspace; this package neither derives its rows nor owns its view preferences. A deployment package can replace the brand mark or name without replacing the New Session control or the rail geometry, and New Session starts the runtime's page-local frontend Session Intent against the explicit, current, or most recently active Workspace. Collapse into the layout-owned 56px rail remains presentation-local.
13
+
14
+ ## Table of Contents
15
+
16
+ - [Use this package](#use-this-package)
17
+ - [Understand the implementation](#understand-the-implementation)
18
+ - [Further Exploration](#further-exploration)
19
+ - [Model Experience](#model-experience)
20
+ - [Known Limitations and Deferred Work](#known-limitations-and-deferred-work)
21
+ - [Dev Note](#dev-note)
22
+
23
+ -----
24
+
25
+ <a id="use-this-package"></a>
26
+ ## Use this package
27
+
28
+ The sidebar is the navigation shell: users see the brand, start new sessions, collapse the rail, and reach Settings. Feature plugins fill its seats — ui-workspace fills `sidebar.workspaces`, ui-settings registers the trigger row and settings panel at `sidebar.settings`.
29
+
30
+ ### Brand and New Session
31
+
32
+ The expanded brand row renders `sidebar.brand.mark` and `sidebar.brand.name` as independent single slots; the collapsed rail renders the same mark slot. Without occupants, the shell uses the fish mark and a localized local-build label. A complete build stacks a code badge below the label as `version[-commit][-dirty]`, using `DSH_CLIENT_VERSION`, the optional 7-character `DSH_CLIENT_COMMIT_HASH`, and `DSH_CLIENT_GIT_DIRTY=true`; missing version metadata omits the badge. New Session targets the explicit Workspace used by a scoped action, otherwise the current Session's Workspace, otherwise the most recently active Workspace; when none exists it clears into the blank New Session page.
33
+
34
+ ### Collapse behavior
35
+
36
+ During a live collapse, the expanded content fades out at its current width, the upper controls share one fade and leftward translation into the 56px rail, and the layout's column slide ends the motion. A page that starts collapsed renders the rail statically, and reduced-motion mode disables both transitions. The bottom-pinned `sidebar.settings` control shares the fade timing but has no horizontal translation.
37
+
38
+ ### Scrollbars
39
+
40
+ Scrollbars in the column are a pointer affordance: the shell rebinds the scrollbar indirection to `transparent` whenever the pointer is outside the column and keeps the thumb drawn for 2s after the pointer leaves, so a list nobody is pointing at carries no bar. The reservation that keeps rows from moving belongs to the scrolling region (ui-workspace), so revealing a thumb never reflows.
41
+
42
+ -----
43
+
44
+ <a id="understand-the-implementation"></a>
45
+ ## Understand the implementation
46
+
47
+ <details>
48
+ <summary>Implementation internals — click to expand</summary>
49
+
50
+ The shell is pure composition: `SidebarRootComponentProps` composes the layout owner share, the global `useSessions` and `useWorkspaces` hooks, the declared brand, the `sidebar.workspaces` and `sidebar.settings` child slots, and injected `startSession` plus sidebar-toggle callbacks. There is no plugin store.
51
+
52
+ ### Slot discipline
53
+
54
+ Declaration-aware `slots.inject()` lets a replacing package activate before or after the sidebar. The foot is the `sidebar.settings` seat: the sidebar renders only the bottom-pinned layout slot and shares its column state (`wide`). The `/client` exports are the plugin body (`apply`/`inject`) plus the contract types only; SidebarRoot, the row components, and the tree derivation remain package-internal behind the slot registration.
55
+
56
+ </details>
57
+
58
+ -----
59
+
60
+ <a id="further-exploration"></a>
61
+ ## Further Exploration
62
+
63
+ These pages cover the surfaces that fill the shell's seats and the composition model.
64
+
65
+ - [ui-workspace](../ui-workspace/README.md) — the Workspace and Session browser rendered into `sidebar.workspaces`.
66
+ - [ui-settings](../ui-settings/README.md) — the settings domain base registering the trigger row at `sidebar.settings`.
67
+ - [ui-layout](../ui-layout/README.md) — the layout owner whose rail and column state the collapse uses.
68
+ - [ui-theme](../ui-theme/README.md) — the scrollbar token indirection the shell rebinds.
69
+ - [Slot system standard](../../../.agents/notes/implemented/architecture/2026-07-22-slot-type-chain-implementation.md) — the composition model behind the seats.
70
+
71
+ -----
72
+
73
+ <a id="model-experience"></a>
74
+ ## Model Experience
75
+
76
+ None, as the package is a browser-side UI plugin layer that registers nothing model-facing.
77
+
78
+ #### KV Cache effect
79
+
80
+ None; this package neither assembles nor sends a provider request.
81
+
82
+ ## Known Limitations and Deferred Work
83
+
84
+ <a id="known-limitations-and-deferred-work"></a>
85
+
86
+
87
+ These limits define what the shell owns versus what its occupants own; they are current package constraints.
88
+
89
+ - **Session state-dot rendering is owned by ui-workspace** — no done/error notification sources are available to this shell.
90
+ - **Workspace browser behavior is composition-owned** — grouping, ordering, search, and row state belong to ui-workspace, not this shell.
91
+ - **"New task completed" unread marking is local viewing state** — completion-time > last-seen never reaches the host.
92
+
93
+ <a id="dev-note"></a>
94
+ ### Dev Note
95
+
96
+ <details>
97
+ <summary>Working context for maintainers — click to expand</summary>
98
+
99
+ None.
100
+
101
+ </details>
package/README.zh.md ADDED
@@ -0,0 +1,101 @@
1
+ ---
2
+ description: "dsh Web 客户端的侧边栏外壳插件:品牌行、New Session 操作、折叠控件、可感知滚动的区域席位与底部固定的 Settings 席位。"
3
+ kind: "package-reference"
4
+ ---
5
+
6
+ # @deepseek-ai/dsh-client-ui-sidebar
7
+
8
+ [English](README.md) | 中文
9
+
10
+ ## 概述
11
+
12
+ `dsh-client-ui-sidebar` 是 dsh Web 客户端的侧边栏外壳:用户看到品牌行、启动新会话、折叠进布局拥有的 56px 轨道,并从底部固定的席位进入 Settings;可感知滚动的区域席位承载 Workspace 与 Session 浏览器。渲染到 `sidebar.workspaces` 的 Workspace 与 Session 浏览器归 ui-workspace 所有;本包既不派生其中的行,也不持有其视图偏好。部署包可以单独替换品牌标记或名称,而无须替换 New Session 控件或轨道几何;New Session 会针对显式指定、当前或最近活跃的 Workspace 启动运行时的页面局部前端 Session Intent。折叠到布局拥有的 56px 轨道仍属于本地呈现行为。
13
+
14
+ ## 目录
15
+
16
+ - [使用本包](#use-this-package)
17
+ - [理解实现](#understand-the-implementation)
18
+ - [进一步探索](#further-exploration)
19
+ - [模型体验](#model-experience)
20
+ - [已知限制与延期工作](#known-limitations-and-deferred-work)
21
+ - [开发备注](#dev-note)
22
+
23
+ -----
24
+
25
+ <a id="use-this-package"></a>
26
+ ## 使用本包
27
+
28
+ 侧边栏是导航外壳:用户看到品牌、启动新会话、折叠轨道并到达 Settings。功能插件填充它的席位——ui-workspace 填充 `sidebar.workspaces`,ui-settings 在 `sidebar.settings` 注册触发行与设置面板。
29
+
30
+ ### 品牌与 New Session
31
+
32
+ 展开的品牌行把 `sidebar.brand.mark` 与 `sidebar.brand.name` 渲染为两个独立的 single slot;收起轨道则渲染同一个 mark slot。没有占位者时,外壳使用鱼形标记和本地化的本地构建标签。完整构建会在标签下方显示代码徽标;该徽标使用 `DSH_CLIENT_VERSION`、可选的 7 位 `DSH_CLIENT_COMMIT_HASH` 与 `DSH_CLIENT_GIT_DIRTY=true` 组装成 `version[-commit][-dirty]`;缺少版本元数据时不显示徽标。New Session 优先使用作用域操作明确指定的 Workspace,否则使用当前 Session 所属 Workspace,再否则使用最近活跃 Workspace;一个 Workspace 都没有时则清空选择,进入空白 New Session 页面。
33
+
34
+ ### 折叠行为
35
+
36
+ 实时收起时,展开内容在当前宽度淡出,上方控件共用一次淡入并左移进入 56px 轨道,由布局的栏滑动结束整段动画。页面初始即为收起状态时会静态渲染轨道;减少动态效果模式会禁用两段过渡。固定在底部的 `sidebar.settings` 控件只共用淡入时序,不发生横向位移。
37
+
38
+ ### 滚动条
39
+
40
+ 栏内的滚动条是一种指针可供性:只要指针不在栏内,外壳就把滚动条间接层重新绑定为 `transparent`;指针离开后滑块再保留 2 秒,因此没人指向的列表不会带着滚动条。避免行位移的空间预留属于滚动区域本身(ui-workspace),所以显示滑块不会引起重排。
41
+
42
+ -----
43
+
44
+ <a id="understand-the-implementation"></a>
45
+ ## 理解实现
46
+
47
+ <details>
48
+ <summary>实现细节——点击展开</summary>
49
+
50
+ 外壳是纯组合:`SidebarRootComponentProps` 组合布局 owner share、全局 `useSessions` 与 `useWorkspaces` 钩子、已声明的品牌、`sidebar.workspaces` 与 `sidebar.settings` 子 slot,以及注入的 `startSession` 与侧边栏切换回调。这里没有插件 store。
51
+
52
+ ### Slot 纪律
53
+
54
+ 声明感知的 `slots.inject()` 让替换包无论先于还是后于侧边栏激活都能生效。页脚承载 `sidebar.settings` 席位:侧边栏只渲染固定在底部的布局 slot,并共享其栏状态(`wide`)。`/client` 导出接口只包含插件主体(`apply`/`inject`)及约定类型;SidebarRoot、行组件与树派生仍由 slot 注册封装在包内。
55
+
56
+ </details>
57
+
58
+ -----
59
+
60
+ <a id="further-exploration"></a>
61
+ ## 进一步探索
62
+
63
+ 以下页面覆盖填充外壳席位的各个界面与组合模型。
64
+
65
+ - [ui-workspace](../ui-workspace/README.zh.md)——渲染到 `sidebar.workspaces` 的 Workspace 与 Session 浏览器。
66
+ - [ui-settings](../ui-settings/README.zh.md)——在 `sidebar.settings` 注册触发行与设置面板的设置领域底座。
67
+ - [ui-layout](../ui-layout/README.zh.md)——折叠所使用轨道与栏状态的布局 owner。
68
+ - [ui-theme](../ui-theme/README.zh.md)——外壳所重新绑定的滚动条 token 间接层。
69
+ - [slot 系统标准](../../../.agents/notes/implemented/architecture/2026-07-22-slot-type-chain-implementation.zh.md)——席位背后的组合模型。
70
+
71
+ -----
72
+
73
+ <a id="model-experience"></a>
74
+ ## 模型体验
75
+
76
+ 无。该包是浏览器端 UI 插件层,不注册任何面向模型的内容。
77
+
78
+ #### KV Cache 影响
79
+
80
+ 无;该包既不组装也不发送提供方请求。
81
+
82
+ ## 已知限制与延期工作
83
+
84
+ <a id="known-limitations-and-deferred-work"></a>
85
+
86
+
87
+ 这些限制定义外壳拥有什么、其占位方拥有什么;它们是当前包约束。
88
+
89
+ - **Session 状态点渲染由 ui-workspace 持有**:本外壳没有可用的 done/error 通知数据源。
90
+ - **Workspace 浏览行为由组合持有**:分组、排序、搜索与行状态都属于 ui-workspace,不属于此外壳。
91
+ - **「New task completed」未读标记是本地查看状态**:完成时间 > 上次查看时间这一事实永远不会到达宿主。
92
+
93
+ <a id="dev-note"></a>
94
+ ### 开发备注
95
+
96
+ <details>
97
+ <summary>维护者的工作上下文——点击展开</summary>
98
+
99
+ 无。
100
+
101
+ </details>
package/lib/client.js ADDED
@@ -0,0 +1,335 @@
1
+ window.__ModuleLoader__.load({
2
+ id: "@prettier-ai/dsh-client-ui-sidebar",
3
+ factory: (require) => {
4
+ var module = { exports: {} };
5
+ var exports = module.exports;
6
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
7
+ let react_jsx_runtime = require("react/jsx-runtime");
8
+ let react = require("react");
9
+ let _prettier_ai_dsh_client_ui_primitives = require("@prettier-ai/dsh-client-ui-primitives");
10
+ //#region ../../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs
11
+ function r(e) {
12
+ var t, f, n = "";
13
+ if ("string" == typeof e || "number" == typeof e) n += e;
14
+ else if ("object" == typeof e) if (Array.isArray(e)) {
15
+ var o = e.length;
16
+ for (t = 0; t < o; t++) e[t] && (f = r(e[t])) && (n && (n += " "), n += f);
17
+ } else for (f in e) e[f] && (n && (n += " "), n += f);
18
+ return n;
19
+ }
20
+ function clsx() {
21
+ for (var e, t, f = 0, n = "", o = arguments.length; f < o; f++) (e = arguments[f]) && (t = r(e)) && (n && (n += " "), n += t);
22
+ return n;
23
+ }
24
+ //#endregion
25
+ //#region \0dsh-css:/home/runner/work/dsh-publisher/dsh-publisher/upstream/packages/client/ui-sidebar/src/client/SidebarRoot.module.css.mjs
26
+ const css = ".ErU0zG_root{--dsh-sidebar-inline-padding:12px;height:100%;padding:6px var(--dsh-sidebar-inline-padding);box-sizing:border-box;background:var(--dsw-specific-sidebar-fill);color:var(--dsw-alias-label-primary);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);flex-direction:column;font-size:14px;display:flex}.ErU0zG_root.ErU0zG_collapsed{padding:18px 10px 6px}.ErU0zG_root.ErU0zG_quietBars{--dsh-scrollbar-thumb:transparent;--dsh-scrollbar-thumb-hover:transparent}.ErU0zG_fading>*{opacity:0;transition:opacity .15s var(--ds-ease-in-out)}.ErU0zG_wide{animation:ErU0zG_wide-in .2s var(--ds-ease-in-out)}@keyframes ErU0zG_wide-in{0%{opacity:0}}.ErU0zG_railIn .ErU0zG_iconButton,.ErU0zG_railIn .ErU0zG_newSession,.ErU0zG_railIn .ErU0zG_regionArea{animation:ErU0zG_rail-in .15s var(--ds-ease-in-out) backwards}.ErU0zG_railIn .ErU0zG_footArea{animation:ErU0zG_rail-fade-in .15s var(--ds-ease-in-out) backwards}@keyframes ErU0zG_rail-in{0%{opacity:0;transform:translate(49px)}}@keyframes ErU0zG_rail-fade-in{0%{opacity:0}}.ErU0zG_logoRow{box-sizing:border-box;flex:none;justify-content:flex-end;align-items:center;gap:8px;height:60px;margin-bottom:8px;padding:8px 0 8px 4px;display:flex;overflow:hidden}.ErU0zG_collapsed .ErU0zG_logoRow{justify-content:flex-start;height:36px;margin-bottom:12px;padding:0}.ErU0zG_brand{min-width:0;color:inherit;cursor:pointer;background:0 0;border:none;flex:1;align-items:center;padding:0;display:inline-flex;overflow:hidden}.ErU0zG_brandIdentity{align-items:center;gap:8px;min-width:0;height:24px;display:inline-flex}.ErU0zG_brandMark{flex:none;justify-content:center;align-items:center;display:inline-flex}.ErU0zG_brandName{letter-spacing:.04em;align-items:center;gap:6px;min-width:0;height:24px;font-size:18px;font-weight:600;line-height:24px;display:inline-flex}.ErU0zG_fallbackBrandName{letter-spacing:0;white-space:nowrap;font-size:17px}.ErU0zG_localBuildBrand{white-space:nowrap;flex-direction:column;flex:none;justify-content:center;align-items:flex-start;gap:1px;height:24px;display:inline-flex}.ErU0zG_localBuildTitle{letter-spacing:0;font-size:12px;line-height:13px}.ErU0zG_iconButton{cursor:pointer;width:28px;height:28px;color:var(--dsw-alias-label-secondary);background:0 0;border:none;border-radius:50%;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.ErU0zG_iconButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.ErU0zG_collapsed .ErU0zG_iconButton{width:36px;height:36px}.ErU0zG_collapsed .ErU0zG_toggle .ErU0zG_panelIcon{display:none}.ErU0zG_collapsed .ErU0zG_toggle:hover .ErU0zG_panelIcon{display:inline}.ErU0zG_collapsed .ErU0zG_toggle:hover .ErU0zG_railMark{display:none}.ErU0zG_railMark{justify-content:center;align-items:center;display:inline-flex}.ErU0zG_collapsed .ErU0zG_iconButton{color:var(--dsw-alias-label-primary)}.ErU0zG_buildVersion{height:10px;color:var(--dsw-alias-label-primary-inverted);background:var(--dsw-alias-label-primary);font-family:var(--ds-font-family-code);white-space:nowrap;border-radius:2px;flex:none;align-items:center;padding:0 3px;font-size:6px;font-weight:500;line-height:10px;display:inline-flex}.ErU0zG_newSession{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-button-elevated-fill);height:38px;color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:12px;flex:none;justify-content:center;align-items:center;gap:6px;margin:0 2px 8px;padding:8px 16px;font-size:14px;font-weight:500;line-height:22px;display:flex;overflow:hidden}.ErU0zG_newSession:hover{background:var(--dsw-alias-button-floating-hover)}.ErU0zG_collapsed .ErU0zG_newSession{background:0 0;border-color:#0000;align-self:flex-start;gap:0;width:36px;height:36px;margin:0 0 12px;padding:0}.ErU0zG_collapsed .ErU0zG_newSession:hover{background:var(--dsw-alias-interactive-bg-hover)}.ErU0zG_newSessionLabel{white-space:nowrap;max-width:200px;overflow:hidden}.ErU0zG_collapsed .ErU0zG_newSessionLabel{max-width:0}.ErU0zG_regionArea{min-height:0;margin-left:-4px;margin-right:calc(-1 * var(--dsh-sidebar-inline-padding));flex-direction:column;flex:1;padding-left:4px;display:flex;overflow:hidden}.ErU0zG_collapsed .ErU0zG_regionArea{margin-left:0;margin-right:0;padding-left:0}.ErU0zG_footArea{flex-direction:column;flex:none;display:flex}.ErU0zG_settingsArea,.ErU0zG_footerActions{flex:none;width:100%;min-width:0}.ErU0zG_footerActions{display:flex}.ErU0zG_collapsed .ErU0zG_footArea{align-items:center}.ErU0zG_collapsed .ErU0zG_settingsArea,.ErU0zG_collapsed .ErU0zG_footerActions{justify-content:center;width:auto;display:flex}@media (prefers-reduced-motion:reduce){.ErU0zG_wide,.ErU0zG_fading>*,.ErU0zG_railIn .ErU0zG_iconButton,.ErU0zG_railIn .ErU0zG_newSession,.ErU0zG_railIn .ErU0zG_footArea,.ErU0zG_railIn .ErU0zG_regionArea{transition:none;animation:none}}";
27
+ const tagId = "@prettier-ai/dsh-client-ui-sidebar/SidebarRoot.module.css";
28
+ if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
29
+ const tag = document.createElement("style");
30
+ tag.dataset.plugin = "@prettier-ai/dsh-client-ui-sidebar";
31
+ tag.dataset.pluginCss = tagId;
32
+ tag.textContent = css;
33
+ document.head.appendChild(tag);
34
+ }
35
+ var SidebarRoot_module_css_default = {
36
+ "brand": "ErU0zG_brand",
37
+ "brandIdentity": "ErU0zG_brandIdentity",
38
+ "brandMark": "ErU0zG_brandMark",
39
+ "brandName": "ErU0zG_brandName",
40
+ "buildVersion": "ErU0zG_buildVersion",
41
+ "collapsed": "ErU0zG_collapsed",
42
+ "fading": "ErU0zG_fading",
43
+ "fallbackBrandName": "ErU0zG_fallbackBrandName",
44
+ "footArea": "ErU0zG_footArea",
45
+ "footerActions": "ErU0zG_footerActions",
46
+ "iconButton": "ErU0zG_iconButton",
47
+ "localBuildBrand": "ErU0zG_localBuildBrand",
48
+ "localBuildTitle": "ErU0zG_localBuildTitle",
49
+ "logoRow": "ErU0zG_logoRow",
50
+ "newSession": "ErU0zG_newSession",
51
+ "newSessionLabel": "ErU0zG_newSessionLabel",
52
+ "panelIcon": "ErU0zG_panelIcon",
53
+ "quietBars": "ErU0zG_quietBars",
54
+ "rail-fade-in": "ErU0zG_rail-fade-in",
55
+ "rail-in": "ErU0zG_rail-in",
56
+ "railIn": "ErU0zG_railIn",
57
+ "railMark": "ErU0zG_railMark",
58
+ "regionArea": "ErU0zG_regionArea",
59
+ "root": "ErU0zG_root",
60
+ "settingsArea": "ErU0zG_settingsArea",
61
+ "toggle": "ErU0zG_toggle",
62
+ "wide": "ErU0zG_wide",
63
+ "wide-in": "ErU0zG_wide-in"
64
+ };
65
+ //#endregion
66
+ //#region lib/types/client/SidebarRoot.js
67
+ /**
68
+ * Sidebar shell: column geometry only. Collapse is a slide plus crossfade:
69
+ * content freezes at its expanded width (inline style) and fades out in place
70
+ * while the sliding column (AppFrame grid tracks) clips it — nothing reflows
71
+ * mid-slide. At settle the wide-only content unmounts and the four upper
72
+ * controls enter the 56px rail from the same horizontal offset (one icon each,
73
+ * same top-down order) on one fade that ends with the slide. The bottom-pinned
74
+ * settings control only fades. The workspace/session browsing region between
75
+ * the New Session button and the foot is the `sidebar.workspaces` registrant's,
76
+ * and the foot holds `sidebar.settings` plus `sidebar.footer.action`; the shell
77
+ * hands them the wide flag (plus an expand request callback for the browser).
78
+ *
79
+ * The column also owns whether the scroll regions nested in it draw a
80
+ * scrollbar at all: the shell tracks the pointer and rebinds ui-theme's
81
+ * scrollbar indirection away while it is elsewhere, so a list the user is not
82
+ * pointing at carries no bar.
83
+ */
84
+ /** Wide-content unmount delay; matches the 150ms wide-content fade-out. */
85
+ const COLLAPSE_SETTLE_MS = 150;
86
+ /**
87
+ * How long the column's scrollbars stay drawn after the pointer leaves it.
88
+ * The bar is a pointer affordance here, and hiding it on the leave event
89
+ * itself makes it blink out while the pointer is only crossing the column's
90
+ * edge — on the way to the conversation, or around a portalled menu.
91
+ */
92
+ const SCROLLBAR_LINGER_MS = 2e3;
93
+ /** Format complete-build metadata for the local brand badge. */
94
+ function localBuildVersion() {
95
+ return `0.1.2-alpha.1-cd5ef81` + ({}.DSH_CLIENT_GIT_DIRTY === "true" ? "-dirty" : "");
96
+ }
97
+ /**
98
+ * Render the sidebar column shell.
99
+ * @param props - composed slot props (runtime share + injected callbacks, contract/slots.ts).
100
+ * @returns the sidebar element tree.
101
+ */
102
+ function SidebarRoot({ collapsed, width, startSession, toggleSidebar, t, renderSlot }) {
103
+ const [settled, setSettled] = (0, react.useState)(collapsed);
104
+ (0, react.useEffect)(() => {
105
+ if (!collapsed) {
106
+ setSettled(false);
107
+ return;
108
+ }
109
+ const timer = window.setTimeout(() => {
110
+ setSettled(true);
111
+ }, COLLAPSE_SETTLE_MS);
112
+ return () => {
113
+ window.clearTimeout(timer);
114
+ };
115
+ }, [collapsed]);
116
+ const wide = !collapsed || !settled;
117
+ const lastWideWidth = (0, react.useRef)(width);
118
+ if (!collapsed) lastWideWidth.current = width;
119
+ const everWide = (0, react.useRef)(!collapsed);
120
+ if (!collapsed) everWide.current = true;
121
+ const column = (0, react.useRef)(null);
122
+ const [pointerInside, setPointerInside] = (0, react.useState)(false);
123
+ const lingerTimer = (0, react.useRef)(void 0);
124
+ const armLinger = () => {
125
+ if (lingerTimer.current !== void 0) return;
126
+ lingerTimer.current = window.setTimeout(() => {
127
+ lingerTimer.current = void 0;
128
+ setPointerInside(false);
129
+ }, SCROLLBAR_LINGER_MS);
130
+ };
131
+ const cancelLinger = () => {
132
+ window.clearTimeout(lingerTimer.current);
133
+ lingerTimer.current = void 0;
134
+ };
135
+ (0, react.useEffect)(() => {
136
+ if (!pointerInside) return;
137
+ const onMove = (event) => {
138
+ const rect = column.current?.getBoundingClientRect();
139
+ /* v8 ignore next -- the listener only exists while the column is mounted and revealed. */
140
+ if (rect === void 0) return;
141
+ if (event.clientX >= rect.left && event.clientX < rect.right && event.clientY >= rect.top && event.clientY < rect.bottom) cancelLinger();
142
+ else armLinger();
143
+ };
144
+ document.addEventListener("pointermove", onMove);
145
+ return () => {
146
+ document.removeEventListener("pointermove", onMove);
147
+ cancelLinger();
148
+ };
149
+ }, [pointerInside]);
150
+ const buildVersion = localBuildVersion();
151
+ return (0, react_jsx_runtime.jsxs)("div", {
152
+ ref: column,
153
+ className: clsx(SidebarRoot_module_css_default.root, !wide && SidebarRoot_module_css_default.collapsed, !wide && everWide.current && SidebarRoot_module_css_default.railIn, collapsed && wide && SidebarRoot_module_css_default.fading, !pointerInside && SidebarRoot_module_css_default.quietBars),
154
+ style: wide ? { width: collapsed ? lastWideWidth.current : width } : void 0,
155
+ onPointerEnter: () => {
156
+ cancelLinger();
157
+ setPointerInside(true);
158
+ },
159
+ onPointerLeave: () => {
160
+ armLinger();
161
+ },
162
+ children: [
163
+ (0, react_jsx_runtime.jsxs)("div", {
164
+ className: SidebarRoot_module_css_default.logoRow,
165
+ children: [wide && (0, react_jsx_runtime.jsx)("button", {
166
+ type: "button",
167
+ className: clsx(SidebarRoot_module_css_default.brand, SidebarRoot_module_css_default.wide),
168
+ "aria-label": t("session.new.label"),
169
+ onClick: () => {
170
+ startSession();
171
+ },
172
+ children: (0, react_jsx_runtime.jsxs)("span", {
173
+ className: SidebarRoot_module_css_default.brandIdentity,
174
+ "aria-hidden": "true",
175
+ children: [(0, react_jsx_runtime.jsx)("span", {
176
+ className: SidebarRoot_module_css_default.brandMark,
177
+ children: renderSlot("sidebar.brand.mark", { size: 24 }, { fallback: (0, react_jsx_runtime.jsx)(_prettier_ai_dsh_client_ui_primitives.FishLogo, { size: 24 }) })
178
+ }), (0, react_jsx_runtime.jsx)("span", {
179
+ className: SidebarRoot_module_css_default.brandName,
180
+ children: renderSlot("sidebar.brand.name", {}, { fallback: buildVersion === void 0 ? (0, react_jsx_runtime.jsx)("span", {
181
+ className: SidebarRoot_module_css_default.fallbackBrandName,
182
+ children: t("brand.localBuild")
183
+ }) : (0, react_jsx_runtime.jsxs)("span", {
184
+ className: SidebarRoot_module_css_default.localBuildBrand,
185
+ children: [(0, react_jsx_runtime.jsx)("span", {
186
+ className: SidebarRoot_module_css_default.localBuildTitle,
187
+ children: t("brand.localBuild")
188
+ }), (0, react_jsx_runtime.jsx)("span", {
189
+ className: SidebarRoot_module_css_default.buildVersion,
190
+ children: buildVersion
191
+ })]
192
+ }) })
193
+ })]
194
+ })
195
+ }), (0, react_jsx_runtime.jsx)(_prettier_ai_dsh_client_ui_primitives.Tooltip, {
196
+ label: collapsed ? t("toggle.open") : t("toggle.collapse"),
197
+ delayMs: 500,
198
+ children: (0, react_jsx_runtime.jsxs)("button", {
199
+ type: "button",
200
+ className: clsx(SidebarRoot_module_css_default.iconButton, SidebarRoot_module_css_default.toggle),
201
+ "aria-label": collapsed ? t("toggle.open") : t("toggle.collapse"),
202
+ onClick: () => {
203
+ toggleSidebar();
204
+ },
205
+ children: [!wide && (0, react_jsx_runtime.jsx)("span", {
206
+ className: SidebarRoot_module_css_default.railMark,
207
+ "aria-hidden": "true",
208
+ children: renderSlot("sidebar.brand.mark", { size: 24 }, { fallback: (0, react_jsx_runtime.jsx)(_prettier_ai_dsh_client_ui_primitives.FishLogo, { size: 24 }) })
209
+ }), (0, react_jsx_runtime.jsx)(_prettier_ai_dsh_client_ui_primitives.IconPanelLeftOutline16, {
210
+ className: SidebarRoot_module_css_default.panelIcon,
211
+ size: wide ? 16 : 18
212
+ })]
213
+ })
214
+ })]
215
+ }),
216
+ (0, react_jsx_runtime.jsx)(_prettier_ai_dsh_client_ui_primitives.Tooltip, {
217
+ label: t("session.new.label"),
218
+ delayMs: 500,
219
+ disabled: wide,
220
+ children: (0, react_jsx_runtime.jsxs)("button", {
221
+ type: "button",
222
+ className: SidebarRoot_module_css_default.newSession,
223
+ "aria-label": t("session.new.label"),
224
+ onClick: () => {
225
+ startSession();
226
+ },
227
+ children: [(0, react_jsx_runtime.jsx)(_prettier_ai_dsh_client_ui_primitives.IconNewChatOutline16, { size: wide ? 14 : 18 }), wide && (0, react_jsx_runtime.jsx)("span", {
228
+ className: clsx(SidebarRoot_module_css_default.newSessionLabel, SidebarRoot_module_css_default.wide),
229
+ children: t("session.new")
230
+ })]
231
+ })
232
+ }),
233
+ (0, react_jsx_runtime.jsx)("div", {
234
+ className: SidebarRoot_module_css_default.regionArea,
235
+ children: renderSlot("sidebar.workspaces", {
236
+ wide,
237
+ expandSidebar: () => {
238
+ if (collapsed) toggleSidebar();
239
+ }
240
+ })
241
+ }),
242
+ (0, react_jsx_runtime.jsxs)("div", {
243
+ className: SidebarRoot_module_css_default.footArea,
244
+ children: [(0, react_jsx_runtime.jsx)("div", {
245
+ className: SidebarRoot_module_css_default.footerActions,
246
+ children: renderSlot("sidebar.footer.action", { wide })
247
+ }), (0, react_jsx_runtime.jsx)("div", {
248
+ className: SidebarRoot_module_css_default.settingsArea,
249
+ children: renderSlot("sidebar.settings", { wide })
250
+ })]
251
+ })
252
+ ]
253
+ });
254
+ }
255
+ //#endregion
256
+ //#region lib/types/client/locales.js
257
+ /** `sidebar` namespace dictionaries: shell controls (brand row, New Session, fold toggle). */
258
+ /** Simplified Chinese dictionary (the key-set source of truth). */
259
+ const zh = {
260
+ "session.new": "新会话",
261
+ "session.new.label": "新建会话",
262
+ "toggle.open": "打开侧边栏",
263
+ "toggle.collapse": "收起侧边栏"
264
+ };
265
+ /** English dictionary, checked complete against the zh key set. */
266
+ const en = {
267
+ "session.new": "New Session",
268
+ "session.new.label": "New session",
269
+ "toggle.open": "Open sidebar",
270
+ "toggle.collapse": "Collapse sidebar"
271
+ };
272
+ //#endregion
273
+ //#region lib/types/client/index.js
274
+ /** Dictionary namespace owned by this plugin (shell controls copy). */
275
+ const NS = "sidebar";
276
+ /** Services required by the sidebar plugin. */
277
+ const inject = [
278
+ "slots",
279
+ "layout",
280
+ "uiWorkspace",
281
+ "locale"
282
+ ];
283
+ /** Registers the sidebar shell and its service callbacks.
284
+ * @param ctx - Client root context.
285
+ */
286
+ function apply(ctx) {
287
+ const workspaceNavigation = ctx.get("uiWorkspace");
288
+ ctx.effect(() => ctx.locale.register(NS, {
289
+ zh,
290
+ en
291
+ }), "ui-sidebar: dictionaries");
292
+ const injectProps = () => ({
293
+ startSession: (workspaceId) => {
294
+ workspaceNavigation.startSession(workspaceId);
295
+ },
296
+ toggleSidebar: () => {
297
+ ctx.layout.toggleSidebar();
298
+ }
299
+ });
300
+ ctx.effect(() => ctx.slots.register({
301
+ name: "sidebar",
302
+ locale: NS,
303
+ children: {
304
+ "sidebar.brand.mark": {
305
+ kind: "single",
306
+ scope: "root"
307
+ },
308
+ "sidebar.brand.name": {
309
+ kind: "single",
310
+ scope: "root"
311
+ },
312
+ "sidebar.workspaces": {
313
+ kind: "single",
314
+ scope: "root"
315
+ },
316
+ "sidebar.settings": {
317
+ kind: "single",
318
+ scope: "root"
319
+ },
320
+ "sidebar.footer.action": {
321
+ kind: "list",
322
+ scope: "root"
323
+ }
324
+ },
325
+ inject: injectProps
326
+ }, SidebarRoot), "ui-sidebar: slot registration");
327
+ }
328
+ //#endregion
329
+ exports.apply = apply;
330
+ exports.inject = inject;
331
+ return module.exports;
332
+ }
333
+ });
334
+
335
+ //# sourceMappingURL=client.js.map
package/lib/index.js ADDED
@@ -0,0 +1,6 @@
1
+ //#region lib/types/index.js
2
+ /** Host loader entry for the browser-only sidebar plugin. */
3
+ /** Provides no host-side behavior. */
4
+ function apply() {}
5
+ //#endregion
6
+ export { apply };
@@ -0,0 +1,25 @@
1
+ //#region lib/types/invariant.js
2
+ /**
3
+ * Package-owned invariant companion for `@prettier-ai/dsh-client-ui-sidebar`.
4
+ * @module @prettier-ai/dsh-client-ui-sidebar/invariant
5
+ */
6
+ const PACKAGE_NAME = "@prettier-ai/dsh-client-ui-sidebar";
7
+ /** Cordis companion plugin name. */
8
+ const name = "client-ui-sidebar-invariant";
9
+ /** Service required before the companion can reserve package ownership. */
10
+ const inject = ["invariants"];
11
+ /**
12
+ * No runtime invariant: a pure-consumer plugin deriving its rows in-component
13
+ * from the standard useSessions delivery — it emits no cordis events and owns
14
+ * no cross-plugin mutable state; derivation and interaction behavior are
15
+ * asserted directly by this package's tree/component specs.
16
+ */
17
+ const install = () => {};
18
+ /**
19
+ * Register this package's invariant companion.
20
+ * @param ctx - Cordis context carrying the invariant service.
21
+ * @returns the installed registration's disposer after setup succeeds.
22
+ */
23
+ const apply = (ctx) => Promise.resolve(ctx.invariants.register(PACKAGE_NAME, install));
24
+ //#endregion
25
+ export { apply, inject, name };
@@ -0,0 +1,8 @@
1
+ import type { SidebarRootComponentProps } from './contract/slots.ts';
2
+ /**
3
+ * Render the sidebar column shell.
4
+ * @param props - composed slot props (runtime share + injected callbacks, contract/slots.ts).
5
+ * @returns the sidebar element tree.
6
+ */
7
+ export declare function SidebarRoot({ collapsed, width, startSession, toggleSidebar, t, renderSlot, }: SidebarRootComponentProps): import("react").JSX.Element;
8
+ //# sourceMappingURL=SidebarRoot.d.ts.map
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Sidebar slot contract: the registrant-side props composition for the
3
+ * layout-owned `sidebar` slot, plus the holes this shell declares. The shell
4
+ * owns column geometry (fold state machine, brand row, New Session);
5
+ * everything between the section header and the list bottom is the
6
+ * `sidebar.workspaces` registrant's (ui-workspace), and the foot is the
7
+ * `sidebar.settings` registrant's (ui-settings), followed by optional footer
8
+ * actions in `sidebar.footer.action`.
9
+ */
10
+ import type { PropsLocale, PropsRenderSlots, PropsRuntime } from '@prettier-ai/dsh-client-ui-slots';
11
+ import type { WorkspaceId } from '@prettier-ai/dsh-api-workspace-controller/client';
12
+ declare module '@prettier-ai/dsh-client-ui-slots' {
13
+ interface SlotMap {
14
+ /**
15
+ * Brand mark rendered in the expanded brand row and collapsed rail.
16
+ * Declared by this package's `sidebar` entry; deployments may replace
17
+ * the shell's fish fallback without replacing the surrounding controls.
18
+ */
19
+ 'sidebar.brand.mark': {
20
+ kind: 'single';
21
+ scope: 'root';
22
+ owner: SidebarBrandMarkOwnerProps;
23
+ };
24
+ /**
25
+ * Brand name rendered beside the expanded mark. Declared by this
26
+ * package's `sidebar` entry; the shell supplies a generic text fallback.
27
+ */
28
+ 'sidebar.brand.name': {
29
+ kind: 'single';
30
+ scope: 'root';
31
+ owner: SidebarBrandNameOwnerProps;
32
+ };
33
+ /**
34
+ * The workspace/session browsing region: section header, search, the
35
+ * grouped/flat session list, and every workspace dialog. Declared by this
36
+ * package's 'sidebar' entry (declaring is claiming); ui-workspace
37
+ * registers the browser.
38
+ */
39
+ 'sidebar.workspaces': {
40
+ kind: 'single';
41
+ scope: 'root';
42
+ owner: SidebarSectionOwnerProps;
43
+ };
44
+ /**
45
+ * The settings seat at the sidebar foot. Declared by this package's
46
+ * 'sidebar' entry; ui-settings registers its trigger row + modal panel.
47
+ * The sidebar passes only its column state — it holds no settings state.
48
+ */
49
+ 'sidebar.settings': {
50
+ kind: 'single';
51
+ scope: 'root';
52
+ owner: SidebarSettingsOwnerProps;
53
+ };
54
+ /**
55
+ * Optional actions beside Settings at the sidebar foot. Declared by this
56
+ * package's 'sidebar' entry; each action receives only the column state.
57
+ */
58
+ 'sidebar.footer.action': {
59
+ kind: 'list';
60
+ scope: 'root';
61
+ owner: SidebarFooterActionOwnerProps;
62
+ };
63
+ }
64
+ }
65
+ /** Geometry supplied to the sidebar brand-mark occupant. */
66
+ export interface SidebarBrandMarkOwnerProps {
67
+ /** Requested square edge in pixels. */
68
+ size: number;
69
+ }
70
+ /** Empty owner share for the sidebar brand-name occupant. */
71
+ export interface SidebarBrandNameOwnerProps {
72
+ /** Marker field: the occupant owns its own content and width. */
73
+ children?: never;
74
+ }
75
+ /**
76
+ * Owner share of the browser hole — the only facts crossing the shell/region
77
+ * boundary. Business data and actions arrive through the region's own inject.
78
+ */
79
+ export interface SidebarSectionOwnerProps {
80
+ /** Shell fold-state output: wide renders the full browser, rail the icon column. */
81
+ wide: boolean;
82
+ /** Rail icons request expansion; the browser rides the wide flip for focus. */
83
+ expandSidebar: () => void;
84
+ }
85
+ /**
86
+ * Owner share of the sidebar settings seat: the column display state the
87
+ * occupant's trigger row must render against (wide row vs rail icon).
88
+ */
89
+ export interface SidebarSettingsOwnerProps {
90
+ /** Whether the sidebar renders wide content (false = 56px rail). */
91
+ wide: boolean;
92
+ }
93
+ /** Owner share of an action rendered beside Settings at the sidebar foot. */
94
+ export interface SidebarFooterActionOwnerProps {
95
+ /** Whether the sidebar renders wide content (false = 56px rail). */
96
+ wide: boolean;
97
+ }
98
+ /**
99
+ * Registrant-private injected share (arrives via the register inject
100
+ * factory). The shell keeps only its own controls: starting a Session from
101
+ * the New Session button and toggling the column.
102
+ */
103
+ export type SidebarRootInjected = {
104
+ /**
105
+ * Start a New Session: with a workspace, reuse-or-create its blank session
106
+ * and open it; without one, inherit the current Session Workspace, then the
107
+ * recent Workspace, or clear into the New Session pure view when none exist.
108
+ */
109
+ startSession: (workspaceId?: WorkspaceId) => void;
110
+ /** Toggle the sidebar column through the layout service. */
111
+ toggleSidebar: () => void;
112
+ };
113
+ /**
114
+ * Full component props: layout owner state/actions plus the declared holes'
115
+ * render shares, this package's injected callbacks, and the standard locale
116
+ * seat. No store is registered.
117
+ */
118
+ export type SidebarRootComponentProps = PropsRuntime<'sidebar'> & PropsRenderSlots<'sidebar.brand.mark' | 'sidebar.brand.name' | 'sidebar.workspaces' | 'sidebar.settings' | 'sidebar.footer.action'> & SidebarRootInjected & PropsLocale<'sidebar'>;
119
+ //# sourceMappingURL=slots.d.ts.map
@@ -0,0 +1,18 @@
1
+ /** Registers the sidebar shell into the layout-owned slot. */
2
+ import type { Context as ClientContext } from '@prettier-ai/cordis';
3
+ import { type SidebarKey } from './locales.ts';
4
+ export type { SidebarBrandMarkOwnerProps, SidebarBrandNameOwnerProps, SidebarFooterActionOwnerProps, SidebarRootComponentProps, SidebarRootInjected, SidebarSectionOwnerProps, SidebarSettingsOwnerProps, } from './contract/slots.ts';
5
+ export type { SidebarKey } from './locales.ts';
6
+ declare module '@prettier-ai/dsh-client-ui-slots' {
7
+ interface LocaleNamespaceMap {
8
+ /** Sidebar shell controls copy. */
9
+ sidebar: SidebarKey;
10
+ }
11
+ }
12
+ /** Services required by the sidebar plugin. */
13
+ export declare const inject: string[];
14
+ /** Registers the sidebar shell and its service callbacks.
15
+ * @param ctx - Client root context.
16
+ */
17
+ export declare function apply(ctx: ClientContext): void;
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,18 @@
1
+ /** `sidebar` namespace dictionaries: shell controls (brand row, New Session, fold toggle). */
2
+ /** Simplified Chinese dictionary (the key-set source of truth). */
3
+ export declare const zh: {
4
+ 'session.new': string;
5
+ 'session.new.label': string;
6
+ 'toggle.open': string;
7
+ 'toggle.collapse': string;
8
+ };
9
+ /** The sidebar namespace key union. */
10
+ export type SidebarKey = keyof typeof zh;
11
+ /** English dictionary, checked complete against the zh key set. */
12
+ export declare const en: {
13
+ 'session.new': string;
14
+ 'session.new.label': string;
15
+ 'toggle.open': string;
16
+ 'toggle.collapse': string;
17
+ };
18
+ //# sourceMappingURL=locales.d.ts.map
@@ -0,0 +1,4 @@
1
+ /** Host loader entry for the browser-only sidebar plugin. */
2
+ /** Provides no host-side behavior. */
3
+ export declare function apply(): void;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Package-owned invariant companion for `@prettier-ai/dsh-client-ui-sidebar`.
3
+ * @module @prettier-ai/dsh-client-ui-sidebar/invariant
4
+ */
5
+ import type { Context } from '@prettier-ai/cordis';
6
+ /** Cordis companion plugin name. */
7
+ export declare const name = "client-ui-sidebar-invariant";
8
+ /** Service required before the companion can reserve package ownership. */
9
+ export declare const inject: string[];
10
+ /**
11
+ * Register this package's invariant companion.
12
+ * @param ctx - Cordis context carrying the invariant service.
13
+ * @returns the installed registration's disposer after setup succeeds.
14
+ */
15
+ export declare const apply: (ctx: Context) => Promise<() => void>;
16
+ //# sourceMappingURL=invariant.d.ts.map
package/package.json ADDED
@@ -0,0 +1,84 @@
1
+ {
2
+ "name": "@prettier-ai/dsh-client-ui-sidebar",
3
+ "description": "Sidebar plugin: session multi-level tree, search, grouping, state dots",
4
+ "version": "0.1.2-alpha.1",
5
+ "publishConfig": {
6
+ "access": "public"
7
+ },
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/deepseek-ai/deepseek-harness.git",
11
+ "directory": "packages/client/ui-sidebar"
12
+ },
13
+ "type": "module",
14
+ "main": "lib/index.js",
15
+ "types": "lib/types/index.d.ts",
16
+ "exports": {
17
+ ".": {
18
+ "types": "./lib/types/index.d.ts",
19
+ "default": "./lib/index.js"
20
+ },
21
+ "./invariant": {
22
+ "types": "./lib/types/invariant.d.ts",
23
+ "default": "./lib/invariant.js"
24
+ },
25
+ "./client": {
26
+ "types": "./lib/types/client/index.d.ts",
27
+ "default": "./lib/client.js"
28
+ },
29
+ "./src/*": "./src/*",
30
+ "./package.json": "./package.json"
31
+ },
32
+ "dsh": {
33
+ "client": {
34
+ "inject": [
35
+ "@prettier-ai/dsh-api-workspace-controller",
36
+ "@prettier-ai/dsh-client-ui-renderer",
37
+ "@prettier-ai/dsh-client-ui-layout",
38
+ "@prettier-ai/dsh-client-ui-session",
39
+ "@prettier-ai/dsh-client-ui-workspace",
40
+ "@prettier-ai/dsh-client-locale"
41
+ ],
42
+ "platform": "web"
43
+ }
44
+ },
45
+ "license": "MIT",
46
+ "dependencies": {
47
+ "clsx": "^2.0.0"
48
+ },
49
+ "peerDependencies": {
50
+ "@prettier-ai/dsh-client-locale": "^0.1.2-alpha.1",
51
+ "@prettier-ai/dsh-client-ui-renderer": "^0.1.2-alpha.1",
52
+ "@prettier-ai/dsh-client-ui-session": "^0.1.2-alpha.1",
53
+ "@prettier-ai/dsh-invariants": "^0.1.2-alpha.1",
54
+ "@prettier-ai/dsh-api-workspace-controller": "^0.1.2-alpha.1",
55
+ "@prettier-ai/cordis": "^4.0.1",
56
+ "@prettier-ai/dsh-client-ui-layout": "^0.1.2-alpha.1",
57
+ "@prettier-ai/dsh-client-ui-workspace": "^0.1.2-alpha.1"
58
+ },
59
+ "devDependencies": {
60
+ "@types/react": "~18.3.1",
61
+ "react": "^18.2.0",
62
+ "@prettier-ai/dsh-api-workspace-controller": "^0.1.2-alpha.1",
63
+ "@prettier-ai/dsh-client-test-runtime": "^0.1.2-alpha.1",
64
+ "@prettier-ai/dsh-client-locale": "^0.1.2-alpha.1",
65
+ "@prettier-ai/dsh-client-ui-layout": "^0.1.2-alpha.1",
66
+ "@prettier-ai/dsh-client-ui-renderer": "^0.1.2-alpha.1",
67
+ "@prettier-ai/dsh-client-ui-slots": "^0.1.2-alpha.1",
68
+ "@prettier-ai/dsh-client-ui-primitives": "^0.1.2-alpha.1",
69
+ "@prettier-ai/dsh-client-ui-session": "^0.1.2-alpha.1",
70
+ "@prettier-ai/dsh-client-ui-workspace": "^0.1.2-alpha.1",
71
+ "@prettier-ai/dsh-invariants": "^0.1.2-alpha.1",
72
+ "@prettier-ai/cordis": "^4.0.1"
73
+ },
74
+ "files": [
75
+ "lib/index.js",
76
+ "lib/invariant.js",
77
+ "lib/client.js",
78
+ "lib/types/**/*.d.ts"
79
+ ],
80
+ "scripts": {
81
+ "bundle": "tsdown",
82
+ "watch": "tsdown --watch"
83
+ }
84
+ }