├── .editorconfig ├── .gitignore ├── .prettierrc ├── README.md ├── package.json ├── pnpm-lock.yaml ├── rollup.config.js ├── src ├── automutable.tsx ├── base.tsx ├── controls.tsx ├── index.ts └── ui.tsx └── tsconfig.json /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | [*] 3 | charset = utf-8 4 | end_of_line = lf 5 | indent_style = tab 6 | insert_final_newline = true 7 | trim_trailing_whitespace = true 8 | 9 | [*.{js,ts,tsx,scss,json,css,cs}] 10 | indent_size = 3 11 | 12 | [*.{yml,yaml}] 13 | indent_style = space 14 | indent_size = 4 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "endOfLine": "lf", 3 | "printWidth": 110, 4 | "singleQuote": false, 5 | "semi": false, 6 | "useTabs": true, 7 | "trailingComma": "es5" 8 | } 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | `pnpm i -S solid-tweakpane solid-js` 2 | 3 | ## Without binding 4 | `initialValue` prop required in this case. 5 | ```tsx 6 | 7 | console.log(e.value)} 15 | /> 16 | { 19 | // ... 20 | }} 21 | /> 22 | 23 | ``` 24 | ## With binding 25 | Currently it can be used with mutable. 26 | You need to place all elements into and provide target. 27 | Example: 28 | 29 | ```tsx 30 | const settings = createMutable({ 31 | bool: false, 32 | current: 0.01, 33 | folder1: { 34 | bool: true, 35 | folder11: { 36 | number: 2, 37 | color: '#f05', 38 | }, 39 | }, 40 | }) 41 | 42 | 43 | console.log('changed value test', e.value)} 49 | /> 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 72 | 73 | 74 | ``` 75 | ![alt](https://i.imgur.com/kK7IPX8.png) 76 | 77 | It's possible to automatically build Pane from mutable with ``: 78 | 79 | ```jsx 80 | 81 | 82 | 83 | ``` 84 | ![alt](https://i.imgur.com/9mlRCMu.png) 85 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "solid-tweakpane", 3 | "version": "0.6.1", 4 | "type": "module", 5 | "description": "Solid components for Tweakpane library", 6 | "main": "./dist/cjs/index.js", 7 | "module": "./dist/es/index.js", 8 | "types": "./dist/index.d.ts", 9 | "exports": { 10 | "node": { 11 | "import": "./dist/es/index.js", 12 | "require": "./dist/cjs/index.js" 13 | }, 14 | "import": "./dist/es/index.js", 15 | "require": "./dist/cjs/index.js", 16 | "types": "./dist/index.d.ts" 17 | }, 18 | "files": [ 19 | "./dist" 20 | ], 21 | "scripts": { 22 | "build": "rollup -c && tsc" 23 | }, 24 | "keywords": [ 25 | "solid", 26 | "tweakpane" 27 | ], 28 | "author": "foxpro tuningiposadka@gmail.com", 29 | "license": "ISC", 30 | "homepage": "https://github.com/MrFoxPro/solid-tweakpane", 31 | "bugs": { 32 | "url": "https://github.com/MrFoxPro/solid-tweakpane/issues" 33 | }, 34 | "devDependencies": { 35 | "@babel/core": "^7.26.10", 36 | "@babel/preset-typescript": "^7.26.0", 37 | "@rollup/plugin-babel": "^6.0.4", 38 | "@rollup/plugin-commonjs": "^28.0.3", 39 | "@rollup/plugin-node-resolve": "^16.0.1", 40 | "@rollup/plugin-strip": "^3.0.4", 41 | "@types/ts-nameof": "^4.2.5", 42 | "babel-plugin-ts-nameof": "^4.2.1", 43 | "babel-preset-solid": "^1.9.5", 44 | "babel-preset-typescript": "7.0.0-alpha.19", 45 | "prettier": "^3.5.3", 46 | "rollup": "^4.35.0", 47 | "rollup-plugin-delete": "^3.0.1", 48 | "solid-js": "^1.5.4", 49 | "typescript": "^5.8.2" 50 | }, 51 | "dependencies": { 52 | "@tweakpane/core": "^1.1.0", 53 | "tweakpane": "^3.1.0" 54 | }, 55 | "peerDependencies": { 56 | "solid-js": "^1.5.4" 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | '@tweakpane/core': 9 | specifier: ^1.1.0 10 | version: 1.1.0 11 | tweakpane: 12 | specifier: ^3.1.0 13 | version: 3.1.0 14 | 15 | devDependencies: 16 | '@babel/core': 17 | specifier: ^7.26.10 18 | version: 7.26.10 19 | '@babel/preset-typescript': 20 | specifier: ^7.26.0 21 | version: 7.26.0(@babel/core@7.26.10) 22 | '@rollup/plugin-babel': 23 | specifier: ^6.0.4 24 | version: 6.0.4(@babel/core@7.26.10)(rollup@4.35.0) 25 | '@rollup/plugin-commonjs': 26 | specifier: ^28.0.3 27 | version: 28.0.3(rollup@4.35.0) 28 | '@rollup/plugin-node-resolve': 29 | specifier: ^16.0.1 30 | version: 16.0.1(rollup@4.35.0) 31 | '@rollup/plugin-strip': 32 | specifier: ^3.0.4 33 | version: 3.0.4(rollup@4.35.0) 34 | '@types/ts-nameof': 35 | specifier: ^4.2.5 36 | version: 4.2.5 37 | babel-plugin-ts-nameof: 38 | specifier: ^4.2.1 39 | version: 4.2.1 40 | babel-preset-solid: 41 | specifier: ^1.9.5 42 | version: 1.9.5(@babel/core@7.26.10) 43 | babel-preset-typescript: 44 | specifier: 7.0.0-alpha.19 45 | version: 7.0.0-alpha.19 46 | prettier: 47 | specifier: ^3.5.3 48 | version: 3.5.3 49 | rollup: 50 | specifier: ^4.35.0 51 | version: 4.35.0 52 | rollup-plugin-delete: 53 | specifier: ^3.0.1 54 | version: 3.0.1(rollup@4.35.0) 55 | solid-js: 56 | specifier: ^1.5.4 57 | version: 1.5.7 58 | typescript: 59 | specifier: ^5.8.2 60 | version: 5.8.2 61 | 62 | packages: 63 | 64 | /@ampproject/remapping@2.3.0: 65 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 66 | engines: {node: '>=6.0.0'} 67 | dependencies: 68 | '@jridgewell/gen-mapping': 0.3.8 69 | '@jridgewell/trace-mapping': 0.3.25 70 | dev: true 71 | 72 | /@babel/code-frame@7.26.2: 73 | resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} 74 | engines: {node: '>=6.9.0'} 75 | dependencies: 76 | '@babel/helper-validator-identifier': 7.25.9 77 | js-tokens: 4.0.0 78 | picocolors: 1.1.1 79 | dev: true 80 | 81 | /@babel/compat-data@7.26.8: 82 | resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} 83 | engines: {node: '>=6.9.0'} 84 | dev: true 85 | 86 | /@babel/core@7.26.10: 87 | resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} 88 | engines: {node: '>=6.9.0'} 89 | dependencies: 90 | '@ampproject/remapping': 2.3.0 91 | '@babel/code-frame': 7.26.2 92 | '@babel/generator': 7.26.10 93 | '@babel/helper-compilation-targets': 7.26.5 94 | '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) 95 | '@babel/helpers': 7.26.10 96 | '@babel/parser': 7.26.10 97 | '@babel/template': 7.26.9 98 | '@babel/traverse': 7.26.10 99 | '@babel/types': 7.26.10 100 | convert-source-map: 2.0.0 101 | debug: 4.4.0 102 | gensync: 1.0.0-beta.2 103 | json5: 2.2.3 104 | semver: 6.3.1 105 | transitivePeerDependencies: 106 | - supports-color 107 | dev: true 108 | 109 | /@babel/generator@7.26.10: 110 | resolution: {integrity: sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==} 111 | engines: {node: '>=6.9.0'} 112 | dependencies: 113 | '@babel/parser': 7.26.10 114 | '@babel/types': 7.26.10 115 | '@jridgewell/gen-mapping': 0.3.8 116 | '@jridgewell/trace-mapping': 0.3.25 117 | jsesc: 3.1.0 118 | dev: true 119 | 120 | /@babel/helper-annotate-as-pure@7.25.9: 121 | resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} 122 | engines: {node: '>=6.9.0'} 123 | dependencies: 124 | '@babel/types': 7.26.10 125 | dev: true 126 | 127 | /@babel/helper-compilation-targets@7.26.5: 128 | resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} 129 | engines: {node: '>=6.9.0'} 130 | dependencies: 131 | '@babel/compat-data': 7.26.8 132 | '@babel/helper-validator-option': 7.25.9 133 | browserslist: 4.24.4 134 | lru-cache: 5.1.1 135 | semver: 6.3.1 136 | dev: true 137 | 138 | /@babel/helper-create-class-features-plugin@7.26.9(@babel/core@7.26.10): 139 | resolution: {integrity: sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg==} 140 | engines: {node: '>=6.9.0'} 141 | peerDependencies: 142 | '@babel/core': ^7.0.0 143 | dependencies: 144 | '@babel/core': 7.26.10 145 | '@babel/helper-annotate-as-pure': 7.25.9 146 | '@babel/helper-member-expression-to-functions': 7.25.9 147 | '@babel/helper-optimise-call-expression': 7.25.9 148 | '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.10) 149 | '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 150 | '@babel/traverse': 7.26.10 151 | semver: 6.3.1 152 | transitivePeerDependencies: 153 | - supports-color 154 | dev: true 155 | 156 | /@babel/helper-member-expression-to-functions@7.25.9: 157 | resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} 158 | engines: {node: '>=6.9.0'} 159 | dependencies: 160 | '@babel/traverse': 7.26.10 161 | '@babel/types': 7.26.10 162 | transitivePeerDependencies: 163 | - supports-color 164 | dev: true 165 | 166 | /@babel/helper-module-imports@7.18.6: 167 | resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} 168 | engines: {node: '>=6.9.0'} 169 | dependencies: 170 | '@babel/types': 7.26.10 171 | dev: true 172 | 173 | /@babel/helper-module-imports@7.25.9: 174 | resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} 175 | engines: {node: '>=6.9.0'} 176 | dependencies: 177 | '@babel/traverse': 7.26.10 178 | '@babel/types': 7.26.10 179 | transitivePeerDependencies: 180 | - supports-color 181 | dev: true 182 | 183 | /@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10): 184 | resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} 185 | engines: {node: '>=6.9.0'} 186 | peerDependencies: 187 | '@babel/core': ^7.0.0 188 | dependencies: 189 | '@babel/core': 7.26.10 190 | '@babel/helper-module-imports': 7.25.9 191 | '@babel/helper-validator-identifier': 7.25.9 192 | '@babel/traverse': 7.26.10 193 | transitivePeerDependencies: 194 | - supports-color 195 | dev: true 196 | 197 | /@babel/helper-optimise-call-expression@7.25.9: 198 | resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} 199 | engines: {node: '>=6.9.0'} 200 | dependencies: 201 | '@babel/types': 7.26.10 202 | dev: true 203 | 204 | /@babel/helper-plugin-utils@7.26.5: 205 | resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} 206 | engines: {node: '>=6.9.0'} 207 | dev: true 208 | 209 | /@babel/helper-replace-supers@7.26.5(@babel/core@7.26.10): 210 | resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==} 211 | engines: {node: '>=6.9.0'} 212 | peerDependencies: 213 | '@babel/core': ^7.0.0 214 | dependencies: 215 | '@babel/core': 7.26.10 216 | '@babel/helper-member-expression-to-functions': 7.25.9 217 | '@babel/helper-optimise-call-expression': 7.25.9 218 | '@babel/traverse': 7.26.10 219 | transitivePeerDependencies: 220 | - supports-color 221 | dev: true 222 | 223 | /@babel/helper-skip-transparent-expression-wrappers@7.25.9: 224 | resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} 225 | engines: {node: '>=6.9.0'} 226 | dependencies: 227 | '@babel/traverse': 7.26.10 228 | '@babel/types': 7.26.10 229 | transitivePeerDependencies: 230 | - supports-color 231 | dev: true 232 | 233 | /@babel/helper-string-parser@7.25.9: 234 | resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} 235 | engines: {node: '>=6.9.0'} 236 | dev: true 237 | 238 | /@babel/helper-validator-identifier@7.25.9: 239 | resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} 240 | engines: {node: '>=6.9.0'} 241 | dev: true 242 | 243 | /@babel/helper-validator-option@7.25.9: 244 | resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} 245 | engines: {node: '>=6.9.0'} 246 | dev: true 247 | 248 | /@babel/helpers@7.26.10: 249 | resolution: {integrity: sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==} 250 | engines: {node: '>=6.9.0'} 251 | dependencies: 252 | '@babel/template': 7.26.9 253 | '@babel/types': 7.26.10 254 | dev: true 255 | 256 | /@babel/parser@7.26.10: 257 | resolution: {integrity: sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==} 258 | engines: {node: '>=6.0.0'} 259 | hasBin: true 260 | dependencies: 261 | '@babel/types': 7.26.10 262 | dev: true 263 | 264 | /@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.10): 265 | resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} 266 | engines: {node: '>=6.9.0'} 267 | peerDependencies: 268 | '@babel/core': ^7.0.0-0 269 | dependencies: 270 | '@babel/core': 7.26.10 271 | '@babel/helper-plugin-utils': 7.26.5 272 | dev: true 273 | 274 | /@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.10): 275 | resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} 276 | engines: {node: '>=6.9.0'} 277 | peerDependencies: 278 | '@babel/core': ^7.0.0-0 279 | dependencies: 280 | '@babel/core': 7.26.10 281 | '@babel/helper-plugin-utils': 7.26.5 282 | dev: true 283 | 284 | /@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.26.10): 285 | resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==} 286 | engines: {node: '>=6.9.0'} 287 | peerDependencies: 288 | '@babel/core': ^7.0.0-0 289 | dependencies: 290 | '@babel/core': 7.26.10 291 | '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) 292 | '@babel/helper-plugin-utils': 7.26.5 293 | transitivePeerDependencies: 294 | - supports-color 295 | dev: true 296 | 297 | /@babel/plugin-transform-typescript@7.26.8(@babel/core@7.26.10): 298 | resolution: {integrity: sha512-bME5J9AC8ChwA7aEPJ6zym3w7aObZULHhbNLU0bKUhKsAkylkzUdq+0kdymh9rzi8nlNFl2bmldFBCKNJBUpuw==} 299 | engines: {node: '>=6.9.0'} 300 | peerDependencies: 301 | '@babel/core': ^7.0.0-0 302 | dependencies: 303 | '@babel/core': 7.26.10 304 | '@babel/helper-annotate-as-pure': 7.25.9 305 | '@babel/helper-create-class-features-plugin': 7.26.9(@babel/core@7.26.10) 306 | '@babel/helper-plugin-utils': 7.26.5 307 | '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 308 | '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.10) 309 | transitivePeerDependencies: 310 | - supports-color 311 | dev: true 312 | 313 | /@babel/preset-typescript@7.26.0(@babel/core@7.26.10): 314 | resolution: {integrity: sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==} 315 | engines: {node: '>=6.9.0'} 316 | peerDependencies: 317 | '@babel/core': ^7.0.0-0 318 | dependencies: 319 | '@babel/core': 7.26.10 320 | '@babel/helper-plugin-utils': 7.26.5 321 | '@babel/helper-validator-option': 7.25.9 322 | '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) 323 | '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.10) 324 | '@babel/plugin-transform-typescript': 7.26.8(@babel/core@7.26.10) 325 | transitivePeerDependencies: 326 | - supports-color 327 | dev: true 328 | 329 | /@babel/template@7.26.9: 330 | resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} 331 | engines: {node: '>=6.9.0'} 332 | dependencies: 333 | '@babel/code-frame': 7.26.2 334 | '@babel/parser': 7.26.10 335 | '@babel/types': 7.26.10 336 | dev: true 337 | 338 | /@babel/traverse@7.26.10: 339 | resolution: {integrity: sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==} 340 | engines: {node: '>=6.9.0'} 341 | dependencies: 342 | '@babel/code-frame': 7.26.2 343 | '@babel/generator': 7.26.10 344 | '@babel/parser': 7.26.10 345 | '@babel/template': 7.26.9 346 | '@babel/types': 7.26.10 347 | debug: 4.4.0 348 | globals: 11.12.0 349 | transitivePeerDependencies: 350 | - supports-color 351 | dev: true 352 | 353 | /@babel/types@7.26.10: 354 | resolution: {integrity: sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==} 355 | engines: {node: '>=6.9.0'} 356 | dependencies: 357 | '@babel/helper-string-parser': 7.25.9 358 | '@babel/helper-validator-identifier': 7.25.9 359 | dev: true 360 | 361 | /@jridgewell/gen-mapping@0.3.8: 362 | resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} 363 | engines: {node: '>=6.0.0'} 364 | dependencies: 365 | '@jridgewell/set-array': 1.2.1 366 | '@jridgewell/sourcemap-codec': 1.5.0 367 | '@jridgewell/trace-mapping': 0.3.25 368 | dev: true 369 | 370 | /@jridgewell/resolve-uri@3.1.2: 371 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 372 | engines: {node: '>=6.0.0'} 373 | dev: true 374 | 375 | /@jridgewell/set-array@1.2.1: 376 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 377 | engines: {node: '>=6.0.0'} 378 | dev: true 379 | 380 | /@jridgewell/sourcemap-codec@1.5.0: 381 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 382 | dev: true 383 | 384 | /@jridgewell/trace-mapping@0.3.25: 385 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 386 | dependencies: 387 | '@jridgewell/resolve-uri': 3.1.2 388 | '@jridgewell/sourcemap-codec': 1.5.0 389 | dev: true 390 | 391 | /@nodelib/fs.scandir@2.1.5: 392 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 393 | engines: {node: '>= 8'} 394 | dependencies: 395 | '@nodelib/fs.stat': 2.0.5 396 | run-parallel: 1.2.0 397 | dev: true 398 | 399 | /@nodelib/fs.stat@2.0.5: 400 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 401 | engines: {node: '>= 8'} 402 | dev: true 403 | 404 | /@nodelib/fs.walk@1.2.8: 405 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 406 | engines: {node: '>= 8'} 407 | dependencies: 408 | '@nodelib/fs.scandir': 2.1.5 409 | fastq: 1.19.1 410 | dev: true 411 | 412 | /@rollup/plugin-babel@6.0.4(@babel/core@7.26.10)(rollup@4.35.0): 413 | resolution: {integrity: sha512-YF7Y52kFdFT/xVSuVdjkV5ZdX/3YtmX0QulG+x0taQOtJdHYzVU61aSSkAgVJ7NOv6qPkIYiJSgSWWN/DM5sGw==} 414 | engines: {node: '>=14.0.0'} 415 | peerDependencies: 416 | '@babel/core': ^7.0.0 417 | '@types/babel__core': ^7.1.9 418 | rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 419 | peerDependenciesMeta: 420 | '@types/babel__core': 421 | optional: true 422 | rollup: 423 | optional: true 424 | dependencies: 425 | '@babel/core': 7.26.10 426 | '@babel/helper-module-imports': 7.25.9 427 | '@rollup/pluginutils': 5.1.4(rollup@4.35.0) 428 | rollup: 4.35.0 429 | transitivePeerDependencies: 430 | - supports-color 431 | dev: true 432 | 433 | /@rollup/plugin-commonjs@28.0.3(rollup@4.35.0): 434 | resolution: {integrity: sha512-pyltgilam1QPdn+Zd9gaCfOLcnjMEJ9gV+bTw6/r73INdvzf1ah9zLIJBm+kW7R6IUFIQ1YO+VqZtYxZNWFPEQ==} 435 | engines: {node: '>=16.0.0 || 14 >= 14.17'} 436 | peerDependencies: 437 | rollup: ^2.68.0||^3.0.0||^4.0.0 438 | peerDependenciesMeta: 439 | rollup: 440 | optional: true 441 | dependencies: 442 | '@rollup/pluginutils': 5.1.4(rollup@4.35.0) 443 | commondir: 1.0.1 444 | estree-walker: 2.0.2 445 | fdir: 6.4.3(picomatch@4.0.2) 446 | is-reference: 1.2.1 447 | magic-string: 0.30.17 448 | picomatch: 4.0.2 449 | rollup: 4.35.0 450 | dev: true 451 | 452 | /@rollup/plugin-node-resolve@16.0.1(rollup@4.35.0): 453 | resolution: {integrity: sha512-tk5YCxJWIG81umIvNkSod2qK5KyQW19qcBF/B78n1bjtOON6gzKoVeSzAE8yHCZEDmqkHKkxplExA8KzdJLJpA==} 454 | engines: {node: '>=14.0.0'} 455 | peerDependencies: 456 | rollup: ^2.78.0||^3.0.0||^4.0.0 457 | peerDependenciesMeta: 458 | rollup: 459 | optional: true 460 | dependencies: 461 | '@rollup/pluginutils': 5.1.4(rollup@4.35.0) 462 | '@types/resolve': 1.20.2 463 | deepmerge: 4.3.1 464 | is-module: 1.0.0 465 | resolve: 1.22.10 466 | rollup: 4.35.0 467 | dev: true 468 | 469 | /@rollup/plugin-strip@3.0.4(rollup@4.35.0): 470 | resolution: {integrity: sha512-LDRV49ZaavxUo2YoKKMQjCxzCxugu1rCPQa0lDYBOWLj6vtzBMr8DcoJjsmg+s450RbKbe3qI9ZLaSO+O1oNbg==} 471 | engines: {node: '>=14.0.0'} 472 | peerDependencies: 473 | rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 474 | peerDependenciesMeta: 475 | rollup: 476 | optional: true 477 | dependencies: 478 | '@rollup/pluginutils': 5.1.4(rollup@4.35.0) 479 | estree-walker: 2.0.2 480 | magic-string: 0.30.17 481 | rollup: 4.35.0 482 | dev: true 483 | 484 | /@rollup/pluginutils@5.1.4(rollup@4.35.0): 485 | resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} 486 | engines: {node: '>=14.0.0'} 487 | peerDependencies: 488 | rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 489 | peerDependenciesMeta: 490 | rollup: 491 | optional: true 492 | dependencies: 493 | '@types/estree': 1.0.6 494 | estree-walker: 2.0.2 495 | picomatch: 4.0.2 496 | rollup: 4.35.0 497 | dev: true 498 | 499 | /@rollup/rollup-android-arm-eabi@4.35.0: 500 | resolution: {integrity: sha512-uYQ2WfPaqz5QtVgMxfN6NpLD+no0MYHDBywl7itPYd3K5TjjSghNKmX8ic9S8NU8w81NVhJv/XojcHptRly7qQ==} 501 | cpu: [arm] 502 | os: [android] 503 | requiresBuild: true 504 | dev: true 505 | optional: true 506 | 507 | /@rollup/rollup-android-arm64@4.35.0: 508 | resolution: {integrity: sha512-FtKddj9XZudurLhdJnBl9fl6BwCJ3ky8riCXjEw3/UIbjmIY58ppWwPEvU3fNu+W7FUsAsB1CdH+7EQE6CXAPA==} 509 | cpu: [arm64] 510 | os: [android] 511 | requiresBuild: true 512 | dev: true 513 | optional: true 514 | 515 | /@rollup/rollup-darwin-arm64@4.35.0: 516 | resolution: {integrity: sha512-Uk+GjOJR6CY844/q6r5DR/6lkPFOw0hjfOIzVx22THJXMxktXG6CbejseJFznU8vHcEBLpiXKY3/6xc+cBm65Q==} 517 | cpu: [arm64] 518 | os: [darwin] 519 | requiresBuild: true 520 | dev: true 521 | optional: true 522 | 523 | /@rollup/rollup-darwin-x64@4.35.0: 524 | resolution: {integrity: sha512-3IrHjfAS6Vkp+5bISNQnPogRAW5GAV1n+bNCrDwXmfMHbPl5EhTmWtfmwlJxFRUCBZ+tZ/OxDyU08aF6NI/N5Q==} 525 | cpu: [x64] 526 | os: [darwin] 527 | requiresBuild: true 528 | dev: true 529 | optional: true 530 | 531 | /@rollup/rollup-freebsd-arm64@4.35.0: 532 | resolution: {integrity: sha512-sxjoD/6F9cDLSELuLNnY0fOrM9WA0KrM0vWm57XhrIMf5FGiN8D0l7fn+bpUeBSU7dCgPV2oX4zHAsAXyHFGcQ==} 533 | cpu: [arm64] 534 | os: [freebsd] 535 | requiresBuild: true 536 | dev: true 537 | optional: true 538 | 539 | /@rollup/rollup-freebsd-x64@4.35.0: 540 | resolution: {integrity: sha512-2mpHCeRuD1u/2kruUiHSsnjWtHjqVbzhBkNVQ1aVD63CcexKVcQGwJ2g5VphOd84GvxfSvnnlEyBtQCE5hxVVw==} 541 | cpu: [x64] 542 | os: [freebsd] 543 | requiresBuild: true 544 | dev: true 545 | optional: true 546 | 547 | /@rollup/rollup-linux-arm-gnueabihf@4.35.0: 548 | resolution: {integrity: sha512-mrA0v3QMy6ZSvEuLs0dMxcO2LnaCONs1Z73GUDBHWbY8tFFocM6yl7YyMu7rz4zS81NDSqhrUuolyZXGi8TEqg==} 549 | cpu: [arm] 550 | os: [linux] 551 | requiresBuild: true 552 | dev: true 553 | optional: true 554 | 555 | /@rollup/rollup-linux-arm-musleabihf@4.35.0: 556 | resolution: {integrity: sha512-DnYhhzcvTAKNexIql8pFajr0PiDGrIsBYPRvCKlA5ixSS3uwo/CWNZxB09jhIapEIg945KOzcYEAGGSmTSpk7A==} 557 | cpu: [arm] 558 | os: [linux] 559 | requiresBuild: true 560 | dev: true 561 | optional: true 562 | 563 | /@rollup/rollup-linux-arm64-gnu@4.35.0: 564 | resolution: {integrity: sha512-uagpnH2M2g2b5iLsCTZ35CL1FgyuzzJQ8L9VtlJ+FckBXroTwNOaD0z0/UF+k5K3aNQjbm8LIVpxykUOQt1m/A==} 565 | cpu: [arm64] 566 | os: [linux] 567 | requiresBuild: true 568 | dev: true 569 | optional: true 570 | 571 | /@rollup/rollup-linux-arm64-musl@4.35.0: 572 | resolution: {integrity: sha512-XQxVOCd6VJeHQA/7YcqyV0/88N6ysSVzRjJ9I9UA/xXpEsjvAgDTgH3wQYz5bmr7SPtVK2TsP2fQ2N9L4ukoUg==} 573 | cpu: [arm64] 574 | os: [linux] 575 | requiresBuild: true 576 | dev: true 577 | optional: true 578 | 579 | /@rollup/rollup-linux-loongarch64-gnu@4.35.0: 580 | resolution: {integrity: sha512-5pMT5PzfgwcXEwOaSrqVsz/LvjDZt+vQ8RT/70yhPU06PTuq8WaHhfT1LW+cdD7mW6i/J5/XIkX/1tCAkh1W6g==} 581 | cpu: [loong64] 582 | os: [linux] 583 | requiresBuild: true 584 | dev: true 585 | optional: true 586 | 587 | /@rollup/rollup-linux-powerpc64le-gnu@4.35.0: 588 | resolution: {integrity: sha512-c+zkcvbhbXF98f4CtEIP1EBA/lCic5xB0lToneZYvMeKu5Kamq3O8gqrxiYYLzlZH6E3Aq+TSW86E4ay8iD8EA==} 589 | cpu: [ppc64] 590 | os: [linux] 591 | requiresBuild: true 592 | dev: true 593 | optional: true 594 | 595 | /@rollup/rollup-linux-riscv64-gnu@4.35.0: 596 | resolution: {integrity: sha512-s91fuAHdOwH/Tad2tzTtPX7UZyytHIRR6V4+2IGlV0Cej5rkG0R61SX4l4y9sh0JBibMiploZx3oHKPnQBKe4g==} 597 | cpu: [riscv64] 598 | os: [linux] 599 | requiresBuild: true 600 | dev: true 601 | optional: true 602 | 603 | /@rollup/rollup-linux-s390x-gnu@4.35.0: 604 | resolution: {integrity: sha512-hQRkPQPLYJZYGP+Hj4fR9dDBMIM7zrzJDWFEMPdTnTy95Ljnv0/4w/ixFw3pTBMEuuEuoqtBINYND4M7ujcuQw==} 605 | cpu: [s390x] 606 | os: [linux] 607 | requiresBuild: true 608 | dev: true 609 | optional: true 610 | 611 | /@rollup/rollup-linux-x64-gnu@4.35.0: 612 | resolution: {integrity: sha512-Pim1T8rXOri+0HmV4CdKSGrqcBWX0d1HoPnQ0uw0bdp1aP5SdQVNBy8LjYncvnLgu3fnnCt17xjWGd4cqh8/hA==} 613 | cpu: [x64] 614 | os: [linux] 615 | requiresBuild: true 616 | dev: true 617 | optional: true 618 | 619 | /@rollup/rollup-linux-x64-musl@4.35.0: 620 | resolution: {integrity: sha512-QysqXzYiDvQWfUiTm8XmJNO2zm9yC9P/2Gkrwg2dH9cxotQzunBHYr6jk4SujCTqnfGxduOmQcI7c2ryuW8XVg==} 621 | cpu: [x64] 622 | os: [linux] 623 | requiresBuild: true 624 | dev: true 625 | optional: true 626 | 627 | /@rollup/rollup-win32-arm64-msvc@4.35.0: 628 | resolution: {integrity: sha512-OUOlGqPkVJCdJETKOCEf1mw848ZyJ5w50/rZ/3IBQVdLfR5jk/6Sr5m3iO2tdPgwo0x7VcncYuOvMhBWZq8ayg==} 629 | cpu: [arm64] 630 | os: [win32] 631 | requiresBuild: true 632 | dev: true 633 | optional: true 634 | 635 | /@rollup/rollup-win32-ia32-msvc@4.35.0: 636 | resolution: {integrity: sha512-2/lsgejMrtwQe44glq7AFFHLfJBPafpsTa6JvP2NGef/ifOa4KBoglVf7AKN7EV9o32evBPRqfg96fEHzWo5kw==} 637 | cpu: [ia32] 638 | os: [win32] 639 | requiresBuild: true 640 | dev: true 641 | optional: true 642 | 643 | /@rollup/rollup-win32-x64-msvc@4.35.0: 644 | resolution: {integrity: sha512-PIQeY5XDkrOysbQblSW7v3l1MDZzkTEzAfTPkj5VAu3FW8fS4ynyLg2sINp0fp3SjZ8xkRYpLqoKcYqAkhU1dw==} 645 | cpu: [x64] 646 | os: [win32] 647 | requiresBuild: true 648 | dev: true 649 | optional: true 650 | 651 | /@sindresorhus/merge-streams@2.3.0: 652 | resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} 653 | engines: {node: '>=18'} 654 | dev: true 655 | 656 | /@ts-nameof/common@4.2.1: 657 | resolution: {integrity: sha512-bWwYOFTTd6Nq7RUqJalIii1su3OyR+N1W0smp5PzHGUVycHuJ7MRiyCQrWgMt1lbbp3GY6cvCttm7Zo5E7A1xQ==} 658 | dev: true 659 | 660 | /@ts-nameof/transforms-babel@4.2.1: 661 | resolution: {integrity: sha512-4BG5+55JXI3bLzoEqHKPQm5t4JgK2Ae1chAD7w5jDdMI8j1mWqVeonMjNMNIm28dMYs41Qvep25/5hpg24JyOw==} 662 | dependencies: 663 | '@ts-nameof/common': 4.2.1 664 | '@ts-nameof/transforms-common': 4.2.1 665 | dev: true 666 | 667 | /@ts-nameof/transforms-common@4.2.1: 668 | resolution: {integrity: sha512-mg6nkkHqNlKU1B15pEtiikSKadJSOxFFWpi7tEVB7Yhjx0PhoTcSe7oxK0fXHZGeoTGF2SMZjmCsGnbtfcgk6w==} 669 | dependencies: 670 | '@ts-nameof/common': 4.2.1 671 | dev: true 672 | 673 | /@tweakpane/core@1.1.0: 674 | resolution: {integrity: sha512-vbbiQb+aoFI13lIbE7DJvhHZVE1YlUpGoaAamSpU6wLp2jA3VowS1wfRJBBB8IBCYm7nF6ULl7zfJKxl1XdyfA==} 675 | dev: false 676 | 677 | /@types/estree@1.0.6: 678 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 679 | dev: true 680 | 681 | /@types/resolve@1.20.2: 682 | resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} 683 | dev: true 684 | 685 | /@types/ts-nameof@4.2.5: 686 | resolution: {integrity: sha512-bdJP6fHAfxdjQYeIrWEPOegSkSR3uOwuDVZmzTR2ueypQdyhrkh8GlbSnM6wi4Qn6RxeOvFanyltT1T6H4Wccg==} 687 | dev: true 688 | 689 | /babel-plugin-jsx-dom-expressions@0.39.7(@babel/core@7.26.10): 690 | resolution: {integrity: sha512-8GzVmFla7jaTNWW8W+lTMl9YGva4/06CtwJjySnkYtt8G1v9weCzc2SuF1DfrudcCNb2Doetc1FRg33swBYZCA==} 691 | peerDependencies: 692 | '@babel/core': ^7.20.12 693 | dependencies: 694 | '@babel/core': 7.26.10 695 | '@babel/helper-module-imports': 7.18.6 696 | '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) 697 | '@babel/types': 7.26.10 698 | html-entities: 2.3.3 699 | parse5: 7.2.1 700 | validate-html-nesting: 1.2.2 701 | dev: true 702 | 703 | /babel-plugin-syntax-object-rest-spread@7.0.0-alpha.19: 704 | resolution: {integrity: sha512-Jo9wXmU9AtufOFPdQpedc+j7Ck5okGYsK0zkk2NZNae61SAtuMF5M3aRUeZusrssPqWC32pOiBokbApIFHdlXw==} 705 | dev: true 706 | 707 | /babel-plugin-syntax-typescript@7.0.0-alpha.19: 708 | resolution: {integrity: sha512-jLuaWfoQsVr8/hmZtWB+86tZ5jYmOYV6kq70EkSUT7RR+gfeYOExS0FjObbbp+WExZNpBaRZvlyikNk3hCQGeQ==} 709 | dev: true 710 | 711 | /babel-plugin-transform-typescript@7.0.0-alpha.19: 712 | resolution: {integrity: sha512-OtkOYcYRffmC38/UjDZn2cvM2qarqDT748TbSJtVpNb7EvDLQcfPn9+0adk8oqmhc0lk+Ldy/2daGMNMxW0vuQ==} 713 | dependencies: 714 | babel-plugin-syntax-typescript: 7.0.0-alpha.19 715 | dev: true 716 | 717 | /babel-plugin-ts-nameof@4.2.1: 718 | resolution: {integrity: sha512-otoDlZLYyc3SzwDWYYtseeMnfp2V5YZPrCqKpo2aqyi56AvszpFfVrrj9+d24Ma/c0gtLgtEhaHgGZ6wLLVa3A==} 719 | dependencies: 720 | '@ts-nameof/transforms-babel': 4.2.1 721 | dev: true 722 | 723 | /babel-preset-solid@1.9.5(@babel/core@7.26.10): 724 | resolution: {integrity: sha512-85I3osODJ1LvZbv8wFozROV1vXq32BubqHXAGu73A//TRs3NLI1OFP83AQBUTSQHwgZQmARjHlJciym3we+V+w==} 725 | peerDependencies: 726 | '@babel/core': ^7.0.0 727 | dependencies: 728 | '@babel/core': 7.26.10 729 | babel-plugin-jsx-dom-expressions: 0.39.7(@babel/core@7.26.10) 730 | dev: true 731 | 732 | /babel-preset-typescript@7.0.0-alpha.19: 733 | resolution: {integrity: sha512-2VGIgn58ohmVXhc+qAx0OsihQHQm5R+Y1Mu7bu98HbCJtR/CzEdZs8qCtPb1XmYKF8XRNvZQge44dPTVimI2/w==} 734 | dependencies: 735 | babel-plugin-syntax-object-rest-spread: 7.0.0-alpha.19 736 | babel-plugin-transform-typescript: 7.0.0-alpha.19 737 | dev: true 738 | 739 | /braces@3.0.3: 740 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 741 | engines: {node: '>=8'} 742 | dependencies: 743 | fill-range: 7.1.1 744 | dev: true 745 | 746 | /browserslist@4.24.4: 747 | resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} 748 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 749 | hasBin: true 750 | dependencies: 751 | caniuse-lite: 1.0.30001705 752 | electron-to-chromium: 1.5.119 753 | node-releases: 2.0.19 754 | update-browserslist-db: 1.1.3(browserslist@4.24.4) 755 | dev: true 756 | 757 | /caniuse-lite@1.0.30001705: 758 | resolution: {integrity: sha512-S0uyMMiYvA7CxNgomYBwwwPUnWzFD83f3B1ce5jHUfHTH//QL6hHsreI8RVC5606R4ssqravelYO5TU6t8sEyg==} 759 | dev: true 760 | 761 | /commondir@1.0.1: 762 | resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} 763 | dev: true 764 | 765 | /convert-source-map@2.0.0: 766 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 767 | dev: true 768 | 769 | /csstype@3.1.1: 770 | resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} 771 | dev: true 772 | 773 | /debug@4.4.0: 774 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 775 | engines: {node: '>=6.0'} 776 | peerDependencies: 777 | supports-color: '*' 778 | peerDependenciesMeta: 779 | supports-color: 780 | optional: true 781 | dependencies: 782 | ms: 2.1.3 783 | dev: true 784 | 785 | /deepmerge@4.3.1: 786 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 787 | engines: {node: '>=0.10.0'} 788 | dev: true 789 | 790 | /del@8.0.0: 791 | resolution: {integrity: sha512-R6ep6JJ+eOBZsBr9esiNN1gxFbZE4Q2cULkUSFumGYecAiS6qodDvcPx/sFuWHMNul7DWmrtoEOpYSm7o6tbSA==} 792 | engines: {node: '>=18'} 793 | dependencies: 794 | globby: 14.1.0 795 | is-glob: 4.0.3 796 | is-path-cwd: 3.0.0 797 | is-path-inside: 4.0.0 798 | p-map: 7.0.3 799 | slash: 5.1.0 800 | dev: true 801 | 802 | /electron-to-chromium@1.5.119: 803 | resolution: {integrity: sha512-Ku4NMzUjz3e3Vweh7PhApPrZSS4fyiCIbcIrG9eKrriYVLmbMepETR/v6SU7xPm98QTqMSYiCwfO89QNjXLkbQ==} 804 | dev: true 805 | 806 | /entities@4.5.0: 807 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 808 | engines: {node: '>=0.12'} 809 | dev: true 810 | 811 | /escalade@3.2.0: 812 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 813 | engines: {node: '>=6'} 814 | dev: true 815 | 816 | /estree-walker@2.0.2: 817 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 818 | dev: true 819 | 820 | /fast-glob@3.3.3: 821 | resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} 822 | engines: {node: '>=8.6.0'} 823 | dependencies: 824 | '@nodelib/fs.stat': 2.0.5 825 | '@nodelib/fs.walk': 1.2.8 826 | glob-parent: 5.1.2 827 | merge2: 1.4.1 828 | micromatch: 4.0.8 829 | dev: true 830 | 831 | /fastq@1.19.1: 832 | resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} 833 | dependencies: 834 | reusify: 1.1.0 835 | dev: true 836 | 837 | /fdir@6.4.3(picomatch@4.0.2): 838 | resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} 839 | peerDependencies: 840 | picomatch: ^3 || ^4 841 | peerDependenciesMeta: 842 | picomatch: 843 | optional: true 844 | dependencies: 845 | picomatch: 4.0.2 846 | dev: true 847 | 848 | /fill-range@7.1.1: 849 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 850 | engines: {node: '>=8'} 851 | dependencies: 852 | to-regex-range: 5.0.1 853 | dev: true 854 | 855 | /fsevents@2.3.3: 856 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 857 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 858 | os: [darwin] 859 | requiresBuild: true 860 | dev: true 861 | optional: true 862 | 863 | /function-bind@1.1.2: 864 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 865 | dev: true 866 | 867 | /gensync@1.0.0-beta.2: 868 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 869 | engines: {node: '>=6.9.0'} 870 | dev: true 871 | 872 | /glob-parent@5.1.2: 873 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 874 | engines: {node: '>= 6'} 875 | dependencies: 876 | is-glob: 4.0.3 877 | dev: true 878 | 879 | /globals@11.12.0: 880 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 881 | engines: {node: '>=4'} 882 | dev: true 883 | 884 | /globby@14.1.0: 885 | resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} 886 | engines: {node: '>=18'} 887 | dependencies: 888 | '@sindresorhus/merge-streams': 2.3.0 889 | fast-glob: 3.3.3 890 | ignore: 7.0.3 891 | path-type: 6.0.0 892 | slash: 5.1.0 893 | unicorn-magic: 0.3.0 894 | dev: true 895 | 896 | /hasown@2.0.2: 897 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 898 | engines: {node: '>= 0.4'} 899 | dependencies: 900 | function-bind: 1.1.2 901 | dev: true 902 | 903 | /html-entities@2.3.3: 904 | resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} 905 | dev: true 906 | 907 | /ignore@7.0.3: 908 | resolution: {integrity: sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==} 909 | engines: {node: '>= 4'} 910 | dev: true 911 | 912 | /is-core-module@2.16.1: 913 | resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} 914 | engines: {node: '>= 0.4'} 915 | dependencies: 916 | hasown: 2.0.2 917 | dev: true 918 | 919 | /is-extglob@2.1.1: 920 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 921 | engines: {node: '>=0.10.0'} 922 | dev: true 923 | 924 | /is-glob@4.0.3: 925 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 926 | engines: {node: '>=0.10.0'} 927 | dependencies: 928 | is-extglob: 2.1.1 929 | dev: true 930 | 931 | /is-module@1.0.0: 932 | resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} 933 | dev: true 934 | 935 | /is-number@7.0.0: 936 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 937 | engines: {node: '>=0.12.0'} 938 | dev: true 939 | 940 | /is-path-cwd@3.0.0: 941 | resolution: {integrity: sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==} 942 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 943 | dev: true 944 | 945 | /is-path-inside@4.0.0: 946 | resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} 947 | engines: {node: '>=12'} 948 | dev: true 949 | 950 | /is-reference@1.2.1: 951 | resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} 952 | dependencies: 953 | '@types/estree': 1.0.6 954 | dev: true 955 | 956 | /js-tokens@4.0.0: 957 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 958 | dev: true 959 | 960 | /jsesc@3.1.0: 961 | resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} 962 | engines: {node: '>=6'} 963 | hasBin: true 964 | dev: true 965 | 966 | /json5@2.2.3: 967 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 968 | engines: {node: '>=6'} 969 | hasBin: true 970 | dev: true 971 | 972 | /lru-cache@5.1.1: 973 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 974 | dependencies: 975 | yallist: 3.1.1 976 | dev: true 977 | 978 | /magic-string@0.30.17: 979 | resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 980 | dependencies: 981 | '@jridgewell/sourcemap-codec': 1.5.0 982 | dev: true 983 | 984 | /merge2@1.4.1: 985 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 986 | engines: {node: '>= 8'} 987 | dev: true 988 | 989 | /micromatch@4.0.8: 990 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 991 | engines: {node: '>=8.6'} 992 | dependencies: 993 | braces: 3.0.3 994 | picomatch: 2.3.1 995 | dev: true 996 | 997 | /ms@2.1.3: 998 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 999 | dev: true 1000 | 1001 | /node-releases@2.0.19: 1002 | resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} 1003 | dev: true 1004 | 1005 | /p-map@7.0.3: 1006 | resolution: {integrity: sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==} 1007 | engines: {node: '>=18'} 1008 | dev: true 1009 | 1010 | /parse5@7.2.1: 1011 | resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} 1012 | dependencies: 1013 | entities: 4.5.0 1014 | dev: true 1015 | 1016 | /path-parse@1.0.7: 1017 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1018 | dev: true 1019 | 1020 | /path-type@6.0.0: 1021 | resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} 1022 | engines: {node: '>=18'} 1023 | dev: true 1024 | 1025 | /picocolors@1.1.1: 1026 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1027 | dev: true 1028 | 1029 | /picomatch@2.3.1: 1030 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1031 | engines: {node: '>=8.6'} 1032 | dev: true 1033 | 1034 | /picomatch@4.0.2: 1035 | resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} 1036 | engines: {node: '>=12'} 1037 | dev: true 1038 | 1039 | /prettier@3.5.3: 1040 | resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} 1041 | engines: {node: '>=14'} 1042 | hasBin: true 1043 | dev: true 1044 | 1045 | /queue-microtask@1.2.3: 1046 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1047 | dev: true 1048 | 1049 | /resolve@1.22.10: 1050 | resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} 1051 | engines: {node: '>= 0.4'} 1052 | hasBin: true 1053 | dependencies: 1054 | is-core-module: 2.16.1 1055 | path-parse: 1.0.7 1056 | supports-preserve-symlinks-flag: 1.0.0 1057 | dev: true 1058 | 1059 | /reusify@1.1.0: 1060 | resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} 1061 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1062 | dev: true 1063 | 1064 | /rollup-plugin-delete@3.0.1(rollup@4.35.0): 1065 | resolution: {integrity: sha512-4tyijMQFwSDLA04DAHwbI2TrRwPiRwAqBQ17dxyr9CgHeHXLdgk8IDVWHFWPrL3UZJWrAmHohQ2MgmVghQDrlg==} 1066 | engines: {node: '>=18'} 1067 | peerDependencies: 1068 | rollup: '*' 1069 | dependencies: 1070 | del: 8.0.0 1071 | rollup: 4.35.0 1072 | dev: true 1073 | 1074 | /rollup@4.35.0: 1075 | resolution: {integrity: sha512-kg6oI4g+vc41vePJyO6dHt/yl0Rz3Thv0kJeVQ3D1kS3E5XSuKbPc29G4IpT/Kv1KQwgHVcN+HtyS+HYLNSvQg==} 1076 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1077 | hasBin: true 1078 | dependencies: 1079 | '@types/estree': 1.0.6 1080 | optionalDependencies: 1081 | '@rollup/rollup-android-arm-eabi': 4.35.0 1082 | '@rollup/rollup-android-arm64': 4.35.0 1083 | '@rollup/rollup-darwin-arm64': 4.35.0 1084 | '@rollup/rollup-darwin-x64': 4.35.0 1085 | '@rollup/rollup-freebsd-arm64': 4.35.0 1086 | '@rollup/rollup-freebsd-x64': 4.35.0 1087 | '@rollup/rollup-linux-arm-gnueabihf': 4.35.0 1088 | '@rollup/rollup-linux-arm-musleabihf': 4.35.0 1089 | '@rollup/rollup-linux-arm64-gnu': 4.35.0 1090 | '@rollup/rollup-linux-arm64-musl': 4.35.0 1091 | '@rollup/rollup-linux-loongarch64-gnu': 4.35.0 1092 | '@rollup/rollup-linux-powerpc64le-gnu': 4.35.0 1093 | '@rollup/rollup-linux-riscv64-gnu': 4.35.0 1094 | '@rollup/rollup-linux-s390x-gnu': 4.35.0 1095 | '@rollup/rollup-linux-x64-gnu': 4.35.0 1096 | '@rollup/rollup-linux-x64-musl': 4.35.0 1097 | '@rollup/rollup-win32-arm64-msvc': 4.35.0 1098 | '@rollup/rollup-win32-ia32-msvc': 4.35.0 1099 | '@rollup/rollup-win32-x64-msvc': 4.35.0 1100 | fsevents: 2.3.3 1101 | dev: true 1102 | 1103 | /run-parallel@1.2.0: 1104 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1105 | dependencies: 1106 | queue-microtask: 1.2.3 1107 | dev: true 1108 | 1109 | /semver@6.3.1: 1110 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 1111 | hasBin: true 1112 | dev: true 1113 | 1114 | /slash@5.1.0: 1115 | resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} 1116 | engines: {node: '>=14.16'} 1117 | dev: true 1118 | 1119 | /solid-js@1.5.7: 1120 | resolution: {integrity: sha512-L1UuyMuZZARAwzXo5NZDhE6yxc14aqNbVOUoGzvlcxRZo1Cm4ExhPV0diEfwDyiKG/igqNNLkNurHkXiI5sVEg==} 1121 | dependencies: 1122 | csstype: 3.1.1 1123 | dev: true 1124 | 1125 | /supports-preserve-symlinks-flag@1.0.0: 1126 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1127 | engines: {node: '>= 0.4'} 1128 | dev: true 1129 | 1130 | /to-regex-range@5.0.1: 1131 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1132 | engines: {node: '>=8.0'} 1133 | dependencies: 1134 | is-number: 7.0.0 1135 | dev: true 1136 | 1137 | /tweakpane@3.1.0: 1138 | resolution: {integrity: sha512-PGAp/LPQdHwzL7/iAW4lV1p9iPQTti7YMjMWO48CoYjvZRS59RmgQnhEGzKzqST1JnmOYmQUjTe8bdhlZRJs5A==} 1139 | dev: false 1140 | 1141 | /typescript@5.8.2: 1142 | resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} 1143 | engines: {node: '>=14.17'} 1144 | hasBin: true 1145 | dev: true 1146 | 1147 | /unicorn-magic@0.3.0: 1148 | resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} 1149 | engines: {node: '>=18'} 1150 | dev: true 1151 | 1152 | /update-browserslist-db@1.1.3(browserslist@4.24.4): 1153 | resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} 1154 | hasBin: true 1155 | peerDependencies: 1156 | browserslist: '>= 4.21.0' 1157 | dependencies: 1158 | browserslist: 4.24.4 1159 | escalade: 3.2.0 1160 | picocolors: 1.1.1 1161 | dev: true 1162 | 1163 | /validate-html-nesting@1.2.2: 1164 | resolution: {integrity: sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg==} 1165 | dev: true 1166 | 1167 | /yallist@3.1.1: 1168 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 1169 | dev: true 1170 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | import babel from '@rollup/plugin-babel' 2 | import commonjs from '@rollup/plugin-commonjs' 3 | import nodeResolve from '@rollup/plugin-node-resolve' 4 | import strip from '@rollup/plugin-strip' 5 | import del from 'rollup-plugin-delete' 6 | const extensions = ['.ts', '.tsx', '.js'] 7 | 8 | /** @type {import('rollup').OutputOptions} */ 9 | const output = {} 10 | /** @type {import('rollup').RollupOptions} */ 11 | const config = { 12 | input: 'src/index.ts', 13 | external: ['solid-js', 'tweakpane', '@tweakpane/core'], 14 | treeshake: 'smallest', 15 | output: [ 16 | { 17 | ...output, 18 | format: 'es', 19 | dir: 'dist/es', 20 | }, 21 | { 22 | ...output, 23 | format: 'cjs', 24 | dir: 'dist/cjs', 25 | }, 26 | ], 27 | plugins: [ 28 | nodeResolve({ 29 | extensions, 30 | }), 31 | babel({ 32 | extensions, 33 | babelHelpers: 'bundled', 34 | presets: ['solid', '@babel/preset-typescript'], 35 | plugins: ['babel-plugin-ts-nameof'], 36 | exclude: /node_modules\//, 37 | }), 38 | commonjs({ 39 | extensions, 40 | }), 41 | strip({ 42 | include: /\.(js|mjs|ts|tsx|jsx)/, 43 | }), 44 | del({ targets: 'dist/*' }), 45 | ], 46 | } 47 | export default config 48 | -------------------------------------------------------------------------------- /src/automutable.tsx: -------------------------------------------------------------------------------- 1 | import { Bindable } from "@tweakpane/core" 2 | import { VoidProps, For, Switch, Match } from "solid-js" 3 | import { TWPFolder } from "./ui" 4 | import { TWPInput } from "./controls" 5 | 6 | export function TWPAutoMutable(props: VoidProps<{ target: Bindable }>) { 7 | return ( 8 | 9 | {(key) => ( 10 | }> 11 | 12 | 13 | 14 | 15 | 16 | 17 | )} 18 | 19 | ) 20 | } 21 | -------------------------------------------------------------------------------- /src/base.tsx: -------------------------------------------------------------------------------- 1 | import { createContext, FlowProps, onCleanup, splitProps, useContext } from "solid-js" 2 | import { Pane } from "tweakpane" 3 | import type { PaneConfig } from "tweakpane/dist/types/pane/pane-config" 4 | import type { Bindable, BladeApi } from "@tweakpane/core" 5 | import type { BladeRackApi } from "@tweakpane/core/dist/cjs/blade/common/api/blade-rack" 6 | 7 | export type TWPBaseProps | BladeRackApi> = { 8 | ref?: (e: T) => void 9 | } 10 | const TWPRootContext = createContext() 11 | export const useTWPRoot = () => useContext(TWPRootContext) 12 | export function TWPGroup(props: FlowProps<{ root: BladeRackApi }>) { 13 | return {props.children} 14 | } 15 | 16 | export function Tweakpane(props: FlowProps) { 17 | const [compProps, paneProps] = splitProps(props, ["children"]) 18 | const pane = new Pane(paneProps) 19 | onCleanup(() => pane.dispose()) 20 | return {compProps.children} 21 | } 22 | 23 | const TWPBindGroupContext = createContext() 24 | export const useTWPBingGroup = () => useContext(TWPBindGroupContext) 25 | export function TWPBindGroup(props: FlowProps<{ target: Bindable }>) { 26 | return {props.children} 27 | } 28 | -------------------------------------------------------------------------------- /src/controls.tsx: -------------------------------------------------------------------------------- 1 | import { createEffect, on, onCleanup, JSX, VoidProps } from "solid-js" 2 | import { Tweakpane, TWPBaseProps, TWPBindGroup, useTWPBingGroup, useTWPRoot } from "./base" 3 | import type { Bindable } from "@tweakpane/core" 4 | import type { InputBindingApi, MonitorBindingApi, InputParams, MonitorParams } from "tweakpane" 5 | import type { BladeRackApi } from "@tweakpane/core/dist/cjs/blade/common/api/blade-rack" 6 | 7 | type AvailableAPI = InputBindingApi | MonitorBindingApi 8 | type TWPControlBaseProps = VoidProps & 9 | TWPBaseProps & { 10 | target?: Bindable 11 | key?: string 12 | initialValue?: any 13 | } 14 | 15 | type TWPControlFactory = ( 16 | root: BladeRackApi, 17 | binding: Bindable, 18 | props: TProps 19 | ) => [AvailableAPI, JSX.Element?] 20 | function createTWPControl( 21 | initFn: TWPControlFactory 22 | ) { 23 | return function (props: TProps) { 24 | const root = useTWPRoot() 25 | if (!root) throw new Error(`Use tweakpane controls within <${nameof(Tweakpane)}>`) 26 | let binding = props.target ?? useTWPBingGroup() 27 | if (!binding && props.key) { 28 | throw new Error( 29 | `In case of usage with key, place it within <${nameof( 30 | TWPBindGroup 31 | )}> and provide target` 32 | ) 33 | } 34 | if (binding && !Object.hasOwn(binding, props.key)) { 35 | throw new Error(`There is no key ${props.key} in binding ${binding}`) 36 | } 37 | if (!binding && !props.key) { 38 | if (!props.initialValue) { 39 | throw new Error( 40 | `In case of usage without target and key, provide ${nameof( 41 | props.initialValue 42 | )} prop` 43 | ) 44 | } 45 | binding = { value: props.initialValue } 46 | props.key = "value" 47 | } 48 | const [comp, element] = initFn(root, binding, props) 49 | createEffect( 50 | on( 51 | () => binding[props.key], 52 | () => comp.refresh(), 53 | { defer: true } 54 | ) 55 | ) 56 | onCleanup(() => { 57 | if (!comp) return 58 | root.remove(comp) 59 | comp.dispose() 60 | }) 61 | props.ref?.(comp) 62 | if (element) return element 63 | } 64 | } 65 | 66 | type TWPInputInputProps = { 67 | params?: InputParams 68 | onChange?: Parameters["on"]>[1] 69 | } 70 | export const TWPInput = createTWPControl((root, binding, props) => { 71 | const input = root.addInput(binding, props.key, props.params) 72 | props.onChange && input.on("change", props.onChange) 73 | return [input] 74 | }) 75 | 76 | type TWPMonitorProps = { 77 | params?: MonitorParams 78 | onUpdate?: Parameters["on"]>[1] 79 | } 80 | export const TWPMonitor = createTWPControl((root, binding, props) => { 81 | const monitor = root.addMonitor(binding, props.key, props.params) 82 | props.onUpdate && monitor.on("update", props.onUpdate) 83 | return [monitor] 84 | }) 85 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export { Tweakpane, TWPBindGroup } from "./base" 2 | export * from "./ui" 3 | export * from "./controls" 4 | export * from "./automutable" 5 | -------------------------------------------------------------------------------- /src/ui.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | ParentProps, 3 | splitProps, 4 | onCleanup, 5 | VoidProps, 6 | JSX, 7 | FlowProps, 8 | createEffect, 9 | createContext, 10 | useContext, 11 | onMount, 12 | } from "solid-js" 13 | import { Tweakpane, TWPBaseProps, TWPGroup, useTWPRoot } from "./base" 14 | import type { FolderApi, FolderParams, TabParams, SeparatorParams } from "tweakpane" 15 | import type { ButtonApi, SeparatorApi, TabApi, TabPageParams } from "@tweakpane/core" 16 | import type { BladeRackApi } from "@tweakpane/core/dist/cjs/blade/common/api/blade-rack" 17 | 18 | type AvailableAPI = FolderApi | ButtonApi | TabApi | SeparatorApi 19 | type TWPUIBaseProps = TWPBaseProps 20 | type TWPUIInitFn = (root: BladeRackApi, props: TProps) => [AvailableAPI, JSX.Element?] 21 | 22 | function createTWPUI( 23 | initFn: TWPUIInitFn 24 | ) { 25 | return function(props: TProps) { 26 | const root = useTWPRoot() 27 | if (!root) throw new Error(`Use tweakpane controls within <${nameof(Tweakpane)}>`) 28 | const [comp, element] = initFn(root, props) 29 | onCleanup(() => { 30 | if (!comp) return 31 | comp.dispose() 32 | root.remove(comp) 33 | }) 34 | props.ref?.(comp) 35 | if (element) return element 36 | } 37 | } 38 | export const TWPFolder = createTWPUI>((root, props) => { 39 | const [compProps, folderProps] = splitProps(props, ["children"]) 40 | const folder = root.addFolder(folderProps) 41 | return [folder, {compProps.children}] 42 | }) 43 | 44 | type TWPButtonProps = { 45 | onClick?: Parameters[1] 46 | } & FolderParams 47 | export const TWPButton = createTWPUI((root, props) => { 48 | const button = root.addButton(props) 49 | props.onClick && button.on("click", props.onClick) 50 | createEffect(() => { 51 | button.title = props.title 52 | }) 53 | return [button] 54 | }) 55 | 56 | export const TWPSeparator = createTWPUI>((root, props) => { 57 | const separator = root.addSeparator(props) 58 | return [separator] 59 | }) 60 | 61 | const TabContext = createContext() 62 | const useTab = () => useContext(TabContext) 63 | export const TWPTab = createTWPUI>>((root, props) => { 64 | const [compProps, tabProps] = splitProps(props, ["children"]) 65 | const tab = root.addTab({ ...tabProps, pages: [{ title: "mock" }] }) 66 | onMount(() => tab.removePage(0)) 67 | return [tab, {compProps.children}] 68 | }) 69 | 70 | export function TWPTabPage(props: ParentProps) { 71 | const root = useTab() 72 | if (!root) throw new Error(`Parent for <${nameof(TWPTabPage)}> should be <${nameof(TWPTab)}>`) 73 | const [compProps, pageProps] = splitProps(props, ["children"]) 74 | const page = root.addPage(pageProps) 75 | createEffect(() => (page.title = props.title)) 76 | onCleanup(() => { 77 | root.removePage(root.pages.indexOf(page)) 78 | }) 79 | return {compProps.children} 80 | } 81 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "emitDeclarationOnly": true, 4 | "declaration": true, 5 | "jsx": "preserve", 6 | "jsxImportSource": "solid-js", 7 | "sourceMap": false, 8 | "target": "ESNext", 9 | "module": "ESNext", 10 | "forceConsistentCasingInFileNames": true, 11 | "allowSyntheticDefaultImports": true, 12 | "moduleResolution": "Node", 13 | "outDir": "./dist", 14 | "skipDefaultLibCheck": true 15 | }, 16 | "exclude": ["node_modules", "dist", "./src/example"], 17 | "include": ["./src"] 18 | } 19 | --------------------------------------------------------------------------------