@korso/shepherd-ui 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/README.md +47 -47
  2. package/dist/ShepherdRoot.js +15 -57
  3. package/dist/components/Dashboard.d.ts +16 -2
  4. package/dist/components/Dashboard.js +76 -5
  5. package/dist/config/EmptyState.js +5 -1
  6. package/dist/lib/{Dashboard-CG6KeFQ3.js → Dashboard-B7nioe5N.js} +529 -457
  7. package/dist/lib/index.d.ts +15 -1
  8. package/dist/lib/index.js +196 -279
  9. package/dist/lib/selfhost.js +1 -1
  10. package/dist/lib/styles.css +217 -209
  11. package/dist/selfhost/assets/index-D6rTsbVM.js +40 -0
  12. package/dist/selfhost/assets/{index-BZmImfYZ.css → index-DnhlP_lc.css} +1 -1
  13. package/dist/selfhost/index.html +13 -13
  14. package/dist/useLandscapePolling.d.ts +7 -0
  15. package/dist/useLandscapePolling.js +6 -1
  16. package/package.json +67 -67
  17. package/dist/ShepherdProvider.d.ts +0 -12
  18. package/dist/ShepherdProvider.js +0 -33
  19. package/dist/ShepherdProvider.test.d.ts +0 -1
  20. package/dist/ShepherdProvider.test.js +0 -47
  21. package/dist/ShepherdRoot.routing.test.d.ts +0 -1
  22. package/dist/ShepherdRoot.routing.test.js +0 -61
  23. package/dist/ShepherdRoot.test.d.ts +0 -1
  24. package/dist/ShepherdRoot.test.js +0 -37
  25. package/dist/app/assets/index-CDOCIg6s.js +0 -11
  26. package/dist/app/index.html +0 -12
  27. package/dist/client.test.d.ts +0 -1
  28. package/dist/client.test.js +0 -298
  29. package/dist/config/ConnectAgent.test.d.ts +0 -1
  30. package/dist/config/ConnectAgent.test.js +0 -92
  31. package/dist/config/EmptyState.test.d.ts +0 -1
  32. package/dist/config/EmptyState.test.js +0 -32
  33. package/dist/config/Members.test.d.ts +0 -1
  34. package/dist/config/Members.test.js +0 -66
  35. package/dist/config/Workspaces.test.d.ts +0 -1
  36. package/dist/config/Workspaces.test.js +0 -90
  37. package/dist/index.cjs +0 -5289
  38. package/dist/index.cjs.map +0 -1
  39. package/dist/index.d.cts +0 -149
  40. package/dist/index.js.map +0 -1
  41. package/dist/selfhost/assets/index-CS268KSw.js +0 -40
  42. package/dist/test/setup.d.ts +0 -1
  43. package/dist/test/setup.js +0 -2
  44. package/dist/views/Chat.d.ts +0 -5
  45. package/dist/views/Chat.js +0 -60
  46. package/dist/views/Chat.test.d.ts +0 -1
  47. package/dist/views/Chat.test.js +0 -92
  48. package/dist/views/Config.d.ts +0 -12
  49. package/dist/views/Config.js +0 -6
  50. package/dist/views/Tasks.d.ts +0 -5
  51. package/dist/views/Tasks.js +0 -75
  52. package/dist/views/Tasks.test.d.ts +0 -1
  53. package/dist/views/Tasks.test.js +0 -115
  54. package/dist/views/useLandscape.d.ts +0 -14
  55. package/dist/views/useLandscape.js +0 -74
  56. package/dist/views/useLandscape.test.d.ts +0 -1
  57. package/dist/views/useLandscape.test.js +0 -101
  58. package/dist/views/wallboard.d.ts +0 -46
  59. package/dist/views/wallboard.js +0 -209
  60. package/dist/views/wallboard.test.d.ts +0 -1
  61. package/dist/views/wallboard.test.js +0 -143
@@ -1,6 +1,6 @@
1
1
  import { jsx as e, jsxs as l } from "react/jsx-runtime";
2
2
  import { useState as s, useMemo as h } from "react";
3
- import { c as d, a as m, D as u } from "./Dashboard-CG6KeFQ3.js";
3
+ import { c as d, a as m, D as u } from "./Dashboard-B7nioe5N.js";
4
4
  const i = "shepherd.token";
5
5
  function p() {
6
6
  try {
@@ -1,209 +1,217 @@
1
- :root {
2
- --bg:#ece0c6; --ink:#322c20; --ink2:#6f6450; --ink3:#9c917a;
3
- --line:#d7c9ac; --line2:#e0d4b9; --live:#3d8b58; --drop:#bd4f3a;
4
- --chip:#e3d6ba; --terr:#7a6a48; --card:#f5ecd9;
5
- }
6
- * { box-sizing:border-box; }
7
- html,body { height:100%; }
8
- body {
9
- margin:0; background:var(--bg); color:var(--ink);
10
- font:14px/1.45 'Inter', ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
11
- -webkit-font-smoothing:antialiased;
12
- }
13
- .wrap { max-width:1100px; margin:0 auto; padding:40px 44px; }
14
-
15
- header { display:flex; align-items:center; gap:12px; padding-bottom:18px; border-bottom:1px solid var(--line); }
16
- /* Chat view: the card supplies its own border, so the header rule is redundant. */
17
- #board:has(#panel-chat:not([hidden])) header { border-bottom:0; }
18
- .brand { font-size:17px; font-weight:600; }
19
- .vitals { color:var(--ink3); font-size:12.5px; }
20
- .grow { flex:1; }
21
- .status { font-size:12px; color:var(--ink3); }
22
- .status--ok { color:var(--live); }
23
- .status--warn { color:var(--terr); }
24
- .status--error { color:var(--drop); }
25
- .freshness { font-size:12px; color:var(--ink3); }
26
-
27
- /* Repo selector (hidden when <2 repos; populated by app.js) */
28
- .repo { position:relative; }
29
- .repo-trig { display:inline-flex; align-items:center; gap:6px; font-size:13px;
30
- font-family:inherit; color:var(--ink); appearance:none;
31
- border:1px solid var(--line); border-radius:8px; padding:4px 10px;
32
- background:rgba(255,250,238,.4); cursor:pointer; }
33
- .repo-trig .slash { color:var(--ink3); }
34
- .repo-menu { position:absolute; top:36px; left:0; min-width:200px; background:var(--card);
35
- border:1px solid var(--line); border-radius:10px; padding:5px;
36
- box-shadow:0 8px 24px rgba(50,40,20,.14); z-index:5; }
37
- .repo-mi { display:flex; justify-content:space-between; gap:14px; padding:7px 9px;
38
- width:100%; text-align:left; border:0; appearance:none; font-family:inherit; color:inherit;
39
- background:transparent; border-radius:7px; font-size:13px; cursor:pointer; }
40
- .repo-mi:hover { background:var(--chip); }
41
- .repo-mi.on { background:var(--chip); font-weight:600; }
42
- .repo-mi .ct { font-size:11px; color:var(--ink3); }
43
- .repo-mi.all { border-top:1px solid var(--line2); margin-top:4px; padding-top:9px; color:var(--ink2); }
44
-
45
- /* Tabs */
46
- .tabs { display:flex; gap:4px; margin-left:auto; }
47
- .tab { font-size:13px; color:var(--ink2); padding:5px 11px; border:0; border-radius:7px;
48
- background:transparent; cursor:pointer; font:inherit; }
49
- .tab--active { background:var(--ink); color:var(--bg); }
50
-
51
- /* Crew strip */
52
- .crew { display:flex; align-items:center; gap:8px; flex-wrap:wrap; margin:26px 0 32px; }
53
- .person { display:inline-flex; align-items:center; gap:9px; padding:5px 13px 5px 5px;
54
- border:1px solid var(--line); border-radius:999px; background:var(--card); font-size:13px; }
55
- .person--idle { opacity:.55; }
56
- .avatar { width:24px; height:24px; border-radius:50%; display:grid; place-items:center;
57
- font-size:10px; font-weight:700; color:#fff; flex:none; }
58
- .person__name { font-weight:600; }
59
- .person__doing { color:var(--ink3); font-size:12px; }
60
-
61
- /* Board */
62
- .board { display:grid; grid-template-columns:1fr 1px 1fr; gap:0; }
63
- .board__rule { background:var(--line); }
64
- .col { padding:0 36px; } .col:first-child { padding-left:0; } .col:last-child { padding-right:0; }
65
- .colhead { display:flex; align-items:center; gap:8px; margin-bottom:6px; }
66
- .colhead h2 { font-size:12px; font-weight:600; letter-spacing:.03em; margin:0;
67
- text-transform:uppercase; color:var(--ink2); }
68
- .colhead .n { font-size:11px; color:var(--ink3); background:var(--chip);
69
- border-radius:999px; padding:1px 8px; }
70
-
71
- .task { padding:16px 0; border-bottom:1px solid var(--line2); }
72
- .task__r1 { display:flex; align-items:center; gap:8px; }
73
- .task__who { font-size:13.5px; font-weight:600; }
74
- .task__tag { font-size:11px; color:var(--ink3); }
75
- .task__repo { font-size:11px; color:var(--terr); background:rgba(122,106,72,.1);
76
- border-radius:4px; padding:0 6px; }
77
- .task__stat { margin-left:auto; font-size:11px; font-weight:500; color:var(--ink3); }
78
- .task__stat--drop { color:var(--drop); }
79
- .livedot { width:7px; height:7px; border-radius:50%; background:var(--live); margin-left:auto; }
80
- .task__intent { font-size:13.5px; margin:5px 0 0; line-height:1.45; }
81
- .terr { margin-top:8px; display:flex; flex-wrap:wrap; gap:6px; align-items:center; }
82
- .terr__lbl { font-size:9.5px; text-transform:uppercase; letter-spacing:.05em; color:var(--ink3); }
83
- .glob { font-family:ui-monospace, Menlo, monospace; font-size:11px; color:var(--terr);
84
- background:rgba(122,106,72,.12); border:1px solid rgba(122,106,72,.22);
85
- border-radius:5px; padding:1px 7px; }
86
- .task__meta { font-size:11.5px; color:var(--ink3); margin-top:6px; }
87
- /* expandable territory (2+ paths collapse to a one-line "N paths" toggle) */
88
- .terrx { margin-top:8px; }
89
- .terrx summary { list-style:none; cursor:pointer; display:flex; align-items:center;
90
- gap:6px; flex-wrap:wrap; user-select:none; }
91
- .terrx summary::-webkit-details-marker { display:none; }
92
- .terrx .terr--full { margin-top:8px; }
93
- .glob--more { cursor:pointer; color:var(--ink2); background:var(--chip);
94
- border:1px solid var(--line); }
95
- .glob--more .tw { color:var(--ink3); display:inline-block; transition:transform .15s; }
96
- .terrx[open] summary .glob--more .tw { transform:rotate(90deg); }
97
- /* grouped agent box: header + claims rail + collapsible "narrower" fold */
98
- .grp { padding:16px 0; border-bottom:1px solid var(--line2); }
99
- .grp__head { display:flex; align-items:center; gap:8px; }
100
- .grp__who { font-size:13.5px; font-weight:600; }
101
- .grp__tag { font-size:11px; color:var(--ink3); }
102
- .grp__count { font-size:11px; color:var(--ink3); }
103
- .grp__dot { width:7px; height:7px; border-radius:50%; background:var(--live); margin-left:auto; }
104
- .claims { margin:10px 0 0 6px; padding-left:14px; border-left:1px solid var(--line); }
105
- .claim { padding:6px 0; }
106
- .claim + .claim { border-top:1px solid var(--line2); margin-top:6px; }
107
- .fold { margin-top:10px; }
108
- .fold summary { list-style:none; cursor:pointer; font-size:12px; color:var(--ink2);
109
- display:inline-flex; align-items:center; gap:6px; user-select:none; }
110
- .fold summary::-webkit-details-marker { display:none; }
111
- .fold summary .tw { display:inline-block; color:var(--ink3); transition:transform .15s; }
112
- .fold[open] summary .tw { transform:rotate(90deg); }
113
- .fold__body { margin:8px 0 0 6px; padding-left:14px; border-left:1px dashed var(--line); }
114
- .covered { font-size:10.5px; color:var(--ink3); font-style:italic; margin-top:4px; }
115
- .day { font-size:11px; color:var(--ink3); padding:18px 0 2px; font-weight:600; }
116
- .more { margin-top:20px; font-size:12.5px; color:var(--ink2); padding:7px 13px;
117
- border:1px solid var(--line); border-radius:8px; background:rgba(255,250,238,.35);
118
- cursor:pointer; }
119
- .empty { color:var(--ink3); font-style:italic; padding:14px 0; }
120
-
121
- /* Chat (re-themed; structure unchanged) */
122
- .chat-wrap { background:var(--card); border:1px solid var(--line); border-radius:12px;
123
- display:flex; flex-direction:column; overflow:hidden; height:calc(100vh - 150px); min-height:320px; }
124
- .chat { flex:1; overflow-y:auto; padding:16px; }
125
- .chat { scrollbar-width:thin; scrollbar-color:var(--line) transparent; }
126
- .chat::-webkit-scrollbar { width:10px; }
127
- .chat::-webkit-scrollbar-track { background:transparent; }
128
- .chat::-webkit-scrollbar-thumb { background:var(--line); border-radius:999px;
129
- border:3px solid var(--card); background-clip:padding-box; }
130
- .chat::-webkit-scrollbar-thumb:hover { background:var(--ink3); background-clip:padding-box; }
131
- .chat__note { padding:9px 16px; font-size:11.5px; color:var(--ink3); }
132
- .msg { display:flex; gap:11px; padding:9px 0; }
133
- .msg__avatar { flex:none; width:32px; height:32px; border-radius:50%; display:grid;
134
- place-items:center; font-size:12px; font-weight:700; color:#fff; }
135
- .msg__body { min-width:0; flex:1; }
136
- .msg__head { display:flex; align-items:baseline; gap:8px; flex-wrap:wrap; }
137
- .msg__who { font-weight:600; }
138
- .msg__human { font-size:12px; color:var(--ink3); }
139
- .msg__to { font-size:11.5px; color:var(--terr); }
140
- .msg__time { font-size:11.5px; color:var(--ink3); margin-left:auto; }
141
- .msg__text { margin-top:3px; padding:8px 12px; border-radius:4px 12px 12px 12px;
142
- background:var(--chip); white-space:pre-wrap; word-break:break-word; }
143
- .msg--targeted .msg__text { box-shadow:inset 3px 0 0 var(--terr); }
144
-
145
- /* Operator's own messages — same group-chat structure, mirrored to the right. */
146
- .msg--me { flex-direction:row-reverse; }
147
- .msg--me .msg__head { flex-direction:row-reverse; }
148
- .msg--me .msg__time { margin-left:0; margin-right:auto; }
149
- .msg--me .msg__body { display:flex; flex-direction:column; align-items:flex-end; }
150
- .msg--me .msg__text { border-radius:12px 4px 12px 12px; background:#d4e7d2; }
151
- .msg--me.msg--targeted .msg__text { box-shadow:inset -3px 0 0 var(--terr); }
152
-
153
- /* Composer */
154
- .composer { position:relative; border-top:1px solid var(--line); padding:10px 12px; }
155
- .chat-form { display:flex; gap:8px; }
156
- .chat-input { flex:1; padding:9px 12px; border-radius:8px; border:1px solid var(--line);
157
- background:var(--bg); color:var(--ink); font:inherit; }
158
- .chat-input:focus { outline:none; border-color:var(--terr); }
159
- .chat-send { padding:9px 16px; border-radius:8px; border:1px solid var(--ink);
160
- background:var(--ink); color:var(--bg); font-weight:600; cursor:pointer; font:inherit; }
161
- .chat-send:disabled { opacity:.5; cursor:default; }
162
-
163
- /* @-mention autocomplete — floats above the input */
164
- .mention-pop { position:absolute; left:12px; right:12px; bottom:56px; z-index:6;
165
- background:var(--card); border:1px solid var(--line); border-radius:10px; padding:5px;
166
- box-shadow:0 8px 24px rgba(50,40,20,.16); max-height:200px; overflow-y:auto; }
167
- .mention-mi { display:flex; align-items:center; gap:9px; width:100%; text-align:left;
168
- border:0; appearance:none; font-family:inherit; color:inherit; background:transparent;
169
- border-radius:7px; padding:6px 8px; font-size:13px; cursor:pointer; }
170
- .mention-mi:hover, .mention-mi.on { background:var(--chip); }
171
- .mention-mi .ma { width:22px; height:22px; border-radius:50%; display:grid; place-items:center;
172
- font-size:9px; font-weight:700; color:#fff; flex:none; }
173
-
174
- /* Token gate */
175
- .gate { max-width:420px; margin:12vh auto 0; text-align:center; }
176
- .gate h1 { font-size:19px; margin:0 0 6px; }
177
- .gate p { color:var(--ink2); margin:0 0 20px; }
178
- .gate form { display:flex; gap:8px; }
179
- .gate input { flex:1; padding:10px 12px; border-radius:8px; border:1px solid var(--line);
180
- background:var(--card); color:var(--ink); }
181
- .gate button { padding:10px 16px; border-radius:8px; border:1px solid var(--ink);
182
- background:var(--ink); color:var(--bg); font-weight:600; cursor:pointer; }
183
-
184
- /* --- Multi-workspace hosted shell + config surface (functional, not polished;
185
- a dedicated styling sub-project refines this). Reuses the board's tokens. --- */
186
- .shepherd-root { max-width:1100px; margin:0 auto; padding:40px 44px; }
187
- .shepherd-root > main { padding-top:18px; }
188
- .shepherd-config { display:flex; flex-direction:column; gap:24px; }
189
- .shepherd-config h2 { font-size:16px; margin:0 0 4px; }
190
- .shepherd-workspaces, .shepherd-members, .shepherd-connect-agent {
191
- display:flex; flex-direction:column; gap:10px;
192
- padding:16px; border:1px solid var(--line); border-radius:10px; background:var(--card); }
193
- .shepherd-workspaces .switcher { display:flex; flex-wrap:wrap; gap:8px; }
194
- .shepherd-workspaces .role { color:var(--ink3); font-size:12px; }
195
- .shepherd-workspaces .admin, .shepherd-workspaces .invites { display:flex; flex-wrap:wrap; gap:8px; align-items:center; }
196
- .shepherd-config input, .shepherd-config select {
197
- padding:8px 10px; border-radius:8px; border:1px solid var(--line);
198
- background:var(--bg); color:var(--ink); }
199
- .shepherd-config button {
200
- padding:8px 14px; border-radius:8px; border:1px solid var(--ink);
201
- background:var(--ink); color:var(--bg); font-weight:600; cursor:pointer; }
202
- .shepherd-config button:disabled { opacity:.55; cursor:default; }
203
- .shepherd-config .invite-result, .shepherd-connect-agent .token-once {
204
- font-family:ui-monospace, SFMono-Regular, Menlo, monospace; font-size:12px;
205
- word-break:break-all; padding:8px 10px; border-radius:8px;
206
- background:var(--chip); border:1px solid var(--line2); }
207
- .shepherd-config .revoked { color:var(--ink3); text-decoration:line-through; }
208
- .shepherd-empty-state { text-align:center; color:var(--ink2); padding:48px 24px; }
209
- .shepherd-empty-state button { margin-top:14px; }
1
+ :root {
2
+ --bg:#ece0c6; --ink:#322c20; --ink2:#6f6450; --ink3:#9c917a;
3
+ --line:#d7c9ac; --line2:#e0d4b9; --live:#3d8b58; --drop:#bd4f3a;
4
+ --chip:#e3d6ba; --terr:#7a6a48; --card:#f5ecd9;
5
+ }
6
+ * { box-sizing:border-box; }
7
+ html,body { height:100%; }
8
+ body {
9
+ margin:0; background:var(--bg); color:var(--ink);
10
+ font:14px/1.45 'Inter', ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
11
+ -webkit-font-smoothing:antialiased;
12
+ }
13
+ .wrap { max-width:1100px; margin:0 auto; padding:40px 44px; }
14
+
15
+ header { display:flex; align-items:center; gap:12px; padding-bottom:18px; border-bottom:1px solid var(--line); }
16
+ /* Chat view: the card supplies its own border, so the header rule is redundant. */
17
+ #board:has(#panel-chat:not([hidden])) header { border-bottom:0; }
18
+ .brand { font-size:17px; font-weight:600; }
19
+ .vitals { color:var(--ink3); font-size:12.5px; }
20
+ .grow { flex:1; }
21
+ .status { font-size:12px; color:var(--ink3); }
22
+ .status--ok { color:var(--live); }
23
+ .status--warn { color:var(--terr); }
24
+ .status--error { color:var(--drop); }
25
+ .freshness { font-size:12px; color:var(--ink3); }
26
+
27
+ /* Repo selector (hidden when <2 repos; populated by app.js) */
28
+ .repo { position:relative; }
29
+ .repo-trig { display:inline-flex; align-items:center; gap:6px; font-size:13px;
30
+ font-family:inherit; color:var(--ink); appearance:none;
31
+ border:1px solid var(--line); border-radius:8px; padding:4px 10px;
32
+ background:rgba(255,250,238,.4); cursor:pointer; }
33
+ .repo-trig .slash { color:var(--ink3); }
34
+ .repo-menu { position:absolute; top:36px; left:0; min-width:200px; background:var(--card);
35
+ border:1px solid var(--line); border-radius:10px; padding:5px;
36
+ box-shadow:0 8px 24px rgba(50,40,20,.14); z-index:5; }
37
+ .repo-mi { display:flex; justify-content:space-between; gap:14px; padding:7px 9px;
38
+ width:100%; text-align:left; border:0; appearance:none; font-family:inherit; color:inherit;
39
+ background:transparent; border-radius:7px; font-size:13px; cursor:pointer; }
40
+ .repo-mi:hover { background:var(--chip); }
41
+ .repo-mi.on { background:var(--chip); font-weight:600; }
42
+ .repo-mi .ct { font-size:11px; color:var(--ink3); }
43
+ .repo-mi.all { border-top:1px solid var(--line2); margin-top:4px; padding-top:9px; color:var(--ink2); }
44
+
45
+ /* Tabs */
46
+ .tabs { display:flex; gap:4px; margin-left:auto; }
47
+ .tab { font-size:13px; color:var(--ink2); padding:5px 11px; border:0; border-radius:7px;
48
+ background:transparent; cursor:pointer; font:inherit; }
49
+ .tab--active { background:var(--ink); color:var(--bg); }
50
+
51
+ /* Crew strip */
52
+ .crew { display:flex; align-items:center; gap:8px; flex-wrap:wrap; margin:26px 0 32px; }
53
+ .person { display:inline-flex; align-items:center; gap:9px; padding:5px 13px 5px 5px;
54
+ border:1px solid var(--line); border-radius:999px; background:var(--card); font-size:13px; }
55
+ .person--idle { opacity:.55; }
56
+ .avatar { width:24px; height:24px; border-radius:50%; display:grid; place-items:center;
57
+ font-size:10px; font-weight:700; color:#fff; flex:none; }
58
+ .person__name { font-weight:600; }
59
+ .person__doing { color:var(--ink3); font-size:12px; }
60
+
61
+ /* Board */
62
+ .board { display:grid; grid-template-columns:1fr 1px 1fr; gap:0; }
63
+ .board__rule { background:var(--line); }
64
+ .col { padding:0 36px; } .col:first-child { padding-left:0; } .col:last-child { padding-right:0; }
65
+ .colhead { display:flex; align-items:center; gap:8px; margin-bottom:6px; }
66
+ .colhead h2 { font-size:12px; font-weight:600; letter-spacing:.03em; margin:0;
67
+ text-transform:uppercase; color:var(--ink2); }
68
+ .colhead .n { font-size:11px; color:var(--ink3); background:var(--chip);
69
+ border-radius:999px; padding:1px 8px; }
70
+
71
+ .task { padding:16px 0; border-bottom:1px solid var(--line2); }
72
+ .task__r1 { display:flex; align-items:center; gap:8px; }
73
+ .task__who { font-size:13.5px; font-weight:600; }
74
+ .task__tag { font-size:11px; color:var(--ink3); }
75
+ .task__repo { font-size:11px; color:var(--terr); background:rgba(122,106,72,.1);
76
+ border-radius:4px; padding:0 6px; }
77
+ .task__stat { margin-left:auto; font-size:11px; font-weight:500; color:var(--ink3); }
78
+ .task__stat--drop { color:var(--drop); }
79
+ .livedot { width:7px; height:7px; border-radius:50%; background:var(--live); margin-left:auto; }
80
+ .task__intent { font-size:13.5px; margin:5px 0 0; line-height:1.45; }
81
+ .terr { margin-top:8px; display:flex; flex-wrap:wrap; gap:6px; align-items:center; }
82
+ .terr__lbl { font-size:9.5px; text-transform:uppercase; letter-spacing:.05em; color:var(--ink3); }
83
+ .glob { font-family:ui-monospace, Menlo, monospace; font-size:11px; color:var(--terr);
84
+ background:rgba(122,106,72,.12); border:1px solid rgba(122,106,72,.22);
85
+ border-radius:5px; padding:1px 7px; }
86
+ .task__meta { font-size:11.5px; color:var(--ink3); margin-top:6px; }
87
+ /* expandable territory (2+ paths collapse to a one-line "N paths" toggle) */
88
+ .terrx { margin-top:8px; }
89
+ .terrx summary { list-style:none; cursor:pointer; display:flex; align-items:center;
90
+ gap:6px; flex-wrap:wrap; user-select:none; }
91
+ .terrx summary::-webkit-details-marker { display:none; }
92
+ .terrx .terr--full { margin-top:8px; }
93
+ .glob--more { cursor:pointer; color:var(--ink2); background:var(--chip);
94
+ border:1px solid var(--line); }
95
+ .glob--more .tw { color:var(--ink3); display:inline-block; transition:transform .15s; }
96
+ .terrx[open] summary .glob--more .tw { transform:rotate(90deg); }
97
+ /* grouped agent box: header + claims rail + collapsible "narrower" fold */
98
+ .grp { padding:16px 0; border-bottom:1px solid var(--line2); }
99
+ .grp__head { display:flex; align-items:center; gap:8px; }
100
+ .grp__who { font-size:13.5px; font-weight:600; }
101
+ .grp__tag { font-size:11px; color:var(--ink3); }
102
+ .grp__count { font-size:11px; color:var(--ink3); }
103
+ .grp__dot { width:7px; height:7px; border-radius:50%; background:var(--live); margin-left:auto; }
104
+ .claims { margin:10px 0 0 6px; padding-left:14px; border-left:1px solid var(--line); }
105
+ .claim { padding:6px 0; }
106
+ .claim + .claim { border-top:1px solid var(--line2); margin-top:6px; }
107
+ .fold { margin-top:10px; }
108
+ .fold summary { list-style:none; cursor:pointer; font-size:12px; color:var(--ink2);
109
+ display:inline-flex; align-items:center; gap:6px; user-select:none; }
110
+ .fold summary::-webkit-details-marker { display:none; }
111
+ .fold summary .tw { display:inline-block; color:var(--ink3); transition:transform .15s; }
112
+ .fold[open] summary .tw { transform:rotate(90deg); }
113
+ .fold__body { margin:8px 0 0 6px; padding-left:14px; border-left:1px dashed var(--line); }
114
+ .covered { font-size:10.5px; color:var(--ink3); font-style:italic; margin-top:4px; }
115
+ .day { font-size:11px; color:var(--ink3); padding:18px 0 2px; font-weight:600; }
116
+ .more { margin-top:20px; font-size:12.5px; color:var(--ink2); padding:7px 13px;
117
+ border:1px solid var(--line); border-radius:8px; background:rgba(255,250,238,.35);
118
+ cursor:pointer; }
119
+ .empty { color:var(--ink3); font-style:italic; padding:14px 0; }
120
+
121
+ /* Chat (re-themed; structure unchanged) */
122
+ .chat-wrap { background:var(--card); border:1px solid var(--line); border-radius:12px;
123
+ display:flex; flex-direction:column; overflow:hidden; height:calc(100vh - 150px); min-height:320px; }
124
+ .chat { flex:1; overflow-y:auto; padding:16px; }
125
+ .chat { scrollbar-width:thin; scrollbar-color:var(--line) transparent; }
126
+ .chat::-webkit-scrollbar { width:10px; }
127
+ .chat::-webkit-scrollbar-track { background:transparent; }
128
+ .chat::-webkit-scrollbar-thumb { background:var(--line); border-radius:999px;
129
+ border:3px solid var(--card); background-clip:padding-box; }
130
+ .chat::-webkit-scrollbar-thumb:hover { background:var(--ink3); background-clip:padding-box; }
131
+ .chat__note { padding:9px 16px; font-size:11.5px; color:var(--ink3); }
132
+ .msg { display:flex; gap:11px; padding:9px 0; }
133
+ .msg__avatar { flex:none; width:32px; height:32px; border-radius:50%; display:grid;
134
+ place-items:center; font-size:12px; font-weight:700; color:#fff; }
135
+ .msg__body { min-width:0; flex:1; }
136
+ .msg__head { display:flex; align-items:baseline; gap:8px; flex-wrap:wrap; }
137
+ .msg__who { font-weight:600; }
138
+ .msg__human { font-size:12px; color:var(--ink3); }
139
+ .msg__to { font-size:11.5px; color:var(--terr); }
140
+ .msg__time { font-size:11.5px; color:var(--ink3); margin-left:auto; }
141
+ .msg__text { margin-top:3px; padding:8px 12px; border-radius:4px 12px 12px 12px;
142
+ background:var(--chip); white-space:pre-wrap; word-break:break-word; }
143
+ .msg--targeted .msg__text { box-shadow:inset 3px 0 0 var(--terr); }
144
+
145
+ /* Operator's own messages — same group-chat structure, mirrored to the right. */
146
+ .msg--me { flex-direction:row-reverse; }
147
+ .msg--me .msg__head { flex-direction:row-reverse; }
148
+ .msg--me .msg__time { margin-left:0; margin-right:auto; }
149
+ .msg--me .msg__body { display:flex; flex-direction:column; align-items:flex-end; }
150
+ .msg--me .msg__text { border-radius:12px 4px 12px 12px; background:#d4e7d2; }
151
+ .msg--me.msg--targeted .msg__text { box-shadow:inset -3px 0 0 var(--terr); }
152
+
153
+ /* Composer */
154
+ .composer { position:relative; border-top:1px solid var(--line); padding:10px 12px; }
155
+ .chat-form { display:flex; gap:8px; }
156
+ .chat-input { flex:1; padding:9px 12px; border-radius:8px; border:1px solid var(--line);
157
+ background:var(--bg); color:var(--ink); font:inherit; }
158
+ .chat-input:focus { outline:none; border-color:var(--terr); }
159
+ .chat-send { padding:9px 16px; border-radius:8px; border:1px solid var(--ink);
160
+ background:var(--ink); color:var(--bg); font-weight:600; cursor:pointer; font:inherit; }
161
+ .chat-send:disabled { opacity:.5; cursor:default; }
162
+
163
+ /* @-mention autocomplete — floats above the input */
164
+ .mention-pop { position:absolute; left:12px; right:12px; bottom:56px; z-index:6;
165
+ background:var(--card); border:1px solid var(--line); border-radius:10px; padding:5px;
166
+ box-shadow:0 8px 24px rgba(50,40,20,.16); max-height:200px; overflow-y:auto; }
167
+ .mention-mi { display:flex; align-items:center; gap:9px; width:100%; text-align:left;
168
+ border:0; appearance:none; font-family:inherit; color:inherit; background:transparent;
169
+ border-radius:7px; padding:6px 8px; font-size:13px; cursor:pointer; }
170
+ .mention-mi:hover, .mention-mi.on { background:var(--chip); }
171
+ .mention-mi .ma { width:22px; height:22px; border-radius:50%; display:grid; place-items:center;
172
+ font-size:9px; font-weight:700; color:#fff; flex:none; }
173
+
174
+ /* Token gate */
175
+ .gate { max-width:420px; margin:12vh auto 0; text-align:center; }
176
+ .gate h1 { font-size:19px; margin:0 0 6px; }
177
+ .gate p { color:var(--ink2); margin:0 0 20px; }
178
+ .gate form { display:flex; gap:8px; }
179
+ .gate input { flex:1; padding:10px 12px; border-radius:8px; border:1px solid var(--line);
180
+ background:var(--card); color:var(--ink); }
181
+ .gate button { padding:10px 16px; border-radius:8px; border:1px solid var(--ink);
182
+ background:var(--ink); color:var(--bg); font-weight:600; cursor:pointer; }
183
+
184
+ /* --- Multi-workspace hosted shell + config surface (functional, not polished;
185
+ a dedicated styling sub-project refines this). Reuses the board's tokens. --- */
186
+ .shepherd-root { max-width:1100px; margin:0 auto; padding:40px 44px; }
187
+ .shepherd-root > main { padding-top:18px; }
188
+ .shepherd-config { display:flex; flex-direction:column; gap:24px; }
189
+ .shepherd-config h2 { font-size:16px; margin:0 0 4px; }
190
+ .shepherd-workspaces, .shepherd-members, .shepherd-connect-agent {
191
+ display:flex; flex-direction:column; gap:10px;
192
+ padding:16px; border:1px solid var(--line); border-radius:10px; background:var(--card); }
193
+ .shepherd-workspaces .switcher { display:flex; flex-wrap:wrap; gap:8px; align-items:center; }
194
+ .shepherd-workspaces .role { color:var(--ink3); font-size:12px; }
195
+ .shepherd-workspaces .admin, .shepherd-workspaces .invites { display:flex; flex-wrap:wrap; gap:8px; align-items:center; }
196
+ /* Create-workspace + join-by-code rows: label, input, then action button on
197
+ one line. A fixed-width label column aligns the two rows' inputs vertically. */
198
+ .shepherd-workspaces .create, .shepherd-workspaces .join {
199
+ display:flex; flex-wrap:wrap; gap:8px; align-items:center; }
200
+ .shepherd-workspaces .create > label, .shepherd-workspaces .join > label,
201
+ .shepherd-workspaces .switcher > label { min-width:104px; color:var(--ink2); }
202
+ .shepherd-workspaces .create > input, .shepherd-workspaces .join > input {
203
+ flex:1; min-width:180px; }
204
+ .shepherd-config input, .shepherd-config select {
205
+ padding:8px 10px; border-radius:8px; border:1px solid var(--line);
206
+ background:var(--bg); color:var(--ink); }
207
+ .shepherd-config button {
208
+ padding:8px 14px; border-radius:8px; border:1px solid var(--ink);
209
+ background:var(--ink); color:var(--bg); font-weight:600; cursor:pointer; }
210
+ .shepherd-config button:disabled { opacity:.55; cursor:default; }
211
+ .shepherd-config .invite-result, .shepherd-connect-agent .token-once {
212
+ font-family:ui-monospace, SFMono-Regular, Menlo, monospace; font-size:12px;
213
+ word-break:break-all; padding:8px 10px; border-radius:8px;
214
+ background:var(--chip); border:1px solid var(--line2); }
215
+ .shepherd-config .revoked { color:var(--ink3); text-decoration:line-through; }
216
+ .shepherd-empty-state { text-align:center; color:var(--ink2); padding:48px 24px; }
217
+ .shepherd-empty-state button { margin-top:14px; }