├── .gitattributes
├── .gitignore
├── docs
├── public
│ ├── images
│ │ ├── ogimg.jpg
│ │ ├── ja
│ │ │ └── common
│ │ │ │ └── installwithvpm
│ │ │ │ ├── wd1.png
│ │ │ │ ├── wd2.png
│ │ │ │ ├── start.png
│ │ │ │ ├── install1.png
│ │ │ │ ├── install2.png
│ │ │ │ ├── install3.png
│ │ │ │ ├── install4.png
│ │ │ │ ├── package.png
│ │ │ │ ├── setting.png
│ │ │ │ ├── addproject.png
│ │ │ │ └── manageproject.png
│ │ ├── icon_warning.svg
│ │ ├── icon_info.svg
│ │ ├── icon_danger.svg
│ │ ├── icon_tip.svg
│ │ └── logo.svg
│ └── scripts
│ │ ├── init.js
│ │ ├── script.js
│ │ ├── lightbox.min.js
│ │ └── jquery.min.js
├── ja
│ ├── world
│ │ └── index.md
│ ├── avatar
│ │ ├── index.md
│ │ ├── optimization.md
│ │ └── modification_by_lil.md
│ ├── common
│ │ ├── index.md
│ │ ├── installwithvpm.md
│ │ └── makevpmrepos.md
│ ├── index.md
│ └── publish.md
├── .vitepress
│ ├── theme
│ │ ├── styles
│ │ │ ├── twemoji.css
│ │ │ └── custom.css
│ │ ├── index.ts
│ │ └── md
│ │ │ ├── markdownItToc.ts
│ │ │ ├── markdownItTwemoji.ts
│ │ │ ├── markdownItMDinMD.ts
│ │ │ ├── markdownItImage.ts
│ │ │ └── twemoji.js
│ └── config
│ │ ├── index.mts
│ │ ├── shared.ts
│ │ └── ja.ts
└── index.md
├── package.json
├── .github
└── workflows
│ └── deploy.yml
└── LICENSE
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Vitepress
2 | /node_modules
3 | /docs/.vitepress/cache
4 | /docs/.vitepress/dist
5 |
--------------------------------------------------------------------------------
/docs/public/images/ogimg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lilxyzw/matome/main/docs/public/images/ogimg.jpg
--------------------------------------------------------------------------------
/docs/ja/world/index.md:
--------------------------------------------------------------------------------
1 | # ワールド編
2 |
3 | ここにはワールド制作で使える知識がまとめています。
4 |
5 | ## ページ一覧
6 |
7 | ::: warning
8 | 工事中です。
9 | :::
--------------------------------------------------------------------------------
/docs/public/images/ja/common/installwithvpm/wd1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lilxyzw/matome/main/docs/public/images/ja/common/installwithvpm/wd1.png
--------------------------------------------------------------------------------
/docs/public/images/ja/common/installwithvpm/wd2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lilxyzw/matome/main/docs/public/images/ja/common/installwithvpm/wd2.png
--------------------------------------------------------------------------------
/docs/public/images/ja/common/installwithvpm/start.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lilxyzw/matome/main/docs/public/images/ja/common/installwithvpm/start.png
--------------------------------------------------------------------------------
/docs/public/images/ja/common/installwithvpm/install1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lilxyzw/matome/main/docs/public/images/ja/common/installwithvpm/install1.png
--------------------------------------------------------------------------------
/docs/public/images/ja/common/installwithvpm/install2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lilxyzw/matome/main/docs/public/images/ja/common/installwithvpm/install2.png
--------------------------------------------------------------------------------
/docs/public/images/ja/common/installwithvpm/install3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lilxyzw/matome/main/docs/public/images/ja/common/installwithvpm/install3.png
--------------------------------------------------------------------------------
/docs/public/images/ja/common/installwithvpm/install4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lilxyzw/matome/main/docs/public/images/ja/common/installwithvpm/install4.png
--------------------------------------------------------------------------------
/docs/public/images/ja/common/installwithvpm/package.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lilxyzw/matome/main/docs/public/images/ja/common/installwithvpm/package.png
--------------------------------------------------------------------------------
/docs/public/images/ja/common/installwithvpm/setting.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lilxyzw/matome/main/docs/public/images/ja/common/installwithvpm/setting.png
--------------------------------------------------------------------------------
/docs/public/images/ja/common/installwithvpm/addproject.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lilxyzw/matome/main/docs/public/images/ja/common/installwithvpm/addproject.png
--------------------------------------------------------------------------------
/docs/public/images/ja/common/installwithvpm/manageproject.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lilxyzw/matome/main/docs/public/images/ja/common/installwithvpm/manageproject.png
--------------------------------------------------------------------------------
/docs/public/images/icon_warning.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/docs/.vitepress/theme/styles/twemoji.css:
--------------------------------------------------------------------------------
1 | img.emoji {
2 | height: 1em;
3 | width: 1em;
4 | margin: 0 .05em 0 .1em;
5 | vertical-align: -0.1em;
6 | display: inline-block !important;
7 | }
--------------------------------------------------------------------------------
/docs/public/images/icon_info.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/docs/public/images/icon_danger.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/docs/.vitepress/config/index.mts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vitepress'
2 | import { shared } from './shared'
3 | import { ja } from './ja'
4 |
5 | export default defineConfig({
6 | ...shared,
7 | locales: {
8 | root: { label: '日本語', ...ja }
9 | }
10 | })
11 |
--------------------------------------------------------------------------------
/docs/ja/avatar/index.md:
--------------------------------------------------------------------------------
1 | # アバター編
2 |
3 | ここにはアバターの制作や改変に使える知識がまとめています。
4 |
5 | ## ページ一覧
6 |
7 |
--------------------------------------------------------------------------------
/docs/ja/common/index.md:
--------------------------------------------------------------------------------
1 | # 共通編
2 |
3 | ここにはアバターでもワールドでも使える知識がまとめています。
4 |
5 | ## ページ一覧
6 |
7 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "devDependencies": {
3 | "@types/jquery": "^3.5.29",
4 | "vitepress": "^1.0.2"
5 | },
6 | "scripts": {
7 | "docs:dev": "vitepress dev docs",
8 | "docs:build": "vitepress build docs",
9 | "docs:preview": "vitepress preview docs"
10 | },
11 | "dependencies": {
12 | "jquery": "^3.7.1",
13 | "lightbox2": "^2.11.4"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/docs/ja/index.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: home
3 |
4 | hero:
5 | name: "Unityまとめ部"
6 | text: ""
7 | tagline: "UnityやBlenderなどの情報のまとめページです。"
8 | actions:
9 | - theme: brand
10 | text: 共通
11 | link: /ja/common/
12 | - theme: alt
13 | text: アバター編
14 | link: /ja/avatar/
15 | - theme: alt
16 | text: ワールド編(準備中)
17 | link: /ja/world/
18 | ---
19 |
--------------------------------------------------------------------------------
/docs/public/scripts/init.js:
--------------------------------------------------------------------------------
1 | var scripts = ['/matome/scripts/jquery.min.js', '/matome/scripts/lightbox.min.js', '/matome/scripts/script.js'];
2 | var i = 0;
3 |
4 | function appendScript() {
5 | var script = document.createElement('script');
6 | script.src = scripts[i];
7 | document.body.appendChild(script);
8 |
9 | if (i++ < 2) {
10 | script.onload = appendScript;
11 | }
12 | }
13 |
14 | appendScript();
--------------------------------------------------------------------------------
/docs/public/images/icon_tip.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/docs/index.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: home
3 |
4 | hero:
5 | name: "Unityまとめ部"
6 | text: ""
7 | tagline: "UnityやBlenderなどの情報のまとめページです。"
8 | image:
9 | src: /images/logo.svg
10 | alt: lilycalInventory Logo
11 | actions:
12 | - theme: brand
13 | text: 共通
14 | link: /ja/common/
15 | - theme: alt
16 | text: アバター編
17 | link: /ja/avatar/
18 | - theme: alt
19 | text: ワールド編(準備中)
20 | link: /ja/world/
21 | ---
22 |
--------------------------------------------------------------------------------
/docs/.vitepress/theme/index.ts:
--------------------------------------------------------------------------------
1 | import type { EnhanceAppContext } from 'vitepress'
2 | import DefaultTheme from 'vitepress/theme'
3 | import './styles/twemoji.css'
4 | import 'lightbox2/dist/css/lightbox.min.css'
5 | import './styles/custom.css'
6 |
7 | export default {
8 | ...DefaultTheme,
9 | enhanceApp(ctx: EnhanceAppContext) {
10 | if (!import.meta.env.SSR) {
11 | var script = document.createElement('script');
12 | script.src = '/matome/scripts/init.js';
13 | document.body.appendChild(script);
14 | }
15 | }
16 | }
--------------------------------------------------------------------------------
/docs/.vitepress/theme/md/markdownItToc.ts:
--------------------------------------------------------------------------------
1 | import type { PluginSimple } from "markdown-it";
2 |
3 | const markdownItToc: PluginSimple = (md) => {
4 | const defaultRender =
5 | md.renderer.rules.toc_body ||
6 | function (tokens, idx, options, env, self) {
7 | return self.renderToken(tokens, idx, options);
8 | };
9 |
10 | md.renderer.rules.toc_body = function (tokens, idx, options, env, self) {
11 | var result = 'もくじ
';
12 | result += defaultRender(tokens, idx, options, env, self);
13 | return result;
14 | }
15 | };
16 |
17 | export default markdownItToc;
--------------------------------------------------------------------------------
/docs/.vitepress/theme/md/markdownItTwemoji.ts:
--------------------------------------------------------------------------------
1 | import type { PluginSimple } from "markdown-it";
2 | import { twemoji } from './twemoji';
3 |
4 | const markdownItTwemoji: PluginSimple = (md) => {
5 | var defaultRender =
6 | md.renderer.rules.text ||
7 | function (tokens, idx, options, env, self) {
8 | return self.renderToken(tokens, idx, options);
9 | };
10 |
11 | md.renderer.rules.text = function (tokens, idx, options, env, self) {
12 | tokens[idx].content = twemoji.parse(tokens[idx].content);
13 | return defaultRender(tokens, idx, options, env, self);
14 | }
15 | };
16 |
17 | export default markdownItTwemoji;
--------------------------------------------------------------------------------
/docs/.vitepress/theme/md/markdownItMDinMD.ts:
--------------------------------------------------------------------------------
1 | import type { PluginSimple } from "markdown-it";
2 | import fs from 'fs';
3 |
4 | // #include "docs/ja/include.md"
5 | const reg = /#include "(.+)"/;
6 |
7 | const markdownItMDinMD: PluginSimple = (md) => {
8 | const parse = (src) => {
9 | var cap;
10 | while(cap = reg.exec(src)) {
11 | var path = cap[1].trim();
12 | var txt = parse(fs.readFileSync(path, 'utf8'));
13 | src = src.substring(0, cap.index) + txt + src.substring(cap.index + cap[0].length);
14 | }
15 | return src;
16 | };
17 |
18 | md.core.ruler.before('normalize', 'markdownItMDinMD', (s) => s.src = parse(s.src));
19 | };
20 |
21 | export default markdownItMDinMD;
--------------------------------------------------------------------------------
/docs/.vitepress/theme/md/markdownItImage.ts:
--------------------------------------------------------------------------------
1 | import type { PluginSimple } from "markdown-it";
2 |
3 | const markdownItImage: PluginSimple = (md) => {
4 | const defaultRender =
5 | md.renderer.rules.image ||
6 | function (tokens, idx, options, env, self) {
7 | return self.renderToken(tokens, idx, options);
8 | };
9 |
10 | md.renderer.rules.image = function (tokens, idx, options, env, self) {
11 | const token = tokens[idx];
12 | if(token.attrs != null)
13 | {
14 | var result = '';
17 | result += defaultRender(tokens, idx, options, env, self);
18 | result += '';
19 | return result;
20 | }
21 | return defaultRender(tokens, idx, options, env, self);
22 | }
23 | };
24 |
25 | export default markdownItImage;
--------------------------------------------------------------------------------
/docs/public/scripts/script.js:
--------------------------------------------------------------------------------
1 | lightbox.option({
2 | 'fadeDuration': 300,
3 | 'imageFadeDuration': 300,
4 | 'resizeDuration': 200
5 | });
6 |
7 | function fadeAnime(){
8 | $('.vp-doc > div > *').each(function(){
9 | var elemPos = $(this).offset().top;
10 | var scroll = $(window).scrollTop();
11 | var windowHeight = $(window).height();
12 | if (scroll >= elemPos - windowHeight - 50){
13 | $(this).addClass('fadeUp');
14 | }
15 | });
16 | }
17 |
18 | function countOl(){
19 | $("ol").each(function() {
20 | $(this).css({
21 | 'counterReset': 'cnt ' + ($(this).attr("start") - 1)
22 | });
23 | });
24 | };
25 |
26 | function init(){
27 | fadeAnime();
28 | countOl();
29 | };
30 |
31 | $(window).on('scroll', fadeAnime);
32 | $(window).on('load', init);
33 |
34 | var config = { attributes: true };
35 |
36 | var modoc = new MutationObserver(init);
37 | var mo = new MutationObserver(function() {
38 | init();
39 | modoc.observe(document.querySelector('.vp-doc'), config);
40 | });
41 |
42 | var vpdoc = document.querySelector('.vp-doc');
43 | if(vpdoc) modoc.observe(vpdoc, config);
44 | mo.observe(document.querySelector('.VPContent'), config);
--------------------------------------------------------------------------------
/docs/.vitepress/config/shared.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vitepress'
2 | import markdownItTwemoji from '../theme/md/markdownItTwemoji'
3 | import markdownItImage from '../theme/md/markdownItImage'
4 | import markdownItToc from '../theme/md/markdownItToc'
5 | import markdownItMDinMD from '../theme/md/markdownItMDinMD'
6 |
7 | export const shared = defineConfig({
8 | base: '/matome/',
9 | title: "Unityまとめ部",
10 | head: [
11 | ['link', {rel: 'icon', type: 'image/svg+xml', href: '/matome/images/logo.svg'}],
12 | ['meta', {property: 'og:type', content: 'website'}],
13 | ['meta', {property: 'og:image', content: 'https://lilxyzw.github.io/matome/images/ogimg.jpg'}],
14 | ['meta', {property: 'twitter:card', content: 'summary'}],
15 | ['link', {rel: 'preconnect', href: 'https://fonts.googleapis.com'}],
16 | ['link', {rel: 'preconnect', href: 'https://fonts.gstatic.com', crossorigin: ''}],
17 | ['link', {href: 'https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@100..900&family=Noto+Sans+Mono:wght@500&display=swap', rel: 'stylesheet'}],
18 | ],
19 | themeConfig: {
20 | logo: '/images/logo.svg',
21 | socialLinks: [
22 | { icon: 'github', link: 'https://github.com/lilxyzw/matome' }
23 | ],
24 | footer: {
25 | message: 'Released under the CC BY 4.0.',
26 | copyright: 'Copyright @ 2024-present authors'
27 | },
28 | editLink: {
29 | pattern: 'https://github.com/lilxyzw/matome/edit/main/docs/:path',
30 | text: 'Edit this page on GitHub'
31 | },
32 | search: {
33 | provider: 'local'
34 | }
35 | },
36 | lastUpdated: true,
37 | markdown: {
38 | config: (md) => {
39 | md.use(markdownItTwemoji)
40 | md.use(markdownItImage)
41 | md.use(markdownItToc)
42 | md.use(markdownItMDinMD)
43 | }
44 | }
45 | })
46 |
--------------------------------------------------------------------------------
/docs/ja/publish.md:
--------------------------------------------------------------------------------
1 | # ページの編集・追加について
2 |
3 | 基本的にはGitHubの[Pull Request](https://github.com/coreybutler/nvm-windows/pulls)で書いたマークダウンを投げるだけですが、実際の環境でどのように表示されるのかを確認したい場合のために執筆環境の構築方法を記載します。
4 |
5 | [[toc]]
6 |
7 | ## 環境構築手順(Windows)
8 |
9 | 1. [matome](https://github.com/lilxyzw/matome)をclone
10 |
11 | 2. [NVM for Windows](https://github.com/coreybutler/nvm-windows/releases)をインストール(既にnvm環境がある場合はそれでも可)
12 |
13 | 3. コマンドプロンプトを開き`nvm list available`コマンドを実行しバージョンを確認
14 |
15 | 4. `nvm install [バージョン番号]`でNode.jsをインストールし、`nvm use [バージョン番号]`でインストールしたものを有効化(インストールするバージョンは基本的にLTSの最新で大丈夫かと思われます。)
16 |
17 | 5. `cd [ディレクトリ]`コマンドで手順1でcloneしたディレクトリに移動
18 | ```
19 | matome ← このフォルダ
20 | ├ .github
21 | ├ docs
22 | ├ .gitattributes
23 | ├ .gitignore
24 | ├ LICENSE
25 | ├ package-lock.json
26 | ├ package.json
27 | ```
28 |
29 | 6. `npm ci`コマンドを実行(前提パッケージがインストールされます)
30 |
31 | 7. `npm run docs:dev`コマンドを実行(ページのプレビューが開始されます)
32 |
33 | 8. ブラウザで`http://localhost:5173/matome/`を開きプレビュー
34 |
35 | ## 既存のページの編集
36 |
37 | ページの編集については`docs/ja/...`フォルダのマークダウンを編集し、該当ページをブラウザで確認するだけです。
38 |
39 | ## 新規ページの作成
40 |
41 | ページを作成する場合はマークダウンの作成に加え、サイトマップにリンクを追加する必要があります。
42 |
43 | 1. `docs/ja/...`フォルダに移動し中にマークダウンを作成
44 |
45 | 2. 同一階層の`index.md`に作ったページへのリンクを追加
46 |
47 | 3. `docs/.vitepress/config/ja.ts`に作ったページへのリンクを追加
48 |
49 | 4. ブラウザで確認
50 |
51 | ## 画像や動画の追加について
52 |
53 | 画像や動画は`docs/public/images/ja/...`にマークダウンファイルと同じ名前のフォルダを作成しその中に配置してください。例えば`docs/public/images/ja/common/xxx/yyy.png`はマークダウンに``と書くことで参照できます。動画の場合、``のように参照できます。
54 |
55 | ## 最終確認
56 |
57 | Pull Requestを投げる前に実際にページをビルドして確認します。
58 |
59 | 1. コマンドプロンプトで`ctrl + C`でプレビューを停止
60 |
61 | 2. `npm run docs:build`コマンドを実行(ビルドが行われ、問題があればどこにエラーがあるかが表示されます)
62 |
63 | 3. `npm run docs:preview`コマンドを実行(ビルドしたもののプレビューが開始されます)
64 |
65 | 4. ブラウザで`http://localhost:4173/matome/`を開き最終確認
66 |
67 | 5. 問題なければGitHubでPull Requestを投げる
--------------------------------------------------------------------------------
/.github/workflows/deploy.yml:
--------------------------------------------------------------------------------
1 | # Sample workflow for building and deploying a VitePress site to GitHub Pages
2 | #
3 | name: Deploy VitePress site to Pages
4 |
5 | on:
6 | # Runs on pushes targeting the `main` branch. Change this to `master` if you're
7 | # using the `master` branch as the default branch.
8 | push:
9 | branches: [main]
10 |
11 | # Allows you to run this workflow manually from the Actions tab
12 | workflow_dispatch:
13 |
14 | # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
15 | permissions:
16 | contents: read
17 | pages: write
18 | id-token: write
19 |
20 | # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
21 | # However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
22 | concurrency:
23 | group: pages
24 | cancel-in-progress: false
25 |
26 | jobs:
27 | # Build job
28 | build:
29 | runs-on: ubuntu-latest
30 | steps:
31 | - name: Checkout
32 | uses: actions/checkout@v4
33 | with:
34 | fetch-depth: 0 # Not needed if lastUpdated is not enabled
35 | # - uses: pnpm/action-setup@v3 # Uncomment this if you're using pnpm
36 | # - uses: oven-sh/setup-bun@v1 # Uncomment this if you're using Bun
37 | - name: Setup Node
38 | uses: actions/setup-node@v4
39 | with:
40 | node-version: 20
41 | cache: npm # or pnpm / yarn
42 | - name: Setup Pages
43 | uses: actions/configure-pages@v4
44 | - name: Install dependencies
45 | run: npm ci # or pnpm install / yarn install / bun install
46 | - name: Build with VitePress
47 | run: npm run docs:build # or pnpm docs:build / yarn docs:build / bun run docs:build
48 | - name: Upload artifact
49 | uses: actions/upload-pages-artifact@v3
50 | with:
51 | path: docs/.vitepress/dist
52 |
53 | # Deployment job
54 | deploy:
55 | environment:
56 | name: github-pages
57 | url: ${{ steps.deployment.outputs.page_url }}
58 | needs: build
59 | runs-on: ubuntu-latest
60 | name: Deploy
61 | steps:
62 | - name: Deploy to GitHub Pages
63 | id: deployment
64 | uses: actions/deploy-pages@v4
--------------------------------------------------------------------------------
/docs/.vitepress/config/ja.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vitepress'
2 |
3 | const langName = '/ja';
4 |
5 | export const ja = defineConfig({
6 | lang: 'ja-JP',
7 | description: "UnityやBlenderなどの情報のまとめページです。",
8 | themeConfig: {
9 | logo: '/images/logo.svg',
10 | nav: [
11 | { text: 'ホーム', link: langName + '/' },
12 | { text: '共通', link: langName + '/common/', activeMatch: '/common/' },
13 | { text: 'アバター', link: langName + '/avatar/', activeMatch: '/avatar/' },
14 | { text: 'ワールド', link: langName + '/world/', activeMatch: '/world/' }
15 | ],
16 | sidebar: [
17 | {
18 | text: '共通',
19 | link: langName + '/common/',
20 | collapsed: false,
21 | items: [
22 | { text: '【脱unitypackage】ツールのインポートにVPMを使ってみよう', link: langName + '/common/installwithvpm' },
23 | { text: '【開発者向け】自作物をVPM・VCC対応する方法', link: langName + '/common/makevpmrepos' }
24 | ]
25 | },
26 | {
27 | text: 'アバター',
28 | link: langName + '/avatar/',
29 | collapsed: false,
30 | items: [
31 | { text: 'VRChatアバター最適化・軽量化【脱Very Poor】', link: langName + '/avatar/optimization' },
32 | { text: 'VRChatアバター 改変の流儀(by lil)', link: langName + '/avatar/modification_by_lil' }
33 | ]
34 | },
35 | {
36 | text: 'ワールド',
37 | link: langName + '/world/',
38 | collapsed: false
39 | },
40 | {
41 | text: 'ページの編集・追加について',
42 | link: langName + '/publish',
43 | collapsed: false
44 | }
45 | ],
46 | search: {
47 | provider: 'local',
48 | options: {
49 | locales: {
50 | ja: {
51 | translations: {
52 | button: {
53 | buttonText: '検索',
54 | buttonAriaLabel: '検索'
55 | },
56 | modal: {
57 | noResultsText: '見つかりませんでした。',
58 | resetButtonTitle: '検索条件を削除',
59 | footer: {
60 | selectText: '選択',
61 | navigateText: '切り替え'
62 | }
63 | }
64 | }
65 | }
66 | }
67 | }
68 | },
69 | lastUpdated: {
70 | text: 'Updated at',
71 | formatOptions: {
72 | dateStyle: 'full',
73 | timeStyle: 'medium'
74 | }
75 | }
76 | }
77 | })
78 |
--------------------------------------------------------------------------------
/docs/ja/common/installwithvpm.md:
--------------------------------------------------------------------------------
1 | # ツールのインポートにVPMを使ってみよう【脱unitypackage】
2 |
3 | [[toc]]
4 |
5 | ## VPMって……?
6 |
7 | VRChat公式が用意しているツールをお手軽インストールできる仕組みです。公式のVRCSDKだけではなく有志が作ったツールもお手軽インストールでき、この仕組みを使うとわざわざダウンロードページに行かなくてもボタン1つで簡単にアップデートができるようになります!
8 |
9 | ## VPMを使うには
10 |
11 | 有志が作った[ALCOM](https://vrc-get.anatawa12.com/alcom/)というソフトがあり、これを使えばVPMの仕組みを簡単に利用できるようになります!
12 |
13 | ## ALCOMのインストール
14 |
15 | 1. [公式ページ](https://vrc-get.anatawa12.com/alcom/)のダウンロードボタンからインストーラーをダウンロードしましょう。
16 |
17 | 2. インストーラーを起動しようとすると警告が表示されることがありますが、以下の画像の通りにクリックして起動しましょう。
18 |
19 | 
20 |
21 | 
22 |
23 | 3. インストーラーのNextボタンをクリックしてインストールを進めましょう。
24 |
25 | 
26 |
27 | 
28 |
29 | 
30 |
31 | 
32 |
33 | 4. これでインストールは完了です!ショートカットか検索バーからALCOMを起動してみましょう。
34 |
35 | 
36 |
37 | 5. 最後にVPMを使いやすくするために設定を開き、下の方にあるメニューからURLの紐付けをします!
38 |
39 | 
40 |
41 | ## ALCOMにUnityプロジェクトを登録
42 |
43 | ::: info
44 | もしすでにプロジェクトが表示されている場合はこの手順は不要です。
45 | :::
46 |
47 | ALCOMでツールを管理できるようにプロジェクトを登録してみましょう。`既存のプロジェクトを追加`ボタンをクリックすると選択画面が開きますが、プロジェクトの最上位のフォルダを選択してください。
48 |
49 | ```
50 | プロジェクト名 ← このフォルダを選択
51 | ├ Assetsフォルダ
52 | ├ Libraryフォルダ
53 | ├ Logsフォルダ
54 | ├ Packagesフォルダ
55 | ├ ...
56 | ```
57 |
58 | 
59 |
60 | ## ツールの追加
61 |
62 | `VPMリポジトリ`というツールの情報がまとまったデータをALCOMに追加してみましょう。インストールのときにURLの紐付けを行ったので以下のURLをクリックするだけで簡単にリポジトリを追加できます。
63 |
64 | - [lilToonやlilycalInventoryなど](vcc://vpm/addRepo?url=https://lilxyzw.github.io/vpm-repos/vpm.json)
65 | - [Modular Avatarなど](vcc://vpm/addRepo?url=https://vpm.nadena.dev/vpm.json)
66 | - [Avatar Optimizerなど](vcc://vpm/addRepo?url=https%3A%2F%2Fvpm.anatawa12.com%2Fvpm.json)
67 |
68 | 
69 |
70 | 
--------------------------------------------------------------------------------
/docs/ja/common/makevpmrepos.md:
--------------------------------------------------------------------------------
1 | # 【開発者向け】自作物をVPM・VCC対応する方法
2 |
3 | ## 手順(Unity作業編)
4 |
5 | 1. ツールのフォルダをAssets配下ではなくPackages配下に置く
6 |
7 | 2. フォルダ名を適宜変更する(エラーが出ない限りは何でもいいですが`com.unity.burst`のようなネーミングがされることが多いので私もそれに合わせて`com.example.tool`としています)
8 |
9 | 3. ツールのルートフォルダ直下にpackage.jsonを作成
10 |
11 | 必要最低限の例
12 | ```json
13 | {
14 | "name": "com.example.tool",
15 | "version": "1.0.0",
16 | }
17 | ```
18 |
19 | 色々書いてみた例
20 | ```json
21 | {
22 | "name": "com.example.tool",
23 | "displayName": "Example Tool",
24 | "version": "1.0.0",
25 | "author": {
26 | "name": "Example",
27 | "email": "contact@example.com"
28 | },
29 | "unity" : "2022.3",
30 | "description" : "Package for explanation.",
31 | "vpmDependencies" : {
32 | "com.vrchat.avatars" : "3.7.0"
33 | },
34 | "url" : "https://packages.example.com/com.example.tool-1.0.0.zip?",
35 | "legacyFolders" : {
36 | "Assets\\ExampleTool" : "5f241139b9f5c4fcf5076516cb09aecc"
37 | }
38 | }
39 | ```
40 |
41 | 表は重要そうなところの抜粋です。公式の情報は以下から。
42 | - [Unity - Manual: Package manifest](https://docs.unity3d.com/2022.3/Documentation/Manual/upm-manifestPkg.html)
43 | - [Packages | VRChat Creator Companion](https://vcc.docs.vrchat.com/vpm/packages/)
44 |
45 | |プロパティ|説明|
46 | |-|-|
47 | |name(必須)|パッケージ名。`com.example.tool`のようなフォーマットで設定。|
48 | |version(必須)|ツールのバージョン番号。`0.0.0`のようなフォーマット(semver)で指定。semverにはバージョン番号の上げ方に制約があり、`x.y.z`のうち他のツールのコードに変更が必要なような破壊的な変更があればxを、単なる機能追加であればyを、不具合修正のみであればzの数値を上げるように決められている。|
49 | |displayName(必須?)|ツールの表示上の名前。現状なくても動くが、あるとVCCやALCOMでこの名前が表示されてわかりやすいのであったほうが良い。|
50 | |url(必須?)|ツールの制作者に関する情報。なくても動くが必須扱いにはされている。後述するreposには必要。urlの末尾の`?`は現在は不要だが、かつてはこれがないとvpmのバグでエラーになっていた。|
51 | |author(必須?)|ツールの制作者に関する情報。なくても動くが必須扱いにはされている。|
52 | |description|ツールの説明文。|
53 | |vpmDependencies|他のvpmパッケージに依存している場合に指定。これが指定されていればツールをインストールする際に前提パッケージも一緒に入れてくれる。|
54 | |dependencies|他の非vpmパッケージに依存している場合に指定。|
55 | |legacyFolders|パッケージをインストールする際に消すファイル・フォルダ。Assetsに旧バージョンがあると重複してエラーになるのであとからVPMに移行する際はあったほうが良い。|
56 |
57 | 4. スクリプト(.cs)のルートフォルダにasmdef(Assembly Definition)を作成
58 |
59 | 5. asmdefの設定を適宜変更
60 |
61 | |名前|説明|
62 | |-|-|
63 | |Name|asmdefの名前。名前は何でも良いが`com.example.tool`のようにパッケージ名に合わせられることが多い。EditorとRuntimeでスクリプトが分かれている場合、それぞれにasmdefを作成し、`com.example.tool.Editor`のように別の名前を指定。|
64 | |Auto Referenced|**オフを強く推奨**。オフにすると他アセンブリから参照する際に明示的な指定が必要になるがコンパイルが早くなる。|
65 | |Assembly Definition References|参照する他アセンブリ。上に`Use GUIDs`は謎のコンパイルエラーの原因になるので**オフを強く推奨**。|
66 | |Platforms|基本はそのままで良い。Editorスクリプトの場合はAny Platformsのチェックを外し、Editorだけチェックを入れる。|
67 | |Version Defines|該当パッケージがインストールされている場合にシンボルを定義。パッケージのインストール状況に応じてコードを変えられる。|
68 |
69 | 6. この時点でスクリプト関係のエラーが出ている場合は適宜`Assembly Definition References`に不足している参照を追加
70 |
71 | 7. おしまい!
72 |
73 | ## 手順(リポジトリ編)
74 |
75 | vpm.jsonを作成して公開するだけです。jsonは手書きでもツールで生成してもGitHub Actionsで自動化しても良いです。一度リポジトリに登録したパッケージを削除すると**破壊が発生する**ため、削除しないようにしてください。
76 |
77 | [Repos | VRChat Creator Companion](https://vcc.docs.vrchat.com/vpm/repos)
78 |
79 | 必要最低限の例
80 | ```
81 | {
82 | "id": "com.example.vpm",
83 | "url": "https://vpm.example.com/vpm.json",
84 | "packages": {
85 | "com.example.tool": {
86 | "versions": {
87 | "1.0.0": {
88 | "name": "com.example.tool",
89 | "version": "1.0.0",
90 | "url" : "https://packages.example.com/com.example.tool-1.0.0.zip?"
91 | }
92 | }
93 | }
94 | }
95 | }
96 | ```
97 |
98 | [私が運用している実際の例](https://lilxyzw.github.io/vpm-repos/vpm.json)
99 |
--------------------------------------------------------------------------------
/docs/public/images/logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
--------------------------------------------------------------------------------
/docs/ja/avatar/optimization.md:
--------------------------------------------------------------------------------
1 | # VRChatアバター最適化・軽量化【脱Very Poor】
2 |
3 | [[toc]]
4 |
5 | ## 最適化・軽量化って何?
6 |
7 | どちらもアバターの表示によるPCの負荷を下げることです。この記事では最適化と軽量化の違いを
8 |
9 | - 最適化は見た目を損なわずに行われるもの
10 | - 軽量化はいくらか見た目を損なう場合があるもの
11 |
12 | としていますが、一般的には最適化・軽量化もまとめて最適化とされるケースも多いです。
13 |
14 | ## なんで最適化したほうがいいの?
15 |
16 | [パフォーマンスランク](https://creators.vrchat.com/avatars/avatar-performance-ranking-system/)があまりにも酷い場合は制限に引っかかり、他人視点から見たときにあなたの改変したアバターがちゃんと表示されなくなることがあります。つまり「多くの人に改変したアバターをちゃんと見てもらえるようにできる」というのが最大のメリットになります。逆にいえばフレンド以外の前で使わないアバターは無理に最適化しなくても良く、人前で使うアバターだけ最適化すればいいということでもあります。
17 |
18 | あなたのアバターはインスタンスにいるみんなのCPUやGPUのリソースを使って表示されているため、極端に重いアバターを使うと迷惑になってしまうことがあります。そこで「みんなの負担を減らして快適にVRChatをできるようにしよう」というのが最適化・軽量化の**本来の**目的ですが、こちらは自分にとってのメリットが弱いかも……。
19 |
20 | ## とりあえずプロジェクトに最適化ツールを入れる
21 |
22 | [Avatar Optimizer](https://vpm.anatawa12.com/avatar-optimizer/ja/)と[anatawa12's gists pack](https://vpm.anatawa12.com/gists/ja/)をプロジェクトに入れましょう。
23 |
24 | インストールが完了したら`Tools/anatawa12's gist selector`から`ActualPerformanceWindow`にチェックを入れて`Apply Changes`をクリック。これで下準備ができました。
25 |
26 | ## 難しいことはわかんないけどとりあえず軽くしたい
27 |
28 | メッシュ・マテリアルスロットの結合と不要なオブジェクト・BlendShapeの削除は[ここ](https://vpm.anatawa12.com/avatar-optimizer/ja/docs/tutorial/basic-usage/)の手順通りにやるとできます。
29 |
30 | ## ここから先はどっから手をつければええんや
31 |
32 | 再生ボタンをクリック。先程入れた`ActualPerformanceWindow`が出てきてパフォーマンスを確認できます。
33 |
34 | ここで
35 |
36 | - ビックリマークの出ている項目を全てなんとかすればPoor
37 | - 赤色の丸をなんとかすればMedium
38 | - 黄色の丸をなんとかすればGood
39 | - 緑色の丸(星なし)をなんとかすればExcellent
40 |
41 | になります。
42 |
43 | つまりビックリマークの項目が最優先で手をつけるべきところとなります。ここから先の記事は手を付けたい項目から順に読みながら作業していきましょう。
44 |
45 | ## 各項目の最適化
46 |
47 | ### Texture Memory(テクスチャメモリが多すぎ)
48 |
49 | ほとんどの場合はテクスチャの解像度を下げることで改善できます。なお、テクスチャ解像度の変更は**Unity上からできるので画像編集ソフトを使う必要はありません**。lilAvatarUtilsでテクスチャを一覧でき、解像度の変更やマテリアルからの削除を一括で行えます([参考](https://note.com/coffee_monaka/n/n197fb85ade94))。[専門の記事](https://qiita.com/lilxyzw/items/9aab99f976295971b8b0)も書いているので興味があれば読んでみて下さい。
50 |
51 | ### PhysBone Components(PhysBoneコンポーネントが多すぎ)
52 |
53 | [AAO Merge PhysBone](https://vpm.anatawa12.com/avatar-optimizer/ja/docs/reference/merge-physbone/)でコンポーネントを統合できます。
54 |
55 | ### PhysBone Transforms(PhysBoneの影響ボーン数が多すぎ)
56 |
57 | [AAO Merge Bone](https://vpm.anatawa12.com/avatar-optimizer/ja/docs/reference/merge-bone/)でボーンを間引けます。また、`AAO Merge PhysBone`のEnd PositionをCleared to zeroにせず、Overrideで設定することでも削減できます。
58 |
59 | ### PhysBone Colliders(PhysBoneのコライダーが多すぎ)
60 |
61 | これはコライダーを消していくしかないです。細かすぎるコライダーを1つのコライダーで代用するなどしましょう。また、スカートで房ごとにInside Colliderを使っているのであれば[この記事](https://note.com/mikekirisima/n/n2fcb9e57f030)のようにPhysBoneを設定することで節約することができるかもしれません。
62 |
63 | ### PhysBone Collision Check Count(PhysBoneのコライダーの判定が多すぎ)
64 |
65 | この値はPhysBoneの影響ボーン数×Collider数になります。影響ボーンもコライダーも多いPhysBoneコンポーネントはこの値に莫大な影響を与えるのでボーンかコライダーどちらかを削りましょう。
66 |
67 | ### Bones(ボーンが多すぎ)
68 |
69 | 通常は上のPhysBoneの影響ボーンを減らすとAAOのTrace And Optimizeで勝手に不要なボーンを結合してくれるので、この項目で引っかかることは少ないと思われます。
70 |
71 | ### Polygons(ポリゴン数が多すぎ)
72 |
73 | 以下のツールで不要なメッシュを消すことである程度対処できます。
74 |
75 | - [AAO Remove Mesh By BlendShape](https://vpm.anatawa12.com/avatar-optimizer/ja/docs/reference/remove-mesh-by-blendshape/)
76 | - [AAO Remove Mesh in Box](https://vpm.anatawa12.com/avatar-optimizer/ja/docs/reference/remove-mesh-in-box/)
77 | - [AAO Remove Mesh By Mask](https://vpm.anatawa12.com/avatar-optimizer/ja/docs/reference/remove-mesh-by-mask/)
78 |
79 | 上のツールで限界まで削ってまだオーバーしている場合は以下のツールでデシメート(ポリゴンを荒くして数を抑える)できます。
80 |
81 | - [NDMF Mantis Lod Editor](https://hitsub.booth.pm/items/5409262)
82 | - [lilNDMFMeshSimplifier](https://github.com/lilxyzw/lilNDMFMeshSimplifier)
83 |
84 | 上のデシメートだと荒すぎる場合はBlenderが必要になりますが、[Cats Blender Plugin](https://github.com/absolute-quantum/cats-blender-plugin)でもう少しきれいにデシメートできます。これでも厳しい場合は[こちらの記事](https://creator.cluster.mu/2023/01/11/blender-3dweight/)の"ポリゴン数を削減する"の項目に従って手作業でなんとかしましょう。
85 |
86 | ### Material Slots(マテリアルスロットが多すぎ)
87 |
88 | [TexTransTool](https://ttt.rs64.net/)の[AtlasTexture](https://ttt.rs64.net/docs/Tutorial/AtlasTexture-Tutorial)でマテリアルを結合しましょう。設定が似たようなマテリアル同士の結合であれば劣化を抑えられます。
89 |
90 | ### Lights(ライトが多すぎ)
91 |
92 | ライトを使わなくてもいい手段を使いましょう。
93 |
94 | アバターの明るさ調整
95 | → マテリアルの明るさの下限・上限やUnlit化をアニメーションで調整することで対処できます
96 |
97 | ワールドが暗い
98 | → 完全な黒とかでなければ暗視シェーダーで対処できます
99 |
100 | ### Bounds
101 |
102 | アバターに適切なBoundsを設定しましょう。Modular Avatarの[Mesh Settings](https://modular-avatar.nadena.dev/ja/docs/reference/mesh-settings)をアバターのルートにつければ一括で調整できます。基本的にはアバターを全体を覆える立方体になればOKだと思います。デカすぎるアバターを使っている場合はどうしようもありません。Unity上では小さくしてVRChat上のアバタースケーリングで大きくするのも手かも……?
103 |
104 | ### Contact Count
105 |
106 | ギミックの最適化は正直ギミックによって異なるため解説できません。基本的にはアバターに含まれるギミックを削るしかないと思われます。
107 |
108 | ### Cloth
109 |
110 | Clothが存在するだけでVery Poorになります。これは影響頂点やレートを計算せず一律にアウトにするVRChatが悪いためどうしようもありません……。
111 |
112 | ### パーティクル関係
113 |
114 | シェーダーでパーティクルを作ってしまい、Particle Systemを使わないため知見が十分になくてわかりません……。
115 |
116 | ### Physics
117 |
118 | 私がPhysicsを使わないためわかりません……。
119 |
120 | ## 全部やったけどVery Poorを脱却できない
121 |
122 | 1アバターに何着か衣装を詰め込んでるとどうしようもなかったりします。衣装ごとにアバターを分けることで対処しましょう。それでも難しい場合は衣装デザイン的に難しいパターンかもしれません……。
--------------------------------------------------------------------------------
/docs/ja/avatar/modification_by_lil.md:
--------------------------------------------------------------------------------
1 | # VRChatアバター 改変の流儀(by lil)
2 |
3 | 半分ぐらいアバター自作みたいな解説になっています。これが答えというわけではなく、あくまで私の方法なので適宜手順をすっ飛ばしたりしてください。
4 |
5 | [[toc]]
6 |
7 | ## 有料ツール
8 |
9 | 他ツールを使う場合は適宜読み替えてください。
10 |
11 | - [Better FBX Importer & Exporter](https://blendermarket.com/products/better-fbx-importer--exporter) - $28
12 | - CLIP STUDIO PAINT PRO(以下、クリスタ) - 買い切りは5,900円
13 |
14 | ## Blender湯通し
15 |
16 | まずBlenderを開きます。そしてアバターのfbxをインポートします。現代のアバターは大体7万ポリゴンを超過しているためです。現在はあまり見かけませんが、スケールが100倍になっていたり-89.98度回転していたりする問題も修正します。
17 |
18 | ### ポリゴン削減
19 |
20 | 手作業で辺や頂点を溶解していきます。
21 |
22 | 1. 適当な辺をクリック
23 | 2. ループ選択(辺ループ)
24 | 2. 辺を溶解
25 |
26 | 基本的にこれの繰り返しです。関節など変形の大きい箇所や角度の急な面よりもなだらかで変形の少ない箇所を優先的に削っていきます。着せ替えもすると思うので、素体や髪は他メッシュにポリゴン数が割ける用に余裕を持って削減したいところです。
27 |
28 | ### メッシュの編集
29 |
30 | 編集前に必ず**編集対象のシェイプキーがBasisであること**を確認しましょう。(n敗)
31 |
32 | Unity上でできない編集をここでやります。具体的には髪の毛に新しい毛束を追加したり目のハイライトをいじったり……。1から作っても良いですが、新たにUV展開したり既存のテクスチャに合わせて展開したりするのは面倒なので、既存のメッシュを複製して変形するとある程度の時間短縮になります。あと、編集後は必ずウェイトやBlendShapeも確認しましょう。これを怠るとバーチャルウニになることができます。
33 |
34 | ### BlendShapeの追加
35 |
36 | Shrink系がない場合はこれを追加すると着せ替えで貫通防止や[AAO Remove Mesh By BlendShape](https://vpm.anatawa12.com/avatar-optimizer/ja/docs/reference/remove-mesh-by-blendshape/)によるポリゴン削減ができて便利になります。また、表情作成時に足りないBlendShapeがある場合はここで自作のものを追加します。
37 |
38 | ### ウェイトのないボーンの削除
39 |
40 | これはPhysBoneのTransform数に影響するので大事です。endボーンのような不要なボーンは削除しておきます。
41 |
42 | ### お好みで衣装と素体の分離
43 |
44 | 他衣装に着せ替えを行うので最初からアバターデフォルト衣装と素体を分離し、扱いやすくする手もあります。分離した衣装はModular Avatarで着せます。
45 |
46 | ### 書き出し
47 |
48 | fbxを書き出します。[Better FBX Importer & Exporter](https://blendermarket.com/products/better-fbx-importer--exporter)で書き出すと不要な回転が入りません。基本的には初期設定のまま書き出して大丈夫で、お好みで`Ignore Armature Node`のチェックを外します(Hipsの上にArmatureオブジェクトを残すかどうか)。
49 |
50 | ## 新規Unityプロジェクトの作成
51 |
52 | プロジェクトの運用方針によって異なりますが、私は素体(ベースとなるアバター)ごとにプロジェクトを分けているのでここでALCOMで新規プロジェクトを作成します。カスタムテンプレートを作っているとツールの導入などを省略できます。私はそれをサボっているので毎回ツールを突っ込んでいます。ちなみにUnityなどが意味不明なエラーを出して死ぬことがあるので、プロジェクトのパスにマルチバイト文字(日本語など)が入らないようにしましょう。
53 |
54 | ### ツールの導入
55 |
56 | - lilToon
57 | - lilAvatarUtils
58 | - lilycalInventory
59 | - lilEditorToolbox
60 | - Modular Avatar
61 | - Non-Destructive Modular Framework
62 | - AAO: Avatar Optimizer
63 | - anatawa12's gists pack
64 |
65 | を導入します。上記ツールは全部ALCOM(VPM)で入れることができます。ここまでやって初めてプロジェクトを開きます。初回はツールのコンパイルなどが入るのでちょい遅いです。
66 |
67 | ## Unity上での初期設定
68 |
69 | ### アバターや衣装などのunitypackageをインポート
70 |
71 | unitypackage内のファイルは基本使わないのですが、マスクテクスチャなどがunitypackage内にしかなかったりするのでなんだかんだでインポートしています。
72 |
73 | ### FBXをインポート
74 |
75 | Sort Hierarchy By Nameのチェックを外し、RigをHumanoidに。RigはlilEditorToolboxでモデルインポート系の機能を有効にしている場合は自動でいい感じにしてくれます。加えて新規マテリアルを作ってMaterialsタブで割り当てます。不要なImport~系はオンのままでも影響はないと思いますが、販売アセットを作る場合などで気になる場合はオフにしても良いと思います。
76 |
77 | ### 新規シーンを作成&保存
78 |
79 | 何らかの要因でデータを吹き飛ばされる可能性があるため、SampleSceneで作業しないようにしましょう。新規シーンはScenesフォルダを作ってその中に保存することが多いです。
80 |
81 | ### シーンに配置&ざっくり設定
82 |
83 | FBXをシーンに配置し、それを見ながらマテリアルを編集します。表情だけ半透明で、それ以外は不透明で良いと思います。ちなみにPrefabは**絶対Unpackしない**ようにしています。Unpackはメッシュデータ以外を複製して編集可能にするような機能なので1度実行すると戻せず、さらにFBX更新時にメッシュデータとUnpack後のデータに齟齬が発生してアバターが破壊される可能性が跳ね上がります。
84 |
85 | ## テクスチャ改変
86 |
87 | アバターは自分カラーに改変する人が多いんじゃないでしょうか。私もです。クリスタを開き、psd(もしくはclip)を開きます。レイヤー分けされたデータが付属していない場合は非常につらいですが、根性で編集します。
88 |
89 | ### 大まかな色の変更
90 |
91 | 楽をする場合は各パーツの一番上にグラデーションマップレイヤーを追加して自分色にして終わりです。
92 |
93 | 丁寧に改変する場合はレイヤーごとに編集します。大体`〇〇ベース`みたいな名前のレイヤーがあるのでそこの色を変更します。影やハイライトもベース色に合わせて変更します。ベースと影とハイライトは色相はずらしたほうがいい感じになりやすいです。例えば黄色やベージュの場合は赤っぽい影、白い場合は青紫っぽい影みたいな感じです。
94 |
95 | ### 加筆
96 |
97 | ほっぺたとか影とか髪のメッシュとかを加筆します。場合によっては一から描く場合もあります。
98 |
99 | ### 書き出しと微調整
100 |
101 | psdで直接Unityプロジェクトに保存します。制作ツールに慣れている人ほど「psdのままUnityで使ったら見た目が変わるのでは?」と考えるかもしれませんが、psdファイルの中には各レイヤーの情報の他に**プレビュー用の画像**が保存されており、Unityはこれをテクスチャとして取得するらしいので書き出し元のツールが壊れていない限りは見た目が変わらないはずです。
102 |
103 | 保存したテクスチャをマテリアルに割り当て見た目を確認します。他部位の色によって印象が変わるのでざっくりでも良いので全テクスチャを改変してから確認しましょう。
104 |
105 | 微調整したい場合はクリスタに戻り、再編集&psdの上書き保存をします。保存後にUnityに戻ると即座に編集が反映されます。これがpsdを直接Unityに入れる利点です。
106 |
107 | ## マテリアルの調整
108 |
109 | 大体lilToonのプリセット欄からイラスト系プリセットを割り当ててそこから調整します。アバターの作風や色によって影の色やリムライトなどを調整します。全マテリアルで共通の設定を行う部分はlilycalInventoryのLI MaterialModifierに任せるのでここでは編集しません。
110 |
111 | ### 距離クリッピングキャンセラーを有効化
112 |
113 | メッシュに近づいても貫通しなくなる機能です。シェーダーコード自体に変更が加えられるのでlilToonを使った全マテリアルに適用されます。
114 |
115 | ### 暗い場所で目を光らせる
116 |
117 | 瞳やハイライトの部分を白く塗ったエミッション用のマスクテクスチャを作成して発光に割り当て、メインカラーの強度を1にします。蛍光の数値を上げると明るい場所で目が過剰に明るくなるのを抑制できます。
118 |
119 | ### LI MaterialModifierを使った改変
120 |
121 | とりあえずlilycalInventory付属のprefabを突っ込みます。
122 |
123 | - `[General] Optimize.prefab` - マテリアルの最適化
124 | - `[lilToon] Distance Fade.prefab` - 距離フェードの適用(顔を近づけると暗くなるやつ)
125 | - `[lilToon] Fix Lighitng` - ライトの設定の統一
126 |
127 | あと適宜自作のprefabも突っ込みます。輪郭線の`VR時に非表示`のようなパラメーターはアバター全体で統一したいので、こういうパラメーターはLI MaterialModifierで自作prefabを作って複数プロジェクトで共有します。
128 |
129 | ## VRC Avatar Descriptorの追加
130 |
131 | アバターに`VRC Avatar Descriptor`コンポーネントを追加します。
132 |
133 | `View`は両目の瞳の中間になるように設定します。多くの場合は顔のポリゴンにめり込む状態になると思います。
134 |
135 | `LipSync`は`Viseme Blend Shape`に設定します。基本的には自動でBlendShapeが割り当てられます。
136 |
137 | `Eye Look`は動かしすぎない程度にいい感じに。
138 |
139 | `Playable Layers`は複雑なギミックを実装しない限りは放置です。
140 |
141 | `Lower Body`は`Use Auto-Footsteps for 3 and 4 point tracking`をオン、`Force Locomotion animations for 6 point tracking`をオフにすることが多いです。
142 |
143 | `Expressions`も自作ギミックを入れない限りは放置で。
144 |
145 | `Colliders`は大体いい感じになっていますが、Headは小さめになりがちなので頭サイズに合わせておきます。
146 |
147 | ## PhysBoneの設定
148 |
149 | PhysBoneはボーンに直接付けず、アバターのルート直下に新規GameObject(名前PhysBone)を作成し、その中にPhysBoneコンポーネントごとにGameObjectを作って追加していきます。
150 |
151 | ### Transforms
152 |
153 | Root Transformは房ごとに設定するのではなく、各房の親に設定してコンポーネント数を削減します。Multi Child TypeをIgnoreにすればボーンが枝分かれした根本のボーンが揺れなくなるので、各房の根本のボーンの位置が変わって変になるという問題も発生しません。
154 |
155 | また、endボーンを削除したのでEndpoint Pisitionを調整します。大抵はYの数値を0.05とかにするといい感じになります。どう調整してもおかしくなる場合はボーンの向きが不正なのでBlenderで修正してください。
156 |
157 | ### Forces
158 |
159 | とりあえず以下のような設定にしてから微調整します。以下設定はフワッフワに揺れるので揺れもの感がいい感じに出ます。
160 |
161 | |名前|設定|
162 | |-|-|
163 | |Integration Type|Simplified|
164 | |Pull|0.1|
165 | |Spring|0.9|
166 | |Gravity|0.5|
167 | |Gravity Falloff|1|
168 | |Immobile Type|World|
169 | |Immobile|0.5|
170 |
171 | ### Limits
172 |
173 | 特定の範囲内で自由に揺れてほしい場合はAngle、一定方向にだけ揺れてほしい場合はHingeに設定します。コライダーで無理やり範囲制限をするよりも安定し、パフォーマンスランクでも有利になるので腕の見せどころです。
174 |
175 | ### Collisions
176 |
177 | Radiusはメッシュの見た目に合うように調整します。カーブを使うと多少メッシュの太さに変動があっても合わせられます。Allow Collisionは手のすぐ近くにある揺れもの以外はTrueに設定し触って揺れるようにします。
178 |
179 | ### Stretch & Squish
180 |
181 | 伸び縮みさせたい場面がそんなにないのでデフォで運用することが多いです。お好みで調整。
182 |
183 | ### Grab & Pose
184 |
185 | Trueのほうが面白いことになるのでTrueに設定することが多いです。
186 |
187 | ### 最終確認
188 |
189 | 一通り設定したらパフォーマンスランクを確認します。コンポーネント数が多い場合は[AAO Merge PhysBone](https://vpm.anatawa12.com/avatar-optimizer/ja/docs/reference/merge-physbone/)で統合します。Transform数が多い場合はウェイト0のボーンが残っていないかを確認、なければ[AAO Merge Bone](https://vpm.anatawa12.com/avatar-optimizer/ja/docs/reference/merge-bone/)でボーンを間引きます。コライダー周りが超過している場合は角度制限に置き換えます。
190 |
191 | ## 表情作成
192 |
193 | なんかいい感じのツール作りたいです。
194 |
195 | ## 表情以外のアニメーション
196 |
197 | 複雑なものでない限りはlilycalInventoryのコンポーネントで完結させています。オブジェクトのオンオフやマテリアルの差し替え、BlendShapeの操作などはLI ItemTogglerやLI SmoothChangerで対応できます。AnimatorControllerもAnimationClipも不要な時代。
198 |
199 | ## その他コンポーネントの追加
200 |
201 | `AAO Trace And Optimize`とか`LI AutoFixMeshSettings`のようなとりあえず付けておけば良い系のコンポーネントを付けておきます。
202 |
203 | ## 汎用ギミックの導入
204 |
205 | 衣装にかかわらず常に使うようなギミックはここで導入しておきます。カメラ拡張とかライト調整とかです。
206 |
207 | ## アバターのPrefab化
208 |
209 | 一通り改変したらアバターをPrefab Variantとして保存します。保存後のPrefabを編集する場合はPrefabをダブルクリックして編集画面を開くか、シーンで編集した後にApply Allで変更を適用します。こうすることで各衣装バリエーションのPrefabにも親Prefabの変更が適用されるので、各衣装バリエーションごとに同じ作業をするという虚無がなくなります。
210 |
211 | ## 衣装バリエーションの作成
212 |
213 | 衣装もポリゴン数多いケースがあるのでBlenderで湯通しします。ポリゴン削減がめんどくさい場合は[Cats Blender Plugin](https://github.com/absolute-quantum/cats-blender-plugin)でお茶を濁すこともあります。
214 |
215 | アバター同様に衣装もマテリアルの割り当てや見た目の調整、PhysBoneの設定を行ってPrefab化します。Prefab化した衣装をアバター内に配置してModular AvatarのSetup Outfitで着せます。さらに衣装を着せたアバターを新規の**Prefab Variant**として保存します。
216 |
217 | ## パフォーマンスランクの確認と最適化
218 |
219 | [VRChatアバター最適化・軽量化【脱Very Poor】](https://lilxyzw.github.io/matome/ja/avatar/optimization.html)を参照です。
220 |
221 | ## ローカルテストとアップロード
222 |
223 | とりあえずアバターをローカルテストします。問題なければアップロードします。
224 |
225 | アバター名は`アバター名 衣装名`にすることが多いです。`Chiffon Dress`みたいな感じです。ただ、名前が長いと表示が途切れて衣装名がわからなくなる場合があるので省略して表記します。`cfn dress`のような感じです。省略する場合は他アバターと名前が重複しないように注意しましょう。
226 |
227 | サムネイルはシーン上に新規カメラを配置してそれを使って撮るようにしています。背景を用意するのがめんどくさいのでカメラのClear FragsをSolid Colorにし、いい感じの単色にします。顔面ドアップなら背景とかポーズとか関係ないのでこだわりなければオススメです。
228 |
--------------------------------------------------------------------------------
/docs/public/scripts/lightbox.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Lightbox v2.11.4
3 | * by Lokesh Dhakar
4 | *
5 | * More info:
6 | * http://lokeshdhakar.com/projects/lightbox2/
7 | *
8 | * Copyright Lokesh Dhakar
9 | * Released under the MIT license
10 | * https://github.com/lokesh/lightbox2/blob/master/LICENSE
11 | *
12 | * @preserve
13 | */
14 | !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],b):"object"==typeof exports?module.exports=b(require("jquery")):a.lightbox=b(a.jQuery)}(this,function(a){function b(b){this.album=[],this.currentImageIndex=void 0,this.init(),this.options=a.extend({},this.constructor.defaults),this.option(b)}return b.defaults={albumLabel:"Image %1 of %2",alwaysShowNavOnTouchDevices:!1,fadeDuration:600,fitImagesInViewport:!0,imageFadeDuration:600,positionFromTop:50,resizeDuration:700,showImageNumberLabel:!0,wrapAround:!1,disableScrolling:!1,sanitizeTitle:!1},b.prototype.option=function(b){a.extend(this.options,b)},b.prototype.imageCountLabel=function(a,b){return this.options.albumLabel.replace(/%1/g,a).replace(/%2/g,b)},b.prototype.init=function(){var b=this;a(document).ready(function(){b.enable(),b.build()})},b.prototype.enable=function(){var b=this;a("body").on("click","a[rel^=lightbox], area[rel^=lightbox], a[data-lightbox], area[data-lightbox]",function(c){return b.start(a(c.currentTarget)),!1})},b.prototype.build=function(){if(!(a("#lightbox").length>0)){var b=this;a('').appendTo(a("body")),this.$lightbox=a("#lightbox"),this.$overlay=a("#lightboxOverlay"),this.$outerContainer=this.$lightbox.find(".lb-outerContainer"),this.$container=this.$lightbox.find(".lb-container"),this.$image=this.$lightbox.find(".lb-image"),this.$nav=this.$lightbox.find(".lb-nav"),this.containerPadding={top:parseInt(this.$container.css("padding-top"),10),right:parseInt(this.$container.css("padding-right"),10),bottom:parseInt(this.$container.css("padding-bottom"),10),left:parseInt(this.$container.css("padding-left"),10)},this.imageBorderWidth={top:parseInt(this.$image.css("border-top-width"),10),right:parseInt(this.$image.css("border-right-width"),10),bottom:parseInt(this.$image.css("border-bottom-width"),10),left:parseInt(this.$image.css("border-left-width"),10)},this.$overlay.hide().on("click",function(){return b.end(),!1}),this.$lightbox.hide().on("click",function(c){"lightbox"===a(c.target).attr("id")&&b.end()}),this.$outerContainer.on("click",function(c){return"lightbox"===a(c.target).attr("id")&&b.end(),!1}),this.$lightbox.find(".lb-prev").on("click",function(){return 0===b.currentImageIndex?b.changeImage(b.album.length-1):b.changeImage(b.currentImageIndex-1),!1}),this.$lightbox.find(".lb-next").on("click",function(){return b.currentImageIndex===b.album.length-1?b.changeImage(0):b.changeImage(b.currentImageIndex+1),!1}),this.$nav.on("mousedown",function(a){3===a.which&&(b.$nav.css("pointer-events","none"),b.$lightbox.one("contextmenu",function(){setTimeout(function(){this.$nav.css("pointer-events","auto")}.bind(b),0)}))}),this.$lightbox.find(".lb-loader, .lb-close").on("click keyup",function(a){if("click"===a.type||"keyup"===a.type&&(13===a.which||32===a.which))return b.end(),!1})}},b.prototype.start=function(b){function c(a){d.album.push({alt:a.attr("data-alt"),link:a.attr("href"),title:a.attr("data-title")||a.attr("title")})}var d=this,e=a(window);e.on("resize",a.proxy(this.sizeOverlay,this)),this.sizeOverlay(),this.album=[];var f,g=0,h=b.attr("data-lightbox");if(h){f=a(b.prop("tagName")+'[data-lightbox="'+h+'"]');for(var i=0;i=1?(i=k,h=parseInt(k/n,10)):(i=parseInt(j/n,10),h=j),f.width(i),f.height(h)):(c.options.fitImagesInViewport?(c.options.maxWidth&&c.options.maxWidthk||g.height>j)&&(g.width/k>g.height/j?(i=k,h=parseInt(g.height/(g.width/i),10),f.width(i),f.height(h)):(h=j,i=parseInt(g.width/(g.height/h),10),f.width(i),f.height(h)))),c.sizeContainer(f.width(),f.height())},g.src=this.album[b].link,this.currentImageIndex=b},b.prototype.sizeOverlay=function(){var b=this;setTimeout(function(){b.$overlay.width(a(document).width()).height(a(document).height())},0)},b.prototype.sizeContainer=function(a,b){function c(){d.$lightbox.find(".lb-dataContainer").width(g),d.$lightbox.find(".lb-prevLink").height(h),d.$lightbox.find(".lb-nextLink").height(h),d.$overlay.trigger("focus"),d.showImage()}var d=this,e=this.$outerContainer.outerWidth(),f=this.$outerContainer.outerHeight(),g=a+this.containerPadding.left+this.containerPadding.right+this.imageBorderWidth.left+this.imageBorderWidth.right,h=b+this.containerPadding.top+this.containerPadding.bottom+this.imageBorderWidth.top+this.imageBorderWidth.bottom;e!==g||f!==h?this.$outerContainer.animate({width:g,height:h},this.options.resizeDuration,"swing",function(){c()}):c()},b.prototype.showImage=function(){this.$lightbox.find(".lb-loader").stop(!0).hide(),this.$lightbox.find(".lb-image").fadeIn(this.options.imageFadeDuration),this.updateNav(),this.updateDetails(),this.preloadNeighboringImages(),this.enableKeyboardNav()},b.prototype.updateNav=function(){var a=!1;try{document.createEvent("TouchEvent"),a=!!this.options.alwaysShowNavOnTouchDevices}catch(a){}this.$lightbox.find(".lb-nav").show(),this.album.length>1&&(this.options.wrapAround?(a&&this.$lightbox.find(".lb-prev, .lb-next").css("opacity","1"),this.$lightbox.find(".lb-prev, .lb-next").show()):(this.currentImageIndex>0&&(this.$lightbox.find(".lb-prev").show(),a&&this.$lightbox.find(".lb-prev").css("opacity","1")),this.currentImageIndex1&&this.options.showImageNumberLabel){var c=this.imageCountLabel(this.currentImageIndex+1,this.album.length);this.$lightbox.find(".lb-number").text(c).fadeIn("fast")}else this.$lightbox.find(".lb-number").hide();this.$outerContainer.removeClass("animating"),this.$lightbox.find(".lb-dataContainer").fadeIn(this.options.resizeDuration,function(){return a.sizeOverlay()})},b.prototype.preloadNeighboringImages=function(){if(this.album.length>this.currentImageIndex+1){(new Image).src=this.album[this.currentImageIndex+1].link}if(this.currentImageIndex>0){(new Image).src=this.album[this.currentImageIndex-1].link}},b.prototype.enableKeyboardNav=function(){this.$lightbox.on("keyup.keyboard",a.proxy(this.keyboardAction,this)),this.$overlay.on("keyup.keyboard",a.proxy(this.keyboardAction,this))},b.prototype.disableKeyboardNav=function(){this.$lightbox.off(".keyboard"),this.$overlay.off(".keyboard")},b.prototype.keyboardAction=function(a){var b=a.keyCode;27===b?(a.stopPropagation(),this.end()):37===b?0!==this.currentImageIndex?this.changeImage(this.currentImageIndex-1):this.options.wrapAround&&this.album.length>1&&this.changeImage(this.album.length-1):39===b&&(this.currentImageIndex!==this.album.length-1?this.changeImage(this.currentImageIndex+1):this.options.wrapAround&&this.album.length>1&&this.changeImage(0))},b.prototype.end=function(){this.disableKeyboardNav(),a(window).off("resize",this.sizeOverlay),this.$lightbox.fadeOut(this.options.fadeDuration),this.$overlay.fadeOut(this.options.fadeDuration),this.options.disableScrolling&&a("body").removeClass("lb-disable-scrolling")},new b});
15 | //# sourceMappingURL=lightbox.min.map
--------------------------------------------------------------------------------
/docs/.vitepress/theme/styles/custom.css:
--------------------------------------------------------------------------------
1 | :root {
2 | --vp-code-color: var(--vp-c-text-1);
3 | --vp-home-hero-name-color: transparent;
4 | --vp-home-hero-name-background: linear-gradient(160deg, #928CDB, #FF637C);
5 |
6 | --vp-font-family-base: 'Inter', 'SF Pro Text', 'Helvetica', 'Segoe UI', 'Noto Sans JP', 'Hiragino Kaku Gothic ProN', 'Meiryo', sans-serif;
7 | --vp-font-family-mono: 'Noto Sans Mono', 'ui-monospace', 'SFMono-Regular', 'SF Mono', 'Menlo', 'Monaco', 'Consolas', 'Liberation Mono', 'Courier New', monospace;
8 | }
9 |
10 | .vp-doc :not(pre) > code {
11 | border-color: var(--vp-c-gray-soft);
12 | border-style: solid;
13 | border-width: 2px;
14 | margin: 0.4em;
15 | padding-left: 0.2em;
16 | padding-right: 0.2em;
17 | padding-top: 0.1em;
18 | padding-bottom: 0.1em;
19 | }
20 |
21 | .VPSidebar {
22 | scrollbar-width: thin;
23 | }
24 |
25 | /* ウェイト */
26 |
27 | .vp-doc code {
28 | font-weight: 400;
29 | }
30 |
31 | .vp-doc p, .vp-doc a, .vp-doc li, .container .outline-link {
32 | font-weight: 500;
33 | }
34 |
35 | .vp-doc h1, .vp-doc h2, .vp-doc h3, .vp-doc h4, .vp-doc h5, .vp-doc h6, .vp-doc .custom-block-title,
36 | .container .title,
37 | .VPNavBarMenu *,
38 | .edit-link-button,
39 | .outline-title,
40 | .VPSidebarItem h2 {
41 | font-weight: 800 !important;
42 | }
43 |
44 | .VPHome .tagline, .VPHome .VPButton {
45 | font-weight: 800 !important;
46 | }
47 |
48 | .VPHome .clip, .VPHome .text {
49 | font-weight: 900 !important;
50 | }
51 |
52 | .VPHomeFeatures .title {
53 | font-weight: 900 !important;
54 | }
55 |
56 | .VPHero h1 span {
57 | font-weight: 700;
58 | letter-spacing: -0.03em;
59 | }
60 |
61 | /* 見出し */
62 | /*
63 | .vp-doc h1:first-letter {
64 | font-size: 1.5em;
65 | color: #928CDB;
66 | }
67 |
68 | .vp-doc h1::after {
69 | content: '';
70 | position: absolute;
71 | left: 0;
72 | bottom: 0;
73 | width: 100%;
74 | height: 4px;
75 | background: linear-gradient(to right, #E65A5A 25%, var(--vp-c-divider) 25%);
76 | }
77 | */
78 |
79 | /* 見出し */
80 |
81 | .vp-doc h2 {
82 | position: relative;
83 | border-top: none;
84 | margin-bottom: 1.5em;
85 | }
86 |
87 | .vp-doc h2::after {
88 | position: absolute;
89 | content: '';
90 | background: linear-gradient(to right, #E65A5A 25%, var(--vp-c-divider) 25%);
91 | width: 100%;
92 | height: 4px;
93 | left: 0;
94 | bottom: -0.5em;
95 | }
96 |
97 | /* もくじ */
98 |
99 | /* ブロック - 背景 */
100 |
101 | .vp-doc .custom-block {
102 | background: none;
103 | border: 0;
104 | padding: 0;
105 | }
106 |
107 | .vp-doc .custom-block p {
108 | border-width: 4px;
109 | border-radius: 8px;
110 | border-top-left-radius: 0px;
111 | margin-top: 0;
112 | padding: 16px;
113 | border-style: solid;
114 | }
115 |
116 | .vp-doc .custom-block.info p {
117 | background-color: rgba(84, 162, 236, 0.15);
118 | border-color: #2196F3;
119 | }
120 |
121 | .vp-doc .custom-block.tip p {
122 | background-color: rgba(84, 236, 165, 0.15);
123 | border-color: #13d453;
124 | }
125 |
126 | .vp-doc .custom-block.warning p {
127 | background-color: rgba(236, 208, 84, 0.15);
128 | border-color: #e4aa0c;
129 | }
130 |
131 | .vp-doc .custom-block.danger p {
132 | background-color: rgba(236, 84, 84, 0.15);
133 | border-color: #f32121;
134 | }
135 |
136 | /* ブロック - 見出し */
137 |
138 | .vp-doc .custom-block.info .custom-block-title,
139 | .vp-doc .custom-block.tip .custom-block-title,
140 | .vp-doc .custom-block.warning .custom-block-title,
141 | .vp-doc .custom-block.danger .custom-block-title {
142 | color: #fff;
143 | left: 0px;
144 | bottom: 100%;
145 | border-radius: 5px 5px 0 0;
146 | padding: 0px 3px;
147 | border-bottom: 0px;
148 | }
149 |
150 | .vp-doc .custom-block.info .custom-block-title {
151 | background: #2196F3;
152 | width: 80px;
153 | }
154 |
155 | .vp-doc .custom-block.tip .custom-block-title {
156 | background: #13d453;
157 | width: 72px;
158 | }
159 |
160 | .vp-doc .custom-block.warning .custom-block-title {
161 | background: #e4aa0c;
162 | width: 114px;
163 | }
164 |
165 | .vp-doc .custom-block.danger .custom-block-title {
166 | background: #f32121;
167 | width: 108px;
168 | }
169 |
170 | /* ブロック - アイコン */
171 |
172 | .vp-doc .custom-block .custom-block-title::before {
173 | content: '';
174 | width: 1.5em;
175 | height: 1.5em;
176 | background-size: contain;
177 | vertical-align: middle;
178 | display: inline-block;
179 | margin-right: 6px;
180 | position: relative;
181 | }
182 |
183 | .vp-doc .custom-block.info .custom-block-title::before {
184 | background-image: url(/images/icon_info.svg);
185 | top: -0.05em;
186 | }
187 |
188 | .vp-doc .custom-block.tip .custom-block-title::before {
189 | background-image: url(/images/icon_tip.svg);
190 | top: -0.15em;
191 | }
192 |
193 | .vp-doc .custom-block.warning .custom-block-title::before {
194 | background-image: url(/images/icon_warning.svg);
195 | top: -0.1em;
196 | }
197 |
198 | .vp-doc .custom-block.danger .custom-block-title::before {
199 | background-image: url(/images/icon_danger.svg);
200 | top: -0.15em;
201 | }
202 |
203 | /* 蛍光ペン風下線 */
204 |
205 | u {
206 | text-decoration: none;
207 | background: linear-gradient(transparent 50%, #ffff00 40%);
208 | }
209 |
210 | .dark u {
211 | text-decoration: underline;
212 | background: none;
213 | }
214 |
215 | /**/
216 |
217 | .VPHomeFeatures .VPFeature {
218 | box-shadow: 10px 10px #2f006d21;
219 | }
220 |
221 | /* タイトルのアニメーション */
222 |
223 | .VPNavBarTitle {
224 | opacity: 1;
225 | transition: opacity 0.3s !important;
226 | }
227 |
228 | .VPNavBarTitle:hover {
229 | opacity: 0.666666;
230 | }
231 |
232 | /* 検索ボタンのアニメーション */
233 |
234 | .DocSearch-Button {
235 | transition: border 0.3s !important;
236 | }
237 |
238 | /* ナビバーのアニメーション */
239 |
240 | .VPNavBarMenuLink span {
241 | position: relative;
242 | text-decoration: none;
243 | }
244 |
245 | .VPNavBarMenuLink span::after {
246 | position: absolute;
247 | left: 0;
248 | content: '';
249 | width: 100%;
250 | height: 1px;
251 | background: var(--vp-c-brand-1);
252 | bottom: 0px;
253 | transform: scale(0, 1);
254 | transform-origin: right top;
255 | transition: transform 0.3s !important;
256 | }
257 |
258 | .VPNavBarMenuLink span:hover::after {
259 | transform: scale(1, 1);
260 | transform-origin: left top;
261 | }
262 |
263 | .VPNavBarMenu a:first-of-type {
264 | margin-right: 24px;
265 | position: relative;
266 | }
267 |
268 | .VPNavBarMenu a:first-of-type::after {
269 | content: '';
270 | position: absolute;
271 | pointer-events: none;
272 | border-right-color: var(--vp-c-text-1);
273 | border-right-width: 2px;
274 | border-right-style: solid;
275 | height: 1em;
276 | right: -13px;
277 | top: 26px;
278 | }
279 |
280 | /* 目次のアニメーション */
281 |
282 | .outline-marker {
283 | transition: cubic-bezier(0.215, 0.61, 0.355, 1) 0.3s !important;
284 | }
285 |
286 | .outline-link {
287 | transition: cubic-bezier(0.215, 0.61, 0.355, 1) 0.3s !important;
288 | }
289 |
290 | a, .VPLink .text {
291 | transition: color cubic-bezier(0.215, 0.61, 0.355, 1) 0.3s !important;
292 | }
293 |
294 | /* ボタンのアニメーション */
295 |
296 | .VPButton {
297 | transition: cubic-bezier(0.215, 0.61, 0.355, 1) 0.3s !important;
298 | padding: 0 20px !important;
299 | }
300 |
301 | .VPButton:hover {
302 | padding: 0 24px !important;
303 | }
304 |
305 | /* 見出しの#のアニメーション */
306 |
307 | .vp-doc h1 .header-anchor,
308 | .vp-doc h2 .header-anchor,
309 | .vp-doc h3 .header-anchor,
310 | .vp-doc h4 .header-anchor,
311 | .vp-doc h5 .header-anchor,
312 | .vp-doc h6 .header-anchor {
313 | transition: cubic-bezier(0.215, 0.61, 0.355, 1) 0.3s !important;
314 | opacity: 0;
315 | transform: translateY(5px);
316 | }
317 |
318 | .vp-doc h1:hover .header-anchor,
319 | .vp-doc h2:hover .header-anchor,
320 | .vp-doc h3:hover .header-anchor,
321 | .vp-doc h4:hover .header-anchor,
322 | .vp-doc h5:hover .header-anchor,
323 | .vp-doc h6:hover .header-anchor {
324 | opacity: 1;
325 | transform: translateY(0px);
326 | }
327 |
328 | /* リスト */
329 |
330 | .vp-doc ol {
331 | counter-reset: cnt;
332 | list-style-type: none!important;
333 | padding:0.5em;
334 | background: #ff538c1e;
335 | border-radius: 8px;
336 | border-width: 2px;
337 | border-color: #FF637C;
338 | }
339 | ol li {
340 | position: relative;
341 | padding-left: 30px;
342 | line-height: 1.5em;
343 | padding: 0.1em 0.1em 0.5em 30px;
344 |
345 | border-bottom-color: #FF637C;
346 | border-bottom-width: 2px;
347 | }
348 | ol li:last-of-type {
349 | border-bottom-style: none;
350 | padding: 0.1em 0.1em 0.1em 30px;
351 | }
352 |
353 | ol li:before{
354 | position: absolute;
355 | counter-increment: cnt;
356 | content: counter(cnt);
357 |
358 | display:inline-block;
359 | background: #FF637C;
360 | color: white;
361 | font-weight:bold;
362 | font-size: 15px;
363 | border-radius: 50%;
364 | left: 0;
365 | width: 25px;
366 | height: 25px;
367 | line-height: 25px;
368 | text-align: center;
369 |
370 | top: 12.5px;
371 | -webkit-transform: translateY(-50%);
372 | transform: translateY(-50%);
373 | }
374 |
375 | li img {
376 | margin-top: 0.5em;
377 | }
378 |
379 | .vp-doc img {
380 | border-radius: 10px;
381 | box-shadow: 5px 5px 15px #00164621;
382 | scale: 95%;
383 | }
384 |
385 | .vp-doc li p {
386 | margin: 0;
387 | }
388 |
389 | /* フェードイン */
390 |
391 | .vp-doc > div > * {
392 | opacity: 0;
393 | }
394 |
395 | .vp-doc > div > .fadeUp {
396 | animation: 0.5s cubic-bezier(0.215, 0.61, 0.355, 1) forwards fadeUpAnime !important;
397 | opacity:0;
398 | }
399 |
400 | @keyframes fadeUpAnime{
401 | from {
402 | opacity: 0;
403 | transform: translateY(20px);
404 | }
405 |
406 | to {
407 | opacity: 1;
408 | transform: translateY(0);
409 | }
410 | }
411 |
412 | /* 目次 */
413 |
414 | .table-of-contents {
415 | position: relative;
416 | margin-top: 2em;
417 | border-top: 2px solid #E65A5A;
418 | padding-top: 0.5em;
419 | padding-bottom: 0.5em;
420 | background-color: var(--vp-sidebar-bg-color);
421 | box-shadow: 5px 5px 15px #00164621;
422 | }
423 |
424 | .table-of-contents ul {
425 | list-style-type: none !important;
426 | }
427 |
428 | .table-of-contents > h1 {
429 | position: absolute;
430 | padding-left: 1em;
431 | padding-right: 1em;
432 | color: white;
433 | background-color: #E65A5A;
434 | border: 2px solid #E65A5A;
435 | border-radius: 8px;
436 | top: -0.9em;
437 | left: 1em;
438 | border-bottom-style: hidden;
439 | font-size: 1em;
440 | line-height: 1.5em;
441 | }
442 |
443 | .table-of-contents > h1:first-letter {
444 | font-size: 1em;
445 | color: white;
446 | }
447 |
448 | .table-of-contents h1::after {
449 | content: none;
450 | }
451 |
452 | .table-of-contents li {
453 | align-items: center;
454 | gap: 0 10px;
455 | position: relative;
456 | padding: .3em .3em .3em 1.5em;
457 | }
458 |
459 | .table-of-contents > ul > li::before {
460 | position: absolute;
461 | content: '';
462 | top: 0.55em;
463 | left: 0;
464 | width: 1em;
465 | height: 1em;
466 | border-radius: 50%;
467 | background-color: #E65A5A;
468 | }
469 |
470 | .table-of-contents > ul > li::after {
471 | position: absolute;
472 | content: '';
473 | top: 0.85em;
474 | left: 0.25em;
475 | transform: rotate(-45deg);
476 | width: 0.4em;
477 | height: 0.4em;
478 | border-bottom: 2px solid #fff;
479 | border-right: 2px solid #fff;
480 | }
481 |
482 | .table-of-contents > ul > li ul {
483 | padding-left: 0;
484 | }
485 |
486 | .table-of-contents > ul > li li::after {
487 | position: absolute;
488 | content: '';
489 | top: 0.85em;
490 | left: 0.25em;
491 | transform: rotate(-45deg);
492 | width: 0.4em;
493 | height: 0.4em;
494 | border-bottom: 2px solid #E65A5A;
495 | border-right: 2px solid #E65A5A;
496 | }
497 |
498 | .table-of-contents a {
499 | color: var(--vp-c-text-1);
500 | text-decoration: none;
501 | }
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Attribution 4.0 International
2 |
3 | =======================================================================
4 |
5 | Creative Commons Corporation ("Creative Commons") is not a law firm and
6 | does not provide legal services or legal advice. Distribution of
7 | Creative Commons public licenses does not create a lawyer-client or
8 | other relationship. Creative Commons makes its licenses and related
9 | information available on an "as-is" basis. Creative Commons gives no
10 | warranties regarding its licenses, any material licensed under their
11 | terms and conditions, or any related information. Creative Commons
12 | disclaims all liability for damages resulting from their use to the
13 | fullest extent possible.
14 |
15 | Using Creative Commons Public Licenses
16 |
17 | Creative Commons public licenses provide a standard set of terms and
18 | conditions that creators and other rights holders may use to share
19 | original works of authorship and other material subject to copyright
20 | and certain other rights specified in the public license below. The
21 | following considerations are for informational purposes only, are not
22 | exhaustive, and do not form part of our licenses.
23 |
24 | Considerations for licensors: Our public licenses are
25 | intended for use by those authorized to give the public
26 | permission to use material in ways otherwise restricted by
27 | copyright and certain other rights. Our licenses are
28 | irrevocable. Licensors should read and understand the terms
29 | and conditions of the license they choose before applying it.
30 | Licensors should also secure all rights necessary before
31 | applying our licenses so that the public can reuse the
32 | material as expected. Licensors should clearly mark any
33 | material not subject to the license. This includes other CC-
34 | licensed material, or material used under an exception or
35 | limitation to copyright. More considerations for licensors:
36 | wiki.creativecommons.org/Considerations_for_licensors
37 |
38 | Considerations for the public: By using one of our public
39 | licenses, a licensor grants the public permission to use the
40 | licensed material under specified terms and conditions. If
41 | the licensor's permission is not necessary for any reason--for
42 | example, because of any applicable exception or limitation to
43 | copyright--then that use is not regulated by the license. Our
44 | licenses grant only permissions under copyright and certain
45 | other rights that a licensor has authority to grant. Use of
46 | the licensed material may still be restricted for other
47 | reasons, including because others have copyright or other
48 | rights in the material. A licensor may make special requests,
49 | such as asking that all changes be marked or described.
50 | Although not required by our licenses, you are encouraged to
51 | respect those requests where reasonable. More considerations
52 | for the public:
53 | wiki.creativecommons.org/Considerations_for_licensees
54 |
55 | =======================================================================
56 |
57 | Creative Commons Attribution 4.0 International Public License
58 |
59 | By exercising the Licensed Rights (defined below), You accept and agree
60 | to be bound by the terms and conditions of this Creative Commons
61 | Attribution 4.0 International Public License ("Public License"). To the
62 | extent this Public License may be interpreted as a contract, You are
63 | granted the Licensed Rights in consideration of Your acceptance of
64 | these terms and conditions, and the Licensor grants You such rights in
65 | consideration of benefits the Licensor receives from making the
66 | Licensed Material available under these terms and conditions.
67 |
68 |
69 | Section 1 -- Definitions.
70 |
71 | a. Adapted Material means material subject to Copyright and Similar
72 | Rights that is derived from or based upon the Licensed Material
73 | and in which the Licensed Material is translated, altered,
74 | arranged, transformed, or otherwise modified in a manner requiring
75 | permission under the Copyright and Similar Rights held by the
76 | Licensor. For purposes of this Public License, where the Licensed
77 | Material is a musical work, performance, or sound recording,
78 | Adapted Material is always produced where the Licensed Material is
79 | synched in timed relation with a moving image.
80 |
81 | b. Adapter's License means the license You apply to Your Copyright
82 | and Similar Rights in Your contributions to Adapted Material in
83 | accordance with the terms and conditions of this Public License.
84 |
85 | c. Copyright and Similar Rights means copyright and/or similar rights
86 | closely related to copyright including, without limitation,
87 | performance, broadcast, sound recording, and Sui Generis Database
88 | Rights, without regard to how the rights are labeled or
89 | categorized. For purposes of this Public License, the rights
90 | specified in Section 2(b)(1)-(2) are not Copyright and Similar
91 | Rights.
92 |
93 | d. Effective Technological Measures means those measures that, in the
94 | absence of proper authority, may not be circumvented under laws
95 | fulfilling obligations under Article 11 of the WIPO Copyright
96 | Treaty adopted on December 20, 1996, and/or similar international
97 | agreements.
98 |
99 | e. Exceptions and Limitations means fair use, fair dealing, and/or
100 | any other exception or limitation to Copyright and Similar Rights
101 | that applies to Your use of the Licensed Material.
102 |
103 | f. Licensed Material means the artistic or literary work, database,
104 | or other material to which the Licensor applied this Public
105 | License.
106 |
107 | g. Licensed Rights means the rights granted to You subject to the
108 | terms and conditions of this Public License, which are limited to
109 | all Copyright and Similar Rights that apply to Your use of the
110 | Licensed Material and that the Licensor has authority to license.
111 |
112 | h. Licensor means the individual(s) or entity(ies) granting rights
113 | under this Public License.
114 |
115 | i. Share means to provide material to the public by any means or
116 | process that requires permission under the Licensed Rights, such
117 | as reproduction, public display, public performance, distribution,
118 | dissemination, communication, or importation, and to make material
119 | available to the public including in ways that members of the
120 | public may access the material from a place and at a time
121 | individually chosen by them.
122 |
123 | j. Sui Generis Database Rights means rights other than copyright
124 | resulting from Directive 96/9/EC of the European Parliament and of
125 | the Council of 11 March 1996 on the legal protection of databases,
126 | as amended and/or succeeded, as well as other essentially
127 | equivalent rights anywhere in the world.
128 |
129 | k. You means the individual or entity exercising the Licensed Rights
130 | under this Public License. Your has a corresponding meaning.
131 |
132 |
133 | Section 2 -- Scope.
134 |
135 | a. License grant.
136 |
137 | 1. Subject to the terms and conditions of this Public License,
138 | the Licensor hereby grants You a worldwide, royalty-free,
139 | non-sublicensable, non-exclusive, irrevocable license to
140 | exercise the Licensed Rights in the Licensed Material to:
141 |
142 | a. reproduce and Share the Licensed Material, in whole or
143 | in part; and
144 |
145 | b. produce, reproduce, and Share Adapted Material.
146 |
147 | 2. Exceptions and Limitations. For the avoidance of doubt, where
148 | Exceptions and Limitations apply to Your use, this Public
149 | License does not apply, and You do not need to comply with
150 | its terms and conditions.
151 |
152 | 3. Term. The term of this Public License is specified in Section
153 | 6(a).
154 |
155 | 4. Media and formats; technical modifications allowed. The
156 | Licensor authorizes You to exercise the Licensed Rights in
157 | all media and formats whether now known or hereafter created,
158 | and to make technical modifications necessary to do so. The
159 | Licensor waives and/or agrees not to assert any right or
160 | authority to forbid You from making technical modifications
161 | necessary to exercise the Licensed Rights, including
162 | technical modifications necessary to circumvent Effective
163 | Technological Measures. For purposes of this Public License,
164 | simply making modifications authorized by this Section 2(a)
165 | (4) never produces Adapted Material.
166 |
167 | 5. Downstream recipients.
168 |
169 | a. Offer from the Licensor -- Licensed Material. Every
170 | recipient of the Licensed Material automatically
171 | receives an offer from the Licensor to exercise the
172 | Licensed Rights under the terms and conditions of this
173 | Public License.
174 |
175 | b. No downstream restrictions. You may not offer or impose
176 | any additional or different terms or conditions on, or
177 | apply any Effective Technological Measures to, the
178 | Licensed Material if doing so restricts exercise of the
179 | Licensed Rights by any recipient of the Licensed
180 | Material.
181 |
182 | 6. No endorsement. Nothing in this Public License constitutes or
183 | may be construed as permission to assert or imply that You
184 | are, or that Your use of the Licensed Material is, connected
185 | with, or sponsored, endorsed, or granted official status by,
186 | the Licensor or others designated to receive attribution as
187 | provided in Section 3(a)(1)(A)(i).
188 |
189 | b. Other rights.
190 |
191 | 1. Moral rights, such as the right of integrity, are not
192 | licensed under this Public License, nor are publicity,
193 | privacy, and/or other similar personality rights; however, to
194 | the extent possible, the Licensor waives and/or agrees not to
195 | assert any such rights held by the Licensor to the limited
196 | extent necessary to allow You to exercise the Licensed
197 | Rights, but not otherwise.
198 |
199 | 2. Patent and trademark rights are not licensed under this
200 | Public License.
201 |
202 | 3. To the extent possible, the Licensor waives any right to
203 | collect royalties from You for the exercise of the Licensed
204 | Rights, whether directly or through a collecting society
205 | under any voluntary or waivable statutory or compulsory
206 | licensing scheme. In all other cases the Licensor expressly
207 | reserves any right to collect such royalties.
208 |
209 |
210 | Section 3 -- License Conditions.
211 |
212 | Your exercise of the Licensed Rights is expressly made subject to the
213 | following conditions.
214 |
215 | a. Attribution.
216 |
217 | 1. If You Share the Licensed Material (including in modified
218 | form), You must:
219 |
220 | a. retain the following if it is supplied by the Licensor
221 | with the Licensed Material:
222 |
223 | i. identification of the creator(s) of the Licensed
224 | Material and any others designated to receive
225 | attribution, in any reasonable manner requested by
226 | the Licensor (including by pseudonym if
227 | designated);
228 |
229 | ii. a copyright notice;
230 |
231 | iii. a notice that refers to this Public License;
232 |
233 | iv. a notice that refers to the disclaimer of
234 | warranties;
235 |
236 | v. a URI or hyperlink to the Licensed Material to the
237 | extent reasonably practicable;
238 |
239 | b. indicate if You modified the Licensed Material and
240 | retain an indication of any previous modifications; and
241 |
242 | c. indicate the Licensed Material is licensed under this
243 | Public License, and include the text of, or the URI or
244 | hyperlink to, this Public License.
245 |
246 | 2. You may satisfy the conditions in Section 3(a)(1) in any
247 | reasonable manner based on the medium, means, and context in
248 | which You Share the Licensed Material. For example, it may be
249 | reasonable to satisfy the conditions by providing a URI or
250 | hyperlink to a resource that includes the required
251 | information.
252 |
253 | 3. If requested by the Licensor, You must remove any of the
254 | information required by Section 3(a)(1)(A) to the extent
255 | reasonably practicable.
256 |
257 | 4. If You Share Adapted Material You produce, the Adapter's
258 | License You apply must not prevent recipients of the Adapted
259 | Material from complying with this Public License.
260 |
261 |
262 | Section 4 -- Sui Generis Database Rights.
263 |
264 | Where the Licensed Rights include Sui Generis Database Rights that
265 | apply to Your use of the Licensed Material:
266 |
267 | a. for the avoidance of doubt, Section 2(a)(1) grants You the right
268 | to extract, reuse, reproduce, and Share all or a substantial
269 | portion of the contents of the database;
270 |
271 | b. if You include all or a substantial portion of the database
272 | contents in a database in which You have Sui Generis Database
273 | Rights, then the database in which You have Sui Generis Database
274 | Rights (but not its individual contents) is Adapted Material; and
275 |
276 | c. You must comply with the conditions in Section 3(a) if You Share
277 | all or a substantial portion of the contents of the database.
278 |
279 | For the avoidance of doubt, this Section 4 supplements and does not
280 | replace Your obligations under this Public License where the Licensed
281 | Rights include other Copyright and Similar Rights.
282 |
283 |
284 | Section 5 -- Disclaimer of Warranties and Limitation of Liability.
285 |
286 | a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
287 | EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
288 | AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
289 | ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
290 | IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
291 | WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
292 | PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
293 | ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
294 | KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
295 | ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
296 |
297 | b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
298 | TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
299 | NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
300 | INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
301 | COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
302 | USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
303 | ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
304 | DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
305 | IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
306 |
307 | c. The disclaimer of warranties and limitation of liability provided
308 | above shall be interpreted in a manner that, to the extent
309 | possible, most closely approximates an absolute disclaimer and
310 | waiver of all liability.
311 |
312 |
313 | Section 6 -- Term and Termination.
314 |
315 | a. This Public License applies for the term of the Copyright and
316 | Similar Rights licensed here. However, if You fail to comply with
317 | this Public License, then Your rights under this Public License
318 | terminate automatically.
319 |
320 | b. Where Your right to use the Licensed Material has terminated under
321 | Section 6(a), it reinstates:
322 |
323 | 1. automatically as of the date the violation is cured, provided
324 | it is cured within 30 days of Your discovery of the
325 | violation; or
326 |
327 | 2. upon express reinstatement by the Licensor.
328 |
329 | For the avoidance of doubt, this Section 6(b) does not affect any
330 | right the Licensor may have to seek remedies for Your violations
331 | of this Public License.
332 |
333 | c. For the avoidance of doubt, the Licensor may also offer the
334 | Licensed Material under separate terms or conditions or stop
335 | distributing the Licensed Material at any time; however, doing so
336 | will not terminate this Public License.
337 |
338 | d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
339 | License.
340 |
341 |
342 | Section 7 -- Other Terms and Conditions.
343 |
344 | a. The Licensor shall not be bound by any additional or different
345 | terms or conditions communicated by You unless expressly agreed.
346 |
347 | b. Any arrangements, understandings, or agreements regarding the
348 | Licensed Material not stated herein are separate from and
349 | independent of the terms and conditions of this Public License.
350 |
351 |
352 | Section 8 -- Interpretation.
353 |
354 | a. For the avoidance of doubt, this Public License does not, and
355 | shall not be interpreted to, reduce, limit, restrict, or impose
356 | conditions on any use of the Licensed Material that could lawfully
357 | be made without permission under this Public License.
358 |
359 | b. To the extent possible, if any provision of this Public License is
360 | deemed unenforceable, it shall be automatically reformed to the
361 | minimum extent necessary to make it enforceable. If the provision
362 | cannot be reformed, it shall be severed from this Public License
363 | without affecting the enforceability of the remaining terms and
364 | conditions.
365 |
366 | c. No term or condition of this Public License will be waived and no
367 | failure to comply consented to unless expressly agreed to by the
368 | Licensor.
369 |
370 | d. Nothing in this Public License constitutes or may be interpreted
371 | as a limitation upon, or waiver of, any privileges and immunities
372 | that apply to the Licensor or You, including from the legal
373 | processes of any jurisdiction or authority.
374 |
375 |
376 | =======================================================================
377 |
378 | Creative Commons is not a party to its public
379 | licenses. Notwithstanding, Creative Commons may elect to apply one of
380 | its public licenses to material it publishes and in those instances
381 | will be considered the “Licensor.” The text of the Creative Commons
382 | public licenses is dedicated to the public domain under the CC0 Public
383 | Domain Dedication. Except for the limited purpose of indicating that
384 | material is shared under a Creative Commons public license or as
385 | otherwise permitted by the Creative Commons policies published at
386 | creativecommons.org/policies, Creative Commons does not authorize the
387 | use of the trademark "Creative Commons" or any other trademark or logo
388 | of Creative Commons without its prior written consent including,
389 | without limitation, in connection with any unauthorized modifications
390 | to any of its public licenses or any other arrangements,
391 | understandings, or agreements concerning use of licensed material. For
392 | the avoidance of doubt, this paragraph does not form part of the
393 | public licenses.
394 |
395 | Creative Commons may be contacted at creativecommons.org.
396 |
--------------------------------------------------------------------------------
/docs/.vitepress/theme/md/twemoji.js:
--------------------------------------------------------------------------------
1 | /*jslint indent: 2, browser: true, bitwise: true, plusplus: true */
2 | export var twemoji = (function (
3 | /*! Copyright Twitter Inc. and other contributors. Licensed under MIT *//*
4 | https://github.com/jdecked/twemoji/blob/gh-pages/LICENSE
5 | */
6 |
7 | // WARNING: this file is generated automatically via
8 | // `node scripts/build.js`
9 | // please update its `createTwemoji` function
10 | // at the bottom of the same file instead.
11 |
12 | ) {
13 | 'use strict';
14 |
15 | /*jshint maxparams:4 */
16 |
17 | var
18 | // the exported module object
19 | twemoji = {
20 |
21 |
22 | /////////////////////////
23 | // properties //
24 | /////////////////////////
25 |
26 | // default assets url, by default will be jsDelivr CDN
27 | base: 'https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/',
28 |
29 | // default assets file extensions, by default '.png'
30 | ext: '.png',
31 |
32 | // default assets/folder size, by default "72x72"
33 | // available via jsDelivr: 72
34 | size: '72x72',
35 |
36 | // default class name, by default 'emoji'
37 | className: 'emoji',
38 |
39 | // basic utilities / helpers to convert code points
40 | // to JavaScript surrogates and vice versa
41 | convert: {
42 |
43 | /**
44 | * Given an HEX codepoint, returns UTF16 surrogate pairs.
45 | *
46 | * @param string generic codepoint, i.e. '1F4A9'
47 | * @return string codepoint transformed into utf16 surrogates pair,
48 | * i.e. \uD83D\uDCA9
49 | *
50 | * @example
51 | * twemoji.convert.fromCodePoint('1f1e8');
52 | * // "\ud83c\udde8"
53 | *
54 | * '1f1e8-1f1f3'.split('-').map(twemoji.convert.fromCodePoint).join('')
55 | * // "\ud83c\udde8\ud83c\uddf3"
56 | */
57 | fromCodePoint: fromCodePoint,
58 |
59 | /**
60 | * Given UTF16 surrogate pairs, returns the equivalent HEX codepoint.
61 | *
62 | * @param string generic utf16 surrogates pair, i.e. \uD83D\uDCA9
63 | * @param string optional separator for double code points, default='-'
64 | * @return string utf16 transformed into codepoint, i.e. '1F4A9'
65 | *
66 | * @example
67 | * twemoji.convert.toCodePoint('\ud83c\udde8\ud83c\uddf3');
68 | * // "1f1e8-1f1f3"
69 | *
70 | * twemoji.convert.toCodePoint('\ud83c\udde8\ud83c\uddf3', '~');
71 | * // "1f1e8~1f1f3"
72 | */
73 | toCodePoint: toCodePoint
74 | },
75 |
76 |
77 | /////////////////////////
78 | // methods //
79 | /////////////////////////
80 |
81 | /**
82 | * User first: used to remove missing images
83 | * preserving the original text intent when
84 | * a fallback for network problems is desired.
85 | * Automatically added to Image nodes via DOM
86 | * It could be recycled for string operations via:
87 | * $('img.emoji').on('error', twemoji.onerror)
88 | */
89 | onerror: function onerror() {
90 | if (this.parentNode) {
91 | this.parentNode.replaceChild(createText(this.alt, false), this);
92 | }
93 | },
94 |
95 | /**
96 | * Main method/logic to generate either
tags or HTMLImage nodes.
97 | * "emojify" a generic text or DOM Element.
98 | *
99 | * @overloads
100 | *
101 | * String replacement for `innerHTML` or server side operations
102 | * twemoji.parse(string);
103 | * twemoji.parse(string, Function);
104 | * twemoji.parse(string, Object);
105 | *
106 | * HTMLElement tree parsing for safer operations over existing DOM
107 | * twemoji.parse(HTMLElement);
108 | * twemoji.parse(HTMLElement, Function);
109 | * twemoji.parse(HTMLElement, Object);
110 | *
111 | * @param string|HTMLElement the source to parse and enrich with emoji.
112 | *
113 | * string replace emoji matches with
tags.
114 | * Mainly used to inject emoji via `innerHTML`
115 | * It does **not** parse the string or validate it,
116 | * it simply replaces found emoji with a tag.
117 | * NOTE: be sure this won't affect security.
118 | *
119 | * HTMLElement walk through the DOM tree and find emoji
120 | * that are inside **text node only** (nodeType === 3)
121 | * Mainly used to put emoji in already generated DOM
122 | * without compromising surrounding nodes and
123 | * **avoiding** the usage of `innerHTML`.
124 | * NOTE: Using DOM elements instead of strings should
125 | * improve security without compromising too much
126 | * performance compared with a less safe `innerHTML`.
127 | *
128 | * @param Function|Object [optional]
129 | * either the callback that will be invoked or an object
130 | * with all properties to use per each found emoji.
131 | *
132 | * Function if specified, this will be invoked per each emoji
133 | * that has been found through the RegExp except
134 | * those follwed by the invariant \uFE0E ("as text").
135 | * Once invoked, parameters will be:
136 | *
137 | * iconId:string the lower case HEX code point
138 | * i.e. "1f4a9"
139 | *
140 | * options:Object all info for this parsing operation
141 | *
142 | * variant:char the optional \uFE0F ("as image")
143 | * variant, in case this info
144 | * is anyhow meaningful.
145 | * By default this is ignored.
146 | *
147 | * If such callback will return a falsy value instead
148 | * of a valid `src` to use for the image, nothing will
149 | * actually change for that specific emoji.
150 | *
151 | *
152 | * Object if specified, an object containing the following properties
153 | *
154 | * callback Function the callback to invoke per each found emoji.
155 | * base string the base url, by default twemoji.base
156 | * ext string the image extension, by default twemoji.ext
157 | * size string the assets size, by default twemoji.size
158 | *
159 | * @example
160 | *
161 | * twemoji.parse("I \u2764\uFE0F emoji!");
162 | * // I
emoji!
163 | *
164 | *
165 | * twemoji.parse("I \u2764\uFE0F emoji!", function(iconId, options) {
166 | * return '/assets/' + iconId + '.gif';
167 | * });
168 | * // I
emoji!
169 | *
170 | *
171 | * twemoji.parse("I \u2764\uFE0F emoji!", {
172 | * size: 72,
173 | * callback: function(iconId, options) {
174 | * return '/assets/' + options.size + '/' + iconId + options.ext;
175 | * }
176 | * });
177 | * // I
emoji!
178 | *
179 | */
180 | parse: parse,
181 |
182 | /**
183 | * Given a string, invokes the callback argument
184 | * per each emoji found in such string.
185 | * This is the most raw version used by
186 | * the .parse(string) method itself.
187 | *
188 | * @param string generic string to parse
189 | * @param Function a generic callback that will be
190 | * invoked to replace the content.
191 | * This callback will receive standard
192 | * String.prototype.replace(str, callback)
193 | * arguments such:
194 | * callback(
195 | * rawText, // the emoji match
196 | * );
197 | *
198 | * and others commonly received via replace.
199 | */
200 | replace: replace,
201 |
202 | /**
203 | * Simplify string tests against emoji.
204 | *
205 | * @param string some text that might contain emoji
206 | * @return boolean true if any emoji was found, false otherwise.
207 | *
208 | * @example
209 | *
210 | * if (twemoji.test(someContent)) {
211 | * console.log("emoji All The Things!");
212 | * }
213 | */
214 | test: test
215 | },
216 |
217 | // used to escape HTML special chars in attributes
218 | escaper = {
219 | '&': '&',
220 | '<': '<',
221 | '>': '>',
222 | "'": ''',
223 | '"': '"'
224 | },
225 |
226 | // RegExp based on emoji's official Unicode standards
227 | // http://www.unicode.org/Public/UNIDATA/EmojiSources.txt
228 | re = /(?:\ud83d\udc68\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffc-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb\udffd-\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb\udffc\udffe\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb-\udffd\udfff]|\ud83e\uddd1\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb-\udffe]|\ud83d\udc68\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffc-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffd-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc68\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffd\udfff]|\ud83d\udc68\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffe]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffc-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffc-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffd-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb\udffd-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffd\udfff]|\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb-\udffd\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffe]|\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb-\udffe]|\ud83e\uddd1\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffc-\udfff]|\ud83e\uddd1\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb\udffd-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb\udffc\udffe\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb-\udffd\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb-\udffe]|\ud83e\uddd1\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d[\udc68\udc69]|\ud83e\udef1\ud83c\udffb\u200d\ud83e\udef2\ud83c[\udffc-\udfff]|\ud83e\udef1\ud83c\udffc\u200d\ud83e\udef2\ud83c[\udffb\udffd-\udfff]|\ud83e\udef1\ud83c\udffd\u200d\ud83e\udef2\ud83c[\udffb\udffc\udffe\udfff]|\ud83e\udef1\ud83c\udffe\u200d\ud83e\udef2\ud83c[\udffb-\udffd\udfff]|\ud83e\udef1\ud83c\udfff\u200d\ud83e\udef2\ud83c[\udffb-\udffe]|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d[\udc68\udc69]|\ud83e\uddd1\u200d\ud83e\udd1d\u200d\ud83e\uddd1|\ud83d\udc6b\ud83c[\udffb-\udfff]|\ud83d\udc6c\ud83c[\udffb-\udfff]|\ud83d\udc6d\ud83c[\udffb-\udfff]|\ud83d\udc8f\ud83c[\udffb-\udfff]|\ud83d\udc91\ud83c[\udffb-\udfff]|\ud83e\udd1d\ud83c[\udffb-\udfff]|\ud83d[\udc6b-\udc6d\udc8f\udc91]|\ud83e\udd1d)|(?:\ud83d[\udc68\udc69]|\ud83e\uddd1)(?:\ud83c[\udffb-\udfff])?\u200d(?:\u2695\ufe0f|\u2696\ufe0f|\u2708\ufe0f|\ud83c[\udf3e\udf73\udf7c\udf84\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e[\uddaf-\uddb3\uddbc\uddbd])(?:\u200d\u27a1\ufe0f)?|(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75]|\u26f9)((?:\ud83c[\udffb-\udfff]|\ufe0f)\u200d[\u2640\u2642]\ufe0f(?:\u200d\u27a1\ufe0f)?)|(?:\ud83c[\udfc3\udfc4\udfca]|\ud83d[\udc6e\udc70\udc71\udc73\udc77\udc81\udc82\udc86\udc87\ude45-\ude47\ude4b\ude4d\ude4e\udea3\udeb4-\udeb6]|\ud83e[\udd26\udd35\udd37-\udd39\udd3d\udd3e\uddb8\uddb9\uddcd-\uddcf\uddd4\uddd6-\udddd])(?:\ud83c[\udffb-\udfff])?\u200d[\u2640\u2642]\ufe0f(?:\u200d\u27a1\ufe0f)?|(?:\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83e\uddd1\u200d\ud83e\uddd1\u200d\ud83e\uddd2\u200d\ud83e\uddd2|\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83e\uddd1\u200d\ud83e\uddd1\u200d\ud83e\uddd2|\ud83e\uddd1\u200d\ud83e\uddd2\u200d\ud83e\uddd2|\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f|\ud83c\udff3\ufe0f\u200d\ud83c\udf08|\ud83d\ude36\u200d\ud83c\udf2b\ufe0f|\u26d3\ufe0f\u200d\ud83d\udca5|\u2764\ufe0f\u200d\ud83d\udd25|\u2764\ufe0f\u200d\ud83e\ude79|\ud83c\udf44\u200d\ud83d\udfeb|\ud83c\udf4b\u200d\ud83d\udfe9|\ud83c\udff4\u200d\u2620\ufe0f|\ud83d\udc15\u200d\ud83e\uddba|\ud83d\udc26\u200d\ud83d\udd25|\ud83d\udc3b\u200d\u2744\ufe0f|\ud83d\udc41\u200d\ud83d\udde8|\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc6f\u200d\u2640\ufe0f|\ud83d\udc6f\u200d\u2642\ufe0f|\ud83d\ude2e\u200d\ud83d\udca8|\ud83d\ude35\u200d\ud83d\udcab|\ud83d\ude42\u200d\u2194\ufe0f|\ud83d\ude42\u200d\u2195\ufe0f|\ud83e\udd3c\u200d\u2640\ufe0f|\ud83e\udd3c\u200d\u2642\ufe0f|\ud83e\uddd1\u200d\ud83e\uddd2|\ud83e\uddde\u200d\u2640\ufe0f|\ud83e\uddde\u200d\u2642\ufe0f|\ud83e\udddf\u200d\u2640\ufe0f|\ud83e\udddf\u200d\u2642\ufe0f|\ud83d\udc08\u200d\u2b1b|\ud83d\udc26\u200d\u2b1b)|[#*0-9]\ufe0f?\u20e3|(?:[©®\u2122\u265f]\ufe0f)|(?:\ud83c[\udc04\udd70\udd71\udd7e\udd7f\ude02\ude1a\ude2f\ude37\udf21\udf24-\udf2c\udf36\udf7d\udf96\udf97\udf99-\udf9b\udf9e\udf9f\udfcd\udfce\udfd4-\udfdf\udff3\udff5\udff7]|\ud83d[\udc3f\udc41\udcfd\udd49\udd4a\udd6f\udd70\udd73\udd76-\udd79\udd87\udd8a-\udd8d\udda5\udda8\uddb1\uddb2\uddbc\uddc2-\uddc4\uddd1-\uddd3\udddc-\uddde\udde1\udde3\udde8\uddef\uddf3\uddfa\udecb\udecd-\udecf\udee0-\udee5\udee9\udef0\udef3]|[\u203c\u2049\u2139\u2194-\u2199\u21a9\u21aa\u231a\u231b\u2328\u23cf\u23ed-\u23ef\u23f1\u23f2\u23f8-\u23fa\u24c2\u25aa\u25ab\u25b6\u25c0\u25fb-\u25fe\u2600-\u2604\u260e\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262a\u262e\u262f\u2638-\u263a\u2640\u2642\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267b\u267f\u2692-\u2697\u2699\u269b\u269c\u26a0\u26a1\u26a7\u26aa\u26ab\u26b0\u26b1\u26bd\u26be\u26c4\u26c5\u26c8\u26cf\u26d1\u26d3\u26d4\u26e9\u26ea\u26f0-\u26f5\u26f8\u26fa\u26fd\u2702\u2708\u2709\u270f\u2712\u2714\u2716\u271d\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u2764\u27a1\u2934\u2935\u2b05-\u2b07\u2b1b\u2b1c\u2b50\u2b55\u3030\u303d\u3297\u3299])(?:\ufe0f|(?!\ufe0e))|(?:(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75\udd90]|\ud83e\udef0|[\u261d\u26f7\u26f9\u270c\u270d])(?:\ufe0f|(?!\ufe0e))|(?:\ud83c\udfc3|\ud83d\udeb6|\ud83e\uddce)(?:\ud83c[\udffb-\udfff])?(?:\u200d\u27a1\ufe0f)?|(?:\ud83c[\udf85\udfc2\udfc4\udfc7\udfca]|\ud83d[\udc42\udc43\udc46-\udc50\udc66-\udc69\udc6e\udc70-\udc78\udc7c\udc81-\udc83\udc85-\udc87\udcaa\udd7a\udd95\udd96\ude45-\ude47\ude4b-\ude4f\udea3\udeb4\udeb5\udec0\udecc]|\ud83e[\udd0c\udd0f\udd18-\udd1c\udd1e\udd1f\udd26\udd30-\udd39\udd3d\udd3e\udd77\uddb5\uddb6\uddb8\uddb9\uddbb\uddcd\uddcf\uddd1-\udddd\udec3-\udec5\udef1-\udef8]|[\u270a\u270b]))(?:\ud83c[\udffb-\udfff])?|(?:\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f|\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f|\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f|\ud83c\udde6\ud83c[\udde8-\uddec\uddee\uddf1\uddf2\uddf4\uddf6-\uddfa\uddfc\uddfd\uddff]|\ud83c\udde7\ud83c[\udde6\udde7\udde9-\uddef\uddf1-\uddf4\uddf6-\uddf9\uddfb\uddfc\uddfe\uddff]|\ud83c\udde8\ud83c[\udde6\udde8\udde9\uddeb-\uddee\uddf0-\uddf5\uddf7\uddfa-\uddff]|\ud83c\udde9\ud83c[\uddea\uddec\uddef\uddf0\uddf2\uddf4\uddff]|\ud83c\uddea\ud83c[\udde6\udde8\uddea\uddec\udded\uddf7-\uddfa]|\ud83c\uddeb\ud83c[\uddee-\uddf0\uddf2\uddf4\uddf7]|\ud83c\uddec\ud83c[\udde6\udde7\udde9-\uddee\uddf1-\uddf3\uddf5-\uddfa\uddfc\uddfe]|\ud83c\udded\ud83c[\uddf0\uddf2\uddf3\uddf7\uddf9\uddfa]|\ud83c\uddee\ud83c[\udde8-\uddea\uddf1-\uddf4\uddf6-\uddf9]|\ud83c\uddef\ud83c[\uddea\uddf2\uddf4\uddf5]|\ud83c\uddf0\ud83c[\uddea\uddec-\uddee\uddf2\uddf3\uddf5\uddf7\uddfc\uddfe\uddff]|\ud83c\uddf1\ud83c[\udde6-\udde8\uddee\uddf0\uddf7-\uddfb\uddfe]|\ud83c\uddf2\ud83c[\udde6\udde8-\udded\uddf0-\uddff]|\ud83c\uddf3\ud83c[\udde6\udde8\uddea-\uddec\uddee\uddf1\uddf4\uddf5\uddf7\uddfa\uddff]|\ud83c\uddf4\ud83c\uddf2|\ud83c\uddf5\ud83c[\udde6\uddea-\udded\uddf0-\uddf3\uddf7-\uddf9\uddfc\uddfe]|\ud83c\uddf6\ud83c\udde6|\ud83c\uddf7\ud83c[\uddea\uddf4\uddf8\uddfa\uddfc]|\ud83c\uddf8\ud83c[\udde6-\uddea\uddec-\uddf4\uddf7-\uddf9\uddfb\uddfd-\uddff]|\ud83c\uddf9\ud83c[\udde6\udde8\udde9\uddeb-\udded\uddef-\uddf4\uddf7\uddf9\uddfb\uddfc\uddff]|\ud83c\uddfa\ud83c[\udde6\uddec\uddf2\uddf3\uddf8\uddfe\uddff]|\ud83c\uddfb\ud83c[\udde6\udde8\uddea\uddec\uddee\uddf3\uddfa]|\ud83c\uddfc\ud83c[\uddeb\uddf8]|\ud83c\uddfd\ud83c\uddf0|\ud83c\uddfe\ud83c[\uddea\uddf9]|\ud83c\uddff\ud83c[\udde6\uddf2\uddfc]|\ud83c[\udccf\udd8e\udd91-\udd9a\udde6-\uddff\ude01\ude32-\ude36\ude38-\ude3a\ude50\ude51\udf00-\udf20\udf2d-\udf35\udf37-\udf7c\udf7e-\udf84\udf86-\udf93\udfa0-\udfc1\udfc5\udfc6\udfc8\udfc9\udfcf-\udfd3\udfe0-\udff0\udff4\udff8-\udfff]|\ud83d[\udc00-\udc3e\udc40\udc44\udc45\udc51-\udc65\udc6a\udc6f\udc79-\udc7b\udc7d-\udc80\udc84\udc88-\udc8e\udc90\udc92-\udca9\udcab-\udcfc\udcff-\udd3d\udd4b-\udd4e\udd50-\udd67\udda4\uddfb-\ude44\ude48-\ude4a\ude80-\udea2\udea4-\udeb3\udeb7-\udebf\udec1-\udec5\uded0-\uded2\uded5-\uded7\udedc-\udedf\udeeb\udeec\udef4-\udefc\udfe0-\udfeb\udff0]|\ud83e[\udd0d\udd0e\udd10-\udd17\udd20-\udd25\udd27-\udd2f\udd3a\udd3c\udd3f-\udd45\udd47-\udd76\udd78-\uddb4\uddb7\uddba\uddbc-\uddcc\uddd0\uddde-\uddff\ude70-\ude7c\ude80-\ude88\ude90-\udebd\udebf-\udec2\udece-\udedb\udee0-\udee8]|[\u23e9-\u23ec\u23f0\u23f3\u267e\u26ce\u2705\u2728\u274c\u274e\u2753-\u2755\u2795-\u2797\u27b0\u27bf\ue50a])|\ufe0f/g,
229 |
230 | // avoid runtime RegExp creation for not so smart,
231 | // not JIT based, and old browsers / engines
232 | UFE0Fg = /\uFE0F/g,
233 |
234 | // avoid using a string literal like '\u200D' here because minifiers expand it inline
235 | U200D = String.fromCharCode(0x200D),
236 |
237 | // used to find HTML special chars in attributes
238 | rescaper = /[&<>'"]/g,
239 |
240 | // nodes with type 1 which should **not** be parsed
241 | shouldntBeParsed = /^(?:iframe|noframes|noscript|script|select|style|textarea)$/,
242 |
243 | // just a private shortcut
244 | fromCharCode = String.fromCharCode;
245 |
246 | return twemoji;
247 |
248 |
249 | /////////////////////////
250 | // private functions //
251 | // declaration //
252 | /////////////////////////
253 |
254 | /**
255 | * Shortcut to create text nodes
256 | * @param string text used to create DOM text node
257 | * @return Node a DOM node with that text
258 | */
259 | function createText(text, clean) {
260 | return document.createTextNode(clean ? text.replace(UFE0Fg, '') : text);
261 | }
262 |
263 | /**
264 | * Utility function to escape html attribute text
265 | * @param string text use in HTML attribute
266 | * @return string text encoded to use in HTML attribute
267 | */
268 | function escapeHTML(s) {
269 | return s.replace(rescaper, replacer);
270 | }
271 |
272 | /**
273 | * Default callback used to generate emoji src
274 | * based on jsDelivr CDN
275 | * @param string the emoji codepoint string
276 | * @param string the default size to use, i.e. "36x36"
277 | * @return string the image source to use
278 | */
279 | function defaultImageSrcGenerator(icon, options) {
280 | return ''.concat(options.base, options.size, '/', icon, options.ext);
281 | }
282 |
283 | /**
284 | * Given a generic DOM nodeType 1, walk through all children
285 | * and store every nodeType 3 (#text) found in the tree.
286 | * @param Element a DOM Element with probably some text in it
287 | * @param Array the list of previously discovered text nodes
288 | * @return Array same list with new discovered nodes, if any
289 | */
290 | function grabAllTextNodes(node, allText) {
291 | var
292 | childNodes = node.childNodes,
293 | length = childNodes.length,
294 | subnode,
295 | nodeType;
296 | while (length--) {
297 | subnode = childNodes[length];
298 | nodeType = subnode.nodeType;
299 | // parse emoji only in text nodes
300 | if (nodeType === 3) {
301 | // collect them to process emoji later
302 | allText.push(subnode);
303 | }
304 | // ignore all nodes that are not type 1, that are svg, or that
305 | // should not be parsed as script, style, and others
306 | else if (nodeType === 1 && !('ownerSVGElement' in subnode) &&
307 | !shouldntBeParsed.test(subnode.nodeName.toLowerCase())) {
308 | grabAllTextNodes(subnode, allText);
309 | }
310 | }
311 | return allText;
312 | }
313 |
314 | /**
315 | * Used to both remove the possible variant
316 | * and to convert utf16 into code points.
317 | * If there is a zero-width-joiner (U+200D), leave the variants in.
318 | * @param string the raw text of the emoji match
319 | * @return string the code point
320 | */
321 | function grabTheRightIcon(rawText) {
322 | // if variant is present as \uFE0F
323 | return toCodePoint(rawText.indexOf(U200D) < 0 ?
324 | rawText.replace(UFE0Fg, '') :
325 | rawText
326 | );
327 | }
328 |
329 | /**
330 | * DOM version of the same logic / parser:
331 | * emojify all found sub-text nodes placing images node instead.
332 | * @param Element generic DOM node with some text in some child node
333 | * @param Object options containing info about how to parse
334 | *
335 | * .callback Function the callback to invoke per each found emoji.
336 | * .base string the base url, by default twemoji.base
337 | * .ext string the image extension, by default twemoji.ext
338 | * .size string the assets size, by default twemoji.size
339 | *
340 | * @return Element same generic node with emoji in place, if any.
341 | */
342 | function parseNode(node, options) {
343 | var
344 | allText = grabAllTextNodes(node, []),
345 | length = allText.length,
346 | attrib,
347 | attrname,
348 | modified,
349 | fragment,
350 | subnode,
351 | text,
352 | match,
353 | i,
354 | index,
355 | img,
356 | rawText,
357 | iconId,
358 | src;
359 | while (length--) {
360 | modified = false;
361 | fragment = document.createDocumentFragment();
362 | subnode = allText[length];
363 | text = subnode.nodeValue;
364 | i = 0;
365 | while ((match = re.exec(text))) {
366 | index = match.index;
367 | if (index !== i) {
368 | fragment.appendChild(
369 | createText(text.slice(i, index), true)
370 | );
371 | }
372 | rawText = match[0];
373 | iconId = grabTheRightIcon(rawText);
374 | i = index + rawText.length;
375 | src = options.callback(iconId, options);
376 | if (iconId && src) {
377 | img = new Image();
378 | img.onerror = options.onerror;
379 | img.setAttribute('draggable', 'false');
380 | attrib = options.attributes(rawText, iconId);
381 | for (attrname in attrib) {
382 | if (
383 | attrib.hasOwnProperty(attrname) &&
384 | // don't allow any handlers to be set + don't allow overrides
385 | attrname.indexOf('on') !== 0 &&
386 | !img.hasAttribute(attrname)
387 | ) {
388 | img.setAttribute(attrname, attrib[attrname]);
389 | }
390 | }
391 | img.className = options.className;
392 | img.alt = rawText;
393 | img.src = src;
394 | modified = true;
395 | fragment.appendChild(img);
396 | }
397 | if (!img) fragment.appendChild(createText(rawText, false));
398 | img = null;
399 | }
400 | // is there actually anything to replace in here ?
401 | if (modified) {
402 | // any text left to be added ?
403 | if (i < text.length) {
404 | fragment.appendChild(
405 | createText(text.slice(i), true)
406 | );
407 | }
408 | // replace the text node only, leave intact
409 | // anything else surrounding such text
410 | subnode.parentNode.replaceChild(fragment, subnode);
411 | }
412 | }
413 | return node;
414 | }
415 |
416 | /**
417 | * String/HTML version of the same logic / parser:
418 | * emojify a generic text placing images tags instead of surrogates pair.
419 | * @param string generic string with possibly some emoji in it
420 | * @param Object options containing info about how to parse
421 | *
422 | * .callback Function the callback to invoke per each found emoji.
423 | * .base string the base url, by default twemoji.base
424 | * .ext string the image extension, by default twemoji.ext
425 | * .size string the assets size, by default twemoji.size
426 | *
427 | * @return the string with
replacing all found and parsed emoji
428 | */
429 | function parseString(str, options) {
430 | return replace(str, function (rawText) {
431 | var
432 | ret = rawText,
433 | iconId = grabTheRightIcon(rawText),
434 | src = options.callback(iconId, options),
435 | attrib,
436 | attrname;
437 | if (iconId && src) {
438 | // recycle the match string replacing the emoji
439 | // with its image counter part
440 | ret = '
');
464 | }
465 | return ret;
466 | });
467 | }
468 |
469 | /**
470 | * Function used to actually replace HTML special chars
471 | * @param string HTML special char
472 | * @return string encoded HTML special char
473 | */
474 | function replacer(m) {
475 | return escaper[m];
476 | }
477 |
478 | /**
479 | * Default options.attribute callback
480 | * @return null
481 | */
482 | function returnNull() {
483 | return null;
484 | }
485 |
486 | /**
487 | * Given a generic value, creates its squared counterpart if it's a number.
488 | * As example, number 36 will return '36x36'.
489 | * @param any a generic value.
490 | * @return any a string representing asset size, i.e. "36x36"
491 | * only in case the value was a number.
492 | * Returns initial value otherwise.
493 | */
494 | function toSizeSquaredAsset(value) {
495 | return typeof value === 'number' ?
496 | value + 'x' + value :
497 | value;
498 | }
499 |
500 |
501 | /////////////////////////
502 | // exported functions //
503 | // declaration //
504 | /////////////////////////
505 |
506 | function fromCodePoint(codepoint) {
507 | var code = typeof codepoint === 'string' ?
508 | parseInt(codepoint, 16) : codepoint;
509 | if (code < 0x10000) {
510 | return fromCharCode(code);
511 | }
512 | code -= 0x10000;
513 | return fromCharCode(
514 | 0xD800 + (code >> 10),
515 | 0xDC00 + (code & 0x3FF)
516 | );
517 | }
518 |
519 | function parse(what, how) {
520 | if (!how || typeof how === 'function') {
521 | how = {callback: how};
522 | }
523 | // if first argument is string, inject html
tags
524 | // otherwise use the DOM tree and parse text nodes only
525 | return (typeof what === 'string' ? parseString : parseNode)(what, {
526 | callback: how.callback || defaultImageSrcGenerator,
527 | attributes: typeof how.attributes === 'function' ? how.attributes : returnNull,
528 | base: typeof how.base === 'string' ? how.base : twemoji.base,
529 | ext: how.ext || twemoji.ext,
530 | size: how.folder || toSizeSquaredAsset(how.size || twemoji.size),
531 | className: how.className || twemoji.className,
532 | onerror: how.onerror || twemoji.onerror
533 | });
534 | }
535 |
536 | function replace(text, callback) {
537 | return String(text).replace(re, callback);
538 | }
539 |
540 | function test(text) {
541 | // IE6 needs a reset before too
542 | re.lastIndex = 0;
543 | var result = re.test(text);
544 | re.lastIndex = 0;
545 | return result;
546 | }
547 |
548 | function toCodePoint(unicodeSurrogates, sep) {
549 | var
550 | r = [],
551 | c = 0,
552 | p = 0,
553 | i = 0;
554 | while (i < unicodeSurrogates.length) {
555 | c = unicodeSurrogates.charCodeAt(i++);
556 | if (p) {
557 | r.push((0x10000 + ((p - 0xD800) << 10) + (c - 0xDC00)).toString(16));
558 | p = 0;
559 | } else if (0xD800 <= c && c <= 0xDBFF) {
560 | p = c;
561 | } else {
562 | r.push(c.toString(16));
563 | }
564 | }
565 | return r.join(sep || '-');
566 | }
567 |
568 | }());
--------------------------------------------------------------------------------
/docs/public/scripts/jquery.min.js:
--------------------------------------------------------------------------------
1 | /*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */
2 | !function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="",le.option=!!xe.lastChild;var ke={thead:[1,""],col:[2,""],tr:[2,""],td:[3,""],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var je=/<|?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 0