@arcanejs/toolkit 6.0.0 → 7.0.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 (72) hide show
  1. package/README.md +156 -12
  2. package/dist/backend/components/base.d.mts +1 -1
  3. package/dist/backend/components/base.d.ts +1 -1
  4. package/dist/backend/components/button.d.mts +1 -1
  5. package/dist/backend/components/button.d.ts +1 -1
  6. package/dist/backend/components/button.js +2 -2
  7. package/dist/backend/components/button.mjs +1 -1
  8. package/dist/backend/components/group.d.mts +1 -1
  9. package/dist/backend/components/group.d.ts +1 -1
  10. package/dist/backend/components/group.js +2 -2
  11. package/dist/backend/components/group.mjs +1 -1
  12. package/dist/backend/components/label.d.mts +2 -2
  13. package/dist/backend/components/label.d.ts +2 -2
  14. package/dist/backend/components/label.js +2 -2
  15. package/dist/backend/components/label.mjs +1 -1
  16. package/dist/backend/components/rect.d.mts +2 -2
  17. package/dist/backend/components/rect.d.ts +2 -2
  18. package/dist/backend/components/rect.js +2 -2
  19. package/dist/backend/components/rect.mjs +1 -1
  20. package/dist/backend/components/slider-button.d.mts +2 -2
  21. package/dist/backend/components/slider-button.d.ts +2 -2
  22. package/dist/backend/components/slider-button.js +2 -2
  23. package/dist/backend/components/slider-button.mjs +1 -1
  24. package/dist/backend/components/switch.d.mts +2 -2
  25. package/dist/backend/components/switch.d.ts +2 -2
  26. package/dist/backend/components/switch.js +2 -2
  27. package/dist/backend/components/switch.mjs +1 -1
  28. package/dist/backend/components/tabs.d.mts +3 -3
  29. package/dist/backend/components/tabs.d.ts +3 -3
  30. package/dist/backend/components/tabs.js +2 -2
  31. package/dist/backend/components/tabs.mjs +1 -1
  32. package/dist/backend/components/text-input.d.mts +2 -2
  33. package/dist/backend/components/text-input.d.ts +2 -2
  34. package/dist/backend/components/text-input.js +2 -2
  35. package/dist/backend/components/text-input.mjs +1 -1
  36. package/dist/backend/components/timeline.d.mts +2 -2
  37. package/dist/backend/components/timeline.d.ts +2 -2
  38. package/dist/backend/components/timeline.js +2 -2
  39. package/dist/backend/components/timeline.mjs +1 -1
  40. package/dist/{chunk-53EOA4UE.js → chunk-2K4UT5QB.js} +1 -1
  41. package/dist/{chunk-4OCRZD4F.js → chunk-4AGKM5NT.js} +1 -1
  42. package/dist/{chunk-QAH2OSHR.js → chunk-5B65Q7RL.js} +1 -1
  43. package/dist/{chunk-3TXBS2UN.mjs → chunk-6PS3Q66F.mjs} +1 -1
  44. package/dist/{chunk-LK6MGXYC.mjs → chunk-7MQHRTBE.mjs} +1 -1
  45. package/dist/{chunk-U6FSQBQ3.js → chunk-A3RWE7HZ.js} +6 -4
  46. package/dist/{chunk-NL3W4M7J.js → chunk-CVY55KAR.js} +1 -1
  47. package/dist/{chunk-WDB3IMOP.mjs → chunk-GXJ3JRRK.mjs} +1 -1
  48. package/dist/{chunk-HTCWMJUA.js → chunk-IV3AE3CW.js} +1 -1
  49. package/dist/{chunk-UQWCTVMC.mjs → chunk-JHWFQLLE.mjs} +1 -1
  50. package/dist/{chunk-QB2WPBWV.mjs → chunk-K6V55JTG.mjs} +1 -1
  51. package/dist/{chunk-PG5EAV5X.mjs → chunk-MHSAHTVN.mjs} +1 -1
  52. package/dist/{chunk-KMEDXCBI.mjs → chunk-R5OA7LLZ.mjs} +6 -4
  53. package/dist/{chunk-6ELB27LK.mjs → chunk-RJLYYTZ6.mjs} +1 -1
  54. package/dist/{chunk-3GTEUTFT.js → chunk-TF7N4O5G.js} +1 -1
  55. package/dist/{chunk-E6FGU7DA.mjs → chunk-TULW7CRV.mjs} +4 -4
  56. package/dist/{chunk-6QWYIJLM.js → chunk-UHEZQR2Q.js} +1 -1
  57. package/dist/{chunk-7JIC2XBC.js → chunk-XSKWLJOQ.js} +4 -4
  58. package/dist/frontend/entrypoint.css +836 -0
  59. package/dist/frontend/entrypoint.css.map +7 -0
  60. package/dist/frontend/entrypoint.js +26049 -26682
  61. package/dist/frontend/entrypoint.js.map +4 -4
  62. package/dist/frontend/index.d.mts +4 -6
  63. package/dist/frontend/index.d.ts +4 -6
  64. package/dist/frontend/index.js +83 -300
  65. package/dist/frontend/index.mjs +90 -307
  66. package/dist/index.d.mts +1 -1
  67. package/dist/index.d.ts +1 -1
  68. package/dist/index.js +280 -98
  69. package/dist/index.mjs +250 -68
  70. package/dist/{toolkit-CohVRj6u.d.mts → toolkit-BPqxbDbk.d.mts} +82 -19
  71. package/dist/{toolkit-C_2Y8N9R.d.ts → toolkit-Bglbv3ix.d.ts} +82 -19
  72. package/package.json +15 -20
@@ -5,311 +5,38 @@ import { initialiseListeners } from "@arcanejs/toolkit-frontend/util";
5
5
  // src/frontend/stage.tsx
6
6
  import { patchJson } from "@arcanejs/diff";
7
7
  import {
8
- useState as useState3,
8
+ useState,
9
9
  useRef,
10
10
  useCallback,
11
- useEffect as useEffect2,
11
+ useEffect,
12
12
  useMemo
13
13
  } from "react";
14
- import { styled } from "styled-components";
15
- import {
16
- BaseStyle as BaseStyle2,
17
- GlobalStyle as GlobalStyle2,
18
- DARK_THEME as DARK_THEME2,
19
- LIGHT_THEME as LIGHT_THEME2
20
- } from "@arcanejs/toolkit-frontend/styling";
14
+ import { ThemeRoot } from "@arcanejs/toolkit-frontend/styling";
21
15
  import {
22
16
  GroupStateWrapper,
23
17
  StageContext
24
18
  } from "@arcanejs/toolkit-frontend";
25
-
26
- // ../toolkit-frontend/src/styling.tsx
27
- import {
28
- createGlobalStyle,
29
- css,
30
- ThemeProvider
31
- } from "styled-components";
32
-
33
- // ../toolkit-frontend/src/util/index.ts
34
- import { useEffect, useState as useState2 } from "react";
35
-
36
- // ../toolkit-frontend/src/util/touch.ts
37
- import { useState } from "react";
38
-
39
- // ../toolkit-frontend/src/util/index.ts
40
- var COLOR_SCHEME_SETTINGS = "arcane-color-scheme-preference";
41
- var VALID_COLOR_SCHEME_PREFS = ["auto", "dark", "light"];
42
- var isValidColorSchemePreference = (value) => {
43
- return VALID_COLOR_SCHEME_PREFS.includes(value);
44
- };
45
- var useColorSchemePreferences = () => {
46
- if (typeof window === "undefined") {
47
- return {
48
- colorSchemePreference: "auto",
49
- setColorSchemePreference: () => {
50
- }
51
- };
52
- }
53
- const [preference, setPreference] = useState2(
54
- window.localStorage.getItem(
55
- COLOR_SCHEME_SETTINGS
56
- ) || "auto"
57
- );
58
- const setColorSchemePreference = (newPreference) => {
59
- if (!isValidColorSchemePreference(newPreference)) {
60
- throw new Error(`Invalid color scheme preference: ${newPreference}`);
61
- }
62
- window.localStorage.setItem(COLOR_SCHEME_SETTINGS, newPreference);
63
- window.dispatchEvent(
64
- new StorageEvent("storage", {
65
- key: COLOR_SCHEME_SETTINGS,
66
- newValue: newPreference
67
- })
68
- );
69
- };
70
- useEffect(() => {
71
- const onStorageChange = (event) => {
72
- if (event.key === COLOR_SCHEME_SETTINGS) {
73
- const newValue = event.newValue;
74
- if (isValidColorSchemePreference(newValue)) {
75
- setPreference(newValue);
76
- }
77
- }
78
- };
79
- window.addEventListener("storage", onStorageChange);
80
- return () => {
81
- window.removeEventListener("storage", onStorageChange);
82
- };
83
- }, []);
84
- return {
85
- colorSchemePreference: isValidColorSchemePreference(preference) ? preference : "auto",
86
- setColorSchemePreference
87
- };
88
- };
89
- var usePreferredColorScheme = () => {
90
- const { colorSchemePreference } = useColorSchemePreferences();
91
- const [theme, setTheme] = useState2("light");
92
- useEffect(() => {
93
- if (typeof window !== "undefined") {
94
- const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
95
- setTheme(mediaQuery.matches ? "dark" : "light");
96
- const handleChange = (event) => {
97
- setTheme(event.matches ? "dark" : "light");
98
- };
99
- mediaQuery.addEventListener("change", handleChange);
100
- return () => {
101
- mediaQuery.removeEventListener("change", handleChange);
102
- };
103
- }
104
- }, []);
105
- return colorSchemePreference === "auto" ? theme : colorSchemePreference;
106
- };
107
-
108
- // ../toolkit-frontend/src/styling.tsx
19
+ import { calculateClass } from "@arcanejs/toolkit-frontend/util";
109
20
  import { jsx } from "react/jsx-runtime";
110
- var GlobalStyle = createGlobalStyle`
111
- body {
112
- &.touch-mode * {
113
- cursor: none !important;
114
- }
115
- }
116
- `;
117
- var DARK_THEME = {
118
- pageBg: "#333",
119
- colorGreen: "#98c379",
120
- colorRed: "#e06c75",
121
- colorAmber: "#d19a66",
122
- bgDark1: "#252524",
123
- bg: "#2a2a2b",
124
- bgLight1: "#353638",
125
- borderDark: "#151516",
126
- borderLight: "#1c1d1d",
127
- borderLighter: "#252524",
128
- borderLighterer: "#6b6b67",
129
- hint: "#4286f4",
130
- hintRGB: "66, 134, 244",
131
- hintDark1: "#2a77f3",
132
- textNormal: "#F3F3F5",
133
- textActive: "#ffffff",
134
- textMuted: "#777777",
135
- shadows: {
136
- boxShadowInset: "inset 0px 0px 8px 0px rgba(0, 0, 0, 0.3)",
137
- textShadow: "0 -1px rgba(0, 0, 0, 0.7)",
138
- textShadowActive: "0 -1px rgba(0, 0, 0, 0.4)"
139
- },
140
- gradients: {
141
- button: "linear-gradient(to bottom, #4f5053, #343436)",
142
- buttonHover: "linear-gradient(to bottom, #5e6064, #393a3b)",
143
- buttonActive: "linear-gradient(to bottom, #242525, #37383a)",
144
- buttonPressedHover: "linear-gradient(to bottom, #282929, #414243)",
145
- hintPressed: "linear-gradient(to bottom,#2a77f3,#4286f4)"
146
- },
147
- sizingPx: {
148
- spacing: 15,
149
- unitHeight: 40
150
- }
151
- };
152
- var LIGHT_THEME = {
153
- pageBg: "#f8f9fa",
154
- colorGreen: "#22863a",
155
- colorRed: "#d73a49",
156
- colorAmber: "#b08800",
157
- bgDark1: "#e9ecef",
158
- bg: "#ffffff",
159
- bgLight1: "#f5f5f5",
160
- borderDark: "#c7c7c7",
161
- borderLight: "#d7d7d7",
162
- borderLighter: "#eaecef",
163
- borderLighterer: "#f6f8fa",
164
- hint: "#4286f4",
165
- hintRGB: "0, 92, 197",
166
- hintDark1: "#2a77f3",
167
- textNormal: "#24292e",
168
- textActive: "#202020",
169
- textMuted: "#6a737d",
170
- shadows: {
171
- boxShadowInset: "inset 0px 0px 8px 0px rgba(0, 0, 0, 0.05)",
172
- textShadow: "0 1px rgba(255, 255, 255, 0.7)",
173
- textShadowActive: "0 1px rgba(255, 255, 255, 0.4)"
174
- },
175
- gradients: {
176
- button: "linear-gradient(to bottom, #e1e4e8, #d1d5da)",
177
- buttonHover: "linear-gradient(to bottom, #d1d5da, #c1c6cc)",
178
- buttonActive: "linear-gradient(to bottom, #b1b6bc, #d2d6da)",
179
- buttonPressedHover: "linear-gradient(to bottom, #a1a6ac, #91969c)",
180
- hintPressed: "linear-gradient(to bottom, #438bff, #85b3ff)"
181
- },
182
- sizingPx: DARK_THEME.sizingPx
183
- };
184
- var BaseStyle = createGlobalStyle`
185
- * {
186
- box-sizing: border-box;
187
- }
188
-
189
- body {
190
- background: ${(p) => p.theme.pageBg};
191
- margin: 0;
192
- padding: 0;
193
- font-size: 14px;
194
- font-family: sans-serif;
195
- }
196
- `;
197
- var buttonStateNormal = css`
198
- color: ${(p) => p.theme.textNormal};
199
- background: ${(p) => p.theme.gradients.button};
200
- text-shadow: ${(p) => p.theme.shadows.textShadow};
201
- box-shadow:
202
- inset 0 1px 0 rgba(255, 255, 255, 0.15),
203
- 0 1px 0 0 rgba(0, 0, 0, 0.25);
204
- `;
205
- var buttonStateNormalHover = css`
206
- color: ${(p) => p.theme.textNormal};
207
- outline-color: rgba(243, 243, 245, 0.3);
208
- background: ${(p) => p.theme.gradients.buttonHover};
209
- text-shadow: ${(p) => p.theme.shadows.textShadow};
210
- `;
211
- var buttonStateNormalActive = css`
212
- color: ${(p) => p.theme.textNormal};
213
- outline-color: rgba(255, 255, 255, 0.3);
214
- background: ${(p) => p.theme.gradients.buttonActive};
215
- text-shadow: ${(p) => p.theme.shadows.textShadowActive};
216
- box-shadow:
217
- inset 0 1px 2px rgba(0, 0, 0, 0.2),
218
- 0 1px 0 0 rgba(255, 255, 255, 0.15);
219
- transition-duration: 50ms;
220
- `;
221
- var buttonStatePressed = css`
222
- ${buttonStateNormalActive}
223
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.1), 0 1px 0 0 rgba(255,255,255,0.15);
224
- `;
225
- var buttonStatePressedHover = css`
226
- ${buttonStateNormalActive}
227
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.1), 0 1px 0 0 rgba(255,255,255,0.15);
228
- background: ${(p) => p.theme.gradients.buttonPressedHover};
229
- `;
230
- var buttonStatePressedActive = buttonStateNormalActive;
231
- var buttonStateDisabled = css`
232
- ${buttonStateNormal}
233
-
234
- cursor: default;
235
- background: ${(p) => p.theme.bg} !important;
236
- color: rgba(${(p) => p.theme.textNormal}, 0.4);
237
- `;
238
- var button = css`
239
- position: relative;
240
- box-sizing: border-box;
241
- cursor: pointer;
242
- transition: all 200ms;
243
- border-radius: 3px;
244
- border: 1px solid ${(p) => p.theme.borderDark};
245
- overflow: hidden;
246
- display: flex;
247
- justify-content: center;
248
- align-items: center;
249
- outline-color: transparent;
250
- ${buttonStateNormal}
251
-
252
- &:hover {
253
- ${buttonStateNormalHover}
254
- }
255
-
256
- &:active {
257
- ${buttonStateNormalActive}
258
- }
259
- `;
260
- var buttonPressed = css`
261
- ${buttonStatePressed}
262
-
263
- &:hover {
264
- ${buttonStatePressedHover}
265
- }
266
-
267
- &:active {
268
- ${buttonStatePressedActive}
269
- }
270
- `;
271
- var buttonDisabled = css`
272
- ${buttonStateDisabled}
273
-
274
- &:hover, &:active {
275
- ${buttonStateDisabled}
276
- }
277
- `;
278
- var touchIndicatorNormal = css`
279
- position: absolute;
280
- top: -6px;
281
- right: -6px;
282
- left: -6px;
283
- bottom: -6px;
284
- border-radius: 6px;
285
- border: 2px solid rgba(0, 0, 0, 0);
286
- background-color: none;
287
- transition: border-color 300ms;
288
- `;
289
- var touchIndicatorTouching = css`
290
- border-color: ${(p) => p.theme.hint};
291
- background-color: rgba(${(p) => p.theme.hintRGB}, 0.2);
292
- transition: border-color 0s;
293
- `;
294
- var PreferredThemeProvider = ({ dark, light, children }) => {
295
- const theme = usePreferredColorScheme();
296
- return /* @__PURE__ */ jsx(ThemeProvider, { theme: theme === "dark" ? dark : light, children });
297
- };
298
-
299
- // src/frontend/stage.tsx
300
- import { jsx as jsx2, jsxs } from "react/jsx-runtime";
301
- var Stage = ({ className, renderers }) => {
302
- const [root, setRoot] = useState3(
21
+ var Stage = ({ className, renderers, loadingState }) => {
22
+ const [root, setRoot] = useState(
303
23
  void 0
304
24
  );
305
25
  const socket = useRef(null);
306
- const [connection, setConnection] = useState3({
26
+ const [connection, setConnection] = useState({
307
27
  state: "connecting"
308
28
  });
29
+ const [clockSync, setClockSync] = useState(null);
30
+ const [lastPingMs, setLastPingMs] = useState(null);
31
+ const [bestPing, setBestPing] = useState(null);
309
32
  const calls = useRef({
310
33
  nextId: 1,
311
34
  calls: /* @__PURE__ */ new Map()
312
35
  });
36
+ const pings = useRef({
37
+ nextId: 1,
38
+ pings: /* @__PURE__ */ new Map()
39
+ });
313
40
  const preparedRenderers = useMemo(() => {
314
41
  const prepared = {};
315
42
  for (const renderer of renderers) {
@@ -331,6 +58,7 @@ var Stage = ({ className, renderers }) => {
331
58
  switch (msg.type) {
332
59
  case "metadata":
333
60
  setConnection({ state: "connected", uuid: msg.connectionUuid });
61
+ setClockSync(msg.clockSync);
334
62
  return;
335
63
  case "tree-full":
336
64
  setRoot(msg.root);
@@ -354,6 +82,32 @@ var Stage = ({ className, renderers }) => {
354
82
  }
355
83
  return;
356
84
  }
85
+ case "pong": {
86
+ const ping = pings.current.pings.get(msg.pingId);
87
+ if (!ping) {
88
+ console.warn(
89
+ `Received pong response for unknown ping ID ${msg.pingId}`
90
+ );
91
+ return;
92
+ }
93
+ pings.current.pings.delete(msg.pingId);
94
+ const roundTripMs = performance.now() - ping.sentAtPerfMs;
95
+ const estimatedClientMidpointMs = ping.sentAtUnixMs + roundTripMs / 2;
96
+ const nextTimeDifferenceMs = estimatedClientMidpointMs - msg.serverTimeMillis;
97
+ setLastPingMs(roundTripMs);
98
+ setBestPing(
99
+ (current) => (
100
+ // No best ping yet
101
+ current === null || // Better ping than current best, so this will likely be more precise
102
+ roundTripMs < current.pingMs || // Time difference has changed significantly, so this is likely more accurate even if ping isn't better
103
+ Math.abs(nextTimeDifferenceMs - current.timeDifferenceMs) > roundTripMs ? {
104
+ pingMs: roundTripMs,
105
+ timeDifferenceMs: nextTimeDifferenceMs
106
+ } : current
107
+ )
108
+ );
109
+ return;
110
+ }
357
111
  }
358
112
  }, []);
359
113
  const initializeWebsocket = useCallback(async () => {
@@ -364,6 +118,7 @@ var Stage = ({ className, renderers }) => {
364
118
  console.log("initializing websocket");
365
119
  const wsUrl = new URL(window.location.href);
366
120
  wsUrl.protocol = wsUrl.protocol === "https:" ? "wss:" : "ws:";
121
+ wsUrl.hash = "";
367
122
  const ws = new WebSocket(wsUrl.href);
368
123
  ws.onmessage = (event) => {
369
124
  handleMessage(JSON.parse(event.data));
@@ -416,9 +171,39 @@ var Stage = ({ className, renderers }) => {
416
171
  },
417
172
  []
418
173
  );
419
- useEffect2(() => {
174
+ useEffect(() => {
420
175
  initializeWebsocket();
421
176
  }, [initializeWebsocket]);
177
+ useEffect(() => {
178
+ if (connection.state !== "connected" && clockSync !== null) {
179
+ setClockSync(null);
180
+ }
181
+ setLastPingMs(null);
182
+ setBestPing(null);
183
+ pings.current.pings.clear();
184
+ if (connection.state !== "connected" || clockSync === null) {
185
+ return;
186
+ }
187
+ const sendPing = () => {
188
+ const pingId = pings.current.nextId++;
189
+ pings.current.pings.set(pingId, {
190
+ sentAtUnixMs: Date.now(),
191
+ sentAtPerfMs: performance.now()
192
+ });
193
+ sendMessage({
194
+ type: "ping",
195
+ pingId
196
+ }).catch((error) => {
197
+ pings.current.pings.delete(pingId);
198
+ console.error("Unable to send ping", error);
199
+ });
200
+ };
201
+ sendPing();
202
+ const interval = window.setInterval(sendPing, clockSync.pingIntervalMs);
203
+ return () => {
204
+ window.clearInterval(interval);
205
+ };
206
+ }, [clockSync, connection.state, sendMessage]);
422
207
  const stageContext = useMemo(
423
208
  () => ({
424
209
  sendMessage,
@@ -426,32 +211,30 @@ var Stage = ({ className, renderers }) => {
426
211
  call,
427
212
  connectionUuid: connection.state === "connected" ? connection.uuid : null,
428
213
  connection,
214
+ timeDifferenceMs: bestPing?.timeDifferenceMs ?? null,
215
+ lastPingMs,
429
216
  reconnect: () => void initializeWebsocket()
430
217
  }),
431
- [sendMessage, renderComponent, call, initializeWebsocket, connection]
218
+ [
219
+ sendMessage,
220
+ renderComponent,
221
+ call,
222
+ initializeWebsocket,
223
+ connection,
224
+ bestPing,
225
+ lastPingMs
226
+ ]
432
227
  );
433
- return /* @__PURE__ */ jsx2(StageContext.Provider, { value: stageContext, children: /* @__PURE__ */ jsx2(GroupStateWrapper, { openByDefault: false, children: /* @__PURE__ */ jsx2("div", { className, children: root ? renderComponent(root) : /* @__PURE__ */ jsx2("div", { className: "no-root", children: "No root has been added to the light desk" }) }) }) });
228
+ return /* @__PURE__ */ jsx(StageContext.Provider, { value: stageContext, children: /* @__PURE__ */ jsx(GroupStateWrapper, { openByDefault: false, children: /* @__PURE__ */ jsx("div", { className, children: root ? renderComponent(root) : loadingState?.() ?? /* @__PURE__ */ jsx("div", { className: "arcane-stage__no-root", children: "No root has been added to the light desk" }) }) }) });
434
229
  };
435
- var StyledStage = styled(Stage)`
436
- width: 100%;
437
- height: 100%;
438
- background-color: ${(p) => p.theme.pageBg};
439
- color: ${(p) => p.theme.textNormal};
440
- padding: ${(p) => p.theme.sizingPx.spacing}px;
441
- `;
442
230
  function rootComponent(props) {
443
- return /* @__PURE__ */ jsxs(
444
- PreferredThemeProvider,
231
+ return /* @__PURE__ */ jsx(ThemeRoot, { rootProps: props.themeRootProps, children: /* @__PURE__ */ jsx(
232
+ Stage,
445
233
  {
446
- dark: props.themes?.dark ?? DARK_THEME2,
447
- light: props.themes?.light ?? LIGHT_THEME2,
448
- children: [
449
- /* @__PURE__ */ jsx2(BaseStyle2, {}),
450
- /* @__PURE__ */ jsx2(GlobalStyle2, {}),
451
- /* @__PURE__ */ jsx2(StyledStage, { ...props })
452
- ]
234
+ ...props,
235
+ className: calculateClass("arcane-stage", props.className)
453
236
  }
454
- );
237
+ ) });
455
238
  }
456
239
 
457
240
  // src/frontend/index.ts
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- export { A as AnyComponent, B as Button, G as Group, e as GroupHeader, T as Toolkit, a as ToolkitConnection, d as ToolkitOptions, c as ToolkitServerListener, b as ToolkitServerListenerOptions } from './toolkit-CohVRj6u.mjs';
1
+ export { A as AnyComponent, B as Button, G as Group, l as GroupHeader, T as Toolkit, e as ToolkitAdditionalFiles, f as ToolkitClockSyncOptions, a as ToolkitConnection, g as ToolkitCoreAssetRelativePath, h as ToolkitHtmlPageContext, i as ToolkitOptions, b as ToolkitRenderContext, d as ToolkitServerListener, c as ToolkitServerListenerOptions, j as ToolkitStaticFile, k as ToolkitStaticFileResolver } from './toolkit-BPqxbDbk.mjs';
2
2
  export { Label } from './backend/components/label.mjs';
3
3
  export { Rect } from './backend/components/rect.mjs';
4
4
  export { SliderButton } from './backend/components/slider-button.mjs';
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { A as AnyComponent, B as Button, G as Group, e as GroupHeader, T as Toolkit, a as ToolkitConnection, d as ToolkitOptions, c as ToolkitServerListener, b as ToolkitServerListenerOptions } from './toolkit-C_2Y8N9R.js';
1
+ export { A as AnyComponent, B as Button, G as Group, l as GroupHeader, T as Toolkit, e as ToolkitAdditionalFiles, f as ToolkitClockSyncOptions, a as ToolkitConnection, g as ToolkitCoreAssetRelativePath, h as ToolkitHtmlPageContext, i as ToolkitOptions, b as ToolkitRenderContext, d as ToolkitServerListener, c as ToolkitServerListenerOptions, j as ToolkitStaticFile, k as ToolkitStaticFileResolver } from './toolkit-Bglbv3ix.js';
2
2
  export { Label } from './backend/components/label.js';
3
3
  export { Rect } from './backend/components/rect.js';
4
4
  export { SliderButton } from './backend/components/slider-button.js';