From 99c8db6dc952d63acf17e694509efd0226e0767c Mon Sep 17 00:00:00 2001 From: ousttrue Date: Fri, 26 Jan 2024 18:24:53 +0900 Subject: [PATCH 1/4] WIP card --- docusaurus.config.ts | 10 + package-lock.json | 533 ++++++++++++++++++ package.json | 3 + src/data/jsUtils.ts | 29 + src/data/users.tsx | 1 + .../_components/ShowcaseCard/index.tsx | 52 ++ .../ShowcaseCard/styles.module.css | 99 ++++ .../ShowcaseFilterToggle/index.tsx | 85 +++ .../ShowcaseFilterToggle/styles.module.css | 57 ++ .../_components/ShowcaseTagSelect/index.tsx | 97 ++++ .../ShowcaseTagSelect/styles.module.css | 38 ++ .../_components/ShowcaseTooltip/index.tsx | 145 +++++ .../ShowcaseTooltip/styles.module.css | 45 ++ src/pages/showcase/index.tsx | 362 ++++++++++-- src/pages/showcase/styles.module.css | 99 ++++ 15 files changed, 1608 insertions(+), 47 deletions(-) create mode 100644 src/data/jsUtils.ts create mode 100644 src/pages/showcase/_components/ShowcaseCard/index.tsx create mode 100644 src/pages/showcase/_components/ShowcaseCard/styles.module.css create mode 100644 src/pages/showcase/_components/ShowcaseFilterToggle/index.tsx create mode 100644 src/pages/showcase/_components/ShowcaseFilterToggle/styles.module.css create mode 100644 src/pages/showcase/_components/ShowcaseTagSelect/index.tsx create mode 100644 src/pages/showcase/_components/ShowcaseTagSelect/styles.module.css create mode 100644 src/pages/showcase/_components/ShowcaseTooltip/index.tsx create mode 100644 src/pages/showcase/_components/ShowcaseTooltip/styles.module.css create mode 100644 src/pages/showcase/styles.module.css diff --git a/docusaurus.config.ts b/docusaurus.config.ts index 05d4a7aea..098dbc280 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -201,6 +201,16 @@ const config: Config = { } satisfies Preset.ThemeConfig, plugins: [ + [ + "@docusaurus/plugin-ideal-image", + { + quality: 70, + max: 1030, // max resized image's size. + min: 640, // min resized image's size. if original is lower, use that size. + steps: 2, // the max number of images generated between min and max (inclusive) + disableInDev: false, + }, + ], [ "@docusaurus/plugin-client-redirects", { diff --git a/package-lock.json b/package-lock.json index 25d7dacc9..27bba5b42 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,9 +19,12 @@ "devDependencies": { "@docusaurus/module-type-aliases": "3.1.0", "@docusaurus/plugin-client-redirects": "^3.1.0", + "@docusaurus/plugin-ideal-image": "^3.1.0", "@docusaurus/tsconfig": "3.1.0", "@docusaurus/types": "3.1.0", + "@popperjs/core": "^2.11.8", "react-markdown": "^9.0.1", + "react-popper": "^2.3.0", "typescript": "~5.2.2" }, "engines": { @@ -2277,6 +2280,22 @@ "node": ">=18.0" } }, + "node_modules/@docusaurus/lqip-loader": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/lqip-loader/-/lqip-loader-3.1.0.tgz", + "integrity": "sha512-vP7Smz7p5Xu75UvD4dA5qlkC7PnXl9dbTv6Eq0kLY8M5ZwBoKhNdB5c8u6j3MS5N8jUTtwYFEuH2wZWjr1/Fpw==", + "dev": true, + "dependencies": { + "@docusaurus/logger": "3.1.0", + "file-loader": "^6.2.0", + "lodash": "^4.17.21", + "sharp": "^0.32.3", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, "node_modules/@docusaurus/mdx-loader": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.1.0.tgz", @@ -2517,6 +2536,38 @@ "react-dom": "^18.0.0" } }, + "node_modules/@docusaurus/plugin-ideal-image": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-ideal-image/-/plugin-ideal-image-3.1.0.tgz", + "integrity": "sha512-ytT7f3hCM78yyv8Km3DIE1Myqp5GEGE8JnRz98wUWDzZq1tNroe+dhrLTqI2D4iqwOYFMcjFQkcvK0vDkLG7cw==", + "dev": true, + "dependencies": { + "@docusaurus/core": "3.1.0", + "@docusaurus/lqip-loader": "3.1.0", + "@docusaurus/responsive-loader": "^1.7.0", + "@docusaurus/theme-translations": "3.1.0", + "@docusaurus/types": "3.1.0", + "@docusaurus/utils-validation": "3.1.0", + "@slorber/react-ideal-image": "^0.0.12", + "react-waypoint": "^10.3.0", + "sharp": "^0.32.3", + "tslib": "^2.6.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "jimp": "*", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "jimp": { + "optional": true + } + } + }, "node_modules/@docusaurus/plugin-sitemap": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.1.0.tgz", @@ -2579,6 +2630,30 @@ "react": "*" } }, + "node_modules/@docusaurus/responsive-loader": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@docusaurus/responsive-loader/-/responsive-loader-1.7.0.tgz", + "integrity": "sha512-N0cWuVqTRXRvkBxeMQcy/OF2l7GN8rmni5EzR3HpwR+iU2ckYPnziceojcxvvxQ5NqZg1QfEW0tycQgHp+e+Nw==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "jimp": "*", + "sharp": "*" + }, + "peerDependenciesMeta": { + "jimp": { + "optional": true + }, + "sharp": { + "optional": true + } + } + }, "node_modules/@docusaurus/theme-classic": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.1.0.tgz", @@ -3005,6 +3080,16 @@ "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.24.tgz", "integrity": "sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==" }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, "node_modules/@sideway/address": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", @@ -3039,6 +3124,21 @@ "url": "https://github.com/sindresorhus/is?sponsor=1" } }, + "node_modules/@slorber/react-ideal-image": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@slorber/react-ideal-image/-/react-ideal-image-0.0.12.tgz", + "integrity": "sha512-u8KiDTEkMA7/KAeA5ywg/P7YG4zuKhWtswfVZDH8R8HXgQsFcHIYU2WaQnGuK/Du7Wdj90I+SdFmajSGFRvoKA==", + "dev": true, + "engines": { + "node": ">= 8.9.0", + "npm": "> 3" + }, + "peerDependencies": { + "prop-types": ">=15", + "react": ">=0.14.x", + "react-waypoint": ">=9.0.2" + } + }, "node_modules/@slorber/remark-comment": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", @@ -4128,6 +4228,12 @@ "postcss": "^8.1.0" } }, + "node_modules/b4a": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", + "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==", + "dev": true + }, "node_modules/babel-loader": { "version": "9.1.3", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", @@ -4210,6 +4316,26 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -4231,6 +4357,17 @@ "node": ">=8" } }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, "node_modules/body-parser": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", @@ -4361,6 +4498,30 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -4611,6 +4772,12 @@ "fsevents": "~2.3.2" } }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, "node_modules/chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", @@ -4744,6 +4911,19 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -4760,6 +4940,16 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dev": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, "node_modules/colord": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", @@ -4899,6 +5089,12 @@ "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" }, + "node_modules/consolidated-events": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/consolidated-events/-/consolidated-events-2.0.2.tgz", + "integrity": "sha512-2/uRVMdRypf5z/TW/ncD/66l75P5hH2vM/GR8Jf8HLc2xnfJtmina6F6du8+v4Z2vTrMo7jC+W1tmEEuuELgkQ==", + "dev": true + }, "node_modules/content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", @@ -5525,6 +5721,15 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", @@ -5751,6 +5956,15 @@ "node": ">= 0.8" } }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/enhanced-resolve": { "version": "5.15.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", @@ -6033,6 +6247,15 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/express": { "version": "4.18.2", "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", @@ -6132,6 +6355,12 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true + }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", @@ -6536,6 +6765,12 @@ "node": ">= 0.6" } }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, "node_modules/fs-extra": { "version": "11.2.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", @@ -6618,6 +6853,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true + }, "node_modules/github-slugger": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", @@ -7422,6 +7663,26 @@ "postcss": "^8.1.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/ignore": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", @@ -10349,6 +10610,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, "node_modules/mrmime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", @@ -10391,6 +10658,12 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -10413,6 +10686,24 @@ "tslib": "^2.0.3" } }, + "node_modules/node-abi": { + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.54.0.tgz", + "integrity": "sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", + "dev": true + }, "node_modules/node-emoji": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", @@ -11546,6 +11837,60 @@ "postcss": "^8.2.15" } }, + "node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prebuild-install/node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/prebuild-install/node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/pretty-error": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", @@ -11644,6 +11989,16 @@ "node": ">= 0.10" } }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -11704,6 +12059,12 @@ } ] }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "dev": true + }, "node_modules/quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", @@ -12012,6 +12373,21 @@ "react": ">=18" } }, + "node_modules/react-popper": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", + "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", + "dev": true, + "dependencies": { + "react-fast-compare": "^3.0.1", + "warning": "^4.0.2" + }, + "peerDependencies": { + "@popperjs/core": "^2.0.0", + "react": "^16.8.0 || ^17 || ^18", + "react-dom": "^16.8.0 || ^17 || ^18" + } + }, "node_modules/react-router": { "version": "5.3.4", "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", @@ -12060,6 +12436,27 @@ "react": ">=15" } }, + "node_modules/react-waypoint": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/react-waypoint/-/react-waypoint-10.3.0.tgz", + "integrity": "sha512-iF1y2c1BsoXuEGz08NoahaLFIGI9gTUAAOKip96HUmylRT6DUtpgoBPjk/Y8dfcFVmfVDvUzWjNXpZyKTOV0SQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "consolidated-events": "^1.1.0 || ^2.0.0", + "prop-types": "^15.0.0", + "react-is": "^17.0.1 || ^18.0.0" + }, + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-waypoint/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -12909,6 +13306,29 @@ "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" }, + "node_modules/sharp": { + "version": "0.32.6", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", + "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.2", + "node-addon-api": "^6.1.0", + "prebuild-install": "^7.1.1", + "semver": "^7.5.4", + "simple-get": "^4.0.1", + "tar-fs": "^3.0.4", + "tunnel-agent": "^0.6.0" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -12970,6 +13390,66 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + }, "node_modules/sirv": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", @@ -13153,6 +13633,16 @@ "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==" }, + "node_modules/streamx": { + "version": "2.15.6", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.6.tgz", + "integrity": "sha512-q+vQL4AAz+FdfT137VF69Cc/APqUbxy+MDOImRrMvchJpigHj9GksgDU2LYbO9rx7RX6osWgxJB2WxhYv4SZAw==", + "dev": true, + "dependencies": { + "fast-fifo": "^1.1.0", + "queue-tick": "^1.0.1" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -13415,6 +13905,28 @@ "node": ">=6" } }, + "node_modules/tar-fs": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", + "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", + "dev": true, + "dependencies": { + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dev": true, + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, "node_modules/terser": { "version": "5.26.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz", @@ -13620,6 +14132,18 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, "node_modules/type-fest": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", @@ -14159,6 +14683,15 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "dev": true, + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", diff --git a/package.json b/package.json index 321a6ea71..38e159077 100644 --- a/package.json +++ b/package.json @@ -26,9 +26,12 @@ "devDependencies": { "@docusaurus/module-type-aliases": "3.1.0", "@docusaurus/plugin-client-redirects": "^3.1.0", + "@docusaurus/plugin-ideal-image": "^3.1.0", "@docusaurus/tsconfig": "3.1.0", "@docusaurus/types": "3.1.0", + "@popperjs/core": "^2.11.8", "react-markdown": "^9.0.1", + "react-popper": "^2.3.0", "typescript": "~5.2.2" }, "browserslist": { diff --git a/src/data/jsUtils.ts b/src/data/jsUtils.ts new file mode 100644 index 000000000..758c7fe2d --- /dev/null +++ b/src/data/jsUtils.ts @@ -0,0 +1,29 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +// Inspired by https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscore#_sortby-and-_orderby +export function sortBy( + array: T[], + getter: (item: T) => string | number | boolean +): T[] { + const sortedArray = [...array]; + sortedArray.sort((a, b) => + // eslint-disable-next-line no-nested-ternary + getter(a) > getter(b) ? 1 : getter(b) > getter(a) ? -1 : 0 + ); + return sortedArray; +} + +export function toggleListItem(list: T[], item: T): T[] { + const itemIndex = list.indexOf(item); + if (itemIndex === -1) { + return list.concat(item); + } + const newList = [...list]; + newList.splice(itemIndex, 1); + return newList; +} diff --git a/src/data/users.tsx b/src/data/users.tsx index 664bc50a8..3b6a96b61 100644 --- a/src/data/users.tsx +++ b/src/data/users.tsx @@ -19,6 +19,7 @@ export type UserInfo = { title: string; url: string; description?: string; + preview?: string; }; export type User = { tag: TagType, diff --git a/src/pages/showcase/_components/ShowcaseCard/index.tsx b/src/pages/showcase/_components/ShowcaseCard/index.tsx new file mode 100644 index 000000000..017e73ff7 --- /dev/null +++ b/src/pages/showcase/_components/ShowcaseCard/index.tsx @@ -0,0 +1,52 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import React from "react"; +import clsx from "clsx"; +import Link from "@docusaurus/Link"; +import Translate from "@docusaurus/Translate"; +import Image from "@theme/IdealImage"; +import { type User, type UserInfo } from "@site/src/data/users"; +import { Tags, TagList, type TagType, type Tag } from "@site/src/data/tags"; + +import { sortBy } from "@site/src/data/jsUtils"; +import Heading from "@theme/Heading"; +import Tooltip from "../ShowcaseTooltip"; +import styles from "./styles.module.css"; +import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; + +function getCardImage(user: UserInfo): string { + return ( + user.preview ?? + `https://slorber-api-screenshot.netlify.app/${encodeURIComponent( + user.url + )}/showcase` + ); +} + +function ShowcaseCard({ user }: { user: UserInfo }) { + const image = getCardImage(user); + return ( +
  • +
    + {user.title} +
    +
    +
    + + + {user.title} + + +
    +

    {user.description}

    +
    +
  • + ); +} + +export default React.memo(ShowcaseCard); diff --git a/src/pages/showcase/_components/ShowcaseCard/styles.module.css b/src/pages/showcase/_components/ShowcaseCard/styles.module.css new file mode 100644 index 000000000..4d4505683 --- /dev/null +++ b/src/pages/showcase/_components/ShowcaseCard/styles.module.css @@ -0,0 +1,99 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +.showcaseCardImage { + overflow: hidden; + height: 150px; + border-bottom: 2px solid var(--ifm-color-emphasis-200); +} + +.showcaseCardHeader { + display: flex; + align-items: center; + margin-bottom: 12px; +} + +.showcaseCardTitle { + margin-bottom: 0; + flex: 1 1 auto; +} + +.showcaseCardTitle a { + text-decoration: none; + background: linear-gradient( + var(--ifm-color-primary), + var(--ifm-color-primary) + ) + 0% 100% / 0% 1px no-repeat; + transition: background-size ease-out 200ms; +} + +.showcaseCardTitle a:not(:focus):hover { + background-size: 100% 1px; +} + +.showcaseCardTitle, +.showcaseCardHeader .svgIconFavorite { + margin-right: 0.25rem; +} + +.showcaseCardHeader .svgIconFavorite { + color: var(--site-color-svg-icon-favorite); +} + +.showcaseCardSrcBtn { + margin-left: 6px; + padding-left: 12px; + padding-right: 12px; + border: none; +} + +.showcaseCardSrcBtn:focus-visible { + background-color: var(--ifm-color-secondary-dark); +} + +[data-theme='dark'] .showcaseCardSrcBtn { + background-color: var(--ifm-color-emphasis-200) !important; + color: inherit; +} + +[data-theme='dark'] .showcaseCardSrcBtn:hover { + background-color: var(--ifm-color-emphasis-300) !important; +} + +.showcaseCardBody { + font-size: smaller; + line-height: 1.66; +} + +.cardFooter { + display: flex; + flex-wrap: wrap; +} + +.tag { + font-size: 0.675rem; + border: 1px solid var(--ifm-color-secondary-darkest); + cursor: default; + margin-right: 6px; + margin-bottom: 6px !important; + border-radius: 12px; + display: inline-flex; + align-items: center; +} + +.tag .textLabel { + margin-left: 8px; +} + +.tag .colorLabel { + width: 7px; + height: 7px; + border-radius: 50%; + margin-left: 6px; + margin-right: 6px; +} diff --git a/src/pages/showcase/_components/ShowcaseFilterToggle/index.tsx b/src/pages/showcase/_components/ShowcaseFilterToggle/index.tsx new file mode 100644 index 000000000..78c1126c6 --- /dev/null +++ b/src/pages/showcase/_components/ShowcaseFilterToggle/index.tsx @@ -0,0 +1,85 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import React, {useState, useEffect, useCallback} from 'react'; +import clsx from 'clsx'; +import {useHistory, useLocation} from '@docusaurus/router'; + +import {prepareUserState} from '../../index'; + +import styles from './styles.module.css'; + +export type Operator = 'OR' | 'AND'; + +export const OperatorQueryKey = 'operator'; + +export function readOperator(search: string): Operator { + return (new URLSearchParams(search).get(OperatorQueryKey) ?? + 'OR') as Operator; +} + +export default function ShowcaseFilterToggle(): JSX.Element { + const id = 'showcase_filter_toggle'; + const location = useLocation(); + const history = useHistory(); + const [operator, setOperator] = useState(false); + useEffect(() => { + setOperator(readOperator(location.search) === 'AND'); + }, [location]); + const toggleOperator = useCallback(() => { + setOperator((o) => !o); + const searchParams = new URLSearchParams(location.search); + searchParams.delete(OperatorQueryKey); + if (!operator) { + searchParams.append(OperatorQueryKey, 'AND'); + } + history.push({ + ...location, + search: searchParams.toString(), + state: prepareUserState(), + }); + }, [operator, location, history]); + + const ClearTag = () => { + history.push({ + ...location, + search: '', + state: prepareUserState(), + }); + }; + + return ( +
    + { + if (e.key === 'Enter') { + toggleOperator(); + } + }} + checked={operator} + /> + + + +
    + ); +} diff --git a/src/pages/showcase/_components/ShowcaseFilterToggle/styles.module.css b/src/pages/showcase/_components/ShowcaseFilterToggle/styles.module.css new file mode 100644 index 000000000..4fde44d18 --- /dev/null +++ b/src/pages/showcase/_components/ShowcaseFilterToggle/styles.module.css @@ -0,0 +1,57 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +.checkboxLabel { + --height: 25px; + --width: 80px; + --border: 2px; + display: flex; + width: var(--width); + height: var(--height); + position: relative; + border-radius: var(--height); + border: var(--border) solid var(--ifm-color-primary-darkest); + cursor: pointer; + justify-content: space-around; + opacity: 0.75; + transition: opacity var(--ifm-transition-fast) + var(--ifm-transition-timing-default); + box-shadow: var(--ifm-global-shadow-md); +} + +.checkboxLabel:hover { + opacity: 1; + box-shadow: var(--ifm-global-shadow-md), + 0 0 2px 1px var(--ifm-color-primary-dark); +} + +.checkboxLabel::after { + position: absolute; + content: ''; + inset: 0; + width: calc(var(--width) / 2); + height: 100%; + border-radius: var(--height); + background-color: var(--ifm-color-primary-darkest); + transition: transform var(--ifm-transition-fast) + var(--ifm-transition-timing-default); + transform: translateX(calc(var(--width) / 2 - var(--border))); +} + +input:focus-visible ~ .checkboxLabel::after { + outline: 2px solid currentColor; +} + +.checkboxLabel > * { + font-size: 0.8rem; + color: inherit; + transition: opacity 150ms ease-in 50ms; +} + +input:checked ~ .checkboxLabel::after { + transform: translateX(calc(-1 * var(--border))); +} diff --git a/src/pages/showcase/_components/ShowcaseTagSelect/index.tsx b/src/pages/showcase/_components/ShowcaseTagSelect/index.tsx new file mode 100644 index 000000000..9bd247514 --- /dev/null +++ b/src/pages/showcase/_components/ShowcaseTagSelect/index.tsx @@ -0,0 +1,97 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import React, { + useCallback, + useState, + useEffect, + type ComponentProps, + type ReactNode, + type ReactElement, +} from 'react'; +import {useHistory, useLocation} from '@docusaurus/router'; +import {toggleListItem} from '@site/src/data/jsUtils'; +import type {TagType} from '@site/src/data/tags'; + +import {prepareUserState} from '../../index'; +import styles from './styles.module.css'; + +interface Props extends ComponentProps<'input'> { + icon: ReactElement>; + label: ReactNode; + tag: TagType; +} + +const TagQueryStringKey = 'tags'; + +export function readSearchTags(search: string): TagType[] { + return new URLSearchParams(search).getAll(TagQueryStringKey) as TagType[]; +} + +function replaceSearchTags(search: string, newTags: TagType[]) { + const searchParams = new URLSearchParams(search); + searchParams.delete(TagQueryStringKey); + newTags.forEach((tag) => searchParams.append(TagQueryStringKey, tag)); + return searchParams.toString(); +} + +function ShowcaseTagSelect( + {id, icon, label, tag, ...rest}: Props, + ref: React.ForwardedRef, +) { + const location = useLocation(); + const history = useHistory(); + const [selected, setSelected] = useState(false); + useEffect(() => { + const tags = readSearchTags(location.search); + setSelected(tags.includes(tag)); + }, [tag, location]); + const toggleTag = useCallback(() => { + const tags = readSearchTags(location.search); + const newTags = toggleListItem(tags, tag); + const newSearch = replaceSearchTags(location.search, newTags); + history.push({ + ...location, + search: newSearch, + state: prepareUserState(), + }); + }, [tag, location, history]); + return ( + <> + { + if (e.key === 'Enter') { + toggleTag(); + } + }} + onFocus={(e) => { + if (e.relatedTarget) { + e.target.nextElementSibling?.dispatchEvent( + new KeyboardEvent('focus'), + ); + } + }} + onBlur={(e) => { + e.target.nextElementSibling?.dispatchEvent(new KeyboardEvent('blur')); + }} + onChange={toggleTag} + checked={selected} + {...rest} + /> + + + ); +} + +export default React.forwardRef(ShowcaseTagSelect); diff --git a/src/pages/showcase/_components/ShowcaseTagSelect/styles.module.css b/src/pages/showcase/_components/ShowcaseTagSelect/styles.module.css new file mode 100644 index 000000000..736714703 --- /dev/null +++ b/src/pages/showcase/_components/ShowcaseTagSelect/styles.module.css @@ -0,0 +1,38 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +.checkboxLabel:hover { + opacity: 1; + box-shadow: 0 0 2px 1px var(--ifm-color-secondary-darkest); +} + +input[type='checkbox'] + .checkboxLabel { + display: flex; + align-items: center; + cursor: pointer; + line-height: 1.5; + border-radius: 4px; + padding: 0.275rem 0.8rem; + opacity: 0.85; + transition: opacity 200ms ease-out; + border: 2px solid var(--ifm-color-secondary-darkest); +} + +input:focus-visible + .checkboxLabel { + outline: 2px solid currentColor; +} + +input:checked + .checkboxLabel { + opacity: 0.9; + background-color: var(--site-color-checkbox-checked-bg); + border: 2px solid var(--ifm-color-primary-darkest); +} + +input:checked + .checkboxLabel:hover { + opacity: 0.75; + box-shadow: 0 0 2px 1px var(--ifm-color-primary-dark); +} diff --git a/src/pages/showcase/_components/ShowcaseTooltip/index.tsx b/src/pages/showcase/_components/ShowcaseTooltip/index.tsx new file mode 100644 index 000000000..7087fa0e5 --- /dev/null +++ b/src/pages/showcase/_components/ShowcaseTooltip/index.tsx @@ -0,0 +1,145 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import React, {useEffect, useState, useRef} from 'react'; +import ReactDOM from 'react-dom'; +import {usePopper} from 'react-popper'; +import styles from './styles.module.css'; + +interface Props { + anchorEl?: HTMLElement | string; + id: string; + text: string; + children: React.ReactElement; +} + +export default function Tooltip({ + children, + id, + anchorEl, + text, +}: Props): JSX.Element { + const [open, setOpen] = useState(false); + const [referenceElement, setReferenceElement] = useState( + null, + ); + const [popperElement, setPopperElement] = useState(null); + const [arrowElement, setArrowElement] = useState(null); + const [container, setContainer] = useState(null); + const {styles: popperStyles, attributes} = usePopper( + referenceElement, + popperElement, + { + modifiers: [ + { + name: 'arrow', + options: { + element: arrowElement, + }, + }, + { + name: 'offset', + options: { + offset: [0, 8], + }, + }, + ], + }, + ); + + const timeout = useRef(null); + const tooltipId = `${id}_tooltip`; + + useEffect(() => { + if (anchorEl) { + if (typeof anchorEl === 'string') { + setContainer(document.querySelector(anchorEl)); + } else { + setContainer(anchorEl); + } + } else { + setContainer(document.body); + } + }, [container, anchorEl]); + + useEffect(() => { + const showEvents = ['mouseenter', 'focus']; + const hideEvents = ['mouseleave', 'blur']; + + const handleOpen = () => { + // There is no point in displaying an empty tooltip. + if (text === '') { + return; + } + + // Remove the title ahead of time to avoid displaying + // two tooltips at the same time (native + this one). + referenceElement?.removeAttribute('title'); + + timeout.current = window.setTimeout(() => { + setOpen(true); + }, 400); + }; + + const handleClose = () => { + clearInterval(timeout.current!); + setOpen(false); + }; + + if (referenceElement) { + showEvents.forEach((event) => { + referenceElement.addEventListener(event, handleOpen); + }); + + hideEvents.forEach((event) => { + referenceElement.addEventListener(event, handleClose); + }); + } + + return () => { + if (referenceElement) { + showEvents.forEach((event) => { + referenceElement.removeEventListener(event, handleOpen); + }); + + hideEvents.forEach((event) => { + referenceElement.removeEventListener(event, handleClose); + }); + } + }; + }, [referenceElement, text]); + + return ( + <> + {React.cloneElement(children, { + ref: setReferenceElement, + 'aria-describedby': open ? tooltipId : undefined, + })} + {container + ? ReactDOM.createPortal( + open && ( + + ), + container, + ) + : container} + + ); +} diff --git a/src/pages/showcase/_components/ShowcaseTooltip/styles.module.css b/src/pages/showcase/_components/ShowcaseTooltip/styles.module.css new file mode 100644 index 000000000..5500c818b --- /dev/null +++ b/src/pages/showcase/_components/ShowcaseTooltip/styles.module.css @@ -0,0 +1,45 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +.tooltip { + border-radius: 4px; + padding: 4px 8px; + color: var(--site-color-tooltip); + background: var(--site-color-tooltip-background); + font-size: 0.8rem; + z-index: 500; + line-height: 1.4; + font-weight: 500; + max-width: 300px; + opacity: 0.92; +} + +.tooltipArrow { + visibility: hidden; +} + +.tooltipArrow, +.tooltipArrow::before { + position: absolute; + width: 8px; + height: 8px; + background: inherit; +} + +.tooltipArrow::before { + visibility: visible; + content: ''; + transform: rotate(45deg); +} + +.tooltip[data-popper-placement^='top'] > .tooltipArrow { + bottom: -4px; +} + +.tooltip[data-popper-placement^='bottom'] > .tooltipArrow { + top: -4px; +} diff --git a/src/pages/showcase/index.tsx b/src/pages/showcase/index.tsx index b04442cf6..577af24a3 100644 --- a/src/pages/showcase/index.tsx +++ b/src/pages/showcase/index.tsx @@ -1,66 +1,334 @@ import React from "react"; -import Layout from '@theme/Layout'; -import Markdown from 'react-markdown' -import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; - -import { - sortedUsers, - type User, - type UserInfo, -} from '@site/src/data/users'; -import { - Tags, - TagList, - type TagType, -} from '@site/src/data/tags'; - -function Row(props: { user: User, lang: string }) { +import Markdown from "react-markdown"; +import clsx from "clsx"; + +import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; +import { useHistory, useLocation } from "@docusaurus/router"; +import Translate, { translate } from "@docusaurus/Translate"; +import ExecutionEnvironment from "@docusaurus/ExecutionEnvironment"; + +import Heading from "@theme/Heading"; +import Layout from "@theme/Layout"; + +import { sortedUsers, type User, type UserInfo } from "@site/src/data/users"; +import { Tags, TagList, type TagType } from "@site/src/data/tags"; + +import ShowcaseCard from "./_components/ShowcaseCard"; +import ShowcaseFilterToggle, { + type Operator, + readOperator, +} from "./_components/ShowcaseFilterToggle"; +import ShowcaseTagSelect, { + readSearchTags, +} from "./_components/ShowcaseTagSelect"; +import ShowcaseTooltip from "./_components/ShowcaseTooltip"; + +import styles from "./styles.module.css"; + +export function prepareUserState(): UserState | undefined { + if (ExecutionEnvironment.canUseDOM) { + return { + scrollTopPosition: window.scrollY, + focusedElementId: document.activeElement?.id, + }; + } + return undefined; +} + +const TITLE = translate({ message: "Docusaurus Site Showcase" }); +const DESCRIPTION = translate({ + message: "List of websites people are building with Docusaurus", +}); +const SUBMIT_URL = "https://github.com/facebook/docusaurus/discussions/7826"; + +function filterUsers( + users: User[], + selectedTags: TagType[], + operator: Operator, + searchName: string | null +) { + const { + i18n: { currentLocale }, + } = useDocusaurusContext(); + + if (searchName) { + // eslint-disable-next-line no-param-reassign + users = users.filter((user) => + user[currentLocale].title.toLowerCase().includes(searchName.toLowerCase()) + ); + } + if (selectedTags.length === 0) { + return users; + } + return users.filter((user) => { + // if (user.tags.length === 0) { + // return false; + // } + if (operator === "AND") { + return selectedTags.every((tag) => user.tag == tag); + } + return selectedTags.some((tag) => user.tag == tag); + }); +} + +function ShowcaseFilters() { + const { + i18n: { currentLocale }, + } = useDocusaurusContext(); + + const filteredUsers = useFilteredUsers(); + return ( +
    +
    +
    + + Filters + + {filteredUsers.length} +
    + +
    +
      + {TagList.map((tag, i) => { + const { ja, en, color } = Tags[tag]; + const id = `showcase_checkbox_id_${tag}`; + const label = currentLocale == "ja" ? ja : en; + const description = currentLocale == "ja" ? ja : en; + + return ( +
    • + + + ) : ( + + ) + } + /> + +
    • + ); + })} +
    +
    + ); +} + +function Row(props: { user: User; lang: string }) { const { user, lang } = props; const info = user[lang]; const tag = Tags[user.tag]; // const debug = true; const debug = false; - return (<> - - {tag[lang]} - {info.title} - {info.description} - {user.vrm} - - {debug && user["en"] && ( + return ( + <> - {tag["en"]} - {user["en"].title} - {user["en"].description} + {tag[lang]} + + {info.title} + + + {info.description} + {user.vrm} - )} - ); + + {debug && user["en"] && ( + + {tag["en"]} + + {user["en"].title} + + + {user["en"].description} + + {user.vrm} + + )} + + ); +} + +type UserState = { + scrollTopPosition: number; + focusedElementId: string | undefined; +}; + +const SearchNameQueryKey = "name"; + +function readSearchName(search: string) { + return new URLSearchParams(search).get(SearchNameQueryKey); +} + +function restoreUserState(userState: UserState | null) { + const { scrollTopPosition, focusedElementId } = userState ?? { + scrollTopPosition: 0, + focusedElementId: undefined, + }; + document.getElementById(focusedElementId)?.focus(); + window.scrollTo({ top: scrollTopPosition }); } -export default function(props) { +function useFilteredUsers() { + const location = useLocation(); + const [operator, setOperator] = React.useState("OR"); + // On SSR / first mount (hydration) no tag is selected + const [selectedTags, setSelectedTags] = React.useState([]); + const [searchName, setSearchName] = React.useState(null); + // Sync tags from QS to state (delayed on purpose to avoid SSR/Client + // hydration mismatch) + React.useEffect(() => { + setSelectedTags(readSearchTags(location.search)); + setOperator(readOperator(location.search)); + setSearchName(readSearchName(location.search)); + restoreUserState(location.state); + }, [location]); + + return React.useMemo( + () => filterUsers(sortedUsers, selectedTags, operator, searchName), + [selectedTags, operator, searchName] + ); +} + +// function ShowcaseCard({ user }: { user: User }) { +// return <>{user.ja.title}; +// } + +function SearchBar() { + const history = useHistory(); + const location = useLocation(); + const [value, setValue] = React.useState(null); + React.useEffect(() => { + setValue(readSearchName(location.search)); + }, [location]); + return ( +
    + { + setValue(e.currentTarget.value); + const newSearch = new URLSearchParams(location.search); + newSearch.delete(SearchNameQueryKey); + if (e.currentTarget.value) { + newSearch.set(SearchNameQueryKey, e.currentTarget.value); + } + history.push({ + ...location, + search: newSearch.toString(), + state: prepareUserState(), + }); + setTimeout(() => { + document.getElementById("searchbar")?.focus(); + }, 0); + }} + /> +
    + ); +} + +function ShowcaseCards() { const { i18n: { currentLocale }, } = useDocusaurusContext(); - return ( -
    + const filteredUsers = useFilteredUsers(); + if (filteredUsers.length === 0) { + return ( +
    +
    + + No result + +
    +
    + ); + } + + return ( +
    + {filteredUsers.length === sortedUsers.length ? ( + <> +
    + + All sites + +
      + {sortedUsers.map((user) => ( + + ))} +
    +
    + + ) : ( +
    +
    +
      + {filteredUsers.map((user) => ( + + ))} +
    +
    + )} +
    + ); +} -

    - VRMファイルが使えるアプリケーションは? -

    +export default function (props: any) { + return ( + +
    +

    VRMファイルが使えるアプリケーションは?

    -
    登録、更新の依頼はこちらへ。
    +
    + 登録、更新の依頼は + こちらへ。 +
    - - - {sortedUsers.map((user) => )} -
    TypeURLDescriptionVRM
    + +
    +
    -
    -
    ); + +
    +
    + ); } diff --git a/src/pages/showcase/styles.module.css b/src/pages/showcase/styles.module.css new file mode 100644 index 000000000..05b170998 --- /dev/null +++ b/src/pages/showcase/styles.module.css @@ -0,0 +1,99 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +.filterCheckbox { + justify-content: space-between; +} + +.filterCheckbox, +.checkboxList { + display: flex; + align-items: center; +} + +.filterCheckbox > div:first-child { + display: flex; + flex: 1 1 auto; + align-items: center; +} + +.filterCheckbox > div > * { + margin-bottom: 0; + margin-right: 8px; +} + +.checkboxList { + flex-wrap: wrap; +} + +.checkboxListItem { + user-select: none; + white-space: nowrap; + height: 32px; + font-size: 0.8rem; + margin-top: 0.5rem; + margin-right: 0.5rem; +} + +.checkboxListItem:last-child { + margin-right: 0; +} + +.searchContainer { + margin-left: auto; +} + +.searchContainer input { + height: 30px; + border-radius: 15px; + padding: 10px; + border: 1px solid gray; +} + +.showcaseList { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); + gap: 24px; +} + +.showcaseFavorite { + padding-top: 2rem; + padding-bottom: 2rem; + background-color: var(--site-color-favorite-background); +} + +.showcaseFavoriteHeader { + display: flex; + align-items: center; +} + +.showcaseFavoriteHeader > h2 { + margin-bottom: 0; +} + +.showcaseFavoriteHeader > svg { + width: 30px; + height: 30px; +} + +.svgIconFavoriteXs, +.svgIconFavorite { + color: var(--site-color-svg-icon-favorite); +} + +.svgIconFavoriteXs { + margin-left: 0.625rem; + font-size: 1rem; +} + +.svgIconFavorite { + margin-left: 1rem; +} + +input[type="checkbox"] { + appearance: none; +} From a5a0fc963119d95fa704c2e3ee90f6f585bf7cc5 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Mon, 29 Jan 2024 14:37:53 +0900 Subject: [PATCH 2/4] fix card --- package-lock.json | 186 +- package.json | 2 + src/data/get_ogp_url.ts | 44 + src/data/tag.d.ts | 22 + src/data/tags.ts | 56 + src/data/tags.tsx | 92 - src/data/user.d.ts | 17 + src/data/users.ts | 2280 +++++++++++++++++ src/data/users.tsx | 2092 --------------- .../_components/ShowcaseCard/index.tsx | 21 +- src/pages/showcase/index.tsx | 101 +- 11 files changed, 2637 insertions(+), 2276 deletions(-) create mode 100644 src/data/get_ogp_url.ts create mode 100644 src/data/tag.d.ts create mode 100644 src/data/tags.ts delete mode 100644 src/data/tags.tsx create mode 100644 src/data/user.d.ts create mode 100644 src/data/users.ts delete mode 100644 src/data/users.tsx diff --git a/package-lock.json b/package-lock.json index 27bba5b42..0f7195ffd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,6 +23,8 @@ "@docusaurus/tsconfig": "3.1.0", "@docusaurus/types": "3.1.0", "@popperjs/core": "^2.11.8", + "@types/node": "^20.11.7", + "fetch-meta-tags": "^1.0.12", "react-markdown": "^9.0.1", "react-popper": "^2.3.0", "typescript": "~5.2.2" @@ -3618,9 +3620,9 @@ "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" }, "node_modules/@types/node": { - "version": "20.11.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.0.tgz", - "integrity": "sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==", + "version": "20.11.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.7.tgz", + "integrity": "sha512-GPmeN1C3XAyV5uybAf4cMLWT9fDWcmQhZVtMFu7OR32WjrqGG+Wnk2V1d0bmtUyE/Zy1QJ9BxyiTih9z8Oks8A==", "dependencies": { "undici-types": "~5.26.4" } @@ -5545,6 +5547,15 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, "node_modules/debounce": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", @@ -6431,6 +6442,39 @@ "node": ">=0.4.0" } }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/fetch-meta-tags": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fetch-meta-tags/-/fetch-meta-tags-1.0.12.tgz", + "integrity": "sha512-KG2RzlZVSGQsEC6xT3vNX05Dp1NXxyXICGJm38lGHp7kbey9qLWhChQOAJNOhoKYpKLIHs3QsXyPm9dAfSKIwA==", + "dev": true, + "dependencies": { + "node-fetch": "^3.0.0", + "node-html-parser": "^5.0.0" + } + }, "node_modules/file-loader": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", @@ -6737,6 +6781,18 @@ "node": ">=0.4.x" } }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -10704,6 +10760,25 @@ "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", "dev": true }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, "node_modules/node-emoji": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", @@ -10718,6 +10793,24 @@ "node": ">=18" } }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -10726,6 +10819,84 @@ "node": ">= 6.13.0" } }, + "node_modules/node-html-parser": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-5.4.2.tgz", + "integrity": "sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==", + "dev": true, + "dependencies": { + "css-select": "^4.2.1", + "he": "1.2.0" + } + }, + "node_modules/node-html-parser/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/node-html-parser/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/node-html-parser/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/node-html-parser/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/node-html-parser/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/node-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", @@ -14721,6 +14892,15 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/web-streams-polyfill": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.2.tgz", + "integrity": "sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/webpack": { "version": "5.89.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", diff --git a/package.json b/package.json index 38e159077..14c03c7ed 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,8 @@ "@docusaurus/tsconfig": "3.1.0", "@docusaurus/types": "3.1.0", "@popperjs/core": "^2.11.8", + "@types/node": "^20.11.7", + "fetch-meta-tags": "^1.0.12", "react-markdown": "^9.0.1", "react-popper": "^2.3.0", "typescript": "~5.2.2" diff --git a/src/data/get_ogp_url.ts b/src/data/get_ogp_url.ts new file mode 100644 index 000000000..b562d7102 --- /dev/null +++ b/src/data/get_ogp_url.ts @@ -0,0 +1,44 @@ +import fetchMeta from "fetch-meta-tags"; +import process from "node:process"; + +import type { UserInfo } from "./user.d.ts"; +import { users } from "./users"; + +async function updateInfo(info: UserInfo) { + if (info.preview) { + return; + } + const meta = await fetchMeta(info.url); + console.error(meta); + if (meta.image) { + info.preview = meta.image; + } + if (!info.description && meta.description) { + info.description = meta.description; + } +} + +async function main() { + for (let i = 0; i < users.length; ++i) { + const user = users[i]; + try { + await updateInfo(user.ja); + } catch (err) { + console.error(user.ja.url, err); + } + + try { + await updateInfo(user.en); + } catch (err) { + console.error(user.en.url, err); + } + } +} + +main().then(() => { + process.stdout.write(`import type { User } from "./user.d.ts"; + +// Add sites to this list +// prettier-ignore +export const users: User[] = ${JSON.stringify(users, null, 2)};\n`); +}); diff --git a/src/data/tag.d.ts b/src/data/tag.d.ts new file mode 100644 index 000000000..ee5dc243f --- /dev/null +++ b/src/data/tag.d.ts @@ -0,0 +1,22 @@ +export type Tag = + | "CharacterPlatform" + | "VrmAnimation" + | "CharacterCreation" + | "ImporterExporter" + | "Streaming" + | "MotionCapture" + | "Animation" + | "Photography" + | "Metaverse" + | "Game" + | "WebBrowser" + | "Viewer" + | "UsingInternally" + | "Other"; + +export type TagInfo = { + tag: Tag; + ja: string; + en: string; + color: string; +}; diff --git a/src/data/tags.ts b/src/data/tags.ts new file mode 100644 index 000000000..3060f100a --- /dev/null +++ b/src/data/tags.ts @@ -0,0 +1,56 @@ +import type { Tag, TagInfo } from "./tag.d.ts"; + +export const tags: TagInfo[] = [ + // service...blue + { + tag: "CharacterPlatform", + ja: "3Dキャラクターのプラットフォーム", + en: "Platform for 3D models", + color: "#2f62fc", + }, + { tag: "Metaverse", ja: "メタバース", en: "Metaverse", color: "#4267b2" }, + { + tag: "UsingInternally", + ja: "内部でVRMを使っている", + en: "Using VRM internally", + color: "#42b2a3", + }, + // character make / devlopment...green + { + tag: "CharacterCreation", + ja: "キャラメイクツール", + en: "Character maker", + color: "#127f82", + }, + { tag: "ImporterExporter", ja: "プラグイン", en: "Plugin", color: "#21731b" }, + // animation / capture / streaming...red + { tag: "Game", ja: "ゲーム", en: "Game", color: "#f34545" }, + { + tag: "Streaming", + ja: "配信ツール", + en: "Live streaming tool", + color: "#801cea", + }, + { tag: "Photography", ja: "撮影", en: "Photography", color: "#73df45" }, + { + tag: "MotionCapture", + ja: "モーションキャプチャー", + en: "MotionCapture", + color: "#ffb300", + }, + { tag: "Animation", ja: "アニメーション", en: "Animation", color: "#fe6829" }, + { + tag: "WebBrowser", + ja: "ウェブブラウザー", + en: "WebBrowser", + color: "#ffcfc3", + }, + { tag: "Viewer", ja: "ビューワー", en: "Viewer", color: "#ed62ff" }, + // { + // tag: "VrmAnimation", + // ja: "Vrmアニメーション", + // en: "VrmAnimation", + // color: "#8c2f00", + // }, + { tag: "Other", ja: "その他", en: "Other", color: "#6b6b6b" }, +]; diff --git a/src/data/tags.tsx b/src/data/tags.tsx deleted file mode 100644 index 04d1844f2..000000000 --- a/src/data/tags.tsx +++ /dev/null @@ -1,92 +0,0 @@ -export type TagType = - | 'CharacterPlatform' - | 'CharacterCreation' - | 'ImporterExporter' - | 'Streaming' - | 'MotionCapture' - | 'Animation' - | 'Photography' - | 'Metaverse' - | 'Game' - | 'WebBrowser' - | 'Viewer' - | 'UsingInternally' - | 'Other' - ; - - -export type Tag = { - ja: string, - en: string, - color: string; -}; - -export const Tags: { [type in TagType]: Tag } = { - 'CharacterPlatform': { - ja: '3Dキャラクターのプラットフォーム', - en: 'Platform for 3D models', - color: '#e9669e', - }, - 'CharacterCreation': { - ja: 'キャラメイクツール', - en: 'Character maker', - color: '#dfd545', - }, - 'ImporterExporter': { - ja: 'プラグイン', - en: 'Plugin', - color: '#39ca30', - }, - 'Streaming': { - ja: '配信ツール', - en: 'Live streaming tool', - color: '#a44fb7', - }, - 'MotionCapture': { - ja: 'モーションキャプチャー', - en: 'MotionCapture', - color: '#127f82', - }, - 'Animation': { - ja: 'アニメーション', - en: 'Animation', - color: '#fe6829', - }, - 'Photography': { - ja: '撮影', - en: 'Photography', - color: '#8c2f00', - }, - 'Metaverse': { - ja: 'メタバース', - en: 'Metaverse', - color: '#4267b2', - }, - 'Game': { - ja: 'ゲーム', - en: 'Game', - color: '#1de9ad', - }, - 'WebBrowser': { - ja: 'ウェブブラウザー', - en: 'WebBrowser', - color: '#ffcfc3', - }, - 'Viewer': { - ja: 'ビューワー', - en: 'Viewer', - color: '#ed62ff', - }, - 'UsingInternally': { - ja: '内部でVRMを使っている', - en: 'Using VRM internally', - color: '#f34545', - }, - 'Other': { - ja: 'その他', - en: 'Other', - color: '#6b6b6b', - }, -}; - -export const TagList = Object.keys(Tags) as TagType[]; diff --git a/src/data/user.d.ts b/src/data/user.d.ts new file mode 100644 index 000000000..20571b19c --- /dev/null +++ b/src/data/user.d.ts @@ -0,0 +1,17 @@ +import type { Tag } from "./tag.d.ts"; + +export type UserInfo = { + title: string; + url: string; + description?: string; + // ogp image url + preview?: string; +}; + +export type User = { + tag: Tag; + ja: UserInfo; + en?: UserInfo; + // `1.0 support` or `1.0 only` or `0.x only` else ? + vrm?: string; +}; diff --git a/src/data/users.ts b/src/data/users.ts new file mode 100644 index 000000000..19059f19f --- /dev/null +++ b/src/data/users.ts @@ -0,0 +1,2280 @@ +import type { User } from "./user.d.ts"; + +// Add sites to this list +// prettier-ignore +export const users: User[] = [ + { + "tag": "CharacterPlatform", + "ja": { + "title": "ザ・シードオンライン", + "url": "https://virtualcast.jp/store/", + "description": "`1.0` アップロード可。3D viewer は `1.0` 未対応", + "preview": "https://virtualcast.jp/img/common/logo/virtual_cast_570_270_white.png" + }, + "en": { + "title": "The Seed Online", + "url": "https://virtualcast.jp/store/", + "description": "`1.0` can be uploaded. 3D viewer does not support `1.0`", + "preview": "https://virtualcast.jp/img/common/logo/virtual_cast_570_270_white.png" + }, + "vrm": "1.0" + }, + { + "tag": "CharacterPlatform", + "ja": { + "title": "ニコニ立体", + "url": "https://3d.nicovideo.jp/", + "preview": "https://3d.nicovideo.jp/images/ogp.png", + "description": "3D投稿サービス「ニコニ立体」" + }, + "en": { + "title": "Niconi Solid", + "url": "https://3d.nicovideo.jp/", + "preview": "https://3d.nicovideo.jp/images/ogp.png", + "description": "3D投稿サービス「ニコニ立体」" + } + }, + { + "tag": "CharacterPlatform", + "ja": { + "title": "VRoid Hub", + "url": "https://hub.vroid.com/", + "preview": "https://hub.vroid.com/public/images/ogp/default_ja.png", + "description": "VRoid Hubは、3Dキャラクターのための投稿・共有プラットフォームです。モデルデータをアップロードするだけでキャラクターが活き活きとアニメーションするプロフィールページを作成でき、利用条件と共にモデルデータを配布することもできます。登録した3Dモデルは、VRoid Hubと連携した各種VR/ARプラットフォームや3Dコンテンツ上で利用可能です" + }, + "en": { + "title": "VRoid Hub", + "url": "https://hub.vroid.com/en/", + "preview": "https://hub.vroid.com/public/images/ogp/default_en.png", + "description": "VRoid Hub is a platform where users can post their 3D characters and share them with other users. With VRoid Hub, users can post their own 3D models to make their characters come alive thanks to a vast range of animations available on the character's profile page, and distribute model data to other users by setting specific usage conditions. In addition, 3D characters posted on VRoid Hub can also be used as avatars on various VR/AR platforms and 3D contents via VRoid Hub linkage. " + }, + "vrm": "1.0" + }, + { + "tag": "CharacterPlatform", + "ja": { + "title": "DMM VR CONNECT", + "url": "https://connect.vrlab.dmm.com/" + }, + "en": { + "title": "DMM VR CONNECT", + "url": "https://connect.vrlab.dmm.com/" + } + }, + { + "tag": "CharacterPlatform", + "ja": { + "title": "CryptoAvatars", + "url": "https://cryptoavatars.io/home", + "description": "アバターの所有権と相互運用性を可能にするブロックチェーンプロトコル", + "preview": "https://storage.cryptoavatars.io/vipe-web/vipe_banner.webp" + }, + "en": { + "title": "CryptoAvatars", + "url": "https://cryptoavatars.io/home", + "description": "Blockchain protocol that enables ownership and interoperability of avatars", + "preview": "https://storage.cryptoavatars.io/vipe-web/vipe_banner.webp" + } + }, + { + "tag": "CharacterPlatform", + "ja": { + "title": "VIPE - Virtual Persona", + "url": "https://vipe.io", + "description": "アーティストのためのオールインワンアバタープラットフォーム、マーケットプレイス、およびハブ", + "preview": "https://storage.cryptoavatars.io/vipe-web/vipe_banner.webp" + }, + "en": { + "title": "VIPE - Virtual Persona", + "url": "https://vipe.io", + "description": "All-in-One avatar platform, marketplace and hub for artists", + "preview": "https://storage.cryptoavatars.io/vipe-web/vipe_banner.webp" + } + }, + { + "tag": "ImporterExporter", + "ja": { + "title": "UniVRM", + "url": "https://github.com/vrm-c/UniVRM/releases", + "description": "Unityエディタ拡張, Unityライブラリ。 `1.0` 版は `0.x` と両方がロードできます", + "preview": "https://opengraph.githubassets.com/23b46f1ccc13b6834ec5370809e05918d9bf45aa53e0a6fe49fce61bf0384d89/vrm-c/UniVRM" + }, + "en": { + "title": "UniVRM", + "url": "https://github.com/vrm-c/UniVRM/releases", + "description": "Unity editor extension, Unity library. `1.0` version can also load `0.x`", + "preview": "https://opengraph.githubassets.com/23b46f1ccc13b6834ec5370809e05918d9bf45aa53e0a6fe49fce61bf0384d89/vrm-c/UniVRM" + }, + "vrm": "1.0" + }, + { + "tag": "ImporterExporter", + "ja": { + "title": "@pixiv/three-vrm", + "url": "https://github.com/pixiv/three-vrm/", + "description": "Three.js用ライブラリ。従来のVRMとVRM 1.0の双方がロードできます", + "preview": "https://repository-images.githubusercontent.com/190160360/9aa13e00-d54c-11e9-9ba3-c9878cf9d28a" + }, + "en": { + "title": "@pixiv/three-vrm", + "url": "https://github.com/pixiv/three-vrm/", + "description": "A library for Three.js. Can load both past VRM and VRM 1.0", + "preview": "https://repository-images.githubusercontent.com/190160360/9aa13e00-d54c-11e9-9ba3-c9878cf9d28a" + }, + "vrm": "1.0" + }, + { + "tag": "ImporterExporter", + "ja": { + "title": "VRM Add-on for Blender", + "url": "https://vrm-addon-for-blender.info/ja", + "description": "Blenderアドオン", + "preview": "https://vrm-addon-for-blender.info/ja/top.ja.png" + }, + "en": { + "title": "VRM Add-on for Blender", + "url": "https://vrm-addon-for-blender.info/en", + "description": "Blender add-on", + "preview": "https://vrm-addon-for-blender.info/en/top.en.png" + } + }, + { + "tag": "ImporterExporter", + "ja": { + "title": "VRM4U", + "url": "https://github.com/ruyo/VRM4U", + "description": "UnrealEngineプラグイン", + "preview": "https://opengraph.githubassets.com/d6bb2b340086c1337e376a6ccc1c9eb6edb454a50c2d24da1ee84ffacb5fbc69/ruyo/VRM4U" + }, + "en": { + "title": "VRM4U", + "url": "https://github.com/ruyo/VRM4U", + "description": "UnrealEngine plug-in", + "preview": "https://opengraph.githubassets.com/d6bb2b340086c1337e376a6ccc1c9eb6edb454a50c2d24da1ee84ffacb5fbc69/ruyo/VRM4U" + } + }, + { + "tag": "ImporterExporter", + "ja": { + "title": "godot-vrm", + "url": "https://github.com/V-Sekai/godot-vrm", + "description": "Godotアドオン", + "preview": "https://opengraph.githubassets.com/25cd42e306a38e8421013987bbc85e974bf8ec7c5f9f551cebf9e59cc2b91ea5/V-Sekai/godot-vrm" + }, + "en": { + "title": "godot-vrm", + "url": "https://github.com/V-Sekai/godot-vrm", + "description": "VRM addon for Godot", + "preview": "https://opengraph.githubassets.com/25cd42e306a38e8421013987bbc85e974bf8ec7c5f9f551cebf9e59cc2b91ea5/V-Sekai/godot-vrm" + } + }, + { + "tag": "ImporterExporter", + "ja": { + "title": "glTF-Maya-Exporter", + "url": "https://github.com/kashikacojp/glTF-Maya-Exporter", + "description": "Mayaスクリプト", + "preview": "https://opengraph.githubassets.com/42a00874ffb0255981e8e0f85484f6cbff0332a52d776aced5c220392564bb98/kashikacojp/glTF-Maya-Exporter" + }, + "en": { + "title": "glTF-Maya-Exporter", + "url": "https://github.com/kashikacojp/glTF-Maya-Exporter", + "description": "Maya script", + "preview": "https://opengraph.githubassets.com/42a00874ffb0255981e8e0f85484f6cbff0332a52d776aced5c220392564bb98/kashikacojp/glTF-Maya-Exporter" + } + }, + { + "tag": "ImporterExporter", + "ja": { + "title": "VRM Converter for VRChat", + "url": "https://pokemori.booth.pm/items/1025226", + "description": "Unityエディタ拡張", + "preview": "https://booth.pximg.net/c/620x620/ba01b0da-9d0b-4dd8-a9ad-3f35270de1c8/i/1025226/c639ada2-329a-4f94-9545-9d3eb2ace96e_base_resized.jpg" + }, + "en": { + "title": "VRM Converter for VRChat", + "url": "https://www.v-market.work/ec/items/122/detail/", + "description": "Unity editor extension", + "preview": "https://vket-store-production.s3.ap-northeast-1.amazonaws.com/uploads/avatar_image/image_url/2723/medium_1282534c-ddd7-4941-af78-6c6e57f8b06a.png?X-Amz-Expires=600&X-Amz-Date=20240126T105044Z&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEOf%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaDmFwLW5vcnRoZWFzdC0xIkgwRgIhAKiOfVGV4LvpurjSITQT%2B7YWweoyguKXzUYxwSMmfHLrAiEA7V5PWUF5WadrWNVeBbs0pTJ%2BR8rUkgOOJ54b7%2F93p6UqgQQIof%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARABGgwzNTAwOTU4ODQ2MTIiDFaV6KBY8mK1re2lqSrVA%2FQpsAyj%2Bg8CsqS53GgMSvTlAgjVwiflI%2BRgTprberNb8mmrfem%2B7%2Bxzjqq4f85aK567fvI29YvTQolTqxnG9taIx4kk5QggYoWr%2BTeQTQiyAiJ2fT6A86wkj65pcsf83kQlHjh0VB%2B8dCqdo06Ub0KVNipreE9lrmslxFqaRtpKpTq5R8FO5zQnAW%2BJ5gEYIwMknZKDGCHc%2BqM%2Fy%2B%2FnAduEb5FqWlURrsPx%2FhJeLL9juGLmp2C7pf%2BDK6M%2FyZ0scgIgu1u7k4L0zz%2BoXvWImXOS6jR5W%2BE%2FBs6mQvbms51%2BwChbFWtXgZQvar9Fv83Zy26%2FCL%2BvnPUK6fhi0CX6BRsLK4L6a742X%2BLB7TlkEk0kjaFaXmZVLgEOwblCp8HQW0S3F9B6pfPIg2RPh4o89CbmRJ80TXwj3YcxhQUSV3OsPOdb1mLsBpjHpsDCKKQrVGXrspUbDmrDfk3L8cLqMhjY4OhhgQg75Zo5%2F1IzbREffAFlcNPX9YYktzJvKIWCI8V2O%2BclPmlZIVGh1hML4l516I2aVC2K3s3tA3PWcP%2FAaRWz6Jl80l5HR0N6rszMbh8uS0eohgjQAX0olZtJjTDQeRVC%2B8ZqM2v5uzYbTLkD5dqS5esw97vNrQY6pAFAngYCYdtKLBF2oztudpQPtcivTDa2MJj%2BsbKGSsxDsCJnzRt2WdQayUKMx1FEtuZoZ32iy8VUZ6DGpUtCRgzZZrY7xSrnMLu15y0Nd1M85n%2BD6k3SZjnTkYrN7PZg81cA3X4zN2gtQbVebcUO%2FAgc7lZa6Qv1USPsKPlwbM%2F87GaJHjmnVotoa9iwjHKY0Dvx7iwAuNc7Y9EfYUGRTqrAjUuYpA%3D%3D&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAVDA2XIFCI7KE2W6N%2F20240126%2Fap-northeast-1%2Fs3%2Faws4_request&X-Amz-SignedHeaders=host&X-Amz-Signature=d2545cba809278232bf5d93328a453821b98b2b04110466c88b2500f466762c7" + } + }, + { + "tag": "ImporterExporter", + "ja": { + "title": "UniVRMExtensions", + "url": "https://pokemori.booth.pm/items/1788660", + "description": "Unityエディタ拡張", + "preview": "https://booth.pximg.net/c/620x620/ba01b0da-9d0b-4dd8-a9ad-3f35270de1c8/i/1788660/0e58aab0-1709-48c0-8a45-7b8fc2ef1500_base_resized.jpg" + }, + "en": { + "title": "UniVRMExtensions", + "url": "https://www.v-market.work/ec/items/1066/detail/", + "description": "Unity editor extension", + "preview": "https://vket-store-production.s3.ap-northeast-1.amazonaws.com/uploads/avatar_image/image_url/14776/medium_ff9ebbed-bb71-421d-ab16-46523750961c0b0760535c9ce40fdff3d104468066b9.png?X-Amz-Expires=600&X-Amz-Date=20240126T105045Z&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEOf%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaDmFwLW5vcnRoZWFzdC0xIkgwRgIhAKiOfVGV4LvpurjSITQT%2B7YWweoyguKXzUYxwSMmfHLrAiEA7V5PWUF5WadrWNVeBbs0pTJ%2BR8rUkgOOJ54b7%2F93p6UqgQQIof%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARABGgwzNTAwOTU4ODQ2MTIiDFaV6KBY8mK1re2lqSrVA%2FQpsAyj%2Bg8CsqS53GgMSvTlAgjVwiflI%2BRgTprberNb8mmrfem%2B7%2Bxzjqq4f85aK567fvI29YvTQolTqxnG9taIx4kk5QggYoWr%2BTeQTQiyAiJ2fT6A86wkj65pcsf83kQlHjh0VB%2B8dCqdo06Ub0KVNipreE9lrmslxFqaRtpKpTq5R8FO5zQnAW%2BJ5gEYIwMknZKDGCHc%2BqM%2Fy%2B%2FnAduEb5FqWlURrsPx%2FhJeLL9juGLmp2C7pf%2BDK6M%2FyZ0scgIgu1u7k4L0zz%2BoXvWImXOS6jR5W%2BE%2FBs6mQvbms51%2BwChbFWtXgZQvar9Fv83Zy26%2FCL%2BvnPUK6fhi0CX6BRsLK4L6a742X%2BLB7TlkEk0kjaFaXmZVLgEOwblCp8HQW0S3F9B6pfPIg2RPh4o89CbmRJ80TXwj3YcxhQUSV3OsPOdb1mLsBpjHpsDCKKQrVGXrspUbDmrDfk3L8cLqMhjY4OhhgQg75Zo5%2F1IzbREffAFlcNPX9YYktzJvKIWCI8V2O%2BclPmlZIVGh1hML4l516I2aVC2K3s3tA3PWcP%2FAaRWz6Jl80l5HR0N6rszMbh8uS0eohgjQAX0olZtJjTDQeRVC%2B8ZqM2v5uzYbTLkD5dqS5esw97vNrQY6pAFAngYCYdtKLBF2oztudpQPtcivTDa2MJj%2BsbKGSsxDsCJnzRt2WdQayUKMx1FEtuZoZ32iy8VUZ6DGpUtCRgzZZrY7xSrnMLu15y0Nd1M85n%2BD6k3SZjnTkYrN7PZg81cA3X4zN2gtQbVebcUO%2FAgc7lZa6Qv1USPsKPlwbM%2F87GaJHjmnVotoa9iwjHKY0Dvx7iwAuNc7Y9EfYUGRTqrAjUuYpA%3D%3D&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAVDA2XIFCI7KE2W6N%2F20240126%2Fap-northeast-1%2Fs3%2Faws4_request&X-Amz-SignedHeaders=host&X-Amz-Signature=d94b6f8359b4bea00b31f9921910822a6dcb6abe3d5e4aad711fb8052b4c6215" + } + }, + { + "tag": "CharacterCreation", + "ja": { + "title": "VRoid Studio", + "url": "https://vroid.com/studio/", + "description": "Windows, macOS", + "preview": "https://vroid.com/_next/static/images/vroid-studio-ogp-jp-14b96bb956ed763f749259a0312079a1.png" + }, + "en": { + "title": "VRoid Studio", + "url": "https://vroid.com/en/studio/", + "description": "Windows, macOS", + "preview": "https://vroid.com/_next/static/images/vroid-studio-ogp-en-ee999ec19debf7f483027e7d3c963be5.png" + } + }, + { + "tag": "CharacterCreation", + "ja": { + "title": "VRoid Mobile", + "url": "https://vroid.com/mobile/", + "description": "iOS, Android", + "preview": "https://vroid.com/_next/static/images/ogp-mobile-e2f35d7d439e8f596f67497cb0e92dd0.png" + }, + "en": { + "title": "VRoid Mobile", + "url": "https://vroid.com/en/mobile/", + "description": "iOS, Android", + "preview": "https://vroid.com/_next/static/images/ogp-mobile_en-ed40679b3c1a4b28833d140172193451.png" + } + }, + { + "tag": "CharacterCreation", + "ja": { + "title": "セシル変身アプリ", + "url": "https://fantia.jp/fanclubs/10552", + "description": "Windows, macOS", + "preview": "https://c.fantia.jp/uploads/fanclub/ogp_image/10552/fanclub_378fed8d-7f9e-435d-8b42-d6215a6dd282.jpg" + }, + "en": { + "title": "CecilHenShin", + "url": "https://fantia.jp/fanclubs/10552", + "description": "Windows, macOS", + "preview": "https://c.fantia.jp/uploads/fanclub/ogp_image/10552/fanclub_378fed8d-7f9e-435d-8b42-d6215a6dd282.jpg" + } + }, + { + "tag": "Streaming", + "ja": { + "title": "VDRAW", + "url": "https://sites.google.com/view/vdraw/", + "description": "Windows", + "preview": "https://lh5.googleusercontent.com/2HiytY5iIpMJSr7G-Aeb_TTyf9E6_pz-nT2k5gQW9DPIoxHQ3-_ot0KuXUEEumk8qnOalpgavR-mK5pb0wVWRBl5UfvErth5pHoXLreRupHlWb8B=w1280" + }, + "en": { + "title": "VDRAW", + "url": "https://sites.google.com/view/vdraw/", + "description": "Windows ", + "preview": "https://lh5.googleusercontent.com/2HiytY5iIpMJSr7G-Aeb_TTyf9E6_pz-nT2k5gQW9DPIoxHQ3-_ot0KuXUEEumk8qnOalpgavR-mK5pb0wVWRBl5UfvErth5pHoXLreRupHlWb8B=w1280" + } + }, + { + "tag": "Streaming", + "ja": { + "title": "SHOWROOM V", + "url": "https://campaign.showroom-live.com/showroom-v/", + "description": "iOS", + "preview": "https://campaign.showroom-live.com/showroom-v/image/ogp/OGP_v3.png" + }, + "en": { + "title": "SHOWROOM V", + "url": "https://campaign.showroom-live.com/showroom-v/", + "description": "iOS ", + "preview": "https://campaign.showroom-live.com/showroom-v/image/ogp/OGP_v3.png" + } + }, + { + "tag": "Streaming", + "ja": { + "title": "Hitogata", + "url": "https://sites.google.com/site/vhitogata/", + "description": "Windows", + "preview": "https://lh5.googleusercontent.com/0xYwhzxl1v3PCq6RwCzfpmKEHWBUUEFJXxkxooGWH6BxlYpAfyeKyoXWomkZg_CNlDRfzcpNqHElhxe1qJ0sxdlNwtU1wrw7t07fAWnDZb4tb31M6AVPxtJ2uV7Xn0j28Q=w1280" + }, + "en": { + "title": "Hitogata", + "url": "https://sites.google.com/site/vhitogata/", + "description": "Windows ", + "preview": "https://lh5.googleusercontent.com/0xYwhzxl1v3PCq6RwCzfpmKEHWBUUEFJXxkxooGWH6BxlYpAfyeKyoXWomkZg_CNlDRfzcpNqHElhxe1qJ0sxdlNwtU1wrw7t07fAWnDZb4tb31M6AVPxtJ2uV7Xn0j28Q=w1280" + } + }, + { + "tag": "Streaming", + "ja": { + "title": "3tene", + "url": "https://3tene.com/", + "description": "Windows, macOS" + }, + "en": { + "title": "3tene", + "url": "https://3tene.com/", + "description": "Windows, macOS" + } + }, + { + "tag": "Streaming", + "ja": { + "title": "Wakaru", + "url": "https://store.steampowered.com/app/870820/Wakaru_ver_beta/", + "description": "Windows", + "preview": "https://cdn.akamai.steamstatic.com/steam/apps/870820/capsule_616x353.jpg?t=1697542068" + }, + "en": { + "title": "Wakaru", + "url": "https://store.steampowered.com/app/870820/Wakaru_ver_beta/", + "description": "Windows ", + "preview": "https://cdn.akamai.steamstatic.com/steam/apps/870820/capsule_616x353.jpg?t=1697542068" + } + }, + { + "tag": "Streaming", + "ja": { + "title": "バーチャルモーションキャプチャー", + "url": "https://sh-akira.github.io/VirtualMotionCapture/", + "description": "Windows VR", + "preview": "https://rawcdn.githack.com/sh-akira/VirtualMotionCapture/master/docs/images/ss2.jpg" + }, + "en": { + "title": "VirtualMotionCapture", + "url": "https://sh-akira.github.io/VirtualMotionCapture/", + "description": "Windows VR", + "preview": "https://rawcdn.githack.com/sh-akira/VirtualMotionCapture/master/docs/images/ss2.jpg" + } + }, + { + "tag": "Streaming", + "ja": { + "title": "FaceVTuber", + "url": "https://facevtuber.com/", + "description": "Google Chrome" + }, + "en": { + "title": "FaceVTuber", + "url": "https://facevtuber.com/", + "description": "Google Chrome" + } + }, + { + "tag": "Streaming", + "ja": { + "title": "LiveAvatar", + "url": "https://github.com/m2wasabi/LiveAvatar", + "description": "HTC VIVE", + "preview": "https://opengraph.githubassets.com/104e2eb3b69c9cd532a8fc8af1c785ac608d36faa5c90978ab3819d7fc38492b/m2wasabi/LiveAvatar" + }, + "en": { + "title": "LiveAvatar", + "url": "https://github.com/m2wasabi/LiveAvatar", + "description": "HTC VIVE", + "preview": "https://opengraph.githubassets.com/104e2eb3b69c9cd532a8fc8af1c785ac608d36faa5c90978ab3819d7fc38492b/m2wasabi/LiveAvatar" + } + }, + { + "tag": "Streaming", + "ja": { + "title": "Luppet", + "url": "https://luppet.appspot.com/", + "description": "Windows + optional hand tracking", + "preview": "https://luppet.jp/images/ogp.jpg" + }, + "en": { + "title": "Luppet", + "url": "https://luppet.appspot.com/", + "description": "Windows + optional hand tracking", + "preview": "https://luppet.jp/images/ogp.jpg" + } + }, + { + "tag": "Streaming", + "ja": { + "title": "vear", + "url": "https://apps.apple.com/jp/app/vear/id1490697369", + "description": "iOS", + "preview": "https://is1-ssl.mzstatic.com/image/thumb/Purple126/v4/d6/a6/ff/d6a6ff2a-8f15-c14b-77a2-c7cff32b5743/AppIcon-1x_U007emarketing-0-7-0-85-220.png/1200x630wa.png" + }, + "en": { + "title": "vear", + "url": "https://apps.apple.com/jp/app/vear/id1490697369", + "description": "iOS ", + "preview": "https://is1-ssl.mzstatic.com/image/thumb/Purple126/v4/d6/a6/ff/d6a6ff2a-8f15-c14b-77a2-c7cff32b5743/AppIcon-1x_U007emarketing-0-7-0-85-220.png/1200x630wa.png" + } + }, + { + "tag": "Streaming", + "ja": { + "title": "CharWebCam", + "url": "https://github.com/xelloss120/CharWebCam", + "description": "Windows", + "preview": "https://opengraph.githubassets.com/12c0df0cc5fd2061b32835d299468711d99d08e02d79e56d374510194416a343/xelloss120/CharWebCam" + }, + "en": { + "title": "CharWebCam", + "url": "https://github.com/xelloss120/CharWebCam", + "description": "Windows ", + "preview": "https://opengraph.githubassets.com/12c0df0cc5fd2061b32835d299468711d99d08e02d79e56d374510194416a343/xelloss120/CharWebCam" + } + }, + { + "tag": "Streaming", + "ja": { + "title": "VMagicMirror", + "url": "https://malaybaku.github.io/VMagicMirror/", + "description": "Windows", + "preview": "https://malaybaku.github.io/VMagicMirror/images/home/gallery_00.png" + }, + "en": { + "title": "VMagicMirror", + "url": "https://malaybaku.github.io/VMagicMirror/en/", + "description": "Windows ", + "preview": "https://malaybaku.github.io/VMagicMirror/images/home/gallery_00.png" + } + }, + { + "tag": "Streaming", + "ja": { + "title": "2DR", + "url": "https://2dr.info/", + "description": "iOS, Android" + }, + "en": { + "title": "2DR", + "url": "https://2dr.info/", + "description": "iOS, Android" + } + }, + { + "tag": "Streaming", + "ja": { + "title": "VUP-VTuber", + "url": "https://store.steampowered.com/app/1207050/VUPVTuber_Maker_Animation_MMDLive2D__facial_capture/", + "description": "Windows 10", + "preview": "https://cdn.akamai.steamstatic.com/steam/apps/1207050/capsule_616x353.jpg?t=1687870739" + }, + "en": { + "title": "VUP-VTuber", + "url": "https://store.steampowered.com/app/1207050/", + "description": "Windows 10", + "preview": "https://cdn.akamai.steamstatic.com/steam/apps/1207050/capsule_616x353.jpg?t=1687870739" + } + }, + { + "tag": "Streaming", + "ja": { + "title": "ミチコンPlus", + "url": "https://www.next-system.com/michicon", + "description": "iOS", + "preview": "https://www.next-system.com/wp-content/uploads/2020/03/a11b4bb3ba448d1fa402ac3dc62cc91f-1.jpg" + }, + "en": { + "title": "Michicon Plus", + "url": "https://www.next-system.com/michicon", + "description": "iOS ", + "preview": "https://www.next-system.com/wp-content/uploads/2020/03/a11b4bb3ba448d1fa402ac3dc62cc91f-1.jpg" + } + }, + { + "tag": "Streaming", + "ja": { + "title": "VOVOLA", + "url": "https://vovola.wixsite.com/website", + "description": "Windows 10" + }, + "en": { + "title": "VOVOLA", + "url": "https://vovola.wixsite.com/website", + "description": "Windows 10" + } + }, + { + "tag": "Streaming", + "ja": { + "title": "VSeeFace", + "url": "https://www.vseeface.icu/", + "description": "Windows + optional hand tracking" + }, + "en": { + "title": "VSeeFace", + "url": "https://www.vseeface.icu/", + "description": "Windows + optional hand tracking" + } + }, + { + "tag": "Streaming", + "ja": { + "title": "ZZ3D", + "url": "https://halmin.wixsite.com/zz3d", + "description": "iOS", + "preview": "https://static.wixstatic.com/media/af3e55_94ed2e0a21e7433587a549663add2d00%7Emv2.png/v1/fit/w_2500,h_1330,al_c/af3e55_94ed2e0a21e7433587a549663add2d00%7Emv2.png" + }, + "en": { + "title": "ZZ3D", + "url": "https://halmin.wixsite.com/zz3d", + "description": "iOS ", + "preview": "https://static.wixstatic.com/media/af3e55_94ed2e0a21e7433587a549663add2d00%7Emv2.png/v1/fit/w_2500,h_1330,al_c/af3e55_94ed2e0a21e7433587a549663add2d00%7Emv2.png" + } + }, + { + "tag": "Streaming", + "ja": { + "title": "LIV", + "url": "https://liv.tv/", + "description": "Windows VR", + "preview": "https://cdn.liv.tv/images/og.jpg" + }, + "en": { + "title": "LIV", + "url": "https://liv.tv/", + "description": "Windows VR", + "preview": "https://cdn.liv.tv/images/og.jpg" + } + }, + { + "tag": "Streaming", + "ja": { + "title": "Animaze by FaceRig", + "url": "https://store.steampowered.com/app/1364390/Animaze_by_FaceRig/", + "description": "Windows", + "preview": "https://cdn.akamai.steamstatic.com/steam/apps/1364390/capsule_616x353.jpg?t=1693380615" + }, + "en": { + "title": "Animaze by FaceRig", + "url": "https://store.steampowered.com/app/1364390/Animaze_by_FaceRig/", + "description": "Windows", + "preview": "https://cdn.akamai.steamstatic.com/steam/apps/1364390/capsule_616x353.jpg?t=1693380615" + } + }, + { + "tag": "Streaming", + "ja": { + "title": "VTmini", + "url": "https://store.steampowered.com/app/1801480/VTmini/", + "description": "Windows", + "preview": "https://cdn.akamai.steamstatic.com/steam/apps/1801480/capsule_616x353.jpg?t=1669986072" + }, + "en": { + "title": "VTmini", + "url": "https://store.steampowered.com/app/1801480/VTmini/", + "description": "Windows ", + "preview": "https://cdn.akamai.steamstatic.com/steam/apps/1801480/capsule_616x353.jpg?t=1669986072" + } + }, + { + "tag": "Streaming", + "ja": { + "title": "JINS MEME VTUNER", + "url": "https://apps.apple.com/jp/app/jins-meme-vtuner/id1554040568", + "description": "iOS" + }, + "en": { + "title": "JINS MEME VTUNER", + "url": "https://apps.apple.com/jp/app/jins-meme-vtuner/id1554040568", + "description": "iOS " + } + }, + { + "tag": "Streaming", + "ja": { + "title": "RiBLA Broadcast", + "url": "https://ribla-laboratory.booth.pm/items/3642935", + "description": "Windows, macOS", + "preview": "https://booth.pximg.net/c/620x620/2f131cbf-fd91-4652-9134-5aab11313537/i/3642935/26de75c9-bc76-47d4-a454-40271e131bc1_base_resized.jpg" + }, + "en": { + "title": "RiBLA Broadcast", + "url": "https://ribla-laboratory.booth.pm/items/3642935", + "description": "Windows, macOS", + "preview": "https://booth.pximg.net/c/620x620/2f131cbf-fd91-4652-9134-5aab11313537/i/3642935/26de75c9-bc76-47d4-a454-40271e131bc1_base_resized.jpg" + } + }, + { + "tag": "Streaming", + "ja": { + "title": "Vフレット", + "url": "https://nkjzm.jp/vfret", + "description": "Windows, macOS", + "preview": "https://storage.googleapis.com/notionstyles.appspot.com/users/c5t1u22ZbeWOeVwhaW77FFaFvcE3/4aa80f2c-5b23-4922-bc23-5d684c004b0b.png" + }, + "en": { + "title": "vfret", + "url": "https://nkjzm.jp/vfret", + "description": "Windows, macOS", + "preview": "https://storage.googleapis.com/notionstyles.appspot.com/users/c5t1u22ZbeWOeVwhaW77FFaFvcE3/4aa80f2c-5b23-4922-bc23-5d684c004b0b.png" + } + }, + { + "tag": "Streaming", + "ja": { + "title": "Avatar.Webcam", + "url": "https://avatar.webcam", + "description": "Windows, macOS", + "preview": "https://static.wixstatic.com/media/ff33c7_d01533f0b5974914b06f54500d679523~mv2.jpg/v1/fill/w_1920,h_1080,al_c/ff33c7_d01533f0b5974914b06f54500d679523~mv2.jpg" + }, + "en": { + "title": "Avatar.Webcam", + "url": "https://avatar.webcam", + "description": "Windows, macOS", + "preview": "https://static.wixstatic.com/media/ff33c7_d01533f0b5974914b06f54500d679523~mv2.jpg/v1/fill/w_1920,h_1080,al_c/ff33c7_d01533f0b5974914b06f54500d679523~mv2.jpg" + } + }, + { + "tag": "MotionCapture", + "ja": { + "title": "TRACKING WORLD", + "url": "http://deatrathias.net/TW/", + "description": "Windows VR" + }, + "en": { + "title": "TRACKING WORLD", + "url": "http://deatrathias.net/TW/", + "description": "Windows VR" + } + }, + { + "tag": "MotionCapture", + "ja": { + "title": "waidayo", + "url": "https://booth.pm/ja/items/1779185", + "description": "PC, iOS", + "preview": "https://booth.pximg.net/c/620x620/5569a658-a303-491f-8f61-55f498e7e5fa/i/1779185/66bdd2a4-eb0d-4c9e-ad85-ec291dc330ee_base_resized.jpg" + }, + "en": { + "title": "waidayo", + "url": "https://booth.pm/ja/items/1779185", + "description": "PC, iOS", + "preview": "https://booth.pximg.net/c/620x620/5569a658-a303-491f-8f61-55f498e7e5fa/i/1779185/66bdd2a4-eb0d-4c9e-ad85-ec291dc330ee_base_resized.jpg" + } + }, + { + "tag": "MotionCapture", + "ja": { + "title": "ThreeDPoseTracker", + "url": "https://github.com/digital-standard/ThreeDPoseTracker", + "description": "Windows", + "preview": "https://opengraph.githubassets.com/c0e4ed0bd9879ff948b4225c2246980a9a34a011217bfc500d1d27c272389cc5/digital-standard/ThreeDPoseTracker" + }, + "en": { + "title": "ThreeDPoseTracker", + "url": "https://github.com/digital-standard/ThreeDPoseTracker", + "description": "Windows ", + "preview": "https://opengraph.githubassets.com/c0e4ed0bd9879ff948b4225c2246980a9a34a011217bfc500d1d27c272389cc5/digital-standard/ThreeDPoseTracker" + } + }, + { + "tag": "MotionCapture", + "ja": { + "title": "TDPT", + "url": "https://digital-standard.com/tdpt_lp/", + "description": "iOS", + "preview": "https://digital-standard.com/tdpt_lp/image/TDPT_Title.png" + }, + "en": { + "title": "TDPT", + "url": "https://digital-standard.com/tdpt_lp/", + "description": "iOS ", + "preview": "https://digital-standard.com/tdpt_lp/image/TDPT_Title.png" + } + }, + { + "tag": "MotionCapture", + "ja": { + "title": "EasyVirtualMotionCaptureForUnity", + "url": "https://booth.pm/ja/items/1801535", + "description": "Windows, Windows VR", + "preview": "https://booth.pximg.net/c/620x620/e6ccaa4b-cb5f-43ce-9aec-a0e825c83ea8/i/1801535/b5f129a7-55ee-42aa-8c44-61d5c9291638_base_resized.jpg" + }, + "en": { + "title": "EasyVirtualMotionCaptureForUnity", + "url": "https://booth.pm/ja/items/1801535", + "description": "Windows, Windows VR", + "preview": "https://booth.pximg.net/c/620x620/e6ccaa4b-cb5f-43ce-9aec-a0e825c83ea8/i/1801535/b5f129a7-55ee-42aa-8c44-61d5c9291638_base_resized.jpg" + } + }, + { + "tag": "MotionCapture", + "ja": { + "title": "Webcam Motion Capture", + "url": "https://webcammotioncapture.info/ja/index.php", + "description": "Windows, macOS", + "preview": "https://webcammotioncapture.info/390_ja.png" + }, + "en": { + "title": "Webcam Motion Capture", + "url": "https://webcammotioncapture.info/ja/index.php", + "description": "Windows, macOS", + "preview": "https://webcammotioncapture.info/390_ja.png" + } + }, + { + "tag": "MotionCapture", + "ja": { + "title": "iFacialMocap", + "url": "https://www.ifacialmocap.com/home/japanese/", + "description": "Windows, macOS, iOS", + "preview": "https://image.jimcdn.com/app/cms/image/transf/none/path/s478167c5170cc992/image/i56287ebf73cfafec/version/1578953166/image.gif" + }, + "en": { + "title": "iFacialMocap", + "url": "https://www.ifacialmocap.com/home/japanese/", + "description": "Windows, macOS, iOS", + "preview": "https://image.jimcdn.com/app/cms/image/transf/none/path/s478167c5170cc992/image/i56287ebf73cfafec/version/1578953166/image.gif" + } + }, + { + "tag": "MotionCapture", + "ja": { + "title": "FACEMOTION3D", + "url": "https://apps.apple.com/jp/app/facemotion3d/id1507538005", + "description": "iOS", + "preview": "https://is1-ssl.mzstatic.com/image/thumb/Purple116/v4/af/40/5f/af405f72-09ea-4573-18a3-3d2e7e9e77c7/AppIcon-0-0-1x_U007emarketing-0-7-0-sRGB-85-220.png/1200x630wa.png" + }, + "en": { + "title": "FACEMOTION3D", + "url": "https://apps.apple.com/jp/app/facemotion3d/id1507538005", + "description": "iOS ", + "preview": "https://is1-ssl.mzstatic.com/image/thumb/Purple116/v4/af/40/5f/af405f72-09ea-4573-18a3-3d2e7e9e77c7/AppIcon-0-0-1x_U007emarketing-0-7-0-sRGB-85-220.png/1200x630wa.png" + } + }, + { + "tag": "MotionCapture", + "ja": { + "title": "Kalidoface 3D", + "url": "https://github.com/yeemachine/kalidoface-3d", + "description": "Windows", + "preview": "https://opengraph.githubassets.com/b8b427ade92a3c30f2d4312a8e773cbf1755af1c7e6079afdd0c8474c6c55286/yeemachine/kalidoface-3d" + }, + "en": { + "title": "Kalidoface 3D", + "url": "https://github.com/yeemachine/kalidoface-3d", + "description": "Windows ", + "preview": "https://opengraph.githubassets.com/b8b427ade92a3c30f2d4312a8e773cbf1755af1c7e6079afdd0c8474c6c55286/yeemachine/kalidoface-3d" + } + }, + { + "tag": "MotionCapture", + "ja": { + "title": "VIRTU: Avatar Camera", + "url": "https://virtu.booth.pm/items/3684467", + "description": "PC, [iOS](https://apps.apple.com/app/virtu-avatar-camera/id1597220065)", + "preview": "https://booth.pximg.net/c/620x620/4dfc3db5-b971-402a-9ab0-da95f0a8ea80/i/3684467/6f8ac834-1539-4476-a52e-dce0cb62327f_base_resized.jpg" + }, + "en": { + "title": "VIRTU: Avatar Camera", + "url": "https://virtu.booth.pm/items/3684467", + "description": "PC, [iOS](https://apps.apple.com/app/virtu-avatar-camera/id1597220065)", + "preview": "https://booth.pximg.net/c/620x620/4dfc3db5-b971-402a-9ab0-da95f0a8ea80/i/3684467/6f8ac834-1539-4476-a52e-dce0cb62327f_base_resized.jpg" + } + }, + { + "tag": "MotionCapture", + "ja": { + "title": "VRigUnity", + "url": "https://github.com/Kariaro/VRigUnity", + "description": "Windows, macOS, Linux", + "preview": "https://opengraph.githubassets.com/8d529f1f2fd01b43baafefa25731cfd853bfda0e6124fb9159c054180630a981/Kariaro/VRigUnity" + }, + "en": { + "title": "VRigUnity", + "url": "https://github.com/Kariaro/VRigUnity", + "description": "Windows, macOS, Linux", + "preview": "https://opengraph.githubassets.com/8d529f1f2fd01b43baafefa25731cfd853bfda0e6124fb9159c054180630a981/Kariaro/VRigUnity" + } + }, + { + "tag": "Animation", + "ja": { + "title": "Ls ENGINE", + "url": "https://lsengine.net/", + "description": "Windows", + "preview": "https://lsengine.net/wp-content/themes/lionblog/img/img_no.gif" + }, + "en": { + "title": "Ls ENGINE", + "url": "https://lsengine.net/", + "description": "Windows ", + "preview": "https://lsengine.net/wp-content/themes/lionblog/img/img_no.gif" + } + }, + { + "tag": "Animation", + "ja": { + "title": "AI4Animation", + "url": "https://github.com/t-takasaka/AI4Animation/tree/master/AI4Animation/Assets/Demo/ARKit", + "description": "Unityライブラリ" + }, + "en": { + "title": "AI4Animation", + "url": "https://github.com/t-takasaka/AI4Animation/tree/master/AI4Animation/Assets/Demo/ARKit", + "description": "Unity library" + } + }, + { + "tag": "Animation", + "ja": { + "title": "Dance Dance Maker!", + "url": "https://booth.pm/ja/items/2216222", + "description": "Oculus Quest", + "preview": "https://booth.pximg.net/c/620x620/570549a5-5345-4e1d-8a77-d5d1179371be/i/2216222/2faa6e2f-9a9a-4f81-a5d5-672c1392f9be_base_resized.jpg" + }, + "en": { + "title": "Dance Dance Maker!", + "url": "https://booth.pm/ja/items/2216222", + "description": "Oculus Quest", + "preview": "https://booth.pximg.net/c/620x620/570549a5-5345-4e1d-8a77-d5d1179371be/i/2216222/2faa6e2f-9a9a-4f81-a5d5-672c1392f9be_base_resized.jpg" + } + }, + { + "tag": "Animation", + "ja": { + "title": "DanceDreamMV", + "url": "https://maruapps.com/dancedreammv/", + "description": "iOS, Android", + "preview": "https://tools.applemediaservices.com/api/badges/download-on-the-app-store/black/ja-jp?size=250x83&releaseDate=1610150400&h=6e6f3a33993bae4283e25f0a7d5de234" + }, + "en": { + "title": "DanceDreamMV", + "url": "https://maruapps.com/dancedreammv/", + "description": "iOS, Android", + "preview": "https://tools.applemediaservices.com/api/badges/download-on-the-app-store/black/ja-jp?size=250x83&releaseDate=1610150400&h=6e6f3a33993bae4283e25f0a7d5de234" + } + }, + { + "tag": "Animation", + "ja": { + "title": "Doll Dancer", + "url": "https://play.google.com/store/apps/details?id=com.personuo.dolldancer", + "description": "[iOS](https://apps.apple.com/jp/app/doll-dancer-mmd-vroid-amv-app/id1394822854?platform=iphone), Android", + "preview": "https://play-lh.googleusercontent.com/PmLAq-47mOHcj2AzTxciznePNEpkaToeDK7b0Ude7QZqyrLVZO3c0O9iR8zIVbn46sE" + }, + "en": { + "title": "Doll Dancer", + "url": "https://play.google.com/store/apps/details?id=com.personuo.dolldancer", + "description": "[iOS](https://apps.apple.com/jp/app/doll-dancer-mmd-vroid-amv-app/id1394822854?platform=iphone), Android", + "preview": "https://play-lh.googleusercontent.com/PmLAq-47mOHcj2AzTxciznePNEpkaToeDK7b0Ude7QZqyrLVZO3c0O9iR8zIVbn46sE" + } + }, + { + "tag": "Animation", + "ja": { + "title": "Dan Sing Sing MV Maker", + "url": "https://vtubershop.booth.pm/items/3366941", + "description": "Windows", + "preview": "https://booth.pximg.net/c/620x620/fa13e29a-76ec-4cee-9178-e5d7b94fc935/i/3366941/31c0d018-1593-4987-801f-b282bc08c4d5_base_resized.jpg" + }, + "en": { + "title": "Dan Sing Sing MV Maker", + "url": "https://vtubershop.booth.pm/items/3366941", + "description": "Windows ", + "preview": "https://booth.pximg.net/c/620x620/fa13e29a-76ec-4cee-9178-e5d7b94fc935/i/3366941/31c0d018-1593-4987-801f-b282bc08c4d5_base_resized.jpg" + } + }, + { + "tag": "Animation", + "ja": { + "title": "PlayAniMaker", + "url": "https://sites.google.com/view/playanimaker", + "description": "Windows VR, Oculus Quest", + "preview": "https://lh3.googleusercontent.com/JJL6RxVppw4CYUcUWwW2Ii0cNNzcoTg00B3v21n-Nzi0Opieb6wwAWcZzEriVN_JJ9dV-A=w16383" + }, + "en": { + "title": "PlayAniMaker", + "url": "https://sites.google.com/view/playanimaker", + "description": "Windows VR, Oculus Quest", + "preview": "https://lh3.googleusercontent.com/JJL6RxVppw4CYUcUWwW2Ii0cNNzcoTg00B3v21n-Nzi0Opieb6wwAWcZzEriVN_JJ9dV-A=w16383" + } + }, + { + "tag": "Photography", + "ja": { + "title": "VRMお人形遊びPC版", + "url": "https://120byte.booth.pm/items/1654585", + "description": "Windows", + "preview": "https://booth.pximg.net/c/620x620/6dd2a4de-9111-46cb-b1c2-14645f3c8515/i/1654585/0fb7f8ce-b074-4168-afa7-01ca957caada_base_resized.jpg" + }, + "en": { + "title": "VRM Doll Play (PC)", + "url": "https://120byte.booth.pm/items/1654585", + "description": "Windows ", + "preview": "https://booth.pximg.net/c/620x620/6dd2a4de-9111-46cb-b1c2-14645f3c8515/i/1654585/0fb7f8ce-b074-4168-afa7-01ca957caada_base_resized.jpg" + } + }, + { + "tag": "Photography", + "ja": { + "title": "VRMお人形遊び", + "url": "https://120byte.booth.pm/items/1099618", + "description": "Windows VR", + "preview": "https://booth.pximg.net/c/620x620/6dd2a4de-9111-46cb-b1c2-14645f3c8515/i/1099618/fae15b8b-85f5-4d99-aa5c-4bdb9a143ace_base_resized.jpg" + }, + "en": { + "title": "VRM Doll Play", + "url": "https://120byte.booth.pm/items/1099618", + "description": "Windows VR", + "preview": "https://booth.pximg.net/c/620x620/6dd2a4de-9111-46cb-b1c2-14645f3c8515/i/1099618/fae15b8b-85f5-4d99-aa5c-4bdb9a143ace_base_resized.jpg" + } + }, + { + "tag": "Photography", + "ja": { + "title": "Vタビ", + "url": "https://app.famitsu.com/gametitle/8356/", + "description": "Android, iOS", + "preview": "https://app.famitsu.com/wp-content/uploads/2019/02/icon-53.jpg" + }, + "en": { + "title": "Vtabi", + "url": "https://app.famitsu.com/gametitle/8356/", + "description": "Android, iOS", + "preview": "https://app.famitsu.com/wp-content/uploads/2019/02/icon-53.jpg" + } + }, + { + "tag": "Photography", + "ja": { + "title": "Vismuth", + "url": "https://vismuth.com/", + "description": "Android, iOS" + }, + "en": { + "title": "Vismuth", + "url": "https://vismuth.com/", + "description": "Android, iOS" + } + }, + { + "tag": "Photography", + "ja": { + "title": "Vスタンプ", + "url": "https://bnut.jp/vstamp", + "description": "Android, iOS", + "preview": "https://cdn.myportfolio.com/949f323d-3e97-4517-aa26-6e8939a9869a/77ae04c4-58e0-48d6-952a-906fbb7c3f61_rwc_0x0x512x512x512.png?h=e3127ea457ea53cfd260429d95ea8ca6" + }, + "en": { + "title": "vstamp", + "url": "https://bnut.jp/vstamp", + "description": "Android, iOS", + "preview": "https://cdn.myportfolio.com/949f323d-3e97-4517-aa26-6e8939a9869a/77ae04c4-58e0-48d6-952a-906fbb7c3f61_rwc_0x0x512x512x512.png?h=e3127ea457ea53cfd260429d95ea8ca6" + } + }, + { + "tag": "Photography", + "ja": { + "title": "VRM Automatic Photographing", + "url": "https://matsuvr.booth.pm/items/2223918", + "description": "Windows 10", + "preview": "https://booth.pximg.net/c/620x620/a449058b-d5f1-415c-9d05-388184ee905a/i/2223918/7ab7e585-3770-4244-9a1c-e142c4a2064f_base_resized.jpg" + }, + "en": { + "title": "VRM Automatic Photographing", + "url": "https://matsuvr.booth.pm/items/2223918", + "description": "Windows 10", + "preview": "https://booth.pximg.net/c/620x620/a449058b-d5f1-415c-9d05-388184ee905a/i/2223918/7ab7e585-3770-4244-9a1c-e142c4a2064f_base_resized.jpg" + } + }, + { + "tag": "Photography", + "ja": { + "title": "VRMCardMaker", + "url": "https://booth.pm/ja/items/1808860", + "description": "Windows", + "preview": "https://booth.pximg.net/c/620x620/55d0b3cd-8d44-43f0-8467-7e99fcc0d318/i/1808860/b11688b5-8d23-479d-bd90-a4dca2dce6dd_base_resized.jpg" + }, + "en": { + "title": "VRMCardMaker", + "url": "https://booth.pm/ja/items/1808860", + "description": "Windows ", + "preview": "https://booth.pximg.net/c/620x620/55d0b3cd-8d44-43f0-8467-7e99fcc0d318/i/1808860/b11688b5-8d23-479d-bd90-a4dca2dce6dd_base_resized.jpg" + } + }, + { + "tag": "Photography", + "ja": { + "title": "Pose Arch", + "url": "https://apps.apple.com/jp/app/pose-arch/id1483326327", + "description": "iOS", + "preview": "https://is1-ssl.mzstatic.com/image/thumb/Purple112/v4/0b/7b/e9/0b7be99b-985c-5242-32b6-8f7527872e7c/AppIcon-1x_U007emarketing-0-7-0-85-220.png/1200x630wa.png" + }, + "en": { + "title": "Pose Arch", + "url": "https://apps.apple.com/jp/app/pose-arch/id1483326327", + "description": "iOS ", + "preview": "https://is1-ssl.mzstatic.com/image/thumb/Purple112/v4/0b/7b/e9/0b7be99b-985c-5242-32b6-8f7527872e7c/AppIcon-1x_U007emarketing-0-7-0-85-220.png/1200x630wa.png" + } + }, + { + "tag": "Photography", + "ja": { + "title": "COCOPStudio", + "url": "https://cocop.site/cocopstudio/", + "description": "Android, iOS, Windows", + "preview": "https://cocop.site/wp-content/uploads/2020/12/COCOPManga-1-1024x749.png" + }, + "en": { + "title": "COCOPStudio", + "url": "https://cocop.site/cocopstudio/", + "description": "Android, iOS, Windows", + "preview": "https://cocop.site/wp-content/uploads/2020/12/COCOPManga-1-1024x749.png" + } + }, + { + "tag": "Photography", + "ja": { + "title": "Emmv Studio", + "url": "https://booth.pm/ja/items/2495794", + "description": "Windows", + "preview": "https://booth.pximg.net/c/620x620/766abe90-a3ce-40ec-829e-ee51f60a5e39/i/2495794/c3793df4-715f-4549-8ace-c8f31995b0de_base_resized.jpg" + }, + "en": { + "title": "Emmv Studio", + "url": "https://booth.pm/ja/items/2495794", + "description": "Windows ", + "preview": "https://booth.pximg.net/c/620x620/766abe90-a3ce-40ec-829e-ee51f60a5e39/i/2495794/c3793df4-715f-4549-8ace-c8f31995b0de_base_resized.jpg" + } + }, + { + "tag": "Photography", + "ja": { + "title": "PaSha!", + "url": "https://ayato3d.booth.pm/items/2202577", + "description": "Windows 10", + "preview": "https://booth.pximg.net/c/620x620/e08e1533-b2cd-4f71-9ae1-005e15c17a4a/i/2202577/654c9859-4984-4e6c-9f86-7205e5b087eb_base_resized.jpg" + }, + "en": { + "title": "PaSha!", + "url": "https://ayato3d.booth.pm/items/2202577", + "description": "Windows 10", + "preview": "https://booth.pximg.net/c/620x620/e08e1533-b2cd-4f71-9ae1-005e15c17a4a/i/2202577/654c9859-4984-4e6c-9f86-7205e5b087eb_base_resized.jpg" + } + }, + { + "tag": "Photography", + "ja": { + "title": "PoseMixerAR", + "url": "https://maruapps.com/posemixerar/", + "description": "Android, iOS", + "preview": "https://maruapps.com/wp-content/uploads/2022/03/Group-133-1024x576.jpg" + }, + "en": { + "title": "PoseMixerAR", + "url": "https://maruapps.com/posemixerar/", + "description": "Android, iOS", + "preview": "https://maruapps.com/wp-content/uploads/2022/03/Group-133-1024x576.jpg" + } + }, + { + "tag": "Photography", + "ja": { + "title": "VRMポージング", + "url": "https://store.steampowered.com/app/1895630/VRM_Posing_Desktop/", + "description": "[Desktop](https://evelyngamedev.com/vrmposing-desktop/), [Mobile](https://evelyngamedev.com/vrmposing-mobile/)", + "preview": "https://cdn.akamai.steamstatic.com/steam/apps/1895630/capsule_616x353.jpg?t=1705887197" + }, + "en": { + "title": "VRM Posing", + "url": "https://store.steampowered.com/app/1895630/VRM_Posing_Desktop/", + "description": "[Desktop](https://evelyngamedev.com/vrmposing-desktop/), [Mobile](https://evelyngamedev.com/vrmposing-mobile/)", + "preview": "https://cdn.akamai.steamstatic.com/steam/apps/1895630/capsule_616x353.jpg?t=1705887197" + } + }, + { + "tag": "Metaverse", + "ja": { + "title": "バーチャルキャスト", + "url": "https://virtualcast.jp/", + "description": " [Windows VR](https://store.steampowered.com/app/947890/VirtualCast/), [Oculus Quest](https://www.oculus.com/experiences/quest/4174249979259348/)", + "preview": "https://virtualcast.jp/img/common/logo/virtual_cast_570_270_white.png" + }, + "en": { + "title": "VirtualCast", + "url": "https://virtualcast.jp/", + "description": "[Windows VR](https://store.steampowered.com/app/947890/VirtualCast/), [Oculus Quest](https://www.oculus.com/experiences/quest/4174249979259348/)", + "preview": "https://virtualcast.jp/img/common/logo/virtual_cast_570_270_white.png" + }, + "vrm": "1.0" + }, + { + "tag": "Metaverse", + "ja": { + "title": "cluster", + "url": "https://cluster.mu/", + "description": " PCVR, Windows, macOS, iOS, Android", + "preview": "https://cluster.mu/ogp.png" + }, + "en": { + "title": "cluster", + "url": "https://cluster.mu/", + "description": "PCVR, Windows, macOS, iOS, Android", + "preview": "https://cluster.mu/ogp.png" + } + }, + { + "tag": "Metaverse", + "ja": { + "title": "Clarie", + "url": "https://biscrat.booth.pm/items/1193414", + "description": " Windows VR", + "preview": "https://booth.pximg.net/c/620x620/4c6f3dce-4c86-4289-8482-91d8225965b3/i/1193414/61972bcb-0c63-4b25-aa67-08657b196568_base_resized.jpg" + }, + "en": { + "title": "Clarie", + "url": "https://biscrat.booth.pm/items/1193414", + "description": "Windows VR", + "preview": "https://booth.pximg.net/c/620x620/4c6f3dce-4c86-4289-8482-91d8225965b3/i/1193414/61972bcb-0c63-4b25-aa67-08657b196568_base_resized.jpg" + } + }, + { + "tag": "Metaverse", + "ja": { + "title": "Exokit", + "url": "https://github.com/exokitxr/avatars", + "description": " Windows, macOS, Linux, VR", + "preview": "https://opengraph.githubassets.com/4b718896d41bca688ee9b3fb6b3bfc8f5c67582cd2488b49b69119b9509f6eec/exokitxr/avatars" + }, + "en": { + "title": "Exokit", + "url": "https://github.com/exokitxr/avatars", + "description": "Windows, macOS, Linux, VR", + "preview": "https://opengraph.githubassets.com/4b718896d41bca688ee9b3fb6b3bfc8f5c67582cd2488b49b69119b9509f6eec/exokitxr/avatars" + } + }, + { + "tag": "Metaverse", + "ja": { + "title": "TECO", + "url": "https://teco-vr.com/", + "description": " Windows, macOS, Oculus", + "preview": "https://i.gyazo.com/165ad1a9602d7ef621bdf0b6bce0dc05.jpg" + }, + "en": { + "title": "TECO", + "url": "https://teco-vr.com/", + "description": "Windows, macOS, Oculus", + "preview": "https://i.gyazo.com/165ad1a9602d7ef621bdf0b6bce0dc05.jpg" + } + }, + { + "tag": "Metaverse", + "ja": { + "title": "コラボル", + "url": "https://brother-pv.booth.pm/items/2016717", + "description": " Windows VR", + "preview": "https://booth.pximg.net/c/620x620/60e6cd32-b667-4ece-843d-c1768dba069a/i/2016717/2b3c437a-619c-4757-b7dc-c6027338b9a8_base_resized.jpg" + }, + "en": { + "title": "Collaboll", + "url": "https://brother-pv.booth.pm/items/2016717", + "description": "Windows VR", + "preview": "https://booth.pximg.net/c/620x620/60e6cd32-b667-4ece-843d-c1768dba069a/i/2016717/2b3c437a-619c-4757-b7dc-c6027338b9a8_base_resized.jpg" + } + }, + { + "tag": "Metaverse", + "ja": { + "title": "Webaverse", + "url": "https://webaverse.com/", + "description": " Web browser" + }, + "en": { + "title": "Webaverse", + "url": "https://webaverse.com/", + "description": "Web browser" + } + }, + { + "tag": "Metaverse", + "ja": { + "title": "ambr", + "url": "https://ambr.co.jp/", + "description": " Windows VR, macOS" + }, + "en": { + "title": "ambr", + "url": "https://ambr.co.jp/", + "description": "Windows VR, macOS" + } + }, + { + "tag": "Metaverse", + "ja": { + "title": "Connect Chat", + "url": "https://store.steampowered.com/app/1424930/Connect_Chat/", + "description": " Windows VR", + "preview": "https://cdn.akamai.steamstatic.com/steam/apps/1424930/capsule_616x353.jpg?t=1661962722" + }, + "en": { + "title": "Connect Chat", + "url": "https://store.steampowered.com/app/1424930/Connect_Chat/", + "description": "Windows VR", + "preview": "https://cdn.akamai.steamstatic.com/steam/apps/1424930/capsule_616x353.jpg?t=1661962722" + } + }, + { + "tag": "Metaverse", + "ja": { + "title": "VZero", + "url": "https://facevtuber.com/vzero/", + "description": " Web browser", + "preview": "https://facevtuber.com/vzero/thumb.png" + }, + "en": { + "title": "VZero", + "url": "https://facevtuber.com/vzero/", + "description": "Web browser", + "preview": "https://facevtuber.com/vzero/thumb.png" + } + }, + { + "tag": "Metaverse", + "ja": { + "title": "Substrata", + "url": "https://substrata.info/", + "description": " Windows, MacOS, Linux" + }, + "en": { + "title": "Substrata", + "url": "https://substrata.info/", + "description": "Windows, MacOS, Linux" + } + }, + { + "tag": "Metaverse", + "ja": { + "title": "Hyperfy", + "url": "https://hyperfy.io/", + "description": " Web browser, mobile ↔️ VR", + "preview": "https://hyperfy.io/logo-opengraph.png" + }, + "en": { + "title": "Hyperfy", + "url": "https://hyperfy.io/", + "description": "Web browser, mobile ↔️ VR", + "preview": "https://hyperfy.io/logo-opengraph.png" + } + }, + { + "tag": "Metaverse", + "ja": { + "title": "Mona", + "url": "https://monaverse.com", + "description": " Web browser" + }, + "en": { + "title": "Mona", + "url": "https://monaverse.com", + "description": "Web browser" + }, + "vrm": "1.0" + }, + { + "tag": "Game", + "ja": { + "title": "Vワールド", + "url": "https://naby.booth.pm/items/990663", + "description": "Windows", + "preview": "https://booth.pximg.net/c/620x620/45af98ee-8bb1-483d-92af-237a94be8384/i/990663/23408896-9e22-48f6-992d-0dd78f077b1a_base_resized.jpg" + }, + "en": { + "title": "VWorld", + "url": "https://naby.booth.pm/items/990663", + "description": "Windows ", + "preview": "https://booth.pximg.net/c/620x620/45af98ee-8bb1-483d-92af-237a94be8384/i/990663/23408896-9e22-48f6-992d-0dd78f077b1a_base_resized.jpg" + } + }, + { + "tag": "Game", + "ja": { + "title": "SEIYA", + "url": "https://wandv.jp/seiya/", + "description": "Windows VR" + }, + "en": { + "title": "SEIYA", + "url": "https://wandv.jp/seiya/", + "description": "Windows VR" + } + }, + { + "tag": "Game", + "ja": { + "title": "BONFIRE~焚き火~", + "url": "https://orenodinner.booth.pm/items/952450", + "description": "Oculus Go", + "preview": "https://booth.pximg.net/c/620x620/137be3c9-9bda-4d79-bff1-e2d7793b1000/i/952450/ca18032e-28da-409f-b1dd-8a0028da326a_base_resized.jpg" + }, + "en": { + "title": "BONFIRE", + "url": "https://orenodinner.booth.pm/items/952450", + "description": "Oculus Go", + "preview": "https://booth.pximg.net/c/620x620/137be3c9-9bda-4d79-bff1-e2d7793b1000/i/952450/ca18032e-28da-409f-b1dd-8a0028da326a_base_resized.jpg" + } + }, + { + "tag": "Game", + "ja": { + "title": "つんつんVR", + "url": "https://store.steampowered.com/app/867090/VR__TSUNTSUN_VR/", + "description": "Windows VR", + "preview": "https://cdn.akamai.steamstatic.com/steam/apps/867090/capsule_616x353.jpg?t=1656591973" + }, + "en": { + "title": "TSUN-TSUN VR", + "url": "https://store.steampowered.com/app/867090/VR__TSUNTSUN_VR/", + "description": "Windows VR", + "preview": "https://cdn.akamai.steamstatic.com/steam/apps/867090/capsule_616x353.jpg?t=1656591973" + } + }, + { + "tag": "Game", + "ja": { + "title": "コロコロシステム", + "url": "https://www.mediaplex.co.jp/korokoro/", + "description": "Oculus Rift", + "preview": "https://www.mediaplex.co.jp/korokoro/img/og.jpg" + }, + "en": { + "title": "KOROKORO System", + "url": "https://www.mediaplex.co.jp/korokoro/", + "description": "Oculus Rift", + "preview": "https://www.mediaplex.co.jp/korokoro/img/og.jpg" + } + }, + { + "tag": "Game", + "ja": { + "title": "パイロットクロス", + "url": "https://n-mattun.booth.pm/", + "description": "Windows VR", + "preview": "https://booth.pximg.net/c/620x620/592c6d9f-3e4c-4946-bfeb-7977d7d981c4/i/1997616/6341cd53-2551-438d-baf1-2e986552ac0f_base_resized.jpg" + }, + "en": { + "title": "PilotXross", + "url": "https://n-mattun.booth.pm/", + "description": "Windows VR", + "preview": "https://booth.pximg.net/c/620x620/592c6d9f-3e4c-4946-bfeb-7977d7d981c4/i/1997616/6341cd53-2551-438d-baf1-2e986552ac0f_base_resized.jpg" + } + }, + { + "tag": "Game", + "ja": { + "title": "プリミティア", + "url": "https://store.steampowered.com/app/1745170/Primitier/", + "description": "Windows VR", + "preview": "https://cdn.akamai.steamstatic.com/steam/apps/1745170/capsule_616x353.jpg?t=1696669100" + }, + "en": { + "title": "Primitier", + "url": "https://store.steampowered.com/app/1745170/Primitier/", + "description": "Windows VR", + "preview": "https://cdn.akamai.steamstatic.com/steam/apps/1745170/capsule_616x353.jpg?t=1696669100" + } + }, + { + "tag": "Game", + "ja": { + "title": "Synth Riders", + "url": "https://store.steampowered.com/app/885000/Synth_Riders/", + "description": "Windows VR", + "preview": "https://cdn.akamai.steamstatic.com/steam/apps/885000/capsule_616x353_alt_assets_7.jpg?t=1706205390" + }, + "en": { + "title": "Synth Riders", + "url": "https://store.steampowered.com/app/885000/Synth_Riders/", + "description": "Windows VR", + "preview": "https://cdn.akamai.steamstatic.com/steam/apps/885000/capsule_616x353_alt_assets_7.jpg?t=1706205390" + } + }, + { + "tag": "Game", + "ja": { + "title": "SOUNDART", + "url": "https://store.steampowered.com/app/1144460/SOUNDART/", + "description": "Windows VR", + "preview": "https://cdn.akamai.steamstatic.com/steam/apps/1144460/capsule_616x353.jpg?t=1692855639" + }, + "en": { + "title": "SOUNDART", + "url": "https://store.steampowered.com/app/1144460/SOUNDART/", + "description": "Windows VR", + "preview": "https://cdn.akamai.steamstatic.com/steam/apps/1144460/capsule_616x353.jpg?t=1692855639" + } + }, + { + "tag": "Game", + "ja": { + "title": "VRAST!", + "url": "https://rc-cobalt.booth.pm/items/1756359", + "description": "Windows", + "preview": "https://booth.pximg.net/c/620x620/a58e34b7-23b4-4d2b-bcff-65217538a985/i/1756359/73ea6dfa-6607-4ec5-9388-f100c6402b6a_base_resized.jpg" + }, + "en": { + "title": "VRAST!", + "url": "https://rc-cobalt.booth.pm/items/1756359", + "description": "Windows ", + "preview": "https://booth.pximg.net/c/620x620/a58e34b7-23b4-4d2b-bcff-65217538a985/i/1756359/73ea6dfa-6607-4ec5-9388-f100c6402b6a_base_resized.jpg" + } + }, + { + "tag": "Game", + "ja": { + "title": "Legend of the Shieldbearers", + "url": "https://www.spacepupstudio.com/lots", + "description": "Oculus Rift/Oculus Quest", + "preview": "https://lh4.googleusercontent.com/f776QxmrcZmhgIgx2OnAKnN-v_RFH_SgoGOP4fz5G7TxBe6aCUbBBeontNNp-ENz-CvskL3_ZSXf6l16TdtTSJ8=w16383" + }, + "en": { + "title": "Legend of the Shieldbearers", + "url": "https://www.spacepupstudio.com/lots", + "description": "Oculus Rift/Oculus Quest", + "preview": "https://lh4.googleusercontent.com/f776QxmrcZmhgIgx2OnAKnN-v_RFH_SgoGOP4fz5G7TxBe6aCUbBBeontNNp-ENz-CvskL3_ZSXf6l16TdtTSJ8=w16383" + } + }, + { + "tag": "Game", + "ja": { + "title": "BOW MAN", + "url": "https://bowman.vrlab.dmm.com/ja/", + "description": "Windows VR" + }, + "en": { + "title": "BOW MAN", + "url": "https://bowman.vrlab.dmm.com/ja/", + "description": "Windows VR" + } + }, + { + "tag": "Game", + "ja": { + "title": "Craftopia", + "url": "https://store.steampowered.com/app/1307550/Craftopia/", + "description": "Windows", + "preview": "https://cdn.akamai.steamstatic.com/steam/apps/1307550/capsule_616x353_alt_assets_2.jpg?t=1704778646" + }, + "en": { + "title": "Craftopia", + "url": "https://store.steampowered.com/app/1307550/Craftopia/", + "description": "Windows ", + "preview": "https://cdn.akamai.steamstatic.com/steam/apps/1307550/capsule_616x353_alt_assets_2.jpg?t=1704778646" + } + }, + { + "tag": "Game", + "ja": { + "title": "RESONARK X", + "url": "https://store.steampowered.com/app/1366570/RESONARK_X/", + "description": "Windows VR, [Oculus Quest](https://www.oculus.com/experiences/quest/3405379359561787/)", + "preview": "https://cdn.akamai.steamstatic.com/steam/apps/1366570/capsule_616x353.jpg?t=1616769503" + }, + "en": { + "title": "RESONARK X", + "url": "https://store.steampowered.com/app/1366570/RESONARK_X/", + "description": "Windows VR, [Oculus Quest](https://www.oculus.com/experiences/quest/3405379359561787/)", + "preview": "https://cdn.akamai.steamstatic.com/steam/apps/1366570/capsule_616x353.jpg?t=1616769503" + } + }, + { + "tag": "Game", + "ja": { + "title": "ラクキン", + "url": "https://rakugaki-kingdom.com/", + "description": "iOS, Android" + }, + "en": { + "title": "Rakugaki Kingdom", + "url": "https://rakugaki-kingdom.com/", + "description": "iOS, Android" + } + }, + { + "tag": "Game", + "ja": { + "title": "FantasySeed", + "url": "https://booth.pm/ja/items/1293100", + "description": "Windows", + "preview": "https://booth.pximg.net/c/620x620/d5f8df31-7910-473a-b996-3810ac1fb8c8/i/1293100/5a73d6ac-fb34-44c8-9309-a1f77485d0eb_base_resized.jpg" + }, + "en": { + "title": "FantasySeed", + "url": "https://booth.pm/ja/items/1293100", + "description": "Windows", + "preview": "https://booth.pximg.net/c/620x620/d5f8df31-7910-473a-b996-3810ac1fb8c8/i/1293100/5a73d6ac-fb34-44c8-9309-a1f77485d0eb_base_resized.jpg" + } + }, + { + "tag": "Game", + "ja": { + "title": "Roduet", + "url": "https://fujisunflower.booth.pm/items/2510498", + "description": "Windows", + "preview": "https://booth.pximg.net/c/620x620/cb0237fe-c742-4a81-a90a-6e3f920ad3de/i/2510498/7fad535a-5def-4351-b5f8-3b7f6de95577_base_resized.jpg" + }, + "en": { + "title": "Roduet", + "url": "https://fujisunflower.booth.pm/items/2510498", + "description": "Windows ", + "preview": "https://booth.pximg.net/c/620x620/cb0237fe-c742-4a81-a90a-6e3f920ad3de/i/2510498/7fad535a-5def-4351-b5f8-3b7f6de95577_base_resized.jpg" + } + }, + { + "tag": "Game", + "ja": { + "title": "Cube Art World", + "url": "https://simplestar-game.booth.pm/items/2622434", + "description": "Windows", + "preview": "https://booth.pximg.net/c/620x620/c7010761-002c-44fe-ae20-85f45c9e259d/i/2622434/e6127b64-5a2c-4644-9ec2-afdf27037117_base_resized.jpg" + }, + "en": { + "title": "Cube Art World", + "url": "https://simplestar-game.booth.pm/items/2622434", + "description": "Windows ", + "preview": "https://booth.pximg.net/c/620x620/c7010761-002c-44fe-ae20-85f45c9e259d/i/2622434/e6127b64-5a2c-4644-9ec2-afdf27037117_base_resized.jpg" + } + }, + { + "tag": "Game", + "ja": { + "title": "TouroReminiscence", + "url": "https://booth.pm/ja/items/2349960", + "description": "Windows", + "preview": "https://booth.pximg.net/c/620x620/d3ce725c-dbbe-4c04-996a-31f0ecf037ac/i/2349960/5edfe757-1064-496a-a818-a26e7953d16e_base_resized.jpg" + }, + "en": { + "title": "TouroReminiscence", + "url": "https://booth.pm/ja/items/2349960", + "description": "Windows ", + "preview": "https://booth.pximg.net/c/620x620/d3ce725c-dbbe-4c04-996a-31f0ecf037ac/i/2349960/5edfe757-1064-496a-a818-a26e7953d16e_base_resized.jpg" + } + }, + { + "tag": "Game", + "ja": { + "title": "VRM Cyber walk", + "url": "https://ktamayan.booth.pm/items/2790105", + "description": "Windows", + "preview": "https://booth.pximg.net/c/620x620/1a4e0889-d4a0-4259-9d32-ed14de1b80f3/i/2790105/086201e8-a3fe-4656-bf94-4622301aa102_base_resized.jpg" + }, + "en": { + "title": "VRM Cyber walk", + "url": "https://ktamayan.booth.pm/items/2790105", + "description": "Windows ", + "preview": "https://booth.pximg.net/c/620x620/1a4e0889-d4a0-4259-9d32-ed14de1b80f3/i/2790105/086201e8-a3fe-4656-bf94-4622301aa102_base_resized.jpg" + } + }, + { + "tag": "Game", + "ja": { + "title": "Virtual Home Run Derby", + "url": "https://paldynojosh.booth.pm/items/1485218", + "description": "Windows", + "preview": "https://booth.pximg.net/c/620x620/6ea7ae69-246b-407c-a384-cebd4c3ba9dc/i/1485218/158cf87a-d9f9-491f-a0d8-63def5025c52_base_resized.jpg" + }, + "en": { + "title": "Virtual Home Run Derby", + "url": "https://paldynojosh.booth.pm/items/1485218", + "description": "Windows ", + "preview": "https://booth.pximg.net/c/620x620/6ea7ae69-246b-407c-a384-cebd4c3ba9dc/i/1485218/158cf87a-d9f9-491f-a0d8-63def5025c52_base_resized.jpg" + } + }, + { + "tag": "Game", + "ja": { + "title": "フードデリバリーバトル", + "url": "https://store.steampowered.com/app/1708710/Food_Delivery_Battle/", + "description": "Windows", + "preview": "https://cdn.akamai.steamstatic.com/steam/apps/1708710/capsule_616x353.jpg?t=1703579874" + }, + "en": { + "title": "Food Delivery Battle", + "url": "https://store.steampowered.com/app/1708710/Food_Delivery_Battle/", + "description": "Windows ", + "preview": "https://cdn.akamai.steamstatic.com/steam/apps/1708710/capsule_616x353.jpg?t=1703579874" + } + }, + { + "tag": "Game", + "ja": { + "title": "古銭プッシャーフレンズ", + "url": "https://store.steampowered.com/app/1722020/Old_Coin_Pusher_Friends/", + "description": "Windows", + "preview": "https://cdn.akamai.steamstatic.com/steam/apps/1722020/capsule_616x353.jpg?t=1703580020" + }, + "en": { + "title": "Old Coin Pusher Friends", + "url": "https://store.steampowered.com/app/1722020/Old_Coin_Pusher_Friends/", + "description": "Windows ", + "preview": "https://cdn.akamai.steamstatic.com/steam/apps/1722020/capsule_616x353.jpg?t=1703580020" + } + }, + { + "tag": "Game", + "ja": { + "title": "AVATAVI", + "url": "https://avatavi.com/jp/index.html", + "description": "iOS", + "preview": "https://avatavi.com/img/KV_main_S.jpg" + }, + "en": { + "title": "AVATAVI", + "url": "https://avatavi.com/jp/index.html", + "description": "iOS ", + "preview": "https://avatavi.com/img/KV_main_S.jpg" + } + }, + { + "tag": "WebBrowser", + "ja": { + "title": "あけろ!爆裂駐車場!", + "url": "https://unityroom.com/games/bakuretsu", + "description": "" + }, + "en": { + "title": "Bakuretsu Parking Lot", + "url": "https://unityroom.com/games/bakuretsu", + "description": "Web browser" + } + }, + { + "tag": "WebBrowser", + "ja": { + "title": "スーパーエクストリームVRMサッカー", + "url": "https://unityroom.com/games/hyperdimension-virtual-super-extreme-vrm-soccer", + "description": "" + }, + "en": { + "title": "Super Extreme VRM Soccer", + "url": "https://unityroom.com/games/hyperdimension-virtual-super-extreme-vrm-soccer", + "description": "Web browser" + } + }, + { + "tag": "WebBrowser", + "ja": { + "title": "密ッションインポッシブル", + "url": "https://unityroom.com/games/mitsussion", + "description": "" + }, + "en": { + "title": "Mission Impossible", + "url": "https://unityroom.com/games/mitsussion", + "description": "Web browser" + } + }, + { + "tag": "WebBrowser", + "ja": { + "title": "スーパーVRMブラザーズ3D", + "url": "https://unityroom.com/games/aguroshoutest", + "description": "" + }, + "en": { + "title": "Super VRM Brothers 3D", + "url": "https://unityroom.com/games/aguroshoutest", + "description": "Web browser" + } + }, + { + "tag": "WebBrowser", + "ja": { + "title": "ペースアップ!", + "url": "https://unityroom.com/games/paseup", + "description": "" + }, + "en": { + "title": "Pace Up !", + "url": "https://unityroom.com/games/paseup", + "description": "Web browser" + } + }, + { + "tag": "WebBrowser", + "ja": { + "title": "二輪VRM", + "url": "https://unityroom.com/games/vrm_bike", + "description": "" + }, + "en": { + "title": "VRM Bike", + "url": "https://unityroom.com/games/vrm_bike", + "description": "Web browser" + } + }, + { + "tag": "WebBrowser", + "ja": { + "title": "VRM三段跳び", + "url": "https://unityroom.com/games/vrmtriplejump", + "description": "" + }, + "en": { + "title": "VRM Triple Jump", + "url": "https://unityroom.com/games/vrmtriplejump", + "description": "Web browser" + } + }, + { + "tag": "WebBrowser", + "ja": { + "title": "(超)STEP PANEL MATCH", + "url": "https://unityroom.com/games/step-panel-match", + "description": "" + }, + "en": { + "title": "Step Panel Match", + "url": "https://unityroom.com/games/step-panel-match", + "description": "Web browser" + } + }, + { + "tag": "WebBrowser", + "ja": { + "title": "Vブレード", + "url": "https://unityroom.com/games/vblade", + "description": "" + }, + "en": { + "title": "V Blade", + "url": "https://unityroom.com/games/vblade", + "description": "Web browser" + } + }, + { + "tag": "Viewer", + "ja": { + "title": "Babylon VRM Viewer", + "url": "https://github.com/virtual-cast/babylon-vrm-loader/", + "description": "Babylon.js拡張 ", + "preview": "https://repository-images.githubusercontent.com/185508879/04114e80-7638-11e9-88be-b3df71865dfc" + }, + "en": { + "title": "Babylon VRM Viewer", + "url": "https://github.com/virtual-cast/babylon-vrm-loader/", + "description": "Babylon.js extension", + "preview": "https://repository-images.githubusercontent.com/185508879/04114e80-7638-11e9-88be-b3df71865dfc" + } + }, + { + "tag": "Viewer", + "ja": { + "title": "VPocket", + "url": "https://booooooh.booth.pm/items/1033823", + "description": "Android, iOS ", + "preview": "https://booth.pximg.net/c/620x620/766abe90-a3ce-40ec-829e-ee51f60a5e39/i/1033823/edda207e-0f4c-47a8-8187-4750abdaa730_base_resized.jpg" + }, + "en": { + "title": "VPocket", + "url": "https://booooooh.booth.pm/items/1033823", + "description": "Android, iOS", + "preview": "https://booth.pximg.net/c/620x620/766abe90-a3ce-40ec-829e-ee51f60a5e39/i/1033823/edda207e-0f4c-47a8-8187-4750abdaa730_base_resized.jpg" + } + }, + { + "tag": "Viewer", + "ja": { + "title": "VRMビュアー", + "url": "https://w.atwiki.jp/beamman/", + "description": "Windows ", + "preview": "https://img.atwiki.jp/beamman/attach/13/163/vrm.png" + }, + "en": { + "title": "VRMViewer", + "url": "https://w.atwiki.jp/beamman/", + "description": "Windows ", + "preview": "https://img.atwiki.jp/beamman/attach/13/163/vrm.png" + } + }, + { + "tag": "Viewer", + "ja": { + "title": "VRM Viewer", + "url": "https://vrm-viewer.yukimochi.io/", + "description": "Webブラウザ " + }, + "en": { + "title": "VRM Viewer", + "url": "https://vrm-viewer.yukimochi.io/", + "description": "Web browser" + } + }, + { + "tag": "Viewer", + "ja": { + "title": "VRMQuickLook", + "url": "https://github.com/magicien/VRMQuickLook", + "description": "macOS ", + "preview": "https://opengraph.githubassets.com/37ddf4ff51b99b8eae86c5ea4cd088a0f7199a2825da84af9ce1905e039ffe6b/magicien/VRMQuickLook" + }, + "en": { + "title": "VRMQuickLook", + "url": "https://github.com/magicien/VRMQuickLook", + "description": "macOS ", + "preview": "https://opengraph.githubassets.com/37ddf4ff51b99b8eae86c5ea4cd088a0f7199a2825da84af9ce1905e039ffe6b/magicien/VRMQuickLook" + } + }, + { + "tag": "Viewer", + "ja": { + "title": "VRM Live Viewer", + "url": "https://booth.pm/ja/items/1783082", + "description": "Windows ", + "preview": "https://booth.pximg.net/c/620x620/46161e9d-5b71-4b27-a134-1820ef0c2489/i/1783082/073e1432-0e59-485f-b615-94f5444b53af_base_resized.jpg" + }, + "en": { + "title": "VRM Live Viewer", + "url": "https://booth.pm/ja/items/1783082", + "description": "Windows ", + "preview": "https://booth.pximg.net/c/620x620/46161e9d-5b71-4b27-a134-1820ef0c2489/i/1783082/073e1432-0e59-485f-b615-94f5444b53af_base_resized.jpg" + } + }, + { + "tag": "Viewer", + "ja": { + "title": "UniWinApi Example project", + "url": "https://github.com/kirurobo/UniWinApi", + "description": "Unityライブラリ ", + "preview": "https://repository-images.githubusercontent.com/144803660/866ab580-b060-11e9-9dcf-bd73939b211a" + }, + "en": { + "title": "UniWinApi Example project", + "url": "https://github.com/kirurobo/UniWinApi", + "description": "Unity library", + "preview": "https://repository-images.githubusercontent.com/144803660/866ab580-b060-11e9-9dcf-bd73939b211a" + } + }, + { + "tag": "Viewer", + "ja": { + "title": "KinectV2VRM", + "url": "https://github.com/m2wasabi/KinectV2VRM", + "description": "Unityライブラリ ", + "preview": "https://opengraph.githubassets.com/a4ba1e60f92c02abb2ecd9461d7acbf81c09b2e8b13c38ce21383965ed80fa66/m2wasabi/KinectV2VRM" + }, + "en": { + "title": "KinectV2VRM", + "url": "https://github.com/m2wasabi/KinectV2VRM", + "description": "Unity library", + "preview": "https://opengraph.githubassets.com/a4ba1e60f92c02abb2ecd9461d7acbf81c09b2e8b13c38ce21383965ed80fa66/m2wasabi/KinectV2VRM" + } + }, + { + "tag": "Viewer", + "ja": { + "title": "MocuMocuVRM", + "url": "http://www.vrai.jp/vr_mocuvrm.html", + "description": "Windows VR, Looking Glass " + }, + "en": { + "title": "MocuMocuVRM", + "url": "http://www.vrai.jp/vr_mocuvrm.html", + "description": "Windows VR, Looking Glass" + } + }, + { + "tag": "Viewer", + "ja": { + "title": "VRM Display", + "url": "https://akarimichi.github.io/vrm-display-releases/", + "description": "Windows ", + "preview": "https://akarimichi.github.io/vrm-display-releases/assets/images/card-image.png" + }, + "en": { + "title": "VRM Display", + "url": "https://akarimichi.github.io/vrm-display-releases/", + "description": "Windows ", + "preview": "https://akarimichi.github.io/vrm-display-releases/assets/images/card-image.png" + } + }, + { + "tag": "Viewer", + "ja": { + "title": "Desktop Magic Engine", + "url": "https://store.steampowered.com/app/1096550/Desktop_Magic_Engine/", + "description": "Windows ", + "preview": "https://cdn.akamai.steamstatic.com/steam/apps/1096550/capsule_616x353.jpg?t=1652877726" + }, + "en": { + "title": "Desktop Magic Engine", + "url": "https://store.steampowered.com/app/1096550/Desktop_Magic_Engine/", + "description": "Windows ", + "preview": "https://cdn.akamai.steamstatic.com/steam/apps/1096550/capsule_616x353.jpg?t=1652877726" + } + }, + { + "tag": "Viewer", + "ja": { + "title": "TSO AR Viewer", + "url": "https://seed.online/static/guide-arviewer", + "description": "Android, iOS " + }, + "en": { + "title": "TSO AR Viewer", + "url": "https://seed.online/static/guide-arviewer", + "description": "Android, iOS" + } + }, + { + "tag": "UsingInternally", + "ja": { + "title": "Vカツ", + "url": "http://vkatsu.jp/", + "description": "Windows, iOS, Android " + }, + "en": { + "title": "Vkatsu", + "url": "http://vkatsu.jp/", + "description": "Windows, iOS, Android" + } + }, + { + "tag": "UsingInternally", + "ja": { + "title": "カスタムキャスト", + "url": "https://customcast.jp/", + "description": "iOS, Android " + }, + "en": { + "title": "Custom Cast", + "url": "https://customcast.jp/", + "description": "iOS, Android" + } + }, + { + "tag": "UsingInternally", + "ja": { + "title": "REALITY", + "url": "https://reality.wrightflyer.net/", + "description": "iOS, Android " + }, + "en": { + "title": "REALITY", + "url": "https://reality.wrightflyer.net/", + "description": "iOS, Android" + } + }, + { + "tag": "UsingInternally", + "ja": { + "title": "パペ文字", + "url": "https://www.puppemoji.com/", + "description": "iOS " + }, + "en": { + "title": "Puppemoji", + "url": "https://www.puppemoji.com/", + "description": "iOS " + } + }, + { + "tag": "UsingInternally", + "ja": { + "title": "メイアライブオーダーメイド版", + "url": "https://materializer.co/lab/mayalive", + "description": "Windows, macOS ", + "preview": "https://materializer.co/lab/_media/logo-materializer-white.png" + }, + "en": { + "title": "Mayalive Order Made Version", + "url": "https://materializer.co/lab/mayalive", + "description": "Windows, macOS", + "preview": "https://materializer.co/lab/_media/logo-materializer-white.png" + } + }, + { + "tag": "UsingInternally", + "ja": { + "title": "MakeAvatar", + "url": "https://gugenka.jp/digital/make_avatar.php", + "description": "iOS, Android ", + "preview": "https://storage.googleapis.com/production-os-assets/assets/eca324fe-a374-42e9-b038-de9d4061038d" + }, + "en": { + "title": "MakeAvatar", + "url": "https://gugenka.jp/digital/make_avatar.php", + "description": "iOS, Android", + "preview": "https://storage.googleapis.com/production-os-assets/assets/eca324fe-a374-42e9-b038-de9d4061038d" + } + }, + { + "tag": "Other", + "ja": { + "title": "VRMLoaderUI", + "url": "https://github.com/m2wasabi/VRMLoaderUI", + "description": "Unityライブラリ ", + "preview": "https://opengraph.githubassets.com/4fc4a503a4078dac4b9102f1c0f658a2d1ed514fbefbb6bdd429e91883a39ec8/m2wasabi/VRMLoaderUI" + }, + "en": { + "title": "VRMLoaderUI", + "url": "https://github.com/m2wasabi/VRMLoaderUI", + "description": "Unity library", + "preview": "https://opengraph.githubassets.com/4fc4a503a4078dac4b9102f1c0f658a2d1ed514fbefbb6bdd429e91883a39ec8/m2wasabi/VRMLoaderUI" + } + }, + { + "tag": "Other", + "ja": { + "title": "テアトル", + "url": "https://teator.jp/", + "description": "Windows 10 ", + "preview": "https://teator.jp/assets/ogp.jpg" + }, + "en": { + "title": "TEATOR", + "url": "https://teator.jp/", + "description": "Windows 10", + "preview": "https://teator.jp/assets/ogp.jpg" + } + }, + { + "tag": "Other", + "ja": { + "title": "NeoRoidHub for Unity", + "url": "https://neoseast-japan.booth.pm/items/2562276", + "description": "Unityエディタ拡張 ", + "preview": "https://booth.pximg.net/c/620x620/8d4d3bf2-308b-4754-bde2-a197718377cd/i/2562276/f36dc2a1-808b-47a8-b6d5-0a19eb146026_base_resized.jpg" + }, + "en": { + "title": "NeoRoidHub for Unity", + "url": "https://neoseast-japan.booth.pm/items/2562276", + "description": "Unity editor extension", + "preview": "https://booth.pximg.net/c/620x620/8d4d3bf2-308b-4754-bde2-a197718377cd/i/2562276/f36dc2a1-808b-47a8-b6d5-0a19eb146026_base_resized.jpg" + } + }, + { + "tag": "Other", + "ja": { + "title": "Virtual Presentation Space", + "url": "https://eyesout.itch.io/virtual-presentation-space", + "description": "Windows VR ", + "preview": "https://img.itch.zone/aW1nLzMwODM5NjkucG5n/original/xszbVE.png" + }, + "en": { + "title": "Virtual Presentation Space", + "url": "https://eyesout.itch.io/virtual-presentation-space", + "description": "Windows VR", + "preview": "https://img.itch.zone/aW1nLzMwODM5NjkucG5n/original/xszbVE.png" + } + }, + { + "tag": "Other", + "ja": { + "title": "VTuber Editor", + "url": "https://store.steampowered.com/app/1454500/VTuber_Editor/", + "description": "Windows ", + "preview": "https://cdn.akamai.steamstatic.com/steam/apps/1454500/capsule_616x353.jpg?t=1669859174" + }, + "en": { + "title": "VTuber Editor", + "url": "https://store.steampowered.com/app/1454500/VTuber_Editor/", + "description": "Windows ", + "preview": "https://cdn.akamai.steamstatic.com/steam/apps/1454500/capsule_616x353.jpg?t=1669859174" + } + }, + { + "tag": "Other", + "ja": { + "title": "ACUAH β", + "url": "https://riemgoshawk.booth.pm/items/1990160", + "description": "Android " + }, + "en": { + "title": "ACUAH β", + "url": "https://riemgoshawk.booth.pm/items/1990160", + "description": "Android " + } + }, + { + "tag": "Other", + "ja": { + "title": "TIFA", + "url": "https://melonspeedruns.itch.io/tifa", + "description": "Windows ", + "preview": "https://img.itch.zone/aW1nLzU0MDU1MjMuZ2lm/original/CgX5uJ.gif" + }, + "en": { + "title": "TIFA", + "url": "https://melonspeedruns.itch.io/tifa", + "description": "Windows ", + "preview": "https://img.itch.zone/aW1nLzU0MDU1MjMuZ2lm/original/CgX5uJ.gif" + } + }, + { + "tag": "Other", + "ja": { + "title": "STYLY", + "url": "https://styly.cc/", + "description": "Windows, Windows VR, Android, iOS ", + "preview": "https://styly.cc/_next/static/media/White_Back_Ground_STYLY_Logo.25c7f144.png" + }, + "en": { + "title": "STYLY", + "url": "https://styly.cc/", + "description": "Windows, Windows VR, Android, iOS", + "preview": "https://styly.cc/_next/static/media/White_Back_Ground_STYLY_Logo.25c7f144.png" + } + }, + { + "tag": "Other", + "ja": { + "title": "[HANA] BlendShapeをコントロールするツール", + "url": "https://kuniyan.booth.pm/items/2437978", + "description": "Windows ", + "preview": "https://booth.pximg.net/c/620x620/5b7e23ca-da84-4832-8e36-f91e02616b3d/i/2437978/ea1d060b-176e-498b-85f5-afa47f47508a_base_resized.jpg" + }, + "en": { + "title": "[HANA_Tool_v2] Control BlendShapes Tool", + "url": "https://kuniyan.booth.pm/items/2604269", + "description": "Windows ", + "preview": "https://booth.pximg.net/c/620x620/5b7e23ca-da84-4832-8e36-f91e02616b3d/i/2604269/ffd3f184-0773-4423-bb96-3eb53d082e7e_base_resized.jpg" + } + }, + { + "tag": "Other", + "ja": { + "title": "Virtual Studio", + "url": "https://natsunatsu.booth.pm/items/2956377", + "description": "Windows ", + "preview": "https://booth.pximg.net/c/620x620/5d1ed011-ef46-45fd-809b-f64220617ae8/i/2956377/fcb0a8f7-bf0b-4c7b-ae45-241ecc43e5dd_base_resized.jpg" + }, + "en": { + "title": "Virtual Studio", + "url": "https://natsunatsu.booth.pm/items/2956377", + "description": "Windows ", + "preview": "https://booth.pximg.net/c/620x620/5d1ed011-ef46-45fd-809b-f64220617ae8/i/2956377/fcb0a8f7-bf0b-4c7b-ae45-241ecc43e5dd_base_resized.jpg" + } + }, + { + "tag": "Other", + "ja": { + "title": "VRM表情設定するやつ", + "url": "https://120byte.booth.pm/items/2152326", + "description": "Windows ", + "preview": "https://booth.pximg.net/c/620x620/6dd2a4de-9111-46cb-b1c2-14645f3c8515/i/2152326/e734b8b5-169d-445e-8311-d2d7f5c71b28_base_resized.jpg" + }, + "en": { + "title": "VRM facial setting", + "url": "https://120byte.booth.pm/items/2152326", + "description": "Windows ", + "preview": "https://booth.pximg.net/c/620x620/6dd2a4de-9111-46cb-b1c2-14645f3c8515/i/2152326/e734b8b5-169d-445e-8311-d2d7f5c71b28_base_resized.jpg" + } + }, + { + "tag": "Other", + "ja": { + "title": "VRMテクスチャ差し替えるやつ", + "url": "https://120byte.booth.pm/items/2177538", + "description": "Windows ", + "preview": "https://booth.pximg.net/c/620x620/6dd2a4de-9111-46cb-b1c2-14645f3c8515/i/2177538/00364192-65e2-462a-88e4-402be5280373_base_resized.jpg" + }, + "en": { + "title": "VRM texture replace", + "url": "https://120byte.booth.pm/items/2177538", + "description": "Windows ", + "preview": "https://booth.pximg.net/c/620x620/6dd2a4de-9111-46cb-b1c2-14645f3c8515/i/2177538/00364192-65e2-462a-88e4-402be5280373_base_resized.jpg" + } + }, + { + "tag": "Other", + "ja": { + "title": "アイテムショップ", + "url": "https://suzuki-cecil.booth.pm/items/3250368", + "description": "Windows ", + "preview": "https://booth.pximg.net/c/620x620/d8fc025c-b520-429f-a51b-71342613591f/i/3250368/d65f636e-d3d0-4e5e-9364-cd82340c2110_base_resized.jpg" + }, + "en": { + "title": "Item Shop", + "url": "https://suzuki-cecil.booth.pm/items/3250368", + "description": "Windows ", + "preview": "https://booth.pximg.net/c/620x620/d8fc025c-b520-429f-a51b-71342613591f/i/3250368/d65f636e-d3d0-4e5e-9364-cd82340c2110_base_resized.jpg" + } + }, + { + "tag": "Other", + "ja": { + "title": "meebits-blender-utils", + "url": "https://github.com/MeebitsDAO/meebits-blender-utils", + "description": "Windows ", + "preview": "https://opengraph.githubassets.com/9b8000c01cce334bfe720389fcd96a2fb24fefd50e3b2b468a9fff496565007f/MeebitsDAO/meebits-blender-utils" + }, + "en": { + "title": "meebits-blender-utils", + "url": "https://github.com/MeebitsDAO/meebits-blender-utils", + "description": "Windows ", + "preview": "https://opengraph.githubassets.com/9b8000c01cce334bfe720389fcd96a2fb24fefd50e3b2b468a9fff496565007f/MeebitsDAO/meebits-blender-utils" + } + }, + { + "tag": "Other", + "ja": { + "title": "The Meebits - Larva Labs", + "url": "https://meebits.larvalabs.com/", + "description": "Windows ", + "preview": "https://meebits.app/public/images/homepage/group.jpg" + }, + "en": { + "title": "The Meebits - Larva Labs", + "url": "https://meebits.larvalabs.com/", + "description": "Windows ", + "preview": "https://meebits.app/public/images/homepage/group.jpg" + } + }, + { + "tag": "Other", + "ja": { + "title": "ミロックプラス", + "url": "https://www.miloq-plus.com/", + "description": "Android, iOS " + }, + "en": { + "title": "miloq plus", + "url": "https://www.miloq-plus.com/", + "description": "Android, iOS" + } + }, + { + "tag": "Other", + "ja": { + "title": "SimpleURPToonLitOutlineExample", + "url": "https://github.com/simplestargame/SimpleURPToonLitOutlineExample", + "description": "Windows ", + "preview": "https://repository-images.githubusercontent.com/452284076/92f08df6-d1d1-4b34-953e-def02f7d561f" + }, + "en": { + "title": "SimpleURPToonLitOutlineExample", + "url": "https://github.com/simplestargame/SimpleURPToonLitOutlineExample", + "description": "Windows ", + "preview": "https://repository-images.githubusercontent.com/452284076/92f08df6-d1d1-4b34-953e-def02f7d561f" + } + }, + { + "tag": "Other", + "ja": { + "title": "Kalidokit", + "url": "https://github.com/yeemachine/kalidokit", + "description": "Windows ", + "preview": "https://opengraph.githubassets.com/a08f1a61d9a0e14348a6f01ec45a6b48bc7608671e4d1133a566e842c02145bc/yeemachine/kalidokit" + }, + "en": { + "title": "Kalidokit", + "url": "https://github.com/yeemachine/kalidokit", + "description": "Windows ", + "preview": "https://opengraph.githubassets.com/a08f1a61d9a0e14348a6f01ec45a6b48bc7608671e4d1133a566e842c02145bc/yeemachine/kalidokit" + } + }, + { + "tag": "Other", + "ja": { + "title": "Wicked Engine", + "url": "https://github.com/turanszkij/WickedEngine", + "description": "Windows, Linux, Xbox Series, PlayStation 5 ", + "preview": "https://repository-images.githubusercontent.com/37770961/c7a169f3-f000-4351-aa94-78cf1d79c7c4" + }, + "en": { + "title": "Wicked Engine", + "url": "https://github.com/turanszkij/WickedEngine", + "description": "Windows, Linux, Xbox Series, PlayStation 5", + "preview": "https://repository-images.githubusercontent.com/37770961/c7a169f3-f000-4351-aa94-78cf1d79c7c4" + } + } +]; diff --git a/src/data/users.tsx b/src/data/users.tsx deleted file mode 100644 index 3b6a96b61..000000000 --- a/src/data/users.tsx +++ /dev/null @@ -1,2092 +0,0 @@ -// https://github.com/facebook/docusaurus/blob/main/website/src/data/users.tsx -// を参考に。 -import type { TagType } from "./tags"; - -// Inspired by https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscore#_sortby-and-_orderby -export function sortBy( - array: T[], - getter: (item: T) => string | number | boolean, -): T[] { - const sortedArray = [...array]; - sortedArray.sort((a, b) => - // eslint-disable-next-line no-nested-ternary - getter(a) > getter(b) ? 1 : getter(b) > getter(a) ? -1 : 0, - ); - return sortedArray; -} - -export type UserInfo = { - title: string; - url: string; - description?: string; - preview?: string; -}; -export type User = { - tag: TagType, - ja: UserInfo, - en?: UserInfo, - // `1.0 support` or `1.0 only` or `0.x only` else ? - vrm?: string, -}; - -// Add sites to this list -// prettier-ignore -const Users: User[] = [ - // CharacterPlatform - { - tag: 'CharacterPlatform', - ja: { - title: 'ザ・シードオンライン', - url: 'https://virtualcast.jp/store/', - description: '`1.0` アップロード可。3D viewer は `1.0` 未対応', - }, - en: { - title: 'The Seed Online', - url: 'https://virtualcast.jp/store/', - description: '`1.0` can be uploaded. 3D viewer does not support `1.0`', - }, - vrm: '1.0', - }, - { - tag: 'CharacterPlatform', - ja: { - title: 'ニコニ立体', - url: 'https://3d.nicovideo.jp/', - }, - en: { - title: 'Niconi Solid', - url: 'https://3d.nicovideo.jp/', - }, - }, - { - tag: 'CharacterPlatform', - ja: { - title: 'VRoid Hub', - url: 'https://hub.vroid.com/', - }, - en: { - title: 'VRoid Hub', - url: 'https://hub.vroid.com/en/', - }, - vrm: '1.0', - }, - { - tag: 'CharacterPlatform', - ja: { - title: 'DMM VR CONNECT', - url: 'https://connect.vrlab.dmm.com/', - }, - en: { - title: 'DMM VR CONNECT', - url: 'https://connect.vrlab.dmm.com/', - }, - }, - { - tag: 'CharacterPlatform', - ja: { - title: 'CryptoAvatars', - url: 'https://cryptoavatars.io/home', - description: 'アバターの所有権と相互運用性を可能にするブロックチェーンプロトコル', - }, - en: { - title: 'CryptoAvatars', - url: 'https://cryptoavatars.io/home', - description: 'Blockchain protocol that enables ownership and interoperability of avatars', - }, - }, - { - tag: 'CharacterPlatform', - ja: { - title: 'VIPE - Virtual Persona', - url: 'https://vipe.io', - description: 'アーティストのためのオールインワンアバタープラットフォーム、マーケットプレイス、およびハブ', - }, - en: { - title: 'VIPE - Virtual Persona', - url: 'https://vipe.io', - description: 'All-in-One avatar platform, marketplace and hub for artists', - }, - }, - - // ImporterExporter - { - tag: 'ImporterExporter', - ja: { - title: 'UniVRM', - url: 'https://github.com/vrm-c/UniVRM/releases', - description: 'Unityエディタ拡張, Unityライブラリ。 `1.0` 版は `0.x` と両方がロードできます' - }, - en: { - title: 'UniVRM', - url: 'https://github.com/vrm-c/UniVRM/releases', - description: 'Unity editor extension, Unity library. `1.0` version can also load `0.x`', - }, - vrm: '1.0', - }, - { - tag: 'ImporterExporter', - ja: { - title: '@pixiv/three-vrm', - url: 'https://github.com/pixiv/three-vrm/', - description: 'Three.js用ライブラリ。従来のVRMとVRM 1.0の双方がロードできます' - }, - en: { - title: '@pixiv/three-vrm', - url: 'https://github.com/pixiv/three-vrm/', - description: 'A library for Three.js. Can load both past VRM and VRM 1.0', - }, - vrm: '1.0' - }, - { - tag: 'ImporterExporter', - ja: { - title: 'VRM Add-on for Blender', - url: 'https://vrm-addon-for-blender.info/ja', - description: 'Blenderアドオン' - }, - en: { - title: 'VRM Add-on for Blender', - url: 'https://vrm-addon-for-blender.info/en', - description: 'Blender add-on', - }, - }, - { - tag: 'ImporterExporter', - ja: { - title: 'VRM4U', - url: 'https://github.com/ruyo/VRM4U', - description: 'UnrealEngineプラグイン' - }, - en: { - title: 'VRM4U', - url: 'https://github.com/ruyo/VRM4U', - description: 'UnrealEngine plug-in', - }, - }, - { - tag: 'ImporterExporter', - ja: { - title: 'godot-vrm', - url: 'https://github.com/V-Sekai/godot-vrm', - description: 'Godotアドオン' - }, - en: { - title: 'godot-vrm', - url: 'https://github.com/V-Sekai/godot-vrm', - description: 'VRM addon for Godot', - }, - }, - { - tag: 'ImporterExporter', - ja: { - title: 'glTF-Maya-Exporter', - url: 'https://github.com/kashikacojp/glTF-Maya-Exporter', - description: 'Mayaスクリプト' - }, - en: { - title: 'glTF-Maya-Exporter', - url: 'https://github.com/kashikacojp/glTF-Maya-Exporter', - description: 'Maya script', - }, - }, - { - tag: 'ImporterExporter', - ja: { - title: 'VRM Converter for VRChat', - url: 'https://pokemori.booth.pm/items/1025226', - description: 'Unityエディタ拡張' - }, - en: { - title: 'VRM Converter for VRChat', - url: 'https://www.v-market.work/ec/items/122/detail/', - description: 'Unity editor extension', - }, - }, - { - tag: 'ImporterExporter', - ja: { - title: 'UniVRMExtensions', - url: 'https://pokemori.booth.pm/items/1788660', - description: 'Unityエディタ拡張' - }, - en: { - title: 'UniVRMExtensions', - url: 'https://www.v-market.work/ec/items/1066/detail/', - description: 'Unity editor extension', - }, - }, - - // CharacterCreation - { - tag: 'CharacterCreation', - ja: { - title: 'VRoid Studio', - url: 'https://vroid.com/studio/', - description: 'Windows, macOS' - }, - en: { - title: 'VRoid Studio', - url: 'https://vroid.com/en/studio/', - description: 'Windows, macOS', - }, - }, - { - tag: 'CharacterCreation', - ja: { - title: 'VRoid Mobile', - url: 'https://vroid.com/mobile/', - description: 'iOS, Android' - }, - en: { - title: 'VRoid Mobile', - url: 'https://vroid.com/en/mobile/', - description: 'iOS, Android', - }, - }, - { - tag: 'CharacterCreation', - ja: { - title: 'セシル変身アプリ', - url: 'https://fantia.jp/fanclubs/10552', - description: 'Windows, macOS' - }, - en: { - title: 'CecilHenShin', - url: 'https://fantia.jp/fanclubs/10552', - description: 'Windows, macOS', - }, - }, - - // Streaming - { - tag: 'Streaming', - ja: { - title: 'VDRAW', - url: 'https://sites.google.com/view/vdraw/', - description: 'Windows' - }, - en: { - title: 'VDRAW', - url: 'https://sites.google.com/view/vdraw/', - description: 'Windows ', - }, - }, - { - tag: 'Streaming', - ja: { - title: 'SHOWROOM V', - url: 'https://campaign.showroom-live.com/showroom-v/', - description: 'iOS' - }, - en: { - title: 'SHOWROOM V', - url: 'https://campaign.showroom-live.com/showroom-v/', - description: 'iOS ', - }, - }, - { - tag: 'Streaming', - ja: { - title: 'Hitogata', - url: 'https://sites.google.com/site/vhitogata/', - description: 'Windows' - }, - en: { - title: 'Hitogata', - url: 'https://sites.google.com/site/vhitogata/', - description: 'Windows ', - }, - }, - { - tag: 'Streaming', - ja: { - title: '3tene', - url: 'https://3tene.com/', - description: 'Windows, macOS' - }, - en: { - title: '3tene', - url: 'https://3tene.com/', - description: 'Windows, macOS', - }, - }, - { - tag: 'Streaming', - ja: { - title: 'Wakaru', - url: 'https://store.steampowered.com/app/870820/Wakaru_ver_beta/', - description: 'Windows' - }, - en: { - title: 'Wakaru', - url: 'https://store.steampowered.com/app/870820/Wakaru_ver_beta/', - description: 'Windows ', - }, - }, - { - tag: 'Streaming', - ja: { - title: 'バーチャルモーションキャプチャー', - url: 'https://sh-akira.github.io/VirtualMotionCapture/', - description: 'Windows VR' - }, - en: { - title: 'VirtualMotionCapture', - url: 'https://sh-akira.github.io/VirtualMotionCapture/', - description: 'Windows VR', - }, - }, - { - tag: 'Streaming', - ja: { - title: 'FaceVTuber', - url: 'https://facevtuber.com/', - description: 'Google Chrome' - }, - en: { - title: 'FaceVTuber', - url: 'https://facevtuber.com/', - description: 'Google Chrome', - }, - }, - { - tag: 'Streaming', - ja: { - title: 'LiveAvatar', - url: 'https://github.com/m2wasabi/LiveAvatar', - description: 'HTC VIVE' - }, - en: { - title: 'LiveAvatar', - url: 'https://github.com/m2wasabi/LiveAvatar', - description: 'HTC VIVE', - }, - }, - { - tag: 'Streaming', - ja: { - title: 'Luppet', - url: 'https://luppet.appspot.com/', - description: 'Windows + optional hand tracking' - }, - en: { - title: 'Luppet', - url: 'https://luppet.appspot.com/', - description: 'Windows + optional hand tracking', - }, - }, - { - tag: 'Streaming', - ja: { - title: 'vear', - url: 'https://apps.apple.com/jp/app/vear/id1490697369', - description: 'iOS' - }, - en: { - title: 'vear', - url: 'https://apps.apple.com/jp/app/vear/id1490697369', - description: 'iOS ', - }, - }, - { - tag: 'Streaming', - ja: { - title: 'CharWebCam', - url: 'https://github.com/xelloss120/CharWebCam', - description: 'Windows' - }, - en: { - title: 'CharWebCam', - url: 'https://github.com/xelloss120/CharWebCam', - description: 'Windows ', - }, - }, - { - tag: 'Streaming', - ja: { - title: 'VMagicMirror', - url: 'https://malaybaku.github.io/VMagicMirror/', - description: 'Windows' - }, - en: { - title: 'VMagicMirror', - url: 'https://malaybaku.github.io/VMagicMirror/en/', - description: 'Windows ', - }, - }, - { - tag: 'Streaming', - ja: { - title: '2DR', - url: 'https://2dr.info/', - description: 'iOS, Android' - }, - en: { - title: '2DR', - url: 'https://2dr.info/', - description: 'iOS, Android', - }, - }, - { - tag: 'Streaming', - ja: { - title: 'VUP-VTuber', - url: 'https://store.steampowered.com/app/1207050/VUPVTuber_Maker_Animation_MMDLive2D__facial_capture/', - description: 'Windows 10' - }, - en: { - title: 'VUP-VTuber', - url: 'https://store.steampowered.com/app/1207050/', - description: 'Windows 10', - }, - }, - { - tag: 'Streaming', - ja: { - title: 'ミチコンPlus', - url: 'https://www.next-system.com/michicon', - description: 'iOS' - }, - en: { - title: 'Michicon Plus', - url: 'https://www.next-system.com/michicon', - description: 'iOS ', - }, - }, - { - tag: 'Streaming', - ja: { - title: 'VOVOLA', - url: 'https://vovola.wixsite.com/website', - description: 'Windows 10' - }, - en: { - title: 'VOVOLA', - url: 'https://vovola.wixsite.com/website', - description: 'Windows 10', - }, - }, - { - tag: 'Streaming', - ja: { - title: 'VSeeFace', - url: 'https://www.vseeface.icu/', - description: 'Windows + optional hand tracking' - }, - en: { - title: 'VSeeFace', - url: 'https://www.vseeface.icu/', - description: 'Windows + optional hand tracking', - }, - }, - { - tag: 'Streaming', - ja: { - title: 'ZZ3D', - url: 'https://halmin.wixsite.com/zz3d', - description: 'iOS' - }, - en: { - title: 'ZZ3D', - url: 'https://halmin.wixsite.com/zz3d', - description: 'iOS ', - }, - }, - { - tag: 'Streaming', - ja: { - title: 'LIV', - url: 'https://liv.tv/', - description: 'Windows VR' - }, - en: { - title: 'LIV', - url: 'https://liv.tv/', - description: 'Windows VR', - }, - }, - { - tag: 'Streaming', - ja: { - title: 'Animaze by FaceRig', - url: 'https://store.steampowered.com/app/1364390/Animaze_by_FaceRig/', - description: 'Windows' - }, - en: { - title: 'Animaze by FaceRig', - url: 'https://store.steampowered.com/app/1364390/Animaze_by_FaceRig/', - description: 'Windows', - }, - }, - { - tag: 'Streaming', - ja: { - title: 'VTmini', - url: 'https://store.steampowered.com/app/1801480/VTmini/', - description: 'Windows' - }, - en: { - title: 'VTmini', - url: 'https://store.steampowered.com/app/1801480/VTmini/', - description: 'Windows ', - }, - }, - { - tag: 'Streaming', - ja: { - title: 'JINS MEME VTUNER', - url: 'https://apps.apple.com/jp/app/jins-meme-vtuner/id1554040568', - description: 'iOS' - }, - en: { - title: 'JINS MEME VTUNER', - url: 'https://apps.apple.com/jp/app/jins-meme-vtuner/id1554040568', - description: 'iOS ', - }, - }, - { - tag: 'Streaming', - ja: { - title: 'RiBLA Broadcast', - url: 'https://ribla-laboratory.booth.pm/items/3642935', - description: 'Windows, macOS' - }, - en: { - title: 'RiBLA Broadcast', - url: 'https://ribla-laboratory.booth.pm/items/3642935', - description: 'Windows, macOS', - }, - }, - { - tag: 'Streaming', - ja: { - title: 'Vフレット', - url: 'https://nkjzm.jp/vfret', - description: 'Windows, macOS' - }, - en: { - title: 'vfret', - url: 'https://nkjzm.jp/vfret', - description: 'Windows, macOS', - }, - }, - { - tag: 'Streaming', - ja: { - title: 'Avatar.Webcam', - url: 'https://avatar.webcam', - description: 'Windows, macOS' - }, - en: { - title: 'Avatar.Webcam', - url: 'https://avatar.webcam', - description: 'Windows, macOS', - }, - }, - // MotionCapture - { - tag: 'MotionCapture', - ja: { - title: 'TRACKING WORLD', - url: 'http://deatrathias.net/TW/', - description: 'Windows VR' - }, - en: { - title: 'TRACKING WORLD', - url: 'http://deatrathias.net/TW/', - description: 'Windows VR', - }, - }, - { - tag: 'MotionCapture', - ja: { - title: 'waidayo', - url: 'https://booth.pm/ja/items/1779185', - description: 'PC, iOS' - }, - en: { - title: 'waidayo', - url: 'https://booth.pm/ja/items/1779185', - description: 'PC, iOS', - }, - }, - { - tag: 'MotionCapture', - ja: { - title: 'ThreeDPoseTracker', - url: 'https://github.com/digital-standard/ThreeDPoseTracker', - description: 'Windows' - }, - en: { - title: 'ThreeDPoseTracker', - url: 'https://github.com/digital-standard/ThreeDPoseTracker', - description: 'Windows ', - }, - }, - { - tag: 'MotionCapture', - ja: { - title: 'TDPT', - url: 'https://digital-standard.com/tdpt_lp/', - description: 'iOS' - }, - en: { - title: 'TDPT', - url: 'https://digital-standard.com/tdpt_lp/', - description: 'iOS ', - }, - }, - { - tag: 'MotionCapture', - ja: { - title: 'EasyVirtualMotionCaptureForUnity', - url: 'https://booth.pm/ja/items/1801535', - description: 'Windows, Windows VR' - }, - en: { - title: 'EasyVirtualMotionCaptureForUnity', - url: 'https://booth.pm/ja/items/1801535', - description: 'Windows, Windows VR', - }, - }, - { - tag: 'MotionCapture', - ja: { - title: 'Webcam Motion Capture', - url: 'https://webcammotioncapture.info/ja/index.php', - description: 'Windows, macOS' - }, - en: { - title: 'Webcam Motion Capture', - url: 'https://webcammotioncapture.info/ja/index.php', - description: 'Windows, macOS', - }, - }, - { - tag: 'MotionCapture', - ja: { - title: 'iFacialMocap', - url: 'https://www.ifacialmocap.com/home/japanese/', - description: 'Windows, macOS, iOS' - }, - en: { - title: 'iFacialMocap', - url: 'https://www.ifacialmocap.com/home/japanese/', - description: 'Windows, macOS, iOS', - }, - }, - { - tag: 'MotionCapture', - ja: { - title: 'FACEMOTION3D', - url: 'https://apps.apple.com/jp/app/facemotion3d/id1507538005', - description: 'iOS' - }, - en: { - title: 'FACEMOTION3D', - url: 'https://apps.apple.com/jp/app/facemotion3d/id1507538005', - description: 'iOS ', - }, - }, - { - tag: 'MotionCapture', - ja: { - title: 'Kalidoface 3D', - url: 'https://github.com/yeemachine/kalidoface-3d', - description: 'Windows' - }, - en: { - title: 'Kalidoface 3D', - url: 'https://github.com/yeemachine/kalidoface-3d', - description: 'Windows ', - }, - }, - { - tag: 'MotionCapture', - ja: { - title: 'VIRTU: Avatar Camera', - url: 'https://virtu.booth.pm/items/3684467', - description: 'PC, [iOS](https://apps.apple.com/app/virtu-avatar-camera/id1597220065)' - }, - en: { - title: 'VIRTU: Avatar Camera', - url: 'https://virtu.booth.pm/items/3684467', - description: 'PC, [iOS](https://apps.apple.com/app/virtu-avatar-camera/id1597220065)', - }, - }, - { - tag: 'MotionCapture', - ja: { - title: 'VRigUnity', - url: 'https://github.com/Kariaro/VRigUnity', - description: 'Windows, macOS, Linux' - }, - en: { - title: 'VRigUnity', - url: 'https://github.com/Kariaro/VRigUnity', - description: 'Windows, macOS, Linux', - }, - }, - // Animation - { - tag: 'Animation', - ja: { - title: 'Ls ENGINE', - url: 'https://lsengine.net/', - description: 'Windows' - }, - en: { - title: 'Ls ENGINE', - url: 'https://lsengine.net/', - description: 'Windows ', - }, - }, - { - tag: 'Animation', - ja: { - title: 'AI4Animation', - url: 'https://github.com/t-takasaka/AI4Animation/tree/master/AI4Animation/Assets/Demo/ARKit', - description: 'Unityライブラリ' - }, - en: { - title: 'AI4Animation', - url: 'https://github.com/t-takasaka/AI4Animation/tree/master/AI4Animation/Assets/Demo/ARKit', - description: 'Unity library', - }, - }, - { - tag: 'Animation', - ja: { - title: 'Dance Dance Maker!', - url: 'https://booth.pm/ja/items/2216222', - description: 'Oculus Quest' - }, - en: { - title: 'Dance Dance Maker!', - url: 'https://booth.pm/ja/items/2216222', - description: 'Oculus Quest', - }, - }, - { - tag: 'Animation', - ja: { - title: 'DanceDreamMV', - url: 'https://maruapps.com/dancedreammv/', - description: 'iOS, Android' - }, - en: { - title: 'DanceDreamMV', - url: 'https://maruapps.com/dancedreammv/', - description: 'iOS, Android', - }, - }, - { - tag: 'Animation', - ja: { - title: 'Doll Dancer', - url: 'https://play.google.com/store/apps/details?id=com.personuo.dolldancer', - description: '[iOS](https://apps.apple.com/jp/app/doll-dancer-mmd-vroid-amv-app/id1394822854?platform=iphone), Android' - }, - en: { - title: 'Doll Dancer', - url: 'https://play.google.com/store/apps/details?id=com.personuo.dolldancer', - description: '[iOS](https://apps.apple.com/jp/app/doll-dancer-mmd-vroid-amv-app/id1394822854?platform=iphone), Android', - }, - }, - { - tag: 'Animation', - ja: { - title: 'Dan Sing Sing MV Maker', - url: 'https://vtubershop.booth.pm/items/3366941', - description: 'Windows' - }, - en: { - title: 'Dan Sing Sing MV Maker', - url: 'https://vtubershop.booth.pm/items/3366941', - description: 'Windows ', - }, - }, - { - tag: 'Animation', - ja: { - title: 'PlayAniMaker', - url: 'https://sites.google.com/view/playanimaker', - description: 'Windows VR, Oculus Quest', - }, - en: { - title: 'PlayAniMaker', - url: 'https://sites.google.com/view/playanimaker', - description: 'Windows VR, Oculus Quest', - }, - }, - // Photography - { - tag: 'Photography', - ja: { - title: 'VRMお人形遊びPC版', - url: 'https://120byte.booth.pm/items/1654585', - description: 'Windows' - }, - en: { - title: 'VRM Doll Play (PC)', - url: 'https://120byte.booth.pm/items/1654585', - description: 'Windows ', - }, - }, - { - tag: 'Photography', - ja: { - title: 'VRMお人形遊び', - url: 'https://120byte.booth.pm/items/1099618', - description: 'Windows VR' - }, - en: { - title: 'VRM Doll Play', - url: 'https://120byte.booth.pm/items/1099618', - description: 'Windows VR', - } - }, - { - tag: 'Photography', - ja: { - title: 'Vタビ', - url: 'https://app.famitsu.com/gametitle/8356/', - description: 'Android, iOS' - }, - en: { - title: 'Vtabi', - url: 'https://app.famitsu.com/gametitle/8356/', - description: 'Android, iOS', - } - }, - { - tag: 'Photography', - ja: { - title: 'Vismuth', - url: 'https://vismuth.com/', - description: 'Android, iOS' - }, - en: { - title: 'Vismuth', - url: 'https://vismuth.com/', - description: 'Android, iOS', - } - }, - { - tag: 'Photography', - ja: { - title: 'Vスタンプ', - url: 'https://bnut.jp/vstamp', - description: 'Android, iOS' - }, - en: { - title: 'vstamp', - url: 'https://bnut.jp/vstamp', - description: 'Android, iOS', - } - }, - { - tag: 'Photography', - ja: { - title: 'VRM Automatic Photographing', - url: 'https://matsuvr.booth.pm/items/2223918', - description: 'Windows 10' - }, - en: { - title: 'VRM Automatic Photographing', - url: 'https://matsuvr.booth.pm/items/2223918', - description: 'Windows 10', - } - }, - { - tag: 'Photography', - ja: { - title: 'VRMCardMaker', - url: 'https://booth.pm/ja/items/1808860', - description: 'Windows' - }, - en: { - title: 'VRMCardMaker', - url: 'https://booth.pm/ja/items/1808860', - description: 'Windows ', - } - }, - { - tag: 'Photography', - ja: { - title: 'Pose Arch', - url: 'https://apps.apple.com/jp/app/pose-arch/id1483326327', - description: 'iOS' - }, - en: { - title: 'Pose Arch', - url: 'https://apps.apple.com/jp/app/pose-arch/id1483326327', - description: 'iOS ', - }, - }, - { - tag: 'Photography', - ja: { - title: 'COCOPStudio', - url: 'https://cocop.site/cocopstudio/', - description: 'Android, iOS, Windows' - }, - en: { - title: 'COCOPStudio', - url: 'https://cocop.site/cocopstudio/', - description: 'Android, iOS, Windows', - } - }, - { - tag: 'Photography', - ja: { - title: 'Emmv Studio', - url: 'https://booth.pm/ja/items/2495794', - description: 'Windows' - }, - en: { - title: 'Emmv Studio', - url: 'https://booth.pm/ja/items/2495794', - description: 'Windows ', - } - }, - { - tag: 'Photography', - ja: { - title: 'PaSha!', - url: 'https://ayato3d.booth.pm/items/2202577', - description: 'Windows 10' - }, - en: { - title: 'PaSha!', - url: 'https://ayato3d.booth.pm/items/2202577', - description: 'Windows 10', - } - }, - { - tag: 'Photography', - ja: { - title: 'PoseMixerAR', - url: 'https://maruapps.com/posemixerar/', - description: 'Android, iOS' - }, - en: { - title: 'PoseMixerAR', - url: 'https://maruapps.com/posemixerar/', - description: 'Android, iOS', - } - }, - { - tag: 'Photography', - ja: { - title: 'VRMポージング', - url: 'https://store.steampowered.com/app/1895630/VRM_Posing_Desktop/', - description: '[Desktop](https://evelyngamedev.com/vrmposing-desktop/), [Mobile](https://evelyngamedev.com/vrmposing-mobile/)' - }, - en: { - title: 'VRM Posing', - url: 'https://store.steampowered.com/app/1895630/VRM_Posing_Desktop/', - description: '[Desktop](https://evelyngamedev.com/vrmposing-desktop/), [Mobile](https://evelyngamedev.com/vrmposing-mobile/)', - } - }, - // Metaverse - { - tag: 'Metaverse', - ja: { - title: 'バーチャルキャスト', - url: 'https://virtualcast.jp/', - description: ' [Windows VR](https://store.steampowered.com/app/947890/VirtualCast/), [Oculus Quest](https://www.oculus.com/experiences/quest/4174249979259348/)' - }, - en: { - title: 'VirtualCast', - url: 'https://virtualcast.jp/', - description: '[Windows VR](https://store.steampowered.com/app/947890/VirtualCast/), [Oculus Quest](https://www.oculus.com/experiences/quest/4174249979259348/)', - }, - vrm: '1.0' - }, - { - tag: 'Metaverse', - ja: { - title: 'cluster', - url: 'https://cluster.mu/', - description: ' PCVR, Windows, macOS, iOS, Android' - }, - en: { - title: 'cluster', - url: 'https://cluster.mu/', - description: 'PCVR, Windows, macOS, iOS, Android', - }, - }, - { - tag: 'Metaverse', - ja: { - title: 'Clarie', - url: 'https://biscrat.booth.pm/items/1193414', - description: ' Windows VR' - }, - en: { - title: 'Clarie', - url: 'https://biscrat.booth.pm/items/1193414', - description: 'Windows VR', - }, - }, - { - tag: 'Metaverse', - ja: { - title: 'Exokit', - url: 'https://github.com/exokitxr/avatars', - description: ' Windows, macOS, Linux, VR' - }, - en: { - title: 'Exokit', - url: 'https://github.com/exokitxr/avatars', - description: 'Windows, macOS, Linux, VR', - }, - }, - { - tag: 'Metaverse', - ja: { - title: 'TECO', - url: 'https://teco-vr.com/', - description: ' Windows, macOS, Oculus' - }, - en: { - title: 'TECO', - url: 'https://teco-vr.com/', - description: 'Windows, macOS, Oculus', - }, - }, - { - tag: 'Metaverse', - ja: { - title: 'コラボル', - url: 'https://brother-pv.booth.pm/items/2016717', - description: ' Windows VR' - }, - en: { - title: 'Collaboll', - url: 'https://brother-pv.booth.pm/items/2016717', - description: 'Windows VR', - }, - }, - { - tag: 'Metaverse', - ja: { - title: 'Webaverse', - url: 'https://webaverse.com/', - description: ' Web browser' - }, - en: { - title: 'Webaverse', - url: 'https://webaverse.com/', - description: 'Web browser', - }, - }, - { - tag: 'Metaverse', - ja: { - title: 'ambr', - url: 'https://ambr.co.jp/', - description: ' Windows VR, macOS' - }, - en: { - title: 'ambr', - url: 'https://ambr.co.jp/', - description: 'Windows VR, macOS', - }, - }, - { - tag: 'Metaverse', - ja: { - title: 'Connect Chat', - url: 'https://store.steampowered.com/app/1424930/Connect_Chat/', - description: ' Windows VR' - }, - en: { - title: 'Connect Chat', - url: 'https://store.steampowered.com/app/1424930/Connect_Chat/', - description: 'Windows VR', - }, - }, - { - tag: 'Metaverse', - ja: { - title: 'VZero', - url: 'https://facevtuber.com/vzero/', - description: ' Web browser' - }, - en: { - title: 'VZero', - url: 'https://facevtuber.com/vzero/', - description: 'Web browser', - }, - }, - { - tag: 'Metaverse', - ja: { - title: 'Substrata', - url: 'https://substrata.info/', - description: ' Windows, MacOS, Linux' - }, - en: { - title: 'Substrata', - url: 'https://substrata.info/', - description: 'Windows, MacOS, Linux', - }, - }, - { - tag: 'Metaverse', - ja: { - title: 'Hyperfy', - url: 'https://hyperfy.io/', - description: ' Web browser, mobile ↔️ VR' - }, - en: { - title: 'Hyperfy', - url: 'https://hyperfy.io/', - description: 'Web browser, mobile ↔️ VR', - }, - }, - { - tag: 'Metaverse', - ja: { - title: 'Mona', - url: 'https://monaverse.com', - description: ' Web browser' - }, - en: { - title: 'Mona', - url: 'https://monaverse.com', - description: 'Web browser', - }, - vrm: '1.0' - }, - // Game - { - tag: 'Game', - ja: { - title: 'Vワールド', - url: 'https://naby.booth.pm/items/990663', - description: 'Windows' - }, - en: { - title: 'VWorld', - url: 'https://naby.booth.pm/items/990663', - description: 'Windows ', - }, - }, - { - tag: 'Game', - ja: { - title: 'SEIYA', - url: 'https://wandv.jp/seiya/', - description: 'Windows VR' - }, - en: { - title: 'SEIYA', - url: 'https://wandv.jp/seiya/', - description: 'Windows VR', - }, - }, - { - tag: 'Game', - ja: { - title: 'BONFIRE~焚き火~', - url: 'https://orenodinner.booth.pm/items/952450', - description: 'Oculus Go' - }, - en: { - title: 'BONFIRE', - url: 'https://orenodinner.booth.pm/items/952450', - description: 'Oculus Go', - }, - }, - { - tag: 'Game', - ja: { - title: 'つんつんVR', - url: 'https://store.steampowered.com/app/867090/VR__TSUNTSUN_VR/', - description: 'Windows VR' - }, - en: { - title: 'TSUN-TSUN VR', - url: 'https://store.steampowered.com/app/867090/VR__TSUNTSUN_VR/', - description: 'Windows VR', - }, - }, - { - tag: 'Game', - ja: { - title: 'コロコロシステム', - url: 'https://www.mediaplex.co.jp/korokoro/', - description: 'Oculus Rift' - }, - en: { - title: 'KOROKORO System', - url: 'https://www.mediaplex.co.jp/korokoro/', - description: 'Oculus Rift', - }, - }, - { - tag: 'Game', - ja: { - title: 'パイロットクロス', - url: 'https://n-mattun.booth.pm/', - description: 'Windows VR' - }, - en: { - title: 'PilotXross', - url: 'https://n-mattun.booth.pm/', - description: 'Windows VR', - }, - }, - { - tag: 'Game', - ja: { - title: 'プリミティア', - url: 'https://store.steampowered.com/app/1745170/Primitier/', - description: 'Windows VR' - }, - en: { - title: 'Primitier', - url: 'https://store.steampowered.com/app/1745170/Primitier/', - description: 'Windows VR', - }, - }, - { - tag: 'Game', - ja: { - title: 'Synth Riders', - url: 'https://store.steampowered.com/app/885000/Synth_Riders/', - description: 'Windows VR' - }, - en: { - title: 'Synth Riders', - url: 'https://store.steampowered.com/app/885000/Synth_Riders/', - description: 'Windows VR', - }, - }, - { - tag: 'Game', - ja: { - title: 'SOUNDART', - url: 'https://store.steampowered.com/app/1144460/SOUNDART/', - description: 'Windows VR' - }, - en: { - title: 'SOUNDART', - url: 'https://store.steampowered.com/app/1144460/SOUNDART/', - description: 'Windows VR', - }, - }, - { - tag: 'Game', - ja: { - title: 'VRAST!', - url: 'https://rc-cobalt.booth.pm/items/1756359', - description: 'Windows' - }, - en: { - title: 'VRAST!', - url: 'https://rc-cobalt.booth.pm/items/1756359', - description: 'Windows ', - }, - }, - { - tag: 'Game', - ja: { - title: 'Legend of the Shieldbearers', - url: 'https://www.spacepupstudio.com/lots', - description: 'Oculus Rift/Oculus Quest' - }, - en: { - title: 'Legend of the Shieldbearers', - url: 'https://www.spacepupstudio.com/lots', - description: 'Oculus Rift/Oculus Quest', - }, - }, - { - tag: 'Game', - ja: { - title: 'BOW MAN', - url: 'https://bowman.vrlab.dmm.com/ja/', - description: 'Windows VR' - }, - en: { - title: 'BOW MAN', - url: 'https://bowman.vrlab.dmm.com/ja/', - description: 'Windows VR', - }, - }, - { - tag: 'Game', - ja: { - title: 'Craftopia', - url: 'https://store.steampowered.com/app/1307550/Craftopia/', - description: 'Windows' - }, - en: { - title: 'Craftopia', - url: 'https://store.steampowered.com/app/1307550/Craftopia/', - description: 'Windows ', - }, - }, - { - tag: 'Game', - ja: { - title: 'RESONARK X', - url: 'https://store.steampowered.com/app/1366570/RESONARK_X/', - description: 'Windows VR, [Oculus Quest](https://www.oculus.com/experiences/quest/3405379359561787/)' - }, - en: { - title: 'RESONARK X', - url: 'https://store.steampowered.com/app/1366570/RESONARK_X/', - description: 'Windows VR, [Oculus Quest](https://www.oculus.com/experiences/quest/3405379359561787/)', - }, - }, - { - tag: 'Game', - ja: { - title: 'ラクキン', - url: 'https://rakugaki-kingdom.com/', - description: 'iOS, Android' - }, - en: { - title: 'Rakugaki Kingdom', - url: 'https://rakugaki-kingdom.com/', - description: 'iOS, Android', - }, - }, - { - tag: 'Game', - ja: { - title: 'FantasySeed', - url: 'https://booth.pm/ja/items/1293100', - description: 'Windows' - }, - en: { - title: 'FantasySeed', - url: 'https://booth.pm/ja/items/1293100', - description: 'Windows', - }, - }, - { - tag: 'Game', - ja: { - title: 'Roduet', - url: 'https://fujisunflower.booth.pm/items/2510498', - description: 'Windows' - }, - en: { - title: 'Roduet', - url: 'https://fujisunflower.booth.pm/items/2510498', - description: 'Windows ', - }, - }, - { - tag: 'Game', - ja: { - title: 'Cube Art World', - url: 'https://simplestar-game.booth.pm/items/2622434', - description: 'Windows' - }, - en: { - title: 'Cube Art World', - url: 'https://simplestar-game.booth.pm/items/2622434', - description: 'Windows ', - }, - }, - { - tag: 'Game', - ja: { - title: 'TouroReminiscence', - url: 'https://booth.pm/ja/items/2349960', - description: 'Windows' - }, - en: { - title: 'TouroReminiscence', - url: 'https://booth.pm/ja/items/2349960', - description: 'Windows ', - }, - }, - { - tag: 'Game', - ja: { - title: 'VRM Cyber walk', - url: 'https://ktamayan.booth.pm/items/2790105', - description: 'Windows' - }, - en: { - title: 'VRM Cyber walk', - url: 'https://ktamayan.booth.pm/items/2790105', - description: 'Windows ', - }, - }, - { - tag: 'Game', - ja: { - title: 'Virtual Home Run Derby', - url: 'https://paldynojosh.booth.pm/items/1485218', - description: 'Windows' - }, - en: { - title: 'Virtual Home Run Derby', - url: 'https://paldynojosh.booth.pm/items/1485218', - description: 'Windows ', - }, - }, - { - tag: 'Game', - ja: { - title: 'フードデリバリーバトル', - url: 'https://store.steampowered.com/app/1708710/Food_Delivery_Battle/', - description: 'Windows' - }, - en: { - title: 'Food Delivery Battle', - url: 'https://store.steampowered.com/app/1708710/Food_Delivery_Battle/', - description: 'Windows ', - }, - }, - { - tag: 'Game', - ja: { - title: '古銭プッシャーフレンズ', - url: 'https://store.steampowered.com/app/1722020/Old_Coin_Pusher_Friends/', - description: 'Windows' - }, - en: { - title: 'Old Coin Pusher Friends', - url: 'https://store.steampowered.com/app/1722020/Old_Coin_Pusher_Friends/', - description: 'Windows ', - }, - }, - { - tag: 'Game', - ja: { - title: 'AVATAVI', - url: 'https://avatavi.com/jp/index.html', - description: 'iOS' - }, - en: { - title: 'AVATAVI', - url: 'https://avatavi.com/jp/index.html', - description: 'iOS ', - }, - }, - // WebBrowser - { - tag: 'WebBrowser', - ja: { - title: 'あけろ!爆裂駐車場!', - url: 'https://unityroom.com/games/bakuretsu', - description: '' - }, - en: { - title: 'Bakuretsu Parking Lot', - url: 'https://unityroom.com/games/bakuretsu', - description: 'Web browser', - }, - }, - { - tag: 'WebBrowser', - ja: { - title: 'スーパーエクストリームVRMサッカー', - url: 'https://unityroom.com/games/hyperdimension-virtual-super-extreme-vrm-soccer', - description: '' - }, - en: { - title: 'Super Extreme VRM Soccer', - url: 'https://unityroom.com/games/hyperdimension-virtual-super-extreme-vrm-soccer', - description: 'Web browser', - }, - }, - { - tag: 'WebBrowser', - ja: { - title: '密ッションインポッシブル', - url: 'https://unityroom.com/games/mitsussion', - description: '' - }, - en: { - title: 'Mission Impossible', - url: 'https://unityroom.com/games/mitsussion', - description: 'Web browser', - }, - }, - { - tag: 'WebBrowser', - ja: { - title: 'スーパーVRMブラザーズ3D', - url: 'https://unityroom.com/games/aguroshoutest', - description: '' - }, - en: { - title: 'Super VRM Brothers 3D', - url: 'https://unityroom.com/games/aguroshoutest', - description: 'Web browser', - }, - }, - { - tag: 'WebBrowser', - ja: { - title: 'ペースアップ!', - url: 'https://unityroom.com/games/paseup', - description: '' - }, - en: { - title: 'Pace Up !', - url: 'https://unityroom.com/games/paseup', - description: 'Web browser', - }, - }, - { - tag: 'WebBrowser', - ja: { - title: '二輪VRM', - url: 'https://unityroom.com/games/vrm_bike', - description: '' - }, - en: { - title: 'VRM Bike', - url: 'https://unityroom.com/games/vrm_bike', - description: 'Web browser', - }, - }, - { - tag: 'WebBrowser', - ja: { - title: 'VRM三段跳び', - url: 'https://unityroom.com/games/vrmtriplejump', - description: '' - }, - en: { - title: 'VRM Triple Jump', - url: 'https://unityroom.com/games/vrmtriplejump', - description: 'Web browser', - }, - }, - { - tag: 'WebBrowser', - ja: { - title: '(超)STEP PANEL MATCH', - url: 'https://unityroom.com/games/step-panel-match', - description: '' - }, - en: { - title: 'Step Panel Match', - url: 'https://unityroom.com/games/step-panel-match', - description: 'Web browser', - }, - }, - { - tag: 'WebBrowser', - ja: { - title: 'Vブレード', - url: 'https://unityroom.com/games/vblade', - description: '' - }, - en: { - title: 'V Blade', - url: 'https://unityroom.com/games/vblade', - description: 'Web browser', - }, - }, - // Viweer - { - tag: 'Viewer', - ja: { - title: 'Babylon VRM Viewer', - url: 'https://github.com/virtual-cast/babylon-vrm-loader/', - description: 'Babylon.js拡張 ' - }, - en: { - title: 'Babylon VRM Viewer', - url: 'https://github.com/virtual-cast/babylon-vrm-loader/', - description: 'Babylon.js extension', - }, - }, - { - tag: 'Viewer', - ja: { - title: 'VPocket', - url: 'https://booooooh.booth.pm/items/1033823', - description: 'Android, iOS ' - }, - en: { - title: 'VPocket', - url: 'https://booooooh.booth.pm/items/1033823', - description: 'Android, iOS', - }, - }, - { - tag: 'Viewer', - ja: { - title: 'VRMビュアー', - url: 'https://w.atwiki.jp/beamman/', - description: 'Windows ' - }, - en: { - title: 'VRMViewer', - url: 'https://w.atwiki.jp/beamman/', - description: 'Windows ', - }, - }, - { - tag: 'Viewer', - ja: { - title: 'VRM Viewer', - url: 'https://vrm-viewer.yukimochi.io/', - description: 'Webブラウザ ' - }, - en: { - title: 'VRM Viewer', - url: 'https://vrm-viewer.yukimochi.io/', - description: 'Web browser', - }, - }, - { - tag: 'Viewer', - ja: { - title: 'VRMQuickLook', - url: 'https://github.com/magicien/VRMQuickLook', - description: 'macOS ' - }, - en: { - title: 'VRMQuickLook', - url: 'https://github.com/magicien/VRMQuickLook', - description: 'macOS ', - }, - }, - { - tag: 'Viewer', - ja: { - title: 'VRM Live Viewer', - url: 'https://booth.pm/ja/items/1783082', - description: 'Windows ' - }, - en: { - title: 'VRM Live Viewer', - url: 'https://booth.pm/ja/items/1783082', - description: 'Windows ', - }, - }, - { - tag: 'Viewer', - ja: { - title: 'UniWinApi Example project', - url: 'https://github.com/kirurobo/UniWinApi', - description: 'Unityライブラリ ' - }, - en: { - title: 'UniWinApi Example project', - url: 'https://github.com/kirurobo/UniWinApi', - description: 'Unity library', - }, - }, - { - tag: 'Viewer', - ja: { - title: 'KinectV2VRM', - url: 'https://github.com/m2wasabi/KinectV2VRM', - description: 'Unityライブラリ ' - }, - en: { - title: 'KinectV2VRM', - url: 'https://github.com/m2wasabi/KinectV2VRM', - description: 'Unity library', - }, - }, - { - tag: 'Viewer', - ja: { - title: 'MocuMocuVRM', - url: 'http://www.vrai.jp/vr_mocuvrm.html', - description: 'Windows VR, Looking Glass ' - }, - en: { - title: 'MocuMocuVRM', - url: 'http://www.vrai.jp/vr_mocuvrm.html', - description: 'Windows VR, Looking Glass', - }, - }, - { - tag: 'Viewer', - ja: { - title: 'VRM Display', - url: 'https://akarimichi.github.io/vrm-display-releases/', - description: 'Windows ' - }, - en: { - title: 'VRM Display', - url: 'https://akarimichi.github.io/vrm-display-releases/', - description: 'Windows ', - }, - }, - { - tag: 'Viewer', - ja: { - title: 'Desktop Magic Engine', - url: 'https://store.steampowered.com/app/1096550/Desktop_Magic_Engine/', - description: 'Windows ' - }, - en: { - title: 'Desktop Magic Engine', - url: 'https://store.steampowered.com/app/1096550/Desktop_Magic_Engine/', - description: 'Windows ', - }, - }, - { - tag: 'Viewer', - ja: { - title: 'TSO AR Viewer', - url: 'https://seed.online/static/guide-arviewer', - description: 'Android, iOS ' - }, - en: { - title: 'TSO AR Viewer', - url: 'https://seed.online/static/guide-arviewer', - description: 'Android, iOS', - }, - }, - // UsingInternally - { - tag: 'UsingInternally', - ja: { - title: 'Vカツ', - url: 'http://vkatsu.jp/', - description: 'Windows, iOS, Android ' - }, - en: { - title: 'Vkatsu', - url: 'http://vkatsu.jp/', - description: 'Windows, iOS, Android', - }, - }, - { - tag: 'UsingInternally', - ja: { - title: 'カスタムキャスト', - url: 'https://customcast.jp/', - description: 'iOS, Android ' - }, - en: { - title: 'Custom Cast', - url: 'https://customcast.jp/', - description: 'iOS, Android', - }, - }, - { - tag: 'UsingInternally', - ja: { - title: 'REALITY', - url: 'https://reality.wrightflyer.net/', - description: 'iOS, Android ' - }, - en: { - title: 'REALITY', - url: 'https://reality.wrightflyer.net/', - description: 'iOS, Android', - }, - }, - { - tag: 'UsingInternally', - ja: { - title: 'パペ文字', - url: 'https://www.puppemoji.com/', - description: 'iOS ' - }, - en: { - title: 'Puppemoji', - url: 'https://www.puppemoji.com/', - description: 'iOS ', - }, - }, - { - tag: 'UsingInternally', - ja: { - title: 'メイアライブオーダーメイド版', - url: 'https://materializer.co/lab/mayalive', - description: 'Windows, macOS ' - }, - en: { - title: 'Mayalive Order Made Version', - url: 'https://materializer.co/lab/mayalive', - description: 'Windows, macOS', - }, - }, - { - tag: 'UsingInternally', - ja: { - title: 'MakeAvatar', - url: 'https://gugenka.jp/digital/make_avatar.php', - description: 'iOS, Android ' - }, - en: { - title: 'MakeAvatar', - url: 'https://gugenka.jp/digital/make_avatar.php', - description: 'iOS, Android', - }, - }, - // Otehr - { - tag: 'Other', - ja: { - title: 'VRMLoaderUI', - url: 'https://github.com/m2wasabi/VRMLoaderUI', - description: 'Unityライブラリ ' - }, - en: { - title: 'VRMLoaderUI', - url: 'https://github.com/m2wasabi/VRMLoaderUI', - description: 'Unity library', - }, - }, - { - tag: 'Other', - ja: { - title: 'テアトル', - url: 'https://teator.jp/', - description: 'Windows 10 ' - }, - en: { - title: 'TEATOR', - url: 'https://teator.jp/', - description: 'Windows 10', - }, - }, - { - tag: 'Other', - ja: { - title: 'NeoRoidHub for Unity', - url: 'https://neoseast-japan.booth.pm/items/2562276', - description: 'Unityエディタ拡張 ' - }, - en: { - title: 'NeoRoidHub for Unity', - url: 'https://neoseast-japan.booth.pm/items/2562276', - description: 'Unity editor extension', - }, - }, - { - tag: 'Other', - ja: { - title: 'Virtual Presentation Space', - url: 'https://eyesout.itch.io/virtual-presentation-space', - description: 'Windows VR ' - }, - en: { - title: 'Virtual Presentation Space', - url: 'https://eyesout.itch.io/virtual-presentation-space', - description: 'Windows VR', - }, - }, - { - tag: 'Other', - ja: { - title: 'VTuber Editor', - url: 'https://store.steampowered.com/app/1454500/VTuber_Editor/', - description: 'Windows ' - }, - en: { - title: 'VTuber Editor', - url: 'https://store.steampowered.com/app/1454500/VTuber_Editor/', - description: 'Windows ', - }, - }, - { - tag: 'Other', - ja: { - title: 'ACUAH β', - url: 'https://riemgoshawk.booth.pm/items/1990160', - description: 'Android ' - }, - en: { - title: 'ACUAH β', - url: 'https://riemgoshawk.booth.pm/items/1990160', - description: 'Android ', - }, - }, - { - tag: 'Other', - ja: { - title: 'TIFA', - url: 'https://melonspeedruns.itch.io/tifa', - description: 'Windows ' - }, - en: { - title: 'TIFA', - url: 'https://melonspeedruns.itch.io/tifa', - description: 'Windows ', - }, - }, - { - tag: 'Other', - ja: { - title: 'STYLY', - url: 'https://styly.cc/', - description: 'Windows, Windows VR, Android, iOS ' - }, - en: { - title: 'STYLY', - url: 'https://styly.cc/', - description: 'Windows, Windows VR, Android, iOS', - }, - }, - { - tag: 'Other', - ja: { - title: '[HANA] BlendShapeをコントロールするツール', - url: 'https://kuniyan.booth.pm/items/2437978', - description: 'Windows ' - }, - en: { - title: '[HANA_Tool_v2] Control BlendShapes Tool', - url: 'https://kuniyan.booth.pm/items/2604269', - description: 'Windows ', - }, - }, - { - tag: 'Other', - ja: { - title: 'Virtual Studio', - url: 'https://natsunatsu.booth.pm/items/2956377', - description: 'Windows ' - }, - en: { - title: 'Virtual Studio', - url: 'https://natsunatsu.booth.pm/items/2956377', - description: 'Windows ', - }, - }, - { - tag: 'Other', - ja: { - title: 'VRM表情設定するやつ', - url: 'https://120byte.booth.pm/items/2152326', - description: 'Windows ' - }, - en: { - title: 'VRM facial setting', - url: 'https://120byte.booth.pm/items/2152326', - description: 'Windows ', - }, - }, - { - tag: 'Other', - ja: { - title: 'VRMテクスチャ差し替えるやつ', - url: 'https://120byte.booth.pm/items/2177538', - description: 'Windows ' - }, - en: { - title: 'VRM texture replace', - url: 'https://120byte.booth.pm/items/2177538', - description: 'Windows ', - }, - }, - { - tag: 'Other', - ja: { - title: 'アイテムショップ', - url: 'https://suzuki-cecil.booth.pm/items/3250368', - description: 'Windows ' - }, - en: { - title: 'Item Shop', - url: 'https://suzuki-cecil.booth.pm/items/3250368', - description: 'Windows ', - }, - }, - { - tag: 'Other', - ja: { - title: 'meebits-blender-utils', - url: 'https://github.com/MeebitsDAO/meebits-blender-utils', - description: 'Windows ' - }, - en: { - title: 'meebits-blender-utils', - url: 'https://github.com/MeebitsDAO/meebits-blender-utils', - description: 'Windows ', - }, - }, - { - tag: 'Other', - ja: { - title: 'The Meebits - Larva Labs', - url: 'https://meebits.larvalabs.com/', - description: 'Windows ' - }, - en: { - title: 'The Meebits - Larva Labs', - url: 'https://meebits.larvalabs.com/', - description: 'Windows ', - }, - }, - { - tag: 'Other', - ja: { - title: 'ミロックプラス', - url: 'https://www.miloq-plus.com/', - description: 'Android, iOS ' - }, - en: { - title: 'miloq plus', - url: 'https://www.miloq-plus.com/', - description: 'Android, iOS', - }, - }, - { - tag: 'Other', - ja: { - title: 'SimpleURPToonLitOutlineExample', - url: 'https://github.com/simplestargame/SimpleURPToonLitOutlineExample', - description: 'Windows ' - }, - en: { - title: 'SimpleURPToonLitOutlineExample', - url: 'https://github.com/simplestargame/SimpleURPToonLitOutlineExample', - description: 'Windows ', - }, - }, - { - tag: 'Other', - ja: { - title: 'Kalidokit', - url: 'https://github.com/yeemachine/kalidokit', - description: 'Windows ' - }, - en: { - title: 'Kalidokit', - url: 'https://github.com/yeemachine/kalidokit', - description: 'Windows ', - }, - }, - { - tag: 'Other', - ja: { - title: 'Wicked Engine', - url: 'https://github.com/turanszkij/WickedEngine', - description: 'Windows, Linux, Xbox Series, PlayStation 5 ' - }, - en: { - title: 'Wicked Engine', - url: 'https://github.com/turanszkij/WickedEngine', - description: 'Windows, Linux, Xbox Series, PlayStation 5', - }, - }, -]; - - -function sortUsers() { - let result = Users; - // // Sort by site name - // result = sortBy(result, (user) => user.title.toLowerCase()); - // // Sort by favorite tag, favorites first - // result = sortBy(result, (user) => !user.tags.includes('favorite')); - return result; -} - -export const sortedUsers = sortUsers(); - diff --git a/src/pages/showcase/_components/ShowcaseCard/index.tsx b/src/pages/showcase/_components/ShowcaseCard/index.tsx index 017e73ff7..139a0fac1 100644 --- a/src/pages/showcase/_components/ShowcaseCard/index.tsx +++ b/src/pages/showcase/_components/ShowcaseCard/index.tsx @@ -1,23 +1,12 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - import React from "react"; import clsx from "clsx"; +import Markdown from "react-markdown"; import Link from "@docusaurus/Link"; -import Translate from "@docusaurus/Translate"; import Image from "@theme/IdealImage"; -import { type User, type UserInfo } from "@site/src/data/users"; -import { Tags, TagList, type TagType, type Tag } from "@site/src/data/tags"; - -import { sortBy } from "@site/src/data/jsUtils"; import Heading from "@theme/Heading"; -import Tooltip from "../ShowcaseTooltip"; +import { type UserInfo } from "@site/src/data/user"; + import styles from "./styles.module.css"; -import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; function getCardImage(user: UserInfo): string { return ( @@ -43,7 +32,9 @@ function ShowcaseCard({ user }: { user: UserInfo }) { -

    {user.description}

    +
    + {user.description} +
    ); diff --git a/src/pages/showcase/index.tsx b/src/pages/showcase/index.tsx index 577af24a3..bb09fb231 100644 --- a/src/pages/showcase/index.tsx +++ b/src/pages/showcase/index.tsx @@ -1,5 +1,4 @@ import React from "react"; -import Markdown from "react-markdown"; import clsx from "clsx"; import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; @@ -10,8 +9,10 @@ import ExecutionEnvironment from "@docusaurus/ExecutionEnvironment"; import Heading from "@theme/Heading"; import Layout from "@theme/Layout"; -import { sortedUsers, type User, type UserInfo } from "@site/src/data/users"; -import { Tags, TagList, type TagType } from "@site/src/data/tags"; +import { users } from "@site/src/data/users"; +import { type User, type UserInfo } from "@site/src/data/user"; +import { tags } from "@site/src/data/tags"; +import { type Tag } from "@site/src/data/tag"; import ShowcaseCard from "./_components/ShowcaseCard"; import ShowcaseFilterToggle, { @@ -35,22 +36,13 @@ export function prepareUserState(): UserState | undefined { return undefined; } -const TITLE = translate({ message: "Docusaurus Site Showcase" }); -const DESCRIPTION = translate({ - message: "List of websites people are building with Docusaurus", -}); -const SUBMIT_URL = "https://github.com/facebook/docusaurus/discussions/7826"; - function filterUsers( users: User[], - selectedTags: TagType[], + selectedTags: Tag[], operator: Operator, - searchName: string | null + searchName: string | null, + currentLocale: string ) { - const { - i18n: { currentLocale }, - } = useDocusaurusContext(); - if (searchName) { // eslint-disable-next-line no-param-reassign users = users.filter((user) => @@ -89,8 +81,8 @@ function ShowcaseFilters() {
      - {TagList.map((tag, i) => { - const { ja, en, color } = Tags[tag]; + {tags.map((tagInfo, i) => { + const { tag, ja, en, color } = tagInfo; const id = `showcase_checkbox_id_${tag}`; const label = currentLocale == "ja" ? ja : en; const description = currentLocale == "ja" ? ja : en; @@ -107,19 +99,15 @@ function ShowcaseFilters() { id={id} label={label} icon={ - tag === "favorite" ? ( - - ) : ( - - ) + } /> @@ -131,40 +119,6 @@ function ShowcaseFilters() { ); } -function Row(props: { user: User; lang: string }) { - const { user, lang } = props; - const info = user[lang]; - const tag = Tags[user.tag]; - // const debug = true; - const debug = false; - return ( - <> - - {tag[lang]} - - {info.title} - - - {info.description} - - {user.vrm} - - {debug && user["en"] && ( - - {tag["en"]} - - {user["en"].title} - - - {user["en"].description} - - {user.vrm} - - )} - - ); -} - type UserState = { scrollTopPosition: number; focusedElementId: string | undefined; @@ -189,7 +143,7 @@ function useFilteredUsers() { const location = useLocation(); const [operator, setOperator] = React.useState("OR"); // On SSR / first mount (hydration) no tag is selected - const [selectedTags, setSelectedTags] = React.useState([]); + const [selectedTags, setSelectedTags] = React.useState([]); const [searchName, setSearchName] = React.useState(null); // Sync tags from QS to state (delayed on purpose to avoid SSR/Client // hydration mismatch) @@ -200,16 +154,16 @@ function useFilteredUsers() { restoreUserState(location.state); }, [location]); + const { + i18n: { currentLocale }, + } = useDocusaurusContext(); + return React.useMemo( - () => filterUsers(sortedUsers, selectedTags, operator, searchName), + () => filterUsers(users, selectedTags, operator, searchName, currentLocale), [selectedTags, operator, searchName] ); } -// function ShowcaseCard({ user }: { user: User }) { -// return <>{user.ja.title}; -// } - function SearchBar() { const history = useHistory(); const location = useLocation(); @@ -267,14 +221,14 @@ function ShowcaseCards() { return (
      - {filteredUsers.length === sortedUsers.length ? ( + {filteredUsers.length === users.length ? ( <>
      All sites
        - {sortedUsers.map((user) => ( + {users.map((user) => ( -
      + > From dd7e9ce57fac114c6d437491c0253d88051aa214 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Mon, 29 Jan 2024 14:53:29 +0900 Subject: [PATCH 3/4] tag --- .../_components/ShowcaseCard/index.tsx | 31 ++++++++++++++++++- src/pages/showcase/index.tsx | 2 ++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/pages/showcase/_components/ShowcaseCard/index.tsx b/src/pages/showcase/_components/ShowcaseCard/index.tsx index 139a0fac1..110df620e 100644 --- a/src/pages/showcase/_components/ShowcaseCard/index.tsx +++ b/src/pages/showcase/_components/ShowcaseCard/index.tsx @@ -5,9 +5,32 @@ import Link from "@docusaurus/Link"; import Image from "@theme/IdealImage"; import Heading from "@theme/Heading"; import { type UserInfo } from "@site/src/data/user"; +import { tags } from "@site/src/data/tags"; +import { type TagInfo } from "@site/src/data/tag"; +import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; import styles from "./styles.module.css"; +const TagComp = React.forwardRef( + ({ tag, color, ja, en }, ref) => { + const { + i18n: { currentLocale }, + } = useDocusaurusContext(); + + return ( +
    • + + {currentLocale == "ja" ? ja : en} + + +
    • + ); + } +); + function getCardImage(user: UserInfo): string { return ( user.preview ?? @@ -17,8 +40,11 @@ function getCardImage(user: UserInfo): string { ); } -function ShowcaseCard({ user }: { user: UserInfo }) { +function ShowcaseCard({ user, tag }: { user: UserInfo; tag: string }) { const image = getCardImage(user); + + const tagObj = tags.find((x) => x.tag == tag); + return (
    • @@ -36,6 +62,9 @@ function ShowcaseCard({ user }: { user: UserInfo }) { {user.description}
      +
        + +
    • ); } diff --git a/src/pages/showcase/index.tsx b/src/pages/showcase/index.tsx index bb09fb231..65fcf0247 100644 --- a/src/pages/showcase/index.tsx +++ b/src/pages/showcase/index.tsx @@ -232,6 +232,7 @@ function ShowcaseCards() { ))}
    @@ -247,6 +248,7 @@ function ShowcaseCards() { ))} From 191a2d589b60d96134f8db9d5e2794ac28475a3a Mon Sep 17 00:00:00 2001 From: ousttrue Date: Mon, 29 Jan 2024 15:07:19 +0900 Subject: [PATCH 4/4] check link --- src/data/users.ts | 259 +++++++++--------- .../_components/ShowcaseCard/index.tsx | 20 +- 2 files changed, 139 insertions(+), 140 deletions(-) diff --git a/src/data/users.ts b/src/data/users.ts index 19059f19f..f2877f055 100644 --- a/src/data/users.ts +++ b/src/data/users.ts @@ -50,17 +50,6 @@ export const users: User[] = [ }, "vrm": "1.0" }, - { - "tag": "CharacterPlatform", - "ja": { - "title": "DMM VR CONNECT", - "url": "https://connect.vrlab.dmm.com/" - }, - "en": { - "title": "DMM VR CONNECT", - "url": "https://connect.vrlab.dmm.com/" - } - }, { "tag": "CharacterPlatform", "ja": { @@ -434,19 +423,6 @@ export const users: User[] = [ "preview": "https://malaybaku.github.io/VMagicMirror/images/home/gallery_00.png" } }, - { - "tag": "Streaming", - "ja": { - "title": "2DR", - "url": "https://2dr.info/", - "description": "iOS, Android" - }, - "en": { - "title": "2DR", - "url": "https://2dr.info/", - "description": "iOS, Android" - } - }, { "tag": "Streaming", "ja": { @@ -932,19 +908,6 @@ export const users: User[] = [ "preview": "https://app.famitsu.com/wp-content/uploads/2019/02/icon-53.jpg" } }, - { - "tag": "Photography", - "ja": { - "title": "Vismuth", - "url": "https://vismuth.com/", - "description": "Android, iOS" - }, - "en": { - "title": "Vismuth", - "url": "https://vismuth.com/", - "description": "Android, iOS" - } - }, { "tag": "Photography", "ja": { @@ -1284,19 +1247,6 @@ export const users: User[] = [ "preview": "https://booth.pximg.net/c/620x620/45af98ee-8bb1-483d-92af-237a94be8384/i/990663/23408896-9e22-48f6-992d-0dd78f077b1a_base_resized.jpg" } }, - { - "tag": "Game", - "ja": { - "title": "SEIYA", - "url": "https://wandv.jp/seiya/", - "description": "Windows VR" - }, - "en": { - "title": "SEIYA", - "url": "https://wandv.jp/seiya/", - "description": "Windows VR" - } - }, { "tag": "Game", "ja": { @@ -1432,19 +1382,6 @@ export const users: User[] = [ "preview": "https://lh4.googleusercontent.com/f776QxmrcZmhgIgx2OnAKnN-v_RFH_SgoGOP4fz5G7TxBe6aCUbBBeontNNp-ENz-CvskL3_ZSXf6l16TdtTSJ8=w16383" } }, - { - "tag": "Game", - "ja": { - "title": "BOW MAN", - "url": "https://bowman.vrlab.dmm.com/ja/", - "description": "Windows VR" - }, - "en": { - "title": "BOW MAN", - "url": "https://bowman.vrlab.dmm.com/ja/", - "description": "Windows VR" - } - }, { "tag": "Game", "ja": { @@ -1475,19 +1412,6 @@ export const users: User[] = [ "preview": "https://cdn.akamai.steamstatic.com/steam/apps/1366570/capsule_616x353.jpg?t=1616769503" } }, - { - "tag": "Game", - "ja": { - "title": "ラクキン", - "url": "https://rakugaki-kingdom.com/", - "description": "iOS, Android" - }, - "en": { - "title": "Rakugaki Kingdom", - "url": "https://rakugaki-kingdom.com/", - "description": "iOS, Android" - } - }, { "tag": "Game", "ja": { @@ -1785,19 +1709,6 @@ export const users: User[] = [ "preview": "https://img.atwiki.jp/beamman/attach/13/163/vrm.png" } }, - { - "tag": "Viewer", - "ja": { - "title": "VRM Viewer", - "url": "https://vrm-viewer.yukimochi.io/", - "description": "Webブラウザ " - }, - "en": { - "title": "VRM Viewer", - "url": "https://vrm-viewer.yukimochi.io/", - "description": "Web browser" - } - }, { "tag": "Viewer", "ja": { @@ -1901,32 +1812,6 @@ export const users: User[] = [ "preview": "https://cdn.akamai.steamstatic.com/steam/apps/1096550/capsule_616x353.jpg?t=1652877726" } }, - { - "tag": "Viewer", - "ja": { - "title": "TSO AR Viewer", - "url": "https://seed.online/static/guide-arviewer", - "description": "Android, iOS " - }, - "en": { - "title": "TSO AR Viewer", - "url": "https://seed.online/static/guide-arviewer", - "description": "Android, iOS" - } - }, - { - "tag": "UsingInternally", - "ja": { - "title": "Vカツ", - "url": "http://vkatsu.jp/", - "description": "Windows, iOS, Android " - }, - "en": { - "title": "Vkatsu", - "url": "http://vkatsu.jp/", - "description": "Windows, iOS, Android" - } - }, { "tag": "UsingInternally", "ja": { @@ -2219,19 +2104,6 @@ export const users: User[] = [ "preview": "https://meebits.app/public/images/homepage/group.jpg" } }, - { - "tag": "Other", - "ja": { - "title": "ミロックプラス", - "url": "https://www.miloq-plus.com/", - "description": "Android, iOS " - }, - "en": { - "title": "miloq plus", - "url": "https://www.miloq-plus.com/", - "description": "Android, iOS" - } - }, { "tag": "Other", "ja": { @@ -2276,5 +2148,134 @@ export const users: User[] = [ "description": "Windows, Linux, Xbox Series, PlayStation 5", "preview": "https://repository-images.githubusercontent.com/37770961/c7a169f3-f000-4351-aa94-78cf1d79c7c4" } - } + }, + // + { + "tag": "CharacterPlatform", + "ja": { + "title": "DMM VR CONNECT", + "url": "https://connect.vrlab.dmm.com/" + }, + "en": { + "title": "DMM VR CONNECT", + "url": "https://connect.vrlab.dmm.com/" + } + }, + { + "tag": "Game", + "ja": { + "title": "BOW MAN", + "url": "https://bowman.vrlab.dmm.com/ja/", + "description": "Windows VR" + }, + "en": { + "title": "BOW MAN", + "url": "https://bowman.vrlab.dmm.com/ja/", + "description": "Windows VR" + } + }, + { + "tag": "Streaming", + "ja": { + "title": "2DR", + "url": "https://2dr.info/", + "description": "iOS, Android" + }, + "en": { + "title": "2DR", + "url": "https://2dr.info/", + "description": "iOS, Android" + } + }, + { + "tag": "Photography", + "ja": { + "title": "Vismuth", + "url": "https://vismuth.com/", + "description": "Android, iOS" + }, + "en": { + "title": "Vismuth", + "url": "https://vismuth.com/", + "description": "Android, iOS" + } + }, + { + "tag": "Game", + "ja": { + "title": "SEIYA", + "url": "https://wandv.jp/seiya/", + "description": "Windows VR" + }, + "en": { + "title": "SEIYA", + "url": "https://wandv.jp/seiya/", + "description": "Windows VR" + } + }, + { + "tag": "Game", + "ja": { + "title": "ラクキン", + "url": "https://rakugaki-kingdom.com/", + "description": "iOS, Android" + }, + "en": { + "title": "Rakugaki Kingdom", + "url": "https://rakugaki-kingdom.com/", + "description": "iOS, Android" + } + }, + { + "tag": "Viewer", + "ja": { + "title": "VRM Viewer", + "url": "https://vrm-viewer.yukimochi.io/", + "description": "Webブラウザ " + }, + "en": { + "title": "VRM Viewer", + "url": "https://vrm-viewer.yukimochi.io/", + "description": "Web browser" + } + }, + { + "tag": "Viewer", + "ja": { + "title": "TSO AR Viewer", + "url": "https://seed.online/static/guide-arviewer", + "description": "Android, iOS " + }, + "en": { + "title": "TSO AR Viewer", + "url": "https://seed.online/static/guide-arviewer", + "description": "Android, iOS" + } + }, + { + "tag": "UsingInternally", + "ja": { + "title": "Vカツ", + "url": "http://vkatsu.jp/", + "description": "Windows, iOS, Android " + }, + "en": { + "title": "Vkatsu", + "url": "http://vkatsu.jp/", + "description": "Windows, iOS, Android" + } + }, + { + "tag": "Other", + "ja": { + "title": "ミロックプラス", + "url": "https://www.miloq-plus.com/", + "description": "Android, iOS " + }, + "en": { + "title": "miloq plus", + "url": "https://www.miloq-plus.com/", + "description": "Android, iOS" + } + }, ]; diff --git a/src/pages/showcase/_components/ShowcaseCard/index.tsx b/src/pages/showcase/_components/ShowcaseCard/index.tsx index 110df620e..204368aee 100644 --- a/src/pages/showcase/_components/ShowcaseCard/index.tsx +++ b/src/pages/showcase/_components/ShowcaseCard/index.tsx @@ -31,24 +31,22 @@ const TagComp = React.forwardRef( } ); -function getCardImage(user: UserInfo): string { - return ( - user.preview ?? - `https://slorber-api-screenshot.netlify.app/${encodeURIComponent( - user.url - )}/showcase` - ); -} +// function getCardImage(user: UserInfo): string { +// return ( +// user.preview ?? +// `https://slorber-api-screenshot.netlify.app/${encodeURIComponent( +// user.url +// )}/showcase` +// ); +// } function ShowcaseCard({ user, tag }: { user: UserInfo; tag: string }) { - const image = getCardImage(user); - const tagObj = tags.find((x) => x.tag == tag); return (
  • - {user.title} + {user.preview ? {user.title} : ""}