@hai3/studio 0.1.0-alpha.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/dist/index.mjs ADDED
@@ -0,0 +1,1414 @@
1
+ import React3, { createContext, useContext, useState, useEffect, useCallback, useRef } from 'react';
2
+ import { I18nRegistry, Language, i18nRegistry, ScreensetCategory, eventBus, useTranslation, useAppDispatch, useAppSelector, selectScreenset, screensetRegistry, setApiMode, themeRegistry, changeTheme, LanguageDisplayMode, TextDirection } from '@hai3/uicore';
3
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
+ import { Card, Button, ButtonSize, ButtonVariant, DropdownMenu, DropdownMenuTrigger, DropdownButton, DropdownMenuContent, DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuSubContent, DropdownMenuItem, Switch } from '@hai3/uikit';
5
+ import { clamp, upperFirst } from 'lodash';
6
+ import { ButtonVariant as ButtonVariant$1 } from '@hai3/uikit-contracts';
7
+
8
+ var __create = Object.create;
9
+ var __defProp = Object.defineProperty;
10
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
11
+ var __getOwnPropNames = Object.getOwnPropertyNames;
12
+ var __getProtoOf = Object.getPrototypeOf;
13
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
14
+ var __commonJS = (cb, mod) => function __require() {
15
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
16
+ };
17
+ var __copyProps = (to, from, except, desc) => {
18
+ if (from && typeof from === "object" || typeof from === "function") {
19
+ for (let key of __getOwnPropNames(from))
20
+ if (!__hasOwnProp.call(to, key) && key !== except)
21
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
22
+ }
23
+ return to;
24
+ };
25
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
26
+ // If the importer is in node compatibility mode or this is not an ESM
27
+ // file that has been converted to a CommonJS file using a Babel-
28
+ // compatible transform (i.e. "__esModule" has not been set), then set
29
+ // "default" to the CommonJS "module.exports" for node compatibility.
30
+ !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
31
+ mod
32
+ ));
33
+
34
+ // src/i18n/en.json
35
+ var require_en = __commonJS({
36
+ "src/i18n/en.json"(exports, module) {
37
+ module.exports = {
38
+ title: "HAI3 Studio",
39
+ aria: {
40
+ openButton: "Open Studio (Shift+`) or drag to move",
41
+ collapseButton: "Collapse Studio panel",
42
+ resizeHandle: "Resize Studio panel"
43
+ },
44
+ controls: {
45
+ heading: "Development Controls",
46
+ screenset: "Screenset:",
47
+ theme: "Theme:",
48
+ language: "Language:",
49
+ mockApi: "Mock API"
50
+ }
51
+ };
52
+ }
53
+ });
54
+
55
+ // src/i18n/ar.json
56
+ var require_ar = __commonJS({
57
+ "src/i18n/ar.json"(exports, module) {
58
+ module.exports = {
59
+ title: "\u0623\u062F\u0648\u0627\u062A \u062A\u0637\u0648\u064A\u0631 HAI3",
60
+ aria: {
61
+ openButton: "\u0641\u062A\u062D \u0623\u062F\u0648\u0627\u062A \u0627\u0644\u062A\u0637\u0648\u064A\u0631 (Shift+`) \u0623\u0648 \u0627\u0644\u0633\u062D\u0628 \u0644\u0644\u062A\u062D\u0631\u064A\u0643",
62
+ collapseButton: "\u0637\u064A \u0644\u0648\u062D\u0629 \u0623\u062F\u0648\u0627\u062A \u0627\u0644\u062A\u0637\u0648\u064A\u0631",
63
+ resizeHandle: "\u062A\u063A\u064A\u064A\u0631 \u062D\u062C\u0645 \u0644\u0648\u062D\u0629 \u0627\u0644\u0623\u062F\u0648\u0627\u062A"
64
+ },
65
+ controls: {
66
+ heading: "\u0639\u0646\u0627\u0635\u0631 \u0627\u0644\u062A\u062D\u0643\u0645 \u0641\u064A \u0627\u0644\u062A\u0637\u0648\u064A\u0631",
67
+ screenset: "\u0645\u062C\u0645\u0648\u0639\u0629 \u0627\u0644\u0634\u0627\u0634\u0627\u062A:",
68
+ theme: "\u0627\u0644\u0633\u0645\u0629:",
69
+ language: "\u0627\u0644\u0644\u063A\u0629:",
70
+ mockApi: "\u0648\u0627\u062C\u0647\u0629 \u0628\u0631\u0645\u062C\u064A\u0629 \u0648\u0647\u0645\u064A\u0629"
71
+ }
72
+ };
73
+ }
74
+ });
75
+
76
+ // src/i18n/bn.json
77
+ var require_bn = __commonJS({
78
+ "src/i18n/bn.json"(exports, module) {
79
+ module.exports = {
80
+ title: "HAI3 \u09A1\u09C7\u09AD\u09C7\u09B2\u09AA\u09AE\u09C7\u09A8\u09CD\u099F \u099F\u09C1\u09B2\u09B8",
81
+ aria: {
82
+ openButton: "\u09A1\u09C7\u09AD\u09C7\u09B2\u09AA\u09AE\u09C7\u09A8\u09CD\u099F \u099F\u09C1\u09B2\u09B8 \u0996\u09C1\u09B2\u09C1\u09A8 (Shift+`) \u09AC\u09BE \u09B8\u09B0\u09BE\u09A8\u09CB\u09B0 \u099C\u09A8\u09CD\u09AF \u099F\u09BE\u09A8\u09C1\u09A8",
83
+ collapseButton: "\u09A1\u09C7\u09AD\u09C7\u09B2\u09AA\u09AE\u09C7\u09A8\u09CD\u099F \u099F\u09C1\u09B2\u09B8 \u09AA\u09CD\u09AF\u09BE\u09A8\u09C7\u09B2 \u09B8\u0982\u0995\u09C1\u099A\u09BF\u09A4 \u0995\u09B0\u09C1\u09A8",
84
+ resizeHandle: "\u099F\u09C1\u09B2\u09B8 \u09AA\u09CD\u09AF\u09BE\u09A8\u09C7\u09B2\u09C7\u09B0 \u0986\u0995\u09BE\u09B0 \u09AA\u09B0\u09BF\u09AC\u09B0\u09CD\u09A4\u09A8 \u0995\u09B0\u09C1\u09A8"
85
+ },
86
+ controls: {
87
+ heading: "\u0989\u09A8\u09CD\u09A8\u09AF\u09BC\u09A8 \u09A8\u09BF\u09AF\u09BC\u09A8\u09CD\u09A4\u09CD\u09B0\u09A3",
88
+ screenset: "\u09B8\u09CD\u0995\u09CD\u09B0\u09BF\u09A8\u09B8\u09C7\u099F:",
89
+ theme: "\u09A5\u09BF\u09AE:",
90
+ language: "\u09AD\u09BE\u09B7\u09BE:",
91
+ mockApi: "\u09AE\u0995 API"
92
+ }
93
+ };
94
+ }
95
+ });
96
+
97
+ // src/i18n/cs.json
98
+ var require_cs = __commonJS({
99
+ "src/i18n/cs.json"(exports, module) {
100
+ module.exports = {
101
+ title: "V\xFDvoj\xE1\u0159sk\xE9 n\xE1stroje HAI3",
102
+ aria: {
103
+ openButton: "Otev\u0159\xEDt v\xFDvoj\xE1\u0159sk\xE9 n\xE1stroje (Shift+`) nebo p\u0159et\xE1hnout pro p\u0159esun",
104
+ collapseButton: "Sbalit panel v\xFDvoj\xE1\u0159sk\xFDch n\xE1stroj\u016F",
105
+ resizeHandle: "Zm\u011Bnit velikost panelu n\xE1stroj\u016F"
106
+ },
107
+ controls: {
108
+ heading: "V\xFDvoj\xE1\u0159sk\xE9 ovl\xE1dac\xED prvky",
109
+ screenset: "Sada obrazovek:",
110
+ theme: "Motiv:",
111
+ language: "Jazyk:",
112
+ mockApi: "Simulovan\xE9 API"
113
+ }
114
+ };
115
+ }
116
+ });
117
+
118
+ // src/i18n/da.json
119
+ var require_da = __commonJS({
120
+ "src/i18n/da.json"(exports, module) {
121
+ module.exports = {
122
+ title: "HAI3 Udviklingsv\xE6rkt\xF8jer",
123
+ aria: {
124
+ openButton: "\xC5bn Udviklingsv\xE6rkt\xF8jer (Shift+`) eller tr\xE6k for at flytte",
125
+ collapseButton: "Skjul udviklingsv\xE6rkt\xF8jspanelet",
126
+ resizeHandle: "\xC6ndre st\xF8rrelse p\xE5 v\xE6rkt\xF8jspanelet"
127
+ },
128
+ controls: {
129
+ heading: "Udviklingskontrolelementer",
130
+ screenset: "Sk\xE6rms\xE6t:",
131
+ theme: "Tema:",
132
+ language: "Sprog:",
133
+ mockApi: "Mock-API"
134
+ }
135
+ };
136
+ }
137
+ });
138
+
139
+ // src/i18n/de.json
140
+ var require_de = __commonJS({
141
+ "src/i18n/de.json"(exports, module) {
142
+ module.exports = {
143
+ title: "HAI3 Entwicklerwerkzeuge",
144
+ aria: {
145
+ openButton: "Entwicklerwerkzeuge \xF6ffnen (Shift+`) oder ziehen zum Verschieben",
146
+ collapseButton: "Entwicklerwerkzeuge-Panel einklappen",
147
+ resizeHandle: "Gr\xF6\xDFe des Werkzeug-Panels \xE4ndern"
148
+ },
149
+ controls: {
150
+ heading: "Entwicklungssteuerung",
151
+ screenset: "Bildschirmset:",
152
+ theme: "Design:",
153
+ language: "Sprache:",
154
+ mockApi: "Mock-API"
155
+ }
156
+ };
157
+ }
158
+ });
159
+
160
+ // src/i18n/el.json
161
+ var require_el = __commonJS({
162
+ "src/i18n/el.json"(exports, module) {
163
+ module.exports = {
164
+ title: "\u0395\u03C1\u03B3\u03B1\u03BB\u03B5\u03AF\u03B1 \u0391\u03BD\u03AC\u03C0\u03C4\u03C5\u03BE\u03B7\u03C2 HAI3",
165
+ aria: {
166
+ openButton: "\u0386\u03BD\u03BF\u03B9\u03B3\u03BC\u03B1 \u0395\u03C1\u03B3\u03B1\u03BB\u03B5\u03AF\u03C9\u03BD \u0391\u03BD\u03AC\u03C0\u03C4\u03C5\u03BE\u03B7\u03C2 (Shift+`) \u03AE \u03C3\u03CD\u03C1\u03B5\u03C4\u03B5 \u03B3\u03B9\u03B1 \u03BC\u03B5\u03C4\u03B1\u03BA\u03AF\u03BD\u03B7\u03C3\u03B7",
167
+ collapseButton: "\u03A3\u03CD\u03BC\u03C0\u03C4\u03C5\u03BE\u03B7 \u03C0\u03AF\u03BD\u03B1\u03BA\u03B1 \u03B5\u03C1\u03B3\u03B1\u03BB\u03B5\u03AF\u03C9\u03BD \u03B1\u03BD\u03AC\u03C0\u03C4\u03C5\u03BE\u03B7\u03C2",
168
+ resizeHandle: "\u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u03BC\u03B5\u03B3\u03AD\u03B8\u03BF\u03C5\u03C2 \u03C0\u03AF\u03BD\u03B1\u03BA\u03B1 \u03B5\u03C1\u03B3\u03B1\u03BB\u03B5\u03AF\u03C9\u03BD"
169
+ },
170
+ controls: {
171
+ heading: "\u03A3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03B1 \u0395\u03BB\u03AD\u03B3\u03C7\u03BF\u03C5 \u0391\u03BD\u03AC\u03C0\u03C4\u03C5\u03BE\u03B7\u03C2",
172
+ screenset: "\u03A3\u03CD\u03BD\u03BF\u03BB\u03BF \u039F\u03B8\u03BF\u03BD\u03CE\u03BD:",
173
+ theme: "\u0398\u03AD\u03BC\u03B1:",
174
+ language: "\u0393\u03BB\u03CE\u03C3\u03C3\u03B1:",
175
+ mockApi: "Mock API"
176
+ }
177
+ };
178
+ }
179
+ });
180
+
181
+ // src/i18n/es.json
182
+ var require_es = __commonJS({
183
+ "src/i18n/es.json"(exports, module) {
184
+ module.exports = {
185
+ title: "Herramientas de Desarrollo HAI3",
186
+ aria: {
187
+ openButton: "Abrir Herramientas de Desarrollo (Shift+`) o arrastrar para mover",
188
+ collapseButton: "Contraer panel de herramientas de desarrollo",
189
+ resizeHandle: "Cambiar tama\xF1o del panel de herramientas"
190
+ },
191
+ controls: {
192
+ heading: "Controles de Desarrollo",
193
+ screenset: "Conjunto de Pantallas:",
194
+ theme: "Tema:",
195
+ language: "Idioma:",
196
+ mockApi: "API Simulada"
197
+ }
198
+ };
199
+ }
200
+ });
201
+
202
+ // src/i18n/fa.json
203
+ var require_fa = __commonJS({
204
+ "src/i18n/fa.json"(exports, module) {
205
+ module.exports = {
206
+ title: "\u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06CC \u062A\u0648\u0633\u0639\u0647 HAI3",
207
+ aria: {
208
+ openButton: "\u0628\u0627\u0632 \u06A9\u0631\u062F\u0646 \u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06CC \u062A\u0648\u0633\u0639\u0647 (Shift+`) \u06CC\u0627 \u06A9\u0634\u06CC\u062F\u0646 \u0628\u0631\u0627\u06CC \u062C\u0627\u0628\u062C\u0627\u06CC\u06CC",
209
+ collapseButton: "\u062C\u0645\u0639 \u06A9\u0631\u062F\u0646 \u067E\u0646\u0644 \u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06CC \u062A\u0648\u0633\u0639\u0647",
210
+ resizeHandle: "\u062A\u063A\u06CC\u06CC\u0631 \u0627\u0646\u062F\u0627\u0632\u0647 \u067E\u0646\u0644 \u0627\u0628\u0632\u0627\u0631\u0647\u0627"
211
+ },
212
+ controls: {
213
+ heading: "\u06A9\u0646\u062A\u0631\u0644\u200C\u0647\u0627\u06CC \u062A\u0648\u0633\u0639\u0647",
214
+ screenset: "\u0645\u062C\u0645\u0648\u0639\u0647 \u0635\u0641\u062D\u0647\u200C\u0646\u0645\u0627\u06CC\u0634:",
215
+ theme: "\u067E\u0648\u0633\u062A\u0647:",
216
+ language: "\u0632\u0628\u0627\u0646:",
217
+ mockApi: "API \u0633\u0627\u062E\u062A\u06AF\u06CC"
218
+ }
219
+ };
220
+ }
221
+ });
222
+
223
+ // src/i18n/fi.json
224
+ var require_fi = __commonJS({
225
+ "src/i18n/fi.json"(exports, module) {
226
+ module.exports = {
227
+ title: "HAI3 Kehitysty\xF6kalut",
228
+ aria: {
229
+ openButton: "Avaa Kehitysty\xF6kalut (Shift+`) tai ved\xE4 siirt\xE4\xE4ksesi",
230
+ collapseButton: "Tiivist\xE4 kehitysty\xF6kalupaneeli",
231
+ resizeHandle: "Muuta ty\xF6kalupaneelin kokoa"
232
+ },
233
+ controls: {
234
+ heading: "Kehitysohjaimet",
235
+ screenset: "N\xE4ytt\xF6sarja:",
236
+ theme: "Teema:",
237
+ language: "Kieli:",
238
+ mockApi: "Mock-API"
239
+ }
240
+ };
241
+ }
242
+ });
243
+
244
+ // src/i18n/fr.json
245
+ var require_fr = __commonJS({
246
+ "src/i18n/fr.json"(exports, module) {
247
+ module.exports = {
248
+ title: "Outils de D\xE9veloppement HAI3",
249
+ aria: {
250
+ openButton: "Ouvrir les outils de d\xE9veloppement (Shift+`) ou glisser pour d\xE9placer",
251
+ collapseButton: "R\xE9duire le panneau des outils de d\xE9veloppement",
252
+ resizeHandle: "Redimensionner le panneau des outils"
253
+ },
254
+ controls: {
255
+ heading: "Contr\xF4les de D\xE9veloppement",
256
+ screenset: "Ensemble d'\xC9crans:",
257
+ theme: "Th\xE8me:",
258
+ language: "Langue:",
259
+ mockApi: "API Simul\xE9e"
260
+ }
261
+ };
262
+ }
263
+ });
264
+
265
+ // src/i18n/he.json
266
+ var require_he = __commonJS({
267
+ "src/i18n/he.json"(exports, module) {
268
+ module.exports = {
269
+ title: "\u05DB\u05DC\u05D9 \u05E4\u05D9\u05EA\u05D5\u05D7 HAI3",
270
+ aria: {
271
+ openButton: "\u05E4\u05EA\u05D7 \u05DB\u05DC\u05D9 \u05E4\u05D9\u05EA\u05D5\u05D7 (Shift+`) \u05D0\u05D5 \u05D2\u05E8\u05D5\u05E8 \u05DC\u05D4\u05D6\u05D6\u05D4",
272
+ collapseButton: "\u05DB\u05D5\u05D5\u05E5 \u05D7\u05DC\u05D5\u05E0\u05D9\u05EA \u05DB\u05DC\u05D9 \u05E4\u05D9\u05EA\u05D5\u05D7",
273
+ resizeHandle: "\u05E9\u05E0\u05D4 \u05D2\u05D5\u05D3\u05DC \u05D7\u05DC\u05D5\u05E0\u05D9\u05EA \u05DB\u05DC\u05D9\u05DD"
274
+ },
275
+ controls: {
276
+ heading: "\u05D1\u05E7\u05E8\u05D5\u05EA \u05E4\u05D9\u05EA\u05D5\u05D7",
277
+ screenset: "\u05E2\u05E8\u05DB\u05EA \u05DE\u05E1\u05DB\u05D9\u05DD:",
278
+ theme: "\u05E2\u05E8\u05DB\u05EA \u05E0\u05D5\u05E9\u05D0:",
279
+ language: "\u05E9\u05E4\u05D4:",
280
+ mockApi: "API \u05DE\u05D3\u05D5\u05DE\u05D4"
281
+ }
282
+ };
283
+ }
284
+ });
285
+
286
+ // src/i18n/hi.json
287
+ var require_hi = __commonJS({
288
+ "src/i18n/hi.json"(exports, module) {
289
+ module.exports = {
290
+ title: "HAI3 \u0921\u0947\u0935\u0932\u092A\u092E\u0947\u0902\u091F \u091F\u0942\u0932\u094D\u0938",
291
+ aria: {
292
+ openButton: "\u0921\u0947\u0935\u0932\u092A\u092E\u0947\u0902\u091F \u091F\u0942\u0932\u094D\u0938 \u0916\u094B\u0932\u0947\u0902 (Shift+`) \u092F\u093E \u0938\u094D\u0925\u093E\u0928\u093E\u0902\u0924\u0930\u093F\u0924 \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F \u0916\u0940\u0902\u091A\u0947\u0902",
293
+ collapseButton: "\u0921\u0947\u0935\u0932\u092A\u092E\u0947\u0902\u091F \u091F\u0942\u0932\u094D\u0938 \u092A\u0948\u0928\u0932 \u0915\u094B \u0938\u0902\u0915\u094D\u0937\u093F\u092A\u094D\u0924 \u0915\u0930\u0947\u0902",
294
+ resizeHandle: "\u091F\u0942\u0932\u094D\u0938 \u092A\u0948\u0928\u0932 \u0915\u093E \u0906\u0915\u093E\u0930 \u092C\u0926\u0932\u0947\u0902"
295
+ },
296
+ controls: {
297
+ heading: "\u0935\u093F\u0915\u093E\u0938 \u0928\u093F\u092F\u0902\u0924\u094D\u0930\u0923",
298
+ screenset: "\u0938\u094D\u0915\u094D\u0930\u0940\u0928\u0938\u0947\u091F:",
299
+ theme: "\u0925\u0940\u092E:",
300
+ language: "\u092D\u093E\u0937\u093E:",
301
+ mockApi: "\u092E\u0949\u0915 API"
302
+ }
303
+ };
304
+ }
305
+ });
306
+
307
+ // src/i18n/hu.json
308
+ var require_hu = __commonJS({
309
+ "src/i18n/hu.json"(exports, module) {
310
+ module.exports = {
311
+ title: "HAI3 Fejleszt\u0151i Eszk\xF6z\xF6k",
312
+ aria: {
313
+ openButton: "Fejleszt\u0151i Eszk\xF6z\xF6k megnyit\xE1sa (Shift+`) vagy h\xFAzza az \xE1thelyez\xE9shez",
314
+ collapseButton: "Fejleszt\u0151i eszk\xF6z\xF6k panel \xF6sszecsuk\xE1sa",
315
+ resizeHandle: "Eszk\xF6zpanel \xE1tm\xE9retez\xE9se"
316
+ },
317
+ controls: {
318
+ heading: "Fejleszt\xE9si Vez\xE9rl\u0151k",
319
+ screenset: "K\xE9perny\u0151k\xE9szlet:",
320
+ theme: "T\xE9ma:",
321
+ language: "Nyelv:",
322
+ mockApi: "Mock API"
323
+ }
324
+ };
325
+ }
326
+ });
327
+
328
+ // src/i18n/id.json
329
+ var require_id = __commonJS({
330
+ "src/i18n/id.json"(exports, module) {
331
+ module.exports = {
332
+ title: "Alat Pengembangan HAI3",
333
+ aria: {
334
+ openButton: "Buka Alat Pengembangan (Shift+`) atau seret untuk memindahkan",
335
+ collapseButton: "Ciutkan panel alat pengembangan",
336
+ resizeHandle: "Ubah ukuran panel alat"
337
+ },
338
+ controls: {
339
+ heading: "Kontrol Pengembangan",
340
+ screenset: "Set Layar:",
341
+ theme: "Tema:",
342
+ language: "Bahasa:",
343
+ mockApi: "API Tiruan"
344
+ }
345
+ };
346
+ }
347
+ });
348
+
349
+ // src/i18n/it.json
350
+ var require_it = __commonJS({
351
+ "src/i18n/it.json"(exports, module) {
352
+ module.exports = {
353
+ title: "Strumenti di Sviluppo HAI3",
354
+ aria: {
355
+ openButton: "Apri Strumenti di Sviluppo (Shift+`) o trascina per spostare",
356
+ collapseButton: "Comprimi pannello strumenti di sviluppo",
357
+ resizeHandle: "Ridimensiona pannello strumenti"
358
+ },
359
+ controls: {
360
+ heading: "Controlli di Sviluppo",
361
+ screenset: "Set di Schermate:",
362
+ theme: "Tema:",
363
+ language: "Lingua:",
364
+ mockApi: "API Simulata"
365
+ }
366
+ };
367
+ }
368
+ });
369
+
370
+ // src/i18n/ja.json
371
+ var require_ja = __commonJS({
372
+ "src/i18n/ja.json"(exports, module) {
373
+ module.exports = {
374
+ title: "HAI3 \u958B\u767A\u30C4\u30FC\u30EB",
375
+ aria: {
376
+ openButton: "\u958B\u767A\u30C4\u30FC\u30EB\u3092\u958B\u304F (Shift+`) \u307E\u305F\u306F\u30C9\u30E9\u30C3\u30B0\u3057\u3066\u79FB\u52D5",
377
+ collapseButton: "\u958B\u767A\u30C4\u30FC\u30EB\u30D1\u30CD\u30EB\u3092\u6298\u308A\u305F\u305F\u3080",
378
+ resizeHandle: "\u30C4\u30FC\u30EB\u30D1\u30CD\u30EB\u306E\u30B5\u30A4\u30BA\u3092\u5909\u66F4"
379
+ },
380
+ controls: {
381
+ heading: "\u958B\u767A\u30B3\u30F3\u30C8\u30ED\u30FC\u30EB",
382
+ screenset: "\u30B9\u30AF\u30EA\u30FC\u30F3\u30BB\u30C3\u30C8:",
383
+ theme: "\u30C6\u30FC\u30DE:",
384
+ language: "\u8A00\u8A9E:",
385
+ mockApi: "\u30E2\u30C3\u30AF API"
386
+ }
387
+ };
388
+ }
389
+ });
390
+
391
+ // src/i18n/ko.json
392
+ var require_ko = __commonJS({
393
+ "src/i18n/ko.json"(exports, module) {
394
+ module.exports = {
395
+ title: "HAI3 \uAC1C\uBC1C \uB3C4\uAD6C",
396
+ aria: {
397
+ openButton: "\uAC1C\uBC1C \uB3C4\uAD6C \uC5F4\uAE30 (Shift+`) \uB610\uB294 \uB4DC\uB798\uADF8\uD558\uC5EC \uC774\uB3D9",
398
+ collapseButton: "\uAC1C\uBC1C \uB3C4\uAD6C \uD328\uB110 \uC811\uAE30",
399
+ resizeHandle: "\uB3C4\uAD6C \uD328\uB110 \uD06C\uAE30 \uC870\uC815"
400
+ },
401
+ controls: {
402
+ heading: "\uAC1C\uBC1C \uC81C\uC5B4",
403
+ screenset: "\uD654\uBA74 \uC138\uD2B8:",
404
+ theme: "\uD14C\uB9C8:",
405
+ language: "\uC5B8\uC5B4:",
406
+ mockApi: "\uBAA8\uC758 API"
407
+ }
408
+ };
409
+ }
410
+ });
411
+
412
+ // src/i18n/ms.json
413
+ var require_ms = __commonJS({
414
+ "src/i18n/ms.json"(exports, module) {
415
+ module.exports = {
416
+ title: "Alat Pembangun HAI3",
417
+ aria: {
418
+ openButton: "Buka Alat Pembangun (Shift+`) atau seret untuk alih",
419
+ collapseButton: "Runtuhkan panel alat pembangun",
420
+ resizeHandle: "Ubah saiz panel alat"
421
+ },
422
+ controls: {
423
+ heading: "Kawalan Pembangunan",
424
+ screenset: "Set Skrin:",
425
+ theme: "Tema:",
426
+ language: "Bahasa:",
427
+ mockApi: "API Palsu"
428
+ }
429
+ };
430
+ }
431
+ });
432
+
433
+ // src/i18n/nl.json
434
+ var require_nl = __commonJS({
435
+ "src/i18n/nl.json"(exports, module) {
436
+ module.exports = {
437
+ title: "HAI3 Ontwikkeltools",
438
+ aria: {
439
+ openButton: "Open Ontwikkeltools (Shift+`) of sleep om te verplaatsen",
440
+ collapseButton: "Ontwikkeltools paneel inklappen",
441
+ resizeHandle: "Formaat van tools paneel wijzigen"
442
+ },
443
+ controls: {
444
+ heading: "Ontwikkelingsbesturing",
445
+ screenset: "Schermset:",
446
+ theme: "Thema:",
447
+ language: "Taal:",
448
+ mockApi: "Nep-API"
449
+ }
450
+ };
451
+ }
452
+ });
453
+
454
+ // src/i18n/no.json
455
+ var require_no = __commonJS({
456
+ "src/i18n/no.json"(exports, module) {
457
+ module.exports = {
458
+ title: "HAI3 Utviklingsverkt\xF8y",
459
+ aria: {
460
+ openButton: "\xC5pne Utviklingsverkt\xF8y (Shift+`) eller dra for \xE5 flytte",
461
+ collapseButton: "Skjul utviklingsverkt\xF8ypanelet",
462
+ resizeHandle: "Endre st\xF8rrelse p\xE5 verkt\xF8ypanelet"
463
+ },
464
+ controls: {
465
+ heading: "Utviklingskontroller",
466
+ screenset: "Skjermsett:",
467
+ theme: "Tema:",
468
+ language: "Spr\xE5k:",
469
+ mockApi: "Mock-API"
470
+ }
471
+ };
472
+ }
473
+ });
474
+
475
+ // src/i18n/pl.json
476
+ var require_pl = __commonJS({
477
+ "src/i18n/pl.json"(exports, module) {
478
+ module.exports = {
479
+ title: "Narz\u0119dzia programistyczne HAI3",
480
+ aria: {
481
+ openButton: "Otw\xF3rz narz\u0119dzia programistyczne (Shift+`) lub przeci\u0105gnij, aby przenie\u015B\u0107",
482
+ collapseButton: "Zwi\u0144 panel narz\u0119dzi programistycznych",
483
+ resizeHandle: "Zmie\u0144 rozmiar panelu narz\u0119dzi"
484
+ },
485
+ controls: {
486
+ heading: "Kontrolki programistyczne",
487
+ screenset: "Zestaw ekran\xF3w:",
488
+ theme: "Motyw:",
489
+ language: "J\u0119zyk:",
490
+ mockApi: "Fikcyjne API"
491
+ }
492
+ };
493
+ }
494
+ });
495
+
496
+ // src/i18n/pt.json
497
+ var require_pt = __commonJS({
498
+ "src/i18n/pt.json"(exports, module) {
499
+ module.exports = {
500
+ title: "Ferramentas de Desenvolvimento HAI3",
501
+ aria: {
502
+ openButton: "Abrir Ferramentas de Desenvolvimento (Shift+`) ou arrastar para mover",
503
+ collapseButton: "Recolher painel de ferramentas de desenvolvimento",
504
+ resizeHandle: "Redimensionar painel de ferramentas"
505
+ },
506
+ controls: {
507
+ heading: "Controles de Desenvolvimento",
508
+ screenset: "Conjunto de Telas:",
509
+ theme: "Tema:",
510
+ language: "Idioma:",
511
+ mockApi: "API Simulada"
512
+ }
513
+ };
514
+ }
515
+ });
516
+
517
+ // src/i18n/ro.json
518
+ var require_ro = __commonJS({
519
+ "src/i18n/ro.json"(exports, module) {
520
+ module.exports = {
521
+ title: "Instrumente de Dezvoltare HAI3",
522
+ aria: {
523
+ openButton: "Deschide Instrumente de Dezvoltare (Shift+`) sau trage pentru a muta",
524
+ collapseButton: "Restr\xE2nge panoul instrumentelor de dezvoltare",
525
+ resizeHandle: "Redimensioneaz\u0103 panoul instrumentelor"
526
+ },
527
+ controls: {
528
+ heading: "Controale de Dezvoltare",
529
+ screenset: "Set de Ecrane:",
530
+ theme: "Tem\u0103:",
531
+ language: "Limb\u0103:",
532
+ mockApi: "API Simulat"
533
+ }
534
+ };
535
+ }
536
+ });
537
+
538
+ // src/i18n/ru.json
539
+ var require_ru = __commonJS({
540
+ "src/i18n/ru.json"(exports, module) {
541
+ module.exports = {
542
+ title: "\u0418\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u044B \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u043A\u0438 HAI3",
543
+ aria: {
544
+ openButton: "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u044B \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u043A\u0438 (Shift+`) \u0438\u043B\u0438 \u043F\u0435\u0440\u0435\u0442\u0430\u0449\u0438\u0442\u044C \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u043C\u0435\u0449\u0435\u043D\u0438\u044F",
545
+ collapseButton: "\u0421\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u043F\u0430\u043D\u0435\u043B\u044C \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u043A\u0438",
546
+ resizeHandle: "\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u0440\u0430\u0437\u043C\u0435\u0440 \u043F\u0430\u043D\u0435\u043B\u0438 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432"
547
+ },
548
+ controls: {
549
+ heading: "\u042D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u043A\u043E\u0439",
550
+ screenset: "\u041D\u0430\u0431\u043E\u0440 \u044D\u043A\u0440\u0430\u043D\u043E\u0432:",
551
+ theme: "\u0422\u0435\u043C\u0430:",
552
+ language: "\u042F\u0437\u044B\u043A:",
553
+ mockApi: "\u0424\u0438\u043A\u0442\u0438\u0432\u043D\u044B\u0439 API"
554
+ }
555
+ };
556
+ }
557
+ });
558
+
559
+ // src/i18n/sv.json
560
+ var require_sv = __commonJS({
561
+ "src/i18n/sv.json"(exports, module) {
562
+ module.exports = {
563
+ title: "HAI3 Utvecklingsverktyg",
564
+ aria: {
565
+ openButton: "\xD6ppna Utvecklingsverktyg (Shift+`) eller dra f\xF6r att flytta",
566
+ collapseButton: "F\xE4ll ihop utvecklingsverktygspanelen",
567
+ resizeHandle: "\xC4ndra storlek p\xE5 verktygspanelen"
568
+ },
569
+ controls: {
570
+ heading: "Utvecklingskontroller",
571
+ screenset: "Sk\xE4rmupps\xE4ttning:",
572
+ theme: "Tema:",
573
+ language: "Spr\xE5k:",
574
+ mockApi: "Mock-API"
575
+ }
576
+ };
577
+ }
578
+ });
579
+
580
+ // src/i18n/sw.json
581
+ var require_sw = __commonJS({
582
+ "src/i18n/sw.json"(exports, module) {
583
+ module.exports = {
584
+ title: "Zana za Utengenezaji wa HAI3",
585
+ aria: {
586
+ openButton: "Fungua Zana za Utengenezaji (Shift+`) au buruta ili kuhamisha",
587
+ collapseButton: "Kunja paneli ya zana za utengenezaji",
588
+ resizeHandle: "Badilisha ukubwa wa paneli ya zana"
589
+ },
590
+ controls: {
591
+ heading: "Vidhibiti vya Maendeleo",
592
+ screenset: "Seti ya Skrini:",
593
+ theme: "Mandhari:",
594
+ language: "Lugha:",
595
+ mockApi: "API ya Majaribio"
596
+ }
597
+ };
598
+ }
599
+ });
600
+
601
+ // src/i18n/ta.json
602
+ var require_ta = __commonJS({
603
+ "src/i18n/ta.json"(exports, module) {
604
+ module.exports = {
605
+ title: "HAI3 \u0BAE\u0BC7\u0BAE\u0BCD\u0BAA\u0BBE\u0B9F\u0BCD\u0B9F\u0BC1 \u0B95\u0BB0\u0BC1\u0BB5\u0BBF\u0B95\u0BB3\u0BCD",
606
+ aria: {
607
+ openButton: "\u0BAE\u0BC7\u0BAE\u0BCD\u0BAA\u0BBE\u0B9F\u0BCD\u0B9F\u0BC1 \u0B95\u0BB0\u0BC1\u0BB5\u0BBF\u0B95\u0BB3\u0BC8\u0BA4\u0BCD \u0BA4\u0BBF\u0BB1 (Shift+`) \u0B85\u0BB2\u0BCD\u0BB2\u0BA4\u0BC1 \u0BA8\u0B95\u0BB0\u0BCD\u0BA4\u0BCD\u0BA4 \u0B87\u0BB4\u0BC1\u0B95\u0BCD\u0B95\u0BB5\u0BC1\u0BAE\u0BCD",
608
+ collapseButton: "\u0BAE\u0BC7\u0BAE\u0BCD\u0BAA\u0BBE\u0B9F\u0BCD\u0B9F\u0BC1 \u0B95\u0BB0\u0BC1\u0BB5\u0BBF\u0B95\u0BB3\u0BCD \u0BAA\u0BB2\u0B95\u0BA4\u0BCD\u0BA4\u0BC8 \u0BAE\u0B9F\u0BBF\u0B95\u0BCD\u0B95\u0BB5\u0BC1\u0BAE\u0BCD",
609
+ resizeHandle: "\u0B95\u0BB0\u0BC1\u0BB5\u0BBF\u0B95\u0BB3\u0BCD \u0BAA\u0BB2\u0B95\u0BA4\u0BCD\u0BA4\u0BBF\u0BA9\u0BCD \u0B85\u0BB3\u0BB5\u0BC8 \u0BAE\u0BBE\u0BB1\u0BCD\u0BB1\u0BB5\u0BC1\u0BAE\u0BCD"
610
+ },
611
+ controls: {
612
+ heading: "\u0BAE\u0BC7\u0BAE\u0BCD\u0BAA\u0BBE\u0B9F\u0BCD\u0B9F\u0BC1 \u0B95\u0B9F\u0BCD\u0B9F\u0BC1\u0BAA\u0BCD\u0BAA\u0BBE\u0B9F\u0BC1\u0B95\u0BB3\u0BCD",
613
+ screenset: "\u0BA4\u0BBF\u0BB0\u0BC8\u0BA4\u0BCD \u0BA4\u0BCA\u0B95\u0BC1\u0BAA\u0BCD\u0BAA\u0BC1:",
614
+ theme: "\u0BA4\u0BC0\u0BAE\u0BCD:",
615
+ language: "\u0BAE\u0BCA\u0BB4\u0BBF:",
616
+ mockApi: "\u0BAA\u0BCB\u0BB2\u0BBF API"
617
+ }
618
+ };
619
+ }
620
+ });
621
+
622
+ // src/i18n/th.json
623
+ var require_th = __commonJS({
624
+ "src/i18n/th.json"(exports, module) {
625
+ module.exports = {
626
+ title: "\u0E40\u0E04\u0E23\u0E37\u0E48\u0E2D\u0E07\u0E21\u0E37\u0E2D\u0E1E\u0E31\u0E12\u0E19\u0E32 HAI3",
627
+ aria: {
628
+ openButton: "\u0E40\u0E1B\u0E34\u0E14\u0E40\u0E04\u0E23\u0E37\u0E48\u0E2D\u0E07\u0E21\u0E37\u0E2D\u0E1E\u0E31\u0E12\u0E19\u0E32 (Shift+`) \u0E2B\u0E23\u0E37\u0E2D\u0E25\u0E32\u0E01\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E22\u0E49\u0E32\u0E22",
629
+ collapseButton: "\u0E22\u0E38\u0E1A\u0E41\u0E1C\u0E07\u0E40\u0E04\u0E23\u0E37\u0E48\u0E2D\u0E07\u0E21\u0E37\u0E2D\u0E1E\u0E31\u0E12\u0E19\u0E32",
630
+ resizeHandle: "\u0E1B\u0E23\u0E31\u0E1A\u0E02\u0E19\u0E32\u0E14\u0E41\u0E1C\u0E07\u0E40\u0E04\u0E23\u0E37\u0E48\u0E2D\u0E07\u0E21\u0E37\u0E2D"
631
+ },
632
+ controls: {
633
+ heading: "\u0E04\u0E27\u0E1A\u0E04\u0E38\u0E21\u0E01\u0E32\u0E23\u0E1E\u0E31\u0E12\u0E19\u0E32",
634
+ screenset: "\u0E0A\u0E38\u0E14\u0E2B\u0E19\u0E49\u0E32\u0E08\u0E2D:",
635
+ theme: "\u0E18\u0E35\u0E21:",
636
+ language: "\u0E20\u0E32\u0E29\u0E32:",
637
+ mockApi: "API \u0E08\u0E33\u0E25\u0E2D\u0E07"
638
+ }
639
+ };
640
+ }
641
+ });
642
+
643
+ // src/i18n/tl.json
644
+ var require_tl = __commonJS({
645
+ "src/i18n/tl.json"(exports, module) {
646
+ module.exports = {
647
+ title: "Mga Kasangkapan sa Pag-develop ng HAI3",
648
+ aria: {
649
+ openButton: "Buksan ang Mga Kasangkapan sa Pag-develop (Shift+`) o i-drag upang ilipat",
650
+ collapseButton: "I-collapse ang panel ng mga kasangkapan sa pag-develop",
651
+ resizeHandle: "Baguhin ang laki ng panel ng mga kasangkapan"
652
+ },
653
+ controls: {
654
+ heading: "Mga Kontrol sa Pag-unlad",
655
+ screenset: "Hanay ng Screen:",
656
+ theme: "Tema:",
657
+ language: "Wika:",
658
+ mockApi: "Mock API"
659
+ }
660
+ };
661
+ }
662
+ });
663
+
664
+ // src/i18n/tr.json
665
+ var require_tr = __commonJS({
666
+ "src/i18n/tr.json"(exports, module) {
667
+ module.exports = {
668
+ title: "HAI3 Geli\u015Ftirici Ara\xE7lar\u0131",
669
+ aria: {
670
+ openButton: "Geli\u015Ftirici Ara\xE7lar\u0131n\u0131 A\xE7 (Shift+`) veya ta\u015F\u0131mak i\xE7in s\xFCr\xFCkle",
671
+ collapseButton: "Geli\u015Ftirici ara\xE7lar\u0131 panelini daralt",
672
+ resizeHandle: "Ara\xE7 panelini yeniden boyutland\u0131r"
673
+ },
674
+ controls: {
675
+ heading: "Geli\u015Ftirme Kontrolleri",
676
+ screenset: "Ekran Seti:",
677
+ theme: "Tema:",
678
+ language: "Dil:",
679
+ mockApi: "Sahte API"
680
+ }
681
+ };
682
+ }
683
+ });
684
+
685
+ // src/i18n/uk.json
686
+ var require_uk = __commonJS({
687
+ "src/i18n/uk.json"(exports, module) {
688
+ module.exports = {
689
+ title: "\u0406\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u0438 \u0440\u043E\u0437\u0440\u043E\u0431\u043A\u0438 HAI3",
690
+ aria: {
691
+ openButton: "\u0412\u0456\u0434\u043A\u0440\u0438\u0442\u0438 \u0456\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u0438 \u0440\u043E\u0437\u0440\u043E\u0431\u043A\u0438 (Shift+`) \u0430\u0431\u043E \u043F\u0435\u0440\u0435\u0442\u044F\u0433\u043D\u0443\u0442\u0438 \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u043C\u0456\u0449\u0435\u043D\u043D\u044F",
692
+ collapseButton: "\u0417\u0433\u043E\u0440\u043D\u0443\u0442\u0438 \u043F\u0430\u043D\u0435\u043B\u044C \u0456\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u0456\u0432 \u0440\u043E\u0437\u0440\u043E\u0431\u043A\u0438",
693
+ resizeHandle: "\u0417\u043C\u0456\u043D\u0438\u0442\u0438 \u0440\u043E\u0437\u043C\u0456\u0440 \u043F\u0430\u043D\u0435\u043B\u0456 \u0456\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u0456\u0432"
694
+ },
695
+ controls: {
696
+ heading: "\u0415\u043B\u0435\u043C\u0435\u043D\u0442\u0438 \u043A\u0435\u0440\u0443\u0432\u0430\u043D\u043D\u044F \u0440\u043E\u0437\u0440\u043E\u0431\u043A\u043E\u044E",
697
+ screenset: "\u041D\u0430\u0431\u0456\u0440 \u0435\u043A\u0440\u0430\u043D\u0456\u0432:",
698
+ theme: "\u0422\u0435\u043C\u0430:",
699
+ language: "\u041C\u043E\u0432\u0430:",
700
+ mockApi: "\u0424\u0456\u043A\u0442\u0438\u0432\u043D\u0438\u0439 API"
701
+ }
702
+ };
703
+ }
704
+ });
705
+
706
+ // src/i18n/ur.json
707
+ var require_ur = __commonJS({
708
+ "src/i18n/ur.json"(exports, module) {
709
+ module.exports = {
710
+ title: "HAI3 \u0688\u0648\u06CC\u0644\u067E\u0645\u0646\u0679 \u0679\u0648\u0644\u0632",
711
+ aria: {
712
+ openButton: "\u0688\u0648\u06CC\u0644\u067E\u0645\u0646\u0679 \u0679\u0648\u0644\u0632 \u06A9\u06BE\u0648\u0644\u06CC\u06BA (Shift+`) \u06CC\u0627 \u0645\u0646\u062A\u0642\u0644 \u06A9\u0631\u0646\u06D2 \u06A9\u06D2 \u0644\u06CC\u06D2 \u06AF\u06BE\u0633\u06CC\u0679\u06CC\u06BA",
713
+ collapseButton: "\u0688\u0648\u06CC\u0644\u067E\u0645\u0646\u0679 \u0679\u0648\u0644\u0632 \u067E\u06CC\u0646\u0644 \u06A9\u0648 \u0633\u06A9\u06CC\u0691\u06CC\u06BA",
714
+ resizeHandle: "\u0679\u0648\u0644\u0632 \u067E\u06CC\u0646\u0644 \u06A9\u0627 \u0633\u0627\u0626\u0632 \u062A\u0628\u062F\u06CC\u0644 \u06A9\u0631\u06CC\u06BA"
715
+ },
716
+ controls: {
717
+ heading: "\u0688\u0648\u06CC\u0644\u067E\u0645\u0646\u0679 \u06A9\u0646\u0679\u0631\u0648\u0644\u0632",
718
+ screenset: "\u0627\u0633\u06A9\u0631\u06CC\u0646 \u0633\u06CC\u0679:",
719
+ theme: "\u062A\u06BE\u06CC\u0645:",
720
+ language: "\u0632\u0628\u0627\u0646:",
721
+ mockApi: "\u0641\u0631\u0636\u06CC API"
722
+ }
723
+ };
724
+ }
725
+ });
726
+
727
+ // src/i18n/vi.json
728
+ var require_vi = __commonJS({
729
+ "src/i18n/vi.json"(exports, module) {
730
+ module.exports = {
731
+ title: "C\xF4ng c\u1EE5 Ph\xE1t tri\u1EC3n HAI3",
732
+ aria: {
733
+ openButton: "M\u1EDF C\xF4ng c\u1EE5 Ph\xE1t tri\u1EC3n (Shift+`) ho\u1EB7c k\xE9o \u0111\u1EC3 di chuy\u1EC3n",
734
+ collapseButton: "Thu g\u1ECDn b\u1EA3ng c\xF4ng c\u1EE5 ph\xE1t tri\u1EC3n",
735
+ resizeHandle: "Thay \u0111\u1ED5i k\xEDch th\u01B0\u1EDBc b\u1EA3ng c\xF4ng c\u1EE5"
736
+ },
737
+ controls: {
738
+ heading: "\u0110i\u1EC1u khi\u1EC3n Ph\xE1t tri\u1EC3n",
739
+ screenset: "B\u1ED9 M\xE0n h\xECnh:",
740
+ theme: "Ch\u1EE7 \u0111\u1EC1:",
741
+ language: "Ng\xF4n ng\u1EEF:",
742
+ mockApi: "API Gi\u1EA3 l\u1EADp"
743
+ }
744
+ };
745
+ }
746
+ });
747
+
748
+ // src/i18n/zh-TW.json
749
+ var require_zh_TW = __commonJS({
750
+ "src/i18n/zh-TW.json"(exports, module) {
751
+ module.exports = {
752
+ title: "HAI3 \u958B\u767C\u5DE5\u5177",
753
+ aria: {
754
+ openButton: "\u958B\u555F\u958B\u767C\u5DE5\u5177 (Shift+`) \u6216\u62D6\u66F3\u79FB\u52D5",
755
+ collapseButton: "\u6536\u5408\u958B\u767C\u5DE5\u5177\u9762\u677F",
756
+ resizeHandle: "\u8ABF\u6574\u5DE5\u5177\u9762\u677F\u5927\u5C0F"
757
+ },
758
+ controls: {
759
+ heading: "\u958B\u767C\u63A7\u5236\u9805",
760
+ screenset: "\u87A2\u5E55\u96C6:",
761
+ theme: "\u4E3B\u984C:",
762
+ language: "\u8A9E\u8A00:",
763
+ mockApi: "\u6A21\u64EC API"
764
+ }
765
+ };
766
+ }
767
+ });
768
+
769
+ // src/i18n/zh.json
770
+ var require_zh = __commonJS({
771
+ "src/i18n/zh.json"(exports, module) {
772
+ module.exports = {
773
+ title: "HAI3 \u5F00\u53D1\u5DE5\u5177",
774
+ aria: {
775
+ openButton: "\u6253\u5F00\u5F00\u53D1\u5DE5\u5177 (Shift+`) \u6216\u62D6\u52A8\u79FB\u52A8",
776
+ collapseButton: "\u6298\u53E0\u5F00\u53D1\u5DE5\u5177\u9762\u677F",
777
+ resizeHandle: "\u8C03\u6574\u5DE5\u5177\u9762\u677F\u5927\u5C0F"
778
+ },
779
+ controls: {
780
+ heading: "\u5F00\u53D1\u63A7\u5236",
781
+ screenset: "\u5C4F\u5E55\u96C6:",
782
+ theme: "\u4E3B\u9898:",
783
+ language: "\u8BED\u8A00:",
784
+ mockApi: "\u6A21\u62DF API"
785
+ }
786
+ };
787
+ }
788
+ });
789
+
790
+ // src/utils/persistence.ts
791
+ var saveStudioState = (key, value) => {
792
+ try {
793
+ localStorage.setItem(key, JSON.stringify(value));
794
+ } catch (e) {
795
+ console.warn(`[Studio] Failed to save state for ${key}:`, e);
796
+ }
797
+ };
798
+ var loadStudioState = (key, defaultValue) => {
799
+ try {
800
+ const item = localStorage.getItem(key);
801
+ return item ? JSON.parse(item) : defaultValue;
802
+ } catch (e) {
803
+ console.warn(`[Studio] Failed to load state for ${key}:`, e);
804
+ return defaultValue;
805
+ }
806
+ };
807
+
808
+ // src/types.ts
809
+ var PANEL_CONSTRAINTS = {
810
+ MIN_WIDTH: 320,
811
+ MIN_HEIGHT: 400,
812
+ MAX_WIDTH: 600,
813
+ MAX_HEIGHT: 800,
814
+ DEFAULT_WIDTH: 400,
815
+ DEFAULT_HEIGHT: 500
816
+ };
817
+ var BUTTON_SIZE = {
818
+ width: 48,
819
+ height: 48
820
+ };
821
+ var STORAGE_PREFIX = "hai3:studio:";
822
+ var STORAGE_KEYS = {
823
+ POSITION: `${STORAGE_PREFIX}position`,
824
+ SIZE: `${STORAGE_PREFIX}size`,
825
+ COLLAPSED: `${STORAGE_PREFIX}collapsed`,
826
+ BUTTON_POSITION: `${STORAGE_PREFIX}buttonPosition`
827
+ };
828
+
829
+ // src/events/studioEvents.ts
830
+ var StudioEvents = {
831
+ PositionChanged: "studio/positionChanged",
832
+ SizeChanged: "studio/sizeChanged",
833
+ ButtonPositionChanged: "studio/buttonPositionChanged"
834
+ };
835
+
836
+ // src/effects/persistenceEffects.ts
837
+ var initPersistenceEffects = () => {
838
+ const positionSubscription = eventBus.on(
839
+ StudioEvents.PositionChanged,
840
+ ({ position }) => {
841
+ saveStudioState(STORAGE_KEYS.POSITION, position);
842
+ }
843
+ );
844
+ const sizeSubscription = eventBus.on(
845
+ StudioEvents.SizeChanged,
846
+ ({ size }) => {
847
+ saveStudioState(STORAGE_KEYS.SIZE, size);
848
+ }
849
+ );
850
+ const buttonPositionSubscription = eventBus.on(
851
+ StudioEvents.ButtonPositionChanged,
852
+ ({ position }) => {
853
+ saveStudioState(STORAGE_KEYS.BUTTON_POSITION, position);
854
+ }
855
+ );
856
+ return () => {
857
+ positionSubscription.unsubscribe();
858
+ sizeSubscription.unsubscribe();
859
+ buttonPositionSubscription.unsubscribe();
860
+ };
861
+ };
862
+ var studioTranslations = I18nRegistry.createLoader({
863
+ [Language.English]: () => Promise.resolve().then(() => __toESM(require_en())),
864
+ [Language.Arabic]: () => Promise.resolve().then(() => __toESM(require_ar())),
865
+ [Language.Bengali]: () => Promise.resolve().then(() => __toESM(require_bn())),
866
+ [Language.Czech]: () => Promise.resolve().then(() => __toESM(require_cs())),
867
+ [Language.Danish]: () => Promise.resolve().then(() => __toESM(require_da())),
868
+ [Language.German]: () => Promise.resolve().then(() => __toESM(require_de())),
869
+ [Language.Greek]: () => Promise.resolve().then(() => __toESM(require_el())),
870
+ [Language.Spanish]: () => Promise.resolve().then(() => __toESM(require_es())),
871
+ [Language.Persian]: () => Promise.resolve().then(() => __toESM(require_fa())),
872
+ [Language.Finnish]: () => Promise.resolve().then(() => __toESM(require_fi())),
873
+ [Language.French]: () => Promise.resolve().then(() => __toESM(require_fr())),
874
+ [Language.Hebrew]: () => Promise.resolve().then(() => __toESM(require_he())),
875
+ [Language.Hindi]: () => Promise.resolve().then(() => __toESM(require_hi())),
876
+ [Language.Hungarian]: () => Promise.resolve().then(() => __toESM(require_hu())),
877
+ [Language.Indonesian]: () => Promise.resolve().then(() => __toESM(require_id())),
878
+ [Language.Italian]: () => Promise.resolve().then(() => __toESM(require_it())),
879
+ [Language.Japanese]: () => Promise.resolve().then(() => __toESM(require_ja())),
880
+ [Language.Korean]: () => Promise.resolve().then(() => __toESM(require_ko())),
881
+ [Language.Malay]: () => Promise.resolve().then(() => __toESM(require_ms())),
882
+ [Language.Dutch]: () => Promise.resolve().then(() => __toESM(require_nl())),
883
+ [Language.Norwegian]: () => Promise.resolve().then(() => __toESM(require_no())),
884
+ [Language.Polish]: () => Promise.resolve().then(() => __toESM(require_pl())),
885
+ [Language.Portuguese]: () => Promise.resolve().then(() => __toESM(require_pt())),
886
+ [Language.Romanian]: () => Promise.resolve().then(() => __toESM(require_ro())),
887
+ [Language.Russian]: () => Promise.resolve().then(() => __toESM(require_ru())),
888
+ [Language.Swedish]: () => Promise.resolve().then(() => __toESM(require_sv())),
889
+ [Language.Swahili]: () => Promise.resolve().then(() => __toESM(require_sw())),
890
+ [Language.Tamil]: () => Promise.resolve().then(() => __toESM(require_ta())),
891
+ [Language.Thai]: () => Promise.resolve().then(() => __toESM(require_th())),
892
+ [Language.Tagalog]: () => Promise.resolve().then(() => __toESM(require_tl())),
893
+ [Language.Turkish]: () => Promise.resolve().then(() => __toESM(require_tr())),
894
+ [Language.Ukrainian]: () => Promise.resolve().then(() => __toESM(require_uk())),
895
+ [Language.Urdu]: () => Promise.resolve().then(() => __toESM(require_ur())),
896
+ [Language.Vietnamese]: () => Promise.resolve().then(() => __toESM(require_vi())),
897
+ [Language.ChineseTraditional]: () => Promise.resolve().then(() => __toESM(require_zh_TW())),
898
+ [Language.ChineseSimplified]: () => Promise.resolve().then(() => __toESM(require_zh()))
899
+ });
900
+ i18nRegistry.registerLoader("studio", studioTranslations);
901
+ var StudioContext = createContext(void 0);
902
+ var useStudioContext = () => {
903
+ const context = useContext(StudioContext);
904
+ if (!context) {
905
+ throw new Error("useStudioContext must be used within StudioProvider");
906
+ }
907
+ return context;
908
+ };
909
+ var StudioProvider = ({ children }) => {
910
+ const [collapsed, setCollapsed] = useState(
911
+ () => loadStudioState(STORAGE_KEYS.COLLAPSED, false)
912
+ );
913
+ const [portalContainer, setPortalContainer] = useState(null);
914
+ useEffect(() => {
915
+ const cleanup = initPersistenceEffects();
916
+ return cleanup;
917
+ }, []);
918
+ const toggleCollapsed = useCallback(() => {
919
+ setCollapsed((prev) => {
920
+ const newValue = !prev;
921
+ saveStudioState(STORAGE_KEYS.COLLAPSED, newValue);
922
+ return newValue;
923
+ });
924
+ }, []);
925
+ return /* @__PURE__ */ jsx(
926
+ StudioContext.Provider,
927
+ {
928
+ value: {
929
+ collapsed,
930
+ toggleCollapsed,
931
+ portalContainer,
932
+ setPortalContainer
933
+ },
934
+ children
935
+ }
936
+ );
937
+ };
938
+ StudioProvider.displayName = "StudioProvider";
939
+ var useDraggable = ({ panelSize, storageKey = STORAGE_KEYS.POSITION }) => {
940
+ const getDefaultPosition = () => ({
941
+ x: window.innerWidth - panelSize.width - 20,
942
+ y: window.innerHeight - panelSize.height - 20
943
+ });
944
+ const [position, setPosition] = useState(
945
+ () => loadStudioState(storageKey, getDefaultPosition())
946
+ );
947
+ const [isDragging, setIsDragging] = useState(false);
948
+ const dragStartPos = useRef({ x: 0, y: 0 });
949
+ const handleMouseDown = useCallback((e) => {
950
+ setIsDragging(true);
951
+ dragStartPos.current = {
952
+ x: e.clientX - position.x,
953
+ y: e.clientY - position.y
954
+ };
955
+ }, [position]);
956
+ useEffect(() => {
957
+ if (!isDragging) return;
958
+ const handleMouseMove = (e) => {
959
+ const newX = clamp(
960
+ e.clientX - dragStartPos.current.x,
961
+ 0,
962
+ window.innerWidth - panelSize.width
963
+ );
964
+ const newY = clamp(
965
+ e.clientY - dragStartPos.current.y,
966
+ 0,
967
+ window.innerHeight - panelSize.height
968
+ );
969
+ const newPosition = { x: newX, y: newY };
970
+ setPosition(newPosition);
971
+ const eventName = storageKey === STORAGE_KEYS.BUTTON_POSITION ? StudioEvents.ButtonPositionChanged : StudioEvents.PositionChanged;
972
+ eventBus.emit(eventName, { position: newPosition });
973
+ };
974
+ const handleMouseUp = () => {
975
+ setIsDragging(false);
976
+ };
977
+ window.addEventListener("mousemove", handleMouseMove);
978
+ window.addEventListener("mouseup", handleMouseUp);
979
+ return () => {
980
+ window.removeEventListener("mousemove", handleMouseMove);
981
+ window.removeEventListener("mouseup", handleMouseUp);
982
+ };
983
+ }, [isDragging, panelSize.width, panelSize.height, storageKey]);
984
+ return {
985
+ position,
986
+ isDragging,
987
+ handleMouseDown
988
+ };
989
+ };
990
+ var useResizable = () => {
991
+ const [size, setSize] = useState(
992
+ () => loadStudioState(STORAGE_KEYS.SIZE, {
993
+ width: PANEL_CONSTRAINTS.DEFAULT_WIDTH,
994
+ height: PANEL_CONSTRAINTS.DEFAULT_HEIGHT
995
+ })
996
+ );
997
+ const [isResizing, setIsResizing] = useState(false);
998
+ const resizeStartRef = useRef(null);
999
+ const handleMouseDown = useCallback((e) => {
1000
+ e.stopPropagation();
1001
+ resizeStartRef.current = {
1002
+ mouseX: e.clientX,
1003
+ mouseY: e.clientY,
1004
+ width: size.width,
1005
+ height: size.height
1006
+ };
1007
+ setIsResizing(true);
1008
+ }, [size.width, size.height]);
1009
+ useEffect(() => {
1010
+ if (!isResizing || !resizeStartRef.current) return;
1011
+ const startState = resizeStartRef.current;
1012
+ document.body.style.userSelect = "none";
1013
+ document.body.style.cursor = "nwse-resize";
1014
+ const handleMouseMove = (e) => {
1015
+ const deltaX = e.clientX - startState.mouseX;
1016
+ const deltaY = e.clientY - startState.mouseY;
1017
+ const newWidth = clamp(
1018
+ startState.width + deltaX,
1019
+ PANEL_CONSTRAINTS.MIN_WIDTH,
1020
+ PANEL_CONSTRAINTS.MAX_WIDTH
1021
+ );
1022
+ const newHeight = clamp(
1023
+ startState.height + deltaY,
1024
+ PANEL_CONSTRAINTS.MIN_HEIGHT,
1025
+ PANEL_CONSTRAINTS.MAX_HEIGHT
1026
+ );
1027
+ const newSize = { width: newWidth, height: newHeight };
1028
+ setSize(newSize);
1029
+ eventBus.emit(StudioEvents.SizeChanged, { size: newSize });
1030
+ };
1031
+ const handleMouseUp = () => {
1032
+ setIsResizing(false);
1033
+ resizeStartRef.current = null;
1034
+ document.body.style.userSelect = "";
1035
+ document.body.style.cursor = "";
1036
+ };
1037
+ window.addEventListener("mousemove", handleMouseMove);
1038
+ window.addEventListener("mouseup", handleMouseUp);
1039
+ return () => {
1040
+ window.removeEventListener("mousemove", handleMouseMove);
1041
+ window.removeEventListener("mouseup", handleMouseUp);
1042
+ document.body.style.userSelect = "";
1043
+ document.body.style.cursor = "";
1044
+ };
1045
+ }, [isResizing]);
1046
+ return {
1047
+ size,
1048
+ isResizing,
1049
+ handleMouseDown
1050
+ };
1051
+ };
1052
+ var ThemeSelector = ({
1053
+ className = ""
1054
+ }) => {
1055
+ const dispatch = useAppDispatch();
1056
+ const currentTheme = useAppSelector((state) => state.uicore.layout.theme);
1057
+ const { portalContainer } = useStudioContext();
1058
+ const { t } = useTranslation();
1059
+ const formatThemeName = (themeName) => {
1060
+ return themeName.split("-").map((word) => upperFirst(word)).join(" ");
1061
+ };
1062
+ const availableThemes = themeRegistry.getThemeNames();
1063
+ return /* @__PURE__ */ jsxs("div", { className: `flex items-center justify-between ${className}`, children: [
1064
+ /* @__PURE__ */ jsx("label", { className: "text-sm text-muted-foreground whitespace-nowrap", children: t("studio:controls.theme") }),
1065
+ /* @__PURE__ */ jsxs(DropdownMenu, { children: [
1066
+ /* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsx(DropdownButton, { variant: ButtonVariant$1.Outline, children: formatThemeName(currentTheme) }) }),
1067
+ /* @__PURE__ */ jsx(DropdownMenuContent, { align: "end", container: portalContainer, className: "z-[99999] pointer-events-auto", children: availableThemes.map((themeName) => /* @__PURE__ */ jsx(
1068
+ DropdownMenuItem,
1069
+ {
1070
+ onClick: () => dispatch(changeTheme(themeName)),
1071
+ children: formatThemeName(themeName)
1072
+ },
1073
+ themeName
1074
+ )) })
1075
+ ] })
1076
+ ] });
1077
+ };
1078
+ ThemeSelector.displayName = "ThemeSelector";
1079
+ var ScreensetSelector = ({
1080
+ options,
1081
+ currentValue,
1082
+ onChange,
1083
+ className = ""
1084
+ }) => {
1085
+ const { portalContainer } = useStudioContext();
1086
+ const { t, direction } = useTranslation();
1087
+ const formatName = (name) => {
1088
+ return name.split(/[-_]/).map((word) => upperFirst(word)).join(" ");
1089
+ };
1090
+ const getCurrentDisplay = () => {
1091
+ const [category, itemId] = currentValue.split(":");
1092
+ if (!category || !itemId) return "Select";
1093
+ const categoryGroup = options.find((opt) => opt.category === category);
1094
+ const item = categoryGroup?.screensets.find((i) => i.id === itemId);
1095
+ return item ? item.name : "Select";
1096
+ };
1097
+ const handleItemClick = (category, itemId) => {
1098
+ onChange(`${category}:${itemId}`);
1099
+ };
1100
+ return /* @__PURE__ */ jsxs("div", { className: `flex items-center justify-between ${className}`, children: [
1101
+ /* @__PURE__ */ jsx("label", { className: "text-sm text-muted-foreground whitespace-nowrap", children: t("studio:controls.screenset") }),
1102
+ /* @__PURE__ */ jsxs(DropdownMenu, { dir: direction, children: [
1103
+ /* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsx(DropdownButton, { variant: ButtonVariant$1.Outline, children: formatName(getCurrentDisplay()) }) }),
1104
+ /* @__PURE__ */ jsx(DropdownMenuContent, { align: "end", container: portalContainer, className: "z-[99999] pointer-events-auto", children: options.map((categoryGroup) => /* @__PURE__ */ jsxs(DropdownMenuSub, { children: [
1105
+ /* @__PURE__ */ jsx(DropdownMenuSubTrigger, { disabled: categoryGroup.screensets.length === 0, children: formatName(categoryGroup.category) }),
1106
+ /* @__PURE__ */ jsx(DropdownMenuSubContent, { container: portalContainer, className: "z-[99999] pointer-events-auto", children: categoryGroup.screensets.map((item) => /* @__PURE__ */ jsx(
1107
+ DropdownMenuItem,
1108
+ {
1109
+ onClick: () => handleItemClick(categoryGroup.category, item.id),
1110
+ children: formatName(item.name)
1111
+ },
1112
+ item.id
1113
+ )) })
1114
+ ] }, categoryGroup.category)) })
1115
+ ] })
1116
+ ] });
1117
+ };
1118
+ ScreensetSelector.displayName = "ScreensetSelector";
1119
+ var FALLBACK_SELECT_LANGUAGE_TEXT = "Select language";
1120
+ var RTL_INDICATOR_SUFFIX = " (RTL)";
1121
+ function LanguageSelector({
1122
+ displayMode = LanguageDisplayMode.Native
1123
+ } = {}) {
1124
+ const { t, language, changeLanguage, getSupportedLanguages } = useTranslation();
1125
+ const { portalContainer } = useStudioContext();
1126
+ const languages = getSupportedLanguages();
1127
+ const currentLanguage = languages.find((lang) => lang.code === language);
1128
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
1129
+ /* @__PURE__ */ jsx("label", { className: "text-sm text-muted-foreground whitespace-nowrap", children: t("studio:controls.language") }),
1130
+ /* @__PURE__ */ jsxs(DropdownMenu, { children: [
1131
+ /* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsx(Button, { variant: ButtonVariant$1.Outline, children: currentLanguage ? displayMode === LanguageDisplayMode.Native ? currentLanguage.name : currentLanguage.englishName : FALLBACK_SELECT_LANGUAGE_TEXT }) }),
1132
+ /* @__PURE__ */ jsx(DropdownMenuContent, { align: "end", container: portalContainer, className: "z-[99999] pointer-events-auto", children: languages.map((lang) => /* @__PURE__ */ jsxs(
1133
+ DropdownMenuItem,
1134
+ {
1135
+ onClick: () => changeLanguage(lang.code),
1136
+ children: [
1137
+ displayMode === LanguageDisplayMode.Native ? lang.name : lang.englishName,
1138
+ lang.direction === TextDirection.RightToLeft && RTL_INDICATOR_SUFFIX
1139
+ ]
1140
+ },
1141
+ lang.code
1142
+ )) })
1143
+ ] })
1144
+ ] });
1145
+ }
1146
+ var ApiModeToggle = ({ className }) => {
1147
+ const useMockApi = useAppSelector((state) => state.uicore.app.useMockApi);
1148
+ const { t } = useTranslation();
1149
+ return /* @__PURE__ */ jsxs("div", { className: `flex items-center justify-between h-9 ${className}`, children: [
1150
+ /* @__PURE__ */ jsx(
1151
+ "label",
1152
+ {
1153
+ htmlFor: "api-mode-toggle",
1154
+ className: "text-sm text-muted-foreground cursor-pointer select-none whitespace-nowrap",
1155
+ children: t("studio:controls.mockApi")
1156
+ }
1157
+ ),
1158
+ /* @__PURE__ */ jsx(
1159
+ Switch,
1160
+ {
1161
+ id: "api-mode-toggle",
1162
+ checked: useMockApi,
1163
+ onCheckedChange: (checked) => setApiMode(checked)
1164
+ }
1165
+ )
1166
+ ] });
1167
+ };
1168
+ ApiModeToggle.displayName = "ApiModeToggle";
1169
+ var ALL_CATEGORIES = [ScreensetCategory.Drafts, ScreensetCategory.Mockups, ScreensetCategory.Production];
1170
+ var buildScreensetOptions = () => {
1171
+ return ALL_CATEGORIES.map((category) => ({
1172
+ category,
1173
+ screensets: screensetRegistry.getMetadataByCategory(category)
1174
+ }));
1175
+ };
1176
+ var ControlPanel = () => {
1177
+ const dispatch = useAppDispatch();
1178
+ const currentScreenset = useAppSelector((state) => state.uicore.layout.currentScreenset);
1179
+ const [screensetOptions, setScreensetOptions] = useState([]);
1180
+ const { t } = useTranslation();
1181
+ useEffect(() => {
1182
+ const options = buildScreensetOptions();
1183
+ setScreensetOptions(options);
1184
+ }, []);
1185
+ return /* @__PURE__ */ jsx("div", { className: "space-y-4", children: /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
1186
+ /* @__PURE__ */ jsx("h3", { className: "text-xs font-semibold text-muted-foreground uppercase tracking-wider", children: t("studio:controls.heading") }),
1187
+ /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
1188
+ screensetOptions.length > 0 && /* @__PURE__ */ jsx(
1189
+ ScreensetSelector,
1190
+ {
1191
+ options: screensetOptions,
1192
+ currentValue: currentScreenset,
1193
+ onChange: (value) => dispatch(selectScreenset(value))
1194
+ }
1195
+ ),
1196
+ /* @__PURE__ */ jsx(ApiModeToggle, {}),
1197
+ /* @__PURE__ */ jsx(ThemeSelector, {}),
1198
+ /* @__PURE__ */ jsx(LanguageSelector, {})
1199
+ ] })
1200
+ ] }) });
1201
+ };
1202
+ ControlPanel.displayName = "ControlPanel";
1203
+ var StudioPanel = () => {
1204
+ const { toggleCollapsed, setPortalContainer } = useStudioContext();
1205
+ const { t } = useTranslation();
1206
+ const portalRef = React3.useRef(null);
1207
+ const { size, handleMouseDown: handleResizeMouseDown } = useResizable();
1208
+ const { position, isDragging, handleMouseDown: handleDragMouseDown } = useDraggable({
1209
+ panelSize: size,
1210
+ storageKey: STORAGE_KEYS.POSITION
1211
+ });
1212
+ React3.useEffect(() => {
1213
+ setPortalContainer(portalRef.current);
1214
+ return () => setPortalContainer(null);
1215
+ }, [setPortalContainer]);
1216
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
1217
+ /* @__PURE__ */ jsx(
1218
+ "div",
1219
+ {
1220
+ ref: portalRef,
1221
+ className: "studio-portal-container fixed z-[99999] pointer-events-none"
1222
+ }
1223
+ ),
1224
+ /* @__PURE__ */ jsx(
1225
+ "div",
1226
+ {
1227
+ className: "studio-panel fixed z-[10000]",
1228
+ style: {
1229
+ left: `${position.x}px`,
1230
+ top: `${position.y}px`,
1231
+ width: `${size.width}px`,
1232
+ height: `${size.height}px`
1233
+ },
1234
+ children: /* @__PURE__ */ jsxs(Card, { className: "h-full w-full flex flex-col overflow-hidden bg-white/20 dark:bg-black/50 backdrop-blur-md backdrop-saturate-[180%] border border-white/30 dark:border-white/20 shadow-[0_8px_32px_rgba(0,0,0,0.2)]", children: [
1235
+ /* @__PURE__ */ jsxs(
1236
+ "div",
1237
+ {
1238
+ className: "studio-header px-4 py-3 border-b border-border/50 select-none flex items-center justify-between",
1239
+ onMouseDown: handleDragMouseDown,
1240
+ style: { cursor: isDragging ? "grabbing" : "grab" },
1241
+ children: [
1242
+ /* @__PURE__ */ jsx("h2", { className: "text-sm font-semibold text-foreground", children: t("studio:title") }),
1243
+ /* @__PURE__ */ jsx(
1244
+ Button,
1245
+ {
1246
+ variant: ButtonVariant.Ghost,
1247
+ size: ButtonSize.Sm,
1248
+ onClick: toggleCollapsed,
1249
+ className: "h-7 w-7 p-0",
1250
+ "aria-label": t("studio:aria.collapseButton"),
1251
+ title: t("studio:aria.collapseButton"),
1252
+ children: /* @__PURE__ */ jsx(
1253
+ "svg",
1254
+ {
1255
+ className: "w-4 h-4",
1256
+ fill: "none",
1257
+ stroke: "currentColor",
1258
+ viewBox: "0 0 24 24",
1259
+ children: /* @__PURE__ */ jsx(
1260
+ "path",
1261
+ {
1262
+ strokeLinecap: "round",
1263
+ strokeLinejoin: "round",
1264
+ strokeWidth: 2,
1265
+ d: "M19 9l-7 7-7-7"
1266
+ }
1267
+ )
1268
+ }
1269
+ )
1270
+ }
1271
+ )
1272
+ ]
1273
+ }
1274
+ ),
1275
+ /* @__PURE__ */ jsx("div", { className: "flex-1 overflow-y-auto p-4", children: /* @__PURE__ */ jsx(ControlPanel, {}) }),
1276
+ /* @__PURE__ */ jsx(
1277
+ "div",
1278
+ {
1279
+ className: "studio-resize-handle absolute bottom-1 right-1 w-5 h-5 cursor-nwse-resize",
1280
+ onMouseDown: handleResizeMouseDown,
1281
+ role: "button",
1282
+ "aria-label": t("studio:aria.resizeHandle"),
1283
+ title: t("studio:aria.resizeHandle"),
1284
+ tabIndex: 0,
1285
+ children: /* @__PURE__ */ jsx(
1286
+ "svg",
1287
+ {
1288
+ className: "w-5 h-5 text-muted-foreground/70 hover:text-muted-foreground transition-colors",
1289
+ fill: "currentColor",
1290
+ viewBox: "0 0 24 24",
1291
+ children: /* @__PURE__ */ jsx("path", { d: "M22 22H20V20H22V22ZM22 18H20V16H22V18ZM18 22H16V20H18V22ZM18 18H16V16H18V18ZM14 22H12V20H14V22Z" })
1292
+ }
1293
+ )
1294
+ }
1295
+ )
1296
+ ] })
1297
+ }
1298
+ )
1299
+ ] });
1300
+ };
1301
+ StudioPanel.displayName = "StudioPanel";
1302
+ var useKeyboardShortcut = (handler) => {
1303
+ useEffect(() => {
1304
+ const handleKeyDown = (e) => {
1305
+ if (e.shiftKey && e.code === "Backquote") {
1306
+ e.preventDefault();
1307
+ handler();
1308
+ }
1309
+ };
1310
+ window.addEventListener("keydown", handleKeyDown);
1311
+ return () => {
1312
+ window.removeEventListener("keydown", handleKeyDown);
1313
+ };
1314
+ }, [handler]);
1315
+ };
1316
+ var GlassmorphicButton = ({
1317
+ icon,
1318
+ onMouseDown,
1319
+ onClick,
1320
+ title,
1321
+ isDragging = false
1322
+ }) => {
1323
+ return /* @__PURE__ */ jsx(
1324
+ Button,
1325
+ {
1326
+ variant: ButtonVariant.Ghost,
1327
+ onMouseDown,
1328
+ onClick,
1329
+ title,
1330
+ className: "w-12 h-12 p-0 rounded-full flex items-center justify-center pointer-events-auto bg-white/20 dark:bg-black/50 backdrop-blur-md backdrop-saturate-[180%] border border-white/30 dark:border-white/20 shadow-[0_8px_32px_rgba(0,0,0,0.2)] hover:bg-white/30 dark:hover:bg-black/60 transition-colors",
1331
+ style: { cursor: isDragging ? "grabbing" : "grab" },
1332
+ children: icon
1333
+ }
1334
+ );
1335
+ };
1336
+ GlassmorphicButton.displayName = "GlassmorphicButton";
1337
+ var StudioIcon = ({ className = "" }) => {
1338
+ return /* @__PURE__ */ jsx(
1339
+ "svg",
1340
+ {
1341
+ className,
1342
+ fill: "none",
1343
+ stroke: "currentColor",
1344
+ viewBox: "0 0 24 24",
1345
+ children: /* @__PURE__ */ jsx(
1346
+ "path",
1347
+ {
1348
+ strokeLinecap: "round",
1349
+ strokeLinejoin: "round",
1350
+ strokeWidth: 2,
1351
+ d: "M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4"
1352
+ }
1353
+ )
1354
+ }
1355
+ );
1356
+ };
1357
+ var CollapsedButton = ({ toggleCollapsed }) => {
1358
+ const { t } = useTranslation();
1359
+ const { position, isDragging, handleMouseDown } = useDraggable({
1360
+ panelSize: BUTTON_SIZE,
1361
+ storageKey: STORAGE_KEYS.BUTTON_POSITION
1362
+ });
1363
+ const dragStartPosition = useRef(null);
1364
+ const handleButtonMouseDown = (e) => {
1365
+ dragStartPosition.current = { x: e.clientX, y: e.clientY };
1366
+ handleMouseDown(e);
1367
+ };
1368
+ const handleButtonClick = (e) => {
1369
+ if (dragStartPosition.current) {
1370
+ const dx = Math.abs(e.clientX - dragStartPosition.current.x);
1371
+ const dy = Math.abs(e.clientY - dragStartPosition.current.y);
1372
+ if (dx < 5 && dy < 5) {
1373
+ toggleCollapsed();
1374
+ }
1375
+ }
1376
+ };
1377
+ return /* @__PURE__ */ jsx(
1378
+ "div",
1379
+ {
1380
+ className: "fixed z-[10000]",
1381
+ style: {
1382
+ left: `${position.x}px`,
1383
+ top: `${position.y}px`
1384
+ },
1385
+ children: /* @__PURE__ */ jsx(
1386
+ GlassmorphicButton,
1387
+ {
1388
+ icon: /* @__PURE__ */ jsx(StudioIcon, { className: "w-6 h-6 text-foreground" }),
1389
+ onMouseDown: handleButtonMouseDown,
1390
+ onClick: handleButtonClick,
1391
+ title: t("studio:aria.openButton"),
1392
+ isDragging
1393
+ }
1394
+ )
1395
+ }
1396
+ );
1397
+ };
1398
+ CollapsedButton.displayName = "CollapsedButton";
1399
+ var StudioContent = () => {
1400
+ const { collapsed, toggleCollapsed } = useStudioContext();
1401
+ useKeyboardShortcut(toggleCollapsed);
1402
+ if (collapsed) {
1403
+ return /* @__PURE__ */ jsx(CollapsedButton, { toggleCollapsed });
1404
+ }
1405
+ return /* @__PURE__ */ jsx(StudioPanel, {});
1406
+ };
1407
+ var StudioOverlay = () => {
1408
+ return /* @__PURE__ */ jsx(StudioProvider, { children: /* @__PURE__ */ jsx(StudioContent, {}) });
1409
+ };
1410
+ StudioOverlay.displayName = "StudioOverlay";
1411
+
1412
+ export { StudioOverlay, StudioProvider, useStudioContext };
1413
+ //# sourceMappingURL=index.mjs.map
1414
+ //# sourceMappingURL=index.mjs.map