@gestaltrun/dsh-ui-brand 0.1.0 → 0.1.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/README.i18n.yaml CHANGED
@@ -3,20 +3,23 @@
3
3
  # After editing either side, bring the other along and re-record with:
4
4
  # pnpm run verify-translation-pairing --write product/ui-brand/README.md
5
5
  /:
6
- en: 1adf55cd647e2fc5
7
- zh: dd623eedd5fa6169
6
+ en: 34cc0d0b601e8944
7
+ zh: 115e789bd90abb5e
8
8
  /gestaltrun-dsh-ui-brand:
9
9
  en: 0c71e8d9623e5c52
10
10
  zh: be1a2796fa01d6f1
11
11
  /gestaltrun-dsh-ui-brand/summary:
12
- en: 9ed5a929d0a75932
13
- zh: 5735289053349ff7
12
+ en: 6ffb924283de1e15
13
+ zh: 09f77d76af093c1e
14
14
  /gestaltrun-dsh-ui-brand/table-of-contents:
15
- en: fef1a8a79d9583a1
16
- zh: fef1a8a79d9583a1
15
+ en: b24335bd1b00a5ed
16
+ zh: b24335bd1b00a5ed
17
17
  /gestaltrun-dsh-ui-brand/product-composition:
18
- en: 8b6348f6152835c5
19
- zh: af96b86249132bbc
18
+ en: 451f1b6100f415f4
19
+ zh: 5e3fe3ef42cd635f
20
+ /gestaltrun-dsh-ui-brand/interface-recovery:
21
+ en: 4468098fdcf85b02
22
+ zh: dfebdbd9b86483bf
20
23
  /gestaltrun-dsh-ui-brand/brand-artwork:
21
24
  en: 8c5c2c0da6991d16
22
25
  zh: bdeeeef3cd2df583
@@ -27,8 +30,8 @@
27
30
  en: f4649870835c978f
28
31
  zh: 40f2c47381beba8e
29
32
  /gestaltrun-dsh-ui-brand/known-limitations-and-deferred-work:
30
- en: 7dcb38b9cb87ee86
31
- zh: d00d76d8c9f76ac3
33
+ en: 1bac7958d14c5187
34
+ zh: a0a643f19ac01e48
32
35
  /gestaltrun-dsh-ui-brand/dev-note:
33
36
  en: b75c8458928b72b9
34
37
  zh: 02cbcc6baa338b07
package/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: "Xingce brand mark, brand name, and travel-agency badge for the client sidebar brand row and the conversation hero."
2
+ description: "Xingce brand mark, brand name, and travel-agency badge for the client sidebar and conversation hero, with standalone interface recovery."
3
3
  kind: "package-plugin"
4
4
  ---
5
5
 
@@ -9,11 +9,12 @@ English | [中文](README.zh.md)
9
9
 
10
10
  ## Summary
11
11
 
12
- This product plugin shows the 行策 (Xingce) brand in the client: the little-people icon in the sidebar brand row and in the conversation hero, and the 行策 name with the 旅行社 badge beside the sidebar mark. A product composition that enables it replaces the official DeepSeek brand occupants.
12
+ This product plugin shows the 行策 (Xingce) brand in the client: the little-people icon in the sidebar brand row and in the conversation hero, and the 行策 name with the 旅行社 badge beside the sidebar mark. A product composition that enables it replaces the official DeepSeek brand occupants. Root rendering failures show a standalone recovery page with a page-only reload action.
13
13
 
14
14
  ## Table of Contents
15
15
 
16
16
  - [Product composition](#product-composition)
17
+ - [Interface recovery](#interface-recovery)
17
18
  - [Brand artwork](#brand-artwork)
18
19
  - [Model Experience](#model-experience)
19
20
  - [Known Limitations and Deferred Work](#known-limitations-and-deferred-work)
@@ -21,7 +22,15 @@ This product plugin shows the 行策 (Xingce) brand in the client: the little-pe
21
22
 
22
23
  ## Product composition
23
24
 
24
- Compose this package in a product bundle whose patch disables the official `ui-brand-official` row and inserts `gestaltrun-brand-ui` naming `@gestaltrun/dsh-ui-brand`; the shipped merchant composition does both in the [resource center patch](../resource-center/cordis.patch.yml). The three brand slots are `single` cells that reject a second registration at load, so keeping the official row disabled belongs to the composition rather than to a runtime preference. The Client entry registers `sidebar.brand.mark`, `sidebar.brand.name`, and `conversation.hero.brand.mark` as one declaration-aware set through `ctx.slots.inject`, and the generator form installs and rolls the set back atomically. Disabling the row removes every occupant and reloads restore exactly one set; unloading the declaring surface releases the set the same way. The Node companion registers nothing.
25
+ Compose this package in a product bundle whose patch disables the official `ui-brand-official` row and inserts `gestaltrun-brand-ui` naming `@gestaltrun/dsh-ui-brand`; the shipped merchant composition does both in the [resource center patch](../resource-intake-bundle/resource-center.patch.yml). The three brand slots are `single` cells that reject a second registration at load, so keeping the official row disabled belongs to the composition rather than to a runtime preference. The Client entry registers `sidebar.brand.mark`, `sidebar.brand.name`, and `conversation.hero.brand.mark` as one declaration-aware set through `ctx.slots.inject`, and the generator form installs and rolls the set back atomically. Disabling the row removes every occupant and reloads restore exactly one set; unloading the declaring surface releases the set the same way. The Node companion registers nothing.
26
+
27
+ ## Interface recovery
28
+
29
+ The Client entry also registers a root failure view through the renderer service, independently of brand slot lifetimes. The view uses typed Chinese and English dictionaries selected from the document `lang`; Chinese language variants use Chinese, and every other language uses English. It requires no slots, Session service, or locale service. The recovery content is centered horizontally and vertically in the viewport. The reload button uses the standard primary button size. Its native button reloads only the current page; background tasks keep running.
30
+
31
+ While registered, the Client plugin remembers the latest active document theme colors. Layout teardown preserves that palette for the failure view; before a theme has been recorded, the view follows the system color scheme. The observer leaves with the plugin registration.
32
+
33
+ When `window.dshDesktop?.reportRendererFailure` is available, the view sends the error name, message, JavaScript stack, and React component stack, and shows saving, saved, or not-saved status. A rejected report request shows not-saved status. Web pages without that method omit report status. If the failure view itself crashes, its own error boundary displays one fixed localized line.
25
34
 
26
35
  ## Brand artwork
27
36
 
@@ -43,7 +52,7 @@ None directly.
43
52
 
44
53
  - The wordmark contours are fixed geometry: they neither follow the UI font nor change with a locale, and regenerating them needs the brand asset pipeline that produced `wordmark-paths.json` plus a component edit.
45
54
  - The little-people mark is a raster image; details become less distinct at small sizes, and artwork updates must synchronize the PNG data URIs in the component and both favicons.
46
- - Application icons, the tray icon, and the favicon are static assets under `apps/`; this package covers only the three client brand slots.
55
+ - Application icons, the tray icon, and the favicon are static assets under `apps/`; this package supplies the three client brand occupants and the root failure view.
47
56
 
48
57
  ## Dev Note
49
58
 
package/README.zh.md CHANGED
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: "行策品牌标记、品牌名与旅行社徽标,用于客户端侧边栏品牌行与对话首屏。"
2
+ description: "行策品牌标记、品牌名与旅行社徽标,用于客户端侧边栏与对话首屏,并提供独立的界面恢复视图。"
3
3
  kind: "package-plugin"
4
4
  ---
5
5
 
@@ -9,11 +9,12 @@ kind: "package-plugin"
9
9
 
10
10
  ## Summary
11
11
 
12
- 本产品插件在客户端展示行策品牌:侧边栏品牌行与对话首屏使用小人组图标,侧边栏标记旁是「行策」品牌名与「旅行社」徽标。启用它的产品组合会替换官方 DeepSeek 品牌占位者。
12
+ 本产品插件在客户端展示行策品牌:侧边栏品牌行与对话首屏使用小人组图标,侧边栏标记旁是「行策」品牌名与「旅行社」徽标。启用它的产品组合会替换官方 DeepSeek 品牌占位者。根渲染失败时,独立的恢复页提供仅重新加载界面的操作。
13
13
 
14
14
  ## Table of Contents
15
15
 
16
16
  - [Product composition](#product-composition)
17
+ - [Interface recovery](#interface-recovery)
17
18
  - [Brand artwork](#brand-artwork)
18
19
  - [Model Experience](#model-experience)
19
20
  - [Known Limitations and Deferred Work](#known-limitations-and-deferred-work)
@@ -21,7 +22,15 @@ kind: "package-plugin"
21
22
 
22
23
  ## Product composition
23
24
 
24
- 在产品 bundle 的补丁中组合本包:先禁用官方 `ui-brand-official` 行,再插入命名为 `@gestaltrun/dsh-ui-brand` 的 `gestaltrun-brand-ui` 行;已交付的商家组合在[资源中心补丁](../resource-center/cordis.patch.yml)中同时完成这两步。三个品牌插槽都是 `single` 单元格,重复注册会在加载时报错,因此禁用官方行属于组合的一部分,而不是运行时偏好。Client 入口通过 `ctx.slots.inject` 以声明感知方式一次性注册 `sidebar.brand.mark`、`sidebar.brand.name` 与 `conversation.hero.brand.mark`,generator 形式让整组原子安装与原子回滚。禁用该行会移除全部占位者,重新加载恢复且只恢复一份;声明面卸载时同样释放整组。Node companion 不注册任何内容。
25
+ 在产品 bundle 的补丁中组合本包:先禁用官方 `ui-brand-official` 行,再插入命名为 `@gestaltrun/dsh-ui-brand` 的 `gestaltrun-brand-ui` 行;已交付的商家组合在[资源中心补丁](../resource-intake-bundle/resource-center.patch.yml)中同时完成这两步。三个品牌插槽都是 `single` 单元格,重复注册会在加载时报错,因此禁用官方行属于组合的一部分,而不是运行时偏好。Client 入口通过 `ctx.slots.inject` 以声明感知方式一次性注册 `sidebar.brand.mark`、`sidebar.brand.name` 与 `conversation.hero.brand.mark`,generator 形式让整组原子安装与原子回滚。禁用该行会移除全部占位者,重新加载恢复且只恢复一份;声明面卸载时同样释放整组。Node companion 不注册任何内容。
26
+
27
+ ## Interface recovery
28
+
29
+ 客户端入口还通过渲染器服务登记根失败视图,其生命周期独立于品牌插槽。视图根据文档 `lang` 选择类型化的中英文字典;中文语言变体使用中文,其余语言使用英文。它不依赖插槽、Session 服务或语言服务。恢复内容在视口的水平和垂直方向居中;重新加载按钮采用标准主要按钮尺寸。原生按钮只重新加载当前页面,后台任务继续运行。
30
+
31
+ 客户端插件登记期间记录最近一次呈现的文档主题配色。布局撤下后,失败视图继续使用该配色;尚无主题记录时,使用系统配色方案。观察器随插件登记一同释放。
32
+
33
+ 存在 `window.dshDesktop?.reportRendererFailure` 时,视图发送错误名称、消息、JavaScript 调用栈与 React 组件调用栈,并显示正在保存、报告已保存或报告未保存状态。上报请求被拒绝时显示未保存。没有该方法的网页省略报告状态。失败视图自身崩溃时,其错误边界显示一行固定的本地化文字。
25
34
 
26
35
  ## Brand artwork
27
36
 
@@ -43,7 +52,7 @@ UI 不增加任何模型可见输入。后续 Session 行为由 Host 运行时
43
52
 
44
53
  - 字标轮廓是固定几何:既不跟随 UI 字体,也不随语言变化;重新生成需要产出 `wordmark-paths.json` 的品牌资产流水线,并修改组件。
45
54
  - 小人组标记是位图,小尺寸下细节辨识度降低;更新图形时须同步组件和两个 favicon 中的 PNG data URI。
46
- - 应用图标、托盘图标与 favicon 是 `apps/` 下的静态资产;本包只覆盖三个客户端品牌插槽。
55
+ - 应用图标、托盘图标与 favicon 是 `apps/` 下的静态资产;本包提供三个客户端品牌占位者与根失败视图。
47
56
 
48
57
  ## Dev Note
49
58
 
package/lib/client.js CHANGED
@@ -4,6 +4,7 @@ window.__ModuleLoader__.load({
4
4
  const module = { exports: {} };
5
5
  const exports = module.exports;
6
6
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
7
+ let react = require("react");
7
8
  let react_jsx_runtime = require("react/jsx-runtime");
8
9
  //#region src/client/Brand.tsx
9
10
  /**
@@ -63,15 +64,187 @@ window.__ModuleLoader__.load({
63
64
  });
64
65
  }
65
66
  //#endregion
67
+ //#region src/client/locales.ts
68
+ /** Context-free failure copy keyed by the document language. */
69
+ const zh = {
70
+ title: "界面暂时无法显示",
71
+ description: "请重新加载界面,后台任务会继续运行",
72
+ reload: "重新加载界面",
73
+ saving: "正在保存",
74
+ saved: "报告已保存",
75
+ notSaved: "报告未保存",
76
+ failedView: "界面暂时无法显示,请重新加载页面"
77
+ };
78
+ /** English copy covers the same keys and all other document languages. */
79
+ const en = {
80
+ title: "The interface could not be displayed",
81
+ description: "Reload the interface. Background tasks will keep running.",
82
+ reload: "Reload interface",
83
+ saving: "Saving report",
84
+ saved: "Report saved",
85
+ notSaved: "Report not saved",
86
+ failedView: "The interface could not be displayed. Reload this page."
87
+ };
88
+ /**
89
+ * Select standalone failure copy from the document language.
90
+ * @param language - Document language tag; Chinese variants select Chinese.
91
+ * @returns Chinese copy for Chinese tags, otherwise English copy.
92
+ */
93
+ function failureCopy(language) {
94
+ return language.toLowerCase().split("-")[0] === "zh" ? zh : en;
95
+ }
96
+ //#endregion
97
+ //#region \0ui-brand-css:src/client/renderer-failure.module.css.mjs
98
+ const key = "@gestaltrun/dsh-ui-brand/renderer-failure.module.css";
99
+ if (!document.querySelector("style[data-plugin-css=" + JSON.stringify(key) + "]")) {
100
+ const s = document.createElement("style");
101
+ s.dataset.plugin = "@gestaltrun/dsh-ui-brand";
102
+ s.dataset.pluginCss = key;
103
+ s.textContent = "._uDVuG_page{box-sizing:border-box;color:var(--ui-brand-failure-primary,CanvasText);background:var(--ui-brand-failure-background,Canvas);padding:32px;display:flex;position:fixed;inset:0;overflow:auto}._uDVuG_content{text-align:center;flex-direction:column;align-items:center;gap:16px;width:min(100%,36rem);margin:auto;display:flex}._uDVuG_heading{margin:0;font-size:24px;font-weight:500;line-height:32px}._uDVuG_description{color:var(--ui-brand-failure-secondary,CanvasText);margin:0;font-size:16px;line-height:26px}._uDVuG_status{color:var(--ui-brand-failure-secondary,CanvasText);margin:0;font-size:14px;line-height:22px}._uDVuG_reload{box-sizing:border-box;border-radius:var(--dsw-radius-md);min-height:36px;color:var(--ui-brand-failure-button-label,Canvas);background:var(--ui-brand-failure-button-fill,CanvasText);cursor:pointer;border:0;justify-content:center;align-items:center;margin-top:8px;padding:0 14px;font-family:inherit;font-size:14px;font-weight:500;line-height:22px;display:inline-flex}@media (hover:hover){._uDVuG_reload:hover{background:var(--ui-brand-failure-button-hover,CanvasText)}}";
104
+ document.head.append(s);
105
+ }
106
+ var renderer_failure_module_css_default = {
107
+ "content": "_uDVuG_content",
108
+ "description": "_uDVuG_description",
109
+ "heading": "_uDVuG_heading",
110
+ "page": "_uDVuG_page",
111
+ "reload": "_uDVuG_reload",
112
+ "status": "_uDVuG_status"
113
+ };
114
+ //#endregion
115
+ //#region src/client/RendererFailureView.tsx
116
+ /** Root failure presentation independent of slots, sessions, and application providers. */
117
+ /** Last rendering attempt for a failed product view; it has no recovery subtree. */
118
+ var FailureViewBoundary = class extends react.Component {
119
+ state = { failed: false };
120
+ static getDerivedStateFromError() {
121
+ return { failed: true };
122
+ }
123
+ render() {
124
+ const copy = failureCopy(document.documentElement.lang);
125
+ return this.state.failed ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
126
+ role: "alert",
127
+ children: copy.failedView
128
+ }) : this.props.children;
129
+ }
130
+ };
131
+ /**
132
+ * Present the page-only recovery action in the document language.
133
+ * @param props - Root error details, retained theme colors, and the renderer-owned reload action.
134
+ * @returns Standalone failure page.
135
+ */
136
+ function RendererFailureView(props) {
137
+ const copy = failureCopy(document.documentElement.lang);
138
+ const desktop = window.dshDesktop;
139
+ const [status, setStatus] = (0, react.useState)("saving");
140
+ (0, react.useEffect)(() => {
141
+ if (desktop?.reportRendererFailure === void 0) return;
142
+ desktop.reportRendererFailure({
143
+ name: props.error.name,
144
+ message: props.error.message,
145
+ stack: props.error.stack ?? "",
146
+ componentStack: props.componentStack
147
+ }).then((result) => {
148
+ setStatus(result.status === "written" ? "saved" : "notSaved");
149
+ }, () => {
150
+ setStatus("notSaved");
151
+ });
152
+ }, [
153
+ desktop,
154
+ props.error,
155
+ props.componentStack
156
+ ]);
157
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("main", {
158
+ className: renderer_failure_module_css_default["page"],
159
+ style: props.theme,
160
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
161
+ className: renderer_failure_module_css_default["content"],
162
+ children: [
163
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h1", {
164
+ className: renderer_failure_module_css_default["heading"],
165
+ children: copy.title
166
+ }),
167
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
168
+ className: renderer_failure_module_css_default["description"],
169
+ children: copy.description
170
+ }),
171
+ desktop?.reportRendererFailure !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
172
+ className: renderer_failure_module_css_default["status"],
173
+ role: "status",
174
+ children: copy[status]
175
+ }),
176
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
177
+ className: renderer_failure_module_css_default["reload"],
178
+ type: "button",
179
+ onClick: props.reload,
180
+ children: copy.reload
181
+ })
182
+ ]
183
+ })
184
+ });
185
+ }
186
+ //#endregion
187
+ //#region src/client/failure-theme.ts
188
+ /**
189
+ * Observe theme presentation for one product plugin lifetime.
190
+ * Removing the source marker retains the last colors instead of capturing teardown's light palette.
191
+ * @returns Snapshot reader and observer disposer; before any theme is recorded, the reader uses the system scheme.
192
+ */
193
+ function observeFailureTheme() {
194
+ let latest;
195
+ const capture = () => {
196
+ if (!document.documentElement.hasAttribute("data-ds-theme-source")) return;
197
+ const colors = getComputedStyle(document.body);
198
+ latest = {
199
+ colorScheme: document.body.hasAttribute("data-ds-dark-theme") ? "dark" : "light",
200
+ "--ui-brand-failure-background": colors.getPropertyValue("--dsw-alias-bg-base"),
201
+ "--ui-brand-failure-primary": colors.getPropertyValue("--dsw-alias-label-primary"),
202
+ "--ui-brand-failure-secondary": colors.getPropertyValue("--dsw-alias-label-secondary"),
203
+ "--ui-brand-failure-button-fill": colors.getPropertyValue("--dsw-alias-button-primary-fill"),
204
+ "--ui-brand-failure-button-label": colors.getPropertyValue("--dsw-alias-label-primary-foreground"),
205
+ "--ui-brand-failure-button-hover": colors.getPropertyValue("--dsw-alias-button-primary-hover")
206
+ };
207
+ };
208
+ capture();
209
+ const observer = new MutationObserver(capture);
210
+ observer.observe(document.documentElement, {
211
+ attributes: true,
212
+ attributeFilter: ["data-ds-theme-source"]
213
+ });
214
+ observer.observe(document.body, {
215
+ attributes: true,
216
+ attributeFilter: ["data-ds-dark-theme", "style"]
217
+ });
218
+ return {
219
+ snapshot: () => {
220
+ return latest ?? { colorScheme: window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light" };
221
+ },
222
+ dispose: () => {
223
+ observer.disconnect();
224
+ }
225
+ };
226
+ }
227
+ //#endregion
66
228
  //#region src/client/index.ts
67
- /** Required service: the UI slot registry. */
68
- const inject = ["slots"];
229
+ /** Required services: UI composition and root failure presentation. */
230
+ const inject = ["slots", "uiRenderer"];
69
231
  /**
70
- * Fill the sidebar and hero brand slots as one declaration-aware registration set. The set installs
232
+ * Register standalone root recovery and the declaration-aware sidebar and hero brand set. The brand set installs
71
233
  * and rolls back atomically, so the mark, the name, and the hero mark always appear and leave together.
72
234
  * @param ctx - Client root context.
73
235
  */
74
236
  function apply(ctx) {
237
+ ctx.effect(() => {
238
+ const theme = observeFailureTheme();
239
+ const unregister = ctx.uiRenderer.registerFailureView((props) => (0, react.createElement)(FailureViewBoundary, { children: (0, react.createElement)(RendererFailureView, {
240
+ ...props,
241
+ theme: theme.snapshot()
242
+ }) }));
243
+ return () => {
244
+ unregister();
245
+ theme.dispose();
246
+ };
247
+ });
75
248
  ctx.slots.inject("sidebar.brand.mark", () => ctx.slots.inject("sidebar.brand.name", () => ctx.slots.inject("conversation.hero.brand.mark", function* () {
76
249
  yield ctx.slots.register({ name: "sidebar.brand.mark" }, XingceBrandMark);
77
250
  yield ctx.slots.register({ name: "sidebar.brand.name" }, XingceBrandName);
@@ -84,3 +257,5 @@ window.__ModuleLoader__.load({
84
257
  return module.exports;
85
258
  }
86
259
  });
260
+
261
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","names":["Component","styles"],"sources":["../src/client/Brand.tsx","../src/client/locales.ts","../src/client/RendererFailureView.tsx","../src/client/failure-theme.ts","../src/client/index.ts"],"sourcesContent":["import type { HeroBrandMarkOwnerProps } from '@deepseek-ai/dsh-client-ui-conversation/client'\n\n/**\n * Outlined 行策 wordmark contours (name, badge plate, badge lettering) in the frozen\n * `0 0 219 48` brand canvas. The glyphs are flattened Hiragino Sans GB W6 outlines, so\n * every platform draws identical lettering without loading a CJK font.\n */\nconst NAME_PATH = 'M64.06 22.134H64.8555C65.6695 22.134 66.4465 22.171 67.057 22.245V20.173C66.576 20.247 65.836 20.284 64.8 20.284H58.51C57.622 20.284 56.7895 20.247 56.2345 20.173V22.245C56.808 22.171 57.659 22.134 58.51 22.134H62.0435V29.1085C62.0435 29.5155 61.951 29.5525 61.2295 29.5525C60.619 29.5525 59.7125 29.4785 58.695 29.349C59.0095 30.126 59.1205 30.607 59.2315 31.421C60.1195 31.458 60.6005 31.4765 61.2665 31.4765C62.4505 31.4765 63.024 31.384 63.431 31.1435C63.8935 30.8475 64.06 30.422 64.06 29.497ZM54.2365 14.5305C53.996 14.993 53.7555 15.3445 53.3485 15.8255C52.442 16.8245 51.4985 17.5645 50.037 18.36C50.518 18.9335 50.8325 19.3775 51.2025 20.099C52.9415 18.989 54.255 17.842 55.4575 16.399C55.809 15.992 55.809 15.992 56.0125 15.77ZM56.9745 17.5275C57.585 17.4535 58.362 17.4165 59.139 17.4165H64.171C64.911 17.4165 65.5955 17.4535 66.243 17.5275V15.474C65.688 15.548 65.059 15.585 64.134 15.585H59.139C58.177 15.585 57.4925 15.548 56.9745 15.474ZM52.5715 29.349C52.5715 30.311 52.5345 31.125 52.442 31.6985H54.736C54.6435 31.088 54.6065 30.348 54.6065 29.3675V22.0785C55.0875 21.4865 55.254 21.246 55.6795 20.6355C55.9385 20.247 56.105 20.025 56.29 19.8215L54.551 18.6745C53.848 20.2655 51.9425 22.3005 50 23.5585C50.407 24.2245 50.6475 24.7055 50.925 25.538C51.5725 25.0755 52.1275 24.539 52.6085 23.9655C52.5715 25.316 52.5715 25.3345 52.5715 26.1115Z M84.653 17.7495C85.4855 17.7495 86.022 17.768 86.5955 17.842V15.9365C86.022 16.0105 85.393 16.0475 84.5605 16.0475H80.916C81.027 15.8255 81.027 15.8255 81.4525 14.919L79.473 14.5675C79.251 15.474 78.807 16.3065 78.215 17.028C78.1225 17.139 78.1225 17.139 78.067 17.213V15.918C77.549 15.992 76.994 16.029 76.2725 16.029H73.7935C74.1265 15.4185 74.3115 15.0485 74.3855 14.919L72.406 14.5675C71.999 15.9365 70.9815 17.287 69.557 18.3415C70.0935 18.804 70.482 19.211 70.8705 19.729C71.703 19.026 72.11 18.582 72.739 17.731H73.738C74.034 18.2675 74.256 18.7855 74.5705 19.6365L76.3835 19.1185C76.0875 18.5265 75.8655 18.101 75.6435 17.731H76.7165C76.957 17.731 77.3455 17.7495 77.549 17.768C77.438 17.879 77.3455 17.953 77.142 18.1195C77.586 18.4525 77.8635 18.693 78.1965 19.063H76.957C77.0125 19.3775 77.031 19.6735 77.0495 20.062H71.999C71.1665 20.062 70.63 20.025 70.038 19.9325V21.8565C70.6115 21.801 71.2405 21.764 71.999 21.764H77.0495V22.689H73.072C72.443 22.689 71.9065 22.6705 71.4625 22.615C71.518 23.0775 71.5365 23.54 71.5365 24.1135V25.7415C71.5365 26.4445 71.4995 26.9625 71.444 27.4435H73.516C73.4605 27.092 73.442 26.648 73.442 25.945V24.317H77.0495V24.983C76.55 25.6305 76.3095 25.8895 75.699 26.389C74.9775 27.018 74.2745 27.499 73.5715 27.906C72.4985 28.498 71 29.1085 69.6865 29.497C70.482 30.2925 70.63 30.4775 71.111 31.273C72.184 30.8475 73.294 30.311 74.219 29.7375C75.4585 28.9605 76.3465 28.165 77.105 27.166C77.068 27.61 77.0495 28.128 77.0495 28.4055V28.461L77.068 29.8115V29.9595C77.068 30.6625 77.031 31.162 76.92 31.754H79.177C79.066 31.1435 79.0475 30.903 79.029 29.83L79.0105 28.424C79.0105 27.9245 78.992 27.684 78.9735 27.0735C79.399 27.647 79.584 27.832 80.139 28.313C80.805 28.8865 81.2305 29.2195 81.8225 29.571C82.7475 30.163 84.098 30.792 85.43 31.273C85.7075 30.681 86.096 30.1815 86.762 29.4415C85.134 28.9975 83.765 28.498 82.692 27.9245C81.2675 27.166 79.8985 26.0745 79.0475 24.983V24.317H83.0065V25.39C83.0065 25.6675 82.8955 25.7415 82.4885 25.7415C82.174 25.7415 81.693 25.7045 81.323 25.6305C81.582 26.3335 81.656 26.6665 81.693 27.24C82.285 27.277 82.5995 27.2955 82.988 27.2955C83.6725 27.2955 84.098 27.24 84.357 27.092C84.7085 26.907 84.8935 26.5 84.8935 25.8895V24.1505C84.8935 23.503 84.912 23.022 84.9675 22.615C84.727 22.652 84.1535 22.6705 83.247 22.689H79.0475V21.764H84.505C85.4115 21.764 85.9295 21.7825 86.4845 21.8565V19.9325C85.9295 20.025 85.4485 20.062 84.505 20.062H79.0475C79.066 19.4515 79.0845 19.396 79.14 19.063H78.8625C79.2325 18.693 79.6025 18.2305 79.9355 17.7495H81.1565C81.545 18.434 81.804 18.9705 82.0445 19.655L83.913 19.1555C83.654 18.6375 83.4135 18.1935 83.136 17.7495Z'\n\n/** Badge plate for the 旅行社 lettering. */\nconst BADGE_PLATE_PATH = 'M101.3 16.4H145.7A2.8 2.8 0 0 1 148.5 19.2V28.8A2.8 2.8 0 0 1 145.7 31.6H101.3A2.8 2.8 0 0 1 98.5 28.8V19.2A2.8 2.8 0 0 1 101.3 16.4Z'\n\n/** Outlined 旅行社 badge lettering. */\nconst BADGE_LETTERING_PATH = 'M117.2424 21.8112C116.6472 22.2432 115.2168 22.608 113.8632 22.6848C113.892 22.896 113.9016 23.1264 113.9016 23.5584V26.8992C113.8824 27.2352 113.8248 27.36 113.6328 27.4656C113.6136 27.4848 113.5848 27.504 113.5368 27.5232L113.9784 28.3392C114.1896 28.2432 114.1896 28.2432 115.2264 27.792C115.9944 27.456 115.9944 27.456 116.2056 27.3408L116.0904 26.4C115.6584 26.6208 115.2168 26.8224 114.8808 26.9376V23.5296C115.1976 23.472 115.2648 23.4624 115.428 23.4336C115.5528 24.4896 115.716 25.1616 116.004 25.8912C116.436 26.9472 116.8968 27.6288 117.7608 28.4352C117.972 27.936 118.116 27.696 118.3944 27.3696C117.6936 26.7744 117.2424 26.1792 116.8968 25.3824C117.4344 24.9792 117.9432 24.5376 118.308 24.144L117.588 23.4528C117.2904 23.8464 116.964 24.1632 116.5704 24.4608C116.436 23.9616 116.388 23.7024 116.34 23.2416C116.7816 23.1168 117.3576 22.9344 117.7032 22.7904C117.876 22.7136 117.876 22.7136 117.9432 22.6848ZM113.2488 20.9472C113.0088 20.9856 112.7688 20.9952 112.3848 20.9952H111.9912C111.8376 20.496 111.6648 20.0736 111.4536 19.632L110.4936 19.9584C110.7336 20.4288 110.8584 20.7072 110.9544 20.9952H110.3688C109.9176 20.9952 109.6872 20.9856 109.428 20.9376V21.9744C109.6488 21.936 109.8504 21.9264 110.2728 21.9264H110.3784C110.3592 23.4624 110.3112 24.2112 110.1864 25.0368C110.0136 26.16 109.7256 26.9184 109.2264 27.5808C109.5432 27.8496 109.716 28.0512 109.9752 28.4928C110.4552 27.8208 110.6856 27.312 110.9256 26.4288C111.1368 25.68 111.2136 25.1232 111.2904 23.8752H112.0488C112.0392 24.5568 112.0296 24.9696 112.0296 25.104C111.9816 26.0448 111.9624 26.4 111.924 26.6688C111.8472 27.2448 111.7992 27.3216 111.4824 27.3216C111.2616 27.3216 111.06 27.2928 110.8296 27.2256C110.9544 27.5904 111.0024 27.8592 111.0216 28.2624C111.252 28.2816 111.3672 28.2912 111.5304 28.2912C112.2696 28.2912 112.5864 28.1184 112.7496 27.6288C112.9032 27.1488 113.0088 26.064 113.028 24.7104C113.0472 23.184 113.0472 23.184 113.0664 22.9152C112.8936 22.9344 112.692 22.944 112.2984 22.944H111.3384C111.3576 22.5504 111.3576 22.5504 111.3672 22.2432C111.3672 22.176 111.3672 22.0608 111.3672 21.9264H112.3752C112.6824 21.9264 112.9032 21.936 113.0856 21.9456C112.9128 22.1472 112.836 22.224 112.596 22.4448C112.9416 22.656 113.2392 22.8768 113.3832 23.0688C113.8728 22.5696 114.1896 22.1568 114.4968 21.6384H117.2904C117.7128 21.6384 117.9624 21.648 118.2312 21.6768V20.64C117.972 20.6784 117.6552 20.6976 117.2328 20.6976H114.9864C115.0728 20.4864 115.1016 20.4288 115.1784 20.2176C115.2168 20.1408 115.3032 19.9296 115.3224 19.8912C115.332 19.872 115.3416 19.8432 115.3608 19.8048L114.276 19.6032C114.1992 20.1792 113.7576 21.1008 113.2488 21.744Z M126.4904 23.5104H126.9032C127.3256 23.5104 127.7288 23.5296 128.0456 23.568V22.4928C127.796 22.5312 127.412 22.5504 126.8744 22.5504H123.6104C123.1496 22.5504 122.7176 22.5312 122.4296 22.4928V23.568C122.7272 23.5296 123.1688 23.5104 123.6104 23.5104H125.444V27.1296C125.444 27.3408 125.396 27.36 125.0216 27.36C124.7048 27.36 124.2344 27.3216 123.7064 27.2544C123.8696 27.6576 123.9272 27.9072 123.9848 28.3296C124.4456 28.3488 124.6952 28.3584 125.0408 28.3584C125.6552 28.3584 125.9528 28.3104 126.164 28.1856C126.404 28.032 126.4904 27.8112 126.4904 27.3312ZM121.3928 19.5648C121.268 19.8048 121.1432 19.9872 120.932 20.2368C120.4616 20.7552 119.972 21.1392 119.2136 21.552C119.4632 21.8496 119.6264 22.08 119.8184 22.4544C120.7208 21.8784 121.4024 21.2832 122.0264 20.5344C122.2088 20.3232 122.2088 20.3232 122.3144 20.208ZM122.8136 21.12C123.1304 21.0816 123.5336 21.0624 123.9368 21.0624H126.548C126.932 21.0624 127.2872 21.0816 127.6232 21.12V20.0544C127.3352 20.0928 127.0088 20.112 126.5288 20.112H123.9368C123.4376 20.112 123.0824 20.0928 122.8136 20.0544ZM120.5288 27.2544C120.5288 27.7536 120.5096 28.176 120.4616 28.4736H121.652C121.604 28.1568 121.5848 27.7728 121.5848 27.264V23.4816C121.8344 23.1744 121.9208 23.0496 122.1416 22.7328C122.276 22.5312 122.3624 22.416 122.4584 22.3104L121.556 21.7152C121.1912 22.5408 120.2024 23.5968 119.1944 24.2496C119.4056 24.5952 119.5304 24.8448 119.6744 25.2768C120.0104 25.0368 120.2984 24.7584 120.548 24.4608C120.5288 25.1616 120.5288 25.1712 120.5288 25.5744Z M131.4568 24.6048C131.8696 24.9696 132.196 25.3248 132.6088 25.8432L133.2232 24.9792C132.7432 24.48 132.4168 24.2112 131.6872 23.6736C132.1096 23.1072 132.3496 22.704 132.6568 22.0128C132.7336 21.8496 132.7816 21.7536 132.8776 21.6096L132.4072 21.1104C132.2824 21.1296 132.148 21.1392 131.86 21.1392H131.14L131.7352 20.7072C131.4952 20.2752 131.2456 19.9296 130.8712 19.5072L130.0648 20.016C130.4392 20.4384 130.6312 20.7072 130.8808 21.1392H129.9304C129.6136 21.1392 129.412 21.1296 129.172 21.1008V22.1664C129.4312 22.1376 129.6328 22.128 129.988 22.128H131.5432C131.2264 22.7424 130.948 23.136 130.5064 23.6064C129.9784 24.1536 129.5176 24.5184 128.8456 24.9024C129.0472 25.1904 129.22 25.536 129.3352 25.9008C129.8248 25.584 130.0168 25.44 130.4104 25.0848V27.4944C130.4104 27.9456 130.3912 28.2048 130.3528 28.4928H131.5144C131.4664 28.2048 131.4568 27.9648 131.4568 27.5136ZM135.5272 22.32V20.6304C135.5272 20.2176 135.5368 20.016 135.5944 19.632H134.3944C134.4424 20.0064 134.4616 20.2368 134.4616 20.6304V22.32H133.7416C133.3288 22.32 133.0792 22.3104 132.8008 22.272V23.3568C133.108 23.328 133.4152 23.3088 133.7416 23.3088H134.4616V27.0624H133.4152C132.9544 27.0624 132.6184 27.0432 132.3112 27.0048V28.1664C132.6472 28.1184 133.012 28.0992 133.396 28.0992H136.6792C137.0632 28.0992 137.4376 28.1184 137.7736 28.1664V27.0048C137.476 27.0432 137.1592 27.0624 136.6792 27.0624H135.5272V23.3088H136.5448C136.8808 23.3088 137.1784 23.328 137.4856 23.3568V22.272C137.2168 22.3104 136.9768 22.32 136.5448 22.32Z'\n\n/** Transparent little-people artwork, resized from the 512 px master with Lanczos to 192 px. */\nconst LITTLE_PEOPLE_MARK = 'data:image/png;base64,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'\n\n/**\n * Render the full-color little-people mark on either theme without a background plate.\n * @param props - Host-supplied mark presentation: the square edge and the host geometry class.\n * @returns the decorative mark image, hidden from assistive technology.\n */\nexport function XingceBrandMark({ size, className }: HeroBrandMarkOwnerProps) {\n return <img src={LITTLE_PEOPLE_MARK} width={size} height={size} alt=\"\" aria-hidden=\"true\" className={className} />\n}\n\n/**\n * Render the brand name and the travel-agency badge without the independently slotted mark.\n * The window crops the shared brand canvas to the name and badge columns of the lockup.\n * @returns the name svg (aria-hidden decorative brand art).\n */\nexport function XingceBrandName() {\n return (\n <svg width=\"106\" height=\"24\" viewBox=\"46 12 106 24\" fill=\"none\" aria-hidden=\"true\" focusable=\"false\">\n <path d={NAME_PATH} fill=\"currentColor\" />\n <path d={BADGE_PLATE_PATH} fill=\"currentColor\" />\n <path d={BADGE_LETTERING_PATH} fill=\"var(--dsw-alias-label-primary-inverted)\" />\n </svg>\n )\n}\n","/** Context-free failure copy keyed by the document language. */\nexport const zh = {\n title: '界面暂时无法显示',\n description: '请重新加载界面,后台任务会继续运行',\n reload: '重新加载界面',\n saving: '正在保存',\n saved: '报告已保存',\n notSaved: '报告未保存',\n failedView: '界面暂时无法显示,请重新加载页面',\n} satisfies Record<string, string>\n\n/** English copy covers the same keys and all other document languages. */\nexport const en = {\n title: 'The interface could not be displayed',\n description: 'Reload the interface. Background tasks will keep running.',\n reload: 'Reload interface',\n saving: 'Saving report',\n saved: 'Report saved',\n notSaved: 'Report not saved',\n failedView: 'The interface could not be displayed. Reload this page.',\n} satisfies Record<keyof typeof zh, string>\n\n/**\n * Select standalone failure copy from the document language.\n * @param language - Document language tag; Chinese variants select Chinese.\n * @returns Chinese copy for Chinese tags, otherwise English copy.\n */\nexport function failureCopy(language: string): typeof en {\n return language.toLowerCase().split('-')[0] === 'zh' ? zh : en\n}\n","/** Root failure presentation independent of slots, sessions, and application providers. */\nimport { Component, useEffect, useState, type ReactNode } from 'react'\nimport type { FailureViewProps } from '@deepseek-ai/dsh-client-ui-renderer/client'\nimport { failureCopy } from './locales.ts'\nimport type { FailureTheme } from './failure-theme.ts'\nimport styles from './renderer-failure.module.css'\n\ntype ReportStatus = 'saving' | 'saved' | 'notSaved'\ninterface DesktopFailureReporter {\n reportRendererFailure?: (failure: { name: string; message: string; stack: string; componentStack: string }) =>\n Promise<{ status: 'written'; path: string } | { status: 'failed' }>\n}\n\n/** Last rendering attempt for a failed product view; it has no recovery subtree. */\nexport class FailureViewBoundary extends Component<{ children: ReactNode }, { failed: boolean }> {\n override state = { failed: false }\n static getDerivedStateFromError(): { failed: boolean } { return { failed: true } }\n override render(): ReactNode {\n const copy = failureCopy(document.documentElement.lang)\n return this.state.failed ? <p role=\"alert\">{copy.failedView}</p> : this.props.children\n }\n}\n\n/**\n * Present the page-only recovery action in the document language.\n * @param props - Root error details, retained theme colors, and the renderer-owned reload action.\n * @returns Standalone failure page.\n */\nexport function RendererFailureView(props: FailureViewProps & { theme: FailureTheme }): ReactNode {\n const copy = failureCopy(document.documentElement.lang)\n const desktop = (window as Window & { dshDesktop?: DesktopFailureReporter }).dshDesktop\n const [status, setStatus] = useState<ReportStatus>('saving')\n useEffect(() => {\n if (desktop?.reportRendererFailure === undefined) return\n void desktop.reportRendererFailure({\n name: props.error.name, message: props.error.message, stack: props.error.stack ?? '', componentStack: props.componentStack,\n }).then(result => { setStatus(result.status === 'written' ? 'saved' : 'notSaved') }, () => { setStatus('notSaved') })\n }, [desktop, props.error, props.componentStack])\n return (\n <main className={styles['page']} style={props.theme}>\n <section className={styles['content']}>\n <h1 className={styles['heading']}>{copy.title}</h1>\n <p className={styles['description']}>{copy.description}</p>\n {desktop?.reportRendererFailure !== undefined && <p className={styles['status']} role=\"status\">{copy[status]}</p>}\n <button className={styles['reload']} type=\"button\" onClick={props.reload}>{copy.reload}</button>\n </section>\n </main>\n )\n}\n","/** Retains document colors for recovery after the layout retracts its theme presentation. */\n\n/** Captured colors scoped to the failure page; missing colors use the system palette. */\nexport type FailureTheme = { colorScheme: 'light' | 'dark' } & Record<`--ui-brand-failure-${string}`, string>\n\n/**\n * Observe theme presentation for one product plugin lifetime.\n * Removing the source marker retains the last colors instead of capturing teardown's light palette.\n * @returns Snapshot reader and observer disposer; before any theme is recorded, the reader uses the system scheme.\n */\nexport function observeFailureTheme(): { snapshot: () => FailureTheme; dispose: () => void } {\n let latest: FailureTheme | undefined\n const capture = (): void => {\n if (!document.documentElement.hasAttribute('data-ds-theme-source')) return\n const colors = getComputedStyle(document.body)\n latest = {\n colorScheme: document.body.hasAttribute('data-ds-dark-theme') ? 'dark' : 'light',\n '--ui-brand-failure-background': colors.getPropertyValue('--dsw-alias-bg-base'),\n '--ui-brand-failure-primary': colors.getPropertyValue('--dsw-alias-label-primary'),\n '--ui-brand-failure-secondary': colors.getPropertyValue('--dsw-alias-label-secondary'),\n '--ui-brand-failure-button-fill': colors.getPropertyValue('--dsw-alias-button-primary-fill'),\n '--ui-brand-failure-button-label': colors.getPropertyValue('--dsw-alias-label-primary-foreground'),\n '--ui-brand-failure-button-hover': colors.getPropertyValue('--dsw-alias-button-primary-hover'),\n }\n }\n capture()\n const observer = new MutationObserver(capture)\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['data-ds-theme-source'] })\n observer.observe(document.body, { attributes: true, attributeFilter: ['data-ds-dark-theme', 'style'] })\n return {\n snapshot: () => {\n return latest ?? { colorScheme: window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light' }\n },\n dispose: () => { observer.disconnect() },\n }\n}\n","/** Xingce brand occupants and standalone root failure presentation. */\nimport type { Context as ClientContext } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-renderer/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-sidebar/client'\nimport { createElement } from 'react'\nimport { XingceBrandMark, XingceBrandName } from './Brand.tsx'\nimport { FailureViewBoundary, RendererFailureView } from './RendererFailureView.tsx'\nimport { observeFailureTheme } from './failure-theme.ts'\n\n/** Required services: UI composition and root failure presentation. */\nexport const inject = ['slots', 'uiRenderer']\n\n/**\n * Register standalone root recovery and the declaration-aware sidebar and hero brand set. The brand set installs\n * and rolls back atomically, so the mark, the name, and the hero mark always appear and leave together.\n * @param ctx - Client root context.\n */\nexport function apply(ctx: ClientContext): void {\n ctx.effect(() => {\n const theme = observeFailureTheme()\n const unregister = ctx.uiRenderer.registerFailureView(props => createElement(FailureViewBoundary, {\n children: createElement(RendererFailureView, { ...props, theme: theme.snapshot() }),\n }))\n return () => { unregister(); theme.dispose() }\n })\n ctx.slots.inject('sidebar.brand.mark', () =>\n ctx.slots.inject('sidebar.brand.name', () =>\n ctx.slots.inject('conversation.hero.brand.mark', function* () {\n yield ctx.slots.register({ name: 'sidebar.brand.mark' }, XingceBrandMark)\n yield ctx.slots.register({ name: 'sidebar.brand.name' }, XingceBrandName)\n yield ctx.slots.register({ name: 'conversation.hero.brand.mark' }, XingceBrandMark)\n })))\n}\n"],"mappings":";;;;;;;;;;;;;;EAOA,MAAM,YAAY;;EAGlB,MAAM,mBAAmB;;EAGzB,MAAM,uBAAuB;;EAG7B,MAAM,qBAAqB;;;;;;EAO3B,SAAgB,gBAAgB,EAAE,MAAM,aAAsC;GAC5E,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;IAAK,KAAK;IAAoB,OAAO;IAAM,QAAQ;IAAM,KAAI;IAAG,eAAY;IAAkB;GAAY,CAAA;EACnH;;;;;;EAOA,SAAgB,kBAAkB;GAChC,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,OAAM;IAAM,QAAO;IAAK,SAAQ;IAAe,MAAK;IAAO,eAAY;IAAO,WAAU;cAA7F;KACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAM,GAAG;MAAW,MAAK;KAAgB,CAAA;KACzC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAM,GAAG;MAAkB,MAAK;KAAgB,CAAA;KAChD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAM,GAAG;MAAsB,MAAK;KAA2C,CAAA;IAC5E;;EAET;;;;ECvCA,MAAa,KAAK;GAChB,OAAO;GACP,aAAa;GACb,QAAQ;GACR,QAAQ;GACR,OAAO;GACP,UAAU;GACV,YAAY;EACd;;EAGA,MAAa,KAAK;GAChB,OAAO;GACP,aAAa;GACb,QAAQ;GACR,QAAQ;GACR,OAAO;GACP,UAAU;GACV,YAAY;EACd;;;;;;EAOA,SAAgB,YAAY,UAA6B;GACvD,OAAO,SAAS,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,OAAO,OAAO,KAAK;EAC9D;;;;;;;;;;;;;;;;;;;;;;;ECfA,IAAa,sBAAb,cAAyCA,MAAAA,UAAwD;GAC/F,QAAiB,EAAE,QAAQ,MAAM;GACjC,OAAO,2BAAgD;IAAE,OAAO,EAAE,QAAQ,KAAK;GAAE;GACjF,SAA6B;IAC3B,MAAM,OAAO,YAAY,SAAS,gBAAgB,IAAI;IACtD,OAAO,KAAK,MAAM,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;KAAG,MAAK;eAAS,KAAK;IAAc,CAAA,IAAI,KAAK,MAAM;GAChF;EACF;;;;;;EAOA,SAAgB,oBAAoB,OAA8D;GAChG,MAAM,OAAO,YAAY,SAAS,gBAAgB,IAAI;GACtD,MAAM,UAAW,OAA4D;GAC7E,MAAM,CAAC,QAAQ,cAAA,GAAA,MAAA,SAAA,CAAoC,QAAQ;GAC3D,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,SAAS,0BAA0B,KAAA,GAAW;IAClD,QAAa,sBAAsB;KACjC,MAAM,MAAM,MAAM;KAAM,SAAS,MAAM,MAAM;KAAS,OAAO,MAAM,MAAM,SAAS;KAAI,gBAAgB,MAAM;IAC9G,CAAC,CAAC,CAAC,MAAK,WAAU;KAAE,UAAU,OAAO,WAAW,YAAY,UAAU,UAAU;IAAE,SAAS;KAAE,UAAU,UAAU;IAAE,CAAC;GACtH,GAAG;IAAC;IAAS,MAAM;IAAO,MAAM;GAAc,CAAC;GAC/C,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;IAAM,WAAWC,oCAAO;IAAS,OAAO,MAAM;cAC5C,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;KAAS,WAAWA,oCAAO;eAA3B;MACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;OAAI,WAAWA,oCAAO;iBAAa,KAAK;MAAU,CAAA;MAClD,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,WAAWA,oCAAO;iBAAiB,KAAK;MAAe,CAAA;MACzD,SAAS,0BAA0B,KAAA,KAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,WAAWA,oCAAO;OAAW,MAAK;iBAAU,KAAK;MAAW,CAAA;MAChH,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,WAAWA,oCAAO;OAAW,MAAK;OAAS,SAAS,MAAM;iBAAS,KAAK;MAAe,CAAA;KACxF;;GACL,CAAA;EAEV;;;;;;;;ECtCA,SAAgB,sBAA6E;GAC3F,IAAI;GACJ,MAAM,gBAAsB;IAC1B,IAAI,CAAC,SAAS,gBAAgB,aAAa,sBAAsB,GAAG;IACpE,MAAM,SAAS,iBAAiB,SAAS,IAAI;IAC7C,SAAS;KACP,aAAa,SAAS,KAAK,aAAa,oBAAoB,IAAI,SAAS;KACzE,iCAAiC,OAAO,iBAAiB,qBAAqB;KAC9E,8BAA8B,OAAO,iBAAiB,2BAA2B;KACjF,gCAAgC,OAAO,iBAAiB,6BAA6B;KACrF,kCAAkC,OAAO,iBAAiB,iCAAiC;KAC3F,mCAAmC,OAAO,iBAAiB,sCAAsC;KACjG,mCAAmC,OAAO,iBAAiB,kCAAkC;IAC/F;GACF;GACA,QAAQ;GACR,MAAM,WAAW,IAAI,iBAAiB,OAAO;GAC7C,SAAS,QAAQ,SAAS,iBAAiB;IAAE,YAAY;IAAM,iBAAiB,CAAC,sBAAsB;GAAE,CAAC;GAC1G,SAAS,QAAQ,SAAS,MAAM;IAAE,YAAY;IAAM,iBAAiB,CAAC,sBAAsB,OAAO;GAAE,CAAC;GACtG,OAAO;IACL,gBAAgB;KACd,OAAO,UAAU,EAAE,aAAa,OAAO,WAAW,8BAA8B,CAAC,CAAC,UAAU,SAAS,QAAQ;IAC/G;IACA,eAAe;KAAE,SAAS,WAAW;IAAE;GACzC;EACF;;;;ECxBA,MAAa,SAAS,CAAC,SAAS,YAAY;;;;;;EAO5C,SAAgB,MAAM,KAA0B;GAC9C,IAAI,aAAa;IACf,MAAM,QAAQ,oBAAoB;IAClC,MAAM,aAAa,IAAI,WAAW,qBAAoB,WAAA,GAAA,MAAA,cAAA,CAAuB,qBAAqB,EAChG,WAAA,GAAA,MAAA,cAAA,CAAwB,qBAAqB;KAAE,GAAG;KAAO,OAAO,MAAM,SAAS;IAAE,CAAC,EACpF,CAAC,CAAC;IACF,aAAa;KAAE,WAAW;KAAG,MAAM,QAAQ;IAAE;GAC/C,CAAC;GACD,IAAI,MAAM,OAAO,4BACf,IAAI,MAAM,OAAO,4BACf,IAAI,MAAM,OAAO,gCAAgC,aAAa;IAC5D,MAAM,IAAI,MAAM,SAAS,EAAE,MAAM,qBAAqB,GAAG,eAAe;IACxE,MAAM,IAAI,MAAM,SAAS,EAAE,MAAM,qBAAqB,GAAG,eAAe;IACxE,MAAM,IAAI,MAAM,SAAS,EAAE,MAAM,+BAA+B,GAAG,eAAe;GACpF,CAAC,CAAC,CAAC;EACT"}
@@ -0,0 +1,26 @@
1
+ /** Root failure presentation independent of slots, sessions, and application providers. */
2
+ import { Component, type ReactNode } from 'react';
3
+ import type { FailureViewProps } from '@deepseek-ai/dsh-client-ui-renderer/client';
4
+ import type { FailureTheme } from './failure-theme.ts';
5
+ /** Last rendering attempt for a failed product view; it has no recovery subtree. */
6
+ export declare class FailureViewBoundary extends Component<{
7
+ children: ReactNode;
8
+ }, {
9
+ failed: boolean;
10
+ }> {
11
+ state: {
12
+ failed: boolean;
13
+ };
14
+ static getDerivedStateFromError(): {
15
+ failed: boolean;
16
+ };
17
+ render(): ReactNode;
18
+ }
19
+ /**
20
+ * Present the page-only recovery action in the document language.
21
+ * @param props - Root error details, retained theme colors, and the renderer-owned reload action.
22
+ * @returns Standalone failure page.
23
+ */
24
+ export declare function RendererFailureView(props: FailureViewProps & {
25
+ theme: FailureTheme;
26
+ }): ReactNode;
@@ -0,0 +1,14 @@
1
+ /** Retains document colors for recovery after the layout retracts its theme presentation. */
2
+ /** Captured colors scoped to the failure page; missing colors use the system palette. */
3
+ export type FailureTheme = {
4
+ colorScheme: 'light' | 'dark';
5
+ } & Record<`--ui-brand-failure-${string}`, string>;
6
+ /**
7
+ * Observe theme presentation for one product plugin lifetime.
8
+ * Removing the source marker retains the last colors instead of capturing teardown's light palette.
9
+ * @returns Snapshot reader and observer disposer; before any theme is recorded, the reader uses the system scheme.
10
+ */
11
+ export declare function observeFailureTheme(): {
12
+ snapshot: () => FailureTheme;
13
+ dispose: () => void;
14
+ };
@@ -1,9 +1,9 @@
1
- /** Xingce brand occupants for the generic browser-brand slots. */
1
+ /** Xingce brand occupants and standalone root failure presentation. */
2
2
  import type { Context as ClientContext } from '@deepseek-ai/cordis';
3
- /** Required service: the UI slot registry. */
3
+ /** Required services: UI composition and root failure presentation. */
4
4
  export declare const inject: string[];
5
5
  /**
6
- * Fill the sidebar and hero brand slots as one declaration-aware registration set. The set installs
6
+ * Register standalone root recovery and the declaration-aware sidebar and hero brand set. The brand set installs
7
7
  * and rolls back atomically, so the mark, the name, and the hero mark always appear and leave together.
8
8
  * @param ctx - Client root context.
9
9
  */
@@ -0,0 +1,26 @@
1
+ /** Context-free failure copy keyed by the document language. */
2
+ export declare const zh: {
3
+ title: string;
4
+ description: string;
5
+ reload: string;
6
+ saving: string;
7
+ saved: string;
8
+ notSaved: string;
9
+ failedView: string;
10
+ };
11
+ /** English copy covers the same keys and all other document languages. */
12
+ export declare const en: {
13
+ title: string;
14
+ description: string;
15
+ reload: string;
16
+ saving: string;
17
+ saved: string;
18
+ notSaved: string;
19
+ failedView: string;
20
+ };
21
+ /**
22
+ * Select standalone failure copy from the document language.
23
+ * @param language - Document language tag; Chinese variants select Chinese.
24
+ * @returns Chinese copy for Chinese tags, otherwise English copy.
25
+ */
26
+ export declare function failureCopy(language: string): typeof en;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gestaltrun/dsh-ui-brand",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Xingce (行策) brand occupants for the sidebar brand row and the conversation hero brand slot",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
@@ -44,25 +44,26 @@
44
44
  }
45
45
  },
46
46
  "peerDependencies": {
47
- "@deepseek-ai/cordis": "4.0.5-alpha.1",
47
+ "@deepseek-ai/cordis": "4.0.6-alpha.1",
48
48
  "react": "18.3.1",
49
49
  "react-dom": "18.3.1"
50
50
  },
51
51
  "devDependencies": {
52
- "@deepseek-ai/cordis": "4.0.5-alpha.1",
53
- "@deepseek-ai/cordis-plugin-include": "1.0.10-alpha.1",
54
- "@deepseek-ai/cordis-plugin-loader": "1.0.6-alpha.1",
55
- "@deepseek-ai/dsh-client-ui-conversation": "0.2.1-alpha.3",
56
- "@deepseek-ai/dsh-client-ui-renderer": "0.2.1-alpha.3",
57
- "@deepseek-ai/dsh-client-ui-sidebar": "0.2.1-alpha.3",
58
- "@deepseek-ai/dsh-client-ui-slots": "0.2.1-alpha.3",
52
+ "@deepseek-ai/cordis": "4.0.6-alpha.1",
53
+ "@deepseek-ai/cordis-plugin-include": "1.0.11-alpha.1",
54
+ "@deepseek-ai/cordis-plugin-loader": "1.0.7-alpha.1",
55
+ "@deepseek-ai/dsh-client-ui-conversation": "0.2.2-alpha.2",
56
+ "@deepseek-ai/dsh-client-ui-renderer": "0.2.2-alpha.2",
57
+ "@deepseek-ai/dsh-client-ui-sidebar": "0.2.2-alpha.2",
58
+ "@deepseek-ai/dsh-client-ui-slots": "0.2.2-alpha.2",
59
59
  "@testing-library/dom": "10.4.1",
60
60
  "@testing-library/react": "16.3.2",
61
61
  "@types/node": "22.20.0",
62
62
  "@types/react": "18.3.31",
63
63
  "@types/react-dom": "18.3.7",
64
- "js-yaml": "4.2.0",
64
+ "js-yaml": "4.3.2",
65
65
  "jsdom": "26.0.0",
66
+ "lightningcss": "1.32.0",
66
67
  "react": "18.3.1",
67
68
  "react-dom": "18.3.1",
68
69
  "tsdown": "0.22.2",