@lemoncat7/dsh-partner 1.5.0 → 1.5.2-next.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/client.js CHANGED
@@ -1162,14 +1162,12 @@ QRCodeSVG.displayName = "QRCodeSVG";
1162
1162
  var client_default = `.dsh-partner-sidebar,
1163
1163
  .dsh-partner-workspace {
1164
1164
  color-scheme: light;
1165
- --partner-canvas: var(--partner-solid-canvas);
1166
1165
  --partner-surface: rgba(246, 247, 250, .17);
1167
1166
  --partner-pane: rgba(255, 255, 255, .16);
1168
1167
  --partner-raised: rgba(255, 255, 255, .38);
1169
1168
  --partner-control: rgba(255, 255, 255, .27);
1170
1169
  --partner-card-surface: rgba(255, 255, 255, .16);
1171
1170
  --partner-card-highlight: rgba(255, 255, 255, .58);
1172
- --partner-solid-canvas: #ebebeb;
1173
1171
  --partner-solid-panel: #f4f4f4;
1174
1172
  --partner-solid-raised: #fafafa;
1175
1173
  --partner-solid-control: #ffffff;
@@ -1224,38 +1222,38 @@ var client_default = `.dsh-partner-sidebar,
1224
1222
 
1225
1223
  body[data-ds-dark-theme] :is(.dsh-partner-sidebar, .dsh-partner-workspace) {
1226
1224
  color-scheme: dark;
1227
- --partner-canvas: var(--partner-solid-canvas);
1228
- --partner-surface: rgba(8, 10, 12, .19);
1229
- --partner-pane: rgba(8, 10, 12, .18);
1230
- --partner-raised: rgba(8, 10, 12, .42);
1231
- --partner-control: rgba(8, 10, 12, .3);
1232
- --partner-card-surface: rgba(7, 9, 11, .22);
1225
+ /* Owned cool-charcoal glass: sufficiently opaque to resist host tint while
1226
+ preserving depth, blur and edge light across the workspace. */
1227
+ --partner-surface: rgb(16 23 25 / 92%);
1228
+ --partner-pane: rgb(25 33 35 / 90%);
1229
+ --partner-raised: rgb(32 41 43 / 94%);
1230
+ --partner-control: rgb(39 50 53 / 92%);
1231
+ --partner-card-surface: rgb(32 41 43 / 90%);
1233
1232
  --partner-card-highlight: rgba(255, 255, 255, .11);
1234
- --partner-solid-canvas: #1c1c1e;
1235
- --partner-solid-panel: #2c2c2e;
1236
- --partner-solid-raised: #323235;
1237
- --partner-solid-control: #3a3a3c;
1233
+ --partner-solid-panel: #182022;
1234
+ --partner-solid-raised: #20292b;
1235
+ --partner-solid-control: #273235;
1238
1236
  --partner-dialog-veil: transparent;
1239
1237
  --partner-card-shadow:
1240
1238
  inset 0 1px 0 var(--partner-card-highlight),
1241
1239
  inset 0 -1px 0 rgba(0, 0, 0, .28),
1242
1240
  0 12px 30px rgba(0, 0, 0, .28),
1243
1241
  0 2px 7px rgba(0, 0, 0, .2);
1244
- --partner-text: #f5f5f7;
1245
- --partner-text-secondary: #d1d1d6;
1246
- --partner-text-tertiary: #98989d;
1247
- --partner-accent: #aeaeb2;
1248
- --partner-accent-strong: #f5f5f7;
1249
- --partner-on-accent: #1d1d1f;
1242
+ --partner-text: #e3eaeb;
1243
+ --partner-text-secondary: #bbc9cc;
1244
+ --partner-text-tertiary: #95a7ab;
1245
+ --partner-accent: #69b6ba;
1246
+ --partner-accent-strong: #8aced0;
1247
+ --partner-on-accent: #101819;
1250
1248
  --partner-success: #30d158;
1251
1249
  --partner-weixin: #30c96b;
1252
1250
  --partner-warning: #ff9f0a;
1253
1251
  --partner-danger: #ff453a;
1254
- --partner-border: rgba(255, 255, 255, .105);
1255
- --partner-separator: rgba(255, 255, 255, .08);
1256
- --partner-hover: rgba(255, 255, 255, .075);
1257
- --partner-selected: rgba(255, 255, 255, .09);
1258
- --partner-focus-ring: rgba(255, 255, 255, .52);
1252
+ --partner-border: rgb(184 204 205 / 11%);
1253
+ --partner-separator: rgb(184 204 205 / 8%);
1254
+ --partner-hover: rgb(105 182 186 / 9%);
1255
+ --partner-selected: rgb(105 182 186 / 14%);
1256
+ --partner-focus-ring: rgb(105 182 186 / 72%);
1259
1257
  --partner-glass-clear: rgba(0, 0, 0, .1);
1260
1258
  --partner-glass-regular: rgba(0, 0, 0, .16);
1261
1259
  --partner-glass-thick: rgba(0, 0, 0, .26);
@@ -1468,28 +1466,56 @@ body[data-ds-dark-theme] :is(.dsh-partner-sidebar, .dsh-partner-workspace) {
1468
1466
  .dsh-partner-feature-form > p.is-success { color: var(--partner-success); background: color-mix(in srgb, var(--partner-success) 7%, transparent); }
1469
1467
  .dsh-partner-board-live { display: inline-flex; min-height: 36px; align-items: center; gap: 7px; padding: 0 10px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }
1470
1468
  .dsh-partner-board-live > i { width: 7px; height: 7px; border-radius: 50%; background: var(--partner-success); box-shadow: 0 0 0 4px color-mix(in srgb, var(--partner-success) 10%, transparent); }
1471
- .dsh-partner-board { display: grid; grid-template-columns: repeat(6, minmax(280px, 1fr)); gap: 10px; overflow-x: auto; padding: 1px 1px 10px; scroll-snap-type: x proximity; scrollbar-width: thin; }
1472
- .dsh-partner-board > section { display: grid; min-height: 430px; align-content: start; gap: 9px; padding: 11px; border: 1px solid var(--partner-border); border-radius: 14px; background: color-mix(in srgb, var(--partner-raised) 66%, transparent); scroll-snap-align: start; }
1469
+ .dsh-partner-board-tools { display: grid; grid-template-columns: minmax(220px, 1fr) minmax(140px, 180px) auto; align-items: center; gap: 8px; }
1470
+ .dsh-partner-board-search { position: relative; display: flex; min-width: 0; align-items: center; }
1471
+ .dsh-partner-board-search > span:not(.sr-only) { position: absolute; z-index: 1; left: 11px; display: grid; place-items: center; color: var(--partner-text-tertiary); pointer-events: none; }
1472
+ .dsh-partner-board-search > input,
1473
+ .dsh-partner-board-assignee > select { width: 100%; min-height: 38px; border: 1px solid var(--partner-border); border-radius: 10px; color: var(--partner-text); background-color: var(--partner-control); font: var(--partner-font-body)/1.4 var(--partner-font-family); transition: border-color 150ms ease, background-color 150ms ease, box-shadow 150ms ease; }
1474
+ .dsh-partner-board-search > input { padding: 8px 38px 8px 34px; }
1475
+ .dsh-partner-board-search > input::placeholder { color: var(--partner-text-tertiary); }
1476
+ .dsh-partner-board-search > input:hover,
1477
+ .dsh-partner-board-assignee > select:hover { border-color: color-mix(in srgb, var(--partner-text) 24%, var(--partner-border)); background-color: var(--partner-hover); }
1478
+ .dsh-partner-board-search > input:focus-visible,
1479
+ .dsh-partner-board-assignee > select:focus-visible { outline: 0; border-color: var(--partner-focus-ring); background-color: var(--partner-raised); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 16%, transparent); }
1480
+ .dsh-partner-board-search > button { position: absolute; z-index: 1; right: 4px; display: grid; width: 30px; min-height: 30px; place-items: center; padding: 0; border: 0; border-radius: 7px; color: var(--partner-text-tertiary); background: transparent; box-shadow: none; }
1481
+ .dsh-partner-board-search > button:hover { color: var(--partner-text); background: var(--partner-hover); }
1482
+ .dsh-partner-board-assignee > select { min-width: 0; padding: 8px 30px 8px 10px; }
1483
+ .dsh-partner-board-tools > small { justify-self: end; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-variant-numeric: tabular-nums; white-space: nowrap; }
1484
+ .dsh-partner-board-statuses { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; padding-bottom: 2px; }
1485
+ .dsh-partner-board-statuses > button { display: inline-flex; min-height: 32px; align-items: center; gap: 7px; padding: 0 9px; border: 1px solid transparent; border-radius: 9px; color: var(--partner-text-tertiary); background: transparent; box-shadow: none; font: var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; transition: border-color 140ms ease, color 140ms ease, background-color 140ms ease; }
1486
+ .dsh-partner-board-statuses > button:hover { border-color: var(--partner-border); color: var(--partner-text); background: var(--partner-hover); }
1487
+ .dsh-partner-board-statuses > button.is-active { border-color: color-mix(in srgb, var(--partner-text) 18%, var(--partner-border)); color: var(--partner-text); background: var(--partner-selected); }
1488
+ .dsh-partner-board-statuses b { min-width: 18px; color: inherit; font-size: inherit; font-variant-numeric: tabular-nums; font-weight: 650; text-align: center; }
1489
+ .dsh-partner-board { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(240px, 100%), 1fr)); align-items: start; gap: 10px; min-width: 0; }
1490
+ .dsh-partner-board[data-focused="true"] { grid-template-columns: minmax(0, 1fr); }
1491
+ .dsh-partner-board > section { display: grid; height: clamp(220px, 27vh, 280px); min-width: 0; grid-template-rows: auto minmax(0, 1fr); align-content: start; gap: 9px; padding: 11px 9px 9px 11px; border: 1px solid var(--partner-border); border-radius: 14px; background: color-mix(in srgb, var(--partner-raised) 66%, transparent); }
1492
+ .dsh-partner-board > section[data-empty="true"] { height: 132px; }
1493
+ .dsh-partner-board[data-focused="true"] > section { height: clamp(340px, 54vh, 560px); }
1494
+ .dsh-partner-board[data-focused="true"] > section[data-empty="true"] { height: 240px; }
1473
1495
  .dsh-partner-board > section > header { display: flex; min-height: 36px; align-items: center; justify-content: space-between; padding: 0 3px; }
1474
1496
  .dsh-partner-board > section > header strong { font-size: var(--partner-font-label); font-weight: 620; }
1475
1497
  .dsh-partner-board > section > header b { display: grid; min-width: 22px; height: 22px; place-items: center; padding: 0 5px; border-radius: 7px; color: var(--partner-text-tertiary); background: var(--partner-selected); font-size: var(--partner-font-caption); }
1476
- .dsh-partner-board > section > div { display: grid; gap: 8px; }
1477
- .dsh-partner-board > section > p { margin: 12px 0; color: var(--partner-text-tertiary); font-size: var(--partner-font-body); text-align: center; }
1478
- .dsh-partner-task-card { position: relative; display: grid; overflow: hidden; border: 1px solid var(--partner-separator); border-radius: 11px; background: var(--partner-raised); box-shadow: var(--partner-shadow-sm); transition: border-color .16s ease, box-shadow .18s ease, transform .16s var(--partner-ease-out); }
1498
+ .dsh-partner-board-column-list { display: grid; min-height: 0; grid-auto-rows: max-content; align-content: start; gap: 7px; overflow-y: auto; padding: 1px 3px 6px 0; overscroll-behavior: contain; scrollbar-gutter: stable; scrollbar-width: thin; }
1499
+ .dsh-partner-board > section > p { align-self: center; margin: 0 0 22px; color: var(--partner-text-tertiary); font-size: var(--partner-font-body); text-align: center; }
1500
+ .dsh-partner-task-card { position: relative; display: grid; min-height: 82px; overflow: hidden; border: 1px solid var(--partner-separator); border-radius: 11px; background: var(--partner-raised); box-shadow: var(--partner-shadow-sm); transition: border-color .16s ease, box-shadow .18s ease, transform .16s var(--partner-ease-out); }
1479
1501
  .dsh-partner-task-card:hover { border-color: color-mix(in srgb, var(--partner-text) 22%, var(--partner-border)); box-shadow: var(--partner-shadow-md); transform: translateY(-1px); }
1480
1502
  .dsh-partner-task-card:focus-within { border-color: var(--partner-focus-ring); box-shadow: 0 0 0 2px color-mix(in srgb, var(--partner-focus-ring) 18%, transparent), var(--partner-shadow-md); }
1481
1503
  .dsh-partner-task-card[data-blocked="true"] { border-left-color: color-mix(in srgb, var(--partner-warning) 55%, var(--partner-border)); }
1482
- .dsh-partner-task-summary { display: grid !important; min-height: 66px !important; grid-template-columns: minmax(0, 1fr) 16px; align-items: center !important; gap: 10px !important; padding: 11px 12px !important; border: 0 !important; border-radius: 0 !important; appearance: none; color: var(--partner-text) !important; background: transparent !important; box-shadow: none !important; font-family: var(--partner-font-family); text-align: left; cursor: pointer; }
1504
+ .dsh-partner-task-summary { display: grid !important; min-height: 82px !important; grid-template-columns: minmax(0, 1fr) 16px; align-items: center !important; gap: 8px !important; padding: 10px 10px 10px 11px !important; border: 0 !important; border-radius: 0 !important; appearance: none; color: var(--partner-text) !important; background: transparent !important; box-shadow: none !important; font-family: var(--partner-font-family); text-align: left; cursor: pointer; }
1483
1505
  .dsh-partner-task-summary:hover { background: var(--partner-hover) !important; }
1484
1506
  .dsh-partner-task-summary:focus-visible { outline: 0; }
1485
- .dsh-partner-task-summary > span { display: grid; min-width: 0; gap: 6px; }
1486
- .dsh-partner-task-summary strong { overflow: hidden; padding-right: 12px; font-size: var(--partner-font-label); font-weight: 620; text-overflow: ellipsis; white-space: nowrap; }
1487
- .dsh-partner-task-summary small { overflow: hidden; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); text-overflow: ellipsis; white-space: nowrap; }
1507
+ .dsh-partner-task-summary > span { display: grid; min-width: 0; gap: 4px; }
1508
+ .dsh-partner-task-card-title { display: flex; min-width: 0; align-items: flex-start; justify-content: space-between; gap: 8px; }
1509
+ .dsh-partner-task-card-title > strong { display: -webkit-box; min-width: 0; overflow: hidden; color: var(--partner-text); font-size: var(--partner-font-body); font-weight: 620; line-height: 1.38; overflow-wrap: anywhere; -webkit-box-orient: vertical; -webkit-line-clamp: 2; }
1510
+ .dsh-partner-task-card-title > em { flex: none; margin-top: 1px; padding: 2px 5px; border: 1px solid var(--partner-separator); border-radius: 6px; color: var(--partner-text-tertiary); background: var(--partner-control); font-size: 10px; font-style: normal; font-weight: 620; line-height: 1.25; }
1511
+ .dsh-partner-task-card[data-priority="high"] .dsh-partner-task-card-title > em { border-color: color-mix(in srgb, var(--partner-warning) 35%, var(--partner-separator)); color: var(--partner-warning); background: color-mix(in srgb, var(--partner-warning) 7%, var(--partner-control)); }
1512
+ .dsh-partner-task-card[data-priority="urgent"] .dsh-partner-task-card-title > em { border-color: color-mix(in srgb, var(--partner-danger) 34%, var(--partner-separator)); color: var(--partner-danger); background: color-mix(in srgb, var(--partner-danger) 7%, var(--partner-control)); }
1513
+ .dsh-partner-task-card-owner { overflow: hidden; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); text-overflow: ellipsis; white-space: nowrap; }
1514
+ .dsh-partner-task-relations { display: flex; min-width: 0; align-items: center; flex-wrap: wrap; gap: 4px; }
1515
+ .dsh-partner-task-relations > small { padding: 2px 6px; border-radius: 6px; color: var(--partner-text-secondary); background: var(--partner-selected); font-size: 10px; font-variant-numeric: tabular-nums; line-height: 1.3; }
1516
+ .dsh-partner-task-relations > small[data-blocked="true"] { color: var(--partner-warning); background: color-mix(in srgb, var(--partner-warning) 8%, var(--partner-selected)); }
1488
1517
  .dsh-partner-task-summary > svg { color: var(--partner-text-tertiary); transition: transform .16s var(--partner-ease-out), color .16s ease; }
1489
1518
  .dsh-partner-task-summary:hover > svg { color: var(--partner-text); transform: translateX(2px); }
1490
- .dsh-partner-priority { position: absolute; top: 17px; right: 12px; width: 6px; height: 6px; border-radius: 50%; background: var(--partner-text-tertiary); }
1491
- .dsh-partner-priority.is-high { background: var(--partner-warning); }
1492
- .dsh-partner-priority.is-urgent { background: var(--partner-danger); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-danger) 12%, transparent); }
1493
1519
  .dsh-partner-task-detail { display: grid; gap: 13px; }
1494
1520
  .dsh-partner-task-description { display: grid; gap: 6px; padding: 12px; border: 1px solid var(--partner-separator); border-radius: 10px; background: color-mix(in srgb, var(--partner-raised) 78%, transparent); }
1495
1521
  .dsh-partner-task-description strong { font-size: var(--partner-font-body); font-weight: 620; }
@@ -1587,6 +1613,8 @@ body[data-ds-dark-theme] :is(.dsh-partner-sidebar, .dsh-partner-workspace) {
1587
1613
  @media (max-width: 820px) {
1588
1614
  .dsh-partner-feature-hero { align-items: start; flex-direction: column; gap: 12px; }
1589
1615
  .dsh-partner-feature-hero > div { width: 100%; flex-wrap: wrap; }
1616
+ .dsh-partner-board-tools { grid-template-columns: minmax(0, 1fr) minmax(130px, 168px); }
1617
+ .dsh-partner-board-tools > small { grid-column: 1 / -1; justify-self: start; }
1590
1618
  .dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form { grid-template-columns: 1fr 1fr; }
1591
1619
  .dsh-partner-schedule-list > article { grid-template-columns: minmax(0, 1fr) auto 30px; }
1592
1620
  .dsh-partner-schedule-list > article > button:not(.is-icon):not(.dsh-partner-feature-switch) { grid-column: 1 / -1; }
@@ -1605,6 +1633,12 @@ body[data-ds-dark-theme] :is(.dsh-partner-sidebar, .dsh-partner-workspace) {
1605
1633
  .dsh-partner-skill-installed > article > .is-icon { grid-column: 3; }
1606
1634
  .dsh-partner-feature-block > header { align-items: flex-start; flex-direction: column; }
1607
1635
  .dsh-partner-feature-block > header > div { width: 100%; flex-wrap: wrap; justify-content: flex-start; }
1636
+ .dsh-partner-board-tools { grid-template-columns: 1fr; }
1637
+ .dsh-partner-board-assignee, .dsh-partner-board-tools > small { grid-column: 1; }
1638
+ .dsh-partner-board-assignee > select { min-height: 42px; }
1639
+ .dsh-partner-board-statuses { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); }
1640
+ .dsh-partner-board-statuses > button { min-width: 0; justify-content: center; padding-inline: 6px; }
1641
+ .dsh-partner-board > section, .dsh-partner-board[data-focused="true"] > section { height: min(430px, 58vh); }
1608
1642
  .dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form { grid-template-columns: 1fr; padding: 14px; }
1609
1643
  :is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > label { grid-column: 1 !important; }
1610
1644
  .dsh-partner-task-form-dependencies > div { grid-template-columns: 1fr; }
@@ -1641,7 +1675,7 @@ body[data-ds-dark-theme] :is(.dsh-partner-sidebar, .dsh-partner-workspace) {
1641
1675
  .dsh-partner-avatar { display: grid; place-items: center; flex: none; width: 36px; height: 36px; border: 1px solid var(--partner-border); border-radius: 12px; color: var(--partner-text); background: linear-gradient(145deg, var(--partner-glass-thick), var(--partner-control)); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-sm); font-size: var(--partner-font-label); font-weight: 650; }
1642
1676
  .dsh-partner-avatar.is-small { width: 25px; height: 25px; border-radius: 8px; font-size: var(--partner-font-caption); }
1643
1677
 
1644
- .dsh-partner-workspace { position: relative; isolation: isolate; display: grid; grid-template-rows: auto minmax(0, 1fr); width: 100%; height: 100%; min-width: 0; overflow: hidden; background: var(--partner-canvas); }
1678
+ .dsh-partner-workspace { position: relative; isolation: isolate; display: grid; grid-template-rows: auto minmax(0, 1fr); width: 100%; height: 100%; min-width: 0; overflow: hidden; background: transparent; }
1645
1679
  .dsh-partner-glass-surface { position: relative; isolation: isolate; transition: opacity 180ms ease-out, border-color 180ms ease, box-shadow 220ms var(--partner-ease-out), transform 220ms var(--partner-ease-out); }
1646
1680
  .dsh-partner-glass-surface.is-svg { -webkit-backdrop-filter: var(--partner-glass-filter-id) saturate(var(--partner-glass-saturation)); backdrop-filter: var(--partner-glass-filter-id) saturate(var(--partner-glass-saturation)); }
1647
1681
  .dsh-partner-glass-surface.is-fallback { -webkit-backdrop-filter: var(--partner-glass-filter); backdrop-filter: var(--partner-glass-filter); }
@@ -2448,7 +2482,6 @@ body[data-ds-dark-theme] :is(.dsh-partner-sidebar, .dsh-partner-workspace) {
2448
2482
 
2449
2483
  @media (prefers-reduced-transparency: reduce) {
2450
2484
  :is(.dsh-partner-sidebar, .dsh-partner-workspace) {
2451
- --partner-canvas: var(--partner-solid-canvas);
2452
2485
  --partner-surface: var(--partner-solid-panel);
2453
2486
  --partner-pane: var(--partner-solid-panel);
2454
2487
  --partner-raised: var(--partner-solid-raised);
@@ -2474,7 +2507,6 @@ body[data-ds-dark-theme] :is(.dsh-partner-sidebar, .dsh-partner-workspace) {
2474
2507
 
2475
2508
  @supports not ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))) {
2476
2509
  :is(.dsh-partner-sidebar, .dsh-partner-workspace) {
2477
- --partner-canvas: var(--partner-solid-canvas);
2478
2510
  --partner-surface: var(--partner-solid-panel);
2479
2511
  --partner-pane: var(--partner-solid-panel);
2480
2512
  --partner-raised: var(--partner-solid-raised);
@@ -2573,6 +2605,262 @@ body[data-ds-dark-theme] :is(.dsh-partner-sidebar, .dsh-partner-workspace) {
2573
2605
  // src/ui/workspace-ui.css
2574
2606
  var workspace_ui_default = '.dsh-partner-feature-hero-actions { display: flex; align-items: center; justify-content: flex-end; flex-wrap: wrap; gap: 8px; }\n.dsh-partner-feature-page { gap: 20px; }\n.dsh-partner-feature-hero { min-height: 92px; padding-bottom: 18px; }\n.dsh-partner-feature-hero p { max-width: 62ch; text-wrap: pretty; }\n.dsh-partner-feature-block { gap: 16px; padding: 20px; border-radius: 18px; box-shadow: inset 0 1px 0 var(--partner-card-highlight), 0 5px 16px color-mix(in srgb, var(--partner-text) 4%, transparent); }\n.dsh-partner-feature-block > header { min-height: 40px; }\n.dsh-partner-feature-block > header strong { font-size: var(--partner-font-label); letter-spacing: -.01em; }\n.dsh-partner-feature-block > header small { margin-top: 1px; }\n\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) :where(input, textarea, select) { outline: 0; }\n.dsh-partner-workspace select:not([multiple]) {\n appearance: none;\n padding-right: 32px;\n border-color: var(--partner-border);\n border-radius: 9px;\n color: var(--partner-text);\n background-color: var(--partner-control);\n background-image: linear-gradient(45deg, transparent 50%, currentColor 50%), linear-gradient(135deg, currentColor 50%, transparent 50%);\n background-position: calc(100% - 15px) calc(50% - 1px), calc(100% - 11px) calc(50% - 1px);\n background-repeat: no-repeat;\n background-size: 4px 4px, 4px 4px;\n box-shadow: inset 0 1px 0 color-mix(in srgb, var(--partner-card-highlight) 54%, transparent), inset 0 -1px 0 var(--partner-glass-rim-shadow);\n font-family: var(--partner-font-family);\n font-size: var(--partner-font-body);\n font-weight: 520;\n cursor: pointer;\n transition: border-color 150ms ease, background-color 150ms ease, box-shadow 150ms ease;\n}\n.dsh-partner-workspace select:not([multiple]):hover:not(:disabled) { border-color: color-mix(in srgb, var(--partner-text) 24%, var(--partner-border)); background-color: var(--partner-hover); }\n.dsh-partner-workspace select:not([multiple]):focus-visible { border-color: var(--partner-focus-ring); background-color: var(--partner-raised); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 16%, transparent), inset 0 1px 0 color-mix(in srgb, var(--partner-card-highlight) 66%, transparent); }\n.dsh-partner-workspace select:not([multiple]):disabled { cursor: not-allowed; }\n.dsh-partner-workspace select option { color: var(--partner-text); background: var(--partner-solid-control); font: inherit; }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > footer { align-items: center; margin-top: 4px; padding-top: 16px; border-top: 1px solid var(--partner-separator); }\n.dsh-partner-form-footer-spacer { flex: 1; }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > footer .is-primary { color: var(--partner-on-accent); border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > footer .is-primary:hover { color: var(--partner-on-accent); border-color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent-strong) 88%, #000); }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > .dsh-partner-workspace-notice { grid-column: 1 / -1; margin: 0; }\n.dsh-partner-feature-page button:disabled { cursor: not-allowed; opacity: .48; }\n.dsh-partner-identity-danger > div { display: flex; align-items: center; justify-content: flex-end; gap: 7px; }\n.dsh-partner-identity-danger[data-confirming="true"] { margin-inline: -12px; padding: 16px 12px 0; border-top-color: color-mix(in srgb, var(--partner-danger) 30%, var(--partner-border)); background: color-mix(in srgb, var(--partner-danger) 4%, transparent); }\n.dsh-partner-identity-danger button.is-secondary { border-color: var(--partner-border); color: var(--partner-text-secondary); background: var(--partner-control); }\n.dsh-partner-identity-danger button.is-danger { color: var(--partner-on-accent); border-color: var(--partner-danger); background: var(--partner-danger); }\n.dsh-partner-profile-entries article > header button.is-danger { color: var(--partner-danger); background: color-mix(in srgb, var(--partner-danger) 8%, transparent); }\n\n.dsh-partner-skill-installed > article,\n.dsh-partner-market-grid > article,\n.dsh-partner-schedule-list > article { transition: border-color 150ms ease, background-color 150ms ease, transform 180ms var(--partner-ease-out); }\n.dsh-partner-skill-installed > article:hover,\n.dsh-partner-schedule-list > article:hover { border-color: color-mix(in srgb, var(--partner-text) 20%, var(--partner-border)); background: color-mix(in srgb, var(--partner-hover) 60%, var(--partner-raised)); transform: translate3d(0, -1px, 0); }\n.dsh-partner-schedule-meta { display: flex !important; align-items: center; flex-wrap: wrap; gap: 5px 10px !important; margin-top: 2px; }\n.dsh-partner-schedule-meta > em { position: relative; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-style: normal; font-variant-numeric: tabular-nums; }\n.dsh-partner-schedule-meta > em + em::before { position: absolute; top: 50%; left: -6px; width: 2px; height: 2px; border-radius: 50%; background: var(--partner-text-tertiary); content: ""; }\n.dsh-partner-run-list > article { border-radius: 9px; transition: background-color 140ms ease; }\n.dsh-partner-run-list > article:hover { background: var(--partner-hover); }\n.dsh-partner-board > section { border-radius: 16px; }\n.dsh-partner-task-card { box-shadow: none; }\n.dsh-partner-task-card[data-expanded="true"] { box-shadow: 0 6px 18px color-mix(in srgb, var(--partner-text) 6%, transparent); }\n\n@media (hover: hover) {\n .dsh-partner-skill-installed .is-icon,\n .dsh-partner-schedule-list .is-icon { opacity: .34; transition: opacity 140ms ease, color 140ms ease, background-color 140ms ease; }\n .dsh-partner-skill-installed > article:hover .is-icon,\n .dsh-partner-schedule-list > article:hover .is-icon,\n .dsh-partner-skill-installed .is-icon:focus-visible,\n .dsh-partner-schedule-list .is-icon:focus-visible { opacity: 1; }\n}\n\n.dsh-partner-workspace-dialog-layer { position: absolute; z-index: 12; inset: 0; display: flex; align-items: center; justify-content: center; padding: clamp(16px, 3vw, 32px); background: var(--partner-dialog-veil); }\n.dsh-partner-workspace-dialog { position: relative; inset: auto; display: grid; grid-template-rows: auto minmax(0, 1fr); width: min(560px, 100%); max-width: none; height: auto; max-height: min(680px, 100%); margin: 0; padding: 0; overflow: hidden; border: 1px solid color-mix(in srgb, var(--partner-text) 18%, var(--partner-border)); border-radius: 16px; color: var(--partner-text); background: var(--partner-solid-panel); box-shadow: 0 22px 58px color-mix(in srgb, #000 18%, transparent), 0 4px 14px color-mix(in srgb, #000 8%, transparent), inset 0 1px 0 var(--partner-card-highlight); animation: dsh-partner-dialog-enter 200ms var(--partner-ease-out) both; }\n.dsh-partner-workspace-dialog.is-wide { width: min(680px, 100%); max-height: min(720px, 100%); }\n.dsh-partner-workspace-dialog > header { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: start; gap: 20px; padding: 22px 22px 18px; border-bottom: 1px solid var(--partner-separator); background: var(--partner-solid-raised); }\n.dsh-partner-workspace-dialog > header > span { display: grid; gap: 5px; min-width: 0; }\n.dsh-partner-workspace-dialog > header small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 680; letter-spacing: .09em; }\n.dsh-partner-workspace-dialog > header strong { font-size: var(--partner-font-title); line-height: 1.25; font-weight: 660; letter-spacing: -.025em; text-wrap: balance; }\n.dsh-partner-workspace-dialog > header p { max-width: 58ch; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.55; text-wrap: pretty; }\n.dsh-partner-workspace-dialog > header button { display: grid; place-items: center; width: 32px; min-height: 32px; padding: 0; border: 1px solid transparent; border-radius: 9px; color: var(--partner-text-tertiary); background: transparent; box-shadow: none; cursor: pointer; transition: color 140ms ease, border-color 140ms ease, background-color 140ms ease, transform 140ms var(--partner-ease-out); }\n.dsh-partner-workspace-dialog > header button:hover { border-color: var(--partner-border); color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-workspace-dialog > header button:active { transform: scale(.94); }\n.dsh-partner-workspace-dialog-body { min-width: 0; min-height: 0; overflow: auto; padding: 20px 22px 24px; overscroll-behavior: contain; scrollbar-gutter: stable; }\n.dsh-partner-workspace-dialog-body > :is(form, .dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) { margin: 0; padding: 0; border: 0; border-radius: 0; background: transparent; box-shadow: none; }\n.dsh-partner-workspace-dialog-body > :is(form, .dsh-partner-task-detail) > footer:last-child { position: sticky; z-index: 2; bottom: -24px; margin: 4px -22px -24px; padding: 14px 22px; border-top: 1px solid var(--partner-separator); background: var(--partner-solid-raised); box-shadow: 0 -10px 24px color-mix(in srgb, #000 5%, transparent); }\n\n.dsh-partner-workspace-notice { display: grid; grid-template-columns: 7px minmax(0, 1fr); align-items: start; gap: 10px; margin: 0 0 14px; padding: 11px 13px; border: 1px solid var(--partner-border); border-radius: 10px; color: var(--partner-text-secondary); background: var(--partner-control); font-size: var(--partner-font-body); line-height: 1.5; }\n.dsh-partner-workspace-notice > i { width: 7px; height: 7px; margin-top: .42em; border-radius: 50%; background: var(--partner-text-tertiary); }\n.dsh-partner-workspace-notice.is-error { border-color: color-mix(in srgb, var(--partner-danger) 30%, var(--partner-border)); color: var(--partner-danger); }\n.dsh-partner-workspace-notice.is-error > i { background: var(--partner-danger); }\n.dsh-partner-workspace-notice.is-warning > i { background: var(--partner-warning); }\n.dsh-partner-workspace-notice.is-success > i { background: var(--partner-success); }\n\n.dsh-partner-collection-empty { display: grid; justify-items: center; padding: 38px 24px 42px; color: var(--partner-text-secondary); text-align: center; }\n.dsh-partner-collection-empty > span { display: grid; place-items: center; width: 42px; height: 42px; margin-bottom: 12px; border: 1px solid var(--partner-border); border-radius: 13px; color: var(--partner-text-tertiary); background: var(--partner-control); }\n.dsh-partner-collection-empty > strong { color: var(--partner-text); font-size: var(--partner-font-label); font-weight: 620; }\n.dsh-partner-collection-empty > p { max-width: 46ch; margin: 6px 0 14px; color: var(--partner-text-tertiary); font-size: var(--partner-font-body); line-height: 1.55; text-wrap: pretty; }\n.dsh-partner-collection-empty > button { margin-top: 14px; }\n\n.dsh-partner-collection-skeleton { display: grid; gap: 8px; padding: 6px 0; }\n.dsh-partner-collection-skeleton > i { display: block; height: 68px; overflow: hidden; border: 1px solid var(--partner-border); border-radius: 12px; background: linear-gradient(100deg, var(--partner-control) 20%, var(--partner-hover) 38%, var(--partner-control) 56%); background-size: 220% 100%; animation: dsh-partner-skeleton 1.4s ease-in-out infinite; }\n\n.dsh-partner-count-label { display: inline-flex; align-items: baseline; gap: 5px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-variant-numeric: tabular-nums; }\n.dsh-partner-count-label > b { color: var(--partner-text); font-size: var(--partner-font-label); font-weight: 650; }\n\n@keyframes dsh-partner-dialog-enter { from { opacity: 0; transform: translate3d(0, 10px, 0) scale(.985); } to { opacity: 1; transform: translate3d(0, 0, 0) scale(1); } }\n@keyframes dsh-partner-skeleton { 0% { background-position: 120% 0; } 100% { background-position: -120% 0; } }\n\n@media (max-width: 760px) {\n .dsh-partner-workspace-dialog-layer { align-items: stretch; padding: 0; }\n .dsh-partner-workspace-dialog, .dsh-partner-workspace-dialog.is-wide { width: 100%; height: 100%; max-height: none; border-width: 0; border-radius: 0; }\n .dsh-partner-workspace-dialog > header { padding: 18px 18px 15px; }\n .dsh-partner-workspace-dialog-body { padding: 18px 18px 26px; }\n .dsh-partner-workspace-dialog-body > :is(form, .dsh-partner-task-detail) > footer:last-child { bottom: -26px; margin: 4px -18px -26px; padding: 13px 18px max(13px, env(safe-area-inset-bottom)); }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .dsh-partner-workspace-dialog, .dsh-partner-collection-skeleton > i { animation: none; }\n}\n';
2575
2607
 
2608
+ // src/ui/responsive-ui.css
2609
+ var responsive_ui_default = `/* Mobile composition lives separately from the desktop visual system so each
2610
+ layout can evolve without selector-specificity patches. */
2611
+ .dsh-partner-mobile-controls { display: none; }
2612
+
2613
+ @media (max-width: 760px) {
2614
+ .dsh-partner-workspace {
2615
+ min-height: 0;
2616
+ height: 100%;
2617
+ max-height: 100dvh;
2618
+ overflow: hidden;
2619
+ font-size: 14px;
2620
+ }
2621
+
2622
+ .dsh-partner-topbar {
2623
+ min-width: 0;
2624
+ margin: max(6px, env(safe-area-inset-top)) 6px 0;
2625
+ padding: 7px 8px 8px;
2626
+ border-radius: 14px 14px 10px 10px;
2627
+ }
2628
+
2629
+ .dsh-partner-topbar > .dsh-partner-topbar-brand {
2630
+ display: flex;
2631
+ min-width: 0;
2632
+ min-height: 44px;
2633
+ gap: 9px;
2634
+ }
2635
+
2636
+ .dsh-partner-topbar-brand > span:last-child { min-width: 0; }
2637
+ .dsh-partner-topbar-brand strong,
2638
+ .dsh-partner-topbar-brand small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
2639
+ .dsh-partner-topbar [data-xiaohei-workspace-close] { width: 44px; height: 44px; }
2640
+
2641
+ .dsh-partner-topbar > .dsh-partner-mobile-controls {
2642
+ display: grid;
2643
+ width: 100%;
2644
+ gap: 6px;
2645
+ }
2646
+
2647
+ .dsh-partner-mobile-companion-row { display: grid; min-width: 0; grid-template-columns: minmax(0, 1fr) 44px; gap: 6px; }
2648
+ .dsh-partner-mobile-companion-picker { position: relative; display: block; min-width: 0; }
2649
+ .dsh-partner-mobile-companion-picker::after {
2650
+ position: absolute;
2651
+ top: 50%;
2652
+ right: 16px;
2653
+ width: 7px;
2654
+ height: 7px;
2655
+ border-right: 1.5px solid currentColor;
2656
+ border-bottom: 1.5px solid currentColor;
2657
+ color: var(--partner-text-tertiary);
2658
+ content: '';
2659
+ transform: translateY(-70%) rotate(45deg);
2660
+ pointer-events: none;
2661
+ }
2662
+ .dsh-partner-mobile-companion-picker select {
2663
+ width: 100%;
2664
+ min-width: 0;
2665
+ min-height: 44px;
2666
+ padding: 0 38px 0 13px;
2667
+ overflow: hidden;
2668
+ border: 1px solid var(--partner-border);
2669
+ border-radius: 10px;
2670
+ color: var(--partner-text);
2671
+ background: var(--partner-control);
2672
+ background-image: none;
2673
+ box-shadow: inset 0 1px 0 var(--partner-glass-highlight);
2674
+ font: 560 16px/1.25 var(--partner-font-family);
2675
+ text-overflow: ellipsis;
2676
+ }
2677
+ .dsh-partner-mobile-create {
2678
+ display: grid;
2679
+ width: 44px;
2680
+ min-height: 44px;
2681
+ place-items: center;
2682
+ padding: 0;
2683
+ border: 1px solid var(--partner-border);
2684
+ border-radius: 10px;
2685
+ color: var(--partner-text-secondary);
2686
+ background: var(--partner-control);
2687
+ box-shadow: inset 0 1px 0 var(--partner-glass-highlight);
2688
+ }
2689
+
2690
+ .dsh-partner-mobile-workspace-nav { gap: 6px; }
2691
+ .dsh-partner-mobile-workspace-nav button {
2692
+ min-height: 44px;
2693
+ padding: 0 9px;
2694
+ border-radius: 10px;
2695
+ font-size: 13px;
2696
+ touch-action: manipulation;
2697
+ }
2698
+
2699
+ .dsh-partner-grid { min-width: 0; padding: 6px 6px max(6px, env(safe-area-inset-bottom)); }
2700
+ .dsh-partner-stage { min-width: 0; border-radius: 13px; }
2701
+ .dsh-partner-stage-scroll { padding: 18px 14px max(36px, calc(20px + env(safe-area-inset-bottom))); }
2702
+
2703
+ .dsh-partner-identity { min-width: 0; min-height: 76px; padding: 13px 14px 9px; }
2704
+ .dsh-partner-identity > span:nth-child(2) { overflow: hidden; }
2705
+ .dsh-partner-identity h1 { font-size: 20px; }
2706
+ .dsh-partner-identity .dsh-partner-status { max-width: 112px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
2707
+ .dsh-partner-tabs { min-height: 45px; margin-inline: 8px; gap: 0; scrollbar-width: none; }
2708
+ .dsh-partner-tabs::-webkit-scrollbar { display: none; }
2709
+ .dsh-partner-tabs button { min-height: 44px; padding-inline: 11px; touch-action: manipulation; }
2710
+
2711
+ .dsh-partner-feature-page { width: 100%; gap: 14px; padding: 18px 12px max(34px, calc(18px + env(safe-area-inset-bottom))); }
2712
+ .dsh-partner-feature-hero { min-height: 0; gap: 13px; padding: 0 2px 14px 12px; }
2713
+ .dsh-partner-feature-hero h2 { font-size: 23px; }
2714
+ .dsh-partner-feature-hero p { font-size: 14px; line-height: 1.55; }
2715
+ .dsh-partner-feature-hero > div { align-items: center; }
2716
+ .dsh-partner-feature-block,
2717
+ .dsh-partner-capability-detail { gap: 13px; padding: 14px; border-radius: 14px; }
2718
+
2719
+ .dsh-partner-workspace :where(input:not([type="checkbox"]):not([type="radio"]), textarea, select) { font-size: 16px; }
2720
+ .dsh-partner-field :where(input, select),
2721
+ :is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) :where(input, select),
2722
+ .dsh-partner-board-search > input,
2723
+ .dsh-partner-board-assignee > select,
2724
+ .dsh-partner-task-detail select { min-height: 44px; height: auto; }
2725
+ .dsh-partner-field textarea,
2726
+ :is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) textarea { min-height: 96px; }
2727
+
2728
+ .dsh-partner-workspace :where(button:not(.dsh-partner-feature-switch)) { touch-action: manipulation; }
2729
+ .dsh-partner-feature-page :where(button:not(.dsh-partner-feature-switch)),
2730
+ .dsh-partner-form-actions > button,
2731
+ .dsh-partner-state > button,
2732
+ .dsh-partner-weixin-connect > button,
2733
+ .dsh-partner-home-channel-actions button,
2734
+ .dsh-partner-home-details header button,
2735
+ .dsh-partner-identity-danger button,
2736
+ .dsh-partner-library-header nav button,
2737
+ .dsh-partner-graph-filters button,
2738
+ .dsh-partner-graph-pair > section button { min-height: 44px; }
2739
+ .dsh-partner-feature-page .is-icon { width: 44px; min-width: 44px; min-height: 44px; }
2740
+ .dsh-partner-check { min-height: 44px; }
2741
+ .dsh-partner-feature-switch,
2742
+ .dsh-partner-feature-switch[data-on="true"] {
2743
+ width: 44px;
2744
+ height: 44px;
2745
+ min-height: 44px !important;
2746
+ border-color: transparent !important;
2747
+ background: transparent !important;
2748
+ }
2749
+ .dsh-partner-feature-switch::before {
2750
+ position: absolute;
2751
+ top: 11px;
2752
+ left: 3px;
2753
+ width: 38px;
2754
+ height: 22px;
2755
+ border: 1px solid var(--partner-border);
2756
+ border-radius: 999px;
2757
+ background: color-mix(in srgb, var(--partner-text) 9%, transparent);
2758
+ content: '';
2759
+ }
2760
+ .dsh-partner-feature-switch[data-on="true"]::before { border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }
2761
+ .dsh-partner-feature-switch i { top: 15px; left: 6px; }
2762
+
2763
+ .dsh-partner-home-heading { margin-bottom: 16px; }
2764
+ .dsh-partner-home-channel { min-height: 0; border-radius: 16px; }
2765
+ .dsh-partner-home-route { min-height: 116px; padding: 20px; }
2766
+ .dsh-partner-home-channel-copy { padding: 12px 18px 20px; }
2767
+ .dsh-partner-home-channel-actions { align-items: stretch; flex-direction: column; gap: 8px; width: 100%; }
2768
+ .dsh-partner-home-channel-actions button { width: 100%; }
2769
+ .dsh-partner-home-details { gap: 10px; margin-top: 12px; }
2770
+ .dsh-partner-home-details > section { padding: 16px 14px 17px; }
2771
+ .dsh-partner-home-details header { grid-template-columns: 34px minmax(0, 1fr) auto; }
2772
+ .dsh-partner-home-profile blockquote,
2773
+ .dsh-partner-home-capability-list,
2774
+ .dsh-partner-home-capability-list small,
2775
+ .dsh-partner-home-continuity > p { margin-left: 0; }
2776
+
2777
+ .dsh-partner-form-actions,
2778
+ .dsh-partner-identity-danger { align-items: stretch; flex-direction: column; }
2779
+ .dsh-partner-form-actions > button,
2780
+ .dsh-partner-identity-danger > div,
2781
+ .dsh-partner-identity-danger button { width: 100%; }
2782
+ .dsh-partner-identity-danger > div { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); }
2783
+
2784
+ .dsh-partner-skill-search,
2785
+ .dsh-partner-skill-search.is-compact { min-height: 52px; grid-template-columns: 36px minmax(0, 1fr) 44px; gap: 6px; padding: 4px 5px 4px 8px; }
2786
+ .dsh-partner-skill-search input,
2787
+ .dsh-partner-skill-search.is-compact input { height: 44px; font-size: 16px; }
2788
+ .dsh-partner-skill-search .dsh-partner-skill-search-clear { width: 44px; min-height: 44px; }
2789
+ .dsh-partner-skill-search-count { grid-column: 2 / -1; min-width: 0; padding: 0 7px 3px 0; border-left: 0; line-height: 16px; text-align: left; }
2790
+ .dsh-partner-skill-search:not(:has(.dsh-partner-skill-search-clear)) { grid-template-columns: 36px minmax(0, 1fr); }
2791
+ .dsh-partner-market-sources > button { min-height: 44px; }
2792
+ .dsh-partner-market-grid { grid-template-columns: 1fr; }
2793
+ .dsh-partner-skill-installed > article,
2794
+ .dsh-partner-skill-installed.is-market > article { grid-template-columns: 36px minmax(0, 1fr) 44px; padding: 10px; }
2795
+ .dsh-partner-skill-installed.is-binding > article { min-height: 0; grid-template-columns: 36px minmax(0, 1fr); }
2796
+ .dsh-partner-skill-installed.is-binding .dsh-partner-skill-binding-action { grid-column: 1 / -1; width: 100%; }
2797
+ .dsh-partner-skill-picker-list { max-height: min(420px, 48dvh); grid-template-columns: 1fr; }
2798
+ .dsh-partner-skill-picker-list > article { min-height: 0; }
2799
+ .dsh-partner-skill-picker-list button { width: 100%; justify-self: stretch; }
2800
+
2801
+ .dsh-partner-board-tools { grid-template-columns: 1fr; }
2802
+ .dsh-partner-board-assignee,
2803
+ .dsh-partner-board-tools > small { grid-column: 1; }
2804
+ .dsh-partner-board-tools > small { justify-self: start; }
2805
+ .dsh-partner-board-search > button { right: 0; width: 44px; min-height: 44px; }
2806
+ .dsh-partner-board-statuses { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 5px; }
2807
+ .dsh-partner-board-statuses > button { min-width: 0; min-height: 44px; justify-content: center; gap: 4px; padding-inline: 5px; }
2808
+ .dsh-partner-board { grid-template-columns: 1fr; }
2809
+ .dsh-partner-board > section,
2810
+ .dsh-partner-board[data-focused="true"] > section { height: min(430px, 55dvh); }
2811
+ .dsh-partner-board > section[data-empty="true"],
2812
+ .dsh-partner-board[data-focused="true"] > section[data-empty="true"] { height: 112px; }
2813
+ .dsh-partner-task-fields label { grid-template-columns: 1fr; gap: 5px; }
2814
+ .dsh-partner-task-dependency > div > span { min-height: 44px; grid-template-columns: 18px minmax(0, 1fr) 52px; }
2815
+ .dsh-partner-task-dependency > div button { min-height: 44px; }
2816
+ .dsh-partner-task-actions > span { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); }
2817
+ .dsh-partner-task-actions button { width: 100%; }
2818
+
2819
+ .dsh-partner-schedule-time { grid-template-columns: 1fr; }
2820
+ .dsh-partner-schedule-list > article {
2821
+ min-height: 0;
2822
+ grid-template-columns: minmax(0, 1fr) 44px;
2823
+ align-items: center;
2824
+ gap: 8px;
2825
+ padding: 12px;
2826
+ }
2827
+ .dsh-partner-schedule-list > article > span:first-child { grid-column: 1 / -1; }
2828
+ .dsh-partner-schedule-list > article > .dsh-partner-feature-switch { grid-column: 1; justify-self: start; }
2829
+ .dsh-partner-schedule-list > article > button:not(.is-icon):not(.dsh-partner-feature-switch) { grid-column: 1; grid-row: 2; justify-self: end; }
2830
+ .dsh-partner-schedule-list > article > .is-icon { grid-column: 2; grid-row: 2; }
2831
+ .dsh-partner-schedule-list p,
2832
+ .dsh-partner-run-list p { white-space: normal; overflow-wrap: anywhere; }
2833
+
2834
+ .dsh-partner-workspace-dialog > header {
2835
+ padding: max(14px, env(safe-area-inset-top)) 14px 13px;
2836
+ }
2837
+ .dsh-partner-workspace-dialog > header button { width: 44px; min-height: 44px; }
2838
+ .dsh-partner-workspace-dialog-body { padding: 16px 14px max(24px, env(safe-area-inset-bottom)); }
2839
+ .dsh-partner-workspace-dialog-body > :is(form, .dsh-partner-task-detail) > footer:last-child {
2840
+ bottom: calc(-1 * max(24px, env(safe-area-inset-bottom)));
2841
+ margin: 4px -14px calc(-1 * max(24px, env(safe-area-inset-bottom)));
2842
+ padding: 12px 14px max(12px, env(safe-area-inset-bottom));
2843
+ }
2844
+ }
2845
+
2846
+ @media (max-width: 420px) {
2847
+ .dsh-partner-topbar-brand small { display: none; }
2848
+ .dsh-partner-feature-page { padding-inline: 10px; }
2849
+ .dsh-partner-feature-block,
2850
+ .dsh-partner-capability-detail { padding: 12px; }
2851
+ .dsh-partner-board-statuses { grid-template-columns: repeat(2, minmax(0, 1fr)); }
2852
+ .dsh-partner-profile-meta { grid-template-columns: 1fr; }
2853
+ .dsh-partner-profile-meta > span { padding-left: 0; border-left: 0; }
2854
+ }
2855
+
2856
+ @media (max-width: 760px) and (max-height: 520px) and (orientation: landscape) {
2857
+ .dsh-partner-topbar { grid-template-columns: minmax(150px, .72fr) minmax(0, 1.28fr); align-items: center; flex-direction: row; gap: 8px; }
2858
+ .dsh-partner-mobile-controls { grid-template-columns: minmax(0, 1fr) minmax(190px, 1fr); }
2859
+ .dsh-partner-stage-scroll { padding-bottom: 20px; }
2860
+ .dsh-partner-workspace-dialog > header { padding-top: 10px; padding-bottom: 10px; }
2861
+ }
2862
+ `;
2863
+
2576
2864
  // src/client-api.ts
2577
2865
  var PARTNER_API = "/partner-local/v1";
2578
2866
  async function api(path = "", init = {}) {
@@ -3410,8 +3698,48 @@ function TaskBoardPanel() {
3410
3698
  const [loading, setLoading] = (0, import_react6.useState)(true);
3411
3699
  const [error, setError] = (0, import_react6.useState)();
3412
3700
  const [syncedAt, setSyncedAt] = (0, import_react6.useState)();
3413
- const selectedTask = board.tasks.find((item) => item.id === selectedTaskId);
3701
+ const [query, setQuery] = (0, import_react6.useState)("");
3702
+ const [statusFilter, setStatusFilter] = (0, import_react6.useState)("all");
3703
+ const [assigneeFilter, setAssigneeFilter] = (0, import_react6.useState)("all");
3704
+ const deferredQuery = (0, import_react6.useDeferredValue)(query.trim().toLocaleLowerCase());
3414
3705
  const tasksById = (0, import_react6.useMemo)(() => new Map(board.tasks.map((item) => [item.id, item])), [board.tasks]);
3706
+ const directoryById = (0, import_react6.useMemo)(() => new Map(directory.map((item) => [item.id, item])), [directory]);
3707
+ const activeDelegationByTaskId = (0, import_react6.useMemo)(() => {
3708
+ const result = /* @__PURE__ */ new Map();
3709
+ for (const delegation of delegations) {
3710
+ if ((delegation.status === "queued" || delegation.status === "running") && !result.has(delegation.taskId)) result.set(delegation.taskId, delegation);
3711
+ }
3712
+ return result;
3713
+ }, [delegations]);
3714
+ const selectedTask = selectedTaskId ? tasksById.get(selectedTaskId) : void 0;
3715
+ const dependentsById = (0, import_react6.useMemo)(() => {
3716
+ const result = /* @__PURE__ */ new Map();
3717
+ for (const task of board.tasks) for (const dependencyId of task.dependencyTaskIds) result.set(dependencyId, (result.get(dependencyId) ?? 0) + 1);
3718
+ return result;
3719
+ }, [board.tasks]);
3720
+ const scopedTasks = (0, import_react6.useMemo)(() => board.tasks.filter((task) => {
3721
+ if (assigneeFilter !== "all" && (task.assigneeCompanionId ?? "unassigned") !== assigneeFilter) return false;
3722
+ if (!deferredQuery) return true;
3723
+ const dependencies = task.dependencyTaskIds.map((id) => tasksById.get(id)?.title ?? "");
3724
+ return [task.title, task.description, task.resultAbstract, task.resultSummary, directoryById.get(task.assigneeCompanionId ?? "")?.name, ...dependencies].some((value) => value?.toLocaleLowerCase().includes(deferredQuery));
3725
+ }), [assigneeFilter, board.tasks, deferredQuery, directoryById, tasksById]);
3726
+ const statusCounts = (0, import_react6.useMemo)(() => {
3727
+ const result = new Map(COLUMNS.map((column) => [column.id, 0]));
3728
+ for (const task of scopedTasks) result.set(task.status, (result.get(task.status) ?? 0) + 1);
3729
+ return result;
3730
+ }, [scopedTasks]);
3731
+ const visibleColumns = statusFilter === "all" ? COLUMNS : COLUMNS.filter((column) => column.id === statusFilter);
3732
+ const tasksByStatus = (0, import_react6.useMemo)(() => {
3733
+ const priorityRank = { urgent: 3, high: 2, normal: 1, low: 0 };
3734
+ const result = new Map(COLUMNS.map((column) => [column.id, []]));
3735
+ for (const task of scopedTasks) {
3736
+ if (statusFilter !== "all" && task.status !== statusFilter) continue;
3737
+ result.get(task.status)?.push(task);
3738
+ }
3739
+ for (const tasks of result.values()) tasks.sort((left, right) => priorityRank[right.priority] - priorityRank[left.priority] || right.updatedAt - left.updatedAt);
3740
+ return result;
3741
+ }, [scopedTasks, statusFilter]);
3742
+ const visibleTaskCount = statusFilter === "all" ? scopedTasks.length : statusCounts.get(statusFilter) ?? 0;
3415
3743
  const loadingRef = (0, import_react6.useRef)(false);
3416
3744
  const load = (0, import_react6.useCallback)(async () => {
3417
3745
  if (loadingRef.current) return;
@@ -3540,7 +3868,7 @@ function TaskBoardPanel() {
3540
3868
  tasks: board.tasks,
3541
3869
  activities: board.activities.filter((item) => item.taskId === selectedTask.id),
3542
3870
  directory,
3543
- execution: delegations.find((item) => item.taskId === selectedTask.id && (item.status === "queued" || item.status === "running")),
3871
+ execution: activeDelegationByTaskId.get(selectedTask.id),
3544
3872
  busy: busy === selectedTask.id,
3545
3873
  update: (change) => {
3546
3874
  void update(selectedTask, change);
@@ -3563,50 +3891,99 @@ function TaskBoardPanel() {
3563
3891
  },
3564
3892
  selectedTask.id
3565
3893
  ) }),
3566
- loading ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(CollectionSkeleton, { rows: 6 }) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "dsh-partner-board", "aria-label": "\u4EFB\u52A1\u770B\u677F", children: COLUMNS.map((column) => {
3567
- const tasks = board.tasks.filter((item) => item.status === column.id);
3568
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("section", { "data-status": column.id, children: [
3569
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("header", { children: [
3570
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("strong", { children: column.label }),
3571
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("b", { children: tasks.length })
3894
+ loading ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(CollectionSkeleton, { rows: 6 }) : /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_jsx_runtime4.Fragment, { children: [
3895
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "dsh-partner-board-tools", children: [
3896
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("label", { className: "dsh-partner-board-search", children: [
3897
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "sr-only", children: "\u641C\u7D22\u4EFB\u52A1" }),
3898
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_dsh_client_ui_primitives3.IconSearchOutline16, { size: 16 }) }),
3899
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("input", { value: query, onChange: (event) => setQuery(event.target.value), placeholder: "\u641C\u7D22\u4EFB\u52A1\u3001\u8D1F\u8D23\u4EBA\u6216\u524D\u7F6E\u4EFB\u52A1" }),
3900
+ query && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("button", { type: "button", onClick: () => setQuery(""), "aria-label": "\u6E05\u9664\u4EFB\u52A1\u641C\u7D22", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_dsh_client_ui_primitives3.IconCloseOutline16, { size: 14 }) })
3572
3901
  ] }),
3573
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { children: tasks.map((task) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
3574
- TaskCard,
3575
- {
3576
- task,
3577
- tasksById,
3578
- directory,
3579
- execution: delegations.find((item) => item.taskId === task.id && (item.status === "queued" || item.status === "running")),
3580
- open: () => setSelectedTaskId(task.id)
3581
- },
3582
- task.id
3583
- )) }),
3584
- tasks.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { children: "\u6682\u65E0\u4EFB\u52A1" })
3585
- ] }, column.id);
3586
- }) })
3902
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("label", { className: "dsh-partner-board-assignee", children: [
3903
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "sr-only", children: "\u6309\u8D1F\u8D23\u4EBA\u7B5B\u9009" }),
3904
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("select", { value: assigneeFilter, onChange: (event) => setAssigneeFilter(event.target.value), children: [
3905
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("option", { value: "all", children: "\u5168\u90E8\u4F19\u4F34" }),
3906
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("option", { value: "unassigned", children: "\u672A\u6307\u6D3E" }),
3907
+ directory.map((item) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("option", { value: item.id, children: [
3908
+ "@",
3909
+ item.name
3910
+ ] }, item.id))
3911
+ ] })
3912
+ ] }),
3913
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("small", { "aria-live": "polite", children: [
3914
+ "\u663E\u793A ",
3915
+ visibleTaskCount,
3916
+ " / ",
3917
+ board.tasks.length
3918
+ ] })
3919
+ ] }),
3920
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("nav", { className: "dsh-partner-board-statuses", "aria-label": "\u6309\u4EFB\u52A1\u72B6\u6001\u7B5B\u9009", children: [
3921
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("button", { type: "button", className: statusFilter === "all" ? "is-active" : "", "aria-pressed": statusFilter === "all", onClick: () => setStatusFilter("all"), children: [
3922
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { children: "\u5168\u90E8" }),
3923
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("b", { children: scopedTasks.length })
3924
+ ] }),
3925
+ COLUMNS.map((column) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("button", { type: "button", className: statusFilter === column.id ? "is-active" : "", "aria-pressed": statusFilter === column.id, onClick: () => setStatusFilter(column.id), children: [
3926
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { children: column.label }),
3927
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("b", { children: statusCounts.get(column.id) ?? 0 })
3928
+ ] }, column.id))
3929
+ ] }),
3930
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "dsh-partner-board", "data-focused": statusFilter !== "all", "aria-label": "\u4EFB\u52A1\u770B\u677F", children: visibleColumns.map((column) => {
3931
+ const tasks = tasksByStatus.get(column.id) ?? [];
3932
+ const columnTitleId = `dsh-partner-board-${column.id}`;
3933
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("section", { "data-status": column.id, "data-empty": tasks.length === 0, "aria-labelledby": columnTitleId, children: [
3934
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("header", { children: [
3935
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("strong", { id: columnTitleId, children: column.label }),
3936
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("b", { children: tasks.length })
3937
+ ] }),
3938
+ tasks.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "dsh-partner-board-column-list", children: tasks.map((task) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
3939
+ TaskCard,
3940
+ {
3941
+ task,
3942
+ tasksById,
3943
+ directoryById,
3944
+ dependentCount: dependentsById.get(task.id) ?? 0,
3945
+ execution: activeDelegationByTaskId.get(task.id),
3946
+ open: () => setSelectedTaskId(task.id)
3947
+ },
3948
+ task.id
3949
+ )) }) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { children: query || assigneeFilter !== "all" ? "\u6CA1\u6709\u5339\u914D\u4EFB\u52A1" : "\u6682\u65E0\u4EFB\u52A1" })
3950
+ ] }, column.id);
3951
+ }) })
3952
+ ] })
3587
3953
  ] });
3588
3954
  }
3589
- function TaskCard({ task, tasksById, directory, execution, open }) {
3955
+ function TaskCard({ task, tasksById, directoryById, dependentCount, execution, open }) {
3590
3956
  const dependencies = task.dependencyTaskIds.map((id) => tasksById.get(id)).filter((item) => item !== void 0);
3591
3957
  const blockers = dependencies.filter((item) => item.status !== "done");
3592
- const assignee = directory.find((item) => item.id === task.assigneeCompanionId);
3958
+ const completedDependencies = dependencies.length - blockers.length;
3959
+ const assignee = directoryById.get(task.assigneeCompanionId ?? "");
3593
3960
  const executionState = execution ? delegationState(execution) : void 0;
3594
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("article", { className: "dsh-partner-task-card", "data-blocked": blockers.length > 0, children: [
3595
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: `dsh-partner-priority is-${task.priority}` }),
3596
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("button", { type: "button", className: "dsh-partner-task-summary", "aria-haspopup": "dialog", onClick: open, children: [
3597
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { children: [
3961
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("article", { className: "dsh-partner-task-card", "data-blocked": blockers.length > 0, "data-priority": task.priority, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("button", { type: "button", className: "dsh-partner-task-summary", "aria-haspopup": "dialog", onClick: open, children: [
3962
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { children: [
3963
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { className: "dsh-partner-task-card-title", children: [
3598
3964
  /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("strong", { title: task.title, children: task.title }),
3599
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("small", { children: [
3600
- assignee ? `@${assignee.name}` : "\u672A\u6307\u6D3E",
3601
- " \xB7 ",
3602
- dependencies.length ? `${dependencies.length} \u9879\u524D\u7F6E${blockers.length ? `\uFF0C${blockers.length} \u9879\u672A\u5B8C\u6210` : "\u5747\u5DF2\u5B8C\u6210"}` : "\u65E0\u524D\u7F6E\u4F9D\u8D56",
3603
- task.resultSummary ? " \xB7 \u5DF2\u6709\u7ED3\u679C" : "",
3604
- executionState ? ` \xB7 ${executionState.label}` : ""
3605
- ] })
3965
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("em", { children: priorityLabel(task.priority) })
3606
3966
  ] }),
3607
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_dsh_client_ui_primitives3.IconChevronRightOutline14, { size: 14 })
3608
- ] })
3609
- ] });
3967
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("small", { className: "dsh-partner-task-card-owner", children: [
3968
+ assignee ? `@${assignee.name}` : "\u672A\u6307\u6D3E",
3969
+ task.resultSummary ? " \xB7 \u5DF2\u6709\u7ED3\u679C" : "",
3970
+ executionState ? ` \xB7 ${executionState.label}` : ""
3971
+ ] }),
3972
+ (dependencies.length > 0 || dependentCount > 0) && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { className: "dsh-partner-task-relations", children: [
3973
+ dependencies.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("small", { "data-blocked": blockers.length > 0, children: [
3974
+ "\u524D\u7F6E ",
3975
+ completedDependencies,
3976
+ "/",
3977
+ dependencies.length
3978
+ ] }),
3979
+ dependentCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("small", { children: [
3980
+ "\u5B8C\u6210\u540E\u89E3\u9501 ",
3981
+ dependentCount
3982
+ ] })
3983
+ ] })
3984
+ ] }),
3985
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_dsh_client_ui_primitives3.IconChevronRightOutline14, { size: 14 })
3986
+ ] }) });
3610
3987
  }
3611
3988
  function TaskDetail({ task, tasks, activities, directory, execution, busy, update, delegate, review, accept, reject, remove }) {
3612
3989
  const [rejecting, setRejecting] = (0, import_react6.useState)(false);
@@ -4363,7 +4740,8 @@ var import_jsx_runtime9 = require("react/jsx-runtime");
4363
4740
  var PLUGIN_ID = "@lemoncat7/dsh-partner";
4364
4741
  var STYLE_ID = `${PLUGIN_ID}/client`;
4365
4742
  var cssText = `${client_default}
4366
- ${workspace_ui_default}`;
4743
+ ${workspace_ui_default}
4744
+ ${responsive_ui_default}`;
4367
4745
  var WORKSPACE_PAGES = /* @__PURE__ */ new Set(["skills", "board", "schedules"]);
4368
4746
  var inject = ["slots", "layout", "sessions"];
4369
4747
  function apply(ctx) {
@@ -4482,7 +4860,7 @@ function PartnerWorkspace({ controller }) {
4482
4860
  return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("main", { className: "dsh-partner-workspace", children: [
4483
4861
  creatingCompanion && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(CompanionCreateDialog, { close: () => setCreatingCompanion(false), create }),
4484
4862
  /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("header", { className: "dsh-partner-topbar", children: [
4485
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { children: [
4863
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "dsh-partner-topbar-brand", children: [
4486
4864
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("button", { type: "button", "data-xiaohei-workspace-close": true, onClick: controller.close, "aria-label": "\u8FD4\u56DE\u4F1A\u8BDD", title: "\u8FD4\u56DE\u4F1A\u8BDD", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_dsh_client_ui_primitives8.IconChevronLeftOutline14, { size: 15 }) }),
4487
4865
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_dsh_client_ui_primitives8.IconAgentPresetOutline16, { size: 18 }),
4488
4866
  /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { children: [
@@ -4490,20 +4868,17 @@ function PartnerWorkspace({ controller }) {
4490
4868
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("small", { children: "\u957F\u671F\u8EAB\u4EFD\u4E0E\u5FAE\u4FE1\u6E20\u9053" })
4491
4869
  ] })
4492
4870
  ] }),
4493
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("nav", { className: "dsh-partner-mobile-workspace-nav", "aria-label": "\u4F19\u4F34\u5DE5\u4F5C\u533A\u5FEB\u6377\u5165\u53E3", children: [
4494
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("button", { type: "button", className: view === "skills" ? "is-active" : "", "aria-label": "Skill \u5E02\u573A", onClick: () => setView("skills"), children: [
4495
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_dsh_client_ui_primitives8.IconBrowseOutline16, { size: 16 }),
4496
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { children: "Skill" })
4497
- ] }),
4498
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("button", { type: "button", className: view === "board" ? "is-active" : "", "aria-label": "\u4EFB\u52A1\u770B\u677F", onClick: () => setView("board"), children: [
4499
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_dsh_client_ui_primitives8.IconListPenOutline16, { size: 16 }),
4500
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { children: "\u770B\u677F" })
4501
- ] }),
4502
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("button", { type: "button", className: view === "schedules" ? "is-active" : "", "aria-label": "\u5B9A\u65F6\u4EFB\u52A1", onClick: () => setView("schedules"), children: [
4503
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_dsh_client_ui_primitives8.IconPlayOutline16, { size: 16 }),
4504
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { children: "\u5B9A\u65F6" })
4505
- ] })
4506
- ] })
4871
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
4872
+ MobileWorkspaceControls,
4873
+ {
4874
+ companions: snapshot?.companions ?? [],
4875
+ selectedId,
4876
+ view,
4877
+ openCompanion,
4878
+ openPage: setView,
4879
+ createCompanion: () => setCreatingCompanion(true)
4880
+ }
4881
+ )
4507
4882
  ] }),
4508
4883
  /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "dsh-partner-grid", children: [
4509
4884
  /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("aside", { className: "dsh-partner-roster", children: [
@@ -4585,6 +4960,38 @@ function PartnerWorkspace({ controller }) {
4585
4960
  ] })
4586
4961
  ] });
4587
4962
  }
4963
+ function MobileWorkspaceControls({ companions, selectedId, view, openCompanion, openPage, createCompanion }) {
4964
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "dsh-partner-mobile-controls", children: [
4965
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "dsh-partner-mobile-companion-row", children: [
4966
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("label", { className: "dsh-partner-mobile-companion-picker", children: [
4967
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "sr-only", children: "\u5F53\u524D\u4F19\u4F34" }),
4968
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("select", { value: selectedId ?? "", disabled: companions.length === 0, "aria-label": "\u5207\u6362\u5F53\u524D\u4F19\u4F34", onChange: (event) => openCompanion(event.target.value), children: [
4969
+ companions.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("option", { value: "", children: "\u8FD8\u6CA1\u6709\u4F19\u4F34" }),
4970
+ companions.map((companion) => /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("option", { value: companion.id, children: [
4971
+ companion.name,
4972
+ " \xB7 ",
4973
+ companion.role
4974
+ ] }, companion.id))
4975
+ ] })
4976
+ ] }),
4977
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("button", { type: "button", className: "dsh-partner-mobile-create", onClick: createCompanion, "aria-label": "\u65B0\u5EFA\u4F19\u4F34", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_dsh_client_ui_primitives8.IconPlusOutline16, { size: 17 }) })
4978
+ ] }),
4979
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("nav", { className: "dsh-partner-mobile-workspace-nav", "aria-label": "\u4F19\u4F34\u5DE5\u4F5C\u533A\u5FEB\u6377\u5165\u53E3", children: [
4980
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("button", { type: "button", className: view === "skills" ? "is-active" : "", "aria-pressed": view === "skills", onClick: () => openPage("skills"), children: [
4981
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_dsh_client_ui_primitives8.IconBrowseOutline16, { size: 16 }),
4982
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { children: "Skill" })
4983
+ ] }),
4984
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("button", { type: "button", className: view === "board" ? "is-active" : "", "aria-pressed": view === "board", onClick: () => openPage("board"), children: [
4985
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_dsh_client_ui_primitives8.IconListPenOutline16, { size: 16 }),
4986
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { children: "\u770B\u677F" })
4987
+ ] }),
4988
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("button", { type: "button", className: view === "schedules" ? "is-active" : "", "aria-pressed": view === "schedules", onClick: () => openPage("schedules"), children: [
4989
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_dsh_client_ui_primitives8.IconPlayOutline16, { size: 16 }),
4990
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { children: "\u5B9A\u65F6" })
4991
+ ] })
4992
+ ] })
4993
+ ] });
4994
+ }
4588
4995
  function HomePanel({ companion, snapshot, navigate, openSession, startSession, renewSession }) {
4589
4996
  const channel = snapshot.channels.find((item) => item.companionId === companion.id);
4590
4997
  const sessions2 = snapshot.sessions.filter((item) => item.companionId === companion.id);