@ycodium-ai/plugin-pixel-office 0.0.0-stage → 0.2.3566
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/README.md +18 -2
- package/assets/icon.svg +14 -0
- package/assets/office.svg +8 -0
- package/assets/ui.js +494 -0
- package/dist/index.js +6268 -0
- package/locales/en.json +35 -0
- package/locales/zh-CN.json +35 -0
- package/package.json +73 -3
package/README.md
CHANGED
|
@@ -1,3 +1,19 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Pixel Office
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
团队页的第三种视角:把团队的每个会话画成办公室里的一个像素小人。团队层是一间房
|
|
4
|
+
(负责人桌、成员工位、前台柜台、咖啡角、沙发、饮水机、门口队),项目层是每个团队一座岛。
|
|
5
|
+
小人的姿势来自会话状态(在跑 / 等你处理 / 出错 / 空闲 / 盯着 / 已停 / 排队等名额),
|
|
6
|
+
状态变化才换姿势;换场(工位 ↔ 咖啡角 ↔ 柜台)走有限步补间,补间期间 rAF ≤ 8 fps,走完即停。
|
|
7
|
+
视角被切走(`active: false`)时停掉全部动画与订阅;静止时零重绘。
|
|
8
|
+
|
|
9
|
+
- 视角:`ui.teamViews` 的 `office`,`scopes: ["team", "project"]`,座位 `team.view`。
|
|
10
|
+
- 数据全部经公开插件接口:`work.lines.*`、`work.items.list`、`threads.list/get`、
|
|
11
|
+
`threads.execution.summary`,刷新靠本插件自己的 `watch` 门铃流(work 事件 + 会话目录流,
|
|
12
|
+
250 ms 合并)。
|
|
13
|
+
- 素材全部自绘:字符画像素小人编译成 box-shadow,房间是纯 CSS 盒,不引外部图片。
|
|
14
|
+
- 名册成员 ↔ 成员会话没有公开映射,所以小人以**会话**为单位(负责人会话 + `person` 子会话),
|
|
15
|
+
还没有会话的成员不进房间。
|
|
16
|
+
|
|
17
|
+
构建:`node build.mjs`(宿主共享 React 与 plugin-api,只打包自身)。
|
|
18
|
+
测试:`vp test run plugins/pixel-office`。
|
|
19
|
+
真实浏览器验收:`node scripts/ui-probe/pixel-office.ts --home <新目录>`。
|
package/assets/icon.svg
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" shape-rendering="crispEdges" role="img" aria-label="Pixel Office">
|
|
2
|
+
<rect width="16" height="16" fill="#0f172a"/>
|
|
3
|
+
<rect x="3" y="2" width="10" height="12" fill="#334155"/>
|
|
4
|
+
<rect x="4" y="3" width="2" height="2" fill="#fde68a"/>
|
|
5
|
+
<rect x="7" y="3" width="2" height="2" fill="#fde68a"/>
|
|
6
|
+
<rect x="10" y="3" width="2" height="2" fill="#38bdf8"/>
|
|
7
|
+
<rect x="4" y="6" width="2" height="2" fill="#38bdf8"/>
|
|
8
|
+
<rect x="7" y="6" width="2" height="2" fill="#fde68a"/>
|
|
9
|
+
<rect x="10" y="6" width="2" height="2" fill="#fde68a"/>
|
|
10
|
+
<rect x="4" y="9" width="2" height="2" fill="#fde68a"/>
|
|
11
|
+
<rect x="7" y="9" width="2" height="2" fill="#38bdf8"/>
|
|
12
|
+
<rect x="10" y="9" width="2" height="2" fill="#fde68a"/>
|
|
13
|
+
<rect x="6" y="12" width="4" height="2" fill="#0ea5e9"/>
|
|
14
|
+
</svg>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" shape-rendering="crispEdges" role="img" aria-label="Office view">
|
|
2
|
+
<rect x="2" y="3" width="12" height="2" fill="#64748b"/>
|
|
3
|
+
<rect x="3" y="5" width="2" height="8" fill="#94a3b8"/>
|
|
4
|
+
<rect x="11" y="5" width="2" height="8" fill="#94a3b8"/>
|
|
5
|
+
<rect x="6" y="6" width="4" height="5" fill="#38bdf8"/>
|
|
6
|
+
<rect x="7" y="9" width="2" height="2" fill="#0ea5e9"/>
|
|
7
|
+
<rect x="6" y="12" width="5" height="1" fill="#f59e0b"/>
|
|
8
|
+
</svg>
|
package/assets/ui.js
ADDED
|
@@ -0,0 +1,494 @@
|
|
|
1
|
+
var J=window.__ycodiumPluginHost.modules?.["@ycodium-ai/plugin-api/ui"];if(!J)throw new Error("This plugin needs a newer Ycodium app. Update the app.");var{HOST_TEAM_VIEW_PREFIX:ht,PLUGIN_UI_BRIDGE_VERSION:wt,PLUGIN_UI_FLOATING_VIEW_PROP:gt,PLUGIN_UI_GLOBAL_KEY:yt,PLUGIN_UI_HOST_CAPABILITIES:bt,PLUGIN_UI_HOST_COMMAND_PALETTE_UNAVAILABLE_MESSAGE:xt,PLUGIN_UI_HOST_UPGRADE_MESSAGE:vt,TEAM_VIEW_KEY_PATTERN:kt,communicationRecordStage:It,defineTeamView:Z,isTeamViewKey:Pt,pluginUiHostHasCapability:Ot}=J;var ee=`/*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */
|
|
2
|
+
@layer properties, theme, base, components, utilities;
|
|
3
|
+
@layer properties;
|
|
4
|
+
:root, :host {
|
|
5
|
+
--color-ring: var(--ring);
|
|
6
|
+
}
|
|
7
|
+
@layer utilities {
|
|
8
|
+
@scope (.ycodium-pixel-office-ui) {
|
|
9
|
+
.absolute:where(:scope, *) {
|
|
10
|
+
position: absolute;
|
|
11
|
+
}
|
|
12
|
+
.relative:where(:scope, *) {
|
|
13
|
+
position: relative;
|
|
14
|
+
}
|
|
15
|
+
.top-0:where(:scope, *) {
|
|
16
|
+
top: calc(var(--spacing, 0.25rem) * 0);
|
|
17
|
+
}
|
|
18
|
+
.left-0:where(:scope, *) {
|
|
19
|
+
left: calc(var(--spacing, 0.25rem) * 0);
|
|
20
|
+
}
|
|
21
|
+
.container:where(:scope, *) {
|
|
22
|
+
width: 100%;
|
|
23
|
+
@media (width >= 40rem) {
|
|
24
|
+
max-width: 40rem;
|
|
25
|
+
}
|
|
26
|
+
@media (width >= 48rem) {
|
|
27
|
+
max-width: 48rem;
|
|
28
|
+
}
|
|
29
|
+
@media (width >= 64rem) {
|
|
30
|
+
max-width: 64rem;
|
|
31
|
+
}
|
|
32
|
+
@media (width >= 80rem) {
|
|
33
|
+
max-width: 80rem;
|
|
34
|
+
}
|
|
35
|
+
@media (width >= 96rem) {
|
|
36
|
+
max-width: 96rem;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
.m-0:where(:scope, *) {
|
|
40
|
+
margin: calc(var(--spacing, 0.25rem) * 0);
|
|
41
|
+
}
|
|
42
|
+
.m-1:where(:scope, *) {
|
|
43
|
+
margin: calc(var(--spacing, 0.25rem) * 1);
|
|
44
|
+
}
|
|
45
|
+
.m-2:where(:scope, *) {
|
|
46
|
+
margin: calc(var(--spacing, 0.25rem) * 2);
|
|
47
|
+
}
|
|
48
|
+
.m-3:where(:scope, *) {
|
|
49
|
+
margin: calc(var(--spacing, 0.25rem) * 3);
|
|
50
|
+
}
|
|
51
|
+
.m-4:where(:scope, *) {
|
|
52
|
+
margin: calc(var(--spacing, 0.25rem) * 4);
|
|
53
|
+
}
|
|
54
|
+
.m-8:where(:scope, *) {
|
|
55
|
+
margin: calc(var(--spacing, 0.25rem) * 8);
|
|
56
|
+
}
|
|
57
|
+
.m-9:where(:scope, *) {
|
|
58
|
+
margin: calc(var(--spacing, 0.25rem) * 9);
|
|
59
|
+
}
|
|
60
|
+
.m-auto:where(:scope, *) {
|
|
61
|
+
margin: auto;
|
|
62
|
+
}
|
|
63
|
+
.block:where(:scope, *) {
|
|
64
|
+
display: block;
|
|
65
|
+
}
|
|
66
|
+
.flex:where(:scope, *) {
|
|
67
|
+
display: flex;
|
|
68
|
+
}
|
|
69
|
+
.min-h-0:where(:scope, *) {
|
|
70
|
+
min-height: calc(var(--spacing, 0.25rem) * 0);
|
|
71
|
+
}
|
|
72
|
+
.w-full:where(:scope, *) {
|
|
73
|
+
width: 100%;
|
|
74
|
+
}
|
|
75
|
+
.min-w-0:where(:scope, *) {
|
|
76
|
+
min-width: calc(var(--spacing, 0.25rem) * 0);
|
|
77
|
+
}
|
|
78
|
+
.flex-1:where(:scope, *) {
|
|
79
|
+
flex: 1;
|
|
80
|
+
}
|
|
81
|
+
.shrink-0:where(:scope, *) {
|
|
82
|
+
flex-shrink: 0;
|
|
83
|
+
}
|
|
84
|
+
.origin-top-left:where(:scope, *) {
|
|
85
|
+
transform-origin: 0 0;
|
|
86
|
+
}
|
|
87
|
+
.transform:where(:scope, *) {
|
|
88
|
+
transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);
|
|
89
|
+
}
|
|
90
|
+
.flex-col:where(:scope, *) {
|
|
91
|
+
flex-direction: column;
|
|
92
|
+
}
|
|
93
|
+
.flex-wrap:where(:scope, *) {
|
|
94
|
+
flex-wrap: wrap;
|
|
95
|
+
}
|
|
96
|
+
.items-center:where(:scope, *) {
|
|
97
|
+
align-items: center;
|
|
98
|
+
}
|
|
99
|
+
.justify-center:where(:scope, *) {
|
|
100
|
+
justify-content: center;
|
|
101
|
+
}
|
|
102
|
+
.gap-1\\.5:where(:scope, *) {
|
|
103
|
+
gap: calc(var(--spacing, 0.25rem) * 1.5);
|
|
104
|
+
}
|
|
105
|
+
.gap-2:where(:scope, *) {
|
|
106
|
+
gap: calc(var(--spacing, 0.25rem) * 2);
|
|
107
|
+
}
|
|
108
|
+
.gap-x-4:where(:scope, *) {
|
|
109
|
+
column-gap: calc(var(--spacing, 0.25rem) * 4);
|
|
110
|
+
}
|
|
111
|
+
.gap-y-1:where(:scope, *) {
|
|
112
|
+
row-gap: calc(var(--spacing, 0.25rem) * 1);
|
|
113
|
+
}
|
|
114
|
+
.overflow-hidden:where(:scope, *) {
|
|
115
|
+
overflow: hidden;
|
|
116
|
+
}
|
|
117
|
+
.overflow-y-auto:where(:scope, *) {
|
|
118
|
+
overflow-y: auto;
|
|
119
|
+
}
|
|
120
|
+
.px-4:where(:scope, *) {
|
|
121
|
+
padding-inline: calc(var(--spacing, 0.25rem) * 4);
|
|
122
|
+
}
|
|
123
|
+
.py-1:where(:scope, *) {
|
|
124
|
+
padding-block: calc(var(--spacing, 0.25rem) * 1);
|
|
125
|
+
}
|
|
126
|
+
.py-2:where(:scope, *) {
|
|
127
|
+
padding-block: calc(var(--spacing, 0.25rem) * 2);
|
|
128
|
+
}
|
|
129
|
+
.pt-2:where(:scope, *) {
|
|
130
|
+
padding-top: calc(var(--spacing, 0.25rem) * 2);
|
|
131
|
+
}
|
|
132
|
+
.text-ui-sm:where(:scope, *) {
|
|
133
|
+
font-size: var(--ui-text-sm);
|
|
134
|
+
line-height: var(--tw-leading, var(--ui-leading-sm));
|
|
135
|
+
}
|
|
136
|
+
.text-ui-xs:where(:scope, *) {
|
|
137
|
+
font-size: var(--ui-text-xs);
|
|
138
|
+
line-height: var(--tw-leading, var(--ui-leading-xs));
|
|
139
|
+
}
|
|
140
|
+
.text-muted-foreground:where(:scope, *) {
|
|
141
|
+
color: var(--contrast-muted-foreground);
|
|
142
|
+
}
|
|
143
|
+
.text-warning-foreground:where(:scope, *) {
|
|
144
|
+
color: var(--warning-foreground);
|
|
145
|
+
}
|
|
146
|
+
.shadow:where(:scope, *) {
|
|
147
|
+
--tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
|
|
148
|
+
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
|
149
|
+
}
|
|
150
|
+
.ring:where(:scope, *) {
|
|
151
|
+
--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
|
|
152
|
+
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
.po-stage {
|
|
157
|
+
--po-tile-a: #d8d3c8;
|
|
158
|
+
--po-tile-b: #cbc5b8;
|
|
159
|
+
--po-wall: #b9c6d5;
|
|
160
|
+
--po-furniture: #a97c50;
|
|
161
|
+
--po-furniture-dark: #8a6240;
|
|
162
|
+
--po-metal: #9aa7b8;
|
|
163
|
+
--po-ink: #3d4451;
|
|
164
|
+
position: relative;
|
|
165
|
+
background: var(--po-tile-b);
|
|
166
|
+
}
|
|
167
|
+
:is(.dark) .po-stage {
|
|
168
|
+
--po-tile-a: #2c333f;
|
|
169
|
+
--po-tile-b: #262c37;
|
|
170
|
+
--po-wall: #333c4b;
|
|
171
|
+
--po-furniture: #7c5b3c;
|
|
172
|
+
--po-furniture-dark: #5f4630;
|
|
173
|
+
--po-metal: #64748b;
|
|
174
|
+
--po-ink: #cbd5e1;
|
|
175
|
+
}
|
|
176
|
+
.po-floor {
|
|
177
|
+
position: absolute;
|
|
178
|
+
left: 0;
|
|
179
|
+
right: 0;
|
|
180
|
+
top: 118px;
|
|
181
|
+
bottom: 0;
|
|
182
|
+
background: conic-gradient( var(--po-tile-a) 25%, var(--po-tile-b) 0 50%, var(--po-tile-a) 0 75%, var(--po-tile-b) 0 );
|
|
183
|
+
background-size: 48px 48px;
|
|
184
|
+
}
|
|
185
|
+
.po-wall {
|
|
186
|
+
position: absolute;
|
|
187
|
+
left: 0;
|
|
188
|
+
right: 0;
|
|
189
|
+
top: 0;
|
|
190
|
+
height: 120px;
|
|
191
|
+
background: var(--po-wall);
|
|
192
|
+
border-bottom: 6px solid #8d99a8;
|
|
193
|
+
}
|
|
194
|
+
.dark .po-wall {
|
|
195
|
+
border-bottom-color: #475264;
|
|
196
|
+
}
|
|
197
|
+
.po-window {
|
|
198
|
+
position: absolute;
|
|
199
|
+
width: 96px;
|
|
200
|
+
height: 54px;
|
|
201
|
+
background: #bfe3f5;
|
|
202
|
+
border: 4px solid #8d99a8;
|
|
203
|
+
}
|
|
204
|
+
.dark .po-window {
|
|
205
|
+
background: #274257;
|
|
206
|
+
border-color: #475264;
|
|
207
|
+
}
|
|
208
|
+
.po-door {
|
|
209
|
+
position: absolute;
|
|
210
|
+
left: 846px;
|
|
211
|
+
top: 468px;
|
|
212
|
+
width: 66px;
|
|
213
|
+
height: 66px;
|
|
214
|
+
background: var(--po-furniture);
|
|
215
|
+
border: 4px solid var(--po-furniture-dark);
|
|
216
|
+
border-radius: 6px 6px 0 0;
|
|
217
|
+
}
|
|
218
|
+
.po-counter {
|
|
219
|
+
position: absolute;
|
|
220
|
+
left: 792px;
|
|
221
|
+
top: 258px;
|
|
222
|
+
width: 84px;
|
|
223
|
+
height: 70px;
|
|
224
|
+
background: var(--po-furniture);
|
|
225
|
+
border: 3px solid var(--po-furniture-dark);
|
|
226
|
+
}
|
|
227
|
+
.po-coffee {
|
|
228
|
+
position: absolute;
|
|
229
|
+
left: 56px;
|
|
230
|
+
top: 216px;
|
|
231
|
+
width: 44px;
|
|
232
|
+
height: 58px;
|
|
233
|
+
background: var(--po-metal);
|
|
234
|
+
border: 3px solid #6b7787;
|
|
235
|
+
}
|
|
236
|
+
.po-couch {
|
|
237
|
+
position: absolute;
|
|
238
|
+
left: 52px;
|
|
239
|
+
top: 424px;
|
|
240
|
+
width: 128px;
|
|
241
|
+
height: 46px;
|
|
242
|
+
background: #b0593b;
|
|
243
|
+
border: 4px solid #8a4630;
|
|
244
|
+
border-radius: 8px;
|
|
245
|
+
}
|
|
246
|
+
.dark .po-couch {
|
|
247
|
+
background: #7e4029;
|
|
248
|
+
border-color: #5e2f1e;
|
|
249
|
+
}
|
|
250
|
+
.po-cooler {
|
|
251
|
+
position: absolute;
|
|
252
|
+
left: 206px;
|
|
253
|
+
top: 150px;
|
|
254
|
+
width: 30px;
|
|
255
|
+
height: 56px;
|
|
256
|
+
background: #dbe7f0;
|
|
257
|
+
border: 3px solid #9aa7b8;
|
|
258
|
+
}
|
|
259
|
+
.dark .po-cooler {
|
|
260
|
+
background: #3d4a5c;
|
|
261
|
+
}
|
|
262
|
+
.po-plant {
|
|
263
|
+
position: absolute;
|
|
264
|
+
width: 26px;
|
|
265
|
+
height: 34px;
|
|
266
|
+
background: #3f7d4f;
|
|
267
|
+
border-radius: 50% 50% 6px 6px;
|
|
268
|
+
}
|
|
269
|
+
.dark .po-plant {
|
|
270
|
+
background: #2f5e3b;
|
|
271
|
+
}
|
|
272
|
+
.po-desk-top {
|
|
273
|
+
position: absolute;
|
|
274
|
+
background: var(--po-furniture);
|
|
275
|
+
border: 2px solid var(--po-furniture-dark);
|
|
276
|
+
}
|
|
277
|
+
.po-desk-dim {
|
|
278
|
+
opacity: 0.55;
|
|
279
|
+
}
|
|
280
|
+
.po-desk-leg {
|
|
281
|
+
position: absolute;
|
|
282
|
+
background: var(--po-furniture-dark);
|
|
283
|
+
}
|
|
284
|
+
.po-laptop {
|
|
285
|
+
position: absolute;
|
|
286
|
+
background: #3f4756;
|
|
287
|
+
border: 1px solid #262c37;
|
|
288
|
+
}
|
|
289
|
+
.dark .po-laptop {
|
|
290
|
+
background: #111722;
|
|
291
|
+
}
|
|
292
|
+
.po-board {
|
|
293
|
+
position: absolute;
|
|
294
|
+
left: 640px;
|
|
295
|
+
top: 14px;
|
|
296
|
+
width: 220px;
|
|
297
|
+
padding: 6px 10px;
|
|
298
|
+
background: #f2efe6;
|
|
299
|
+
border: 3px solid #8a6240;
|
|
300
|
+
border-radius: 4px;
|
|
301
|
+
color: var(--po-ink);
|
|
302
|
+
display: flex;
|
|
303
|
+
flex-direction: column;
|
|
304
|
+
gap: 2px;
|
|
305
|
+
}
|
|
306
|
+
.dark .po-board {
|
|
307
|
+
background: #1c222c;
|
|
308
|
+
}
|
|
309
|
+
.po-board-title {
|
|
310
|
+
font-weight: 600;
|
|
311
|
+
font-size: 12px;
|
|
312
|
+
margin-bottom: 2px;
|
|
313
|
+
overflow: hidden;
|
|
314
|
+
text-overflow: ellipsis;
|
|
315
|
+
white-space: nowrap;
|
|
316
|
+
}
|
|
317
|
+
.po-board-row {
|
|
318
|
+
display: flex;
|
|
319
|
+
align-items: center;
|
|
320
|
+
gap: 6px;
|
|
321
|
+
font-size: 11px;
|
|
322
|
+
line-height: 1.3;
|
|
323
|
+
}
|
|
324
|
+
.po-island {
|
|
325
|
+
position: absolute;
|
|
326
|
+
background: var(--po-tile-a);
|
|
327
|
+
border: 3px dashed #a99f8c;
|
|
328
|
+
border-radius: 10px;
|
|
329
|
+
}
|
|
330
|
+
.dark .po-island {
|
|
331
|
+
border-color: #4a5364;
|
|
332
|
+
}
|
|
333
|
+
.po-island-archived {
|
|
334
|
+
opacity: 0.55;
|
|
335
|
+
}
|
|
336
|
+
.po-island-sign {
|
|
337
|
+
position: absolute;
|
|
338
|
+
display: flex;
|
|
339
|
+
align-items: baseline;
|
|
340
|
+
gap: 8px;
|
|
341
|
+
max-width: 288px;
|
|
342
|
+
color: var(--po-ink);
|
|
343
|
+
font-size: 12px;
|
|
344
|
+
white-space: nowrap;
|
|
345
|
+
}
|
|
346
|
+
.po-island-sign-archived {
|
|
347
|
+
text-decoration: line-through;
|
|
348
|
+
}
|
|
349
|
+
.po-island-name {
|
|
350
|
+
font-weight: 600;
|
|
351
|
+
overflow: hidden;
|
|
352
|
+
text-overflow: ellipsis;
|
|
353
|
+
}
|
|
354
|
+
.po-island-badge {
|
|
355
|
+
font-size: 10px;
|
|
356
|
+
padding: 0 4px;
|
|
357
|
+
border-radius: 4px;
|
|
358
|
+
background: var(--po-ink);
|
|
359
|
+
@supports (color: color-mix(in lab, red, red)) {
|
|
360
|
+
background: color-mix(in srgb, var(--po-ink) 12%, transparent);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
.po-island-count {
|
|
364
|
+
font-size: 10px;
|
|
365
|
+
opacity: 0.8;
|
|
366
|
+
}
|
|
367
|
+
.po-character {
|
|
368
|
+
position: absolute;
|
|
369
|
+
transform: translate(-50%, -100%);
|
|
370
|
+
display: flex;
|
|
371
|
+
flex-direction: column;
|
|
372
|
+
align-items: center;
|
|
373
|
+
padding: 0;
|
|
374
|
+
border: 0;
|
|
375
|
+
background: transparent;
|
|
376
|
+
cursor: pointer;
|
|
377
|
+
-webkit-tap-highlight-color: transparent;
|
|
378
|
+
}
|
|
379
|
+
.po-character:focus-visible {
|
|
380
|
+
outline: 2px solid var(--color-ring, #3b82f6);
|
|
381
|
+
outline-offset: 2px;
|
|
382
|
+
border-radius: 4px;
|
|
383
|
+
}
|
|
384
|
+
.po-sprite-frame {
|
|
385
|
+
display: block;
|
|
386
|
+
}
|
|
387
|
+
.po-sprite {
|
|
388
|
+
display: block;
|
|
389
|
+
}
|
|
390
|
+
.po-name {
|
|
391
|
+
display: block;
|
|
392
|
+
margin-top: 2px;
|
|
393
|
+
width: var(--po-name-w, 80px);
|
|
394
|
+
min-width: 0;
|
|
395
|
+
font-size: 11px;
|
|
396
|
+
line-height: 1.2;
|
|
397
|
+
color: var(--po-ink);
|
|
398
|
+
overflow: hidden;
|
|
399
|
+
text-overflow: ellipsis;
|
|
400
|
+
white-space: nowrap;
|
|
401
|
+
}
|
|
402
|
+
.po-bubble {
|
|
403
|
+
position: absolute;
|
|
404
|
+
top: -14px;
|
|
405
|
+
right: -6px;
|
|
406
|
+
min-width: 16px;
|
|
407
|
+
height: 16px;
|
|
408
|
+
padding: 0 3px;
|
|
409
|
+
display: flex;
|
|
410
|
+
align-items: center;
|
|
411
|
+
justify-content: center;
|
|
412
|
+
font-size: 11px;
|
|
413
|
+
font-weight: 700;
|
|
414
|
+
border-radius: 8px 8px 8px 2px;
|
|
415
|
+
}
|
|
416
|
+
.po-bubble-waiting {
|
|
417
|
+
background: #f5c518;
|
|
418
|
+
color: #4a3b00;
|
|
419
|
+
}
|
|
420
|
+
.po-bubble-failed {
|
|
421
|
+
background: #e5484d;
|
|
422
|
+
color: #fff;
|
|
423
|
+
}
|
|
424
|
+
.po-bubble-asleep {
|
|
425
|
+
background: #8b95a5;
|
|
426
|
+
color: #1c222c;
|
|
427
|
+
}
|
|
428
|
+
.po-bubble-queued {
|
|
429
|
+
background: #7c9cf5;
|
|
430
|
+
color: #101a33;
|
|
431
|
+
}
|
|
432
|
+
.po-dot {
|
|
433
|
+
display: inline-block;
|
|
434
|
+
width: 8px;
|
|
435
|
+
height: 8px;
|
|
436
|
+
border-radius: 2px;
|
|
437
|
+
flex: none;
|
|
438
|
+
}
|
|
439
|
+
.po-dot-working, .po-dot-started {
|
|
440
|
+
background: #3b82f6;
|
|
441
|
+
}
|
|
442
|
+
.po-dot-waiting {
|
|
443
|
+
background: #f5c518;
|
|
444
|
+
}
|
|
445
|
+
.po-dot-monitoring {
|
|
446
|
+
background: #14b8a6;
|
|
447
|
+
}
|
|
448
|
+
.po-dot-failed {
|
|
449
|
+
background: #e5484d;
|
|
450
|
+
}
|
|
451
|
+
.po-dot-idle {
|
|
452
|
+
background: #94a3b8;
|
|
453
|
+
}
|
|
454
|
+
.po-dot-asleep {
|
|
455
|
+
background: #64748b;
|
|
456
|
+
}
|
|
457
|
+
.po-dot-queued {
|
|
458
|
+
background: #7c9cf5;
|
|
459
|
+
}
|
|
460
|
+
.po-dot-todo {
|
|
461
|
+
background: #a8a29e;
|
|
462
|
+
}
|
|
463
|
+
.po-dot-completed {
|
|
464
|
+
background: #22c55e;
|
|
465
|
+
}
|
|
466
|
+
.po-dot-cancelled {
|
|
467
|
+
background: #78716c;
|
|
468
|
+
}
|
|
469
|
+
@layer properties {
|
|
470
|
+
@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {
|
|
471
|
+
*, ::before, ::after, ::backdrop {
|
|
472
|
+
--tw-rotate-x: initial;
|
|
473
|
+
--tw-rotate-y: initial;
|
|
474
|
+
--tw-rotate-z: initial;
|
|
475
|
+
--tw-skew-x: initial;
|
|
476
|
+
--tw-skew-y: initial;
|
|
477
|
+
--tw-shadow: 0 0 #0000;
|
|
478
|
+
--tw-shadow-color: initial;
|
|
479
|
+
--tw-shadow-alpha: 100%;
|
|
480
|
+
--tw-inset-shadow: 0 0 #0000;
|
|
481
|
+
--tw-inset-shadow-color: initial;
|
|
482
|
+
--tw-inset-shadow-alpha: 100%;
|
|
483
|
+
--tw-ring-color: initial;
|
|
484
|
+
--tw-ring-shadow: 0 0 #0000;
|
|
485
|
+
--tw-inset-ring-color: initial;
|
|
486
|
+
--tw-inset-ring-shadow: 0 0 #0000;
|
|
487
|
+
--tw-ring-inset: initial;
|
|
488
|
+
--tw-ring-offset-width: 0px;
|
|
489
|
+
--tw-ring-offset-color: #fff;
|
|
490
|
+
--tw-ring-offset-shadow: 0 0 #0000;
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
`;var Je=window.__ycodiumPluginHost.react;var{Activity:Rt,Children:Lt,Component:Et,Fragment:Ct,Profiler:Mt,PureComponent:Nt,StrictMode:_t,Suspense:At,__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE:Dt,__COMPILER_RUNTIME:Ht,act:Ut,cache:Wt,cacheSignal:Bt,captureOwnerStack:Ft,cloneElement:qt,createContext:te,createElement:A,createRef:jt,forwardRef:Vt,isValidElement:zt,lazy:$t,memo:oe,startTransition:Kt,unstable_useCacheRefresh:Gt,use:Xt,useActionState:Yt,useCallback:R,useContext:re,useDebugValue:Qt,useDeferredValue:Jt,useEffect:x,useEffectEvent:Zt,useId:eo,useImperativeHandle:to,useInsertionEffect:oo,useLayoutEffect:ne,useMemo:v,useOptimistic:ro,useReducer:no,useRef:g,useState:C,useSyncExternalStore:ao,useTransition:io,version:so}=Je;var ae=te(null),ie=ae.Provider;function k(){let e=re(ae);if(e===null)throw new Error("pixel-office-ui-not-registered");return e}function O(){let e=k().i18n.usePluginTranslation();return{t:(t,o)=>e(t,o)}}function se({environmentId:e,projectId:t,onBell:o,retryRef:r}){let n=k(),s=v(()=>({projectId:t}),[t]),c=v(()=>({environmentId:e}),[e]),l=n.commands.useSubscription("watch",s,c),a=l.data,d=a?.cursor??null,f=a?.threads,m=l.error!==null||l.isUnavailable,w=g(!1);return x(()=>{r.current=l.refresh}),x(()=>{if(!w.current){w.current=!0,o({cursor:d,failed:m,initial:!0});return}o({cursor:d,failed:m,...f===void 0?{}:{threads:f}})},[d,m,f]),null}var Ze={todo:0,started:0,completed:0,cancelled:0},et=e=>{let t={...Ze};for(let o of e)switch(o.state.group){case"started":t.started+=1;break;case"completed":t.completed+=1;break;case"cancelled":t.cancelled+=1;break;default:t.todo+=1;break}return t},ce=(e,t)=>({workLineId:e.workLineId,name:e.name,archived:e.archivedAt!==null,threadId:e.threadId,counts:et(t.filter(o=>o.workLineId===e.workLineId))}),tt=e=>[...e].sort((t,o)=>t.archived!==o.archived?t.archived?1:-1:t.workLineId.localeCompare(o.workLineId)),le=e=>[...e].sort((t,o)=>t.lineId!==o.lineId?t.lineId.localeCompare(o.lineId):t.role!==o.role?t.role==="lead"?-1:1:t.threadId.localeCompare(o.threadId)),de=(e,t,o,r,n,s)=>({threadId:o,title:r,role:t,status:n,queuePosition:s,lineId:e}),H=e=>{switch(e){case"needs-approval":case"needs-input":case"plan-ready":return"waiting";case"running":return"working";case"background":return"monitoring";case"failed":return"failed";case"stopped":return"asleep";default:return"idle"}},ue=e=>H(e.status??"idle"),U=e=>e.summary?.origin?.requestedBy==="person",j=e=>e==="idle",V=e=>{let t=new Map;for(let o of e){if(o===null||o.continuation!=="queued")continue;let r=o.queue.find(n=>n.status==="blocked"&&n.waitingForCapacity===!0);r!==void 0&&t.set(o.threadId,r.position)}return t},pe=(e,t)=>e==="idle"&&t!==null?"queued":e,fe=(e,t,o)=>me(e,"member",t,o),ot=(e,t,o)=>me(e,"lead",t,o),me=(e,t,o,r)=>de(e,t,o.threadId,o.title,pe(H(o.status),r),r),rt=(e,t,o)=>de(e,"lead",t.id,t.title,pe(ue(t),o),o),he=(e,t)=>[...e!==null&&j(ue(e))?[e.id]:[],...t.filter(o=>j(H(o.status))).map(o=>o.threadId)],we=(e,t)=>{let o=new Set(e.flatMap(r=>r.threadId===null?[]:[r.threadId]));return t.filter(r=>(o.has(r.threadId)||r.parentThreadId!==null&&o.has(r.parentThreadId)&&U(r))&&j(H(r.status))).map(r=>r.threadId)},z=e=>{let t=e.line.workLineId;return{lines:[ce(e.line,e.items)],characters:le([...e.lead===null?[]:[rt(t,e.lead,e.queue.get(e.lead.id)??null)],...e.members.map(o=>fe(t,o,e.queue.get(o.threadId)??null))])}},ge=e=>{let t=new Map(e.threads.map(n=>[n.threadId,n])),o=new Map;for(let n of e.threads){if(n.parentThreadId===null||!U(n))continue;let s=o.get(n.parentThreadId);s===void 0?o.set(n.parentThreadId,[n]):s.push(n)}let r=[];for(let n of e.lines){let s=n.workLineId;if(n.threadId!==null){let c=t.get(n.threadId);c!==void 0&&r.push(ot(s,c,e.queue.get(c.threadId)??null));for(let l of o.get(n.threadId)??[])r.push(fe(s,l,e.queue.get(l.threadId)??null))}}return{lines:tt(e.lines.map(n=>ce(n,e.items))),characters:le(r)}};var D=async e=>{let t=[],o=null;for(;;){let r=await e(o);if(t.push(...r.items),r.nextCursor===null)return t;o=r.nextCursor}},ye=async(e,t,o)=>{if(o.length===0)return V([]);let r=await Promise.all(o.map(n=>e.data.read("threads.execution.summary",{threadId:n},{environmentId:t}).catch(()=>null)));return V(r)};async function be(e,t){let{environmentId:o,projectId:r,workLineId:n}=t,{line:s}=await e.data.read("work.lines.get",{projectId:r,workLineId:n},{environmentId:o}),c=D(y=>e.data.read("work.items.list",{projectId:r,workLineIds:[n],cursor:y},{environmentId:o}));if(s.threadId===null)return z({line:s,lead:null,members:[],items:await c,queue:new Map});let l=s.threadId,[a,d,f]=await Promise.all([e.data.read("threads.get",{threadId:l},{environmentId:o}).catch(()=>null),D(y=>e.data.read("threads.list",{projectId:r,parentThreadId:l,include:["summary"],cursor:y},{environmentId:o})),c]),m=d.filter(U),w=await ye(e,o,he(a,m));return z({line:s,lead:a,members:m,items:f,queue:w})}async function xe(e,t){let{environmentId:o,projectId:r}=t,[n,s,c]=await Promise.all([D(a=>e.data.read("work.lines.list",{projectId:r,includeArchived:!0,cursor:a},{environmentId:o})),D(a=>e.data.read("threads.list",{projectId:r,include:["summary"],cursor:a},{environmentId:o})),D(a=>e.data.read("work.items.list",{projectId:r,cursor:a},{environmentId:o}))]),l=await ye(e,o,we(n,s));return ge({lines:n,threads:s,items:c,queue:l})}var nt=(e,t)=>JSON.stringify(e)===JSON.stringify(t);function ve(e){let{environmentId:t,projectId:o,active:r}=e,n=e.scope==="team"?e.workLineId:null,s=k(),c=g(()=>{}),l=R(()=>c.current(),[]),a=v(()=>({scene:null}),[t,o,n]),d=v(()=>({active:!1,dirty:!1,running:null}),[t,o,n]),f=g(e);f.current=e;let[m,w]=C(null),[y,b]=C(!1),[I,M]=C(!1),P=R(()=>!d.active||!f.current.active?Promise.resolve():(d.dirty=!0,d.running!==null||(d.running=(async()=>{try{do{d.dirty=!1;try{let p=f.current.scope==="team"?await be(s,f.current):await xe(s,f.current);if(!d.active||!f.current.active)return;(a.scene===null||!nt(p,a.scene))&&(a.scene=p,w(p)),b(!1)}catch{if(!d.active||!f.current.active)return;b(!0)}}while(d.active&&d.dirty)}finally{d.running=null}})()),d.running),[s,a,d]);x(()=>(d.active=!0,a.scene=null,w(null),b(!1),P(),()=>{d.active=!1}),[d,P,a]);let N=g(null),q=R(p=>{if(M(_=>_===p.failed?_:p.failed),p.initial===!0){p.cursor!==null&&(N.current=p.cursor);return}let E=N.current;if(Object.is(E,p.cursor))return;if(N.current=p.cursor,E!==null&&p.cursor===E+1&&p.threads!==void 0){let _=f.current.scope==="team"?[f.current.threadId]:a.scene?.lines.map(T=>T.threadId)??[],Xe=new Set(_),Ye=new Set([..._,...a.scene?.characters.map(T=>T.threadId)??[]]);if(!p.threads.ids.some(T=>Ye.has(T))&&!p.threads.parentIds.some(T=>Xe.has(T)))return}P()},[a,P]),h=g(r);return x(()=>{r&&!h.current&&P(),h.current=r},[r,P]),{scene:m,loadFailed:y,reload:P,watchFailed:r&&I,retryWatch:l,subscription:r?A(se,{environmentId:t,projectId:o,onBell:q,retryRef:c}):null}}function $(e){return function(o){return A(k().ui[e],{...o})}}var K=$("Empty"),G=$("EmptyHeader"),X=$("EmptyTitle");function Y(e){return A(k().ui.Button,e)}var at={working:["...hhhh...","..hhhhhh..","..ssssss..","..sesses..","..ssssss..",".cccccccc.","cccccccccc","cccccccccc",".s.cccc.s.","...kkkk...","..pppppp..","..pp..pp..","..b....b..",".........."],waiting:["...hhhh.s.","..hhhhhh.s","..ssssss.s","..sesses.s","..ssssss.s",".ccccccccc","cccccccccc","cccccccccc",".s.cccc...","...pppp...","..pp..pp..","..pp..pp..","..b....b..",".........."],failed:["..........","..........","...hhhh...","..hhhhhh..","..ssssss..","..ssssss..",".cccccccc.","cccccccccc","sccccccccs","s........s","..pppppp..","..pp..pp..","..b....b..",".........."],idle:["...hhhh...","..hhhhhh..","..ssssss..","..sesses..","..ssssss..",".cccccccc.","cccccccccc","u.ccccccc.","u.scccc...","...pppp...","..pp..pp..","..pp..pp..","..b....b..",".........."],asleep:["..........","...hhhh...","..hhhhhh..","..ssssss..","..s.ss.s..",".cccccccc.","cccccccccc","cccccccccc",".cccccccc.","..pppppp..","..pppppp..","..........","..........",".........."],monitoring:["...hhhh...","..hhhhhh..","..ssssss..","..sesses..","..ssssss..",".cccccccc.","cccccccccc","cccccccccc",".ccccccc..","..pppppp..","..pp..pp..","..pp..pp..","..b....b..",".........."],queued:["...hhhh...","..hhhhhh..","..ssssss..","..sssssee.","..ssssss..",".cccccccc.","cccccccccc","cccccccccc",".s.cccccc.","..ppppppk.","..pppppp..","..pppppp..","...b..b...",".........."]},L=3,ke=10,it=14,W=1,Ie=new Map;function Re(e){let t=Ie.get(e);if(t!==void 0)return t;let o=at[e],r=[];for(let[s,c]of o.entries()){if(c.length!==ke)throw new Error(`pose-${e}-row-${s}-width`);for(let[l,a]of[...c].entries())a!=="."&&r.push(`${(l+W)*L}px ${(s+W)*L}px 0 var(--po-${a})`)}let n={boxShadow:r.join(", "),width:(ke+W)*L,height:(it+W)*L};return Ie.set(e,n),n}var Pe=["#f2c9a0","#dcae7c","#c28c5c","#9c6b44"],Oe=["#2f2a26","#5b4632","#8a6a3f","#b58a52","#d9c48f","#6e6e73","#40485c"],Se=["#3b82f6","#ef4444","#10b981","#f59e0b","#8b5cf6","#ec4899","#14b8a6","#64748b"],Te=["#334155","#1e293b","#4b5563"],st=e=>{let t=5381;for(let o of e)t=(t*33^o.charCodeAt(0))>>>0;return t};function Le(e){let t=st(e);return{"--po-h":Oe[(t>>>0)%Oe.length],"--po-s":Pe[(t>>>3)%Pe.length],"--po-e":"#26221e","--po-c":Se[(t>>>6)%Se.length],"--po-p":Te[(t>>>9)%Te.length],"--po-b":"#3b2f2a","--po-k":"#4b5563","--po-u":"#f4f1ea"}}var{jsx:i,jsxs:u,Fragment:S}=window.__ycodiumPluginHost.jsxRuntime;var ct=e=>{switch(e.status){case"waiting":return"?";case"failed":return"!";case"asleep":return"z";case"queued":return e.queuePosition===null?"\u2026":String(e.queuePosition);default:return null}},Ee=oe(function(t){let{character:o,slot:r}=t,{t:n}=O(),s=Re(o.status),c=ct(o),l=n(`office.status.${o.status}`),a=g(null),d=g(t.walker);d.current=t.walker;let f=g(r);return ne(()=>{let m=a.current,w=f.current;f.current=r,!(m===null||w.x===r.x&&w.y===r.y)&&d.current.move(o.threadId,m,w,r)},[r,o.threadId]),u("button",{ref:a,type:"button",className:"po-character","data-office-character":o.threadId,"data-office-status":o.status,style:{left:r.x,top:r.y,...Le(o.threadId)},"aria-label":`${n("office.characterLabel",{name:o.title,status:l})}${o.role==="lead"?` \xB7 ${n("office.leadBadge")}`:""}${o.queuePosition!==null?` \xB7 ${n("office.queuePosition",{position:o.queuePosition})}`:""}`,onClick:()=>t.onOpen(o),children:[i("span",{className:"po-sprite-frame",style:{width:s.width,height:s.height},children:i("span",{className:"po-sprite",style:{width:L,height:L,boxShadow:s.boxShadow}})}),c===null?null:i("span",{className:`po-bubble po-bubble-${o.status}`,children:c}),i("span",{className:"po-name",children:o.title})]})});function Q(e){let t=g(null),[o,r]=C(1),n=e.plan.width;x(()=>{let c=t.current;if(c===null||typeof ResizeObserver>"u")return;let l=new ResizeObserver(()=>{let a=Math.min(c.clientWidth/n,1.4);r(d=>Math.abs(d-a)<.001?d:a)});return l.observe(c),()=>l.disconnect()},[n]);let s={width:e.plan.width,height:e.plan.height,transform:`scale(${o})`};return i("div",{ref:t,className:"po-viewport relative flex w-full min-w-0 items-center justify-center overflow-hidden",style:{height:"100%",minHeight:e.plan.height*o,"--po-name-w":e.compact===!0?"64px":"120px"},children:i("div",{className:"relative shrink-0",style:{width:e.plan.width*o,height:e.plan.height*o},children:i("div",{className:"po-stage absolute left-0 top-0 origin-top-left","data-office-room":"",role:"group","aria-label":e.ariaLabel,style:s,children:e.children})})})}var B=(e,t,o,r,n,s)=>i("div",{className:n,style:{left:e,top:t,width:o,height:r}},s);function Ce(e){return u(S,{children:[B(e.x-34,e.y+4,68,10,`po-desk-top${e.dark?" po-desk-dim":""}`,"top"),B(e.x-30,e.y+14,4,18,"po-desk-leg","leg-l"),B(e.x+26,e.y+14,4,18,"po-desk-leg","leg-r"),e.laptop?B(e.x-10,e.y-2,20,7,"po-laptop","laptop"):null]})}function Me(){return u(S,{children:[i("div",{className:"po-floor"}),i("div",{className:"po-wall"}),i("div",{className:"po-window",style:{left:300,top:28}}),i("div",{className:"po-window",style:{left:430,top:28}}),i("div",{className:"po-door"}),i("div",{className:"po-counter"}),i("div",{className:"po-coffee"}),i("div",{className:"po-couch"}),i("div",{className:"po-cooler"}),i("div",{className:"po-plant",style:{left:900,top:130}})]})}function Ne(e){let{t}=O();return u("div",{className:"po-board","data-office-board":"",children:[i("div",{className:"po-board-title",children:e.name}),u("div",{className:"po-board-row",children:[i("span",{className:"po-dot po-dot-todo"}),t("office.counts.todo",{count:e.counts.todo})]}),u("div",{className:"po-board-row",children:[i("span",{className:"po-dot po-dot-started"}),t("office.counts.started",{count:e.counts.started})]}),u("div",{className:"po-board-row",children:[i("span",{className:"po-dot po-dot-completed"}),t("office.counts.completed",{count:e.counts.completed})]}),u("div",{className:"po-board-row",children:[i("span",{className:"po-dot po-dot-cancelled"}),t("office.counts.cancelled",{count:e.counts.cancelled})]})]})}function _e(e){let{t}=O();return u(S,{children:[i("div",{className:`po-island${e.archived?" po-island-archived":""}`,style:lt(e)}),u("div",{className:`po-island-sign${e.archived?" po-island-sign-archived":""}`,style:{left:e.x+8,top:e.y-26},children:[i("span",{className:"po-island-name",children:e.name}),e.archived?i("span",{className:"po-island-badge",children:t("office.archived")}):null,u("span",{className:"po-island-count",children:[t("office.counts.started",{count:e.counts.started})," \xB7"," ",t("office.counts.completed",{count:e.counts.completed})]})]})]})}var lt=e=>({left:e.x,top:e.y,width:e.width,height:e.height});function We(e){let t=new Map,o=new Map,r=["waiting","idle","asleep","monitoring","queued"],n=new Map(r.map(a=>[a,0])),s=e.characters.filter(a=>a.role==="member");for(let[a,d]of s.entries())o.set(d.threadId,{x:150+a%6*130,y:330+Math.floor(a/6)*120});for(let a of e.characters){let d=n.get(a.status);a.role==="lead"&&o.set(a.threadId,{x:470,y:220}),a.status==="working"||a.status==="failed"?t.set(a.threadId,o.get(a.threadId)):d!==void 0?(t.set(a.threadId,dt(a.status,d)),n.set(a.status,d+1)):t.set(a.threadId,o.get(a.threadId))}let c=[...t.values(),...o.values()],l=Math.max(0,...c.map(a=>a.y));return{width:960,height:Math.max(540,l+70),positions:t,homeDesks:o}}var dt=(e,t)=>{switch(e){case"waiting":return{x:830,y:250+t*62};case"idle":return{x:100,y:260+t*58};case"asleep":return{x:100,y:430+t*50};case"monitoring":return{x:215,y:185+t*58};default:return{x:872,y:468+t*52}}},Ae=3,De=296,He=240,Ue=316,ut=24;function Be(e){let t=new Map,o=new Map,r=[],n=new Map;for(let c of e.characters){let l=n.get(c.lineId);l===void 0?n.set(c.lineId,[c]):l.push(c)}let s=156;for(let c=0;c<e.lines.length;c+=Ae){let a=e.lines.slice(c,c+Ae).map(m=>{let w=n.get(m.workLineId)??[],y=new Map,b=new Map,I=[],M=0;for(let h of w){if(h.role==="lead"){let E={x:De/2,y:72};y.set(h.threadId,E),b.set(h.threadId,E);continue}let p={x:58+M%3*90,y:150+Math.floor(M/3)*78};M+=1,y.set(h.threadId,p),h.status==="working"||h.status==="failed"?b.set(h.threadId,p):I.push(h.threadId)}let P=Math.max(0,...[...y.values()].map(h=>h.y)),N=Math.max(He-12,P+80);I.forEach((h,p)=>{b.set(h,{x:40+p%4*72,y:N+Math.floor(p/4)*60})});let q=Math.max(0,...[...b.values()].map(h=>h.y));return{line:m,desks:y,localPositions:b,height:Math.max(He,P+70,q+70)}}),d=Math.max(...a.map(m=>m.height)),f=(960-a.length*Ue)/2;a.forEach((m,w)=>{let y=f+w*Ue+10;r.push({line:m.line,x:y,y:s,width:De,height:d});for(let[b,I]of m.desks)o.set(b,{x:y+I.x,y:s+I.y});for(let[b,I]of m.localPositions)t.set(b,{x:y+I.x,y:s+I.y})}),s+=d+ut}return{islands:r,plan:{width:960,height:s+16,positions:t,homeDesks:o}}}var F=class{walks=new Map;handle=null;requestFrame;cancelFrame;schedule;cancelSchedule;animated;constructor(t={}){let o=t.requestFrame!==void 0||typeof requestAnimationFrame=="function";this.requestFrame=t.requestFrame??(r=>requestAnimationFrame(r)),this.cancelFrame=t.cancelFrame??(r=>cancelAnimationFrame(r)),this.schedule=t.schedule??(r=>Number(setTimeout(r,125))),this.cancelSchedule=t.cancelSchedule??(r=>clearTimeout(r)),this.animated=o}move(t,o,r,n){let s=this.walks.get(t),c=(s===void 0?r.x:s.toX+s.dx)-n.x,l=(s===void 0?r.y:s.toY+s.dy)-n.y,a=Math.max(Math.abs(c),Math.abs(l))<24;if(!this.animated||a){s!==void 0?this.finish(t):this.paintAt(o,0,0);return}this.walks.set(t,{element:o,dx:c,dy:l,toX:n.x,toY:n.y}),o.setAttribute("data-office-walking",""),this.paint(t),this.ensureLoop("raf")}stopAll(){this.clearHandle();let t=[...this.walks.keys()];for(let o of t)this.finish(o);this.walks.clear()}get isWalking(){return this.walks.size>0}clearHandle(){let t=this.handle;this.handle=null,t!==null&&(t.kind==="raf"?this.cancelFrame:this.cancelSchedule)(t.id)}ensureLoop(t){this.handle===null&&(this.handle=t==="raf"?{kind:"raf",id:this.requestFrame(()=>this.step())}:{kind:"timer",id:this.schedule(()=>{this.handle=null,this.ensureLoop("raf")})})}step(){this.handle=null;let t=[...this.walks.keys()];for(let o of t){let r=this.walks.get(o);r!==void 0&&(r.dx=Fe(r.dx),r.dy=Fe(r.dy),r.dx===0&&r.dy===0?this.finish(o):this.paint(o))}this.walks.size>0&&this.ensureLoop("timer")}finish(t){let o=this.walks.get(t);o!==void 0&&(this.walks.delete(t),o.element.removeAttribute("data-office-walking"),this.paintAt(o.element,0,0))}paint(t){let o=this.walks.get(t);o!==void 0&&this.paintAt(o.element,o.dx,o.dy)}paintAt(t,o,r){t.style.transform=o===0&&r===0?"translate(-50%, -100%)":`translate(-50%, -100%) translate(${o}px, ${r}px)`}},Fe=e=>{if(e===0)return 0;let t=Math.min(Math.abs(e),8);return e>0?e-t:e+t};function qe(e){let t=g(null);return t.current===null&&(t.current=new F),x(()=>{e||t.current?.stopAll()},[e]),x(()=>()=>t.current?.stopAll(),[]),t.current}function je(e){let t=k();return R(o=>{t.openThread({environmentId:e,threadId:o.threadId})},[t,e])}function Ve(e){return u(S,{children:[e.characters.map(t=>{let o=e.homeDesks.get(t.threadId);return o===void 0?null:i(Ce,{x:o.x,y:o.y,laptop:t.status==="working"&&e.positions.get(t.threadId)?.x===o.x&&e.positions.get(t.threadId)?.y===o.y,dark:e.archivedLine?.(t)===!0},`desk-${t.threadId}`)}),e.characters.map(t=>{let o=e.positions.get(t.threadId);return o===void 0?null:i(Ee,{character:t,slot:o,walker:e.walker,onOpen:e.onOpen},t.threadId)})]})}function ze(e){let t=v(()=>We(e.scene),[e.scene]),o=je(e.environmentId),r=qe(e.active);return u(Q,{plan:t,ariaLabel:e.scene.lines[0]?.name??"",children:[i(Me,{}),e.scene.lines[0]!==void 0?i(Ne,{name:e.scene.lines[0].name,counts:e.scene.lines[0].counts}):null,i(Ve,{characters:e.scene.characters,positions:t.positions,homeDesks:t.homeDesks,walker:r,onOpen:o})]})}function $e(e){let{t}=O(),{plan:o,islands:r}=v(()=>Be(e.scene),[e.scene]),n=je(e.environmentId),s=qe(e.active),c=R(l=>r.find(a=>a.line.workLineId===l.lineId)?.line.archived===!0,[r]);return u(Q,{plan:o,ariaLabel:t("office.floorLabel",{count:r.length}),compact:!0,children:[i("div",{className:"po-floor"}),r.map(l=>i(_e,{x:l.x,y:l.y,width:l.width,height:l.height,name:l.line.name,archived:l.line.archived,counts:l.line.counts},l.line.workLineId)),i(Ve,{characters:e.scene.characters,positions:o.positions,homeDesks:o.homeDesks,walker:s,onOpen:n,archivedLine:c})]})}var Ke=["working","waiting","monitoring","failed","idle","asleep","queued"];function pt(e){let{t}=O();return i("ul",{className:"flex flex-wrap items-center justify-center gap-x-4 gap-y-1 px-4 py-2","data-office-legend":"",children:[...e.statuses].toSorted((o,r)=>Ke.indexOf(o[0])-Ke.indexOf(r[0])).map(([o,r])=>u("li",{className:"flex items-center gap-1.5 text-ui-sm text-muted-foreground",children:[i("span",{className:`po-dot po-dot-${o}`}),t(`office.status.${o}`)," \xD7 ",r]},o))})}function Ge(e){let{t}=O(),o=ve(e),r=v(()=>{let n=new Map;for(let s of o.scene?.characters??[]){let c=s.status;n.set(c,(n.get(c)??0)+1)}return n},[o.scene]);return u("section",{className:"ycodium-pixel-office-ui flex w-full min-w-0 flex-1 flex-col","data-office-scope":e.scope,"data-office-active":e.active,children:[o.subscription,o.watchFailed?u("p",{className:"flex items-center justify-center gap-2 px-4 py-1 text-ui-xs text-warning-foreground",children:[t("office.watchFailed"),i(Y,{size:"sm",onClick:()=>{o.retryWatch()},children:t("office.retryWatch")})]}):null,o.scene===null?o.loadFailed?u(K,{className:"m-auto",children:[i(G,{children:i(X,{children:t("office.loadFailed")})}),i(Y,{onClick:()=>{o.reload()},children:t("office.reload")})]}):i("p",{className:"m-auto",children:t("office.loading")}):o.scene.lines.length===0?i(K,{className:"m-auto",children:i(G,{children:i(X,{children:t("office.noTeams")})})}):u(S,{children:[e.scope==="team"&&e.threadId===null?i("p",{className:"px-4 pt-2 text-ui-xs text-muted-foreground",children:t("office.threadDeleted")}):null,o.scene.characters.length===0?i("p",{className:"px-4 pt-2 text-ui-xs text-muted-foreground",children:t("office.emptyRoom")}):null,i("div",{className:"min-h-0 flex-1 overflow-y-auto",children:e.scope==="team"?i(ze,{environmentId:e.environmentId,scene:o.scene,active:e.active}):i($e,{environmentId:e.environmentId,scene:o.scene,active:e.active})}),r.size>0?i(pt,{statuses:r}):null]})]})}function ft(e){return{slots:[Z({key:"office",component:function(o){return u(ie,{value:e,children:[i("style",{children:ee}),i(Ge,{...o})]})}})]}}export{ft as default};
|