@vite-plugin-opencode-assistant/components 1.0.92 → 1.0.93

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.
Files changed (31) hide show
  1. package/es/index.d.ts +1 -1
  2. package/es/index.mjs +1 -1
  3. package/es/open-code-widget/composables/use-persist-state.d.ts +2 -0
  4. package/es/open-code-widget/composables/use-persist-state.mjs +2 -0
  5. package/es/open-code-widget/src/components/ChatPanel.vue.d.ts +2 -2
  6. package/es/open-code-widget/src/components/Frame.vue.mjs +7 -13
  7. package/es/open-code-widget/src/components/Header-sfc.css +1 -1
  8. package/es/open-code-widget/src/components/Header.vue.mjs +55 -23
  9. package/es/open-code-widget/src/components/SelectHint-sfc.css +1 -1
  10. package/es/open-code-widget/src/components/SelectHint.vue.mjs +2 -8
  11. package/es/open-code-widget/src/context.d.ts +2 -0
  12. package/es/open-code-widget/src/index-sfc.css +1 -1
  13. package/es/open-code-widget/src/index.vue.mjs +13 -1
  14. package/lib/@vite-plugin-opencode-assistant/components.cjs.js +65 -30
  15. package/lib/@vite-plugin-opencode-assistant/components.es.js +65 -30
  16. package/lib/components.css +3 -3
  17. package/lib/index.cjs +1 -1
  18. package/lib/index.d.ts +1 -1
  19. package/lib/open-code-widget/composables/use-persist-state.cjs +2 -0
  20. package/lib/open-code-widget/composables/use-persist-state.d.ts +2 -0
  21. package/lib/open-code-widget/src/components/ChatPanel.vue.d.ts +2 -2
  22. package/lib/open-code-widget/src/components/Frame.vue.cjs +6 -12
  23. package/lib/open-code-widget/src/components/Header-sfc.css +1 -1
  24. package/lib/open-code-widget/src/components/Header.vue.cjs +55 -23
  25. package/lib/open-code-widget/src/components/SelectHint-sfc.css +1 -1
  26. package/lib/open-code-widget/src/components/SelectHint.vue.cjs +1 -7
  27. package/lib/open-code-widget/src/context.d.ts +2 -0
  28. package/lib/open-code-widget/src/index-sfc.css +1 -1
  29. package/lib/open-code-widget/src/index.vue.cjs +13 -1
  30. package/lib/web-types.json +1 -1
  31. package/package.json +2 -2
@@ -40,11 +40,6 @@ var __vue_sfc__$9 = /* @__PURE__ */ defineComponent({
40
40
  if (!((_a = iframeRef.value) == null ? void 0 : _a.contentWindow)) return;
41
41
  iframeRef.value.contentWindow.postMessage(__spreadValues$4({ type }, data), "*");
42
42
  }
43
- onMounted(() => {
44
- if (iframeRef.value) iframeRef.value.addEventListener("load", () => {
45
- handleFrameLoaded();
46
- });
47
- });
48
43
  __expose({ sendMessageToIframe });
49
44
  const __returned__ = {
50
45
  iframeRef,
@@ -71,7 +66,7 @@ var _hoisted_3$5 = ["src"];
71
66
  function __vue_render__$9(_ctx, _cache, $props, $setup, $data, $options) {
72
67
  return openBlock(), createElementBlock("div", _hoisted_1$7, [
73
68
  createElementVNode("div", { class: normalizeClass(["opencode-empty-state-overlay", { visible: $setup.showEmptyState }]) }, [renderSlot(_ctx.$slots, "empty-state", {}, () => [
74
- _cache[1] || (_cache[1] = createElementVNode("div", { class: "opencode-empty-state-icon" }, [createElementVNode("svg", {
69
+ _cache[2] || (_cache[2] = createElementVNode("div", { class: "opencode-empty-state-icon" }, [createElementVNode("svg", {
75
70
  viewBox: "0 0 24 24",
76
71
  width: "48",
77
72
  height: "48",
@@ -91,15 +86,16 @@ function __vue_render__$9(_ctx, _cache, $props, $setup, $data, $options) {
91
86
  onClick: _cache[0] || (_cache[0] = (...args) => $setup.handleEmptyAction && $setup.handleEmptyAction(...args))
92
87
  }, toDisplayString($setup.emptyStateActionText), 1)
93
88
  ])], 2),
94
- createElementVNode("div", { class: normalizeClass(["opencode-loading-overlay", { visible: $setup.frameLoading }]) }, [renderSlot(_ctx.$slots, "loading", {}, () => [_cache[2] || (_cache[2] = createElementVNode("div", { class: "opencode-loading-spinner" }, null, -1)), _cache[3] || (_cache[3] = createElementVNode("div", { class: "opencode-loading-text" }, "加载中...", -1))])], 2),
89
+ createElementVNode("div", { class: normalizeClass(["opencode-loading-overlay", { visible: $setup.frameLoading }]) }, [renderSlot(_ctx.$slots, "loading", {}, () => [_cache[3] || (_cache[3] = createElementVNode("div", { class: "opencode-loading-spinner" }, null, -1)), _cache[4] || (_cache[4] = createElementVNode("div", { class: "opencode-loading-text" }, "加载中...", -1))])], 2),
95
90
  createElementVNode("div", { class: normalizeClass(["opencode-error-overlay", { visible: $setup.showError }]) }, [renderSlot(_ctx.$slots, "error")], 2),
96
91
  renderSlot(_ctx.$slots, "content", {}, () => [createElementVNode("iframe", {
97
92
  ref: "iframeRef",
98
93
  class: "opencode-iframe",
99
94
  src: $setup.iframeSrc,
100
95
  allow: "clipboard-write; clipboard-read",
101
- referrerpolicy: "origin"
102
- }, null, 8, _hoisted_3$5)])
96
+ referrerpolicy: "origin",
97
+ onLoad: _cache[1] || (_cache[1] = (...args) => $setup.handleFrameLoaded && $setup.handleFrameLoaded(...args))
98
+ }, null, 40, _hoisted_3$5)])
103
99
  ]);
104
100
  }
105
101
  __vue_sfc__$9.render = __vue_render__$9;
@@ -110,7 +106,7 @@ var __vue_sfc__$8 = /* @__PURE__ */ defineComponent({
110
106
  __name: "Header",
111
107
  setup(__props, { expose: __expose }) {
112
108
  __expose();
113
- const { title, sessionListTitle, sessionListCollapsed, selectMode, selectEnabled, theme, resolvedTheme, minimized, promptDockVisible, mode, displayMode, splitPosition, handleToggleSessionList, handleToggleSelectMode, handleToggleTheme, handleToggleDisplayMode, handleToggleSplitPosition, handleClose, handleToggleMinimize, handleTogglePromptDock, handleRefresh } = useOpenCodeWidgetContext();
109
+ const { title, sessionListTitle, sessionListCollapsed, selectMode, selectEnabled, theme, resolvedTheme, minimized, promptDockVisible, reviewPanelVisible, mode, displayMode, splitPosition, handleToggleSessionList, handleToggleSelectMode, handleToggleTheme, handleToggleDisplayMode, handleToggleSplitPosition, handleClose, handleToggleMinimize, handleTogglePromptDock, handleToggleReviewPanel, handleRefresh } = useOpenCodeWidgetContext();
114
110
  const __returned__ = {
115
111
  title,
116
112
  sessionListTitle,
@@ -121,6 +117,7 @@ var __vue_sfc__$8 = /* @__PURE__ */ defineComponent({
121
117
  resolvedTheme,
122
118
  minimized,
123
119
  promptDockVisible,
120
+ reviewPanelVisible,
124
121
  mode,
125
122
  displayMode,
126
123
  splitPosition,
@@ -132,6 +129,7 @@ var __vue_sfc__$8 = /* @__PURE__ */ defineComponent({
132
129
  handleClose,
133
130
  handleToggleMinimize,
134
131
  handleTogglePromptDock,
132
+ handleToggleReviewPanel,
135
133
  handleRefresh,
136
134
  isSplitMode: computed(() => mode.value === "split"),
137
135
  themeIconTitle: computed(() => {
@@ -292,7 +290,12 @@ var _hoisted_19 = [
292
290
  "aria-label",
293
291
  "aria-pressed"
294
292
  ];
295
- var _hoisted_20 = {
293
+ var _hoisted_20 = [
294
+ "title",
295
+ "aria-label",
296
+ "aria-pressed"
297
+ ];
298
+ var _hoisted_21 = {
296
299
  key: 0,
297
300
  viewBox: "0 0 24 24",
298
301
  width: "14",
@@ -302,7 +305,7 @@ var _hoisted_20 = {
302
305
  "stroke-width": "2",
303
306
  "aria-hidden": "true"
304
307
  };
305
- var _hoisted_21 = {
308
+ var _hoisted_22 = {
306
309
  key: 1,
307
310
  viewBox: "0 0 24 24",
308
311
  width: "14",
@@ -322,7 +325,7 @@ function __vue_render__$8(_ctx, _cache, $props, $setup, $data, $options) {
322
325
  "aria-label": $setup.sessionListTitle,
323
326
  "aria-expanded": !$setup.sessionListCollapsed,
324
327
  onClick: _cache[0] || (_cache[0] = (...args) => $setup.handleToggleSessionList && $setup.handleToggleSessionList(...args))
325
- }, [renderSlot(_ctx.$slots, "session-toggle-icon", {}, () => [_cache[9] || (_cache[9] = createElementVNode("svg", {
328
+ }, [renderSlot(_ctx.$slots, "session-toggle-icon", {}, () => [_cache[10] || (_cache[10] = createElementVNode("svg", {
326
329
  viewBox: "0 0 24 24",
327
330
  width: "16",
328
331
  height: "16",
@@ -342,7 +345,7 @@ function __vue_render__$8(_ctx, _cache, $props, $setup, $data, $options) {
342
345
  "aria-pressed": $setup.selectMode,
343
346
  disabled: !$setup.selectEnabled,
344
347
  onClick: _cache[1] || (_cache[1] = (...args) => $setup.handleToggleSelectMode && $setup.handleToggleSelectMode(...args))
345
- }, [renderSlot(_ctx.$slots, "select-icon", {}, () => [_cache[10] || (_cache[10] = createElementVNode("svg", {
348
+ }, [renderSlot(_ctx.$slots, "select-icon", {}, () => [_cache[11] || (_cache[11] = createElementVNode("svg", {
346
349
  viewBox: "0 0 1024 1024",
347
350
  width: "16",
348
351
  height: "16",
@@ -360,7 +363,7 @@ function __vue_render__$8(_ctx, _cache, $props, $setup, $data, $options) {
360
363
  title: $setup.themeIconTitle,
361
364
  "aria-label": $setup.themeIconLabel,
362
365
  onClick: _cache[2] || (_cache[2] = (...args) => $setup.handleToggleTheme && $setup.handleToggleTheme(...args))
363
- }, [renderSlot(_ctx.$slots, "theme-icon", {}, () => [$setup.theme === "light" ? (openBlock(), createElementBlock("svg", _hoisted_6$4, [..._cache[11] || (_cache[11] = [createStaticVNode("<circle cx=\"12\" cy=\"12\" r=\"5\"></circle><line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"3\"></line><line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"23\"></line><line x1=\"4.22\" y1=\"4.22\" x2=\"5.64\" y2=\"5.64\"></line><line x1=\"18.36\" y1=\"18.36\" x2=\"19.78\" y2=\"19.78\"></line><line x1=\"1\" y1=\"12\" x2=\"3\" y2=\"12\"></line><line x1=\"21\" y1=\"12\" x2=\"23\" y2=\"12\"></line><line x1=\"4.22\" y1=\"19.78\" x2=\"5.64\" y2=\"18.36\"></line><line x1=\"18.36\" y1=\"5.64\" x2=\"19.78\" y2=\"4.22\"></line>", 9)])])) : $setup.theme === "dark" ? (openBlock(), createElementBlock("svg", _hoisted_7$2, [..._cache[12] || (_cache[12] = [createElementVNode("path", { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" }, null, -1)])])) : (openBlock(), createElementBlock("svg", _hoisted_8$1, [..._cache[13] || (_cache[13] = [createStaticVNode("<rect x=\"2\" y=\"3\" width=\"20\" height=\"14\" rx=\"2\" ry=\"2\"></rect><line x1=\"8\" y1=\"21\" x2=\"16\" y2=\"21\"></line><line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"21\"></line><circle cx=\"12\" cy=\"10\" r=\"3\"></circle><path d=\"M7 7l2 2M17 7l-2 2M7 13l2-2M17 13l-2-2\"></path>", 5)])]))])], 8, _hoisted_5$4),
366
+ }, [renderSlot(_ctx.$slots, "theme-icon", {}, () => [$setup.theme === "light" ? (openBlock(), createElementBlock("svg", _hoisted_6$4, [..._cache[12] || (_cache[12] = [createStaticVNode("<circle cx=\"12\" cy=\"12\" r=\"5\"></circle><line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"3\"></line><line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"23\"></line><line x1=\"4.22\" y1=\"4.22\" x2=\"5.64\" y2=\"5.64\"></line><line x1=\"18.36\" y1=\"18.36\" x2=\"19.78\" y2=\"19.78\"></line><line x1=\"1\" y1=\"12\" x2=\"3\" y2=\"12\"></line><line x1=\"21\" y1=\"12\" x2=\"23\" y2=\"12\"></line><line x1=\"4.22\" y1=\"19.78\" x2=\"5.64\" y2=\"18.36\"></line><line x1=\"18.36\" y1=\"5.64\" x2=\"19.78\" y2=\"4.22\"></line>", 9)])])) : $setup.theme === "dark" ? (openBlock(), createElementBlock("svg", _hoisted_7$2, [..._cache[13] || (_cache[13] = [createElementVNode("path", { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" }, null, -1)])])) : (openBlock(), createElementBlock("svg", _hoisted_8$1, [..._cache[14] || (_cache[14] = [createStaticVNode("<rect x=\"2\" y=\"3\" width=\"20\" height=\"14\" rx=\"2\" ry=\"2\"></rect><line x1=\"8\" y1=\"21\" x2=\"16\" y2=\"21\"></line><line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"21\"></line><circle cx=\"12\" cy=\"10\" r=\"3\"></circle><path d=\"M7 7l2 2M17 7l-2 2M7 13l2-2M17 13l-2-2\"></path>", 5)])]))])], 8, _hoisted_5$4),
364
367
  $setup.displayMode !== "extension" ? (openBlock(), createElementBlock("button", {
365
368
  key: 0,
366
369
  class: "opencode-header-btn display-mode-btn",
@@ -368,7 +371,7 @@ function __vue_render__$8(_ctx, _cache, $props, $setup, $data, $options) {
368
371
  title: $setup.displayModeIconTitle,
369
372
  "aria-label": $setup.displayModeIconLabel,
370
373
  onClick: _cache[3] || (_cache[3] = (...args) => $setup.handleToggleDisplayMode && $setup.handleToggleDisplayMode(...args))
371
- }, [renderSlot(_ctx.$slots, "display-mode-icon", {}, () => [$setup.displayMode === "bubble" ? (openBlock(), createElementBlock("svg", _hoisted_10$1, [..._cache[14] || (_cache[14] = [
374
+ }, [renderSlot(_ctx.$slots, "display-mode-icon", {}, () => [$setup.displayMode === "bubble" ? (openBlock(), createElementBlock("svg", _hoisted_10$1, [..._cache[15] || (_cache[15] = [
372
375
  createElementVNode("circle", {
373
376
  cx: "12",
374
377
  cy: "12",
@@ -392,7 +395,7 @@ function __vue_render__$8(_ctx, _cache, $props, $setup, $data, $options) {
392
395
  y2: "9",
393
396
  "stroke-linecap": "round"
394
397
  }, null, -1)
395
- ])])) : $setup.displayMode === "split" ? (openBlock(), createElementBlock("svg", _hoisted_11, [..._cache[15] || (_cache[15] = [createElementVNode("rect", {
398
+ ])])) : $setup.displayMode === "split" ? (openBlock(), createElementBlock("svg", _hoisted_11, [..._cache[16] || (_cache[16] = [createElementVNode("rect", {
396
399
  x: "3",
397
400
  y: "3",
398
401
  width: "18",
@@ -403,7 +406,7 @@ function __vue_render__$8(_ctx, _cache, $props, $setup, $data, $options) {
403
406
  y1: "3",
404
407
  x2: "12",
405
408
  y2: "21"
406
- }, null, -1)])])) : (openBlock(), createElementBlock("svg", _hoisted_12, [..._cache[16] || (_cache[16] = [
409
+ }, null, -1)])])) : (openBlock(), createElementBlock("svg", _hoisted_12, [..._cache[17] || (_cache[17] = [
407
410
  createElementVNode("rect", {
408
411
  x: "3",
409
412
  y: "3",
@@ -441,7 +444,7 @@ function __vue_render__$8(_ctx, _cache, $props, $setup, $data, $options) {
441
444
  title: "刷新面板",
442
445
  "aria-label": "刷新面板",
443
446
  onClick: _cache[4] || (_cache[4] = (...args) => $setup.handleRefresh && $setup.handleRefresh(...args))
444
- }, [..._cache[17] || (_cache[17] = [createElementVNode("svg", {
447
+ }, [..._cache[18] || (_cache[18] = [createElementVNode("svg", {
445
448
  viewBox: "0 0 24 24",
446
449
  width: "16",
447
450
  height: "16",
@@ -457,7 +460,7 @@ function __vue_render__$8(_ctx, _cache, $props, $setup, $data, $options) {
457
460
  title: $setup.splitPositionIconTitle,
458
461
  "aria-label": $setup.splitPositionIconLabel,
459
462
  onClick: _cache[5] || (_cache[5] = (...args) => $setup.handleToggleSplitPosition && $setup.handleToggleSplitPosition(...args))
460
- }, [renderSlot(_ctx.$slots, "split-position-icon", {}, () => [$setup.splitPosition === "right" ? (openBlock(), createElementBlock("svg", _hoisted_16, [..._cache[18] || (_cache[18] = [createElementVNode("rect", {
463
+ }, [renderSlot(_ctx.$slots, "split-position-icon", {}, () => [$setup.splitPosition === "right" ? (openBlock(), createElementBlock("svg", _hoisted_16, [..._cache[19] || (_cache[19] = [createElementVNode("rect", {
461
464
  x: "3",
462
465
  y: "3",
463
466
  width: "18",
@@ -468,7 +471,7 @@ function __vue_render__$8(_ctx, _cache, $props, $setup, $data, $options) {
468
471
  y1: "3",
469
472
  x2: "15",
470
473
  y2: "21"
471
- }, null, -1)])])) : (openBlock(), createElementBlock("svg", _hoisted_17, [..._cache[19] || (_cache[19] = [createElementVNode("rect", {
474
+ }, null, -1)])])) : (openBlock(), createElementBlock("svg", _hoisted_17, [..._cache[20] || (_cache[20] = [createElementVNode("rect", {
472
475
  x: "3",
473
476
  y: "3",
474
477
  width: "18",
@@ -480,6 +483,24 @@ function __vue_render__$8(_ctx, _cache, $props, $setup, $data, $options) {
480
483
  x2: "9",
481
484
  y2: "21"
482
485
  }, null, -1)])]))])], 8, _hoisted_15)) : createCommentVNode("v-if", true),
486
+ createElementVNode("button", {
487
+ class: normalizeClass(["opencode-header-btn review-panel", { active: $setup.reviewPanelVisible }]),
488
+ type: "button",
489
+ title: $setup.reviewPanelVisible ? "收起审查面板" : "展开审查面板",
490
+ "aria-label": $setup.reviewPanelVisible ? "收起审查面板" : "展开审查面板",
491
+ "aria-pressed": $setup.reviewPanelVisible,
492
+ onClick: _cache[6] || (_cache[6] = (...args) => $setup.handleToggleReviewPanel && $setup.handleToggleReviewPanel(...args))
493
+ }, [..._cache[21] || (_cache[21] = [createElementVNode("svg", {
494
+ viewBox: "0 0 24 24",
495
+ width: "15",
496
+ height: "15",
497
+ fill: "none",
498
+ stroke: "currentColor",
499
+ "stroke-width": "2",
500
+ "stroke-linecap": "round",
501
+ "stroke-linejoin": "round",
502
+ "aria-hidden": "true"
503
+ }, [createElementVNode("polyline", { points: "16 18 22 12 16 6" }), createElementVNode("polyline", { points: "8 6 2 12 8 18" })], -1)])], 10, _hoisted_18),
483
504
  !$setup.isSplitMode ? (openBlock(), createElementBlock("button", {
484
505
  key: 2,
485
506
  class: "opencode-header-btn prompt-dock",
@@ -487,8 +508,8 @@ function __vue_render__$8(_ctx, _cache, $props, $setup, $data, $options) {
487
508
  title: $setup.promptDockVisible ? "隐藏对话框" : "显示对话框",
488
509
  "aria-label": $setup.promptDockVisible ? "隐藏对话框" : "显示对话框",
489
510
  "aria-pressed": $setup.promptDockVisible,
490
- onClick: _cache[6] || (_cache[6] = (...args) => $setup.handleTogglePromptDock && $setup.handleTogglePromptDock(...args))
491
- }, [renderSlot(_ctx.$slots, "prompt-dock-icon", {}, () => [_cache[20] || (_cache[20] = createElementVNode("svg", {
511
+ onClick: _cache[7] || (_cache[7] = (...args) => $setup.handleTogglePromptDock && $setup.handleTogglePromptDock(...args))
512
+ }, [renderSlot(_ctx.$slots, "prompt-dock-icon", {}, () => [_cache[22] || (_cache[22] = createElementVNode("svg", {
492
513
  viewBox: "0 0 24 24",
493
514
  width: "14",
494
515
  height: "14",
@@ -496,7 +517,7 @@ function __vue_render__$8(_ctx, _cache, $props, $setup, $data, $options) {
496
517
  stroke: "currentColor",
497
518
  "stroke-width": "2",
498
519
  "aria-hidden": "true"
499
- }, [createElementVNode("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" })], -1))])], 8, _hoisted_18)) : createCommentVNode("v-if", true),
520
+ }, [createElementVNode("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" })], -1))])], 8, _hoisted_19)) : createCommentVNode("v-if", true),
500
521
  !$setup.isSplitMode ? (openBlock(), createElementBlock("button", {
501
522
  key: 3,
502
523
  class: "opencode-header-btn minimize",
@@ -504,16 +525,16 @@ function __vue_render__$8(_ctx, _cache, $props, $setup, $data, $options) {
504
525
  title: $setup.minimized ? "展开" : "最小化",
505
526
  "aria-label": $setup.minimized ? "展开面板" : "最小化面板",
506
527
  "aria-pressed": $setup.minimized,
507
- onClick: _cache[7] || (_cache[7] = (...args) => $setup.handleToggleMinimize && $setup.handleToggleMinimize(...args))
508
- }, [renderSlot(_ctx.$slots, "minimize-icon", {}, () => [$setup.minimized ? (openBlock(), createElementBlock("svg", _hoisted_20, [..._cache[21] || (_cache[21] = [createElementVNode("path", { d: "M8 3v3a2 2 0 0 1-2 2H3m18 0h-3a2 2 0 0 1-2-2V3m0 18v-3a2 2 0 0 1 2-2h3M3 16h3a2 2 0 0 1 2 2v3" }, null, -1)])])) : (openBlock(), createElementBlock("svg", _hoisted_21, [..._cache[22] || (_cache[22] = [createElementVNode("path", { d: "M8 3v3a2 2 0 0 1-2 2H3m18 0h-3a2 2 0 0 1-2-2V3m0 18v-3a2 2 0 0 1 2-2h3M3 16h3a2 2 0 0 1 2 2v3" }, null, -1)])]))])], 8, _hoisted_19)) : createCommentVNode("v-if", true),
528
+ onClick: _cache[8] || (_cache[8] = (...args) => $setup.handleToggleMinimize && $setup.handleToggleMinimize(...args))
529
+ }, [renderSlot(_ctx.$slots, "minimize-icon", {}, () => [$setup.minimized ? (openBlock(), createElementBlock("svg", _hoisted_21, [..._cache[23] || (_cache[23] = [createElementVNode("path", { d: "M8 3v3a2 2 0 0 1-2 2H3m18 0h-3a2 2 0 0 1-2-2V3m0 18v-3a2 2 0 0 1 2-2h3M3 16h3a2 2 0 0 1 2 2v3" }, null, -1)])])) : (openBlock(), createElementBlock("svg", _hoisted_22, [..._cache[24] || (_cache[24] = [createElementVNode("path", { d: "M8 3v3a2 2 0 0 1-2 2H3m18 0h-3a2 2 0 0 1-2-2V3m0 18v-3a2 2 0 0 1 2-2h3M3 16h3a2 2 0 0 1 2 2v3" }, null, -1)])]))])], 8, _hoisted_20)) : createCommentVNode("v-if", true),
509
530
  !$setup.isSplitMode ? (openBlock(), createElementBlock("button", {
510
531
  key: 4,
511
532
  class: "opencode-header-btn close",
512
533
  type: "button",
513
534
  title: "关闭",
514
535
  "aria-label": "关闭面板",
515
- onClick: _cache[8] || (_cache[8] = (...args) => $setup.handleClose && $setup.handleClose(...args))
516
- }, [renderSlot(_ctx.$slots, "close-icon", {}, () => [_cache[23] || (_cache[23] = createElementVNode("svg", {
536
+ onClick: _cache[9] || (_cache[9] = (...args) => $setup.handleClose && $setup.handleClose(...args))
537
+ }, [renderSlot(_ctx.$slots, "close-icon", {}, () => [_cache[25] || (_cache[25] = createElementVNode("svg", {
517
538
  viewBox: "0 0 24 24",
518
539
  width: "14",
519
540
  height: "14",
@@ -1163,7 +1184,7 @@ var __vue_sfc__$3 = /* @__PURE__ */ defineComponent({
1163
1184
  });
1164
1185
  var _hoisted_1$2 = { class: "opencode-hint-shortcut" };
1165
1186
  function __vue_render__$3(_ctx, _cache, $props, $setup, $data, $options) {
1166
- return openBlock(), createElementBlock("div", { class: normalizeClass(["opencode-select-mode-hint", { visible: $setup.visible }]) }, [_cache[0] || (_cache[0] = createElementVNode("span", null, "🎯 选择模式已开启 - 点击元素进行选择", -1)), createElementVNode("span", _hoisted_1$2, toDisplayString($setup.shortcutLabel), 1)], 2);
1187
+ return openBlock(), createElementBlock("div", { class: normalizeClass(["opencode-select-mode-hint", { visible: $setup.visible }]) }, [_cache[0] || (_cache[0] = createStaticVNode("<span class=\"opencode-hint-main\"><span class=\"opencode-hint-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"8\"></circle><circle cx=\"12\" cy=\"12\" r=\"2.5\" fill=\"currentColor\"></circle><line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"5\"></line><line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"22\"></line><line x1=\"2\" y1=\"12\" x2=\"5\" y2=\"12\"></line><line x1=\"19\" y1=\"12\" x2=\"22\" y2=\"12\"></line></svg></span><span class=\"opencode-hint-text\">选择模式已开启 · 点击元素进行选择</span></span>", 1)), createElementVNode("span", _hoisted_1$2, toDisplayString($setup.shortcutLabel), 1)], 2);
1167
1188
  }
1168
1189
  __vue_sfc__$3.render = __vue_render__$3;
1169
1190
  var SelectHint_vue_default = __vue_sfc__$3;
@@ -2292,6 +2313,7 @@ function usePersistState(options) {
2292
2313
  open: options.open.value,
2293
2314
  minimized: options.minimized.value,
2294
2315
  promptDockVisible: options.promptDockVisible.value,
2316
+ reviewPanelVisible: options.reviewPanelVisible.value,
2295
2317
  bubbleOffset: options.bubbleOffset.value,
2296
2318
  theme: options.theme.value,
2297
2319
  sessionListCollapsed: options.sessionListCollapsed.value,
@@ -2307,6 +2329,7 @@ function usePersistState(options) {
2307
2329
  options.open,
2308
2330
  options.minimized,
2309
2331
  options.promptDockVisible,
2332
+ options.reviewPanelVisible,
2310
2333
  options.bubbleOffset,
2311
2334
  options.theme,
2312
2335
  options.sessionListCollapsed
@@ -2677,6 +2700,7 @@ var __vue_sfc__ = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({
2677
2700
  const localSplitPosition = ref((_b = (_a = props.splitMode) == null ? void 0 : _a.position) != null ? _b : "right");
2678
2701
  const minimized = ref(false);
2679
2702
  const promptDockVisible = ref(true);
2703
+ const reviewPanelVisible = ref(false);
2680
2704
  const isRestoring = ref(true);
2681
2705
  const iframeLoaded = ref(false);
2682
2706
  const splitPanelWidth = ref(props.splitPanelWidth);
@@ -2684,6 +2708,7 @@ var __vue_sfc__ = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({
2684
2708
  if (!iframeLoaded.value) return;
2685
2709
  sendMessageToIframe(WIDGET_MSG.PROMPT_DOCK_VISIBILITY, { visible: promptDockVisible.value });
2686
2710
  sendMessageToIframe(WIDGET_MSG.MINIMIZE_STATE, { minimized: minimized.value });
2711
+ sendMessageToIframe(WIDGET_MSG.REVIEW_PANEL_TOGGLE, { visible: reviewPanelVisible.value });
2687
2712
  };
2688
2713
  const handleFrameLoaded = () => {
2689
2714
  emit("frame-loaded");
@@ -2803,6 +2828,7 @@ var __vue_sfc__ = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({
2803
2828
  open: toRef(props, "open"),
2804
2829
  minimized,
2805
2830
  promptDockVisible,
2831
+ reviewPanelVisible,
2806
2832
  bubbleOffset,
2807
2833
  theme: toRef(props, "theme"),
2808
2834
  sessionListCollapsed: localSessionListCollapsed,
@@ -2835,6 +2861,7 @@ var __vue_sfc__ = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({
2835
2861
  }
2836
2862
  if (state.promptDockVisible !== void 0) promptDockVisible.value = state.promptDockVisible;
2837
2863
  else if (minimized.value) promptDockVisible.value = false;
2864
+ if (state.reviewPanelVisible !== void 0) reviewPanelVisible.value = state.reviewPanelVisible;
2838
2865
  if (state.splitPanelWidth !== void 0 && state.splitPanelWidth !== props.splitPanelWidth) handleResize(state.splitPanelWidth);
2839
2866
  if (state.displayMode !== void 0 && state.displayMode !== props.displayMode) localDisplayMode.value = state.displayMode;
2840
2867
  if (state.splitPosition !== void 0) localSplitPosition.value = state.splitPosition;
@@ -2856,6 +2883,10 @@ var __vue_sfc__ = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({
2856
2883
  promptDockVisible.value = !promptDockVisible.value;
2857
2884
  sendMessageToIframe(WIDGET_MSG.PROMPT_DOCK_VISIBILITY, { visible: promptDockVisible.value });
2858
2885
  };
2886
+ const handleToggleReviewPanel = () => {
2887
+ reviewPanelVisible.value = !reviewPanelVisible.value;
2888
+ sendMessageToIframe(WIDGET_MSG.REVIEW_PANEL_TOGGLE, { visible: reviewPanelVisible.value });
2889
+ };
2859
2890
  const handleRefresh = () => {
2860
2891
  window.location.reload();
2861
2892
  };
@@ -2990,6 +3021,7 @@ var __vue_sfc__ = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({
2990
3021
  thinking: toRef(props, "thinking"),
2991
3022
  minimized,
2992
3023
  promptDockVisible,
3024
+ reviewPanelVisible,
2993
3025
  bubbleOffset,
2994
3026
  mode: effectiveMode,
2995
3027
  displayMode: localDisplayMode,
@@ -3009,6 +3041,7 @@ var __vue_sfc__ = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({
3009
3041
  handleClose,
3010
3042
  handleToggleMinimize,
3011
3043
  handleTogglePromptDock,
3044
+ handleToggleReviewPanel,
3012
3045
  handleToggleSessionList,
3013
3046
  handleToggleTheme,
3014
3047
  handleToggleDisplayMode,
@@ -3064,6 +3097,7 @@ var __vue_sfc__ = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({
3064
3097
  localSplitPosition,
3065
3098
  minimized,
3066
3099
  promptDockVisible,
3100
+ reviewPanelVisible,
3067
3101
  isRestoring,
3068
3102
  iframeLoaded,
3069
3103
  splitPanelWidth,
@@ -3108,6 +3142,7 @@ var __vue_sfc__ = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({
3108
3142
  handleTogglePosition,
3109
3143
  handleToggleMinimize,
3110
3144
  handleTogglePromptDock,
3145
+ handleToggleReviewPanel,
3111
3146
  handleRefresh,
3112
3147
  windowWidth,
3113
3148
  windowHeight,
@@ -3277,7 +3312,7 @@ __vue_sfc__.render = __vue_render__;
3277
3312
  var open_code_widget_default = __vue_sfc__;
3278
3313
  //#endregion
3279
3314
  //#region es/index.mjs
3280
- var version = "1.0.92";
3315
+ var version = "1.0.93";
3281
3316
  function install(app, options) {
3282
3317
  [open_code_widget_default].forEach((item) => {
3283
3318
  if (item.install) app.use(item, options);
@@ -1,11 +1,11 @@
1
- .opencode-widget{--oc-bg-main: #ffffff;--oc-bg-secondary: #f8f9fa;--oc-bg-tertiary: #f3f4f6;--oc-overlay-bg: rgba(255, 255, 255, .9);--oc-bg-inverse: #1e1e1e;--oc-text-primary: #282828;--oc-text-secondary: #4b5563;--oc-text-tertiary: #6b7280;--oc-text-placeholder: #9ca3af;--oc-text-inverse: #ffffff;--oc-border-primary: #e5e7eb;--oc-border-secondary: #d1d5db;--oc-primary: #3b82f6;--oc-primary-hover: #2563eb;--oc-primary-bg: rgba(59, 130, 246, .1);--oc-danger: #ef4444;--oc-danger-hover: #dc2626;--oc-danger-active: #b91c1c;--oc-success: #10b981;--oc-overlay: rgba(0, 0, 0, .5);--oc-tooltip-bg: #1e1e1e;--oc-dialog-overlay: rgba(0, 0, 0, .5);--oc-thinking-gradient-1: #10b981;--oc-thinking-gradient-2: #059669;--oc-thinking-glow: rgba(16, 185, 129, .3);--oc-thinking-glow-strong: rgba(16, 185, 129, .6);--oc-skeleton-bg: #e5e7eb;--oc-skeleton-gradient: linear-gradient(90deg, #e5e7eb 25%, #f3f4f6 50%, #e5e7eb 75%);--oc-shadow-sm: 0 2px 4px rgba(0, 0, 0, .1);--oc-shadow-md: 0 4px 12px rgba(0, 0, 0, .15);--oc-shadow-lg: 0 8px 32px rgba(0, 0, 0, .12);--oc-shadow-xl: 0 20px 60px rgba(0, 0, 0, .3);--oc-shadow-primary: 0 2px 4px rgba(59, 130, 246, .2);--oc-shadow-primary-hover: 0 4px 6px rgba(59, 130, 246, .3);--oc-shadow-danger: 0 4px 12px rgba(239, 68, 68, .3);--oc-trigger-bg: #3b82f6;--oc-trigger-bg-hover: #2563eb;--oc-trigger-bg-active: #1d4ed8;--oc-trigger-shadow: 0 2px 8px rgba(59, 130, 246, .3);--oc-trigger-shadow-hover: 0 4px 12px rgba(59, 130, 246, .4);--oc-trigger-shadow-active: 0 4px 12px rgba(59, 130, 246, .5);position:fixed;z-index:999999;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.opencode-widget.opencode-theme-dark{--oc-bg-main: #1a1a1a;--oc-bg-secondary: #1e1e1e;--oc-bg-tertiary: #282828;--oc-overlay-bg: rgba(26, 26, 26, .9);--oc-bg-inverse: #ffffff;--oc-text-primary: #f3f4f6;--oc-text-secondary: #d1d5db;--oc-text-tertiary: #9ca3af;--oc-text-placeholder: #6b7280;--oc-text-inverse: #282828;--oc-border-primary: #282828;--oc-border-secondary: #4b5563;--oc-primary: #3b82f6;--oc-primary-hover: #2563eb;--oc-primary-bg: rgba(59, 130, 246, .15);--oc-danger: #ef4444;--oc-danger-hover: #dc2626;--oc-danger-active: #b91c1c;--oc-success: #10b981;--oc-overlay: rgba(26, 26, 26, .9);--oc-tooltip-bg: #282828;--oc-dialog-overlay: rgba(0, 0, 0, .7);--oc-thinking-gradient-1: #34d399;--oc-thinking-gradient-2: #10b981;--oc-thinking-glow: rgba(52, 211, 153, .3);--oc-thinking-glow-strong: rgba(52, 211, 153, .6);--oc-skeleton-bg: #151515;--oc-skeleton-gradient: linear-gradient(90deg, #282828 25%, #4b5563 50%, #282828 75%);--oc-shadow-sm: 0 2px 4px rgba(0, 0, 0, .3);--oc-shadow-md: 0 4px 12px rgba(0, 0, 0, .4);--oc-shadow-lg: 0 8px 32px rgba(0, 0, 0, .4);--oc-shadow-xl: 0 20px 60px rgba(0, 0, 0, .6);--oc-shadow-primary: 0 2px 4px rgba(59, 130, 246, .3);--oc-shadow-primary-hover: 0 4px 6px rgba(59, 130, 246, .4);--oc-shadow-danger: 0 4px 12px rgba(239, 68, 68, .4);--oc-trigger-bg: #60a5fa;--oc-trigger-bg-hover: #3b82f6;--oc-trigger-bg-active: #2563eb;--oc-trigger-shadow: 0 2px 8px rgba(96, 165, 250, .4);--oc-trigger-shadow-hover: 0 4px 12px rgba(96, 165, 250, .5);--oc-trigger-shadow-active: 0 4px 12px rgba(96, 165, 250, .6)}.opencode-chat{position:fixed;bottom:20px;width:700px;height:86vh;max-height:calc(100vh - 40px);background:var(--oc-bg-main);border-radius:16px;box-shadow:var(--oc-shadow-lg);overflow:hidden;opacity:0;visibility:hidden;transform:translate3d(var(---chatAnimationOrigin\.x),var(---chatAnimationOrigin\.y),0) scale(.95);transition:all .3s ease;display:flex;flex-direction:column;z-index:99999}.opencode-chat.open{opacity:1;visibility:visible;transform:translateZ(0) scale(1)}.opencode-chat.no-transition,.opencode-chat.no-transition.open{transition:none!important}.opencode-chat.minimized{width:320px;height:320px}.opencode-chat.minimized .opencode-iframe-container{margin-top:-146px}.opencode-chat-content{display:flex;flex:1;overflow:hidden}.opencode-notification{position:absolute;top:20px;left:50%;transform:translate(-50%);padding:12px 24px;background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff;border-radius:10px;font-size:14px;font-weight:500;box-shadow:0 4px 16px #3b82f666,0 0 0 2px #3b82f633;animation:slideDown .3s ease;z-index:10000000;display:flex;align-items:center;gap:10px}.opencode-notification:before{content:"\1f4a1";font-size:16px}.opencode-dialog-overlay{position:fixed;inset:0;background:var(--oc-dialog-overlay);display:flex;align-items:center;justify-content:center;z-index:9999999;animation:fadeIn .2s ease}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.opencode-dialog{background:var(--oc-bg-main);border-radius:12px;padding:24px;min-width:320px;max-width:400px;box-shadow:var(--oc-shadow-xl);animation:scaleIn .2s ease}@keyframes scaleIn{0%{transform:scale(.9);opacity:0}to{transform:scale(1);opacity:1}}.opencode-dialog-content{margin-bottom:20px}.opencode-dialog-message{font-size:15px;color:var(--oc-text-primary);line-height:1.5}.opencode-dialog-actions{display:flex;gap:12px;justify-content:flex-end}.opencode-dialog-btn{padding:10px 20px;border-radius:8px;border:none;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s}.opencode-dialog-btn.cancel{background:var(--oc-bg-tertiary);color:var(--oc-text-primary)}.opencode-dialog-btn.cancel:hover{background:var(--oc-text-primary);color:var(--oc-bg-main)}.opencode-dialog-btn.confirm{background:var(--oc-danger);color:#fff}.opencode-dialog-btn.confirm:hover{background:var(--oc-danger-hover)}@keyframes slideDown{0%{transform:translate(-50%) translateY(-100%);opacity:0}to{transform:translate(-50%) translateY(0);opacity:1}}.opencode-page-notification{position:fixed;top:20px;left:50%;transform:translate(-50%);padding:12px 24px;background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff;border-radius:10px;font-size:14px;font-weight:500;box-shadow:0 4px 16px #3b82f666,0 0 0 2px #3b82f633;animation:slideDown .3s ease;z-index:2147483647;display:flex;align-items:center;gap:10px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.opencode-page-notification:before{content:"\1f4a1";font-size:16px}.opencode-element-highlight{position:fixed;pointer-events:none;z-index:999998;border-radius:4px}#vue-inspector-container{display:none!important}.opencode-element-tooltip{position:fixed;background:var(--oc-tooltip-bg);color:#fff;padding:8px 12px;border-radius:6px;font-size:12px;z-index:9999998;box-shadow:var(--oc-shadow-md);max-width:300px;pointer-events:none;line-height:1}.opencode-tooltip-tag{font-weight:500;margin-bottom:4px;word-break:break-all}.opencode-tooltip-file{font-size:11px;color:var(--oc-text-placeholder);word-break:break-all}.opencode-element-highlight-temp{position:absolute;pointer-events:none;z-index:999998;border-radius:4px;animation:highlight-pulse 2s ease-out forwards}@keyframes highlight-pulse{0%{opacity:1;transform:scale(1)}50%{opacity:.8;transform:scale(1.02)}to{opacity:0;transform:scale(1)}}@media(max-width:768px){.opencode-chat{width:calc(100vw - 40px);height:calc(100vh - 100px)}}body.has-opencode-split{transition:padding .3s ease;min-width:auto}body.has-opencode-split-right{padding-right:var(--opencode-split-width, 500px)}body.has-opencode-split-left{padding-left:var(--opencode-split-width, 500px)}.opencode-widget.extension-mode{position:static;width:100%;height:100%;display:flex}.opencode-widget.extension-mode .opencode-select-mode-hint,.opencode-widget.extension-mode .opencode-dialog-overlay{position:absolute}
1
+ .opencode-widget{--oc-bg-main: #ffffff;--oc-bg-secondary: #f8f9fa;--oc-bg-tertiary: #f3f4f6;--oc-overlay-bg: rgba(255, 255, 255, .9);--oc-bg-inverse: #1e1e1e;--oc-text-primary: #282828;--oc-text-secondary: #4b5563;--oc-text-tertiary: #6b7280;--oc-text-placeholder: #9ca3af;--oc-text-inverse: #ffffff;--oc-border-primary: #e5e7eb;--oc-border-secondary: #d1d5db;--oc-primary: #3b82f6;--oc-primary-hover: #2563eb;--oc-primary-bg: rgba(59, 130, 246, .1);--oc-danger: #ef4444;--oc-danger-hover: #dc2626;--oc-danger-active: #b91c1c;--oc-success: #10b981;--oc-overlay: rgba(0, 0, 0, .5);--oc-tooltip-bg: #1e1e1e;--oc-dialog-overlay: rgba(0, 0, 0, .5);--oc-thinking-gradient-1: #10b981;--oc-thinking-gradient-2: #059669;--oc-thinking-glow: rgba(16, 185, 129, .3);--oc-thinking-glow-strong: rgba(16, 185, 129, .6);--oc-skeleton-bg: #e5e7eb;--oc-skeleton-gradient: linear-gradient(90deg, #e5e7eb 25%, #f3f4f6 50%, #e5e7eb 75%);--oc-shadow-sm: 0 2px 4px rgba(0, 0, 0, .1);--oc-shadow-md: 0 4px 12px rgba(0, 0, 0, .15);--oc-shadow-lg: 0 8px 32px rgba(0, 0, 0, .12);--oc-shadow-xl: 0 20px 60px rgba(0, 0, 0, .3);--oc-shadow-primary: 0 2px 4px rgba(59, 130, 246, .2);--oc-shadow-primary-hover: 0 4px 6px rgba(59, 130, 246, .3);--oc-shadow-danger: 0 4px 12px rgba(239, 68, 68, .3);--oc-trigger-bg: #3b82f6;--oc-trigger-bg-hover: #2563eb;--oc-trigger-bg-active: #1d4ed8;--oc-trigger-shadow: 0 2px 8px rgba(59, 130, 246, .3);--oc-trigger-shadow-hover: 0 4px 12px rgba(59, 130, 246, .4);--oc-trigger-shadow-active: 0 4px 12px rgba(59, 130, 246, .5);position:fixed;z-index:999999;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.opencode-widget.opencode-theme-dark{--oc-bg-main: #1a1a1a;--oc-bg-secondary: #1e1e1e;--oc-bg-tertiary: #282828;--oc-overlay-bg: rgba(26, 26, 26, .9);--oc-bg-inverse: #ffffff;--oc-text-primary: #f3f4f6;--oc-text-secondary: #d1d5db;--oc-text-tertiary: #9ca3af;--oc-text-placeholder: #6b7280;--oc-text-inverse: #282828;--oc-border-primary: #282828;--oc-border-secondary: #4b5563;--oc-primary: #3b82f6;--oc-primary-hover: #2563eb;--oc-primary-bg: rgba(59, 130, 246, .15);--oc-danger: #ef4444;--oc-danger-hover: #dc2626;--oc-danger-active: #b91c1c;--oc-success: #10b981;--oc-overlay: rgba(26, 26, 26, .9);--oc-tooltip-bg: #282828;--oc-dialog-overlay: rgba(0, 0, 0, .7);--oc-thinking-gradient-1: #34d399;--oc-thinking-gradient-2: #10b981;--oc-thinking-glow: rgba(52, 211, 153, .3);--oc-thinking-glow-strong: rgba(52, 211, 153, .6);--oc-skeleton-bg: #151515;--oc-skeleton-gradient: linear-gradient(90deg, #282828 25%, #4b5563 50%, #282828 75%);--oc-shadow-sm: 0 2px 4px rgba(0, 0, 0, .3);--oc-shadow-md: 0 4px 12px rgba(0, 0, 0, .4);--oc-shadow-lg: 0 8px 32px rgba(0, 0, 0, .4);--oc-shadow-xl: 0 20px 60px rgba(0, 0, 0, .6);--oc-shadow-primary: 0 2px 4px rgba(59, 130, 246, .3);--oc-shadow-primary-hover: 0 4px 6px rgba(59, 130, 246, .4);--oc-shadow-danger: 0 4px 12px rgba(239, 68, 68, .4);--oc-trigger-bg: #60a5fa;--oc-trigger-bg-hover: #3b82f6;--oc-trigger-bg-active: #2563eb;--oc-trigger-shadow: 0 2px 8px rgba(96, 165, 250, .4);--oc-trigger-shadow-hover: 0 4px 12px rgba(96, 165, 250, .5);--oc-trigger-shadow-active: 0 4px 12px rgba(96, 165, 250, .6)}.opencode-chat{position:fixed;bottom:20px;width:700px;height:86vh;max-height:calc(100vh - 40px);background:var(--oc-bg-main);border-radius:16px;box-shadow:var(--oc-shadow-lg);overflow:hidden;opacity:0;visibility:hidden;transform:translate3d(var(---chatAnimationOrigin\.x),var(---chatAnimationOrigin\.y),0) scale(.95);transition:all .3s ease;display:flex;flex-direction:column;z-index:99999}.opencode-chat.open{opacity:1;visibility:visible;transform:translateZ(0) scale(1)}.opencode-chat.no-transition,.opencode-chat.no-transition.open{transition:none!important}.opencode-chat.minimized{width:320px;height:320px}.opencode-chat.minimized .opencode-iframe-container{margin-top:-146px}.opencode-chat-content{display:flex;flex:1;overflow:hidden}.opencode-notification{position:absolute;top:20px;left:50%;transform:translate(-50%);padding:12px 24px;background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff;border-radius:10px;font-size:14px;font-weight:500;box-shadow:0 4px 16px #3b82f666,0 0 0 2px #3b82f633;animation:slideDown .3s ease;z-index:10000000;display:flex;align-items:center;gap:10px}.opencode-notification:before{content:"\1f4a1";font-size:16px}.opencode-dialog-overlay{position:fixed;inset:0;background:var(--oc-dialog-overlay);display:flex;align-items:center;justify-content:center;z-index:9999999;animation:fadeIn .2s ease}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.opencode-dialog{background:var(--oc-bg-main);border-radius:12px;padding:24px;min-width:320px;max-width:400px;box-shadow:var(--oc-shadow-xl);animation:scaleIn .2s ease}@keyframes scaleIn{0%{transform:scale(.9);opacity:0}to{transform:scale(1);opacity:1}}.opencode-dialog-content{margin-bottom:20px}.opencode-dialog-message{font-size:15px;color:var(--oc-text-primary);line-height:1.5}.opencode-dialog-actions{display:flex;gap:12px;justify-content:flex-end}.opencode-dialog-btn{padding:10px 20px;border-radius:8px;border:none;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s}.opencode-dialog-btn.cancel{background:var(--oc-bg-tertiary);color:var(--oc-text-primary)}.opencode-dialog-btn.cancel:hover{background:var(--oc-text-primary);color:var(--oc-bg-main)}.opencode-dialog-btn.confirm{background:var(--oc-danger);color:#fff}.opencode-dialog-btn.confirm:hover{background:var(--oc-danger-hover)}@keyframes slideDown{0%{transform:translate(-50%) translateY(-100%);opacity:0}to{transform:translate(-50%) translateY(0);opacity:1}}.opencode-page-notification{position:fixed;top:20px;left:50%;transform:translate(-50%);padding:12px 24px;background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff;border-radius:10px;font-size:14px;font-weight:500;box-shadow:0 4px 16px #3b82f666,0 0 0 2px #3b82f633;animation:slideDown .3s ease;z-index:2147483647;display:flex;align-items:center;gap:10px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.opencode-page-notification:before{content:"\1f4a1";font-size:16px}.opencode-element-highlight{position:fixed;pointer-events:none;z-index:999998;border-radius:4px}#vue-inspector-container{display:none!important}.opencode-element-tooltip{position:fixed;background:var(--oc-tooltip-bg);color:#fff;padding:8px 12px;border-radius:6px;font-size:12px;z-index:9999998;box-shadow:var(--oc-shadow-md);max-width:300px;pointer-events:none;line-height:1}.opencode-tooltip-tag{font-weight:500;margin-bottom:4px;word-break:break-all}.opencode-tooltip-file{font-size:11px;color:var(--oc-text-placeholder);word-break:break-all}.opencode-element-highlight-temp{position:absolute;pointer-events:none;z-index:999998;border-radius:4px;animation:highlight-pulse 2s ease-out forwards}@keyframes highlight-pulse{0%{opacity:1;transform:scale(1)}50%{opacity:.8;transform:scale(1.02)}to{opacity:0;transform:scale(1)}}@media(max-width:768px){.opencode-chat{width:calc(100vw - 40px);height:calc(100vh - 100px)}}body.has-opencode-split{transition:padding .3s ease;min-width:auto}body.has-opencode-split-right{padding-right:var(--opencode-split-width, 500px)}body.has-opencode-split-left{padding-left:var(--opencode-split-width, 500px)}.opencode-widget.extension-mode{position:relative;width:100%;height:100%;display:flex}.opencode-widget.extension-mode .opencode-select-mode-hint,.opencode-widget.extension-mode .opencode-dialog-overlay{position:absolute}
2
2
  .opencode-chat{position:fixed;bottom:20px;width:700px;height:86vh;max-height:calc(100vh - 40px);background:var(--oc-bg-main);border-radius:16px;box-shadow:var(--oc-shadow-lg);overflow:hidden;display:flex;flex-direction:column;z-index:99999}.opencode-chat:not(.split-mode){opacity:0;visibility:hidden;transition:all .3s ease;transform:translate3d(var(---animationOrigin\.x),var(---animationOrigin\.y),0) scale(.95)}.opencode-chat.split-mode{position:fixed;top:0;bottom:0;height:100vh;max-height:100vh;border-radius:0;box-shadow:var(--oc-shadow-lg);overflow:visible;opacity:1;visibility:visible;transition:transform .3s ease}.opencode-chat.split-mode.split-right{right:0;border-left:1px solid var(--oc-border-primary);transform:translate(100%)}.opencode-chat.split-mode.split-left{left:0;border-right:1px solid var(--oc-border-primary);transform:translate(-100%)}.opencode-chat.split-mode .opencode-chat-content{overflow:hidden;flex:1}.opencode-chat.split-mode.open{transform:translate(0)}.opencode-chat.split-mode.dragging{transition:none}.opencode-chat.dragging .opencode-iframe{pointer-events:none}.opencode-chat.extension-mode{position:static;width:100%;height:100%;bottom:auto;left:auto;right:auto;border-radius:0;border-left:none;border-right:none;max-height:none;box-shadow:none;transform:none;opacity:1;visibility:visible}.opencode-chat:not(.split-mode){opacity:0;visibility:hidden;transition:all .3s ease}.opencode-chat:not(.split-mode).open{opacity:1;visibility:visible;transform:translateZ(0) scale(1)}.opencode-chat.no-transition,.opencode-chat.no-transition.open{transition:none!important}.opencode-chat.minimized:not(.split-mode){width:320px;height:320px}.opencode-chat.minimized:not(.split-mode) .opencode-iframe-container{margin-top:-146px}.opencode-chat-content{display:flex;flex:1;overflow:hidden}.opencode-session-empty{padding:24px;text-align:center;color:var(--oc-text-placeholder);font-size:14px}.opencode-split-toggle-btn{position:absolute;left:-21px;top:50%;transform:translateY(-50%);width:20px;height:48px;background:#fff;border:none;border-radius:8px 0 0 8px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:#667eea;box-shadow:0 4px 12px #667eea66;transition:all .3s ease;z-index:5;transform-origin:right center}.opencode-split-toggle-btn.split-left{left:auto;right:-21px;border-radius:0 8px 8px 0;transform-origin:left center}.opencode-split-toggle-btn:hover{transform:translateY(-50%) scale(1.1);box-shadow:0 6px 16px #667eea80}.opencode-split-toggle-btn.split-left:hover{transform:translateY(-50%) scale(1.1)}.opencode-split-toggle-btn.opencode-theme-dark{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;box-shadow:0 4px 12px #667eea4d}.opencode-split-toggle-btn.opencode-theme-dark:before{content:"";position:absolute;inset:-2px 0 -2px -2px;border-radius:8px 0 0 8px;background:linear-gradient(135deg,#8b9cf5,#9d6bc7);z-index:-1}.opencode-split-toggle-btn.opencode-theme-dark.split-left:before{left:0;right:-2px;border-radius:0 8px 8px 0}.opencode-split-toggle-btn.opencode-theme-dark:hover{box-shadow:0 6px 16px #667eea66}.opencode-split-toggle-btn.thinking{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;animation:split-thinking-glow 2s ease-in-out infinite,split-thinking-pulse 2s ease-in-out infinite;box-shadow:0 0 20px #667eea99,0 0 40px #764ba266,0 0 60px #667eea33}.opencode-split-toggle-btn.thinking:before{content:"";position:absolute;inset:-2px 0 -2px -2px;border-radius:8px 0 0 8px;background:linear-gradient(135deg,#8b9cf5,#9d6bc7);z-index:-1}.opencode-split-toggle-btn.thinking.split-left:before{left:0;right:-2px;border-radius:0 8px 8px 0}.opencode-split-toggle-btn.thinking:after{content:"";position:absolute;inset:-3px -1px -3px -3px;border-radius:8px 0 0 8px;background:conic-gradient(from 180deg,transparent,rgba(102,126,234,.3),transparent,rgba(118,75,162,.3),transparent);z-index:-2;animation:split-thinking-rotate 2s linear infinite reverse;filter:blur(8px)}.opencode-split-toggle-btn.thinking.split-left:after{left:-1px;right:-3px;border-radius:0 8px 8px 0}@keyframes split-thinking-glow{0%,to{box-shadow:0 0 20px #667eea99,0 0 40px #764ba266,0 0 60px #667eea33}50%{box-shadow:0 0 30px #667eeacc,0 0 60px #764ba299,0 0 90px #667eea4d}}@keyframes split-thinking-rotate{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes split-thinking-pulse{0%,to{transform:translateY(-50%) scale(1)}50%{transform:translateY(-50%) scale(.92)}}.opencode-split-toggle-icon{display:flex;align-items:center;justify-content:center;transition:transform .25s ease}.opencode-split-toggle-btn:hover .opencode-split-toggle-icon{transform:scale(1.1)}
3
3
  .opencode-iframe-container{flex:1;position:relative;overflow:hidden;display:flex;flex-direction:column}.opencode-loading-overlay{position:absolute;inset:0;background:var(--oc-overlay-bg);display:none;flex-direction:column;align-items:center;justify-content:center;z-index:10;transition:opacity .3s ease}.opencode-loading-overlay.visible{display:flex}.opencode-loading-spinner{width:40px;height:40px;border:3px solid var(--oc-border-primary);border-top-color:var(--oc-primary);border-radius:50%;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.opencode-loading-text{margin-top:12px;font-size:14px;color:var(--oc-text-placeholder)}.opencode-error-overlay{position:absolute;inset:0;z-index:15;display:none}.opencode-error-overlay.visible{display:flex}.opencode-empty-state-overlay{position:absolute;inset:0;background:var(--oc-bg-secondary);display:none;flex-direction:column;align-items:center;justify-content:center;z-index:5;transition:opacity .3s ease}.opencode-empty-state-overlay.visible{display:flex}.opencode-empty-state-icon{color:var(--oc-text-placeholder);margin-bottom:16px}.opencode-empty-state-text{color:var(--oc-text-primary);font-size:16px;font-weight:500;margin-bottom:24px}.opencode-empty-state-btn{padding:10px 24px;border-radius:8px;border:none;background:var(--oc-primary);color:#fff;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s;box-shadow:var(--oc-shadow-primary)}.opencode-empty-state-btn:hover{background:var(--oc-primary-hover);transform:translateY(-1px);box-shadow:var(--oc-shadow-primary-hover)}.opencode-empty-state-btn:active{transform:translateY(0)}.opencode-iframe{width:100%;height:100%;border:none}
4
- .opencode-chat-header{position:relative;flex-shrink:0;display:flex;align-items:center;justify-content:space-between;padding:0 12px;height:40px;background:var(--oc-bg-secondary);border-bottom:1px solid var(--oc-border-primary);z-index:5}.opencode-chat-header-left{display:flex;align-items:center;gap:4px}.opencode-chat-header-title{font-size:14px;font-weight:600;color:var(--oc-text-primary);position:absolute;left:50%;transform:translate(-50%)}.opencode-chat-header-actions{display:flex;gap:4px}.opencode-header-btn{width:28px;height:28px;border-radius:6px;border:none;background:transparent;color:var(--oc-text-placeholder);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s}.opencode-header-btn:hover{background:var(--oc-bg-tertiary);color:var(--oc-text-primary)}.opencode-header-btn.close:hover{background:var(--oc-danger);color:#fff}.opencode-header-btn.select-btn.active,.opencode-header-btn.session-toggle.active{background:var(--oc-primary);color:#fff}
4
+ .opencode-chat-header{position:relative;flex-shrink:0;display:flex;align-items:center;justify-content:space-between;padding:0 12px;height:40px;background:var(--oc-bg-secondary);border-bottom:1px solid var(--oc-border-primary);z-index:5}.opencode-chat-header-left{display:flex;align-items:center;gap:4px}.opencode-chat-header-title{font-size:14px;font-weight:600;color:var(--oc-text-primary);position:absolute;left:50%;transform:translate(-50%)}.opencode-chat-header-actions{display:flex;gap:4px}.opencode-header-btn{width:28px;height:28px;border-radius:6px;border:none;background:transparent;color:var(--oc-text-placeholder);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s}.opencode-header-btn:hover{background:var(--oc-bg-tertiary);color:var(--oc-text-primary)}.opencode-header-btn.close:hover{background:var(--oc-danger);color:#fff}.opencode-header-btn.select-btn.active,.opencode-header-btn.session-toggle.active,.opencode-header-btn.review-panel.active{background:var(--oc-primary);color:#fff}
5
5
  .opencode-session-list{width:240px;background:var(--oc-bg-secondary);border-right:1px solid var(--oc-border-primary);display:flex;flex-direction:column;flex-shrink:0;transition:width .2s ease}.opencode-session-list.collapsed{width:0;overflow:hidden}.opencode-session-list.collapsed .opencode-session-list-header,.opencode-session-list.collapsed .opencode-session-list-content{display:none}.opencode-session-list-header{padding:16px;border-bottom:1px solid var(--oc-border-primary);display:flex;justify-content:space-between;align-items:center;font-weight:600;font-size:14px;color:var(--oc-text-primary)}.opencode-new-session-btn{width:28px;height:28px;border-radius:6px;border:none;background:var(--oc-primary);color:#fff;font-size:18px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s}.opencode-new-session-btn:hover{background:var(--oc-primary-hover);transform:scale(1.05)}.opencode-session-list-content{flex:1;overflow-y:auto;padding:8px;position:relative}.opencode-session-list-loading-overlay{position:absolute;inset:0;background:var(--oc-overlay-bg);display:flex;align-items:center;justify-content:center;z-index:10;border-radius:8px}.opencode-loading-spinner.small{width:24px;height:24px;border-width:2px}.opencode-session-item{padding:12px;border-radius:8px;cursor:pointer;transition:transform .2s;margin-bottom:4px;color:var(--oc-text-primary)}.opencode-session-item:hover{background:var(--oc-bg-tertiary)}.opencode-session-item.active{background:var(--oc-primary);color:#fff;transition:none}.opencode-session-title{font-size:14px;font-weight:500;margin-bottom:4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.opencode-session-meta{font-size:12px;opacity:.6}.opencode-session-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:4px}.opencode-session-delete-btn{width:20px;height:20px;border-radius:4px;border:none;background:transparent;color:var(--oc-text-placeholder);font-size:16px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s;opacity:0;flex-shrink:0}.opencode-session-item:hover .opencode-session-delete-btn{opacity:1}.opencode-session-delete-btn:hover{background:var(--oc-danger);color:#fff}.opencode-session-item.active .opencode-session-delete-btn{color:#ffffffb3}.opencode-session-item.active .opencode-session-delete-btn:hover{background:#fff3;color:#fff}.opencode-session-header-skeleton{padding:16px;border-bottom:1px solid var(--oc-border-primary);display:none;justify-content:space-between;align-items:center}.opencode-session-header-skeleton.visible{display:flex}.opencode-skeleton-header-title{height:18px;width:80px;background:var(--oc-skeleton-gradient);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:4px}.opencode-skeleton-header-btn{width:28px;height:28px;background:var(--oc-skeleton-gradient);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:6px}.opencode-session-skeleton{flex:1;overflow-y:auto;padding:8px;display:none}.opencode-session-skeleton.visible{display:block}.opencode-skeleton-item{padding:12px;border-radius:8px;margin-bottom:4px;background:var(--oc-skeleton-bg)}.opencode-skeleton-title{height:16px;background:var(--oc-skeleton-gradient);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:4px;margin-bottom:8px;width:70%}.opencode-skeleton-meta{height:12px;background:var(--oc-skeleton-gradient);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:4px;width:50%}.opencode-session-empty{padding:32px 16px;text-align:center;color:var(--oc-text-placeholder);font-size:13px}.opencode-thinking-loading{display:inline-block;width:12px;height:12px;margin-right:6px;border:2px solid var(--oc-border-secondary);border-top-color:var(--oc-text-secondary);border-radius:50%;animation:thinking-spin .8s linear infinite;vertical-align:middle}.opencode-session-item.active .opencode-thinking-loading{border-color:#ffffff4d;border-top-color:#ffffffe6}@keyframes thinking-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes skeleton-loading{0%{background-position:200% 0}to{background-position:-200% 0}}
6
6
  .opencode-right-toolbar{width:140px;background:var(--oc-bg-secondary);border-left:1px solid var(--oc-border-primary);display:flex;flex-direction:column;flex-shrink:0;transition:width .2s ease;overflow:hidden}.opencode-right-toolbar.collapsed{width:0;overflow:hidden}.opencode-right-toolbar.collapsed .opencode-selected-nodes-header,.opencode-right-toolbar.collapsed .opencode-selected-nodes,.opencode-right-toolbar.collapsed .opencode-clear-all-btn{display:none}.opencode-selected-nodes-header{padding:12px 8px 8px;border-bottom:1px solid var(--oc-border-primary)}.opencode-selected-nodes-title{font-size:14px;font-weight:600;color:var(--oc-text-primary);margin-bottom:4px}.opencode-selected-nodes-desc{font-size:11px;color:var(--oc-text-placeholder);line-height:1.4}.opencode-selected-nodes{flex:1;display:flex;flex-direction:column;padding:8px;gap:6px;overflow-y:auto;overflow-x:hidden}.opencode-selected-nodes:empty:before{content:"\6682\65e0\9009\4e2d\5143\7d20";color:var(--oc-text-placeholder);font-size:12px;text-align:center;padding:20px 10px}.opencode-selected-node{display:flex;align-items:center;gap:8px;padding:8px 10px;background:var(--oc-bg-main);border:1px solid var(--oc-border-primary);border-radius:6px;font-size:12px;transition:all .2s}.opencode-selected-node:hover{border-color:var(--oc-primary);box-shadow:var(--oc-shadow-primary)}.opencode-node-content{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.opencode-node-text{color:var(--oc-text-primary);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.opencode-node-file{color:var(--oc-text-placeholder);font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.opencode-node-remove{width:18px;height:18px;border-radius:4px;border:none;background:transparent;color:var(--oc-text-placeholder);cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:14px;transition:all .2s;flex-shrink:0}.opencode-node-remove:hover{background:var(--oc-danger);color:#fff}.opencode-clear-all-btn{width:calc(100% - 16px);margin:8px;padding:8px 12px;border-radius:6px;border:none;background:var(--oc-danger);color:#fff;font-size:12px;font-weight:500;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:4px;transition:all .2s}.opencode-clear-all-btn:hover{background:var(--oc-danger-hover);transform:scale(1.02)}
7
7
  .opencode-resize-handle{position:absolute;left:0;top:0;bottom:0;width:6px;cursor:col-resize;background:transparent;z-index:10;transition:background .2s ease}.opencode-resize-handle.handle-left{left:auto;right:0}.opencode-resize-handle:hover,.opencode-resize-handle.resizing{background:var(--oc-primary-bg)}.opencode-resize-handle:after{content:"";position:absolute;left:2px;top:50%;transform:translateY(-50%);width:2px;height:40px;background:var(--oc-border-secondary);border-radius:1px;opacity:0;transition:opacity .2s ease}.opencode-resize-handle.handle-left:after{left:auto;right:2px}.opencode-resize-handle:hover:after,.opencode-resize-handle.resizing:after{opacity:1}
8
- .opencode-select-mode-hint{position:fixed;top:20px;left:50%;transform:translate(-50%);padding:10px;background:linear-gradient(135deg,#ef4444,#dc2626);color:#fff;border-radius:12px;font-size:14px;font-weight:500;box-shadow:0 6px 20px #ef444480,0 0 0 3px #ef44444d;z-index:9999999;display:none;align-items:center;gap:12px;border:1px solid rgba(255,255,255,.3)}.opencode-select-mode-hint.visible{display:flex;animation:slideDown .3s ease,pulseHint 2s ease-in-out infinite}.opencode-hint-shortcut{padding:4px 10px;background:#ffffff40;border-radius:6px;font-size:13px;font-weight:600;border:1px solid rgba(255,255,255,.4)}@keyframes pulseHint{0%,to{box-shadow:0 6px 20px #ef444480,0 0 0 3px #ef44444d}50%{box-shadow:0 6px 20px #ef444499,0 0 0 6px #ef444466}}
8
+ .opencode-select-mode-hint{position:fixed;top:16px;left:50%;transform:translate(-50%) translateY(-16px);width:280px;padding:8px 14px;background:linear-gradient(135deg,#ef4444,#dc2626);color:#fff;border-radius:18px;font-size:13px;font-weight:500;line-height:1.4;box-shadow:0 6px 20px #ef444480,0 0 0 3px #ef44444d;z-index:9999999;display:none;flex-direction:column;align-items:center;justify-content:center;gap:6px;border:1px solid rgba(255,255,255,.25);opacity:0;transition:opacity .2s ease,transform .25s cubic-bezier(.16,1,.3,1);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);box-sizing:border-box}.opencode-select-mode-hint.visible{display:flex;opacity:1;transform:translate(-50%) translateY(0);animation:hintSlideIn .3s cubic-bezier(.16,1,.3,1),pulseHint 2s ease-in-out .3s infinite}.opencode-hint-main{display:inline-flex;align-items:center;gap:8px;min-width:0}.opencode-hint-icon{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:50%;background:#fff3;color:#fff;flex-shrink:0}.opencode-hint-icon svg{display:block}.opencode-hint-text{font-size:13px;font-weight:500;letter-spacing:.2px;white-space:nowrap;text-shadow:0 1px 2px rgba(0,0,0,.15)}.opencode-hint-shortcut{display:inline-flex;align-items:center;padding:4px 10px;background:#0000002e;border-radius:999px;font-size:12px;font-weight:600;letter-spacing:.3px;border:1px solid rgba(255,255,255,.2);white-space:nowrap;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,monospace}@keyframes hintSlideIn{0%{opacity:0;transform:translate(-50%) translateY(-16px)}to{opacity:1;transform:translate(-50%) translateY(0)}}@keyframes pulseHint{0%,to{box-shadow:0 6px 20px #ef444480,0 0 0 3px #ef44444d}50%{box-shadow:0 6px 20px #ef444499,0 0 0 6px #ef444466}}
9
9
  .opencode-button{width:42px;height:42px;border-radius:50%;background:#fff;border:none;cursor:pointer;box-shadow:0 4px 12px #667eea66;transition:all .3s ease;display:flex;align-items:center;justify-content:center;padding:0;position:relative}.opencode-button svg{transform:rotate(180deg) scale(1.1);transition:transform .3s ease;width:100%;height:100%;display:block}.opencode-button:hover svg{transform:rotate(180deg) scale(1.1)}.opencode-button:hover{transform:scale(1.1);box-shadow:0 6px 16px #667eea80}.opencode-button.thinking{background:linear-gradient(135deg,#667eea,#764ba2);animation:thinking-glow 2s ease-in-out infinite,thinking-pulse 2s ease-in-out infinite;box-shadow:0 0 20px #667eea99,0 0 40px #764ba266,0 0 60px #667eea33}.opencode-button.thinking svg path{fill:#fff}.opencode-button.thinking:before{content:"";position:absolute;inset:-2px;border-radius:50%;background:linear-gradient(135deg,#8b9cf5,#9d6bc7);z-index:-1}.opencode-button.thinking:after{content:"";position:absolute;inset:-3px;border-radius:50%;background:conic-gradient(from 180deg,transparent,rgba(102,126,234,.3),transparent,rgba(118,75,162,.3),transparent);z-index:-2;animation:thinking-rotate 2s linear infinite reverse;filter:blur(8px)}@keyframes thinking-glow{0%,to{box-shadow:0 0 20px #667eea99,0 0 40px #764ba266,0 0 60px #667eea33}50%{box-shadow:0 0 30px #667eeacc,0 0 60px #764ba299,0 0 90px #667eea4d}}@keyframes thinking-rotate{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes thinking-pulse{0%,to{transform:scale(1)}50%{transform:scale(.92)}}.opencode-button.opencode-theme-dark{background:linear-gradient(135deg,#667eea,#764ba2);box-shadow:0 4px 12px #667eea4d}.opencode-button.opencode-theme-dark:before{content:"";position:absolute;inset:-2px;border-radius:50%;background:linear-gradient(135deg,#8b9cf5,#9d6bc7);z-index:-1}.opencode-button.opencode-theme-dark:hover{box-shadow:0 6px 16px #667eea66}.opencode-button.opencode-theme-dark svg path{fill:#fff}
10
10
  .floating-bubble{position:fixed;top:0;left:0;z-index:999999;cursor:grab;-webkit-user-select:none;-moz-user-select:none;user-select:none;touch-action:none;will-change:transform}.floating-bubble:active{cursor:grabbing}body.floating-bubble-dragging *{pointer-events:none!important}body.floating-bubble-dragging .floating-bubble,body.floating-bubble-dragging .floating-bubble *{pointer-events:auto!important}
11
11
  /*$vite$:1*/
package/lib/index.cjs CHANGED
@@ -34,7 +34,7 @@ __export(lib_exports, {
34
34
  });
35
35
  module.exports = __toCommonJS(lib_exports);
36
36
  var import_open_code_widget = __toESM(require("./open-code-widget/index.cjs"));
37
- const version = "1.0.92";
37
+ const version = "1.0.93";
38
38
  function install(app, options) {
39
39
  const components = [
40
40
  import_open_code_widget.default
package/lib/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import OpenCodeWidget from './open-code-widget';
2
2
  import type { App } from 'vue';
3
- declare const version = "1.0.92";
3
+ declare const version = "1.0.93";
4
4
  declare function install(app: App<any>, options?: any): void;
5
5
  export { install, version, OpenCodeWidget };
6
6
  export default install;
@@ -56,6 +56,7 @@ function usePersistState(options) {
56
56
  open: options.open.value,
57
57
  minimized: options.minimized.value,
58
58
  promptDockVisible: options.promptDockVisible.value,
59
+ reviewPanelVisible: options.reviewPanelVisible.value,
59
60
  bubbleOffset: options.bubbleOffset.value,
60
61
  theme: options.theme.value,
61
62
  sessionListCollapsed: options.sessionListCollapsed.value,
@@ -71,6 +72,7 @@ function usePersistState(options) {
71
72
  options.open,
72
73
  options.minimized,
73
74
  options.promptDockVisible,
75
+ options.reviewPanelVisible,
74
76
  options.bubbleOffset,
75
77
  options.theme,
76
78
  options.sessionListCollapsed
@@ -5,6 +5,7 @@ export interface WidgetPersistState {
5
5
  open: boolean;
6
6
  minimized: boolean;
7
7
  promptDockVisible: boolean;
8
+ reviewPanelVisible: boolean;
8
9
  bubbleOffset?: FloatingBubbleOffset;
9
10
  theme: OpenCodeWidgetTheme;
10
11
  sessionListCollapsed: boolean;
@@ -16,6 +17,7 @@ export interface UsePersistStateOptions {
16
17
  open: Ref<boolean>;
17
18
  minimized: Ref<boolean>;
18
19
  promptDockVisible: Ref<boolean>;
20
+ reviewPanelVisible: Ref<boolean>;
19
21
  bubbleOffset: Ref<FloatingBubbleOffset | undefined>;
20
22
  theme: Ref<OpenCodeWidgetTheme>;
21
23
  sessionListCollapsed: Ref<boolean>;
@@ -141,14 +141,14 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {
141
141
  }) | null>;
142
142
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
143
143
  resize: (width: number) => any;
144
- toggle: () => any;
145
144
  "resize-start": () => any;
146
145
  "resize-end": () => any;
146
+ toggle: () => any;
147
147
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
148
148
  onResize?: ((width: number) => any) | undefined;
149
- onToggle?: (() => any) | undefined;
150
149
  "onResize-start"?: (() => any) | undefined;
151
150
  "onResize-end"?: (() => any) | undefined;
151
+ onToggle?: (() => any) | undefined;
152
152
  }>, {
153
153
  extension: boolean;
154
154
  resolvedTheme: "light" | "dark";
@@ -58,13 +58,6 @@ const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)({
58
58
  if (!((_a = iframeRef.value) == null ? void 0 : _a.contentWindow)) return;
59
59
  iframeRef.value.contentWindow.postMessage(__spreadValues({ type }, data), "*");
60
60
  }
61
- (0, import_vue2.onMounted)(() => {
62
- if (iframeRef.value) {
63
- iframeRef.value.addEventListener("load", () => {
64
- handleFrameLoaded();
65
- });
66
- }
67
- });
68
61
  __expose({
69
62
  sendMessageToIframe
70
63
  });
@@ -85,7 +78,7 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
85
78
  },
86
79
  [
87
80
  (0, import_vue3.renderSlot)(_ctx.$slots, "empty-state", {}, () => [
88
- _cache[1] || (_cache[1] = (0, import_vue3.createElementVNode)(
81
+ _cache[2] || (_cache[2] = (0, import_vue3.createElementVNode)(
89
82
  "div",
90
83
  { class: "opencode-empty-state-icon" },
91
84
  [
@@ -138,14 +131,14 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
138
131
  },
139
132
  [
140
133
  (0, import_vue3.renderSlot)(_ctx.$slots, "loading", {}, () => [
141
- _cache[2] || (_cache[2] = (0, import_vue3.createElementVNode)(
134
+ _cache[3] || (_cache[3] = (0, import_vue3.createElementVNode)(
142
135
  "div",
143
136
  { class: "opencode-loading-spinner" },
144
137
  null,
145
138
  -1
146
139
  /* CACHED */
147
140
  )),
148
- _cache[3] || (_cache[3] = (0, import_vue3.createElementVNode)(
141
+ _cache[4] || (_cache[4] = (0, import_vue3.createElementVNode)(
149
142
  "div",
150
143
  { class: "opencode-loading-text" },
151
144
  "\u52A0\u8F7D\u4E2D...",
@@ -174,8 +167,9 @@ function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
174
167
  class: "opencode-iframe",
175
168
  src: $setup.iframeSrc,
176
169
  allow: "clipboard-write; clipboard-read",
177
- referrerpolicy: "origin"
178
- }, null, 8, _hoisted_3)
170
+ referrerpolicy: "origin",
171
+ onLoad: _cache[1] || (_cache[1] = (...args) => $setup.handleFrameLoaded && $setup.handleFrameLoaded(...args))
172
+ }, null, 40, _hoisted_3)
179
173
  ])
180
174
  ]);
181
175
  }
@@ -1 +1 @@
1
- .opencode-chat-header{position:relative;flex-shrink:0;display:flex;align-items:center;justify-content:space-between;padding:0 12px;height:40px;background:var(--oc-bg-secondary);border-bottom:1px solid var(--oc-border-primary);z-index:5}.opencode-chat-header-left{display:flex;align-items:center;gap:4px}.opencode-chat-header-title{font-size:14px;font-weight:600;color:var(--oc-text-primary);position:absolute;left:50%;transform:translate(-50%)}.opencode-chat-header-actions{display:flex;gap:4px}.opencode-header-btn{width:28px;height:28px;border-radius:6px;border:none;background:transparent;color:var(--oc-text-placeholder);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s}.opencode-header-btn:hover{background:var(--oc-bg-tertiary);color:var(--oc-text-primary)}.opencode-header-btn.close:hover{background:var(--oc-danger);color:#fff}.opencode-header-btn.select-btn.active,.opencode-header-btn.session-toggle.active{background:var(--oc-primary);color:#fff}
1
+ .opencode-chat-header{position:relative;flex-shrink:0;display:flex;align-items:center;justify-content:space-between;padding:0 12px;height:40px;background:var(--oc-bg-secondary);border-bottom:1px solid var(--oc-border-primary);z-index:5}.opencode-chat-header-left{display:flex;align-items:center;gap:4px}.opencode-chat-header-title{font-size:14px;font-weight:600;color:var(--oc-text-primary);position:absolute;left:50%;transform:translate(-50%)}.opencode-chat-header-actions{display:flex;gap:4px}.opencode-header-btn{width:28px;height:28px;border-radius:6px;border:none;background:transparent;color:var(--oc-text-placeholder);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s}.opencode-header-btn:hover{background:var(--oc-bg-tertiary);color:var(--oc-text-primary)}.opencode-header-btn.close:hover{background:var(--oc-danger);color:#fff}.opencode-header-btn.select-btn.active,.opencode-header-btn.session-toggle.active,.opencode-header-btn.review-panel.active{background:var(--oc-primary);color:#fff}