diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 708e7a8e..0c4fda09 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -108,7 +108,7 @@ importers:
version: link:../packages/types
'@vanilla-extract/vite-plugin':
specifier: ^4.0.11
- version: 4.0.15(@types/node@22.5.1)(terser@5.31.6)(vite@5.4.2(@types/node@22.5.1)(terser@5.31.6))
+ version: 4.0.15(@types/node@22.5.1)(terser@5.31.6)(vite@5.4.9(@types/node@22.5.1)(terser@5.31.6))
'@vitest/coverage-v8':
specifier: ^1.5.2
version: 1.6.0(vitest@1.6.0(@types/node@22.5.1)(happy-dom@15.7.4)(jsdom@25.0.0)(terser@5.31.6))
@@ -277,10 +277,10 @@ importers:
version: 0.7.39
'@vanilla-extract/vite-plugin':
specifier: ^4.0.13
- version: 4.0.15(@types/node@20.16.1)(terser@5.31.6)(vite@5.4.2(@types/node@20.16.1)(terser@5.31.6))
+ version: 4.0.15(@types/node@20.16.1)(terser@5.31.6)(vite@5.4.9(@types/node@20.16.1)(terser@5.31.6))
'@vitejs/plugin-react':
specifier: ^4.3.1
- version: 4.3.1(vite@5.4.2(@types/node@20.16.1)(terser@5.31.6))
+ version: 4.3.1(vite@5.4.9(@types/node@20.16.1)(terser@5.31.6))
'@vitest/coverage-v8':
specifier: ^1.6.0
version: 1.6.0(vitest@1.6.0(@types/node@20.16.1)(happy-dom@15.7.4)(jsdom@24.1.3)(terser@5.31.6))
@@ -339,6 +339,8 @@ importers:
specifier: ^1.0.5
version: 1.0.6(@types/node@20.16.1)(happy-dom@15.7.4)(jsdom@24.1.3)(terser@5.31.6)
+ spirekey-web: {}
+
packages:
'@adobe/css-tools@4.4.0':
@@ -4239,6 +4241,9 @@ packages:
picocolors@1.0.1:
resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==}
+ picocolors@1.1.1:
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+
picomatch@2.3.1:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
engines: {node: '>=8.6'}
@@ -4282,6 +4287,10 @@ packages:
resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==}
engines: {node: ^10 || ^12 || >=14}
+ postcss@8.4.47:
+ resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==}
+ engines: {node: ^10 || ^12 || >=14}
+
prelude-ls@1.2.1:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
engines: {node: '>= 0.8.0'}
@@ -4720,6 +4729,10 @@ packages:
resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==}
engines: {node: '>=0.10.0'}
+ source-map-js@1.2.1:
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+ engines: {node: '>=0.10.0'}
+
source-map-support@0.5.21:
resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
@@ -5239,6 +5252,37 @@ packages:
terser:
optional: true
+ vite@5.4.9:
+ resolution: {integrity: sha512-20OVpJHh0PAM0oSOELa5GaZNWeDjcAvQjGXy2Uyr+Tp+/D2/Hdz6NLgpJLsarPTA2QJ6v8mX2P1ZfbsSKvdMkg==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': ^18.0.0 || >=20.0.0
+ less: '*'
+ lightningcss: ^1.21.0
+ sass: '*'
+ sass-embedded: '*'
+ stylus: '*'
+ sugarss: '*'
+ terser: ^5.4.0
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ less:
+ optional: true
+ lightningcss:
+ optional: true
+ sass:
+ optional: true
+ sass-embedded:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+
vitest-matchmedia-mock@1.0.6:
resolution: {integrity: sha512-UUU0YY6BpmcuD2p4DpUVUP0afKuxHX6YAQs5J5skP+ksm+yXJHi9kSN5eOQuC0TFVTuXnIFPl0U9vGPNgnzA1g==}
@@ -5771,8 +5815,8 @@ snapshots:
'@ungap/structured-clone': 1.2.0
'@vanilla-extract/css': 1.15.5
'@vanilla-extract/integration': 7.1.9(@types/node@22.5.1)(terser@5.31.6)
- '@vanilla-extract/vite-plugin': 4.0.15(@types/node@22.5.1)(terser@5.31.6)(vite@5.4.2(@types/node@22.5.1)(terser@5.31.6))
- '@vitejs/plugin-react-swc': 3.7.0(@swc/helpers@0.5.12)(vite@5.4.2(@types/node@22.5.1)(terser@5.31.6))
+ '@vanilla-extract/vite-plugin': 4.0.15(@types/node@22.5.1)(terser@5.31.6)(vite@5.4.9(@types/node@22.5.1)(terser@5.31.6))
+ '@vitejs/plugin-react-swc': 3.7.0(@swc/helpers@0.5.12)(vite@5.4.9(@types/node@22.5.1)(terser@5.31.6))
'@vocab/webpack': 1.2.9(webpack@5.94.0)
builtin-modules: 3.3.0
c12: 1.11.1(magicast@0.3.4)
@@ -5803,7 +5847,7 @@ snapshots:
type-fest: 3.13.1
typescript: 5.5.4
used-styles: 2.6.5
- vite: 5.4.2(@types/node@22.5.1)(terser@5.31.6)
+ vite: 5.4.9(@types/node@22.5.1)(terser@5.31.6)
transitivePeerDependencies:
- '@swc/helpers'
- '@types/node'
@@ -7806,7 +7850,7 @@ snapshots:
find-up: 5.0.0
javascript-stringify: 2.1.0
mlly: 1.7.1
- vite: 5.4.2(@types/node@20.16.1)(terser@5.31.6)
+ vite: 5.4.9(@types/node@20.16.1)(terser@5.31.6)
vite-node: 1.6.0(@types/node@20.16.1)(terser@5.31.6)
transitivePeerDependencies:
- '@types/node'
@@ -7832,7 +7876,7 @@ snapshots:
find-up: 5.0.0
javascript-stringify: 2.1.0
mlly: 1.7.1
- vite: 5.4.2(@types/node@22.5.1)(terser@5.31.6)
+ vite: 5.4.9(@types/node@22.5.1)(terser@5.31.6)
vite-node: 1.6.0(@types/node@22.5.1)(terser@5.31.6)
transitivePeerDependencies:
- '@types/node'
@@ -7877,10 +7921,10 @@ snapshots:
dependencies:
'@vanilla-extract/css': 1.14.2
- '@vanilla-extract/vite-plugin@4.0.15(@types/node@20.16.1)(terser@5.31.6)(vite@5.4.2(@types/node@20.16.1)(terser@5.31.6))':
+ '@vanilla-extract/vite-plugin@4.0.15(@types/node@20.16.1)(terser@5.31.6)(vite@5.4.9(@types/node@20.16.1)(terser@5.31.6))':
dependencies:
'@vanilla-extract/integration': 7.1.9(@types/node@20.16.1)(terser@5.31.6)
- vite: 5.4.2(@types/node@20.16.1)(terser@5.31.6)
+ vite: 5.4.9(@types/node@20.16.1)(terser@5.31.6)
transitivePeerDependencies:
- '@types/node'
- babel-plugin-macros
@@ -7893,10 +7937,10 @@ snapshots:
- supports-color
- terser
- '@vanilla-extract/vite-plugin@4.0.15(@types/node@22.5.1)(terser@5.31.6)(vite@5.4.2(@types/node@22.5.1)(terser@5.31.6))':
+ '@vanilla-extract/vite-plugin@4.0.15(@types/node@22.5.1)(terser@5.31.6)(vite@5.4.9(@types/node@22.5.1)(terser@5.31.6))':
dependencies:
'@vanilla-extract/integration': 7.1.9(@types/node@22.5.1)(terser@5.31.6)
- vite: 5.4.2(@types/node@22.5.1)(terser@5.31.6)
+ vite: 5.4.9(@types/node@22.5.1)(terser@5.31.6)
transitivePeerDependencies:
- '@types/node'
- babel-plugin-macros
@@ -7928,21 +7972,21 @@ snapshots:
- supports-color
- terser
- '@vitejs/plugin-react-swc@3.7.0(@swc/helpers@0.5.12)(vite@5.4.2(@types/node@22.5.1)(terser@5.31.6))':
+ '@vitejs/plugin-react-swc@3.7.0(@swc/helpers@0.5.12)(vite@5.4.9(@types/node@22.5.1)(terser@5.31.6))':
dependencies:
'@swc/core': 1.7.18(@swc/helpers@0.5.12)
- vite: 5.4.2(@types/node@22.5.1)(terser@5.31.6)
+ vite: 5.4.9(@types/node@22.5.1)(terser@5.31.6)
transitivePeerDependencies:
- '@swc/helpers'
- '@vitejs/plugin-react@4.3.1(vite@5.4.2(@types/node@20.16.1)(terser@5.31.6))':
+ '@vitejs/plugin-react@4.3.1(vite@5.4.9(@types/node@20.16.1)(terser@5.31.6))':
dependencies:
'@babel/core': 7.24.7
'@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.24.7)
'@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.24.7)
'@types/babel__core': 7.20.5
react-refresh: 0.14.2
- vite: 5.4.2(@types/node@20.16.1)(terser@5.31.6)
+ vite: 5.4.9(@types/node@20.16.1)(terser@5.31.6)
transitivePeerDependencies:
- supports-color
@@ -10515,6 +10559,8 @@ snapshots:
picocolors@1.0.1: {}
+ picocolors@1.1.1: {}
+
picomatch@2.3.1: {}
picomatch@4.0.2: {}
@@ -10568,6 +10614,12 @@ snapshots:
picocolors: 1.0.1
source-map-js: 1.2.0
+ postcss@8.4.47:
+ dependencies:
+ nanoid: 3.3.7
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
prelude-ls@1.2.1: {}
prettier-plugin-organize-imports@3.2.4(prettier@3.3.3)(typescript@5.5.4):
@@ -11094,6 +11146,8 @@ snapshots:
source-map-js@1.2.0: {}
+ source-map-js@1.2.1: {}
+
source-map-support@0.5.21:
dependencies:
buffer-from: 1.1.2
@@ -11538,7 +11592,7 @@ snapshots:
debug: 4.3.6
pathe: 1.1.2
picocolors: 1.0.1
- vite: 5.4.2(@types/node@20.16.1)(terser@5.31.6)
+ vite: 5.4.9(@types/node@20.16.1)(terser@5.31.6)
transitivePeerDependencies:
- '@types/node'
- less
@@ -11556,7 +11610,7 @@ snapshots:
debug: 4.3.6
pathe: 1.1.2
picocolors: 1.0.1
- vite: 5.4.2(@types/node@22.5.1)(terser@5.31.6)
+ vite: 5.4.9(@types/node@22.5.1)(terser@5.31.6)
transitivePeerDependencies:
- '@types/node'
- less
@@ -11574,7 +11628,7 @@ snapshots:
debug: 4.3.6
pathe: 1.1.2
tinyrainbow: 1.2.0
- vite: 5.4.2(@types/node@20.16.1)(terser@5.31.6)
+ vite: 5.4.9(@types/node@20.16.1)(terser@5.31.6)
transitivePeerDependencies:
- '@types/node'
- less
@@ -11606,6 +11660,26 @@ snapshots:
fsevents: 2.3.3
terser: 5.31.6
+ vite@5.4.9(@types/node@20.16.1)(terser@5.31.6):
+ dependencies:
+ esbuild: 0.21.5
+ postcss: 8.4.47
+ rollup: 4.21.0
+ optionalDependencies:
+ '@types/node': 20.16.1
+ fsevents: 2.3.3
+ terser: 5.31.6
+
+ vite@5.4.9(@types/node@22.5.1)(terser@5.31.6):
+ dependencies:
+ esbuild: 0.21.5
+ postcss: 8.4.47
+ rollup: 4.21.0
+ optionalDependencies:
+ '@types/node': 22.5.1
+ fsevents: 2.3.3
+ terser: 5.31.6
+
vitest-matchmedia-mock@1.0.6(@types/node@20.16.1)(happy-dom@15.7.4)(jsdom@24.1.3)(terser@5.31.6):
dependencies:
vitest: 2.0.5(@types/node@20.16.1)(happy-dom@15.7.4)(jsdom@24.1.3)(terser@5.31.6)
@@ -11715,7 +11789,7 @@ snapshots:
tinybench: 2.9.0
tinypool: 1.0.1
tinyrainbow: 1.2.0
- vite: 5.4.2(@types/node@20.16.1)(terser@5.31.6)
+ vite: 5.4.9(@types/node@20.16.1)(terser@5.31.6)
vite-node: 2.0.5(@types/node@20.16.1)(terser@5.31.6)
why-is-node-running: 2.3.0
optionalDependencies:
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 8d19c1fd..27db5a07 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -1,5 +1,6 @@
packages:
- 'spirekey'
+ - 'spirekey-web'
- 'sdk'
- 'packages/*'
- 'examples/*'
diff --git a/spirekey-web/dist/assets/index-BxS8GbLC.css b/spirekey-web/dist/assets/index-BxS8GbLC.css
new file mode 100644
index 00000000..af38b673
--- /dev/null
+++ b/spirekey-web/dist/assets/index-BxS8GbLC.css
@@ -0,0 +1 @@
+*,*:before,*:after{box-sizing:border-box}body{font-family:Inter,sans-serif;font-optical-sizing:auto;background-color:#020e1b;display:flex;flex-direction:column;max-width:43rem;width:100%;height:100dhw;align-items:center;justify-content:center;color:#ffffffb3;margin-inline:auto;padding-inline:.5rem}.code{font-family:Kode Mono,monospace;font-optical-sizing:auto}.card{background-color:#131e2bcc;color:#fffffff2;padding-inline:2.25rem;padding-block:1.5rem;border-radius:.5rem;border:1px solid #d2d4d640;width:100%}.footer{display:flex;width:100%;justify-content:flex-end}.action-bar{display:flex;width:100%;justify-content:flex-end;align-items:center;gap:1rem}a:not(.button){color:#3cbc92}.button{font-weight:500;font-size:.875rem;line-height:1.125rem;letter-spacing:0;background-color:#52ffc6;padding-block:.5rem;padding-inline:1.5rem;border-radius:2px;cursor:pointer;color:#000;text-decoration:none}.button.outline{background-color:transparent;color:#fff;box-shadow:0 0 0 1px #d2d4d640 inset}
diff --git a/spirekey-web/dist/index.html b/spirekey-web/dist/index.html
new file mode 100644
index 00000000..0c19b878
--- /dev/null
+++ b/spirekey-web/dist/index.html
@@ -0,0 +1,85 @@
+
+
+
+
+
+ Spirekey
+
+
+
+
+
+
+
+
+
+ Kadena SpireKey leverages WebAuthn standards to deliver secure backend,
+ enabling end users to generate and store keypairs directly on their
+ hardware devices. Developers can generate keypairs using the in-browser
+ SDK, integrate their application with SpireKey using the SDK package, or
+ explore the technical documentation outlined in the KIPs.
+
+
+
+
+
Demo Applications
+
+
+
+ Experience Kadena SpireKey authentication showcased with wallet
+ functionality
+
+
+
+
+
Mint your own NFT using SpireKey authentication
+
+
+
+
+
+
+
+
diff --git a/spirekey-web/index.html b/spirekey-web/index.html
new file mode 100644
index 00000000..a57e3577
--- /dev/null
+++ b/spirekey-web/index.html
@@ -0,0 +1,122 @@
+
+
+
+
+
+ Spirekey
+
+
+
+
+
+
+
+
+
+
+
+ Kadena SpireKey leverages WebAuthn standards to deliver secure
+ backend, enabling end users to generate and store keypairs directly on
+ their hardware devices. Developers can generate keypairs using the
+ in-browser SDK, integrate their application with SpireKey using the
+ SDK package, or explore the technical documentation outlined in the
+ KIPs.
+
+
+
+
+
+
+
Developer Resources
+
+
+
+
+
Demo Applications
+
+
+
+
+
+
+ Experience Kadena SpireKey authentication showcased with wallet
+ functionality
+
+
+
+
+
+
+
+
Mint your own NFT using SpireKey authentication
+
+
+
+
+
+
+
+
+
diff --git a/spirekey-web/logo.svg b/spirekey-web/logo.svg
new file mode 100644
index 00000000..6d83f481
--- /dev/null
+++ b/spirekey-web/logo.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spirekey-web/package.json b/spirekey-web/package.json
new file mode 100644
index 00000000..233d8019
--- /dev/null
+++ b/spirekey-web/package.json
@@ -0,0 +1,5 @@
+{
+ "name": "@kadena/spirekey-web",
+ "version": "0.1.0",
+ "private": true
+}
diff --git a/spirekey-web/style.css b/spirekey-web/style.css
new file mode 100644
index 00000000..29885623
--- /dev/null
+++ b/spirekey-web/style.css
@@ -0,0 +1,159 @@
+*,
+*:before,
+*:after {
+ box-sizing: border-box;
+}
+
+body {
+ font-size: 16px;
+ font-family: 'Inter', sans-serif;
+ font-optical-sizing: auto;
+ background-color: #020e1b;
+ display: flex;
+ flex-direction: column;
+ max-width: 43rem;
+ width: 100%;
+ height: 100dhw;
+ align-items: center;
+ justify-content: center;
+ color: #ffffffb3;
+ margin-inline: auto;
+ padding-inline: 0.5rem;
+}
+
+.code {
+ font-family: 'Kode Mono', monospace;
+ font-optical-sizing: auto;
+}
+
+.card {
+ margin-block-start: 4rem;
+ display: flex;
+ flex-direction: column;
+ background-color: #131e2bcc;
+ color: #ffffffb3;
+ line-height: 130%;
+ font-weight: 400;
+ padding-inline: 2.25rem;
+ padding-block: 1.5rem;
+ border-radius: 0.5rem;
+ border: 1px solid #d2d4d640;
+ width: 100%;
+ gap: 3rem;
+}
+
+.stack {
+ display: flex;
+ width: 100%;
+
+ & .section {
+ width: 50%;
+ flex: 1;
+
+ & > a:not(.button) {
+ display: block;
+ }
+
+ .link {
+ margin-block-end: 1rem;
+ }
+ }
+}
+
+.footer {
+ display: flex;
+ width: 100%;
+ justify-content: flex-end;
+ gap: 1rem;
+ padding-block-start: 1rem;
+
+ a {
+ color: #ffffff66 !important;
+ text-decoration: none;
+ font-size: 0.6875rem;
+
+ &:hover {
+ text-decoration: underline;
+ }
+ }
+}
+
+.action-bar {
+ display: flex;
+ width: 100%;
+ justify-content: flex-end;
+ align-items: center;
+ gap: 1rem;
+}
+
+a:not(.button) {
+ color: #3cbc92;
+}
+
+.button {
+ font-weight: 500;
+ font-size: 0.875rem;
+ line-height: 1.125rem;
+ letter-spacing: 0;
+ background-color: #52ffc6;
+ padding-block: 0.5rem;
+ padding-inline: 1.5rem;
+ border-radius: 2px;
+ cursor: pointer;
+ color: #000;
+ text-decoration: none;
+
+ &.outline {
+ background-color: transparent;
+ color: #fff;
+ box-shadow: 0 0 0 1px #d2d4d640 inset;
+ }
+}
+
+h2,
+h3,
+h4,
+h5 {
+ font-weight: 500;
+ margin-block: 0rem;
+ padding: 0;
+ color: #fff;
+}
+
+h3 {
+ margin-block-end: 1rem;
+}
+
+.logo {
+ padding-block-end: 1rem;
+}
+
+.main-text {
+ width: 80%;
+}
+
+.tile {
+ display: flex;
+ flex-direction: column;
+ gap: 0.5rem;
+ margin-block-end: 0.5rem;
+
+ p {
+ margin: 0;
+ }
+}
+
+@media only screen and (max-width: 768px) {
+ .stack {
+ flex-direction: column;
+ gap: 1.5rem;
+
+ .section {
+ width: 100%;
+ }
+ }
+
+ .main-text {
+ width: 100%;
+ }
+}