@musnows/scriverse 0.4.2 → 0.4.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.
@@ -65,6 +65,9 @@
65
65
  }
66
66
 
67
67
  .auth-pending .app-shell { pointer-events: none; user-select: none; }
68
+ .dev-auth-bypass .auth-view { display: none !important; }
69
+ .dev-auth-bypass .auth-pending .app-shell { pointer-events: auto; user-select: auto; }
70
+ .dev-auth-bypass .auth-loading { display: none !important; }
68
71
  .auth-loading { display: none; }
69
72
  .auth-pending .auth-loading { position: fixed; inset: 0; z-index: 900; display: grid; place-items: center; pointer-events: none; }
70
73
  .auth-loading::before { content: ""; width: 32px; height: 32px; border: 3px solid color-mix(in srgb, var(--accent) 25%, transparent); border-top-color: var(--accent); border-radius: 50%; animation: auth-loading-spin .8s linear infinite; }
@@ -285,6 +288,45 @@ html, body { width: 100%; height: 100%; margin: 0; overflow: hidden; }
285
288
  button, input, textarea, select { font: inherit; color: inherit; }
286
289
  button { cursor: pointer; }
287
290
 
291
+ input[type="checkbox"] {
292
+ appearance: none;
293
+ -webkit-appearance: none;
294
+ display: inline-grid;
295
+ flex: 0 0 16px;
296
+ place-content: center;
297
+ width: 16px;
298
+ height: 16px;
299
+ min-width: 16px;
300
+ margin: 0;
301
+ border: 1px solid var(--line);
302
+ border-radius: 4px;
303
+ background: var(--surface);
304
+ cursor: pointer;
305
+ transition: border-color .15s ease, background-color .15s ease, box-shadow .15s ease;
306
+ }
307
+
308
+ input[type="checkbox"]::before {
309
+ content: "";
310
+ width: 8px;
311
+ height: 5px;
312
+ border: solid #fff;
313
+ border-width: 0 0 2px 2px;
314
+ transform: translateY(-1px) rotate(-45deg) scale(0);
315
+ transform-origin: center;
316
+ transition: transform .12s ease;
317
+ }
318
+
319
+ input[type="checkbox"]:hover:not(:disabled) { border-color: var(--accent); }
320
+ input[type="checkbox"]:checked { border-color: var(--accent); background: var(--accent); }
321
+ input[type="checkbox"]:checked::before { transform: translateY(-1px) rotate(-45deg) scale(1); }
322
+ input[type="checkbox"]:focus-visible {
323
+ outline: none;
324
+ border-color: var(--accent);
325
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 22%, transparent);
326
+ }
327
+ input[type="checkbox"]:disabled { cursor: not-allowed; opacity: .48; }
328
+ input[type="checkbox"][hidden] { display: none; }
329
+
288
330
  .app-shell {
289
331
  display: grid;
290
332
  grid-template-columns: var(--left-panel-width) minmax(480px, 1fr) var(--ai-panel-width);
@@ -303,7 +345,7 @@ button { cursor: pointer; }
303
345
  align-items: center;
304
346
  border-bottom: 1px solid var(--line);
305
347
  background: var(--panel);
306
- z-index: 5;
348
+ z-index: 20;
307
349
  }
308
350
 
309
351
  .brand-block { display: flex; align-items: center; gap: 11px; padding: 0 20px; border: 0; background: transparent; text-align: left; }
@@ -312,7 +354,26 @@ button { cursor: pointer; }
312
354
  .brand-block strong { font-size: 16px; letter-spacing: .16em; }
313
355
  .brand-block small { color: var(--muted); font-size: 10px; margin-top: 2px; }
314
356
  .work-meta { font-size: 13px; color: var(--muted); padding-left: 26px; }
315
- .top-actions { display: flex; justify-content: flex-end; gap: 10px; align-items: center; padding-right: 18px; }
357
+ .top-actions { position: relative; display: flex; justify-content: flex-end; gap: 10px; align-items: center; padding-right: 18px; }
358
+ .mobile-module-tab { display: none; }
359
+ .mobile-panel-backdrop { display: none; }
360
+ .presence-control { position: relative; }
361
+ .presence-button { display: flex; align-items: center; gap: 7px; min-height: 34px; padding: 0 11px; border: 1px solid var(--line); border-radius: 18px; background: transparent; color: var(--muted); font-size: 11px; }
362
+ .presence-button:hover, .presence-button:focus-visible, .presence-button[aria-expanded="true"] { border-color: var(--accent); background: var(--paper-deep); color: var(--accent-dark); outline: none; }
363
+ .presence-status-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--green); box-shadow: 0 0 0 3px color-mix(in srgb, var(--green) 16%, transparent); }
364
+ .presence-panel { position: absolute; top: calc(100% + 10px); right: 0; z-index: 12; width: min(340px, calc(100vw - 24px)); padding: 14px; border: 1px solid var(--line); border-radius: 6px; background: var(--paper); box-shadow: 0 14px 38px rgba(36, 30, 24, .16); }
365
+ .presence-panel > header { display: grid; gap: 3px; padding-bottom: 10px; border-bottom: 1px solid var(--line); }
366
+ .presence-panel > header strong { font-size: 12px; }
367
+ .presence-panel > header small { color: var(--muted); font-size: 10px; }
368
+ .presence-list { display: grid; gap: 5px; padding-top: 8px; }
369
+ .presence-person { display: grid; grid-template-columns: 30px minmax(0, 1fr) auto; align-items: center; gap: 9px; padding: 7px; border-radius: 4px; }
370
+ .presence-person.is-same-page { background: color-mix(in srgb, var(--accent) 8%, transparent); }
371
+ .presence-person .user-avatar { width: 30px; height: 30px; }
372
+ .presence-person-copy { min-width: 0; }
373
+ .presence-person-copy strong, .presence-person-copy small { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
374
+ .presence-person-copy strong { font-size: 11px; }
375
+ .presence-person-copy small { margin-top: 3px; color: var(--muted); font-size: 10px; }
376
+ .presence-same-page { color: var(--accent-dark); font-size: 9px; white-space: nowrap; }
316
377
  .theme-toggle, .settings-button, .topbar-icon-button {
317
378
  display: grid;
318
379
  flex: 0 0 34px;
@@ -450,7 +511,7 @@ body.is-panel-resizing { cursor: col-resize; user-select: none; }
450
511
 
451
512
  .shelf-view { display: flex; flex-direction: column; height: 100%; overflow-y: auto; padding: 48px clamp(32px, 7vw, 110px) 90px; }
452
513
  #shelf-view, #settings-hub-view { padding-bottom: 24px; }
453
- .shelf-header { display: flex; align-items: flex-end; justify-content: space-between; gap: 30px; max-width: 1400px; margin: 0 auto 38px; }
514
+ .shelf-header { display: flex; align-items: flex-end; justify-content: space-between; gap: 30px; width: 100%; max-width: 1400px; margin: 0 auto 38px; }
454
515
  .shelf-header h1 { margin: 0 0 10px; font-size: clamp(30px, 4vw, 52px); font-weight: 560; letter-spacing: -.04em; }
455
516
  .shelf-header p { margin: 0; color: var(--muted); }
456
517
  .settings-hub-header { align-items: center; }
@@ -816,7 +877,7 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
816
877
  .chapter-add-button { flex: none; }
817
878
  .volume-chapters { display: block; }
818
879
  .volume-node.is-collapsed .volume-chapters { display: none; }
819
- .chapter-node { display: grid; grid-template-columns: minmax(0, 1fr) max-content; gap: 8px; width: 100%; padding: 9px 0 9px 20px; border: 0; background: transparent; border-radius: 4px; text-align: left; font-size: 12px; }
880
+ .chapter-node { display: grid; grid-template-columns: minmax(0, 1fr) max-content; gap: 8px; width: calc(100% + 6px); padding: 9px 6px 9px 20px; border: 0; background: transparent; border-radius: 4px; text-align: left; font-size: 12px; }
820
881
  .chapter-node:hover, .chapter-node.active { background: var(--row-active); }
821
882
  .chapter-node.active { color: var(--accent-dark); font-weight: 700; }
822
883
  .chapter-node > span:first-child { min-width: 0; overflow-wrap: anywhere; line-height: 1.45; white-space: normal; }
@@ -896,9 +957,11 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
896
957
  .record-card p { color: var(--muted); font-size: 12px; line-height: 1.55; margin: 0; white-space: pre-wrap; }
897
958
  .record-card small { color: var(--accent); font-size: 9px; letter-spacing: .1em; text-transform: uppercase; }
898
959
  .settings-layout-toolbar, .module-layout-toolbar { display: flex; align-items: center; justify-content: flex-end; gap: 10px; margin-bottom: 0; }
899
- .settings-layout-hint, .module-layout-hint { color: var(--muted); font-size: 10px; }
960
+ .settings-layout-hint { color: var(--muted); font-size: 10px; }
900
961
  .settings-layout-toggle, .module-layout-toggle { display: inline-flex; border: 1px solid var(--line); border-radius: 4px; overflow: hidden; background: var(--surface); }
901
- .settings-layout-toggle button, .module-layout-toggle button { min-height: 34px; padding: 0 12px; border: 0; border-right: 1px solid var(--line); background: transparent; color: var(--muted); font-size: 11px; }
962
+ .settings-layout-toggle button { min-height: 34px; padding: 0 12px; border: 0; border-right: 1px solid var(--line); background: transparent; color: var(--muted); font-size: 11px; }
963
+ .module-layout-toggle button { display: inline-grid; place-items: center; width: 36px; min-height: 34px; padding: 0; border: 0; border-right: 1px solid var(--line); background: transparent; color: var(--muted); }
964
+ .module-layout-toggle svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.7; }
902
965
  .settings-layout-toggle button:last-child, .module-layout-toggle button:last-child { border-right: 0; }
903
966
  .settings-layout-toggle button:hover, .settings-layout-toggle button:focus-visible,
904
967
  .module-layout-toggle button:hover, .module-layout-toggle button:focus-visible { color: var(--ink); background: var(--paper-deep); }
@@ -908,10 +971,11 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
908
971
  .setting-row, .module-row { display: grid; grid-template-columns: minmax(108px, .2fr) minmax(120px, .24fr) minmax(0, 1fr) auto; gap: 10px 16px; align-items: center; min-height: 0; padding: 12px 16px; }
909
972
  .setting-row h3, .module-row h3 { margin: 0; font-size: 14px; line-height: 1.35; }
910
973
  .setting-row p, .module-row p, .module-row-preview { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
911
- .module-row-preview { margin: 0; color: var(--muted); font-size: 12px; line-height: 1.45; }
974
+ .module-row .module-row-preview { display: -webkit-box; max-height: 2.9em; margin: 0; overflow: hidden; color: var(--muted); font-size: 12px; line-height: 1.45; white-space: normal; -webkit-box-orient: vertical; -webkit-line-clamp: 2; }
912
975
  .module-row-path { display: block; margin-top: 2px; color: var(--accent); font-family: var(--font-latin), monospace; font-size: 11px; font-weight: 500; }
913
976
  .module-row-span { grid-column: 1 / -1; }
914
977
  .setting-row .card-actions, .module-row .card-actions { margin-top: 0; flex-wrap: wrap; justify-content: flex-end; }
978
+ .module-row .card-actions > .record-card-edit { position: static; }
915
979
  .character-card { cursor: pointer; }
916
980
  .character-card:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
917
981
  .character-audit-panel { display: flex; align-items: center; justify-content: space-between; gap: 18px; margin-bottom: 18px; padding: 15px 17px; border: 1px solid var(--line); background: var(--surface-soft); }
@@ -929,6 +993,7 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
929
993
  .character-duplicate-actions { flex-wrap: wrap; }
930
994
  .card-actions { display: flex; gap: 6px; margin-top: 15px; }
931
995
  .card-actions button { border: 1px solid var(--line); background: transparent; border-radius: 3px; font-size: 10px; padding: 5px 8px; }
996
+ .card-actions .record-card-edit { padding: 0; }
932
997
  .danger-button { border: 1px solid color-mix(in srgb, var(--accent) 52%, var(--line)); border-radius: 4px; background: transparent; color: var(--accent-dark); padding: 8px 13px; font-size: 12px; }
933
998
  .danger-button:hover, .danger-button:focus-visible { border-color: var(--accent); background: color-mix(in srgb, var(--accent) 9%, transparent); outline: none; }
934
999
  .card-actions .danger-button { border-color: color-mix(in srgb, var(--accent) 52%, var(--line)); color: var(--accent-dark); }
@@ -958,14 +1023,14 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
958
1023
  .race-settings .pill { display: inline-flex; align-items: center; gap: 5px; }
959
1024
  .race-settings .pill small { color: inherit; font-size: 8px; letter-spacing: 0; text-transform: none; opacity: .72; }
960
1025
  .race-settings .pill.inherited { border-style: dashed; }
961
- .entity-dialog-management, .entity-editor-management { display: grid; gap: 10px; padding: 14px; border: 1px solid color-mix(in srgb, var(--accent) 34%, var(--line)); border-radius: 5px; background: color-mix(in srgb, var(--accent) 4%, var(--surface)); }
962
- .entity-dialog-management > div:first-child, .entity-editor-management > div:first-child { display: grid; gap: 4px; }
963
- .entity-dialog-management strong, .entity-editor-management strong { color: var(--ink); font-size: 11px; }
964
- .entity-dialog-management small, .entity-editor-management small { color: var(--muted); font-size: 10px; line-height: 1.5; }
965
- .entity-dialog-management-actions, .entity-editor-management-actions { display: flex; flex-wrap: wrap; gap: 7px; }
966
- .entity-dialog-management-actions button, .entity-editor-management-actions button { min-height: 32px; }
1026
+ .entity-dialog-management { display: grid; gap: 10px; padding: 14px; border: 1px solid color-mix(in srgb, var(--accent) 34%, var(--line)); border-radius: 5px; background: color-mix(in srgb, var(--accent) 4%, var(--surface)); }
1027
+ .entity-dialog-management > div:first-child { display: grid; gap: 4px; }
1028
+ .entity-dialog-management strong { color: var(--ink); font-size: 11px; }
1029
+ .entity-dialog-management small { color: var(--muted); font-size: 10px; line-height: 1.5; }
1030
+ .entity-dialog-management-actions { display: flex; flex-wrap: wrap; gap: 7px; }
1031
+ .entity-dialog-management-actions button { min-height: 32px; }
967
1032
  .danger-confirm-field { display: grid !important; grid-template-columns: auto minmax(0, 1fr); align-items: start; gap: 9px !important; padding: 12px; border: 1px solid color-mix(in srgb, var(--accent) 42%, var(--line)); border-radius: 5px; background: color-mix(in srgb, var(--accent) 5%, var(--surface)); }
968
- .danger-confirm-field input { width: auto !important; margin-top: 3px; }
1033
+ .danger-confirm-field input { width: 16px !important; margin-top: 3px; }
969
1034
  .danger-confirm-field span { display: grid; gap: 4px; }
970
1035
  .danger-confirm-field strong { color: var(--ink); font-size: 11px; }
971
1036
  .danger-confirm-field small { color: var(--muted); font-size: 10px; line-height: 1.5; }
@@ -1027,7 +1092,7 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
1027
1092
  .config-section-header p { margin: 0; color: var(--muted); font-size: 11px; }
1028
1093
  .ai-agent-tools { display: grid; gap: 8px; }
1029
1094
  .ai-agent-tools label { display: grid; grid-template-columns: 18px minmax(0, 1fr); gap: 8px; align-items: start; color: var(--muted); font-size: 11px; line-height: 1.45; }
1030
- .ai-agent-tools input { width: auto; margin-top: 2px; }
1095
+ .ai-agent-tools input { width: 16px; margin-top: 2px; }
1031
1096
  .ai-agent-tools strong { color: var(--ink); font-size: 12px; font-weight: 600; }
1032
1097
  .ai-agent-tools small { display: block; margin-top: 2px; font-size: 10px; }
1033
1098
  .default-model-select { min-width: 260px; padding: 7px 9px; font-size: 11px; }
@@ -1504,6 +1569,7 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
1504
1569
  }
1505
1570
  .toast-confirmation strong { font-size: 12px; }
1506
1571
  .toast-confirmation p { margin: 0; color: var(--muted); font-size: 11px; line-height: 1.55; white-space: pre-line; }
1572
+ .toast-input { width: 100%; min-height: 34px; padding: 7px 9px; border: 1px solid var(--line); border-radius: 4px; background: var(--surface); color: var(--ink); font-size: 11px; }
1507
1573
  .toast-confirmation-actions { display: flex; justify-content: flex-end; gap: 7px; margin-top: 3px; }
1508
1574
  .toast-confirmation-actions button { min-height: 30px; padding: 6px 10px; }
1509
1575
  .chapter-type-menu { position: fixed; z-index: 80; width: 176px; padding: 10px; border: 1px solid var(--line); border-radius: 6px; background: var(--panel); box-shadow: 0 14px 38px rgba(49,42,32,.22); }
@@ -1522,6 +1588,7 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
1522
1588
  .dialog::backdrop { background: rgba(34,30,25,.42); backdrop-filter: blur(3px); }
1523
1589
  .dialog-header { display: flex; justify-content: space-between; align-items: flex-start; padding: 22px 24px 16px; border-bottom: 1px solid var(--line); }
1524
1590
  .dialog-header h2 { margin: 0; font-size: 23px; font-weight: 500; }
1591
+ .dialog-header-meta { margin: 7px 0 0; color: var(--muted); font-size: 10px; line-height: 1.5; }
1525
1592
  .dialog-close {
1526
1593
  display: grid;
1527
1594
  place-items: center;
@@ -1586,12 +1653,12 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
1586
1653
  .character-section-count { display: block; margin-top: 8px; color: var(--accent-dark); }
1587
1654
  .chip-picker { display: flex; flex-wrap: wrap; gap: 7px; max-height: 190px; overflow-y: auto; padding: 9px; border: 1px solid var(--line); border-radius: 4px; background: var(--surface-soft); }
1588
1655
  .dialog-fields .member-chip { position: relative; display: inline-flex !important; width: auto; cursor: pointer; }
1589
- .member-chip input { position: absolute; width: 1px !important; height: 1px; opacity: 0; }
1656
+ .member-chip input { position: absolute; width: 1px !important; min-width: 1px; height: 1px; opacity: 0; }
1590
1657
  .member-chip span { display: inline-flex; align-items: center; min-height: 30px; padding: 5px 10px; border: 1px solid var(--line); border-radius: 16px; background: var(--panel); color: var(--muted); font-size: 10px; transition: background .14s ease, border-color .14s ease, color .14s ease; }
1591
1658
  .member-chip input:checked + span { border-color: var(--accent); background: var(--accent); color: #fff; }
1592
1659
  .member-chip input:focus-visible + span { outline: 2px solid var(--accent); outline-offset: 2px; }
1593
1660
  .checkbox-field { display: flex !important; align-items: center; grid-template-columns: 18px 1fr; }
1594
- .checkbox-field input { width: auto; }
1661
+ .checkbox-field input { width: 16px; }
1595
1662
  .dialog-actions { display: flex; justify-content: flex-end; gap: 8px; padding: 14px 24px 20px; }
1596
1663
  .dialog-actions .reset-button { margin-right: auto; }
1597
1664
  .import-mode-dialog { width: min(560px, calc(100vw - 32px)); }
@@ -1618,6 +1685,14 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
1618
1685
  .import-mode-dialog .dialog-actions { flex-wrap: wrap; }
1619
1686
  }
1620
1687
  .entity-editor-open { overflow: hidden; }
1688
+ .preview-record-card { cursor: pointer; }
1689
+ .preview-record-card:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
1690
+ .entity-editor-mode-actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: 8px; }
1691
+ .entity-editor-mode-actions button { min-height: 36px; }
1692
+ .module-pagination { display: flex; align-items: center; justify-content: center; gap: 8px; padding: 12px 0 4px; }
1693
+ .module-pagination span { color: var(--muted); font-size: 10px; }
1694
+ .module-pagination button { min-width: 58px; min-height: 28px; padding: 5px 9px; border: 1px solid var(--line); border-radius: 4px; background: transparent; color: var(--muted); font-size: 10px; }
1695
+ .module-pagination button:disabled { cursor: default; opacity: .46; }
1621
1696
  .entity-editor-view { position: fixed; z-index: 700; inset: 0; overflow: hidden; background: var(--panel); color: var(--ink); }
1622
1697
  .entity-editor-view.hidden, .entity-editor-page.hidden { display: none; }
1623
1698
  .entity-editor-page { width: 100%; height: 100%; min-height: 0; }
@@ -1638,16 +1713,16 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
1638
1713
  .setting-editor-title-input:focus { border-color: var(--accent); box-shadow: none; }
1639
1714
  .setting-editor-header-fields { display: flex; align-items: center; justify-content: center; gap: 14px; min-width: 0; }
1640
1715
  .setting-editor-header-fields > label:not(.setting-editor-lock) { display: inline-flex; align-items: center; gap: 6px; color: var(--muted); font-size: 10px; white-space: nowrap; }
1641
- .setting-editor-header-fields select, .setting-editor-change-note input { min-width: 0; padding: 5px 8px; border: 1px solid var(--line); border-radius: 4px; background: var(--surface); color: var(--ink); font-size: 11px; }
1716
+ .setting-editor-header-fields select { min-width: 0; padding: 5px 8px; border: 1px solid var(--line); border-radius: 4px; background: var(--surface); color: var(--ink); font-size: 11px; }
1642
1717
  .setting-editor-lock { display: inline-flex; grid-template-columns: none; align-items: center; gap: 6px; padding: 0; border: 0; background: transparent; white-space: nowrap; }
1643
- .setting-editor-lock input { width: auto; margin: 0; }
1644
- .setting-editor-lock span { display: block; }
1645
- .setting-editor-lock b { color: var(--ink); font-size: 10px; }
1718
+ .setting-editor-lock input { width: 16px; margin: 0; }
1719
+ .setting-editor-lock span { display: inline-flex; align-items: center; min-height: 16px; line-height: 16px; }
1720
+ .setting-editor-lock b { display: block; color: var(--ink); font-size: 10px; line-height: 16px; }
1646
1721
  .setting-editor-lock small { display: none; }
1647
- .setting-editor-change-note { align-items: center; gap: 6px; }
1648
- .setting-editor-workspace { display: grid; grid-template-rows: auto minmax(0, 1fr); min-height: 0; overflow: hidden; }
1722
+ .setting-editor-workspace { display: grid; grid-template-rows: minmax(0, 1fr); min-height: 0; overflow: hidden; }
1649
1723
  .setting-editor-content { height: 100%; min-height: 0; padding: 16px clamp(16px, 2vw, 32px) 24px; overflow: hidden; }
1650
1724
  .setting-markdown-field { display: grid; grid-template-rows: minmax(0, 1fr); height: 100%; min-height: 0; }
1725
+ .entity-editor-page.is-read-only .vditor-ir pre.vditor-reset[contenteditable="false"], .entity-editor-page.is-read-only .vditor-wysiwyg pre.vditor-reset[contenteditable="false"], .entity-editor-page.is-read-only .vditor-sv[contenteditable="false"] { opacity: 1; cursor: default; }
1651
1726
  .setting-markdown-heading, .markdown-editor-field-heading { display: flex; align-items: baseline; justify-content: space-between; gap: 24px; color: var(--ink); font-size: 14px; }
1652
1727
  .setting-markdown-heading small, .markdown-editor-field-heading small { color: var(--muted); font-size: 10px; }
1653
1728
  .markdown-editor-field { display: grid; gap: 10px; min-width: 0; }
@@ -1657,6 +1732,7 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
1657
1732
  .vditor-editor-host.vditor:not(.vditor--dark) { --border-color: var(--line); --panel-background-color: var(--surface); --toolbar-background-color: var(--surface-soft); --toolbar-icon-color: var(--muted); --toolbar-icon-hover-color: var(--accent-dark); --textarea-background-color: var(--surface); --textarea-text-color: var(--ink); --heading-border-color: var(--line); --blockquote-color: var(--muted); }
1658
1733
  .vditor-editor-host.vditor--dark { --border-color: var(--line); --panel-background-color: var(--surface); --toolbar-background-color: var(--surface-soft); --toolbar-icon-color: var(--muted); --toolbar-icon-hover-color: var(--accent); --textarea-background-color: var(--surface); --textarea-text-color: var(--ink); --heading-border-color: var(--line); --blockquote-color: var(--muted); }
1659
1734
  .vditor-editor-host .vditor-toolbar { flex: 0 0 auto; }
1735
+ .vditor-editor-host .markdown-word-count { display: inline-flex; align-items: center; min-height: 28px; margin-left: auto; padding: 0 10px; color: var(--muted); font: 10px/1 var(--font-latin), var(--font-cjk), sans-serif; white-space: nowrap; }
1660
1736
  .vditor-editor-host .vditor-content { min-height: 0; }
1661
1737
  .vditor-editor-host .vditor-reset { color: var(--ink); font-family: var(--font-cjk), var(--font-latin), sans-serif; }
1662
1738
  .vditor-editor-host .vditor-ir, .vditor-editor-host .vditor-sv, .vditor-editor-host .vditor-wysiwyg { background: var(--surface); color: var(--ink); }
@@ -1918,6 +1994,234 @@ select:focus, input:focus, textarea:focus { border-color: #a77768; box-shadow: 0
1918
1994
  .account-settings-form .primary-button { width: 100%; }
1919
1995
  }
1920
1996
 
1997
+ /* 移动端工作台:仅在窄屏覆盖桌面三栏布局,保留桌面端原有尺寸与排列。 */
1998
+ @media (max-width: 850px) {
1999
+ :root { --mobile-gutter: 14px; }
2000
+
2001
+ html, body { min-width: 0; overflow-x: hidden; }
2002
+ body { -webkit-text-size-adjust: 100%; }
2003
+ button, select, input, textarea, [contenteditable="true"] { touch-action: manipulation; }
2004
+ button, .ghost-button, .primary-button, .danger-button, select { min-height: 40px; }
2005
+
2006
+ .app-shell {
2007
+ grid-template-columns: minmax(0, 1fr);
2008
+ grid-template-rows: auto auto minmax(0, 1fr);
2009
+ min-height: 100dvh;
2010
+ height: 100dvh;
2011
+ overflow-x: hidden;
2012
+ overflow-y: hidden;
2013
+ }
2014
+ .app-shell.shelf-mode {
2015
+ grid-template-rows: auto minmax(0, 1fr);
2016
+ min-height: 100dvh;
2017
+ }
2018
+ .topbar {
2019
+ grid-column: 1;
2020
+ grid-row: 1;
2021
+ grid-template-columns: minmax(0, 1fr) auto;
2022
+ grid-template-rows: 56px auto;
2023
+ min-width: 0;
2024
+ padding: 0 var(--mobile-gutter);
2025
+ }
2026
+ .app-shell.shelf-mode .topbar { grid-template-columns: minmax(0, 1fr) auto; }
2027
+ .brand-block { min-width: 0; padding: 0; }
2028
+ .app-shell:not(.shelf-mode):not(.left-panel-collapsed) .topbar .brand-block > div { visibility: hidden; }
2029
+ .brand-block .brand-mark { width: 30px; height: 30px; }
2030
+ .brand-block strong { font-size: 14px; }
2031
+ .brand-block small { display: none; }
2032
+ .mobile-module-tab { position: fixed; z-index: 32; top: 132px; right: 0; display: grid; width: 34px; height: 42px; padding: 0; place-items: center; border: 1px solid var(--line); border-right: 0; border-radius: 5px 0 0 5px; background: var(--surface-soft); color: var(--accent-dark); font-size: 10px; writing-mode: vertical-rl; }
2033
+ .mobile-panel-backdrop { position: fixed; z-index: 30; inset: 0; width: 100%; height: 100%; padding: 0; border: 0; background: rgba(20, 17, 14, .28); }
2034
+ .app-shell:not(.shelf-mode):not(.left-panel-collapsed) .mobile-panel-backdrop { display: block; }
2035
+ .work-meta {
2036
+ grid-column: 1 / -1;
2037
+ grid-row: 2;
2038
+ min-width: 0;
2039
+ padding: 8px 0 10px;
2040
+ border-top: 1px solid var(--line);
2041
+ overflow: hidden;
2042
+ text-overflow: ellipsis;
2043
+ white-space: nowrap;
2044
+ font-size: 11px;
2045
+ }
2046
+ .top-actions { gap: 5px; padding: 0; }
2047
+ .top-actions .save-state, .top-actions .presence-control { display: none; }
2048
+ .account-button { width: 34px; height: 34px; padding: 3px; }
2049
+ .account-button > span:last-child { display: none; }
2050
+ .account-button { width: 36px; min-width: 36px; height: 36px; padding: 3px; justify-content: center; border-radius: 50%; }
2051
+ .account-avatar { width: 28px; height: 28px; }
2052
+ .account-menu { top: 46px; right: 0; width: min(220px, calc(100vw - 28px)); }
2053
+ .topbar-icon-button, .theme-toggle, .settings-button { width: 36px; height: 36px; min-height: 0; }
2054
+ button.account-button { width: 36px; height: 36px; min-height: 0; }
2055
+
2056
+ .left-panel {
2057
+ position: fixed;
2058
+ z-index: 31;
2059
+ top: 0;
2060
+ bottom: 0;
2061
+ right: 0;
2062
+ width: min(300px, 84vw);
2063
+ grid-column: auto;
2064
+ grid-row: auto;
2065
+ min-width: 0;
2066
+ padding: 76px var(--mobile-gutter) 18px;
2067
+ border-left: 1px solid var(--line);
2068
+ border-bottom: 1px solid var(--line);
2069
+ box-shadow: -12px 0 36px rgba(36, 30, 24, .2);
2070
+ overflow-y: auto;
2071
+ transform: translateX(0);
2072
+ transition: transform .2s ease;
2073
+ }
2074
+ .app-shell.left-panel-collapsed .left-panel { padding: 76px var(--mobile-gutter) 18px; transform: translateX(100%); }
2075
+ .app-shell.left-panel-collapsed .left-panel > :not(.left-actions) { display: block; }
2076
+ .app-shell.left-panel-collapsed .left-panel > .module-nav { display: grid; }
2077
+ .left-panel > .panel-resize-handle { display: none; }
2078
+ .left-actions { margin: 0 0 8px; }
2079
+ .left-primary-actions { gap: 6px; }
2080
+ .left-primary-actions .file-button { display: none; }
2081
+ .left-primary-actions #left-panel-toggle { position: absolute; top: 14px; right: 14px; display: grid; place-items: center; width: 32px; height: 32px; font-size: 22px; }
2082
+ .module-nav { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 5px; margin: 0; padding: 0 0 8px; overflow: visible; }
2083
+ .module-nav > button {
2084
+ flex: 0 0 auto;
2085
+ min-height: 42px;
2086
+ padding: 8px 12px;
2087
+ white-space: nowrap;
2088
+ }
2089
+ .module-nav .nav-icon { width: 16px; height: 16px; }
2090
+ .module-nav .module-nav-secondary.hidden { display: none !important; }
2091
+ .panel-heading, #novel-tree { display: none; }
2092
+ .app-shell.left-panel-collapsed .left-panel { padding: 8px var(--mobile-gutter) 0; }
2093
+ .app-shell.left-panel-collapsed .left-actions { display: block; padding: 0; }
2094
+
2095
+ .main-panel {
2096
+ grid-column: 1;
2097
+ grid-row: 2;
2098
+ min-width: 0;
2099
+ min-height: 0;
2100
+ overflow: hidden;
2101
+ }
2102
+ .app-shell.shelf-mode .main-panel { grid-column: 1; grid-row: 2; min-height: 0; }
2103
+ .ai-panel {
2104
+ position: fixed;
2105
+ z-index: 25;
2106
+ right: 0;
2107
+ bottom: 0;
2108
+ left: 0;
2109
+ grid-column: 1;
2110
+ grid-row: 4;
2111
+ min-width: 0;
2112
+ height: min(72dvh, 620px);
2113
+ min-height: 0;
2114
+ padding: 12px var(--mobile-gutter) 18px;
2115
+ border-top: 1px solid var(--line);
2116
+ border-left: 0;
2117
+ box-shadow: 0 -14px 36px rgba(36, 30, 24, .14);
2118
+ transform: translateY(0);
2119
+ transition: transform .2s ease;
2120
+ }
2121
+ .app-shell.shelf-mode .ai-panel { display: none; }
2122
+ .ai-panel > .panel-resize-handle { display: none; }
2123
+ .app-shell.ai-panel-collapsed .ai-panel { height: 58px; padding-block: 8px; transform: translateY(0); }
2124
+ .app-shell.ai-panel-collapsed .ai-panel > :not(.ai-heading) { display: none; }
2125
+ .app-shell.ai-panel-collapsed .ai-heading { display: flex; justify-content: space-between; padding: 0; }
2126
+
2127
+ .shelf-view { height: auto; min-height: 100%; padding: 28px var(--mobile-gutter) 42px; }
2128
+ #shelf-view, #settings-hub-view { padding-bottom: 0; }
2129
+ #shelf-view .product-footer, #settings-hub-view .product-footer { margin-bottom: 0; padding-bottom: env(safe-area-inset-bottom); }
2130
+ .shelf-header, .module-header { align-items: stretch; flex-direction: column; gap: 14px; margin-bottom: 20px; }
2131
+ .shelf-header h1 { font-size: clamp(24px, 7.5vw, 32px); }
2132
+ .shelf-header .primary-button { align-self: flex-start; min-width: 150px; min-height: 40px; padding: 10px 18px; }
2133
+ .module-header-actions { width: 100%; }
2134
+ .book-shelf { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 20px 14px; }
2135
+ .book-info { padding-top: 10px; padding-right: 0; }
2136
+ .book-info strong { font-size: 14px; }
2137
+ .book-card-settings { opacity: 1; }
2138
+ .welcome-view { padding: 28px var(--mobile-gutter); }
2139
+ .welcome-view h1 { font-size: clamp(30px, 9vw, 44px); }
2140
+ .welcome-grid { grid-template-columns: 1fr; margin-top: 34px; }
2141
+
2142
+ .editor-toolbar { padding: 18px var(--mobile-gutter) 14px; }
2143
+ .editor-actions { position: fixed; z-index: 34; right: 0; bottom: 18px; left: auto; display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); width: min(300px, 84vw); max-width: none; gap: 6px; padding: 10px; border: 1px solid var(--line); border-right: 0; border-radius: 6px 0 0 6px; background: var(--panel); box-shadow: -12px 0 36px rgba(36, 30, 24, .2); transform: translateX(0); transition: transform .2s ease; }
2144
+ .app-shell.left-panel-collapsed .editor-actions { transform: translateX(100%); pointer-events: none; }
2145
+ .editor-actions .chapter-stats { grid-column: 1 / -1; }
2146
+ .editor-actions > button { min-width: 0; min-height: 36px; padding-inline: 8px; font-size: 11px; }
2147
+ .chapter-title { font-size: 23px; }
2148
+ .chapter-content { padding: 22px 16px 64px 12px; font-size: max(16px, var(--editor-font-size)); }
2149
+ .chapter-line-numbers { width: 32px; font-size: 11px; }
2150
+ .chapter-editor-frame { grid-template-columns: 32px minmax(0, 1fr); }
2151
+ .chapter-line-measure { left: 32px; }
2152
+ .chapter-insight { margin: 10px var(--mobile-gutter) 0; }
2153
+
2154
+ .module-view { padding: 26px var(--mobile-gutter) 46px; }
2155
+ .module-header { padding-bottom: 18px; }
2156
+ .module-header h1 { font-size: 29px; }
2157
+ .module-header-actions { justify-content: stretch; }
2158
+ .module-header-actions > * { flex: 1 1 auto; }
2159
+ .module-content { padding: 18px 0 56px; }
2160
+ .card-grid, .provider-card-grid { grid-template-columns: minmax(0, 1fr); }
2161
+ .record-card { padding: 15px; }
2162
+ .card-actions, .task-row-actions, .module-header-actions { gap: 8px; }
2163
+ .card-actions button, .task-row-actions button { flex: 1 1 auto; min-height: 38px; }
2164
+ .setting-row, .module-row { padding: 13px; }
2165
+ .settings-layout-toolbar, .module-layout-toolbar { align-items: stretch; flex-direction: column; }
2166
+ .settings-layout-toggle, .module-layout-toggle { width: 100%; }
2167
+ .settings-layout-toggle button { flex: 1; }
2168
+
2169
+ .dialog, .wide-dialog, .account-dialog {
2170
+ width: calc(100vw - 20px);
2171
+ max-width: calc(100vw - 20px);
2172
+ max-height: calc(100dvh - 20px);
2173
+ margin: auto;
2174
+ border-radius: 10px;
2175
+ }
2176
+ .dialog-header { padding: 14px 16px 12px; }
2177
+ .dialog-header h2 { font-size: 20px; }
2178
+ .dialog-fields, .appearance-grid, .access-dialog-body, .account-settings-body, .versions-list, .entity-history-list { padding-inline: 16px; }
2179
+ .dialog-actions { flex-wrap: wrap; padding: 12px 16px 16px; }
2180
+ .dialog-actions > button { flex: 1 1 120px; }
2181
+ .search-form { grid-template-columns: minmax(0, 1fr); }
2182
+ .search-form .primary-button { width: 100%; }
2183
+ .appearance-grid { grid-template-columns: minmax(0, 1fr); }
2184
+ .appearance-whitespace-field, .font-preview { grid-column: auto; }
2185
+ .access-row { grid-template-columns: minmax(0, 1fr); align-items: stretch; }
2186
+ .access-row select, .access-row button, .work-access-field .ghost-button { width: 100%; }
2187
+ .work-access-field { align-items: stretch; flex-direction: column; }
2188
+
2189
+ .entity-editor-view { min-width: 0; }
2190
+ .entity-editor-header, .character-editor-header { grid-template-columns: auto minmax(0, 1fr); gap: 8px; padding: 12px var(--mobile-gutter); }
2191
+ .entity-editor-mode-actions, .character-editor-header-actions { grid-column: 1 / -1; justify-content: stretch; flex-wrap: wrap; }
2192
+ .entity-editor-mode-actions > button, .character-editor-header-actions > button { flex: 1 1 auto; }
2193
+ .setting-editor-header { min-height: 0; }
2194
+ .setting-editor-content { padding: 12px; }
2195
+ .setting-markdown-field { height: 68dvh; }
2196
+ .character-editor-actions { padding: 12px var(--mobile-gutter) 16px; }
2197
+ .character-editor-actions > div { justify-content: stretch; flex-wrap: wrap; }
2198
+ .character-editor-actions > div > button { flex: 1 1 auto; }
2199
+ .character-markdown-editor { padding: 12px; }
2200
+ .character-markdown-editor-actions { justify-content: stretch; flex-wrap: wrap; }
2201
+ .character-markdown-editor-actions button { flex: 1 1 auto; }
2202
+
2203
+ .relationship-table-wrapper, .data-table-wrapper, .table-scroll, .module-table-wrapper { max-width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; }
2204
+ table { min-width: 620px; }
2205
+ }
2206
+
2207
+ @media (max-width: 480px) {
2208
+ .top-actions .settings-button { display: none; }
2209
+ .topbar-icon-button, .theme-toggle, .account-button { flex: 0 0 32px; width: 32px; min-width: 32px; height: 32px; }
2210
+ button.account-button { width: 32px; height: 32px; }
2211
+ .top-actions { gap: 3px; }
2212
+ .left-primary-actions .file-button { font-size: 10px; }
2213
+ .editor-actions { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); }
2214
+ .editor-actions .chapter-stats { display: none; }
2215
+ .editor-actions > button { width: auto; }
2216
+ .book-shelf { grid-template-columns: minmax(0, 1fr); max-width: 280px; }
2217
+ .book-add-card { min-height: 220px; }
2218
+ .onboarding-popover { width: calc(100vw - 20px); }
2219
+ }
2220
+
2221
+ @media (max-width: 850px) {
2222
+ #onboarding-menu-button { display: none; }
2223
+ }
2224
+
1921
2225
  @media (prefers-reduced-motion: reduce) {
1922
2226
  *, *::before, *::after { scroll-behavior: auto !important; animation-duration: .01ms !important; animation-iteration-count: 1 !important; transition-duration: .01ms !important; }
1923
2227
  }
package/dist/user-auth.js CHANGED
@@ -700,6 +700,8 @@ function workModuleRequirements(request, write) {
700
700
  return write ? { ownerOnly: true } : {};
701
701
  if (/^\/api\/works\/[^/]+\/members(?:\/[^/]+)?$/u.test(pathname))
702
702
  return { ownerOnly: true };
703
+ if (/^\/api\/works\/[^/]+\/presence$/u.test(pathname))
704
+ return {};
703
705
  if (/^\/api\/works\/[^/]+\/audit-logs$/u.test(pathname))
704
706
  return { ownerOnly: true };
705
707
  if (/^\/api\/works\/[^/]+\/models$/u.test(pathname))