cardbuddy 0.12.1 → 0.12.2

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 (65) hide show
  1. package/README.md +11 -5
  2. package/dist/config.js +4 -4
  3. package/dist/preview-editor/assets/{index-CHuGGIR3.js → index-CjZzK7u7.js} +14 -14
  4. package/dist/preview-editor/index.html +1 -1
  5. package/dist/standalone.js +5 -5
  6. package/dist/vendored/{preview → card-editor}/api.js +1 -1
  7. package/dist/vendored/{preview → card-editor}/components/SvgSymbols.vue +1 -1
  8. package/dist/vendored/server/core/nodeModels.js +1 -1
  9. package/dist/vendored/server/core/renderStatus.js +1 -1
  10. package/dist/vendored/skills/card-skill-trainer/SKILL.md +1 -1
  11. package/dist/vendored/skills/dsl-card-ai/SKILL.md +1 -1
  12. package/dist/vendored/skills/dsl-card-generator/references/expression_engine.md +1 -1
  13. package/dist/vendored/skills/dsl-card-generator/references/generation_pitfalls.md +1 -1
  14. package/dist/vendored/skills/dsl-card-generator/references/rules.md +1 -1
  15. package/dist/vendored/skills/dsl-card-generator/references/slices_convention.md +1 -1
  16. package/dist/vendored/skills/dsl-card-generator/scripts/lint_autofix.mjs +1 -1
  17. package/dist/vendored/skills/dsl-card-generator/scripts/lint_card.mjs +2 -2
  18. package/dist/vendored/skills/dsl-card-generator/vendor/preview/assets/standalone-BCLshIzC.css +1 -0
  19. package/dist/vendored/skills/dsl-card-generator/vendor/preview/assets/standalone-pP5kTKiI.js +88 -0
  20. package/dist/vendored/skills/dsl-card-generator/vendor/preview/standalone.html +2 -2
  21. package/dist/vendored/skills/finmall-card-sync/SKILL.md +2 -2
  22. package/package.json +1 -1
  23. package/dist/vendored/skills/dsl-card-generator/vendor/preview/assets/standalone-C9k-07y7.css +0 -1
  24. package/dist/vendored/skills/dsl-card-generator/vendor/preview/assets/standalone-oFRM4f4V.js +0 -55
  25. /package/dist/vendored/{preview → card-editor}/assets/default-image.png +0 -0
  26. /package/dist/vendored/{preview → card-editor}/assets/svg-symbols.svg +0 -0
  27. /package/dist/vendored/{preview → card-editor}/components/AbsoluteLayout.vue +0 -0
  28. /package/dist/vendored/{preview → card-editor}/components/Button.vue +0 -0
  29. /package/dist/vendored/{preview → card-editor}/components/Canvas.vue +0 -0
  30. /package/dist/vendored/{preview → card-editor}/components/CheckGroup.vue +0 -0
  31. /package/dist/vendored/{preview → card-editor}/components/Column.vue +0 -0
  32. /package/dist/vendored/{preview → card-editor}/components/CustomPlaceholder.vue +0 -0
  33. /package/dist/vendored/{preview → card-editor}/components/Divider.vue +0 -0
  34. /package/dist/vendored/{preview → card-editor}/components/GridLayout.vue +0 -0
  35. /package/dist/vendored/{preview → card-editor}/components/Icon.vue +0 -0
  36. /package/dist/vendored/{preview → card-editor}/components/Image.vue +0 -0
  37. /package/dist/vendored/{preview → card-editor}/components/Input.vue +0 -0
  38. /package/dist/vendored/{preview → card-editor}/components/ListLayout.vue +0 -0
  39. /package/dist/vendored/{preview → card-editor}/components/Map.vue +0 -0
  40. /package/dist/vendored/{preview → card-editor}/components/MultiColumn.vue +0 -0
  41. /package/dist/vendored/{preview → card-editor}/components/MultiText.vue +0 -0
  42. /package/dist/vendored/{preview → card-editor}/components/ProgressSlider.vue +0 -0
  43. /package/dist/vendored/{preview → card-editor}/components/RadioButton.vue +0 -0
  44. /package/dist/vendored/{preview → card-editor}/components/RenderTree.vue +0 -0
  45. /package/dist/vendored/{preview → card-editor}/components/Root.vue +0 -0
  46. /package/dist/vendored/{preview → card-editor}/components/Row.vue +0 -0
  47. /package/dist/vendored/{preview → card-editor}/components/SvgCode.vue +0 -0
  48. /package/dist/vendored/{preview → card-editor}/components/Text.vue +0 -0
  49. /package/dist/vendored/{preview → card-editor}/components/Video.vue +0 -0
  50. /package/dist/vendored/{preview → card-editor}/components/ViewContainer.vue +0 -0
  51. /package/dist/vendored/{preview → card-editor}/components/base.js +0 -0
  52. /package/dist/vendored/{preview → card-editor}/components/icons.js +0 -0
  53. /package/dist/vendored/{preview → card-editor}/components/index.js +0 -0
  54. /package/dist/vendored/{preview → card-editor}/meta/component-meta.json +0 -0
  55. /package/dist/vendored/{preview → card-editor}/meta/directive-meta.json +0 -0
  56. /package/dist/vendored/{preview → card-editor}/meta/style-meta.json +0 -0
  57. /package/dist/vendored/{preview → card-editor}/runtime/StyleParser.js +0 -0
  58. /package/dist/vendored/{preview → card-editor}/runtime/adapter.js +0 -0
  59. /package/dist/vendored/{preview → card-editor}/runtime/assets.js +0 -0
  60. /package/dist/vendored/{preview → card-editor}/runtime/canvas-context.js +0 -0
  61. /package/dist/vendored/{preview → card-editor}/runtime/card-runtime.js +0 -0
  62. /package/dist/vendored/{preview → card-editor}/runtime/evaluate.js +0 -0
  63. /package/dist/vendored/{preview → card-editor}/runtime/property.js +0 -0
  64. /package/dist/vendored/{preview → card-editor}/runtime/selectionOverlay.js +0 -0
  65. /package/dist/vendored/{preview → card-editor}/runtime/toPreview.js +0 -0
@@ -4,8 +4,8 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>CardBuddy Standalone Card Preview</title>
7
- <script type="module" crossorigin src="/assets/standalone-oFRM4f4V.js"></script>
8
- <link rel="stylesheet" crossorigin href="/assets/standalone-C9k-07y7.css">
7
+ <script type="module" crossorigin src="/assets/standalone-pP5kTKiI.js"></script>
8
+ <link rel="stylesheet" crossorigin href="/assets/standalone-BCLshIzC.css">
9
9
  </head>
10
10
  <body>
11
11
  <div id="app"></div>
@@ -121,7 +121,7 @@ node skills/finmall-card-sync/scripts/api_batch_sync.mjs --startPage 1
121
121
 
122
122
  | 入口 | 范围 | 说明 |
123
123
  |---|---|---|
124
- | 编辑器顶栏「远端 → 切图上传」 | 当前卡片 | 用户点击才执行,先二次确认;`preview/App.vue → uploadCardSlices()` → `POST /__slice-upload` |
124
+ | 编辑器顶栏「远端 → 切图上传」 | 当前卡片 | 用户点击才执行,先二次确认;`card-editor/App.vue → uploadCardSlices()` → `POST /__slice-upload` |
125
125
  | MCP `card_slice_upload` | 单卡(`cardId` 必填) | 需 dev server + FinMall 登录态,不支持离线降级 |
126
126
  | CLI(下方命令) | 默认全部卡片,可 `--cardId` 收窄 | 批量补做 / 排障用 |
127
127
 
@@ -242,7 +242,7 @@ python3 skills/dsl-card-generator/scripts/validate_all_schemas.py src/cards
242
242
 
243
243
  同时确认本次运行的 JSON 摘要中 `duplicates` 数组为空。非空的 `duplicates` 意味着两个卡片 code 解析出了字节完全相同的 schema,其数据不可信。
244
244
 
245
- > 早期版本用 `node -e "JSON.parse(...)"` 兜底校验——只能确认"JSON 语法合法",无法发现组件嵌套错误、属性键缺失、data.json 漂移等真问题。**已弃用**,统一走 `validate_schema.py`。校验器白名单从 `preview/meta/component-meta.json` 动态加载(P0 修复),新组件不会误报。
245
+ > 早期版本用 `node -e "JSON.parse(...)"` 兜底校验——只能确认"JSON 语法合法",无法发现组件嵌套错误、属性键缺失、data.json 漂移等真问题。**已弃用**,统一走 `validate_schema.py`。校验器白名单从 `card-editor/meta/component-meta.json` 动态加载(P0 修复),新组件不会误报。
246
246
 
247
247
  把无法解析 `schema.json` 或 `data.json`、或 `validate_schema.py` 报 ERROR 视为硬性失败;不要仅凭可见的页面文本就报告成功。
248
248
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cardbuddy",
3
- "version": "0.12.1",
3
+ "version": "0.12.2",
4
4
  "description": "Local dev service for the CardBuddy card editor — decouples card CRUD (sync/save/validate/render-status/screenshot) from the static public editor, so the editor can be deployed to any static host while each developer runs a local service against their own card source.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1 +0,0 @@
1
- .ce_map_view[data-v-b297e8af]{background-position:50%;background-repeat:no-repeat;background-size:100% 100%;width:100%;height:100%;min-height:160px;position:relative}.ce_map_grid[data-v-b297e8af]{width:100%;height:100%;position:absolute;inset:0}.ce_map_center[data-v-b297e8af]{pointer-events:none;flex-direction:column;align-items:center;display:flex;position:absolute;top:50%;left:50%;transform:translate(-50%,-100%)}.ce_map_pin[data-v-b297e8af]{filter:drop-shadow(0 2px 3px #00000040)}.ce_map_markname[data-v-b297e8af]{color:#333;white-space:nowrap;text-overflow:ellipsis;background:#ffffffe6;border-radius:4px;max-width:160px;margin-top:2px;padding:2px 6px;font-size:12px;line-height:1.3;overflow:hidden}.ce_multicolumn[data-v-cc3a8cee]{box-sizing:border-box;min-height:24px}.ce_divider{background-color:#00000026;width:100%;height:1px}.ce_image{aspect-ratio:16/9;display:flex}.ce_image_fill{background-position:50%;background-repeat:no-repeat;background-size:100% 100%;width:100%;height:100%}.ce_input{border:0;width:100%}.ce_input:focus{outline:none}.ce_text{text-overflow:ellipsis;box-orient:vertical;word-wrap:break-word;word-break:break-all;white-space:pre-line;text-align:left;-webkit-box-orient:vertical;width:fit-content;display:-webkit-box;display:-ms-flexbox;overflow:hidden}.ce_multitext{width:fit-content;display:flex}.ce_svgsymbols,.ce_svgcode{fill:#000;width:100%;height:100%}.ce_svgcode svg{width:100%;height:100%;fill:inherit}.ce_icon{font-size:0}.ce_button{-webkit-user-select:none;user-select:none;background-color:#0000;border:0}.ce_button.ce_button_disabled{color:#9a9a9a!important;background-color:#e6e6e6!important;border:none!important}.ce_map{position:relative}.ce_map .ce_map_view{background-position:50%;background-repeat:no-repeat;background-size:100% 100%;width:100%;height:100%}.ce_map .ce_map_view svg{width:100%;height:100%}.ce_map .ce_map_placeholder{z-index:1000;width:100%;height:100%;position:absolute;inset:0}.ce_svgcheckstyle{width:100%;height:100%}.ce_check_group .ce_check_list{flex-wrap:wrap;display:flex;overflow:hidden}.ce_check_group .ce_check_item{cursor:pointer;align-items:center;display:flex}.ce_check_group .ce_check_icon{flex:none;font-size:0}.ce_check_group .ce_check_text{text-overflow:ellipsis;white-space:nowrap;flex:auto;overflow:hidden}.ce_svgradiostyle{width:100%;height:100%}.ce_radio_button .ce_radio_item{cursor:pointer;align-items:center;display:flex}.ce_radio_button .ce_radio_icon{font-size:0}.ce_slider{align-items:center;display:flex}.ce_slider .ce_slider_rect{width:100%;position:relative}.ce_slider .ce_slider_bar{width:0;height:100%;position:absolute;top:0;left:0}.ce_slider .ce_slider_con{position:absolute;top:50%;left:0;transform:translateY(-50%)translate(-50%)}.ce_slider .ce_slider_block{background-repeat:no-repeat;background-size:100% 100%}.ce_slider .ce_hover,.ce_slider .ce_dragging{transform:scale(1.2)}.ce_video{position:relative}.ce_video .ce_video_elem{width:100%;height:100%}.ce_video .ce_video_poster{cursor:pointer;width:100%;height:100%;position:absolute;top:0;left:0}.ce_viewcontainer{width:100%}.ce_root{color:#000;flex-direction:column;line-height:1.5;display:flex;position:relative;overflow:hidden}.ce_row{display:flex}.ce_column{flex-direction:column;max-width:100%;display:flex}.ce_singlecolumn{flex-direction:column;width:100%;display:flex}.ce_multicolumn{justify-content:space-between;width:100%;display:flex}.ce_listlayout{width:100%}.ce_listlayout .ce_listlayout_con{box-sizing:border-box;flex-direction:column;width:100%;display:flex}.ce_listlayout .ce_listlayout_item{width:100%;display:flex}.ce_listlayout .ce_listlayout_horizontal{flex-flow:row;width:100%;height:100%;display:flex;overflow:auto hidden}.ce_listlayout .ce_listlayout_horizontal::-webkit-scrollbar{display:none}.ce_listlayout .ce_listlayout_horizontal .ce_listlayout_item{width:auto;height:100%;display:flex}.ce_gridlayout{flex-wrap:wrap;width:100%;display:flex}.ce_gridlayout .ce_gridlayout_item{width:100%;display:flex}.ce_absolutelayout{flex-direction:column;display:flex;position:relative}.ce_absolutelayout>*{z-index:1;position:absolute}.ce_absolutelayout_bottomright>*{z-index:1;position:static}:root{--bg-app:#0e0f13;--bg-bar:#15171c;--bg-panel:#181b21;--bg-stage:#0b0c0f;--bg-input:#1b1e25;--bg-hover:#232733;--bg-active:#2b2f3d;--bg-pop:#1c1f26f5;--bg-soft:#0f1219;--border:#2a2e38;--border-strong:#353b48;--text:#e8eaf0;--text-dim:#949aab;--text-faint:#626a7d;--accent:#6b83f7;--accent-2:#5a6ff0;--accent-soft:#6b83f724;--accent-border:#6b83f773;--accent-hover:#8195f9;--danger:#f87171;--danger-soft:#f8717124;--danger-hover:#ef4444;--warn:#fbbf24;--warn-soft:#fbbf2424;--warn-border:#fbbf2466;--ok:#34d399;--ok-soft:#34d39929;--ok-border:#34d39973;--ok-strong:#34d399;--info:#6b83f7;--info-soft:#6b83f724;--info-border:#6b83f773;--on-accent:#0f1115;--radius:8px;--radius-sm:6px;--shadow-pop:#0000008c;--shadow-card:#00000080;--shadow-drawer:#00000073;--shadow-toast:#00000047;--scrim:#0000008c;--scrim-soft:#00000073;--scrim-faint:#0006;--bar-grad:linear-gradient(180deg, #171a20, #131519);--splitter:#5b6cff;--splitter-grip:#ffffff47;--overlay-tint:#ffffff08;--overlay-tint-strong:#ffffff47;--err-item-fg:#ffb3a3;--api-item-fg:#bcd3ff;--api-item-border:#7c8cff33;--api-item-bg:#384c890f;--copy-ok:#8fe39a;--tag-ok-fg:#1a7f37;--tag-ok-bg:#1a7f3724;--tag-warn-fg:#b58105;--tag-warn-bg:#b5810529;--log-warn-fg:#e0b341;--log-warn-bg:#e0b34124;--log-warn-border:#e0b34159;--scroll-thumb:#949aab47;--scroll-thumb-hover:#949aab73;--jt-key:#9db4ff;--jt-string:#8fe39a;--jt-number:#f0b86e;--jt-boolean:#f08e8e;--jt-null:#626a7d;--jt-faint:#8b93a7;--jt-ring:#9db4ff40;--jt-del-fg:#f08e8e;--jt-del-bg:#f0646426;--jt-add-bg:#9db4ff1a;--st-label:#ccc;--st-id:#8b93a7;--st-badge-bg:#6b83f7;--st-badge-fg:#fff;--st-hl-bg:#6b83f747;--code-comment:#6b7280;--code-punc:#9ca3af;--code-prop:#f0883e;--code-str:#7ee787;--code-num:#79c0ff;--code-kw:#ff7b72;--code-fn:#d2a8ff;--code-var:#ffa657;--code-binding:#56d4dd;--code-warn:#f59e0b;--space-0:0;--space-1:4px;--space-2:8px;--space-3:12px;--space-4:16px;--space-5:20px;--space-6:24px;--space-7:32px;--space-8:40px;--space-9:48px;--fs-xs:11px;--lh-xs:16px;--fs-sm:12px;--lh-sm:18px;--fs-base:13px;--lh-base:20px;--fs-md:14px;--lh-md:22px;--fs-lg:15px;--lh-lg:22px;--fs-xl:16px;--lh-xl:24px;--fs-2xl:20px;--lh-2xl:28px;--radius-xs:4px;--radius-md:8px;--radius-lg:10px;--radius-xl:12px;--radius-2xl:16px;--radius-pill:999px;--ctrl-xs:24px;--ctrl-sm:28px;--ctrl-md:32px;--ctrl-lg:36px;--ctrl-xl:40px;--row-h:28px;--icon-xs:12px;--icon-sm:14px;--icon-md:16px;--icon-lg:20px;--icon-xl:24px;--stroke:1.75;--shadow-1:0 1px 2px var(--shadow-card);--shadow-2:0 4px 12px var(--shadow-card);--shadow-3:0 8px 24px var(--shadow-card);--shadow-4:0 20px 64px var(--shadow-pop);--shadow-5:-20px 0 32px var(--shadow-drawer);--z-base:1;--z-sticky:20;--z-overlay-low:50;--z-overlay:60;--z-pop:70;--z-panel:100;--z-modal:1000;--z-deviceui:1100;--z-appmodal:2000;--z-toast-app:2100}:root[data-theme=light]{--bg-app:#f4f5f7;--bg-bar:#fff;--bg-panel:#fff;--bg-stage:#e9ecf1;--bg-input:#eef1f5;--bg-hover:#e3e7ee;--bg-active:#d6dbe4;--bg-pop:#fffffff7;--bg-soft:#e7ebf2;--border:#d8dce3;--border-strong:#c2c8d2;--text:#1f2329;--text-dim:#5b6472;--text-faint:#8a93a3;--accent:#4f6bf2;--accent-2:#3d57d9;--accent-soft:#4f6bf21f;--accent-border:#4f6bf266;--accent-hover:#3d57d9;--danger:#ef4444;--danger-soft:#ef44441f;--danger-hover:#dc2626;--warn:#f59e0b;--warn-soft:#f59e0b24;--warn-border:#f59e0b66;--ok:#10b981;--ok-soft:#10b98124;--ok-border:#10b98166;--ok-strong:#166534;--info:#4f6bf2;--info-soft:#4f6bf21f;--info-border:#4f6bf266;--on-accent:#fff;--radius:8px;--radius-sm:6px;--shadow-pop:#0f172a29;--shadow-card:#0f172a29;--shadow-drawer:#0f172a24;--shadow-toast:#0f172a1f;--scrim:#0f172a59;--scrim-soft:#0f172a47;--scrim-faint:#0f172a38;--bar-grad:linear-gradient(180deg, #fff, #f3f5f8);--splitter:#5b6cff;--splitter-grip:#00000029;--overlay-tint:#00000008;--overlay-tint-strong:#0000001a;--err-item-fg:#c0392b;--api-item-fg:#2f4fb0;--api-item-border:#5b6cff40;--api-item-bg:#5b6cff0f;--copy-ok:#1a7f37;--tag-ok-fg:#1a7f37;--tag-ok-bg:#1a7f371a;--tag-warn-fg:#b58105;--tag-warn-bg:#b581051a;--log-warn-fg:#9a6a00;--log-warn-bg:#b581051a;--log-warn-border:#b581054d;--scroll-thumb:#0003;--scroll-thumb-hover:#00000052;--jt-key:#953800;--jt-string:#0a3069;--jt-number:#116329;--jt-boolean:#cf222e;--jt-null:#57606a;--jt-faint:#6b7280;--jt-ring:#5b6cff4d;--jt-del-fg:#cf222e;--jt-del-bg:#cf222e1f;--jt-add-bg:#5b6cff1f;--st-label:#24292f;--st-id:#64748b;--st-badge-bg:#4f6bf2;--st-badge-fg:#fff;--st-hl-bg:#4f6bf229;--code-comment:#6e7781;--code-punc:#6e7781;--code-prop:#953800;--code-str:#0a3069;--code-num:#0550ae;--code-kw:#cf222e;--code-fn:#8250df;--code-var:#953800;--code-binding:#0d9488;--code-warn:#b58105}*{box-sizing:border-box;outline:none}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit;color:inherit;margin:0}html,body{background:var(--bg-app);height:100%;color:var(--text);-webkit-font-smoothing:antialiased;margin:0;font-family:PingFang SC,-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif}#app{height:100vh}*{scrollbar-width:thin;scrollbar-color:var(--scroll-thumb) transparent}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-thumb{background:var(--scroll-thumb);border-radius:8px}::-webkit-scrollbar-thumb:hover{background:var(--scroll-thumb-hover)}::-webkit-scrollbar-track{background:0 0}.app{background:var(--bg-app);flex-direction:column;height:100vh;display:flex}.app__bar{background:var(--bar-grad);border-bottom:1px solid var(--border);flex:none;align-items:center;gap:12px;height:48px;padding:0 16px;display:flex}.app__logo{color:var(--text);white-space:nowrap;align-items:center;gap:8px;font-size:15px;font-weight:600;display:flex}.app__logo-icon{width:var(--icon-xl);height:var(--icon-xl);display:block}.app__logo-version{font-size:var(--fs-xs);letter-spacing:.02em;color:var(--text-faint);font-weight:500;line-height:1}.app__btn{height:var(--ctrl-md);background:var(--bg-input);color:var(--text);border:1px solid var(--border-strong);cursor:pointer;white-space:nowrap;border-radius:8px;flex:none;align-items:center;gap:6px;padding:0 12px;font-size:13px;transition:background .15s,border-color .15s,transform 50ms;display:inline-flex}.app__btn:hover:not(:disabled){background:var(--bg-hover);border-color:var(--accent-border);color:var(--accent)}.app__btn:active:not(:disabled){transform:translateY(1px)}.app__btn:disabled{opacity:.5;cursor:default}.app__btn--icon{height:var(--ctrl-md);padding:0 8px}.app__bar .app__btn--icon{height:var(--ctrl-sm)}.app__btn--remote{height:var(--ctrl-sm);background:var(--accent-soft);color:var(--accent);border-color:var(--accent-border);padding:0 10px;font-size:12px}.app__btn--remote:hover:not(:disabled){background:var(--accent);color:var(--on-accent);border-color:var(--accent)}.app__btn--remote.app__btn--warn{background:var(--warn-soft);color:var(--warn);border-color:var(--warn-border)}.app__btn--remote.app__btn--warn:hover:not(:disabled){background:var(--warn);color:var(--on-accent);border-color:var(--warn)}.app__remote-menu{display:inline-flex;position:relative}.app__remote-menu .app__btn--remote{gap:6px}.app__icon--chev{transition:transform .15s}.app__remote-item--save:hover{background:var(--accent-soft);color:var(--accent)}.app__remote-item--sync:hover{background:var(--ok-soft);color:var(--ok)}.app__op-group{display:inline-flex}.app__op-group>.app__btn{background:var(--bg-input);color:var(--text);border:1px solid var(--border);height:var(--ctrl-sm);border-radius:0;margin-left:-1px;padding:0 10px;font-size:12px}.app__op-group>.app__btn:first-child{border-top-left-radius:var(--radius-sm,6px);border-bottom-left-radius:var(--radius-sm,6px);margin-left:0}.app__op-group>.app__btn:last-child{border-top-right-radius:var(--radius-sm,6px);border-bottom-right-radius:var(--radius-sm,6px)}.app__op-group>.app__btn:hover:not(:disabled){z-index:var(--z-base);border-color:var(--border-strong);background:var(--bg-hover);position:relative}.app__op-group>.app__btn:disabled{opacity:.5;cursor:default}.app__btn--history-save.is-dirty:disabled{background:var(--bg-input);color:var(--text);border-color:var(--border-strong);box-shadow:none;opacity:.5;cursor:default}.app__btn--history-save.is-dirty:not(:disabled){background:var(--accent);color:var(--on-accent);border-color:var(--accent)}.app__btn--history-save.is-dirty:not(:disabled):hover{background:var(--accent-2);border-color:var(--accent-2)}.app__btn--publish{height:var(--ctrl-md);color:var(--info);border-color:var(--info-border);background:var(--info-soft);align-items:center;gap:5px;padding:0 12px;display:inline-flex}.app__btn--publish:hover:not(:disabled){background:var(--info);color:var(--on-accent);border-color:var(--info)}.app__btn--publish:disabled{opacity:.5;cursor:default}.app__btn--publish.app__btn--warn{color:var(--warn);border-color:var(--warn-border);background:var(--warn-soft)}.app__btn--publish.app__btn--warn:hover:not(:disabled){background:var(--warn);color:var(--on-accent);border-color:var(--warn)}.app__bar-actions{align-items:center;gap:12px;margin-left:auto;display:flex}.app__dev-svc{display:inline-flex;position:relative}.app__btn--warn{background:var(--warn-soft);color:var(--warn);border-color:var(--warn-border)}.app__btn--connected{background:var(--ok-soft);color:var(--ok);border-color:var(--ok-border)}.app__btn--connected:hover:not(:disabled){background:var(--ok-soft);color:var(--ok-strong);border-color:var(--ok)}.app__btn--reconnecting{background:var(--warn-soft);color:var(--warn);border-color:var(--warn-border)}.app__btn--disconnected{background:var(--danger-soft);color:var(--danger);border-color:var(--danger)}.app__btn--sm{padding:4px 10px;font-size:12px}.app__dev-svc-panel{z-index:var(--z-overlay-low);background:var(--bg-soft,#20242b);border:1px solid var(--border,#2b3038);border-radius:var(--radius-xl);width:320px;color:var(--text,#e6e9ef);text-align:left;padding:16px;position:absolute;top:calc(100% + 8px);right:0;box-shadow:0 12px 30px #00000059}.app__dev-svc-title{margin-bottom:10px;font-size:13px;font-weight:600}.app__dev-svc-row{color:var(--text-dim,#9aa3b2);justify-content:space-between;align-items:center;gap:4px;margin-bottom:10px;font-size:12px;display:flex}.app__dev-svc-row--col{flex-direction:column;align-items:stretch}.app__dev-svc-row--col>span{margin-bottom:4px}.app__dev-svc-row input[type=text],.app__dev-svc-row input[type=password],.app__dev-svc-row textarea{width:100%;min-width:0;height:var(--ctrl-md);background:var(--bg-input);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text);outline:none;padding:0 12px;font-family:inherit;font-size:12px;transition:border-color .15s,box-shadow .15s}.app__dev-svc-row textarea{resize:none;height:auto;min-height:84px;padding:6px 8px;line-height:1.5}.app__dev-svc-row input[type=text]:focus,.app__dev-svc-row input[type=password]:focus,.app__dev-svc-row textarea:focus{border-color:var(--accent-border);box-shadow:0 0 0 2px var(--accent-soft)}.app__dev-svc-row input::placeholder,.app__dev-svc-row textarea::placeholder{color:var(--text-faint)}.app__dev-svc-row .switch{flex:none}.app__dev-svc-actions{justify-content:flex-end;gap:8px;margin-top:4px;display:flex}.app__dev-svc-hint{color:var(--warn,#e0a23a);margin:8px 0 0;font-size:11px;line-height:1.5}.app__nosvc-banner{color:var(--warn,#e0a23a);background:var(--warn-soft,#e0a23a1f);padding:8px 14px;font-size:13px}.app__nosvc-banner--disconnected{color:var(--danger,#ef4444);background:var(--danger-soft,#ef44441f)}.app__extreload-banner{color:var(--info,#0079f2);background:var(--info-soft,#0079f21f)}.theme-toggle{color:var(--text-dim);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;align-items:center;gap:7px;padding:0;font-size:12px;transition:color .15s;display:inline-flex}.theme-toggle:hover{color:var(--text)}.theme-toggle__track{background:var(--bg-input);border:1px solid var(--border-strong);border-radius:999px;width:36px;height:20px;transition:background .18s,border-color .18s;position:relative}.theme-toggle__thumb{background:var(--text-faint);border-radius:50%;justify-content:center;align-items:center;width:16px;height:16px;transition:transform .18s,background .18s;display:flex;position:absolute;top:50%;left:2px;transform:translateY(-50%)}.theme-toggle__icon{width:11px;height:11px;color:var(--bg-app)}:root[data-theme=light] .theme-toggle__track{background:var(--accent-soft);border-color:var(--accent-border)}:root[data-theme=light] .theme-toggle__thumb{background:var(--accent);transform:translateY(-50%)translate(16px)}:root[data-theme=light] .theme-toggle__icon{color:var(--on-accent)}.switch{cursor:pointer;vertical-align:middle;background:0 0;border:none;margin:0;padding:0;line-height:0;display:inline-flex}.switch--disabled{cursor:not-allowed;opacity:.5}.switch__track{background:var(--bg-input);border:1px solid var(--border-strong);box-sizing:border-box;border-radius:999px;width:36px;height:20px;transition:background .18s,border-color .18s;display:inline-block;position:relative}.switch__thumb{background:var(--text-faint);border-radius:50%;width:16px;height:16px;transition:transform .18s,background .18s;position:absolute;top:50%;left:2px;transform:translateY(-50%)}.switch--on .switch__track{background:var(--accent);border-color:var(--accent)}.switch--on .switch__thumb{background:var(--on-accent);transform:translateY(-50%)translate(16px)}.app__badge{border:1px solid var(--border-strong);background:var(--bg-input);color:var(--text-dim);-webkit-user-select:none;user-select:none;white-space:nowrap;border-radius:999px;flex:none;align-items:center;gap:5px;padding:2px 9px;font-size:11px;font-weight:600;display:inline-flex}.app__badge-dot{background:var(--text-faint);border-radius:50%;flex:none;width:7px;height:7px}.app__badge--ok{color:var(--ok);border-color:var(--ok-border);background:var(--ok-soft)}.app__badge--ok .app__badge-dot{background:var(--ok)}.app__badge--error{color:var(--danger);border-color:var(--danger-soft);background:var(--danger-soft)}.app__badge--error .app__badge-dot{background:var(--danger)}.app__badge--pending{color:var(--warn);border-color:var(--warn-border);background:var(--warn-soft)}.app__badge--pending .app__badge-dot{background:var(--warn);animation:1s ease-in-out infinite app-badge-pulse}.app__badge--nopython,.app__badge--fail{color:var(--text-faint);border-color:var(--border);background:var(--bg-input)}.app__badge--nopython .app__badge-dot,.app__badge--fail .app__badge-dot{background:var(--text-faint)}@keyframes app-badge-pulse{0%,to{opacity:1}50%{opacity:.3}}.app__icon{width:15px;height:15px;display:block}.app__icon--spin{animation:.8s linear infinite app__spin}@keyframes app__spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.app__stage{flex:auto;min-height:0;display:flex;position:relative}.phone{background:radial-gradient(circle at 30% 20%, #7c8cff0d, transparent 60%), var(--bg-stage);flex-direction:column;flex:none;justify-content:center;align-items:center;min-height:0;display:flex;overflow:hidden}.phone__frame{flex:auto;justify-content:center;align-items:center;width:100%;min-height:0;display:flex;position:relative;overflow:hidden}.phone__scaler{flex-direction:column;width:100%;height:100%;display:flex;position:relative}.splitter{top:0;bottom:0;left:calc(var(--preview-width) - 3px);cursor:col-resize;width:6px;z-index:var(--z-sticky);transition:background .15s;position:absolute}.splitter:hover,.splitter.is-dragging{background:var(--splitter)}.phone--dragging,.phone--dragging *{-webkit-user-select:none!important;user-select:none!important;cursor:col-resize!important}.device-bar{background:var(--bg-bar);border-bottom:1px solid var(--border);flex:none;align-items:center;gap:8px;width:100%;height:28px;padding:0 12px;display:flex}.device-bar__spacer{flex:auto}.device-bar__info{color:var(--text-faint);white-space:nowrap;font-size:12px}.statusbar__refresh{color:var(--text-faint);cursor:pointer;background:0 0;border:none;border-radius:6px;flex:none;justify-content:center;align-items:center;padding:0;transition:background .15s,color .15s,transform 50ms;display:inline-flex}.statusbar__refresh:hover:not(:disabled){color:var(--accent)}.statusbar__refresh:active:not(:disabled){transform:translateY(1px)}.statusbar__refresh:disabled{opacity:.4;cursor:default}.device-bar__label{color:var(--text-faint);white-space:nowrap;font-size:12px}.preview-statusbar{background:var(--bg-bar);border-top:1px solid var(--border);flex:none;align-items:center;gap:12px;width:100%;height:28px;padding:0 12px;display:flex}.statusbar__conn-icon{flex:none;width:14px;height:14px}.statusbar .app__btn--connected,.statusbar .app__btn--reconnecting,.statusbar .app__btn--disconnected,.statusbar .app__btn--warn{background:0 0;border:none;padding:0 10px}.statusbar .app__btn--connected{color:var(--ok)}.statusbar .app__btn--reconnecting{color:var(--warn)}.statusbar .app__btn--disconnected{color:var(--danger)}.statusbar .app__btn--warn{color:var(--warn)}.vc-sketch-presets{border-top-color:var(--border)!important}.phone-viewport{width:100%;min-height:0;box-shadow:0 12px 48px var(--shadow-pop);cursor:default;flex:auto;position:relative}.phone__screen{scrollbar-width:none;-ms-overflow-style:none;width:100%;height:100%;padding:16px;position:relative;overflow:hidden auto}.phone__screen--bg-checker{background-color:#fff;background-image:linear-gradient(45deg,#cfcfcf 25%,#0000 25% 75%,#cfcfcf 75%),linear-gradient(45deg,#cfcfcf 25%,#0000 25% 75%,#cfcfcf 75%);background-position:0 0,8px 8px;background-size:16px 16px}.phone__screen--bg-white{background:#fff}.phone__screen--bg-gray{background:#f0f0f0}.phone__screen::-webkit-scrollbar{display:none}.ce-sel-overlay{pointer-events:none;box-sizing:border-box;z-index:var(--z-overlay-low);background:#4285f42e;position:absolute}.ce-guides{pointer-events:none;z-index:var(--z-overlay-low);position:absolute;top:0;left:0}.ce-guide{background:#68ffff;position:absolute}.ce-guide--v{width:1px;height:100%;top:0;transform:translate(-.5px)}.ce-guide--h{width:100%;height:1px;left:0;transform:translateY(-.5px)}.debug{background:var(--bg-panel);border-left:1px solid var(--border);flex-direction:column;flex:auto;min-width:300px;display:flex}.debug__tabs{border-bottom:1px solid var(--border);display:flex}.debug__tab{color:var(--text-dim);cursor:pointer;background:0 0;border:none;flex:1;padding:12px 8px;font-size:13px;transition:color .15s;position:relative}.debug__tab:hover{color:var(--text)}.debug__tab--active{color:var(--accent)}.debug__tab--active:after{content:"";background:var(--accent);height:2px;position:absolute;bottom:-1px;left:20%;right:20%}.debug__count{background:var(--bg-hover);min-width:16px;color:var(--text-dim);border-radius:999px;margin-left:5px;padding:0 5px;font-size:12px;display:inline-block}.debug__body{flex:auto;padding:12px 16px;position:relative;overflow:auto}.debug__placeholder{width:100%;height:38px;display:block}.debug__empty{color:var(--text-faint);text-align:center;font-size:13px}.debug__meta-list{flex-direction:column;gap:8px;margin:0;display:flex}.debug__meta-row{grid-template-columns:72px 1fr;align-items:baseline;gap:8px;font-size:13px;display:grid}.debug__meta-row dt{color:var(--text-faint);margin:0}.debug__meta-row dd{color:var(--text);word-break:break-all;margin:0}.debug__meta-row code{font-family:var(--mono,ui-monospace, monospace);background:var(--bg-hover);border-radius:4px;padding:1px 5px;font-size:12px}.debug__meta-muted{color:var(--text-faint);font-size:12px}.debug__meta-err{color:var(--danger);font-size:12px}.debug__meta-hint{border-top:1px solid var(--border);color:var(--text-faint);margin-top:12px;padding-top:10px;font-size:12px;line-height:1.6}.statepanel{background:var(--bg-panel);border-top:1px solid var(--border-strong);flex-direction:column;flex:none;order:1;height:240px;min-height:120px;max-height:60vh;display:flex;overflow:hidden}.statepanel__head{height:var(--ctrl-lg);background:var(--bg-bar);border-bottom:1px solid var(--border);color:var(--text);cursor:row-resize;-webkit-user-select:none;user-select:none;flex:none;align-items:center;gap:8px;padding:0 12px;font-size:13px;display:flex}.statepanel__title{letter-spacing:.2px;font-weight:600}.statepanel__title code{font-family:var(--mono,ui-monospace, SFMono-Regular, Menlo, monospace);color:var(--accent);font-size:12px}.statepanel__close{width:18px;height:18px;color:var(--text-faint);cursor:pointer;background:0 0;border:none;justify-content:center;align-items:center;margin-left:auto;padding:0;font-size:15px;line-height:1;transition:color .15s;display:inline-flex}.statepanel__close:hover{color:var(--text)}.statepanel__tree{flex:auto;padding:8px 12px 10px;overflow:auto}.statusbar__item--prob.is-open{color:var(--accent)}.debug__tag{border-radius:999px;padding:1px 8px;font-size:12px;line-height:1.6;display:inline-block}.debug__tag--ok{color:var(--ok-strong);background:var(--ok-soft)}.debug__tag--warn{color:var(--tag-warn-fg);background:var(--tag-warn-bg)}.debug__tag--err{color:var(--danger);background:var(--danger-soft)}.debug__clear{float:right;z-index:var(--z-sticky);background:var(--bg-input);width:28px;height:28px;color:var(--text);border:1px solid var(--border-strong);cursor:pointer;box-shadow:-10px 0 10px var(--bg-panel);border-radius:8px;justify-content:center;align-items:center;padding:0;transition:background .15s,border-color .15s,transform 50ms;display:inline-flex;position:sticky;top:0}.debug__clear:hover:not(:disabled){background:var(--bg-hover);border-color:var(--accent-border)}.debug__clear:active:not(:disabled){transform:translateY(1px)}.debug__clear:disabled{opacity:.5;cursor:default}.debug__list--api{padding-top:34px}.debug__list{margin:0;padding:0;list-style:none}.debug__item{word-break:break-all;border-radius:8px;margin-bottom:6px;padding:4px 8px;font-size:12px;line-height:1.6}.debug__item--err{background:var(--danger-soft);color:var(--err-item-fg)}.debug__item--api{border:1px solid var(--api-item-border);color:var(--api-item-fg);background:var(--api-item-bg)}.debug__kind{opacity:.85;font-weight:600}.debug__pre{white-space:pre-wrap;color:var(--text-dim);margin:4px 0 0;font-size:11px}.debug__api-row{justify-content:space-between;align-items:center;gap:8px;display:flex}.debug__copy-ic{width:24px;height:22px;color:var(--text-faint);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:6px;flex:none;justify-content:center;align-items:center;padding:0;transition:background .15s,color .15s,border-color .15s;display:inline-flex}.debug__copy-ic:hover{background:var(--bg-hover);border-color:var(--border);color:var(--text)}.debug__copy-ok{color:var(--copy-ok);font-size:14px;line-height:1}.apt{color:var(--text-dim);margin-top:4px;font-family:SF Mono,JetBrains Mono,Menlo,Consolas,monospace;font-size:12px;line-height:1.6}.apt__list{margin:0;padding:0;list-style:none}.apt__node{position:relative}.apt__branch,.apt__leaf{cursor:pointer;border-radius:4px;align-items:center;gap:4px;padding:1px 4px;display:flex}.apt__branch:hover,.apt__leaf:hover{background:var(--bg-hover)}.apt__caret{text-align:center;width:12px;color:var(--text-faint);-webkit-user-select:none;user-select:none;flex:none;font-size:9px;transition:transform .15s;transform:rotate(0)}.apt__caret--open{color:var(--accent);transform:rotate(90deg)}.apt__caret--leaf{visibility:hidden}.apt__children{border-left:1px solid var(--border);margin-left:4px;padding-left:16px}.apt__close{color:var(--text-faint);padding:1px 4px 1px 20px}.debug__scope{white-space:pre-wrap;color:var(--text-dim);margin:0;font-size:11px;line-height:1.5}.debug__scope-wrap{flex-direction:column;min-height:0;display:flex;position:absolute;inset:10px 10px 10px 16px}.debug__scope-tree{flex:auto;min-height:0;overflow:auto}.debug__scope-foot{flex:none;justify-content:flex-end;align-items:center;gap:8px;padding:8px 12px;display:flex;position:absolute;bottom:0;right:0}.debug__copied{color:var(--accent);font-size:12px}.debug__copy{height:var(--ctrl-sm);background:var(--bg-input);color:var(--text);border:1px solid var(--accent-border);border-radius:var(--radius-sm);cursor:pointer;align-items:center;padding:0 14px;font-size:13px;transition:background .15s,border-color .15s;display:inline-flex}.debug__copy:hover{background:var(--bg-hover);border-color:var(--accent)}.debug__scope-wrap--raw{flex-direction:column;min-height:0;display:flex}.debug__scope-raw{flex-direction:column;flex:auto;min-height:0;display:flex}.debug__raw-editor{background:var(--bg-input);width:100%;min-height:160px;color:var(--text);border:1px solid var(--border-strong);tab-size:2;white-space:pre;border-radius:8px;outline:none;flex:auto;padding:12px 14px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;line-height:1.6;overflow:auto}.debug__raw-editor:focus{border-color:var(--accent-border)}.debug__raw-editor .token.property,.debug__raw-editor .token.tag,.debug__raw-editor .token.boolean,.debug__raw-editor .token.number,.debug__raw-editor .token.constant,.debug__raw-editor .token.symbol{color:var(--code-prop)}.debug__raw-editor .token.selector,.debug__raw-editor .token.attr-name,.debug__raw-editor .token.string,.debug__raw-editor .token.char,.debug__raw-editor .token.builtin{color:var(--code-str)}.debug__raw-editor .token.operator,.debug__raw-editor .token.entity,.debug__raw-editor .token.url{color:var(--code-num)}.debug__raw-editor .token.punctuation{color:var(--code-punc)}.debug__raw-editor .token.keyword,.debug__raw-editor .token.null{color:var(--code-kw)}.debug__raw-editor .token.function,.debug__raw-editor .token.class-name{color:var(--code-fn)}.debug__raw-err{color:var(--danger);flex:none;margin:6px 0 0;font-size:12px}.statusbar{background:var(--bg-bar);border-top:1px solid var(--border);height:28px;color:var(--text-dim);-webkit-user-select:none;user-select:none;flex:none;order:3;align-items:stretch;padding:0 2px;font-size:12px;display:flex}.statusbar__spacer{flex:auto}.statusbar__item{white-space:nowrap;cursor:default;align-items:center;gap:5px;height:100%;padding:0 10px;display:inline-flex}.statusbar__item--right{color:var(--text-faint)}.statusbar__item--prob{cursor:pointer;color:var(--text-dim);background:0 0;border:none;border-radius:0;font-weight:400}.statusbar__item--prob:hover{color:var(--text)}.statusbar__item--prob.is-error,.statusbar__item--prob.is-error:hover{color:var(--danger)}.statusbar__item--prob.is-log,.statusbar__item--prob.is-log:hover{color:var(--accent)}.statusbar__item--prob.is-ok{color:var(--text-faint);cursor:default}.statusbar__item--prob.is-ok:hover{color:var(--text-faint)}.statusbar__icon{font-size:14px;line-height:1}.statusbar__icon.is-dirty{color:var(--warn)}.errpanel{background:var(--bg-panel);border-top:1px solid var(--border-strong);flex-direction:column;flex:none;order:2;height:240px;min-height:120px;max-height:60vh;display:flex;overflow:hidden}.errpanel__head{height:var(--ctrl-lg);background:var(--bg-bar);cursor:row-resize;-webkit-user-select:none;user-select:none;border-bottom:1px solid var(--border);color:var(--text);flex:none;align-items:center;gap:8px;padding:0 12px;font-size:13px;display:flex}.errpanel__title{letter-spacing:.2px;font-weight:600}.errpanel__actions{align-items:center;gap:6px;margin-left:auto;display:flex}.errpanel__iconbtn{width:20px;height:20px;color:var(--text-faint);cursor:pointer;background:0 0;border:none;justify-content:center;align-items:center;padding:0;transition:color .15s;display:inline-flex}.errpanel__iconbtn:hover:not(:disabled){color:var(--text)}.errpanel__iconbtn:disabled{opacity:.35;cursor:not-allowed}.errpanel__clear:hover:not(:disabled){color:var(--danger)}.errpanel__body{flex:auto;padding:12px 16px;overflow:auto}.ep__sec-title{color:var(--text-dim);border-bottom:1px dashed var(--border);margin:8px 0 6px;padding-bottom:4px;font-size:12px;font-weight:600}.ep__sec-title:first-child{margin-top:0}.debug__list--log{flex-direction:column;display:flex}.log__item{border-bottom:1px solid var(--border);align-items:flex-start;gap:10px;padding:6px 8px;display:flex}.log__item:last-child{border-bottom:none}.log__item:hover{background:var(--bg-input)}.log__tag{text-transform:uppercase;letter-spacing:.4px;color:var(--text-dim);background:var(--bg-input);border:1px solid var(--border);border-radius:4px;flex:none;margin-top:1px;padding:1px 6px;font-family:SF Mono,JetBrains Mono,Menlo,Consolas,monospace;font-size:11px;font-weight:600;line-height:1.5}.log__tag--warn{color:var(--log-warn-fg);background:var(--log-warn-bg);border-color:var(--log-warn-border)}.log__tag--error{color:var(--danger);background:var(--danger-soft);border-color:var(--danger-soft)}.log__content{min-width:0;color:var(--text);flex-wrap:wrap;flex:auto;align-items:flex-start;gap:4px 10px;font-family:SF Mono,JetBrains Mono,Menlo,Consolas,monospace;font-size:12px;line-height:1.5;display:flex}.log__val{white-space:pre-wrap;word-break:break-word}.log__json{flex:100%;padding:2px 0}.log__empty{color:var(--text-faint)}.alert-layer{z-index:var(--z-modal);position:absolute;inset:0}.alert-mask{background:#0000008c;padding:16px;display:flex;position:absolute;inset:0}.alert-mask--bottom{justify-content:center;align-items:flex-end}.alert-mask--top{justify-content:center;align-items:flex-start}.alert-mask--center{justify-content:center;align-items:center}.alert-mask--left{justify-content:flex-start;align-items:center}.alert-mask--right{justify-content:flex-end;align-items:center}.alert-panel{background:#fff;border-radius:12px;width:100%;max-width:100%;max-height:92vh;animation:.2s ease-out alert-pop;overflow:hidden auto;box-shadow:0 18px 60px #00000080}@keyframes alert-pop{0%{opacity:0;transform:scale(.96)translateY(8px)}to{opacity:1;transform:scale(1)translateY(0)}}.alert-mask--center .alert-panel,.alert-mask--left .alert-panel,.alert-mask--right .alert-panel{border-radius:12px}.device-ui{z-index:var(--z-deviceui);pointer-events:none;position:absolute;inset:0}.dlg-mask{pointer-events:auto;background:#00000073;justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.dlg{text-align:center;background:#fff;border-radius:12px;width:288px;max-width:82%;padding:24px 20px 0;animation:.2s ease-out dlg-pop;box-shadow:0 12px 40px #00000059}@keyframes dlg-pop{0%{opacity:0;transform:scale(.94)}to{opacity:1;transform:scale(1)}}.dlg__title{color:#333;font-size:16px;font-weight:600}.dlg__msg{color:#666;text-align:left;word-break:break-all;white-space:pre-wrap;max-height:320px;margin-top:10px;font-size:14px;line-height:1.5;overflow-y:auto}.dlg__title+.dlg__msg{margin-top:12px}.dlg__btns{border-top:1px solid #e8e8e8;margin:18px -20px 0;display:flex}.dlg__btn{cursor:pointer;background:0 0;border:none;flex:1 1 0;min-width:0;padding:14px 0;font-size:15px}.dlg__btn--ok{color:#1677ff;font-weight:500}.dlg__btn--cancel{color:#1677ff;border-right:1px solid #e8e8e8}.dlg__btn--cancel.dlg__btn--gray{color:#888}.dtoast{color:#fff;text-align:center;box-sizing:border-box;pointer-events:none;background:#000000b3;border-radius:10px;flex-direction:column;justify-content:center;align-items:center;gap:8px;min-width:0;max-width:76%;padding:10px 14px;font-size:14px;line-height:20px;display:flex;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.dtoast--icon{min-width:96px;padding:16px}.dtoast__icon{flex:none;justify-content:center;align-items:center;width:36px;height:36px;display:inline-flex}.dtoast__icon-svg{fill:none;stroke:#fff;stroke-width:2.4px;stroke-linecap:round;stroke-linejoin:round;width:28px;height:28px}.dtoast__msg{word-break:break-all}.apptoast{z-index:var(--z-toast-app);color:#fff;pointer-events:none;background:#111111d1;border-radius:10px;align-items:center;gap:8px;max-width:76%;padding:12px 20px;font-size:14px;line-height:1.4;display:inline-flex;position:fixed;top:56px;left:50%;transform:translate(-50%);box-shadow:0 6px 24px #00000047}.apptoast__icon{background:var(--text-faint);border-radius:50%;flex:none;justify-content:center;align-items:center;width:18px;height:18px;display:inline-flex}.apptoast--ok .apptoast__icon{background:var(--ok)}.apptoast--err .apptoast__icon{background:var(--danger)}.apptoast__icon-svg{fill:none;stroke:#fff;stroke-width:2.6px;stroke-linecap:round;stroke-linejoin:round;width:12px;height:12px}.apptoast__msg{word-break:break-all}.apptoast-fade-enter-active,.apptoast-fade-leave-active{transition:opacity .2s,transform .2s}.apptoast-fade-enter,.apptoast-fade-leave-to{opacity:0;transform:translate(-50%,-8px)}.dlg-fade-enter-active,.dlg-fade-leave-active,.toast-fade-enter-active,.toast-fade-leave-active{transition:opacity .18s}.dlg-fade-enter,.dlg-fade-leave-to,.toast-fade-enter,.toast-fade-leave-to{opacity:0}.pk-mask{pointer-events:auto;background:#0006;align-items:flex-end;display:flex;position:absolute;inset:0}.pk-sheet{background:#fff;border-radius:12px 12px 0 0;width:100%;animation:.2s ease-out pk-up}@keyframes pk-up{0%{transform:translateY(100%)}to{transform:translateY(0)}}.pk-bar{box-sizing:border-box;border-bottom:1px solid #eef0f2;justify-content:space-between;align-items:center;height:44px;padding:0 16px;display:flex}.pk-bar__title{color:#333;font-size:15px;font-weight:600}.pk-bar__btn{cursor:pointer;background:0 0;border:none;padding:4px 2px;font-size:15px}.pk-bar__btn--cancel{color:#888}.pk-bar__btn--ok{color:#1677ff;font-weight:600}.pk-cols{height:230px;display:flex;position:relative;overflow:hidden}.pk-col{flex:1 1 0;min-width:0;height:100%;position:relative}.pk-col__band{pointer-events:none;background:#1677ff14;border-top:1px solid #d6e4ff;border-bottom:1px solid #d6e4ff;height:40px;position:absolute;top:50%;left:0;right:0;transform:translateY(-50%)}.pk-col__list{-webkit-overflow-scrolling:touch;height:100%;padding:95px 0;overflow-y:auto}.pk-item{text-align:center;color:#333;cursor:pointer;white-space:nowrap;text-overflow:ellipsis;height:40px;padding:0 6px;font-size:16px;line-height:40px;overflow:hidden}.pk-item--on{color:#1677ff;font-weight:600}.pk-cols--wheel .pk-col{cursor:grab;touch-action:none}.pk-cols--wheel.is-dragging{-webkit-user-select:none;user-select:none;cursor:grabbing}.pk-cols--wheel .pk-col__list{scrollbar-width:none;-ms-overflow-style:none}.pk-cols--wheel .pk-col__list::-webkit-scrollbar{display:none}.picker-fade-enter-active,.picker-fade-leave-active{transition:opacity .18s}.picker-fade-enter,.picker-fade-leave-to{opacity:0}.rp-mask{z-index:var(--z-appmodal);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);background:#080a108c;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.rp-card{background:var(--bg-panel);border:1px solid var(--border);width:300px;max-width:calc(100vw - 32px);box-shadow:0 18px 50px var(--shadow-card);color:var(--text);border-radius:14px;overflow:hidden}.rp-head{border-bottom:1px solid var(--border);justify-content:space-between;align-items:center;padding:12px 14px;display:flex}.rp-title{font-size:14px;font-weight:600}.rp-x{width:26px;height:26px;color:var(--text-dim);cursor:pointer;background:0 0;border:none;border-radius:7px;font-size:20px;line-height:1;transition:background .15s,color .15s}.rp-x:hover{background:var(--bg-hover);color:var(--text)}.rp-body{flex-direction:column;align-items:center;padding:18px 16px 16px;display:flex}.rp-qr-wrap{box-sizing:border-box;background:#fff;border-radius:10px;justify-content:center;align-items:center;width:220px;height:220px;padding:8px;display:flex;position:relative}.rp-qr{width:204px;height:204px;display:block}.rp-qr--loading{width:100%;height:100%;color:var(--text-placeholder);justify-content:center;align-items:center;font-size:14px;display:flex}.rp-qr--blurred{filter:blur(7px);opacity:.55;transition:filter .25s,opacity .25s}.rp-qr-loading{background:#ffffff80;border-radius:12px;flex-direction:column;justify-content:center;align-items:center;gap:10px;display:flex;position:absolute;inset:0}.rp-spinner{border:3px solid #10131a2e;border-top-color:var(--accent);border-radius:50%;width:30px;height:30px;animation:.8s linear infinite rp-spin}.rp-loading-text{color:var(--text-dim);font-size:13px}@keyframes rp-spin{to{transform:rotate(360deg)}}.rp-tip{color:var(--text-dim);text-align:center;margin:12px 0 10px;font-size:12.5px}.rp-url{align-items:center;gap:8px;width:100%;display:flex}.rp-url-text{min-width:0;color:var(--text-dim);background:var(--bg-input);border:1px solid var(--border);text-overflow:ellipsis;white-space:nowrap;border-radius:7px;flex:auto;padding:6px 8px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;overflow:hidden}.rp-copy{border:1px solid var(--accent-border);background:var(--accent);color:var(--on-accent);cursor:pointer;border-radius:7px;flex:none;padding:6px 10px;font-size:12px;transition:background .15s,opacity .15s}.rp-copy:hover:not(:disabled){background:var(--accent-hover)}.rp-copy:disabled{opacity:.5;cursor:default}.app--chrome-off .app__stage{justify-content:center}.app--chrome-off .phone-viewport{box-shadow:none}.app--chrome-off .phone__screen{width:375px;margin:0 auto;padding:0}.rp-warn{color:var(--warn);text-align:center;margin:10px 0 0;font-size:11.5px;line-height:1.5}.login-mask{z-index:var(--z-appmodal);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);background:#080a108c;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.login-modal{background:var(--bg-panel);border:1px solid var(--border);width:320px;max-width:calc(100vw - 32px);box-shadow:0 18px 50px var(--shadow-card);color:var(--text);box-sizing:border-box;border-radius:14px;padding:18px 18px 16px}.login-modal__title{margin-bottom:6px;font-size:15px;font-weight:600}.login-modal__desc{color:var(--text-dim);margin-bottom:14px;font-size:12px;line-height:1.5}.login-modal__row{align-items:center;gap:10px;margin-bottom:12px;display:flex}.login-modal__label{color:var(--text-dim);flex:0 0 36px;font-size:13px}.login-modal__input{min-width:0;height:34px;color:var(--text);background:var(--bg-input);border:1px solid var(--border);box-sizing:border-box;border-radius:8px;outline:none;flex:auto;padding:0 10px;font-size:13px}.login-modal__input:focus{border-color:var(--accent)}.login-modal__error{color:var(--danger);margin-bottom:10px;font-size:12px}.login-modal__actions{justify-content:flex-end;gap:10px;margin-top:4px;display:flex}.login-modal__btn{border:1px solid var(--border);cursor:pointer;border-radius:8px;padding:7px 14px;font-size:13px;transition:background .15s,opacity .15s,border-color .15s}.login-modal__btn--ghost{color:var(--text-dim);background:0 0}.login-modal__btn--ghost:hover:not(:disabled){background:var(--bg-hover);color:var(--text)}.login-modal__btn--primary{border-color:var(--accent-border);background:var(--accent);color:var(--on-accent)}.login-modal__btn--primary:hover:not(:disabled){background:var(--accent-hover)}.login-modal__btn:disabled{opacity:.5;cursor:default}.confirm-mask{z-index:var(--z-appmodal);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);background:#080a108c;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.confirm-modal{background:var(--bg-panel);border:1px solid var(--border);width:360px;max-width:calc(100vw - 32px);box-shadow:0 18px 50px var(--shadow-card);color:var(--text);box-sizing:border-box;border-radius:14px;padding:18px 18px 16px}.confirm-modal__title{align-items:center;gap:8px;margin-bottom:8px;font-size:15px;font-weight:600;display:flex}.confirm-modal__title.is-danger{color:var(--danger)}.confirm-modal__icon{flex:none;width:18px;height:18px}.confirm-modal__icon :is(path,line,polyline,circle,rect){vector-effect:non-scaling-stroke}.confirm-modal__desc{color:var(--text-dim);white-space:pre-line;margin-bottom:16px;font-size:12.5px;line-height:1.6}.confirm-modal__actions{justify-content:flex-end;gap:10px;display:flex}.confirm-modal__btn{border:1px solid var(--border);cursor:pointer;border-radius:8px;padding:7px 16px;font-size:13px;transition:background .15s,opacity .15s,border-color .15s}.confirm-modal__btn--ghost{color:var(--text-dim);background:0 0}.confirm-modal__btn--ghost:hover{background:var(--bg-hover);color:var(--text)}.confirm-modal__btn--primary{border-color:var(--accent-border);background:var(--accent);color:var(--on-accent)}.confirm-modal__btn--primary:hover{background:var(--accent-hover)}.confirm-modal__btn--danger{border-color:var(--danger);background:var(--danger);color:var(--on-accent)}.confirm-modal__btn--danger:hover{background:var(--danger-hover)}.confirm-fade-enter-active,.confirm-fade-leave-active{transition:opacity .15s}.confirm-fade-enter-from,.confirm-fade-leave-to{opacity:0}html,body,#app{width:100%;height:100%;margin:0;padding:0}.card-preview{background:#fff;justify-content:center;align-items:flex-start;width:100%;min-height:100%;display:flex}.card-preview .phone__screen{height:auto;min-height:100%;margin:0 auto;padding:0;overflow:hidden}