Publication de la nouvelle branche au propre. Reste à tester.
217
srcs/requirements/svelte/api_front/package-lock.json
generated
@@ -8,8 +8,6 @@
|
||||
"name": "svelte-app",
|
||||
"version": "1.0.0",
|
||||
"dependencies": {
|
||||
"axios": "^1.1.3",
|
||||
"bootstrap": "^5.2.2",
|
||||
"sirv-cli": "^2.0.0",
|
||||
"svelte-spa-router": "^3.3.0"
|
||||
},
|
||||
@@ -163,16 +161,6 @@
|
||||
"resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz",
|
||||
"integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g=="
|
||||
},
|
||||
"node_modules/@popperjs/core": {
|
||||
"version": "2.11.6",
|
||||
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz",
|
||||
"integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==",
|
||||
"peer": true,
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/popperjs"
|
||||
}
|
||||
},
|
||||
"node_modules/@rollup/plugin-commonjs": {
|
||||
"version": "17.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-17.1.0.tgz",
|
||||
@@ -339,21 +327,6 @@
|
||||
"node": ">= 8"
|
||||
}
|
||||
},
|
||||
"node_modules/asynckit": {
|
||||
"version": "0.4.0",
|
||||
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
|
||||
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
|
||||
},
|
||||
"node_modules/axios": {
|
||||
"version": "1.1.3",
|
||||
"resolved": "https://registry.npmjs.org/axios/-/axios-1.1.3.tgz",
|
||||
"integrity": "sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA==",
|
||||
"dependencies": {
|
||||
"follow-redirects": "^1.15.0",
|
||||
"form-data": "^4.0.0",
|
||||
"proxy-from-env": "^1.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/balanced-match": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
|
||||
@@ -369,24 +342,6 @@
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/bootstrap": {
|
||||
"version": "5.2.2",
|
||||
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.2.tgz",
|
||||
"integrity": "sha512-dEtzMTV71n6Fhmbg4fYJzQsw1N29hJKO1js5ackCgIpDcGid2ETMGC6zwSYw09v05Y+oRdQ9loC54zB1La3hHQ==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/twbs"
|
||||
},
|
||||
{
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/bootstrap"
|
||||
}
|
||||
],
|
||||
"peerDependencies": {
|
||||
"@popperjs/core": "^2.11.6"
|
||||
}
|
||||
},
|
||||
"node_modules/brace-expansion": {
|
||||
"version": "1.1.11",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||
@@ -501,17 +456,6 @@
|
||||
"integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/combined-stream": {
|
||||
"version": "1.0.8",
|
||||
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
|
||||
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
|
||||
"dependencies": {
|
||||
"delayed-stream": "~1.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/commander": {
|
||||
"version": "2.20.3",
|
||||
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
|
||||
@@ -547,14 +491,6 @@
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/delayed-stream": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
|
||||
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
|
||||
"engines": {
|
||||
"node": ">=0.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/detect-indent": {
|
||||
"version": "6.1.0",
|
||||
"resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz",
|
||||
@@ -622,38 +558,6 @@
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/follow-redirects": {
|
||||
"version": "1.15.2",
|
||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
|
||||
"integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "individual",
|
||||
"url": "https://github.com/sponsors/RubenVerborgh"
|
||||
}
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=4.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"debug": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/form-data": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
|
||||
"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
|
||||
"dependencies": {
|
||||
"asynckit": "^0.4.0",
|
||||
"combined-stream": "^1.0.8",
|
||||
"mime-types": "^2.1.12"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 6"
|
||||
}
|
||||
},
|
||||
"node_modules/fs.realpath": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
|
||||
@@ -966,25 +870,6 @@
|
||||
"node": ">=8.6"
|
||||
}
|
||||
},
|
||||
"node_modules/mime-db": {
|
||||
"version": "1.52.0",
|
||||
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
|
||||
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/mime-types": {
|
||||
"version": "2.1.35",
|
||||
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
|
||||
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
|
||||
"dependencies": {
|
||||
"mime-db": "1.52.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/min-indent": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
|
||||
@@ -1112,11 +997,6 @@
|
||||
"url": "https://github.com/sponsors/jonschlinkert"
|
||||
}
|
||||
},
|
||||
"node_modules/proxy-from-env": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
|
||||
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
|
||||
},
|
||||
"node_modules/queue-microtask": {
|
||||
"version": "1.2.3",
|
||||
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
|
||||
@@ -1516,9 +1396,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/svelte": {
|
||||
"version": "3.52.0",
|
||||
"resolved": "https://registry.npmjs.org/svelte/-/svelte-3.52.0.tgz",
|
||||
"integrity": "sha512-FxcnEUOAVfr10vDU5dVgJN19IvqeHQCS1zfe8vayTfis9A2t5Fhx+JDe5uv/C3j//bB1umpLJ6quhgs9xyUbCQ==",
|
||||
"version": "3.53.1",
|
||||
"resolved": "https://registry.npmjs.org/svelte/-/svelte-3.53.1.tgz",
|
||||
"integrity": "sha512-Q4/hHkktZogGhN5iqxqSi9sjEVoe/NbIxX4hXEHoasTxj+TxEQVAq66LnDMdAZxjmsodkoI5F3slqsS68U7FNw==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">= 8"
|
||||
@@ -1676,9 +1556,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/typescript": {
|
||||
"version": "4.8.4",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz",
|
||||
"integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==",
|
||||
"version": "4.9.3",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz",
|
||||
"integrity": "sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==",
|
||||
"dev": true,
|
||||
"bin": {
|
||||
"tsc": "bin/tsc",
|
||||
@@ -1823,12 +1703,6 @@
|
||||
"resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz",
|
||||
"integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g=="
|
||||
},
|
||||
"@popperjs/core": {
|
||||
"version": "2.11.6",
|
||||
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz",
|
||||
"integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==",
|
||||
"peer": true
|
||||
},
|
||||
"@rollup/plugin-commonjs": {
|
||||
"version": "17.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-17.1.0.tgz",
|
||||
@@ -1954,21 +1828,6 @@
|
||||
"picomatch": "^2.0.4"
|
||||
}
|
||||
},
|
||||
"asynckit": {
|
||||
"version": "0.4.0",
|
||||
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
|
||||
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
|
||||
},
|
||||
"axios": {
|
||||
"version": "1.1.3",
|
||||
"resolved": "https://registry.npmjs.org/axios/-/axios-1.1.3.tgz",
|
||||
"integrity": "sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA==",
|
||||
"requires": {
|
||||
"follow-redirects": "^1.15.0",
|
||||
"form-data": "^4.0.0",
|
||||
"proxy-from-env": "^1.1.0"
|
||||
}
|
||||
},
|
||||
"balanced-match": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
|
||||
@@ -1981,12 +1840,6 @@
|
||||
"integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
|
||||
"dev": true
|
||||
},
|
||||
"bootstrap": {
|
||||
"version": "5.2.2",
|
||||
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.2.tgz",
|
||||
"integrity": "sha512-dEtzMTV71n6Fhmbg4fYJzQsw1N29hJKO1js5ackCgIpDcGid2ETMGC6zwSYw09v05Y+oRdQ9loC54zB1La3hHQ==",
|
||||
"requires": {}
|
||||
},
|
||||
"brace-expansion": {
|
||||
"version": "1.1.11",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||
@@ -2072,14 +1925,6 @@
|
||||
"integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
|
||||
"dev": true
|
||||
},
|
||||
"combined-stream": {
|
||||
"version": "1.0.8",
|
||||
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
|
||||
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
|
||||
"requires": {
|
||||
"delayed-stream": "~1.0.0"
|
||||
}
|
||||
},
|
||||
"commander": {
|
||||
"version": "2.20.3",
|
||||
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
|
||||
@@ -2109,11 +1954,6 @@
|
||||
"integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
|
||||
"dev": true
|
||||
},
|
||||
"delayed-stream": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
|
||||
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
|
||||
},
|
||||
"detect-indent": {
|
||||
"version": "6.1.0",
|
||||
"resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz",
|
||||
@@ -2169,21 +2009,6 @@
|
||||
"to-regex-range": "^5.0.1"
|
||||
}
|
||||
},
|
||||
"follow-redirects": {
|
||||
"version": "1.15.2",
|
||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
|
||||
"integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA=="
|
||||
},
|
||||
"form-data": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
|
||||
"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
|
||||
"requires": {
|
||||
"asynckit": "^0.4.0",
|
||||
"combined-stream": "^1.0.8",
|
||||
"mime-types": "^2.1.12"
|
||||
}
|
||||
},
|
||||
"fs.realpath": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
|
||||
@@ -2425,19 +2250,6 @@
|
||||
"picomatch": "^2.3.1"
|
||||
}
|
||||
},
|
||||
"mime-db": {
|
||||
"version": "1.52.0",
|
||||
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
|
||||
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
|
||||
},
|
||||
"mime-types": {
|
||||
"version": "2.1.35",
|
||||
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
|
||||
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
|
||||
"requires": {
|
||||
"mime-db": "1.52.0"
|
||||
}
|
||||
},
|
||||
"min-indent": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
|
||||
@@ -2532,11 +2344,6 @@
|
||||
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
|
||||
"dev": true
|
||||
},
|
||||
"proxy-from-env": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
|
||||
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
|
||||
},
|
||||
"queue-microtask": {
|
||||
"version": "1.2.3",
|
||||
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
|
||||
@@ -2815,9 +2622,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"svelte": {
|
||||
"version": "3.52.0",
|
||||
"resolved": "https://registry.npmjs.org/svelte/-/svelte-3.52.0.tgz",
|
||||
"integrity": "sha512-FxcnEUOAVfr10vDU5dVgJN19IvqeHQCS1zfe8vayTfis9A2t5Fhx+JDe5uv/C3j//bB1umpLJ6quhgs9xyUbCQ==",
|
||||
"version": "3.53.1",
|
||||
"resolved": "https://registry.npmjs.org/svelte/-/svelte-3.53.1.tgz",
|
||||
"integrity": "sha512-Q4/hHkktZogGhN5iqxqSi9sjEVoe/NbIxX4hXEHoasTxj+TxEQVAq66LnDMdAZxjmsodkoI5F3slqsS68U7FNw==",
|
||||
"dev": true
|
||||
},
|
||||
"svelte-check": {
|
||||
@@ -2896,9 +2703,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"typescript": {
|
||||
"version": "4.8.4",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz",
|
||||
"integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==",
|
||||
"version": "4.9.3",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz",
|
||||
"integrity": "sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==",
|
||||
"dev": true
|
||||
},
|
||||
"wrappy": {
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"scripts": {
|
||||
"build": "rollup -c",
|
||||
"dev": "rollup -c -w",
|
||||
"start": "sirv public --no-clear --host",
|
||||
"start": "sirv public --no-clear",
|
||||
"check": "svelte-check --tsconfig ./tsconfig.json"
|
||||
},
|
||||
"devDependencies": {
|
||||
@@ -25,8 +25,6 @@
|
||||
"typescript": "^4.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"axios": "^1.1.3",
|
||||
"bootstrap": "^5.2.2",
|
||||
"sirv-cli": "^2.0.0",
|
||||
"svelte-spa-router": "^3.3.0"
|
||||
}
|
||||
|
||||
|
After Width: | Height: | Size: 134 KiB |
|
After Width: | Height: | Size: 127 KiB |
@@ -0,0 +1,183 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg>
|
||||
<metadata>
|
||||
Created by FontForge 20090914 at Thu Feb 23 16:36:38 2012
|
||||
By ffonts
|
||||
Copyright AtushiAoki 1998.All rights recerved.Add‐FatMan Ver1.0
|
||||
</metadata>
|
||||
<defs>
|
||||
<font id="AddFatMan" horiz-adv-x="740" >
|
||||
<font-face
|
||||
font-family="AddFatMan"
|
||||
font-weight="400"
|
||||
font-stretch="normal"
|
||||
units-per-em="1000"
|
||||
panose-1="0 0 4 0 0 0 0 0 0 0"
|
||||
ascent="800"
|
||||
descent="-200"
|
||||
x-height="592"
|
||||
cap-height="675"
|
||||
bbox="0 -33 792 800"
|
||||
underline-thickness="20"
|
||||
underline-position="-123"
|
||||
unicode-range="U+0020-U+007A"
|
||||
/>
|
||||
<missing-glyph horiz-adv-x="500"
|
||||
d="M63 0v800h375v-800h-375zM125 63h250v675h-250v-675z" />
|
||||
<glyph glyph-name=".notdef" horiz-adv-x="500"
|
||||
d="M63 0v800h375v-800h-375zM125 63h250v675h-250v-675z" />
|
||||
<glyph glyph-name=".null" horiz-adv-x="0"
|
||||
/>
|
||||
<glyph glyph-name="nonmarkingreturn" horiz-adv-x="327"
|
||||
/>
|
||||
<glyph glyph-name="space" unicode=" " horiz-adv-x="327"
|
||||
/>
|
||||
<glyph glyph-name="exclam" unicode="!" horiz-adv-x="363"
|
||||
d="M0 550v-250q0 -76 82 -84h126q84 7 84 84v375h-167q-125 -9 -125 -125zM208 92q78 0 84 83h-84v0h-125v0q-83 -6 -83 -83h208z" />
|
||||
<glyph glyph-name="comma" unicode="," horiz-adv-x="327"
|
||||
/>
|
||||
<glyph glyph-name="hyphen" unicode="-" horiz-adv-x="541"
|
||||
d="M378 258q77 0 83 84h-83v-1h-292v1q-83 -6 -83 -84h375z" />
|
||||
<glyph glyph-name="hyphen" unicode="‐" horiz-adv-x="541"
|
||||
d="M378 258q77 0 83 84h-83v-1h-292v1q-83 -6 -83 -84h375z" />
|
||||
<glyph glyph-name="period" unicode="." horiz-adv-x="327"
|
||||
/>
|
||||
<glyph glyph-name="zero" unicode="0" horiz-adv-x="739"
|
||||
d="M542 675h-417q-125 -9 -125 -125v-333q0 -116 125 -125h417q125 9 125 125v333q0 116 -125 125zM292 300q0 78 83 84l128 -1l-198 -198q-13 14 -13 32v83zM583 217q0 -39 -41 -42h-130l171 171v-4v-125z" />
|
||||
<glyph glyph-name="one" unicode="1" horiz-adv-x="449"
|
||||
d="M0 550v-167h83v-291h209q83 6 83 83v500h-250q-125 -9 -125 -125z" />
|
||||
<glyph glyph-name="two" unicode="2" horiz-adv-x="736"
|
||||
d="M542 675h-417q-116 0 -125 -125v-167h500q77 0 83 -41q0 -39 -41 -42h-459q-77 0 -83 -83v-42q0 -77 83 -83h500q78 0 84 83h-334q-38 0 -41 42h250q116 0 125 125v208q0 116 -125 125z" />
|
||||
<glyph glyph-name="three" unicode="3"
|
||||
d="M542 675h-417q-116 0 -125 -125v-167h500q77 0 83 -41q0 -39 -41 -42h-500v-83h541q-3 -42 -41 -42h-542q6 -83 83 -83h500q84 6 84 83v42q0 30 -22 50q22 30 22 75v208q0 116 -125 125z" />
|
||||
<glyph glyph-name="four" unicode="4" horiz-adv-x="698"
|
||||
d="M500 550v-250h-208v375h-167q-125 -9 -125 -125v-208q0 -116 125 -125h375v-125q116 0 125 124v459q-116 0 -125 -125z" />
|
||||
<glyph glyph-name="five" unicode="5" horiz-adv-x="730"
|
||||
d="M0 550v-208q9 -125 125 -125h458q-3 -42 -41 -42h-542q6 -83 83 -83h500q84 6 84 83v42q-6 83 -84 83h-251h-40v42q6 42 83 42l125 -1q167 9 167 125v167h-542q-125 -9 -125 -125z" />
|
||||
<glyph glyph-name="six" unicode="6" horiz-adv-x="730"
|
||||
d="M0 550v-375q6 -83 83 -83h500q84 6 84 83v42q-6 83 -84 83h-251h-40v42q6 42 83 42l125 -1q167 9 167 125v167h-542q-125 -9 -125 -125zM583 217q-3 -42 -41 -42h-250v42h291z" />
|
||||
<glyph glyph-name="seven" unicode="7" horiz-adv-x="741"
|
||||
d="M0 550v-167h583v-208q6 -83 84 -83v583h-542q-125 -9 -125 -125z" />
|
||||
<glyph glyph-name="eight" unicode="8"
|
||||
d="M542 675h-417q-125 -9 -125 -125v-208q0 -34 19 -70q-19 -26 -19 -55v-42q6 -83 83 -83h500q84 6 84 83v42q0 30 -23 50q23 38 23 75v208q0 116 -125 125zM542 175h-209q-41 3 -41 42h291q-3 -42 -41 -42zM542 300v0h-209q-41 3 -41 42q0 38 41 41h209q41 -3 41 -42
|
||||
q0 -37 -39 -41h-2v0z" />
|
||||
<glyph glyph-name="nine" unicode="9"
|
||||
d="M542 675h-417q-125 -9 -125 -125v-208q0 -116 125 -125h458q-3 -42 -41 -42h-542q6 -83 83 -83h500q84 6 84 83v375q0 116 -125 125zM292 300q0 77 83 83h167q41 -3 41 -41v-42h-291z" />
|
||||
<glyph glyph-name="colon" unicode=":" horiz-adv-x="187"
|
||||
d="M63 217q-26 0 -44.5 -18.5t-18.5 -44.5t18.5 -44t44.5 -18q25 0 43.5 18t18.5 44t-18.5 44.5t-43.5 18.5zM63 467q-26 0 -44.5 -18.5t-18.5 -44.5t18.5 -44t44.5 -18q25 0 43.5 18t18.5 44t-18.5 44.5t-43.5 18.5z" />
|
||||
<glyph glyph-name="semicolon" unicode=";" horiz-adv-x="190"
|
||||
d="M63 467q-26 0 -44.5 -18.5t-18.5 -44.5t18.5 -44t44.5 -18q25 0 43.5 18t18.5 44t-18.5 44.5t-43.5 18.5zM125 113v41q0 26 -18.5 44.5t-43.5 18.5q-26 0 -44.5 -18.5t-18.5 -44.5q0 -44 42 -59v-66q77 0 83 84z" />
|
||||
<glyph glyph-name="question" unicode="?" horiz-adv-x="732"
|
||||
d="M542 300h-292q-77 0 -83 -83h416q78 0 84 83v375h-542q-125 -9 -125 -125v-167h542q38 0 41 -41q-3 -42 -41 -42zM375 175v0h-125v0q-83 -6 -83 -83h208q77 0 83 83h-83z" />
|
||||
<glyph glyph-name="A" unicode="A" horiz-adv-x="741"
|
||||
d="M125 92h167v125h208q83 6 83 83h-291q6 83 83 83h208v-208q0 -77 84 -83v583h-542q-125 -9 -125 -125v-333q9 -125 125 -125z" />
|
||||
<glyph glyph-name="B" unicode="B"
|
||||
d="M125 92h458q78 0 84 83v42q-3 41 -42 41q42 3 42 42v375h-542q-125 -9 -125 -125v-333q9 -125 125 -125zM375 383h208v-41q-3 -42 -41 -42h-250q6 83 83 83zM292 217h291q-3 -42 -41 -42h-250v42z" />
|
||||
<glyph glyph-name="C" unicode="C" horiz-adv-x="716"
|
||||
d="M125 92h458q84 6 84 83h-292q-83 6 -83 83v42q6 83 83 83h125q167 9 167 125v167h-542q-125 -9 -125 -125v-333q9 -125 125 -125z" />
|
||||
<glyph glyph-name="D" unicode="D" horiz-adv-x="739"
|
||||
d="M667 217v333q0 116 -125 125h-417q-125 -9 -125 -125v-458h542q125 9 125 125zM292 175v208h208q77 0 83 -83v-42q-6 -83 -83 -83h-208z" />
|
||||
<glyph glyph-name="E" unicode="E" horiz-adv-x="729"
|
||||
d="M375 383h125q167 9 167 125v167h-542q-125 -9 -125 -125v-333q9 -125 125 -125h458q84 6 84 83h-292q-52 0 -73 42h281q84 6 84 83h-375q6 83 83 83z" />
|
||||
<glyph glyph-name="F" unicode="F" horiz-adv-x="716"
|
||||
d="M125 92h167v125h291q84 6 84 83h-375q6 83 83 83h125q167 9 167 125v167h-542q-125 -9 -125 -125v-333q9 -125 125 -125z" />
|
||||
<glyph glyph-name="G" unicode="G" horiz-adv-x="731"
|
||||
d="M375 383h125q167 9 167 125v167h-542q-125 -9 -125 -125v-333q9 -125 125 -125h458q84 6 84 83v125h-250q-84 -6 -84 -83h250q-3 -42 -41 -42h-167q-83 6 -83 83v42q6 83 83 83z" />
|
||||
<glyph glyph-name="H" unicode="H"
|
||||
d="M292 299v376h-167q-125 -9 -125 -125v-334q0 -116 125 -125h167v125h166q84 6 84 83h-250zM667 216v459q-116 0 -125 -125v-459q116 0 125 125z" />
|
||||
<glyph glyph-name="I" unicode="I" horiz-adv-x="365"
|
||||
d="M83 92h-1h-8h9zM208 92q84 6 84 83v500h-167q-125 -9 -125 -125v-375q0 -76 82 -83h126z" />
|
||||
<glyph glyph-name="J" unicode="J" horiz-adv-x="719"
|
||||
d="M83 300q-77 0 -83 -84v-41q6 -84 83 -84h334q83 6 83 84v208q167 9 167 125v167h-542q-125 -9 -125 -125v-167h417v-167q-3 -41 -42 -41h-42q-41 3 -41 41v84h-209z" />
|
||||
<glyph glyph-name="K" unicode="K"
|
||||
d="M292 199h208q39 0 42 -42q6 -83 83 -83h42v101q0 52 -29 83q29 32 29 84v315q-116 0 -125 -125v-208q-3 -42 -42 -42h-208v393h-167q-125 -9 -125 -125v-334q0 -116 125 -125h167v108z" />
|
||||
<glyph glyph-name="L" unicode="L" horiz-adv-x="685"
|
||||
d="M667 175h-334q-38 0 -41 41v459h-167q-125 -9 -125 -125v-375q0 -78 83 -84h500q78 0 84 84z" />
|
||||
<glyph glyph-name="M" unicode="M" horiz-adv-x="866"
|
||||
d="M292 342q0 39 41 42q42 -3 42 -42v-166q0 -78 83 -84h84q77 0 83 84v166q0 39 42 42q41 -3 41 -42v-166q6 -84 84 -84v500q-6 84 -84 84h-83q-77 0 -83 -84v-375q0 -38 -42 -41q-42 3 -42 41v375q-6 84 -83 84l-250 -1q-125 -9 -125 -125v-333q0 -116 125 -125h167v250z
|
||||
" />
|
||||
<glyph glyph-name="N" unicode="N" horiz-adv-x="699"
|
||||
d="M542 592v-376q0 -38 -42 -41q-42 3 -42 41v375q-6 84 -83 84h-250q-125 -9 -125 -125v-334q0 -116 125 -125h167v250q0 39 41 42q42 -3 42 -42v-166q0 -78 83 -84h84q77 0 83 84v0v500q-77 0 -83 -83z" />
|
||||
<glyph glyph-name="O" unicode="O" horiz-adv-x="739"
|
||||
d="M667 216v334q0 116 -125 125h-417q-125 -9 -125 -125v-334q0 -116 125 -125h417q125 9 125 125zM292 216v84q0 77 83 83h167q41 -3 41 -42v-125q0 -38 -41 -41h-209q-41 3 -41 41z" />
|
||||
<glyph glyph-name="P" unicode="P" horiz-adv-x="730"
|
||||
d="M0 556v-333q9 -125 125 -125h167v125h291q84 6 84 83v375h-542q-125 -9 -125 -125zM375 390h167q38 0 41 -42q-3 -42 -41 -42h-250q6 84 83 84z" />
|
||||
<glyph glyph-name="Q" unicode="Q" horiz-adv-x="806"
|
||||
d="M667 300v250q0 116 -125 125h-417q-125 -9 -125 -125v-334q0 -116 125 -125h417q125 9 125 125h83q0 78 -83 84zM583 300h-208q0 -78 83 -84h125q0 -38 -41 -41h-209q-41 3 -41 41v84q0 77 83 83h167q41 -3 41 -42v-41z" />
|
||||
<glyph glyph-name="R" unicode="R" horiz-adv-x="741"
|
||||
d="M667 508v167h-542q-125 -9 -125 -125v-334q9 -125 125 -125h167v125h250q38 0 41 -41q6 -84 84 -84v84q0 52 -29 84q29 39 29 82v167zM542 300h-250q6 83 83 83h167q38 0 41 -42q-3 -41 -41 -41z" />
|
||||
<glyph glyph-name="S" unicode="S" horiz-adv-x="731"
|
||||
d="M375 383h292v167q0 116 -125 125h-417q-125 -9 -125 -125v-209q9 -125 125 -125h458q-3 -41 -41 -41h-542q6 -84 83 -84h500q84 6 84 84v41q-6 84 -84 84h-251h-40v41q6 42 83 42z" />
|
||||
<glyph glyph-name="T" unicode="T" horiz-adv-x="711"
|
||||
d="M375 91v292h125q167 9 167 125v167h-542q-125 -9 -125 -125v-167h292v-208q6 -84 83 -84z" />
|
||||
<glyph glyph-name="U" unicode="U" horiz-adv-x="699"
|
||||
d="M542 91q77 0 83 84v0v500q-77 0 -83 -84v-374q-6 -39 -42 -42h-167q-38 0 -41 42v458h-167q-125 -9 -125 -125v-375q0 -76 82 -84h460z" />
|
||||
<glyph glyph-name="V" unicode="V" horiz-adv-x="737"
|
||||
d="M667 342v333q-78 0 -84 -83v-250q0 -105 -83 -146q-35 -18 -83 -21h-84q-38 0 -41 42v458h-167q-125 -9 -125 -125v-333q0 -116 125 -125h292q156 0 218 125q26 52 32 125z" />
|
||||
<glyph glyph-name="W" unicode="W" horiz-adv-x="865"
|
||||
d="M625 92h83q78 0 84 83v500q-78 0 -84 -83v-369q0 -38 -41 -41q-42 3 -42 41v369q-6 83 -83 83h-84q-83 -6 -83 -83v-369q0 -38 -42 -41q-41 3 -41 41v452h-167q-125 -9 -125 -125v-333q0 -116 125 -125h250q77 0 83 83v167q0 38 42 41q42 -3 42 -41v-167q6 -83 83 -83z
|
||||
" />
|
||||
<glyph glyph-name="X" unicode="X" horiz-adv-x="741"
|
||||
d="M292 175q3 42 41 42h167q39 0 42 -42q6 -83 83 -83h42v83q0 52 -29 84q29 31 29 83v333q-116 0 -125 -125v-208q-3 -42 -42 -42h-167q-41 3 -41 42v333h-167q-125 -9 -125 -125v-208q0 -77 83 -83q-77 0 -83 -84v-83h208q78 0 84 83z" />
|
||||
<glyph glyph-name="Y" unicode="Y" horiz-adv-x="732"
|
||||
d="M333 101h84v125h166q78 0 84 84v375q-78 0 -84 -84v-250q-3 -41 -41 -41h-209q-41 3 -41 41v334h-167q-125 -9 -125 -125v-209q0 -116 83 -125h250v-125z" />
|
||||
<glyph glyph-name="Z" unicode="Z" horiz-adv-x="738"
|
||||
d="M583 176h-291q0 39 41 42l250 -1q78 0 84 84v375h-542q-125 -9 -125 -125v-167h542q38 0 41 -42q-3 -41 -41 -41h-459q-77 0 -83 -84v-124h667q0 77 -84 83z" />
|
||||
<glyph glyph-name="underscore" unicode="_" horiz-adv-x="538"
|
||||
d="M375 175v0h-292v0q-83 -6 -83 -83h375q77 0 83 83h-83z" />
|
||||
<glyph glyph-name="a" unicode="a" horiz-adv-x="656"
|
||||
d="M583 175v417h-458q-125 -9 -125 -125v-250q9 -125 125 -125h292q83 6 83 83h-208v125q6 83 83 83h125v-208q0 -77 83 -83v83z" />
|
||||
<glyph glyph-name="b" unicode="b" horiz-adv-x="651"
|
||||
d="M125 675q-125 -9 -125 -125v-333q0 -116 125 -125h333q125 9 125 125v250q0 116 -125 125h-166v83h-167zM375 384l83 -1q42 -3 42 -41v-125q0 -39 -42 -42h-125q-41 3 -41 42v83q0 78 83 84z" />
|
||||
<glyph glyph-name="c" unicode="c" horiz-adv-x="635"
|
||||
d="M583 175h-208q-83 6 -83 83v42q6 83 83 83h83q125 4 125 84v125h-458q-125 -9 -125 -125v-250q9 -125 125 -125h375q83 6 83 83z" />
|
||||
<glyph glyph-name="d" unicode="d" horiz-adv-x="656"
|
||||
d="M458 92q125 9 125 125v458q-77 0 -83 -83h-375q-125 -9 -125 -125v-250q0 -116 125 -125h333zM292 300q0 78 83 84l83 -1q42 -3 42 -41v-125q0 -39 -42 -42h-125q-41 3 -41 42v83z" />
|
||||
<glyph glyph-name="e" unicode="e" horiz-adv-x="651"
|
||||
d="M0 467v-250q0 -116 125 -125h333q125 9 125 125h-83q0 -39 -42 -42h-125q-41 3 -41 42v41h291v209q0 116 -125 125h-333q-125 -9 -125 -125zM375 384l83 -1q42 -3 42 -41h-198q21 42 73 42z" />
|
||||
<glyph glyph-name="f" unicode="f" horiz-adv-x="676"
|
||||
d="M83 133q9 -125 125 -125h167v167q83 6 83 83h-83q6 84 83 84h42q125 6 125 83v167h-417q-125 -9 -125 -125v-209q-83 -6 -83 -83h83v-42z" />
|
||||
<glyph glyph-name="g" unicode="g" horiz-adv-x="655"
|
||||
d="M458 592h-333q-125 -9 -125 -125v-250q0 -116 125 -125h375q-3 -42 -42 -42h-458q0 -77 83 -83h417q83 6 83 83v417q0 116 -125 125zM500 217q0 -39 -42 -42h-125q-41 3 -41 42v83q0 78 83 84l83 -1q42 -3 42 -41v-125z" />
|
||||
<glyph glyph-name="h" unicode="h" horiz-adv-x="652"
|
||||
d="M583 217v250q0 116 -125 125h-166v83h-167q-125 -9 -125 -125v-333q0 -116 125 -125h167v208q0 78 83 84l83 -1q42 -3 42 -41v-250q77 0 83 83v42z" />
|
||||
<glyph glyph-name="i" unicode="i" horiz-adv-x="363"
|
||||
d="M83 92h-1h-8h9zM208 92q84 6 84 83v375h-167q-125 -9 -125 -125v-250q0 -76 82 -83h126zM83 675q-83 -6 -83 -83h208q84 6 84 83h-209z" />
|
||||
<glyph glyph-name="j" unicode="j" horiz-adv-x="614"
|
||||
d="M542 133v417q-84 -6 -84 -83v-333q0 -39 -41 -42h-21h-21q-83 6 -83 83v125h-167q-125 -9 -125 -125v-42q0 -116 125 -125h292q125 9 125 125zM625 675h-208q-84 -6 -84 -83h209q83 6 83 83z" />
|
||||
<glyph glyph-name="k" unicode="k" horiz-adv-x="654"
|
||||
d="M125 85h167v108h125q38 0 41 -42q6 -83 84 -83h41v101q0 51 -28 83q28 32 28 84v249q-116 0 -125 -125v-142q-3 -42 -41 -42h-125v392h-167q-125 -8 -125 -125v-333q0 -116 125 -125z" />
|
||||
<glyph glyph-name="l" unicode="l" horiz-adv-x="475"
|
||||
d="M417 169h-84q-38 0 -41 41v458h-167q-125 -8 -125 -125v-374q0 -78 83 -84h250q78 0 84 84z" />
|
||||
<glyph glyph-name="m" unicode="m" horiz-adv-x="863"
|
||||
d="M792 168v292q0 116 -125 125h-542q-125 -9 -125 -125v-250q0 -116 125 -125h167v209q0 77 83 83h21h21q41 -3 41 -42v-243h84v202q0 77 83 83h21h21q41 -3 41 -42v-250q78 0 84 83z" />
|
||||
<glyph glyph-name="n" unicode="n" horiz-adv-x="655"
|
||||
d="M583 168v292q0 116 -125 125h-333q-125 -9 -125 -125v-250q0 -116 125 -125h167v209q0 77 83 83h83q42 -3 42 -42v-250q77 0 83 83z" />
|
||||
<glyph glyph-name="o" unicode="o" horiz-adv-x="654"
|
||||
d="M458 592h-333q-125 -9 -125 -125v-250q0 -116 125 -125h333q125 9 125 125v250q0 116 -125 125zM500 217q0 -39 -42 -42h-125q-41 3 -41 42v83q0 78 83 84l83 -1q42 -3 42 -41v-125z" />
|
||||
<glyph glyph-name="p" unicode="p" horiz-adv-x="654"
|
||||
d="M0 217v-84q0 -116 125 -125h167v84h166q125 9 125 125v250q0 116 -125 125h-333q-125 -9 -125 -125v-250zM292 300q0 78 83 84l83 -1q42 -3 42 -41v-125q0 -39 -42 -42h-125q-41 3 -41 42v83z" />
|
||||
<glyph glyph-name="q" unicode="q" horiz-adv-x="655"
|
||||
d="M583 133v334q0 116 -125 125h-333q-125 -9 -125 -125v-250q0 -116 125 -125h375v-84q83 9 83 125zM458 175h-125q-41 3 -41 42v83q0 77 83 83h83q42 -3 42 -41v-125q0 -39 -42 -42z" />
|
||||
<glyph glyph-name="r" unicode="r" horiz-adv-x="622"
|
||||
d="M125 92h167v208q0 78 83 84l208 -1v84q0 116 -125 125h-333q-125 -9 -125 -125v-250q0 -116 125 -125z" />
|
||||
<glyph glyph-name="s" unicode="s" horiz-adv-x="647"
|
||||
d="M583 175v42q-6 83 -83 83h-168h-40v42q6 42 83 42l42 -1q166 6 166 84v125h-458q-125 -9 -125 -125v-125q9 -125 125 -125h375q-3 -42 -42 -42h-458q6 -83 83 -83h417q83 6 83 83z" />
|
||||
<glyph glyph-name="t" unicode="t" horiz-adv-x="630"
|
||||
d="M333 592v83q-25 -2 -47 -10q-52 -21 -78 -73h-83q-125 -9 -125 -125v-84h208v-166q9 -125 125 -125h84q83 6 83 83h-125q-42 3 -42 42v166h84q166 9 166 125v84h-250z" />
|
||||
<glyph glyph-name="u" unicode="u" horiz-adv-x="614"
|
||||
d="M458 508v-333h-125q-38 0 -41 41v376l-167 -1q-125 -9 -125 -125v-291q0 -77 82 -84h376q78 0 84 84v417q-78 0 -84 -84z" />
|
||||
<glyph glyph-name="v" unicode="v" horiz-adv-x="651"
|
||||
d="M583 342v250q-77 0 -83 -84v-166q0 -105 -83 -146q-35 -18 -84 -21q-38 0 -41 42v375h-167q-125 -9 -125 -125v-250q0 -116 125 -125h208q157 0 219 125q26 52 31 125z" />
|
||||
<glyph glyph-name="w" unicode="w" horiz-adv-x="864"
|
||||
d="M708 509v-286q0 -38 -41 -41q-42 3 -42 41v286q-6 83 -83 83h-84q-83 -6 -83 -83v-286q0 -38 -42 -41q-41 3 -41 41v369h-167q-125 -9 -125 -125v-250q0 -116 125 -125h250q77 0 83 83v167q0 38 42 41q42 -3 42 -41v-167q6 -83 83 -83h83q78 0 84 83v417q-78 0 -84 -83z
|
||||
" />
|
||||
<glyph glyph-name="x" unicode="x" horiz-adv-x="656"
|
||||
d="M458 467v-125q-3 -42 -41 -42h-84q-41 3 -41 42v250h-167q-125 -8 -125 -125v-125q0 -77 83 -83q-77 0 -83 -84v-83h208q78 0 84 83q3 42 41 42h84q38 0 41 -42q6 -83 84 -83h41v83q0 52 -28 84q28 31 28 83v250q-116 0 -125 -125z" />
|
||||
<glyph glyph-name="y" unicode="y" horiz-adv-x="656"
|
||||
d="M500 509v-292q-3 -42 -42 -42h-125q-41 3 -41 42v375h-167q-125 -9 -125 -125v-250q0 -116 83 -125h417q-3 -42 -42 -42h-458q0 -77 83 -83h417q83 6 83 83v542q-77 0 -83 -83z" />
|
||||
<glyph glyph-name="z" unicode="z" horiz-adv-x="653"
|
||||
d="M0 467v-84h458q39 0 42 -42q-3 -41 -42 -41h-375q-77 0 -83 -84v-41q0 -78 83 -84h417q77 0 83 84h-250q-38 0 -41 41h208q77 0 83 84v292h-458q-125 -9 -125 -125z" />
|
||||
</font>
|
||||
</defs></svg>
|
||||
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 134 KiB |
BIN
srcs/requirements/svelte/api_front/public/fonts/Barcade.otf
Normal file
BIN
srcs/requirements/svelte/api_front/public/fonts/Bondi.ttf.eot
Normal file
2376
srcs/requirements/svelte/api_front/public/fonts/Bondi.ttf.svg
Normal file
|
After Width: | Height: | Size: 107 KiB |
BIN
srcs/requirements/svelte/api_front/public/fonts/Bondi.ttf.woff
Normal file
@@ -0,0 +1,512 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg>
|
||||
<metadata>
|
||||
Created by FontForge 20120731 at Tue Oct 18 10:48:08 2022
|
||||
By ffonts
|
||||
Copyright (c) 2021, Khalid M. All right reserved.
|
||||
Behance.com/khalydm
|
||||
</metadata>
|
||||
<defs>
|
||||
<font id="Monocode-Regular-V01.02b" horiz-adv-x="600" >
|
||||
<font-face
|
||||
font-family="Monocode"
|
||||
font-weight="400"
|
||||
font-stretch="normal"
|
||||
units-per-em="1000"
|
||||
panose-1="2 0 5 9 0 0 0 0 0 0"
|
||||
ascent="800"
|
||||
descent="-200"
|
||||
x-height="535"
|
||||
cap-height="788"
|
||||
bbox="25 -132 575 791"
|
||||
underline-thickness="50"
|
||||
underline-position="-50"
|
||||
unicode-range="U+0020-00FF"
|
||||
/>
|
||||
<missing-glyph
|
||||
d="M33 0v666h265v-666h-265zM66 33h199v600h-199v-600z" />
|
||||
<glyph glyph-name=".notdef"
|
||||
d="M33 0v666h265v-666h-265zM66 33h199v600h-199v-600z" />
|
||||
<glyph glyph-name=".null" horiz-adv-x="0"
|
||||
/>
|
||||
<glyph glyph-name="nonmarkingreturn"
|
||||
/>
|
||||
<glyph glyph-name="space" unicode=" "
|
||||
/>
|
||||
<glyph glyph-name="exclam" unicode="!"
|
||||
d="M338 170h-76v618h76v-618zM338 91v-93h-76v93h76z" />
|
||||
<glyph glyph-name="quotedbl" unicode="""
|
||||
d="M282 788v-93q0 -36 -32 -52q-13 -6 -26 -6v34q18 0 23 18q1 3 1 6h-43v93h77zM318 788h77v-93q0 -36 -32 -52q-13 -6 -26 -6v34q18 0 23 18q1 3 1 6h-43v93z" />
|
||||
<glyph glyph-name="numbersign" unicode="#"
|
||||
d="M532 470h-68l-23 -152h68l-11 -76h-69l-37 -242h-76l37 242h-152l-37 -242h-76l36 242h-68l12 76h68l23 152h-68l11 76h69l37 242h76l-37 -242h152l37 242h76l-36 -242h68zM364 318l23 152h-151l-23 -152h151z" />
|
||||
<glyph glyph-name="dollar" unicode="$"
|
||||
d="M502 578h-77v42q0 11 -18 16q-5 2 -11 2h-58v-133h58q59 0 90 -44q16 -24 16 -50v-243q0 -51 -48 -79q-27 -15 -58 -16h-58v-75h-76v75h-58q-59 0 -90 45q-16 24 -16 50v42h77v-42q0 -11 18 -17q6 -1 11 -1h58v279h-58q-59 0 -90 45q-16 23 -16 50v96q0 51 48 79
|
||||
q27 15 58 15h58v74h76v-74h58q59 0 90 -44q16 -24 16 -50v-42zM396 429h-58v-279h58q24 4 29 18v243q0 11 -18 16q-6 2 -11 2zM262 505v133h-58q-24 -4 -29 -18v-96q0 -12 18 -17q6 -1 11 -2h58z" />
|
||||
<glyph glyph-name="percent" unicode="%"
|
||||
d="M202 525h-30q-51 0 -78 44q-14 23 -14 49v78q0 51 44 78q23 14 48 14h30q52 0 79 -44q13 -23 14 -48v-78q0 -52 -44 -79q-23 -13 -49 -14zM172 711q-13 -3 -15 -15v-78q3 -13 15 -16h30q13 3 16 16v78q-3 13 -16 15h-30zM428 0h-30q-52 0 -79 44q-13 23 -14 48v78
|
||||
q0 52 44 79q23 13 49 14h30q51 0 78 -45q14 -22 14 -48v-78q0 -51 -44 -78q-23 -14 -48 -14zM398 186q-13 -3 -16 -16v-78q0 -13 12 -15q3 0 4 -1h30q13 4 15 16v78q-3 13 -15 16h-30zM520 788l-363 -788h-77l363 788h77z" />
|
||||
<glyph glyph-name="ampersand" unicode="&"
|
||||
d="M497 -50h-88l-31 55q-16 -5 -31 -5h-138q-57 0 -88 48q-17 27 -18 58v156q0 57 48 88q14 9 29 14l-25 46q-13 24 -13 51v149q0 57 47 88q27 18 58 18h67q56 0 88 -48q17 -27 17 -58v-205h-76v205q0 22 -22 28q-4 1 -7 1h-67q-22 0 -28 -21q-1 -4 -1 -8v-149q1 -8 4 -14
|
||||
l44 -79v-1l110 -199v113h76v-175q0 -28 -13 -52zM209 77h130l-119 214h-11q-22 0 -28 -21q-1 -5 -1 -8v-156q0 -22 21 -28q5 -1 8 -1z" />
|
||||
<glyph glyph-name="quotesingle" unicode="'"
|
||||
d="M262 791h76v-92q0 -36 -32 -52q-12 -6 -26 -6v33q20 7 24 25h-42v92z" />
|
||||
<glyph glyph-name="parenleft" unicode="("
|
||||
d="M372 0q-86 0 -141 67q-41 50 -41 115v424q0 86 67 141q51 41 115 41h38v-77h-38q-56 0 -88 -46q-17 -27 -17 -59v-424q0 -57 46 -88q27 -17 59 -18v-76z" />
|
||||
<glyph glyph-name="parenright" unicode=")"
|
||||
d="M228 0h-38v76h38q56 0 88 47q17 27 17 59v424q0 57 -46 88q-27 17 -59 17h-38v77h38q86 0 141 -67q41 -51 41 -115v-424q0 -86 -67 -141q-51 -41 -115 -41z" />
|
||||
<glyph glyph-name="asterisk" unicode="*"
|
||||
d="M414 677l-52 -16l32 -45l-62 -45l-32 45l-32 -45l-62 45l32 45l-52 16l24 73l52 -17v55h76v-55l52 17z" />
|
||||
<glyph glyph-name="plus" unicode="+"
|
||||
d="M338 476v-138h138v-76h-138v-138h-76v138h-138v76h138v138h76z" />
|
||||
<glyph glyph-name="comma" unicode=","
|
||||
d="M262 92h76v-93q0 -36 -32 -52q-12 -6 -26 -6v34q20 6 24 24h-42v93z" />
|
||||
<glyph glyph-name="hyphen" unicode="-"
|
||||
d="M182 262v76h236v-76h-236z" />
|
||||
<glyph glyph-name="period" unicode="."
|
||||
d="M262 0v93h76v-93h-76z" />
|
||||
<glyph glyph-name="slash" unicode="/"
|
||||
d="M191 0h-77l295 788h77z" />
|
||||
<glyph glyph-name="zero" unicode="0"
|
||||
d="M419 788q57 0 88 -48q16 -26 16 -57v-578q0 -57 -47 -88q-26 -16 -57 -17h-238q-57 0 -88 48q-16 26 -16 57v578q0 57 47 88q26 16 57 17h238zM181 711q-21 0 -27 -20q-1 -4 -1 -8v-480l282 503q-8 5 -16 5h-238zM419 77q21 0 27 20q1 4 1 8v467l-276 -493q5 -2 10 -2
|
||||
h238z" />
|
||||
<glyph glyph-name="one" unicode="1"
|
||||
d="M338 76h182v-76h-440v76h182v607l-123 -123l-55 54l174 173h80v-711z" />
|
||||
<glyph glyph-name="two" unicode="2"
|
||||
d="M519 0h-439v172l354 333q9 9 9 21v156q0 22 -21 28q-5 1 -8 1h-228q-22 0 -28 -22q-1 -4 -1 -7v-39h-77v39q0 56 48 88q27 17 58 17h228q57 0 88 -47q17 -27 18 -58v-156q-1 -45 -33 -77l-330 -310v-63h286v68h76v-144z" />
|
||||
<glyph glyph-name="three" unicode="3"
|
||||
d="M496 497q24 -30 24 -67v-324q-1 -57 -48 -88q-27 -18 -58 -18h-228q-57 0 -88 47q-18 28 -18 59v39h77v-39q0 -22 21 -28l8 -2h228q22 0 28 22q1 4 1 8v324q0 12 -8 20q-9 8 -21 9h-138h-39v76h39h138q12 1 21 9q8 9 8 21v117q0 22 -21 28q-5 1 -8 1h-228q-22 0 -28 -22
|
||||
q-1 -4 -1 -7v-39h-77v39q0 56 48 88q27 17 58 17h228q57 0 88 -47q17 -27 18 -58v-117q-1 -39 -24 -68z" />
|
||||
<glyph glyph-name="four" unicode="4"
|
||||
d="M443 787h77v-594v-76v-117h-77v117h-363v61l192 610l80 -1l-187 -594h278v594z" />
|
||||
<glyph glyph-name="five" unicode="5"
|
||||
d="M414 1h-228q-57 0 -88 47q-17 27 -18 58h77q0 -22 21 -28q5 -1 8 -1h228q12 1 20 9q9 9 9 21l-1 323q0 22 -21 29q-5 0 -8 1h-333v328h440v-144h-77v68h-286v-176h256q57 0 88 -47q17 -27 18 -58l1 -324q-1 -44 -31 -75q-32 -31 -75 -31z" />
|
||||
<glyph glyph-name="six" unicode="6"
|
||||
d="M520 644h-77v38q0 22 -21 28l-8 2h-228q-22 0 -28 -22q-1 -4 -1 -8v-150q15 4 29 4h228q57 0 88 -47q17 -27 18 -59v-324q0 -56 -48 -88q-27 -17 -58 -17h-228q-57 0 -88 47q-17 27 -18 58v576q0 57 48 88q27 18 58 18h228q57 0 88 -47q17 -28 18 -59v-38zM186 460
|
||||
q-22 0 -28 -22q-1 -4 -1 -8v-324q0 -22 21 -28q4 -1 8 -1h228q22 0 28 22q1 4 1 7v324q0 22 -21 29q-4 0 -8 1h-228z" />
|
||||
<glyph glyph-name="seven" unicode="7"
|
||||
d="M520 788v-174l-352 -614h-88l364 634v78h-287v-68h-76v144h439z" />
|
||||
<glyph glyph-name="eight" unicode="8"
|
||||
d="M520 682v-117q-1 -38 -25 -67q24 -30 25 -68v-324q0 -56 -48 -88q-27 -17 -58 -17h-228q-57 0 -88 47q-17 27 -18 58v324q1 39 25 68q-24 30 -25 67v117q0 57 48 88q27 18 58 18h228q57 0 88 -47q17 -28 18 -59zM157 682v-117q0 -22 21 -28q5 -1 8 -1h228q22 0 28 21
|
||||
q1 5 1 8v117q0 22 -21 28q-5 1 -8 2h-228q-22 0 -28 -22q-1 -4 -1 -8zM443 106v324q0 22 -21 29q-5 0 -8 1h-228q-22 0 -28 -22q-1 -4 -1 -8v-324q0 -22 21 -28q5 -1 8 -1h228q22 0 28 22q1 4 1 7z" />
|
||||
<glyph glyph-name="nine" unicode="9"
|
||||
d="M414 788q57 0 88 -47q17 -28 18 -59v-576q0 -56 -48 -88q-27 -17 -58 -17h-228q-44 1 -75 31q-30 31 -31 74v39h77v-39q1 -12 8 -20q10 -8 21 -9h228q22 0 28 22q1 4 1 7v151q-15 -4 -29 -4h-228q-57 0 -88 47q-17 27 -18 58v324q0 57 48 88q27 18 58 18h228zM443 358
|
||||
v324q0 22 -21 28l-8 2h-228q-22 0 -28 -22q-1 -4 -1 -8v-324q0 -22 21 -28q4 -1 8 -1h228q22 0 28 21q1 5 1 8z" />
|
||||
<glyph glyph-name="colon" unicode=":"
|
||||
d="M338 0h-76v93h76v-93zM338 342v-93h-76v93h76z" />
|
||||
<glyph glyph-name="semicolon" unicode=";"
|
||||
d="M338 249h-76v93h76v-93zM262 93h76v-93q0 -36 -32 -52q-12 -6 -26 -6v34q20 6 24 24h-42v93z" />
|
||||
<glyph glyph-name="less" unicode="<"
|
||||
d="M348 159l-145 121v40l145 121l49 -59l-99 -82l99 -82z" />
|
||||
<glyph glyph-name="equal" unicode="="
|
||||
d="M124 191v77h352v-77h-352zM124 332v77h352v-77h-352z" />
|
||||
<glyph glyph-name="greater" unicode=">"
|
||||
d="M252 159l-49 59l99 82l-99 82l49 59l145 -121v-40z" />
|
||||
<glyph glyph-name="question" unicode="?"
|
||||
d="M338 -2h-76v93h76v-93zM338 298v-128h-76v128q0 57 47 88q27 17 59 18h46q22 0 28 21q1 4 1 8v249q0 22 -21 28q-4 1 -8 1h-228q-22 0 -28 -21q-1 -4 -1 -8v-38h-77v38q0 57 48 88q27 18 58 18h228q57 0 88 -48q18 -27 18 -58v-249q0 -57 -48 -88q-27 -18 -58 -18h-46
|
||||
q-23 0 -29 -21q-1 -5 -1 -8z" />
|
||||
<glyph glyph-name="at" unicode="@"
|
||||
d="M497 181h39v-76h-39q-56 0 -88 47q-1 2 -2 3q-28 -19 -61 -19h-58q-57 0 -88 47q-17 27 -18 58v194q0 56 48 88q27 17 58 17h58q24 0 46 -10v64q0 22 -22 28q-4 1 -8 1h-192q-22 0 -28 -21q-1 -5 -1 -8v-486q0 -22 21 -28q5 -1 8 -1h263v-76h-263q-57 0 -88 47
|
||||
q-17 27 -18 58v486q0 57 48 88q27 17 58 17h192q57 0 89 -47q17 -27 17 -58v-384q0 -22 21 -28q5 -1 8 -1zM375 241v194q0 22 -21 28q-5 1 -8 1h-58q-22 0 -28 -22q-1 -4 -1 -7v-194q0 -22 21 -28q5 -1 8 -1h58q22 0 28 21q1 5 1 8z" />
|
||||
<glyph glyph-name="A" unicode="A"
|
||||
d="M442 0l-28 129h-228l-28 -129h-79l172 788h98l172 -788h-79zM203 206h194l-97 447z" />
|
||||
<glyph glyph-name="B" unicode="B"
|
||||
d="M520 682v-117q0 -38 -24 -67q24 -30 24 -68v-324q0 -57 -47 -88q-27 -18 -58 -18h-335v788h335q56 0 88 -48q17 -27 17 -58zM156 711v-175h259q22 0 28 21q1 5 1 8v117q0 22 -21 28q-5 1 -8 1h-259zM444 106v324q0 22 -21 28q-5 1 -8 1h-259v-382h259q22 0 28 21q1 4 1 8
|
||||
z" />
|
||||
<glyph glyph-name="C" unicode="C"
|
||||
d="M414 0h-228q-57 0 -88 48q-18 27 -18 58v576q0 57 48 88q27 18 58 18h228q57 0 88 -48q18 -27 18 -58v-38h-77v38q0 22 -21 28q-4 1 -8 1h-228q-22 0 -28 -21q-1 -4 -1 -8v-576q0 -22 21 -28q4 -1 8 -1h228q22 0 28 21q1 4 1 8v38h77v-38q0 -57 -48 -88q-27 -18 -58 -18z
|
||||
" />
|
||||
<glyph glyph-name="D" unicode="D"
|
||||
d="M414 788q57 0 88 -48q18 -27 18 -58v-576q0 -57 -48 -88q-27 -18 -58 -18h-334v788h334zM443 106v576q0 22 -21 28q-4 1 -8 1h-257v-634h257q22 0 28 21q1 4 1 8z" />
|
||||
<glyph glyph-name="E" unicode="E"
|
||||
d="M520 711h-363v-175h363v-77h-363v-382h363v-77h-440v788h440v-77z" />
|
||||
<glyph glyph-name="F" unicode="F"
|
||||
d="M520 711h-363v-175h363v-77h-363v-459h-77v459v77v252h440v-77z" />
|
||||
<glyph glyph-name="G" unicode="G"
|
||||
d="M414 0h-228q-57 0 -88 48q-18 27 -18 58v576q0 57 48 88q27 18 58 18h228q57 0 88 -48q18 -27 18 -58v-38h-77v38q0 22 -21 28q-4 1 -8 1h-228q-22 0 -28 -21q-1 -4 -1 -8v-576q0 -22 21 -28q4 -1 8 -1h228q22 0 28 21q1 4 1 8v353h-123v77h200v-430q0 -57 -48 -88
|
||||
q-27 -18 -58 -18z" />
|
||||
<glyph glyph-name="H" unicode="H"
|
||||
d="M443 788h77v-788h-77v459h-286v-459h-77v788h77v-252h286v252z" />
|
||||
<glyph glyph-name="I" unicode="I"
|
||||
d="M520 711h-182v-634h182v-77h-440v77h182v634h-182v77h440v-77z" />
|
||||
<glyph glyph-name="J" unicode="J"
|
||||
d="M414 0h-228q-57 0 -88 48q-18 27 -18 58v130h77v-130q0 -22 21 -28q4 -1 8 -1h228q22 0 28 21q1 4 1 8v682h77v-682q0 -57 -48 -88q-27 -18 -58 -18z" />
|
||||
<glyph glyph-name="K" unicode="K"
|
||||
d="M482 711q-27 0 -45 -19l-268 -299l268 -297q18 -19 44 -19h39v-77h-39q-60 1 -100 45l-224 247v-292h-77v788h77v-295l224 250q41 44 101 45h38v-77h-38z" />
|
||||
<glyph glyph-name="L" unicode="L"
|
||||
d="M520 0h-440v788h77v-711h363v-77z" />
|
||||
<glyph glyph-name="M" unicode="M"
|
||||
d="M558 0h-77l1 669l-183 -234l-181 234l1 -669h-77l-1 788h81l178 -228l178 228h81z" />
|
||||
<glyph glyph-name="N" unicode="N"
|
||||
d="M520 0h-76l-287 608v-608h-77v788h76l287 -608v608h77v-788z" />
|
||||
<glyph glyph-name="O" unicode="O"
|
||||
d="M414 0h-228q-57 0 -88 48q-18 27 -18 58v576q0 57 48 88q27 18 58 18h228q57 0 88 -48q18 -27 18 -58v-576q0 -57 -48 -88q-27 -18 -58 -18zM186 711q-22 0 -28 -21q-1 -4 -1 -8v-576q0 -22 21 -28q4 -1 8 -1h228q22 0 28 21q1 4 1 8v576q0 22 -21 28q-4 1 -8 1h-228z
|
||||
" />
|
||||
<glyph glyph-name="P" unicode="P"
|
||||
d="M414 788q57 0 88 -48q18 -27 18 -58v-117q0 -57 -48 -88q-27 -17 -58 -18h-257v-459h-77v788h334zM443 565v117q0 22 -21 28q-4 1 -8 1h-257v-175h257q22 0 28 21q1 5 1 8z" />
|
||||
<glyph glyph-name="Q" unicode="Q"
|
||||
d="M515 106q0 -57 -46 -89q-26 -17 -57 -17h-46q44 -55 112 -55h37v-77h-37q-98 0 -164 76q-22 26 -35 56h-91q-55 0 -86 47q-17 28 -17 59v576q0 57 46 88q27 18 57 18h224q55 0 86 -48q17 -27 17 -58v-576zM334 92q0 -8 1 -16h77q21 0 27 22q1 4 1 8v576q0 22 -21 28
|
||||
q-4 1 -7 1h-224q-21 0 -27 -21q-1 -4 -1 -8v-576q0 -22 21 -28q4 -1 7 -2h72q-1 9 -1 16v38h75v-38z" />
|
||||
<glyph glyph-name="R" unicode="R"
|
||||
d="M520 682v-117q-1 -38 -24 -67q23 -30 24 -67v-431h-77v431q0 21 -21 27q-4 1 -8 1h-257v-459h-77v788h334q57 0 88 -48q18 -27 18 -58zM157 536h257q22 0 28 21q1 5 1 8v117q0 22 -21 28q-4 1 -8 1h-257v-175z" />
|
||||
<glyph glyph-name="S" unicode="S"
|
||||
d="M414 1h-228q-56 0 -88 47q-17 28 -17 59v38h76v-38q0 -22 21 -28q5 -1 8 -1h228q22 0 28 21q1 4 1 8v323q0 22 -21 28q-4 1 -8 1h-228q-44 1 -75 31q-30 32 -31 75l1 117q0 56 47 88q27 17 58 17h228q57 0 88 -47q17 -27 18 -58v-38h-77v38q0 22 -21 28q-4 1 -8 1h-228
|
||||
q-22 0 -28 -21q-1 -5 -1 -8v-117q1 -12 8 -21q10 -8 21 -8h228q57 0 88 -48q17 -27 18 -58v-323q0 -57 -48 -88q-27 -18 -58 -18z" />
|
||||
<glyph glyph-name="T" unicode="T"
|
||||
d="M519 787v-76h-181v-710h-76v710h-181v76h438z" />
|
||||
<glyph glyph-name="U" unicode="U"
|
||||
d="M414 1h-228q-56 0 -88 47q-17 28 -17 59v680h76v-680q0 -22 21 -28q5 -1 8 -1h228q22 0 28 21q1 4 1 8v680h76v-680q0 -57 -47 -88q-27 -18 -58 -18z" />
|
||||
<glyph glyph-name="V" unicode="V"
|
||||
d="M520 787l-171 -787h-98l-171 787h78l142 -652l142 652h78z" />
|
||||
<glyph glyph-name="W" unicode="W"
|
||||
d="M43 788h76v-667l182 233l180 -233v667h76l1 -786h-81l-177 227l-177 -227h-81z" />
|
||||
<glyph glyph-name="X" unicode="X"
|
||||
d="M522 787l-180 -396l178 -390h-84l-136 298l-136 -298h-84l178 390l-180 396h84l138 -304l138 304h84z" />
|
||||
<glyph glyph-name="Y" unicode="Y"
|
||||
d="M521 787l-183 -300v-487h-76v487l-183 300h89l132 -216l132 216h89z" />
|
||||
<glyph glyph-name="Z" unicode="Z"
|
||||
d="M519 1h-438v71l349 638h-349v77h438v-72l-349 -638h349v-76zM119 63z" />
|
||||
<glyph glyph-name="bracketleft" unicode="["
|
||||
d="M410 0h-220v788h220v-77h-143v-635h143v-76z" />
|
||||
<glyph glyph-name="backslash" unicode="\"
|
||||
d="M409 0l-295 788h77l295 -788h-77z" />
|
||||
<glyph glyph-name="bracketright" unicode="]"
|
||||
d="M410 0h-220v76h143v635h-143v77h220v-788z" />
|
||||
<glyph glyph-name="asciicircum" unicode="^"
|
||||
d="M349 611l-49 73l-49 -73l-64 43l91 134h44l91 -134z" />
|
||||
<glyph glyph-name="underscore" unicode="_"
|
||||
d="M80 0v77h440v-77h-440z" />
|
||||
<glyph glyph-name="grave" unicode="`"
|
||||
d="M328 788l21 -114h-49l-49 114h77z" />
|
||||
<glyph glyph-name="a" unicode="a"
|
||||
d="M536 0h-39q-38 1 -67 25q-31 -25 -68 -25h-192q-57 0 -88 48q-17 27 -18 58v138q0 57 48 88q27 17 58 18h221v80q0 22 -21 28q-4 1 -8 1h-192q-22 0 -28 -21q-1 -4 -1 -8v-38h-77v38q0 57 48 88q27 18 58 18h192q57 0 88 -48q17 -27 18 -58v-324q0 -22 21 -28q5 -1 8 -1
|
||||
h39v-77zM362 77q22 0 28 21q1 4 1 8v167h-221q-22 0 -28 -21q-1 -4 -1 -8v-138q0 -22 21 -28q5 -1 8 -1h192z" />
|
||||
<glyph glyph-name="b" unicode="b"
|
||||
d="M430 536q57 0 88 -48q17 -27 18 -58v-324q0 -57 -48 -88q-27 -18 -58 -18h-192q-39 1 -68 25q-30 -25 -67 -25h-39v77h38q23 0 29 21q1 4 1 8v682h76v-256q15 4 30 4h192zM459 106v324q0 22 -21 28q-5 1 -8 1h-192q-22 0 -28 -21l-2 -8v-324q0 -22 22 -28q4 -1 8 -1h192
|
||||
q22 0 28 21q1 4 1 8z" />
|
||||
<glyph glyph-name="c" unicode="c"
|
||||
d="M396 0h-192q-57 0 -88 48q-18 27 -18 58v324q0 57 48 88q27 18 58 18h192q57 0 88 -48q18 -27 18 -58v-38h-77v38q0 22 -21 28q-4 1 -8 1h-192q-22 0 -28 -21q-1 -4 -1 -8v-324q0 -22 21 -28q4 -1 8 -1h192q22 0 28 21q1 4 1 8v38h77v-38q0 -57 -48 -88q-27 -18 -58 -18z
|
||||
" />
|
||||
<glyph glyph-name="d" unicode="d"
|
||||
d="M536 0h-38q-39 1 -68 25q-30 -25 -68 -25h-192q-57 0 -88 48q-17 27 -18 58v324q0 57 48 88q27 18 58 18h192q15 0 29 -4v256h77v-682q0 -22 21 -28q5 -1 8 -1h38zM362 77q22 0 28 21q1 4 1 8v324q0 22 -21 28q-4 1 -8 1h-192q-22 0 -28 -21q-1 -4 -1 -8v-324
|
||||
q0 -22 21 -28q4 -1 8 -1h192z" />
|
||||
<glyph glyph-name="e" unicode="e"
|
||||
d="M396 0h-192q-57 0 -88 48q-18 27 -18 58v324q0 57 48 88q27 18 58 18h192q57 0 88 -48q18 -27 18 -58v-71q0 -57 -48 -89q-27 -17 -58 -17h-221v-147q0 -22 21 -28q4 -1 8 -1h192q22 0 28 21q1 4 1 8v38h77v-38q0 -57 -48 -88q-27 -18 -58 -18zM175 330h221q22 0 28 21
|
||||
q1 4 1 8v71q0 22 -21 28q-4 1 -8 1h-192q-22 0 -28 -21q-1 -4 -1 -8v-100z" />
|
||||
<glyph glyph-name="f" unicode="f"
|
||||
d="M473 711q-72 0 -115 -57q-28 -39 -29 -86v-32h164v-77h-164v-382h164v-77h-164h-76h-164v77h164v382h-164v77h164v32q0 99 74 165q63 55 146 55h38v-77h-38z" />
|
||||
<glyph glyph-name="g" unicode="g"
|
||||
d="M175 536h357v-77h-63q4 -15 4 -30v-130q0 -57 -48 -89q-27 -17 -58 -17h-119q-40 -1 -61 -34h181q57 0 89 -48q17 -27 17 -59v-78q0 -57 -48 -89q-27 -17 -58 -17h-193q-58 0 -89 48q-17 27 -18 58v78q1 44 31 75q2 43 26 78q-49 26 -56 81q-1 7 -1 13v130q0 58 48 89
|
||||
q28 18 59 18zM397 52q0 21 -20 28q-5 2 -9 2h-193q-21 0 -28 -20l-2 -10v-78q0 -21 20 -28l10 -2h193q21 0 28 20q1 6 1 10v78zM396 429q0 22 -20 28q-5 2 -9 2h-33h-159q-21 0 -28 -20l-2 -10v-130q0 -21 20 -28q5 -1 10 -1h73h119q21 0 27 20q2 5 2 9v130z" />
|
||||
<glyph glyph-name="h" unicode="h"
|
||||
d="M427 536q57 0 88 -48q17 -27 18 -58v-430h-77v430q0 22 -21 28q-5 1 -8 1h-215v-459h-77v459v77v146q0 22 -21 28q-4 1 -8 1h-38l-1 77h39q57 0 88 -48q17 -27 18 -58v-146h215z" />
|
||||
<glyph glyph-name="i" unicode="i"
|
||||
d="M338 607h-76v93h76v-93zM338 77h164v-77h-164h-76h-164v77h164v382h-164v77h240v-459z" />
|
||||
<glyph glyph-name="j" unicode="j"
|
||||
d="M98 -56h20q72 0 115 58q29 38 29 85v372h-164v77h404v-77h-164v-372q0 -99 -74 -164q-63 -55 -146 -55h-20v76zM338 700v-93h-76v93h76z" />
|
||||
<glyph glyph-name="k" unicode="k"
|
||||
d="M397 109q16 -31 48 -35h38v-77h-38q-65 0 -104 53q-11 16 -17 34l-66 196l-65 -62v-221h-76v791h76v-463l179 171h111l-164 -157z" />
|
||||
<glyph glyph-name="l" unicode="l"
|
||||
d="M326 682v-608h176v-77h-176h-77h-151v77h151v608q0 21 -20 28q-5 1 -9 1h-39v77h39q57 0 88 -48q17 -27 18 -58z" />
|
||||
<glyph glyph-name="m" unicode="m"
|
||||
d="M448 536q57 0 88 -48q17 -27 18 -58v-430h-77v430q0 22 -21 28q-5 1 -8 1h-47q-22 0 -28 -21q-1 -4 -1 -8v-430h-77v430q0 22 -21 28q-4 1 -8 1h-46q-22 0 -28 -21l-2 -8v-430h-76v430q0 22 -21 28q-5 1 -8 1h-39v77h39q38 -1 67 -25q30 24 68 25h46q39 -1 68 -25
|
||||
q30 24 67 25h47z" />
|
||||
<glyph glyph-name="n" unicode="n"
|
||||
d="M432 536q57 0 89 -48q17 -27 17 -58v-430h-77v430q0 22 -21 28q-4 1 -8 1h-196q-22 0 -28 -21q-1 -4 -1 -8v-430h-76v430q0 22 -22 28q-4 1 -8 1h-38v77h38q39 -1 68 -25q30 24 67 25h196z" />
|
||||
<glyph glyph-name="o" unicode="o"
|
||||
d="M396 535q58 0 89 -48q17 -27 18 -58v-326q0 -57 -48 -88q-27 -18 -59 -18h-192q-58 0 -89 48q-17 27 -18 58v326q0 57 48 88q27 18 59 18h192zM426 103v326q0 21 -20 28q-5 1 -10 1h-192q-21 0 -28 -20q-2 -5 -2 -9v-326q0 -21 20 -28q5 -1 10 -1h192q21 0 28 20q2 5 2 9
|
||||
z" />
|
||||
<glyph glyph-name="p" unicode="p"
|
||||
d="M537 104q0 -58 -48 -89q-27 -17 -59 -18h-193q-15 1 -29 4v-133h-77v561q0 22 -20 28q-5 2 -10 2h-38v77h39q38 -1 68 -25q30 24 67 25h193q58 0 89 -48q18 -27 18 -59v-325zM460 104v325q0 22 -20 28q-5 2 -10 2h-193q-21 0 -27 -20q-2 -5 -2 -10v-325q0 -21 20 -28
|
||||
q5 -2 9 -2h193q22 0 28 20q2 5 2 10z" />
|
||||
<glyph glyph-name="q" unicode="q"
|
||||
d="M170 -3q-58 0 -89 48q-18 27 -18 59v325q0 58 48 89q27 18 59 18h193q38 -1 67 -25q31 24 68 25h39v-77h-38q-23 0 -29 -22q-1 -4 -1 -8v-561h-77v133q-15 -4 -29 -4h-193zM140 429v-325q0 -21 20 -28q5 -2 10 -2h193q21 0 27 20q2 5 2 10v325q0 22 -20 28q-5 2 -9 2
|
||||
h-193q-22 0 -28 -20q-2 -5 -2 -10z" />
|
||||
<glyph glyph-name="r" unicode="r"
|
||||
d="M432 538q58 0 89 -48q17 -27 18 -58v-38h-77v38q0 21 -20 28q-5 1 -10 1h-196q-22 0 -28 -19q-2 -6 -2 -10v-432h-77v432q0 21 -20 28q-4 1 -9 1h-39v77h39q38 0 68 -24q30 24 68 24h196z" />
|
||||
<glyph glyph-name="s" unicode="s"
|
||||
d="M397 -3h-194q-57 0 -88 48q-18 27 -18 59v38h77v-38q0 -21 20 -28q5 -2 9 -2h194q21 0 27 20q2 5 2 10v87q0 21 -20 28q-5 1 -9 1h-194q-57 0 -88 49q-18 27 -18 58v102q0 58 48 89q27 18 58 18h194q57 0 88 -48q18 -27 18 -59h-77q0 22 -20 28q-5 2 -9 2h-194
|
||||
q-21 0 -27 -20q-2 -5 -2 -10v-102q0 -21 20 -28q5 -2 9 -2h194q57 0 88 -48q18 -27 18 -58v-87q0 -58 -48 -89q-27 -17 -58 -18z" />
|
||||
<glyph glyph-name="t" unicode="t"
|
||||
d="M463 78h38v-77h-38q-102 0 -170 76q-57 66 -58 151v231h-136v77h136v136h77v-136h186v-77h-186v-231q0 -74 60 -120q41 -30 91 -30z" />
|
||||
<glyph glyph-name="u" unicode="u"
|
||||
d="M537 0h-39q-37 1 -66 23q-31 -25 -70 -26h-193q-57 0 -89 48q-17 27 -17 59v432h77v-432q0 -21 20 -28q5 -2 9 -2h193q21 0 28 20q2 5 2 10v2v430h77v-430q0 -21 20 -27q4 -2 9 -2h39v-77z" />
|
||||
<glyph glyph-name="v" unicode="v"
|
||||
d="M491 536l-140 -539h-102l-140 539h79l112 -431l112 431h79z" />
|
||||
<glyph glyph-name="w" unicode="w"
|
||||
d="M131 -3q-57 0 -88 48q-18 27 -18 59v432h77v-432q0 -21 20 -28q5 -2 9 -2h65q21 0 28 20q1 5 1 10v432h77v-432q0 -21 20 -28q5 -2 10 -2h68q21 0 28 20q2 5 2 10v2v430h77v-430q0 -21 20 -27q5 -2 9 -2h39v-77h-39q-37 1 -66 23q-31 -25 -70 -26h-68q-39 1 -68 25
|
||||
q-30 -24 -68 -25h-65z" />
|
||||
<glyph glyph-name="x" unicode="x"
|
||||
d="M509 536l-164 -274l160 -266h-90l-115 192l-115 -192h-90l160 266l-164 274h90l119 -199l119 199h90z" />
|
||||
<glyph glyph-name="y" unicode="y"
|
||||
d="M442 536h82l-193 -518q-32 -88 -118 -128q-48 -22 -99 -22h-38v76h38q75 0 122 59q15 20 23 42l9 24l-129 372q-7 17 -25 18h-38v77h38q56 0 87 -47q7 -11 11 -22l98 -285z" />
|
||||
<glyph glyph-name="z" unicode="z"
|
||||
d="M503 -3h-406v58l303 404h-303v77h406v-67l-295 -395h295v-77zM135 42z" />
|
||||
<glyph glyph-name="braceleft" unicode="{"
|
||||
d="M429 0h-79q-66 0 -104 53q-24 34 -24 74v178q0 32 -29 46q-11 4 -22 5v76q32 0 46 30q5 10 5 21v177q0 66 54 104q33 24 74 24h79v-77h-79q-33 0 -47 -29q-4 -11 -5 -22v-177q0 -52 -36 -89q36 -38 36 -89v-178q0 -32 30 -46q11 -4 22 -5h79v-76z" />
|
||||
<glyph glyph-name="bar" unicode="|"
|
||||
d="M262 -56v844h76v-844h-76z" />
|
||||
<glyph glyph-name="braceright" unicode="}"
|
||||
d="M250 0h-79v76h79q33 0 47 30q4 11 5 21v178q0 52 36 89q-36 38 -36 89v177q0 33 -30 47q-11 4 -22 4h-79v77h79q66 0 104 -54q24 -33 24 -74v-177q0 -32 29 -46q11 -5 22 -5v-76q-32 0 -46 -30q-5 -11 -5 -21v-178q0 -65 -54 -103q-33 -24 -74 -24z" />
|
||||
<glyph glyph-name="asciitilde" unicode="~"
|
||||
d="M360 238q-32 0 -76 30q-31 20 -42 17q-8 -3 -19 -14l-27 -27l-54 54l27 27q66 66 148 13q4 -3 9 -7q30 -20 39 -16q5 3 12 10l27 27l54 -54l-27 -27q-34 -33 -71 -33z" />
|
||||
<glyph glyph-name="uni007F"
|
||||
/>
|
||||
<glyph glyph-name="uni0080"
|
||||
/>
|
||||
<glyph glyph-name="uni0081"
|
||||
/>
|
||||
<glyph glyph-name="uni0082"
|
||||
/>
|
||||
<glyph glyph-name="uni0083"
|
||||
/>
|
||||
<glyph glyph-name="uni0084"
|
||||
/>
|
||||
<glyph glyph-name="uni0085" unicode="…"
|
||||
/>
|
||||
<glyph glyph-name="uni0086"
|
||||
/>
|
||||
<glyph glyph-name="uni0087"
|
||||
/>
|
||||
<glyph glyph-name="uni0088"
|
||||
/>
|
||||
<glyph glyph-name="uni0089"
|
||||
/>
|
||||
<glyph glyph-name="uni008A"
|
||||
/>
|
||||
<glyph glyph-name="uni008B"
|
||||
/>
|
||||
<glyph glyph-name="uni008C"
|
||||
/>
|
||||
<glyph glyph-name="uni008D"
|
||||
/>
|
||||
<glyph glyph-name="uni008E"
|
||||
/>
|
||||
<glyph glyph-name="uni008F"
|
||||
/>
|
||||
<glyph glyph-name="uni0090"
|
||||
/>
|
||||
<glyph glyph-name="uni0091"
|
||||
/>
|
||||
<glyph glyph-name="uni0092"
|
||||
/>
|
||||
<glyph glyph-name="uni0093"
|
||||
/>
|
||||
<glyph glyph-name="uni0094"
|
||||
/>
|
||||
<glyph glyph-name="uni0095"
|
||||
/>
|
||||
<glyph glyph-name="uni0096"
|
||||
/>
|
||||
<glyph glyph-name="uni0097"
|
||||
/>
|
||||
<glyph glyph-name="uni0098"
|
||||
/>
|
||||
<glyph glyph-name="uni0099"
|
||||
/>
|
||||
<glyph glyph-name="uni009A"
|
||||
/>
|
||||
<glyph glyph-name="uni009B"
|
||||
/>
|
||||
<glyph glyph-name="uni009C"
|
||||
/>
|
||||
<glyph glyph-name="uni009D"
|
||||
/>
|
||||
<glyph glyph-name="uni009E"
|
||||
/>
|
||||
<glyph glyph-name="uni009F"
|
||||
/>
|
||||
<glyph glyph-name="uni00A0" unicode=" "
|
||||
/>
|
||||
<glyph glyph-name="exclamdown" unicode="¡"
|
||||
/>
|
||||
<glyph glyph-name="cent" unicode="¢"
|
||||
/>
|
||||
<glyph glyph-name="sterling" unicode="£"
|
||||
/>
|
||||
<glyph glyph-name="currency" unicode="¤"
|
||||
/>
|
||||
<glyph glyph-name="yen" unicode="¥"
|
||||
/>
|
||||
<glyph glyph-name="brokenbar" unicode="¦"
|
||||
/>
|
||||
<glyph glyph-name="section" unicode="§"
|
||||
/>
|
||||
<glyph glyph-name="dieresis" unicode="¨"
|
||||
/>
|
||||
<glyph glyph-name="copyright" unicode="©"
|
||||
/>
|
||||
<glyph glyph-name="ordfeminine" unicode="ª"
|
||||
/>
|
||||
<glyph glyph-name="guillemotleft" unicode="«"
|
||||
/>
|
||||
<glyph glyph-name="logicalnot" unicode="¬"
|
||||
/>
|
||||
<glyph glyph-name="uni00AD" unicode="­"
|
||||
/>
|
||||
<glyph glyph-name="registered" unicode="®"
|
||||
/>
|
||||
<glyph glyph-name="macron" unicode="¯"
|
||||
/>
|
||||
<glyph glyph-name="degree" unicode="°"
|
||||
/>
|
||||
<glyph glyph-name="plusminus" unicode="±"
|
||||
/>
|
||||
<glyph glyph-name="uni00B2" unicode="²"
|
||||
/>
|
||||
<glyph glyph-name="uni00B3" unicode="³"
|
||||
/>
|
||||
<glyph glyph-name="acute" unicode="´"
|
||||
/>
|
||||
<glyph glyph-name="mu" unicode="µ"
|
||||
/>
|
||||
<glyph glyph-name="paragraph" unicode="¶"
|
||||
/>
|
||||
<glyph glyph-name="periodcentered" unicode="·"
|
||||
/>
|
||||
<glyph glyph-name="cedilla" unicode="¸"
|
||||
/>
|
||||
<glyph glyph-name="uni00B9" unicode="¹"
|
||||
/>
|
||||
<glyph glyph-name="ordmasculine" unicode="º"
|
||||
/>
|
||||
<glyph glyph-name="guillemotright" unicode="»"
|
||||
/>
|
||||
<glyph glyph-name="onequarter" unicode="¼"
|
||||
/>
|
||||
<glyph glyph-name="onehalf" unicode="½"
|
||||
/>
|
||||
<glyph glyph-name="threequarters" unicode="¾"
|
||||
/>
|
||||
<glyph glyph-name="questiondown" unicode="¿"
|
||||
/>
|
||||
<glyph glyph-name="Agrave" unicode="À"
|
||||
/>
|
||||
<glyph glyph-name="Aacute" unicode="Á"
|
||||
/>
|
||||
<glyph glyph-name="Acircumflex" unicode="Â"
|
||||
/>
|
||||
<glyph glyph-name="Atilde" unicode="Ã"
|
||||
/>
|
||||
<glyph glyph-name="Adieresis" unicode="Ä"
|
||||
/>
|
||||
<glyph glyph-name="Aring" unicode="Å"
|
||||
/>
|
||||
<glyph glyph-name="AE" unicode="Æ"
|
||||
/>
|
||||
<glyph glyph-name="Ccedilla" unicode="Ç"
|
||||
/>
|
||||
<glyph glyph-name="Egrave" unicode="È"
|
||||
/>
|
||||
<glyph glyph-name="Eacute" unicode="É"
|
||||
/>
|
||||
<glyph glyph-name="Ecircumflex" unicode="Ê"
|
||||
/>
|
||||
<glyph glyph-name="Edieresis" unicode="Ë"
|
||||
/>
|
||||
<glyph glyph-name="Igrave" unicode="Ì"
|
||||
/>
|
||||
<glyph glyph-name="Iacute" unicode="Í"
|
||||
/>
|
||||
<glyph glyph-name="Icircumflex" unicode="Î"
|
||||
/>
|
||||
<glyph glyph-name="Idieresis" unicode="Ï"
|
||||
/>
|
||||
<glyph glyph-name="Eth" unicode="Ð"
|
||||
/>
|
||||
<glyph glyph-name="Ntilde" unicode="Ñ"
|
||||
/>
|
||||
<glyph glyph-name="Ograve" unicode="Ò"
|
||||
/>
|
||||
<glyph glyph-name="Oacute" unicode="Ó"
|
||||
/>
|
||||
<glyph glyph-name="Ocircumflex" unicode="Ô"
|
||||
/>
|
||||
<glyph glyph-name="Otilde" unicode="Õ"
|
||||
/>
|
||||
<glyph glyph-name="Odieresis" unicode="Ö"
|
||||
/>
|
||||
<glyph glyph-name="multiply" unicode="×"
|
||||
/>
|
||||
<glyph glyph-name="Oslash" unicode="Ø"
|
||||
/>
|
||||
<glyph glyph-name="Ugrave" unicode="Ù"
|
||||
/>
|
||||
<glyph glyph-name="Uacute" unicode="Ú"
|
||||
/>
|
||||
<glyph glyph-name="Ucircumflex" unicode="Û"
|
||||
/>
|
||||
<glyph glyph-name="Udieresis" unicode="Ü"
|
||||
/>
|
||||
<glyph glyph-name="Yacute" unicode="Ý"
|
||||
/>
|
||||
<glyph glyph-name="Thorn" unicode="Þ"
|
||||
/>
|
||||
<glyph glyph-name="germandbls" unicode="ß"
|
||||
/>
|
||||
<glyph glyph-name="agrave" unicode="à"
|
||||
/>
|
||||
<glyph glyph-name="aacute" unicode="á"
|
||||
/>
|
||||
<glyph glyph-name="acircumflex" unicode="â"
|
||||
/>
|
||||
<glyph glyph-name="atilde" unicode="ã"
|
||||
/>
|
||||
<glyph glyph-name="adieresis" unicode="ä"
|
||||
/>
|
||||
<glyph glyph-name="aring" unicode="å"
|
||||
/>
|
||||
<glyph glyph-name="ae" unicode="æ"
|
||||
/>
|
||||
<glyph glyph-name="ccedilla" unicode="ç"
|
||||
/>
|
||||
<glyph glyph-name="egrave" unicode="è"
|
||||
/>
|
||||
<glyph glyph-name="eacute" unicode="é"
|
||||
/>
|
||||
<glyph glyph-name="ecircumflex" unicode="ê"
|
||||
/>
|
||||
<glyph glyph-name="edieresis" unicode="ë"
|
||||
/>
|
||||
<glyph glyph-name="igrave" unicode="ì"
|
||||
/>
|
||||
<glyph glyph-name="iacute" unicode="í"
|
||||
/>
|
||||
<glyph glyph-name="icircumflex" unicode="î"
|
||||
/>
|
||||
<glyph glyph-name="idieresis" unicode="ï"
|
||||
/>
|
||||
<glyph glyph-name="eth" unicode="ð"
|
||||
/>
|
||||
<glyph glyph-name="ntilde" unicode="ñ"
|
||||
/>
|
||||
<glyph glyph-name="ograve" unicode="ò"
|
||||
/>
|
||||
<glyph glyph-name="oacute" unicode="ó"
|
||||
/>
|
||||
<glyph glyph-name="ocircumflex" unicode="ô"
|
||||
/>
|
||||
<glyph glyph-name="otilde" unicode="õ"
|
||||
/>
|
||||
<glyph glyph-name="odieresis" unicode="ö"
|
||||
/>
|
||||
<glyph glyph-name="divide" unicode="÷"
|
||||
/>
|
||||
<glyph glyph-name="oslash" unicode="ø"
|
||||
/>
|
||||
<glyph glyph-name="ugrave" unicode="ù"
|
||||
/>
|
||||
<glyph glyph-name="uacute" unicode="ú"
|
||||
/>
|
||||
<glyph glyph-name="ucircumflex" unicode="û"
|
||||
/>
|
||||
<glyph glyph-name="udieresis" unicode="ü"
|
||||
/>
|
||||
<glyph glyph-name="yacute" unicode="ý"
|
||||
/>
|
||||
<glyph glyph-name="thorn" unicode="þ"
|
||||
/>
|
||||
<glyph glyph-name="ydieresis" unicode="ÿ"
|
||||
/>
|
||||
</font>
|
||||
</defs></svg>
|
||||
|
After Width: | Height: | Size: 27 KiB |
@@ -1,4 +1,65 @@
|
||||
html, body {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
html {
|
||||
height: -webkit-fill-available;
|
||||
}
|
||||
body {
|
||||
color: #333;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
|
||||
/* tmp? */
|
||||
background: bisque;
|
||||
}
|
||||
|
||||
a {
|
||||
color: rgb(0,100,200);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
a:visited {
|
||||
color: rgb(0,80,160);
|
||||
}
|
||||
|
||||
label {
|
||||
display: block;
|
||||
}
|
||||
|
||||
input, button, select, textarea {
|
||||
font-family: inherit;
|
||||
font-size: inherit;
|
||||
-webkit-padding: 0.4em 0;
|
||||
padding: 0.4em;
|
||||
margin: 0 0 0.5em 0;
|
||||
box-sizing: border-box;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
input:disabled {
|
||||
color: #ccc;
|
||||
}
|
||||
|
||||
button {
|
||||
color: #333;
|
||||
background-color: #f4f4f4;
|
||||
outline: none;
|
||||
}
|
||||
|
||||
button:disabled {
|
||||
color: #999;
|
||||
}
|
||||
|
||||
button:not(:disabled):active {
|
||||
background-color: #ddd;
|
||||
}
|
||||
|
||||
button:focus {
|
||||
border-color: #666;
|
||||
}
|
||||
|
||||
|
After Width: | Height: | Size: 675 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 109 KiB |
|
After Width: | Height: | Size: 69 KiB |
BIN
srcs/requirements/svelte/api_front/public/img/potato_logo.png
Normal file
|
After Width: | Height: | Size: 124 KiB |
|
After Width: | Height: | Size: 430 KiB |
@@ -0,0 +1 @@
|
||||
<svg id="visual" viewBox="0 0 900 150" width="900" height="150" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"><path d="M0 36L21.5 33.7C43 31.3 86 26.7 128.8 32.5C171.7 38.3 214.3 54.7 257.2 63.5C300 72.3 343 73.7 385.8 65.7C428.7 57.7 471.3 40.3 514.2 30.5C557 20.7 600 18.3 642.8 25.8C685.7 33.3 728.3 50.7 771.2 59.5C814 68.3 857 68.7 878.5 68.8L900 69L900 0L878.5 0C857 0 814 0 771.2 0C728.3 0 685.7 0 642.8 0C600 0 557 0 514.2 0C471.3 0 428.7 0 385.8 0C343 0 300 0 257.2 0C214.3 0 171.7 0 128.8 0C86 0 43 0 21.5 0L0 0Z" fill="#618174" stroke-linecap="round" stroke-linejoin="miter"></path></svg>
|
||||
|
After Width: | Height: | Size: 645 B |
@@ -3,8 +3,6 @@
|
||||
<head>
|
||||
<meta charset='utf-8'>
|
||||
<meta name='viewport' content='width=device-width,initial-scale=1'>
|
||||
<!-- CSS only -->
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi" crossorigin="anonymous">
|
||||
|
||||
<title>Svelte app</title>
|
||||
|
||||
|
||||
@@ -1,49 +1,36 @@
|
||||
<script>
|
||||
import Login from "./pages/auth/login.svelte";
|
||||
import Home from "./pages/home/home.svelte";
|
||||
import Router, {link, push} from 'svelte-spa-router';
|
||||
import Profil from "./pages/profil/profil.svelte";
|
||||
import UpdateProfil from "./pages/profil/updateProfil.svelte";
|
||||
import DoubleFa from "./pages/auth/DoubleFa.svelte";
|
||||
<script lang="ts">
|
||||
// routing
|
||||
// may not need {link} here
|
||||
import Router, { link } from "svelte-spa-router";
|
||||
import { primaryRoutes } from "./routes/primaryRoutes.js";
|
||||
|
||||
|
||||
// this page should handle the SPA history management...
|
||||
|
||||
// set to false later for actual security
|
||||
// let loggedIn = true;
|
||||
|
||||
|
||||
|
||||
// $: logout = async() => {
|
||||
// await fetch("http://transcendance:8080/api/v2/auth/logout",{
|
||||
// method : 'POST',
|
||||
// }).then(push('/login'));
|
||||
// }
|
||||
|
||||
const routes = {
|
||||
"/": Home,
|
||||
"/login": Login,
|
||||
"/profil": Profil,
|
||||
"/update-profil": UpdateProfil,
|
||||
"/2fa": DoubleFa,
|
||||
};
|
||||
|
||||
$: logout = async() => {
|
||||
await fetch("http://transcendance:8080/api/v2/auth/logout",{
|
||||
method : 'POST',
|
||||
}).then(push('/login'));
|
||||
}
|
||||
</script>
|
||||
|
||||
<header class="p-3 text-bg-dark">
|
||||
<div class="container">
|
||||
<div
|
||||
class="d-flex flex-wrap align-items-center justify-content-center justify-content-lg-start">
|
||||
<!-- <h1>Testing</h1> -->
|
||||
<Router routes={primaryRoutes} />
|
||||
|
||||
|
||||
<style>
|
||||
|
||||
/* doesn't work... */
|
||||
/* body{
|
||||
background: bisque;
|
||||
} */
|
||||
</style>
|
||||
|
||||
<ul class="nav col-12 col-lg-auto me-lg-auto mb-2 justify-content-center mb-md-0">
|
||||
<li>
|
||||
<a href="/" type="button" class="btn btn-primary">Home</a>
|
||||
</li>
|
||||
<!-- <li>
|
||||
<a href="/profil" use:link type="button" class="btn btn-primary">Profil</a>
|
||||
</li> -->
|
||||
</ul>
|
||||
<div>
|
||||
<button on:click={logout} class="w-100 btn btn-lg btn-primary" type="submit">
|
||||
Deconnexion
|
||||
</button>
|
||||
</div>
|
||||
<div class="text-end">
|
||||
<a href="/login" use:link type="button" class="btn btn-warning">Connexion</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<Router {routes} />
|
||||
|
||||
17
srcs/requirements/svelte/api_front/src/NotFound.svelte
Normal file
@@ -0,0 +1,17 @@
|
||||
<script>
|
||||
import { link } from "svelte-spa-router";
|
||||
</script>
|
||||
|
||||
<h1>We are sorry!</h1>
|
||||
<p>This isn't a url that we use.</p>
|
||||
<!-- <img src="https://picsum.photos/id/685/800/400" alt="img"> -->
|
||||
<p>Go home you're drunk.</p>
|
||||
<a href="/" use:link>
|
||||
<h2>Take me home →</h2>
|
||||
</a>
|
||||
|
||||
<style>
|
||||
/* img {
|
||||
width: 100%;
|
||||
} */
|
||||
</style>
|
||||
97
srcs/requirements/svelte/api_front/src/ProfileDisplay.svelte
Normal file
@@ -0,0 +1,97 @@
|
||||
<script lang="ts">
|
||||
|
||||
import {location} from 'svelte-spa-router';
|
||||
// this could be how i
|
||||
|
||||
// this is how you access /:first for example
|
||||
// export let params = {}
|
||||
// <p>Your name is: <b>{params.first}</b> <b>{#if params.last}{params.last}{/if}</b></p>
|
||||
|
||||
// If i export these vars, maybe as an nice tidy object, i could pass whatever i like to them
|
||||
// The current user, some other user, whatever, and thus reuse this Componente for the user and their friends or whatever
|
||||
// will have to coordinate with Back, will know more once the Game stats are in the back
|
||||
// wait maybe this won't work, cuz like it's still going through a route, i would have to update a Store Var each time...
|
||||
// not sure if that's what i want...
|
||||
|
||||
// All the variables that will eventually be replaced by the real values
|
||||
let username = 'Username';
|
||||
let games = { total: 7, won: 4, lost: 3};
|
||||
let rank = 'gold or whatever the fuck who cares...';
|
||||
|
||||
export const user = {
|
||||
username: 'chaboi',
|
||||
}
|
||||
|
||||
// maybe the rank is determined dynamically just in the front based on win loss ratio or something no one cares about
|
||||
// why bother storing that shit in the back...
|
||||
// maybe i need a Rank.svelte component
|
||||
// ohhh i could make above a certain rank glitter! like that CSS tutorial showed me!
|
||||
|
||||
</script>
|
||||
|
||||
<!-- i don't think i need a div around this anymore, do i? -->
|
||||
<main>
|
||||
<!-- what the fuck do we even want in here? messges, about the user, STATISTICS!!! -->
|
||||
<!-- <div>some stuff goes here</div> -->
|
||||
<img class="icon" src="img/default_user_icon.png" alt="default user icon">
|
||||
<div>{username}</div>
|
||||
<div>Rank: {rank}</div>
|
||||
<section class="main-stats">
|
||||
<h4>Match Statistics</h4>
|
||||
<p>Total: {games.total}</p>
|
||||
<p>Victories: {games.won}</p>
|
||||
<p>Losses: {games.lost}</p>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
|
||||
<style>
|
||||
|
||||
/* very clearly redo all this */
|
||||
|
||||
div.main-grid{
|
||||
display: grid;
|
||||
grid-template-columns: repeat(12, 1fr);
|
||||
/* max-height: calc(100vh - 30vh); */
|
||||
height: 85vh;
|
||||
}
|
||||
|
||||
section.sidebar{
|
||||
grid-column: 1 / span 2;
|
||||
background: white;
|
||||
}
|
||||
|
||||
/* The main part */
|
||||
main{
|
||||
max-width: 960px;
|
||||
margin: 40px auto;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
main.offset{
|
||||
grid-column: 3 / span 10;
|
||||
}
|
||||
|
||||
/* Normal CSS stuff */
|
||||
.icon{
|
||||
max-width: 150px;
|
||||
}
|
||||
|
||||
/* The variable rich section */
|
||||
section.main-stats{
|
||||
max-width: 600px;
|
||||
margin: 40px auto;
|
||||
text-align: center;
|
||||
/* i think i want to use a grid? */
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
/* not sure about this, maybe top should be larger? */
|
||||
grid-template-rows: repeat(3, 1fr);
|
||||
}
|
||||
|
||||
/* the stuff in the grid*/
|
||||
section.main-stats h4{
|
||||
grid-column: 1 / span 3;
|
||||
}
|
||||
|
||||
</style>
|
||||
48
srcs/requirements/svelte/api_front/src/ProfilePage.svelte
Normal file
@@ -0,0 +1,48 @@
|
||||
<script lang="ts">
|
||||
|
||||
// import { loginStatus } from "./stores/loginStatusStore.js";
|
||||
import Header from "./components/Header.svelte";
|
||||
import Footer from "./components/Footer.svelte";
|
||||
// import { createEventDispatcher } from "svelte";
|
||||
import { push } from "svelte-spa-router";
|
||||
import Router, { link } from "svelte-spa-router";
|
||||
import { profileRoutes, prefix } from "./routes/profileRoutes.js";
|
||||
|
||||
// let dispatch = createEventDispatcher();
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
<!-- remove ={clickedHome} if you want to forward the event to App.svelte-->
|
||||
<Header />
|
||||
|
||||
<!-- The Wave -->
|
||||
<!-- <div class="spacer layer1"></div> -->
|
||||
|
||||
<Router routes={profileRoutes} {prefix} />
|
||||
|
||||
|
||||
<!-- <Footer /> -->
|
||||
|
||||
|
||||
<style>
|
||||
|
||||
/* from Haikei */
|
||||
/* for any Haikei image */
|
||||
|
||||
/* .spacer{
|
||||
aspect-ratio: 900/300;
|
||||
width: 100%;
|
||||
background-repeat: no-repeat;
|
||||
background-position: center;
|
||||
background-size: cover;
|
||||
} */
|
||||
|
||||
/* the specific image we use, you need both classes */
|
||||
|
||||
/* .layer1{
|
||||
background-image: url('/img/wave-haikei.svg');
|
||||
} */
|
||||
|
||||
</style>
|
||||
@@ -0,0 +1,14 @@
|
||||
<script lang="ts">
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
<h1>this is settings</h1>
|
||||
|
||||
|
||||
<style>
|
||||
|
||||
|
||||
|
||||
</style>
|
||||
190
srcs/requirements/svelte/api_front/src/SplashPage.svelte
Normal file
@@ -0,0 +1,190 @@
|
||||
<script lang="ts">
|
||||
import Canvas from "./components/Canvas.svelte";
|
||||
import { createEventDispatcher } from "svelte";
|
||||
import { push } from "svelte-spa-router";
|
||||
// import axios from 'axios';
|
||||
import { onMount } from 'svelte';
|
||||
import { loginStatus } from './stores/loginStatusStore.js';
|
||||
import { onDestroy } from 'svelte';
|
||||
|
||||
let dispatch = createEventDispatcher();
|
||||
|
||||
onMount(async () => {
|
||||
// console.log('PROFIL SVELTE');
|
||||
console.log('SplashPage testing if logged in')
|
||||
// const {data} = await axios.get('http://transcendance:8080/api/v2/user');
|
||||
// if (data) {
|
||||
// $loginStatus = true;
|
||||
// push('/user');
|
||||
// }
|
||||
});
|
||||
|
||||
const login = () => {
|
||||
// document.body.scrollIntoView();
|
||||
// push
|
||||
window.location.href = 'http://transcendance:8080/api/v2/auth';
|
||||
// await fetch ('http://transcendance:8080/api/v2/auth');
|
||||
console.log('you are now logged in');
|
||||
push('/profile');
|
||||
// it doesn't wait before changing the page tho which is really annoying... maybe the backend needs to be updated idk
|
||||
// cuz rn i'm doing it in the front and that doesn't seem great...
|
||||
}
|
||||
|
||||
const logout = async() => {
|
||||
await fetch('http://transcendance:8080/api/v2/auth/logout',);
|
||||
$loginStatus = false;
|
||||
};
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
<header class="grid-container">
|
||||
|
||||
<!-- <div on:mouseenter={enter} on:mouseleave={leave} class:active > -->
|
||||
<h1>Potato Pong</h1>
|
||||
<!-- </div> -->
|
||||
<nav>
|
||||
<!-- placeholder links -->
|
||||
<a href="/">Somewhere</a>
|
||||
<!-- <a href="/">SomewhereElse</a> -->
|
||||
{#if $loginStatus == false}
|
||||
<div on:click={login}>Login {$loginStatus}</div>
|
||||
{:else}
|
||||
<div on:click={logout}>Logout {$loginStatus}</div>
|
||||
{/if}
|
||||
<!-- one of these will be login and it will scroll you down to the login part -->
|
||||
</nav>
|
||||
<h2>
|
||||
<div>Welcome to</div>
|
||||
<div>Potato Pong</div>
|
||||
</h2>
|
||||
|
||||
<!-- here i want a flashing arrow pointing down to the login part -->
|
||||
|
||||
</header>
|
||||
<!-- <Canvas class=".canvas2"/> -->
|
||||
<Canvas/>
|
||||
|
||||
|
||||
|
||||
<style>
|
||||
/* currently useless */
|
||||
/* No styles get applied to the canvas from here, maybe i should move them to the Canvas Component... */
|
||||
/* tho tbh, why bother, i'm gonna change it anyway... */
|
||||
.canvas{
|
||||
/* grid-column: 1 / 13;
|
||||
grid-row: 1 / 3; */
|
||||
/* don't rely on Z-Index!!!! */
|
||||
z-index: -1;
|
||||
position: relative;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
white-space: nowrap;
|
||||
|
||||
/* Tmp? */
|
||||
/* background-color: #666; */
|
||||
|
||||
/* somehow this got rid of they annoying white space under the canvas */
|
||||
padding-bottom: 0;
|
||||
margin-bottom: 0px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.canvas2{
|
||||
z-index: -1;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
white-space: nowrap;
|
||||
|
||||
/* Tmp? */
|
||||
/* background-color: #666; */
|
||||
|
||||
/* somehow this got rid of they annoying white space under the canvas */
|
||||
padding-bottom: 0;
|
||||
margin-bottom: 0px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
|
||||
/* .canvas .grid-container{ */
|
||||
.grid-container{
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
|
||||
|
||||
box-sizing: border-box;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
white-space: nowrap;
|
||||
/* padding-bottom: 0; */
|
||||
margin-bottom: 0px;
|
||||
overflow: hidden;
|
||||
padding: 20px 40px;
|
||||
|
||||
|
||||
display: grid;
|
||||
grid-template-columns: repeat(12, 1fr);
|
||||
grid-template-rows: 1fr 1fr 1fr 1fr 1fr;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
header h1, header nav a{
|
||||
/* tmp ? well i kinda like it */
|
||||
color: bisque;
|
||||
}
|
||||
header h1{
|
||||
grid-column: 1 / 7;
|
||||
grid-row: 1;
|
||||
/* grid-column: span 6; */
|
||||
/* tmp? */
|
||||
padding: 20px;
|
||||
border: 1px solid bisque;
|
||||
}
|
||||
header nav{
|
||||
/* make it a flexbox? */
|
||||
grid-column: 7 / 13;
|
||||
grid-row: 1;
|
||||
justify-self: end;
|
||||
/* tmp? */
|
||||
padding: 20px;
|
||||
border: 1px solid bisque;
|
||||
}
|
||||
header nav a{
|
||||
margin-left: 10px;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
/* testing */
|
||||
header nav a:hover{
|
||||
font-weight: bold;
|
||||
background-color: blue;
|
||||
}
|
||||
header h2:hover{
|
||||
background: blue;
|
||||
}
|
||||
|
||||
|
||||
header h2{
|
||||
grid-row: 3;
|
||||
grid-column: 5 / span 4;
|
||||
justify-self: center;
|
||||
/* tmp */
|
||||
border: 1px solid black;
|
||||
z-index: 3;
|
||||
}
|
||||
header h2 div{
|
||||
font-size: 2em;
|
||||
}
|
||||
|
||||
/* tmp prolly */
|
||||
nav div {
|
||||
display: inline;
|
||||
color: bisque;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
</style>
|
||||
12
srcs/requirements/svelte/api_front/src/TmpTest.svelte
Normal file
@@ -0,0 +1,12 @@
|
||||
|
||||
<script>
|
||||
|
||||
import { onMount } from "svelte";
|
||||
|
||||
onMount( () => console.log('in TMP TEST'))
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
<h1>TMP TEST</h1>
|
||||
112
srcs/requirements/svelte/api_front/src/components/Canvas.svelte
Normal file
@@ -0,0 +1,112 @@
|
||||
<script lang="ts">
|
||||
import { onMount } from 'svelte';
|
||||
// rename to PotatoCanvas?
|
||||
|
||||
let canvas;
|
||||
// let img;
|
||||
let loaded = false;
|
||||
// i feel like they told me not to do this, new Image(), isn't there another way?
|
||||
// never mind they do seem to do this shit...
|
||||
// no idea if this should be in onMount...
|
||||
const img = new Image();
|
||||
img.src = 'img/potato_logo.png';
|
||||
img.onload = () => {
|
||||
loaded = true;
|
||||
// not sure if i'll use this...
|
||||
}
|
||||
|
||||
// $: scaleRatio = window.innerWidth / 10;
|
||||
$: scaleRatio = 30;
|
||||
$: nPotoatoRows = Math.floor(window.innerHeight / 200);
|
||||
$: nPotoatoCols = Math.floor(window.innerWidth / 200);
|
||||
// $: spacing = (canvas.height - (img.height / scaleRatio * (nPotoatoRows - 1) )) / nPotoatoRows;
|
||||
|
||||
|
||||
// apparently i might need to move all my reactive statements outside the onMount... not sure why...
|
||||
|
||||
|
||||
|
||||
onMount(() => {
|
||||
|
||||
// in this on mount we will set the canvas and the img
|
||||
|
||||
const ctx = canvas.getContext('2d');
|
||||
// let frame = requestAnimationFrame(loop);
|
||||
ctx.width = window.innerWidth;
|
||||
ctx.height = window.innerHeight;
|
||||
|
||||
// console.log(nPotoatoCols);
|
||||
|
||||
// img = fetch('img/potato_logo.png');
|
||||
|
||||
// Moving the IMG stuff from her out of mount
|
||||
|
||||
// let nPotoatoRows = 4;
|
||||
// $: nPotoatoRows = Math.floor(canvas.height / 200);
|
||||
let spacing = (canvas.height - (img.height / scaleRatio * (nPotoatoRows - 1) )) / nPotoatoRows;
|
||||
// $: spacing = (canvas.height - (img.height / scaleRatio * (nPotoatoRows - 1) )) / nPotoatoRows;
|
||||
// i prolly need a number of potatos X and Y vars
|
||||
|
||||
|
||||
|
||||
// i could do it so there are more potatos than can fit on the screen, translate them over, and then after some point
|
||||
// shift them all back to the next position they would be in, so it looks like they keep going to infinity
|
||||
|
||||
// let dx = 1.5;
|
||||
let dx = 1;
|
||||
// let dy = -0.5;
|
||||
let dy = -1;
|
||||
// let startX = spacing;
|
||||
// let startY = spacing;
|
||||
// let startX = 0;
|
||||
// let startY = 0;
|
||||
let startX = -(spacing * 2.5);
|
||||
let startY = -(spacing * 2.5);
|
||||
let x = startX;
|
||||
let y = startY;
|
||||
|
||||
let frame = requestAnimationFrame(loop);
|
||||
// i don't think i need t...
|
||||
function loop(t) {
|
||||
// yea ok a loop in a loop in a loop, horrible idea...
|
||||
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
||||
// this has to be at the end, no?
|
||||
frame = requestAnimationFrame(loop);
|
||||
// if (x > 900) {
|
||||
// x = startX;
|
||||
// y = startY;
|
||||
// }
|
||||
// else {
|
||||
// x += dx;
|
||||
// y += dy;
|
||||
// }
|
||||
|
||||
for (let i = 0; i < 20; i++) {
|
||||
for (let j = 0; j < 10; j++) {
|
||||
// ctx.drawImage(img, x + (i * spacing * 2), y + (j * spacing), img.width / scaleRatio, img.height / scaleRatio);
|
||||
ctx.drawImage(img, x + (i * spacing), y + (j * spacing), img.width / scaleRatio, img.height / scaleRatio);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return () => {
|
||||
cancelAnimationFrame(frame);
|
||||
};
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
<canvas
|
||||
bind:this={canvas}
|
||||
width={window.innerWidth}
|
||||
height={window.innerHeight}
|
||||
></canvas>
|
||||
|
||||
<style>
|
||||
canvas {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: #666;
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,18 @@
|
||||
<footer>
|
||||
<div class="copyright">I am official I have a Copyright in 2022</div>
|
||||
</footer>
|
||||
|
||||
<style>
|
||||
footer{
|
||||
padding: 40px;
|
||||
padding-bottom: 10px;
|
||||
text-align: center;
|
||||
}
|
||||
.copyright{
|
||||
color: #aaa;
|
||||
font-size: 14px;
|
||||
display: inline-block;
|
||||
padding: 20px;
|
||||
border-top: 1px solid #ddd;
|
||||
}
|
||||
</style>
|
||||
124
srcs/requirements/svelte/api_front/src/components/Header.svelte
Normal file
@@ -0,0 +1,124 @@
|
||||
<script lang="ts">
|
||||
|
||||
// import { primaryRoutes } from "../routes.js";
|
||||
import { push } from "svelte-spa-router";
|
||||
import { loginStatus } from "../stores/loginStatusStore.js";
|
||||
|
||||
import {location} from 'svelte-spa-router';
|
||||
// this could be how i change the header based on which Route it's in
|
||||
import active from 'svelte-spa-router/active'
|
||||
// or i could leave them all and not display if they're active?
|
||||
|
||||
// import { createEventDispatcher } from 'svelte';
|
||||
|
||||
// let dispatch = createEventDispatcher();
|
||||
|
||||
|
||||
let handleClickHome = () => {
|
||||
// dispatch('clickedHome');
|
||||
// profile?
|
||||
push('/profile');
|
||||
};
|
||||
|
||||
let handleClickLogout = () => {
|
||||
// dispatch('clickedLogout');
|
||||
fetch ('http://transcendance:8080/api/v2/auth/logout');
|
||||
push('/');
|
||||
$loginStatus = false;
|
||||
};
|
||||
|
||||
</script>
|
||||
|
||||
<!-- What if i could query what the current URL is and based on that change the button names in the NAV! -->
|
||||
|
||||
<header>
|
||||
<!-- svelte-ignore a11y-click-events-have-key-events -->
|
||||
<img src="/img/potato_logo.png" alt="Potato Pong Logo" on:click={handleClickHome}>
|
||||
<!-- {#if currentType === 'home'} -->
|
||||
<h1>Potato Pong</h1>
|
||||
<!-- {/if} -->
|
||||
<nav>
|
||||
<!-- <a href=""></a> -->
|
||||
<!-- i might change these to links rather than buttons, i kinda hate the buttons -->
|
||||
<!-- maybe just p or div actually idk -->
|
||||
<!-- {#if userpage === 'display'} -->
|
||||
<button>My Stats</button>
|
||||
<!-- {:else if userpage === 'settings'} -->
|
||||
<!-- {:else} -->
|
||||
<!-- button idk something about -->
|
||||
<button>Stream</button>
|
||||
<button on:click={handleClickLogout}>Log Out</button>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<style>
|
||||
/* See "possible_fonts.css" for more font options... */
|
||||
@font-face {
|
||||
font-family: 'Bondi';
|
||||
src:url('/fonts/Bondi.ttf.woff') format('woff'),
|
||||
url('/fonts/Bondi.ttf.svg#Bondi') format('svg'),
|
||||
url('/fonts/Bondi.ttf.eot'),
|
||||
url('/fonts/Bondi.ttf.eot?#iefix') format('embedded-opentype');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
|
||||
/* There is a bunch of unncessary shit in here... why so many flex grids, why is everything the same class? just seemed easier but... */
|
||||
|
||||
|
||||
header{
|
||||
/* background: #f7f7f7; */
|
||||
background: #618174;
|
||||
/* padding: 20px; */
|
||||
margin: 0;
|
||||
/* does nothing so far... */
|
||||
/* display: flex; */
|
||||
}
|
||||
|
||||
header{
|
||||
/* for some reason this doesn't do shit! */
|
||||
position: sticky;
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr 1fr;
|
||||
}
|
||||
|
||||
/* Headers */
|
||||
h1{
|
||||
font-family: 'Bondi';
|
||||
}
|
||||
|
||||
h1{
|
||||
margin: 0;
|
||||
text-align: left;
|
||||
/* max-width: 40px; */
|
||||
/* this helped with the weird extra space under the image... */
|
||||
display: flex;
|
||||
justify-self: center;
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
/* Images */
|
||||
|
||||
img{
|
||||
cursor: pointer;
|
||||
max-width: 40px;
|
||||
padding: 7px 20px;
|
||||
justify-self: left;
|
||||
}
|
||||
|
||||
nav{
|
||||
display: flex;
|
||||
justify-content: right;
|
||||
}
|
||||
|
||||
nav button{
|
||||
margin: 7px 20px;
|
||||
/* padding: 5px; */
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
/* .none{
|
||||
|
||||
} */
|
||||
</style>
|
||||
@@ -7,4 +7,4 @@ const app = new App({
|
||||
}
|
||||
});
|
||||
|
||||
export default app;
|
||||
export default app;
|
||||
@@ -0,0 +1,81 @@
|
||||
<script lang="ts">
|
||||
// routing
|
||||
// may not need {link} here
|
||||
import Router, { link } from "svelte-spa-router";
|
||||
import { routes } from "../routes.js";
|
||||
|
||||
import LoginPage from "./LoginPage.svelte";
|
||||
import UserPage from "../UserPage.svelte";
|
||||
import NotFound from "../NotFound.svelte";
|
||||
|
||||
// Ideally fuck all this shit in the long run
|
||||
let pages = ['login', 'user', 'account'];
|
||||
// make this a $: currentPage ?
|
||||
let currentPage = 'booba';
|
||||
// prolly change this? yea idk...
|
||||
// let userIndex;
|
||||
// tmp for testing
|
||||
let userId = 0;
|
||||
// horrible naming... can be HOME or ACCOUNT
|
||||
let currentType = 'account';
|
||||
|
||||
// this page should handle the SPA history management...
|
||||
|
||||
// set to false later for actual security
|
||||
let loggedIn = true;
|
||||
|
||||
// not sure if this is how i want to do this...
|
||||
// might do differently cuz URL route manangement...
|
||||
const handleLogin = () => {
|
||||
currentPage = 'user';
|
||||
loggedIn = true;
|
||||
};
|
||||
|
||||
// I don't know if i should but i'm tempted to put this here...
|
||||
|
||||
// import axios from 'axios';
|
||||
// import { onMount } from 'svelte';
|
||||
// import { push } from 'svelte-spa-router';
|
||||
|
||||
// let user = {logedIn: false};
|
||||
|
||||
// onMount(async () => {
|
||||
// // console.log('PROFIL SVELTE');
|
||||
// const {data} = await axios.get('http://transcendance:8080/api/v2/user');
|
||||
// if (data)
|
||||
// user.logedIn = true;
|
||||
// });
|
||||
|
||||
// $: submit = async() => {
|
||||
// window.location.href = 'http://transcendance:8080/api/v2/auth';
|
||||
// }
|
||||
|
||||
// $: logout = async() => {
|
||||
// await fetch('http://transcendance:8080/api/v2/auth/logout',);
|
||||
// user.logedIn = false;
|
||||
// }
|
||||
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
<!-- eventually we will do this with routes, but for now use a prop -->
|
||||
<!-- {#if currentPage === 'login'}
|
||||
<LoginPage {pages} {currentPage} {userId} on:loggedIn={handleLogin}/>
|
||||
{:else if currentPage === 'user'}
|
||||
<UserPage {pages} {currentPage} {userId} {currentType}/>
|
||||
{:else}
|
||||
<NotFound />
|
||||
{/if} -->
|
||||
<Router {routes}/>
|
||||
|
||||
<style>
|
||||
|
||||
/* doesn't work... */
|
||||
/* body{
|
||||
background: bisque;
|
||||
} */
|
||||
</style>
|
||||
|
||||
|
||||
@@ -0,0 +1,167 @@
|
||||
<!-- <script lang="ts"> -->
|
||||
<script>
|
||||
import { onMount } from 'svelte';
|
||||
|
||||
let canvas;
|
||||
|
||||
// $: scaleRatio = window.innerWidth / 10;
|
||||
$: scaleRatio = 30;
|
||||
|
||||
onMount(() => {
|
||||
// we're invoking JS methods of the canvas element
|
||||
const ctx = canvas.getContext('2d');
|
||||
|
||||
ctx.width = window.innerWidth;
|
||||
ctx.height = window.innerHeight;
|
||||
|
||||
// ctx.beginPath();
|
||||
// ctx.moveTo(50,50);
|
||||
// ctx.lineTo(70,70);
|
||||
// ctx.stroke();
|
||||
|
||||
// attempting to import an image
|
||||
const img = new Image();
|
||||
// we may have to call an onMount or something to make sure the image has loaded...
|
||||
// doing it in JS for now, ideally in Svelte later..
|
||||
// img.addEventListener('load', () => {
|
||||
// // execute drawImage statements here
|
||||
// }, false);
|
||||
img.src = 'img/potato_logo.png'; // seems like this does need to be above onload()
|
||||
img.onload = () => {
|
||||
// ctx.drawImage(img, 0, 0, img.width * (ctx.width / 15), img.height * (ctx.height / 15));
|
||||
// ctx.drawImage(img, 0, 0, ctx.width / 15, ctx.height / 15);
|
||||
|
||||
// i think i don't want this cuz it'll get in the way?
|
||||
// ctx.drawImage(img, 0, 0, img.width / scaleRatio, img.height / scaleRatio);
|
||||
|
||||
// it would seem you need to redraw the images when you change the Window size, it's not automatically responsive
|
||||
};
|
||||
|
||||
let startX = 200;
|
||||
let startY = 200;
|
||||
let dx = 3;
|
||||
let dy = -1;
|
||||
|
||||
// Time for some math
|
||||
// lets say i want 6 rows
|
||||
// ok so we're gonna draw all the potatos at the same time and each of them gets animated, like i have it now
|
||||
// 6 in a row so # of rows aka x = width * 6/height
|
||||
|
||||
function Potato(x, y) {
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
// ctx.drawImage(img, x, y, img.width / scaleRatio, img.height / scaleRatio);
|
||||
|
||||
this.draw = function() {
|
||||
ctx.drawImage(img, x, y, img.width / scaleRatio, img.height / scaleRatio);
|
||||
}
|
||||
|
||||
this.animate = function() {
|
||||
this.x += dx;
|
||||
this.y += dy;
|
||||
|
||||
this.draw();
|
||||
}
|
||||
}
|
||||
|
||||
// let spacing = canvas.width * ((6 + 1) / canvas.height);
|
||||
let spacing = 70;
|
||||
let Potatos = [];
|
||||
//check the math...
|
||||
// for (let i = 0; i < 6 * spacing; i++) {
|
||||
for (let i = 0; i < 2; i++) {
|
||||
// for (let j = 0; j < 6; j++) {
|
||||
for (let j = 0; i < 2; j++) {
|
||||
Potatos.push(new Potato(spacing + (i * spacing), spacing + (j * spacing)));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// now i'm trying to move 1 potato
|
||||
let frame = requestAnimationFrame(loop);
|
||||
// function loop(t) {
|
||||
// ctx.clearRect(0, 0, canvas.width, canvas.height);
|
||||
// frame = requestAnimationFrame(loop);
|
||||
// ctx.drawImage(img, startX, startY, img.width / scaleRatio, img.height / scaleRatio);
|
||||
// startX += dx;
|
||||
// startY += dy;
|
||||
// }
|
||||
|
||||
// new Potato(70, 70).animate();
|
||||
|
||||
|
||||
function loop(t) {
|
||||
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
||||
frame = requestAnimationFrame(loop);
|
||||
for (let i = 0; i < Potatos.length; i++) {
|
||||
Potatos[i].animate();
|
||||
}
|
||||
// Potatos[0].animate();
|
||||
}
|
||||
|
||||
loop();
|
||||
|
||||
// Lets try again with a single loop
|
||||
|
||||
|
||||
|
||||
|
||||
// THis shit makes the cool Gradient
|
||||
// let frame = requestAnimationFrame(loop);
|
||||
// function loop(t) {
|
||||
// frame = requestAnimationFrame(loop);
|
||||
|
||||
// // const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
|
||||
|
||||
// for (let p = 0; p < imageData.data.length; p += 4) {
|
||||
// const i = p / 4;
|
||||
// const x = i % canvas.width;
|
||||
// const y = i / canvas.width >>> 0;
|
||||
|
||||
// const r = 64 + (128 * x / canvas.width) + (64 * Math.sin(t / 1000));
|
||||
// const g = 64 + (128 * y / canvas.height) + (64 * Math.cos(t / 1000));
|
||||
// const b = 128;
|
||||
|
||||
// imageData.data[p + 0] = r;
|
||||
// imageData.data[p + 1] = g;
|
||||
// imageData.data[p + 2] = b;
|
||||
// imageData.data[p + 3] = 255;
|
||||
// }
|
||||
|
||||
// ctx.putImageData(imageData, 0, 0);
|
||||
// }
|
||||
|
||||
return () => {
|
||||
cancelAnimationFrame(frame);
|
||||
// prolly something else...
|
||||
};
|
||||
});
|
||||
</script>
|
||||
|
||||
<canvas
|
||||
bind:this={canvas}
|
||||
width={window.innerWidth}
|
||||
height={window.innerHeight}
|
||||
></canvas>
|
||||
<!-- widht and height were 32, trying stuff -->
|
||||
|
||||
<!-- I don't have the /svelte-logo-mask.svg, i guess i'll go get something -->
|
||||
<style>
|
||||
canvas {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: #666;
|
||||
|
||||
|
||||
/* testing something */
|
||||
/* -webkit-mask-image: radial-gradient(circle, black 50%, rgba(0, 0, 0, 0.5) 50%);
|
||||
mask-image: radial-gradient(circle, black 50%, rgba(0, 0, 0, 0.5) 50%); */
|
||||
/* Holy shit that worked! i got a mask */
|
||||
/* it also works without a mask! i have a canvas! */
|
||||
|
||||
/* -webkit-mask: url(/svelte-logo-mask.svg) 50% 50% no-repeat; */
|
||||
/* -webkit-mask: url(img/cartoon_potato3.jpg) 50% 50% no-repeat; */
|
||||
/* mask: url(/svelte-logo-mask.svg) 50% 50% no-repeat; */
|
||||
/* mask: url(img/cartoon_potato3.jpg) 50% 50% no-repeat; */
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,45 @@
|
||||
<script lang="ts">
|
||||
import { onMount, setContext } from "svelte";
|
||||
|
||||
let canvas;
|
||||
|
||||
// what do i want?
|
||||
// lets start with an image of my potato
|
||||
// then get it to move
|
||||
// then have many displayed in an offset grid
|
||||
|
||||
const drawFunctions = [];
|
||||
|
||||
|
||||
setContext('canvas', {
|
||||
register(drawFn) {
|
||||
drawFunctions.push(drawFn);
|
||||
},
|
||||
unregister(drawFn) {
|
||||
drawFunctions.splice(drawFunctions.indexOf(drawFn), 1);
|
||||
}
|
||||
})
|
||||
|
||||
onMount(() => {
|
||||
// not sure what this does...
|
||||
const ctx = canvas.getContext('2d');
|
||||
|
||||
// no idea what this does...
|
||||
function update() {
|
||||
|
||||
ctx.clearRect()
|
||||
drawFunctions.forEach(drawFn => {
|
||||
drawFn(ctx);
|
||||
});
|
||||
|
||||
frameId = requestAnimationFrame(update);
|
||||
}
|
||||
|
||||
let frameId = requestAnimationFrame(update);
|
||||
return () => {
|
||||
cancelAnimationFrame(update);
|
||||
};
|
||||
});
|
||||
</script>
|
||||
|
||||
<canvas bind:this={canvas} />
|
||||
@@ -0,0 +1,24 @@
|
||||
<script lang="ts">
|
||||
// might rename...
|
||||
// no idea what i'm doing...
|
||||
|
||||
import { getContext, onMount } from 'svelte';
|
||||
|
||||
// here you have to export the vars you need to draw this shit...
|
||||
|
||||
const { register, unregister } = getContext('canvas');
|
||||
|
||||
onMount(() => {
|
||||
register(draw);
|
||||
|
||||
return () => {
|
||||
unregister(draw);
|
||||
}
|
||||
});
|
||||
|
||||
function draw(ctx) {
|
||||
ctx.beginPath();
|
||||
ctx.fillStyle = fill;
|
||||
}
|
||||
|
||||
</script>
|
||||
124
srcs/requirements/svelte/api_front/src/old_unused/Header.svelte
Normal file
@@ -0,0 +1,124 @@
|
||||
<script lang="ts">
|
||||
|
||||
// Fucking having a header that can change size, i don't really want the larger one
|
||||
|
||||
import { createEventDispatcher } from 'svelte';
|
||||
|
||||
let dispatch = createEventDispatcher();
|
||||
|
||||
let types: string[] = ['home', 'regular', 'none'];
|
||||
// let currentType: string = 'regular';
|
||||
export let currentType = 'regular';
|
||||
// apparently Regular is the only one i use...
|
||||
|
||||
let handleClickHome = () => {
|
||||
dispatch('clickedHome');
|
||||
};
|
||||
|
||||
let handleClickLogout = () => {
|
||||
dispatch('clickedLogout');
|
||||
};
|
||||
|
||||
</script>
|
||||
|
||||
<!-- Make it so you can have a Big Home page header and a regular header or no header -->
|
||||
<!-- So far my CSS is super Gross, i guess i'll get Hugo to help me with it -->
|
||||
|
||||
<header class={currentType}>
|
||||
<!-- svelte-ignore a11y-click-events-have-key-events -->
|
||||
<img class={currentType} src="/img/potato_logo.png" alt="Potato Pong Logo" on:click={handleClickHome}>
|
||||
<!-- {#if currentType === 'home'} -->
|
||||
<h1 class={currentType}>Potato Pong</h1>
|
||||
<!-- {/if} -->
|
||||
<nav class={currentType}>
|
||||
<!-- <a href=""></a> -->
|
||||
<!-- i might change these to links rather than buttons, i kinda hate the buttons -->
|
||||
<button>My Stats</button>
|
||||
<button>Stream</button>
|
||||
<button on:click={handleClickLogout}>Log Out</button>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<style>
|
||||
/* See "possible_fonts.css" for more font options... */
|
||||
@font-face {
|
||||
font-family: 'Bondi';
|
||||
src:url('/fonts/Bondi.ttf.woff') format('woff'),
|
||||
url('/fonts/Bondi.ttf.svg#Bondi') format('svg'),
|
||||
url('/fonts/Bondi.ttf.eot'),
|
||||
url('/fonts/Bondi.ttf.eot?#iefix') format('embedded-opentype');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
|
||||
/* There is a bunch of unncessary shit in here... why so many flex grids, why is everything the same class? just seemed easier but... */
|
||||
|
||||
|
||||
header{
|
||||
/* background: #f7f7f7; */
|
||||
background: #618174;
|
||||
/* padding: 20px; */
|
||||
margin: 0;
|
||||
/* does nothing so far... */
|
||||
/* display: flex; */
|
||||
}
|
||||
|
||||
header.home{
|
||||
/* position: sticky; */
|
||||
}
|
||||
header.regular{
|
||||
/* for some reason this doesn't do shit! */
|
||||
position: sticky;
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr 1fr;
|
||||
}
|
||||
|
||||
/* Headers */
|
||||
h1{
|
||||
font-family: 'Bondi';
|
||||
}
|
||||
h1.home {
|
||||
margin: 0;
|
||||
text-align: center;
|
||||
/* max-width: 100px; */
|
||||
}
|
||||
h1.regular{
|
||||
margin: 0;
|
||||
text-align: left;
|
||||
/* max-width: 40px; */
|
||||
/* this helped with the weird extra space under the image... */
|
||||
display: flex;
|
||||
justify-self: center;
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
/* Images */
|
||||
img.home{
|
||||
/* text-align: center; */
|
||||
/* get the image squarely in the middle... */
|
||||
cursor: pointer;
|
||||
max-width: 100px;
|
||||
}
|
||||
img.regular{
|
||||
cursor: pointer;
|
||||
max-width: 40px;
|
||||
padding: 7px 20px;
|
||||
justify-self: left;
|
||||
}
|
||||
|
||||
nav{
|
||||
display: flex;
|
||||
justify-content: right;
|
||||
}
|
||||
|
||||
nav button{
|
||||
margin: 7px 20px;
|
||||
/* padding: 5px; */
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
/* .none{
|
||||
|
||||
} */
|
||||
</style>
|
||||
@@ -0,0 +1,102 @@
|
||||
<script lang="ts">
|
||||
import { createEventDispatcher } from 'svelte';
|
||||
|
||||
let dispatch = createEventDispatcher();
|
||||
|
||||
let types: string[] = ['home', 'regular', 'none'];
|
||||
// let currentType: string = 'regular';
|
||||
export let currentType = 'home';
|
||||
|
||||
let handleClick = () => {
|
||||
dispatch('clickedHome');
|
||||
};
|
||||
|
||||
</script>
|
||||
|
||||
<!-- Make it so you can have a Big Home page header and a regular header or no header -->
|
||||
<!-- So far my CSS is super Gross, i guess i'll get Hugo to help me with it -->
|
||||
|
||||
<header class={currentType}>
|
||||
<h1 class={currentType}>
|
||||
<img class={currentType} src="/img/potato_logo.png" alt="Potato Pong Logo" on:click={handleClick}>
|
||||
</h1>
|
||||
<!-- {#if currentType === 'home'} -->
|
||||
<h1 class={currentType}>Potato Pong</h1>
|
||||
<!-- {/if} -->
|
||||
</header>
|
||||
|
||||
<style>
|
||||
/* See "possible_fonts.css" for more font options... */
|
||||
@font-face {
|
||||
font-family: 'Bondi';
|
||||
src:url('/fonts/Bondi.ttf.woff') format('woff'),
|
||||
url('/fonts/Bondi.ttf.svg#Bondi') format('svg'),
|
||||
url('/fonts/Bondi.ttf.eot'),
|
||||
url('/fonts/Bondi.ttf.eot?#iefix') format('embedded-opentype');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
|
||||
/* There is a bunch of unncessary shit in here... why so many flex grids, why is everything the same class? just seemed easier but... */
|
||||
|
||||
|
||||
header{
|
||||
/* background: #f7f7f7; */
|
||||
background: #618174;
|
||||
/* padding: 20px; */
|
||||
margin: 0;
|
||||
font-family: 'Bondi';
|
||||
/* does nothing so far... */
|
||||
/* display: flex; */
|
||||
}
|
||||
|
||||
header.home{
|
||||
/* position: sticky; */
|
||||
}
|
||||
header.regular{
|
||||
position: sticky;
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr 1fr;
|
||||
}
|
||||
header.regular > h1:first-child{
|
||||
justify-self: left;
|
||||
}
|
||||
header.regular > h1:nth-child(2){
|
||||
justify-items: center;
|
||||
}
|
||||
|
||||
/* Headers */
|
||||
h1.home {
|
||||
margin: 0;
|
||||
text-align: center;
|
||||
/* max-width: 100px; */
|
||||
}
|
||||
h1.regular{
|
||||
margin: 0;
|
||||
text-align: left;
|
||||
/* max-width: 40px; */
|
||||
/* this helped with the weird extra space under the image... */
|
||||
display: flex;
|
||||
justify-self: center;
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
/* Images */
|
||||
h1 img.home{
|
||||
/* text-align: center; */
|
||||
/* get the image squarely in the middle... */
|
||||
cursor: pointer;
|
||||
max-width: 100px;
|
||||
}
|
||||
h1 img.regular{
|
||||
cursor: pointer;
|
||||
max-width: 40px;
|
||||
padding: 7px 15px;
|
||||
}
|
||||
|
||||
|
||||
/* .none{
|
||||
|
||||
} */
|
||||
</style>
|
||||
@@ -0,0 +1,172 @@
|
||||
<script lang="ts">
|
||||
|
||||
// Now called LoginPage
|
||||
|
||||
// import Header from "./Header.svelte";
|
||||
import Footer from "../components/Footer.svelte";
|
||||
import Login from "./Login.svelte";
|
||||
import Tabs from "../shared/Tabs.svelte"
|
||||
import Card from "../shared/Card.svelte"
|
||||
// tmp
|
||||
let login = { username: '', password: ''};
|
||||
// let's us track any errors in a submited form
|
||||
let errors = { username: '', password: ''};
|
||||
let valid:boolean = false;
|
||||
const loginHandler = () => {
|
||||
console.log('hi');
|
||||
};
|
||||
const createAccountHandler = () => {
|
||||
console.log('hi');
|
||||
};
|
||||
|
||||
// Tabs
|
||||
let items: string[] = ['Login', 'Create Account'];
|
||||
let activeItem: string = 'Login';
|
||||
|
||||
const tabChange = (e) => {
|
||||
activeItem = e.detail;
|
||||
};
|
||||
|
||||
// TMP for switching page, down the line this will be down by modifying url
|
||||
|
||||
</script>
|
||||
|
||||
<!-- New New Approach -->
|
||||
<!-- if i were to do all this with CSS Grids how would i do it? -->
|
||||
<!-- Things i want -->
|
||||
<!-- A title button, some nav buttons, a giant dope canvas and words over it -->
|
||||
<!-- not sure if i want: login and create account -->
|
||||
<!-- let's start with just the canvas -->
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- New aproach -->
|
||||
<!-- just make the html in order you can move it around all you want into special Compoenents later -->
|
||||
|
||||
<!-- Ok i think all of this needs to go in a Home Page Component -->
|
||||
<!-- and then i make another master component for the main page once you're logged in, no idea what that should look like -->
|
||||
|
||||
<!-- what if i kept the special canvas header in here and made another generic header for the rest of the site as a component -->
|
||||
|
||||
<header class="banner">
|
||||
<!-- top left corner, sticky -->
|
||||
<h1>Potato Pong</h1>
|
||||
<!-- top right but it takes you down the page -->
|
||||
<h2>Login</h2>
|
||||
|
||||
<!-- all this used to be in Welcome Section -->
|
||||
<!-- the amazing backround! not sure yet if it should scroll with us or be the size of the View Port... -->
|
||||
<!-- <canvas></canvas> -->
|
||||
<!-- i think maybe the canvas needs to be in the header -->
|
||||
<!-- using an image for now as a placehodler for the canvase -->
|
||||
<img src="/img/tmp_mario_banner.png" alt="tmp Mario banner">
|
||||
<div class="welcome">
|
||||
<h2>Welcome to <br><span>Potato Pong</span></h2>
|
||||
</div>
|
||||
<!-- I want some sort of arrow pointing down and blinking to indicate you should scroll -->
|
||||
</header>
|
||||
<!-- <section class="banner"> -->
|
||||
<section class="welcome">
|
||||
|
||||
</section>
|
||||
<!-- no nav on home page -->
|
||||
<section class="register">
|
||||
|
||||
<!-- i could have a toggle tab to login or create a new account -->
|
||||
|
||||
<Tabs items={items} {activeItem} on:tabChange={tabChange}/>
|
||||
{#if activeItem === 'Login'}
|
||||
<div class="card">
|
||||
<Card>
|
||||
<h2>Login</h2>
|
||||
<form on:submit|preventDefault={loginHandler}>
|
||||
<div class="form-field">
|
||||
<input type="text" id="username" placeholder="username" bind:value={login.username}>
|
||||
<div class="error">{ errors.username }</div>
|
||||
</div>
|
||||
<div class="form-field">
|
||||
<input type="password" id="password" placeholder="password" bind:value={login.password}>
|
||||
<div class="error">{ errors.password }</div>
|
||||
</div>
|
||||
<!-- type="" but flat={} cuz type is a string but flat is a bool-->
|
||||
<!-- <Button type="secondary" flat={true}>Add Poll</Button> -->
|
||||
<button>Login</button>
|
||||
</form>
|
||||
</Card>
|
||||
</div>
|
||||
{:else if activeItem = 'Create Account'}
|
||||
<!-- Create Account -->
|
||||
<div class="card">
|
||||
<Card>
|
||||
<h3>Create Account</h3>
|
||||
<form on:submit|preventDefault={createAccountHandler}>
|
||||
<div class="form-field">
|
||||
<input type="text" id="username" placeholder="username" bind:value={login.username}>
|
||||
<div class="error">{ errors.username }</div>
|
||||
</div>
|
||||
<div class="form-field">
|
||||
<input type="password" id="password" placeholder="password" bind:value={login.password}>
|
||||
<div class="error">{ errors.password }</div>
|
||||
</div>
|
||||
<!-- type="" but flat={} cuz type is a string but flat is a bool-->
|
||||
<!-- <Button type="secondary" flat={true}>Add Poll</Button> -->
|
||||
<button>Login</button>
|
||||
</form>
|
||||
</Card>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
|
||||
</section>
|
||||
<!-- below this i could say, this is where i might have put an explanation of what you can do on this page but fuck you i didn't -->
|
||||
<!-- or maybe in the end i will, something like: Fun, Game, Colors, enjoy Friendship, or don't, it's your choice! -->
|
||||
<Footer />
|
||||
|
||||
|
||||
|
||||
<style>
|
||||
/* hearder stuff */
|
||||
|
||||
/* Clearly i have yet to master floating stuff... */
|
||||
/* i need to put box-sizing in here somewhere for the login... */
|
||||
|
||||
/* starting again with CSS Grid */
|
||||
/* .banner{
|
||||
position: relative;
|
||||
}
|
||||
.banner img{
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.banner h1{
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 10px;
|
||||
}
|
||||
.banner h2{
|
||||
position: absolute;
|
||||
left: 90%;
|
||||
top: 10px;
|
||||
}
|
||||
.banner .welcome{
|
||||
background-color: #feb614;
|
||||
color:white;
|
||||
padding: 30px;
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
top: 50%;
|
||||
}
|
||||
.banner .welcome h2{
|
||||
font-size: 58px;
|
||||
}
|
||||
.banner .welcome h2 span{
|
||||
font-size: 1.3em;
|
||||
}
|
||||
|
||||
.register{
|
||||
|
||||
} */
|
||||
|
||||
|
||||
</style>
|
||||
@@ -0,0 +1,90 @@
|
||||
<script lang="ts">
|
||||
import { now } from "svelte/internal";
|
||||
import Card from "../shared/Card.svelte";
|
||||
import { createEventDispatcher } from 'svelte';
|
||||
// import UserStore from './stores/UserStore';
|
||||
|
||||
// prolly Typescript-ify
|
||||
//let fields{question:string, answerA:string, answerB: string} = { question: '', answerA: '', answerB: ''};
|
||||
let login = { username: '', password: ''};
|
||||
// let's us track any errors in a submited form
|
||||
let errors = { username: '', password: ''};
|
||||
let valid:boolean = false;
|
||||
|
||||
const dispatch = createEventDispatcher();
|
||||
|
||||
const loginHandler = () => {
|
||||
valid = true;
|
||||
|
||||
if (login.username !== $UserStore.username) {
|
||||
valid = false;
|
||||
errors.username = "wrong example username."
|
||||
} else {
|
||||
// reseting the value of errors
|
||||
errors.username = "";
|
||||
}
|
||||
if (login.password !== $UserStore.password) {
|
||||
valid = false;
|
||||
errors.password = "wrong example password."
|
||||
} else {
|
||||
// reseting the value of errors
|
||||
errors.password = "";
|
||||
}
|
||||
|
||||
if (valid) {
|
||||
$UserStore.loggedIn = true;
|
||||
$UserStore.status = 'online';
|
||||
|
||||
dispatch('login');
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
<div class="login">
|
||||
<Card>
|
||||
|
||||
<form on:submit|preventDefault={loginHandler}>
|
||||
<div class="form-field">
|
||||
<input type="text" id="username" placeholder="username" bind:value={login.username}>
|
||||
<div class="error">{ errors.username }</div>
|
||||
</div>
|
||||
<div class="form-field">
|
||||
<input type="password" id="password" placeholder="password" bind:value={login.password}>
|
||||
<div class="error">{ errors.password }</div>
|
||||
</div>
|
||||
<!-- type="" but flat={} cuz type is a string but flat is a bool-->
|
||||
<!-- <Button type="secondary" flat={true}>Add Poll</Button> -->
|
||||
<button>Login</button>
|
||||
</form>
|
||||
|
||||
</Card>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
form{
|
||||
width: 200px;
|
||||
margin: 0 auto;
|
||||
text-align: center;
|
||||
}
|
||||
.form-field{
|
||||
margin: 18px auto;
|
||||
}
|
||||
input{
|
||||
width: 100%;
|
||||
border-radius: 6px;
|
||||
}
|
||||
.login{
|
||||
/* display: grid;
|
||||
grid-template-columns: 1fr; */
|
||||
max-width: 350px;
|
||||
}
|
||||
|
||||
.error{
|
||||
font-weight: bold;
|
||||
font-size: 12px;
|
||||
color: #d91b42;
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,414 @@
|
||||
<script lang="ts">
|
||||
// import Header from "./Header.svelte";
|
||||
import Footer from "../components/Footer.svelte";
|
||||
import Tabs from "../shared/Tabs.svelte";
|
||||
import Card from "../shared/Card.svelte";
|
||||
import Canvas from "../components/Canvas.svelte";
|
||||
import ScrollTo from "../shared/ScrollTo.svelte";
|
||||
import UserStore from "./UserStore.js";
|
||||
import { createEventDispatcher } from "svelte";
|
||||
import {push} from "svelte-spa-router";
|
||||
|
||||
let dispatch = createEventDispatcher();
|
||||
// Tabs
|
||||
let items: string[] = ['Login', 'Create Account'];
|
||||
let activeItem: string = 'Login';
|
||||
|
||||
const tabChange = (e) => {
|
||||
activeItem = e.detail;
|
||||
};
|
||||
|
||||
|
||||
import axios from 'axios';
|
||||
import { onMount } from 'svelte';
|
||||
|
||||
let user = {logedIn: false};
|
||||
|
||||
onMount(async () => {
|
||||
// console.log('PROFIL SVELTE');
|
||||
const {data} = await axios.get('http://transcendance:8080/api/v2/user');
|
||||
if (data)
|
||||
user.logedIn = true;
|
||||
});
|
||||
|
||||
const submit = async() => {
|
||||
document.body.scrollIntoView();
|
||||
push
|
||||
window.location.href = 'http://transcendance:8080/api/v2/auth';
|
||||
}
|
||||
|
||||
const logout = async() => {
|
||||
await fetch('http://transcendance:8080/api/v2/auth/logout',);
|
||||
user.logedIn = false;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// for toLogin
|
||||
|
||||
let bottomHalf;
|
||||
// console.log(bottomHalf);
|
||||
// const element = document.body;
|
||||
|
||||
|
||||
// in theory this could be a Store, but for now this will do
|
||||
// also in future we'll do this with urls
|
||||
export let pages;
|
||||
export let currentPage;
|
||||
// this shit has overstayed it's welcome, fuck having userId all over the place
|
||||
export let userId;
|
||||
|
||||
|
||||
// maybe we put this in the login Component?
|
||||
// tmp
|
||||
let login = { username: '', password: ''};
|
||||
// let's us track any errors in a submited form
|
||||
let errors = { username: '', password: ''};
|
||||
let valid:boolean = false;
|
||||
|
||||
const loginHandler = () => {
|
||||
console.log('hi from loginHandler');
|
||||
|
||||
|
||||
//
|
||||
// Basic Checks
|
||||
//
|
||||
valid = false;
|
||||
|
||||
// checkin Username
|
||||
if (login.username.length < 1)
|
||||
{
|
||||
valid = false;
|
||||
errors.username = 'please enter a username';
|
||||
} else {
|
||||
valid = true;
|
||||
errors.username = '';
|
||||
}
|
||||
|
||||
// Checking Password
|
||||
if (login.password.length < 1)
|
||||
{
|
||||
valid = false;
|
||||
errors.password = 'please enter your password';
|
||||
} else {
|
||||
valid = true;
|
||||
errors.password = '';
|
||||
}
|
||||
|
||||
//
|
||||
// Advanded Checks
|
||||
//
|
||||
|
||||
// Comparing to UserStore
|
||||
let users;
|
||||
const unsubscribe = UserStore.subscribe(objs => {
|
||||
users = objs;
|
||||
console.log('subscribed');
|
||||
});
|
||||
|
||||
// could i do $users.length ? doesn't look like it...
|
||||
// let len = $users.length;
|
||||
|
||||
// userId = 0;
|
||||
// userId = users.filter(user => user.username === login.username);
|
||||
// this shit returns an array, it would be nice if it weren't an array
|
||||
// let user = users.filter(user => user.username === login.username);
|
||||
let user = users.find(user => user.username === login.username);
|
||||
|
||||
console.log(user);
|
||||
// console.log(user.password);
|
||||
|
||||
|
||||
// all this shit is a bit wordy... maybe a better way to handle this stuff?
|
||||
|
||||
// if (userIndex > users.length) {
|
||||
if (!user) {
|
||||
valid = false;
|
||||
errors.username = 'user not found';
|
||||
// something better?
|
||||
} else {
|
||||
valid = true;
|
||||
errors.username = '';
|
||||
}
|
||||
|
||||
// if (users[userIndex].password !== login.password) {
|
||||
if (user && user.password !== login.password) {
|
||||
valid = false;
|
||||
errors.password = 'Wrong Password';
|
||||
// Maybe clear the fields?
|
||||
} else {
|
||||
valid = true;
|
||||
errors.password = '';
|
||||
}
|
||||
|
||||
//
|
||||
// Validation
|
||||
//
|
||||
unsubscribe();
|
||||
|
||||
if (valid) {
|
||||
// yea don't modify this here...
|
||||
currentPage = 'user';
|
||||
// something like: indicate that userIndex is the one we want...
|
||||
console.log('valid Credentials');
|
||||
|
||||
// making sure we start at the top of the page, way less jarring
|
||||
// leave for now just in case...
|
||||
document.body.scrollIntoView();
|
||||
|
||||
// may not actually want a dispatch?
|
||||
// pass data userIndex?
|
||||
// dispatch('loggedIn');
|
||||
// from svelte-spa-router
|
||||
push("/user");
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
const createAccountHandler = () => {
|
||||
console.log('hi from accunt handler');
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
<header class="grid-container">
|
||||
|
||||
<!-- <div on:mouseenter={enter} on:mouseleave={leave} class:active > -->
|
||||
<h1>Potato Pong</h1>
|
||||
<!-- </div> -->
|
||||
<nav>
|
||||
<!-- placeholder links -->
|
||||
<a href="/">Somewhere</a>
|
||||
<!-- <a href="/">SomewhereElse</a> -->
|
||||
{#if !user.logedIn}
|
||||
<ScrollTo element={bottomHalf}/>
|
||||
{:else}
|
||||
<div class="logout" on:click={logout}>Log Out</div>
|
||||
{/if}
|
||||
<!-- one of these will be login and it will scroll you down to the login part -->
|
||||
</nav>
|
||||
<h2>
|
||||
<div>Welcome to</div>
|
||||
<div>Potato Pong</div>
|
||||
</h2>
|
||||
|
||||
<!-- here i want a flashing arrow pointing down to the login part -->
|
||||
|
||||
</header>
|
||||
<!-- <Canvas class=".canvas2"/> -->
|
||||
<Canvas/>
|
||||
|
||||
|
||||
|
||||
<section class="register" bind:this={bottomHalf}>
|
||||
|
||||
<!-- My beautiful tabs are useless now, whatever, kill your darlings... -->
|
||||
<!-- i could have a toggle tab to login or create a new account -->
|
||||
<!-- This shit is kinda unnecessary cuz there is no Create Account option... -->
|
||||
|
||||
<Tabs items={items} {activeItem} on:tabChange={tabChange}/>
|
||||
{#if activeItem === 'Login'}
|
||||
<div class="card">
|
||||
<Card>
|
||||
<h2>Login</h2>
|
||||
<form on:submit|preventDefault={loginHandler}>
|
||||
<div class="form-field">
|
||||
<input type="text" id="username" placeholder="username" bind:value={login.username}>
|
||||
<div class="error">{ errors.username }</div>
|
||||
</div>
|
||||
<div class="form-field">
|
||||
<input type="password" id="password" placeholder="password" bind:value={login.password}>
|
||||
<div class="error">{ errors.password }</div>
|
||||
</div>
|
||||
<!-- type="" but flat={} cuz type is a string but flat is a bool-->
|
||||
<!-- <Button type="secondary" flat={true}>Add Poll</Button> -->
|
||||
<button>Login</button>
|
||||
</form>
|
||||
</Card>
|
||||
</div>
|
||||
{:else if activeItem = 'Create Account'}
|
||||
<!-- Create Account -->
|
||||
<div class="card">
|
||||
<Card>
|
||||
<h2>Create Account</h2>
|
||||
<form on:submit|preventDefault={createAccountHandler}>
|
||||
<div class="form-field">
|
||||
<input type="text" id="username" placeholder="username" bind:value={login.username}>
|
||||
<div class="error">{ errors.username }</div>
|
||||
</div>
|
||||
<div class="form-field">
|
||||
<input type="password" id="password" placeholder="password" bind:value={login.password}>
|
||||
<div class="error">{ errors.password }</div>
|
||||
</div>
|
||||
<!-- type="" but flat={} cuz type is a string but flat is a bool-->
|
||||
<!-- <Button type="secondary" flat={true}>Add Poll</Button> -->
|
||||
<button>Login</button>
|
||||
</form>
|
||||
</Card>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
|
||||
</section>
|
||||
<!-- below this i could say, this is where i might have put an explanation of what you can do on this page but fuck you i didn't -->
|
||||
<!-- or maybe in the end i will, something like: Fun, Game, Colors, enjoy Friendship, or don't, it's your choice! -->
|
||||
|
||||
<Footer />
|
||||
|
||||
<!-- </div> -->
|
||||
|
||||
|
||||
<style>
|
||||
/* currently useless */
|
||||
/* No styles get applied to the canvas from here, maybe i should move them to the Canvas Component... */
|
||||
/* tho tbh, why bother, i'm gonna change it anyway... */
|
||||
.canvas{
|
||||
/* grid-column: 1 / 13;
|
||||
grid-row: 1 / 3; */
|
||||
/* don't rely on Z-Index!!!! */
|
||||
z-index: -1;
|
||||
position: relative;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
white-space: nowrap;
|
||||
|
||||
/* Tmp? */
|
||||
/* background-color: #666; */
|
||||
|
||||
/* somehow this got rid of they annoying white space under the canvas */
|
||||
padding-bottom: 0;
|
||||
margin-bottom: 0px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.canvas2{
|
||||
z-index: -1;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
white-space: nowrap;
|
||||
|
||||
/* Tmp? */
|
||||
/* background-color: #666; */
|
||||
|
||||
/* somehow this got rid of they annoying white space under the canvas */
|
||||
padding-bottom: 0;
|
||||
margin-bottom: 0px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
|
||||
/* .canvas .grid-container{ */
|
||||
.grid-container{
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
|
||||
|
||||
box-sizing: border-box;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
white-space: nowrap;
|
||||
/* padding-bottom: 0; */
|
||||
margin-bottom: 0px;
|
||||
overflow: hidden;
|
||||
padding: 20px 40px;
|
||||
|
||||
|
||||
display: grid;
|
||||
grid-template-columns: repeat(12, 1fr);
|
||||
grid-template-rows: 1fr 1fr 1fr 1fr 1fr;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
header h1, header nav a{
|
||||
/* tmp ? well i kinda like it */
|
||||
color: bisque;
|
||||
}
|
||||
header h1{
|
||||
grid-column: 1 / 7;
|
||||
grid-row: 1;
|
||||
/* grid-column: span 6; */
|
||||
/* tmp? */
|
||||
padding: 20px;
|
||||
border: 1px solid bisque;
|
||||
}
|
||||
header nav{
|
||||
/* make it a flexbox? */
|
||||
grid-column: 7 / 13;
|
||||
grid-row: 1;
|
||||
justify-self: end;
|
||||
/* tmp? */
|
||||
padding: 20px;
|
||||
border: 1px solid bisque;
|
||||
}
|
||||
header nav a{
|
||||
margin-left: 10px;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
/* testing */
|
||||
header nav a:hover{
|
||||
font-weight: bold;
|
||||
background-color: blue;
|
||||
}
|
||||
header h2:hover{
|
||||
background: blue;
|
||||
}
|
||||
|
||||
|
||||
header h2{
|
||||
grid-row: 3;
|
||||
grid-column: 5 / span 4;
|
||||
justify-self: center;
|
||||
/* tmp */
|
||||
border: 1px solid black;
|
||||
z-index: 3;
|
||||
}
|
||||
header h2 div{
|
||||
font-size: 2em;
|
||||
}
|
||||
|
||||
/* the login / register part */
|
||||
|
||||
/* What do i want?
|
||||
I want it to be the same size as a full screen so you don't see the canvas at all anymore */
|
||||
|
||||
/* doesn't work... */
|
||||
/* body{
|
||||
background: bisque;
|
||||
} */
|
||||
|
||||
.bottom-half{
|
||||
/* doesn't quite work... */
|
||||
background: bisque;
|
||||
/* also doesn't work... */
|
||||
/* height: 1vw; */
|
||||
|
||||
/* testing */
|
||||
/* position: absolute; */
|
||||
}
|
||||
|
||||
section.register{
|
||||
min-height: 400px;
|
||||
}
|
||||
|
||||
.error{
|
||||
font-size: 0.8em;
|
||||
font-weight: bold;
|
||||
color: red;
|
||||
}
|
||||
|
||||
|
||||
</style>
|
||||
@@ -0,0 +1,149 @@
|
||||
<script lang="ts">
|
||||
|
||||
// The User Page can have several Flavors ?
|
||||
// like a HomePage vibe, and an AccountPage vibe or whatever, but we'll still be serving this page just with diff props
|
||||
|
||||
import UserStore from "./UserStore";
|
||||
import Header from "../components/Header.svelte";
|
||||
import Footer from "../components/Footer.svelte";
|
||||
import { createEventDispatcher } from "svelte";
|
||||
import { loginStatus } from '../stores/loginStatusStore';
|
||||
import { push } from "svelte-spa-router";
|
||||
|
||||
let dispatch = createEventDispatcher();
|
||||
|
||||
// i fucking hate these vars, the will have to go
|
||||
export let pages;
|
||||
export let currentPage;
|
||||
export let userId;
|
||||
|
||||
// This shit is so redundant...
|
||||
let types = ['home', 'account']
|
||||
export let currentType = 'account';
|
||||
|
||||
// this is also stupid...
|
||||
let sidebar = true;
|
||||
|
||||
|
||||
// would i prefer to forward this?
|
||||
let clickedHome = () => {
|
||||
console.log('clicked home');
|
||||
// do something...
|
||||
currentType = 'home';
|
||||
};
|
||||
|
||||
let clickedLogout = async() => {
|
||||
console.log('clicked logout');
|
||||
await fetch('http://transcendance:8080/api/v2/auth/logout',);
|
||||
$loginStatus = false;
|
||||
// maybe use replace() ?
|
||||
push('/');
|
||||
};
|
||||
|
||||
// All the variables that will eventually be replaced by the real values
|
||||
|
||||
let username = 'Username';
|
||||
let games = { total: 7, won: 4, lost: 3};
|
||||
let rank = 'gold or whatever the fuck who cares...';
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
<!-- remove ={clickedHome} if you want to forward the event to App.svelte-->
|
||||
<!-- god this is some gross code... -->
|
||||
<Header on:clickedHome={clickedHome} currentType="{currentType === 'home' ? 'home' : 'regular'}" on:clickedLogout={clickedLogout}/>
|
||||
|
||||
<!-- The Wave -->
|
||||
<!-- <div class="spacer layer1"></div> -->
|
||||
|
||||
<!-- this is the thing that will let me offset -->
|
||||
<div class='{sidebar ? "main-grid" : "none"}'>
|
||||
{#if sidebar}
|
||||
<section class="sidebar">
|
||||
<p>i am a sidebar</p>
|
||||
</section>
|
||||
{/if}
|
||||
|
||||
<main class:offset={sidebar}>
|
||||
<!-- what the fuck do we even want in here? messges, about the user, STATISTICS!!! -->
|
||||
<!-- <div>some stuff goes here</div> -->
|
||||
<img class="icon" src="img/default_user_icon.png" alt="default user icon">
|
||||
<div>{username}</div>
|
||||
<div>Rank: {rank}</div>
|
||||
<section class="main-stats">
|
||||
<h4>Match Statistics</h4>
|
||||
<p>Total: {games.total}</p>
|
||||
<p>Victories: {games.won}</p>
|
||||
<p>Losses: {games.lost}</p>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
</div>
|
||||
|
||||
<Footer />
|
||||
|
||||
|
||||
<style>
|
||||
|
||||
|
||||
|
||||
/* from Haikei */
|
||||
/* for any Haikei image */
|
||||
.spacer{
|
||||
aspect-ratio: 900/300;
|
||||
width: 100%;
|
||||
background-repeat: no-repeat;
|
||||
background-position: center;
|
||||
background-size: cover;
|
||||
}
|
||||
/* the specific image we use, you need both classes */
|
||||
.layer1{
|
||||
background-image: url('/img/wave-haikei.svg');
|
||||
}
|
||||
|
||||
div.main-grid{
|
||||
display: grid;
|
||||
grid-template-columns: repeat(12, 1fr);
|
||||
/* max-height: calc(100vh - 30vh); */
|
||||
height: 85vh;
|
||||
}
|
||||
|
||||
section.sidebar{
|
||||
grid-column: 1 / span 2;
|
||||
background: white;
|
||||
}
|
||||
|
||||
/* The main part */
|
||||
main{
|
||||
max-width: 960px;
|
||||
margin: 40px auto;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
main.offset{
|
||||
grid-column: 3 / span 10;
|
||||
}
|
||||
|
||||
/* Normal CSS stuff */
|
||||
.icon{
|
||||
max-width: 150px;
|
||||
}
|
||||
|
||||
/* The variable rich section */
|
||||
section.main-stats{
|
||||
max-width: 600px;
|
||||
margin: 40px auto;
|
||||
text-align: center;
|
||||
/* i think i want to use a grid? */
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
/* not sure about this, maybe top should be larger? */
|
||||
grid-template-rows: repeat(3, 1fr);
|
||||
}
|
||||
|
||||
/* the stuff in the grid*/
|
||||
section.main-stats h4{
|
||||
grid-column: 1 / span 3;
|
||||
}
|
||||
|
||||
</style>
|
||||
@@ -0,0 +1,45 @@
|
||||
import { writable } from "svelte/store";
|
||||
|
||||
// ok yea this doesn't make a lot of sense, what am i trying to do?
|
||||
// have an array of objects that are all the users?
|
||||
// or an object that is the one user?
|
||||
// For now as a placeholder i'll have one user in one obj
|
||||
|
||||
// should it not be a const? yea seems like it
|
||||
// export const users = writable(
|
||||
const UserStore = writable(
|
||||
[{
|
||||
// this is an example user
|
||||
id: 1,
|
||||
username: 'chaboi',
|
||||
email: 'nope@fu.com',
|
||||
// surely there's a better way to do this!
|
||||
password: '1234',
|
||||
// maybe an object listing friends' usernames?
|
||||
friends: 0,
|
||||
loggedIn: false,
|
||||
// i imagine the user uploading their Avatare and it being put somehwere in the DB which could be referenced like a URL
|
||||
// so if this field is empty then use the default avatar
|
||||
avatar: '',
|
||||
// online, offline, gaming
|
||||
status: 'offline',
|
||||
},
|
||||
{
|
||||
id: 2,
|
||||
username: 'itsame',
|
||||
email: 'mario@nintendo.com',
|
||||
// surely there's a better way to do this!
|
||||
password: '1234',
|
||||
// maybe an object listing friends' usernames?
|
||||
friends: 0,
|
||||
loggedIn: false,
|
||||
// i imagine the user uploading their Avatare and it being put somehwere in the DB which could be referenced like a URL
|
||||
// so if this field is empty then use the default avatar
|
||||
avatar: '',
|
||||
// online, offline, gaming
|
||||
status: 'offline',
|
||||
}]
|
||||
);
|
||||
|
||||
export default UserStore;
|
||||
// export default users;
|
||||
@@ -0,0 +1,54 @@
|
||||
@font-face {
|
||||
font-family: 'Monocode-Regular-Demo';
|
||||
src:url('/fonts/Monocode-Regular-Demo.ttf.woff') format('woff'),
|
||||
url('Monocode-Regular-Demo.ttf.svg#Monocode-Regular-Demo') format('svg'),
|
||||
url('Monocode-Regular-Demo.ttf.eot'),
|
||||
url('Monocode-Regular-Demo.ttf.eot?#iefix') format('embedded-opentype');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Air-Conditioner';
|
||||
src:url('/fonts/Air-Conditioner.ttf.woff') format('woff'),
|
||||
url('Air-Conditioner.ttf.svg#Air-Conditioner') format('svg'),
|
||||
url('Air-Conditioner.ttf.eot'),
|
||||
url('Air-Conditioner.ttf.eot?#iefix') format('embedded-opentype');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
@font-face {
|
||||
font-family: '1968-Odyssey-3D';
|
||||
src:url('/fonts/1968-Odyssey-3D.ttf.woff') format('woff'),
|
||||
url('1968-Odyssey-3D.ttf.svg#1968-Odyssey-3D') format('svg'),
|
||||
url('1968-Odyssey-3D.ttf.eot'),
|
||||
url('1968-Odyssey-3D.ttf.eot?#iefix') format('embedded-opentype');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
@font-face {
|
||||
font-family: '1968-Odyssey-Gradient';
|
||||
src:url('/fonts/1968-Odyssey-Gradient.ttf.woff') format('woff'),
|
||||
url('1968-Odyssey-Gradient.ttf.svg#1968-Odyssey-Gradient') format('svg'),
|
||||
url('1968-Odyssey-Gradient.ttf.eot'),
|
||||
url('1968-Odyssey-Gradient.ttf.eot?#iefix') format('embedded-opentype');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'AddFatMan';
|
||||
src:url('/fonts/AddFatMan.ttf.woff') format('woff'),
|
||||
url('/fonts/AddFatMan.ttf.svg#AddFatMan') format('svg'),
|
||||
url('/fonts/AddFatMan.ttf.eot'),
|
||||
url('/fonts/AddFatMan.ttf.eot?#iefix') format('embedded-opentype');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Bondi';
|
||||
src:url('/fonts/Bondi.ttf.woff') format('woff'),
|
||||
url('/fonts/Bondi.ttf.svg#Bondi') format('svg'),
|
||||
url('/fonts/Bondi.ttf.eot'),
|
||||
url('/fonts/Bondi.ttf.eot?#iefix') format('embedded-opentype');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
@@ -1,89 +0,0 @@
|
||||
<script>
|
||||
import { push } from "svelte-spa-router";
|
||||
|
||||
let qrCodeImg;
|
||||
let qrCode = "";
|
||||
let wrongCode = "";
|
||||
let maxTry = 3;
|
||||
const fetchQrCodeImg = (async() => {
|
||||
await fetch("http://transcendance:8080/api/v2/auth/2fa/generate",
|
||||
{
|
||||
method: 'POST',
|
||||
})
|
||||
.then(response => {return response.blob()})
|
||||
.then(blob => {
|
||||
const url = URL.createObjectURL(blob);
|
||||
qrCodeImg = url;
|
||||
});
|
||||
})()
|
||||
|
||||
$: submit = async() => {
|
||||
const response = await fetch("http://transcendance:8080/api/v2/auth/2fa/turn-on",
|
||||
{
|
||||
method : 'POST',
|
||||
headers : {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body : JSON.stringify({
|
||||
"twoFaCode" : qrCode,
|
||||
}),
|
||||
});
|
||||
if (response.status === 401)
|
||||
{
|
||||
qrCode = "";
|
||||
wrongCode = `Wrong code, please try again. You have ${maxTry} before end session`;
|
||||
maxTry--;
|
||||
}
|
||||
if (maxTry === 0)
|
||||
{
|
||||
await fetch("http://transcendance:8080/auth/logout",
|
||||
{
|
||||
method : 'POST',
|
||||
})
|
||||
.then(response => response.json())
|
||||
.then(push("/login"));
|
||||
}
|
||||
if (response.status === 200)
|
||||
{
|
||||
push("/");
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<body>
|
||||
<main class="form-signin w-100 m-auto">
|
||||
{#await fetchQrCodeImg}
|
||||
<p>Please Wait...</p>
|
||||
{:then data}
|
||||
{#if wrongCode}
|
||||
<div class="alert alert-danger" role="alert">
|
||||
{wrongCode}
|
||||
</div>
|
||||
{/if}
|
||||
<img src={qrCodeImg} alt="A QRCodeImg you must scan with google authenticator" id="qrcodeImg" />
|
||||
<form on:submit|preventDefault={submit}>
|
||||
<label for="code" class="block text-sm text-gray-600">Code</label>
|
||||
<input id="code" bind:value={qrCode} type="text" class="block px-1 py-2 mt-2 border-2 border-gray-100 text-gray-800" />
|
||||
<button type="submit" class="p-2 bg-blue-500 text-white mt-4 px-6">
|
||||
Send
|
||||
</button>
|
||||
</form>
|
||||
{:catch}
|
||||
<p>Unable to get QrCodeImg</p>
|
||||
{/await}
|
||||
</main>
|
||||
</body>
|
||||
|
||||
<style>
|
||||
body {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding-top: 40px;
|
||||
padding-bottom: 40px;
|
||||
}
|
||||
|
||||
.form-signin {
|
||||
max-width: 330px;
|
||||
padding: 15px;
|
||||
}
|
||||
</style>
|
||||
@@ -1,55 +0,0 @@
|
||||
<script lang="ts">
|
||||
import axios from 'axios';
|
||||
import { onMount } from 'svelte';
|
||||
import {push} from 'svelte-spa-router';
|
||||
|
||||
let user = {logedIn: false};
|
||||
|
||||
onMount(async () => {
|
||||
console.log('PROFIL SVELTE');
|
||||
const {data} = await axios.get('http://transcendance:8080/api/v2/user');
|
||||
if (data)
|
||||
user.logedIn = true;
|
||||
});
|
||||
|
||||
$: submit = async() => {
|
||||
window.location.href = 'http://transcendance:8080/api/v2/auth';
|
||||
}
|
||||
|
||||
$: logout = async() => {
|
||||
await fetch('http://transcendance:8080/api/v2/auth/logout',);
|
||||
user.logedIn = false;
|
||||
}
|
||||
|
||||
console.log(user.logedIn);
|
||||
</script>
|
||||
|
||||
<body>
|
||||
<main class="form-signin w-100 m-auto">
|
||||
{#if !user.logedIn}
|
||||
<button on:click={submit} class="w-100 btn btn-lg btn-primary" type="submit">
|
||||
Connexion
|
||||
</button>
|
||||
{/if}
|
||||
{#if user.logedIn}
|
||||
<button on:click={logout} class="w-100 btn btn-lg btn-primary" type="submit">
|
||||
Deconnexion
|
||||
</button>
|
||||
{/if}
|
||||
</main>
|
||||
</body>
|
||||
|
||||
<style>
|
||||
|
||||
body {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding-top: 40px;
|
||||
padding-bottom: 40px;
|
||||
}
|
||||
|
||||
.form-signin {
|
||||
max-width: 330px;
|
||||
padding: 15px;
|
||||
}
|
||||
</style>
|
||||
@@ -1,67 +0,0 @@
|
||||
<script>
|
||||
import Router, { link } from "svelte-spa-router";
|
||||
import Login from "../auth/login.svelte";
|
||||
import Profil from "../profil/profil.svelte";
|
||||
import UpdateProfil from "../profil/updateProfil.svelte";
|
||||
const routes = {
|
||||
"/login": Login,
|
||||
"/profil": Profil,
|
||||
"/update-profil": UpdateProfil,
|
||||
};
|
||||
</script>
|
||||
|
||||
<body>
|
||||
<main class="d-flex flex-nowrap">
|
||||
<h1 class="visually-hidden">Sidebars examples</h1>
|
||||
|
||||
<div
|
||||
class="d-flex flex-column flex-shrink-0 p-3 text-bg-dark"
|
||||
style="width: 280px;"
|
||||
>
|
||||
<a href="/" use:link class="d-flex align-items-center mb-3 mb-md-0 me-md-auto text-white text-decoration-none">
|
||||
<span class="fs-4">Sidebar</span>
|
||||
</a>
|
||||
<hr />
|
||||
<ul class="nav nav-pills flex-column mb-auto">
|
||||
<li class="nav-item">
|
||||
<a
|
||||
href="/profil"
|
||||
use:link
|
||||
class="nav-link active"
|
||||
aria-current="page"
|
||||
>
|
||||
Profil
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a
|
||||
href="/update-profil"
|
||||
use:link
|
||||
class="nav-link active"
|
||||
aria-current="page"
|
||||
>
|
||||
Update Profile
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
<hr />
|
||||
</div>
|
||||
</main>
|
||||
</body>
|
||||
|
||||
<Router {routes} />
|
||||
|
||||
<style>
|
||||
body {
|
||||
min-height: 100vh;
|
||||
min-height: -webkit-fill-available;
|
||||
}
|
||||
|
||||
main {
|
||||
height: 100vh;
|
||||
height: -webkit-fill-available;
|
||||
max-height: 100vh;
|
||||
overflow-x: auto;
|
||||
overflow-y: hidden;
|
||||
}
|
||||
</style>
|
||||
@@ -1,53 +0,0 @@
|
||||
<script>
|
||||
import axios from "axios";
|
||||
import { onMount } from "svelte";
|
||||
|
||||
let user = {};
|
||||
let stats = {};
|
||||
onMount (async() => {
|
||||
console.log("PROFIL SVELTE");
|
||||
const response = await fetch('http://transcendance:8080/api/v2/user',
|
||||
{
|
||||
method : 'GET',
|
||||
}).then(response => response.json());
|
||||
console.log(response);
|
||||
user = response;
|
||||
stats = user.stats;
|
||||
});
|
||||
</script>
|
||||
|
||||
|
||||
<body>
|
||||
<main class="form-signin w-100 m-auto">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<h1>Profil</h1>
|
||||
<ul>
|
||||
<li>username : {user.username}</li>
|
||||
<li>stats : Win games {stats.winGame}
|
||||
Lose games {stats.loseGame}
|
||||
Draw games {stats.drawGame}
|
||||
Total games {stats.totalGame}
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</body>
|
||||
|
||||
<style>
|
||||
|
||||
body {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding-top: 40px;
|
||||
padding-bottom: 40px;
|
||||
}
|
||||
|
||||
.form-signin {
|
||||
max-width: 330px;
|
||||
padding: 15px;
|
||||
}
|
||||
</style>
|
||||
@@ -1,120 +0,0 @@
|
||||
<script>
|
||||
import { onMount } from "svelte";
|
||||
|
||||
let avatarUser, postVar, newAvatar, fileinput;
|
||||
let usernameSv = "";
|
||||
let image_urlSv = "";
|
||||
let uploadAvatarSuccess = false;
|
||||
let gAuth = false;
|
||||
let errors = {usernameSv, image_urlSv};
|
||||
onMount(async () => {
|
||||
await fetch("http://transcendance:8080/api/v2/user").
|
||||
then(response => response.json()).
|
||||
then(data => {
|
||||
usernameSv = data.username;
|
||||
gAuth = data.isEnabledTwoFactorAuth;
|
||||
});
|
||||
await fetch("http://transcendance:8080/api/v2/user/avatar", {method: "GET"}).
|
||||
then(response => {return response.blob()}).
|
||||
then(data => {
|
||||
const url = URL.createObjectURL(data);
|
||||
avatarUser = url;
|
||||
});
|
||||
});
|
||||
|
||||
$: uploadAvatar = async() => {
|
||||
const data = new FormData();
|
||||
data.append("file", newAvatar[0]);
|
||||
console.log(data);
|
||||
await fetch("http://transcendance:8080/api/v2/user/avatar",
|
||||
{
|
||||
method : 'POST',
|
||||
body : data,
|
||||
})
|
||||
.then(uploadAvatarSuccess = true)
|
||||
.catch(errors.image_urlSv = "Something went wrong." )
|
||||
}
|
||||
|
||||
$: submit = async() => {
|
||||
errors.usernameSv = "";
|
||||
errors.image_urlSv ="";
|
||||
if (usernameSv === undefined || usernameSv.trim() === "") {
|
||||
errors.usernameSv = "Username is required";
|
||||
return;
|
||||
}
|
||||
console.log(usernameSv);
|
||||
await fetch("http://transcendance:8080/api/v2/user/",
|
||||
{
|
||||
method: "PATCH",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: JSON.stringify({
|
||||
"username" : usernameSv,
|
||||
"isEnabledTwoFactorAuth" : gAuth
|
||||
})
|
||||
})
|
||||
}
|
||||
</script>
|
||||
|
||||
<body>
|
||||
<main class="form-signin w-100 m-auto">
|
||||
<div class="p-20">
|
||||
{#if errors.image_urlSv}
|
||||
<div class="alert alert-danger" role="alert">
|
||||
{errors.image_urlSv}
|
||||
</div>
|
||||
{/if}
|
||||
{#if errors.username}
|
||||
<div class="alert alert-danger" role="alert">
|
||||
{errors.username}
|
||||
</div>
|
||||
{/if}
|
||||
{#if uploadAvatarSuccess}
|
||||
<div class="alert alert-danger" role="alert">
|
||||
You avatar has been successfully uploaded !
|
||||
</div>
|
||||
{/if}
|
||||
<form on:submit|preventDefault={uploadAvatar}>
|
||||
{#if avatarUser}
|
||||
<img class="avatar" src={avatarUser} alt="" />
|
||||
{/if}
|
||||
<input
|
||||
type="text"
|
||||
bind:value={postVar}
|
||||
placeholder={"choose your file"}
|
||||
/>
|
||||
<br />
|
||||
<input
|
||||
type="file"
|
||||
bind:files={newAvatar} />
|
||||
<br />
|
||||
<button type="submit" class="p-2 bg-blue-500 text-white mt-4 px-6">
|
||||
Choose avatar
|
||||
</button>
|
||||
</form>
|
||||
<form on:submit|preventDefault={submit}>
|
||||
<label for="username" class="block text-sm text-gray-600">Username</label>
|
||||
<input id="username" type="text" placeholder=${usernameSv} class="block px-1 py-2 mt-2 border-2 border-gray-100 text-gray-800" bind:value={usernameSv} />
|
||||
<div>
|
||||
<input type="checkbox" bind:checked={gAuth} id="gAuth" name="gAuth">
|
||||
<label for="gAuth">Enable google authenticator</label>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</main>
|
||||
</body>
|
||||
<style>
|
||||
|
||||
body {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding-top: 40px;
|
||||
padding-bottom: 40px;
|
||||
}
|
||||
|
||||
.form-signin {
|
||||
max-width: 330px;
|
||||
padding: 15px;
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,39 @@
|
||||
import NotFound from "../NotFound.svelte";
|
||||
import ProfilePage from "../ProfilePage.svelte";
|
||||
import SplashPage from "../SplashPage.svelte";
|
||||
import TmpTest from '../TmpTest.svelte';
|
||||
|
||||
|
||||
// "/article/:title": Article, // this is how you would do parameters!
|
||||
// "/": LoginPage,
|
||||
|
||||
export const primaryRoutes = {
|
||||
'/': SplashPage,
|
||||
'/profile': ProfilePage,
|
||||
'/profile/*': ProfilePage,
|
||||
'*': NotFound
|
||||
};
|
||||
|
||||
// export const primaryRoutes = {
|
||||
// "/": SplashPage,
|
||||
// "/profile": ProfilePage,
|
||||
// "/game": GamePage,
|
||||
// "/chat": ChatPage,
|
||||
// "*": NotFound
|
||||
// };
|
||||
|
||||
// i might need to add /profile/* and such to make the nested routers work
|
||||
|
||||
// ok maybe these need to be in their own files?
|
||||
|
||||
|
||||
|
||||
// export const gameRoutes = {
|
||||
// "/": GamePage,
|
||||
// "*": NotFound
|
||||
// };
|
||||
|
||||
// export const chatRoutes = {
|
||||
// "/": ChatPage,
|
||||
// "*": NotFound
|
||||
// };
|
||||
@@ -0,0 +1,15 @@
|
||||
|
||||
import NotFound from "../NotFound.svelte";
|
||||
import ProfileDisplay from '../ProfileDisplay.svelte';
|
||||
import ProfileSettings from '../ProfileSettings.svelte';
|
||||
|
||||
// establishing the prefix here very clearly so we can have a coherent repeatable structure
|
||||
export const prefix = '/profile';
|
||||
|
||||
export const profileRoutes = {
|
||||
'/': ProfileDisplay,
|
||||
'/settings': ProfileSettings,
|
||||
'*': NotFound
|
||||
};
|
||||
|
||||
// what if i did /#/profile/:id for like not the user? and then based on that did a fetch?
|
||||
14
srcs/requirements/svelte/api_front/src/shared/Card.svelte
Normal file
@@ -0,0 +1,14 @@
|
||||
<div class="card">
|
||||
<slot></slot>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.card{
|
||||
background: white;
|
||||
padding: 20px;
|
||||
border-radius: 6px;
|
||||
/* this softens the corners */
|
||||
|
||||
box-shadow: 0px 2px 4px rgba(0,0,0,0.1);
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,40 @@
|
||||
<script lang="ts">
|
||||
|
||||
// trying something...
|
||||
// const element = document.getElementById("bottom-half");
|
||||
export let element;
|
||||
|
||||
// is this too JS for me?
|
||||
const scrollTo= () => {
|
||||
element.scrollIntoView({behavior: "smooth"});
|
||||
console.log('supposed to scroll');
|
||||
// Maybe eventually i can do this in a more svelte way, on:scroll={someEvent} ... whatever
|
||||
};
|
||||
|
||||
</script>
|
||||
|
||||
<!-- <svelte:window bind:scrollY={y}/> -->
|
||||
|
||||
|
||||
<!-- wait actually i don't want this... -->
|
||||
<!-- <svelte:window on:scroll={handleOnScroll} /> -->
|
||||
|
||||
<!-- a div instead? -->
|
||||
<!-- <button>Login</button> -->
|
||||
<div class="to-login" on:click={scrollTo}>Login</div>
|
||||
|
||||
|
||||
<style>
|
||||
.to-login{
|
||||
display: inline-block;
|
||||
/* color: bisque; */
|
||||
color: blue;
|
||||
margin-left: 10px;
|
||||
}
|
||||
.to-login:hover{
|
||||
font-weight: bold;
|
||||
color: black;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
</style>
|
||||
43
srcs/requirements/svelte/api_front/src/shared/Tabs.svelte
Normal file
@@ -0,0 +1,43 @@
|
||||
<script lang='ts'>
|
||||
import { createEventDispatcher } from "svelte";
|
||||
export let items;
|
||||
export let activeItem;
|
||||
|
||||
const dispatch = createEventDispatcher();
|
||||
|
||||
</script>
|
||||
|
||||
<div class="tabs">
|
||||
<!-- creates a list, can be done other ways -->
|
||||
<ul>
|
||||
{#each items as item}
|
||||
<li on:click={() => dispatch('tabChange', item)}>
|
||||
<!-- the class active is attributed if the condition is met -->
|
||||
<div class:active={activeItem === item}>{item}</div>
|
||||
</li>
|
||||
{/each}
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.tabs{
|
||||
margin-bottom: 40px;
|
||||
}
|
||||
ul{
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
padding: 0;
|
||||
list-style-type: none;
|
||||
}
|
||||
li{
|
||||
margin: 0 16px;
|
||||
font-size: 18px;
|
||||
color: #555;
|
||||
cursor: pointer;
|
||||
}
|
||||
.active{
|
||||
color: #d91b42;
|
||||
border-bottom: 2px solid #d91b42;
|
||||
padding-bottom: 8px;
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,16 @@
|
||||
import { writable } from "svelte/store";
|
||||
|
||||
// This is a "Custom Store" see that chapter in the Svelte Tutorial, should be fine
|
||||
// NVM this is definitely overkill
|
||||
// function createLogin() {
|
||||
// const { subscribe, update } = writable(false);
|
||||
|
||||
// return {
|
||||
// subscribe,
|
||||
// login: () => update(s => s = true),
|
||||
// logout: () => update(s => s = false),
|
||||
// }
|
||||
// }
|
||||
// export const loginStatus = createLogin();
|
||||
|
||||
export const loginStatus = writable(false);
|
||||