{"_id":"r3f-form","_rev":"30-653e6f302a78e0b95e8b657edefed23d","name":"r3f-form","dist-tags":{"latest":"4.0.0","beta":"3.0.3-beta.6"},"versions":{"0.0.0-development":{"name":"r3f-form","version":"0.0.0-development","description":"A webGL input field component for use with React Three Fiber","main":"dist/index.cjs.js","module":"dist/index.js","types":"dist/index.d.ts","publishConfig":{"access":"public"},"scripts":{"build":"rollup -c --bundleConfigAsCjs","typegen":"tsc --emitDeclarationOnly","lint":"eslint .","storybook":"start-storybook -p 6006","build-storybook":"build-storybook","semantic-release":"semantic-release --branches main"},"author":{"name":"John Beresford"},"license":"MIT","devDependencies":{"@babel/core":"^7.20.7","@babel/plugin-transform-runtime":"^7.19.6","@babel/preset-env":"^7.20.2","@babel/preset-react":"^7.18.6","@babel/preset-typescript":"^7.18.6","@react-three/drei":"^9.48.6","@react-three/fiber":"^8.9.1","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-node-resolve":"^15.0.1","@rollup/plugin-terser":"^0.2.1","@rollup/plugin-typescript":"^10.0.1","@storybook/addon-actions":"^6.5.15","@storybook/addon-essentials":"^6.5.15","@storybook/addon-interactions":"^6.5.15","@storybook/addon-links":"^6.5.15","@storybook/builder-webpack4":"^6.5.15","@storybook/manager-webpack4":"^6.5.15","@storybook/react":"^6.5.15","@storybook/testing-library":"^0.0.13","@types/react":"^18.0.26","@types/react-dom":"^18.0.10","@types/three":"^0.146.0","@typescript-eslint/eslint-plugin":"^5.48.0","@typescript-eslint/parser":"^5.48.0","babel-loader":"^8.3.0","eslint":"^8.31.0","eslint-config-prettier":"^8.6.0","eslint-plugin-import":"^2.26.0","eslint-plugin-prettier":"^4.2.1","eslint-plugin-react":"^7.31.11","eslint-plugin-react-hooks":"^4.6.0","react":"^18.2.0","react-dom":"^18.2.0","rollup":"^3.9.0","rollup-plugin-multi-input":"^1.3.1","semantic-release":"^19.0.5","three":"^0.148.0","troika-three-text":"^0.47.1","tslib":"^2.4.1","typescript":"^4.9.4"},"peerDependencies":{"@react-three/drei":">=9.0","@react-three/fiber":">=8.0","react":">=18.0","react-dom":">=18.0","three":">=0.146.0","troika-three-text":">=0.47.0"},"repository":{"type":"git","url":"git+https://github.com/JMBeresford/r3f-form.git"},"gitHead":"405f7ed5b3976f6c0dd55fb1f0fc36311458e812","bugs":{"url":"https://github.com/JMBeresford/r3f-form/issues"},"homepage":"https://github.com/JMBeresford/r3f-form#readme","_id":"r3f-form@0.0.0-development","_nodeVersion":"16.17.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-a5xZ35ovknQdo864prkCUOPQj2uscEEAcrXUokoAR7bKvMqUEtgdRpkGrdgnzcULcFuNepdz/o8gSyG5OsiDaQ==","shasum":"1065b0a35d664fb6919c2f73c334ab101d1d58b5","tarball":"https://registry.npmjs.org/r3f-form/-/r3f-form-0.0.0-development.tgz","fileCount":59,"unpackedSize":111999,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDyoWF/klFnizNhpqNqUPvwgTtUzML3B8GWkuisD86joQIgc2HKOEOS0DVbwn4BtEUOmWOp3/oSmEDiF8vA0O3c6ps="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxK9vACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmorCg/8DQGAoqzcgOAzxgFLLPNVKBNBsXFNQE4F18okoY5FvOdMg7OE\r\nb4osC2Bb9nobYd6a4hy6Zu/cFsc1basBPJ9HbA+Li+gXByevAcouUwf9G4qr\r\nIwutm7bONEOzKHIsv2dC6YkhFO/rbbSN/Z1Bc5uRIHMUVB1ABKLisdbzzwxK\r\nAAxwVIyeoUHmXuL58clmg1FI69gi4bonEFfYOyFwWkFK6lB7Km4yHCuYr6pj\r\n6wMHPl+IeCqvAeeMwZU0bDFKfyNB0mGLAlvffVBSfxWjs7Vz3upH6Z2qcSxF\r\nSVh/VXuSuQaiUXLYA1Lt9hdnF700UUroCx4avJDH0aEdwIjzrzl/gq0rgN0G\r\ncHv74JKC5rj20TzfTXPcez52asaRAd0PQ3z1wPta9VvDbVQxuWvQbV4SvZxK\r\nLsihInO0xTjx7omp0iGWy/80CaUnUfkzeqLDvl/hs5ljYmzUC6xqZ60MZQA4\r\n47RPxcZfFBue4uJzy1cvPh0LcXBytKNwJgL9UsQcBLma8J+t+qMltvBePMiJ\r\nwruqpatQlz/Rs/5meXlahSt28PSbjbQ1I/5BVhUV/nUoUopMWpwDSB8CybHX\r\nfyZeDQGGcct86b5yvo6AgSYXmDQXznYHw+C5zVdyVkUGRtQpKNx2g9QfQzH7\r\n5o0pzP1MR32jUKx6IMfsPX/gJvRMl0/hwEw=\r\n=cKFh\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"jberesford","email":"volcaus@gmail.com"},"directories":{},"maintainers":[{"name":"jberesford","email":"volcaus@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/r3f-form_0.0.0-development_1673834350829_0.8763564893285238"},"_hasShrinkwrap":false},"1.3.0":{"name":"r3f-form","version":"1.3.0","description":"A webGL input field component for use with React Three Fiber","main":"dist/index.cjs.js","module":"dist/index.js","types":"dist/index.d.ts","publishConfig":{"access":"public"},"scripts":{"build":"rollup -c --bundleConfigAsCjs","typegen":"tsc --emitDeclarationOnly","lint":"eslint .","storybook":"start-storybook -p 6006","build-storybook":"build-storybook","semantic-release":"semantic-release --branches main"},"author":{"name":"John Beresford"},"license":"MIT","devDependencies":{"@babel/core":"^7.20.7","@babel/plugin-transform-runtime":"^7.19.6","@babel/preset-env":"^7.20.2","@babel/preset-react":"^7.18.6","@babel/preset-typescript":"^7.18.6","@react-three/drei":"^9.48.6","@react-three/fiber":"^8.9.1","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-node-resolve":"^15.0.1","@rollup/plugin-terser":"^0.2.1","@rollup/plugin-typescript":"^10.0.1","@storybook/addon-actions":"^6.5.15","@storybook/addon-essentials":"^6.5.15","@storybook/addon-interactions":"^6.5.15","@storybook/addon-links":"^6.5.15","@storybook/builder-webpack4":"^6.5.15","@storybook/manager-webpack4":"^6.5.15","@storybook/react":"^6.5.15","@storybook/testing-library":"^0.0.13","@types/react":"^18.0.26","@types/react-dom":"^18.0.10","@types/three":"^0.146.0","@typescript-eslint/eslint-plugin":"^5.48.0","@typescript-eslint/parser":"^5.48.0","babel-loader":"^8.3.0","eslint":"^8.31.0","eslint-config-prettier":"^8.6.0","eslint-plugin-import":"^2.26.0","eslint-plugin-prettier":"^4.2.1","eslint-plugin-react":"^7.31.11","eslint-plugin-react-hooks":"^4.6.0","react":"^18.2.0","react-dom":"^18.2.0","rollup":"^3.9.0","rollup-plugin-multi-input":"^1.3.1","semantic-release":"^19.0.5","three":"^0.148.0","troika-three-text":"^0.47.1","tslib":"^2.4.1","typescript":"^4.9.4"},"peerDependencies":{"@react-three/drei":">=9.0","@react-three/fiber":">=8.0","react":">=18.0","react-dom":">=18.0","three":">=0.146.0","troika-three-text":">=0.47.0"},"repository":{"type":"git","url":"git+https://github.com/JMBeresford/r3f-form.git"},"gitHead":"4357ae51c66c8163db328bf50e8bbd02bdeacc3a","bugs":{"url":"https://github.com/JMBeresford/r3f-form/issues"},"homepage":"https://github.com/JMBeresford/r3f-form#readme","_id":"r3f-form@1.3.0","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-r9175MDF1wypmki6vMQ4NndpRGaOJ3nuRVxQbhJP6lT1nyrVki8VF+9iUa5yYbkgQPPWTCaW4qsvoq9QjFwgYQ==","shasum":"d095061068c2a7de6b7c147fe89884bf800ec2fc","tarball":"https://registry.npmjs.org/r3f-form/-/r3f-form-1.3.0.tgz","fileCount":53,"unpackedSize":98625,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGqX9tBg4//iiIgR340nZp9g9PHjra5kGA3Z4z7CUn5vAiAJbOWMbajMSV/eFAyNNkqVqXIWVjxjT/D/9CaQ1OYfaA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxMSUACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoGlQ/+NhyyhHO+369MRKtWnWFAOq+mTskyDxF6/lOBE+Nh9n3nMa4t\r\noEovG1KYJPJcvnKBLp2DfysHFeDiw3+AQ8doHr7+DsC89VG43wlXI20bCAzl\r\nw3sA+V/Agh+rHxnalVUpWSBZNNbxgpcqg1aHX3kwUl3VOYmOeH6a62OaB1+Z\r\nxlaGvp75MbahvoRTpzP0pPdYECHSv47Cs+F6577SFjCIuTP/i02fhdAwr+nm\r\n7/3619W1zKIecL7re35l+bP0fCuY7Dl6rnMUVNKgxu4wRqwt+d3TwJLcAZM4\r\n4hlt5u+J6oGiY+Yb7DzL7CiqdSx4t+X2wHAuLh4g2wGk6JTeBKzhGNR1BC6m\r\nzAFdzRtLq/oTCnUxxEONl6xE3hrugRxlSFlUDxRcxNGIQk81HgnXD1eiXIUX\r\n5CXfiBuyG369r/3hMZI5bgdeAhyt6XOFjU5xHb9E7/qu/Mh+UJdLqiryRlSO\r\nKja4qdBOH2wvl3bd+3V6x/8ysahb7SgNn3uJT3H8tIwyJfMRjU4nzfftkdkJ\r\nsrQPPBZeoq3h2PZWONWEcFtimj/H70d64LQFe6YB3KxHdamL/t3NQTKC5MY1\r\n/vatTLevrNH9mJd2BywL9t+VxEzWNJw84xA09VSnLAWuO02NirIg2LWrGqlK\r\nmYtA+7BaIdcnTaYOIo7r0fxMYi1tTD45N4E=\r\n=pRh0\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"jberesford","email":"volcaus@gmail.com"},"directories":{},"maintainers":[{"name":"jberesford","email":"volcaus@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/r3f-form_1.3.0_1673839763895_0.7307486488440673"},"_hasShrinkwrap":false},"1.4.0":{"name":"r3f-form","version":"1.4.0","description":"A webGL input field component for use with React Three Fiber","main":"dist/index.cjs.js","module":"dist/index.js","types":"dist/index.d.ts","publishConfig":{"access":"public"},"scripts":{"build":"rollup -c --bundleConfigAsCjs","typegen":"tsc --emitDeclarationOnly","lint":"eslint .","storybook":"start-storybook -p 6006","build-storybook":"build-storybook","semantic-release":"semantic-release --branches main"},"author":{"name":"John Beresford"},"license":"MIT","devDependencies":{"@babel/core":"^7.20.7","@babel/plugin-transform-runtime":"^7.19.6","@babel/preset-env":"^7.20.2","@babel/preset-react":"^7.18.6","@babel/preset-typescript":"^7.18.6","@react-three/drei":"^9.48.6","@react-three/fiber":"^8.9.1","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-node-resolve":"^15.0.1","@rollup/plugin-terser":"^0.2.1","@rollup/plugin-typescript":"^10.0.1","@storybook/addon-actions":"^6.5.15","@storybook/addon-essentials":"^6.5.15","@storybook/addon-interactions":"^6.5.15","@storybook/addon-links":"^6.5.15","@storybook/builder-webpack4":"^6.5.15","@storybook/manager-webpack4":"^6.5.15","@storybook/react":"^6.5.15","@storybook/testing-library":"^0.0.13","@types/react":"^18.0.26","@types/react-dom":"^18.0.10","@types/three":"^0.146.0","@typescript-eslint/eslint-plugin":"^5.48.0","@typescript-eslint/parser":"^5.48.0","babel-loader":"^8.3.0","eslint":"^8.31.0","eslint-config-prettier":"^8.6.0","eslint-plugin-import":"^2.26.0","eslint-plugin-prettier":"^4.2.1","eslint-plugin-react":"^7.31.11","eslint-plugin-react-hooks":"^4.6.0","react":"^18.2.0","react-dom":"^18.2.0","rollup":"^3.9.0","rollup-plugin-multi-input":"^1.3.1","semantic-release":"^19.0.5","three":"^0.148.0","troika-three-text":"^0.47.1","tslib":"^2.4.1","typescript":"^4.9.4"},"peerDependencies":{"@react-three/drei":">=9.0","@react-three/fiber":">=8.0","react":">=18.0","react-dom":">=18.0","three":">=0.146.0","troika-three-text":">=0.47.0"},"repository":{"type":"git","url":"git+https://github.com/JMBeresford/r3f-form.git"},"gitHead":"d59cd891cb60088f9dd565f65ce97ced929b5758","bugs":{"url":"https://github.com/JMBeresford/r3f-form/issues"},"homepage":"https://github.com/JMBeresford/r3f-form#readme","_id":"r3f-form@1.4.0","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-L0BGIfWcr1xLpmP1WP6Pg5/NmwSZgHE3qOAGHW6yop6xKVcfKIJvY/PFvSgg3M7wY8lceeBnLXMk65IW8QkhJQ==","shasum":"c9459e14b57f66b845ded4ad5cad7ef75c104bbf","tarball":"https://registry.npmjs.org/r3f-form/-/r3f-form-1.4.0.tgz","fileCount":53,"unpackedSize":100092,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDYj1mz9yCAFt8T5o8Ofk+15wUVx6lJikVK3LSyawCiHwIgJPxngxk4K9Q8xrGf9XeGoFSbIPDa+2nkoYhhgXIFkZE="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxcQ1ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmre+RAAkOZKivnIV2qKaY5UFga/08SmOtaF6noBZJ75OMXZlzuGkgVM\r\n0A1bY+LeCtInPNmLhVzqzkY2dRjTYzBgZRSEprhJbfYigqtw+uL9iuABgtdj\r\ntnC0Br9uqwCjPgpE+4p9o4AmiRfGQJ+7QeCw0RebuNbnYWNei37fl91kVQEK\r\nm3uUdEC7F5syuCbHDpduNRyuzDfCrgaLI1+BeD/h9hgbZ8zJVtK9lSs1xicr\r\nEb5yF039A3spxlucZWHAPPeaUHqYxV2WKWXRjYy3ItdFUorJ9UueveFP3pvy\r\nvvwmFRqae9pPvIoezetWazG9T9ZjcIAFTP7XY/O9oJ6+ElKM6iUXByWsNvCj\r\nQM0qzSnRjQnbFN8fHAYt35JJNSv/2IRiZYws5kpAmWFBzrqIJ7Tj3abPr0Fu\r\ngiAf3MFWTXGLTCz26aGFlxQeUl4SeYDBSMsmvulK1cTuItOvvQaXtWns1esT\r\njamg4q1/8YnoQHXRyhxHanQZV0VapPaOfjYlFeZZGAXHbW3wR/iha89Wm9fF\r\nCnstREDps5jCNwKXRjIkg9yliYvrgxWFOlIuKG3sj1Q4O0gZvR7KMkvMsouE\r\n1pkjwtAwvSiScy/UnpI133iZfzYuj6POkjR6KzuIjdFS/8QZa/0V1OwuBucb\r\nquc+cZsDZ9+PQThP5vNsbxNj9M0ICLsvgLg=\r\n=h+y7\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"jberesford","email":"volcaus@gmail.com"},"directories":{},"maintainers":[{"name":"jberesford","email":"volcaus@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/r3f-form_1.4.0_1673905205515_0.878999096354367"},"_hasShrinkwrap":false},"1.4.1":{"name":"r3f-form","version":"1.4.1","description":"A webGL input field component for use with React Three Fiber","main":"dist/index.cjs.js","module":"dist/index.js","types":"dist/index.d.ts","publishConfig":{"access":"public"},"scripts":{"build":"rollup -c --bundleConfigAsCjs","typegen":"tsc --emitDeclarationOnly","lint":"eslint .","storybook":"start-storybook -p 6006","build-storybook":"build-storybook","semantic-release":"semantic-release --branches main"},"author":{"name":"John Beresford"},"license":"MIT","devDependencies":{"@babel/core":"^7.20.7","@babel/plugin-transform-runtime":"^7.19.6","@babel/preset-env":"^7.20.2","@babel/preset-react":"^7.18.6","@babel/preset-typescript":"^7.18.6","@react-three/drei":"^9.48.6","@react-three/fiber":"^8.9.1","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-node-resolve":"^15.0.1","@rollup/plugin-terser":"^0.2.1","@rollup/plugin-typescript":"^10.0.1","@storybook/addon-actions":"^6.5.15","@storybook/addon-essentials":"^6.5.15","@storybook/addon-interactions":"^6.5.15","@storybook/addon-links":"^6.5.15","@storybook/builder-webpack4":"^6.5.15","@storybook/manager-webpack4":"^6.5.15","@storybook/react":"^6.5.15","@storybook/testing-library":"^0.0.13","@types/react":"^18.0.26","@types/react-dom":"^18.0.10","@types/three":"^0.146.0","@typescript-eslint/eslint-plugin":"^5.48.0","@typescript-eslint/parser":"^5.48.0","babel-loader":"^8.3.0","eslint":"^8.31.0","eslint-config-prettier":"^8.6.0","eslint-plugin-import":"^2.26.0","eslint-plugin-prettier":"^4.2.1","eslint-plugin-react":"^7.31.11","eslint-plugin-react-hooks":"^4.6.0","react":"^18.2.0","react-dom":"^18.2.0","rollup":"^3.9.0","rollup-plugin-multi-input":"^1.3.1","semantic-release":"^19.0.5","three":"^0.148.0","troika-three-text":"^0.47.1","tslib":"^2.4.1","typescript":"^4.9.4"},"peerDependencies":{"@react-three/drei":">=9.0","@react-three/fiber":">=8.0","react":">=18.0","react-dom":">=18.0","three":">=0.146.0","troika-three-text":">=0.47.0"},"repository":{"type":"git","url":"git+https://github.com/JMBeresford/r3f-form.git"},"gitHead":"eeba2a26a0853dfd5c4cc50977e0a7342d43bee0","bugs":{"url":"https://github.com/JMBeresford/r3f-form/issues"},"homepage":"https://github.com/JMBeresford/r3f-form#readme","_id":"r3f-form@1.4.1","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-h59eQfrzJyyOXa41MuJ1YOups2UQzhdeLsRKIHY+zFjIndu7JZ2Z7g7jCxyAT51ObicjsOB+eK88RSuyUiyu3Q==","shasum":"48fc2728dd90a7436a252e0c131f399cfd2b2af3","tarball":"https://registry.npmjs.org/r3f-form/-/r3f-form-1.4.1.tgz","fileCount":53,"unpackedSize":106978,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDJsL3yrZp8+zLI7Y54f4PyWCclU8yJpe/SC1+GOI6kFAIhAJv3bUmlzyJanJ+o7uKFc17Ewqwxz9QlWA74bEhyIH8z"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxccqACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqWXxAApGjC1mPoIout5LxZe/kc1BHnWc0uDgIwWVq1d6caozijo93L\r\n9xIshi2qedEOfkdoSgEFVDi1kCpf8k5YxqnhL5BnZtWrD34Jhov1oEhJP4fk\r\nganjPF645Ey/gExAKle1twoY3nsNMemyPjQ6syn6Xd+8JMXg6FHHb2A8a93z\r\nhAu7+BF2CZVz8tzISycMtzuno2/9NLqTV7KHf39kMCvc0Zi5dQV4cQwdpxt/\r\nKu/+DDPRyiOWg9nHwfFLUDTdj4euuX1GRSWGcu0bVNs9jLpWnlruii6HfM8i\r\n1ZFd3VnV7SqLUga4V/Yp+pRkuml7fqzmL5NntizFKsjutUzWhCKhe19REKUy\r\ngBAKACN3lcmHgOiKQqDX0ZBmExXn4O2/IR4xt0jh7rkEz3InSCX0aJ94siRT\r\nypYvjIoP11TWEk96QNv2G0zKvuWFM9UWpinLLzSPi3s4TMM4eSMwoJZpD6Yp\r\nPAiXNGoQ3A7ayfCN1N5+NMnepXI97y6tXmP4VKXcFuB/V8Jed5ewv5n5bbTi\r\nNKC/yPa0HXukLyZC+jufIREhj8a+LHes1n9yeSesqeeI1BVQAWReU1mIeAOe\r\nrruJ9dnTRbM5uBLDBDxA3fUvoywGAD0Nv3aaoSWBr7nsNIo0BaPoYQYj5vMP\r\n+oPfXNcSMnjc8viGcg4QUTD1a3oGr/Dd/4k=\r\n=PA3x\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"jberesford","email":"volcaus@gmail.com"},"directories":{},"maintainers":[{"name":"jberesford","email":"volcaus@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/r3f-form_1.4.1_1673905962740_0.6355112725551353"},"_hasShrinkwrap":false},"1.4.2":{"name":"r3f-form","version":"1.4.2","description":"A webGL input field component for use with React Three Fiber","main":"dist/index.cjs.js","module":"dist/index.js","types":"dist/index.d.ts","publishConfig":{"access":"public"},"scripts":{"build":"rollup -c --bundleConfigAsCjs","typegen":"tsc --emitDeclarationOnly","lint":"eslint .","storybook":"start-storybook -p 6006","build-storybook":"build-storybook","semantic-release":"semantic-release --branches main"},"author":{"name":"John Beresford"},"license":"MIT","devDependencies":{"@babel/core":"^7.20.7","@babel/plugin-transform-runtime":"^7.19.6","@babel/preset-env":"^7.20.2","@babel/preset-react":"^7.18.6","@babel/preset-typescript":"^7.18.6","@react-three/drei":"^9.48.6","@react-three/fiber":"^8.9.1","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-node-resolve":"^15.0.1","@rollup/plugin-terser":"^0.2.1","@rollup/plugin-typescript":"^10.0.1","@storybook/addon-actions":"^6.5.15","@storybook/addon-essentials":"^6.5.15","@storybook/addon-interactions":"^6.5.15","@storybook/addon-links":"^6.5.15","@storybook/builder-webpack4":"^6.5.15","@storybook/manager-webpack4":"^6.5.15","@storybook/react":"^6.5.15","@storybook/testing-library":"^0.0.13","@types/react":"^18.0.26","@types/react-dom":"^18.0.10","@types/three":"^0.146.0","@typescript-eslint/eslint-plugin":"^5.48.0","@typescript-eslint/parser":"^5.48.0","babel-loader":"^8.3.0","eslint":"^8.31.0","eslint-config-prettier":"^8.6.0","eslint-plugin-import":"^2.26.0","eslint-plugin-prettier":"^4.2.1","eslint-plugin-react":"^7.31.11","eslint-plugin-react-hooks":"^4.6.0","react":"^18.2.0","react-dom":"^18.2.0","rollup":"^3.9.0","rollup-plugin-multi-input":"^1.3.1","semantic-release":"^19.0.5","three":"^0.148.0","troika-three-text":"^0.47.1","tslib":"^2.4.1","typescript":"^4.9.4"},"peerDependencies":{"@react-three/drei":">=9.0","@react-three/fiber":">=8.0","react":">=18.0","react-dom":">=18.0","three":">=0.146.0","troika-three-text":">=0.47.0"},"repository":{"type":"git","url":"git+https://github.com/JMBeresford/r3f-form.git"},"gitHead":"c6d80093de34a2bdd1ccd6911172c3fa55476b29","bugs":{"url":"https://github.com/JMBeresford/r3f-form/issues"},"homepage":"https://github.com/JMBeresford/r3f-form#readme","_id":"r3f-form@1.4.2","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-2xJHhoZd77710a0mrs0oGyvY/lgTDdAnfrUSnTug730lzqtgkdx6f/JTB3MrfdJCCbvZWxr1W0z6WxdQ6SOUNg==","shasum":"3e40d40cd94e3dae7df013a9d0b2b03753fc2d20","tarball":"https://registry.npmjs.org/r3f-form/-/r3f-form-1.4.2.tgz","fileCount":53,"unpackedSize":107021,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHvB/ZriU7ZgVwkMh+i6DyGUjDytH/6NZyjwbMouufgWAiEAuhYYIO4Kf6vP9az2yUqD250pZ+vudGRGI17n9WqTpoo="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxdNDACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqhWhAAlzcdqHVKcHoFmxtvHwpa0HUYUeQENtcNPcTJE5MMoemM4vHN\r\n5q9AItoZznaQEapNnE5Y6gvMvxlv5ET4jcd2ltptTC6sf1OqIMIU6W46KJ/u\r\nainKcVYkWkKP5dfiGQrOYNHfXc8zCQUqqMnxmkQ6lglGXUTr3XnuiZYszXgv\r\nc6eMHmCPP4RodXlTQQ0AvlwjEqEgiEfG6o+9wGTTdUib+uJOQIsnChwNEPkU\r\n/Wd5YaVl7erdil3CljkafLAlZ1G0zKRsD2oss4oWP95a8rsIIXdxtk6LYUOc\r\nB2lPvoCTkQ89jFKMjuJwNHlkfeEl77ImDzRlyCrUclo2QSlZD5Hi5MUWXj5m\r\nbuf9S5v+8akhxKDOOanPZbtgJ5LhSUSIBEa6XnQ37rieD6IrQgQH5HD91ZhV\r\nA5FhXTWL0B+gX4Xq+PfVB8Q0TjL4iT4U+cPB6Bffg4PlAkHff+WVA9li8mAc\r\nSr98YSwNwB8mQ9ozjFgt+YfO4sHjUvk8ntbwWGu5vaxZx/xmmnkyzgYvTacf\r\nKCUQiIlXwQRVHmr4jD02gBSugj2/dHf3atZgRCI8t+zcLr555WVpyyQIzfkp\r\nEXwKWJaeezggXSg7C14zPhvLa5vlxR/JQtOHWftfHiG9JHtbeYLC5j2Z6c8B\r\nzfa3C4vSwwhHoBohwZqXVut0hcAnEBf6vPo=\r\n=pgBV\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"jberesford","email":"volcaus@gmail.com"},"directories":{},"maintainers":[{"name":"jberesford","email":"volcaus@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/r3f-form_1.4.2_1673909058969_0.3945312579656066"},"_hasShrinkwrap":false},"1.4.4":{"name":"r3f-form","version":"1.4.4","description":"A webGL input field component for use with React Three Fiber","main":"dist/index.cjs.js","module":"dist/index.js","types":"dist/index.d.ts","publishConfig":{"access":"public"},"scripts":{"build":"rollup -c --bundleConfigAsCjs","typegen":"tsc --emitDeclarationOnly","lint":"eslint .","storybook":"start-storybook -p 6006","build-storybook":"build-storybook","semantic-release":"semantic-release --branches main"},"author":{"name":"John Beresford"},"license":"MIT","devDependencies":{"@babel/core":"^7.20.7","@babel/plugin-transform-runtime":"^7.19.6","@babel/preset-env":"^7.20.2","@babel/preset-react":"^7.18.6","@babel/preset-typescript":"^7.18.6","@react-three/drei":"^9.48.6","@react-three/fiber":"^8.9.1","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-node-resolve":"^15.0.1","@rollup/plugin-terser":"^0.2.1","@rollup/plugin-typescript":"^10.0.1","@storybook/addon-actions":"^6.5.15","@storybook/addon-essentials":"^6.5.15","@storybook/addon-interactions":"^6.5.15","@storybook/addon-links":"^6.5.15","@storybook/builder-webpack4":"^6.5.15","@storybook/manager-webpack4":"^6.5.15","@storybook/react":"^6.5.15","@storybook/testing-library":"^0.0.13","@types/react":"^18.0.26","@types/react-dom":"^18.0.10","@types/three":"^0.146.0","@typescript-eslint/eslint-plugin":"^5.48.0","@typescript-eslint/parser":"^5.48.0","babel-loader":"^8.3.0","eslint":"^8.31.0","eslint-config-prettier":"^8.6.0","eslint-plugin-import":"^2.26.0","eslint-plugin-prettier":"^4.2.1","eslint-plugin-react":"^7.31.11","eslint-plugin-react-hooks":"^4.6.0","react":"^18.2.0","react-dom":"^18.2.0","rollup":"^3.9.0","rollup-plugin-multi-input":"^1.3.1","semantic-release":"^19.0.5","three":"^0.148.0","troika-three-text":"^0.47.1","tslib":"^2.4.1","typescript":"^4.9.4"},"peerDependencies":{"@react-three/drei":">=9.0","@react-three/fiber":">=8.0","react":">=18.0","react-dom":">=18.0","three":">=0.146.0","troika-three-text":">=0.47.0"},"repository":{"type":"git","url":"git+https://github.com/JMBeresford/r3f-form.git"},"gitHead":"d4383cfb4f20fc39c7d0ea6c5ae18ffde2fc868b","bugs":{"url":"https://github.com/JMBeresford/r3f-form/issues"},"homepage":"https://github.com/JMBeresford/r3f-form#readme","_id":"r3f-form@1.4.4","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-Mdike0iR6XGONWgtZpIGDUYwN20U37alw8wYsyXMq36g53blR00cTQmg4AKIEXKdL/outhdlu2mRtTNm9UaORw==","shasum":"05b642429461c27da973ed5a9265b893ba29ccfd","tarball":"https://registry.npmjs.org/r3f-form/-/r3f-form-1.4.4.tgz","fileCount":53,"unpackedSize":107856,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCs2Fm3EdyZvl2x5XEYgXPHdTxiTu2kv0wPA8ZdWGdntwIgLgKHM9qEFUAjKZatA8P9rR+BJCd2NA16vebNfneGOzk="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxd0dACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq5UQ//cTHUDWJoXyMwvZF1pJbRr4uALEatTY+CbLBAlFkgvKuJNPye\r\nsO+aN9ql3aa8GsNTCXO44M6pbWgdgb3oAySfb7fhaHGzvgqhgHEAE9UsaDfW\r\nr3asMWdcOq2J8KCHYCZD0n7lkcaMW3pruFwIMVTimoPMDcft0yUDgNAymY9W\r\nN+yEcBf2zreZlowtlRTy+C/4xgkNE4It3hc1xYuiB2wF1t5nALl6gnkz8j0S\r\n6IDv/wQvocmb6Mzj6DU/mlMNSppbU4J/6yxT/4PE46hc8lczFrjMV58JTRl1\r\nj4CpN5gJHIfYjUWtco217TGO7fidy5b8YTs+baoocaiDq2NZCsZ+M4MA/sAk\r\nbo8tRQETeAJRBzBVSrMk0c58g+n/Ng3TKt0Hkd/hB18dAW/m7RwsTMwWZ5X/\r\n64hPFga6ekXGxRvt23sQYYcjuTHHFMXVR/KuxRXl82EUyLs4QG4C7rshw5Qp\r\npsXJpha+XTUrRusCHAVW0+jBXFmNGKbEbTQVn6dGru9p4UuY/VV5/QFHNftq\r\nxfODRYO6Ylf82kViRSMqvL5NW0wLqpJFmM5nBzUeqxjKPtrTC86pkDgo6y3+\r\nOFMDf0oI9Fc9mxkB4yevBXs14iP559g8dUPaz0FtbzFWxulj/Hza0wGTmPlX\r\nFt7cPnYxyIeLxFKPeO2Yo1qyMSWXFFfNz+w=\r\n=fgUj\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"jberesford","email":"volcaus@gmail.com"},"directories":{},"maintainers":[{"name":"jberesford","email":"volcaus@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/r3f-form_1.4.4_1673911581179_0.8215692034796624"},"_hasShrinkwrap":false},"1.4.5":{"name":"r3f-form","version":"1.4.5","description":"A webGL input field component for use with React Three Fiber","main":"dist/index.cjs.js","module":"dist/index.js","types":"dist/index.d.ts","publishConfig":{"access":"public"},"scripts":{"build":"rollup -c --bundleConfigAsCjs","typegen":"tsc --emitDeclarationOnly","lint":"eslint .","storybook":"start-storybook -p 6006","build-storybook":"build-storybook","semantic-release":"semantic-release --branches main"},"author":{"name":"John Beresford"},"license":"MIT","devDependencies":{"@babel/core":"^7.20.7","@babel/plugin-transform-runtime":"^7.19.6","@babel/preset-env":"^7.20.2","@babel/preset-react":"^7.18.6","@babel/preset-typescript":"^7.18.6","@react-three/drei":"^9.48.6","@react-three/fiber":"^8.9.1","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-node-resolve":"^15.0.1","@rollup/plugin-terser":"^0.2.1","@rollup/plugin-typescript":"^10.0.1","@storybook/addon-actions":"^6.5.15","@storybook/addon-essentials":"^6.5.15","@storybook/addon-interactions":"^6.5.15","@storybook/addon-links":"^6.5.15","@storybook/builder-webpack4":"^6.5.15","@storybook/manager-webpack4":"^6.5.15","@storybook/react":"^6.5.15","@storybook/testing-library":"^0.0.13","@types/react":"^18.0.26","@types/react-dom":"^18.0.10","@types/three":"^0.146.0","@typescript-eslint/eslint-plugin":"^5.48.0","@typescript-eslint/parser":"^5.48.0","babel-loader":"^8.3.0","eslint":"^8.31.0","eslint-config-prettier":"^8.6.0","eslint-plugin-import":"^2.26.0","eslint-plugin-prettier":"^4.2.1","eslint-plugin-react":"^7.31.11","eslint-plugin-react-hooks":"^4.6.0","react":"^18.2.0","react-dom":"^18.2.0","rollup":"^3.9.0","rollup-plugin-multi-input":"^1.3.1","semantic-release":"^19.0.5","three":"^0.148.0","troika-three-text":"^0.47.1","tslib":"^2.4.1","typescript":"^4.9.4"},"peerDependencies":{"@react-three/drei":">=9.0","@react-three/fiber":">=8.0","react":">=18.0","react-dom":">=18.0","three":">=0.146.0","troika-three-text":">=0.47.0"},"repository":{"type":"git","url":"git+https://github.com/JMBeresford/r3f-form.git"},"gitHead":"74cf3d41effa0325cdf35509ea6c5b5d705d20fa","bugs":{"url":"https://github.com/JMBeresford/r3f-form/issues"},"homepage":"https://github.com/JMBeresford/r3f-form#readme","_id":"r3f-form@1.4.5","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-kj9iUq0HsfGhd2hpBnTAP5w4UoXOzvOF155C8BFevm3w5sZNk+/XdGM8XKA+PJtwuPCBo4fXPe0tv59on5KWuw==","shasum":"002bbb9bea00ef8056094b149102b4c80125fe0b","tarball":"https://registry.npmjs.org/r3f-form/-/r3f-form-1.4.5.tgz","fileCount":53,"unpackedSize":107635,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFOYvCMQI/VpIC5DKlS4G8BYJ3CHe0yUADh6hXDiXlV8AiAMCXE0QuHhSfQeGSVZ1LkQRzGeBzXWg9arFmQoMDPxcw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjxfPdACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrADg//e6ycR09LnAd+E5kn89SK3Ba+iKsnx+KyVN734iuKASMOVgQW\r\n5P3bQEoMN+KTZk515mBotmeb3pHyEnol1t8P5DAsitiqSq/u3X+fZV88Rg1L\r\n2SVkz0F/PLd1gQ4WuNtmOqBOoQVqU8PBGvaLatBwjfKkVsTvfqwf5KlsRH6Z\r\n4RDKLMFkZNFA07kDiJKD7koC0ehPMMciSduzpxh+oCSQ0PKdH+rX1fiUUHCN\r\nNPbUkbG2sxRBrkWqeXcXa/DsJRNAZ1Dk7eNsPZXNe8FJ3+8+K1dOk5iMFksp\r\nyP2cEOZM2DenAYJ3uBZspSSspPkiN0x5GLZUbK191kJdegWngEXxcYUACGZj\r\nfLgxkhzFM1He6VMNK1KX7Al7ZXu75QmqOOy4tVMabo6vCpS8VAXD+4XmcqXR\r\nvqaZ2pC4RZzEcGxHII9xSOQMYxTgWabCJZYERpWSjni7R8wkbTO3kGsj7Itu\r\n63DHYudr3lQypqknFZ6IrTR+P7XmZPt7bnPzktPUL0jPupQAO0tRbX/bLAru\r\nDVK0hVYqkXM9Qx0ckhIYRPIde0j6LYURTuI4d1vsMdccw/tVGuwOIb3l4S6C\r\nRlsuRIzz1oSmS6O87MJtzqpaoAYPJwBJ/V+FT2YujNBfZGx84H6i+yHLUbe0\r\nx+A27jXtD32igOyhysKg0xS8rRt6Be+I92Y=\r\n=VBdY\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"jberesford","email":"volcaus@gmail.com"},"directories":{},"maintainers":[{"name":"jberesford","email":"volcaus@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/r3f-form_1.4.5_1673917404924_0.34967152833283555"},"_hasShrinkwrap":false},"2.0.0":{"name":"r3f-form","version":"2.0.0","description":"A webGL input field component for use with React Three Fiber","main":"dist/index.cjs.js","module":"dist/index.js","types":"dist/index.d.ts","publishConfig":{"access":"public"},"scripts":{"build":"rollup -c --bundleConfigAsCjs","typegen":"tsc --emitDeclarationOnly","lint":"eslint .","storybook":"start-storybook -p 6006","build-storybook":"build-storybook","semantic-release":"semantic-release --branches main","commit":"cz"},"author":{"name":"John Beresford"},"license":"MIT","devDependencies":{"@babel/core":"^7.20.7","@babel/plugin-transform-runtime":"^7.19.6","@babel/preset-env":"^7.20.2","@babel/preset-react":"^7.18.6","@babel/preset-typescript":"^7.18.6","@react-three/drei":"^9.48.6","@react-three/fiber":"^8.9.1","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-node-resolve":"^15.0.1","@rollup/plugin-terser":"^0.2.1","@rollup/plugin-typescript":"^10.0.1","@storybook/addon-actions":"^6.5.15","@storybook/addon-essentials":"^6.5.15","@storybook/addon-interactions":"^6.5.15","@storybook/addon-links":"^6.5.15","@storybook/builder-webpack4":"^6.5.15","@storybook/manager-webpack4":"^6.5.15","@storybook/react":"^6.5.15","@storybook/testing-library":"^0.0.13","@types/react":"^18.0.26","@types/react-dom":"^18.0.10","@types/three":"^0.146.0","@typescript-eslint/eslint-plugin":"^5.48.0","@typescript-eslint/parser":"^5.48.0","babel-loader":"^8.3.0","commitizen":"^4.3.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.31.0","eslint-config-prettier":"^8.6.0","eslint-plugin-import":"^2.26.0","eslint-plugin-prettier":"^4.2.1","eslint-plugin-react":"^7.31.11","eslint-plugin-react-hooks":"^4.6.0","react":"^18.2.0","react-dom":"^18.2.0","rollup":"^3.9.0","rollup-plugin-multi-input":"^1.3.1","semantic-release":"^19.0.5","three":"^0.148.0","troika-three-text":"^0.47.1","tslib":"^2.4.1","typescript":"^4.9.4"},"peerDependencies":{"@react-three/drei":">=9.0","@react-three/fiber":">=8.0","react":">=18.0","react-dom":">=18.0","three":">=0.146.0","troika-three-text":">=0.47.0"},"repository":{"type":"git","url":"git+https://github.com/JMBeresford/r3f-form.git"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"gitHead":"8be408465028fc44fbba45ce667321baac1a6315","bugs":{"url":"https://github.com/JMBeresford/r3f-form/issues"},"homepage":"https://github.com/JMBeresford/r3f-form#readme","_id":"r3f-form@2.0.0","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-+31GD33sfeOU0T1OgNQiw3Q2s7bom2G6YW2cN2VaomEzTxTKkGRxetNSxvzK7H85JFWpoXpsFE9bTqolH0GqIQ==","shasum":"997503680b5707d0e79ad3eb4067f8813cf2516e","tarball":"https://registry.npmjs.org/r3f-form/-/r3f-form-2.0.0.tgz","fileCount":50,"unpackedSize":107074,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCAB4TA1hcTQTIHYfE/Bq8AFbC1wTRQXfjIn8Vd6nCRegIhAOlLa50zDtS1I5wXVqkkHpPr3AUxJbQLmx3TtM/N5k9D"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj5HkgACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrbQxAAl3xbm5O9pm/Y9oluFqVtxrnmrHb5SrcB7Cd1owIPzyFm8eMC\r\nBKAi22VdvbPRI0EYYXBvgAaYCKx+TPOb6bJXCF6TwWB4ijM6SF5IPeflP/UE\r\nZ2lZfTPS4QlG6wzp4wFbLzFpeM+1QgEftYbw/JBi73ny75eS0og+qEjUtTW3\r\n7YV8z+dchuJ1h/FNBY45muf4dw+4kLTzDAsp+nw8K3ZVCMXAXiZCiIya+wOK\r\nTTyG88cK3K7VSsqoFtlIUsiTwunsrDoRt1MJHZyHSGnrIXcoXkmHKLRJ5Pal\r\n0FgzuCQ5M8hOazlPCXF9F/oDOXhUM0T4szL3i+HoU3FRtr+CqHFIAx5nD8Vx\r\nQhniCjPJFzZ/IEF/9TN5IYYEub7SLnzCBl8rGq1iBaGQqktf5jvFRnAgy6Fj\r\n94tjzvxUE3WDVZWWCU1++xpbl/l9kuNqxH3+2Bq/P32u96o5tlTvQhnB+BR5\r\n4Rx8rNYLKf7CHISou3hxCEAjjAflsRUJ0NPY7LDXSIfS/NUJcZGnmhTLuIhj\r\npFg0qdvh85pmgka+RqPEQPiDcQDViskfxqwNfw4SKtXYqSn/259nqupi81kb\r\nl9Cx3m1fiiXlrTrnuIaagJTWrcsiMGZgXKRAYcjDXFSbNyPgzCPQaL7L9Pni\r\nuAr7bSTDFGX3EEhjKqzOLFh2BzbHDpDQbjE=\r\n=oyii\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"jberesford","email":"volcaus@gmail.com"},"directories":{},"maintainers":[{"name":"jberesford","email":"volcaus@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/r3f-form_2.0.0_1675917600612_0.8095879938157398"},"_hasShrinkwrap":false},"2.0.1":{"name":"r3f-form","version":"2.0.1","description":"A webGL input field component for use with React Three Fiber","main":"dist/index.cjs.js","module":"dist/index.js","types":"dist/index.d.ts","publishConfig":{"access":"public"},"scripts":{"build":"rollup -c --bundleConfigAsCjs","typegen":"tsc --emitDeclarationOnly","lint":"eslint .","storybook":"start-storybook -p 6006","build-storybook":"build-storybook","semantic-release":"semantic-release --branches main","commit":"cz"},"author":{"name":"John Beresford"},"license":"MIT","devDependencies":{"@babel/core":"^7.20.7","@babel/plugin-transform-runtime":"^7.19.6","@babel/preset-env":"^7.20.2","@babel/preset-react":"^7.18.6","@babel/preset-typescript":"^7.18.6","@react-three/drei":"^9.48.6","@react-three/fiber":"^8.9.1","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-node-resolve":"^15.0.1","@rollup/plugin-terser":"^0.2.1","@rollup/plugin-typescript":"^10.0.1","@storybook/addon-actions":"^6.5.15","@storybook/addon-essentials":"^6.5.15","@storybook/addon-interactions":"^6.5.15","@storybook/addon-links":"^6.5.15","@storybook/builder-webpack4":"^6.5.15","@storybook/manager-webpack4":"^6.5.15","@storybook/react":"^6.5.15","@storybook/testing-library":"^0.0.13","@types/react":"^18.0.26","@types/react-dom":"^18.0.10","@types/three":"^0.146.0","@typescript-eslint/eslint-plugin":"^5.48.0","@typescript-eslint/parser":"^5.48.0","babel-loader":"^8.3.0","commitizen":"^4.3.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.31.0","eslint-config-prettier":"^8.6.0","eslint-plugin-import":"^2.26.0","eslint-plugin-prettier":"^4.2.1","eslint-plugin-react":"^7.31.11","eslint-plugin-react-hooks":"^4.6.0","react":"^18.2.0","react-dom":"^18.2.0","rollup":"^3.9.0","rollup-plugin-multi-input":"^1.3.1","semantic-release":"^19.0.5","three":"^0.148.0","troika-three-text":"^0.47.1","tslib":"^2.4.1","typescript":"^4.9.4"},"peerDependencies":{"@react-three/drei":">=9.0","@react-three/fiber":">=8.0","react":">=18.0","react-dom":">=18.0","three":">=0.146.0","troika-three-text":">=0.47.0"},"repository":{"type":"git","url":"git+https://github.com/JMBeresford/r3f-form.git"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"gitHead":"dacf0e2be87585fce73a46578fe72aad535c62a6","bugs":{"url":"https://github.com/JMBeresford/r3f-form/issues"},"homepage":"https://github.com/JMBeresford/r3f-form#readme","_id":"r3f-form@2.0.1","_nodeVersion":"16.19.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-9dYMH5Gc8CYBGt+U3kccEsXTIDZZvb9eMoOvcfycL+jUn/ZNBXrULpxvmLyx6gLsXqywD8YXsrHsqskYv3HftQ==","shasum":"a38958da8a6c0394cd8b3531ce18b4e770e3b2c8","tarball":"https://registry.npmjs.org/r3f-form/-/r3f-form-2.0.1.tgz","fileCount":50,"unpackedSize":107243,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCGLnDDM1jZQn1ObTL26Qj177Td8Ox07EZ0dcAHjpae/AIgfXmBKiZbz7GFm/1GhYEgYWS1hC5TBcyxrL2HyTD4ooY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj5Im2ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpuDhAAh6a1q19vB14YJzZREOSnkiguQLh9lVWWuhzBZvwPQPhuhwtg\r\nHgovdac53wLVXal2P9V35KDSKyLp4BFMlm0nYXnV7nlTxqKiTlNleqza55FG\r\na/QooNPw5uWmxKHmcKMk4TLsCCegFWvqlgkAB5dbjIxMPLb/Pq5Il63Dk14s\r\nzT4nShrVhIPYiyJWwQ7rwL+EVz9cS7jyxn4gUq784dcoLGdJTjltZtNo03ux\r\nGyD9iA2zJ78DsUX4hPUy1XrmnH2oUQuWCOUbB0PO6vVI+F9k1scPeHIpwV07\r\nnAQZhtXlOxfRPZx52P5huai2k9vmEGTherNcwl2aFoUf+GVBmIjQnktWaPhC\r\nr0lEVWQ1bMVGNn2S4SjzcVsz7sY4GiG5OCxdSdRkTE2qPqtoUXOeiF9RvtH6\r\nNknqNKEhI58MJ5ec6czp6J+47UjYvzXgFm3fJ5V06jSJ8txRiYKrjSEmmHrl\r\nhOO1yJQGO6HsRIkiEBMkfgykIhS1iOIkn0j/HJv7Cmn05GOAKgeAqdiW99rf\r\nO6tLXOien/SowTycnv2eI2CuOxH+52s6QQZzYIJVOXyDcz80xCXYLFp5z3d+\r\nGHBh5wgKgRGYWR32pVwpJ5VCQ8l8Ut7SlKboWGjGJhiySOH6z4HESpnvDWnI\r\niz9I9UrI2HD7WEs1Q6aDfoAlIA8bTqPLzPQ=\r\n=4uxM\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"jberesford","email":"volcaus@gmail.com"},"directories":{},"maintainers":[{"name":"jberesford","email":"volcaus@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/r3f-form_2.0.1_1675921846527_0.5382516794467735"},"_hasShrinkwrap":false},"2.0.2-beta.1":{"name":"r3f-form","version":"2.0.2-beta.1","description":"A webGL input field component for use with React Three Fiber","main":"dist/index.cjs.js","exports":{"./Input":{"import":"./dist/Input/index.js","require":"./dist/Input/index.cjs.js"},"./Textarea":{"import":"./dist/Textarea/index.js","require":"./dist/Textarea/index.cjs.js"}},"module":"dist/index.js","types":"dist/index.d.ts","publishConfig":{"access":"public"},"scripts":{"build":"rollup -c --bundleConfigAsCjs","typegen":"tsc --emitDeclarationOnly","lint":"eslint .","storybook":"start-storybook -p 6006","build-storybook":"build-storybook","semantic-release":"semantic-release --branches main","commit":"cz"},"author":{"name":"John Beresford"},"license":"MIT","devDependencies":{"@babel/core":"^7.20.7","@babel/plugin-transform-runtime":"^7.19.6","@babel/preset-env":"^7.20.2","@babel/preset-react":"^7.18.6","@babel/preset-typescript":"^7.18.6","@react-three/drei":"^9.48.6","@react-three/fiber":"^8.9.1","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-node-resolve":"^15.0.1","@rollup/plugin-terser":"^0.2.1","@rollup/plugin-typescript":"^10.0.1","@storybook/addon-actions":"^6.5.15","@storybook/addon-essentials":"^6.5.15","@storybook/addon-interactions":"^6.5.15","@storybook/addon-links":"^6.5.15","@storybook/builder-webpack4":"^6.5.15","@storybook/manager-webpack4":"^6.5.15","@storybook/react":"^6.5.15","@storybook/testing-library":"^0.0.13","@types/react":"^18.0.26","@types/react-dom":"^18.0.10","@types/three":"^0.146.0","@typescript-eslint/eslint-plugin":"^5.48.0","@typescript-eslint/parser":"^5.48.0","babel-loader":"^8.3.0","commitizen":"^4.3.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.31.0","eslint-config-prettier":"^8.6.0","eslint-plugin-import":"^2.26.0","eslint-plugin-prettier":"^4.2.1","eslint-plugin-react":"^7.31.11","eslint-plugin-react-hooks":"^4.6.0","react":"^18.2.0","react-dom":"^18.2.0","rollup":"^3.9.0","rollup-plugin-multi-input":"^1.3.1","semantic-release":"^19.0.5","three":"^0.148.0","troika-three-text":"^0.47.1","tslib":"^2.4.1","typescript":"^4.9.4"},"peerDependencies":{"@react-three/drei":">=9.0","@react-three/fiber":">=8.0","react":">=18.0","react-dom":">=18.0","three":">=0.146.0","troika-three-text":">=0.47.0"},"repository":{"type":"git","url":"git+https://github.com/JMBeresford/r3f-form.git"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"readme":"# r3f-form\n\n### [View examples](https://jmberesford.github.io/r3f-form/?path=/story/form--default-submit-button)\n\n> ## WARNING: UNDER HEAVY DEVELOPMENT\n>\n> Each release will aim to be a fully functional and usable release,\n> but breaking API changes WILL be likely for the forseeable future.\n\n## A webGL form component for use with React Three Fiber\n\n![image](https://user-images.githubusercontent.com/1373954/210024281-c735f61a-1a69-45e5-a5d3-147ed57a6c30.png)\n\nThis package aims to create a fully-functional and **accessible** `<Form />`\ncomponents that can be used within the [@react-three/fiber](https://github.com/pmndrs/react-three-fiber)\necosystem. Ultimately, the goal is to have fully functioning HTML `<form>`s -- with all viable input types -- rendered in webGL.\n\nCurrent implementation binds webGL elements to the existing state and event systems of respective\nhidden HTML DOM elements. There is a heavy reliance on\n[troika-three-text](https://github.com/protectwise/troika/tree/main/packages/troika-three-text)\nfor text-rendering and selection/caret logic.\n\n> Note that `r3f-form` will only work within a React-Three-Fiber Canvas element.\n> You **must** be using\n>\n> - [@react-three/fiber](https://github.com/pmndrs/react-three-fiber)\n> - [@react-three/drei](https://github.com/pmndrs/drei)\n> - [troika-three-text](https://github.com/protectwise/troika/tree/main/packages/troika-three-text)\n>\n> as dependencies in your project to use `r3f-form`.\n\n### Install\n\n```sh\nnpm install r3f-form\n# or, if using yarn\nyarn install r3f-form\n```\n\n# How to use\n\n## Forms\n\nIn order to create a form, just wrap any relevant elements in a `<Form>`:\n\n```tsx\nimport { Form, Input, Label, Submit } from \"r3f-form\";\n\nexport function MyForm() {\n  return (\n    <Form>\n      <Label text=\"username\" />\n      <Input name=\"username\" />\n\n      <Label text=\"password\" />\n      <Input name=\"password\" type=\"password\" />\n\n      <Submit value=\"Login\" />\n    </Form>\n  );\n}\n```\n\n> Note that each element in the form will require a `name` prop in order to be picked up in submission, just like in a normal DOM form element\n\nThe relevant inputs will be bound to respective DOM elements under the hood, and be rendered into the 3D scene like so:\n\n![image](https://user-images.githubusercontent.com/1373954/217718779-816da536-00af-4375-85dd-de707e79aa8d.png)\n\nYou can define submission behavior just like with any old HTML `<form>`:\n\n```tsx\n// redirect to a login script\n<Form action=\"/login.php\"></Form>;\n\n// or handle it with a callback\nconst handleSubmit = (e: FormEvent) => {\n  e.preventDefault();\n\n  const data = new FormData(e.target);\n\n  for (let [name, value] of data.entries()) {\n    console.log(`${name}: ${value}`);\n  }\n};\n\n<Form onSubmit={handleSubmit}></Form>;\n```\n\n## Inputs\n\nAn editable text-box bound to an DOM `<input>` and represented in the webGL canvas.\n\n```ts\ntype Props = {\n  type?: \"text\" | \"password\";\n\n  /** width of the container */\n  width?: number;\n  backgroundColor?: Color;\n  selectionColor?: Color;\n  backgroundOpacity?: number;\n\n  /** [left/right , top/bottom] in THREE units, respectively\n   *\n   * note that height is implicitly defined by the capHeight of the rendered\n   * text. The cap height is dependant on both the `textProps.font` being used and the\n   * `textProps.fontSize` value\n   */\n  padding?: Vector2;\n  cursorWidth?: number;\n\n  /** 3D transformations */\n  position: Vector3;\n  rotation: Euler;\n  scale: Vector3;\n\n  // And ALL props available to DOM <input>s\n};\n```\n\nCreate a basic input field like so:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\nexport function MyInput() {\n  return (\n    <>\n      <Label text=\"label\" />\n      <Input />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718847-acb169ed-95ff-4def-a126-491c648346b9.png)\n\nYou can access the value of the input via the `onChange` callback prop:\n\n> The callback is passed the `ChangeEvent` object from the underlying HTML `<input>`s\n> change event on every change.\n>\n> Read more about this event [here](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/change_event)\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\nexport function MyInput() {\n  const [username, setUsername] = React.useState(\"\");\n  // username will always contain the current value\n\n  function handleChange(e) {\n    setUsername(ev.target.value);\n  }\n\n  return (\n    <>\n      <Label text=\"Test Input\" />\n      <Input onChange={handleChange} />\n    </>\n  );\n}\n```\n\nYou can also create password inputs:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\nexport function MyPassword() {\n  return (\n    <>\n      <Label text=\"Password\" />\n      <Input type=\"password\" />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718412-48158e10-53b2-4e79-86c9-54bc5495521a.png)\n\nAdd custom padding to the text container:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\n/*\n * padding: [horizontal padding, vertical padding] in THREE units\n */\n\nexport function MyInput() {\n  return (\n    <>\n      <Label text=\"Label\" />\n      <Input padding={[0.05, 0.5]} />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718475-1c696ff1-3b1d-4559-9d02-9535bd59cdff.png)\n\n---\n\n## Textarea\n\n```ts\ntype Props = {\n  /** width of the container */\n  width?: number;\n\n  backgroundColor?: Color;\n  backgroundOpacity?: number;\n  selectionColor?: Color;\n\n  /** [left/right , top/bottom] in THREE units, respectively\n   *\n   * note that height is implicitly defined by the capHeight of the rendered\n   * text. The cap height is dependant on both the `textProps.font` being used\n   * and the `textProps.fontSize` value\n   */\n  padding?: Vector2;\n  cursorWidth?: number;\n\n  /** 3D transformations */\n  position: Vector3;\n  rotation: Euler;\n  scale: Vector3;\n\n  // And ALL props available to DOM <textarea>s\n};\n```\n\nSimilar to the `<Input />` component, you can also create a `<Textarea />` like so:\n\n```tsx\nimport { Textarea, Label } from \"r3f-form\";\n\nexport function App() {\n  return (\n    <>\n      <Label text=\"Default Textarea:\" />\n      <Textarea />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718566-a718eab7-1e73-4559-96aa-8e14824f0031.png)\n\n---\n\n## Text\n\nIn order to configure the underlying `troika-three-text` instance\nthat is responsible for rendering the actual text, you can use the\n`<Text />` component.\n\nThere is a respective `<Text />` component for both `<Input />`s and\n`<Textarea />`s.\n\nFor all configuration options, check out the [troika docs](https://github.com/protectwise/troika/tree/main/packages/troika-three-text).\n\n> Note that **not all** of troika's props are exposed on these `<Text />`\n> components\n\nChange color and background opacity:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\nimport { Text } from \"r3f-form/Input\";\n\nexport function App() {\n  return (\n    <>\n      <Label text=\"Test Color/Opacity\" />\n      <Input backgroundOpacity={0.6} backgroundColor=\"black\">\n        <Text color=\"red\" />\n      </Input>\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718611-c2e4848e-8267-4926-9243-7bb61bced61d.png)\n\nIf you wanted to alter both an `<Input />` and a\n`<Textarea />` via their respective `<Text />` components\nyou could do the following:\n\n```tsx\nimport { Input, Textarea, Label } from \"r3f-form\";\nimport { Text as InputText } from \"r3f-form/Input\";\nimport { Text as TextareaText } from \"r3f-form/Textarea\";\n\nexport function App() {\n  return (\n    <>\n      <Label text=\"Test Color/Opacity\" />\n      <Input>\n        <InputText color=\"#red\" />\n      </Input>\n\n      <Label text=\"Test Textarea\" />\n      <Textarea>\n        <TextareaText color=\"red\" />\n      </Textarea>\n    </>\n  );\n}\n```\n\n---\n\n## Submit\n\nEquivalent to a DOM `<input type=\"submit\" />`, exposed as\nan independent component. By default it renders a button\nusing the following props:\n\n```ts\ntype Props = {\n  value?: string;\n  fontSize?: number;\n  width?: number;\n  height?: number;\n  color?: Color;\n  backgroundColor?: Color;\n\n  /** 3D transformations */\n  position: Vector3;\n  rotation: Euler;\n  scale: Vector3;\n\n  // And ALL props available to DOM <input>s\n};\n```\n\nAdd a simple submit button to your forms like so:\n\n```tsx\n<Form>\n  <Label text=\"Username\" />\n  <Input name=\"username\" />\n\n  <Label text=\"Password\" />\n  <Input name=\"password\" type=\"password\" />\n\n  <Submit value=\"Login\" />\n</Form>\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718665-c64f6653-f85f-4310-a1c7-f2cf43154f2e.png)\n\nWhile this provides a somewhat-customizable default button, the main purpose of this component\nis to provide a simple interface to use 3D elements to submit your forms. Any children passed in\nwill submit the form on click. For example:\n\n```tsx\n<Form>\n  . . .\n  <Submit value=\"submit\">\n    <MySubmitButton />\n  </Submit>\n</Form>\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718713-a0a6671f-3f1e-4817-9ee9-e205bcc22610.png)\n\nClicking on the big red button would submit the `<Form>`\n","readmeFilename":"README.md","gitHead":"0b8a681b7a8f4d860d5b4569b5702610354a643b","bugs":{"url":"https://github.com/JMBeresford/r3f-form/issues"},"homepage":"https://github.com/JMBeresford/r3f-form#readme","_id":"r3f-form@2.0.2-beta.1","_nodeVersion":"19.9.0","_npmVersion":"9.6.3","dist":{"integrity":"sha512-cuYiwrWL+RGhMtXxPsduBl9lUPaYSe1sLky7VHTgGSIxSJjlAE8jiXbu4ckTg/iLI8S3oV7A7xVA7inaPMqAVg==","shasum":"c246ac69432d97c1c9a5e778fedc35a0531460c1","tarball":"https://registry.npmjs.org/r3f-form/-/r3f-form-2.0.2-beta.1.tgz","fileCount":50,"unpackedSize":107499,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD/h8qhASiGse8mCOH65hqy2YR5mLlEzrCHDPd5NYosIQIhAIbpE7VxdvSrZOeDTpgkJN614QBWgjHp8LCllCQNIqU5"}]},"_npmUser":{"name":"jberesford","email":"volcaus@gmail.com"},"directories":{},"maintainers":[{"name":"jberesford","email":"volcaus@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/r3f-form_2.0.2-beta.1_1689097332988_0.6056439915390908"},"_hasShrinkwrap":false},"2.0.2-beta.2":{"name":"r3f-form","version":"2.0.2-beta.2","description":"A webGL input field component for use with React Three Fiber","main":"dist/index.cjs.js","exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs.js","types":"./dist/index.d.ts"},"./Input":{"import":"./dist/Input/index.js","require":"./dist/Input/index.cjs.js","types":"./dist/Input/index.d.ts"},"./Textarea":{"import":"./dist/Textarea/index.js","require":"./dist/Textarea/index.cjs.js","types":"./dist/Textarea/index.d.ts"}},"module":"dist/index.js","types":"dist/index.d.ts","publishConfig":{"access":"public"},"scripts":{"build":"rollup -c --bundleConfigAsCjs","typegen":"tsc --emitDeclarationOnly","lint":"eslint .","storybook":"start-storybook -p 6006","build-storybook":"build-storybook","semantic-release":"semantic-release --branches main","commit":"cz"},"author":{"name":"John Beresford"},"license":"MIT","devDependencies":{"@babel/core":"^7.20.7","@babel/plugin-transform-runtime":"^7.19.6","@babel/preset-env":"^7.20.2","@babel/preset-react":"^7.18.6","@babel/preset-typescript":"^7.18.6","@react-three/drei":"^9.48.6","@react-three/fiber":"^8.9.1","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-node-resolve":"^15.0.1","@rollup/plugin-terser":"^0.2.1","@rollup/plugin-typescript":"^10.0.1","@storybook/addon-actions":"^6.5.15","@storybook/addon-essentials":"^6.5.15","@storybook/addon-interactions":"^6.5.15","@storybook/addon-links":"^6.5.15","@storybook/builder-webpack4":"^6.5.15","@storybook/manager-webpack4":"^6.5.15","@storybook/react":"^6.5.15","@storybook/testing-library":"^0.0.13","@types/react":"^18.0.26","@types/react-dom":"^18.0.10","@types/three":"^0.146.0","@typescript-eslint/eslint-plugin":"^5.48.0","@typescript-eslint/parser":"^5.48.0","babel-loader":"^8.3.0","commitizen":"^4.3.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.31.0","eslint-config-prettier":"^8.6.0","eslint-plugin-import":"^2.26.0","eslint-plugin-prettier":"^4.2.1","eslint-plugin-react":"^7.31.11","eslint-plugin-react-hooks":"^4.6.0","react":"^18.2.0","react-dom":"^18.2.0","rollup":"^3.9.0","rollup-plugin-multi-input":"^1.3.1","semantic-release":"^19.0.5","three":"^0.148.0","troika-three-text":"^0.47.1","tslib":"^2.4.1","typescript":"^4.9.4"},"peerDependencies":{"@react-three/drei":">=9.0","@react-three/fiber":">=8.0","react":">=18.0","react-dom":">=18.0","three":">=0.146.0","troika-three-text":">=0.47.0"},"repository":{"type":"git","url":"git+https://github.com/JMBeresford/r3f-form.git"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"readme":"# r3f-form\n\n### [View examples](https://jmberesford.github.io/r3f-form/?path=/story/form--default-submit-button)\n\n> ## WARNING: UNDER HEAVY DEVELOPMENT\n>\n> Each release will aim to be a fully functional and usable release,\n> but breaking API changes WILL be likely for the forseeable future.\n\n## A webGL form component for use with React Three Fiber\n\n![image](https://user-images.githubusercontent.com/1373954/210024281-c735f61a-1a69-45e5-a5d3-147ed57a6c30.png)\n\nThis package aims to create a fully-functional and **accessible** `<Form />`\ncomponents that can be used within the [@react-three/fiber](https://github.com/pmndrs/react-three-fiber)\necosystem. Ultimately, the goal is to have fully functioning HTML `<form>`s -- with all viable input types -- rendered in webGL.\n\nCurrent implementation binds webGL elements to the existing state and event systems of respective\nhidden HTML DOM elements. There is a heavy reliance on\n[troika-three-text](https://github.com/protectwise/troika/tree/main/packages/troika-three-text)\nfor text-rendering and selection/caret logic.\n\n> Note that `r3f-form` will only work within a React-Three-Fiber Canvas element.\n> You **must** be using\n>\n> - [@react-three/fiber](https://github.com/pmndrs/react-three-fiber)\n> - [@react-three/drei](https://github.com/pmndrs/drei)\n> - [troika-three-text](https://github.com/protectwise/troika/tree/main/packages/troika-three-text)\n>\n> as dependencies in your project to use `r3f-form`.\n\n### Install\n\n```sh\nnpm install r3f-form\n# or, if using yarn\nyarn install r3f-form\n```\n\n# How to use\n\n## Forms\n\nIn order to create a form, just wrap any relevant elements in a `<Form>`:\n\n```tsx\nimport { Form, Input, Label, Submit } from \"r3f-form\";\n\nexport function MyForm() {\n  return (\n    <Form>\n      <Label text=\"username\" />\n      <Input name=\"username\" />\n\n      <Label text=\"password\" />\n      <Input name=\"password\" type=\"password\" />\n\n      <Submit value=\"Login\" />\n    </Form>\n  );\n}\n```\n\n> Note that each element in the form will require a `name` prop in order to be picked up in submission, just like in a normal DOM form element\n\nThe relevant inputs will be bound to respective DOM elements under the hood, and be rendered into the 3D scene like so:\n\n![image](https://user-images.githubusercontent.com/1373954/217718779-816da536-00af-4375-85dd-de707e79aa8d.png)\n\nYou can define submission behavior just like with any old HTML `<form>`:\n\n```tsx\n// redirect to a login script\n<Form action=\"/login.php\"></Form>;\n\n// or handle it with a callback\nconst handleSubmit = (e: FormEvent) => {\n  e.preventDefault();\n\n  const data = new FormData(e.target);\n\n  for (let [name, value] of data.entries()) {\n    console.log(`${name}: ${value}`);\n  }\n};\n\n<Form onSubmit={handleSubmit}></Form>;\n```\n\n## Inputs\n\nAn editable text-box bound to an DOM `<input>` and represented in the webGL canvas.\n\n```ts\ntype Props = {\n  type?: \"text\" | \"password\";\n\n  /** width of the container */\n  width?: number;\n  backgroundColor?: Color;\n  selectionColor?: Color;\n  backgroundOpacity?: number;\n\n  /** [left/right , top/bottom] in THREE units, respectively\n   *\n   * note that height is implicitly defined by the capHeight of the rendered\n   * text. The cap height is dependant on both the `textProps.font` being used and the\n   * `textProps.fontSize` value\n   */\n  padding?: Vector2;\n  cursorWidth?: number;\n\n  /** 3D transformations */\n  position: Vector3;\n  rotation: Euler;\n  scale: Vector3;\n\n  // And ALL props available to DOM <input>s\n};\n```\n\nCreate a basic input field like so:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\nexport function MyInput() {\n  return (\n    <>\n      <Label text=\"label\" />\n      <Input />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718847-acb169ed-95ff-4def-a126-491c648346b9.png)\n\nYou can access the value of the input via the `onChange` callback prop:\n\n> The callback is passed the `ChangeEvent` object from the underlying HTML `<input>`s\n> change event on every change.\n>\n> Read more about this event [here](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/change_event)\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\nexport function MyInput() {\n  const [username, setUsername] = React.useState(\"\");\n  // username will always contain the current value\n\n  function handleChange(e) {\n    setUsername(ev.target.value);\n  }\n\n  return (\n    <>\n      <Label text=\"Test Input\" />\n      <Input onChange={handleChange} />\n    </>\n  );\n}\n```\n\nYou can also create password inputs:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\nexport function MyPassword() {\n  return (\n    <>\n      <Label text=\"Password\" />\n      <Input type=\"password\" />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718412-48158e10-53b2-4e79-86c9-54bc5495521a.png)\n\nAdd custom padding to the text container:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\n/*\n * padding: [horizontal padding, vertical padding] in THREE units\n */\n\nexport function MyInput() {\n  return (\n    <>\n      <Label text=\"Label\" />\n      <Input padding={[0.05, 0.5]} />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718475-1c696ff1-3b1d-4559-9d02-9535bd59cdff.png)\n\n---\n\n## Textarea\n\n```ts\ntype Props = {\n  /** width of the container */\n  width?: number;\n\n  backgroundColor?: Color;\n  backgroundOpacity?: number;\n  selectionColor?: Color;\n\n  /** [left/right , top/bottom] in THREE units, respectively\n   *\n   * note that height is implicitly defined by the capHeight of the rendered\n   * text. The cap height is dependant on both the `textProps.font` being used\n   * and the `textProps.fontSize` value\n   */\n  padding?: Vector2;\n  cursorWidth?: number;\n\n  /** 3D transformations */\n  position: Vector3;\n  rotation: Euler;\n  scale: Vector3;\n\n  // And ALL props available to DOM <textarea>s\n};\n```\n\nSimilar to the `<Input />` component, you can also create a `<Textarea />` like so:\n\n```tsx\nimport { Textarea, Label } from \"r3f-form\";\n\nexport function App() {\n  return (\n    <>\n      <Label text=\"Default Textarea:\" />\n      <Textarea />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718566-a718eab7-1e73-4559-96aa-8e14824f0031.png)\n\n---\n\n## Text\n\nIn order to configure the underlying `troika-three-text` instance\nthat is responsible for rendering the actual text, you can use the\n`<Text />` component.\n\nThere is a respective `<Text />` component for both `<Input />`s and\n`<Textarea />`s.\n\nFor all configuration options, check out the [troika docs](https://github.com/protectwise/troika/tree/main/packages/troika-three-text).\n\n> Note that **not all** of troika's props are exposed on these `<Text />`\n> components\n\nChange color and background opacity:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\nimport { Text } from \"r3f-form/Input\";\n\nexport function App() {\n  return (\n    <>\n      <Label text=\"Test Color/Opacity\" />\n      <Input backgroundOpacity={0.6} backgroundColor=\"black\">\n        <Text color=\"red\" />\n      </Input>\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718611-c2e4848e-8267-4926-9243-7bb61bced61d.png)\n\nIf you wanted to alter both an `<Input />` and a\n`<Textarea />` via their respective `<Text />` components\nyou could do the following:\n\n```tsx\nimport { Input, Textarea, Label } from \"r3f-form\";\nimport { Text as InputText } from \"r3f-form/Input\";\nimport { Text as TextareaText } from \"r3f-form/Textarea\";\n\nexport function App() {\n  return (\n    <>\n      <Label text=\"Test Color/Opacity\" />\n      <Input>\n        <InputText color=\"#red\" />\n      </Input>\n\n      <Label text=\"Test Textarea\" />\n      <Textarea>\n        <TextareaText color=\"red\" />\n      </Textarea>\n    </>\n  );\n}\n```\n\n---\n\n## Submit\n\nEquivalent to a DOM `<input type=\"submit\" />`, exposed as\nan independent component. By default it renders a button\nusing the following props:\n\n```ts\ntype Props = {\n  value?: string;\n  fontSize?: number;\n  width?: number;\n  height?: number;\n  color?: Color;\n  backgroundColor?: Color;\n\n  /** 3D transformations */\n  position: Vector3;\n  rotation: Euler;\n  scale: Vector3;\n\n  // And ALL props available to DOM <input>s\n};\n```\n\nAdd a simple submit button to your forms like so:\n\n```tsx\n<Form>\n  <Label text=\"Username\" />\n  <Input name=\"username\" />\n\n  <Label text=\"Password\" />\n  <Input name=\"password\" type=\"password\" />\n\n  <Submit value=\"Login\" />\n</Form>\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718665-c64f6653-f85f-4310-a1c7-f2cf43154f2e.png)\n\nWhile this provides a somewhat-customizable default button, the main purpose of this component\nis to provide a simple interface to use 3D elements to submit your forms. Any children passed in\nwill submit the form on click. For example:\n\n```tsx\n<Form>\n  . . .\n  <Submit value=\"submit\">\n    <MySubmitButton />\n  </Submit>\n</Form>\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718713-a0a6671f-3f1e-4817-9ee9-e205bcc22610.png)\n\nClicking on the big red button would submit the `<Form>`\n","readmeFilename":"README.md","gitHead":"0b8a681b7a8f4d860d5b4569b5702610354a643b","bugs":{"url":"https://github.com/JMBeresford/r3f-form/issues"},"homepage":"https://github.com/JMBeresford/r3f-form#readme","_id":"r3f-form@2.0.2-beta.2","_nodeVersion":"19.9.0","_npmVersion":"9.6.3","dist":{"integrity":"sha512-nYjtnEv+1279WnLu15ChKBF8eDnWhBIwJ81Nsk3HXw9MaReynvIDwg6KASVONtOot3Ut8neHpS3MCJk/QFX77Q==","shasum":"1034079246678d4c39a103981f36a1f078916820","tarball":"https://registry.npmjs.org/r3f-form/-/r3f-form-2.0.2-beta.2.tgz","fileCount":50,"unpackedSize":107714,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFGZZc+9V3WjMa49bY2ZZCn0kg4oPP7hEtu26fTZx5HbAiAhpB2bwYq5/pgE0VuNYSYFM8iQLSKYF5L2bIoimHoUmQ=="}]},"_npmUser":{"name":"jberesford","email":"volcaus@gmail.com"},"directories":{},"maintainers":[{"name":"jberesford","email":"volcaus@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/r3f-form_2.0.2-beta.2_1689097742912_0.3111783276955915"},"_hasShrinkwrap":false},"2.0.2-beta.3":{"name":"r3f-form","version":"2.0.2-beta.3","description":"A webGL input field component for use with React Three Fiber","exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs.js","types":"./dist/index.d.ts"},"./Input/*":"./dist/Input/*","./Textarea/*":"./dist/Textarea/*"},"publishConfig":{"access":"public"},"scripts":{"build":"rollup -c --bundleConfigAsCjs","typegen":"tsc --emitDeclarationOnly","lint":"eslint .","storybook":"start-storybook -p 6006","build-storybook":"build-storybook","semantic-release":"semantic-release --branches main","commit":"cz"},"author":{"name":"John Beresford"},"license":"MIT","devDependencies":{"@babel/core":"^7.20.7","@babel/plugin-transform-runtime":"^7.19.6","@babel/preset-env":"^7.20.2","@babel/preset-react":"^7.18.6","@babel/preset-typescript":"^7.18.6","@react-three/drei":"^9.48.6","@react-three/fiber":"^8.9.1","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-node-resolve":"^15.0.1","@rollup/plugin-terser":"^0.2.1","@rollup/plugin-typescript":"^10.0.1","@storybook/addon-actions":"^6.5.15","@storybook/addon-essentials":"^6.5.15","@storybook/addon-interactions":"^6.5.15","@storybook/addon-links":"^6.5.15","@storybook/builder-webpack4":"^6.5.15","@storybook/manager-webpack4":"^6.5.15","@storybook/react":"^6.5.15","@storybook/testing-library":"^0.0.13","@types/react":"^18.0.26","@types/react-dom":"^18.0.10","@types/three":"^0.146.0","@typescript-eslint/eslint-plugin":"^5.48.0","@typescript-eslint/parser":"^5.48.0","babel-loader":"^8.3.0","commitizen":"^4.3.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.31.0","eslint-config-prettier":"^8.6.0","eslint-plugin-import":"^2.26.0","eslint-plugin-prettier":"^4.2.1","eslint-plugin-react":"^7.31.11","eslint-plugin-react-hooks":"^4.6.0","react":"^18.2.0","react-dom":"^18.2.0","rollup":"^3.9.0","rollup-plugin-multi-input":"^1.3.1","semantic-release":"^19.0.5","three":"^0.148.0","troika-three-text":"^0.47.1","tslib":"^2.4.1","typescript":"^4.9.4"},"peerDependencies":{"@react-three/drei":">=9.0","@react-three/fiber":">=8.0","react":">=18.0","react-dom":">=18.0","three":">=0.146.0","troika-three-text":">=0.47.0"},"repository":{"type":"git","url":"git+https://github.com/JMBeresford/r3f-form.git"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"readme":"# r3f-form\n\n### [View examples](https://jmberesford.github.io/r3f-form/?path=/story/form--default-submit-button)\n\n> ## WARNING: UNDER HEAVY DEVELOPMENT\n>\n> Each release will aim to be a fully functional and usable release,\n> but breaking API changes WILL be likely for the forseeable future.\n\n## A webGL form component for use with React Three Fiber\n\n![image](https://user-images.githubusercontent.com/1373954/210024281-c735f61a-1a69-45e5-a5d3-147ed57a6c30.png)\n\nThis package aims to create a fully-functional and **accessible** `<Form />`\ncomponents that can be used within the [@react-three/fiber](https://github.com/pmndrs/react-three-fiber)\necosystem. Ultimately, the goal is to have fully functioning HTML `<form>`s -- with all viable input types -- rendered in webGL.\n\nCurrent implementation binds webGL elements to the existing state and event systems of respective\nhidden HTML DOM elements. There is a heavy reliance on\n[troika-three-text](https://github.com/protectwise/troika/tree/main/packages/troika-three-text)\nfor text-rendering and selection/caret logic.\n\n> Note that `r3f-form` will only work within a React-Three-Fiber Canvas element.\n> You **must** be using\n>\n> - [@react-three/fiber](https://github.com/pmndrs/react-three-fiber)\n> - [@react-three/drei](https://github.com/pmndrs/drei)\n> - [troika-three-text](https://github.com/protectwise/troika/tree/main/packages/troika-three-text)\n>\n> as dependencies in your project to use `r3f-form`.\n\n### Install\n\n```sh\nnpm install r3f-form\n# or, if using yarn\nyarn install r3f-form\n```\n\n# How to use\n\n## Forms\n\nIn order to create a form, just wrap any relevant elements in a `<Form>`:\n\n```tsx\nimport { Form, Input, Label, Submit } from \"r3f-form\";\n\nexport function MyForm() {\n  return (\n    <Form>\n      <Label text=\"username\" />\n      <Input name=\"username\" />\n\n      <Label text=\"password\" />\n      <Input name=\"password\" type=\"password\" />\n\n      <Submit value=\"Login\" />\n    </Form>\n  );\n}\n```\n\n> Note that each element in the form will require a `name` prop in order to be picked up in submission, just like in a normal DOM form element\n\nThe relevant inputs will be bound to respective DOM elements under the hood, and be rendered into the 3D scene like so:\n\n![image](https://user-images.githubusercontent.com/1373954/217718779-816da536-00af-4375-85dd-de707e79aa8d.png)\n\nYou can define submission behavior just like with any old HTML `<form>`:\n\n```tsx\n// redirect to a login script\n<Form action=\"/login.php\"></Form>;\n\n// or handle it with a callback\nconst handleSubmit = (e: FormEvent) => {\n  e.preventDefault();\n\n  const data = new FormData(e.target);\n\n  for (let [name, value] of data.entries()) {\n    console.log(`${name}: ${value}`);\n  }\n};\n\n<Form onSubmit={handleSubmit}></Form>;\n```\n\n## Inputs\n\nAn editable text-box bound to an DOM `<input>` and represented in the webGL canvas.\n\n```ts\ntype Props = {\n  type?: \"text\" | \"password\";\n\n  /** width of the container */\n  width?: number;\n  backgroundColor?: Color;\n  selectionColor?: Color;\n  backgroundOpacity?: number;\n\n  /** [left/right , top/bottom] in THREE units, respectively\n   *\n   * note that height is implicitly defined by the capHeight of the rendered\n   * text. The cap height is dependant on both the `textProps.font` being used and the\n   * `textProps.fontSize` value\n   */\n  padding?: Vector2;\n  cursorWidth?: number;\n\n  /** 3D transformations */\n  position: Vector3;\n  rotation: Euler;\n  scale: Vector3;\n\n  // And ALL props available to DOM <input>s\n};\n```\n\nCreate a basic input field like so:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\nexport function MyInput() {\n  return (\n    <>\n      <Label text=\"label\" />\n      <Input />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718847-acb169ed-95ff-4def-a126-491c648346b9.png)\n\nYou can access the value of the input via the `onChange` callback prop:\n\n> The callback is passed the `ChangeEvent` object from the underlying HTML `<input>`s\n> change event on every change.\n>\n> Read more about this event [here](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/change_event)\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\nexport function MyInput() {\n  const [username, setUsername] = React.useState(\"\");\n  // username will always contain the current value\n\n  function handleChange(e) {\n    setUsername(ev.target.value);\n  }\n\n  return (\n    <>\n      <Label text=\"Test Input\" />\n      <Input onChange={handleChange} />\n    </>\n  );\n}\n```\n\nYou can also create password inputs:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\nexport function MyPassword() {\n  return (\n    <>\n      <Label text=\"Password\" />\n      <Input type=\"password\" />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718412-48158e10-53b2-4e79-86c9-54bc5495521a.png)\n\nAdd custom padding to the text container:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\n/*\n * padding: [horizontal padding, vertical padding] in THREE units\n */\n\nexport function MyInput() {\n  return (\n    <>\n      <Label text=\"Label\" />\n      <Input padding={[0.05, 0.5]} />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718475-1c696ff1-3b1d-4559-9d02-9535bd59cdff.png)\n\n---\n\n## Textarea\n\n```ts\ntype Props = {\n  /** width of the container */\n  width?: number;\n\n  backgroundColor?: Color;\n  backgroundOpacity?: number;\n  selectionColor?: Color;\n\n  /** [left/right , top/bottom] in THREE units, respectively\n   *\n   * note that height is implicitly defined by the capHeight of the rendered\n   * text. The cap height is dependant on both the `textProps.font` being used\n   * and the `textProps.fontSize` value\n   */\n  padding?: Vector2;\n  cursorWidth?: number;\n\n  /** 3D transformations */\n  position: Vector3;\n  rotation: Euler;\n  scale: Vector3;\n\n  // And ALL props available to DOM <textarea>s\n};\n```\n\nSimilar to the `<Input />` component, you can also create a `<Textarea />` like so:\n\n```tsx\nimport { Textarea, Label } from \"r3f-form\";\n\nexport function App() {\n  return (\n    <>\n      <Label text=\"Default Textarea:\" />\n      <Textarea />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718566-a718eab7-1e73-4559-96aa-8e14824f0031.png)\n\n---\n\n## Text\n\nIn order to configure the underlying `troika-three-text` instance\nthat is responsible for rendering the actual text, you can use the\n`<Text />` component.\n\nThere is a respective `<Text />` component for both `<Input />`s and\n`<Textarea />`s.\n\nFor all configuration options, check out the [troika docs](https://github.com/protectwise/troika/tree/main/packages/troika-three-text).\n\n> Note that **not all** of troika's props are exposed on these `<Text />`\n> components\n\nChange color and background opacity:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\nimport { Text } from \"r3f-form/Input\";\n\nexport function App() {\n  return (\n    <>\n      <Label text=\"Test Color/Opacity\" />\n      <Input backgroundOpacity={0.6} backgroundColor=\"black\">\n        <Text color=\"red\" />\n      </Input>\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718611-c2e4848e-8267-4926-9243-7bb61bced61d.png)\n\nIf you wanted to alter both an `<Input />` and a\n`<Textarea />` via their respective `<Text />` components\nyou could do the following:\n\n```tsx\nimport { Input, Textarea, Label } from \"r3f-form\";\nimport { Text as InputText } from \"r3f-form/Input\";\nimport { Text as TextareaText } from \"r3f-form/Textarea\";\n\nexport function App() {\n  return (\n    <>\n      <Label text=\"Test Color/Opacity\" />\n      <Input>\n        <InputText color=\"#red\" />\n      </Input>\n\n      <Label text=\"Test Textarea\" />\n      <Textarea>\n        <TextareaText color=\"red\" />\n      </Textarea>\n    </>\n  );\n}\n```\n\n---\n\n## Submit\n\nEquivalent to a DOM `<input type=\"submit\" />`, exposed as\nan independent component. By default it renders a button\nusing the following props:\n\n```ts\ntype Props = {\n  value?: string;\n  fontSize?: number;\n  width?: number;\n  height?: number;\n  color?: Color;\n  backgroundColor?: Color;\n\n  /** 3D transformations */\n  position: Vector3;\n  rotation: Euler;\n  scale: Vector3;\n\n  // And ALL props available to DOM <input>s\n};\n```\n\nAdd a simple submit button to your forms like so:\n\n```tsx\n<Form>\n  <Label text=\"Username\" />\n  <Input name=\"username\" />\n\n  <Label text=\"Password\" />\n  <Input name=\"password\" type=\"password\" />\n\n  <Submit value=\"Login\" />\n</Form>\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718665-c64f6653-f85f-4310-a1c7-f2cf43154f2e.png)\n\nWhile this provides a somewhat-customizable default button, the main purpose of this component\nis to provide a simple interface to use 3D elements to submit your forms. Any children passed in\nwill submit the form on click. For example:\n\n```tsx\n<Form>\n  . . .\n  <Submit value=\"submit\">\n    <MySubmitButton />\n  </Submit>\n</Form>\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718713-a0a6671f-3f1e-4817-9ee9-e205bcc22610.png)\n\nClicking on the big red button would submit the `<Form>`\n","readmeFilename":"README.md","gitHead":"0b8a681b7a8f4d860d5b4569b5702610354a643b","bugs":{"url":"https://github.com/JMBeresford/r3f-form/issues"},"homepage":"https://github.com/JMBeresford/r3f-form#readme","_id":"r3f-form@2.0.2-beta.3","_nodeVersion":"19.9.0","_npmVersion":"9.6.3","dist":{"integrity":"sha512-tsm/c/kK9SgDUG9aVXbHM+zS8YFuBZORhm4jxfI96rz6gMSd7SQflvOJJmbRrCFwM0q2yYtlJlSsVr6njQEShA==","shasum":"18a4302d0bb1c5cc12fcf26198d8c59cf09c53d8","tarball":"https://registry.npmjs.org/r3f-form/-/r3f-form-2.0.2-beta.3.tgz","fileCount":50,"unpackedSize":107384,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD2p/ZzUZgwPoSXg4BN/KptRWNNDd3aFCLuqtlE7J6P5AIhAKSfB1qoH32p+4LeZkdUoaeEz/rNYCtm8fM7st4n4C8I"}]},"_npmUser":{"name":"jberesford","email":"volcaus@gmail.com"},"directories":{},"maintainers":[{"name":"jberesford","email":"volcaus@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/r3f-form_2.0.2-beta.3_1689098277811_0.09182696003433288"},"_hasShrinkwrap":false},"2.0.2-beta.4":{"name":"r3f-form","version":"2.0.2-beta.4","description":"A webGL input field component for use with React Three Fiber","exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs.js","types":"./dist/index.d.ts"},"./Input/*":"./dist/Input/*","./Textarea/*":"./dist/Textarea/*"},"publishConfig":{"access":"public"},"scripts":{"build":"rollup -c --bundleConfigAsCjs","typegen":"tsc --emitDeclarationOnly","lint":"eslint .","storybook":"start-storybook -p 6006","build-storybook":"build-storybook","semantic-release":"semantic-release --branches main","commit":"cz"},"author":{"name":"John Beresford"},"license":"MIT","devDependencies":{"@babel/core":"^7.20.7","@babel/plugin-transform-runtime":"^7.19.6","@babel/preset-env":"^7.20.2","@babel/preset-react":"^7.18.6","@babel/preset-typescript":"^7.18.6","@react-three/drei":"^9.48.6","@react-three/fiber":"^8.9.1","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-node-resolve":"^15.0.1","@rollup/plugin-terser":"^0.2.1","@rollup/plugin-typescript":"^10.0.1","@storybook/addon-actions":"^6.5.15","@storybook/addon-essentials":"^6.5.15","@storybook/addon-interactions":"^6.5.15","@storybook/addon-links":"^6.5.15","@storybook/builder-webpack4":"^6.5.15","@storybook/manager-webpack4":"^6.5.15","@storybook/react":"^6.5.15","@storybook/testing-library":"^0.0.13","@types/react":"^18.0.26","@types/react-dom":"^18.0.10","@types/three":"^0.146.0","@typescript-eslint/eslint-plugin":"^5.48.0","@typescript-eslint/parser":"^5.48.0","babel-loader":"^8.3.0","commitizen":"^4.3.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.31.0","eslint-config-prettier":"^8.6.0","eslint-plugin-import":"^2.26.0","eslint-plugin-prettier":"^4.2.1","eslint-plugin-react":"^7.31.11","eslint-plugin-react-hooks":"^4.6.0","react":"^18.2.0","react-dom":"^18.2.0","rollup":"^3.9.0","rollup-plugin-multi-input":"^1.3.1","semantic-release":"^19.0.5","three":"^0.148.0","troika-three-text":"^0.47.1","tslib":"^2.4.1","typescript":"^4.9.4"},"peerDependencies":{"@react-three/drei":">=9.0","@react-three/fiber":">=8.0","react":">=18.0","react-dom":">=18.0","three":">=0.146.0","troika-three-text":">=0.47.0"},"repository":{"type":"git","url":"git+https://github.com/JMBeresford/r3f-form.git"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"readme":"# r3f-form\n\n### [View examples](https://jmberesford.github.io/r3f-form/?path=/story/form--default-submit-button)\n\n> ## WARNING: UNDER HEAVY DEVELOPMENT\n>\n> Each release will aim to be a fully functional and usable release,\n> but breaking API changes WILL be likely for the forseeable future.\n\n## A webGL form component for use with React Three Fiber\n\n![image](https://user-images.githubusercontent.com/1373954/210024281-c735f61a-1a69-45e5-a5d3-147ed57a6c30.png)\n\nThis package aims to create a fully-functional and **accessible** `<Form />`\ncomponents that can be used within the [@react-three/fiber](https://github.com/pmndrs/react-three-fiber)\necosystem. Ultimately, the goal is to have fully functioning HTML `<form>`s -- with all viable input types -- rendered in webGL.\n\nCurrent implementation binds webGL elements to the existing state and event systems of respective\nhidden HTML DOM elements. There is a heavy reliance on\n[troika-three-text](https://github.com/protectwise/troika/tree/main/packages/troika-three-text)\nfor text-rendering and selection/caret logic.\n\n> Note that `r3f-form` will only work within a React-Three-Fiber Canvas element.\n> You **must** be using\n>\n> - [@react-three/fiber](https://github.com/pmndrs/react-three-fiber)\n> - [@react-three/drei](https://github.com/pmndrs/drei)\n> - [troika-three-text](https://github.com/protectwise/troika/tree/main/packages/troika-three-text)\n>\n> as dependencies in your project to use `r3f-form`.\n\n### Install\n\n```sh\nnpm install r3f-form\n# or, if using yarn\nyarn install r3f-form\n```\n\n# How to use\n\n## Forms\n\nIn order to create a form, just wrap any relevant elements in a `<Form>`:\n\n```tsx\nimport { Form, Input, Label, Submit } from \"r3f-form\";\n\nexport function MyForm() {\n  return (\n    <Form>\n      <Label text=\"username\" />\n      <Input name=\"username\" />\n\n      <Label text=\"password\" />\n      <Input name=\"password\" type=\"password\" />\n\n      <Submit value=\"Login\" />\n    </Form>\n  );\n}\n```\n\n> Note that each element in the form will require a `name` prop in order to be picked up in submission, just like in a normal DOM form element\n\nThe relevant inputs will be bound to respective DOM elements under the hood, and be rendered into the 3D scene like so:\n\n![image](https://user-images.githubusercontent.com/1373954/217718779-816da536-00af-4375-85dd-de707e79aa8d.png)\n\nYou can define submission behavior just like with any old HTML `<form>`:\n\n```tsx\n// redirect to a login script\n<Form action=\"/login.php\"></Form>;\n\n// or handle it with a callback\nconst handleSubmit = (e: FormEvent) => {\n  e.preventDefault();\n\n  const data = new FormData(e.target);\n\n  for (let [name, value] of data.entries()) {\n    console.log(`${name}: ${value}`);\n  }\n};\n\n<Form onSubmit={handleSubmit}></Form>;\n```\n\n## Inputs\n\nAn editable text-box bound to an DOM `<input>` and represented in the webGL canvas.\n\n```ts\ntype Props = {\n  type?: \"text\" | \"password\";\n\n  /** width of the container */\n  width?: number;\n  backgroundColor?: Color;\n  selectionColor?: Color;\n  backgroundOpacity?: number;\n\n  /** [left/right , top/bottom] in THREE units, respectively\n   *\n   * note that height is implicitly defined by the capHeight of the rendered\n   * text. The cap height is dependant on both the `textProps.font` being used and the\n   * `textProps.fontSize` value\n   */\n  padding?: Vector2;\n  cursorWidth?: number;\n\n  /** 3D transformations */\n  position: Vector3;\n  rotation: Euler;\n  scale: Vector3;\n\n  // And ALL props available to DOM <input>s\n};\n```\n\nCreate a basic input field like so:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\nexport function MyInput() {\n  return (\n    <>\n      <Label text=\"label\" />\n      <Input />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718847-acb169ed-95ff-4def-a126-491c648346b9.png)\n\nYou can access the value of the input via the `onChange` callback prop:\n\n> The callback is passed the `ChangeEvent` object from the underlying HTML `<input>`s\n> change event on every change.\n>\n> Read more about this event [here](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/change_event)\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\nexport function MyInput() {\n  const [username, setUsername] = React.useState(\"\");\n  // username will always contain the current value\n\n  function handleChange(e) {\n    setUsername(ev.target.value);\n  }\n\n  return (\n    <>\n      <Label text=\"Test Input\" />\n      <Input onChange={handleChange} />\n    </>\n  );\n}\n```\n\nYou can also create password inputs:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\nexport function MyPassword() {\n  return (\n    <>\n      <Label text=\"Password\" />\n      <Input type=\"password\" />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718412-48158e10-53b2-4e79-86c9-54bc5495521a.png)\n\nAdd custom padding to the text container:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\n/*\n * padding: [horizontal padding, vertical padding] in THREE units\n */\n\nexport function MyInput() {\n  return (\n    <>\n      <Label text=\"Label\" />\n      <Input padding={[0.05, 0.5]} />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718475-1c696ff1-3b1d-4559-9d02-9535bd59cdff.png)\n\n---\n\n## Textarea\n\n```ts\ntype Props = {\n  /** width of the container */\n  width?: number;\n\n  backgroundColor?: Color;\n  backgroundOpacity?: number;\n  selectionColor?: Color;\n\n  /** [left/right , top/bottom] in THREE units, respectively\n   *\n   * note that height is implicitly defined by the capHeight of the rendered\n   * text. The cap height is dependant on both the `textProps.font` being used\n   * and the `textProps.fontSize` value\n   */\n  padding?: Vector2;\n  cursorWidth?: number;\n\n  /** 3D transformations */\n  position: Vector3;\n  rotation: Euler;\n  scale: Vector3;\n\n  // And ALL props available to DOM <textarea>s\n};\n```\n\nSimilar to the `<Input />` component, you can also create a `<Textarea />` like so:\n\n```tsx\nimport { Textarea, Label } from \"r3f-form\";\n\nexport function App() {\n  return (\n    <>\n      <Label text=\"Default Textarea:\" />\n      <Textarea />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718566-a718eab7-1e73-4559-96aa-8e14824f0031.png)\n\n---\n\n## Text\n\nIn order to configure the underlying `troika-three-text` instance\nthat is responsible for rendering the actual text, you can use the\n`<Text />` component.\n\nThere is a respective `<Text />` component for both `<Input />`s and\n`<Textarea />`s.\n\nFor all configuration options, check out the [troika docs](https://github.com/protectwise/troika/tree/main/packages/troika-three-text).\n\n> Note that **not all** of troika's props are exposed on these `<Text />`\n> components\n\nChange color and background opacity:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\nimport { Text } from \"r3f-form/Input\";\n\nexport function App() {\n  return (\n    <>\n      <Label text=\"Test Color/Opacity\" />\n      <Input backgroundOpacity={0.6} backgroundColor=\"black\">\n        <Text color=\"red\" />\n      </Input>\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718611-c2e4848e-8267-4926-9243-7bb61bced61d.png)\n\nIf you wanted to alter both an `<Input />` and a\n`<Textarea />` via their respective `<Text />` components\nyou could do the following:\n\n```tsx\nimport { Input, Textarea, Label } from \"r3f-form\";\nimport { Text as InputText } from \"r3f-form/Input\";\nimport { Text as TextareaText } from \"r3f-form/Textarea\";\n\nexport function App() {\n  return (\n    <>\n      <Label text=\"Test Color/Opacity\" />\n      <Input>\n        <InputText color=\"#red\" />\n      </Input>\n\n      <Label text=\"Test Textarea\" />\n      <Textarea>\n        <TextareaText color=\"red\" />\n      </Textarea>\n    </>\n  );\n}\n```\n\n---\n\n## Submit\n\nEquivalent to a DOM `<input type=\"submit\" />`, exposed as\nan independent component. By default it renders a button\nusing the following props:\n\n```ts\ntype Props = {\n  value?: string;\n  fontSize?: number;\n  width?: number;\n  height?: number;\n  color?: Color;\n  backgroundColor?: Color;\n\n  /** 3D transformations */\n  position: Vector3;\n  rotation: Euler;\n  scale: Vector3;\n\n  // And ALL props available to DOM <input>s\n};\n```\n\nAdd a simple submit button to your forms like so:\n\n```tsx\n<Form>\n  <Label text=\"Username\" />\n  <Input name=\"username\" />\n\n  <Label text=\"Password\" />\n  <Input name=\"password\" type=\"password\" />\n\n  <Submit value=\"Login\" />\n</Form>\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718665-c64f6653-f85f-4310-a1c7-f2cf43154f2e.png)\n\nWhile this provides a somewhat-customizable default button, the main purpose of this component\nis to provide a simple interface to use 3D elements to submit your forms. Any children passed in\nwill submit the form on click. For example:\n\n```tsx\n<Form>\n  . . .\n  <Submit value=\"submit\">\n    <MySubmitButton />\n  </Submit>\n</Form>\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718713-a0a6671f-3f1e-4817-9ee9-e205bcc22610.png)\n\nClicking on the big red button would submit the `<Form>`\n","readmeFilename":"README.md","gitHead":"0b8a681b7a8f4d860d5b4569b5702610354a643b","bugs":{"url":"https://github.com/JMBeresford/r3f-form/issues"},"homepage":"https://github.com/JMBeresford/r3f-form#readme","_id":"r3f-form@2.0.2-beta.4","_nodeVersion":"19.9.0","_npmVersion":"9.6.3","dist":{"integrity":"sha512-15067+unuvoOQ8uSsxXwKBKeYqRJo9o9Sh7+k/g83FrdMRR0qrhk0juOQ0AQegVjhn5raAdAB+O6zP8jOrMV3g==","shasum":"4fef4d0735527b2bf67416d6ff677d6d64d48fc6","tarball":"https://registry.npmjs.org/r3f-form/-/r3f-form-2.0.2-beta.4.tgz","fileCount":47,"unpackedSize":105875,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAO82D4s/38HU7Ws8ULaUjy8m9DBm4fCIJTUgu0kuiFhAiEA1r379zTmjQvUYD2PUoVNrUW/aWOqOh/R9mZ2FYXyIxQ="}]},"_npmUser":{"name":"jberesford","email":"volcaus@gmail.com"},"directories":{},"maintainers":[{"name":"jberesford","email":"volcaus@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/r3f-form_2.0.2-beta.4_1689098563777_0.46865250755268417"},"_hasShrinkwrap":false},"2.0.2-beta.5":{"name":"r3f-form","version":"2.0.2-beta.5","description":"A webGL input field component for use with React Three Fiber","exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs.js","types":"./dist/index.d.ts"},"./Input/*":{"import":"./dist/Input/*.js","require":"./dist/Input/*.cjs.js","types":"./dist/Input/*.d.ts"}},"publishConfig":{"access":"public"},"scripts":{"build":"rollup -c --bundleConfigAsCjs","typegen":"tsc --emitDeclarationOnly","lint":"eslint .","storybook":"start-storybook -p 6006","build-storybook":"build-storybook","semantic-release":"semantic-release --branches main","commit":"cz"},"author":{"name":"John Beresford"},"license":"MIT","devDependencies":{"@babel/core":"^7.20.7","@babel/plugin-transform-runtime":"^7.19.6","@babel/preset-env":"^7.20.2","@babel/preset-react":"^7.18.6","@babel/preset-typescript":"^7.18.6","@react-three/drei":"^9.48.6","@react-three/fiber":"^8.9.1","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-node-resolve":"^15.0.1","@rollup/plugin-terser":"^0.2.1","@rollup/plugin-typescript":"^10.0.1","@storybook/addon-actions":"^6.5.15","@storybook/addon-essentials":"^6.5.15","@storybook/addon-interactions":"^6.5.15","@storybook/addon-links":"^6.5.15","@storybook/builder-webpack4":"^6.5.15","@storybook/manager-webpack4":"^6.5.15","@storybook/react":"^6.5.15","@storybook/testing-library":"^0.0.13","@types/react":"^18.0.26","@types/react-dom":"^18.0.10","@types/three":"^0.146.0","@typescript-eslint/eslint-plugin":"^5.48.0","@typescript-eslint/parser":"^5.48.0","babel-loader":"^8.3.0","commitizen":"^4.3.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.31.0","eslint-config-prettier":"^8.6.0","eslint-plugin-import":"^2.26.0","eslint-plugin-prettier":"^4.2.1","eslint-plugin-react":"^7.31.11","eslint-plugin-react-hooks":"^4.6.0","react":"^18.2.0","react-dom":"^18.2.0","rollup":"^3.9.0","rollup-plugin-multi-input":"^1.3.1","semantic-release":"^19.0.5","three":"^0.148.0","troika-three-text":"^0.47.1","tslib":"^2.4.1","typescript":"^4.9.4"},"peerDependencies":{"@react-three/drei":">=9.0","@react-three/fiber":">=8.0","react":">=18.0","react-dom":">=18.0","three":">=0.146.0","troika-three-text":">=0.47.0"},"repository":{"type":"git","url":"git+https://github.com/JMBeresford/r3f-form.git"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"readme":"# r3f-form\n\n### [View examples](https://jmberesford.github.io/r3f-form/?path=/story/form--default-submit-button)\n\n> ## WARNING: UNDER HEAVY DEVELOPMENT\n>\n> Each release will aim to be a fully functional and usable release,\n> but breaking API changes WILL be likely for the forseeable future.\n\n## A webGL form component for use with React Three Fiber\n\n![image](https://user-images.githubusercontent.com/1373954/210024281-c735f61a-1a69-45e5-a5d3-147ed57a6c30.png)\n\nThis package aims to create a fully-functional and **accessible** `<Form />`\ncomponents that can be used within the [@react-three/fiber](https://github.com/pmndrs/react-three-fiber)\necosystem. Ultimately, the goal is to have fully functioning HTML `<form>`s -- with all viable input types -- rendered in webGL.\n\nCurrent implementation binds webGL elements to the existing state and event systems of respective\nhidden HTML DOM elements. There is a heavy reliance on\n[troika-three-text](https://github.com/protectwise/troika/tree/main/packages/troika-three-text)\nfor text-rendering and selection/caret logic.\n\n> Note that `r3f-form` will only work within a React-Three-Fiber Canvas element.\n> You **must** be using\n>\n> - [@react-three/fiber](https://github.com/pmndrs/react-three-fiber)\n> - [@react-three/drei](https://github.com/pmndrs/drei)\n> - [troika-three-text](https://github.com/protectwise/troika/tree/main/packages/troika-three-text)\n>\n> as dependencies in your project to use `r3f-form`.\n\n### Install\n\n```sh\nnpm install r3f-form\n# or, if using yarn\nyarn install r3f-form\n```\n\n# How to use\n\n## Forms\n\nIn order to create a form, just wrap any relevant elements in a `<Form>`:\n\n```tsx\nimport { Form, Input, Label, Submit } from \"r3f-form\";\n\nexport function MyForm() {\n  return (\n    <Form>\n      <Label text=\"username\" />\n      <Input name=\"username\" />\n\n      <Label text=\"password\" />\n      <Input name=\"password\" type=\"password\" />\n\n      <Submit value=\"Login\" />\n    </Form>\n  );\n}\n```\n\n> Note that each element in the form will require a `name` prop in order to be picked up in submission, just like in a normal DOM form element\n\nThe relevant inputs will be bound to respective DOM elements under the hood, and be rendered into the 3D scene like so:\n\n![image](https://user-images.githubusercontent.com/1373954/217718779-816da536-00af-4375-85dd-de707e79aa8d.png)\n\nYou can define submission behavior just like with any old HTML `<form>`:\n\n```tsx\n// redirect to a login script\n<Form action=\"/login.php\"></Form>;\n\n// or handle it with a callback\nconst handleSubmit = (e: FormEvent) => {\n  e.preventDefault();\n\n  const data = new FormData(e.target);\n\n  for (let [name, value] of data.entries()) {\n    console.log(`${name}: ${value}`);\n  }\n};\n\n<Form onSubmit={handleSubmit}></Form>;\n```\n\n## Inputs\n\nAn editable text-box bound to an DOM `<input>` and represented in the webGL canvas.\n\n```ts\ntype Props = {\n  type?: \"text\" | \"password\";\n\n  /** width of the container */\n  width?: number;\n  backgroundColor?: Color;\n  selectionColor?: Color;\n  backgroundOpacity?: number;\n\n  /** [left/right , top/bottom] in THREE units, respectively\n   *\n   * note that height is implicitly defined by the capHeight of the rendered\n   * text. The cap height is dependant on both the `textProps.font` being used and the\n   * `textProps.fontSize` value\n   */\n  padding?: Vector2;\n  cursorWidth?: number;\n\n  /** 3D transformations */\n  position: Vector3;\n  rotation: Euler;\n  scale: Vector3;\n\n  // And ALL props available to DOM <input>s\n};\n```\n\nCreate a basic input field like so:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\nexport function MyInput() {\n  return (\n    <>\n      <Label text=\"label\" />\n      <Input />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718847-acb169ed-95ff-4def-a126-491c648346b9.png)\n\nYou can access the value of the input via the `onChange` callback prop:\n\n> The callback is passed the `ChangeEvent` object from the underlying HTML `<input>`s\n> change event on every change.\n>\n> Read more about this event [here](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/change_event)\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\nexport function MyInput() {\n  const [username, setUsername] = React.useState(\"\");\n  // username will always contain the current value\n\n  function handleChange(e) {\n    setUsername(ev.target.value);\n  }\n\n  return (\n    <>\n      <Label text=\"Test Input\" />\n      <Input onChange={handleChange} />\n    </>\n  );\n}\n```\n\nYou can also create password inputs:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\nexport function MyPassword() {\n  return (\n    <>\n      <Label text=\"Password\" />\n      <Input type=\"password\" />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718412-48158e10-53b2-4e79-86c9-54bc5495521a.png)\n\nAdd custom padding to the text container:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\n/*\n * padding: [horizontal padding, vertical padding] in THREE units\n */\n\nexport function MyInput() {\n  return (\n    <>\n      <Label text=\"Label\" />\n      <Input padding={[0.05, 0.5]} />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718475-1c696ff1-3b1d-4559-9d02-9535bd59cdff.png)\n\n---\n\n## Textarea\n\n```ts\ntype Props = {\n  /** width of the container */\n  width?: number;\n\n  backgroundColor?: Color;\n  backgroundOpacity?: number;\n  selectionColor?: Color;\n\n  /** [left/right , top/bottom] in THREE units, respectively\n   *\n   * note that height is implicitly defined by the capHeight of the rendered\n   * text. The cap height is dependant on both the `textProps.font` being used\n   * and the `textProps.fontSize` value\n   */\n  padding?: Vector2;\n  cursorWidth?: number;\n\n  /** 3D transformations */\n  position: Vector3;\n  rotation: Euler;\n  scale: Vector3;\n\n  // And ALL props available to DOM <textarea>s\n};\n```\n\nSimilar to the `<Input />` component, you can also create a `<Textarea />` like so:\n\n```tsx\nimport { Textarea, Label } from \"r3f-form\";\n\nexport function App() {\n  return (\n    <>\n      <Label text=\"Default Textarea:\" />\n      <Textarea />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718566-a718eab7-1e73-4559-96aa-8e14824f0031.png)\n\n---\n\n## Text\n\nIn order to configure the underlying `troika-three-text` instance\nthat is responsible for rendering the actual text, you can use the\n`<Text />` component.\n\nThere is a respective `<Text />` component for both `<Input />`s and\n`<Textarea />`s.\n\nFor all configuration options, check out the [troika docs](https://github.com/protectwise/troika/tree/main/packages/troika-three-text).\n\n> Note that **not all** of troika's props are exposed on these `<Text />`\n> components\n\nChange color and background opacity:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\nimport { Text } from \"r3f-form/Input\";\n\nexport function App() {\n  return (\n    <>\n      <Label text=\"Test Color/Opacity\" />\n      <Input backgroundOpacity={0.6} backgroundColor=\"black\">\n        <Text color=\"red\" />\n      </Input>\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718611-c2e4848e-8267-4926-9243-7bb61bced61d.png)\n\nIf you wanted to alter both an `<Input />` and a\n`<Textarea />` via their respective `<Text />` components\nyou could do the following:\n\n```tsx\nimport { Input, Textarea, Label } from \"r3f-form\";\nimport { Text as InputText } from \"r3f-form/Input\";\nimport { Text as TextareaText } from \"r3f-form/Textarea\";\n\nexport function App() {\n  return (\n    <>\n      <Label text=\"Test Color/Opacity\" />\n      <Input>\n        <InputText color=\"#red\" />\n      </Input>\n\n      <Label text=\"Test Textarea\" />\n      <Textarea>\n        <TextareaText color=\"red\" />\n      </Textarea>\n    </>\n  );\n}\n```\n\n---\n\n## Submit\n\nEquivalent to a DOM `<input type=\"submit\" />`, exposed as\nan independent component. By default it renders a button\nusing the following props:\n\n```ts\ntype Props = {\n  value?: string;\n  fontSize?: number;\n  width?: number;\n  height?: number;\n  color?: Color;\n  backgroundColor?: Color;\n\n  /** 3D transformations */\n  position: Vector3;\n  rotation: Euler;\n  scale: Vector3;\n\n  // And ALL props available to DOM <input>s\n};\n```\n\nAdd a simple submit button to your forms like so:\n\n```tsx\n<Form>\n  <Label text=\"Username\" />\n  <Input name=\"username\" />\n\n  <Label text=\"Password\" />\n  <Input name=\"password\" type=\"password\" />\n\n  <Submit value=\"Login\" />\n</Form>\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718665-c64f6653-f85f-4310-a1c7-f2cf43154f2e.png)\n\nWhile this provides a somewhat-customizable default button, the main purpose of this component\nis to provide a simple interface to use 3D elements to submit your forms. Any children passed in\nwill submit the form on click. For example:\n\n```tsx\n<Form>\n  . . .\n  <Submit value=\"submit\">\n    <MySubmitButton />\n  </Submit>\n</Form>\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718713-a0a6671f-3f1e-4817-9ee9-e205bcc22610.png)\n\nClicking on the big red button would submit the `<Form>`\n","readmeFilename":"README.md","gitHead":"0b8a681b7a8f4d860d5b4569b5702610354a643b","bugs":{"url":"https://github.com/JMBeresford/r3f-form/issues"},"homepage":"https://github.com/JMBeresford/r3f-form#readme","_id":"r3f-form@2.0.2-beta.5","_nodeVersion":"19.9.0","_npmVersion":"9.6.3","dist":{"integrity":"sha512-kx2Fz411FCT7AYA9CZWwXN5MAr+N6pLCIFne3AHBLGRBUkwBr9MVumhpv4EV0KyY5R8XpBwHvQmbffaYJDuV3Q==","shasum":"734a9c4d921e98d9ffc3b9d155f7fe7724b7e096","tarball":"https://registry.npmjs.org/r3f-form/-/r3f-form-2.0.2-beta.5.tgz","fileCount":47,"unpackedSize":105941,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCbhmccR1j+Er+jotIjWV2QCAGTC4bB4lNN3MZZx2WU3wIhANQQnzKv8ZJ5ND1riMafvGuM9mgt9CLZHwTFoOiSW3Lm"}]},"_npmUser":{"name":"jberesford","email":"volcaus@gmail.com"},"directories":{},"maintainers":[{"name":"jberesford","email":"volcaus@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/r3f-form_2.0.2-beta.5_1689098917179_0.4239995316967171"},"_hasShrinkwrap":false},"2.0.2-beta.6":{"name":"r3f-form","version":"2.0.2-beta.6","description":"A webGL input field component for use with React Three Fiber","exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs.js","types":"./dist/index.d.ts"},"./Input/*":{"import":"./dist/Input/*.js","require":"./dist/Input/*.cjs.js","types":"./dist/Input/*.d.ts"}},"publishConfig":{"access":"public"},"scripts":{"build":"rollup -c --bundleConfigAsCjs","typegen":"tsc --emitDeclarationOnly","lint":"eslint .","storybook":"start-storybook -p 6006","build-storybook":"build-storybook","semantic-release":"semantic-release --branches main","commit":"cz"},"author":{"name":"John Beresford"},"license":"MIT","devDependencies":{"@babel/core":"^7.20.7","@babel/plugin-transform-runtime":"^7.19.6","@babel/preset-env":"^7.20.2","@babel/preset-react":"^7.18.6","@babel/preset-typescript":"^7.18.6","@react-three/drei":"^9.48.6","@react-three/fiber":"^8.9.1","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-node-resolve":"^15.0.1","@rollup/plugin-terser":"^0.2.1","@rollup/plugin-typescript":"^10.0.1","@storybook/addon-actions":"^6.5.15","@storybook/addon-essentials":"^6.5.15","@storybook/addon-interactions":"^6.5.15","@storybook/addon-links":"^6.5.15","@storybook/builder-webpack4":"^6.5.15","@storybook/manager-webpack4":"^6.5.15","@storybook/react":"^6.5.15","@storybook/testing-library":"^0.0.13","@types/react":"^18.0.26","@types/react-dom":"^18.0.10","@types/three":"^0.146.0","@typescript-eslint/eslint-plugin":"^5.48.0","@typescript-eslint/parser":"^5.48.0","babel-loader":"^8.3.0","commitizen":"^4.3.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.31.0","eslint-config-prettier":"^8.6.0","eslint-plugin-import":"^2.26.0","eslint-plugin-prettier":"^4.2.1","eslint-plugin-react":"^7.31.11","eslint-plugin-react-hooks":"^4.6.0","react":"^18.2.0","react-dom":"^18.2.0","rollup":"^3.9.0","rollup-plugin-multi-input":"^1.3.1","semantic-release":"^19.0.5","three":"^0.148.0","troika-three-text":"^0.47.1","tslib":"^2.4.1","typescript":"^4.9.4"},"peerDependencies":{"@react-three/drei":">=9.0","@react-three/fiber":">=8.0","react":">=18.0","react-dom":">=18.0","three":">=0.146.0","troika-three-text":">=0.47.0"},"repository":{"type":"git","url":"git+https://github.com/JMBeresford/r3f-form.git"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"readme":"# r3f-form\n\n### [View examples](https://jmberesford.github.io/r3f-form/?path=/story/form--default-submit-button)\n\n> ## WARNING: UNDER HEAVY DEVELOPMENT\n>\n> Each release will aim to be a fully functional and usable release,\n> but breaking API changes WILL be likely for the forseeable future.\n\n## A webGL form component for use with React Three Fiber\n\n![image](https://user-images.githubusercontent.com/1373954/210024281-c735f61a-1a69-45e5-a5d3-147ed57a6c30.png)\n\nThis package aims to create a fully-functional and **accessible** `<Form />`\ncomponents that can be used within the [@react-three/fiber](https://github.com/pmndrs/react-three-fiber)\necosystem. Ultimately, the goal is to have fully functioning HTML `<form>`s -- with all viable input types -- rendered in webGL.\n\nCurrent implementation binds webGL elements to the existing state and event systems of respective\nhidden HTML DOM elements. There is a heavy reliance on\n[troika-three-text](https://github.com/protectwise/troika/tree/main/packages/troika-three-text)\nfor text-rendering and selection/caret logic.\n\n> Note that `r3f-form` will only work within a React-Three-Fiber Canvas element.\n> You **must** be using\n>\n> - [@react-three/fiber](https://github.com/pmndrs/react-three-fiber)\n> - [@react-three/drei](https://github.com/pmndrs/drei)\n> - [troika-three-text](https://github.com/protectwise/troika/tree/main/packages/troika-three-text)\n>\n> as dependencies in your project to use `r3f-form`.\n\n### Install\n\n```sh\nnpm install r3f-form\n# or, if using yarn\nyarn install r3f-form\n```\n\n# How to use\n\n## Forms\n\nIn order to create a form, just wrap any relevant elements in a `<Form>`:\n\n```tsx\nimport { Form, Input, Label, Submit } from \"r3f-form\";\n\nexport function MyForm() {\n  return (\n    <Form>\n      <Label text=\"username\" />\n      <Input name=\"username\" />\n\n      <Label text=\"password\" />\n      <Input name=\"password\" type=\"password\" />\n\n      <Submit value=\"Login\" />\n    </Form>\n  );\n}\n```\n\n> Note that each element in the form will require a `name` prop in order to be picked up in submission, just like in a normal DOM form element\n\nThe relevant inputs will be bound to respective DOM elements under the hood, and be rendered into the 3D scene like so:\n\n![image](https://user-images.githubusercontent.com/1373954/217718779-816da536-00af-4375-85dd-de707e79aa8d.png)\n\nYou can define submission behavior just like with any old HTML `<form>`:\n\n```tsx\n// redirect to a login script\n<Form action=\"/login.php\"></Form>;\n\n// or handle it with a callback\nconst handleSubmit = (e: FormEvent) => {\n  e.preventDefault();\n\n  const data = new FormData(e.target);\n\n  for (let [name, value] of data.entries()) {\n    console.log(`${name}: ${value}`);\n  }\n};\n\n<Form onSubmit={handleSubmit}></Form>;\n```\n\n## Inputs\n\nAn editable text-box bound to an DOM `<input>` and represented in the webGL canvas.\n\n```ts\ntype Props = {\n  type?: \"text\" | \"password\";\n\n  /** width of the container */\n  width?: number;\n  backgroundColor?: Color;\n  selectionColor?: Color;\n  backgroundOpacity?: number;\n\n  /** [left/right , top/bottom] in THREE units, respectively\n   *\n   * note that height is implicitly defined by the capHeight of the rendered\n   * text. The cap height is dependant on both the `textProps.font` being used and the\n   * `textProps.fontSize` value\n   */\n  padding?: Vector2;\n  cursorWidth?: number;\n\n  /** 3D transformations */\n  position: Vector3;\n  rotation: Euler;\n  scale: Vector3;\n\n  // And ALL props available to DOM <input>s\n};\n```\n\nCreate a basic input field like so:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\nexport function MyInput() {\n  return (\n    <>\n      <Label text=\"label\" />\n      <Input />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718847-acb169ed-95ff-4def-a126-491c648346b9.png)\n\nYou can access the value of the input via the `onChange` callback prop:\n\n> The callback is passed the `ChangeEvent` object from the underlying HTML `<input>`s\n> change event on every change.\n>\n> Read more about this event [here](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/change_event)\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\nexport function MyInput() {\n  const [username, setUsername] = React.useState(\"\");\n  // username will always contain the current value\n\n  function handleChange(e) {\n    setUsername(ev.target.value);\n  }\n\n  return (\n    <>\n      <Label text=\"Test Input\" />\n      <Input onChange={handleChange} />\n    </>\n  );\n}\n```\n\nYou can also create password inputs:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\nexport function MyPassword() {\n  return (\n    <>\n      <Label text=\"Password\" />\n      <Input type=\"password\" />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718412-48158e10-53b2-4e79-86c9-54bc5495521a.png)\n\nAdd custom padding to the text container:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\n/*\n * padding: [horizontal padding, vertical padding] in THREE units\n */\n\nexport function MyInput() {\n  return (\n    <>\n      <Label text=\"Label\" />\n      <Input padding={[0.05, 0.5]} />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718475-1c696ff1-3b1d-4559-9d02-9535bd59cdff.png)\n\n---\n\n## Textarea\n\n```ts\ntype Props = {\n  /** width of the container */\n  width?: number;\n\n  backgroundColor?: Color;\n  backgroundOpacity?: number;\n  selectionColor?: Color;\n\n  /** [left/right , top/bottom] in THREE units, respectively\n   *\n   * note that height is implicitly defined by the capHeight of the rendered\n   * text. The cap height is dependant on both the `textProps.font` being used\n   * and the `textProps.fontSize` value\n   */\n  padding?: Vector2;\n  cursorWidth?: number;\n\n  /** 3D transformations */\n  position: Vector3;\n  rotation: Euler;\n  scale: Vector3;\n\n  // And ALL props available to DOM <textarea>s\n};\n```\n\nSimilar to the `<Input />` component, you can also create a `<Textarea />` like so:\n\n```tsx\nimport { Textarea, Label } from \"r3f-form\";\n\nexport function App() {\n  return (\n    <>\n      <Label text=\"Default Textarea:\" />\n      <Textarea />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718566-a718eab7-1e73-4559-96aa-8e14824f0031.png)\n\n---\n\n## Text\n\nIn order to configure the underlying `troika-three-text` instance\nthat is responsible for rendering the actual text, you can use the\n`<Text />` component.\n\nThere is a respective `<Text />` component for both `<Input />`s and\n`<Textarea />`s.\n\nFor all configuration options, check out the [troika docs](https://github.com/protectwise/troika/tree/main/packages/troika-three-text).\n\n> Note that **not all** of troika's props are exposed on these `<Text />`\n> components\n\nChange color and background opacity:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\nimport { Text } from \"r3f-form/Input\";\n\nexport function App() {\n  return (\n    <>\n      <Label text=\"Test Color/Opacity\" />\n      <Input backgroundOpacity={0.6} backgroundColor=\"black\">\n        <Text color=\"red\" />\n      </Input>\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718611-c2e4848e-8267-4926-9243-7bb61bced61d.png)\n\nIf you wanted to alter both an `<Input />` and a\n`<Textarea />` via their respective `<Text />` components\nyou could do the following:\n\n```tsx\nimport { Input, Textarea, Label } from \"r3f-form\";\nimport { Text as InputText } from \"r3f-form/Input\";\nimport { Text as TextareaText } from \"r3f-form/Textarea\";\n\nexport function App() {\n  return (\n    <>\n      <Label text=\"Test Color/Opacity\" />\n      <Input>\n        <InputText color=\"#red\" />\n      </Input>\n\n      <Label text=\"Test Textarea\" />\n      <Textarea>\n        <TextareaText color=\"red\" />\n      </Textarea>\n    </>\n  );\n}\n```\n\n---\n\n## Submit\n\nEquivalent to a DOM `<input type=\"submit\" />`, exposed as\nan independent component. By default it renders a button\nusing the following props:\n\n```ts\ntype Props = {\n  value?: string;\n  fontSize?: number;\n  width?: number;\n  height?: number;\n  color?: Color;\n  backgroundColor?: Color;\n\n  /** 3D transformations */\n  position: Vector3;\n  rotation: Euler;\n  scale: Vector3;\n\n  // And ALL props available to DOM <input>s\n};\n```\n\nAdd a simple submit button to your forms like so:\n\n```tsx\n<Form>\n  <Label text=\"Username\" />\n  <Input name=\"username\" />\n\n  <Label text=\"Password\" />\n  <Input name=\"password\" type=\"password\" />\n\n  <Submit value=\"Login\" />\n</Form>\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718665-c64f6653-f85f-4310-a1c7-f2cf43154f2e.png)\n\nWhile this provides a somewhat-customizable default button, the main purpose of this component\nis to provide a simple interface to use 3D elements to submit your forms. Any children passed in\nwill submit the form on click. For example:\n\n```tsx\n<Form>\n  . . .\n  <Submit value=\"submit\">\n    <MySubmitButton />\n  </Submit>\n</Form>\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718713-a0a6671f-3f1e-4817-9ee9-e205bcc22610.png)\n\nClicking on the big red button would submit the `<Form>`\n","readmeFilename":"README.md","gitHead":"0b8a681b7a8f4d860d5b4569b5702610354a643b","bugs":{"url":"https://github.com/JMBeresford/r3f-form/issues"},"homepage":"https://github.com/JMBeresford/r3f-form#readme","_id":"r3f-form@2.0.2-beta.6","_nodeVersion":"19.9.0","_npmVersion":"9.6.3","dist":{"integrity":"sha512-o5JfnFlj97zQtYj6+asXtQLRzz5YmBRv6f5ABeVf8ujci3+XjcK2a4wF1uxH6qZVHn9XUdVDxLu0j7aJodjaEg==","shasum":"56eec2ce02269a23c40a81a73b34effb8d947f1b","tarball":"https://registry.npmjs.org/r3f-form/-/r3f-form-2.0.2-beta.6.tgz","fileCount":47,"unpackedSize":105946,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDr1briq87d2FZOIy4YsM8SPtbK6iHAeclzwqUnDdZGIwIhANwro7E95D2jWdZ5G5VKVMBuz+p0XEpwkAFuOp5AVFhz"}]},"_npmUser":{"name":"jberesford","email":"volcaus@gmail.com"},"directories":{},"maintainers":[{"name":"jberesford","email":"volcaus@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/r3f-form_2.0.2-beta.6_1689099439819_0.794699408982591"},"_hasShrinkwrap":false},"2.0.2-beta.7":{"name":"r3f-form","version":"2.0.2-beta.7","description":"A webGL input field component for use with React Three Fiber","main":"dist/index.cjs.js","module":"dist/index.js","types":"dist/index.d.ts","exports":{"./Input":{"import":"./dist/Input/index.js","require":"./dist/Input/index.cjs.js","types":"./dist/Input/index.d.ts"},"./Textarea":{"import":"./dist/Textarea/index.js","require":"./dist/Textarea/index.cjs.js","types":"./dist/Textarea/index.d.ts"}},"publishConfig":{"access":"public"},"scripts":{"build":"rollup -c --bundleConfigAsCjs","typegen":"tsc --emitDeclarationOnly","lint":"eslint .","storybook":"start-storybook -p 6006","build-storybook":"build-storybook","semantic-release":"semantic-release --branches main","commit":"cz"},"author":{"name":"John Beresford"},"license":"MIT","devDependencies":{"@babel/core":"^7.20.7","@babel/plugin-transform-runtime":"^7.19.6","@babel/preset-env":"^7.20.2","@babel/preset-react":"^7.18.6","@babel/preset-typescript":"^7.18.6","@react-three/drei":"^9.48.6","@react-three/fiber":"^8.9.1","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-node-resolve":"^15.0.1","@rollup/plugin-terser":"^0.2.1","@rollup/plugin-typescript":"^10.0.1","@storybook/addon-actions":"^6.5.15","@storybook/addon-essentials":"^6.5.15","@storybook/addon-interactions":"^6.5.15","@storybook/addon-links":"^6.5.15","@storybook/builder-webpack4":"^6.5.15","@storybook/manager-webpack4":"^6.5.15","@storybook/react":"^6.5.15","@storybook/testing-library":"^0.0.13","@types/react":"^18.0.26","@types/react-dom":"^18.0.10","@types/three":"^0.146.0","@typescript-eslint/eslint-plugin":"^5.48.0","@typescript-eslint/parser":"^5.48.0","babel-loader":"^8.3.0","commitizen":"^4.3.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.31.0","eslint-config-prettier":"^8.6.0","eslint-plugin-import":"^2.26.0","eslint-plugin-prettier":"^4.2.1","eslint-plugin-react":"^7.31.11","eslint-plugin-react-hooks":"^4.6.0","react":"^18.2.0","react-dom":"^18.2.0","rollup":"^3.9.0","rollup-plugin-multi-input":"^1.3.1","semantic-release":"^19.0.5","three":"^0.148.0","troika-three-text":"^0.47.1","tslib":"^2.4.1","typescript":"^4.9.4"},"peerDependencies":{"@react-three/drei":">=9.0","@react-three/fiber":">=8.0","react":">=18.0","react-dom":">=18.0","three":">=0.146.0","troika-three-text":">=0.47.0"},"repository":{"type":"git","url":"git+https://github.com/JMBeresford/r3f-form.git"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"readme":"# r3f-form\n\n### [View examples](https://jmberesford.github.io/r3f-form/?path=/story/form--default-submit-button)\n\n> ## WARNING: UNDER HEAVY DEVELOPMENT\n>\n> Each release will aim to be a fully functional and usable release,\n> but breaking API changes WILL be likely for the forseeable future.\n\n## A webGL form component for use with React Three Fiber\n\n![image](https://user-images.githubusercontent.com/1373954/210024281-c735f61a-1a69-45e5-a5d3-147ed57a6c30.png)\n\nThis package aims to create a fully-functional and **accessible** `<Form />`\ncomponents that can be used within the [@react-three/fiber](https://github.com/pmndrs/react-three-fiber)\necosystem. Ultimately, the goal is to have fully functioning HTML `<form>`s -- with all viable input types -- rendered in webGL.\n\nCurrent implementation binds webGL elements to the existing state and event systems of respective\nhidden HTML DOM elements. There is a heavy reliance on\n[troika-three-text](https://github.com/protectwise/troika/tree/main/packages/troika-three-text)\nfor text-rendering and selection/caret logic.\n\n> Note that `r3f-form` will only work within a React-Three-Fiber Canvas element.\n> You **must** be using\n>\n> - [@react-three/fiber](https://github.com/pmndrs/react-three-fiber)\n> - [@react-three/drei](https://github.com/pmndrs/drei)\n> - [troika-three-text](https://github.com/protectwise/troika/tree/main/packages/troika-three-text)\n>\n> as dependencies in your project to use `r3f-form`.\n\n### Install\n\n```sh\nnpm install r3f-form\n# or, if using yarn\nyarn install r3f-form\n```\n\n# How to use\n\n## Forms\n\nIn order to create a form, just wrap any relevant elements in a `<Form>`:\n\n```tsx\nimport { Form, Input, Label, Submit } from \"r3f-form\";\n\nexport function MyForm() {\n  return (\n    <Form>\n      <Label text=\"username\" />\n      <Input name=\"username\" />\n\n      <Label text=\"password\" />\n      <Input name=\"password\" type=\"password\" />\n\n      <Submit value=\"Login\" />\n    </Form>\n  );\n}\n```\n\n> Note that each element in the form will require a `name` prop in order to be picked up in submission, just like in a normal DOM form element\n\nThe relevant inputs will be bound to respective DOM elements under the hood, and be rendered into the 3D scene like so:\n\n![image](https://user-images.githubusercontent.com/1373954/217718779-816da536-00af-4375-85dd-de707e79aa8d.png)\n\nYou can define submission behavior just like with any old HTML `<form>`:\n\n```tsx\n// redirect to a login script\n<Form action=\"/login.php\"></Form>;\n\n// or handle it with a callback\nconst handleSubmit = (e: FormEvent) => {\n  e.preventDefault();\n\n  const data = new FormData(e.target);\n\n  for (let [name, value] of data.entries()) {\n    console.log(`${name}: ${value}`);\n  }\n};\n\n<Form onSubmit={handleSubmit}></Form>;\n```\n\n## Inputs\n\nAn editable text-box bound to an DOM `<input>` and represented in the webGL canvas.\n\n```ts\ntype Props = {\n  type?: \"text\" | \"password\";\n\n  /** width of the container */\n  width?: number;\n  backgroundColor?: Color;\n  selectionColor?: Color;\n  backgroundOpacity?: number;\n\n  /** [left/right , top/bottom] in THREE units, respectively\n   *\n   * note that height is implicitly defined by the capHeight of the rendered\n   * text. The cap height is dependant on both the `textProps.font` being used and the\n   * `textProps.fontSize` value\n   */\n  padding?: Vector2;\n  cursorWidth?: number;\n\n  /** 3D transformations */\n  position: Vector3;\n  rotation: Euler;\n  scale: Vector3;\n\n  // And ALL props available to DOM <input>s\n};\n```\n\nCreate a basic input field like so:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\nexport function MyInput() {\n  return (\n    <>\n      <Label text=\"label\" />\n      <Input />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718847-acb169ed-95ff-4def-a126-491c648346b9.png)\n\nYou can access the value of the input via the `onChange` callback prop:\n\n> The callback is passed the `ChangeEvent` object from the underlying HTML `<input>`s\n> change event on every change.\n>\n> Read more about this event [here](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/change_event)\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\nexport function MyInput() {\n  const [username, setUsername] = React.useState(\"\");\n  // username will always contain the current value\n\n  function handleChange(e) {\n    setUsername(ev.target.value);\n  }\n\n  return (\n    <>\n      <Label text=\"Test Input\" />\n      <Input onChange={handleChange} />\n    </>\n  );\n}\n```\n\nYou can also create password inputs:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\nexport function MyPassword() {\n  return (\n    <>\n      <Label text=\"Password\" />\n      <Input type=\"password\" />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718412-48158e10-53b2-4e79-86c9-54bc5495521a.png)\n\nAdd custom padding to the text container:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\n/*\n * padding: [horizontal padding, vertical padding] in THREE units\n */\n\nexport function MyInput() {\n  return (\n    <>\n      <Label text=\"Label\" />\n      <Input padding={[0.05, 0.5]} />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718475-1c696ff1-3b1d-4559-9d02-9535bd59cdff.png)\n\n---\n\n## Textarea\n\n```ts\ntype Props = {\n  /** width of the container */\n  width?: number;\n\n  backgroundColor?: Color;\n  backgroundOpacity?: number;\n  selectionColor?: Color;\n\n  /** [left/right , top/bottom] in THREE units, respectively\n   *\n   * note that height is implicitly defined by the capHeight of the rendered\n   * text. The cap height is dependant on both the `textProps.font` being used\n   * and the `textProps.fontSize` value\n   */\n  padding?: Vector2;\n  cursorWidth?: number;\n\n  /** 3D transformations */\n  position: Vector3;\n  rotation: Euler;\n  scale: Vector3;\n\n  // And ALL props available to DOM <textarea>s\n};\n```\n\nSimilar to the `<Input />` component, you can also create a `<Textarea />` like so:\n\n```tsx\nimport { Textarea, Label } from \"r3f-form\";\n\nexport function App() {\n  return (\n    <>\n      <Label text=\"Default Textarea:\" />\n      <Textarea />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718566-a718eab7-1e73-4559-96aa-8e14824f0031.png)\n\n---\n\n## Text\n\nIn order to configure the underlying `troika-three-text` instance\nthat is responsible for rendering the actual text, you can use the\n`<Text />` component.\n\nThere is a respective `<Text />` component for both `<Input />`s and\n`<Textarea />`s.\n\nFor all configuration options, check out the [troika docs](https://github.com/protectwise/troika/tree/main/packages/troika-three-text).\n\n> Note that **not all** of troika's props are exposed on these `<Text />`\n> components\n\nChange color and background opacity:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\nimport { Text } from \"r3f-form/Input\";\n\nexport function App() {\n  return (\n    <>\n      <Label text=\"Test Color/Opacity\" />\n      <Input backgroundOpacity={0.6} backgroundColor=\"black\">\n        <Text color=\"red\" />\n      </Input>\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718611-c2e4848e-8267-4926-9243-7bb61bced61d.png)\n\nIf you wanted to alter both an `<Input />` and a\n`<Textarea />` via their respective `<Text />` components\nyou could do the following:\n\n```tsx\nimport { Input, Textarea, Label } from \"r3f-form\";\nimport { Text as InputText } from \"r3f-form/Input\";\nimport { Text as TextareaText } from \"r3f-form/Textarea\";\n\nexport function App() {\n  return (\n    <>\n      <Label text=\"Test Color/Opacity\" />\n      <Input>\n        <InputText color=\"#red\" />\n      </Input>\n\n      <Label text=\"Test Textarea\" />\n      <Textarea>\n        <TextareaText color=\"red\" />\n      </Textarea>\n    </>\n  );\n}\n```\n\n---\n\n## Submit\n\nEquivalent to a DOM `<input type=\"submit\" />`, exposed as\nan independent component. By default it renders a button\nusing the following props:\n\n```ts\ntype Props = {\n  value?: string;\n  fontSize?: number;\n  width?: number;\n  height?: number;\n  color?: Color;\n  backgroundColor?: Color;\n\n  /** 3D transformations */\n  position: Vector3;\n  rotation: Euler;\n  scale: Vector3;\n\n  // And ALL props available to DOM <input>s\n};\n```\n\nAdd a simple submit button to your forms like so:\n\n```tsx\n<Form>\n  <Label text=\"Username\" />\n  <Input name=\"username\" />\n\n  <Label text=\"Password\" />\n  <Input name=\"password\" type=\"password\" />\n\n  <Submit value=\"Login\" />\n</Form>\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718665-c64f6653-f85f-4310-a1c7-f2cf43154f2e.png)\n\nWhile this provides a somewhat-customizable default button, the main purpose of this component\nis to provide a simple interface to use 3D elements to submit your forms. Any children passed in\nwill submit the form on click. For example:\n\n```tsx\n<Form>\n  . . .\n  <Submit value=\"submit\">\n    <MySubmitButton />\n  </Submit>\n</Form>\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718713-a0a6671f-3f1e-4817-9ee9-e205bcc22610.png)\n\nClicking on the big red button would submit the `<Form>`\n","readmeFilename":"README.md","gitHead":"0b8a681b7a8f4d860d5b4569b5702610354a643b","bugs":{"url":"https://github.com/JMBeresford/r3f-form/issues"},"homepage":"https://github.com/JMBeresford/r3f-form#readme","_id":"r3f-form@2.0.2-beta.7","_nodeVersion":"19.9.0","_npmVersion":"9.6.3","dist":{"integrity":"sha512-Wa0FcIOoBjeaQKNwtqBuI/RTN9Jt62MHhSwhxJjLKUW/3SxlIKfNkS13ccmojhW2mkyWVWX99aU4AuYEKStk3A==","shasum":"de99c6ef44fd724152efb22de10a9ebfde3f2947","tarball":"https://registry.npmjs.org/r3f-form/-/r3f-form-2.0.2-beta.7.tgz","fileCount":47,"unpackedSize":106082,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICD813ezjtJ427DtIgFueB7ANhdJe+ijw1KCjgPMaOcpAiEA1MXxe4DNkR6AUyoA47A8FiV4zLt3BKkP5vByidgqoi8="}]},"_npmUser":{"name":"jberesford","email":"volcaus@gmail.com"},"directories":{},"maintainers":[{"name":"jberesford","email":"volcaus@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/r3f-form_2.0.2-beta.7_1689100832911_0.4428433173656068"},"_hasShrinkwrap":false},"2.0.2-beta.8":{"name":"r3f-form","version":"2.0.2-beta.8","description":"A webGL input field component for use with React Three Fiber","exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs.js","types":"./dist/index.d.ts"},"./Input":{"import":"./dist/Input/index.js","require":"./dist/Input/index.cjs.js","types":"./dist/Input/index.d.ts"},"./Textarea":{"import":"./dist/Textarea/index.js","require":"./dist/Textarea/index.cjs.js","types":"./dist/Textarea/index.d.ts"}},"publishConfig":{"access":"public"},"scripts":{"build":"rollup -c --bundleConfigAsCjs","typegen":"tsc --emitDeclarationOnly","lint":"eslint .","storybook":"start-storybook -p 6006","build-storybook":"build-storybook","semantic-release":"semantic-release --branches main","commit":"cz"},"author":{"name":"John Beresford"},"license":"MIT","devDependencies":{"@babel/core":"^7.20.7","@babel/plugin-transform-runtime":"^7.19.6","@babel/preset-env":"^7.20.2","@babel/preset-react":"^7.18.6","@babel/preset-typescript":"^7.18.6","@react-three/drei":"^9.48.6","@react-three/fiber":"^8.9.1","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-node-resolve":"^15.0.1","@rollup/plugin-terser":"^0.2.1","@rollup/plugin-typescript":"^10.0.1","@storybook/addon-actions":"^6.5.15","@storybook/addon-essentials":"^6.5.15","@storybook/addon-interactions":"^6.5.15","@storybook/addon-links":"^6.5.15","@storybook/builder-webpack4":"^6.5.15","@storybook/manager-webpack4":"^6.5.15","@storybook/react":"^6.5.15","@storybook/testing-library":"^0.0.13","@types/react":"^18.0.26","@types/react-dom":"^18.0.10","@types/three":"^0.146.0","@typescript-eslint/eslint-plugin":"^5.48.0","@typescript-eslint/parser":"^5.48.0","babel-loader":"^8.3.0","commitizen":"^4.3.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.31.0","eslint-config-prettier":"^8.6.0","eslint-plugin-import":"^2.26.0","eslint-plugin-prettier":"^4.2.1","eslint-plugin-react":"^7.31.11","eslint-plugin-react-hooks":"^4.6.0","react":"^18.2.0","react-dom":"^18.2.0","rollup":"^3.9.0","rollup-plugin-multi-input":"^1.3.1","semantic-release":"^19.0.5","three":"^0.148.0","troika-three-text":"^0.47.1","tslib":"^2.4.1","typescript":"^4.9.4"},"peerDependencies":{"@react-three/drei":">=9.0","@react-three/fiber":">=8.0","react":">=18.0","react-dom":">=18.0","three":">=0.146.0","troika-three-text":">=0.47.0"},"repository":{"type":"git","url":"git+https://github.com/JMBeresford/r3f-form.git"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"readme":"# r3f-form\n\n### [View examples](https://jmberesford.github.io/r3f-form/?path=/story/form--default-submit-button)\n\n> ## WARNING: UNDER HEAVY DEVELOPMENT\n>\n> Each release will aim to be a fully functional and usable release,\n> but breaking API changes WILL be likely for the forseeable future.\n\n## A webGL form component for use with React Three Fiber\n\n![image](https://user-images.githubusercontent.com/1373954/210024281-c735f61a-1a69-45e5-a5d3-147ed57a6c30.png)\n\nThis package aims to create a fully-functional and **accessible** `<Form />`\ncomponents that can be used within the [@react-three/fiber](https://github.com/pmndrs/react-three-fiber)\necosystem. Ultimately, the goal is to have fully functioning HTML `<form>`s -- with all viable input types -- rendered in webGL.\n\nCurrent implementation binds webGL elements to the existing state and event systems of respective\nhidden HTML DOM elements. There is a heavy reliance on\n[troika-three-text](https://github.com/protectwise/troika/tree/main/packages/troika-three-text)\nfor text-rendering and selection/caret logic.\n\n> Note that `r3f-form` will only work within a React-Three-Fiber Canvas element.\n> You **must** be using\n>\n> - [@react-three/fiber](https://github.com/pmndrs/react-three-fiber)\n> - [@react-three/drei](https://github.com/pmndrs/drei)\n> - [troika-three-text](https://github.com/protectwise/troika/tree/main/packages/troika-three-text)\n>\n> as dependencies in your project to use `r3f-form`.\n\n### Install\n\n```sh\nnpm install r3f-form\n# or, if using yarn\nyarn install r3f-form\n```\n\n# How to use\n\n## Forms\n\nIn order to create a form, just wrap any relevant elements in a `<Form>`:\n\n```tsx\nimport { Form, Input, Label, Submit } from \"r3f-form\";\n\nexport function MyForm() {\n  return (\n    <Form>\n      <Label text=\"username\" />\n      <Input name=\"username\" />\n\n      <Label text=\"password\" />\n      <Input name=\"password\" type=\"password\" />\n\n      <Submit value=\"Login\" />\n    </Form>\n  );\n}\n```\n\n> Note that each element in the form will require a `name` prop in order to be picked up in submission, just like in a normal DOM form element\n\nThe relevant inputs will be bound to respective DOM elements under the hood, and be rendered into the 3D scene like so:\n\n![image](https://user-images.githubusercontent.com/1373954/217718779-816da536-00af-4375-85dd-de707e79aa8d.png)\n\nYou can define submission behavior just like with any old HTML `<form>`:\n\n```tsx\n// redirect to a login script\n<Form action=\"/login.php\"></Form>;\n\n// or handle it with a callback\nconst handleSubmit = (e: FormEvent) => {\n  e.preventDefault();\n\n  const data = new FormData(e.target);\n\n  for (let [name, value] of data.entries()) {\n    console.log(`${name}: ${value}`);\n  }\n};\n\n<Form onSubmit={handleSubmit}></Form>;\n```\n\n## Inputs\n\nAn editable text-box bound to an DOM `<input>` and represented in the webGL canvas.\n\n```ts\ntype Props = {\n  type?: \"text\" | \"password\";\n\n  /** width of the container */\n  width?: number;\n  backgroundColor?: Color;\n  selectionColor?: Color;\n  backgroundOpacity?: number;\n\n  /** [left/right , top/bottom] in THREE units, respectively\n   *\n   * note that height is implicitly defined by the capHeight of the rendered\n   * text. The cap height is dependant on both the `textProps.font` being used and the\n   * `textProps.fontSize` value\n   */\n  padding?: Vector2;\n  cursorWidth?: number;\n\n  /** 3D transformations */\n  position: Vector3;\n  rotation: Euler;\n  scale: Vector3;\n\n  // And ALL props available to DOM <input>s\n};\n```\n\nCreate a basic input field like so:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\nexport function MyInput() {\n  return (\n    <>\n      <Label text=\"label\" />\n      <Input />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718847-acb169ed-95ff-4def-a126-491c648346b9.png)\n\nYou can access the value of the input via the `onChange` callback prop:\n\n> The callback is passed the `ChangeEvent` object from the underlying HTML `<input>`s\n> change event on every change.\n>\n> Read more about this event [here](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/change_event)\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\nexport function MyInput() {\n  const [username, setUsername] = React.useState(\"\");\n  // username will always contain the current value\n\n  function handleChange(e) {\n    setUsername(ev.target.value);\n  }\n\n  return (\n    <>\n      <Label text=\"Test Input\" />\n      <Input onChange={handleChange} />\n    </>\n  );\n}\n```\n\nYou can also create password inputs:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\nexport function MyPassword() {\n  return (\n    <>\n      <Label text=\"Password\" />\n      <Input type=\"password\" />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718412-48158e10-53b2-4e79-86c9-54bc5495521a.png)\n\nAdd custom padding to the text container:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\n/*\n * padding: [horizontal padding, vertical padding] in THREE units\n */\n\nexport function MyInput() {\n  return (\n    <>\n      <Label text=\"Label\" />\n      <Input padding={[0.05, 0.5]} />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718475-1c696ff1-3b1d-4559-9d02-9535bd59cdff.png)\n\n---\n\n## Textarea\n\n```ts\ntype Props = {\n  /** width of the container */\n  width?: number;\n\n  backgroundColor?: Color;\n  backgroundOpacity?: number;\n  selectionColor?: Color;\n\n  /** [left/right , top/bottom] in THREE units, respectively\n   *\n   * note that height is implicitly defined by the capHeight of the rendered\n   * text. The cap height is dependant on both the `textProps.font` being used\n   * and the `textProps.fontSize` value\n   */\n  padding?: Vector2;\n  cursorWidth?: number;\n\n  /** 3D transformations */\n  position: Vector3;\n  rotation: Euler;\n  scale: Vector3;\n\n  // And ALL props available to DOM <textarea>s\n};\n```\n\nSimilar to the `<Input />` component, you can also create a `<Textarea />` like so:\n\n```tsx\nimport { Textarea, Label } from \"r3f-form\";\n\nexport function App() {\n  return (\n    <>\n      <Label text=\"Default Textarea:\" />\n      <Textarea />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718566-a718eab7-1e73-4559-96aa-8e14824f0031.png)\n\n---\n\n## Text\n\nIn order to configure the underlying `troika-three-text` instance\nthat is responsible for rendering the actual text, you can use the\n`<Text />` component.\n\nThere is a respective `<Text />` component for both `<Input />`s and\n`<Textarea />`s.\n\nFor all configuration options, check out the [troika docs](https://github.com/protectwise/troika/tree/main/packages/troika-three-text).\n\n> Note that **not all** of troika's props are exposed on these `<Text />`\n> components\n\nChange color and background opacity:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\nimport { Text } from \"r3f-form/Input\";\n\nexport function App() {\n  return (\n    <>\n      <Label text=\"Test Color/Opacity\" />\n      <Input backgroundOpacity={0.6} backgroundColor=\"black\">\n        <Text color=\"red\" />\n      </Input>\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718611-c2e4848e-8267-4926-9243-7bb61bced61d.png)\n\nIf you wanted to alter both an `<Input />` and a\n`<Textarea />` via their respective `<Text />` components\nyou could do the following:\n\n```tsx\nimport { Input, Textarea, Label } from \"r3f-form\";\nimport { Text as InputText } from \"r3f-form/Input\";\nimport { Text as TextareaText } from \"r3f-form/Textarea\";\n\nexport function App() {\n  return (\n    <>\n      <Label text=\"Test Color/Opacity\" />\n      <Input>\n        <InputText color=\"#red\" />\n      </Input>\n\n      <Label text=\"Test Textarea\" />\n      <Textarea>\n        <TextareaText color=\"red\" />\n      </Textarea>\n    </>\n  );\n}\n```\n\n---\n\n## Submit\n\nEquivalent to a DOM `<input type=\"submit\" />`, exposed as\nan independent component. By default it renders a button\nusing the following props:\n\n```ts\ntype Props = {\n  value?: string;\n  fontSize?: number;\n  width?: number;\n  height?: number;\n  color?: Color;\n  backgroundColor?: Color;\n\n  /** 3D transformations */\n  position: Vector3;\n  rotation: Euler;\n  scale: Vector3;\n\n  // And ALL props available to DOM <input>s\n};\n```\n\nAdd a simple submit button to your forms like so:\n\n```tsx\n<Form>\n  <Label text=\"Username\" />\n  <Input name=\"username\" />\n\n  <Label text=\"Password\" />\n  <Input name=\"password\" type=\"password\" />\n\n  <Submit value=\"Login\" />\n</Form>\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718665-c64f6653-f85f-4310-a1c7-f2cf43154f2e.png)\n\nWhile this provides a somewhat-customizable default button, the main purpose of this component\nis to provide a simple interface to use 3D elements to submit your forms. Any children passed in\nwill submit the form on click. For example:\n\n```tsx\n<Form>\n  . . .\n  <Submit value=\"submit\">\n    <MySubmitButton />\n  </Submit>\n</Form>\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718713-a0a6671f-3f1e-4817-9ee9-e205bcc22610.png)\n\nClicking on the big red button would submit the `<Form>`\n","readmeFilename":"README.md","gitHead":"0b8a681b7a8f4d860d5b4569b5702610354a643b","bugs":{"url":"https://github.com/JMBeresford/r3f-form/issues"},"homepage":"https://github.com/JMBeresford/r3f-form#readme","_id":"r3f-form@2.0.2-beta.8","_nodeVersion":"19.9.0","_npmVersion":"9.6.3","dist":{"integrity":"sha512-X+Ak3UtdL/+RlTlw930ayioRaVRn9qHq9kfUolS4wz72R9lTH2LFWevlYbYgBBh14E5bGpJ9oNdebMU49zdw7g==","shasum":"10ab967889068469bedbe45613755d26bf85ce0d","tarball":"https://registry.npmjs.org/r3f-form/-/r3f-form-2.0.2-beta.8.tgz","fileCount":47,"unpackedSize":106120,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCwt4wwWcAJoRT01HFNiYCHSzhYwbChZ6enwnJUuVZpnQIhAN5RIH08ubqgELwGcnlalicj+JakUdXGrU1zNLO6N3Iv"}]},"_npmUser":{"name":"jberesford","email":"volcaus@gmail.com"},"directories":{},"maintainers":[{"name":"jberesford","email":"volcaus@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/r3f-form_2.0.2-beta.8_1689100939778_0.6584198930643241"},"_hasShrinkwrap":false},"2.0.2-beta.9":{"name":"r3f-form","version":"2.0.2-beta.9","description":"A webGL input field component for use with React Three Fiber","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs.js"},"./Input":{"types":"./dist/Input/index.d.ts","import":"./dist/Input/index.js","require":"./dist/Input/index.cjs.js"},"./Textarea":{"types":"./dist/Textarea/index.d.ts","import":"./dist/Textarea/index.js","require":"./dist/Textarea/index.cjs.js"}},"publishConfig":{"access":"public"},"scripts":{"build":"rollup -c --bundleConfigAsCjs","typegen":"tsc --emitDeclarationOnly","lint":"eslint .","storybook":"start-storybook -p 6006","build-storybook":"build-storybook","semantic-release":"semantic-release --branches main","commit":"cz"},"author":{"name":"John Beresford"},"license":"MIT","devDependencies":{"@babel/core":"^7.20.7","@babel/plugin-transform-runtime":"^7.19.6","@babel/preset-env":"^7.20.2","@babel/preset-react":"^7.18.6","@babel/preset-typescript":"^7.18.6","@react-three/drei":"^9.48.6","@react-three/fiber":"^8.9.1","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-node-resolve":"^15.0.1","@rollup/plugin-terser":"^0.2.1","@rollup/plugin-typescript":"^10.0.1","@storybook/addon-actions":"^6.5.15","@storybook/addon-essentials":"^6.5.15","@storybook/addon-interactions":"^6.5.15","@storybook/addon-links":"^6.5.15","@storybook/builder-webpack4":"^6.5.15","@storybook/manager-webpack4":"^6.5.15","@storybook/react":"^6.5.15","@storybook/testing-library":"^0.0.13","@types/react":"^18.0.26","@types/react-dom":"^18.0.10","@types/three":"^0.146.0","@typescript-eslint/eslint-plugin":"^5.48.0","@typescript-eslint/parser":"^5.48.0","babel-loader":"^8.3.0","commitizen":"^4.3.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.31.0","eslint-config-prettier":"^8.6.0","eslint-plugin-import":"^2.26.0","eslint-plugin-prettier":"^4.2.1","eslint-plugin-react":"^7.31.11","eslint-plugin-react-hooks":"^4.6.0","react":"^18.2.0","react-dom":"^18.2.0","rollup":"^3.9.0","rollup-plugin-multi-input":"^1.3.1","semantic-release":"^19.0.5","three":"^0.148.0","troika-three-text":"^0.47.1","tslib":"^2.4.1","typescript":"^4.9.4"},"peerDependencies":{"@react-three/drei":">=9.0","@react-three/fiber":">=8.0","react":">=18.0","react-dom":">=18.0","three":">=0.146.0","troika-three-text":">=0.47.0"},"repository":{"type":"git","url":"git+https://github.com/JMBeresford/r3f-form.git"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"readme":"# r3f-form\n\n### [View examples](https://jmberesford.github.io/r3f-form/?path=/story/form--default-submit-button)\n\n> ## WARNING: UNDER HEAVY DEVELOPMENT\n>\n> Each release will aim to be a fully functional and usable release,\n> but breaking API changes WILL be likely for the forseeable future.\n\n## A webGL form component for use with React Three Fiber\n\n![image](https://user-images.githubusercontent.com/1373954/210024281-c735f61a-1a69-45e5-a5d3-147ed57a6c30.png)\n\nThis package aims to create a fully-functional and **accessible** `<Form />`\ncomponents that can be used within the [@react-three/fiber](https://github.com/pmndrs/react-three-fiber)\necosystem. Ultimately, the goal is to have fully functioning HTML `<form>`s -- with all viable input types -- rendered in webGL.\n\nCurrent implementation binds webGL elements to the existing state and event systems of respective\nhidden HTML DOM elements. There is a heavy reliance on\n[troika-three-text](https://github.com/protectwise/troika/tree/main/packages/troika-three-text)\nfor text-rendering and selection/caret logic.\n\n> Note that `r3f-form` will only work within a React-Three-Fiber Canvas element.\n> You **must** be using\n>\n> - [@react-three/fiber](https://github.com/pmndrs/react-three-fiber)\n> - [@react-three/drei](https://github.com/pmndrs/drei)\n> - [troika-three-text](https://github.com/protectwise/troika/tree/main/packages/troika-three-text)\n>\n> as dependencies in your project to use `r3f-form`.\n\n### Install\n\n```sh\nnpm install r3f-form\n# or, if using yarn\nyarn install r3f-form\n```\n\n# How to use\n\n## Forms\n\nIn order to create a form, just wrap any relevant elements in a `<Form>`:\n\n```tsx\nimport { Form, Input, Label, Submit } from \"r3f-form\";\n\nexport function MyForm() {\n  return (\n    <Form>\n      <Label text=\"username\" />\n      <Input name=\"username\" />\n\n      <Label text=\"password\" />\n      <Input name=\"password\" type=\"password\" />\n\n      <Submit value=\"Login\" />\n    </Form>\n  );\n}\n```\n\n> Note that each element in the form will require a `name` prop in order to be picked up in submission, just like in a normal DOM form element\n\nThe relevant inputs will be bound to respective DOM elements under the hood, and be rendered into the 3D scene like so:\n\n![image](https://user-images.githubusercontent.com/1373954/217718779-816da536-00af-4375-85dd-de707e79aa8d.png)\n\nYou can define submission behavior just like with any old HTML `<form>`:\n\n```tsx\n// redirect to a login script\n<Form action=\"/login.php\"></Form>;\n\n// or handle it with a callback\nconst handleSubmit = (e: FormEvent) => {\n  e.preventDefault();\n\n  const data = new FormData(e.target);\n\n  for (let [name, value] of data.entries()) {\n    console.log(`${name}: ${value}`);\n  }\n};\n\n<Form onSubmit={handleSubmit}></Form>;\n```\n\n## Inputs\n\nAn editable text-box bound to an DOM `<input>` and represented in the webGL canvas.\n\n```ts\ntype Props = {\n  type?: \"text\" | \"password\";\n\n  /** width of the container */\n  width?: number;\n  backgroundColor?: Color;\n  selectionColor?: Color;\n  backgroundOpacity?: number;\n\n  /** [left/right , top/bottom] in THREE units, respectively\n   *\n   * note that height is implicitly defined by the capHeight of the rendered\n   * text. The cap height is dependant on both the `textProps.font` being used and the\n   * `textProps.fontSize` value\n   */\n  padding?: Vector2;\n  cursorWidth?: number;\n\n  /** 3D transformations */\n  position: Vector3;\n  rotation: Euler;\n  scale: Vector3;\n\n  // And ALL props available to DOM <input>s\n};\n```\n\nCreate a basic input field like so:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\nexport function MyInput() {\n  return (\n    <>\n      <Label text=\"label\" />\n      <Input />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718847-acb169ed-95ff-4def-a126-491c648346b9.png)\n\nYou can access the value of the input via the `onChange` callback prop:\n\n> The callback is passed the `ChangeEvent` object from the underlying HTML `<input>`s\n> change event on every change.\n>\n> Read more about this event [here](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/change_event)\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\nexport function MyInput() {\n  const [username, setUsername] = React.useState(\"\");\n  // username will always contain the current value\n\n  function handleChange(e) {\n    setUsername(ev.target.value);\n  }\n\n  return (\n    <>\n      <Label text=\"Test Input\" />\n      <Input onChange={handleChange} />\n    </>\n  );\n}\n```\n\nYou can also create password inputs:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\nexport function MyPassword() {\n  return (\n    <>\n      <Label text=\"Password\" />\n      <Input type=\"password\" />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718412-48158e10-53b2-4e79-86c9-54bc5495521a.png)\n\nAdd custom padding to the text container:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\n/*\n * padding: [horizontal padding, vertical padding] in THREE units\n */\n\nexport function MyInput() {\n  return (\n    <>\n      <Label text=\"Label\" />\n      <Input padding={[0.05, 0.5]} />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718475-1c696ff1-3b1d-4559-9d02-9535bd59cdff.png)\n\n---\n\n## Textarea\n\n```ts\ntype Props = {\n  /** width of the container */\n  width?: number;\n\n  backgroundColor?: Color;\n  backgroundOpacity?: number;\n  selectionColor?: Color;\n\n  /** [left/right , top/bottom] in THREE units, respectively\n   *\n   * note that height is implicitly defined by the capHeight of the rendered\n   * text. The cap height is dependant on both the `textProps.font` being used\n   * and the `textProps.fontSize` value\n   */\n  padding?: Vector2;\n  cursorWidth?: number;\n\n  /** 3D transformations */\n  position: Vector3;\n  rotation: Euler;\n  scale: Vector3;\n\n  // And ALL props available to DOM <textarea>s\n};\n```\n\nSimilar to the `<Input />` component, you can also create a `<Textarea />` like so:\n\n```tsx\nimport { Textarea, Label } from \"r3f-form\";\n\nexport function App() {\n  return (\n    <>\n      <Label text=\"Default Textarea:\" />\n      <Textarea />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718566-a718eab7-1e73-4559-96aa-8e14824f0031.png)\n\n---\n\n## Text\n\nIn order to configure the underlying `troika-three-text` instance\nthat is responsible for rendering the actual text, you can use the\n`<Text />` component.\n\nThere is a respective `<Text />` component for both `<Input />`s and\n`<Textarea />`s.\n\nFor all configuration options, check out the [troika docs](https://github.com/protectwise/troika/tree/main/packages/troika-three-text).\n\n> Note that **not all** of troika's props are exposed on these `<Text />`\n> components\n\nChange color and background opacity:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\nimport { Text } from \"r3f-form/Input\";\n\nexport function App() {\n  return (\n    <>\n      <Label text=\"Test Color/Opacity\" />\n      <Input backgroundOpacity={0.6} backgroundColor=\"black\">\n        <Text color=\"red\" />\n      </Input>\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718611-c2e4848e-8267-4926-9243-7bb61bced61d.png)\n\nIf you wanted to alter both an `<Input />` and a\n`<Textarea />` via their respective `<Text />` components\nyou could do the following:\n\n```tsx\nimport { Input, Textarea, Label } from \"r3f-form\";\nimport { Text as InputText } from \"r3f-form/Input\";\nimport { Text as TextareaText } from \"r3f-form/Textarea\";\n\nexport function App() {\n  return (\n    <>\n      <Label text=\"Test Color/Opacity\" />\n      <Input>\n        <InputText color=\"#red\" />\n      </Input>\n\n      <Label text=\"Test Textarea\" />\n      <Textarea>\n        <TextareaText color=\"red\" />\n      </Textarea>\n    </>\n  );\n}\n```\n\n---\n\n## Submit\n\nEquivalent to a DOM `<input type=\"submit\" />`, exposed as\nan independent component. By default it renders a button\nusing the following props:\n\n```ts\ntype Props = {\n  value?: string;\n  fontSize?: number;\n  width?: number;\n  height?: number;\n  color?: Color;\n  backgroundColor?: Color;\n\n  /** 3D transformations */\n  position: Vector3;\n  rotation: Euler;\n  scale: Vector3;\n\n  // And ALL props available to DOM <input>s\n};\n```\n\nAdd a simple submit button to your forms like so:\n\n```tsx\n<Form>\n  <Label text=\"Username\" />\n  <Input name=\"username\" />\n\n  <Label text=\"Password\" />\n  <Input name=\"password\" type=\"password\" />\n\n  <Submit value=\"Login\" />\n</Form>\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718665-c64f6653-f85f-4310-a1c7-f2cf43154f2e.png)\n\nWhile this provides a somewhat-customizable default button, the main purpose of this component\nis to provide a simple interface to use 3D elements to submit your forms. Any children passed in\nwill submit the form on click. For example:\n\n```tsx\n<Form>\n  . . .\n  <Submit value=\"submit\">\n    <MySubmitButton />\n  </Submit>\n</Form>\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718713-a0a6671f-3f1e-4817-9ee9-e205bcc22610.png)\n\nClicking on the big red button would submit the `<Form>`\n","readmeFilename":"README.md","gitHead":"0b8a681b7a8f4d860d5b4569b5702610354a643b","bugs":{"url":"https://github.com/JMBeresford/r3f-form/issues"},"homepage":"https://github.com/JMBeresford/r3f-form#readme","_id":"r3f-form@2.0.2-beta.9","_nodeVersion":"19.9.0","_npmVersion":"9.6.3","dist":{"integrity":"sha512-SksftfbmTgHwEvnsPF3RH83P9U6Z9RJay/yGqteiMAy+9LO39wCRnBOMxvdpoBTQ8OpDiLObgMV6+p6oltco/A==","shasum":"d5681896c880da66ec0ff51c36bd2e8503a45659","tarball":"https://registry.npmjs.org/r3f-form/-/r3f-form-2.0.2-beta.9.tgz","fileCount":50,"unpackedSize":107624,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDkTZ6J8CbU/Q6Tt/ajqaaNFaWUgy6zoCwRpofQTP+FmAiBn3JuI+IoznqDSBGSfADZIy+nwRMHNBcXUgW0BOkfIxQ=="}]},"_npmUser":{"name":"jberesford","email":"volcaus@gmail.com"},"directories":{},"maintainers":[{"name":"jberesford","email":"volcaus@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/r3f-form_2.0.2-beta.9_1689101148065_0.7350758493622445"},"_hasShrinkwrap":false},"2.0.2-beta.10":{"name":"r3f-form","version":"2.0.2-beta.10","description":"A webGL input field component for use with React Three Fiber","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs.js"},"./Input":{"types":"./dist/Input/index.d.ts","import":"./dist/Input/index.js","require":"./dist/Input/index.cjs.js"},"./Textarea":{"types":"./dist/Textarea/index.d.ts","import":"./dist/Textarea/index.js","require":"./dist/Textarea/index.cjs.js"}},"publishConfig":{"access":"public"},"scripts":{"build":"rollup -c --bundleConfigAsCjs","typegen":"tsc --emitDeclarationOnly","lint":"eslint .","storybook":"start-storybook -p 6006","build-storybook":"build-storybook","semantic-release":"semantic-release --branches main","commit":"cz"},"author":{"name":"John Beresford"},"license":"MIT","devDependencies":{"@babel/core":"^7.20.7","@babel/plugin-transform-runtime":"^7.19.6","@babel/preset-env":"^7.20.2","@babel/preset-react":"^7.18.6","@babel/preset-typescript":"^7.18.6","@react-three/drei":"^9.48.6","@react-three/fiber":"^8.9.1","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-node-resolve":"^15.0.1","@rollup/plugin-terser":"^0.2.1","@rollup/plugin-typescript":"^10.0.1","@storybook/addon-actions":"^6.5.15","@storybook/addon-essentials":"^6.5.15","@storybook/addon-interactions":"^6.5.15","@storybook/addon-links":"^6.5.15","@storybook/builder-webpack4":"^6.5.15","@storybook/manager-webpack4":"^6.5.15","@storybook/react":"^6.5.15","@storybook/testing-library":"^0.0.13","@types/react":"^18.0.26","@types/react-dom":"^18.0.10","@types/three":"^0.146.0","@typescript-eslint/eslint-plugin":"^5.48.0","@typescript-eslint/parser":"^5.48.0","babel-loader":"^8.3.0","commitizen":"^4.3.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.31.0","eslint-config-prettier":"^8.6.0","eslint-plugin-import":"^2.26.0","eslint-plugin-prettier":"^4.2.1","eslint-plugin-react":"^7.31.11","eslint-plugin-react-hooks":"^4.6.0","react":"^18.2.0","react-dom":"^18.2.0","rollup":"^3.9.0","rollup-plugin-multi-input":"^1.3.1","semantic-release":"^19.0.5","three":"^0.148.0","troika-three-text":"^0.47.1","tslib":"^2.4.1","typescript":"^4.9.4"},"peerDependencies":{"@react-three/drei":">=9.0","@react-three/fiber":">=8.0","react":">=18.0","react-dom":">=18.0","three":">=0.146.0","troika-three-text":">=0.47.0"},"repository":{"type":"git","url":"git+https://github.com/JMBeresford/r3f-form.git"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"readme":"# r3f-form\n\n### [View examples](https://jmberesford.github.io/r3f-form/?path=/story/form--default-submit-button)\n\n> ## WARNING: UNDER HEAVY DEVELOPMENT\n>\n> Each release will aim to be a fully functional and usable release,\n> but breaking API changes WILL be likely for the forseeable future.\n\n## A webGL form component for use with React Three Fiber\n\n![image](https://user-images.githubusercontent.com/1373954/210024281-c735f61a-1a69-45e5-a5d3-147ed57a6c30.png)\n\nThis package aims to create a fully-functional and **accessible** `<Form />`\ncomponents that can be used within the [@react-three/fiber](https://github.com/pmndrs/react-three-fiber)\necosystem. Ultimately, the goal is to have fully functioning HTML `<form>`s -- with all viable input types -- rendered in webGL.\n\nCurrent implementation binds webGL elements to the existing state and event systems of respective\nhidden HTML DOM elements. There is a heavy reliance on\n[troika-three-text](https://github.com/protectwise/troika/tree/main/packages/troika-three-text)\nfor text-rendering and selection/caret logic.\n\n> Note that `r3f-form` will only work within a React-Three-Fiber Canvas element.\n> You **must** be using\n>\n> - [@react-three/fiber](https://github.com/pmndrs/react-three-fiber)\n> - [@react-three/drei](https://github.com/pmndrs/drei)\n> - [troika-three-text](https://github.com/protectwise/troika/tree/main/packages/troika-three-text)\n>\n> as dependencies in your project to use `r3f-form`.\n\n### Install\n\n```sh\nnpm install r3f-form\n# or, if using yarn\nyarn install r3f-form\n```\n\n# How to use\n\n## Forms\n\nIn order to create a form, just wrap any relevant elements in a `<Form>`:\n\n```tsx\nimport { Form, Input, Label, Submit } from \"r3f-form\";\n\nexport function MyForm() {\n  return (\n    <Form>\n      <Label text=\"username\" />\n      <Input name=\"username\" />\n\n      <Label text=\"password\" />\n      <Input name=\"password\" type=\"password\" />\n\n      <Submit value=\"Login\" />\n    </Form>\n  );\n}\n```\n\n> Note that each element in the form will require a `name` prop in order to be picked up in submission, just like in a normal DOM form element\n\nThe relevant inputs will be bound to respective DOM elements under the hood, and be rendered into the 3D scene like so:\n\n![image](https://user-images.githubusercontent.com/1373954/217718779-816da536-00af-4375-85dd-de707e79aa8d.png)\n\nYou can define submission behavior just like with any old HTML `<form>`:\n\n```tsx\n// redirect to a login script\n<Form action=\"/login.php\"></Form>;\n\n// or handle it with a callback\nconst handleSubmit = (e: FormEvent) => {\n  e.preventDefault();\n\n  const data = new FormData(e.target);\n\n  for (let [name, value] of data.entries()) {\n    console.log(`${name}: ${value}`);\n  }\n};\n\n<Form onSubmit={handleSubmit}></Form>;\n```\n\n## Inputs\n\nAn editable text-box bound to an DOM `<input>` and represented in the webGL canvas.\n\n```ts\ntype Props = {\n  type?: \"text\" | \"password\";\n\n  /** width of the container */\n  width?: number;\n  backgroundColor?: Color;\n  selectionColor?: Color;\n  backgroundOpacity?: number;\n\n  /** [left/right , top/bottom] in THREE units, respectively\n   *\n   * note that height is implicitly defined by the capHeight of the rendered\n   * text. The cap height is dependant on both the `textProps.font` being used and the\n   * `textProps.fontSize` value\n   */\n  padding?: Vector2;\n  cursorWidth?: number;\n\n  /** 3D transformations */\n  position: Vector3;\n  rotation: Euler;\n  scale: Vector3;\n\n  // And ALL props available to DOM <input>s\n};\n```\n\nCreate a basic input field like so:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\nexport function MyInput() {\n  return (\n    <>\n      <Label text=\"label\" />\n      <Input />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718847-acb169ed-95ff-4def-a126-491c648346b9.png)\n\nYou can access the value of the input via the `onChange` callback prop:\n\n> The callback is passed the `ChangeEvent` object from the underlying HTML `<input>`s\n> change event on every change.\n>\n> Read more about this event [here](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/change_event)\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\nexport function MyInput() {\n  const [username, setUsername] = React.useState(\"\");\n  // username will always contain the current value\n\n  function handleChange(e) {\n    setUsername(ev.target.value);\n  }\n\n  return (\n    <>\n      <Label text=\"Test Input\" />\n      <Input onChange={handleChange} />\n    </>\n  );\n}\n```\n\nYou can also create password inputs:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\nexport function MyPassword() {\n  return (\n    <>\n      <Label text=\"Password\" />\n      <Input type=\"password\" />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718412-48158e10-53b2-4e79-86c9-54bc5495521a.png)\n\nAdd custom padding to the text container:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\n/*\n * padding: [horizontal padding, vertical padding] in THREE units\n */\n\nexport function MyInput() {\n  return (\n    <>\n      <Label text=\"Label\" />\n      <Input padding={[0.05, 0.5]} />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718475-1c696ff1-3b1d-4559-9d02-9535bd59cdff.png)\n\n---\n\n## Textarea\n\n```ts\ntype Props = {\n  /** width of the container */\n  width?: number;\n\n  backgroundColor?: Color;\n  backgroundOpacity?: number;\n  selectionColor?: Color;\n\n  /** [left/right , top/bottom] in THREE units, respectively\n   *\n   * note that height is implicitly defined by the capHeight of the rendered\n   * text. The cap height is dependant on both the `textProps.font` being used\n   * and the `textProps.fontSize` value\n   */\n  padding?: Vector2;\n  cursorWidth?: number;\n\n  /** 3D transformations */\n  position: Vector3;\n  rotation: Euler;\n  scale: Vector3;\n\n  // And ALL props available to DOM <textarea>s\n};\n```\n\nSimilar to the `<Input />` component, you can also create a `<Textarea />` like so:\n\n```tsx\nimport { Textarea, Label } from \"r3f-form\";\n\nexport function App() {\n  return (\n    <>\n      <Label text=\"Default Textarea:\" />\n      <Textarea />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718566-a718eab7-1e73-4559-96aa-8e14824f0031.png)\n\n---\n\n## Text\n\nIn order to configure the underlying `troika-three-text` instance\nthat is responsible for rendering the actual text, you can use the\n`<Text />` component.\n\nThere is a respective `<Text />` component for both `<Input />`s and\n`<Textarea />`s.\n\nFor all configuration options, check out the [troika docs](https://github.com/protectwise/troika/tree/main/packages/troika-three-text).\n\n> Note that **not all** of troika's props are exposed on these `<Text />`\n> components\n\nChange color and background opacity:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\nimport { Text } from \"r3f-form/Input\";\n\nexport function App() {\n  return (\n    <>\n      <Label text=\"Test Color/Opacity\" />\n      <Input backgroundOpacity={0.6} backgroundColor=\"black\">\n        <Text color=\"red\" />\n      </Input>\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718611-c2e4848e-8267-4926-9243-7bb61bced61d.png)\n\nIf you wanted to alter both an `<Input />` and a\n`<Textarea />` via their respective `<Text />` components\nyou could do the following:\n\n```tsx\nimport { Input, Textarea, Label } from \"r3f-form\";\nimport { Text as InputText } from \"r3f-form/Input\";\nimport { Text as TextareaText } from \"r3f-form/Textarea\";\n\nexport function App() {\n  return (\n    <>\n      <Label text=\"Test Color/Opacity\" />\n      <Input>\n        <InputText color=\"#red\" />\n      </Input>\n\n      <Label text=\"Test Textarea\" />\n      <Textarea>\n        <TextareaText color=\"red\" />\n      </Textarea>\n    </>\n  );\n}\n```\n\n---\n\n## Submit\n\nEquivalent to a DOM `<input type=\"submit\" />`, exposed as\nan independent component. By default it renders a button\nusing the following props:\n\n```ts\ntype Props = {\n  value?: string;\n  fontSize?: number;\n  width?: number;\n  height?: number;\n  color?: Color;\n  backgroundColor?: Color;\n\n  /** 3D transformations */\n  position: Vector3;\n  rotation: Euler;\n  scale: Vector3;\n\n  // And ALL props available to DOM <input>s\n};\n```\n\nAdd a simple submit button to your forms like so:\n\n```tsx\n<Form>\n  <Label text=\"Username\" />\n  <Input name=\"username\" />\n\n  <Label text=\"Password\" />\n  <Input name=\"password\" type=\"password\" />\n\n  <Submit value=\"Login\" />\n</Form>\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718665-c64f6653-f85f-4310-a1c7-f2cf43154f2e.png)\n\nWhile this provides a somewhat-customizable default button, the main purpose of this component\nis to provide a simple interface to use 3D elements to submit your forms. Any children passed in\nwill submit the form on click. For example:\n\n```tsx\n<Form>\n  . . .\n  <Submit value=\"submit\">\n    <MySubmitButton />\n  </Submit>\n</Form>\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718713-a0a6671f-3f1e-4817-9ee9-e205bcc22610.png)\n\nClicking on the big red button would submit the `<Form>`\n","readmeFilename":"README.md","gitHead":"0b8a681b7a8f4d860d5b4569b5702610354a643b","bugs":{"url":"https://github.com/JMBeresford/r3f-form/issues"},"homepage":"https://github.com/JMBeresford/r3f-form#readme","_id":"r3f-form@2.0.2-beta.10","_nodeVersion":"19.9.0","_npmVersion":"9.6.3","dist":{"integrity":"sha512-1KOTbmjMsA7snrp7D6sG6/Envq8eShOuMMsmB9OBMrPlexY8UVT3yT06JR2xcYLL/NZWsb8k6UvgDjVKQk/71w==","shasum":"0c92df8342993963841acfbae52954ce5d77ad9b","tarball":"https://registry.npmjs.org/r3f-form/-/r3f-form-2.0.2-beta.10.tgz","fileCount":50,"unpackedSize":107625,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGB5GX8H999qBHstakxUk6SBauOVhHiJx5xh78DBusOEAiAiL/zJJixBcMPnYKPHFKzeH/4JzVqdDMqyT+RZVLRZbA=="}]},"_npmUser":{"name":"jberesford","email":"volcaus@gmail.com"},"directories":{},"maintainers":[{"name":"jberesford","email":"volcaus@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/r3f-form_2.0.2-beta.10_1689202617139_0.19221196009575237"},"_hasShrinkwrap":false},"2.0.2-beta.11":{"name":"r3f-form","version":"2.0.2-beta.11","description":"A webGL input field component for use with React Three Fiber","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs.js"},"./Input":{"types":"./dist/Input/index.d.ts","import":"./dist/Input/index.js","require":"./dist/Input/index.cjs.js"},"./Textarea":{"types":"./dist/Textarea/index.d.ts","import":"./dist/Textarea/index.js","require":"./dist/Textarea/index.cjs.js"}},"publishConfig":{"access":"public"},"scripts":{"build":"rollup -c --bundleConfigAsCjs","typegen":"tsc --emitDeclarationOnly","lint":"eslint .","storybook":"start-storybook -p 6006","build-storybook":"build-storybook","semantic-release":"semantic-release --branches main","commit":"cz"},"author":{"name":"John Beresford"},"license":"MIT","devDependencies":{"@babel/core":"^7.20.7","@babel/plugin-transform-runtime":"^7.19.6","@babel/preset-env":"^7.20.2","@babel/preset-react":"^7.18.6","@babel/preset-typescript":"^7.18.6","@react-three/drei":"^9.48.6","@react-three/fiber":"^8.9.1","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-node-resolve":"^15.0.1","@rollup/plugin-terser":"^0.2.1","@rollup/plugin-typescript":"^10.0.1","@storybook/addon-actions":"^6.5.15","@storybook/addon-essentials":"^6.5.15","@storybook/addon-interactions":"^6.5.15","@storybook/addon-links":"^6.5.15","@storybook/builder-webpack4":"^6.5.15","@storybook/manager-webpack4":"^6.5.15","@storybook/react":"^6.5.15","@storybook/testing-library":"^0.0.13","@types/react":"^18.0.26","@types/react-dom":"^18.0.10","@types/three":"^0.146.0","@typescript-eslint/eslint-plugin":"^5.48.0","@typescript-eslint/parser":"^5.48.0","babel-loader":"^8.3.0","commitizen":"^4.3.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.31.0","eslint-config-prettier":"^8.6.0","eslint-plugin-import":"^2.26.0","eslint-plugin-prettier":"^4.2.1","eslint-plugin-react":"^7.31.11","eslint-plugin-react-hooks":"^4.6.0","react":"^18.2.0","react-dom":"^18.2.0","rollup":"^3.9.0","rollup-plugin-multi-input":"^1.3.1","semantic-release":"^19.0.5","three":"^0.148.0","troika-three-text":"^0.47.1","tslib":"^2.4.1","typescript":"^4.9.4"},"peerDependencies":{"@react-three/drei":">=9.0","@react-three/fiber":">=8.0","react":">=18.0","react-dom":">=18.0","three":">=0.146.0","troika-three-text":">=0.47.0"},"repository":{"type":"git","url":"git+https://github.com/JMBeresford/r3f-form.git"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"readme":"# r3f-form\n\n### [View examples](https://jmberesford.github.io/r3f-form/?path=/story/form--default-submit-button)\n\n> ## WARNING: UNDER HEAVY DEVELOPMENT\n>\n> Each release will aim to be a fully functional and usable release,\n> but breaking API changes WILL be likely for the forseeable future.\n\n## A webGL form component for use with React Three Fiber\n\n![image](https://user-images.githubusercontent.com/1373954/210024281-c735f61a-1a69-45e5-a5d3-147ed57a6c30.png)\n\nThis package aims to create a fully-functional and **accessible** `<Form />`\ncomponents that can be used within the [@react-three/fiber](https://github.com/pmndrs/react-three-fiber)\necosystem. Ultimately, the goal is to have fully functioning HTML `<form>`s -- with all viable input types -- rendered in webGL.\n\nCurrent implementation binds webGL elements to the existing state and event systems of respective\nhidden HTML DOM elements. There is a heavy reliance on\n[troika-three-text](https://github.com/protectwise/troika/tree/main/packages/troika-three-text)\nfor text-rendering and selection/caret logic.\n\n> Note that `r3f-form` will only work within a React-Three-Fiber Canvas element.\n> You **must** be using\n>\n> - [@react-three/fiber](https://github.com/pmndrs/react-three-fiber)\n> - [@react-three/drei](https://github.com/pmndrs/drei)\n> - [troika-three-text](https://github.com/protectwise/troika/tree/main/packages/troika-three-text)\n>\n> as dependencies in your project to use `r3f-form`.\n\n### Install\n\n```sh\nnpm install r3f-form\n# or, if using yarn\nyarn install r3f-form\n```\n\n# How to use\n\n## Forms\n\nIn order to create a form, just wrap any relevant elements in a `<Form>`:\n\n```tsx\nimport { Form, Input, Label, Submit } from \"r3f-form\";\n\nexport function MyForm() {\n  return (\n    <Form>\n      <Label text=\"username\" />\n      <Input name=\"username\" />\n\n      <Label text=\"password\" />\n      <Input name=\"password\" type=\"password\" />\n\n      <Submit value=\"Login\" />\n    </Form>\n  );\n}\n```\n\n> Note that each element in the form will require a `name` prop in order to be picked up in submission, just like in a normal DOM form element\n\nThe relevant inputs will be bound to respective DOM elements under the hood, and be rendered into the 3D scene like so:\n\n![image](https://user-images.githubusercontent.com/1373954/217718779-816da536-00af-4375-85dd-de707e79aa8d.png)\n\nYou can define submission behavior just like with any old HTML `<form>`:\n\n```tsx\n// redirect to a login script\n<Form action=\"/login.php\"></Form>;\n\n// or handle it with a callback\nconst handleSubmit = (e: FormEvent) => {\n  e.preventDefault();\n\n  const data = new FormData(e.target);\n\n  for (let [name, value] of data.entries()) {\n    console.log(`${name}: ${value}`);\n  }\n};\n\n<Form onSubmit={handleSubmit}></Form>;\n```\n\n## Inputs\n\nAn editable text-box bound to an DOM `<input>` and represented in the webGL canvas.\n\n```ts\ntype Props = {\n  type?: \"text\" | \"password\";\n\n  /** width of the container */\n  width?: number;\n  backgroundColor?: Color;\n  selectionColor?: Color;\n  backgroundOpacity?: number;\n\n  /** [left/right , top/bottom] in THREE units, respectively\n   *\n   * note that height is implicitly defined by the capHeight of the rendered\n   * text. The cap height is dependant on both the `textProps.font` being used and the\n   * `textProps.fontSize` value\n   */\n  padding?: Vector2;\n  cursorWidth?: number;\n\n  /** 3D transformations */\n  position: Vector3;\n  rotation: Euler;\n  scale: Vector3;\n\n  // And ALL props available to DOM <input>s\n};\n```\n\nCreate a basic input field like so:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\nexport function MyInput() {\n  return (\n    <>\n      <Label text=\"label\" />\n      <Input />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718847-acb169ed-95ff-4def-a126-491c648346b9.png)\n\nYou can access the value of the input via the `onChange` callback prop:\n\n> The callback is passed the `ChangeEvent` object from the underlying HTML `<input>`s\n> change event on every change.\n>\n> Read more about this event [here](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/change_event)\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\nexport function MyInput() {\n  const [username, setUsername] = React.useState(\"\");\n  // username will always contain the current value\n\n  function handleChange(e) {\n    setUsername(ev.target.value);\n  }\n\n  return (\n    <>\n      <Label text=\"Test Input\" />\n      <Input onChange={handleChange} />\n    </>\n  );\n}\n```\n\nYou can also create password inputs:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\nexport function MyPassword() {\n  return (\n    <>\n      <Label text=\"Password\" />\n      <Input type=\"password\" />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718412-48158e10-53b2-4e79-86c9-54bc5495521a.png)\n\nAdd custom padding to the text container:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\n/*\n * padding: [horizontal padding, vertical padding] in THREE units\n */\n\nexport function MyInput() {\n  return (\n    <>\n      <Label text=\"Label\" />\n      <Input padding={[0.05, 0.5]} />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718475-1c696ff1-3b1d-4559-9d02-9535bd59cdff.png)\n\n---\n\n## Textarea\n\n```ts\ntype Props = {\n  /** width of the container */\n  width?: number;\n\n  backgroundColor?: Color;\n  backgroundOpacity?: number;\n  selectionColor?: Color;\n\n  /** [left/right , top/bottom] in THREE units, respectively\n   *\n   * note that height is implicitly defined by the capHeight of the rendered\n   * text. The cap height is dependant on both the `textProps.font` being used\n   * and the `textProps.fontSize` value\n   */\n  padding?: Vector2;\n  cursorWidth?: number;\n\n  /** 3D transformations */\n  position: Vector3;\n  rotation: Euler;\n  scale: Vector3;\n\n  // And ALL props available to DOM <textarea>s\n};\n```\n\nSimilar to the `<Input />` component, you can also create a `<Textarea />` like so:\n\n```tsx\nimport { Textarea, Label } from \"r3f-form\";\n\nexport function App() {\n  return (\n    <>\n      <Label text=\"Default Textarea:\" />\n      <Textarea />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718566-a718eab7-1e73-4559-96aa-8e14824f0031.png)\n\n---\n\n## Text\n\nIn order to configure the underlying `troika-three-text` instance\nthat is responsible for rendering the actual text, you can use the\n`<Text />` component.\n\nThere is a respective `<Text />` component for both `<Input />`s and\n`<Textarea />`s.\n\nFor all configuration options, check out the [troika docs](https://github.com/protectwise/troika/tree/main/packages/troika-three-text).\n\n> Note that **not all** of troika's props are exposed on these `<Text />`\n> components\n\nChange color and background opacity:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\nimport { Text } from \"r3f-form/Input\";\n\nexport function App() {\n  return (\n    <>\n      <Label text=\"Test Color/Opacity\" />\n      <Input backgroundOpacity={0.6} backgroundColor=\"black\">\n        <Text color=\"red\" />\n      </Input>\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718611-c2e4848e-8267-4926-9243-7bb61bced61d.png)\n\nIf you wanted to alter both an `<Input />` and a\n`<Textarea />` via their respective `<Text />` components\nyou could do the following:\n\n```tsx\nimport { Input, Textarea, Label } from \"r3f-form\";\nimport { Text as InputText } from \"r3f-form/Input\";\nimport { Text as TextareaText } from \"r3f-form/Textarea\";\n\nexport function App() {\n  return (\n    <>\n      <Label text=\"Test Color/Opacity\" />\n      <Input>\n        <InputText color=\"#red\" />\n      </Input>\n\n      <Label text=\"Test Textarea\" />\n      <Textarea>\n        <TextareaText color=\"red\" />\n      </Textarea>\n    </>\n  );\n}\n```\n\n---\n\n## Submit\n\nEquivalent to a DOM `<input type=\"submit\" />`, exposed as\nan independent component. By default it renders a button\nusing the following props:\n\n```ts\ntype Props = {\n  value?: string;\n  fontSize?: number;\n  width?: number;\n  height?: number;\n  color?: Color;\n  backgroundColor?: Color;\n\n  /** 3D transformations */\n  position: Vector3;\n  rotation: Euler;\n  scale: Vector3;\n\n  // And ALL props available to DOM <input>s\n};\n```\n\nAdd a simple submit button to your forms like so:\n\n```tsx\n<Form>\n  <Label text=\"Username\" />\n  <Input name=\"username\" />\n\n  <Label text=\"Password\" />\n  <Input name=\"password\" type=\"password\" />\n\n  <Submit value=\"Login\" />\n</Form>\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718665-c64f6653-f85f-4310-a1c7-f2cf43154f2e.png)\n\nWhile this provides a somewhat-customizable default button, the main purpose of this component\nis to provide a simple interface to use 3D elements to submit your forms. Any children passed in\nwill submit the form on click. For example:\n\n```tsx\n<Form>\n  . . .\n  <Submit value=\"submit\">\n    <MySubmitButton />\n  </Submit>\n</Form>\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718713-a0a6671f-3f1e-4817-9ee9-e205bcc22610.png)\n\nClicking on the big red button would submit the `<Form>`\n","readmeFilename":"README.md","gitHead":"0b8a681b7a8f4d860d5b4569b5702610354a643b","bugs":{"url":"https://github.com/JMBeresford/r3f-form/issues"},"homepage":"https://github.com/JMBeresford/r3f-form#readme","_id":"r3f-form@2.0.2-beta.11","_nodeVersion":"19.9.0","_npmVersion":"9.6.3","dist":{"integrity":"sha512-lqGtWh7QbGANas4P9OgTfBSTl2cwkQ57DMtZhzkqHx6fV1BTTvWFnvaHfTrCEBlZuQYab2sN5SwvKr6YGcM1cA==","shasum":"8d13b68440330cc8c485c8d19cfb3e16fe385874","tarball":"https://registry.npmjs.org/r3f-form/-/r3f-form-2.0.2-beta.11.tgz","fileCount":50,"unpackedSize":107625,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCwMCEFYI0uT7TS82tRC8epxPTrqXgSShUITN+DmXxeswIhAJ2b1tES18PvuzmDUS5xqClvoTus4cq4YtFjWQP4d+LX"}]},"_npmUser":{"name":"jberesford","email":"volcaus@gmail.com"},"directories":{},"maintainers":[{"name":"jberesford","email":"volcaus@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/r3f-form_2.0.2-beta.11_1689202686035_0.7693678154362422"},"_hasShrinkwrap":false},"3.0.0":{"name":"r3f-form","version":"3.0.0","description":"A webGL input field component for use with React Three Fiber","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs.js"},"./Input":{"types":"./dist/Input/index.d.ts","import":"./dist/Input/index.js","require":"./dist/Input/index.cjs.js"},"./Textarea":{"types":"./dist/Textarea/index.d.ts","import":"./dist/Textarea/index.js","require":"./dist/Textarea/index.cjs.js"}},"publishConfig":{"access":"public"},"scripts":{"build":"rollup -c --bundleConfigAsCjs","typegen":"tsc --emitDeclarationOnly","lint":"eslint .","storybook":"start-storybook -p 6006","build-storybook":"build-storybook","semantic-release":"semantic-release --branches main","commit":"cz"},"author":{"name":"John Beresford"},"license":"MIT","devDependencies":{"@babel/core":"^7.20.7","@babel/plugin-transform-runtime":"^7.19.6","@babel/preset-env":"^7.20.2","@babel/preset-react":"^7.18.6","@babel/preset-typescript":"^7.18.6","@react-three/drei":"^9.48.6","@react-three/fiber":"^8.9.1","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-node-resolve":"^15.0.1","@rollup/plugin-terser":"^0.2.1","@rollup/plugin-typescript":"^10.0.1","@storybook/addon-actions":"^6.5.15","@storybook/addon-essentials":"^6.5.15","@storybook/addon-interactions":"^6.5.15","@storybook/addon-links":"^6.5.15","@storybook/builder-webpack4":"^6.5.15","@storybook/manager-webpack4":"^6.5.15","@storybook/react":"^6.5.15","@storybook/testing-library":"^0.0.13","@types/react":"^18.0.26","@types/react-dom":"^18.0.10","@types/three":"^0.146.0","@typescript-eslint/eslint-plugin":"^5.48.0","@typescript-eslint/parser":"^5.48.0","babel-loader":"^8.3.0","commitizen":"^4.3.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.31.0","eslint-config-prettier":"^8.6.0","eslint-plugin-import":"^2.26.0","eslint-plugin-prettier":"^4.2.1","eslint-plugin-react":"^7.31.11","eslint-plugin-react-hooks":"^4.6.0","react":"^18.2.0","react-dom":"^18.2.0","rollup":"^3.9.0","rollup-plugin-multi-input":"^1.3.1","semantic-release":"^19.0.5","three":"^0.148.0","troika-three-text":"^0.47.1","tslib":"^2.4.1","typescript":"^4.9.4"},"peerDependencies":{"@react-three/drei":">=9.0","@react-three/fiber":">=8.0","react":">=18.0","react-dom":">=18.0","three":">=0.146.0","troika-three-text":">=0.47.0"},"repository":{"type":"git","url":"git+https://github.com/JMBeresford/r3f-form.git"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"gitHead":"c22d91519c770dd9f5211de992f14f9634b9da83","bugs":{"url":"https://github.com/JMBeresford/r3f-form/issues"},"homepage":"https://github.com/JMBeresford/r3f-form#readme","_id":"r3f-form@3.0.0","_nodeVersion":"16.20.1","_npmVersion":"8.19.3","dist":{"integrity":"sha512-INcAjIqtk3JJ/szSo+N6DBpGLpNFxFxAePGDxB3ZdYxG+iZANsm9rt5Z7EuSZ6XJY0Nl+bnRKEo1bAIU74rBSA==","shasum":"ebb2cf7d8f450dadcf6b6a5441f169c4d57a87e9","tarball":"https://registry.npmjs.org/r3f-form/-/r3f-form-3.0.0.tgz","fileCount":50,"unpackedSize":107617,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDwwg7upOeORR04IsdzvcXYgjLoLYqr1h3Ns5vR9vtrrgIhAOhOc0dl1fyWdEO+kjZGXtPrwSIFcMfTNGoyE26oXJlI"}]},"_npmUser":{"name":"jberesford","email":"volcaus@gmail.com"},"directories":{},"maintainers":[{"name":"jberesford","email":"volcaus@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/r3f-form_3.0.0_1689203216446_0.6029565276969264"},"_hasShrinkwrap":false},"3.0.1":{"name":"r3f-form","version":"3.0.1","description":"A webGL input field component for use with React Three Fiber","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs.js"},"./Input":{"types":"./dist/Input/index.d.ts","import":"./dist/Input/index.js","require":"./dist/Input/index.cjs.js"},"./Textarea":{"types":"./dist/Textarea/index.d.ts","import":"./dist/Textarea/index.js","require":"./dist/Textarea/index.cjs.js"}},"publishConfig":{"access":"public"},"scripts":{"build":"rollup -c --bundleConfigAsCjs","typegen":"tsc --emitDeclarationOnly","lint":"eslint .","storybook":"start-storybook -p 6006","build-storybook":"build-storybook","semantic-release":"semantic-release --branches main","commit":"cz"},"author":{"name":"John Beresford"},"license":"MIT","devDependencies":{"@babel/core":"^7.20.7","@babel/plugin-transform-runtime":"^7.19.6","@babel/preset-env":"^7.20.2","@babel/preset-react":"^7.18.6","@babel/preset-typescript":"^7.18.6","@react-three/fiber":"^8.9.1","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-node-resolve":"^15.0.1","@rollup/plugin-terser":"^0.2.1","@rollup/plugin-typescript":"^10.0.1","@storybook/addon-actions":"^6.5.15","@storybook/addon-essentials":"^6.5.15","@storybook/addon-interactions":"^6.5.15","@storybook/addon-links":"^6.5.15","@storybook/builder-webpack4":"^6.5.15","@storybook/manager-webpack4":"^6.5.15","@storybook/react":"^6.5.15","@storybook/testing-library":"^0.0.13","@types/react":"^18.0.26","@types/react-dom":"^18.0.10","@types/three":"^0.146.0","@typescript-eslint/eslint-plugin":"^5.48.0","@typescript-eslint/parser":"^5.48.0","babel-loader":"^8.3.0","commitizen":"^4.3.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.31.0","eslint-config-prettier":"^8.6.0","eslint-plugin-import":"^2.26.0","eslint-plugin-prettier":"^4.2.1","eslint-plugin-react":"^7.31.11","eslint-plugin-react-hooks":"^4.6.0","react":"^18.2.0","react-dom":"^18.2.0","rollup":"^3.9.0","rollup-plugin-multi-input":"^1.3.1","semantic-release":"^19.0.5","typescript":"^4.9.4"},"dependencies":{"three":"^0.148.0","troika-three-text":"^0.47.1","@react-three/drei":"^9.48.6","tslib":"^2.4.1"},"peerDependencies":{"@react-three/drei":">=9.0","@react-three/fiber":">=8.0","react":">=18.0","react-dom":">=18.0","three":">=0.146.0","troika-three-text":">=0.47.0"},"repository":{"type":"git","url":"git+https://github.com/JMBeresford/r3f-form.git"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"gitHead":"9c7350f13ab23791ace44a444411ec42df8f1a00","bugs":{"url":"https://github.com/JMBeresford/r3f-form/issues"},"homepage":"https://github.com/JMBeresford/r3f-form#readme","_id":"r3f-form@3.0.1","_nodeVersion":"16.20.1","_npmVersion":"8.19.3","dist":{"integrity":"sha512-dD7D3wMIhfVeRqDeLvQt8W+NL16lGcB8lFx2v0FuSdZOYrdhqevp9kawTl11jNTcr8wCfrPDLXzRZw8DvPOMiQ==","shasum":"ab04272c8dd531762ba10a4a583e6c7b42c955f0","tarball":"https://registry.npmjs.org/r3f-form/-/r3f-form-3.0.1.tgz","fileCount":50,"unpackedSize":107641,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDSg6lLL3E2ysVZ/UUPr9j9Uun4TS8g76shC7K4v5tntgIhAP6MtLxALANa6sW04PmGpt0VlVBnSuDWCXDSsOwkUGHN"}]},"_npmUser":{"name":"jberesford","email":"volcaus@gmail.com"},"directories":{},"maintainers":[{"name":"jberesford","email":"volcaus@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/r3f-form_3.0.1_1689204046014_0.5029228880636971"},"_hasShrinkwrap":false},"3.0.2":{"name":"r3f-form","version":"3.0.2","description":"An *accessible* webGL form component library for use with React Three Fiber","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs.js"},"./Input":{"types":"./dist/Input/index.d.ts","import":"./dist/Input/index.js","require":"./dist/Input/index.cjs.js"},"./Textarea":{"types":"./dist/Textarea/index.d.ts","import":"./dist/Textarea/index.js","require":"./dist/Textarea/index.cjs.js"}},"publishConfig":{"access":"public"},"scripts":{"build":"rollup -c --bundleConfigAsCjs","typegen":"tsc --emitDeclarationOnly","lint":"eslint .","storybook":"start-storybook -p 6006","build-storybook":"build-storybook","semantic-release":"semantic-release --branches main","commit":"cz"},"author":{"name":"John Beresford"},"license":"MIT","devDependencies":{"@babel/core":"^7.20.7","@babel/plugin-transform-runtime":"^7.19.6","@babel/preset-env":"^7.20.2","@babel/preset-react":"^7.18.6","@babel/preset-typescript":"^7.18.6","@react-three/fiber":"^8.9.1","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-node-resolve":"^15.0.1","@rollup/plugin-terser":"^0.2.1","@rollup/plugin-typescript":"^10.0.1","@storybook/addon-actions":"^6.5.15","@storybook/addon-essentials":"^6.5.15","@storybook/addon-interactions":"^6.5.15","@storybook/addon-links":"^6.5.15","@storybook/builder-webpack4":"^6.5.15","@storybook/manager-webpack4":"^6.5.15","@storybook/react":"^6.5.15","@storybook/testing-library":"^0.0.13","@types/react":"^18.0.26","@types/react-dom":"^18.0.10","@types/three":"^0.154.0","@typescript-eslint/eslint-plugin":"^5.48.0","@typescript-eslint/parser":"^5.48.0","babel-loader":"^8.3.0","commitizen":"^4.3.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.31.0","eslint-config-prettier":"^8.6.0","eslint-plugin-import":"^2.26.0","eslint-plugin-prettier":"^4.2.1","eslint-plugin-react":"^7.31.11","eslint-plugin-react-hooks":"^4.6.0","react":"^18.2.0","react-dom":"^18.2.0","rollup":"^3.9.0","rollup-plugin-multi-input":"^1.3.1","semantic-release":"^19.0.5","typescript":"^4.9.4"},"dependencies":{"@react-three/drei":"^9.78.2","three":">=0.146.0","troika-three-text":">=0.47.0","tslib":"^2.4.1"},"peerDependencies":{"@react-three/fiber":">=8.0","react":">=18.0","react-dom":">=18.0","three":">=0.146.0","troika-three-text":">=0.47.0"},"repository":{"type":"git","url":"git+https://github.com/JMBeresford/r3f-form.git"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"gitHead":"2da9498b7f3c8ab24a5f68d58074f3b014dfb869","bugs":{"url":"https://github.com/JMBeresford/r3f-form/issues"},"homepage":"https://github.com/JMBeresford/r3f-form#readme","_id":"r3f-form@3.0.2","_nodeVersion":"16.20.1","_npmVersion":"8.19.3","dist":{"integrity":"sha512-3SfSMgcs4S1PuOrBhFYYITFWYRxRb2k0VTMldEULs2pr2YxXI5fgzI99JZRvo1X/7FedG+PGwOr02e/fgDcxhA==","shasum":"74c8158cc44f0cc38d811527df16d76d64e66491","tarball":"https://registry.npmjs.org/r3f-form/-/r3f-form-3.0.2.tgz","fileCount":50,"unpackedSize":107718,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFvia/xUW8LBxuFtGhYQ9g/8yYA/94cH7k51UEICEugmAiBWFZeHa3AaRyui0oE8kdEu2qdUFPI5w0UikAelUOhvuA=="}]},"_npmUser":{"name":"jberesford","email":"volcaus@gmail.com"},"directories":{},"maintainers":[{"name":"jberesford","email":"volcaus@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/r3f-form_3.0.2_1689206321343_0.800963532406594"},"_hasShrinkwrap":false},"3.0.3-beta.0":{"version":"3.0.3-beta.0","name":"r3f-form","description":"An *accessible* webGL form component library for use with React Three Fiber","main":"dist/index.cjs.js","module":"dist/index.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.es.js","require":"./dist/index.cjs.js"},"./Input":{"types":"./dist/input/input.d.ts","import":"./dist/input.es.js","require":"./dist/input.cjs.js"},"./Textarea":{"types":"./dist/textarea/index.d.ts","import":"./dist/textarea/index.es.js","require":"./dist/textarea/index.cjs.js"}},"publishConfig":{"access":"public"},"scripts":{"dev":"vite","build":"tsc && vite build","lint":"eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0","preview":"vite preview","commit":"cz","semantic-release":"semantic-release --branches main","storybook":"storybook dev -p 6006","build-storybook":"storybook build"},"author":{"name":"John Beresford"},"license":"MIT","devDependencies":{"@storybook/addon-essentials":"^7.6.17","@storybook/addon-interactions":"^7.6.17","@storybook/addon-links":"^7.6.17","@storybook/addon-onboarding":"^1.0.11","@storybook/blocks":"^7.6.17","@storybook/jest":"^0.2.3","@storybook/react":"^7.6.17","@storybook/react-vite":"^7.6.17","@storybook/test":"^7.6.17","@storybook/testing-library":"^0.2.2","@types/react":"^18.2.56","@types/react-dom":"^18.2.19","@types/three":"^0.155.1","@typescript-eslint/eslint-plugin":"^7.0.2","@typescript-eslint/parser":"^7.0.2","@vitejs/plugin-react":"^4.2.1","commitizen":"^4.3.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.56.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","eslint-plugin-react":"^7.31.11","eslint-plugin-react-hooks":"^4.6.0","eslint-plugin-react-refresh":"^0.4.5","eslint-plugin-storybook":"^0.8.0","prettier":"^3.0.0","semantic-release":"^23.0.2","storybook":"^7.6.17","tslib":"^2.6.2","typescript":"^5.2.2","vite":"^5.1.4"},"dependencies":{"react":">=18.0","react-dom":">=18.0","three":">=0.146.0","troika-three-text":"^0.49.0","vite-plugin-dts":"^3.7.3"},"peerDependencies":{"@react-three/drei":">=9.0","@react-three/fiber":">=8.0","react":">=18.0","react-dom":">=18.0","three":">=0.146.0"},"repository":{"type":"git","url":"git+https://github.com/JMBeresford/r3f-form.git"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"readme":"# React + TypeScript + Vite\n\nThis template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.\n\nCurrently, two official plugins are available:\n\n- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh\n- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh\n\n## Expanding the ESLint configuration\n\nIf you are developing a production application, we recommend updating the configuration to enable type aware lint rules:\n\n- Configure the top-level `parserOptions` property like this:\n\n```js\nexport default {\n  // other rules...\n  parserOptions: {\n    ecmaVersion: 'latest',\n    sourceType: 'module',\n    project: ['./tsconfig.json', './tsconfig.node.json'],\n    tsconfigRootDir: __dirname,\n  },\n}\n```\n\n- Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked`\n- Optionally add `plugin:@typescript-eslint/stylistic-type-checked`\n- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list\n","readmeFilename":"README.md","gitHead":"e40660281ed35ebf8004c8f08a00d90e715f9a59","bugs":{"url":"https://github.com/JMBeresford/r3f-form/issues"},"homepage":"https://github.com/JMBeresford/r3f-form#readme","_id":"r3f-form@3.0.3-beta.0","_nodeVersion":"19.9.0","_npmVersion":"9.6.3","dist":{"integrity":"sha512-1dRNwiTZ2i3SuTNqKv7knzPoDLzJPbYZzGP9EIfcNEjjGsy6GCxbFx2ah5o9dYwSBJc9vueoGFflr0Wqm88gvw==","shasum":"8113fa191b6f31313b308a78f17338452857a0c5","tarball":"https://registry.npmjs.org/r3f-form/-/r3f-form-3.0.3-beta.0.tgz","fileCount":31,"unpackedSize":2844953,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDnApk1upjJ41PjWXpuzR3q5nzIeikVJhOxBUxFmEd0IAiAObkMwRGAw/GPa88KxnzJw7YOzjZmY0yWYZHxQ/FQblQ=="}]},"_npmUser":{"name":"jberesford","email":"volcaus@gmail.com"},"directories":{},"maintainers":[{"name":"jberesford","email":"volcaus@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/r3f-form_3.0.3-beta.0_1710010001937_0.9654677158684408"},"_hasShrinkwrap":false},"3.0.3-beta.1":{"version":"3.0.3-beta.1","name":"r3f-form","description":"An *accessible* webGL form component library for use with React Three Fiber","main":"dist/index.cjs.js","module":"dist/index.es.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.es.js","require":"./dist/index.cjs.js"},"./Input":{"types":"./dist/Input/input.d.ts","import":"./dist/input.es.js","require":"./dist/input.cjs.js"},"./Textarea":{"types":"./dist/Textarea/index.d.ts","import":"./dist/textarea/index.es.js","require":"./dist/textarea/index.cjs.js"}},"publishConfig":{"access":"public"},"scripts":{"dev":"vite","build":"tsc && vite build","lint":"eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0","preview":"vite preview","commit":"cz","semantic-release":"semantic-release --branches main","storybook":"storybook dev -p 6006","build-storybook":"storybook build"},"author":{"name":"John Beresford"},"license":"MIT","devDependencies":{"@storybook/addon-essentials":"^7.6.17","@storybook/addon-interactions":"^7.6.17","@storybook/addon-links":"^7.6.17","@storybook/addon-onboarding":"^1.0.11","@storybook/blocks":"^7.6.17","@storybook/jest":"^0.2.3","@storybook/react":"^7.6.17","@storybook/react-vite":"^7.6.17","@storybook/test":"^7.6.17","@storybook/testing-library":"^0.2.2","@types/react":"^18.2.56","@types/react-dom":"^18.2.19","@types/three":"^0.155.1","@typescript-eslint/eslint-plugin":"^7.0.2","@typescript-eslint/parser":"^7.0.2","@vitejs/plugin-react":"^4.2.1","commitizen":"^4.3.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.56.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","eslint-plugin-react":"^7.31.11","eslint-plugin-react-hooks":"^4.6.0","eslint-plugin-react-refresh":"^0.4.5","eslint-plugin-storybook":"^0.8.0","prettier":"^3.0.0","semantic-release":"^23.0.2","storybook":"^7.6.17","tslib":"^2.6.2","typescript":"^5.2.2","vite":"^5.1.4"},"dependencies":{"react":">=18.0","react-dom":">=18.0","three":">=0.146.0","troika-three-text":"^0.49.0","vite-plugin-dts":"^3.7.3"},"peerDependencies":{"@react-three/drei":">=9.0","@react-three/fiber":">=8.0","react":">=18.0","react-dom":">=18.0","three":">=0.146.0"},"repository":{"type":"git","url":"git+https://github.com/JMBeresford/r3f-form.git"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"readme":"# React + TypeScript + Vite\n\nThis template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.\n\nCurrently, two official plugins are available:\n\n- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh\n- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh\n\n## Expanding the ESLint configuration\n\nIf you are developing a production application, we recommend updating the configuration to enable type aware lint rules:\n\n- Configure the top-level `parserOptions` property like this:\n\n```js\nexport default {\n  // other rules...\n  parserOptions: {\n    ecmaVersion: 'latest',\n    sourceType: 'module',\n    project: ['./tsconfig.json', './tsconfig.node.json'],\n    tsconfigRootDir: __dirname,\n  },\n}\n```\n\n- Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked`\n- Optionally add `plugin:@typescript-eslint/stylistic-type-checked`\n- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list\n","readmeFilename":"README.md","gitHead":"e40660281ed35ebf8004c8f08a00d90e715f9a59","bugs":{"url":"https://github.com/JMBeresford/r3f-form/issues"},"homepage":"https://github.com/JMBeresford/r3f-form#readme","_id":"r3f-form@3.0.3-beta.1","_nodeVersion":"19.9.0","_npmVersion":"9.6.3","dist":{"integrity":"sha512-WwvufHxxOyhnn7FA9inFPJlyxm3B1zWoZ3F0iPImQCpLF7JholZ9WPmWEo4AvBFbAOlOT3nWGJTw0qcgzSrvRQ==","shasum":"2b79ced14f7ca2ec75f19c480a25c4afd8b9108e","tarball":"https://registry.npmjs.org/r3f-form/-/r3f-form-3.0.3-beta.1.tgz","fileCount":31,"unpackedSize":2844953,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCxouzRH5tQ6pPH6fguzlwmHZjtNPzp/lYC+3xIxjiLqAIgHQXRuBaKzV6V13BcfTqJJjUCtNYisIEPp6dIOOaMdXk="}]},"_npmUser":{"name":"jberesford","email":"volcaus@gmail.com"},"directories":{},"maintainers":[{"name":"jberesford","email":"volcaus@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/r3f-form_3.0.3-beta.1_1710010437478_0.5748140080775399"},"_hasShrinkwrap":false},"3.0.3-beta.2":{"version":"3.0.3-beta.2","name":"r3f-form","description":"An *accessible* webGL form component library for use with React Three Fiber","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.es.js","require":"./dist/index.cjs.js"},"./Input":{"types":"./dist/input/index.d.ts","import":"./dist/input.es.js","require":"./dist/input.cjs.js"},"./Textarea":{"types":"./dist/textarea/index.d.ts","import":"./dist/textarea/index.es.js","require":"./dist/textarea/index.cjs.js"}},"publishConfig":{"access":"public"},"scripts":{"dev":"vite","build":"tsc && vite build","lint":"eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0","preview":"vite preview","commit":"cz","semantic-release":"semantic-release --branches main","storybook":"storybook dev -p 6006","build-storybook":"storybook build"},"author":{"name":"John Beresford"},"license":"MIT","devDependencies":{"@storybook/addon-essentials":"^7.6.17","@storybook/addon-interactions":"^7.6.17","@storybook/addon-links":"^7.6.17","@storybook/addon-onboarding":"^1.0.11","@storybook/blocks":"^7.6.17","@storybook/jest":"^0.2.3","@storybook/react":"^7.6.17","@storybook/react-vite":"^7.6.17","@storybook/test":"^7.6.17","@storybook/testing-library":"^0.2.2","@types/react":"^18.2.56","@types/react-dom":"^18.2.19","@types/three":"^0.155.1","@typescript-eslint/eslint-plugin":"^7.0.2","@typescript-eslint/parser":"^7.0.2","@vitejs/plugin-react":"^4.2.1","commitizen":"^4.3.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.56.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","eslint-plugin-react":"^7.31.11","eslint-plugin-react-hooks":"^4.6.0","eslint-plugin-react-refresh":"^0.4.5","eslint-plugin-storybook":"^0.8.0","prettier":"^3.0.0","semantic-release":"^23.0.2","storybook":"^7.6.17","tslib":"^2.6.2","typescript":"^5.2.2","vite":"^5.1.4"},"dependencies":{"react":">=18.0","react-dom":">=18.0","three":">=0.146.0","troika-three-text":"^0.49.0","vite-plugin-dts":"^3.7.3"},"peerDependencies":{"@react-three/drei":">=9.0","@react-three/fiber":">=8.0","react":">=18.0","react-dom":">=18.0","three":">=0.146.0"},"repository":{"type":"git","url":"git+https://github.com/JMBeresford/r3f-form.git"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"readme":"# React + TypeScript + Vite\n\nThis template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.\n\nCurrently, two official plugins are available:\n\n- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh\n- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh\n\n## Expanding the ESLint configuration\n\nIf you are developing a production application, we recommend updating the configuration to enable type aware lint rules:\n\n- Configure the top-level `parserOptions` property like this:\n\n```js\nexport default {\n  // other rules...\n  parserOptions: {\n    ecmaVersion: 'latest',\n    sourceType: 'module',\n    project: ['./tsconfig.json', './tsconfig.node.json'],\n    tsconfigRootDir: __dirname,\n  },\n}\n```\n\n- Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked`\n- Optionally add `plugin:@typescript-eslint/stylistic-type-checked`\n- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list\n","readmeFilename":"README.md","gitHead":"e40660281ed35ebf8004c8f08a00d90e715f9a59","bugs":{"url":"https://github.com/JMBeresford/r3f-form/issues"},"homepage":"https://github.com/JMBeresford/r3f-form#readme","_id":"r3f-form@3.0.3-beta.2","_nodeVersion":"19.9.0","_npmVersion":"9.6.3","dist":{"integrity":"sha512-VsqIauULttIx090T7DVKolfQYj63mkBTQnl2geqKyUtI8Mw75lI8muy/+7WrYV5CWhd614aHEL8JAiNLUkFVEQ==","shasum":"decd2ec4fbc6482633ad9f346da05691e018db92","tarball":"https://registry.npmjs.org/r3f-form/-/r3f-form-3.0.3-beta.2.tgz","fileCount":31,"unpackedSize":2844983,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCvvmHHyopVQcU2hi287tWJuuZ62Nu6+PKGZUrS9PBXXAIhAIbHytj06RJTEPhuhLXnaoqAtbrWPz6+O91YGPqnawnT"}]},"_npmUser":{"name":"jberesford","email":"volcaus@gmail.com"},"directories":{},"maintainers":[{"name":"jberesford","email":"volcaus@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/r3f-form_3.0.3-beta.2_1710011005034_0.46092534066323587"},"_hasShrinkwrap":false},"3.0.3-beta.3":{"version":"3.0.3-beta.3","name":"r3f-form","description":"An *accessible* webGL form component library for use with React Three Fiber","type":"module","main":"dist/index.cjs.js","module":"dist/index.es.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.es.js","require":"./dist/index.cjs.js"},"./Input":{"types":"./dist/input/index.d.ts","import":"./dist/input.es.js","require":"./dist/input.cjs.js"},"./Textarea":{"types":"./dist/textarea/index.d.ts","import":"./dist/textarea/index.es.js","require":"./dist/textarea/index.cjs.js"}},"publishConfig":{"access":"public"},"scripts":{"dev":"vite","build":"tsc && vite build","lint":"eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0","preview":"vite preview","commit":"cz","semantic-release":"semantic-release --branches main","storybook":"storybook dev -p 6006","build-storybook":"storybook build"},"author":{"name":"John Beresford"},"license":"MIT","devDependencies":{"@storybook/addon-essentials":"^7.6.17","@storybook/addon-interactions":"^7.6.17","@storybook/addon-links":"^7.6.17","@storybook/addon-onboarding":"^1.0.11","@storybook/blocks":"^7.6.17","@storybook/jest":"^0.2.3","@storybook/react":"^7.6.17","@storybook/react-vite":"^7.6.17","@storybook/test":"^7.6.17","@storybook/testing-library":"^0.2.2","@types/react":"^18.2.56","@types/react-dom":"^18.2.19","@types/three":"^0.155.1","@typescript-eslint/eslint-plugin":"^7.0.2","@typescript-eslint/parser":"^7.0.2","@vitejs/plugin-react":"^4.2.1","commitizen":"^4.3.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.56.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","eslint-plugin-react":"^7.31.11","eslint-plugin-react-hooks":"^4.6.0","eslint-plugin-react-refresh":"^0.4.5","eslint-plugin-storybook":"^0.8.0","prettier":"^3.0.0","semantic-release":"^23.0.2","storybook":"^7.6.17","tslib":"^2.6.2","typescript":"^5.2.2","vite-plugin-dts":"^3.7.3","vite":"^5.1.4"},"dependencies":{"react":">=18.0","react-dom":">=18.0","three":">=0.146.0","troika-three-text":"^0.49.0"},"peerDependencies":{"@react-three/drei":">=9.0","@react-three/fiber":">=8.0","react":">=18.0","react-dom":">=18.0","three":">=0.146.0"},"repository":{"type":"git","url":"git+https://github.com/JMBeresford/r3f-form.git"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"readme":"# React + TypeScript + Vite\n\nThis template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.\n\nCurrently, two official plugins are available:\n\n- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh\n- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh\n\n## Expanding the ESLint configuration\n\nIf you are developing a production application, we recommend updating the configuration to enable type aware lint rules:\n\n- Configure the top-level `parserOptions` property like this:\n\n```js\nexport default {\n  // other rules...\n  parserOptions: {\n    ecmaVersion: 'latest',\n    sourceType: 'module',\n    project: ['./tsconfig.json', './tsconfig.node.json'],\n    tsconfigRootDir: __dirname,\n  },\n}\n```\n\n- Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked`\n- Optionally add `plugin:@typescript-eslint/stylistic-type-checked`\n- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list\n","readmeFilename":"README.md","gitHead":"e40660281ed35ebf8004c8f08a00d90e715f9a59","bugs":{"url":"https://github.com/JMBeresford/r3f-form/issues"},"homepage":"https://github.com/JMBeresford/r3f-form#readme","_id":"r3f-form@3.0.3-beta.3","_nodeVersion":"19.9.0","_npmVersion":"9.6.3","dist":{"integrity":"sha512-3ZTBBf0YAu/1aw0yuDjm7jogm3UzPaC/k4n/+TME4BUzT1T1MqDXEZAT/H+vyip+r6s1k+eu8M7nvU96m9rpGQ==","shasum":"643019ec67b62d996256020fa1156e0eefd88c2b","tarball":"https://registry.npmjs.org/r3f-form/-/r3f-form-3.0.3-beta.3.tgz","fileCount":31,"unpackedSize":88472,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCGQGr4Y8gb3CzQt47fuyJopN1HSchPppql3D4qYJltywIhALPUGo5TUxUYvP58r38mBfKFVTrV3+r4rRumz90bMXRN"}]},"_npmUser":{"name":"jberesford","email":"volcaus@gmail.com"},"directories":{},"maintainers":[{"name":"jberesford","email":"volcaus@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/r3f-form_3.0.3-beta.3_1710021594874_0.138452209592556"},"_hasShrinkwrap":false},"3.0.3-beta.4":{"version":"3.0.3-beta.4","name":"r3f-form","description":"An *accessible* webGL form component library for use with React Three Fiber","type":"module","module":"dist/index.js","types":"dist/index.d.ts","publishConfig":{"access":"public"},"scripts":{"dev":"vite","build":"tsc && vite build","lint":"eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0","preview":"vite preview","commit":"cz","semantic-release":"semantic-release --branches main","storybook":"storybook dev -p 6006","build-storybook":"storybook build"},"author":{"name":"John Beresford"},"license":"MIT","devDependencies":{"@storybook/addon-essentials":"^7.6.17","@storybook/addon-interactions":"^7.6.17","@storybook/addon-links":"^7.6.17","@storybook/addon-onboarding":"^1.0.11","@storybook/blocks":"^7.6.17","@storybook/jest":"^0.2.3","@storybook/react":"^7.6.17","@storybook/react-vite":"^7.6.17","@storybook/test":"^7.6.17","@storybook/testing-library":"^0.2.2","@types/react":"^18.2.56","@types/react-dom":"^18.2.19","@types/three":"^0.155.1","@typescript-eslint/eslint-plugin":"^7.0.2","@typescript-eslint/parser":"^7.0.2","@vitejs/plugin-react":"^4.2.1","commitizen":"^4.3.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.56.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","eslint-plugin-react":"^7.31.11","eslint-plugin-react-hooks":"^4.6.0","eslint-plugin-react-refresh":"^0.4.5","eslint-plugin-storybook":"^0.8.0","glob":"^10.3.10","prettier":"^3.0.0","semantic-release":"^23.0.2","storybook":"^7.6.17","tslib":"^2.6.2","typescript":"^5.2.2","vite":"^5.1.4","vite-plugin-dts":"^3.7.3"},"dependencies":{"react":">=18.0","react-dom":">=18.0","three":">=0.146.0"},"peerDependencies":{"@react-three/drei":">=9.0","@react-three/fiber":">=8.0","react":">=18.0","troika-three-text":"^0.49.0","react-dom":">=18.0","three":">=0.146.0"},"repository":{"type":"git","url":"git+https://github.com/JMBeresford/r3f-form.git"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"readme":"# React + TypeScript + Vite\n\nThis template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.\n\nCurrently, two official plugins are available:\n\n- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh\n- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh\n\n## Expanding the ESLint configuration\n\nIf you are developing a production application, we recommend updating the configuration to enable type aware lint rules:\n\n- Configure the top-level `parserOptions` property like this:\n\n```js\nexport default {\n  // other rules...\n  parserOptions: {\n    ecmaVersion: 'latest',\n    sourceType: 'module',\n    project: ['./tsconfig.json', './tsconfig.node.json'],\n    tsconfigRootDir: __dirname,\n  },\n}\n```\n\n- Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked`\n- Optionally add `plugin:@typescript-eslint/stylistic-type-checked`\n- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list\n","readmeFilename":"README.md","gitHead":"e40660281ed35ebf8004c8f08a00d90e715f9a59","bugs":{"url":"https://github.com/JMBeresford/r3f-form/issues"},"homepage":"https://github.com/JMBeresford/r3f-form#readme","_id":"r3f-form@3.0.3-beta.4","_nodeVersion":"19.9.0","_npmVersion":"9.6.3","dist":{"integrity":"sha512-3YhYWsA9mpUwVTKqWko9Cb1cjxOyf3hM4KUEFf3QOqMylCxE1LDBUyZA3K5X7bQXw7bqUotvqedI8hNqB5K41A==","shasum":"96aa75d655cdb2a52890f0b2a796f7eaa35b2a3a","tarball":"https://registry.npmjs.org/r3f-form/-/r3f-form-3.0.3-beta.4.tgz","fileCount":19,"unpackedSize":33973,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD+PJW3qy6TN6E83MKtNhAkMF3WX9kNODOCJj4AqhXkkgIhAO8zJKwtWfj00cNOUpW4cov7tSkkmwLjRELp9xiME7Y4"}]},"_npmUser":{"name":"jberesford","email":"volcaus@gmail.com"},"directories":{},"maintainers":[{"name":"jberesford","email":"volcaus@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/r3f-form_3.0.3-beta.4_1710025023357_0.003205963433484005"},"_hasShrinkwrap":false},"3.0.3-beta.5":{"version":"3.0.3-beta.5","name":"r3f-form","description":"An *accessible* webGL form component library for use with React Three Fiber","type":"module","module":"dist/index.js","types":"dist/index.d.ts","publishConfig":{"access":"public"},"scripts":{"dev":"vite","build":"tsc && vite build","lint":"eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0","preview":"vite preview","commit":"cz","semantic-release":"semantic-release --branches main","storybook":"storybook dev -p 6006","build-storybook":"storybook build"},"author":{"name":"John Beresford"},"license":"MIT","devDependencies":{"@storybook/addon-essentials":"^7.6.17","@storybook/addon-interactions":"^7.6.17","@storybook/addon-links":"^7.6.17","@storybook/addon-onboarding":"^1.0.11","@storybook/blocks":"^7.6.17","@storybook/jest":"^0.2.3","@storybook/react":"^7.6.17","@storybook/react-vite":"^7.6.17","@storybook/test":"^7.6.17","@storybook/testing-library":"^0.2.2","@types/react":"^18.2.56","@types/react-dom":"^18.2.19","@types/three":"^0.155.1","@typescript-eslint/eslint-plugin":"^7.0.2","@typescript-eslint/parser":"^7.0.2","@vitejs/plugin-react":"^4.2.1","commitizen":"^4.3.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.56.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","eslint-plugin-react":"^7.31.11","eslint-plugin-react-hooks":"^4.6.0","eslint-plugin-react-refresh":"^0.4.5","eslint-plugin-storybook":"^0.8.0","glob":"^10.3.10","prettier":"^3.0.0","semantic-release":"^23.0.2","storybook":"^7.6.17","tslib":"^2.6.2","typescript":"^5.2.2","vite":"^5.1.4","vite-plugin-dts":"^3.7.3"},"dependencies":{"react":">=18.0","react-dom":">=18.0","three":">=0.146.0"},"peerDependencies":{"@react-three/drei":">=9.0","@react-three/fiber":">=8.0","react":">=18.0","troika-three-text":"^0.49.0","react-dom":">=18.0","three":">=0.146.0"},"repository":{"type":"git","url":"git+https://github.com/JMBeresford/r3f-form.git"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"readme":"# React + TypeScript + Vite\n\nThis template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.\n\nCurrently, two official plugins are available:\n\n- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh\n- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh\n\n## Expanding the ESLint configuration\n\nIf you are developing a production application, we recommend updating the configuration to enable type aware lint rules:\n\n- Configure the top-level `parserOptions` property like this:\n\n```js\nexport default {\n  // other rules...\n  parserOptions: {\n    ecmaVersion: 'latest',\n    sourceType: 'module',\n    project: ['./tsconfig.json', './tsconfig.node.json'],\n    tsconfigRootDir: __dirname,\n  },\n}\n```\n\n- Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked`\n- Optionally add `plugin:@typescript-eslint/stylistic-type-checked`\n- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list\n","readmeFilename":"README.md","gitHead":"e40660281ed35ebf8004c8f08a00d90e715f9a59","bugs":{"url":"https://github.com/JMBeresford/r3f-form/issues"},"homepage":"https://github.com/JMBeresford/r3f-form#readme","_id":"r3f-form@3.0.3-beta.5","_nodeVersion":"19.9.0","_npmVersion":"9.6.3","dist":{"integrity":"sha512-hL5hK95hW8iSvbuqGAYKsfSkA3UE6WoZ2FdhkONPPg8IIoLxugyOznGkMGYZaYPrI9l5xyvilP1VSecrzFuF/A==","shasum":"b9208ddc82be77fffaeb1e7be079d5b1951de9c0","tarball":"https://registry.npmjs.org/r3f-form/-/r3f-form-3.0.3-beta.5.tgz","fileCount":40,"unpackedSize":728064,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBJuAVfnTcEDu4pi1pMe37yysKa9NHRNhuypyRWUVZdcAiEA9r4MJgsGie/eOLczAgzgaxkot69kYFT2gX5n8oWWl/c="}]},"_npmUser":{"name":"jberesford","email":"volcaus@gmail.com"},"directories":{},"maintainers":[{"name":"jberesford","email":"volcaus@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/r3f-form_3.0.3-beta.5_1710025322557_0.7912013655561119"},"_hasShrinkwrap":false},"3.0.3-beta.6":{"version":"3.0.3-beta.6","name":"r3f-form","description":"An *accessible* webGL form component library for use with React Three Fiber","type":"module","module":"dist/index.js","main":"dist/index.js","types":"dist/index.d.ts","publishConfig":{"access":"public"},"scripts":{"dev":"vite","build":"tsc && vite build","lint":"eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0","preview":"vite preview","commit":"cz","semantic-release":"semantic-release --branches main","storybook":"storybook dev -p 6006","build-storybook":"storybook build"},"author":{"name":"John Beresford"},"license":"MIT","devDependencies":{"@storybook/addon-essentials":"^7.6.17","@storybook/addon-interactions":"^7.6.17","@storybook/addon-links":"^7.6.17","@storybook/addon-onboarding":"^1.0.11","@storybook/blocks":"^7.6.17","@storybook/jest":"^0.2.3","@storybook/react":"^7.6.17","@storybook/react-vite":"^7.6.17","@storybook/test":"^7.6.17","@storybook/testing-library":"^0.2.2","@types/react":"^18.2.56","@types/react-dom":"^18.2.19","@types/three":"^0.155.1","@typescript-eslint/eslint-plugin":"^7.0.2","@typescript-eslint/parser":"^7.0.2","@vitejs/plugin-react":"^4.2.1","commitizen":"^4.3.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.56.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","eslint-plugin-react":"^7.31.11","eslint-plugin-react-hooks":"^4.6.0","eslint-plugin-react-refresh":"^0.4.5","eslint-plugin-storybook":"^0.8.0","glob":"^10.3.10","prettier":"^3.0.0","semantic-release":"^23.0.2","storybook":"^7.6.17","tslib":"^2.6.2","typescript":"^5.2.2","vite":"^5.1.4","vite-plugin-dts":"^3.7.3"},"dependencies":{"react":">=18.0","react-dom":">=18.0","three":">=0.146.0"},"peerDependencies":{"@react-three/drei":">=9.0","@react-three/fiber":">=8.0","react":">=18.0","troika-three-text":"^0.49.0","react-dom":">=18.0","three":">=0.146.0"},"repository":{"type":"git","url":"git+https://github.com/JMBeresford/r3f-form.git"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"readme":"# React + TypeScript + Vite\n\nThis template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.\n\nCurrently, two official plugins are available:\n\n- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh\n- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh\n\n## Expanding the ESLint configuration\n\nIf you are developing a production application, we recommend updating the configuration to enable type aware lint rules:\n\n- Configure the top-level `parserOptions` property like this:\n\n```js\nexport default {\n  // other rules...\n  parserOptions: {\n    ecmaVersion: 'latest',\n    sourceType: 'module',\n    project: ['./tsconfig.json', './tsconfig.node.json'],\n    tsconfigRootDir: __dirname,\n  },\n}\n```\n\n- Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked`\n- Optionally add `plugin:@typescript-eslint/stylistic-type-checked`\n- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list\n","readmeFilename":"README.md","gitHead":"e40660281ed35ebf8004c8f08a00d90e715f9a59","bugs":{"url":"https://github.com/JMBeresford/r3f-form/issues"},"homepage":"https://github.com/JMBeresford/r3f-form#readme","_id":"r3f-form@3.0.3-beta.6","_nodeVersion":"19.9.0","_npmVersion":"9.6.3","dist":{"integrity":"sha512-u/MrWZT8v+O8BNEBS8KT6iz89iCjzqj3BbWN7o54m7lxuDXppO72LWOgVDlxX0Z/E/MYC7/pXDTb2yzOUOLWsg==","shasum":"e95aa31793f5a8e1ad89766c94bbb668b5ce00bb","tarball":"https://registry.npmjs.org/r3f-form/-/r3f-form-3.0.3-beta.6.tgz","fileCount":57,"unpackedSize":758317,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE/4IZMlLfDXDZyvWSs4ASvHqBKzQ+IHjd6Cmi0rIhnwAiBQHH1Sjb8T3OEQcnDNtEM/UDl1fb5LPHTJaeeLZxCHhQ=="}]},"_npmUser":{"name":"jberesford","email":"volcaus@gmail.com"},"directories":{},"maintainers":[{"name":"jberesford","email":"volcaus@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/r3f-form_3.0.3-beta.6_1710025469196_0.7276844562294607"},"_hasShrinkwrap":false},"4.0.0":{"version":"4.0.0","name":"r3f-form","description":"An *accessible* webGL form component library for use with React Three Fiber","type":"module","module":"dist/index.js","main":"dist/index.js","types":"dist/index.d.ts","publishConfig":{"access":"public"},"scripts":{"dev":"vite","build":"tsc && vite build","format":"prettier --write .","format:check":"prettier --check .","lint":"eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0","preview":"vite preview","commit":"cz","semantic-release":"semantic-release --branches main","storybook":"storybook dev -p 6006","build-storybook":"storybook build"},"author":{"name":"John Beresford"},"license":"MIT","devDependencies":{"@storybook/addon-essentials":"^7.6.17","@storybook/addon-interactions":"^7.6.17","@storybook/addon-links":"^7.6.17","@storybook/addon-onboarding":"^1.0.11","@storybook/blocks":"^7.6.17","@storybook/jest":"^0.2.3","@storybook/react":"^7.6.17","@storybook/react-vite":"^7.6.17","@storybook/test":"^7.6.17","@storybook/testing-library":"^0.2.2","@types/react":"^18.2.56","@types/react-dom":"^18.2.19","@types/three":"^0.155.1","@typescript-eslint/eslint-plugin":"^7.0.2","@typescript-eslint/parser":"^7.0.2","@vitejs/plugin-react":"^4.2.1","commitizen":"^4.3.0","cz-conventional-changelog":"^3.3.0","eslint":"^8.56.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","eslint-plugin-react":"^7.31.11","eslint-plugin-react-hooks":"^4.6.0","eslint-plugin-react-refresh":"^0.4.5","eslint-plugin-storybook":"^0.8.0","prettier":"^3.0.0","semantic-release":"^23.0.2","storybook":"^7.6.17","tslib":"^2.6.2","typescript":"^5.2.2","vite":"^5.1.4","vite-plugin-dts":"^3.7.3"},"peerDependencies":{"@react-three/drei":">=9.0","@react-three/fiber":">=8.0","react":">=18.0","troika-three-text":"^0.49.0","react-dom":">=18.0","three":">=0.146.0"},"repository":{"type":"git","url":"git+https://github.com/JMBeresford/r3f-form.git"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"_id":"r3f-form@4.0.0","gitHead":"b3a30d120c37e8a054a7920d982709d7852e8673","bugs":{"url":"https://github.com/JMBeresford/r3f-form/issues"},"homepage":"https://github.com/JMBeresford/r3f-form#readme","_nodeVersion":"20.11.1","_npmVersion":"10.5.0","dist":{"integrity":"sha512-KdJY1Uv9VG7SPosnUI7q6XYknJb6MWdiruf1VCEWnJtJA1n3UZKcs15T8tE5sWTA1lsG3h5MFLVCmGIPoX9xig==","shasum":"d2af0c121cac91dc10c2d0420aea6f7ad000220c","tarball":"https://registry.npmjs.org/r3f-form/-/r3f-form-4.0.0.tgz","fileCount":64,"unpackedSize":772150,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICSQ+OjPD08Z8Dj+a/x0y8OQ+Uut6lLntBYxeRof72SyAiEA4AFvQTV7UZrkGxvFZfxG/EijFB8MN9XWkmhFFwiT188="}]},"_npmUser":{"name":"jberesford","email":"volcaus@gmail.com"},"directories":{},"maintainers":[{"name":"jberesford","email":"volcaus@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/r3f-form_4.0.0_1710027158040_0.272582061687362"},"_hasShrinkwrap":false}},"time":{"created":"2023-01-16T01:59:10.784Z","0.0.0-development":"2023-01-16T01:59:10.996Z","modified":"2024-03-09T23:32:38.708Z","1.3.0":"2023-01-16T03:29:24.062Z","1.4.0":"2023-01-16T21:40:05.681Z","1.4.1":"2023-01-16T21:52:42.905Z","1.4.2":"2023-01-16T22:44:19.138Z","1.4.4":"2023-01-16T23:26:21.338Z","1.4.5":"2023-01-17T01:03:25.094Z","2.0.0":"2023-02-09T04:40:00.769Z","2.0.1":"2023-02-09T05:50:46.695Z","2.0.2-beta.1":"2023-07-11T17:42:13.244Z","2.0.2-beta.2":"2023-07-11T17:49:03.170Z","2.0.2-beta.3":"2023-07-11T17:57:58.010Z","2.0.2-beta.4":"2023-07-11T18:02:43.970Z","2.0.2-beta.5":"2023-07-11T18:08:37.379Z","2.0.2-beta.6":"2023-07-11T18:17:20.079Z","2.0.2-beta.7":"2023-07-11T18:40:33.096Z","2.0.2-beta.8":"2023-07-11T18:42:19.990Z","2.0.2-beta.9":"2023-07-11T18:45:48.326Z","2.0.2-beta.10":"2023-07-12T22:56:57.312Z","2.0.2-beta.11":"2023-07-12T22:58:06.212Z","3.0.0":"2023-07-12T23:06:56.638Z","3.0.1":"2023-07-12T23:20:46.264Z","3.0.2":"2023-07-12T23:58:41.513Z","3.0.3-beta.0":"2024-03-09T18:46:42.183Z","3.0.3-beta.1":"2024-03-09T18:53:57.680Z","3.0.3-beta.2":"2024-03-09T19:03:25.252Z","3.0.3-beta.3":"2024-03-09T21:59:55.015Z","3.0.3-beta.4":"2024-03-09T22:57:04.090Z","3.0.3-beta.5":"2024-03-09T23:02:02.786Z","3.0.3-beta.6":"2024-03-09T23:04:29.377Z","4.0.0":"2024-03-09T23:32:38.273Z"},"maintainers":[{"name":"jberesford","email":"volcaus@gmail.com"}],"description":"An *accessible* webGL form component library for use with React Three Fiber","homepage":"https://github.com/JMBeresford/r3f-form#readme","repository":{"type":"git","url":"git+https://github.com/JMBeresford/r3f-form.git"},"author":{"name":"John Beresford"},"bugs":{"url":"https://github.com/JMBeresford/r3f-form/issues"},"license":"MIT","readme":"# r3f-form\n\n### [View examples](https://jmberesford.github.io/r3f-form/?path=/story/form--default-submit-button)\n\n> ## WARNING: UNDER HEAVY DEVELOPMENT\n>\n> Each release will aim to be a fully functional and usable release,\n> but breaking API changes WILL be likely for the forseeable future.\n\n## A webGL form component for use with React Three Fiber\n\n![image](https://user-images.githubusercontent.com/1373954/210024281-c735f61a-1a69-45e5-a5d3-147ed57a6c30.png)\n\nThis package aims to create a fully-functional and **accessible** `<Form />`\ncomponents that can be used within the [@react-three/fiber](https://github.com/pmndrs/react-three-fiber)\necosystem. Ultimately, the goal is to have fully functioning HTML `<form>`s -- with all viable input types -- rendered in webGL.\n\nCurrent implementation binds webGL elements to the existing state and event systems of respective\nhidden HTML DOM elements. There is a heavy reliance on\n[troika-three-text](https://github.com/protectwise/troika/tree/main/packages/troika-three-text)\nfor text-rendering and selection/caret logic.\n\n> Note that `r3f-form` will only work within a React-Three-Fiber Canvas element.\n> You **must** be using\n>\n> - [@react-three/fiber](https://github.com/pmndrs/react-three-fiber)\n> - [@react-three/drei](https://github.com/pmndrs/drei)\n> - [troika-three-text](https://github.com/protectwise/troika/tree/main/packages/troika-three-text)\n>\n> as dependencies in your project to use `r3f-form`.\n\n### Install\n\n```sh\nnpm install r3f-form\n# or\nyarn add r3f-form\n# or\npnpm install r3f-form\n```\n\n# How to use\n\n## Forms\n\nIn order to create a form, just wrap any relevant elements in a `<Form>`:\n\n```tsx\nimport { Form, Input, Label, Submit } from \"r3f-form\";\n\nexport function MyForm() {\n  return (\n    <Form>\n      <Label text=\"username\" />\n      <Input name=\"username\" />\n\n      <Label text=\"password\" />\n      <Input name=\"password\" type=\"password\" />\n\n      <Submit value=\"Login\" />\n    </Form>\n  );\n}\n```\n\n> Note that each element in the form will require a `name` prop in order to be picked up in submission, just like in a normal DOM form element\n\nThe relevant inputs will be bound to respective DOM elements under the hood, and be rendered into the 3D scene like so:\n\n![image](https://user-images.githubusercontent.com/1373954/217718779-816da536-00af-4375-85dd-de707e79aa8d.png)\n\nYou can define submission behavior just like with any old HTML `<form>`:\n\n```tsx\n// redirect to a login script\n<Form action=\"/login.php\"></Form>;\n\n// or handle it with a callback\nconst handleSubmit = (e: FormEvent) => {\n  e.preventDefault();\n\n  const data = new FormData(e.target);\n\n  for (let [name, value] of data.entries()) {\n    console.log(`${name}: ${value}`);\n  }\n};\n\n<Form onSubmit={handleSubmit}></Form>;\n```\n\n## Inputs\n\nAn editable text-box bound to an DOM `<input>` and represented in the webGL canvas.\n\n```ts\ntype Props = {\n  type?: \"text\" | \"password\";\n\n  /** width of the container */\n  width?: number;\n  backgroundColor?: Color;\n  selectionColor?: Color;\n  backgroundOpacity?: number;\n\n  /** [left/right , top/bottom] in THREE units, respectively\n   *\n   * note that height is implicitly defined by the capHeight of the rendered\n   * text. The cap height is dependant on both the `textProps.font` being used and the\n   * `textProps.fontSize` value\n   */\n  padding?: Vector2;\n  cursorWidth?: number;\n\n  /** 3D transformations */\n  position: Vector3;\n  rotation: Euler;\n  scale: Vector3;\n\n  // And ALL props available to DOM <input>s\n};\n```\n\nCreate a basic input field like so:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\nexport function MyInput() {\n  return (\n    <>\n      <Label text=\"label\" />\n      <Input />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718847-acb169ed-95ff-4def-a126-491c648346b9.png)\n\nYou can access the value of the input via the `onChange` callback prop:\n\n> The callback is passed the `ChangeEvent` object from the underlying HTML `<input>`s\n> change event on every change.\n>\n> Read more about this event [here](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/change_event)\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\nexport function MyInput() {\n  const [username, setUsername] = React.useState(\"\");\n  // username will always contain the current value\n\n  function handleChange(e) {\n    setUsername(ev.target.value);\n  }\n\n  return (\n    <>\n      <Label text=\"Test Input\" />\n      <Input onChange={handleChange} />\n    </>\n  );\n}\n```\n\nYou can also create password inputs:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\nexport function MyPassword() {\n  return (\n    <>\n      <Label text=\"Password\" />\n      <Input type=\"password\" />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718412-48158e10-53b2-4e79-86c9-54bc5495521a.png)\n\nAdd custom padding to the text container:\n\n```tsx\nimport { Input, Label } from \"r3f-form\";\n\n/*\n * padding: [horizontal padding, vertical padding] in THREE units\n */\n\nexport function MyInput() {\n  return (\n    <>\n      <Label text=\"Label\" />\n      <Input padding={[0.05, 0.5]} />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718475-1c696ff1-3b1d-4559-9d02-9535bd59cdff.png)\n\n---\n\n## Textarea\n\n```ts\ntype Props = {\n  /** width of the container */\n  width?: number;\n\n  backgroundColor?: Color;\n  backgroundOpacity?: number;\n  selectionColor?: Color;\n\n  /** [left/right , top/bottom] in THREE units, respectively\n   *\n   * note that height is implicitly defined by the capHeight of the rendered\n   * text. The cap height is dependant on both the `textProps.font` being used\n   * and the `textProps.fontSize` value\n   */\n  padding?: Vector2;\n  cursorWidth?: number;\n\n  /** 3D transformations */\n  position: Vector3;\n  rotation: Euler;\n  scale: Vector3;\n\n  // And ALL props available to DOM <textarea>s\n};\n```\n\nSimilar to the `<Input />` component, you can also create a `<Textarea />` like so:\n\n```tsx\nimport { Textarea, Label } from \"r3f-form\";\n\nexport function App() {\n  return (\n    <>\n      <Label text=\"Default Textarea:\" />\n      <Textarea />\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718566-a718eab7-1e73-4559-96aa-8e14824f0031.png)\n\n---\n\n## Text\n\nIn order to configure the underlying `troika-three-text` instance\nthat is responsible for rendering the actual text, you can use the\n`<Text />` component.\n\nThere is a respective `<InputText />` or `<TextareaText />` component for both `<Input />`s and\n`<Textarea />`s.\n\nFor all configuration options, check out the [troika docs](https://github.com/protectwise/troika/tree/main/packages/troika-three-text).\n\n> Note that **not all** of troika's props are exposed on these `<Text />`\n> components\n\nChange color and background opacity:\n\n```tsx\nimport { Input, Label, InputText } from \"r3f-form\";\n\nexport function App() {\n  return (\n    <>\n      <Label text=\"Test Color/Opacity\" />\n      <Input backgroundOpacity={0.6} backgroundColor=\"black\">\n        <InputText color=\"red\" />\n      </Input>\n    </>\n  );\n}\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718611-c2e4848e-8267-4926-9243-7bb61bced61d.png)\n\n```tsx\nimport { Input, Textarea, Label, InputText, TextareaText } from \"r3f-form\";\n\nexport function App() {\n  return (\n    <>\n      <Label text=\"Test Color/Opacity\" />\n      <Input>\n        <InputText color=\"#red\" />\n      </Input>\n\n      <Label text=\"Test Textarea\" />\n      <Textarea>\n        <TextareaText color=\"red\" />\n      </Textarea>\n    </>\n  );\n}\n```\n\n---\n\n## Submit\n\nEquivalent to a DOM `<input type=\"submit\" />`, exposed as\nan independent component. By default it renders a button\nusing the following props:\n\n```ts\ntype Props = {\n  value?: string;\n  fontSize?: number;\n  width?: number;\n  height?: number;\n  color?: Color;\n  backgroundColor?: Color;\n\n  /** 3D transformations */\n  position: Vector3;\n  rotation: Euler;\n  scale: Vector3;\n\n  // And ALL props available to DOM <input>s\n};\n```\n\nAdd a simple submit button to your forms like so:\n\n```tsx\n<Form>\n  <Label text=\"Username\" />\n  <Input name=\"username\" />\n\n  <Label text=\"Password\" />\n  <Input name=\"password\" type=\"password\" />\n\n  <Submit value=\"Login\" />\n</Form>\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718665-c64f6653-f85f-4310-a1c7-f2cf43154f2e.png)\n\nWhile this provides a somewhat-customizable default button, the main purpose of this component\nis to provide a simple interface to use 3D elements to submit your forms. Any children passed in\nwill submit the form on click. For example:\n\n```tsx\n<Form>\n  . . .\n  <Submit value=\"submit\">\n    <MySubmitButton />\n  </Submit>\n</Form>\n```\n\n![image](https://user-images.githubusercontent.com/1373954/217718713-a0a6671f-3f1e-4817-9ee9-e205bcc22610.png)\n\nClicking on the big red button would submit the `<Form>`\n","readmeFilename":"README.md"}