castle-web-cli 0.4.166 → 0.4.167

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 (85) hide show
  1. package/dist/agent.d.ts +1 -2
  2. package/dist/agent.js +22 -13
  3. package/dist/api.js +16 -1
  4. package/dist/imports.js +19 -4
  5. package/dist/localPaths.d.ts +2 -0
  6. package/dist/localPaths.js +6 -0
  7. package/dist/serve.js +5 -1
  8. package/dist/serveSecurity.d.ts +12 -0
  9. package/dist/serveSecurity.js +42 -0
  10. package/dist/shell/assets/{index-CG9TrvCm.js → index-C8M-p00y.js} +36 -36
  11. package/dist/shell/index.html +1 -1
  12. package/kits/base/castle.json +64 -2
  13. package/kits/base/editors/ImageViewer.js +259 -0
  14. package/kits/base/editors/MediaPlayer.js +90 -0
  15. package/kits/base/editors/imageViewer.css +95 -0
  16. package/kits/base/editors/mediaPlayer.css +58 -0
  17. package/kits/multiplayer-2d/castle.json +1 -1
  18. package/kits/multiplayer-2d/package-lock.json +4 -1
  19. package/kits/multiplayer-3d/castle.json +1 -1
  20. package/kits/multiplayer-3d/package-lock.json +1 -1
  21. package/kits/physics-2d/behaviors/Joints.jsx +11 -5
  22. package/kits/physics-2d/behaviors/Sprite.jsx +6 -21
  23. package/kits/physics-2d/castle.json +1 -61
  24. package/kits/physics-2d/editors/BlueprintLibrary.jsx +8 -68
  25. package/kits/physics-2d/editors/SingleEditor.jsx +3 -10
  26. package/kits/physics-2d/editors/editorRegistry.jsx +36 -2
  27. package/kits/physics-2d/engine/art.js +25 -1
  28. package/kits/physics-2d/engine/artThumbnail.jsx +92 -0
  29. package/kits/physics-2d/engine/files.js +4 -15
  30. package/kits/physics-2d/engine/spriteField.jsx +176 -0
  31. package/kits/physics-2d/engine/ui.module.css +136 -0
  32. package/kits/physics-2d/package-lock.json +5 -0
  33. package/kits/physics-2d/pnpm-lock.yaml +96 -3
  34. package/kits/physics-3d/castle.json +1 -1
  35. package/kits/physics-3d/package-lock.json +1 -1
  36. package/kits/physics-3d/pnpm-lock.yaml +88 -3
  37. package/kits/real-time/castle.json +1 -1
  38. package/kits/real-time/package.json +3 -0
  39. package/kits/turn-based/castle.json +1 -1
  40. package/kits/turn-based/package-lock.json +1 -1
  41. package/package.json +1 -1
  42. package/kits/base/node_modules/.package-lock.json +0 -28
  43. package/kits/base/node_modules/castle-web-fonts/README.md +0 -114
  44. package/kits/base/node_modules/castle-web-fonts/dist/catalog.d.ts +0 -18
  45. package/kits/base/node_modules/castle-web-fonts/dist/catalog.js +0 -142
  46. package/kits/base/node_modules/castle-web-fonts/dist/face.d.ts +0 -1
  47. package/kits/base/node_modules/castle-web-fonts/dist/face.js +0 -52
  48. package/kits/base/node_modules/castle-web-fonts/dist/faces/Bore.d.ts +0 -3
  49. package/kits/base/node_modules/castle-web-fonts/dist/faces/Bore.js +0 -10
  50. package/kits/base/node_modules/castle-web-fonts/dist/faces/CourierPrime.d.ts +0 -3
  51. package/kits/base/node_modules/castle-web-fonts/dist/faces/CourierPrime.js +0 -10
  52. package/kits/base/node_modules/castle-web-fonts/dist/faces/DMSans.d.ts +0 -3
  53. package/kits/base/node_modules/castle-web-fonts/dist/faces/DMSans.js +0 -10
  54. package/kits/base/node_modules/castle-web-fonts/dist/faces/Glacier.d.ts +0 -3
  55. package/kits/base/node_modules/castle-web-fonts/dist/faces/Glacier.js +0 -10
  56. package/kits/base/node_modules/castle-web-fonts/dist/faces/HelicoCentrica.d.ts +0 -3
  57. package/kits/base/node_modules/castle-web-fonts/dist/faces/HelicoCentrica.js +0 -10
  58. package/kits/base/node_modules/castle-web-fonts/dist/faces/Piazzolla.d.ts +0 -3
  59. package/kits/base/node_modules/castle-web-fonts/dist/faces/Piazzolla.js +0 -10
  60. package/kits/base/node_modules/castle-web-fonts/dist/faces/Synco.d.ts +0 -3
  61. package/kits/base/node_modules/castle-web-fonts/dist/faces/Synco.js +0 -10
  62. package/kits/base/node_modules/castle-web-fonts/dist/faces/Tektur.d.ts +0 -3
  63. package/kits/base/node_modules/castle-web-fonts/dist/faces/Tektur.js +0 -10
  64. package/kits/base/node_modules/castle-web-fonts/dist/faces/YatraOne.d.ts +0 -3
  65. package/kits/base/node_modules/castle-web-fonts/dist/faces/YatraOne.js +0 -10
  66. package/kits/base/node_modules/castle-web-fonts/dist/index.d.ts +0 -16
  67. package/kits/base/node_modules/castle-web-fonts/dist/index.js +0 -15
  68. package/kits/base/node_modules/castle-web-fonts/licenses/CC-BY-ND-4.0.txt +0 -393
  69. package/kits/base/node_modules/castle-web-fonts/licenses/FONTS.md +0 -64
  70. package/kits/base/node_modules/castle-web-fonts/licenses/OFL-1.1.txt +0 -95
  71. package/kits/base/node_modules/castle-web-fonts/package.json +0 -47
  72. package/kits/base/node_modules/castle-web-fonts/woff2/Bore.woff2 +0 -0
  73. package/kits/base/node_modules/castle-web-fonts/woff2/CourierPrime.woff2 +0 -0
  74. package/kits/base/node_modules/castle-web-fonts/woff2/DMSans.woff2 +0 -0
  75. package/kits/base/node_modules/castle-web-fonts/woff2/Glacier.woff2 +0 -0
  76. package/kits/base/node_modules/castle-web-fonts/woff2/HelicoCentrica.woff2 +0 -0
  77. package/kits/base/node_modules/castle-web-fonts/woff2/Piazzolla.woff2 +0 -0
  78. package/kits/base/node_modules/castle-web-fonts/woff2/SOURCE.txt +0 -2
  79. package/kits/base/node_modules/castle-web-fonts/woff2/Synco.woff2 +0 -0
  80. package/kits/base/node_modules/castle-web-fonts/woff2/Tektur.woff2 +0 -0
  81. package/kits/base/node_modules/castle-web-fonts/woff2/YatraOne.woff2 +0 -0
  82. package/kits/physics-2d/editors/ImageViewer.jsx +0 -206
  83. package/kits/physics-2d/editors/MediaPlayer.jsx +0 -57
  84. package/kits/physics-2d/editors/mediaFile.js +0 -31
  85. package/kits/physics-2d/editors/mediaViewer.module.css +0 -128
@@ -0,0 +1,176 @@
1
+ import React, { useEffect, useLayoutEffect, useRef, useState } from 'react';
2
+ import { createPortal } from 'react-dom';
3
+ import { ArtThumbnail } from './artThumbnail';
4
+ import { cx, FieldRow, Icon, styles } from './ui';
5
+
6
+ // Visual sprite / image picker for inspector fields that point at art files.
7
+ // Anchored popover (same family as FileField), not a modal: thumbnails only,
8
+ // name-without-extension on hover, pick closes. Blank art reuses ArtThumbnail's
9
+ // belt fallback (title in place of the empty canvas).
10
+
11
+ function basenameOf(path) {
12
+ if (!path) return '';
13
+ return path.slice(path.lastIndexOf('/') + 1);
14
+ }
15
+
16
+ function displayNameOf(path) {
17
+ const base = basenameOf(path);
18
+ if (!base) return 'None';
19
+ return base.replace(/\.[^.]+$/, '') || base;
20
+ }
21
+
22
+ function candidatePaths(files, sprites, current, allowEmpty) {
23
+ const paths = [];
24
+ if (allowEmpty) paths.push('');
25
+ const list = files ?? Object.keys(sprites ?? {}).sort();
26
+ for (const path of list) {
27
+ if (path && !paths.includes(path)) paths.push(path);
28
+ }
29
+ if (current && !paths.includes(current)) {
30
+ paths.splice(allowEmpty ? 1 : 0, 0, current);
31
+ }
32
+ return paths;
33
+ }
34
+
35
+ function placePopover(anchor, popover) {
36
+ const margin = 8;
37
+ const gap = 4;
38
+ const rect = anchor.getBoundingClientRect();
39
+ const box = popover.getBoundingClientRect();
40
+ const width = Math.min(Math.max(rect.width, 220), window.innerWidth - margin * 2);
41
+ let left = rect.left;
42
+ if (left + width > window.innerWidth - margin) {
43
+ left = Math.max(margin, window.innerWidth - width - margin);
44
+ }
45
+ let top = rect.bottom + gap;
46
+ if (top + box.height > window.innerHeight - margin) {
47
+ top = Math.max(margin, rect.top - gap - box.height);
48
+ }
49
+ return { top, left, width };
50
+ }
51
+
52
+ function SpritePickerPopover({ paths, current, sprites, anchorRef, onPick, onClose }) {
53
+ const listRef = useRef(null);
54
+ const [pos, setPos] = useState(null);
55
+
56
+ useLayoutEffect(() => {
57
+ if (!anchorRef.current || !listRef.current) return undefined;
58
+ function place() {
59
+ setPos(placePopover(anchorRef.current, listRef.current));
60
+ }
61
+ place();
62
+ window.addEventListener('resize', place);
63
+ window.addEventListener('scroll', place, true);
64
+ return () => {
65
+ window.removeEventListener('resize', place);
66
+ window.removeEventListener('scroll', place, true);
67
+ };
68
+ }, [anchorRef, paths.length]);
69
+
70
+ useEffect(() => {
71
+ function onKeyDown(event) {
72
+ if (event.key === 'Escape') onClose();
73
+ }
74
+ function onPointerDown(event) {
75
+ if (listRef.current?.contains(event.target) || anchorRef.current?.contains(event.target)) {
76
+ return;
77
+ }
78
+ onClose();
79
+ }
80
+ window.addEventListener('keydown', onKeyDown);
81
+ window.addEventListener('pointerdown', onPointerDown);
82
+ return () => {
83
+ window.removeEventListener('keydown', onKeyDown);
84
+ window.removeEventListener('pointerdown', onPointerDown);
85
+ };
86
+ }, [anchorRef, onClose]);
87
+
88
+ return (
89
+ <div
90
+ ref={listRef}
91
+ className={styles.spritePicker}
92
+ role="listbox"
93
+ aria-label="Sprite"
94
+ style={pos ?? { visibility: 'hidden' }}>
95
+ {paths.map((path) => {
96
+ const selected = path === current;
97
+ const name = displayNameOf(path);
98
+ return (
99
+ <button
100
+ key={path || '__none'}
101
+ type="button"
102
+ role="option"
103
+ aria-selected={selected}
104
+ aria-label={name}
105
+ className={cx(styles.spritePickerTile, selected && styles.spritePickerTileSelected)}
106
+ data-name={name}
107
+ onClick={() => onPick(path)}>
108
+ {path ? (
109
+ <ArtThumbnail art={sprites?.[path]} name={name} className={styles.spritePickerThumb} />
110
+ ) : (
111
+ <span className={cx(styles.bpSlotFallback, styles.spritePickerThumb)}>
112
+ <Icon name="times" />
113
+ </span>
114
+ )}
115
+ </button>
116
+ );
117
+ })}
118
+ </div>
119
+ );
120
+ }
121
+
122
+ export function SpriteField({
123
+ label,
124
+ value,
125
+ onChange,
126
+ sprites,
127
+ files,
128
+ allowEmpty = false,
129
+ overridden,
130
+ defaultValue,
131
+ onReset,
132
+ }) {
133
+ const current = value ?? '';
134
+ const [open, setOpen] = useState(false);
135
+ const buttonRef = useRef(null);
136
+ const paths = candidatePaths(files, sprites, current, allowEmpty);
137
+ const art = current ? sprites?.[current] : null;
138
+ const name = current ? displayNameOf(current) : '';
139
+
140
+ return (
141
+ <FieldRow
142
+ label={label}
143
+ overridden={overridden}
144
+ defaultValue={defaultValue ? displayNameOf(defaultValue) : defaultValue}
145
+ onReset={onReset}>
146
+ <button
147
+ ref={buttonRef}
148
+ type="button"
149
+ className={cx(styles.select, styles.fileField, styles.spriteField)}
150
+ aria-haspopup="listbox"
151
+ aria-expanded={open}
152
+ onClick={() => setOpen((next) => !next)}>
153
+ <ArtThumbnail art={art} className={styles.spriteFieldThumb} />
154
+ <span className={cx(styles.fileFieldLabel, !current && styles.fileFieldEmpty)}>
155
+ {current ? name : 'None'}
156
+ </span>
157
+ </button>
158
+ {open
159
+ ? createPortal(
160
+ <SpritePickerPopover
161
+ paths={paths}
162
+ current={current}
163
+ sprites={sprites}
164
+ anchorRef={buttonRef}
165
+ onPick={(path) => {
166
+ onChange(path);
167
+ setOpen(false);
168
+ }}
169
+ onClose={() => setOpen(false)}
170
+ />,
171
+ document.body
172
+ )
173
+ : null}
174
+ </FieldRow>
175
+ );
176
+ }
@@ -465,6 +465,11 @@
465
465
  object-fit: contain;
466
466
  }
467
467
 
468
+ /* Smooth / vector finish is supersampled — nearest-neighbour would re-blockify it. */
469
+ .bpSlotThumbSmooth {
470
+ image-rendering: auto;
471
+ }
472
+
468
473
  .bpSlotFallback {
469
474
  display: inline-flex;
470
475
  align-items: center;
@@ -1871,6 +1876,137 @@
1871
1876
  color: var(--castle-inspector-muted);
1872
1877
  }
1873
1878
 
1879
+ /* SpriteField: closed chrome carries a tiny thumb beside the basename so you
1880
+ can see which art is selected without opening the picker. */
1881
+ .spriteField {
1882
+ gap: 8px;
1883
+ padding-left: 6px;
1884
+ min-height: 32px;
1885
+ }
1886
+
1887
+ .spriteFieldThumb {
1888
+ width: 22px;
1889
+ height: 22px;
1890
+ flex: 0 0 22px;
1891
+ border-radius: 3px;
1892
+ }
1893
+
1894
+ /* Anchored art grid — same shell family as FileField's path list, not a modal. */
1895
+ .spritePicker {
1896
+ position: fixed;
1897
+ z-index: 200;
1898
+ box-sizing: border-box;
1899
+ display: grid;
1900
+ grid-template-columns: repeat(auto-fill, minmax(52px, 1fr));
1901
+ gap: 6px;
1902
+ max-height: min(280px, calc(100vh - 16px));
1903
+ overflow-x: hidden;
1904
+ overflow-y: auto;
1905
+ overscroll-behavior-y: contain;
1906
+ padding: 8px;
1907
+ border: 1px solid var(--castle-inspector-border);
1908
+ border-radius: var(--castle-radius);
1909
+ background: var(--castle-workspace-bg);
1910
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.28);
1911
+ scrollbar-width: thin;
1912
+ }
1913
+
1914
+ .spritePickerTile {
1915
+ position: relative;
1916
+ display: flex;
1917
+ align-items: center;
1918
+ justify-content: center;
1919
+ min-width: 0;
1920
+ aspect-ratio: 1;
1921
+ padding: 4px;
1922
+ border: 1px solid var(--castle-inspector-border);
1923
+ border-radius: 6px;
1924
+ background: var(--castle-inspector-input-bg);
1925
+ color: var(--castle-text);
1926
+ cursor: pointer;
1927
+ }
1928
+
1929
+ .spritePickerTile:hover {
1930
+ border-color: var(--castle-inspector-muted);
1931
+ }
1932
+
1933
+ .spritePickerTileSelected,
1934
+ .spritePickerTileSelected:hover {
1935
+ border-color: var(--castle-selected);
1936
+ box-shadow: 0 0 0 1px var(--castle-selected);
1937
+ }
1938
+
1939
+ /* Name without extension — hover only, so the grid stays pictures.
1940
+ Anchored to the bottom of the tile (not above it) so the top row stays
1941
+ readable and the scrollable picker never clips the label. */
1942
+ .spritePickerTile::after {
1943
+ content: attr(data-name);
1944
+ position: absolute;
1945
+ left: 0;
1946
+ right: 0;
1947
+ bottom: 0;
1948
+ z-index: 1;
1949
+ padding: 3px 4px;
1950
+ border-radius: 0 0 5px 5px;
1951
+ background: rgba(0, 0, 0, 0.72);
1952
+ color: var(--castle-text);
1953
+ font-size: 10px;
1954
+ line-height: 1.2;
1955
+ text-align: center;
1956
+ white-space: nowrap;
1957
+ overflow: hidden;
1958
+ text-overflow: ellipsis;
1959
+ pointer-events: none;
1960
+ opacity: 0;
1961
+ }
1962
+
1963
+ .spritePickerTile:hover::after,
1964
+ .spritePickerTile:focus-visible::after {
1965
+ opacity: 1;
1966
+ }
1967
+
1968
+ .spritePickerThumb {
1969
+ width: 100%;
1970
+ height: 100%;
1971
+ flex: 0 0 auto;
1972
+ max-width: 44px;
1973
+ max-height: 44px;
1974
+ border-radius: 4px;
1975
+ object-fit: contain;
1976
+ }
1977
+
1978
+ /* Picker tiles are larger than the belt's 36px slot — stretch the shared
1979
+ ArtThumbnail chrome (canvas / blank-name / fallback) to fill the tile. */
1980
+ .spritePickerThumb.bpSlotArt,
1981
+ .spritePickerThumb .bpSlotThumb,
1982
+ .spritePickerThumb .bpSlotName,
1983
+ .spritePickerThumb .bpSlotFallback {
1984
+ width: 100%;
1985
+ height: 100%;
1986
+ flex: none;
1987
+ max-width: none;
1988
+ max-height: none;
1989
+ }
1990
+
1991
+ .spritePickerThumb .bpSlotName {
1992
+ font-size: 9px;
1993
+ }
1994
+
1995
+ .spriteFieldThumb.bpSlotArt,
1996
+ .spriteFieldThumb .bpSlotThumb,
1997
+ .spriteFieldThumb .bpSlotName,
1998
+ .spriteFieldThumb .bpSlotFallback {
1999
+ width: 22px;
2000
+ height: 22px;
2001
+ flex: 0 0 22px;
2002
+ max-width: none;
2003
+ max-height: none;
2004
+ }
2005
+
2006
+ .spriteFieldThumb .bpSlotName {
2007
+ font-size: 5.5px;
2008
+ }
2009
+
1874
2010
  .filePicker {
1875
2011
  position: fixed;
1876
2012
  z-index: 200;
@@ -216,6 +216,7 @@
216
216
  "resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz",
217
217
  "integrity": "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==",
218
218
  "license": "MIT",
219
+ "peer": true,
219
220
  "dependencies": {
220
221
  "@dnd-kit/accessibility": "^3.1.1",
221
222
  "@dnd-kit/utilities": "^3.2.2",
@@ -669,6 +670,7 @@
669
670
  "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
670
671
  "dev": true,
671
672
  "license": "MIT",
673
+ "peer": true,
672
674
  "bin": {
673
675
  "acorn": "bin/acorn"
674
676
  },
@@ -1129,6 +1131,7 @@
1129
1131
  "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==",
1130
1132
  "dev": true,
1131
1133
  "license": "MIT",
1134
+ "peer": true,
1132
1135
  "dependencies": {
1133
1136
  "@eslint-community/eslint-utils": "^4.8.0",
1134
1137
  "@eslint-community/regexpp": "^4.12.1",
@@ -2438,6 +2441,7 @@
2438
2441
  "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz",
2439
2442
  "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==",
2440
2443
  "license": "MIT",
2444
+ "peer": true,
2441
2445
  "engines": {
2442
2446
  "node": ">=0.10.0"
2443
2447
  }
@@ -2447,6 +2451,7 @@
2447
2451
  "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz",
2448
2452
  "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==",
2449
2453
  "license": "MIT",
2454
+ "peer": true,
2450
2455
  "dependencies": {
2451
2456
  "scheduler": "^0.27.0"
2452
2457
  },
@@ -23,18 +23,33 @@ importers:
23
23
  '@codemirror/view':
24
24
  specifier: ^6.41.1
25
25
  version: 6.43.1
26
+ '@dnd-kit/core':
27
+ specifier: ^6.3.1
28
+ version: 6.3.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
29
+ '@dnd-kit/modifiers':
30
+ specifier: ^9.0.0
31
+ version: 9.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react@19.2.7)
32
+ '@dnd-kit/sortable':
33
+ specifier: ^10.0.0
34
+ version: 10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react@19.2.7)
35
+ '@dnd-kit/utilities':
36
+ specifier: ^3.2.2
37
+ version: 3.2.2(react@19.2.7)
26
38
  '@fortawesome/free-solid-svg-icons':
27
39
  specifier: ^5.15.4
28
40
  version: 5.15.4
29
41
  '@lezer/highlight':
30
42
  specifier: ^1.2.3
31
43
  version: 1.2.3
32
- castle-web-sdk:
33
- specifier: file:../../sdk
34
- version: file:../../sdk
44
+ castle-web-fonts:
45
+ specifier: ^1.0.0
46
+ version: 1.0.0
35
47
  codemirror:
36
48
  specifier: ^6.0.2
37
49
  version: 6.0.2
50
+ matter-js:
51
+ specifier: ^0.20.0
52
+ version: 0.20.0
38
53
  react:
39
54
  specifier: ^19.2.4
40
55
  version: 19.2.7
@@ -42,6 +57,9 @@ importers:
42
57
  specifier: ^19.2.4
43
58
  version: 19.2.7(react@19.2.7)
44
59
  devDependencies:
60
+ castle-web-sdk:
61
+ specifier: file:../../sdk
62
+ version: file:../../sdk
45
63
  eslint:
46
64
  specifier: ^9.0.0
47
65
  version: 9.39.4
@@ -102,6 +120,34 @@ packages:
102
120
  resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==}
103
121
  engines: {node: '>=0.1.90'}
104
122
 
123
+ '@dnd-kit/accessibility@3.1.1':
124
+ resolution: {integrity: sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==}
125
+ peerDependencies:
126
+ react: '>=16.8.0'
127
+
128
+ '@dnd-kit/core@6.3.1':
129
+ resolution: {integrity: sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==}
130
+ peerDependencies:
131
+ react: '>=16.8.0'
132
+ react-dom: '>=16.8.0'
133
+
134
+ '@dnd-kit/modifiers@9.0.0':
135
+ resolution: {integrity: sha512-ybiLc66qRGuZoC20wdSSG6pDXFikui/dCNGthxv4Ndy8ylErY0N3KVxY2bgo7AWwIbxDmXDg3ylAFmnrjcbVvw==}
136
+ peerDependencies:
137
+ '@dnd-kit/core': ^6.3.0
138
+ react: '>=16.8.0'
139
+
140
+ '@dnd-kit/sortable@10.0.0':
141
+ resolution: {integrity: sha512-+xqhmIIzvAYMGfBYYnbKuNicfSsk4RksY2XdmJhT+HAC01nix6fHCztU68jooFiMUB01Ky3F0FyOvhG/BZrWkg==}
142
+ peerDependencies:
143
+ '@dnd-kit/core': ^6.3.0
144
+ react: '>=16.8.0'
145
+
146
+ '@dnd-kit/utilities@3.2.2':
147
+ resolution: {integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==}
148
+ peerDependencies:
149
+ react: '>=16.8.0'
150
+
105
151
  '@eslint-community/eslint-utils@4.9.1':
106
152
  resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==}
107
153
  engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -291,6 +337,9 @@ packages:
291
337
  resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
292
338
  engines: {node: '>=6'}
293
339
 
340
+ castle-web-fonts@1.0.0:
341
+ resolution: {integrity: sha512-amFts4vVJjaXKNQkh2DMMmxYHafCYczAOvme70n+0WX8fsTqJACh6r6MzND94l89Q6LFoIyrCm+cLh3S1Usy0w==}
342
+
294
343
  castle-web-sdk@file:../../sdk:
295
344
  resolution: {directory: ../../sdk, type: directory}
296
345
 
@@ -624,6 +673,9 @@ packages:
624
673
  resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
625
674
  engines: {node: '>= 0.4'}
626
675
 
676
+ matter-js@0.20.0:
677
+ resolution: {integrity: sha512-iC9fYR7zVT3HppNnsFsp9XOoQdQN2tUyfaKg4CHLH8bN+j6GT4Gw7IH2rP0tflAebrHFw730RR3DkVSZRX8hwA==}
678
+
627
679
  merge-stream@2.0.0:
628
680
  resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
629
681
 
@@ -836,6 +888,9 @@ packages:
836
888
  token-stream@1.0.0:
837
889
  resolution: {integrity: sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==}
838
890
 
891
+ tslib@2.8.1:
892
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
893
+
839
894
  type-check@0.4.0:
840
895
  resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
841
896
  engines: {node: '>= 0.8.0'}
@@ -948,6 +1003,38 @@ snapshots:
948
1003
  '@colors/colors@1.5.0':
949
1004
  optional: true
950
1005
 
1006
+ '@dnd-kit/accessibility@3.1.1(react@19.2.7)':
1007
+ dependencies:
1008
+ react: 19.2.7
1009
+ tslib: 2.8.1
1010
+
1011
+ '@dnd-kit/core@6.3.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7)':
1012
+ dependencies:
1013
+ '@dnd-kit/accessibility': 3.1.1(react@19.2.7)
1014
+ '@dnd-kit/utilities': 3.2.2(react@19.2.7)
1015
+ react: 19.2.7
1016
+ react-dom: 19.2.7(react@19.2.7)
1017
+ tslib: 2.8.1
1018
+
1019
+ '@dnd-kit/modifiers@9.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react@19.2.7)':
1020
+ dependencies:
1021
+ '@dnd-kit/core': 6.3.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
1022
+ '@dnd-kit/utilities': 3.2.2(react@19.2.7)
1023
+ react: 19.2.7
1024
+ tslib: 2.8.1
1025
+
1026
+ '@dnd-kit/sortable@10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react@19.2.7)':
1027
+ dependencies:
1028
+ '@dnd-kit/core': 6.3.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
1029
+ '@dnd-kit/utilities': 3.2.2(react@19.2.7)
1030
+ react: 19.2.7
1031
+ tslib: 2.8.1
1032
+
1033
+ '@dnd-kit/utilities@3.2.2(react@19.2.7)':
1034
+ dependencies:
1035
+ react: 19.2.7
1036
+ tslib: 2.8.1
1037
+
951
1038
  '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4)':
952
1039
  dependencies:
953
1040
  eslint: 9.39.4
@@ -1149,6 +1236,8 @@ snapshots:
1149
1236
 
1150
1237
  callsites@3.1.0: {}
1151
1238
 
1239
+ castle-web-fonts@1.0.0: {}
1240
+
1152
1241
  castle-web-sdk@file:../../sdk: {}
1153
1242
 
1154
1243
  chalk@4.1.2:
@@ -1514,6 +1603,8 @@ snapshots:
1514
1603
 
1515
1604
  math-intrinsics@1.1.0: {}
1516
1605
 
1606
+ matter-js@0.20.0: {}
1607
+
1517
1608
  merge-stream@2.0.0: {}
1518
1609
 
1519
1610
  merge2@1.4.1: {}
@@ -1729,6 +1820,8 @@ snapshots:
1729
1820
 
1730
1821
  token-stream@1.0.0: {}
1731
1822
 
1823
+ tslib@2.8.1: {}
1824
+
1732
1825
  type-check@0.4.0:
1733
1826
  dependencies:
1734
1827
  prelude-ls: 1.2.1
@@ -69,5 +69,5 @@
69
69
  "autoUpdateWhenImported": true,
70
70
  "deckId": "JH0SclbPVP0y",
71
71
  "cardId": "eXfAaUdbSU5A",
72
- "publishedVersion": "2026-09-02T05:55:18.459Z"
72
+ "publishedVersion": "2026-09-05T00:07:37.655Z"
73
73
  }
@@ -35,7 +35,7 @@
35
35
  },
36
36
  "../../sdk": {
37
37
  "name": "castle-web-sdk",
38
- "version": "0.4.23",
38
+ "version": "0.4.26",
39
39
  "dev": true,
40
40
  "devDependencies": {
41
41
  "eslint": "^9.0.0",