@crowdedkingdoms/crowdyjs 12.0.0 → 12.2.0
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/MIGRATION.md +45 -0
- package/README.md +70 -1
- package/dist/crowdy-studio/agent-dom-shell.d.ts +29 -1
- package/dist/crowdy-studio/agent-dom-shell.d.ts.map +1 -1
- package/dist/crowdy-studio/agent-dom-shell.js +108 -44
- package/dist/crowdy-studio/dom-shell.d.ts +46 -3
- package/dist/crowdy-studio/dom-shell.d.ts.map +1 -1
- package/dist/crowdy-studio/dom-shell.js +551 -125
- package/dist/crowdy-studio/embed/dock.d.ts +56 -0
- package/dist/crowdy-studio/embed/dock.d.ts.map +1 -0
- package/dist/crowdy-studio/embed/dock.js +231 -0
- package/dist/crowdy-studio/embed/embed-styles.d.ts +12 -0
- package/dist/crowdy-studio/embed/embed-styles.d.ts.map +1 -0
- package/dist/crowdy-studio/embed/embed-styles.js +549 -0
- package/dist/crowdy-studio/embed/hud-layer.d.ts +40 -0
- package/dist/crowdy-studio/embed/hud-layer.d.ts.map +1 -0
- package/dist/crowdy-studio/embed/hud-layer.js +100 -0
- package/dist/crowdy-studio/embed/index.d.ts +5 -0
- package/dist/crowdy-studio/embed/index.d.ts.map +1 -0
- package/dist/crowdy-studio/embed/index.js +4 -0
- package/dist/crowdy-studio/embed/panel.d.ts +162 -0
- package/dist/crowdy-studio/embed/panel.d.ts.map +1 -0
- package/dist/crowdy-studio/embed/panel.js +642 -0
- package/dist/crowdy-studio/index.d.ts +3 -0
- package/dist/crowdy-studio/index.d.ts.map +1 -1
- package/dist/crowdy-studio/index.js +3 -0
- package/dist/crowdy-studio/layout.d.ts +50 -0
- package/dist/crowdy-studio/layout.d.ts.map +1 -0
- package/dist/crowdy-studio/layout.js +155 -0
- package/dist/crowdy-studio/mount.d.ts.map +1 -1
- package/dist/crowdy-studio/mount.js +3 -1
- package/dist/crowdy-studio/splitter.d.ts +33 -0
- package/dist/crowdy-studio/splitter.d.ts.map +1 -0
- package/dist/crowdy-studio/splitter.js +133 -0
- package/dist/crowdy-studio/styles.d.ts +1 -1
- package/dist/crowdy-studio/styles.d.ts.map +1 -1
- package/dist/crowdy-studio/styles.js +128 -13
- package/dist/domains/gameModel.d.ts +68 -1
- package/dist/domains/gameModel.d.ts.map +1 -1
- package/dist/domains/gameModel.js +88 -1
- package/dist/generated/graphql.d.ts +132 -15
- package/dist/generated/graphql.d.ts.map +1 -1
- package/dist/generated/graphql.js +12 -0
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/kit/npcs.d.ts.map +1 -1
- package/dist/kit/social.d.ts.map +1 -1
- package/dist/player-host/control-banner.d.ts +40 -0
- package/dist/player-host/control-banner.d.ts.map +1 -0
- package/dist/player-host/control-banner.js +252 -0
- package/dist/player-host/control-gate.d.ts +77 -0
- package/dist/player-host/control-gate.d.ts.map +1 -0
- package/dist/player-host/control-gate.js +197 -0
- package/dist/player-host/index.d.ts +2 -0
- package/dist/player-host/index.d.ts.map +1 -1
- package/dist/player-host/index.js +2 -0
- package/package.json +6 -1
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* User-directed Crowdy Studio layout state: which panes are visible and how
|
|
3
|
+
* large they are. The editor is the only always-visible surface; the explorer,
|
|
4
|
+
* project settings, agent dock, and bottom panel are toggled by the person
|
|
5
|
+
* using the Studio and their choices persist locally.
|
|
6
|
+
*/
|
|
7
|
+
export type StudioPaneId = 'explorer' | 'settings' | 'agent' | 'bottom';
|
|
8
|
+
export interface StudioPaneSizeRange {
|
|
9
|
+
readonly min: number;
|
|
10
|
+
readonly max: number;
|
|
11
|
+
}
|
|
12
|
+
export interface StudioLayoutState {
|
|
13
|
+
readonly visible: Readonly<Record<StudioPaneId, boolean>>;
|
|
14
|
+
/** Pixel widths for side panes; pixel height for the bottom panel. */
|
|
15
|
+
readonly sizes: Readonly<Record<StudioPaneId, number>>;
|
|
16
|
+
}
|
|
17
|
+
export type StudioLayoutListener = (state: StudioLayoutState) => void;
|
|
18
|
+
export type StudioLayoutStorage = Pick<Storage, 'getItem' | 'setItem'>;
|
|
19
|
+
export interface StudioLayoutControllerOptions {
|
|
20
|
+
storage?: StudioLayoutStorage | null;
|
|
21
|
+
storageKey?: string;
|
|
22
|
+
defaults?: Partial<StudioLayoutState>;
|
|
23
|
+
}
|
|
24
|
+
export declare const STUDIO_LAYOUT_STORAGE_KEY = "ck:crowdy-studio:layout:v1";
|
|
25
|
+
export declare const STUDIO_PANE_IDS: readonly StudioPaneId[];
|
|
26
|
+
export declare function studioPaneSizeRange(pane: StudioPaneId): StudioPaneSizeRange;
|
|
27
|
+
export declare function clampStudioPaneSize(pane: StudioPaneId, size: number): number;
|
|
28
|
+
/**
|
|
29
|
+
* Headless layout state machine. DOM shells subscribe and translate the state
|
|
30
|
+
* into CSS variables / hidden attributes; tests drive it directly.
|
|
31
|
+
*/
|
|
32
|
+
export declare class StudioLayoutController {
|
|
33
|
+
private readonly storage;
|
|
34
|
+
private readonly storageKey;
|
|
35
|
+
private readonly listeners;
|
|
36
|
+
private visible;
|
|
37
|
+
private sizes;
|
|
38
|
+
constructor(options?: StudioLayoutControllerOptions);
|
|
39
|
+
getState(): StudioLayoutState;
|
|
40
|
+
isVisible(pane: StudioPaneId): boolean;
|
|
41
|
+
paneSize(pane: StudioPaneId): number;
|
|
42
|
+
subscribe(listener: StudioLayoutListener): () => void;
|
|
43
|
+
setVisible(pane: StudioPaneId, visible: boolean): void;
|
|
44
|
+
toggle(pane: StudioPaneId): void;
|
|
45
|
+
setSize(pane: StudioPaneId, size: number, persist?: boolean): void;
|
|
46
|
+
private emit;
|
|
47
|
+
private loadPersisted;
|
|
48
|
+
private persist;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../src/crowdy-studio/layout.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;AAExE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1D,sEAAsE;IACtE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;CACxD;AAED,MAAM,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;AAEtE,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,GAAG,SAAS,CAAC,CAAC;AAEvE,MAAM,WAAW,6BAA6B;IAC5C,OAAO,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACvC;AAED,eAAO,MAAM,yBAAyB,+BAA+B,CAAC;AAEtE,eAAO,MAAM,eAAe,EAAE,SAAS,YAAY,EAKlD,CAAC;AAuBF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,GAAG,mBAAmB,CAE3E;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAI5E;AAED;;;GAGG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IACrD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmC;IAC7D,OAAO,CAAC,OAAO,CAAgC;IAC/C,OAAO,CAAC,KAAK,CAA+B;gBAEhC,OAAO,GAAE,6BAAkC;IAevD,QAAQ,IAAI,iBAAiB;IAI7B,SAAS,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO;IAItC,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM;IAIpC,SAAS,CAAC,QAAQ,EAAE,oBAAoB,GAAG,MAAM,IAAI;IAOrD,UAAU,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAOtD,MAAM,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAIhC,OAAO,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,UAAO,GAAG,IAAI;IAW/D,OAAO,CAAC,IAAI;IAKZ,OAAO,CAAC,aAAa;IA6BrB,OAAO,CAAC,OAAO;CAWhB"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* User-directed Crowdy Studio layout state: which panes are visible and how
|
|
3
|
+
* large they are. The editor is the only always-visible surface; the explorer,
|
|
4
|
+
* project settings, agent dock, and bottom panel are toggled by the person
|
|
5
|
+
* using the Studio and their choices persist locally.
|
|
6
|
+
*/
|
|
7
|
+
export const STUDIO_LAYOUT_STORAGE_KEY = 'ck:crowdy-studio:layout:v1';
|
|
8
|
+
export const STUDIO_PANE_IDS = [
|
|
9
|
+
'explorer',
|
|
10
|
+
'settings',
|
|
11
|
+
'agent',
|
|
12
|
+
'bottom',
|
|
13
|
+
];
|
|
14
|
+
const DEFAULT_VISIBLE = {
|
|
15
|
+
explorer: true,
|
|
16
|
+
settings: false,
|
|
17
|
+
agent: false,
|
|
18
|
+
bottom: false,
|
|
19
|
+
};
|
|
20
|
+
const DEFAULT_SIZES = {
|
|
21
|
+
explorer: 230,
|
|
22
|
+
settings: 280,
|
|
23
|
+
agent: 340,
|
|
24
|
+
bottom: 180,
|
|
25
|
+
};
|
|
26
|
+
const SIZE_RANGES = {
|
|
27
|
+
explorer: { min: 160, max: 480 },
|
|
28
|
+
settings: { min: 220, max: 480 },
|
|
29
|
+
agent: { min: 280, max: 620 },
|
|
30
|
+
bottom: { min: 96, max: 480 },
|
|
31
|
+
};
|
|
32
|
+
export function studioPaneSizeRange(pane) {
|
|
33
|
+
return SIZE_RANGES[pane];
|
|
34
|
+
}
|
|
35
|
+
export function clampStudioPaneSize(pane, size) {
|
|
36
|
+
const range = SIZE_RANGES[pane];
|
|
37
|
+
if (!Number.isFinite(size))
|
|
38
|
+
return DEFAULT_SIZES[pane];
|
|
39
|
+
return Math.round(Math.min(range.max, Math.max(range.min, size)));
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Headless layout state machine. DOM shells subscribe and translate the state
|
|
43
|
+
* into CSS variables / hidden attributes; tests drive it directly.
|
|
44
|
+
*/
|
|
45
|
+
export class StudioLayoutController {
|
|
46
|
+
constructor(options = {}) {
|
|
47
|
+
this.listeners = new Set();
|
|
48
|
+
this.storage =
|
|
49
|
+
options.storage !== undefined ? options.storage : safeLocalStorage();
|
|
50
|
+
this.storageKey = options.storageKey ?? STUDIO_LAYOUT_STORAGE_KEY;
|
|
51
|
+
this.visible = { ...DEFAULT_VISIBLE, ...options.defaults?.visible };
|
|
52
|
+
this.sizes = { ...DEFAULT_SIZES };
|
|
53
|
+
if (options.defaults?.sizes) {
|
|
54
|
+
for (const pane of STUDIO_PANE_IDS) {
|
|
55
|
+
const size = options.defaults.sizes[pane];
|
|
56
|
+
if (size !== undefined)
|
|
57
|
+
this.sizes[pane] = clampStudioPaneSize(pane, size);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
this.loadPersisted();
|
|
61
|
+
}
|
|
62
|
+
getState() {
|
|
63
|
+
return { visible: { ...this.visible }, sizes: { ...this.sizes } };
|
|
64
|
+
}
|
|
65
|
+
isVisible(pane) {
|
|
66
|
+
return this.visible[pane];
|
|
67
|
+
}
|
|
68
|
+
paneSize(pane) {
|
|
69
|
+
return this.sizes[pane];
|
|
70
|
+
}
|
|
71
|
+
subscribe(listener) {
|
|
72
|
+
this.listeners.add(listener);
|
|
73
|
+
return () => {
|
|
74
|
+
this.listeners.delete(listener);
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
setVisible(pane, visible) {
|
|
78
|
+
if (this.visible[pane] === visible)
|
|
79
|
+
return;
|
|
80
|
+
this.visible = { ...this.visible, [pane]: visible };
|
|
81
|
+
this.persist();
|
|
82
|
+
this.emit();
|
|
83
|
+
}
|
|
84
|
+
toggle(pane) {
|
|
85
|
+
this.setVisible(pane, !this.visible[pane]);
|
|
86
|
+
}
|
|
87
|
+
setSize(pane, size, persist = true) {
|
|
88
|
+
const next = clampStudioPaneSize(pane, size);
|
|
89
|
+
if (this.sizes[pane] === next) {
|
|
90
|
+
if (persist)
|
|
91
|
+
this.persist();
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
this.sizes = { ...this.sizes, [pane]: next };
|
|
95
|
+
if (persist)
|
|
96
|
+
this.persist();
|
|
97
|
+
this.emit();
|
|
98
|
+
}
|
|
99
|
+
emit() {
|
|
100
|
+
const state = this.getState();
|
|
101
|
+
for (const listener of [...this.listeners])
|
|
102
|
+
listener(state);
|
|
103
|
+
}
|
|
104
|
+
loadPersisted() {
|
|
105
|
+
if (!this.storage)
|
|
106
|
+
return;
|
|
107
|
+
let raw = null;
|
|
108
|
+
try {
|
|
109
|
+
raw = this.storage.getItem(this.storageKey);
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
if (!raw)
|
|
115
|
+
return;
|
|
116
|
+
try {
|
|
117
|
+
const parsed = JSON.parse(raw);
|
|
118
|
+
if (typeof parsed !== 'object' || parsed === null)
|
|
119
|
+
return;
|
|
120
|
+
const record = parsed;
|
|
121
|
+
for (const pane of STUDIO_PANE_IDS) {
|
|
122
|
+
const visible = record.visible?.[pane];
|
|
123
|
+
if (typeof visible === 'boolean')
|
|
124
|
+
this.visible[pane] = visible;
|
|
125
|
+
const size = record.sizes?.[pane];
|
|
126
|
+
if (typeof size === 'number' && Number.isFinite(size)) {
|
|
127
|
+
this.sizes[pane] = clampStudioPaneSize(pane, size);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
// Ignore corrupt persisted layout; defaults remain in effect.
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
persist() {
|
|
136
|
+
if (!this.storage)
|
|
137
|
+
return;
|
|
138
|
+
try {
|
|
139
|
+
this.storage.setItem(this.storageKey, JSON.stringify({ visible: this.visible, sizes: this.sizes }));
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
// Storage can be unavailable (private mode); layout stays session-only.
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
function safeLocalStorage() {
|
|
147
|
+
try {
|
|
148
|
+
if (typeof window === 'undefined')
|
|
149
|
+
return null;
|
|
150
|
+
return window.localStorage;
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mount.d.ts","sourceRoot":"","sources":["../../src/crowdy-studio/mount.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,KAAK,6BAA6B,EACnC,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAGL,uBAAuB,EACvB,2BAA2B,EAE3B,KAAK,gCAAgC,EACrC,KAAK,oCAAoC,EAC1C,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,wBAAwB,EAExB,KAAK,iCAAiC,EACtC,KAAK,mBAAmB,EACzB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EACV,yBAAyB,EAEzB,sBAAsB,EACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EAEL,KAAK,+BAA+B,EACrC,MAAM,oBAAoB,CAAC;AAG5B,MAAM,WAAW,wBACf,SAAQ,6BAA6B,EACnC,+BAA+B;IACjC,6DAA6D;IAC7D,KAAK,CAAC,EAAE,6BAA6B,CAAC;CACvC;AAED,MAAM,WAAW,6BACf,SAAQ,IAAI,CACV,oCAAoC,EAClC,mBAAmB,GACnB,iBAAiB,GACjB,iBAAiB,GACjB,gBAAgB,GAChB,WAAW,GACX,uBAAuB,CAC1B;IACD,QAAQ,CAAC,EAAE,uBAAuB,CAAC;IACnC,qEAAqE;IACrE,eAAe,CAAC,EAAE,gCAAgC,CAAC;IACnD,UAAU,CAAC,EAAE,mBAAmB,CAAC;IACjC,WAAW,CAAC,EAAE,iCAAiC,CAAC;IAChD,cAAc,CAAC,EAAE,oCAAoC,CAAC,WAAW,CAAC,CAAC;IACnE,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,sBAAsB,CAAC;IACnC,KAAK,EAAE,2BAA2B,GAAG,IAAI,CAAC;IAC1C,mBAAmB,EAAE,wBAAwB,GAAG,IAAI,CAAC;IACrD,UAAU,EAAE,sBAAsB,CAAC;IACnC,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,WAAW,EACjB,aAAa,EAAE,MAAM,yBAAyB,GAAG,IAAI,GACpD,MAAM,IAAI,CAmBZ;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,kBAAkB,CAAC,
|
|
1
|
+
{"version":3,"file":"mount.d.ts","sourceRoot":"","sources":["../../src/crowdy-studio/mount.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,KAAK,6BAA6B,EACnC,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAGL,uBAAuB,EACvB,2BAA2B,EAE3B,KAAK,gCAAgC,EACrC,KAAK,oCAAoC,EAC1C,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,wBAAwB,EAExB,KAAK,iCAAiC,EACtC,KAAK,mBAAmB,EACzB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EACV,yBAAyB,EAEzB,sBAAsB,EACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EAEL,KAAK,+BAA+B,EACrC,MAAM,oBAAoB,CAAC;AAG5B,MAAM,WAAW,wBACf,SAAQ,6BAA6B,EACnC,+BAA+B;IACjC,6DAA6D;IAC7D,KAAK,CAAC,EAAE,6BAA6B,CAAC;CACvC;AAED,MAAM,WAAW,6BACf,SAAQ,IAAI,CACV,oCAAoC,EAClC,mBAAmB,GACnB,iBAAiB,GACjB,iBAAiB,GACjB,gBAAgB,GAChB,WAAW,GACX,uBAAuB,CAC1B;IACD,QAAQ,CAAC,EAAE,uBAAuB,CAAC;IACnC,qEAAqE;IACrE,eAAe,CAAC,EAAE,gCAAgC,CAAC;IACnD,UAAU,CAAC,EAAE,mBAAmB,CAAC;IACjC,WAAW,CAAC,EAAE,iCAAiC,CAAC;IAChD,cAAc,CAAC,EAAE,oCAAoC,CAAC,WAAW,CAAC,CAAC;IACnE,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,sBAAsB,CAAC;IACnC,KAAK,EAAE,2BAA2B,GAAG,IAAI,CAAC;IAC1C,mBAAmB,EAAE,wBAAwB,GAAG,IAAI,CAAC;IACrD,UAAU,EAAE,sBAAsB,CAAC;IACnC,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,WAAW,EACjB,aAAa,EAAE,MAAM,yBAAyB,GAAG,IAAI,GACpD,MAAM,IAAI,CAmBZ;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,kBAAkB,CAAC,CA+O7B"}
|
|
@@ -138,7 +138,9 @@ export async function mountCrowdyStudio(host, options) {
|
|
|
138
138
|
let editor = null;
|
|
139
139
|
let destroyed = false;
|
|
140
140
|
let recoveringEditor = false;
|
|
141
|
-
|
|
141
|
+
// Observe the editor box itself so pane toggles and splitter drags inside
|
|
142
|
+
// the studio relayout Monaco, not only host/window resizes.
|
|
143
|
+
const disconnectLayoutObserver = observeCrowdyStudioEditorLayout(shell.editorHost, () => editor);
|
|
142
144
|
const callbacks = {
|
|
143
145
|
onProjectFileChange: (target, path, content) => controller.updateFile(target, path, content),
|
|
144
146
|
onLocalDiagnostics: (diagnostics) => controller.setLocalDiagnostics(diagnostics),
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reusable accessible pane splitter for Crowdy Studio panes. Pointer drag plus
|
|
3
|
+
* Arrow/Home/End keyboard resizing, mirroring the behavior games already ship
|
|
4
|
+
* for the game/studio dock separator.
|
|
5
|
+
*/
|
|
6
|
+
export interface PaneSplitterRange {
|
|
7
|
+
readonly min: number;
|
|
8
|
+
readonly max: number;
|
|
9
|
+
}
|
|
10
|
+
export interface PaneSplitterOptions {
|
|
11
|
+
/** `vertical` separators resize widths; `horizontal` separators heights. */
|
|
12
|
+
orientation: 'vertical' | 'horizontal';
|
|
13
|
+
/**
|
|
14
|
+
* Where the sized pane sits relative to the separator in document order:
|
|
15
|
+
* `before` (explorer to its left / panel above) grows as the pointer moves
|
|
16
|
+
* right/down; `after` (right-hand or bottom panes) grows in the opposite
|
|
17
|
+
* direction.
|
|
18
|
+
*/
|
|
19
|
+
pane: 'before' | 'after';
|
|
20
|
+
label: string;
|
|
21
|
+
range(): PaneSplitterRange;
|
|
22
|
+
getSize(): number;
|
|
23
|
+
/** `commit` is true for the final size of a gesture (persist it). */
|
|
24
|
+
setSize(size: number, commit: boolean): void;
|
|
25
|
+
}
|
|
26
|
+
export interface PaneSplitterHandle {
|
|
27
|
+
readonly element: HTMLDivElement;
|
|
28
|
+
/** Re-sync ARIA values after external size or range changes. */
|
|
29
|
+
refresh(): void;
|
|
30
|
+
dispose(): void;
|
|
31
|
+
}
|
|
32
|
+
export declare function createPaneSplitter(options: PaneSplitterOptions): PaneSplitterHandle;
|
|
33
|
+
//# sourceMappingURL=splitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"splitter.d.ts","sourceRoot":"","sources":["../../src/crowdy-studio/splitter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,4EAA4E;IAC5E,WAAW,EAAE,UAAU,GAAG,YAAY,CAAC;IACvC;;;;;OAKG;IACH,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,IAAI,iBAAiB,CAAC;IAC3B,OAAO,IAAI,MAAM,CAAC;IAClB,qEAAqE;IACrE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;CAC9C;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,gEAAgE;IAChE,OAAO,IAAI,IAAI,CAAC;IAChB,OAAO,IAAI,IAAI,CAAC;CACjB;AAKD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,mBAAmB,GAC3B,kBAAkB,CAoIpB"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reusable accessible pane splitter for Crowdy Studio panes. Pointer drag plus
|
|
3
|
+
* Arrow/Home/End keyboard resizing, mirroring the behavior games already ship
|
|
4
|
+
* for the game/studio dock separator.
|
|
5
|
+
*/
|
|
6
|
+
const KEYBOARD_STEP_PX = 16;
|
|
7
|
+
const KEYBOARD_LARGE_STEP_PX = 48;
|
|
8
|
+
export function createPaneSplitter(options) {
|
|
9
|
+
const element = document.createElement('div');
|
|
10
|
+
element.className = 'ck-crowdy-studio-splitter';
|
|
11
|
+
element.dataset.orientation = options.orientation;
|
|
12
|
+
element.tabIndex = 0;
|
|
13
|
+
element.setAttribute('role', 'separator');
|
|
14
|
+
element.setAttribute('aria-orientation', options.orientation === 'vertical' ? 'vertical' : 'horizontal');
|
|
15
|
+
element.setAttribute('aria-label', options.label);
|
|
16
|
+
element.title =
|
|
17
|
+
options.orientation === 'vertical'
|
|
18
|
+
? `${options.label} (Left/Right arrows, Home/End)`
|
|
19
|
+
: `${options.label} (Up/Down arrows, Home/End)`;
|
|
20
|
+
let draggingPointerId = null;
|
|
21
|
+
let dragStartCoord = 0;
|
|
22
|
+
let dragStartSize = 0;
|
|
23
|
+
const direction = options.pane === 'before' ? 1 : -1;
|
|
24
|
+
const refresh = () => {
|
|
25
|
+
const range = options.range();
|
|
26
|
+
element.setAttribute('aria-valuemin', String(range.min));
|
|
27
|
+
element.setAttribute('aria-valuemax', String(range.max));
|
|
28
|
+
element.setAttribute('aria-valuenow', String(Math.round(options.getSize())));
|
|
29
|
+
};
|
|
30
|
+
const apply = (size, commit) => {
|
|
31
|
+
const range = options.range();
|
|
32
|
+
const next = Math.round(Math.min(range.max, Math.max(range.min, size)));
|
|
33
|
+
options.setSize(next, commit);
|
|
34
|
+
refresh();
|
|
35
|
+
};
|
|
36
|
+
const pointerCoord = (event) => options.orientation === 'vertical' ? event.clientX : event.clientY;
|
|
37
|
+
const pointerDown = (event) => {
|
|
38
|
+
if (event.button !== 0)
|
|
39
|
+
return;
|
|
40
|
+
event.preventDefault();
|
|
41
|
+
event.stopPropagation();
|
|
42
|
+
draggingPointerId = event.pointerId;
|
|
43
|
+
dragStartCoord = pointerCoord(event);
|
|
44
|
+
dragStartSize = options.getSize();
|
|
45
|
+
element.dataset.dragging = 'true';
|
|
46
|
+
try {
|
|
47
|
+
element.setPointerCapture(event.pointerId);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// Synthetic browser tests and older engines may not expose capture.
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
const pointerMove = (event) => {
|
|
54
|
+
if (event.pointerId !== draggingPointerId)
|
|
55
|
+
return;
|
|
56
|
+
event.preventDefault();
|
|
57
|
+
event.stopPropagation();
|
|
58
|
+
const delta = pointerCoord(event) - dragStartCoord;
|
|
59
|
+
apply(dragStartSize + direction * delta, false);
|
|
60
|
+
};
|
|
61
|
+
const pointerUp = (event) => {
|
|
62
|
+
if (event.pointerId !== draggingPointerId)
|
|
63
|
+
return;
|
|
64
|
+
event.preventDefault();
|
|
65
|
+
event.stopPropagation();
|
|
66
|
+
const delta = pointerCoord(event) - dragStartCoord;
|
|
67
|
+
apply(dragStartSize + direction * delta, true);
|
|
68
|
+
stopDragging();
|
|
69
|
+
};
|
|
70
|
+
const pointerCancel = (event) => {
|
|
71
|
+
if (event.pointerId !== draggingPointerId)
|
|
72
|
+
return;
|
|
73
|
+
event.stopPropagation();
|
|
74
|
+
apply(options.getSize(), true);
|
|
75
|
+
stopDragging();
|
|
76
|
+
};
|
|
77
|
+
const stopDragging = () => {
|
|
78
|
+
const pointerId = draggingPointerId;
|
|
79
|
+
draggingPointerId = null;
|
|
80
|
+
element.dataset.dragging = 'false';
|
|
81
|
+
if (pointerId === null)
|
|
82
|
+
return;
|
|
83
|
+
try {
|
|
84
|
+
if (element.hasPointerCapture(pointerId)) {
|
|
85
|
+
element.releasePointerCapture(pointerId);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// Capture is an enhancement; sizing does not depend on it.
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
const keyDown = (event) => {
|
|
93
|
+
const range = options.range();
|
|
94
|
+
const step = event.shiftKey ? KEYBOARD_LARGE_STEP_PX : KEYBOARD_STEP_PX;
|
|
95
|
+
const grow = options.orientation === 'vertical' ? 'ArrowRight' : 'ArrowDown';
|
|
96
|
+
const shrink = options.orientation === 'vertical' ? 'ArrowLeft' : 'ArrowUp';
|
|
97
|
+
let next = null;
|
|
98
|
+
if (event.code === grow)
|
|
99
|
+
next = options.getSize() + direction * step;
|
|
100
|
+
else if (event.code === shrink)
|
|
101
|
+
next = options.getSize() - direction * step;
|
|
102
|
+
else if (event.code === 'Home')
|
|
103
|
+
next = range.min;
|
|
104
|
+
else if (event.code === 'End')
|
|
105
|
+
next = range.max;
|
|
106
|
+
if (next === null)
|
|
107
|
+
return;
|
|
108
|
+
event.preventDefault();
|
|
109
|
+
event.stopPropagation();
|
|
110
|
+
apply(next, true);
|
|
111
|
+
};
|
|
112
|
+
element.addEventListener('pointerdown', pointerDown);
|
|
113
|
+
element.addEventListener('pointermove', pointerMove);
|
|
114
|
+
element.addEventListener('pointerup', pointerUp);
|
|
115
|
+
element.addEventListener('pointercancel', pointerCancel);
|
|
116
|
+
element.addEventListener('lostpointercapture', pointerCancel);
|
|
117
|
+
element.addEventListener('keydown', keyDown);
|
|
118
|
+
refresh();
|
|
119
|
+
return {
|
|
120
|
+
element,
|
|
121
|
+
refresh,
|
|
122
|
+
dispose() {
|
|
123
|
+
stopDragging();
|
|
124
|
+
element.removeEventListener('pointerdown', pointerDown);
|
|
125
|
+
element.removeEventListener('pointermove', pointerMove);
|
|
126
|
+
element.removeEventListener('pointerup', pointerUp);
|
|
127
|
+
element.removeEventListener('pointercancel', pointerCancel);
|
|
128
|
+
element.removeEventListener('lostpointercapture', pointerCancel);
|
|
129
|
+
element.removeEventListener('keydown', keyDown);
|
|
130
|
+
element.remove();
|
|
131
|
+
},
|
|
132
|
+
};
|
|
133
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const CROWDY_STUDIO_STYLES = "\n.ck-crowdy-studio{--ck-bg:#111827;--ck-panel:#182235;--ck-line:#334155;--ck-text:#e5e7eb;--ck-muted:#94a3b8;--ck-accent:#38bdf8;container-type:inline-size;display:grid;grid-template-rows:auto auto minmax(240px,1fr) minmax(120px,.36fr);width:100%;height:100%;min-height:0;overflow:hidden;background:var(--ck-bg);color:var(--ck-text);font:13px/1.4 ui-sans-serif,system-ui,sans-serif;border:1px solid var(--ck-line)}\n.ck-crowdy-studio *{box-sizing:border-box}.ck-crowdy-studio button,.ck-crowdy-studio input,.ck-crowdy-studio select,.ck-crowdy-studio textarea{font:inherit}.ck-crowdy-studio button,.ck-crowdy-studio select,.ck-crowdy-studio input{background:#0f172a;color:var(--ck-text);border:1px solid var(--ck-line);border-radius:4px;padding:5px 8px}.ck-crowdy-studio button{cursor:pointer}.ck-crowdy-studio button:hover{border-color:var(--ck-accent)}.ck-crowdy-studio button:disabled{opacity:.5;cursor:not-allowed}\n.ck-crowdy-studio-toolbar,.ck-crowdy-studio-actions,.ck-crowdy-studio-tabs,.ck-crowdy-studio-panel-tabs{display:flex;align-items:center;gap:6px;padding:7px;border-bottom:1px solid var(--ck-line)}.ck-crowdy-studio-toolbar{justify-content:space-between;flex-wrap:wrap}.ck-crowdy-studio-project-tools,.ck-crowdy-studio-runtime-tools{display:flex;align-items:center;gap:6px;flex-wrap:wrap}\n.ck-crowdy-studio-save[data-state=SAVED]{color:#86efac}.ck-crowdy-studio-save[data-state=SAVING]{color:#fde68a}.ck-crowdy-studio-save[data-state=CONFLICT]{color:#fca5a5}.ck-crowdy-studio-save[data-state=OFFLINE]{color:#fdba74}\n.ck-crowdy-studio-main{display:grid;grid-template-columns:230px minmax(0,1fr) 260px;min-height:0}.ck-crowdy-studio-explorer,.ck-crowdy-studio-settings{background:var(--ck-panel);overflow:auto;padding:8px}.ck-crowdy-studio-explorer{border-right:1px solid var(--ck-line)}.ck-crowdy-studio-settings{border-left:1px solid var(--ck-line)}.ck-crowdy-studio-editor-column{display:grid;grid-template-rows:auto minmax(0,1fr);min-width:0}\n.ck-crowdy-studio-editor{min-height:0;position:relative}.ck-crowdy-studio-textarea{width:100%;height:100%;min-height:0;resize:none;background:#0b1020;color:var(--ck-text);border:0;padding:12px;font:13px/1.5 ui-monospace,SFMono-Regular,Consolas,monospace}.ck-crowdy-studio-editor-notice{padding:4px 8px;background:#78350f;color:#ffedd5}\n.ck-crowdy-studio-section{margin-bottom:12px}.ck-crowdy-studio-section-header{display:flex;align-items:center;justify-content:space-between;color:var(--ck-muted);font-weight:700;text-transform:uppercase;font-size:11px;margin-bottom:4px}.ck-crowdy-studio-file{display:grid;grid-template-columns:minmax(0,1fr) auto auto;gap:3px;align-items:center}.ck-crowdy-studio-file>button:first-child{text-align:left;overflow:hidden;text-overflow:ellipsis;border:0;background:transparent}.ck-crowdy-studio-file>button:not(:first-child){padding:1px 4px}\n.ck-crowdy-studio-tabs{padding:4px;overflow:auto}.ck-crowdy-studio-tab[data-active=true],.ck-crowdy-studio-panel-tab[data-active=true]{border-color:var(--ck-accent);color:#bae6fd}.ck-crowdy-studio-tab{white-space:nowrap}.ck-crowdy-studio-tab span{margin-left:7px;color:var(--ck-muted)}\n.ck-crowdy-studio-settings label{display:grid;gap:3px;margin-bottom:9px;color:var(--ck-muted)}.ck-crowdy-studio-settings input,.ck-crowdy-studio-settings select{width:100%}.ck-crowdy-studio-new{display:none;gap:6px;align-items:center;width:100%;padding:7px;border-bottom:1px solid var(--ck-line)}.ck-crowdy-studio-new[data-open=true]{display:flex}.ck-crowdy-studio-new input{flex:1}\n.ck-crowdy-studio-bottom{display:grid;grid-template-rows:auto minmax(0,1fr);min-height:0;border-top:1px solid var(--ck-line)}.ck-crowdy-studio-panel{display:none;overflow:auto;padding:8px}.ck-crowdy-studio-panel[data-active=true]{display:block}.ck-crowdy-studio-panel pre{white-space:pre-wrap;margin:0;font:12px/1.5 ui-monospace,SFMono-Regular,Consolas,monospace}.ck-crowdy-studio-problem{display:grid;grid-template-columns:auto auto 1fr;gap:8px;padding:3px;border-bottom:1px solid #243247}.ck-crowdy-studio-problem[data-source=rustc]{color:#fecaca}.ck-crowdy-studio-problem[data-source=local-advisory]{color:#fde68a}\n.ck-crowdy-studio-status{color:var(--ck-muted)}.ck-crowdy-studio-invoke{display:grid;grid-template-columns:180px 1fr auto;gap:6px}.ck-crowdy-studio-invoke textarea{min-height:70px;background:#0f172a;color:var(--ck-text);border:1px solid var(--ck-line)}.ck-crowdy-studio-empty{color:var(--ck-muted);padding:8px}\n.ck-crowdy-studio[data-agent=true]{grid-template-columns:minmax(0,1fr) minmax(300px,380px)}.ck-crowdy-studio[data-agent=true]>.ck-crowdy-studio-toolbar,.ck-crowdy-studio[data-agent=true]>.ck-crowdy-studio-new,.ck-crowdy-studio[data-agent=true]>.ck-crowdy-studio-main,.ck-crowdy-studio[data-agent=true]>.ck-crowdy-studio-bottom{grid-column:1}.ck-crowdy-studio-agent-dock{grid-column:2;grid-row:1/-1;display:flex;flex-direction:column;gap:8px;min-width:0;min-height:0;padding:10px;border-left:1px solid var(--ck-line);background:#0b1220;overflow:auto}.ck-crowdy-studio-agent-dock header{display:flex;align-items:center;justify-content:space-between;gap:8px}.ck-crowdy-studio-agent-dock h2,.ck-crowdy-studio-agent-dock h3{margin:0;font-size:13px}.ck-crowdy-studio-agent-status,.ck-crowdy-studio-agent-budget,.ck-crowdy-studio-agent-lease{color:var(--ck-muted);font-size:12px}.ck-crowdy-studio-agent-modes,.ck-crowdy-studio-agent-controls{display:flex;gap:5px;flex-wrap:wrap}.ck-crowdy-studio-agent-modes button[data-active=true]{border-color:var(--ck-accent);color:#bae6fd}.ck-crowdy-studio-agent-stop{border-color:#ef4444!important;color:#fecaca!important}.ck-crowdy-studio-agent-lease-controls{display:flex;gap:6px;flex-wrap:wrap;margin:0;padding:7px;border:1px solid var(--ck-line)}.ck-crowdy-studio-agent-lease-controls legend{color:var(--ck-muted)}.ck-crowdy-studio-agent-lease-controls label{display:flex;gap:3px;align-items:center}.ck-crowdy-studio-agent-messages{display:flex;flex-direction:column;gap:6px;min-height:90px;max-height:260px;overflow:auto}.ck-crowdy-studio-agent-message,.ck-crowdy-studio-agent-stream,.ck-crowdy-studio-agent-approval,.ck-crowdy-studio-agent-diff,.ck-crowdy-studio-agent-checkpoint{padding:7px;border:1px solid var(--ck-line);border-radius:5px;background:var(--ck-panel)}.ck-crowdy-studio-agent-message[data-role=USER]{border-color:#155e75}.ck-crowdy-studio-agent-message p,.ck-crowdy-studio-agent-approval p,.ck-crowdy-studio-agent-diff p,.ck-crowdy-studio-agent-checkpoint p{margin:3px 0;white-space:pre-wrap;overflow-wrap:anywhere}.ck-crowdy-studio-agent-timeline{display:grid;gap:5px;margin:0;padding-left:22px;max-height:190px;overflow:auto}.ck-crowdy-studio-agent-timeline li{padding:4px;border-bottom:1px solid #243247}.ck-crowdy-studio-agent-timeline li>span{margin-left:6px;color:var(--ck-muted)}.ck-crowdy-studio-agent-approvals,.ck-crowdy-studio-agent-checkpoints{display:grid;gap:7px}.ck-crowdy-studio-agent-approval{border-color:#f59e0b}.ck-crowdy-studio-agent-approval code{display:block;overflow-wrap:anywhere;color:#fde68a}.ck-crowdy-studio-agent-approval>div{display:flex;gap:6px}.ck-crowdy-studio-agent-composer{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:6px;margin-top:auto}.ck-crowdy-studio-agent-composer textarea{min-height:62px;resize:vertical;background:#0f172a;color:var(--ck-text);border:1px solid var(--ck-line);padding:7px}.ck-crowdy-studio :focus-visible{outline:2px solid var(--ck-accent);outline-offset:2px}\n@container(max-width:900px){.ck-crowdy-studio-main{grid-template-columns:180px minmax(0,1fr)}.ck-crowdy-studio-settings{display:none}}@container(max-width:620px){.ck-crowdy-studio-main{grid-template-columns:1fr}.ck-crowdy-studio-explorer{display:none}}\n@container(max-width:760px){.ck-crowdy-studio[data-agent=true]{grid-template-columns:1fr;grid-template-rows:auto auto minmax(240px,1fr) minmax(120px,.36fr) minmax(300px,.7fr);overflow:auto}.ck-crowdy-studio[data-agent=true]>.ck-crowdy-studio-agent-dock{grid-column:1;grid-row:5;border-left:0;border-top:1px solid var(--ck-line)}}\n";
|
|
1
|
+
export declare const CROWDY_STUDIO_STYLES = "\n.ck-crowdy-studio{--ck-bg:#111827;--ck-panel:#182235;--ck-line:#334155;--ck-text:#e5e7eb;--ck-muted:#94a3b8;--ck-accent:#38bdf8;container-type:inline-size;display:flex;flex-direction:column;position:relative;isolation:isolate;width:100%;height:100%;min-height:0;overflow:hidden;background:var(--ck-bg);color:var(--ck-text);font:13px/1.4 ui-sans-serif,system-ui,sans-serif;border:1px solid var(--ck-line)}\n.ck-crowdy-studio *{box-sizing:border-box}.ck-crowdy-studio button,.ck-crowdy-studio input,.ck-crowdy-studio select,.ck-crowdy-studio textarea{font:inherit}.ck-crowdy-studio button,.ck-crowdy-studio select,.ck-crowdy-studio input{background:#0f172a;color:var(--ck-text);border:1px solid var(--ck-line);border-radius:4px;padding:5px 8px}.ck-crowdy-studio button{cursor:pointer}.ck-crowdy-studio button:hover{border-color:var(--ck-accent)}.ck-crowdy-studio button:disabled{opacity:.5;cursor:not-allowed}\n.ck-crowdy-studio [hidden]{display:none!important}\n\n/* Top bar */\n.ck-crowdy-studio-toolbar{display:flex;align-items:center;justify-content:space-between;gap:6px;padding:6px 8px;border-bottom:1px solid var(--ck-line);position:relative;z-index:30}\n.ck-crowdy-studio-project-tools,.ck-crowdy-studio-runtime-tools{display:flex;align-items:center;gap:6px;min-width:0}\n.ck-crowdy-studio-primary{border-color:var(--ck-accent);color:#bae6fd}\n.ck-crowdy-studio-save{color:var(--ck-muted)}\n.ck-crowdy-studio-save[data-state=SAVED]{color:#86efac}.ck-crowdy-studio-save[data-state=SAVING]{color:#fde68a}.ck-crowdy-studio-save[data-state=CONFLICT]{color:#fca5a5;border-color:#f87171}.ck-crowdy-studio-save[data-state=OFFLINE]{color:#fdba74;border-color:#fb923c}\n.ck-crowdy-studio-save-message{margin:0;padding:4px 6px;color:var(--ck-muted);max-width:280px}\n.ck-crowdy-studio-save-actions{display:flex;gap:6px;padding:4px 6px}\n\n/* Menus */\n.ck-crowdy-studio-menu-wrap{position:relative;display:inline-flex;min-width:0}\n.ck-crowdy-studio-menu-button{max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.ck-crowdy-studio-menu{position:absolute;top:calc(100% + 4px);left:0;z-index:40;min-width:180px;max-width:320px;max-height:60vh;overflow:auto;display:flex;flex-direction:column;background:var(--ck-panel);border:1px solid var(--ck-line);border-radius:6px;padding:4px;box-shadow:0 8px 24px rgba(2,6,23,.55)}\n.ck-crowdy-studio-runtime-tools .ck-crowdy-studio-menu{left:auto;right:0}\n.ck-crowdy-studio-menu-item{display:block;width:100%;text-align:left;background:transparent;border:0;border-radius:4px;padding:6px 8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.ck-crowdy-studio-menu-item:hover{background:#0f172a;border:0}\n.ck-crowdy-studio-menu-item[data-active=true]{color:#bae6fd}\n.ck-crowdy-studio-menu-divider{border-top:1px solid var(--ck-line);margin:4px 2px}\n\n/* New-project popover */\n.ck-crowdy-studio-new{display:none;position:absolute;top:100%;left:8px;z-index:35;gap:6px;align-items:center;padding:8px;background:var(--ck-panel);border:1px solid var(--ck-line);border-radius:6px;box-shadow:0 8px 24px rgba(2,6,23,.55)}\n.ck-crowdy-studio-new[data-open=true]{display:flex}\n.ck-crowdy-studio-new input{flex:1;min-width:160px}\n\n/* Workspace: rail + panes + editor */\n.ck-crowdy-studio-workspace{display:flex;flex:1;min-height:0;min-width:0;position:relative}\n.ck-crowdy-studio-rail{display:flex;flex-direction:column;gap:4px;padding:6px 3px;border-right:1px solid var(--ck-line);background:#0b1220}\n.ck-crowdy-studio-rail-button{writing-mode:vertical-rl;padding:8px 4px;background:transparent;border:1px solid transparent;color:var(--ck-muted);border-radius:4px}\n.ck-crowdy-studio-rail-button:hover{color:var(--ck-text)}\n.ck-crowdy-studio-rail-button[aria-pressed=true]{color:#bae6fd;border-color:var(--ck-line);background:#0f172a}\n.ck-crowdy-studio-explorer,.ck-crowdy-studio-settings{flex:none;background:var(--ck-panel);overflow:auto;padding:8px;min-width:0}\n.ck-crowdy-studio-settings{border-left:1px solid var(--ck-line)}\n.ck-crowdy-studio-settings h3{margin:0 0 8px}\n.ck-crowdy-studio-editor-column{display:flex;flex-direction:column;flex:1;min-width:240px;min-height:0}\n.ck-crowdy-studio-editor{flex:1;min-height:80px;position:relative}\n.ck-crowdy-studio-textarea{width:100%;height:100%;min-height:0;resize:none;background:#0b1020;color:var(--ck-text);border:0;padding:12px;font:13px/1.5 ui-monospace,SFMono-Regular,Consolas,monospace}\n.ck-crowdy-studio-editor-notice{padding:4px 8px;background:#78350f;color:#ffedd5}\n\n/* Splitters */\n.ck-crowdy-studio-splitter{flex:none;background:transparent;position:relative;z-index:5}\n.ck-crowdy-studio-splitter[data-orientation=vertical]{width:6px;cursor:col-resize}\n.ck-crowdy-studio-splitter[data-orientation=horizontal]{height:6px;cursor:row-resize}\n.ck-crowdy-studio-splitter:hover,.ck-crowdy-studio-splitter[data-dragging=true]{background:var(--ck-accent);opacity:.5}\n\n/* Explorer */\n.ck-crowdy-studio-section{margin-bottom:12px}\n.ck-crowdy-studio-section-header{display:flex;align-items:center;justify-content:space-between;color:var(--ck-muted);font-weight:700;text-transform:uppercase;font-size:11px;margin-bottom:4px}\n.ck-crowdy-studio-file{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:3px;align-items:center}\n.ck-crowdy-studio-file>button:first-child{text-align:left;overflow:hidden;text-overflow:ellipsis;border:0;background:transparent}\n.ck-crowdy-studio-file-action{padding:1px 6px}\n.ck-crowdy-studio-file .ck-crowdy-studio-menu{left:auto;right:0;min-width:130px}\n.ck-crowdy-studio-inline-form{display:flex;flex-wrap:wrap;gap:4px;margin:4px 0;padding:6px;border:1px solid var(--ck-line);border-radius:4px;background:#0f172a}\n.ck-crowdy-studio-inline-form input{flex:1 1 100%;min-width:0}\n.ck-crowdy-studio-file-form-row{display:flex;flex-wrap:wrap;gap:4px;align-items:center;margin:4px 0;padding:6px;border:1px solid #f59e0b66;border-radius:4px}\n\n/* Editor tabs */\n.ck-crowdy-studio-tabs{display:flex;align-items:center;gap:6px;padding:4px;border-bottom:1px solid var(--ck-line);overflow:auto}\n.ck-crowdy-studio-tab{white-space:nowrap}\n.ck-crowdy-studio-tab[data-active=true],.ck-crowdy-studio-panel-tab[data-active=true]{border-color:var(--ck-accent);color:#bae6fd}\n.ck-crowdy-studio-tab span{margin-left:7px;color:var(--ck-muted)}\n\n/* Settings */\n.ck-crowdy-studio-settings label{display:grid;gap:3px;margin-bottom:9px;color:var(--ck-muted)}\n.ck-crowdy-studio-settings input,.ck-crowdy-studio-settings select{width:100%}\n\n/* Bottom panel */\n.ck-crowdy-studio-bottom{flex:none;display:flex;flex-direction:column;min-height:0;border-top:1px solid var(--ck-line)}\n.ck-crowdy-studio-panel-tabs{display:flex;align-items:center;gap:6px;padding:5px 7px;border-bottom:1px solid var(--ck-line)}\n.ck-crowdy-studio-panel-hide{margin-left:auto;padding:1px 7px;color:var(--ck-muted)}\n.ck-crowdy-studio-panel-body{flex:1;min-height:0;display:flex;flex-direction:column}\n.ck-crowdy-studio-panel{display:none;flex:1;overflow:auto;padding:8px}\n.ck-crowdy-studio-panel[data-active=true]{display:block}\n.ck-crowdy-studio-panel pre{white-space:pre-wrap;margin:0;font:12px/1.5 ui-monospace,SFMono-Regular,Consolas,monospace}\n.ck-crowdy-studio-problem{display:grid;grid-template-columns:auto auto 1fr;gap:8px;padding:3px;border-bottom:1px solid #243247;width:100%;text-align:left;background:transparent;border-left:0;border-right:0;border-top:0;border-radius:0}\n.ck-crowdy-studio-problem[data-source=rustc]{color:#fecaca}\n.ck-crowdy-studio-problem[data-source=local-advisory]{color:#fde68a}\n.ck-crowdy-studio-invoke{display:grid;grid-template-columns:180px 1fr auto;gap:6px}\n.ck-crowdy-studio-invoke textarea{min-height:70px;background:#0f172a;color:var(--ck-text);border:1px solid var(--ck-line)}\n.ck-crowdy-studio-empty{color:var(--ck-muted);padding:8px}\n\n/* Status bar */\n.ck-crowdy-studio-statusbar{display:flex;align-items:center;gap:14px;padding:3px 10px;border-top:1px solid var(--ck-line);background:#0b1220;font-size:12px;min-height:24px}\n.ck-crowdy-studio-status{color:var(--ck-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.ck-crowdy-studio-statusbar-runtime{background:transparent;border:0;padding:1px 4px;border-radius:3px}\n.ck-crowdy-studio-statusbar-runtime:hover{color:var(--ck-text)}\n.ck-crowdy-studio-statusbar-runtime[data-phase=RUNNING]{color:#86efac}\n.ck-crowdy-studio-statusbar-runtime[data-phase=COMPILING],.ck-crowdy-studio-statusbar-runtime[data-phase=TESTING_DRAFT],.ck-crowdy-studio-statusbar-runtime[data-phase=DEPLOYING_LIVE],.ck-crowdy-studio-statusbar-runtime[data-phase=ENABLING]{color:#fde68a}\n.ck-crowdy-studio-statusbar-runtime[data-phase=COMPILE_FAILED],.ck-crowdy-studio-statusbar-runtime[data-phase=ERROR],.ck-crowdy-studio-statusbar-runtime[data-phase=PARTIAL_FAILURE]{color:#fca5a5}\n\n/* Agent dock */\n.ck-crowdy-studio-agent-dock{flex:none;display:flex;flex-direction:column;gap:8px;min-width:0;min-height:0;padding:10px;border-left:1px solid var(--ck-line);background:#0b1220;overflow:auto}\n.ck-crowdy-studio-agent-dock header{display:flex;align-items:center;justify-content:space-between;gap:8px}\n.ck-crowdy-studio-agent-dock h2,.ck-crowdy-studio-agent-dock h3{margin:0;font-size:13px}\n.ck-crowdy-studio-agent-status,.ck-crowdy-studio-agent-budget,.ck-crowdy-studio-agent-lease{color:var(--ck-muted);font-size:12px}\n.ck-crowdy-studio-agent-lease[data-active=true]{color:#fde68a;border:1px solid #f59e0b;border-radius:5px;padding:6px}\n.ck-crowdy-studio-agent-controls-row{display:flex;align-items:center;justify-content:space-between;gap:6px;flex-wrap:wrap}\n.ck-crowdy-studio-agent-modes,.ck-crowdy-studio-agent-controls{display:flex;gap:5px;flex-wrap:wrap}\n.ck-crowdy-studio-agent-modes button[data-active=true]{border-color:var(--ck-accent);color:#bae6fd}\n.ck-crowdy-studio-agent-stop{border-color:#ef4444!important;color:#fecaca!important}\n.ck-crowdy-studio-agent-disclosure{border:1px solid var(--ck-line);border-radius:5px;padding:0}\n.ck-crowdy-studio-agent-disclosure>summary{cursor:pointer;padding:6px 8px;color:var(--ck-muted)}\n.ck-crowdy-studio-agent-disclosure[open]>summary{border-bottom:1px solid var(--ck-line);color:var(--ck-text)}\n.ck-crowdy-studio-agent-disclosure>:not(summary){padding:6px 8px}\n.ck-crowdy-studio-agent-lease-controls{display:flex;gap:6px;flex-wrap:wrap;margin:0;padding:7px;border:1px solid var(--ck-line)}\n.ck-crowdy-studio-agent-lease-controls legend{color:var(--ck-muted)}\n.ck-crowdy-studio-agent-lease-controls label{display:flex;gap:3px;align-items:center}\n.ck-crowdy-studio-agent-messages{display:flex;flex-direction:column;gap:6px;flex:1;min-height:120px;overflow:auto}\n.ck-crowdy-studio-agent-message,.ck-crowdy-studio-agent-stream,.ck-crowdy-studio-agent-approval,.ck-crowdy-studio-agent-diff,.ck-crowdy-studio-agent-checkpoint{padding:7px;border:1px solid var(--ck-line);border-radius:5px;background:var(--ck-panel)}\n.ck-crowdy-studio-agent-message[data-role=USER]{border-color:#155e75}\n.ck-crowdy-studio-agent-message p,.ck-crowdy-studio-agent-approval p,.ck-crowdy-studio-agent-diff p,.ck-crowdy-studio-agent-checkpoint p{margin:3px 0;white-space:pre-wrap;overflow-wrap:anywhere}\n.ck-crowdy-studio-agent-timeline{display:grid;gap:5px;margin:0;padding-left:22px;max-height:190px;overflow:auto}\n.ck-crowdy-studio-agent-timeline li{padding:4px;border-bottom:1px solid #243247}\n.ck-crowdy-studio-agent-timeline li>span{margin-left:6px;color:var(--ck-muted)}\n.ck-crowdy-studio-agent-approvals,.ck-crowdy-studio-agent-checkpoints{display:grid;gap:7px}\n.ck-crowdy-studio-agent-approval{border-color:#f59e0b}\n.ck-crowdy-studio-agent-approval code{display:block;overflow-wrap:anywhere;color:#fde68a}\n.ck-crowdy-studio-agent-approval>div{display:flex;gap:6px}\n.ck-crowdy-studio-agent-composer{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:6px}\n.ck-crowdy-studio-agent-composer textarea{min-height:62px;resize:vertical;background:#0f172a;color:var(--ck-text);border:1px solid var(--ck-line);padding:7px}\n.ck-crowdy-studio :focus-visible{outline:2px solid var(--ck-accent);outline-offset:2px}\n\n/* Narrow widths: side panes become overlays so the editor keeps priority. */\n@container(max-width:900px){.ck-crowdy-studio-settings{position:absolute;right:0;top:0;bottom:0;z-index:20;max-width:85%;border-left:1px solid var(--ck-line);box-shadow:-8px 0 24px rgba(2,6,23,.55)}.ck-crowdy-studio-splitter[data-orientation=vertical]{display:none}}\n@container(max-width:760px){.ck-crowdy-studio-agent-dock{position:absolute;right:0;top:0;bottom:0;z-index:22;max-width:92%;box-shadow:-8px 0 24px rgba(2,6,23,.55)}}\n@container(max-width:620px){.ck-crowdy-studio-explorer{position:absolute;left:34px;top:0;bottom:0;z-index:21;max-width:85%;border-right:1px solid var(--ck-line);box-shadow:8px 0 24px rgba(2,6,23,.55)}}\n";
|
|
2
2
|
//# sourceMappingURL=styles.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/crowdy-studio/styles.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,
|
|
1
|
+
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/crowdy-studio/styles.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,2iZAkIhC,CAAC"}
|
|
@@ -1,16 +1,131 @@
|
|
|
1
1
|
export const CROWDY_STUDIO_STYLES = `
|
|
2
|
-
.ck-crowdy-studio{--ck-bg:#111827;--ck-panel:#182235;--ck-line:#334155;--ck-text:#e5e7eb;--ck-muted:#94a3b8;--ck-accent:#38bdf8;container-type:inline-size;display:
|
|
2
|
+
.ck-crowdy-studio{--ck-bg:#111827;--ck-panel:#182235;--ck-line:#334155;--ck-text:#e5e7eb;--ck-muted:#94a3b8;--ck-accent:#38bdf8;container-type:inline-size;display:flex;flex-direction:column;position:relative;isolation:isolate;width:100%;height:100%;min-height:0;overflow:hidden;background:var(--ck-bg);color:var(--ck-text);font:13px/1.4 ui-sans-serif,system-ui,sans-serif;border:1px solid var(--ck-line)}
|
|
3
3
|
.ck-crowdy-studio *{box-sizing:border-box}.ck-crowdy-studio button,.ck-crowdy-studio input,.ck-crowdy-studio select,.ck-crowdy-studio textarea{font:inherit}.ck-crowdy-studio button,.ck-crowdy-studio select,.ck-crowdy-studio input{background:#0f172a;color:var(--ck-text);border:1px solid var(--ck-line);border-radius:4px;padding:5px 8px}.ck-crowdy-studio button{cursor:pointer}.ck-crowdy-studio button:hover{border-color:var(--ck-accent)}.ck-crowdy-studio button:disabled{opacity:.5;cursor:not-allowed}
|
|
4
|
-
.ck-crowdy-studio
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
.ck-crowdy-studio-
|
|
8
|
-
.ck-crowdy-studio-
|
|
9
|
-
.ck-crowdy-studio-
|
|
10
|
-
.ck-crowdy-studio-
|
|
11
|
-
.ck-crowdy-studio-
|
|
12
|
-
.ck-crowdy-studio-
|
|
13
|
-
.ck-crowdy-studio
|
|
14
|
-
|
|
15
|
-
|
|
4
|
+
.ck-crowdy-studio [hidden]{display:none!important}
|
|
5
|
+
|
|
6
|
+
/* Top bar */
|
|
7
|
+
.ck-crowdy-studio-toolbar{display:flex;align-items:center;justify-content:space-between;gap:6px;padding:6px 8px;border-bottom:1px solid var(--ck-line);position:relative;z-index:30}
|
|
8
|
+
.ck-crowdy-studio-project-tools,.ck-crowdy-studio-runtime-tools{display:flex;align-items:center;gap:6px;min-width:0}
|
|
9
|
+
.ck-crowdy-studio-primary{border-color:var(--ck-accent);color:#bae6fd}
|
|
10
|
+
.ck-crowdy-studio-save{color:var(--ck-muted)}
|
|
11
|
+
.ck-crowdy-studio-save[data-state=SAVED]{color:#86efac}.ck-crowdy-studio-save[data-state=SAVING]{color:#fde68a}.ck-crowdy-studio-save[data-state=CONFLICT]{color:#fca5a5;border-color:#f87171}.ck-crowdy-studio-save[data-state=OFFLINE]{color:#fdba74;border-color:#fb923c}
|
|
12
|
+
.ck-crowdy-studio-save-message{margin:0;padding:4px 6px;color:var(--ck-muted);max-width:280px}
|
|
13
|
+
.ck-crowdy-studio-save-actions{display:flex;gap:6px;padding:4px 6px}
|
|
14
|
+
|
|
15
|
+
/* Menus */
|
|
16
|
+
.ck-crowdy-studio-menu-wrap{position:relative;display:inline-flex;min-width:0}
|
|
17
|
+
.ck-crowdy-studio-menu-button{max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
18
|
+
.ck-crowdy-studio-menu{position:absolute;top:calc(100% + 4px);left:0;z-index:40;min-width:180px;max-width:320px;max-height:60vh;overflow:auto;display:flex;flex-direction:column;background:var(--ck-panel);border:1px solid var(--ck-line);border-radius:6px;padding:4px;box-shadow:0 8px 24px rgba(2,6,23,.55)}
|
|
19
|
+
.ck-crowdy-studio-runtime-tools .ck-crowdy-studio-menu{left:auto;right:0}
|
|
20
|
+
.ck-crowdy-studio-menu-item{display:block;width:100%;text-align:left;background:transparent;border:0;border-radius:4px;padding:6px 8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
21
|
+
.ck-crowdy-studio-menu-item:hover{background:#0f172a;border:0}
|
|
22
|
+
.ck-crowdy-studio-menu-item[data-active=true]{color:#bae6fd}
|
|
23
|
+
.ck-crowdy-studio-menu-divider{border-top:1px solid var(--ck-line);margin:4px 2px}
|
|
24
|
+
|
|
25
|
+
/* New-project popover */
|
|
26
|
+
.ck-crowdy-studio-new{display:none;position:absolute;top:100%;left:8px;z-index:35;gap:6px;align-items:center;padding:8px;background:var(--ck-panel);border:1px solid var(--ck-line);border-radius:6px;box-shadow:0 8px 24px rgba(2,6,23,.55)}
|
|
27
|
+
.ck-crowdy-studio-new[data-open=true]{display:flex}
|
|
28
|
+
.ck-crowdy-studio-new input{flex:1;min-width:160px}
|
|
29
|
+
|
|
30
|
+
/* Workspace: rail + panes + editor */
|
|
31
|
+
.ck-crowdy-studio-workspace{display:flex;flex:1;min-height:0;min-width:0;position:relative}
|
|
32
|
+
.ck-crowdy-studio-rail{display:flex;flex-direction:column;gap:4px;padding:6px 3px;border-right:1px solid var(--ck-line);background:#0b1220}
|
|
33
|
+
.ck-crowdy-studio-rail-button{writing-mode:vertical-rl;padding:8px 4px;background:transparent;border:1px solid transparent;color:var(--ck-muted);border-radius:4px}
|
|
34
|
+
.ck-crowdy-studio-rail-button:hover{color:var(--ck-text)}
|
|
35
|
+
.ck-crowdy-studio-rail-button[aria-pressed=true]{color:#bae6fd;border-color:var(--ck-line);background:#0f172a}
|
|
36
|
+
.ck-crowdy-studio-explorer,.ck-crowdy-studio-settings{flex:none;background:var(--ck-panel);overflow:auto;padding:8px;min-width:0}
|
|
37
|
+
.ck-crowdy-studio-settings{border-left:1px solid var(--ck-line)}
|
|
38
|
+
.ck-crowdy-studio-settings h3{margin:0 0 8px}
|
|
39
|
+
.ck-crowdy-studio-editor-column{display:flex;flex-direction:column;flex:1;min-width:240px;min-height:0}
|
|
40
|
+
.ck-crowdy-studio-editor{flex:1;min-height:80px;position:relative}
|
|
41
|
+
.ck-crowdy-studio-textarea{width:100%;height:100%;min-height:0;resize:none;background:#0b1020;color:var(--ck-text);border:0;padding:12px;font:13px/1.5 ui-monospace,SFMono-Regular,Consolas,monospace}
|
|
42
|
+
.ck-crowdy-studio-editor-notice{padding:4px 8px;background:#78350f;color:#ffedd5}
|
|
43
|
+
|
|
44
|
+
/* Splitters */
|
|
45
|
+
.ck-crowdy-studio-splitter{flex:none;background:transparent;position:relative;z-index:5}
|
|
46
|
+
.ck-crowdy-studio-splitter[data-orientation=vertical]{width:6px;cursor:col-resize}
|
|
47
|
+
.ck-crowdy-studio-splitter[data-orientation=horizontal]{height:6px;cursor:row-resize}
|
|
48
|
+
.ck-crowdy-studio-splitter:hover,.ck-crowdy-studio-splitter[data-dragging=true]{background:var(--ck-accent);opacity:.5}
|
|
49
|
+
|
|
50
|
+
/* Explorer */
|
|
51
|
+
.ck-crowdy-studio-section{margin-bottom:12px}
|
|
52
|
+
.ck-crowdy-studio-section-header{display:flex;align-items:center;justify-content:space-between;color:var(--ck-muted);font-weight:700;text-transform:uppercase;font-size:11px;margin-bottom:4px}
|
|
53
|
+
.ck-crowdy-studio-file{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:3px;align-items:center}
|
|
54
|
+
.ck-crowdy-studio-file>button:first-child{text-align:left;overflow:hidden;text-overflow:ellipsis;border:0;background:transparent}
|
|
55
|
+
.ck-crowdy-studio-file-action{padding:1px 6px}
|
|
56
|
+
.ck-crowdy-studio-file .ck-crowdy-studio-menu{left:auto;right:0;min-width:130px}
|
|
57
|
+
.ck-crowdy-studio-inline-form{display:flex;flex-wrap:wrap;gap:4px;margin:4px 0;padding:6px;border:1px solid var(--ck-line);border-radius:4px;background:#0f172a}
|
|
58
|
+
.ck-crowdy-studio-inline-form input{flex:1 1 100%;min-width:0}
|
|
59
|
+
.ck-crowdy-studio-file-form-row{display:flex;flex-wrap:wrap;gap:4px;align-items:center;margin:4px 0;padding:6px;border:1px solid #f59e0b66;border-radius:4px}
|
|
60
|
+
|
|
61
|
+
/* Editor tabs */
|
|
62
|
+
.ck-crowdy-studio-tabs{display:flex;align-items:center;gap:6px;padding:4px;border-bottom:1px solid var(--ck-line);overflow:auto}
|
|
63
|
+
.ck-crowdy-studio-tab{white-space:nowrap}
|
|
64
|
+
.ck-crowdy-studio-tab[data-active=true],.ck-crowdy-studio-panel-tab[data-active=true]{border-color:var(--ck-accent);color:#bae6fd}
|
|
65
|
+
.ck-crowdy-studio-tab span{margin-left:7px;color:var(--ck-muted)}
|
|
66
|
+
|
|
67
|
+
/* Settings */
|
|
68
|
+
.ck-crowdy-studio-settings label{display:grid;gap:3px;margin-bottom:9px;color:var(--ck-muted)}
|
|
69
|
+
.ck-crowdy-studio-settings input,.ck-crowdy-studio-settings select{width:100%}
|
|
70
|
+
|
|
71
|
+
/* Bottom panel */
|
|
72
|
+
.ck-crowdy-studio-bottom{flex:none;display:flex;flex-direction:column;min-height:0;border-top:1px solid var(--ck-line)}
|
|
73
|
+
.ck-crowdy-studio-panel-tabs{display:flex;align-items:center;gap:6px;padding:5px 7px;border-bottom:1px solid var(--ck-line)}
|
|
74
|
+
.ck-crowdy-studio-panel-hide{margin-left:auto;padding:1px 7px;color:var(--ck-muted)}
|
|
75
|
+
.ck-crowdy-studio-panel-body{flex:1;min-height:0;display:flex;flex-direction:column}
|
|
76
|
+
.ck-crowdy-studio-panel{display:none;flex:1;overflow:auto;padding:8px}
|
|
77
|
+
.ck-crowdy-studio-panel[data-active=true]{display:block}
|
|
78
|
+
.ck-crowdy-studio-panel pre{white-space:pre-wrap;margin:0;font:12px/1.5 ui-monospace,SFMono-Regular,Consolas,monospace}
|
|
79
|
+
.ck-crowdy-studio-problem{display:grid;grid-template-columns:auto auto 1fr;gap:8px;padding:3px;border-bottom:1px solid #243247;width:100%;text-align:left;background:transparent;border-left:0;border-right:0;border-top:0;border-radius:0}
|
|
80
|
+
.ck-crowdy-studio-problem[data-source=rustc]{color:#fecaca}
|
|
81
|
+
.ck-crowdy-studio-problem[data-source=local-advisory]{color:#fde68a}
|
|
82
|
+
.ck-crowdy-studio-invoke{display:grid;grid-template-columns:180px 1fr auto;gap:6px}
|
|
83
|
+
.ck-crowdy-studio-invoke textarea{min-height:70px;background:#0f172a;color:var(--ck-text);border:1px solid var(--ck-line)}
|
|
84
|
+
.ck-crowdy-studio-empty{color:var(--ck-muted);padding:8px}
|
|
85
|
+
|
|
86
|
+
/* Status bar */
|
|
87
|
+
.ck-crowdy-studio-statusbar{display:flex;align-items:center;gap:14px;padding:3px 10px;border-top:1px solid var(--ck-line);background:#0b1220;font-size:12px;min-height:24px}
|
|
88
|
+
.ck-crowdy-studio-status{color:var(--ck-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
89
|
+
.ck-crowdy-studio-statusbar-runtime{background:transparent;border:0;padding:1px 4px;border-radius:3px}
|
|
90
|
+
.ck-crowdy-studio-statusbar-runtime:hover{color:var(--ck-text)}
|
|
91
|
+
.ck-crowdy-studio-statusbar-runtime[data-phase=RUNNING]{color:#86efac}
|
|
92
|
+
.ck-crowdy-studio-statusbar-runtime[data-phase=COMPILING],.ck-crowdy-studio-statusbar-runtime[data-phase=TESTING_DRAFT],.ck-crowdy-studio-statusbar-runtime[data-phase=DEPLOYING_LIVE],.ck-crowdy-studio-statusbar-runtime[data-phase=ENABLING]{color:#fde68a}
|
|
93
|
+
.ck-crowdy-studio-statusbar-runtime[data-phase=COMPILE_FAILED],.ck-crowdy-studio-statusbar-runtime[data-phase=ERROR],.ck-crowdy-studio-statusbar-runtime[data-phase=PARTIAL_FAILURE]{color:#fca5a5}
|
|
94
|
+
|
|
95
|
+
/* Agent dock */
|
|
96
|
+
.ck-crowdy-studio-agent-dock{flex:none;display:flex;flex-direction:column;gap:8px;min-width:0;min-height:0;padding:10px;border-left:1px solid var(--ck-line);background:#0b1220;overflow:auto}
|
|
97
|
+
.ck-crowdy-studio-agent-dock header{display:flex;align-items:center;justify-content:space-between;gap:8px}
|
|
98
|
+
.ck-crowdy-studio-agent-dock h2,.ck-crowdy-studio-agent-dock h3{margin:0;font-size:13px}
|
|
99
|
+
.ck-crowdy-studio-agent-status,.ck-crowdy-studio-agent-budget,.ck-crowdy-studio-agent-lease{color:var(--ck-muted);font-size:12px}
|
|
100
|
+
.ck-crowdy-studio-agent-lease[data-active=true]{color:#fde68a;border:1px solid #f59e0b;border-radius:5px;padding:6px}
|
|
101
|
+
.ck-crowdy-studio-agent-controls-row{display:flex;align-items:center;justify-content:space-between;gap:6px;flex-wrap:wrap}
|
|
102
|
+
.ck-crowdy-studio-agent-modes,.ck-crowdy-studio-agent-controls{display:flex;gap:5px;flex-wrap:wrap}
|
|
103
|
+
.ck-crowdy-studio-agent-modes button[data-active=true]{border-color:var(--ck-accent);color:#bae6fd}
|
|
104
|
+
.ck-crowdy-studio-agent-stop{border-color:#ef4444!important;color:#fecaca!important}
|
|
105
|
+
.ck-crowdy-studio-agent-disclosure{border:1px solid var(--ck-line);border-radius:5px;padding:0}
|
|
106
|
+
.ck-crowdy-studio-agent-disclosure>summary{cursor:pointer;padding:6px 8px;color:var(--ck-muted)}
|
|
107
|
+
.ck-crowdy-studio-agent-disclosure[open]>summary{border-bottom:1px solid var(--ck-line);color:var(--ck-text)}
|
|
108
|
+
.ck-crowdy-studio-agent-disclosure>:not(summary){padding:6px 8px}
|
|
109
|
+
.ck-crowdy-studio-agent-lease-controls{display:flex;gap:6px;flex-wrap:wrap;margin:0;padding:7px;border:1px solid var(--ck-line)}
|
|
110
|
+
.ck-crowdy-studio-agent-lease-controls legend{color:var(--ck-muted)}
|
|
111
|
+
.ck-crowdy-studio-agent-lease-controls label{display:flex;gap:3px;align-items:center}
|
|
112
|
+
.ck-crowdy-studio-agent-messages{display:flex;flex-direction:column;gap:6px;flex:1;min-height:120px;overflow:auto}
|
|
113
|
+
.ck-crowdy-studio-agent-message,.ck-crowdy-studio-agent-stream,.ck-crowdy-studio-agent-approval,.ck-crowdy-studio-agent-diff,.ck-crowdy-studio-agent-checkpoint{padding:7px;border:1px solid var(--ck-line);border-radius:5px;background:var(--ck-panel)}
|
|
114
|
+
.ck-crowdy-studio-agent-message[data-role=USER]{border-color:#155e75}
|
|
115
|
+
.ck-crowdy-studio-agent-message p,.ck-crowdy-studio-agent-approval p,.ck-crowdy-studio-agent-diff p,.ck-crowdy-studio-agent-checkpoint p{margin:3px 0;white-space:pre-wrap;overflow-wrap:anywhere}
|
|
116
|
+
.ck-crowdy-studio-agent-timeline{display:grid;gap:5px;margin:0;padding-left:22px;max-height:190px;overflow:auto}
|
|
117
|
+
.ck-crowdy-studio-agent-timeline li{padding:4px;border-bottom:1px solid #243247}
|
|
118
|
+
.ck-crowdy-studio-agent-timeline li>span{margin-left:6px;color:var(--ck-muted)}
|
|
119
|
+
.ck-crowdy-studio-agent-approvals,.ck-crowdy-studio-agent-checkpoints{display:grid;gap:7px}
|
|
120
|
+
.ck-crowdy-studio-agent-approval{border-color:#f59e0b}
|
|
121
|
+
.ck-crowdy-studio-agent-approval code{display:block;overflow-wrap:anywhere;color:#fde68a}
|
|
122
|
+
.ck-crowdy-studio-agent-approval>div{display:flex;gap:6px}
|
|
123
|
+
.ck-crowdy-studio-agent-composer{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:6px}
|
|
124
|
+
.ck-crowdy-studio-agent-composer textarea{min-height:62px;resize:vertical;background:#0f172a;color:var(--ck-text);border:1px solid var(--ck-line);padding:7px}
|
|
125
|
+
.ck-crowdy-studio :focus-visible{outline:2px solid var(--ck-accent);outline-offset:2px}
|
|
126
|
+
|
|
127
|
+
/* Narrow widths: side panes become overlays so the editor keeps priority. */
|
|
128
|
+
@container(max-width:900px){.ck-crowdy-studio-settings{position:absolute;right:0;top:0;bottom:0;z-index:20;max-width:85%;border-left:1px solid var(--ck-line);box-shadow:-8px 0 24px rgba(2,6,23,.55)}.ck-crowdy-studio-splitter[data-orientation=vertical]{display:none}}
|
|
129
|
+
@container(max-width:760px){.ck-crowdy-studio-agent-dock{position:absolute;right:0;top:0;bottom:0;z-index:22;max-width:92%;box-shadow:-8px 0 24px rgba(2,6,23,.55)}}
|
|
130
|
+
@container(max-width:620px){.ck-crowdy-studio-explorer{position:absolute;left:34px;top:0;bottom:0;z-index:21;max-width:85%;border-right:1px solid var(--ck-line);box-shadow:8px 0 24px rgba(2,6,23,.55)}}
|
|
16
131
|
`;
|