@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.
Files changed (58) hide show
  1. package/MIGRATION.md +45 -0
  2. package/README.md +70 -1
  3. package/dist/crowdy-studio/agent-dom-shell.d.ts +29 -1
  4. package/dist/crowdy-studio/agent-dom-shell.d.ts.map +1 -1
  5. package/dist/crowdy-studio/agent-dom-shell.js +108 -44
  6. package/dist/crowdy-studio/dom-shell.d.ts +46 -3
  7. package/dist/crowdy-studio/dom-shell.d.ts.map +1 -1
  8. package/dist/crowdy-studio/dom-shell.js +551 -125
  9. package/dist/crowdy-studio/embed/dock.d.ts +56 -0
  10. package/dist/crowdy-studio/embed/dock.d.ts.map +1 -0
  11. package/dist/crowdy-studio/embed/dock.js +231 -0
  12. package/dist/crowdy-studio/embed/embed-styles.d.ts +12 -0
  13. package/dist/crowdy-studio/embed/embed-styles.d.ts.map +1 -0
  14. package/dist/crowdy-studio/embed/embed-styles.js +549 -0
  15. package/dist/crowdy-studio/embed/hud-layer.d.ts +40 -0
  16. package/dist/crowdy-studio/embed/hud-layer.d.ts.map +1 -0
  17. package/dist/crowdy-studio/embed/hud-layer.js +100 -0
  18. package/dist/crowdy-studio/embed/index.d.ts +5 -0
  19. package/dist/crowdy-studio/embed/index.d.ts.map +1 -0
  20. package/dist/crowdy-studio/embed/index.js +4 -0
  21. package/dist/crowdy-studio/embed/panel.d.ts +162 -0
  22. package/dist/crowdy-studio/embed/panel.d.ts.map +1 -0
  23. package/dist/crowdy-studio/embed/panel.js +642 -0
  24. package/dist/crowdy-studio/index.d.ts +3 -0
  25. package/dist/crowdy-studio/index.d.ts.map +1 -1
  26. package/dist/crowdy-studio/index.js +3 -0
  27. package/dist/crowdy-studio/layout.d.ts +50 -0
  28. package/dist/crowdy-studio/layout.d.ts.map +1 -0
  29. package/dist/crowdy-studio/layout.js +155 -0
  30. package/dist/crowdy-studio/mount.d.ts.map +1 -1
  31. package/dist/crowdy-studio/mount.js +3 -1
  32. package/dist/crowdy-studio/splitter.d.ts +33 -0
  33. package/dist/crowdy-studio/splitter.d.ts.map +1 -0
  34. package/dist/crowdy-studio/splitter.js +133 -0
  35. package/dist/crowdy-studio/styles.d.ts +1 -1
  36. package/dist/crowdy-studio/styles.d.ts.map +1 -1
  37. package/dist/crowdy-studio/styles.js +128 -13
  38. package/dist/domains/gameModel.d.ts +68 -1
  39. package/dist/domains/gameModel.d.ts.map +1 -1
  40. package/dist/domains/gameModel.js +88 -1
  41. package/dist/generated/graphql.d.ts +132 -15
  42. package/dist/generated/graphql.d.ts.map +1 -1
  43. package/dist/generated/graphql.js +12 -0
  44. package/dist/index.d.ts +4 -4
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +3 -3
  47. package/dist/kit/npcs.d.ts.map +1 -1
  48. package/dist/kit/social.d.ts.map +1 -1
  49. package/dist/player-host/control-banner.d.ts +40 -0
  50. package/dist/player-host/control-banner.d.ts.map +1 -0
  51. package/dist/player-host/control-banner.js +252 -0
  52. package/dist/player-host/control-gate.d.ts +77 -0
  53. package/dist/player-host/control-gate.d.ts.map +1 -0
  54. package/dist/player-host/control-gate.js +197 -0
  55. package/dist/player-host/index.d.ts +2 -0
  56. package/dist/player-host/index.d.ts.map +1 -1
  57. package/dist/player-host/index.js +2 -0
  58. package/package.json +6 -1
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Accessible splitter and persisted width state for the game/studio embed
3
+ * dock. Layout ownership stays with the embed panel through the width
4
+ * callback: the dock only decides "how wide", never "where".
5
+ *
6
+ * Ported from the proven Blocks with Friends dock so every game embedding
7
+ * Crowdy Studio gets the same keyboard/pointer resize semantics.
8
+ */
9
+ export declare const CROWDY_STUDIO_EMBED_NARROW_BREAKPOINT_PX = 1000;
10
+ export declare const CROWDY_STUDIO_EMBED_DEFAULT_DOCK_RATIO = 0.52;
11
+ export declare const CROWDY_STUDIO_EMBED_MIN_DOCK_WIDTH_PX = 480;
12
+ export declare const CROWDY_STUDIO_EMBED_MIN_GAME_WIDTH_PX = 420;
13
+ export declare const CROWDY_STUDIO_EMBED_SPLITTER_WIDTH_PX = 10;
14
+ export declare const CROWDY_STUDIO_EMBED_DOCK_WIDTH_STORAGE_KEY = "ck:crowdy-studio:embed:dock-width:v1";
15
+ export interface CrowdyStudioEmbedDockWidthRange {
16
+ min: number;
17
+ max: number;
18
+ }
19
+ export type CrowdyStudioEmbedDockStorage = Pick<Storage, 'getItem' | 'setItem'>;
20
+ /**
21
+ * Width bounds for the right-hand studio dock. The desktop breakpoint ensures
22
+ * these minimums do not conflict in normal use; the defensive Math.min keeps
23
+ * direct callers safe in unusually small test or embedded viewports.
24
+ */
25
+ export declare function crowdyStudioEmbedDockWidthRange(viewportWidth?: number): CrowdyStudioEmbedDockWidthRange;
26
+ export declare function clampCrowdyStudioEmbedDockWidth(width: number, viewportWidth?: number): number;
27
+ export declare class CrowdyStudioEmbedDock {
28
+ private readonly onWidthChange;
29
+ private readonly storage;
30
+ readonly separator: HTMLDivElement;
31
+ private preferredWidth;
32
+ private currentWidth;
33
+ private active;
34
+ private draggingPointerId;
35
+ constructor(onWidthChange: (width: number) => void, storage?: CrowdyStudioEmbedDockStorage | null);
36
+ get width(): number;
37
+ activate(): void;
38
+ deactivate(): void;
39
+ /** Re-clamp the preferred width after a viewport resize. */
40
+ refresh(): void;
41
+ destroy(): void;
42
+ private applyPreferredWidth;
43
+ private setPreferredWidth;
44
+ private updateAria;
45
+ private readonly keyDown;
46
+ private readonly pointerDown;
47
+ private readonly pointerMove;
48
+ private readonly pointerUp;
49
+ private readonly pointerCancel;
50
+ private stopDragging;
51
+ private loadPersistedWidth;
52
+ private persistWidth;
53
+ }
54
+ export declare function addBodyClass(name: string): void;
55
+ export declare function removeBodyClass(...names: readonly string[]): void;
56
+ //# sourceMappingURL=dock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dock.d.ts","sourceRoot":"","sources":["../../../src/crowdy-studio/embed/dock.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,eAAO,MAAM,wCAAwC,OAAQ,CAAC;AAC9D,eAAO,MAAM,sCAAsC,OAAO,CAAC;AAC3D,eAAO,MAAM,qCAAqC,MAAM,CAAC;AACzD,eAAO,MAAM,qCAAqC,MAAM,CAAC;AACzD,eAAO,MAAM,qCAAqC,KAAK,CAAC;AACxD,eAAO,MAAM,0CAA0C,yCACf,CAAC;AAKzC,MAAM,WAAW,+BAA+B;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,MAAM,4BAA4B,GAAG,IAAI,CAC7C,OAAO,EACP,SAAS,GAAG,SAAS,CACtB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC7C,aAAa,SAAoB,GAChC,+BAA+B,CASjC;AAED,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,MAAM,EACb,aAAa,SAAoB,GAChC,MAAM,CAGR;AAED,qBAAa,qBAAqB;IAQ9B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAR1B,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,iBAAiB,CAAuB;gBAG7B,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EACtC,OAAO,GAAE,4BAA4B,GAAG,IAAyB;IAwBpF,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,QAAQ,IAAI,IAAI;IAMhB,UAAU,IAAI,IAAI;IAMlB,4DAA4D;IAC5D,OAAO,IAAI,IAAI;IAQf,OAAO,IAAI,IAAI;IAcf,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAatB;IAEF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAa1B;IAEF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAK1B;IAEF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAMxB;IAEF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAK5B;IAEF,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,YAAY;CAYrB;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAM/C;AAED,wBAAgB,eAAe,CAAC,GAAG,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAMjE"}
@@ -0,0 +1,231 @@
1
+ /**
2
+ * Accessible splitter and persisted width state for the game/studio embed
3
+ * dock. Layout ownership stays with the embed panel through the width
4
+ * callback: the dock only decides "how wide", never "where".
5
+ *
6
+ * Ported from the proven Blocks with Friends dock so every game embedding
7
+ * Crowdy Studio gets the same keyboard/pointer resize semantics.
8
+ */
9
+ export const CROWDY_STUDIO_EMBED_NARROW_BREAKPOINT_PX = 1000;
10
+ export const CROWDY_STUDIO_EMBED_DEFAULT_DOCK_RATIO = 0.52;
11
+ export const CROWDY_STUDIO_EMBED_MIN_DOCK_WIDTH_PX = 480;
12
+ export const CROWDY_STUDIO_EMBED_MIN_GAME_WIDTH_PX = 420;
13
+ export const CROWDY_STUDIO_EMBED_SPLITTER_WIDTH_PX = 10;
14
+ export const CROWDY_STUDIO_EMBED_DOCK_WIDTH_STORAGE_KEY = 'ck:crowdy-studio:embed:dock-width:v1';
15
+ const KEYBOARD_STEP_PX = 16;
16
+ const KEYBOARD_LARGE_STEP_PX = 48;
17
+ /**
18
+ * Width bounds for the right-hand studio dock. The desktop breakpoint ensures
19
+ * these minimums do not conflict in normal use; the defensive Math.min keeps
20
+ * direct callers safe in unusually small test or embedded viewports.
21
+ */
22
+ export function crowdyStudioEmbedDockWidthRange(viewportWidth = window.innerWidth) {
23
+ const max = Math.max(CROWDY_STUDIO_EMBED_SPLITTER_WIDTH_PX, Math.floor(viewportWidth - CROWDY_STUDIO_EMBED_MIN_GAME_WIDTH_PX));
24
+ return {
25
+ min: Math.min(CROWDY_STUDIO_EMBED_MIN_DOCK_WIDTH_PX, max),
26
+ max,
27
+ };
28
+ }
29
+ export function clampCrowdyStudioEmbedDockWidth(width, viewportWidth = window.innerWidth) {
30
+ const range = crowdyStudioEmbedDockWidthRange(viewportWidth);
31
+ return Math.round(Math.min(range.max, Math.max(range.min, width)));
32
+ }
33
+ export class CrowdyStudioEmbedDock {
34
+ constructor(onWidthChange, storage = safeLocalStorage()) {
35
+ this.onWidthChange = onWidthChange;
36
+ this.storage = storage;
37
+ this.currentWidth = 0;
38
+ this.active = false;
39
+ this.draggingPointerId = null;
40
+ this.keyDown = (event) => {
41
+ if (!this.active)
42
+ return;
43
+ const range = crowdyStudioEmbedDockWidthRange();
44
+ const step = event.shiftKey ? KEYBOARD_LARGE_STEP_PX : KEYBOARD_STEP_PX;
45
+ let next = null;
46
+ if (event.code === 'ArrowLeft')
47
+ next = this.currentWidth + step;
48
+ else if (event.code === 'ArrowRight')
49
+ next = this.currentWidth - step;
50
+ else if (event.code === 'Home')
51
+ next = range.min;
52
+ else if (event.code === 'End')
53
+ next = range.max;
54
+ if (next === null)
55
+ return;
56
+ event.preventDefault();
57
+ event.stopPropagation();
58
+ this.setPreferredWidth(next, true);
59
+ };
60
+ this.pointerDown = (event) => {
61
+ if (!this.active || event.button !== 0)
62
+ return;
63
+ event.preventDefault();
64
+ event.stopPropagation();
65
+ this.draggingPointerId = event.pointerId;
66
+ this.separator.dataset.dragging = 'true';
67
+ addBodyClass('ck-crowdy-studio-embed-resizing');
68
+ try {
69
+ this.separator.setPointerCapture(event.pointerId);
70
+ }
71
+ catch {
72
+ // Synthetic browser tests and older engines may not expose capture.
73
+ }
74
+ this.setPreferredWidth(window.innerWidth - event.clientX, false);
75
+ };
76
+ this.pointerMove = (event) => {
77
+ if (event.pointerId !== this.draggingPointerId)
78
+ return;
79
+ event.preventDefault();
80
+ event.stopPropagation();
81
+ this.setPreferredWidth(window.innerWidth - event.clientX, false);
82
+ };
83
+ this.pointerUp = (event) => {
84
+ if (event.pointerId !== this.draggingPointerId)
85
+ return;
86
+ event.preventDefault();
87
+ event.stopPropagation();
88
+ this.setPreferredWidth(window.innerWidth - event.clientX, true);
89
+ this.stopDragging();
90
+ };
91
+ this.pointerCancel = (event) => {
92
+ if (event.pointerId !== this.draggingPointerId)
93
+ return;
94
+ event.stopPropagation();
95
+ this.persistWidth();
96
+ this.stopDragging();
97
+ };
98
+ this.preferredWidth =
99
+ this.loadPersistedWidth() ??
100
+ Math.round(window.innerWidth * CROWDY_STUDIO_EMBED_DEFAULT_DOCK_RATIO);
101
+ const separator = document.createElement('div');
102
+ separator.className = 'ck-crowdy-studio-embed-separator';
103
+ separator.hidden = true;
104
+ separator.tabIndex = 0;
105
+ separator.setAttribute('role', 'separator');
106
+ separator.setAttribute('aria-orientation', 'vertical');
107
+ separator.setAttribute('aria-label', 'Resize Crowdy Studio dock');
108
+ separator.title = 'Resize Crowdy Studio (Left/Right arrows, Home/End)';
109
+ separator.addEventListener('keydown', this.keyDown);
110
+ separator.addEventListener('pointerdown', this.pointerDown);
111
+ separator.addEventListener('pointermove', this.pointerMove);
112
+ separator.addEventListener('pointerup', this.pointerUp);
113
+ separator.addEventListener('pointercancel', this.pointerCancel);
114
+ separator.addEventListener('lostpointercapture', this.pointerCancel);
115
+ this.separator = separator;
116
+ this.updateAria();
117
+ }
118
+ get width() {
119
+ return this.currentWidth;
120
+ }
121
+ activate() {
122
+ this.active = true;
123
+ this.separator.hidden = false;
124
+ this.applyPreferredWidth(true);
125
+ }
126
+ deactivate() {
127
+ this.active = false;
128
+ this.separator.hidden = true;
129
+ this.stopDragging();
130
+ }
131
+ /** Re-clamp the preferred width after a viewport resize. */
132
+ refresh() {
133
+ if (!this.active) {
134
+ this.updateAria();
135
+ return;
136
+ }
137
+ this.applyPreferredWidth(false);
138
+ }
139
+ destroy() {
140
+ this.deactivate();
141
+ this.separator.removeEventListener('keydown', this.keyDown);
142
+ this.separator.removeEventListener('pointerdown', this.pointerDown);
143
+ this.separator.removeEventListener('pointermove', this.pointerMove);
144
+ this.separator.removeEventListener('pointerup', this.pointerUp);
145
+ this.separator.removeEventListener('pointercancel', this.pointerCancel);
146
+ this.separator.removeEventListener('lostpointercapture', this.pointerCancel);
147
+ this.separator.remove();
148
+ }
149
+ applyPreferredWidth(force) {
150
+ const next = clampCrowdyStudioEmbedDockWidth(this.preferredWidth);
151
+ const changed = next !== this.currentWidth;
152
+ this.currentWidth = next;
153
+ this.updateAria();
154
+ if (changed || force)
155
+ this.onWidthChange(next);
156
+ }
157
+ setPreferredWidth(width, persist) {
158
+ this.preferredWidth = clampCrowdyStudioEmbedDockWidth(width);
159
+ this.applyPreferredWidth(false);
160
+ if (persist)
161
+ this.persistWidth();
162
+ }
163
+ updateAria() {
164
+ const range = crowdyStudioEmbedDockWidthRange();
165
+ const width = this.currentWidth ||
166
+ clampCrowdyStudioEmbedDockWidth(this.preferredWidth);
167
+ const gameWidth = Math.max(0, window.innerWidth - width);
168
+ this.separator.setAttribute('aria-valuemin', String(range.min));
169
+ this.separator.setAttribute('aria-valuemax', String(range.max));
170
+ this.separator.setAttribute('aria-valuenow', String(width));
171
+ this.separator.setAttribute('aria-valuetext', `Crowdy Studio ${width} pixels; game ${gameWidth} pixels`);
172
+ }
173
+ stopDragging() {
174
+ const pointerId = this.draggingPointerId;
175
+ this.draggingPointerId = null;
176
+ this.separator.dataset.dragging = 'false';
177
+ removeBodyClass('ck-crowdy-studio-embed-resizing');
178
+ if (pointerId === null)
179
+ return;
180
+ try {
181
+ if (this.separator.hasPointerCapture(pointerId)) {
182
+ this.separator.releasePointerCapture(pointerId);
183
+ }
184
+ }
185
+ catch {
186
+ // Capture is an enhancement; width and persistence do not depend on it.
187
+ }
188
+ }
189
+ loadPersistedWidth() {
190
+ if (!this.storage)
191
+ return null;
192
+ try {
193
+ const parsed = Number(this.storage.getItem(CROWDY_STUDIO_EMBED_DOCK_WIDTH_STORAGE_KEY));
194
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : null;
195
+ }
196
+ catch {
197
+ return null;
198
+ }
199
+ }
200
+ persistWidth() {
201
+ if (!this.storage || this.currentWidth <= 0)
202
+ return;
203
+ try {
204
+ this.storage.setItem(CROWDY_STUDIO_EMBED_DOCK_WIDTH_STORAGE_KEY, String(this.currentWidth));
205
+ }
206
+ catch {
207
+ // Storage can be unavailable in private/embedded contexts; resizing
208
+ // remains fully functional for the current session.
209
+ }
210
+ }
211
+ }
212
+ export function addBodyClass(name) {
213
+ const classes = new Set(document.body.className.split(/\s+/u).filter(Boolean));
214
+ classes.add(name);
215
+ document.body.className = [...classes].join(' ');
216
+ }
217
+ export function removeBodyClass(...names) {
218
+ const remove = new Set(names);
219
+ document.body.className = document.body.className
220
+ .split(/\s+/u)
221
+ .filter((value) => value && !remove.has(value))
222
+ .join(' ');
223
+ }
224
+ function safeLocalStorage() {
225
+ try {
226
+ return window.localStorage;
227
+ }
228
+ catch {
229
+ return null;
230
+ }
231
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Injected presentation for the Crowdy Studio embed shell (panel, dock
3
+ * separator, context drawer, text HUD). Ported from the proven Blocks with
4
+ * Friends chrome so every embedding game starts from the same accessible
5
+ * baseline; games restyle by overriding these classes.
6
+ *
7
+ * Games that dock the studio can consume `--ck-game-right-inset` (set on
8
+ * `document.body` while docked) to inset their own canvas/HUD.
9
+ */
10
+ export declare function ensureCrowdyStudioEmbedStyles(doc?: Document): void;
11
+ export declare const CROWDY_STUDIO_EMBED_STYLES = "\nbody.ck-crowdy-studio-embed-open {\n overscroll-behavior: none;\n}\n\nbody.ck-crowdy-studio-embed-resizing,\nbody.ck-crowdy-studio-embed-resizing * {\n cursor: col-resize !important;\n user-select: none !important;\n}\n\n.ck-crowdy-studio-embed {\n position: fixed;\n inset: 0;\n z-index: 100;\n padding: clamp(8px, 1.5vw, 22px);\n color: #e2e8f0;\n background:\n radial-gradient(circle at 12% 4%, rgba(16, 185, 129, 0.2), transparent 30%),\n radial-gradient(circle at 92% 98%, rgba(5, 150, 105, 0.13), transparent 34%),\n rgba(2, 6, 23, 0.88);\n backdrop-filter: blur(18px) saturate(120%);\n pointer-events: auto;\n animation: ck-crowdy-studio-embed-enter 160ms ease-out;\n}\n\n.ck-crowdy-studio-embed.is-docked {\n inset: 0 0 0 auto;\n display: grid;\n grid-template-columns: 10px minmax(0, 1fr);\n width: var(--ck-crowdy-studio-embed-dock-width);\n padding: 0;\n background: #020617;\n backdrop-filter: none;\n box-shadow: -18px 0 50px rgba(0, 0, 0, 0.32);\n}\n\n.ck-crowdy-studio-embed-separator {\n position: relative;\n z-index: 3;\n width: 10px;\n min-width: 10px;\n height: 100%;\n padding: 0;\n border: 0;\n background: rgba(15, 23, 42, 0.98);\n cursor: col-resize;\n touch-action: none;\n}\n\n.ck-crowdy-studio-embed-separator::after {\n position: absolute;\n inset: 0 3px;\n border-radius: 999px;\n background: rgba(110, 231, 183, 0.34);\n content: \"\";\n transition:\n inset 120ms ease,\n background 120ms ease;\n}\n\n.ck-crowdy-studio-embed-separator:hover::after,\n.ck-crowdy-studio-embed-separator:focus-visible::after,\n.ck-crowdy-studio-embed-separator[data-dragging=\"true\"]::after {\n inset-inline: 2px;\n background: #6ee7b7;\n}\n\n.ck-crowdy-studio-embed-shell {\n display: grid;\n grid-template-rows: auto minmax(0, 1fr);\n width: 100%;\n height: 100%;\n overflow: hidden;\n border: 1px solid rgba(110, 231, 183, 0.24);\n border-radius: 20px;\n background:\n linear-gradient(145deg, rgba(15, 23, 42, 0.97), rgba(2, 6, 23, 0.96));\n box-shadow:\n 0 32px 100px rgba(0, 0, 0, 0.62),\n inset 0 1px rgba(255, 255, 255, 0.04);\n}\n\n.ck-crowdy-studio-embed.is-docked .ck-crowdy-studio-embed-shell {\n grid-column: 2;\n border-block: 0;\n border-right: 0;\n border-radius: 0;\n box-shadow: none;\n}\n\n/* Single compact header row: title \u00B7 context pill \u00B7 Context toggle \u00B7 Close. */\n.ck-crowdy-studio-embed-header {\n display: flex;\n gap: 10px;\n align-items: center;\n min-height: 46px;\n padding: 6px 12px;\n border-bottom: 1px solid rgba(148, 163, 184, 0.18);\n background: rgba(15, 23, 42, 0.78);\n}\n\n.ck-crowdy-studio-embed-header h1 {\n overflow: hidden;\n margin: 0;\n margin-right: auto;\n color: #f8fafc;\n font-size: 16px;\n line-height: 1.1;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.ck-crowdy-studio-embed-visually-hidden {\n position: absolute;\n overflow: hidden;\n width: 1px;\n height: 1px;\n margin: -1px;\n clip-path: inset(50%);\n white-space: nowrap;\n}\n\n.ck-crowdy-studio-embed-context-toggle {\n border: 1px solid rgba(148, 163, 184, 0.3);\n border-radius: 9px;\n padding: 8px 13px;\n color: #cbd5e1;\n background: rgba(2, 6, 23, 0.48);\n cursor: pointer;\n}\n\n.ck-crowdy-studio-embed-context-toggle:hover,\n.ck-crowdy-studio-embed-context-toggle[aria-expanded=\"true\"] {\n border-color: #6ee7b7;\n color: #d1fae5;\n}\n\n.ck-crowdy-studio-embed-context-pill {\n display: grid;\n gap: 2px;\n max-width: 310px;\n padding: 7px 10px;\n border: 1px solid rgba(148, 163, 184, 0.2);\n border-radius: 9px;\n background: rgba(2, 6, 23, 0.48);\n}\n\n.ck-crowdy-studio-embed-context-pill small {\n color: #64748b;\n font-size: 9px;\n font-weight: 800;\n letter-spacing: 0.1em;\n text-transform: uppercase;\n}\n\n.ck-crowdy-studio-embed-context-pill strong {\n overflow: hidden;\n color: #cbd5e1;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 11px;\n font-weight: 600;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.ck-crowdy-studio-embed-close,\n.ck-crowdy-studio-embed-retry {\n border: 1px solid rgba(110, 231, 183, 0.38);\n border-radius: 9px;\n padding: 8px 13px;\n color: #d1fae5;\n background: rgba(6, 78, 59, 0.52);\n cursor: pointer;\n}\n\n.ck-crowdy-studio-embed-close:hover,\n.ck-crowdy-studio-embed-retry:hover {\n border-color: #6ee7b7;\n background: rgba(5, 150, 105, 0.42);\n}\n\n.ck-crowdy-studio-embed.is-docked .ck-crowdy-studio-embed-header {\n min-height: 40px;\n padding: 5px 8px;\n}\n\n.ck-crowdy-studio-embed.is-docked .ck-crowdy-studio-embed-close,\n.ck-crowdy-studio-embed.is-docked .ck-crowdy-studio-embed-context-toggle {\n padding: 6px 9px;\n}\n\n.ck-crowdy-studio-embed-workspace {\n position: relative;\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n min-height: 0;\n}\n\n/* On-demand context drawer overlays the studio from the right. */\n.ck-crowdy-studio-embed-drawer {\n position: absolute;\n inset: 0 0 0 auto;\n z-index: 6;\n width: min(320px, 88%);\n min-height: 0;\n padding: 16px;\n overflow: auto;\n border-left: 1px solid rgba(148, 163, 184, 0.16);\n background:\n linear-gradient(180deg, rgba(15, 23, 42, 0.97), rgba(2, 6, 23, 0.96));\n box-shadow: -18px 0 44px rgba(0, 0, 0, 0.4);\n}\n\n.ck-crowdy-studio-embed-drawer[hidden] {\n display: none;\n}\n\n.ck-crowdy-studio-embed-drawer h2 {\n margin: 0 0 8px;\n color: #a7f3d0;\n font-size: 10px;\n font-weight: 800;\n letter-spacing: 0.11em;\n text-transform: uppercase;\n}\n\n.ck-crowdy-studio-embed-drawer h2:not(:first-child) {\n margin-top: 22px;\n}\n\n.ck-crowdy-studio-embed-drawer > p {\n margin: 0 0 8px;\n color: #94a3b8;\n font-size: 11px;\n}\n\n.ck-crowdy-studio-embed-hud-preview-disclosure {\n margin-top: 22px;\n}\n\n.ck-crowdy-studio-embed-hud-preview-disclosure summary {\n color: #a7f3d0;\n cursor: pointer;\n font-size: 10px;\n font-weight: 800;\n letter-spacing: 0.11em;\n text-transform: uppercase;\n}\n\n.ck-crowdy-studio-embed-hud-preview-disclosure[open] summary {\n margin-bottom: 8px;\n}\n\n.ck-crowdy-studio-embed-grid-context {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr);\n gap: 6px 10px;\n margin: 0;\n padding: 11px;\n border: 1px solid rgba(148, 163, 184, 0.16);\n border-radius: 11px;\n background: rgba(2, 6, 23, 0.42);\n}\n\n.ck-crowdy-studio-embed-grid-context dt {\n color: #64748b;\n font-size: 11px;\n}\n\n.ck-crowdy-studio-embed-grid-context dd {\n overflow: hidden;\n margin: 0;\n color: #cbd5e1;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 10px;\n text-align: right;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.ck-crowdy-studio-embed-permissions {\n display: grid;\n gap: 8px;\n}\n\n.ck-crowdy-studio-embed-permission {\n display: grid;\n grid-template-columns: 1fr;\n gap: 5px;\n padding: 10px;\n border: 1px solid rgba(52, 211, 153, 0.25);\n border-radius: 10px;\n background: rgba(6, 78, 59, 0.16);\n}\n\n.ck-crowdy-studio-embed-permission.is-disabled {\n border-color: rgba(148, 163, 184, 0.15);\n background: rgba(30, 41, 59, 0.36);\n}\n\n.ck-crowdy-studio-embed-permission strong {\n color: #e2e8f0;\n font-size: 11px;\n letter-spacing: 0.08em;\n}\n\n.ck-crowdy-studio-embed-permission span {\n font-size: 10px;\n}\n\n.ck-crowdy-studio-embed-permission .is-allowed {\n color: #6ee7b7;\n}\n\n.ck-crowdy-studio-embed-permission .is-denied {\n color: #94a3b8;\n}\n\n.ck-crowdy-studio-embed-permission-source,\n.ck-crowdy-studio-embed-shortcuts {\n margin: 8px 0 0;\n color: #64748b;\n font-size: 10px;\n line-height: 1.45;\n}\n\n.ck-crowdy-studio-embed-hud-preview {\n min-height: 80px;\n padding: 8px;\n border: 1px dashed rgba(110, 231, 183, 0.26);\n border-radius: 11px;\n background: rgba(2, 6, 23, 0.5);\n}\n\n.ck-crowdy-studio-embed-main {\n position: relative;\n min-width: 0;\n min-height: 0;\n overflow: hidden;\n background: #080f1d;\n}\n\n.ck-crowdy-studio-embed-mount {\n width: 100%;\n height: 100%;\n min-height: 0;\n}\n\n.ck-crowdy-studio-embed-status {\n position: absolute;\n inset: 0;\n z-index: 4;\n display: flex;\n gap: 10px;\n align-items: center;\n justify-content: center;\n padding: 24px;\n color: #cbd5e1;\n background:\n radial-gradient(circle at 50% 35%, rgba(16, 185, 129, 0.1), transparent 34%),\n #080f1d;\n text-align: center;\n}\n\n.ck-crowdy-studio-embed-status.hidden {\n display: none;\n}\n\n.ck-crowdy-studio-embed-status.is-error {\n flex-direction: column;\n color: #fecaca;\n}\n\n.ck-crowdy-studio-embed-status.is-error strong {\n color: #fef2f2;\n font-size: 18px;\n}\n\n.ck-crowdy-studio-embed-status.is-error span {\n max-width: 560px;\n line-height: 1.55;\n}\n\n.ck-crowdy-studio-embed-spinner {\n width: 18px;\n height: 18px;\n border: 2px solid rgba(110, 231, 183, 0.2);\n border-top-color: #6ee7b7;\n border-radius: 999px;\n animation: ck-crowdy-studio-embed-spin 700ms linear infinite;\n}\n\n/* Stable hooks so the embed themes the CrowdyJS studio panes it hosts. */\n.ck-crowdy-studio-embed-mount .ck-crowdy-studio {\n width: 100%;\n height: 100%;\n color: #e2e8f0;\n background: #080f1d;\n}\n\n.ck-crowdy-studio-embed-mount .ck-crowdy-studio-explorer {\n border-right: 1px solid rgba(148, 163, 184, 0.16);\n background: #0b1322;\n}\n\n.ck-crowdy-studio-embed-mount .ck-crowdy-studio-editor {\n min-width: 0;\n background: #080f1d;\n}\n\n.ck-crowdy-studio-embed-mount :is(\n .ck-crowdy-studio-bottom,\n .ck-crowdy-studio-panel\n) {\n border-top: 1px solid rgba(148, 163, 184, 0.16);\n color: #cbd5e1;\n background: #0b1322;\n}\n\n.ck-crowdy-studio-embed-mount .ck-crowdy-studio-status {\n color: #a7f3d0;\n background: #052e2b;\n}\n\n.ck-crowdy-studio-embed-mount meter {\n accent-color: #10b981;\n}\n\n/* Text-only player-mod HUD: no mod-supplied markup is inserted here. */\n.ck-crowdy-studio-hud-layer {\n position: fixed;\n top: 96px;\n left: 12px;\n right: calc(12px + var(--ck-game-right-inset, 0px));\n z-index: 40;\n display: flex;\n flex-direction: column;\n gap: 6px;\n max-width: 280px;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 12px;\n pointer-events: none;\n}\n\n.ck-crowdy-studio-hud-layer[hidden] {\n display: none;\n}\n\n.ck-crowdy-studio-hud-card {\n padding: 7px 9px;\n border: 1px solid rgba(110, 231, 183, 0.25);\n border-radius: 8px;\n color: #dbeafe;\n background: rgba(8, 15, 29, 0.9);\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.28);\n}\n\n.ck-crowdy-studio-hud-title {\n margin-bottom: 3px;\n color: #a7f3d0;\n font-weight: 700;\n}\n\n.ck-crowdy-studio-hud-payload {\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n}\n\n.ck-crowdy-studio-hud-preview-card {\n box-shadow: none;\n}\n\n.ck-crowdy-studio-hud-preview-empty {\n margin: 0;\n color: #64748b;\n font-size: 10px;\n line-height: 1.45;\n}\n\n@keyframes ck-crowdy-studio-embed-enter {\n from {\n opacity: 0;\n transform: scale(0.995);\n }\n}\n\n@keyframes ck-crowdy-studio-embed-spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@media (max-width: 900px) {\n .ck-crowdy-studio-embed-context-pill {\n display: none;\n }\n\n .ck-crowdy-studio-embed-permission-source,\n .ck-crowdy-studio-embed-shortcuts {\n display: none;\n }\n}\n\n@media (max-width: 620px) {\n .ck-crowdy-studio-embed {\n padding: 0;\n }\n\n .ck-crowdy-studio-embed-shell {\n border: 0;\n border-radius: 0;\n }\n\n .ck-crowdy-studio-embed-drawer {\n width: 100%;\n border-left: 0;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .ck-crowdy-studio-embed,\n .ck-crowdy-studio-embed-spinner,\n .ck-crowdy-studio-embed * {\n scroll-behavior: auto !important;\n animation-duration: 0.001ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.001ms !important;\n }\n}\n";
12
+ //# sourceMappingURL=embed-styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embed-styles.d.ts","sourceRoot":"","sources":["../../../src/crowdy-studio/embed/embed-styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,wBAAgB,6BAA6B,CAAC,GAAG,GAAE,QAAmB,GAAG,IAAI,CAM5E;AAED,eAAO,MAAM,0BAA0B,sqXAkhBtC,CAAC"}