@pactor-app/ui 1.22.0 → 1.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -13240,6 +13240,10 @@ function ChatPage({
13240
13240
  conversationTitle,
13241
13241
  conversationHeaderAction,
13242
13242
  onConversationHeaderAction,
13243
+ conversationRailItems = [],
13244
+ hideArtifactRailItem = false,
13245
+ activeConversationRailKey,
13246
+ onConversationRailChange,
13243
13247
  messages = [],
13244
13248
  sending,
13245
13249
  composerPlaceholder,
@@ -13280,6 +13284,51 @@ function ChatPage({
13280
13284
  if (!controlled) setInnerOpen(next);
13281
13285
  onArtifactOpenChange?.(next);
13282
13286
  };
13287
+ const railControlled = activeConversationRailKey !== void 0;
13288
+ const [activeRailInner, setActiveRailInner] = (0, import_react67.useState)(null);
13289
+ const activeRailKey = railControlled ? activeConversationRailKey : activeRailInner;
13290
+ const setActiveRailKey = (next) => {
13291
+ if (!railControlled) setActiveRailInner(next);
13292
+ onConversationRailChange?.(next);
13293
+ };
13294
+ const visibleRailItems = conversationRailItems.filter((item) => item.hidden !== true);
13295
+ const activeRailItem = visibleRailItems.find(
13296
+ (item) => item.key === activeRailKey
13297
+ );
13298
+ const activePanelItem = activeRailItem?.display === "panel" && activeRailItem.content !== void 0 ? activeRailItem : void 0;
13299
+ const activePopoverItem = activeRailItem !== void 0 && activeRailItem.display !== "panel" && activeRailItem.content !== void 0 ? activeRailItem : void 0;
13300
+ const toggleRailItem = (item) => {
13301
+ const next = activeRailKey === item.key ? null : item.key;
13302
+ if (next !== null && item.display === "panel") {
13303
+ setOpen(false);
13304
+ }
13305
+ setActiveRailKey(next);
13306
+ };
13307
+ const toggleArtifact = () => {
13308
+ if (!open && activePanelItem) {
13309
+ setActiveRailKey(null);
13310
+ }
13311
+ setOpen(!open);
13312
+ };
13313
+ (0, import_react67.useEffect)(() => {
13314
+ if (!activePopoverItem) return;
13315
+ const onKeyDown = (event) => {
13316
+ if (event.key === "Escape") setActiveRailKey(null);
13317
+ };
13318
+ const onPointerDown = (event) => {
13319
+ const target = event.target;
13320
+ if (target.closest("[data-slot=chat-page-rail-popover]") || target.closest("[data-slot=chat-page-conv-rail]")) {
13321
+ return;
13322
+ }
13323
+ setActiveRailKey(null);
13324
+ };
13325
+ document.addEventListener("keydown", onKeyDown);
13326
+ document.addEventListener("mousedown", onPointerDown);
13327
+ return () => {
13328
+ document.removeEventListener("keydown", onKeyDown);
13329
+ document.removeEventListener("mousedown", onPointerDown);
13330
+ };
13331
+ });
13283
13332
  const { renderChildren } = (0, import_runtime26.useRenderer)();
13284
13333
  const renderSlot = (slot) => (0, import_react67.isValidElement)(slot) || typeof slot !== "object" || slot === null ? slot : renderChildren([slot]);
13285
13334
  const convCollControlled = conversationSectionCollapsed !== void 0;
@@ -13311,10 +13360,58 @@ function ChatPage({
13311
13360
  onClick: () => onMenuSelect?.(item.key)
13312
13361
  }
13313
13362
  ) }, item.key);
13363
+ const convRailButton = (item, active, onClick) => {
13364
+ const button = /* @__PURE__ */ (0, import_jsx_runtime185.jsx)(
13365
+ Button2,
13366
+ {
13367
+ icon: item.icon,
13368
+ variant: "text",
13369
+ className: cn(active ? "bg-accent text-accent-foreground" : void 0, "px-2"),
13370
+ onClick
13371
+ }
13372
+ );
13373
+ return item.label !== void 0 ? /* @__PURE__ */ (0, import_jsx_runtime185.jsx)(Tooltip2, { content: item.label, side: "left", children: button }, item.key) : /* @__PURE__ */ (0, import_jsx_runtime185.jsx)("span", { children: button }, item.key);
13374
+ };
13375
+ const convRailVisible = !hideArtifactRailItem || visibleRailItems.length > 0;
13376
+ const convRail = convRailVisible ? /* @__PURE__ */ (0, import_jsx_runtime185.jsxs)(
13377
+ "div",
13378
+ {
13379
+ "data-slot": "chat-page-conv-rail",
13380
+ className: "relative flex w-(--pactor-chat-rail-width) shrink-0 flex-col items-center gap-1 px-1 py-2",
13381
+ children: [
13382
+ !hideArtifactRailItem ? convRailButton(
13383
+ {
13384
+ key: "artifact",
13385
+ icon: open ? "panel-right-close" : "package",
13386
+ label: open ? "\u6536\u8D77\u4EA7\u7269\u533A" : artifactTitle
13387
+ },
13388
+ open,
13389
+ toggleArtifact
13390
+ ) : null,
13391
+ visibleRailItems.map(
13392
+ (item) => convRailButton(item, activeRailKey === item.key, () => toggleRailItem(item))
13393
+ ),
13394
+ activePopoverItem ? /* @__PURE__ */ (0, import_jsx_runtime185.jsx)(
13395
+ "div",
13396
+ {
13397
+ "data-slot": "chat-page-rail-popover",
13398
+ className: "absolute right-full top-0 z-10 mr-2 overflow-auto rounded-lg border border-border bg-popover shadow-md",
13399
+ style: {
13400
+ width: "var(--pactor-chat-rail-popover-width)",
13401
+ maxWidth: "calc(100cqw - 2rem)",
13402
+ maxHeight: "calc(100% - 1rem)"
13403
+ },
13404
+ children: renderSlot(activePopoverItem.content)
13405
+ }
13406
+ ) : null
13407
+ ]
13408
+ }
13409
+ ) : null;
13314
13410
  const chatArea = /* @__PURE__ */ (0, import_jsx_runtime185.jsxs)("div", { "data-slot": "chat-page-conversation", className: "flex h-full min-w-0 flex-1 flex-col", children: [
13315
13411
  /* @__PURE__ */ (0, import_jsx_runtime185.jsxs)(
13316
13412
  "div",
13317
13413
  {
13414
+ "data-slot": "chat-page-conversation-header",
13318
13415
  className: "flex shrink-0 items-center justify-between border-b border-border px-4 py-2.5",
13319
13416
  children: [
13320
13417
  /* @__PURE__ */ (0, import_jsx_runtime185.jsx)(Text, { text: conversationTitle, strong: true }),
@@ -13326,66 +13423,62 @@ function ChatPage({
13326
13423
  variant: "text",
13327
13424
  onClick: () => onConversationHeaderAction?.()
13328
13425
  }
13329
- ) }) : /* @__PURE__ */ (0, import_jsx_runtime185.jsx)(Tooltip2, { content: open ? "\u6536\u8D77\u4EA7\u7269\u533A" : artifactTitle, side: "bottom", children: /* @__PURE__ */ (0, import_jsx_runtime185.jsx)(
13330
- Button2,
13331
- {
13332
- icon: open ? "panel-right-close" : "panel-right-open",
13333
- variant: "text",
13334
- onClick: () => setOpen(!open)
13335
- }
13336
- ) })
13426
+ ) }) : null
13337
13427
  ]
13338
13428
  }
13339
13429
  ),
13340
- /* @__PURE__ */ (0, import_jsx_runtime185.jsxs)(
13341
- "div",
13342
- {
13343
- "data-slot": "chat-page-conversation-body",
13344
- className: "mx-auto flex min-h-0 w-[61.8cqw] max-w-full flex-1 flex-col",
13345
- children: [
13346
- messages.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime185.jsx)(
13347
- Welcome,
13348
- {
13349
- title: welcome?.title,
13350
- description: welcome?.description,
13351
- prompts: welcome?.prompts,
13352
- style: { flex: 1 },
13353
- onSelect: (value) => onSend?.(value)
13354
- }
13355
- ) : /* @__PURE__ */ (0, import_jsx_runtime185.jsx)(
13356
- MessageList,
13357
- {
13358
- messages,
13359
- className: "scrollbar-subtle",
13360
- style: { flex: 1, minHeight: 0, padding: 16 },
13361
- onAction: onMessageAction,
13362
- onOpenArtifacts: () => setOpen(true)
13363
- }
13364
- ),
13365
- /* @__PURE__ */ (0, import_jsx_runtime185.jsx)(
13366
- Composer,
13367
- {
13368
- placeholder: composerPlaceholder,
13369
- loading: sending,
13370
- models,
13371
- model,
13372
- contexts,
13373
- contextItems,
13374
- attachments,
13375
- footer: composerFooter,
13376
- style: { padding: 16, paddingBottom: composerBottom ? 8 : 16, flexShrink: 0 },
13377
- onModelChange,
13378
- onContextItemsChange,
13379
- onAttachFiles,
13380
- onRemoveAttachment,
13381
- onRetryAttachment,
13382
- onSubmit: (text) => onSend?.(text)
13383
- }
13384
- ),
13385
- composerBottom ? /* @__PURE__ */ (0, import_jsx_runtime185.jsx)("div", { "data-slot": "chat-page-composer-bottom", className: "shrink-0 px-4 pb-2 text-center", children: renderSlot(composerBottom) }) : null
13386
- ]
13387
- }
13388
- )
13430
+ /* @__PURE__ */ (0, import_jsx_runtime185.jsxs)("div", { className: "flex min-h-0 flex-1", children: [
13431
+ /* @__PURE__ */ (0, import_jsx_runtime185.jsxs)(
13432
+ "div",
13433
+ {
13434
+ "data-slot": "chat-page-conversation-body",
13435
+ className: "mx-auto flex min-h-0 w-[61.8cqw] max-w-full flex-col",
13436
+ children: [
13437
+ messages.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime185.jsx)(
13438
+ Welcome,
13439
+ {
13440
+ title: welcome?.title,
13441
+ description: welcome?.description,
13442
+ prompts: welcome?.prompts,
13443
+ style: { flex: 1 },
13444
+ onSelect: (value) => onSend?.(value)
13445
+ }
13446
+ ) : /* @__PURE__ */ (0, import_jsx_runtime185.jsx)(
13447
+ MessageList,
13448
+ {
13449
+ messages,
13450
+ className: "scrollbar-subtle",
13451
+ style: { flex: 1, minHeight: 0, padding: 16 },
13452
+ onAction: onMessageAction,
13453
+ onOpenArtifacts: () => setOpen(true)
13454
+ }
13455
+ ),
13456
+ /* @__PURE__ */ (0, import_jsx_runtime185.jsx)(
13457
+ Composer,
13458
+ {
13459
+ placeholder: composerPlaceholder,
13460
+ loading: sending,
13461
+ models,
13462
+ model,
13463
+ contexts,
13464
+ contextItems,
13465
+ attachments,
13466
+ footer: composerFooter,
13467
+ style: { padding: 16, paddingBottom: composerBottom ? 8 : 16, flexShrink: 0 },
13468
+ onModelChange,
13469
+ onContextItemsChange,
13470
+ onAttachFiles,
13471
+ onRemoveAttachment,
13472
+ onRetryAttachment,
13473
+ onSubmit: (text) => onSend?.(text)
13474
+ }
13475
+ ),
13476
+ composerBottom ? /* @__PURE__ */ (0, import_jsx_runtime185.jsx)("div", { "data-slot": "chat-page-composer-bottom", className: "shrink-0 px-4 pb-2 text-center", children: renderSlot(composerBottom) }) : null
13477
+ ]
13478
+ }
13479
+ ),
13480
+ convRail
13481
+ ] })
13389
13482
  ] });
13390
13483
  const activeArtifact = artifacts.find((item) => item.id === activeArtifactId) ?? (activeArtifactId === void 0 || activeArtifactId === "" ? artifacts[artifacts.length - 1] : void 0);
13391
13484
  const artifactPanel = /* @__PURE__ */ (0, import_jsx_runtime185.jsx)(
@@ -13517,10 +13610,17 @@ function ChatPage({
13517
13610
  ]
13518
13611
  }
13519
13612
  ),
13520
- /* @__PURE__ */ (0, import_jsx_runtime185.jsx)("div", { className: "@container h-full min-w-0 flex-1", children: open ? /* @__PURE__ */ (0, import_jsx_runtime185.jsxs)(PanelGroup, { orientation: "horizontal", style: { width: "100%", height: "100%" }, children: [
13613
+ /* @__PURE__ */ (0, import_jsx_runtime185.jsx)("div", { className: "@container h-full min-w-0 flex-1", children: open || activePanelItem ? /* @__PURE__ */ (0, import_jsx_runtime185.jsxs)(PanelGroup, { orientation: "horizontal", style: { width: "100%", height: "100%" }, children: [
13521
13614
  /* @__PURE__ */ (0, import_jsx_runtime185.jsx)(Panel, { defaultSize: "62%", children: chatArea }),
13522
13615
  /* @__PURE__ */ (0, import_jsx_runtime185.jsx)(ResizableHandle, { withHandle: true }),
13523
- /* @__PURE__ */ (0, import_jsx_runtime185.jsx)(Panel, { defaultSize: "38%", minSize: "380px", maxSize: "760px", children: artifactPanel })
13616
+ /* @__PURE__ */ (0, import_jsx_runtime185.jsx)(Panel, { defaultSize: "38%", minSize: "380px", maxSize: "760px", children: activePanelItem ? /* @__PURE__ */ (0, import_jsx_runtime185.jsx)(
13617
+ "div",
13618
+ {
13619
+ "data-slot": "chat-page-rail-panel",
13620
+ className: "flex h-full min-w-0 flex-col border-l border-border bg-muted",
13621
+ children: renderSlot(activePanelItem.content)
13622
+ }
13623
+ ) : artifactPanel })
13524
13624
  ] }) : chatArea })
13525
13625
  ]
13526
13626
  }
@@ -13660,10 +13760,10 @@ function EChartBase({
13660
13760
  dataIndex: params.dataIndex
13661
13761
  });
13662
13762
  });
13663
- const observer = new ResizeObserver(() => chart?.resize());
13664
- observer.observe(host);
13763
+ const observer2 = new ResizeObserver(() => chart?.resize());
13764
+ observer2.observe(host);
13665
13765
  return () => {
13666
- observer.disconnect();
13766
+ observer2.disconnect();
13667
13767
  chart?.dispose();
13668
13768
  chartRef.current = null;
13669
13769
  };
@@ -14124,6 +14224,9 @@ function buildComposedOption(input, theme) {
14124
14224
  };
14125
14225
  }
14126
14226
 
14227
+ // src/components/chart/lib/use-chart-theme.ts
14228
+ var import_react69 = require("react");
14229
+
14127
14230
  // src/components/chart/lib/color.ts
14128
14231
  var LPAREN = String.fromCharCode(40);
14129
14232
  var RPAREN = String.fromCharCode(41);
@@ -14220,6 +14323,64 @@ function getChartTheme() {
14220
14323
  return FALLBACK_THEME;
14221
14324
  }
14222
14325
  }
14326
+ function resetChartTheme() {
14327
+ cached = null;
14328
+ }
14329
+ var CHART_SKIN_CHANGE_EVENT = "pactor:skin-change";
14330
+ var listeners = /* @__PURE__ */ new Set();
14331
+ var observer = null;
14332
+ var scheduled = false;
14333
+ function scheduleNotify() {
14334
+ if (scheduled) return;
14335
+ scheduled = true;
14336
+ const enqueue = typeof requestAnimationFrame === "function" ? requestAnimationFrame : (cb) => setTimeout(cb, 0);
14337
+ enqueue(() => {
14338
+ scheduled = false;
14339
+ resetChartTheme();
14340
+ for (const listener of [...listeners]) {
14341
+ listener();
14342
+ }
14343
+ });
14344
+ }
14345
+ function handleResourceLoad(event) {
14346
+ const target = event.target;
14347
+ if (target instanceof HTMLLinkElement || target instanceof HTMLStyleElement) {
14348
+ scheduleNotify();
14349
+ }
14350
+ }
14351
+ function subscribeChartTheme(listener) {
14352
+ if (typeof document === "undefined" || typeof MutationObserver === "undefined") {
14353
+ return () => {
14354
+ };
14355
+ }
14356
+ listeners.add(listener);
14357
+ if (!observer) {
14358
+ observer = new MutationObserver(scheduleNotify);
14359
+ observer.observe(document.documentElement, { attributes: true });
14360
+ observer.observe(document.head, {
14361
+ attributes: true,
14362
+ childList: true,
14363
+ characterData: true,
14364
+ subtree: true
14365
+ });
14366
+ document.addEventListener("load", handleResourceLoad, true);
14367
+ window.addEventListener(CHART_SKIN_CHANGE_EVENT, scheduleNotify);
14368
+ }
14369
+ return () => {
14370
+ listeners.delete(listener);
14371
+ if (listeners.size === 0 && observer) {
14372
+ observer.disconnect();
14373
+ observer = null;
14374
+ document.removeEventListener("load", handleResourceLoad, true);
14375
+ window.removeEventListener(CHART_SKIN_CHANGE_EVENT, scheduleNotify);
14376
+ }
14377
+ };
14378
+ }
14379
+
14380
+ // src/components/chart/lib/use-chart-theme.ts
14381
+ function useChartTheme() {
14382
+ return (0, import_react69.useSyncExternalStore)(subscribeChartTheme, getChartTheme, getChartTheme);
14383
+ }
14223
14384
 
14224
14385
  // src/components/chart/AreaChart/index.tsx
14225
14386
  var import_jsx_runtime189 = require("react/jsx-runtime");
@@ -14238,7 +14399,7 @@ function AreaChart({
14238
14399
  }) {
14239
14400
  const option = buildAreaOption(
14240
14401
  { data, xKey, yKeys, stacked, fillOpacity, colors, title },
14241
- getChartTheme()
14402
+ useChartTheme()
14242
14403
  );
14243
14404
  return /* @__PURE__ */ (0, import_jsx_runtime189.jsx)(
14244
14405
  EChartBase,
@@ -14269,7 +14430,7 @@ function BarChart2({
14269
14430
  }) {
14270
14431
  const option = buildBarOption(
14271
14432
  { data, yKey, yKeys: xKeys, stacked, colors, title },
14272
- getChartTheme()
14433
+ useChartTheme()
14273
14434
  );
14274
14435
  return /* @__PURE__ */ (0, import_jsx_runtime190.jsx)(
14275
14436
  EChartBase,
@@ -14301,7 +14462,7 @@ function BubbleChart({
14301
14462
  }) {
14302
14463
  const option = buildBubbleOption(
14303
14464
  { data, xKey, yKey, sizeKey, seriesKey, colors, title },
14304
- getChartTheme()
14465
+ useChartTheme()
14305
14466
  );
14306
14467
  return /* @__PURE__ */ (0, import_jsx_runtime191.jsx)(
14307
14468
  EChartBase,
@@ -14332,7 +14493,7 @@ function ColumnChart({
14332
14493
  }) {
14333
14494
  const option = buildColumnOption(
14334
14495
  { data, xKey, yKeys, stacked, colors, title },
14335
- getChartTheme()
14496
+ useChartTheme()
14336
14497
  );
14337
14498
  return /* @__PURE__ */ (0, import_jsx_runtime192.jsx)(
14338
14499
  EChartBase,
@@ -14362,7 +14523,7 @@ function ComposedChart({
14362
14523
  }) {
14363
14524
  const option = buildComposedOption(
14364
14525
  { data, xKey, series, colors, title },
14365
- getChartTheme()
14526
+ useChartTheme()
14366
14527
  );
14367
14528
  return /* @__PURE__ */ (0, import_jsx_runtime193.jsx)(
14368
14529
  EChartBase,
@@ -14408,7 +14569,7 @@ function DonutChart({
14408
14569
  colors,
14409
14570
  title
14410
14571
  },
14411
- getChartTheme()
14572
+ useChartTheme()
14412
14573
  );
14413
14574
  return /* @__PURE__ */ (0, import_jsx_runtime194.jsx)(
14414
14575
  EChartBase,
@@ -14439,7 +14600,7 @@ function FunnelChart2({
14439
14600
  }) {
14440
14601
  const option = buildFunnelOption(
14441
14602
  { data, nameKey, valueKey, sort, colors, title },
14442
- getChartTheme()
14603
+ useChartTheme()
14443
14604
  );
14444
14605
  return /* @__PURE__ */ (0, import_jsx_runtime195.jsx)(
14445
14606
  EChartBase,
@@ -14470,7 +14631,7 @@ function GaugeChart2({
14470
14631
  }) {
14471
14632
  const option = buildGaugeOption(
14472
14633
  { value, min, max, thresholds, unit, title },
14473
- getChartTheme()
14634
+ useChartTheme()
14474
14635
  );
14475
14636
  return /* @__PURE__ */ (0, import_jsx_runtime196.jsx)(
14476
14637
  EChartBase,
@@ -14500,7 +14661,7 @@ function Heatmap({
14500
14661
  }) {
14501
14662
  const option = buildHeatmapOption(
14502
14663
  { data, xKey, yKey, valueKey, title },
14503
- getChartTheme()
14664
+ useChartTheme()
14504
14665
  );
14505
14666
  return /* @__PURE__ */ (0, import_jsx_runtime197.jsx)(
14506
14667
  EChartBase,
@@ -14533,7 +14694,7 @@ function LineChart2({
14533
14694
  }) {
14534
14695
  const option = buildLineOption(
14535
14696
  { data, xKey, yKeys, smooth, showArea, stacked, colors, title },
14536
- getChartTheme()
14697
+ useChartTheme()
14537
14698
  );
14538
14699
  return /* @__PURE__ */ (0, import_jsx_runtime198.jsx)(
14539
14700
  EChartBase,
@@ -14549,7 +14710,7 @@ function LineChart2({
14549
14710
  }
14550
14711
 
14551
14712
  // src/components/chart/MapChart/index.tsx
14552
- var import_react69 = require("react");
14713
+ var import_react70 = require("react");
14553
14714
  var import_jsx_runtime199 = require("react/jsx-runtime");
14554
14715
  var fetchedMaps = /* @__PURE__ */ new Set();
14555
14716
  function hasRegisteredMap(mapName) {
@@ -14572,7 +14733,8 @@ function MapChart2({
14572
14733
  className,
14573
14734
  style
14574
14735
  }) {
14575
- const [loadState, setLoadState] = (0, import_react69.useState)(
14736
+ const theme = useChartTheme();
14737
+ const [loadState, setLoadState] = (0, import_react70.useState)(
14576
14738
  () => geoJson || !geoJsonUrl || hasRegisteredMap(mapName) ? "idle" : "loading"
14577
14739
  );
14578
14740
  if (geoJson) {
@@ -14581,7 +14743,7 @@ function MapChart2({
14581
14743
  } catch {
14582
14744
  }
14583
14745
  }
14584
- (0, import_react69.useEffect)(() => {
14746
+ (0, import_react70.useEffect)(() => {
14585
14747
  if (geoJson || !geoJsonUrl || hasRegisteredMap(mapName) || fetchedMaps.has(mapName)) {
14586
14748
  setLoadState("idle");
14587
14749
  return;
@@ -14638,7 +14800,7 @@ function MapChart2({
14638
14800
  }
14639
14801
  );
14640
14802
  }
14641
- const option = buildMapOption({ mapName, data, nameKey, valueKey, title }, getChartTheme());
14803
+ const option = buildMapOption({ mapName, data, nameKey, valueKey, title }, theme);
14642
14804
  return /* @__PURE__ */ (0, import_jsx_runtime199.jsx)(
14643
14805
  EChartBase,
14644
14806
  {
@@ -14725,7 +14887,7 @@ function PieChart2({
14725
14887
  }) {
14726
14888
  const option = buildPieOption(
14727
14889
  { data, nameKey, valueKey, showLabel, colors, title },
14728
- getChartTheme()
14890
+ useChartTheme()
14729
14891
  );
14730
14892
  return /* @__PURE__ */ (0, import_jsx_runtime201.jsx)(
14731
14893
  EChartBase,
@@ -14755,7 +14917,7 @@ function RadarChart2({
14755
14917
  }) {
14756
14918
  const option = buildRadarOption(
14757
14919
  { data, indicatorKey, yKeys, colors, title },
14758
- getChartTheme()
14920
+ useChartTheme()
14759
14921
  );
14760
14922
  return /* @__PURE__ */ (0, import_jsx_runtime202.jsx)(
14761
14923
  EChartBase,
@@ -14781,7 +14943,7 @@ function SankeyChart2({
14781
14943
  className,
14782
14944
  style
14783
14945
  }) {
14784
- const option = buildSankeyOption({ nodes, links, title }, getChartTheme());
14946
+ const option = buildSankeyOption({ nodes, links, title }, useChartTheme());
14785
14947
  return /* @__PURE__ */ (0, import_jsx_runtime203.jsx)(
14786
14948
  EChartBase,
14787
14949
  {
@@ -14811,7 +14973,7 @@ function ScatterChart2({
14811
14973
  }) {
14812
14974
  const option = buildScatterOption(
14813
14975
  { data, xKey, yKey, seriesKey, colors, title },
14814
- getChartTheme()
14976
+ useChartTheme()
14815
14977
  );
14816
14978
  return /* @__PURE__ */ (0, import_jsx_runtime204.jsx)(
14817
14979
  EChartBase,
@@ -14841,7 +15003,7 @@ function TreeChart2({
14841
15003
  }) {
14842
15004
  const option = buildTreeOption(
14843
15005
  { data, title, orient, edgeShape, initialTreeDepth },
14844
- getChartTheme()
15006
+ useChartTheme()
14845
15007
  );
14846
15008
  return /* @__PURE__ */ (0, import_jsx_runtime205.jsx)(
14847
15009
  EChartBase,
@@ -3381,6 +3381,20 @@ interface ChatPageMenuItem {
3381
3381
  /** 图标名(Icon 白名单) */
3382
3382
  icon?: string;
3383
3383
  }
3384
+ /** 对话图标栏项:点击 toggle 展示当前对话的附加内容(产物 / 执行步骤等) */
3385
+ interface ConversationRailItem {
3386
+ key: string;
3387
+ /** 提示文案(hover tooltip) */
3388
+ label?: string;
3389
+ /** 图标名(Icon 白名单) */
3390
+ icon?: string;
3391
+ /** 呈现形态:popover(图标栏旁悬浮弹框,缺省)/ panel(产物栏式右侧固定宽栏) */
3392
+ display?: 'panel' | 'popover';
3393
+ /** 附加内容(React 元素或 DslNode;缺省时点击仅触发状态事件,不渲染内容层) */
3394
+ content?: DslNode | ReactNode;
3395
+ /** 隐藏该项(如按当前会话有无对应内容动态显隐);隐藏时激活态一并失效 */
3396
+ hidden?: boolean;
3397
+ }
3384
3398
  /** 品牌区(展开菜单区标题 / 版本) */
3385
3399
  interface ChatPageBrand {
3386
3400
  title: string;
@@ -3436,9 +3450,8 @@ interface ChatPageProps {
3436
3450
  /** 对话区头部标题(通常为当前会话标题) */
3437
3451
  conversationTitle?: string;
3438
3452
  /**
3439
- * 对话区头部右侧自定义操作(图标 + 提示);提供时替换缺省的产物区
3440
- * 开关钮,点击经 onConversationHeaderAction 传出(产物区开关可经
3441
- * 受控 artifactOpen + onArtifactOpenChange 自行接线)
3453
+ * 对话区头部右侧自定义操作(图标 + 提示);提供才渲染(未配置时
3454
+ * header 不渲染任何按钮),点击经 onConversationHeaderAction 传出
3442
3455
  */
3443
3456
  conversationHeaderAction?: {
3444
3457
  icon?: string;
@@ -3447,6 +3460,17 @@ interface ChatPageProps {
3447
3460
  };
3448
3461
  /** 对话区头部右侧自定义操作点击事件 */
3449
3462
  onConversationHeaderAction?: () => void;
3463
+ /**
3464
+ * 对话图标栏附加项(header 下方、对话区右缘纵向排列,产物内置项
3465
+ * 之后按序展示);点击 toggle 展示对应附加内容
3466
+ */
3467
+ conversationRailItems?: ConversationRailItem[];
3468
+ /** 隐藏图标栏内置产物入口(缺省 false:产物开关为图标栏首项) */
3469
+ hideArtifactRailItem?: boolean;
3470
+ /** 图标栏激活项 key(提供即受控,配合 onConversationRailChange 闭环;null 为全部收起) */
3471
+ activeConversationRailKey?: string | null;
3472
+ /** 图标栏激活项变化事件,传出 key 或 null */
3473
+ onConversationRailChange?: (key: string | null) => void;
3450
3474
  messages?: MessageListItem[];
3451
3475
  /** 发送中(禁用 Composer 发送钮,由调用方完成后复位) */
3452
3476
  sending?: boolean;
@@ -3526,13 +3550,16 @@ interface ChatPageProps {
3526
3550
  * 行内提及(contexts:输入触发符在光标处弹菜单,选中替换为行内提及块,
3527
3551
  * 退格整体删除;受控 contextItems)、附件
3528
3552
  * 入口(onAttachFiles + 受控 attachments)与 composerFooter /
3529
- * composerBottom 槽位)、最右产物区(ArtifactPanel:内建产物预览、
3553
+ * composerBottom 槽位)、对话图标栏(header 下方、对话区右缘纵向
3554
+ * 图标列:内置产物入口 + conversationRailItems 附加项,点击 toggle
3555
+ * 展示附加内容——popover 悬浮弹框或 panel 右侧分栏,与产物区互斥)、
3556
+ * 最右产物区(ArtifactPanel:内建产物预览、
3530
3557
  * 目录树与下载,可显隐;展示时经 Resizable 拖拽调节与对话区的宽度)。
3531
3558
  * 数据与行为全部经 props / events 进出,
3532
- * 本组件不持有业务状态(产物区开关与分区折叠缺省非受控,均可经
3533
- * 受控 prop + change 事件闭环)。
3559
+ * 本组件不持有业务状态(产物区开关、图标栏激活项与分区折叠缺省非受控,
3560
+ * 均可经受控 prop + change 事件闭环)。
3534
3561
  */
3535
- declare function ChatPage({ brand, menuItems, activeMenuKey, railItems, railFooterItems, menuAction, onMenuSelect, onMenuAction, conversationSectionTitle, conversationSectionCollapsed, defaultConversationSectionCollapsed, onConversationSectionToggle, conversations, activeConversationId, onSelectConversation, onDeleteConversation, moreLabel, onMore, footerSectionTitle, footerItems, footerSectionCollapsed, defaultFooterSectionCollapsed, onFooterSectionToggle, conversationTitle, conversationHeaderAction, onConversationHeaderAction, messages, sending, composerPlaceholder, welcome, onSend, onMessageAction, models, model, onModelChange, contexts, contextItems, onContextItemsChange, attachments, onAttachFiles, onRemoveAttachment, onRetryAttachment, composerFooter, composerBottom, artifactTitle, artifacts, activeArtifactId, onSelectArtifact, artifactEmptyText, safeRegistry, user, artifactViewers, onDownloadArtifact, artifactOpen, defaultArtifactOpen, onArtifactOpenChange, className, style, }: ChatPageProps): React.JSX.Element;
3562
+ declare function ChatPage({ brand, menuItems, activeMenuKey, railItems, railFooterItems, menuAction, onMenuSelect, onMenuAction, conversationSectionTitle, conversationSectionCollapsed, defaultConversationSectionCollapsed, onConversationSectionToggle, conversations, activeConversationId, onSelectConversation, onDeleteConversation, moreLabel, onMore, footerSectionTitle, footerItems, footerSectionCollapsed, defaultFooterSectionCollapsed, onFooterSectionToggle, conversationTitle, conversationHeaderAction, onConversationHeaderAction, conversationRailItems, hideArtifactRailItem, activeConversationRailKey, onConversationRailChange, messages, sending, composerPlaceholder, welcome, onSend, onMessageAction, models, model, onModelChange, contexts, contextItems, onContextItemsChange, attachments, onAttachFiles, onRemoveAttachment, onRetryAttachment, composerFooter, composerBottom, artifactTitle, artifacts, activeArtifactId, onSelectArtifact, artifactEmptyText, safeRegistry, user, artifactViewers, onDownloadArtifact, artifactOpen, defaultArtifactOpen, onArtifactOpenChange, className, style, }: ChatPageProps): React.JSX.Element;
3536
3563
 
3537
3564
  /** 引用来源项 */
3538
3565
  interface CitationItem {
@@ -4444,4 +4471,4 @@ interface FormContextValue {
4444
4471
  /** 在字段组件内探测 Form 上下文;不在 Form 内时返回 null */
4445
4472
  declare function useFormContext(): FormContextValue | null;
4446
4473
 
4447
- export { Accordion, type AccordionItemData, type AccordionProps, Affix, type AffixProps, AgentStatus, type AgentStatusProps, type AgentStatusType, Alert, AlertDialog, type AlertDialogProps, type AlertProps, type AlertVariant, Anchor, type AnchorItemData, type AnchorProps, AreaChart, type AreaChartProps, ArtifactPanel, type ArtifactPanelProps, type ArtifactTreeNode, type ArtifactViewer, type ArtifactViewers, AspectRatio, type AspectRatioProps, Attachment, type AttachmentItemData, type AttachmentProps, Audio, type AudioProps, Avatar, type AvatarProps, BackTop, type BackTopProps, Badge, type BadgeProps, type BadgeVariant, BarChart, type BarChartProps, Breadcrumb, type BreadcrumbItemData, type BreadcrumbProps, Bubble, BubbleChart, type BubbleChartProps, type BubbleProps, type BubbleVariant, Button, ButtonGroup, type ButtonGroupProps, type ButtonProps, type ButtonSize, type ButtonVariant, Calendar, type CalendarProps, Card, type CardProps, Carousel, type CarouselImage, type CarouselItemData, type CarouselProps, Cascader, type CascaderOption, type CascaderProps, type ChartSelectPayload, ChatInput, type ChatInputProps, ChatMessage, type ChatMessageActionItem, type ChatMessageAgent, type ChatMessagePart, type ChatMessageProps, type ChatMessageStatus, ChatPage, type ChatPageArtifact, type ChatPageBrand, type ChatPageMenuItem, type ChatPageProps, Checkbox, type CheckboxProps, Citation, type CitationItem, type CitationProps, CodeBlock, type CodeBlockProps, Collapsible, type CollapsibleProps, ColorPicker, type ColorPickerProps, ColumnChart, type ColumnChartProps, Combobox, type ComboboxOption, type ComboboxProps, Command, type CommandGroupData, type CommandItemData, type CommandProps, ComposedChart, type ComposedChartProps, type ComposedSeriesItem, Composer, type ComposerContextItem, type ComposerContextSource, type ComposerModelOption, type ComposerProps, Container, type ContainerProps, type ContainerSize, Content, type ContentProps, ContextMenu, type ContextMenuItemData, type ContextMenuProps, type ConversationItemData, ConversationList, type ConversationListProps, DataTable, type DataTableColumn, type DataTablePagination, type DataTableProps, type DataTableSort, type DataTableSortOrder, DatePicker, type DatePickerPreset, type DatePickerPresetKey, type DatePickerProps, type DatePickerRangeProps, type DatePickerSingleProps, type DateRangeValue, Descriptions, type DescriptionsItemData, type DescriptionsProps, Dialog, type DialogProps, DiffViewer, type DiffViewerProps, type DocumentPageData, DocumentPreview, type DocumentPreviewProps, DonutChart, type DonutChartProps, Drawer, type DrawerPlacement, type DrawerProps, DropdownMenu, type DropdownMenuItemData, type DropdownMenuProps, EChartBase, type EChartBaseProps, Empty, type EmptyProps, Field, type FieldProps, type FieldRule, FilePreview, type FilePreviewKind, type FilePreviewProps, Flex, type FlexProps, Footer, type FooterProps, Form, type FormContextValue, type FormProps, FunnelChart, type FunnelChartProps, Gallery, type GalleryItemData, type GalleryProps, GaugeChart, type GaugeChartProps, Grid, type GridProps, Header, type HeaderBrandPosition, type HeaderDropdown, type HeaderDropdownItem, type HeaderLocale, type HeaderMenuItem, type HeaderProps, type HeaderTheme, type HeaderUser, type HeaderUserItem, Heatmap, type HeatmapProps, HoverCard, type HoverCardProps, ICONS, Icon, type IconProps, type IconSize, Image, ImageLightbox, type ImageLightboxProps, type ImageProps, ImageViewer, type ImageViewerProps, Input, InputGroup, type InputGroupProps, InputOTP, type InputOTPProps, type InputProps, Item, type ItemProps, JSONViewer, type JSONViewerProps, Kbd, type KbdProps, Label, type LabelProps, Layout, type LayoutProps, LineChart, type LineChartProps, Link, type LinkProps, List, type ListItemData, type ListProps, LoadingOverlay, type LoadingOverlayProps, MapChart, type MapChartProps, type MentionOption, Mentions, type MentionsProps, Menu, type MenuItem, type MenuProps, Menubar, type MenubarLeafItem, type MenubarMenuData, type MenubarProps, Message, MessageList, type MessageListItem, type MessageListProps, type MessageProps, MetricCard, type MetricCardProps, NavigationMenu, type NavigationMenuChildItem, type NavigationMenuItemData, type NavigationMenuProps, Notification, type NotificationProps, NumberInput, type NumberInputProps, Page, type PageProps, Pagination, type PaginationProps, PieChart, type PieChartProps, Popconfirm, type PopconfirmProps, Popover, type PopoverProps, Progress, type ProgressProps, Prompt, type PromptProps, QRCode, type QRCodeProps, RadarChart, type RadarChartProps, RadioGroup, type RadioGroupOption, type RadioGroupProps, RailTooltip, Rate, type RateProps, Resizable, type ResizablePanelData, type ResizableProps, Result, type ResultProps, type ResultStatus, RichText, type RichTextProps, SankeyChart, type SankeyChartProps, ScatterChart, type ScatterChartProps, ScrollArea, type ScrollAreaProps, Segmented, type SegmentedOption, type SegmentedProps, Select, type SelectOption, type SelectProps, Sender, type SenderProps, Separator, type SeparatorProps, Sheet, type SheetProps, type SheetSide, Sidebar, type SidebarBrand, type SidebarNavItem, type SidebarProps, Sider, type SiderProps, Skeleton, type SkeletonProps, type SkeletonShape, Slider, type SliderProps, Sonner, type SonnerProps, Space, type SpaceProps, Spinner, type SpinnerProps, type SpinnerSize, Statistic, type StatisticProps, Status, type StatusProps, type StatusType, type StepItemData, type StepStatus, Steps, type StepsProps, StreamingText, type StreamingTextProps, Suggestion, type SuggestionItem, type SuggestionProps, Switch, type SwitchProps, type TabItem, Table, type TableColumn, type TablePagination, type TablePaginationInfo, type TableProps, Tabs, type TabsProps, Tag, type TagColor, type TagProps, Text, type TextProps, type TextType, Textarea, type TextareaProps, Thinking, type ThinkingProps, type ThinkingStatus, TimePicker, type TimePickerProps, Timeline, type TimelineItemData, type TimelineProps, Toggle, ToggleGroup, type ToggleGroupOption, type ToggleGroupProps, type ToggleProps, ToolCall, type ToolCallProps, type ToolCallStatus, Tooltip, type TooltipProps, Tour, type TourProps, type TourStep, Transfer, type TransferOption, type TransferProps, Tree, TreeChart, type TreeChartProps, type TreeNodeData, type TreeProps, TreeSelect, type TreeSelectOption, type TreeSelectProps, Typography, type TypographyProps, type TypographyVariant, Upload, type UploadFileMeta, type UploadProps, Video, type VideoProps, Watermark, type WatermarkProps, Welcome, type WelcomePromptItem, type WelcomeProps, buildArtifactTree, builtinComponents, createComponentRegistry, diffLines, inferKind, normalizeIconName, registerBuiltinComponents, useFormContext, useSidebarDrawer };
4474
+ export { Accordion, type AccordionItemData, type AccordionProps, Affix, type AffixProps, AgentStatus, type AgentStatusProps, type AgentStatusType, Alert, AlertDialog, type AlertDialogProps, type AlertProps, type AlertVariant, Anchor, type AnchorItemData, type AnchorProps, AreaChart, type AreaChartProps, ArtifactPanel, type ArtifactPanelProps, type ArtifactTreeNode, type ArtifactViewer, type ArtifactViewers, AspectRatio, type AspectRatioProps, Attachment, type AttachmentItemData, type AttachmentProps, Audio, type AudioProps, Avatar, type AvatarProps, BackTop, type BackTopProps, Badge, type BadgeProps, type BadgeVariant, BarChart, type BarChartProps, Breadcrumb, type BreadcrumbItemData, type BreadcrumbProps, Bubble, BubbleChart, type BubbleChartProps, type BubbleProps, type BubbleVariant, Button, ButtonGroup, type ButtonGroupProps, type ButtonProps, type ButtonSize, type ButtonVariant, Calendar, type CalendarProps, Card, type CardProps, Carousel, type CarouselImage, type CarouselItemData, type CarouselProps, Cascader, type CascaderOption, type CascaderProps, type ChartSelectPayload, ChatInput, type ChatInputProps, ChatMessage, type ChatMessageActionItem, type ChatMessageAgent, type ChatMessagePart, type ChatMessageProps, type ChatMessageStatus, ChatPage, type ChatPageArtifact, type ChatPageBrand, type ChatPageMenuItem, type ChatPageProps, Checkbox, type CheckboxProps, Citation, type CitationItem, type CitationProps, CodeBlock, type CodeBlockProps, Collapsible, type CollapsibleProps, ColorPicker, type ColorPickerProps, ColumnChart, type ColumnChartProps, Combobox, type ComboboxOption, type ComboboxProps, Command, type CommandGroupData, type CommandItemData, type CommandProps, ComposedChart, type ComposedChartProps, type ComposedSeriesItem, Composer, type ComposerContextItem, type ComposerContextSource, type ComposerModelOption, type ComposerProps, Container, type ContainerProps, type ContainerSize, Content, type ContentProps, ContextMenu, type ContextMenuItemData, type ContextMenuProps, type ConversationItemData, ConversationList, type ConversationListProps, type ConversationRailItem, DataTable, type DataTableColumn, type DataTablePagination, type DataTableProps, type DataTableSort, type DataTableSortOrder, DatePicker, type DatePickerPreset, type DatePickerPresetKey, type DatePickerProps, type DatePickerRangeProps, type DatePickerSingleProps, type DateRangeValue, Descriptions, type DescriptionsItemData, type DescriptionsProps, Dialog, type DialogProps, DiffViewer, type DiffViewerProps, type DocumentPageData, DocumentPreview, type DocumentPreviewProps, DonutChart, type DonutChartProps, Drawer, type DrawerPlacement, type DrawerProps, DropdownMenu, type DropdownMenuItemData, type DropdownMenuProps, EChartBase, type EChartBaseProps, Empty, type EmptyProps, Field, type FieldProps, type FieldRule, FilePreview, type FilePreviewKind, type FilePreviewProps, Flex, type FlexProps, Footer, type FooterProps, Form, type FormContextValue, type FormProps, FunnelChart, type FunnelChartProps, Gallery, type GalleryItemData, type GalleryProps, GaugeChart, type GaugeChartProps, Grid, type GridProps, Header, type HeaderBrandPosition, type HeaderDropdown, type HeaderDropdownItem, type HeaderLocale, type HeaderMenuItem, type HeaderProps, type HeaderTheme, type HeaderUser, type HeaderUserItem, Heatmap, type HeatmapProps, HoverCard, type HoverCardProps, ICONS, Icon, type IconProps, type IconSize, Image, ImageLightbox, type ImageLightboxProps, type ImageProps, ImageViewer, type ImageViewerProps, Input, InputGroup, type InputGroupProps, InputOTP, type InputOTPProps, type InputProps, Item, type ItemProps, JSONViewer, type JSONViewerProps, Kbd, type KbdProps, Label, type LabelProps, Layout, type LayoutProps, LineChart, type LineChartProps, Link, type LinkProps, List, type ListItemData, type ListProps, LoadingOverlay, type LoadingOverlayProps, MapChart, type MapChartProps, type MentionOption, Mentions, type MentionsProps, Menu, type MenuItem, type MenuProps, Menubar, type MenubarLeafItem, type MenubarMenuData, type MenubarProps, Message, MessageList, type MessageListItem, type MessageListProps, type MessageProps, MetricCard, type MetricCardProps, NavigationMenu, type NavigationMenuChildItem, type NavigationMenuItemData, type NavigationMenuProps, Notification, type NotificationProps, NumberInput, type NumberInputProps, Page, type PageProps, Pagination, type PaginationProps, PieChart, type PieChartProps, Popconfirm, type PopconfirmProps, Popover, type PopoverProps, Progress, type ProgressProps, Prompt, type PromptProps, QRCode, type QRCodeProps, RadarChart, type RadarChartProps, RadioGroup, type RadioGroupOption, type RadioGroupProps, RailTooltip, Rate, type RateProps, Resizable, type ResizablePanelData, type ResizableProps, Result, type ResultProps, type ResultStatus, RichText, type RichTextProps, SankeyChart, type SankeyChartProps, ScatterChart, type ScatterChartProps, ScrollArea, type ScrollAreaProps, Segmented, type SegmentedOption, type SegmentedProps, Select, type SelectOption, type SelectProps, Sender, type SenderProps, Separator, type SeparatorProps, Sheet, type SheetProps, type SheetSide, Sidebar, type SidebarBrand, type SidebarNavItem, type SidebarProps, Sider, type SiderProps, Skeleton, type SkeletonProps, type SkeletonShape, Slider, type SliderProps, Sonner, type SonnerProps, Space, type SpaceProps, Spinner, type SpinnerProps, type SpinnerSize, Statistic, type StatisticProps, Status, type StatusProps, type StatusType, type StepItemData, type StepStatus, Steps, type StepsProps, StreamingText, type StreamingTextProps, Suggestion, type SuggestionItem, type SuggestionProps, Switch, type SwitchProps, type TabItem, Table, type TableColumn, type TablePagination, type TablePaginationInfo, type TableProps, Tabs, type TabsProps, Tag, type TagColor, type TagProps, Text, type TextProps, type TextType, Textarea, type TextareaProps, Thinking, type ThinkingProps, type ThinkingStatus, TimePicker, type TimePickerProps, Timeline, type TimelineItemData, type TimelineProps, Toggle, ToggleGroup, type ToggleGroupOption, type ToggleGroupProps, type ToggleProps, ToolCall, type ToolCallProps, type ToolCallStatus, Tooltip, type TooltipProps, Tour, type TourProps, type TourStep, Transfer, type TransferOption, type TransferProps, Tree, TreeChart, type TreeChartProps, type TreeNodeData, type TreeProps, TreeSelect, type TreeSelectOption, type TreeSelectProps, Typography, type TypographyProps, type TypographyVariant, Upload, type UploadFileMeta, type UploadProps, Video, type VideoProps, Watermark, type WatermarkProps, Welcome, type WelcomePromptItem, type WelcomeProps, buildArtifactTree, builtinComponents, createComponentRegistry, diffLines, inferKind, normalizeIconName, registerBuiltinComponents, useFormContext, useSidebarDrawer };