wip
This commit is contained in:
		
							parent
							
								
									ac93af8eb5
								
							
						
					
					
						commit
						bf4b3dcb7f
					
				
					 123 changed files with 1949 additions and 1854 deletions
				
			
		| 
						 | 
					@ -177,6 +177,10 @@ npx ts-node ./node_modules/typeorm/cli.js migration:generate -n 変更の名前
 | 
				
			||||||
### JSONのimportに気を付けよう
 | 
					### JSONのimportに気を付けよう
 | 
				
			||||||
TypeScriptでjsonをimportすると、tscでコンパイルするときにそのjsonファイルも一緒にdistディレクトリに吐き出されてしまう。この挙動により、意図せずファイルの書き換えが発生することがあるので、jsonをimportするときは書き換えられても良いものかどうか確認すること。書き換えされて欲しくない場合は、importで読み込むのではなく、`fs.readFileSync`などの関数を使って読み込むようにすればよい。
 | 
					TypeScriptでjsonをimportすると、tscでコンパイルするときにそのjsonファイルも一緒にdistディレクトリに吐き出されてしまう。この挙動により、意図せずファイルの書き換えが発生することがあるので、jsonをimportするときは書き換えられても良いものかどうか確認すること。書き換えされて欲しくない場合は、importで読み込むのではなく、`fs.readFileSync`などの関数を使って読み込むようにすればよい。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### コンポーネントのスタイル定義でmarginを持たせない
 | 
				
			||||||
 | 
					コンポーネント自身がmarginを設定するのは問題の元となることはよく知られている
 | 
				
			||||||
 | 
					marginはそのコンポーネントを使う側が設定する
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## その他
 | 
					## その他
 | 
				
			||||||
### HTMLのクラス名で follow という単語は使わない
 | 
					### HTMLのクラス名で follow という単語は使わない
 | 
				
			||||||
広告ブロッカーで誤ってブロックされる
 | 
					広告ブロッカーで誤ってブロックされる
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -787,6 +787,8 @@ pubSub: "Pub/Subのアカウント"
 | 
				
			||||||
lastCommunication: "直近の通信"
 | 
					lastCommunication: "直近の通信"
 | 
				
			||||||
resolved: "解決済み"
 | 
					resolved: "解決済み"
 | 
				
			||||||
unresolved: "未解決"
 | 
					unresolved: "未解決"
 | 
				
			||||||
 | 
					itsOn: "オンになっています"
 | 
				
			||||||
 | 
					itsOff: "オフになっています"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_accountDelete:
 | 
					_accountDelete:
 | 
				
			||||||
  accountDelete: "アカウントの削除"
 | 
					  accountDelete: "アカウントの削除"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -104,7 +104,7 @@
 | 
				
			||||||
		"@types/websocket": "1.0.4",
 | 
							"@types/websocket": "1.0.4",
 | 
				
			||||||
		"@types/ws": "7.4.7",
 | 
							"@types/ws": "7.4.7",
 | 
				
			||||||
		"@typescript-eslint/parser": "4.31.2",
 | 
							"@typescript-eslint/parser": "4.31.2",
 | 
				
			||||||
		"@vue/compiler-sfc": "3.2.13",
 | 
							"@vue/compiler-sfc": "3.2.18",
 | 
				
			||||||
		"abort-controller": "3.0.0",
 | 
							"abort-controller": "3.0.0",
 | 
				
			||||||
		"apexcharts": "3.28.3",
 | 
							"apexcharts": "3.28.3",
 | 
				
			||||||
		"autobind-decorator": "2.4.0",
 | 
							"autobind-decorator": "2.4.0",
 | 
				
			||||||
| 
						 | 
					@ -233,7 +233,7 @@
 | 
				
			||||||
		"uuid": "8.3.2",
 | 
							"uuid": "8.3.2",
 | 
				
			||||||
		"v-debounce": "0.1.2",
 | 
							"v-debounce": "0.1.2",
 | 
				
			||||||
		"vanilla-tilt": "1.7.2",
 | 
							"vanilla-tilt": "1.7.2",
 | 
				
			||||||
		"vue": "3.2.13",
 | 
							"vue": "3.2.18",
 | 
				
			||||||
		"vue-loader": "16.7.0",
 | 
							"vue-loader": "16.7.0",
 | 
				
			||||||
		"vue-prism-editor": "2.0.0-alpha.2",
 | 
							"vue-prism-editor": "2.0.0-alpha.2",
 | 
				
			||||||
		"vue-router": "4.0.5",
 | 
							"vue-router": "4.0.5",
 | 
				
			||||||
| 
						 | 
					@ -241,7 +241,7 @@
 | 
				
			||||||
		"vue-svg-loader": "0.17.0-beta.2",
 | 
							"vue-svg-loader": "0.17.0-beta.2",
 | 
				
			||||||
		"vuedraggable": "4.0.1",
 | 
							"vuedraggable": "4.0.1",
 | 
				
			||||||
		"web-push": "3.4.5",
 | 
							"web-push": "3.4.5",
 | 
				
			||||||
		"webpack": "5.53.0",
 | 
							"webpack": "5.54.0",
 | 
				
			||||||
		"webpack-cli": "4.8.0",
 | 
							"webpack-cli": "4.8.0",
 | 
				
			||||||
		"websocket": "1.0.34",
 | 
							"websocket": "1.0.34",
 | 
				
			||||||
		"ws": "8.2.2",
 | 
							"ws": "8.2.2",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,7 +25,7 @@
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent, markRaw } from 'vue';
 | 
					import { defineComponent, markRaw } from 'vue';
 | 
				
			||||||
import XWindow from '@client/components/ui/window.vue';
 | 
					import XWindow from '@client/components/ui/window.vue';
 | 
				
			||||||
import MkTextarea from '@client/components/ui/textarea.vue';
 | 
					import MkTextarea from '@client/components/form/textarea.vue';
 | 
				
			||||||
import MkButton from '@client/components/ui/button.vue';
 | 
					import MkButton from '@client/components/ui/button.vue';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -37,23 +37,23 @@ export default defineComponent({
 | 
				
			||||||
		--formXPadding: 0px;
 | 
							--formXPadding: 0px;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		> ::v-deep(*) {
 | 
							> ::v-deep(*) {
 | 
				
			||||||
			._formPanel {
 | 
								._debobigegoPanel {
 | 
				
			||||||
				border: solid 0.5px var(--divider);
 | 
									border: solid 0.5px var(--divider);
 | 
				
			||||||
				border-radius: 0;
 | 
									border-radius: 0;
 | 
				
			||||||
				border-left: none;
 | 
									border-left: none;
 | 
				
			||||||
				border-right: none;
 | 
									border-right: none;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			._form_group {
 | 
								._debobigego_group {
 | 
				
			||||||
				> *:not(._formNoConcat) {
 | 
									> *:not(._debobigegoNoConcat) {
 | 
				
			||||||
					&:not(:last-child):not(._formNoConcatPrev) {
 | 
										&:not(:last-child):not(._debobigegoNoConcatPrev) {
 | 
				
			||||||
						&._formPanel, ._formPanel {
 | 
											&._debobigegoPanel, ._debobigegoPanel {
 | 
				
			||||||
							border-bottom: solid 0.5px var(--divider);
 | 
												border-bottom: solid 0.5px var(--divider);
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					&:not(:first-child):not(._formNoConcatNext) {
 | 
										&:not(:first-child):not(._debobigegoNoConcatNext) {
 | 
				
			||||||
						&._formPanel, ._formPanel {
 | 
											&._debobigegoPanel, ._debobigegoPanel {
 | 
				
			||||||
							border-top: none;
 | 
												border-top: none;
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
<div class="yzpgjkxe _formItem">
 | 
					<div class="yzpgjkxe _debobigegoItem">
 | 
				
			||||||
	<div class="_formLabel"><slot name="label"></slot></div>
 | 
						<div class="_debobigegoLabel"><slot name="label"></slot></div>
 | 
				
			||||||
	<button class="main _button _formPanel _formClickable" :class="{ center, primary, danger }">
 | 
						<button class="main _button _debobigegoPanel _debobigegoClickable" :class="{ center, primary, danger }">
 | 
				
			||||||
		<slot></slot>
 | 
							<slot></slot>
 | 
				
			||||||
		<div class="suffix">
 | 
							<div class="suffix">
 | 
				
			||||||
			<slot name="suffix"></slot>
 | 
								<slot name="suffix"></slot>
 | 
				
			||||||
| 
						 | 
					@ -10,13 +10,13 @@
 | 
				
			||||||
			</div>
 | 
								</div>
 | 
				
			||||||
		</div>
 | 
							</div>
 | 
				
			||||||
	</button>
 | 
						</button>
 | 
				
			||||||
	<div class="_formCaption"><slot name="desc"></slot></div>
 | 
						<div class="_debobigegoCaption"><slot name="desc"></slot></div>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import './form.scss';
 | 
					import './debobigego.scss';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default defineComponent({
 | 
					export default defineComponent({
 | 
				
			||||||
	props: {
 | 
						props: {
 | 
				
			||||||
| 
						 | 
					@ -1,9 +1,9 @@
 | 
				
			||||||
._formPanel {
 | 
					._debobigegoPanel {
 | 
				
			||||||
	background: var(--panel);
 | 
						background: var(--panel);
 | 
				
			||||||
	border-radius: var(--radius);
 | 
						border-radius: var(--radius);
 | 
				
			||||||
	transition: background 0.2s ease;
 | 
						transition: background 0.2s ease;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	&._formClickable {
 | 
						&._debobigegoClickable {
 | 
				
			||||||
		&:hover {
 | 
							&:hover {
 | 
				
			||||||
			//background: var(--panelHighlight);
 | 
								//background: var(--panelHighlight);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -15,8 +15,8 @@
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
._formLabel,
 | 
					._debobigegoLabel,
 | 
				
			||||||
._formCaption {
 | 
					._debobigegoCaption {
 | 
				
			||||||
	font-size: 80%;
 | 
						font-size: 80%;
 | 
				
			||||||
	color: var(--fgTransparentWeak);
 | 
						color: var(--fgTransparentWeak);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,7 +25,7 @@
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
._formLabel {
 | 
					._debobigegoLabel {
 | 
				
			||||||
	position: sticky;
 | 
						position: sticky;
 | 
				
			||||||
	top: var(--stickyTop, 0px);
 | 
						top: var(--stickyTop, 0px);
 | 
				
			||||||
	z-index: 2;
 | 
						z-index: 2;
 | 
				
			||||||
| 
						 | 
					@ -36,17 +36,17 @@
 | 
				
			||||||
	backdrop-filter: var(--blur, blur(10px));
 | 
						backdrop-filter: var(--blur, blur(10px));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
._themeChanging_ ._formLabel {
 | 
					._themeChanging_ ._debobigegoLabel {
 | 
				
			||||||
	transition: none !important;
 | 
						transition: none !important;
 | 
				
			||||||
	background: transparent;
 | 
						background: transparent;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
._formCaption {
 | 
					._debobigegoCaption {
 | 
				
			||||||
	padding: 8px var(--formContentHMargin) 0 var(--formContentHMargin);
 | 
						padding: 8px var(--formContentHMargin) 0 var(--formContentHMargin);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
._formItem {
 | 
					._debobigegoItem {
 | 
				
			||||||
	& + ._formItem {
 | 
						& + ._debobigegoItem {
 | 
				
			||||||
		margin-top: 24px;
 | 
							margin-top: 24px;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1,10 +1,10 @@
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
<div class="vrtktovg _formItem _formNoConcat" v-size="{ max: [500] }" v-sticky-container>
 | 
					<div class="vrtktovg _debobigegoItem _debobigegoNoConcat" v-size="{ max: [500] }" v-sticky-container>
 | 
				
			||||||
	<div class="_formLabel"><slot name="label"></slot></div>
 | 
						<div class="_debobigegoLabel"><slot name="label"></slot></div>
 | 
				
			||||||
	<div class="main _form_group" ref="child">
 | 
						<div class="main _debobigego_group" ref="child">
 | 
				
			||||||
		<slot></slot>
 | 
							<slot></slot>
 | 
				
			||||||
	</div>
 | 
						</div>
 | 
				
			||||||
	<div class="_formCaption"><slot name="caption"></slot></div>
 | 
						<div class="_debobigegoCaption"><slot name="caption"></slot></div>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,9 +20,9 @@ export default defineComponent({
 | 
				
			||||||
			const els = Array.from(child.value.children);
 | 
								const els = Array.from(child.value.children);
 | 
				
			||||||
			for (let i = 0; i < els.length; i++) {
 | 
								for (let i = 0; i < els.length; i++) {
 | 
				
			||||||
				const el = els[i];
 | 
									const el = els[i];
 | 
				
			||||||
				if (el.classList.contains('_formNoConcat')) {
 | 
									if (el.classList.contains('_debobigegoNoConcat')) {
 | 
				
			||||||
					if (els[i - 1]) els[i - 1].classList.add('_formNoConcatPrev');
 | 
										if (els[i - 1]) els[i - 1].classList.add('_debobigegoNoConcatPrev');
 | 
				
			||||||
					if (els[i + 1]) els[i + 1].classList.add('_formNoConcatNext');
 | 
										if (els[i + 1]) els[i + 1].classList.add('_debobigegoNoConcatNext');
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
| 
						 | 
					@ -52,21 +52,21 @@ export default defineComponent({
 | 
				
			||||||
<style lang="scss" scoped>
 | 
					<style lang="scss" scoped>
 | 
				
			||||||
.vrtktovg {
 | 
					.vrtktovg {
 | 
				
			||||||
	> .main {
 | 
						> .main {
 | 
				
			||||||
		> ::v-deep(*):not(._formNoConcat) {
 | 
							> ::v-deep(*):not(._debobigegoNoConcat) {
 | 
				
			||||||
			&:not(._formNoConcatNext) {
 | 
								&:not(._debobigegoNoConcatNext) {
 | 
				
			||||||
				margin: 0;
 | 
									margin: 0;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			&:not(:last-child):not(._formNoConcatPrev) {
 | 
								&:not(:last-child):not(._debobigegoNoConcatPrev) {
 | 
				
			||||||
				&._formPanel, ._formPanel {
 | 
									&._debobigegoPanel, ._debobigegoPanel {
 | 
				
			||||||
					border-bottom: solid 0.5px var(--divider);
 | 
										border-bottom: solid 0.5px var(--divider);
 | 
				
			||||||
					border-bottom-left-radius: 0;
 | 
										border-bottom-left-radius: 0;
 | 
				
			||||||
					border-bottom-right-radius: 0;
 | 
										border-bottom-right-radius: 0;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			&:not(:first-child):not(._formNoConcatNext) {
 | 
								&:not(:first-child):not(._debobigegoNoConcatNext) {
 | 
				
			||||||
				&._formPanel, ._formPanel {
 | 
									&._debobigegoPanel, ._debobigegoPanel {
 | 
				
			||||||
					border-top: none;
 | 
										border-top: none;
 | 
				
			||||||
					border-top-left-radius: 0;
 | 
										border-top-left-radius: 0;
 | 
				
			||||||
					border-top-right-radius: 0;
 | 
										border-top-right-radius: 0;
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
<div class="fzenkabp _formItem">
 | 
					<div class="fzenkabp _debobigegoItem">
 | 
				
			||||||
	<div class="_formPanel" :class="{ warn }">
 | 
						<div class="_debobigegoPanel" :class="{ warn }">
 | 
				
			||||||
		<i v-if="warn" class="fas fa-exclamation-triangle"></i>
 | 
							<i v-if="warn" class="fas fa-exclamation-triangle"></i>
 | 
				
			||||||
		<i v-else class="fas fa-info-circle"></i>
 | 
							<i v-else class="fas fa-info-circle"></i>
 | 
				
			||||||
		<slot></slot>
 | 
							<slot></slot>
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,9 @@
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
<div class="matxzzsk">
 | 
					<FormGroup class="_debobigegoItem">
 | 
				
			||||||
	<div class="label" @click="focus"><slot name="label"></slot></div>
 | 
						<template #label><slot></slot></template>
 | 
				
			||||||
	<div class="input" :class="{ inline, disabled, focused }">
 | 
						<div class="ztzhwixg _debobigegoItem" :class="{ inline, disabled }">
 | 
				
			||||||
 | 
							<div class="icon" ref="icon"><slot name="icon"></slot></div>
 | 
				
			||||||
 | 
							<div class="input _debobigegoPanel">
 | 
				
			||||||
			<div class="prefix" ref="prefixEl"><slot name="prefix"></slot></div>
 | 
								<div class="prefix" ref="prefixEl"><slot name="prefix"></slot></div>
 | 
				
			||||||
			<input ref="inputEl"
 | 
								<input ref="inputEl"
 | 
				
			||||||
				:type="type"
 | 
									:type="type"
 | 
				
			||||||
| 
						 | 
					@ -25,25 +27,27 @@
 | 
				
			||||||
			</datalist>
 | 
								</datalist>
 | 
				
			||||||
			<div class="suffix" ref="suffixEl"><slot name="suffix"></slot></div>
 | 
								<div class="suffix" ref="suffixEl"><slot name="suffix"></slot></div>
 | 
				
			||||||
		</div>
 | 
							</div>
 | 
				
			||||||
	<div class="caption"><slot name="caption"></slot></div>
 | 
						</div>
 | 
				
			||||||
 | 
						<template #caption><slot name="desc"></slot></template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	<MkButton v-if="manualSave && changed" @click="updated" primary><i class="fas fa-save"></i> {{ $ts.save }}</MkButton>
 | 
						<FormButton v-if="manualSave && changed" @click="updated" primary><i class="fas fa-save"></i> {{ $ts.save }}</FormButton>
 | 
				
			||||||
</div>
 | 
					</FormGroup>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent, onMounted, onUnmounted, nextTick, ref, watch, computed, toRefs } from 'vue';
 | 
					import { defineComponent, onMounted, onUnmounted, nextTick, ref, watch, computed, toRefs } from 'vue';
 | 
				
			||||||
import MkButton from './button.vue';
 | 
					import './debobigego.scss';
 | 
				
			||||||
import { debounce } from 'throttle-debounce';
 | 
					import FormButton from './button.vue';
 | 
				
			||||||
 | 
					import FormGroup from './group.vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default defineComponent({
 | 
					export default defineComponent({
 | 
				
			||||||
	components: {
 | 
						components: {
 | 
				
			||||||
		MkButton,
 | 
							FormGroup,
 | 
				
			||||||
 | 
							FormButton,
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
					 | 
				
			||||||
	props: {
 | 
						props: {
 | 
				
			||||||
		modelValue: {
 | 
							value: {
 | 
				
			||||||
			required: true
 | 
								required: false
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		type: {
 | 
							type: {
 | 
				
			||||||
			type: String,
 | 
								type: String,
 | 
				
			||||||
| 
						 | 
					@ -92,23 +96,16 @@ export default defineComponent({
 | 
				
			||||||
			required: false,
 | 
								required: false,
 | 
				
			||||||
			default: false
 | 
								default: false
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		debounce: {
 | 
					 | 
				
			||||||
			type: Boolean,
 | 
					 | 
				
			||||||
			required: false,
 | 
					 | 
				
			||||||
			default: false
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		manualSave: {
 | 
							manualSave: {
 | 
				
			||||||
			type: Boolean,
 | 
								type: Boolean,
 | 
				
			||||||
			required: false,
 | 
								required: false,
 | 
				
			||||||
			default: false
 | 
								default: false
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
						emits: ['change', 'keydown', 'enter'],
 | 
				
			||||||
	emits: ['change', 'keydown', 'enter', 'update:modelValue'],
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	setup(props, context) {
 | 
						setup(props, context) {
 | 
				
			||||||
		const { modelValue, type, autofocus } = toRefs(props);
 | 
							const { value, type, autofocus } = toRefs(props);
 | 
				
			||||||
		const v = ref(modelValue.value);
 | 
							const v = ref(value.value);
 | 
				
			||||||
		const id = Math.random().toString(); // TODO: uuid?
 | 
							const id = Math.random().toString(); // TODO: uuid?
 | 
				
			||||||
		const focused = ref(false);
 | 
							const focused = ref(false);
 | 
				
			||||||
		const changed = ref(false);
 | 
							const changed = ref(false);
 | 
				
			||||||
| 
						 | 
					@ -134,26 +131,20 @@ export default defineComponent({
 | 
				
			||||||
		const updated = () => {
 | 
							const updated = () => {
 | 
				
			||||||
			changed.value = false;
 | 
								changed.value = false;
 | 
				
			||||||
			if (type?.value === 'number') {
 | 
								if (type?.value === 'number') {
 | 
				
			||||||
				context.emit('update:modelValue', parseFloat(v.value));
 | 
									context.emit('update:value', parseFloat(v.value));
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				context.emit('update:modelValue', v.value);
 | 
									context.emit('update:value', v.value);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		const debouncedUpdated = debounce(1000, updated);
 | 
							watch(value, newValue => {
 | 
				
			||||||
 | 
					 | 
				
			||||||
		watch(modelValue, newValue => {
 | 
					 | 
				
			||||||
			v.value = newValue;
 | 
								v.value = newValue;
 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		watch(v, newValue => {
 | 
							watch(v, newValue => {
 | 
				
			||||||
			if (!props.manualSave) {
 | 
								if (!props.manualSave) {
 | 
				
			||||||
				if (props.debounce) {
 | 
					 | 
				
			||||||
					debouncedUpdated();
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
				updated();
 | 
									updated();
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
			invalid.value = inputEl.value.validity.badInput;
 | 
								invalid.value = inputEl.value.validity.badInput;
 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
| 
						 | 
					@ -205,68 +196,59 @@ export default defineComponent({
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<style lang="scss" scoped>
 | 
					<style lang="scss" scoped>
 | 
				
			||||||
.matxzzsk {
 | 
					.ztzhwixg {
 | 
				
			||||||
	margin: 1.5em 0;
 | 
						position: relative;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	> .label {
 | 
						> .icon {
 | 
				
			||||||
		font-size: 0.85em;
 | 
							position: absolute;
 | 
				
			||||||
		padding: 0 0 8px 12px;
 | 
							top: 0;
 | 
				
			||||||
		user-select: none;
 | 
							left: 0;
 | 
				
			||||||
 | 
							width: 24px;
 | 
				
			||||||
 | 
							text-align: center;
 | 
				
			||||||
 | 
							line-height: 32px;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		&:empty {
 | 
							&:not(:empty) + .input {
 | 
				
			||||||
			display: none;
 | 
								margin-left: 28px;
 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	> .caption {
 | 
					 | 
				
			||||||
		font-size: 0.8em;
 | 
					 | 
				
			||||||
		padding: 8px 0 0 12px;
 | 
					 | 
				
			||||||
		color: var(--fgTransparentWeak);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		&:empty {
 | 
					 | 
				
			||||||
			display: none;
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	> .input {
 | 
						> .input {
 | 
				
			||||||
		$height: 42px;
 | 
							$height: 48px;
 | 
				
			||||||
		position: relative;
 | 
							position: relative;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		> input {
 | 
							> input {
 | 
				
			||||||
			appearance: none;
 | 
					 | 
				
			||||||
			-webkit-appearance: none;
 | 
					 | 
				
			||||||
			display: block;
 | 
								display: block;
 | 
				
			||||||
			height: $height;
 | 
								height: $height;
 | 
				
			||||||
			width: 100%;
 | 
								width: 100%;
 | 
				
			||||||
			margin: 0;
 | 
								margin: 0;
 | 
				
			||||||
			padding: 0 12px;
 | 
								padding: 0 16px;
 | 
				
			||||||
			font: inherit;
 | 
								font: inherit;
 | 
				
			||||||
			font-weight: normal;
 | 
								font-weight: normal;
 | 
				
			||||||
			font-size: 1em;
 | 
								font-size: 1em;
 | 
				
			||||||
			color: var(--fg);
 | 
								line-height: $height;
 | 
				
			||||||
			background: var(--panel);
 | 
								color: var(--inputText);
 | 
				
			||||||
			border: solid 0.5px var(--inputBorder);
 | 
								background: transparent;
 | 
				
			||||||
			border-radius: 6px;
 | 
								border: none;
 | 
				
			||||||
 | 
								border-radius: 0;
 | 
				
			||||||
			outline: none;
 | 
								outline: none;
 | 
				
			||||||
			box-shadow: none;
 | 
								box-shadow: none;
 | 
				
			||||||
			box-sizing: border-box;
 | 
								box-sizing: border-box;
 | 
				
			||||||
			transition: border-color 0.1s ease-out;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
			&:hover {
 | 
								&[type='file'] {
 | 
				
			||||||
				border-color: var(--inputBorderHover);
 | 
									display: none;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		> .prefix,
 | 
							> .prefix,
 | 
				
			||||||
		> .suffix {
 | 
							> .suffix {
 | 
				
			||||||
			display: flex;
 | 
								display: block;
 | 
				
			||||||
			align-items: center;
 | 
					 | 
				
			||||||
			position: absolute;
 | 
								position: absolute;
 | 
				
			||||||
			z-index: 1;
 | 
								z-index: 1;
 | 
				
			||||||
			top: 0;
 | 
								top: 0;
 | 
				
			||||||
			padding: 0 12px;
 | 
								padding: 0 16px;
 | 
				
			||||||
			font-size: 1em;
 | 
								font-size: 1em;
 | 
				
			||||||
			height: $height;
 | 
								line-height: $height;
 | 
				
			||||||
 | 
								color: var(--inputLabel);
 | 
				
			||||||
			pointer-events: none;
 | 
								pointer-events: none;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			&:empty {
 | 
								&:empty {
 | 
				
			||||||
| 
						 | 
					@ -285,12 +267,13 @@ export default defineComponent({
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		> .prefix {
 | 
							> .prefix {
 | 
				
			||||||
			left: 0;
 | 
								left: 0;
 | 
				
			||||||
			padding-right: 6px;
 | 
								padding-right: 8px;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		> .suffix {
 | 
							> .suffix {
 | 
				
			||||||
			right: 0;
 | 
								right: 0;
 | 
				
			||||||
			padding-left: 6px;
 | 
								padding-left: 8px;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	&.inline {
 | 
						&.inline {
 | 
				
			||||||
| 
						 | 
					@ -298,13 +281,6 @@ export default defineComponent({
 | 
				
			||||||
		margin: 0;
 | 
							margin: 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		&.focused {
 | 
					 | 
				
			||||||
			> input {
 | 
					 | 
				
			||||||
				border-color: var(--accent);
 | 
					 | 
				
			||||||
				//box-shadow: 0 0 0 4px var(--focus);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	&.disabled {
 | 
						&.disabled {
 | 
				
			||||||
		opacity: 0.7;
 | 
							opacity: 0.7;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -312,6 +288,5 @@ export default defineComponent({
 | 
				
			||||||
			cursor: not-allowed !important;
 | 
								cursor: not-allowed !important;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
</style>
 | 
					</style>
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
<div class="_formItem">
 | 
					<div class="_debobigegoItem">
 | 
				
			||||||
	<div class="_formPanel anocepby">
 | 
						<div class="_debobigegoPanel anocepby">
 | 
				
			||||||
		<span class="key"><slot name="key"></slot></span>
 | 
							<span class="key"><slot name="key"></slot></span>
 | 
				
			||||||
		<span class="value"><slot name="value"></slot></span>
 | 
							<span class="value"><slot name="value"></slot></span>
 | 
				
			||||||
	</div>
 | 
						</div>
 | 
				
			||||||
| 
						 | 
					@ -9,7 +9,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import './form.scss';
 | 
					import './debobigego.scss';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default defineComponent({
 | 
					export default defineComponent({
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
<div class="qmfkfnzi _formItem">
 | 
					<div class="qmfkfnzi _debobigegoItem">
 | 
				
			||||||
	<a class="main _button _formPanel _formClickable" :href="to" target="_blank" v-if="external">
 | 
						<a class="main _button _debobigegoPanel _debobigegoClickable" :href="to" target="_blank" v-if="external">
 | 
				
			||||||
		<span class="icon"><slot name="icon"></slot></span>
 | 
							<span class="icon"><slot name="icon"></slot></span>
 | 
				
			||||||
		<span class="text"><slot></slot></span>
 | 
							<span class="text"><slot></slot></span>
 | 
				
			||||||
		<span class="right">
 | 
							<span class="right">
 | 
				
			||||||
| 
						 | 
					@ -8,7 +8,7 @@
 | 
				
			||||||
			<i class="fas fa-external-link-alt icon"></i>
 | 
								<i class="fas fa-external-link-alt icon"></i>
 | 
				
			||||||
		</span>
 | 
							</span>
 | 
				
			||||||
	</a>
 | 
						</a>
 | 
				
			||||||
	<MkA class="main _button _formPanel _formClickable" :class="{ active }" :to="to" :behavior="behavior" v-else>
 | 
						<MkA class="main _button _debobigegoPanel _debobigegoClickable" :class="{ active }" :to="to" :behavior="behavior" v-else>
 | 
				
			||||||
		<span class="icon"><slot name="icon"></slot></span>
 | 
							<span class="icon"><slot name="icon"></slot></span>
 | 
				
			||||||
		<span class="text"><slot></slot></span>
 | 
							<span class="text"><slot></slot></span>
 | 
				
			||||||
		<span class="right">
 | 
							<span class="right">
 | 
				
			||||||
| 
						 | 
					@ -21,7 +21,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import './form.scss';
 | 
					import './debobigego.scss';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default defineComponent({
 | 
					export default defineComponent({
 | 
				
			||||||
	props: {
 | 
						props: {
 | 
				
			||||||
| 
						 | 
					@ -1,8 +1,8 @@
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
<FormGroup class="_formItem">
 | 
					<FormGroup class="_debobigegoItem">
 | 
				
			||||||
	<template #label><slot></slot></template>
 | 
						<template #label><slot></slot></template>
 | 
				
			||||||
	<div class="drooglns _formItem" :class="{ tall }">
 | 
						<div class="drooglns _debobigegoItem" :class="{ tall }">
 | 
				
			||||||
		<div class="input _formPanel">
 | 
							<div class="input _debobigegoPanel">
 | 
				
			||||||
			<textarea class="_monospace"
 | 
								<textarea class="_monospace"
 | 
				
			||||||
				v-model="v"
 | 
									v-model="v"
 | 
				
			||||||
				readonly
 | 
									readonly
 | 
				
			||||||
| 
						 | 
					@ -17,7 +17,7 @@
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent, ref, toRefs, watch } from 'vue';
 | 
					import { defineComponent, ref, toRefs, watch } from 'vue';
 | 
				
			||||||
import * as JSON5 from 'json5';
 | 
					import * as JSON5 from 'json5';
 | 
				
			||||||
import './form.scss';
 | 
					import './debobigego.scss';
 | 
				
			||||||
import FormGroup from './group.vue';
 | 
					import FormGroup from './group.vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default defineComponent({
 | 
					export default defineComponent({
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,5 @@
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
<FormGroup class="uljviswt _formItem">
 | 
					<FormGroup class="uljviswt _debobigegoItem">
 | 
				
			||||||
	<template #label><slot name="label"></slot></template>
 | 
						<template #label><slot name="label"></slot></template>
 | 
				
			||||||
	<slot :items="items"></slot>
 | 
						<slot :items="items"></slot>
 | 
				
			||||||
	<div class="empty" v-if="empty" key="_empty_">
 | 
						<div class="empty" v-if="empty" key="_empty_">
 | 
				
			||||||
							
								
								
									
										112
									
								
								src/client/components/debobigego/radios.vue
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										112
									
								
								src/client/components/debobigego/radios.vue
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,112 @@
 | 
				
			||||||
 | 
					<script lang="ts">
 | 
				
			||||||
 | 
					import { defineComponent, h } from 'vue';
 | 
				
			||||||
 | 
					import MkRadio from '@client/components/ui/radio.vue';
 | 
				
			||||||
 | 
					import './debobigego.scss';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default defineComponent({
 | 
				
			||||||
 | 
						components: {
 | 
				
			||||||
 | 
							MkRadio
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						props: {
 | 
				
			||||||
 | 
							modelValue: {
 | 
				
			||||||
 | 
								required: false
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						data() {
 | 
				
			||||||
 | 
							return {
 | 
				
			||||||
 | 
								value: this.modelValue,
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						watch: {
 | 
				
			||||||
 | 
							modelValue() {
 | 
				
			||||||
 | 
								this.value = this.modelValue;
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							value() {
 | 
				
			||||||
 | 
								this.$emit('update:modelValue', this.value);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						render() {
 | 
				
			||||||
 | 
							const label = this.$slots.desc();
 | 
				
			||||||
 | 
							let options = this.$slots.default();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// なぜかFragmentになることがあるため
 | 
				
			||||||
 | 
							if (options.length === 1 && options[0].props == null) options = options[0].children;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return h('div', {
 | 
				
			||||||
 | 
								class: 'cnklmpwm _debobigegoItem'
 | 
				
			||||||
 | 
							}, [
 | 
				
			||||||
 | 
								h('div', {
 | 
				
			||||||
 | 
									class: '_debobigegoLabel',
 | 
				
			||||||
 | 
								}, label),
 | 
				
			||||||
 | 
								...options.map(option => h('button', {
 | 
				
			||||||
 | 
									class: '_button _debobigegoPanel _debobigegoClickable',
 | 
				
			||||||
 | 
									key: option.key,
 | 
				
			||||||
 | 
									onClick: () => this.value = option.props.value,
 | 
				
			||||||
 | 
								}, [h('span', {
 | 
				
			||||||
 | 
									class: ['check', { checked: this.value === option.props.value }],
 | 
				
			||||||
 | 
								}), option.children]))
 | 
				
			||||||
 | 
							]);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style lang="scss">
 | 
				
			||||||
 | 
					.cnklmpwm {
 | 
				
			||||||
 | 
						> button {
 | 
				
			||||||
 | 
							display: block;
 | 
				
			||||||
 | 
							width: 100%;
 | 
				
			||||||
 | 
							box-sizing: border-box;
 | 
				
			||||||
 | 
							padding: 14px 18px;
 | 
				
			||||||
 | 
							text-align: left;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							&:not(:first-of-type) {
 | 
				
			||||||
 | 
								border-top: none !important;
 | 
				
			||||||
 | 
								border-top-left-radius: 0;
 | 
				
			||||||
 | 
								border-top-right-radius: 0;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							&:not(:last-of-type) {
 | 
				
			||||||
 | 
								border-bottom: solid 0.5px var(--divider);
 | 
				
			||||||
 | 
								border-bottom-left-radius: 0;
 | 
				
			||||||
 | 
								border-bottom-right-radius: 0;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							> .check {
 | 
				
			||||||
 | 
								display: inline-block;
 | 
				
			||||||
 | 
								vertical-align: bottom;
 | 
				
			||||||
 | 
								position: relative;
 | 
				
			||||||
 | 
								width: 16px;
 | 
				
			||||||
 | 
								height: 16px;
 | 
				
			||||||
 | 
								margin-right: 8px;
 | 
				
			||||||
 | 
								background: none;
 | 
				
			||||||
 | 
								border: 2px solid var(--inputBorder);
 | 
				
			||||||
 | 
								border-radius: 100%;
 | 
				
			||||||
 | 
								transition: inherit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								&:after {
 | 
				
			||||||
 | 
									content: "";
 | 
				
			||||||
 | 
									display: block;
 | 
				
			||||||
 | 
									position: absolute;
 | 
				
			||||||
 | 
									top: 3px;
 | 
				
			||||||
 | 
									right: 3px;
 | 
				
			||||||
 | 
									bottom: 3px;
 | 
				
			||||||
 | 
									left: 3px;
 | 
				
			||||||
 | 
									border-radius: 100%;
 | 
				
			||||||
 | 
									opacity: 0;
 | 
				
			||||||
 | 
									transform: scale(0);
 | 
				
			||||||
 | 
									transition: .4s cubic-bezier(.25,.8,.25,1);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								&.checked {
 | 
				
			||||||
 | 
									border-color: var(--accent);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									&:after {
 | 
				
			||||||
 | 
										background-color: var(--accent);
 | 
				
			||||||
 | 
										transform: scale(1);
 | 
				
			||||||
 | 
										opacity: 1;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
							
								
								
									
										122
									
								
								src/client/components/debobigego/range.vue
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								src/client/components/debobigego/range.vue
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,122 @@
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					<div class="ifitouly _debobigegoItem" :class="{ focused, disabled }">
 | 
				
			||||||
 | 
						<div class="_debobigegoLabel"><slot name="label"></slot></div>
 | 
				
			||||||
 | 
						<div class="_debobigegoPanel main">
 | 
				
			||||||
 | 
							<input
 | 
				
			||||||
 | 
								type="range"
 | 
				
			||||||
 | 
								ref="input"
 | 
				
			||||||
 | 
								v-model="v"
 | 
				
			||||||
 | 
								:disabled="disabled"
 | 
				
			||||||
 | 
								:min="min"
 | 
				
			||||||
 | 
								:max="max"
 | 
				
			||||||
 | 
								:step="step"
 | 
				
			||||||
 | 
								@focus="focused = true"
 | 
				
			||||||
 | 
								@blur="focused = false"
 | 
				
			||||||
 | 
								@input="$emit('update:value', $event.target.value)"
 | 
				
			||||||
 | 
							/>
 | 
				
			||||||
 | 
						</div>
 | 
				
			||||||
 | 
						<div class="_debobigegoCaption"><slot name="caption"></slot></div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script lang="ts">
 | 
				
			||||||
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default defineComponent({
 | 
				
			||||||
 | 
						props: {
 | 
				
			||||||
 | 
							value: {
 | 
				
			||||||
 | 
								type: Number,
 | 
				
			||||||
 | 
								required: false,
 | 
				
			||||||
 | 
								default: 0
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							disabled: {
 | 
				
			||||||
 | 
								type: Boolean,
 | 
				
			||||||
 | 
								required: false,
 | 
				
			||||||
 | 
								default: false
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							min: {
 | 
				
			||||||
 | 
								type: Number,
 | 
				
			||||||
 | 
								required: false,
 | 
				
			||||||
 | 
								default: 0
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							max: {
 | 
				
			||||||
 | 
								type: Number,
 | 
				
			||||||
 | 
								required: false,
 | 
				
			||||||
 | 
								default: 100
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							step: {
 | 
				
			||||||
 | 
								type: Number,
 | 
				
			||||||
 | 
								required: false,
 | 
				
			||||||
 | 
								default: 1
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						data() {
 | 
				
			||||||
 | 
							return {
 | 
				
			||||||
 | 
								v: this.value,
 | 
				
			||||||
 | 
								focused: false
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						watch: {
 | 
				
			||||||
 | 
							value(v) {
 | 
				
			||||||
 | 
								this.v = parseFloat(v);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style lang="scss" scoped>
 | 
				
			||||||
 | 
					.ifitouly {
 | 
				
			||||||
 | 
						position: relative;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						> .main {
 | 
				
			||||||
 | 
							padding: 22px 16px;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							> input {
 | 
				
			||||||
 | 
								display: block;
 | 
				
			||||||
 | 
								-webkit-appearance: none;
 | 
				
			||||||
 | 
								-moz-appearance: none;
 | 
				
			||||||
 | 
								appearance: none;
 | 
				
			||||||
 | 
								background: var(--X10);
 | 
				
			||||||
 | 
								height: 4px;
 | 
				
			||||||
 | 
								width: 100%;
 | 
				
			||||||
 | 
								box-sizing: border-box;
 | 
				
			||||||
 | 
								margin: 0;
 | 
				
			||||||
 | 
								outline: 0;
 | 
				
			||||||
 | 
								border: 0;
 | 
				
			||||||
 | 
								border-radius: 7px;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								&.disabled {
 | 
				
			||||||
 | 
									opacity: 0.6;
 | 
				
			||||||
 | 
									cursor: not-allowed;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								&::-webkit-slider-thumb {
 | 
				
			||||||
 | 
									-webkit-appearance: none;
 | 
				
			||||||
 | 
									appearance: none;
 | 
				
			||||||
 | 
									cursor: pointer;
 | 
				
			||||||
 | 
									width: 20px;
 | 
				
			||||||
 | 
									height: 20px;
 | 
				
			||||||
 | 
									display: block;
 | 
				
			||||||
 | 
									border-radius: 50%;
 | 
				
			||||||
 | 
									border: none;
 | 
				
			||||||
 | 
									background: var(--accent);
 | 
				
			||||||
 | 
									box-shadow: 0 0 6px rgba(0, 0, 0, 0.3);
 | 
				
			||||||
 | 
									box-sizing: content-box;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								&::-moz-range-thumb {
 | 
				
			||||||
 | 
									-moz-appearance: none;
 | 
				
			||||||
 | 
									appearance: none;
 | 
				
			||||||
 | 
									cursor: pointer;
 | 
				
			||||||
 | 
									width: 20px;
 | 
				
			||||||
 | 
									height: 20px;
 | 
				
			||||||
 | 
									display: block;
 | 
				
			||||||
 | 
									border-radius: 50%;
 | 
				
			||||||
 | 
									border: none;
 | 
				
			||||||
 | 
									background: var(--accent);
 | 
				
			||||||
 | 
									box-shadow: 0 0 6px rgba(0, 0, 0, 0.3);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
							
								
								
									
										145
									
								
								src/client/components/debobigego/select.vue
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										145
									
								
								src/client/components/debobigego/select.vue
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,145 @@
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					<div class="yrtfrpux _debobigegoItem" :class="{ disabled, inline }">
 | 
				
			||||||
 | 
						<div class="_debobigegoLabel"><slot name="label"></slot></div>
 | 
				
			||||||
 | 
						<div class="icon" ref="icon"><slot name="icon"></slot></div>
 | 
				
			||||||
 | 
						<div class="input _debobigegoPanel _debobigegoClickable" @click="focus">
 | 
				
			||||||
 | 
							<div class="prefix" ref="prefix"><slot name="prefix"></slot></div>
 | 
				
			||||||
 | 
							<select ref="input"
 | 
				
			||||||
 | 
								v-model="v"
 | 
				
			||||||
 | 
								:required="required"
 | 
				
			||||||
 | 
								:disabled="disabled"
 | 
				
			||||||
 | 
								@focus="focused = true"
 | 
				
			||||||
 | 
								@blur="focused = false"
 | 
				
			||||||
 | 
							>
 | 
				
			||||||
 | 
								<slot></slot>
 | 
				
			||||||
 | 
							</select>
 | 
				
			||||||
 | 
							<div class="suffix">
 | 
				
			||||||
 | 
								<i class="fas fa-chevron-down"></i>
 | 
				
			||||||
 | 
							</div>
 | 
				
			||||||
 | 
						</div>
 | 
				
			||||||
 | 
						<div class="_debobigegoCaption"><slot name="caption"></slot></div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script lang="ts">
 | 
				
			||||||
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
 | 
					import './debobigego.scss';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default defineComponent({
 | 
				
			||||||
 | 
						props: {
 | 
				
			||||||
 | 
							value: {
 | 
				
			||||||
 | 
								required: false
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							required: {
 | 
				
			||||||
 | 
								type: Boolean,
 | 
				
			||||||
 | 
								required: false
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							disabled: {
 | 
				
			||||||
 | 
								type: Boolean,
 | 
				
			||||||
 | 
								required: false
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							inline: {
 | 
				
			||||||
 | 
								type: Boolean,
 | 
				
			||||||
 | 
								required: false,
 | 
				
			||||||
 | 
								default: false
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						data() {
 | 
				
			||||||
 | 
							return {
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						computed: {
 | 
				
			||||||
 | 
							v: {
 | 
				
			||||||
 | 
								get() {
 | 
				
			||||||
 | 
									return this.value;
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								set(v) {
 | 
				
			||||||
 | 
									this.$emit('update:value', v);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						methods: {
 | 
				
			||||||
 | 
							focus() {
 | 
				
			||||||
 | 
								this.$refs.input.focus();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style lang="scss" scoped>
 | 
				
			||||||
 | 
					.yrtfrpux {
 | 
				
			||||||
 | 
						position: relative;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						> .icon {
 | 
				
			||||||
 | 
							position: absolute;
 | 
				
			||||||
 | 
							top: 0;
 | 
				
			||||||
 | 
							left: 0;
 | 
				
			||||||
 | 
							width: 24px;
 | 
				
			||||||
 | 
							text-align: center;
 | 
				
			||||||
 | 
							line-height: 32px;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							&:not(:empty) + .input {
 | 
				
			||||||
 | 
								margin-left: 28px;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						> .input {
 | 
				
			||||||
 | 
							display: flex;
 | 
				
			||||||
 | 
							position: relative;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							> select {
 | 
				
			||||||
 | 
								display: block;
 | 
				
			||||||
 | 
								flex: 1;
 | 
				
			||||||
 | 
								width: 100%;
 | 
				
			||||||
 | 
								padding: 0 16px;
 | 
				
			||||||
 | 
								font: inherit;
 | 
				
			||||||
 | 
								font-weight: normal;
 | 
				
			||||||
 | 
								font-size: 1em;
 | 
				
			||||||
 | 
								height: 48px;
 | 
				
			||||||
 | 
								background: none;
 | 
				
			||||||
 | 
								border: none;
 | 
				
			||||||
 | 
								border-radius: 0;
 | 
				
			||||||
 | 
								outline: none;
 | 
				
			||||||
 | 
								box-shadow: none;
 | 
				
			||||||
 | 
								appearance: none;
 | 
				
			||||||
 | 
								-webkit-appearance: none;
 | 
				
			||||||
 | 
								color: var(--fg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								option,
 | 
				
			||||||
 | 
								optgroup {
 | 
				
			||||||
 | 
									color: var(--fg);
 | 
				
			||||||
 | 
									background: var(--bg);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							> .prefix,
 | 
				
			||||||
 | 
							> .suffix {
 | 
				
			||||||
 | 
								display: block;
 | 
				
			||||||
 | 
								align-self: center;
 | 
				
			||||||
 | 
								justify-self: center;
 | 
				
			||||||
 | 
								font-size: 1em;
 | 
				
			||||||
 | 
								line-height: 32px;
 | 
				
			||||||
 | 
								color: var(--inputLabel);
 | 
				
			||||||
 | 
								pointer-events: none;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								&:empty {
 | 
				
			||||||
 | 
									display: none;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								> * {
 | 
				
			||||||
 | 
									display: block;
 | 
				
			||||||
 | 
									min-width: 16px;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							> .prefix {
 | 
				
			||||||
 | 
								padding-right: 4px;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							> .suffix {
 | 
				
			||||||
 | 
								padding: 0 16px 0 0;
 | 
				
			||||||
 | 
								opacity: 0.7;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
| 
						 | 
					@ -1,15 +1,15 @@
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
<transition name="fade" mode="out-in">
 | 
					<transition name="fade" mode="out-in">
 | 
				
			||||||
	<div class="_formItem" v-if="pending">
 | 
						<div class="_debobigegoItem" v-if="pending">
 | 
				
			||||||
		<div class="_formPanel">
 | 
							<div class="_debobigegoPanel">
 | 
				
			||||||
			<MkLoading/>
 | 
								<MkLoading/>
 | 
				
			||||||
		</div>
 | 
							</div>
 | 
				
			||||||
	</div>
 | 
						</div>
 | 
				
			||||||
	<div v-else-if="resolved" class="_formItem">
 | 
						<div v-else-if="resolved" class="_debobigegoItem">
 | 
				
			||||||
		<slot :result="result"></slot>
 | 
							<slot :result="result"></slot>
 | 
				
			||||||
	</div>
 | 
						</div>
 | 
				
			||||||
	<div class="_formItem" v-else>
 | 
						<div class="_debobigegoItem" v-else>
 | 
				
			||||||
		<div class="_formPanel eiurkvay">
 | 
							<div class="_debobigegoPanel eiurkvay">
 | 
				
			||||||
			<div><i class="fas fa-exclamation-triangle"></i> {{ $ts.somethingHappened }}</div>
 | 
								<div><i class="fas fa-exclamation-triangle"></i> {{ $ts.somethingHappened }}</div>
 | 
				
			||||||
			<MkButton inline @click="retry" class="retry"><i class="fas fa-redo-alt"></i> {{ $ts.retry }}</MkButton>
 | 
								<MkButton inline @click="retry" class="retry"><i class="fas fa-redo-alt"></i> {{ $ts.retry }}</MkButton>
 | 
				
			||||||
		</div>
 | 
							</div>
 | 
				
			||||||
| 
						 | 
					@ -19,7 +19,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent, PropType, ref, watch } from 'vue';
 | 
					import { defineComponent, PropType, ref, watch } from 'vue';
 | 
				
			||||||
import './form.scss';
 | 
					import './debobigego.scss';
 | 
				
			||||||
import MkButton from '@client/components/ui/button.vue';
 | 
					import MkButton from '@client/components/ui/button.vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default defineComponent({
 | 
					export default defineComponent({
 | 
				
			||||||
							
								
								
									
										132
									
								
								src/client/components/debobigego/switch.vue
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										132
									
								
								src/client/components/debobigego/switch.vue
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,132 @@
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					<div class="ijnpvmgr _debobigegoItem">
 | 
				
			||||||
 | 
						<div class="main _debobigegoPanel _debobigegoClickable"
 | 
				
			||||||
 | 
							:class="{ disabled, checked }"
 | 
				
			||||||
 | 
							:aria-checked="checked"
 | 
				
			||||||
 | 
							:aria-disabled="disabled"
 | 
				
			||||||
 | 
							@click.prevent="toggle"
 | 
				
			||||||
 | 
						>
 | 
				
			||||||
 | 
							<input
 | 
				
			||||||
 | 
								type="checkbox"
 | 
				
			||||||
 | 
								ref="input"
 | 
				
			||||||
 | 
								:disabled="disabled"
 | 
				
			||||||
 | 
								@keydown.enter="toggle"
 | 
				
			||||||
 | 
							>
 | 
				
			||||||
 | 
							<span class="button">
 | 
				
			||||||
 | 
								<span></span>
 | 
				
			||||||
 | 
							</span>
 | 
				
			||||||
 | 
							<span class="label">
 | 
				
			||||||
 | 
								<span><slot></slot></span>
 | 
				
			||||||
 | 
							</span>
 | 
				
			||||||
 | 
						</div>
 | 
				
			||||||
 | 
						<div class="_debobigegoCaption"><slot name="desc"></slot></div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script lang="ts">
 | 
				
			||||||
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
 | 
					import './debobigego.scss';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default defineComponent({
 | 
				
			||||||
 | 
						props: {
 | 
				
			||||||
 | 
							value: {
 | 
				
			||||||
 | 
								type: Boolean,
 | 
				
			||||||
 | 
								default: false
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							disabled: {
 | 
				
			||||||
 | 
								type: Boolean,
 | 
				
			||||||
 | 
								default: false
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						computed: {
 | 
				
			||||||
 | 
							checked(): boolean {
 | 
				
			||||||
 | 
								return this.value;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						methods: {
 | 
				
			||||||
 | 
							toggle() {
 | 
				
			||||||
 | 
								if (this.disabled) return;
 | 
				
			||||||
 | 
								this.$emit('update:value', !this.checked);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style lang="scss" scoped>
 | 
				
			||||||
 | 
					.ijnpvmgr {
 | 
				
			||||||
 | 
						> .main {
 | 
				
			||||||
 | 
							position: relative;
 | 
				
			||||||
 | 
							display: flex;
 | 
				
			||||||
 | 
							padding: 14px 16px;
 | 
				
			||||||
 | 
							cursor: pointer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							> * {
 | 
				
			||||||
 | 
								user-select: none;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							&.disabled {
 | 
				
			||||||
 | 
								opacity: 0.6;
 | 
				
			||||||
 | 
								cursor: not-allowed;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							&.checked {
 | 
				
			||||||
 | 
								> .button {
 | 
				
			||||||
 | 
									background-color: var(--X10);
 | 
				
			||||||
 | 
									border-color: var(--X10);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									> * {
 | 
				
			||||||
 | 
										background-color: var(--accent);
 | 
				
			||||||
 | 
										transform: translateX(14px);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							> input {
 | 
				
			||||||
 | 
								position: absolute;
 | 
				
			||||||
 | 
								width: 0;
 | 
				
			||||||
 | 
								height: 0;
 | 
				
			||||||
 | 
								opacity: 0;
 | 
				
			||||||
 | 
								margin: 0;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							> .button {
 | 
				
			||||||
 | 
								position: relative;
 | 
				
			||||||
 | 
								display: inline-block;
 | 
				
			||||||
 | 
								flex-shrink: 0;
 | 
				
			||||||
 | 
								margin: 3px 0 0 0;
 | 
				
			||||||
 | 
								width: 34px;
 | 
				
			||||||
 | 
								height: 14px;
 | 
				
			||||||
 | 
								background: var(--X6);
 | 
				
			||||||
 | 
								outline: none;
 | 
				
			||||||
 | 
								border-radius: 14px;
 | 
				
			||||||
 | 
								transition: all 0.3s;
 | 
				
			||||||
 | 
								cursor: pointer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								> * {
 | 
				
			||||||
 | 
									position: absolute;
 | 
				
			||||||
 | 
									top: -3px;
 | 
				
			||||||
 | 
									left: 0;
 | 
				
			||||||
 | 
									border-radius: 100%;
 | 
				
			||||||
 | 
									transition: background-color 0.3s, transform 0.3s;
 | 
				
			||||||
 | 
									width: 20px;
 | 
				
			||||||
 | 
									height: 20px;
 | 
				
			||||||
 | 
									background-color: #fff;
 | 
				
			||||||
 | 
									box-shadow: 0 2px 1px -1px rgba(#000, 0.2), 0 1px 1px 0 rgba(#000, 0.14), 0 1px 3px 0 rgba(#000, 0.12);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							> .label {
 | 
				
			||||||
 | 
								margin-left: 12px;
 | 
				
			||||||
 | 
								display: block;
 | 
				
			||||||
 | 
								transition: inherit;
 | 
				
			||||||
 | 
								color: var(--fg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								> span {
 | 
				
			||||||
 | 
									display: block;
 | 
				
			||||||
 | 
									line-height: 20px;
 | 
				
			||||||
 | 
									transition: inherit;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
							
								
								
									
										161
									
								
								src/client/components/debobigego/textarea.vue
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										161
									
								
								src/client/components/debobigego/textarea.vue
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,161 @@
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					<FormGroup class="_debobigegoItem">
 | 
				
			||||||
 | 
						<template #label><slot></slot></template>
 | 
				
			||||||
 | 
						<div class="rivhosbp _debobigegoItem" :class="{ tall, pre }">
 | 
				
			||||||
 | 
							<div class="input _debobigegoPanel">
 | 
				
			||||||
 | 
								<textarea ref="input" :class="{ code, _monospace: code }"
 | 
				
			||||||
 | 
									v-model="v"
 | 
				
			||||||
 | 
									:required="required"
 | 
				
			||||||
 | 
									:readonly="readonly"
 | 
				
			||||||
 | 
									:pattern="pattern"
 | 
				
			||||||
 | 
									:autocomplete="autocomplete"
 | 
				
			||||||
 | 
									:spellcheck="!code"
 | 
				
			||||||
 | 
									@input="onInput"
 | 
				
			||||||
 | 
									@focus="focused = true"
 | 
				
			||||||
 | 
									@blur="focused = false"
 | 
				
			||||||
 | 
								></textarea>
 | 
				
			||||||
 | 
							</div>
 | 
				
			||||||
 | 
						</div>
 | 
				
			||||||
 | 
						<template #caption><slot name="desc"></slot></template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						<FormButton v-if="manualSave && changed" @click="updated" primary><i class="fas fa-save"></i> {{ $ts.save }}</FormButton>
 | 
				
			||||||
 | 
					</FormGroup>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script lang="ts">
 | 
				
			||||||
 | 
					import { defineComponent, ref, toRefs, watch } from 'vue';
 | 
				
			||||||
 | 
					import './debobigego.scss';
 | 
				
			||||||
 | 
					import FormButton from './button.vue';
 | 
				
			||||||
 | 
					import FormGroup from './group.vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default defineComponent({
 | 
				
			||||||
 | 
						components: {
 | 
				
			||||||
 | 
							FormGroup,
 | 
				
			||||||
 | 
							FormButton,
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						props: {
 | 
				
			||||||
 | 
							value: {
 | 
				
			||||||
 | 
								required: false
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							required: {
 | 
				
			||||||
 | 
								type: Boolean,
 | 
				
			||||||
 | 
								required: false
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							readonly: {
 | 
				
			||||||
 | 
								type: Boolean,
 | 
				
			||||||
 | 
								required: false
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							pattern: {
 | 
				
			||||||
 | 
								type: String,
 | 
				
			||||||
 | 
								required: false
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							autocomplete: {
 | 
				
			||||||
 | 
								type: String,
 | 
				
			||||||
 | 
								required: false
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							code: {
 | 
				
			||||||
 | 
								type: Boolean,
 | 
				
			||||||
 | 
								required: false
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							tall: {
 | 
				
			||||||
 | 
								type: Boolean,
 | 
				
			||||||
 | 
								required: false,
 | 
				
			||||||
 | 
								default: false
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							pre: {
 | 
				
			||||||
 | 
								type: Boolean,
 | 
				
			||||||
 | 
								required: false,
 | 
				
			||||||
 | 
								default: false
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							manualSave: {
 | 
				
			||||||
 | 
								type: Boolean,
 | 
				
			||||||
 | 
								required: false,
 | 
				
			||||||
 | 
								default: false
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						setup(props, context) {
 | 
				
			||||||
 | 
							const { value } = toRefs(props);
 | 
				
			||||||
 | 
							const v = ref(value.value);
 | 
				
			||||||
 | 
							const changed = ref(false);
 | 
				
			||||||
 | 
							const inputEl = ref(null);
 | 
				
			||||||
 | 
							const focus = () => inputEl.value.focus();
 | 
				
			||||||
 | 
							const onInput = (ev) => {
 | 
				
			||||||
 | 
								changed.value = true;
 | 
				
			||||||
 | 
								context.emit('change', ev);
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							const updated = () => {
 | 
				
			||||||
 | 
								changed.value = false;
 | 
				
			||||||
 | 
								context.emit('update:value', v.value);
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							watch(value, newValue => {
 | 
				
			||||||
 | 
								v.value = newValue;
 | 
				
			||||||
 | 
							});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							watch(v, newValue => {
 | 
				
			||||||
 | 
								if (!props.manualSave) {
 | 
				
			||||||
 | 
									updated();
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							});
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							return {
 | 
				
			||||||
 | 
								v,
 | 
				
			||||||
 | 
								updated,
 | 
				
			||||||
 | 
								changed,
 | 
				
			||||||
 | 
								focus,
 | 
				
			||||||
 | 
								onInput,
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style lang="scss" scoped>
 | 
				
			||||||
 | 
					.rivhosbp {
 | 
				
			||||||
 | 
						position: relative;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						> .input {
 | 
				
			||||||
 | 
							position: relative;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
							> textarea {
 | 
				
			||||||
 | 
								display: block;
 | 
				
			||||||
 | 
								width: 100%;
 | 
				
			||||||
 | 
								min-width: 100%;
 | 
				
			||||||
 | 
								max-width: 100%;
 | 
				
			||||||
 | 
								min-height: 130px;
 | 
				
			||||||
 | 
								margin: 0;
 | 
				
			||||||
 | 
								padding: 16px;
 | 
				
			||||||
 | 
								box-sizing: border-box;
 | 
				
			||||||
 | 
								font: inherit;
 | 
				
			||||||
 | 
								font-weight: normal;
 | 
				
			||||||
 | 
								font-size: 1em;
 | 
				
			||||||
 | 
								background: transparent;
 | 
				
			||||||
 | 
								border: none;
 | 
				
			||||||
 | 
								border-radius: 0;
 | 
				
			||||||
 | 
								outline: none;
 | 
				
			||||||
 | 
								box-shadow: none;
 | 
				
			||||||
 | 
								color: var(--fg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								&.code {
 | 
				
			||||||
 | 
									tab-size: 2;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						&.tall {
 | 
				
			||||||
 | 
							> .input {
 | 
				
			||||||
 | 
								> textarea {
 | 
				
			||||||
 | 
									min-height: 200px;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						&.pre {
 | 
				
			||||||
 | 
							> .input {
 | 
				
			||||||
 | 
								> textarea {
 | 
				
			||||||
 | 
									white-space: pre;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,5 @@
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
<div class="wthhikgt _formItem" v-size="{ max: [500] }">
 | 
					<div class="wthhikgt _debobigegoItem" v-size="{ max: [500] }">
 | 
				
			||||||
	<slot></slot>
 | 
						<slot></slot>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
| 
						 | 
					@ -40,8 +40,8 @@
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import MkModal from '@client/components/ui/modal.vue';
 | 
					import MkModal from '@client/components/ui/modal.vue';
 | 
				
			||||||
import MkButton from '@client/components/ui/button.vue';
 | 
					import MkButton from '@client/components/ui/button.vue';
 | 
				
			||||||
import MkInput from '@client/components/ui/input.vue';
 | 
					import MkInput from '@client/components/form/input.vue';
 | 
				
			||||||
import MkSelect from '@client/components/ui/select.vue';
 | 
					import MkSelect from '@client/components/form/select.vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default defineComponent({
 | 
					export default defineComponent({
 | 
				
			||||||
	components: {
 | 
						components: {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,7 +35,7 @@
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import XModalWindow from '@client/components/ui/modal-window.vue';
 | 
					import XModalWindow from '@client/components/ui/modal-window.vue';
 | 
				
			||||||
import MkButton from '@client/components/ui/button.vue';
 | 
					import MkButton from '@client/components/ui/button.vue';
 | 
				
			||||||
import MkInput from '@client/components/ui/input.vue';
 | 
					import MkInput from '@client/components/form/input.vue';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default defineComponent({
 | 
					export default defineComponent({
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -53,14 +53,14 @@
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import XModalWindow from '@client/components/ui/modal-window.vue';
 | 
					import XModalWindow from '@client/components/ui/modal-window.vue';
 | 
				
			||||||
import FormBase from './form/base.vue';
 | 
					import FormBase from './debobigego/base.vue';
 | 
				
			||||||
import FormInput from './form/input.vue';
 | 
					import FormInput from './debobigego/input.vue';
 | 
				
			||||||
import FormTextarea from './form/textarea.vue';
 | 
					import FormTextarea from './debobigego/textarea.vue';
 | 
				
			||||||
import FormSwitch from './form/switch.vue';
 | 
					import FormSwitch from './debobigego/switch.vue';
 | 
				
			||||||
import FormSelect from './form/select.vue';
 | 
					import FormSelect from './debobigego/select.vue';
 | 
				
			||||||
import FormRange from './form/range.vue';
 | 
					import FormRange from './debobigego/range.vue';
 | 
				
			||||||
import FormButton from './form/button.vue';
 | 
					import FormButton from './debobigego/button.vue';
 | 
				
			||||||
import FormRadios from './form/radios.vue';
 | 
					import FormRadios from './debobigego/radios.vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default defineComponent({
 | 
					export default defineComponent({
 | 
				
			||||||
	components: {
 | 
						components: {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,9 +1,7 @@
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
<FormGroup class="_formItem">
 | 
					<div class="matxzzsk">
 | 
				
			||||||
	<template #label><slot></slot></template>
 | 
						<div class="label" @click="focus"><slot name="label"></slot></div>
 | 
				
			||||||
	<div class="ztzhwixg _formItem" :class="{ inline, disabled }">
 | 
						<div class="input" :class="{ inline, disabled, focused }">
 | 
				
			||||||
		<div class="icon" ref="icon"><slot name="icon"></slot></div>
 | 
					 | 
				
			||||||
		<div class="input _formPanel">
 | 
					 | 
				
			||||||
		<div class="prefix" ref="prefixEl"><slot name="prefix"></slot></div>
 | 
							<div class="prefix" ref="prefixEl"><slot name="prefix"></slot></div>
 | 
				
			||||||
		<input ref="inputEl"
 | 
							<input ref="inputEl"
 | 
				
			||||||
			:type="type"
 | 
								:type="type"
 | 
				
			||||||
| 
						 | 
					@ -27,27 +25,25 @@
 | 
				
			||||||
		</datalist>
 | 
							</datalist>
 | 
				
			||||||
		<div class="suffix" ref="suffixEl"><slot name="suffix"></slot></div>
 | 
							<div class="suffix" ref="suffixEl"><slot name="suffix"></slot></div>
 | 
				
			||||||
	</div>
 | 
						</div>
 | 
				
			||||||
	</div>
 | 
						<div class="caption"><slot name="caption"></slot></div>
 | 
				
			||||||
	<template #caption><slot name="desc"></slot></template>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	<FormButton v-if="manualSave && changed" @click="updated" primary><i class="fas fa-save"></i> {{ $ts.save }}</FormButton>
 | 
						<MkButton v-if="manualSave && changed" @click="updated" primary><i class="fas fa-save"></i> {{ $ts.save }}</MkButton>
 | 
				
			||||||
</FormGroup>
 | 
					</div>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent, onMounted, onUnmounted, nextTick, ref, watch, computed, toRefs } from 'vue';
 | 
					import { defineComponent, onMounted, onUnmounted, nextTick, ref, watch, computed, toRefs } from 'vue';
 | 
				
			||||||
import './form.scss';
 | 
					import MkButton from '../ui/button.vue';
 | 
				
			||||||
import FormButton from './button.vue';
 | 
					import { debounce } from 'throttle-debounce';
 | 
				
			||||||
import FormGroup from './group.vue';
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default defineComponent({
 | 
					export default defineComponent({
 | 
				
			||||||
	components: {
 | 
						components: {
 | 
				
			||||||
		FormGroup,
 | 
							MkButton,
 | 
				
			||||||
		FormButton,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	props: {
 | 
						props: {
 | 
				
			||||||
		value: {
 | 
							modelValue: {
 | 
				
			||||||
			required: false
 | 
								required: true
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		type: {
 | 
							type: {
 | 
				
			||||||
			type: String,
 | 
								type: String,
 | 
				
			||||||
| 
						 | 
					@ -96,16 +92,23 @@ export default defineComponent({
 | 
				
			||||||
			required: false,
 | 
								required: false,
 | 
				
			||||||
			default: false
 | 
								default: false
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
							debounce: {
 | 
				
			||||||
 | 
								type: Boolean,
 | 
				
			||||||
 | 
								required: false,
 | 
				
			||||||
 | 
								default: false
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
		manualSave: {
 | 
							manualSave: {
 | 
				
			||||||
			type: Boolean,
 | 
								type: Boolean,
 | 
				
			||||||
			required: false,
 | 
								required: false,
 | 
				
			||||||
			default: false
 | 
								default: false
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	emits: ['change', 'keydown', 'enter'],
 | 
					
 | 
				
			||||||
 | 
						emits: ['change', 'keydown', 'enter', 'update:modelValue'],
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	setup(props, context) {
 | 
						setup(props, context) {
 | 
				
			||||||
		const { value, type, autofocus } = toRefs(props);
 | 
							const { modelValue, type, autofocus } = toRefs(props);
 | 
				
			||||||
		const v = ref(value.value);
 | 
							const v = ref(modelValue.value);
 | 
				
			||||||
		const id = Math.random().toString(); // TODO: uuid?
 | 
							const id = Math.random().toString(); // TODO: uuid?
 | 
				
			||||||
		const focused = ref(false);
 | 
							const focused = ref(false);
 | 
				
			||||||
		const changed = ref(false);
 | 
							const changed = ref(false);
 | 
				
			||||||
| 
						 | 
					@ -131,20 +134,26 @@ export default defineComponent({
 | 
				
			||||||
		const updated = () => {
 | 
							const updated = () => {
 | 
				
			||||||
			changed.value = false;
 | 
								changed.value = false;
 | 
				
			||||||
			if (type?.value === 'number') {
 | 
								if (type?.value === 'number') {
 | 
				
			||||||
				context.emit('update:value', parseFloat(v.value));
 | 
									context.emit('update:modelValue', parseFloat(v.value));
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				context.emit('update:value', v.value);
 | 
									context.emit('update:modelValue', v.value);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		watch(value, newValue => {
 | 
							const debouncedUpdated = debounce(1000, updated);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							watch(modelValue, newValue => {
 | 
				
			||||||
			v.value = newValue;
 | 
								v.value = newValue;
 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		watch(v, newValue => {
 | 
							watch(v, newValue => {
 | 
				
			||||||
			if (!props.manualSave) {
 | 
								if (!props.manualSave) {
 | 
				
			||||||
 | 
									if (props.debounce) {
 | 
				
			||||||
 | 
										debouncedUpdated();
 | 
				
			||||||
 | 
									} else {
 | 
				
			||||||
					updated();
 | 
										updated();
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			invalid.value = inputEl.value.validity.badInput;
 | 
								invalid.value = inputEl.value.validity.badInput;
 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
| 
						 | 
					@ -196,59 +205,66 @@ export default defineComponent({
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<style lang="scss" scoped>
 | 
					<style lang="scss" scoped>
 | 
				
			||||||
.ztzhwixg {
 | 
					.matxzzsk {
 | 
				
			||||||
	position: relative;
 | 
						> .label {
 | 
				
			||||||
 | 
							font-size: 0.85em;
 | 
				
			||||||
 | 
							padding: 0 0 8px 12px;
 | 
				
			||||||
 | 
							user-select: none;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	> .icon {
 | 
							&:empty {
 | 
				
			||||||
		position: absolute;
 | 
								display: none;
 | 
				
			||||||
		top: 0;
 | 
							}
 | 
				
			||||||
		left: 0;
 | 
						}
 | 
				
			||||||
		width: 24px;
 | 
					 | 
				
			||||||
		text-align: center;
 | 
					 | 
				
			||||||
		line-height: 32px;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		&:not(:empty) + .input {
 | 
						> .caption {
 | 
				
			||||||
			margin-left: 28px;
 | 
							font-size: 0.8em;
 | 
				
			||||||
 | 
							padding: 8px 0 0 12px;
 | 
				
			||||||
 | 
							color: var(--fgTransparentWeak);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							&:empty {
 | 
				
			||||||
 | 
								display: none;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	> .input {
 | 
						> .input {
 | 
				
			||||||
		$height: 48px;
 | 
							$height: 42px;
 | 
				
			||||||
		position: relative;
 | 
							position: relative;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		> input {
 | 
							> input {
 | 
				
			||||||
 | 
								appearance: none;
 | 
				
			||||||
 | 
								-webkit-appearance: none;
 | 
				
			||||||
			display: block;
 | 
								display: block;
 | 
				
			||||||
			height: $height;
 | 
								height: $height;
 | 
				
			||||||
			width: 100%;
 | 
								width: 100%;
 | 
				
			||||||
			margin: 0;
 | 
								margin: 0;
 | 
				
			||||||
			padding: 0 16px;
 | 
								padding: 0 12px;
 | 
				
			||||||
			font: inherit;
 | 
								font: inherit;
 | 
				
			||||||
			font-weight: normal;
 | 
								font-weight: normal;
 | 
				
			||||||
			font-size: 1em;
 | 
								font-size: 1em;
 | 
				
			||||||
			line-height: $height;
 | 
								color: var(--fg);
 | 
				
			||||||
			color: var(--inputText);
 | 
								background: var(--panel);
 | 
				
			||||||
			background: transparent;
 | 
								border: solid 0.5px var(--inputBorder);
 | 
				
			||||||
			border: none;
 | 
								border-radius: 6px;
 | 
				
			||||||
			border-radius: 0;
 | 
					 | 
				
			||||||
			outline: none;
 | 
								outline: none;
 | 
				
			||||||
			box-shadow: none;
 | 
								box-shadow: none;
 | 
				
			||||||
			box-sizing: border-box;
 | 
								box-sizing: border-box;
 | 
				
			||||||
 | 
								transition: border-color 0.1s ease-out;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			&[type='file'] {
 | 
								&:hover {
 | 
				
			||||||
				display: none;
 | 
									border-color: var(--inputBorderHover);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		> .prefix,
 | 
							> .prefix,
 | 
				
			||||||
		> .suffix {
 | 
							> .suffix {
 | 
				
			||||||
			display: block;
 | 
								display: flex;
 | 
				
			||||||
 | 
								align-items: center;
 | 
				
			||||||
			position: absolute;
 | 
								position: absolute;
 | 
				
			||||||
			z-index: 1;
 | 
								z-index: 1;
 | 
				
			||||||
			top: 0;
 | 
								top: 0;
 | 
				
			||||||
			padding: 0 16px;
 | 
								padding: 0 12px;
 | 
				
			||||||
			font-size: 1em;
 | 
								font-size: 1em;
 | 
				
			||||||
			line-height: $height;
 | 
								height: $height;
 | 
				
			||||||
			color: var(--inputLabel);
 | 
					 | 
				
			||||||
			pointer-events: none;
 | 
								pointer-events: none;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			&:empty {
 | 
								&:empty {
 | 
				
			||||||
| 
						 | 
					@ -267,13 +283,12 @@ export default defineComponent({
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		> .prefix {
 | 
							> .prefix {
 | 
				
			||||||
			left: 0;
 | 
								left: 0;
 | 
				
			||||||
			padding-right: 8px;
 | 
								padding-right: 6px;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		> .suffix {
 | 
							> .suffix {
 | 
				
			||||||
			right: 0;
 | 
								right: 0;
 | 
				
			||||||
			padding-left: 8px;
 | 
								padding-left: 6px;
 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		&.inline {
 | 
							&.inline {
 | 
				
			||||||
| 
						 | 
					@ -281,6 +296,13 @@ export default defineComponent({
 | 
				
			||||||
			margin: 0;
 | 
								margin: 0;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							&.focused {
 | 
				
			||||||
 | 
								> input {
 | 
				
			||||||
 | 
									border-color: var(--accent);
 | 
				
			||||||
 | 
									//box-shadow: 0 0 0 4px var(--focus);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		&.disabled {
 | 
							&.disabled {
 | 
				
			||||||
			opacity: 0.7;
 | 
								opacity: 0.7;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -288,5 +310,6 @@ export default defineComponent({
 | 
				
			||||||
				cursor: not-allowed !important;
 | 
									cursor: not-allowed !important;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
</style>
 | 
					</style>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,6 @@
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent, h } from 'vue';
 | 
					import { defineComponent, h } from 'vue';
 | 
				
			||||||
import MkRadio from '@client/components/ui/radio.vue';
 | 
					import MkRadio from './radio.vue';
 | 
				
			||||||
import './form.scss';
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default defineComponent({
 | 
					export default defineComponent({
 | 
				
			||||||
	components: {
 | 
						components: {
 | 
				
			||||||
| 
						 | 
					@ -18,9 +17,6 @@ export default defineComponent({
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	watch: {
 | 
						watch: {
 | 
				
			||||||
		modelValue() {
 | 
					 | 
				
			||||||
			this.value = this.modelValue;
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		value() {
 | 
							value() {
 | 
				
			||||||
			this.$emit('update:modelValue', this.value);
 | 
								this.$emit('update:modelValue', this.value);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -33,80 +29,38 @@ export default defineComponent({
 | 
				
			||||||
		if (options.length === 1 && options[0].props == null) options = options[0].children;
 | 
							if (options.length === 1 && options[0].props == null) options = options[0].children;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return h('div', {
 | 
							return h('div', {
 | 
				
			||||||
			class: 'cnklmpwm _formItem'
 | 
								class: 'novjtcto'
 | 
				
			||||||
		}, [
 | 
							}, [
 | 
				
			||||||
			h('div', {
 | 
								h('div', { class: 'label' }, label),
 | 
				
			||||||
				class: '_formLabel',
 | 
								...options.map(option => h(MkRadio, {
 | 
				
			||||||
			}, label),
 | 
					 | 
				
			||||||
			...options.map(option => h('button', {
 | 
					 | 
				
			||||||
				class: '_button _formPanel _formClickable',
 | 
					 | 
				
			||||||
				key: option.key,
 | 
									key: option.key,
 | 
				
			||||||
				onClick: () => this.value = option.props.value,
 | 
									value: option.props.value,
 | 
				
			||||||
			}, [h('span', {
 | 
									modelValue: this.value,
 | 
				
			||||||
				class: ['check', { checked: this.value === option.props.value }],
 | 
									'onUpdate:modelValue': value => this.value = value,
 | 
				
			||||||
			}), option.children]))
 | 
								}, option.children))
 | 
				
			||||||
		]);
 | 
							]);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<style lang="scss">
 | 
					<style lang="scss">
 | 
				
			||||||
.cnklmpwm {
 | 
					.novjtcto {
 | 
				
			||||||
	> button {
 | 
						> .label {
 | 
				
			||||||
		display: block;
 | 
							font-size: 0.85em;
 | 
				
			||||||
		width: 100%;
 | 
							padding: 0 0 8px 12px;
 | 
				
			||||||
		box-sizing: border-box;
 | 
							user-select: none;
 | 
				
			||||||
		padding: 14px 18px;
 | 
					 | 
				
			||||||
		text-align: left;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		&:not(:first-of-type) {
 | 
							&:empty {
 | 
				
			||||||
			border-top: none !important;
 | 
								display: none;
 | 
				
			||||||
			border-top-left-radius: 0;
 | 
					 | 
				
			||||||
			border-top-right-radius: 0;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		&:not(:last-of-type) {
 | 
					 | 
				
			||||||
			border-bottom: solid 0.5px var(--divider);
 | 
					 | 
				
			||||||
			border-bottom-left-radius: 0;
 | 
					 | 
				
			||||||
			border-bottom-right-radius: 0;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		> .check {
 | 
					 | 
				
			||||||
			display: inline-block;
 | 
					 | 
				
			||||||
			vertical-align: bottom;
 | 
					 | 
				
			||||||
			position: relative;
 | 
					 | 
				
			||||||
			width: 16px;
 | 
					 | 
				
			||||||
			height: 16px;
 | 
					 | 
				
			||||||
			margin-right: 8px;
 | 
					 | 
				
			||||||
			background: none;
 | 
					 | 
				
			||||||
			border: 2px solid var(--inputBorder);
 | 
					 | 
				
			||||||
			border-radius: 100%;
 | 
					 | 
				
			||||||
			transition: inherit;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			&:after {
 | 
					 | 
				
			||||||
				content: "";
 | 
					 | 
				
			||||||
				display: block;
 | 
					 | 
				
			||||||
				position: absolute;
 | 
					 | 
				
			||||||
				top: 3px;
 | 
					 | 
				
			||||||
				right: 3px;
 | 
					 | 
				
			||||||
				bottom: 3px;
 | 
					 | 
				
			||||||
				left: 3px;
 | 
					 | 
				
			||||||
				border-radius: 100%;
 | 
					 | 
				
			||||||
				opacity: 0;
 | 
					 | 
				
			||||||
				transform: scale(0);
 | 
					 | 
				
			||||||
				transition: .4s cubic-bezier(.25,.8,.25,1);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			&.checked {
 | 
					 | 
				
			||||||
				border-color: var(--accent);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				&:after {
 | 
					 | 
				
			||||||
					background-color: var(--accent);
 | 
					 | 
				
			||||||
					transform: scale(1);
 | 
					 | 
				
			||||||
					opacity: 1;
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						&:first-child {
 | 
				
			||||||
 | 
							margin-top: 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						&:last-child {
 | 
				
			||||||
 | 
							margin-bottom: 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
</style>
 | 
					</style>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
<div class="ifitouly _formItem" :class="{ focused, disabled }">
 | 
					<div class="timctyfi" :class="{ focused, disabled }">
 | 
				
			||||||
	<div class="_formLabel"><slot name="label"></slot></div>
 | 
						<div class="icon"><slot name="icon"></slot></div>
 | 
				
			||||||
	<div class="_formPanel main">
 | 
						<span class="label"><slot name="label"></slot></span>
 | 
				
			||||||
	<input
 | 
						<input
 | 
				
			||||||
		type="range"
 | 
							type="range"
 | 
				
			||||||
		ref="input"
 | 
							ref="input"
 | 
				
			||||||
| 
						 | 
					@ -10,12 +10,11 @@
 | 
				
			||||||
		:min="min"
 | 
							:min="min"
 | 
				
			||||||
		:max="max"
 | 
							:max="max"
 | 
				
			||||||
		:step="step"
 | 
							:step="step"
 | 
				
			||||||
 | 
							:autofocus="autofocus"
 | 
				
			||||||
		@focus="focused = true"
 | 
							@focus="focused = true"
 | 
				
			||||||
		@blur="focused = false"
 | 
							@blur="focused = false"
 | 
				
			||||||
		@input="$emit('update:value', $event.target.value)"
 | 
							@input="$emit('update:value', $event.target.value)"
 | 
				
			||||||
	/>
 | 
						/>
 | 
				
			||||||
	</div>
 | 
					 | 
				
			||||||
	<div class="_formCaption"><slot name="caption"></slot></div>
 | 
					 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -49,6 +48,10 @@ export default defineComponent({
 | 
				
			||||||
			required: false,
 | 
								required: false,
 | 
				
			||||||
			default: 1
 | 
								default: 1
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
							autofocus: {
 | 
				
			||||||
 | 
								type: Boolean,
 | 
				
			||||||
 | 
								required: false
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	data() {
 | 
						data() {
 | 
				
			||||||
		return {
 | 
							return {
 | 
				
			||||||
| 
						 | 
					@ -61,26 +64,41 @@ export default defineComponent({
 | 
				
			||||||
			this.v = parseFloat(v);
 | 
								this.v = parseFloat(v);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
						mounted() {
 | 
				
			||||||
 | 
							if (this.autofocus) {
 | 
				
			||||||
 | 
								this.$nextTick(() => {
 | 
				
			||||||
 | 
									this.$refs.input.focus();
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<style lang="scss" scoped>
 | 
					<style lang="scss" scoped>
 | 
				
			||||||
.ifitouly {
 | 
					.timctyfi {
 | 
				
			||||||
	position: relative;
 | 
						position: relative;
 | 
				
			||||||
 | 
						margin: 8px;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	> .main {
 | 
						> .icon {
 | 
				
			||||||
		padding: 22px 16px;
 | 
							display: inline-block;
 | 
				
			||||||
 | 
							width: 24px;
 | 
				
			||||||
 | 
							text-align: center;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						> .title {
 | 
				
			||||||
 | 
							pointer-events: none;
 | 
				
			||||||
 | 
							font-size: 16px;
 | 
				
			||||||
 | 
							color: var(--inputLabel);
 | 
				
			||||||
 | 
							overflow: hidden;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	> input {
 | 
						> input {
 | 
				
			||||||
			display: block;
 | 
					 | 
				
			||||||
		-webkit-appearance: none;
 | 
							-webkit-appearance: none;
 | 
				
			||||||
		-moz-appearance: none;
 | 
							-moz-appearance: none;
 | 
				
			||||||
		appearance: none;
 | 
							appearance: none;
 | 
				
			||||||
		background: var(--X10);
 | 
							background: var(--X10);
 | 
				
			||||||
			height: 4px;
 | 
							height: 7px;
 | 
				
			||||||
			width: 100%;
 | 
							margin: 0 8px;
 | 
				
			||||||
			box-sizing: border-box;
 | 
					 | 
				
			||||||
			margin: 0;
 | 
					 | 
				
			||||||
		outline: 0;
 | 
							outline: 0;
 | 
				
			||||||
		border: 0;
 | 
							border: 0;
 | 
				
			||||||
		border-radius: 7px;
 | 
							border-radius: 7px;
 | 
				
			||||||
| 
						 | 
					@ -117,6 +135,5 @@ export default defineComponent({
 | 
				
			||||||
			box-shadow: 0 0 6px rgba(0, 0, 0, 0.3);
 | 
								box-shadow: 0 0 6px rgba(0, 0, 0, 0.3);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
</style>
 | 
					</style>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										31
									
								
								src/client/components/form/section.vue
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								src/client/components/form/section.vue
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,31 @@
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					<div class="vrtktovh" v-size="{ max: [500] }" v-sticky-container>
 | 
				
			||||||
 | 
						<div class="label"><slot name="label"></slot></div>
 | 
				
			||||||
 | 
						<div class="main">
 | 
				
			||||||
 | 
							<slot></slot>
 | 
				
			||||||
 | 
						</div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script lang="ts">
 | 
				
			||||||
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default defineComponent({
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style lang="scss" scoped>
 | 
				
			||||||
 | 
					.vrtktovh {
 | 
				
			||||||
 | 
						border-top: solid 0.5px var(--divider);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						> .label {
 | 
				
			||||||
 | 
							font-weight: bold;
 | 
				
			||||||
 | 
							padding: 24px 0 16px 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						> .main {
 | 
				
			||||||
 | 
							margin-bottom: 32px;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
| 
						 | 
					@ -1,125 +1,216 @@
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
<div class="yrtfrpux _formItem" :class="{ disabled, inline }">
 | 
					<div class="vblkjoeq">
 | 
				
			||||||
	<div class="_formLabel"><slot name="label"></slot></div>
 | 
						<div class="label" @click="focus"><slot name="label"></slot></div>
 | 
				
			||||||
	<div class="icon" ref="icon"><slot name="icon"></slot></div>
 | 
						<div class="input" :class="{ inline, disabled, focused }">
 | 
				
			||||||
	<div class="input _formPanel _formClickable" @click="focus">
 | 
							<div class="prefix" ref="prefixEl"><slot name="prefix"></slot></div>
 | 
				
			||||||
		<div class="prefix" ref="prefix"><slot name="prefix"></slot></div>
 | 
							<select ref="inputEl"
 | 
				
			||||||
		<select ref="input"
 | 
					 | 
				
			||||||
			v-model="v"
 | 
								v-model="v"
 | 
				
			||||||
			:required="required"
 | 
					 | 
				
			||||||
			:disabled="disabled"
 | 
								:disabled="disabled"
 | 
				
			||||||
 | 
								:required="required"
 | 
				
			||||||
 | 
								:readonly="readonly"
 | 
				
			||||||
 | 
								:placeholder="placeholder"
 | 
				
			||||||
			@focus="focused = true"
 | 
								@focus="focused = true"
 | 
				
			||||||
			@blur="focused = false"
 | 
								@blur="focused = false"
 | 
				
			||||||
 | 
								@input="onInput"
 | 
				
			||||||
		>
 | 
							>
 | 
				
			||||||
			<slot></slot>
 | 
								<slot></slot>
 | 
				
			||||||
		</select>
 | 
							</select>
 | 
				
			||||||
		<div class="suffix">
 | 
							<div class="suffix" ref="suffixEl"><i class="fas fa-chevron-down"></i></div>
 | 
				
			||||||
			<i class="fas fa-chevron-down"></i>
 | 
					 | 
				
			||||||
	</div>
 | 
						</div>
 | 
				
			||||||
	</div>
 | 
						<div class="caption"><slot name="caption"></slot></div>
 | 
				
			||||||
	<div class="_formCaption"><slot name="caption"></slot></div>
 | 
					
 | 
				
			||||||
 | 
						<MkButton v-if="manualSave && changed" @click="updated" primary><i class="fas fa-save"></i> {{ $ts.save }}</MkButton>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent, onMounted, onUnmounted, nextTick, ref, watch, computed, toRefs } from 'vue';
 | 
				
			||||||
import './form.scss';
 | 
					import MkButton from '../ui/button.vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default defineComponent({
 | 
					export default defineComponent({
 | 
				
			||||||
 | 
						components: {
 | 
				
			||||||
 | 
							MkButton,
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	props: {
 | 
						props: {
 | 
				
			||||||
		value: {
 | 
							modelValue: {
 | 
				
			||||||
			required: false
 | 
								required: true
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		required: {
 | 
							required: {
 | 
				
			||||||
			type: Boolean,
 | 
								type: Boolean,
 | 
				
			||||||
			required: false
 | 
								required: false
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
							readonly: {
 | 
				
			||||||
 | 
								type: Boolean,
 | 
				
			||||||
 | 
								required: false
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
		disabled: {
 | 
							disabled: {
 | 
				
			||||||
			type: Boolean,
 | 
								type: Boolean,
 | 
				
			||||||
			required: false
 | 
								required: false
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
							placeholder: {
 | 
				
			||||||
 | 
								type: String,
 | 
				
			||||||
 | 
								required: false
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							autofocus: {
 | 
				
			||||||
 | 
								type: Boolean,
 | 
				
			||||||
 | 
								required: false,
 | 
				
			||||||
 | 
								default: false
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
		inline: {
 | 
							inline: {
 | 
				
			||||||
			type: Boolean,
 | 
								type: Boolean,
 | 
				
			||||||
			required: false,
 | 
								required: false,
 | 
				
			||||||
			default: false
 | 
								default: false
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
							manualSave: {
 | 
				
			||||||
 | 
								type: Boolean,
 | 
				
			||||||
 | 
								required: false,
 | 
				
			||||||
 | 
								default: false
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	data() {
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						emits: ['change', 'update:modelValue'],
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						setup(props, context) {
 | 
				
			||||||
 | 
							const { modelValue, autofocus } = toRefs(props);
 | 
				
			||||||
 | 
							const v = ref(modelValue.value);
 | 
				
			||||||
 | 
							const focused = ref(false);
 | 
				
			||||||
 | 
							const changed = ref(false);
 | 
				
			||||||
 | 
							const invalid = ref(false);
 | 
				
			||||||
 | 
							const filled = computed(() => v.value !== '' && v.value != null);
 | 
				
			||||||
 | 
							const inputEl = ref(null);
 | 
				
			||||||
 | 
							const prefixEl = ref(null);
 | 
				
			||||||
 | 
							const suffixEl = ref(null);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							const focus = () => inputEl.value.focus();
 | 
				
			||||||
 | 
							const onInput = (ev) => {
 | 
				
			||||||
 | 
								changed.value = true;
 | 
				
			||||||
 | 
								context.emit('change', ev);
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							const updated = () => {
 | 
				
			||||||
 | 
								changed.value = false;
 | 
				
			||||||
 | 
								context.emit('update:modelValue', v.value);
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							watch(modelValue, newValue => {
 | 
				
			||||||
 | 
								v.value = newValue;
 | 
				
			||||||
 | 
							});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							watch(v, newValue => {
 | 
				
			||||||
 | 
								if (!props.manualSave) {
 | 
				
			||||||
 | 
									updated();
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								invalid.value = inputEl.value.validity.badInput;
 | 
				
			||||||
 | 
							});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							onMounted(() => {
 | 
				
			||||||
 | 
								nextTick(() => {
 | 
				
			||||||
 | 
									if (autofocus.value) {
 | 
				
			||||||
 | 
										focus();
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									// このコンポーネントが作成された時、非表示状態である場合がある
 | 
				
			||||||
 | 
									// 非表示状態だと要素の幅などは0になってしまうので、定期的に計算する
 | 
				
			||||||
 | 
									const clock = setInterval(() => {
 | 
				
			||||||
 | 
										if (prefixEl.value) {
 | 
				
			||||||
 | 
											if (prefixEl.value.offsetWidth) {
 | 
				
			||||||
 | 
												inputEl.value.style.paddingLeft = prefixEl.value.offsetWidth + 'px';
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										if (suffixEl.value) {
 | 
				
			||||||
 | 
											if (suffixEl.value.offsetWidth) {
 | 
				
			||||||
 | 
												inputEl.value.style.paddingRight = suffixEl.value.offsetWidth + 'px';
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}, 100);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									onUnmounted(() => {
 | 
				
			||||||
 | 
										clearInterval(clock);
 | 
				
			||||||
 | 
									});
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
 | 
							});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return {
 | 
							return {
 | 
				
			||||||
 | 
								v,
 | 
				
			||||||
 | 
								focused,
 | 
				
			||||||
 | 
								invalid,
 | 
				
			||||||
 | 
								changed,
 | 
				
			||||||
 | 
								filled,
 | 
				
			||||||
 | 
								inputEl,
 | 
				
			||||||
 | 
								prefixEl,
 | 
				
			||||||
 | 
								suffixEl,
 | 
				
			||||||
 | 
								focus,
 | 
				
			||||||
 | 
								onInput,
 | 
				
			||||||
 | 
								updated,
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	computed: {
 | 
					 | 
				
			||||||
		v: {
 | 
					 | 
				
			||||||
			get() {
 | 
					 | 
				
			||||||
				return this.value;
 | 
					 | 
				
			||||||
			},
 | 
					 | 
				
			||||||
			set(v) {
 | 
					 | 
				
			||||||
				this.$emit('update:value', v);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
	methods: {
 | 
					 | 
				
			||||||
		focus() {
 | 
					 | 
				
			||||||
			this.$refs.input.focus();
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<style lang="scss" scoped>
 | 
					<style lang="scss" scoped>
 | 
				
			||||||
.yrtfrpux {
 | 
					.vblkjoeq {
 | 
				
			||||||
	position: relative;
 | 
						> .label {
 | 
				
			||||||
 | 
							font-size: 0.85em;
 | 
				
			||||||
 | 
							padding: 0 0 8px 12px;
 | 
				
			||||||
 | 
							user-select: none;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	> .icon {
 | 
							&:empty {
 | 
				
			||||||
		position: absolute;
 | 
								display: none;
 | 
				
			||||||
		top: 0;
 | 
							}
 | 
				
			||||||
		left: 0;
 | 
						}
 | 
				
			||||||
		width: 24px;
 | 
					 | 
				
			||||||
		text-align: center;
 | 
					 | 
				
			||||||
		line-height: 32px;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		&:not(:empty) + .input {
 | 
						> .caption {
 | 
				
			||||||
			margin-left: 28px;
 | 
							font-size: 0.8em;
 | 
				
			||||||
 | 
							padding: 8px 0 0 12px;
 | 
				
			||||||
 | 
							color: var(--fgTransparentWeak);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							&:empty {
 | 
				
			||||||
 | 
								display: none;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	> .input {
 | 
						> .input {
 | 
				
			||||||
		display: flex;
 | 
							$height: 42px;
 | 
				
			||||||
		position: relative;
 | 
							position: relative;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		> select {
 | 
							> select {
 | 
				
			||||||
 | 
								appearance: none;
 | 
				
			||||||
 | 
								-webkit-appearance: none;
 | 
				
			||||||
			display: block;
 | 
								display: block;
 | 
				
			||||||
			flex: 1;
 | 
								height: $height;
 | 
				
			||||||
			width: 100%;
 | 
								width: 100%;
 | 
				
			||||||
			padding: 0 16px;
 | 
								margin: 0;
 | 
				
			||||||
 | 
								padding: 0 12px;
 | 
				
			||||||
			font: inherit;
 | 
								font: inherit;
 | 
				
			||||||
			font-weight: normal;
 | 
								font-weight: normal;
 | 
				
			||||||
			font-size: 1em;
 | 
								font-size: 1em;
 | 
				
			||||||
			height: 48px;
 | 
								color: var(--fg);
 | 
				
			||||||
			background: none;
 | 
								background: var(--panel);
 | 
				
			||||||
			border: none;
 | 
								border: solid 1px var(--inputBorder);
 | 
				
			||||||
			border-radius: 0;
 | 
								border-radius: 6px;
 | 
				
			||||||
			outline: none;
 | 
								outline: none;
 | 
				
			||||||
			box-shadow: none;
 | 
								box-shadow: none;
 | 
				
			||||||
			appearance: none;
 | 
								box-sizing: border-box;
 | 
				
			||||||
			-webkit-appearance: none;
 | 
								cursor: pointer;
 | 
				
			||||||
			color: var(--fg);
 | 
								transition: border-color 0.1s ease-out;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			option,
 | 
								&:hover {
 | 
				
			||||||
			optgroup {
 | 
									border-color: var(--inputBorderHover);
 | 
				
			||||||
				color: var(--fg);
 | 
					 | 
				
			||||||
				background: var(--bg);
 | 
					 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		> .prefix,
 | 
							> .prefix,
 | 
				
			||||||
		> .suffix {
 | 
							> .suffix {
 | 
				
			||||||
			display: block;
 | 
								display: flex;
 | 
				
			||||||
			align-self: center;
 | 
								align-items: center;
 | 
				
			||||||
			justify-self: center;
 | 
								position: absolute;
 | 
				
			||||||
 | 
								z-index: 1;
 | 
				
			||||||
 | 
								top: 0;
 | 
				
			||||||
 | 
								padding: 0 12px;
 | 
				
			||||||
			font-size: 1em;
 | 
								font-size: 1em;
 | 
				
			||||||
			line-height: 32px;
 | 
								height: $height;
 | 
				
			||||||
			color: var(--inputLabel);
 | 
					 | 
				
			||||||
			pointer-events: none;
 | 
								pointer-events: none;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			&:empty {
 | 
								&:empty {
 | 
				
			||||||
| 
						 | 
					@ -127,18 +218,42 @@ export default defineComponent({
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			> * {
 | 
								> * {
 | 
				
			||||||
				display: block;
 | 
									display: inline-block;
 | 
				
			||||||
				min-width: 16px;
 | 
									min-width: 16px;
 | 
				
			||||||
 | 
									max-width: 150px;
 | 
				
			||||||
 | 
									overflow: hidden;
 | 
				
			||||||
 | 
									white-space: nowrap;
 | 
				
			||||||
 | 
									text-overflow: ellipsis;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		> .prefix {
 | 
							> .prefix {
 | 
				
			||||||
			padding-right: 4px;
 | 
								left: 0;
 | 
				
			||||||
 | 
								padding-right: 6px;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		> .suffix {
 | 
							> .suffix {
 | 
				
			||||||
			padding: 0 16px 0 0;
 | 
								right: 0;
 | 
				
			||||||
 | 
								padding-left: 6px;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							&.inline {
 | 
				
			||||||
 | 
								display: inline-block;
 | 
				
			||||||
 | 
								margin: 0;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							&.focused {
 | 
				
			||||||
 | 
								> select {
 | 
				
			||||||
 | 
									border-color: var(--accent);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							&.disabled {
 | 
				
			||||||
			opacity: 0.7;
 | 
								opacity: 0.7;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								&, * {
 | 
				
			||||||
 | 
									cursor: not-allowed !important;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										50
									
								
								src/client/components/form/slot.vue
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								src/client/components/form/slot.vue
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,50 @@
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					<div class="adhpbeou">
 | 
				
			||||||
 | 
						<div class="label" @click="focus"><slot name="label"></slot></div>
 | 
				
			||||||
 | 
						<div class="content">
 | 
				
			||||||
 | 
							<slot></slot>
 | 
				
			||||||
 | 
						</div>
 | 
				
			||||||
 | 
						<div class="caption"><slot name="caption"></slot></div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script lang="ts">
 | 
				
			||||||
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default defineComponent({
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style lang="scss" scoped>
 | 
				
			||||||
 | 
					.adhpbeou {
 | 
				
			||||||
 | 
						margin: 1.5em 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						> .label {
 | 
				
			||||||
 | 
							font-size: 0.85em;
 | 
				
			||||||
 | 
							padding: 0 0 8px 12px;
 | 
				
			||||||
 | 
							user-select: none;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							&:empty {
 | 
				
			||||||
 | 
								display: none;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						> .caption {
 | 
				
			||||||
 | 
							font-size: 0.8em;
 | 
				
			||||||
 | 
							padding: 8px 0 0 12px;
 | 
				
			||||||
 | 
							color: var(--fgTransparentWeak);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							&:empty {
 | 
				
			||||||
 | 
								display: none;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						> .content {
 | 
				
			||||||
 | 
							position: relative;
 | 
				
			||||||
 | 
							background: var(--panel);
 | 
				
			||||||
 | 
							border: solid 0.5px var(--inputBorder);
 | 
				
			||||||
 | 
							border-radius: 6px;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
| 
						 | 
					@ -1,35 +1,34 @@
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
<div class="ijnpvmgr _formItem">
 | 
					<div
 | 
				
			||||||
	<div class="main _formPanel _formClickable"
 | 
						class="ziffeoms"
 | 
				
			||||||
	:class="{ disabled, checked }"
 | 
						:class="{ disabled, checked }"
 | 
				
			||||||
 | 
						role="switch"
 | 
				
			||||||
	:aria-checked="checked"
 | 
						:aria-checked="checked"
 | 
				
			||||||
	:aria-disabled="disabled"
 | 
						:aria-disabled="disabled"
 | 
				
			||||||
	@click.prevent="toggle"
 | 
						@click.prevent="toggle"
 | 
				
			||||||
	>
 | 
					>
 | 
				
			||||||
	<input
 | 
						<input
 | 
				
			||||||
		type="checkbox"
 | 
							type="checkbox"
 | 
				
			||||||
		ref="input"
 | 
							ref="input"
 | 
				
			||||||
		:disabled="disabled"
 | 
							:disabled="disabled"
 | 
				
			||||||
		@keydown.enter="toggle"
 | 
							@keydown.enter="toggle"
 | 
				
			||||||
	>
 | 
						>
 | 
				
			||||||
		<span class="button">
 | 
						<span class="button" v-tooltip="checked ? $ts.itsOn : $ts.itsOff">
 | 
				
			||||||
			<span></span>
 | 
							<span class="handle"></span>
 | 
				
			||||||
	</span>
 | 
						</span>
 | 
				
			||||||
	<span class="label">
 | 
						<span class="label">
 | 
				
			||||||
		<span><slot></slot></span>
 | 
							<span><slot></slot></span>
 | 
				
			||||||
 | 
							<p><slot name="caption"></slot></p>
 | 
				
			||||||
	</span>
 | 
						</span>
 | 
				
			||||||
	</div>
 | 
					 | 
				
			||||||
	<div class="_formCaption"><slot name="desc"></slot></div>
 | 
					 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import './form.scss';
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default defineComponent({
 | 
					export default defineComponent({
 | 
				
			||||||
	props: {
 | 
						props: {
 | 
				
			||||||
		value: {
 | 
							modelValue: {
 | 
				
			||||||
			type: Boolean,
 | 
								type: Boolean,
 | 
				
			||||||
			default: false
 | 
								default: false
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
| 
						 | 
					@ -40,47 +39,37 @@ export default defineComponent({
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	computed: {
 | 
						computed: {
 | 
				
			||||||
		checked(): boolean {
 | 
							checked(): boolean {
 | 
				
			||||||
			return this.value;
 | 
								return this.modelValue;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	methods: {
 | 
						methods: {
 | 
				
			||||||
		toggle() {
 | 
							toggle() {
 | 
				
			||||||
			if (this.disabled) return;
 | 
								if (this.disabled) return;
 | 
				
			||||||
			this.$emit('update:value', !this.checked);
 | 
								this.$emit('update:modelValue', !this.checked);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<style lang="scss" scoped>
 | 
					<style lang="scss" scoped>
 | 
				
			||||||
.ijnpvmgr {
 | 
					.ziffeoms {
 | 
				
			||||||
	> .main {
 | 
					 | 
				
			||||||
	position: relative;
 | 
						position: relative;
 | 
				
			||||||
	display: flex;
 | 
						display: flex;
 | 
				
			||||||
		padding: 14px 16px;
 | 
					 | 
				
			||||||
	cursor: pointer;
 | 
						cursor: pointer;
 | 
				
			||||||
 | 
						transition: all 0.3s;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						&:first-child {
 | 
				
			||||||
 | 
							margin-top: 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						&:last-child {
 | 
				
			||||||
 | 
							margin-bottom: 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	> * {
 | 
						> * {
 | 
				
			||||||
		user-select: none;
 | 
							user-select: none;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		&.disabled {
 | 
					 | 
				
			||||||
			opacity: 0.6;
 | 
					 | 
				
			||||||
			cursor: not-allowed;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		&.checked {
 | 
					 | 
				
			||||||
			> .button {
 | 
					 | 
				
			||||||
				background-color: var(--X10);
 | 
					 | 
				
			||||||
				border-color: var(--X10);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				> * {
 | 
					 | 
				
			||||||
					background-color: var(--accent);
 | 
					 | 
				
			||||||
					transform: translateX(14px);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	> input {
 | 
						> input {
 | 
				
			||||||
		position: absolute;
 | 
							position: absolute;
 | 
				
			||||||
		width: 0;
 | 
							width: 0;
 | 
				
			||||||
| 
						 | 
					@ -93,31 +82,33 @@ export default defineComponent({
 | 
				
			||||||
		position: relative;
 | 
							position: relative;
 | 
				
			||||||
		display: inline-block;
 | 
							display: inline-block;
 | 
				
			||||||
		flex-shrink: 0;
 | 
							flex-shrink: 0;
 | 
				
			||||||
			margin: 3px 0 0 0;
 | 
							margin: 0;
 | 
				
			||||||
			width: 34px;
 | 
							width: 36px;
 | 
				
			||||||
			height: 14px;
 | 
							height: 26px;
 | 
				
			||||||
			background: var(--X6);
 | 
							background: var(--switchBg);
 | 
				
			||||||
		outline: none;
 | 
							outline: none;
 | 
				
			||||||
			border-radius: 14px;
 | 
							border-radius: 999px;
 | 
				
			||||||
			transition: all 0.3s;
 | 
							transition: inherit;
 | 
				
			||||||
			cursor: pointer;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
			> * {
 | 
							> .handle {
 | 
				
			||||||
			position: absolute;
 | 
								position: absolute;
 | 
				
			||||||
				top: -3px;
 | 
								top: 0;
 | 
				
			||||||
				left: 0;
 | 
								bottom: 0;
 | 
				
			||||||
 | 
								left: 5px;
 | 
				
			||||||
 | 
								margin: auto 0;
 | 
				
			||||||
			border-radius: 100%;
 | 
								border-radius: 100%;
 | 
				
			||||||
			transition: background-color 0.3s, transform 0.3s;
 | 
								transition: background-color 0.3s, transform 0.3s;
 | 
				
			||||||
				width: 20px;
 | 
								width: 16px;
 | 
				
			||||||
				height: 20px;
 | 
								height: 16px;
 | 
				
			||||||
			background-color: #fff;
 | 
								background-color: #fff;
 | 
				
			||||||
				box-shadow: 0 2px 1px -1px rgba(#000, 0.2), 0 1px 1px 0 rgba(#000, 0.14), 0 1px 3px 0 rgba(#000, 0.12);
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	> .label {
 | 
						> .label {
 | 
				
			||||||
			margin-left: 12px;
 | 
							margin-left: 16px;
 | 
				
			||||||
 | 
							margin-top: 2px;
 | 
				
			||||||
		display: block;
 | 
							display: block;
 | 
				
			||||||
 | 
							cursor: pointer;
 | 
				
			||||||
		transition: inherit;
 | 
							transition: inherit;
 | 
				
			||||||
		color: var(--fg);
 | 
							color: var(--fg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -126,6 +117,33 @@ export default defineComponent({
 | 
				
			||||||
			line-height: 20px;
 | 
								line-height: 20px;
 | 
				
			||||||
			transition: inherit;
 | 
								transition: inherit;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							> p {
 | 
				
			||||||
 | 
								margin: 0;
 | 
				
			||||||
 | 
								color: var(--fgTransparentWeak);
 | 
				
			||||||
 | 
								font-size: 90%;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						&:hover {
 | 
				
			||||||
 | 
							> .button {
 | 
				
			||||||
 | 
								background-color: var(--accentedBg);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						&.disabled {
 | 
				
			||||||
 | 
							opacity: 0.6;
 | 
				
			||||||
 | 
							cursor: not-allowed;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						&.checked {
 | 
				
			||||||
 | 
							> .button {
 | 
				
			||||||
 | 
								background-color: var(--accent);
 | 
				
			||||||
 | 
								border-color: var(--accent);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								> .handle {
 | 
				
			||||||
 | 
									transform: translateX(10px);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,40 +1,45 @@
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
<FormGroup class="_formItem">
 | 
					<div class="adhpbeos">
 | 
				
			||||||
	<template #label><slot></slot></template>
 | 
						<div class="label" @click="focus"><slot name="label"></slot></div>
 | 
				
			||||||
	<div class="rivhosbp _formItem" :class="{ tall, pre }">
 | 
						<div class="input" :class="{ disabled, focused, tall, pre }">
 | 
				
			||||||
		<div class="input _formPanel">
 | 
							<textarea ref="inputEl"
 | 
				
			||||||
			<textarea ref="input" :class="{ code, _monospace: code }"
 | 
								:class="{ code, _monospace: code }"
 | 
				
			||||||
			v-model="v"
 | 
								v-model="v"
 | 
				
			||||||
 | 
								:disabled="disabled"
 | 
				
			||||||
			:required="required"
 | 
								:required="required"
 | 
				
			||||||
			:readonly="readonly"
 | 
								:readonly="readonly"
 | 
				
			||||||
 | 
								:placeholder="placeholder"
 | 
				
			||||||
			:pattern="pattern"
 | 
								:pattern="pattern"
 | 
				
			||||||
			:autocomplete="autocomplete"
 | 
								:autocomplete="autocomplete"
 | 
				
			||||||
				:spellcheck="!code"
 | 
								:spellcheck="spellcheck"
 | 
				
			||||||
				@input="onInput"
 | 
					 | 
				
			||||||
			@focus="focused = true"
 | 
								@focus="focused = true"
 | 
				
			||||||
			@blur="focused = false"
 | 
								@blur="focused = false"
 | 
				
			||||||
 | 
								@keydown="onKeydown($event)"
 | 
				
			||||||
 | 
								@input="onInput"
 | 
				
			||||||
		></textarea>
 | 
							></textarea>
 | 
				
			||||||
	</div>
 | 
						</div>
 | 
				
			||||||
	</div>
 | 
						<div class="caption"><slot name="caption"></slot></div>
 | 
				
			||||||
	<template #caption><slot name="desc"></slot></template>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	<FormButton v-if="manualSave && changed" @click="updated" primary><i class="fas fa-save"></i> {{ $ts.save }}</FormButton>
 | 
						<MkButton v-if="manualSave && changed" @click="updated" primary><i class="fas fa-save"></i> {{ $ts.save }}</MkButton>
 | 
				
			||||||
</FormGroup>
 | 
					</div>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent, ref, toRefs, watch } from 'vue';
 | 
					import { defineComponent, onMounted, onUnmounted, nextTick, ref, watch, computed, toRefs } from 'vue';
 | 
				
			||||||
import './form.scss';
 | 
					import MkButton from '../ui/button.vue';
 | 
				
			||||||
import FormButton from './button.vue';
 | 
					import { debounce } from 'throttle-debounce';
 | 
				
			||||||
import FormGroup from './group.vue';
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default defineComponent({
 | 
					export default defineComponent({
 | 
				
			||||||
	components: {
 | 
						components: {
 | 
				
			||||||
		FormGroup,
 | 
							MkButton,
 | 
				
			||||||
		FormButton,
 | 
					 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	props: {
 | 
						props: {
 | 
				
			||||||
		value: {
 | 
							modelValue: {
 | 
				
			||||||
 | 
								required: true
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							type: {
 | 
				
			||||||
 | 
								type: String,
 | 
				
			||||||
			required: false
 | 
								required: false
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		required: {
 | 
							required: {
 | 
				
			||||||
| 
						 | 
					@ -45,14 +50,29 @@ export default defineComponent({
 | 
				
			||||||
			type: Boolean,
 | 
								type: Boolean,
 | 
				
			||||||
			required: false
 | 
								required: false
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
							disabled: {
 | 
				
			||||||
 | 
								type: Boolean,
 | 
				
			||||||
 | 
								required: false
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
		pattern: {
 | 
							pattern: {
 | 
				
			||||||
			type: String,
 | 
								type: String,
 | 
				
			||||||
			required: false
 | 
								required: false
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		autocomplete: {
 | 
							placeholder: {
 | 
				
			||||||
			type: String,
 | 
								type: String,
 | 
				
			||||||
			required: false
 | 
								required: false
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
							autofocus: {
 | 
				
			||||||
 | 
								type: Boolean,
 | 
				
			||||||
 | 
								required: false,
 | 
				
			||||||
 | 
								default: false
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							autocomplete: {
 | 
				
			||||||
 | 
								required: false
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							spellcheck: {
 | 
				
			||||||
 | 
								required: false
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
		code: {
 | 
							code: {
 | 
				
			||||||
			type: Boolean,
 | 
								type: Boolean,
 | 
				
			||||||
			required: false
 | 
								required: false
 | 
				
			||||||
| 
						 | 
					@ -67,91 +87,162 @@ export default defineComponent({
 | 
				
			||||||
			required: false,
 | 
								required: false,
 | 
				
			||||||
			default: false
 | 
								default: false
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
							debounce: {
 | 
				
			||||||
 | 
								type: Boolean,
 | 
				
			||||||
 | 
								required: false,
 | 
				
			||||||
 | 
								default: false
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
		manualSave: {
 | 
							manualSave: {
 | 
				
			||||||
			type: Boolean,
 | 
								type: Boolean,
 | 
				
			||||||
			required: false,
 | 
								required: false,
 | 
				
			||||||
			default: false
 | 
								default: false
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						emits: ['change', 'keydown', 'enter', 'update:modelValue'],
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	setup(props, context) {
 | 
						setup(props, context) {
 | 
				
			||||||
		const { value } = toRefs(props);
 | 
							const { modelValue, autofocus } = toRefs(props);
 | 
				
			||||||
		const v = ref(value.value);
 | 
							const v = ref(modelValue.value);
 | 
				
			||||||
 | 
							const focused = ref(false);
 | 
				
			||||||
		const changed = ref(false);
 | 
							const changed = ref(false);
 | 
				
			||||||
 | 
							const invalid = ref(false);
 | 
				
			||||||
 | 
							const filled = computed(() => v.value !== '' && v.value != null);
 | 
				
			||||||
		const inputEl = ref(null);
 | 
							const inputEl = ref(null);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		const focus = () => inputEl.value.focus();
 | 
							const focus = () => inputEl.value.focus();
 | 
				
			||||||
		const onInput = (ev) => {
 | 
							const onInput = (ev) => {
 | 
				
			||||||
			changed.value = true;
 | 
								changed.value = true;
 | 
				
			||||||
			context.emit('change', ev);
 | 
								context.emit('change', ev);
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
 | 
							const onKeydown = (ev: KeyboardEvent) => {
 | 
				
			||||||
 | 
								context.emit('keydown', ev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (ev.code === 'Enter') {
 | 
				
			||||||
 | 
									context.emit('enter');
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		const updated = () => {
 | 
							const updated = () => {
 | 
				
			||||||
			changed.value = false;
 | 
								changed.value = false;
 | 
				
			||||||
			context.emit('update:value', v.value);
 | 
								context.emit('update:modelValue', v.value);
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		watch(value, newValue => {
 | 
							const debouncedUpdated = debounce(1000, updated);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							watch(modelValue, newValue => {
 | 
				
			||||||
			v.value = newValue;
 | 
								v.value = newValue;
 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		watch(v, newValue => {
 | 
							watch(v, newValue => {
 | 
				
			||||||
			if (!props.manualSave) {
 | 
								if (!props.manualSave) {
 | 
				
			||||||
 | 
									if (props.debounce) {
 | 
				
			||||||
 | 
										debouncedUpdated();
 | 
				
			||||||
 | 
									} else {
 | 
				
			||||||
					updated();
 | 
										updated();
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								invalid.value = inputEl.value.validity.badInput;
 | 
				
			||||||
 | 
							});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							onMounted(() => {
 | 
				
			||||||
 | 
								nextTick(() => {
 | 
				
			||||||
 | 
									if (autofocus.value) {
 | 
				
			||||||
 | 
										focus();
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return {
 | 
							return {
 | 
				
			||||||
			v,
 | 
								v,
 | 
				
			||||||
			updated,
 | 
								focused,
 | 
				
			||||||
 | 
								invalid,
 | 
				
			||||||
			changed,
 | 
								changed,
 | 
				
			||||||
 | 
								filled,
 | 
				
			||||||
 | 
								inputEl,
 | 
				
			||||||
			focus,
 | 
								focus,
 | 
				
			||||||
			onInput,
 | 
								onInput,
 | 
				
			||||||
 | 
								onKeydown,
 | 
				
			||||||
 | 
								updated,
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
	}
 | 
						},
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<style lang="scss" scoped>
 | 
					<style lang="scss" scoped>
 | 
				
			||||||
.rivhosbp {
 | 
					.adhpbeos {
 | 
				
			||||||
	position: relative;
 | 
						> .label {
 | 
				
			||||||
 | 
							font-size: 0.85em;
 | 
				
			||||||
 | 
							padding: 0 0 8px 12px;
 | 
				
			||||||
 | 
							user-select: none;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							&:empty {
 | 
				
			||||||
 | 
								display: none;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						> .caption {
 | 
				
			||||||
 | 
							font-size: 0.8em;
 | 
				
			||||||
 | 
							padding: 8px 0 0 12px;
 | 
				
			||||||
 | 
							color: var(--fgTransparentWeak);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							&:empty {
 | 
				
			||||||
 | 
								display: none;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	> .input {
 | 
						> .input {
 | 
				
			||||||
		position: relative;
 | 
							position: relative;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		> textarea {
 | 
							> textarea {
 | 
				
			||||||
 | 
								appearance: none;
 | 
				
			||||||
 | 
								-webkit-appearance: none;
 | 
				
			||||||
			display: block;
 | 
								display: block;
 | 
				
			||||||
			width: 100%;
 | 
								width: 100%;
 | 
				
			||||||
			min-width: 100%;
 | 
								min-width: 100%;
 | 
				
			||||||
			max-width: 100%;
 | 
								max-width: 100%;
 | 
				
			||||||
			min-height: 130px;
 | 
								min-height: 130px;
 | 
				
			||||||
			margin: 0;
 | 
								margin: 0;
 | 
				
			||||||
			padding: 16px;
 | 
								padding: 12px;
 | 
				
			||||||
			box-sizing: border-box;
 | 
					 | 
				
			||||||
			font: inherit;
 | 
								font: inherit;
 | 
				
			||||||
			font-weight: normal;
 | 
								font-weight: normal;
 | 
				
			||||||
			font-size: 1em;
 | 
								font-size: 1em;
 | 
				
			||||||
			background: transparent;
 | 
								color: var(--fg);
 | 
				
			||||||
			border: none;
 | 
								background: var(--panel);
 | 
				
			||||||
			border-radius: 0;
 | 
								border: solid 0.5px var(--inputBorder);
 | 
				
			||||||
 | 
								border-radius: 6px;
 | 
				
			||||||
			outline: none;
 | 
								outline: none;
 | 
				
			||||||
			box-shadow: none;
 | 
								box-shadow: none;
 | 
				
			||||||
			color: var(--fg);
 | 
								box-sizing: border-box;
 | 
				
			||||||
 | 
								transition: border-color 0.1s ease-out;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			&.code {
 | 
								&:hover {
 | 
				
			||||||
				tab-size: 2;
 | 
									border-color: var(--inputBorderHover);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							&.focused {
 | 
				
			||||||
 | 
								> textarea {
 | 
				
			||||||
 | 
									border-color: var(--accent);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							&.disabled {
 | 
				
			||||||
 | 
								opacity: 0.7;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								&, * {
 | 
				
			||||||
 | 
									cursor: not-allowed !important;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		&.tall {
 | 
							&.tall {
 | 
				
			||||||
		> .input {
 | 
					 | 
				
			||||||
			> textarea {
 | 
								> textarea {
 | 
				
			||||||
				min-height: 200px;
 | 
									min-height: 200px;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		&.pre {
 | 
							&.pre {
 | 
				
			||||||
		> .input {
 | 
					 | 
				
			||||||
			> textarea {
 | 
								> textarea {
 | 
				
			||||||
				white-space: pre;
 | 
									white-space: pre;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -36,7 +36,7 @@
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent, markRaw } from 'vue';
 | 
					import { defineComponent, markRaw } from 'vue';
 | 
				
			||||||
import Chart from 'chart.js';
 | 
					import Chart from 'chart.js';
 | 
				
			||||||
import MkSelect from './ui/select.vue';
 | 
					import MkSelect from './form/select.vue';
 | 
				
			||||||
import number from '@client/filters/number';
 | 
					import number from '@client/filters/number';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const sum = (...arr) => arr.reduce((r, a) => r.map((b, i) => a[i] + b));
 | 
					const sum = (...arr) => arr.reduce((r, a) => r.map((b, i) => a[i] + b));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -29,7 +29,7 @@
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent, PropType } from 'vue';
 | 
					import { defineComponent, PropType } from 'vue';
 | 
				
			||||||
import XModalWindow from '@client/components/ui/modal-window.vue';
 | 
					import XModalWindow from '@client/components/ui/modal-window.vue';
 | 
				
			||||||
import MkSwitch from './ui/switch.vue';
 | 
					import MkSwitch from './form/switch.vue';
 | 
				
			||||||
import MkInfo from './ui/info.vue';
 | 
					import MkInfo from './ui/info.vue';
 | 
				
			||||||
import MkButton from './ui/button.vue';
 | 
					import MkButton from './ui/button.vue';
 | 
				
			||||||
import { notificationTypes } from '../../types';
 | 
					import { notificationTypes } from '../../types';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,7 +8,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { computed, defineComponent, PropType } from 'vue';
 | 
					import { computed, defineComponent, PropType } from 'vue';
 | 
				
			||||||
import MkInput from '../ui/input.vue';
 | 
					import MkInput from '../form/input.vue';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
import { Hpml } from '@client/scripts/hpml/evaluator';
 | 
					import { Hpml } from '@client/scripts/hpml/evaluator';
 | 
				
			||||||
import { NumberInputVarBlock } from '@client/scripts/hpml/block';
 | 
					import { NumberInputVarBlock } from '@client/scripts/hpml/block';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,7 +10,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent, PropType } from 'vue';
 | 
					import { defineComponent, PropType } from 'vue';
 | 
				
			||||||
import MkTextarea from '../ui/textarea.vue';
 | 
					import MkTextarea from '../form/textarea.vue';
 | 
				
			||||||
import MkButton from '../ui/button.vue';
 | 
					import MkButton from '../ui/button.vue';
 | 
				
			||||||
import { apiUrl } from '@client/config';
 | 
					import { apiUrl } from '@client/config';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,7 +7,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { computed, defineComponent, PropType } from 'vue';
 | 
					import { computed, defineComponent, PropType } from 'vue';
 | 
				
			||||||
import MkRadio from '../ui/radio.vue';
 | 
					import MkRadio from '../form/radio.vue';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
import { Hpml } from '@client/scripts/hpml/evaluator';
 | 
					import { Hpml } from '@client/scripts/hpml/evaluator';
 | 
				
			||||||
import { RadioButtonVarBlock } from '@client/scripts/hpml/block';
 | 
					import { RadioButtonVarBlock } from '@client/scripts/hpml/block';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,7 +6,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { computed, defineComponent, PropType } from 'vue';
 | 
					import { computed, defineComponent, PropType } from 'vue';
 | 
				
			||||||
import MkSwitch from '../ui/switch.vue';
 | 
					import MkSwitch from '../form/switch.vue';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
import { Hpml } from '@client/scripts/hpml/evaluator';
 | 
					import { Hpml } from '@client/scripts/hpml/evaluator';
 | 
				
			||||||
import { SwitchVarBlock } from '@client/scripts/hpml/block';
 | 
					import { SwitchVarBlock } from '@client/scripts/hpml/block';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,7 +8,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { computed, defineComponent, PropType } from 'vue';
 | 
					import { computed, defineComponent, PropType } from 'vue';
 | 
				
			||||||
import MkInput from '../ui/input.vue';
 | 
					import MkInput from '../form/input.vue';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
import { Hpml } from '@client/scripts/hpml/evaluator';
 | 
					import { Hpml } from '@client/scripts/hpml/evaluator';
 | 
				
			||||||
import { TextInputVarBlock } from '@client/scripts/hpml/block';
 | 
					import { TextInputVarBlock } from '@client/scripts/hpml/block';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,7 +8,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { computed, defineComponent, PropType } from 'vue';
 | 
					import { computed, defineComponent, PropType } from 'vue';
 | 
				
			||||||
import MkTextarea from '../ui/textarea.vue';
 | 
					import MkTextarea from '../form/textarea.vue';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
import { Hpml } from '@client/scripts/hpml/evaluator';
 | 
					import { Hpml } from '@client/scripts/hpml/evaluator';
 | 
				
			||||||
import { HpmlTextInput } from '@client/scripts/hpml';
 | 
					import { HpmlTextInput } from '@client/scripts/hpml';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,7 +6,7 @@
 | 
				
			||||||
import { TextBlock } from '@client/scripts/hpml/block';
 | 
					import { TextBlock } from '@client/scripts/hpml/block';
 | 
				
			||||||
import { Hpml } from '@client/scripts/hpml/evaluator';
 | 
					import { Hpml } from '@client/scripts/hpml/evaluator';
 | 
				
			||||||
import { defineComponent, PropType } from 'vue';
 | 
					import { defineComponent, PropType } from 'vue';
 | 
				
			||||||
import MkTextarea from '../ui/textarea.vue';
 | 
					import MkTextarea from '../form/textarea.vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default defineComponent({
 | 
					export default defineComponent({
 | 
				
			||||||
	components: {
 | 
						components: {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -51,9 +51,9 @@
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import { addTime } from '../../prelude/time';
 | 
					import { addTime } from '../../prelude/time';
 | 
				
			||||||
import { formatDateTimeString } from '@/misc/format-time-string';
 | 
					import { formatDateTimeString } from '@/misc/format-time-string';
 | 
				
			||||||
import MkInput from './ui/input.vue';
 | 
					import MkInput from './form/input.vue';
 | 
				
			||||||
import MkSelect from './ui/select.vue';
 | 
					import MkSelect from './form/select.vue';
 | 
				
			||||||
import MkSwitch from './ui/switch.vue';
 | 
					import MkSwitch from './form/switch.vue';
 | 
				
			||||||
import MkButton from './ui/button.vue';
 | 
					import MkButton from './ui/button.vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default defineComponent({
 | 
					export default defineComponent({
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -30,9 +30,9 @@
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import MkButton from '@client/components/ui/button.vue';
 | 
					import MkButton from '@client/components/ui/button.vue';
 | 
				
			||||||
import MkInput from '@client/components/ui/input.vue';
 | 
					import MkInput from '@client/components/form/input.vue';
 | 
				
			||||||
import MkSwitch from '@client/components/ui/switch.vue';
 | 
					import MkSwitch from '@client/components/form/switch.vue';
 | 
				
			||||||
import MkTextarea from '@client/components/ui/textarea.vue';
 | 
					import MkTextarea from '@client/components/form/textarea.vue';
 | 
				
			||||||
import MkRadio from '@client/components/ui/radio.vue';
 | 
					import MkRadio from '@client/components/ui/radio.vue';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
import * as config from '@client/config';
 | 
					import * as config from '@client/config';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -49,7 +49,7 @@
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import { toUnicode } from 'punycode/';
 | 
					import { toUnicode } from 'punycode/';
 | 
				
			||||||
import MkButton from '@client/components/ui/button.vue';
 | 
					import MkButton from '@client/components/ui/button.vue';
 | 
				
			||||||
import MkInput from '@client/components/ui/input.vue';
 | 
					import MkInput from '@client/components/form/input.vue';
 | 
				
			||||||
import { apiUrl, host } from '@client/config';
 | 
					import { apiUrl, host } from '@client/config';
 | 
				
			||||||
import { byteify, hexify } from '@client/scripts/2fa';
 | 
					import { byteify, hexify } from '@client/scripts/2fa';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -57,8 +57,8 @@ const getPasswordStrength = require('syuilo-password-strength');
 | 
				
			||||||
import { toUnicode } from 'punycode/';
 | 
					import { toUnicode } from 'punycode/';
 | 
				
			||||||
import { host, url } from '@client/config';
 | 
					import { host, url } from '@client/config';
 | 
				
			||||||
import MkButton from './ui/button.vue';
 | 
					import MkButton from './ui/button.vue';
 | 
				
			||||||
import MkInput from './ui/input.vue';
 | 
					import MkInput from './form/input.vue';
 | 
				
			||||||
import MkSwitch from './ui/switch.vue';
 | 
					import MkSwitch from './form/switch.vue';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
import { login } from '@client/account';
 | 
					import { login } from '@client/account';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -31,9 +31,9 @@
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import { kinds } from '@/misc/api-permissions';
 | 
					import { kinds } from '@/misc/api-permissions';
 | 
				
			||||||
import XModalWindow from '@client/components/ui/modal-window.vue';
 | 
					import XModalWindow from '@client/components/ui/modal-window.vue';
 | 
				
			||||||
import MkInput from './ui/input.vue';
 | 
					import MkInput from './form/input.vue';
 | 
				
			||||||
import MkTextarea from './ui/textarea.vue';
 | 
					import MkTextarea from './form/textarea.vue';
 | 
				
			||||||
import MkSwitch from './ui/switch.vue';
 | 
					import MkSwitch from './form/switch.vue';
 | 
				
			||||||
import MkButton from './ui/button.vue';
 | 
					import MkButton from './ui/button.vue';
 | 
				
			||||||
import MkInfo from './ui/info.vue';
 | 
					import MkInfo from './ui/info.vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -181,14 +181,6 @@ export default defineComponent({
 | 
				
			||||||
		outline-offset: 2px;
 | 
							outline-offset: 2px;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	&.inline + .bghgjjyj {
 | 
					 | 
				
			||||||
		margin-left: 12px;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	&:not(.inline) + .bghgjjyj {
 | 
					 | 
				
			||||||
		margin-top: 16px;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	&.inline {
 | 
						&.inline {
 | 
				
			||||||
		display: inline-block;
 | 
							display: inline-block;
 | 
				
			||||||
		width: auto;
 | 
							width: auto;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,58 +0,0 @@
 | 
				
			||||||
<script lang="ts">
 | 
					 | 
				
			||||||
import { defineComponent, h } from 'vue';
 | 
					 | 
				
			||||||
import MkRadio from '@client/components/ui/radio.vue';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export default defineComponent({
 | 
					 | 
				
			||||||
	components: {
 | 
					 | 
				
			||||||
		MkRadio
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
	props: {
 | 
					 | 
				
			||||||
		modelValue: {
 | 
					 | 
				
			||||||
			required: false
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
	data() {
 | 
					 | 
				
			||||||
		return {
 | 
					 | 
				
			||||||
			value: this.modelValue,
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
	watch: {
 | 
					 | 
				
			||||||
		value() {
 | 
					 | 
				
			||||||
			this.$emit('update:modelValue', this.value);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
	render() {
 | 
					 | 
				
			||||||
		const label = this.$slots.desc();
 | 
					 | 
				
			||||||
		let options = this.$slots.default();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// なぜかFragmentになることがあるため
 | 
					 | 
				
			||||||
		if (options.length === 1 && options[0].props == null) options = options[0].children;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		return h('div', {
 | 
					 | 
				
			||||||
			class: 'novjtcto'
 | 
					 | 
				
			||||||
		}, [
 | 
					 | 
				
			||||||
			h('div', label),
 | 
					 | 
				
			||||||
			...options.map(option => h(MkRadio, {
 | 
					 | 
				
			||||||
				key: option.key,
 | 
					 | 
				
			||||||
				value: option.props.value,
 | 
					 | 
				
			||||||
				modelValue: this.value,
 | 
					 | 
				
			||||||
				'onUpdate:modelValue': value => this.value = value,
 | 
					 | 
				
			||||||
			}, option.children))
 | 
					 | 
				
			||||||
		]);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
</script>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<style lang="scss">
 | 
					 | 
				
			||||||
.novjtcto {
 | 
					 | 
				
			||||||
	margin: 32px 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	&:first-child {
 | 
					 | 
				
			||||||
		margin-top: 0;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	&:last-child {
 | 
					 | 
				
			||||||
		margin-bottom: 0;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
</style>
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,139 +0,0 @@
 | 
				
			||||||
<template>
 | 
					 | 
				
			||||||
<div class="timctyfi" :class="{ focused, disabled }">
 | 
					 | 
				
			||||||
	<div class="icon"><slot name="icon"></slot></div>
 | 
					 | 
				
			||||||
	<span class="label"><slot name="label"></slot></span>
 | 
					 | 
				
			||||||
	<input
 | 
					 | 
				
			||||||
		type="range"
 | 
					 | 
				
			||||||
		ref="input"
 | 
					 | 
				
			||||||
		v-model="v"
 | 
					 | 
				
			||||||
		:disabled="disabled"
 | 
					 | 
				
			||||||
		:min="min"
 | 
					 | 
				
			||||||
		:max="max"
 | 
					 | 
				
			||||||
		:step="step"
 | 
					 | 
				
			||||||
		:autofocus="autofocus"
 | 
					 | 
				
			||||||
		@focus="focused = true"
 | 
					 | 
				
			||||||
		@blur="focused = false"
 | 
					 | 
				
			||||||
		@input="$emit('update:value', $event.target.value)"
 | 
					 | 
				
			||||||
	/>
 | 
					 | 
				
			||||||
</div>
 | 
					 | 
				
			||||||
</template>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<script lang="ts">
 | 
					 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export default defineComponent({
 | 
					 | 
				
			||||||
	props: {
 | 
					 | 
				
			||||||
		value: {
 | 
					 | 
				
			||||||
			type: Number,
 | 
					 | 
				
			||||||
			required: false,
 | 
					 | 
				
			||||||
			default: 0
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		disabled: {
 | 
					 | 
				
			||||||
			type: Boolean,
 | 
					 | 
				
			||||||
			required: false,
 | 
					 | 
				
			||||||
			default: false
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		min: {
 | 
					 | 
				
			||||||
			type: Number,
 | 
					 | 
				
			||||||
			required: false,
 | 
					 | 
				
			||||||
			default: 0
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		max: {
 | 
					 | 
				
			||||||
			type: Number,
 | 
					 | 
				
			||||||
			required: false,
 | 
					 | 
				
			||||||
			default: 100
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		step: {
 | 
					 | 
				
			||||||
			type: Number,
 | 
					 | 
				
			||||||
			required: false,
 | 
					 | 
				
			||||||
			default: 1
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		autofocus: {
 | 
					 | 
				
			||||||
			type: Boolean,
 | 
					 | 
				
			||||||
			required: false
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
	data() {
 | 
					 | 
				
			||||||
		return {
 | 
					 | 
				
			||||||
			v: this.value,
 | 
					 | 
				
			||||||
			focused: false
 | 
					 | 
				
			||||||
		};
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
	watch: {
 | 
					 | 
				
			||||||
		value(v) {
 | 
					 | 
				
			||||||
			this.v = parseFloat(v);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
	mounted() {
 | 
					 | 
				
			||||||
		if (this.autofocus) {
 | 
					 | 
				
			||||||
			this.$nextTick(() => {
 | 
					 | 
				
			||||||
				this.$refs.input.focus();
 | 
					 | 
				
			||||||
			});
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
</script>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<style lang="scss" scoped>
 | 
					 | 
				
			||||||
.timctyfi {
 | 
					 | 
				
			||||||
	position: relative;
 | 
					 | 
				
			||||||
	margin: 8px;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	> .icon {
 | 
					 | 
				
			||||||
		display: inline-block;
 | 
					 | 
				
			||||||
		width: 24px;
 | 
					 | 
				
			||||||
		text-align: center;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	> .title {
 | 
					 | 
				
			||||||
		pointer-events: none;
 | 
					 | 
				
			||||||
		font-size: 16px;
 | 
					 | 
				
			||||||
		color: var(--inputLabel);
 | 
					 | 
				
			||||||
		overflow: hidden;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	> input {
 | 
					 | 
				
			||||||
		-webkit-appearance: none;
 | 
					 | 
				
			||||||
		-moz-appearance: none;
 | 
					 | 
				
			||||||
		appearance: none;
 | 
					 | 
				
			||||||
		background: var(--X10);
 | 
					 | 
				
			||||||
		height: 7px;
 | 
					 | 
				
			||||||
		margin: 0 8px;
 | 
					 | 
				
			||||||
		outline: 0;
 | 
					 | 
				
			||||||
		border: 0;
 | 
					 | 
				
			||||||
		border-radius: 7px;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		&.disabled {
 | 
					 | 
				
			||||||
			opacity: 0.6;
 | 
					 | 
				
			||||||
			cursor: not-allowed;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		&::-webkit-slider-thumb {
 | 
					 | 
				
			||||||
			-webkit-appearance: none;
 | 
					 | 
				
			||||||
			appearance: none;
 | 
					 | 
				
			||||||
			cursor: pointer;
 | 
					 | 
				
			||||||
			width: 20px;
 | 
					 | 
				
			||||||
			height: 20px;
 | 
					 | 
				
			||||||
			display: block;
 | 
					 | 
				
			||||||
			border-radius: 50%;
 | 
					 | 
				
			||||||
			border: none;
 | 
					 | 
				
			||||||
			background: var(--accent);
 | 
					 | 
				
			||||||
			box-shadow: 0 0 6px rgba(0, 0, 0, 0.3);
 | 
					 | 
				
			||||||
			box-sizing: content-box;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		&::-moz-range-thumb {
 | 
					 | 
				
			||||||
			-moz-appearance: none;
 | 
					 | 
				
			||||||
			appearance: none;
 | 
					 | 
				
			||||||
			cursor: pointer;
 | 
					 | 
				
			||||||
			width: 20px;
 | 
					 | 
				
			||||||
			height: 20px;
 | 
					 | 
				
			||||||
			display: block;
 | 
					 | 
				
			||||||
			border-radius: 50%;
 | 
					 | 
				
			||||||
			border: none;
 | 
					 | 
				
			||||||
			background: var(--accent);
 | 
					 | 
				
			||||||
			box-shadow: 0 0 6px rgba(0, 0, 0, 0.3);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
</style>
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,262 +0,0 @@
 | 
				
			||||||
<template>
 | 
					 | 
				
			||||||
<div class="vblkjoeq">
 | 
					 | 
				
			||||||
	<div class="label" @click="focus"><slot name="label"></slot></div>
 | 
					 | 
				
			||||||
	<div class="input" :class="{ inline, disabled, focused }">
 | 
					 | 
				
			||||||
		<div class="prefix" ref="prefixEl"><slot name="prefix"></slot></div>
 | 
					 | 
				
			||||||
		<select ref="inputEl"
 | 
					 | 
				
			||||||
			v-model="v"
 | 
					 | 
				
			||||||
			:disabled="disabled"
 | 
					 | 
				
			||||||
			:required="required"
 | 
					 | 
				
			||||||
			:readonly="readonly"
 | 
					 | 
				
			||||||
			:placeholder="placeholder"
 | 
					 | 
				
			||||||
			@focus="focused = true"
 | 
					 | 
				
			||||||
			@blur="focused = false"
 | 
					 | 
				
			||||||
			@input="onInput"
 | 
					 | 
				
			||||||
		>
 | 
					 | 
				
			||||||
			<slot></slot>
 | 
					 | 
				
			||||||
		</select>
 | 
					 | 
				
			||||||
		<div class="suffix" ref="suffixEl"><i class="fas fa-chevron-down"></i></div>
 | 
					 | 
				
			||||||
	</div>
 | 
					 | 
				
			||||||
	<div class="caption"><slot name="caption"></slot></div>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	<MkButton v-if="manualSave && changed" @click="updated" primary><i class="fas fa-save"></i> {{ $ts.save }}</MkButton>
 | 
					 | 
				
			||||||
</div>
 | 
					 | 
				
			||||||
</template>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<script lang="ts">
 | 
					 | 
				
			||||||
import { defineComponent, onMounted, onUnmounted, nextTick, ref, watch, computed, toRefs } from 'vue';
 | 
					 | 
				
			||||||
import MkButton from './button.vue';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export default defineComponent({
 | 
					 | 
				
			||||||
	components: {
 | 
					 | 
				
			||||||
		MkButton,
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	props: {
 | 
					 | 
				
			||||||
		modelValue: {
 | 
					 | 
				
			||||||
			required: true
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		required: {
 | 
					 | 
				
			||||||
			type: Boolean,
 | 
					 | 
				
			||||||
			required: false
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		readonly: {
 | 
					 | 
				
			||||||
			type: Boolean,
 | 
					 | 
				
			||||||
			required: false
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		disabled: {
 | 
					 | 
				
			||||||
			type: Boolean,
 | 
					 | 
				
			||||||
			required: false
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		placeholder: {
 | 
					 | 
				
			||||||
			type: String,
 | 
					 | 
				
			||||||
			required: false
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		autofocus: {
 | 
					 | 
				
			||||||
			type: Boolean,
 | 
					 | 
				
			||||||
			required: false,
 | 
					 | 
				
			||||||
			default: false
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		inline: {
 | 
					 | 
				
			||||||
			type: Boolean,
 | 
					 | 
				
			||||||
			required: false,
 | 
					 | 
				
			||||||
			default: false
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		manualSave: {
 | 
					 | 
				
			||||||
			type: Boolean,
 | 
					 | 
				
			||||||
			required: false,
 | 
					 | 
				
			||||||
			default: false
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	emits: ['change', 'update:modelValue'],
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	setup(props, context) {
 | 
					 | 
				
			||||||
		const { modelValue, autofocus } = toRefs(props);
 | 
					 | 
				
			||||||
		const v = ref(modelValue.value);
 | 
					 | 
				
			||||||
		const focused = ref(false);
 | 
					 | 
				
			||||||
		const changed = ref(false);
 | 
					 | 
				
			||||||
		const invalid = ref(false);
 | 
					 | 
				
			||||||
		const filled = computed(() => v.value !== '' && v.value != null);
 | 
					 | 
				
			||||||
		const inputEl = ref(null);
 | 
					 | 
				
			||||||
		const prefixEl = ref(null);
 | 
					 | 
				
			||||||
		const suffixEl = ref(null);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		const focus = () => inputEl.value.focus();
 | 
					 | 
				
			||||||
		const onInput = (ev) => {
 | 
					 | 
				
			||||||
			changed.value = true;
 | 
					 | 
				
			||||||
			context.emit('change', ev);
 | 
					 | 
				
			||||||
		};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		const updated = () => {
 | 
					 | 
				
			||||||
			changed.value = false;
 | 
					 | 
				
			||||||
			context.emit('update:modelValue', v.value);
 | 
					 | 
				
			||||||
		};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		watch(modelValue, newValue => {
 | 
					 | 
				
			||||||
			v.value = newValue;
 | 
					 | 
				
			||||||
		});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		watch(v, newValue => {
 | 
					 | 
				
			||||||
			if (!props.manualSave) {
 | 
					 | 
				
			||||||
				updated();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			invalid.value = inputEl.value.validity.badInput;
 | 
					 | 
				
			||||||
		});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		onMounted(() => {
 | 
					 | 
				
			||||||
			nextTick(() => {
 | 
					 | 
				
			||||||
				if (autofocus.value) {
 | 
					 | 
				
			||||||
					focus();
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				// このコンポーネントが作成された時、非表示状態である場合がある
 | 
					 | 
				
			||||||
				// 非表示状態だと要素の幅などは0になってしまうので、定期的に計算する
 | 
					 | 
				
			||||||
				const clock = setInterval(() => {
 | 
					 | 
				
			||||||
					if (prefixEl.value) {
 | 
					 | 
				
			||||||
						if (prefixEl.value.offsetWidth) {
 | 
					 | 
				
			||||||
							inputEl.value.style.paddingLeft = prefixEl.value.offsetWidth + 'px';
 | 
					 | 
				
			||||||
						}
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					if (suffixEl.value) {
 | 
					 | 
				
			||||||
						if (suffixEl.value.offsetWidth) {
 | 
					 | 
				
			||||||
							inputEl.value.style.paddingRight = suffixEl.value.offsetWidth + 'px';
 | 
					 | 
				
			||||||
						}
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}, 100);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				onUnmounted(() => {
 | 
					 | 
				
			||||||
					clearInterval(clock);
 | 
					 | 
				
			||||||
				});
 | 
					 | 
				
			||||||
			});
 | 
					 | 
				
			||||||
		});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		return {
 | 
					 | 
				
			||||||
			v,
 | 
					 | 
				
			||||||
			focused,
 | 
					 | 
				
			||||||
			invalid,
 | 
					 | 
				
			||||||
			changed,
 | 
					 | 
				
			||||||
			filled,
 | 
					 | 
				
			||||||
			inputEl,
 | 
					 | 
				
			||||||
			prefixEl,
 | 
					 | 
				
			||||||
			suffixEl,
 | 
					 | 
				
			||||||
			focus,
 | 
					 | 
				
			||||||
			onInput,
 | 
					 | 
				
			||||||
			updated,
 | 
					 | 
				
			||||||
		};
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
</script>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<style lang="scss" scoped>
 | 
					 | 
				
			||||||
.vblkjoeq {
 | 
					 | 
				
			||||||
	margin: 1.5em 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	> .label {
 | 
					 | 
				
			||||||
		font-size: 0.85em;
 | 
					 | 
				
			||||||
		padding: 0 0 8px 12px;
 | 
					 | 
				
			||||||
		user-select: none;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		&:empty {
 | 
					 | 
				
			||||||
			display: none;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	> .caption {
 | 
					 | 
				
			||||||
		font-size: 0.8em;
 | 
					 | 
				
			||||||
		padding: 8px 0 0 12px;
 | 
					 | 
				
			||||||
		color: var(--fgTransparentWeak);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		&:empty {
 | 
					 | 
				
			||||||
			display: none;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	> .input {
 | 
					 | 
				
			||||||
		$height: 42px;
 | 
					 | 
				
			||||||
		position: relative;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		> select {
 | 
					 | 
				
			||||||
			appearance: none;
 | 
					 | 
				
			||||||
			-webkit-appearance: none;
 | 
					 | 
				
			||||||
			display: block;
 | 
					 | 
				
			||||||
			height: $height;
 | 
					 | 
				
			||||||
			width: 100%;
 | 
					 | 
				
			||||||
			margin: 0;
 | 
					 | 
				
			||||||
			padding: 0 12px;
 | 
					 | 
				
			||||||
			font: inherit;
 | 
					 | 
				
			||||||
			font-weight: normal;
 | 
					 | 
				
			||||||
			font-size: 1em;
 | 
					 | 
				
			||||||
			color: var(--fg);
 | 
					 | 
				
			||||||
			background: var(--panel);
 | 
					 | 
				
			||||||
			border: solid 1px var(--inputBorder);
 | 
					 | 
				
			||||||
			border-radius: 6px;
 | 
					 | 
				
			||||||
			outline: none;
 | 
					 | 
				
			||||||
			box-shadow: none;
 | 
					 | 
				
			||||||
			box-sizing: border-box;
 | 
					 | 
				
			||||||
			cursor: pointer;
 | 
					 | 
				
			||||||
			transition: border-color 0.1s ease-out;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			&:hover {
 | 
					 | 
				
			||||||
				border-color: var(--inputBorderHover);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		> .prefix,
 | 
					 | 
				
			||||||
		> .suffix {
 | 
					 | 
				
			||||||
			display: flex;
 | 
					 | 
				
			||||||
			align-items: center;
 | 
					 | 
				
			||||||
			position: absolute;
 | 
					 | 
				
			||||||
			z-index: 1;
 | 
					 | 
				
			||||||
			top: 0;
 | 
					 | 
				
			||||||
			padding: 0 12px;
 | 
					 | 
				
			||||||
			font-size: 1em;
 | 
					 | 
				
			||||||
			height: $height;
 | 
					 | 
				
			||||||
			pointer-events: none;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			&:empty {
 | 
					 | 
				
			||||||
				display: none;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			> * {
 | 
					 | 
				
			||||||
				display: inline-block;
 | 
					 | 
				
			||||||
				min-width: 16px;
 | 
					 | 
				
			||||||
				max-width: 150px;
 | 
					 | 
				
			||||||
				overflow: hidden;
 | 
					 | 
				
			||||||
				white-space: nowrap;
 | 
					 | 
				
			||||||
				text-overflow: ellipsis;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		> .prefix {
 | 
					 | 
				
			||||||
			left: 0;
 | 
					 | 
				
			||||||
			padding-right: 6px;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		> .suffix {
 | 
					 | 
				
			||||||
			right: 0;
 | 
					 | 
				
			||||||
			padding-left: 6px;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		&.inline {
 | 
					 | 
				
			||||||
			display: inline-block;
 | 
					 | 
				
			||||||
			margin: 0;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		&.focused {
 | 
					 | 
				
			||||||
			> select {
 | 
					 | 
				
			||||||
				border-color: var(--accent);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		&.disabled {
 | 
					 | 
				
			||||||
			opacity: 0.7;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			&, * {
 | 
					 | 
				
			||||||
				cursor: not-allowed !important;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
</style>
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,144 +0,0 @@
 | 
				
			||||||
<template>
 | 
					 | 
				
			||||||
<div
 | 
					 | 
				
			||||||
	class="ziffeoms"
 | 
					 | 
				
			||||||
	:class="{ disabled, checked }"
 | 
					 | 
				
			||||||
	role="switch"
 | 
					 | 
				
			||||||
	:aria-checked="checked"
 | 
					 | 
				
			||||||
	:aria-disabled="disabled"
 | 
					 | 
				
			||||||
	@click.prevent="toggle"
 | 
					 | 
				
			||||||
>
 | 
					 | 
				
			||||||
	<input
 | 
					 | 
				
			||||||
		type="checkbox"
 | 
					 | 
				
			||||||
		ref="input"
 | 
					 | 
				
			||||||
		:disabled="disabled"
 | 
					 | 
				
			||||||
		@keydown.enter="toggle"
 | 
					 | 
				
			||||||
	>
 | 
					 | 
				
			||||||
	<span class="button">
 | 
					 | 
				
			||||||
		<span></span>
 | 
					 | 
				
			||||||
	</span>
 | 
					 | 
				
			||||||
	<span class="label">
 | 
					 | 
				
			||||||
		<span><slot></slot></span>
 | 
					 | 
				
			||||||
		<p><slot name="caption"></slot></p>
 | 
					 | 
				
			||||||
	</span>
 | 
					 | 
				
			||||||
</div>
 | 
					 | 
				
			||||||
</template>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<script lang="ts">
 | 
					 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export default defineComponent({
 | 
					 | 
				
			||||||
	props: {
 | 
					 | 
				
			||||||
		modelValue: {
 | 
					 | 
				
			||||||
			type: Boolean,
 | 
					 | 
				
			||||||
			default: false
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		disabled: {
 | 
					 | 
				
			||||||
			type: Boolean,
 | 
					 | 
				
			||||||
			default: false
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
	computed: {
 | 
					 | 
				
			||||||
		checked(): boolean {
 | 
					 | 
				
			||||||
			return this.modelValue;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
	methods: {
 | 
					 | 
				
			||||||
		toggle() {
 | 
					 | 
				
			||||||
			if (this.disabled) return;
 | 
					 | 
				
			||||||
			this.$emit('update:modelValue', !this.checked);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
</script>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<style lang="scss" scoped>
 | 
					 | 
				
			||||||
.ziffeoms {
 | 
					 | 
				
			||||||
	position: relative;
 | 
					 | 
				
			||||||
	display: flex;
 | 
					 | 
				
			||||||
	margin: 32px 0;
 | 
					 | 
				
			||||||
	cursor: pointer;
 | 
					 | 
				
			||||||
	transition: all 0.3s;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	&:first-child {
 | 
					 | 
				
			||||||
		margin-top: 0;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	&:last-child {
 | 
					 | 
				
			||||||
		margin-bottom: 0;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	> * {
 | 
					 | 
				
			||||||
		user-select: none;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	&.disabled {
 | 
					 | 
				
			||||||
		opacity: 0.6;
 | 
					 | 
				
			||||||
		cursor: not-allowed;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	&.checked {
 | 
					 | 
				
			||||||
		> .button {
 | 
					 | 
				
			||||||
			background-color: var(--X10);
 | 
					 | 
				
			||||||
			border-color: var(--X10);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			> * {
 | 
					 | 
				
			||||||
				background-color: var(--accent);
 | 
					 | 
				
			||||||
				transform: translateX(14px);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	> input {
 | 
					 | 
				
			||||||
		position: absolute;
 | 
					 | 
				
			||||||
		width: 0;
 | 
					 | 
				
			||||||
		height: 0;
 | 
					 | 
				
			||||||
		opacity: 0;
 | 
					 | 
				
			||||||
		margin: 0;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	> .button {
 | 
					 | 
				
			||||||
		position: relative;
 | 
					 | 
				
			||||||
		display: inline-block;
 | 
					 | 
				
			||||||
		flex-shrink: 0;
 | 
					 | 
				
			||||||
		margin: 3px 0 0 0;
 | 
					 | 
				
			||||||
		width: 34px;
 | 
					 | 
				
			||||||
		height: 14px;
 | 
					 | 
				
			||||||
		background: var(--X6);
 | 
					 | 
				
			||||||
		outline: none;
 | 
					 | 
				
			||||||
		border-radius: 14px;
 | 
					 | 
				
			||||||
		transition: inherit;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		> * {
 | 
					 | 
				
			||||||
			position: absolute;
 | 
					 | 
				
			||||||
			top: -3px;
 | 
					 | 
				
			||||||
			left: 0;
 | 
					 | 
				
			||||||
			border-radius: 100%;
 | 
					 | 
				
			||||||
			transition: background-color 0.3s, transform 0.3s;
 | 
					 | 
				
			||||||
			width: 20px;
 | 
					 | 
				
			||||||
			height: 20px;
 | 
					 | 
				
			||||||
			background-color: #fff;
 | 
					 | 
				
			||||||
			box-shadow: 0 2px 1px -1px rgba(#000, 0.2), 0 1px 1px 0 rgba(#000, 0.14), 0 1px 3px 0 rgba(#000, 0.12);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	> .label {
 | 
					 | 
				
			||||||
		margin-left: 8px;
 | 
					 | 
				
			||||||
		display: block;
 | 
					 | 
				
			||||||
		cursor: pointer;
 | 
					 | 
				
			||||||
		transition: inherit;
 | 
					 | 
				
			||||||
		color: var(--fg);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		> span {
 | 
					 | 
				
			||||||
			display: block;
 | 
					 | 
				
			||||||
			line-height: 20px;
 | 
					 | 
				
			||||||
			transition: inherit;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		> p {
 | 
					 | 
				
			||||||
			margin: 0;
 | 
					 | 
				
			||||||
			color: var(--fgTransparentWeak);
 | 
					 | 
				
			||||||
			font-size: 90%;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
</style>
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,254 +0,0 @@
 | 
				
			||||||
<template>
 | 
					 | 
				
			||||||
<div class="adhpbeos">
 | 
					 | 
				
			||||||
	<div class="label" @click="focus"><slot name="label"></slot></div>
 | 
					 | 
				
			||||||
	<div class="input" :class="{ disabled, focused, tall, pre }">
 | 
					 | 
				
			||||||
		<textarea ref="inputEl"
 | 
					 | 
				
			||||||
			:class="{ code, _monospace: code }"
 | 
					 | 
				
			||||||
			v-model="v"
 | 
					 | 
				
			||||||
			:disabled="disabled"
 | 
					 | 
				
			||||||
			:required="required"
 | 
					 | 
				
			||||||
			:readonly="readonly"
 | 
					 | 
				
			||||||
			:placeholder="placeholder"
 | 
					 | 
				
			||||||
			:pattern="pattern"
 | 
					 | 
				
			||||||
			:autocomplete="autocomplete"
 | 
					 | 
				
			||||||
			:spellcheck="spellcheck"
 | 
					 | 
				
			||||||
			@focus="focused = true"
 | 
					 | 
				
			||||||
			@blur="focused = false"
 | 
					 | 
				
			||||||
			@keydown="onKeydown($event)"
 | 
					 | 
				
			||||||
			@input="onInput"
 | 
					 | 
				
			||||||
		></textarea>
 | 
					 | 
				
			||||||
	</div>
 | 
					 | 
				
			||||||
	<div class="caption"><slot name="caption"></slot></div>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	<MkButton v-if="manualSave && changed" @click="updated" primary><i class="fas fa-save"></i> {{ $ts.save }}</MkButton>
 | 
					 | 
				
			||||||
</div>
 | 
					 | 
				
			||||||
</template>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<script lang="ts">
 | 
					 | 
				
			||||||
import { defineComponent, onMounted, onUnmounted, nextTick, ref, watch, computed, toRefs } from 'vue';
 | 
					 | 
				
			||||||
import MkButton from './button.vue';
 | 
					 | 
				
			||||||
import { debounce } from 'throttle-debounce';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export default defineComponent({
 | 
					 | 
				
			||||||
	components: {
 | 
					 | 
				
			||||||
		MkButton,
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	props: {
 | 
					 | 
				
			||||||
		modelValue: {
 | 
					 | 
				
			||||||
			required: true
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		type: {
 | 
					 | 
				
			||||||
			type: String,
 | 
					 | 
				
			||||||
			required: false
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		required: {
 | 
					 | 
				
			||||||
			type: Boolean,
 | 
					 | 
				
			||||||
			required: false
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		readonly: {
 | 
					 | 
				
			||||||
			type: Boolean,
 | 
					 | 
				
			||||||
			required: false
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		disabled: {
 | 
					 | 
				
			||||||
			type: Boolean,
 | 
					 | 
				
			||||||
			required: false
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		pattern: {
 | 
					 | 
				
			||||||
			type: String,
 | 
					 | 
				
			||||||
			required: false
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		placeholder: {
 | 
					 | 
				
			||||||
			type: String,
 | 
					 | 
				
			||||||
			required: false
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		autofocus: {
 | 
					 | 
				
			||||||
			type: Boolean,
 | 
					 | 
				
			||||||
			required: false,
 | 
					 | 
				
			||||||
			default: false
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		autocomplete: {
 | 
					 | 
				
			||||||
			required: false
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		spellcheck: {
 | 
					 | 
				
			||||||
			required: false
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		code: {
 | 
					 | 
				
			||||||
			type: Boolean,
 | 
					 | 
				
			||||||
			required: false
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		tall: {
 | 
					 | 
				
			||||||
			type: Boolean,
 | 
					 | 
				
			||||||
			required: false,
 | 
					 | 
				
			||||||
			default: false
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		pre: {
 | 
					 | 
				
			||||||
			type: Boolean,
 | 
					 | 
				
			||||||
			required: false,
 | 
					 | 
				
			||||||
			default: false
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		debounce: {
 | 
					 | 
				
			||||||
			type: Boolean,
 | 
					 | 
				
			||||||
			required: false,
 | 
					 | 
				
			||||||
			default: false
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		manualSave: {
 | 
					 | 
				
			||||||
			type: Boolean,
 | 
					 | 
				
			||||||
			required: false,
 | 
					 | 
				
			||||||
			default: false
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	emits: ['change', 'keydown', 'enter', 'update:modelValue'],
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	setup(props, context) {
 | 
					 | 
				
			||||||
		const { modelValue, autofocus } = toRefs(props);
 | 
					 | 
				
			||||||
		const v = ref(modelValue.value);
 | 
					 | 
				
			||||||
		const focused = ref(false);
 | 
					 | 
				
			||||||
		const changed = ref(false);
 | 
					 | 
				
			||||||
		const invalid = ref(false);
 | 
					 | 
				
			||||||
		const filled = computed(() => v.value !== '' && v.value != null);
 | 
					 | 
				
			||||||
		const inputEl = ref(null);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		const focus = () => inputEl.value.focus();
 | 
					 | 
				
			||||||
		const onInput = (ev) => {
 | 
					 | 
				
			||||||
			changed.value = true;
 | 
					 | 
				
			||||||
			context.emit('change', ev);
 | 
					 | 
				
			||||||
		};
 | 
					 | 
				
			||||||
		const onKeydown = (ev: KeyboardEvent) => {
 | 
					 | 
				
			||||||
			context.emit('keydown', ev);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			if (ev.code === 'Enter') {
 | 
					 | 
				
			||||||
				context.emit('enter');
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		const updated = () => {
 | 
					 | 
				
			||||||
			changed.value = false;
 | 
					 | 
				
			||||||
			context.emit('update:modelValue', v.value);
 | 
					 | 
				
			||||||
		};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		const debouncedUpdated = debounce(1000, updated);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		watch(modelValue, newValue => {
 | 
					 | 
				
			||||||
			v.value = newValue;
 | 
					 | 
				
			||||||
		});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		watch(v, newValue => {
 | 
					 | 
				
			||||||
			if (!props.manualSave) {
 | 
					 | 
				
			||||||
				if (props.debounce) {
 | 
					 | 
				
			||||||
					debouncedUpdated();
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					updated();
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			invalid.value = inputEl.value.validity.badInput;
 | 
					 | 
				
			||||||
		});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		onMounted(() => {
 | 
					 | 
				
			||||||
			nextTick(() => {
 | 
					 | 
				
			||||||
				if (autofocus.value) {
 | 
					 | 
				
			||||||
					focus();
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			});
 | 
					 | 
				
			||||||
		});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		return {
 | 
					 | 
				
			||||||
			v,
 | 
					 | 
				
			||||||
			focused,
 | 
					 | 
				
			||||||
			invalid,
 | 
					 | 
				
			||||||
			changed,
 | 
					 | 
				
			||||||
			filled,
 | 
					 | 
				
			||||||
			inputEl,
 | 
					 | 
				
			||||||
			focus,
 | 
					 | 
				
			||||||
			onInput,
 | 
					 | 
				
			||||||
			onKeydown,
 | 
					 | 
				
			||||||
			updated,
 | 
					 | 
				
			||||||
		};
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
</script>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<style lang="scss" scoped>
 | 
					 | 
				
			||||||
.adhpbeos {
 | 
					 | 
				
			||||||
	margin: 1.5em 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	> .label {
 | 
					 | 
				
			||||||
		font-size: 0.85em;
 | 
					 | 
				
			||||||
		padding: 0 0 8px 12px;
 | 
					 | 
				
			||||||
		user-select: none;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		&:empty {
 | 
					 | 
				
			||||||
			display: none;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	> .caption {
 | 
					 | 
				
			||||||
		font-size: 0.8em;
 | 
					 | 
				
			||||||
		padding: 8px 0 0 12px;
 | 
					 | 
				
			||||||
		color: var(--fgTransparentWeak);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		&:empty {
 | 
					 | 
				
			||||||
			display: none;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	> .input {
 | 
					 | 
				
			||||||
		position: relative;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		> textarea {
 | 
					 | 
				
			||||||
			appearance: none;
 | 
					 | 
				
			||||||
			-webkit-appearance: none;
 | 
					 | 
				
			||||||
			display: block;
 | 
					 | 
				
			||||||
			width: 100%;
 | 
					 | 
				
			||||||
			min-width: 100%;
 | 
					 | 
				
			||||||
			max-width: 100%;
 | 
					 | 
				
			||||||
			min-height: 130px;
 | 
					 | 
				
			||||||
			margin: 0;
 | 
					 | 
				
			||||||
			padding: 12px;
 | 
					 | 
				
			||||||
			font: inherit;
 | 
					 | 
				
			||||||
			font-weight: normal;
 | 
					 | 
				
			||||||
			font-size: 1em;
 | 
					 | 
				
			||||||
			color: var(--fg);
 | 
					 | 
				
			||||||
			background: var(--panel);
 | 
					 | 
				
			||||||
			border: solid 0.5px var(--inputBorder);
 | 
					 | 
				
			||||||
			border-radius: 6px;
 | 
					 | 
				
			||||||
			outline: none;
 | 
					 | 
				
			||||||
			box-shadow: none;
 | 
					 | 
				
			||||||
			box-sizing: border-box;
 | 
					 | 
				
			||||||
			transition: border-color 0.1s ease-out;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			&:hover {
 | 
					 | 
				
			||||||
				border-color: var(--inputBorderHover);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		&.focused {
 | 
					 | 
				
			||||||
			> textarea {
 | 
					 | 
				
			||||||
				border-color: var(--accent);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		&.disabled {
 | 
					 | 
				
			||||||
			opacity: 0.7;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			&, * {
 | 
					 | 
				
			||||||
				cursor: not-allowed !important;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		&.tall {
 | 
					 | 
				
			||||||
			> textarea {
 | 
					 | 
				
			||||||
				min-height: 200px;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		&.pre {
 | 
					 | 
				
			||||||
			> textarea {
 | 
					 | 
				
			||||||
				white-space: pre;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
</style>
 | 
					 | 
				
			||||||
| 
						 | 
					@ -52,7 +52,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import MkInput from './ui/input.vue';
 | 
					import MkInput from './form/input.vue';
 | 
				
			||||||
import XModalWindow from '@client/components/ui/modal-window.vue';
 | 
					import XModalWindow from '@client/components/ui/modal-window.vue';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -30,7 +30,7 @@
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent, defineAsyncComponent } from 'vue';
 | 
					import { defineComponent, defineAsyncComponent } from 'vue';
 | 
				
			||||||
import { v4 as uuid } from 'uuid';
 | 
					import { v4 as uuid } from 'uuid';
 | 
				
			||||||
import MkSelect from '@client/components/ui/select.vue';
 | 
					import MkSelect from '@client/components/form/select.vue';
 | 
				
			||||||
import MkButton from '@client/components/ui/button.vue';
 | 
					import MkButton from '@client/components/ui/button.vue';
 | 
				
			||||||
import { widgets as widgetDefs } from '@client/widgets';
 | 
					import { widgets as widgetDefs } from '@client/widgets';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,15 +2,15 @@
 | 
				
			||||||
<div style="overflow: clip;">
 | 
					<div style="overflow: clip;">
 | 
				
			||||||
	<FormBase class="znqjceqz">
 | 
						<FormBase class="znqjceqz">
 | 
				
			||||||
		<div id="debug"></div>
 | 
							<div id="debug"></div>
 | 
				
			||||||
		<section class="_formItem about">
 | 
							<section class="_debobigegoItem about">
 | 
				
			||||||
			<div class="_formPanel panel" :class="{ playing: easterEggEngine != null }" ref="about">
 | 
								<div class="_debobigegoPanel panel" :class="{ playing: easterEggEngine != null }" ref="about">
 | 
				
			||||||
				<img src="/static-assets/client/about-icon.png" alt="" class="icon" @load="iconLoaded" draggable="false" @click="gravity"/>
 | 
									<img src="/static-assets/client/about-icon.png" alt="" class="icon" @load="iconLoaded" draggable="false" @click="gravity"/>
 | 
				
			||||||
				<div class="misskey">Misskey</div>
 | 
									<div class="misskey">Misskey</div>
 | 
				
			||||||
				<div class="version">v{{ version }}</div>
 | 
									<div class="version">v{{ version }}</div>
 | 
				
			||||||
				<span class="emoji" v-for="emoji in easterEggEmojis" :key="emoji.id" :data-physics-x="emoji.left" :data-physics-y="emoji.top" :class="{ _physics_circle_: !emoji.emoji.startsWith(':') }"><MkEmoji class="emoji" :emoji="emoji.emoji" :custom-emojis="$instance.emojis" :is-reaction="false" :normal="true" :no-style="true"/></span>
 | 
									<span class="emoji" v-for="emoji in easterEggEmojis" :key="emoji.id" :data-physics-x="emoji.left" :data-physics-y="emoji.top" :class="{ _physics_circle_: !emoji.emoji.startsWith(':') }"><MkEmoji class="emoji" :emoji="emoji.emoji" :custom-emojis="$instance.emojis" :is-reaction="false" :normal="true" :no-style="true"/></span>
 | 
				
			||||||
			</div>
 | 
								</div>
 | 
				
			||||||
		</section>
 | 
							</section>
 | 
				
			||||||
		<section class="_formItem" style="text-align: center; padding: 0 16px;">
 | 
							<section class="_debobigegoItem" style="text-align: center; padding: 0 16px;">
 | 
				
			||||||
			{{ $ts._aboutMisskey.about }}<br><MkA class="_link" to="/docs/general/misskey">{{ $ts.learnMore }}</MkA>
 | 
								{{ $ts._aboutMisskey.about }}<br><MkA class="_link" to="/docs/general/misskey">{{ $ts.learnMore }}</MkA>
 | 
				
			||||||
		</section>
 | 
							</section>
 | 
				
			||||||
		<FormGroup>
 | 
							<FormGroup>
 | 
				
			||||||
| 
						 | 
					@ -55,10 +55,10 @@
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import { version } from '@client/config';
 | 
					import { version } from '@client/config';
 | 
				
			||||||
import FormLink from '@client/components/form/link.vue';
 | 
					import FormLink from '@client/components/debobigego/link.vue';
 | 
				
			||||||
import FormBase from '@client/components/form/base.vue';
 | 
					import FormBase from '@client/components/debobigego/base.vue';
 | 
				
			||||||
import FormGroup from '@client/components/form/group.vue';
 | 
					import FormGroup from '@client/components/debobigego/group.vue';
 | 
				
			||||||
import FormKeyValueView from '@client/components/form/key-value-view.vue';
 | 
					import FormKeyValueView from '@client/components/debobigego/key-value-view.vue';
 | 
				
			||||||
import MkLink from '@client/components/link.vue';
 | 
					import MkLink from '@client/components/link.vue';
 | 
				
			||||||
import { physics } from '@client/scripts/physics';
 | 
					import { physics } from '@client/scripts/physics';
 | 
				
			||||||
import * as symbols from '@client/symbols';
 | 
					import * as symbols from '@client/symbols';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
<FormBase>
 | 
					<FormBase>
 | 
				
			||||||
	<div class="_formItem">
 | 
						<div class="_debobigegoItem">
 | 
				
			||||||
		<div class="_formPanel fwhjspax">
 | 
							<div class="_debobigegoPanel fwhjspax">
 | 
				
			||||||
			<img :src="$instance.iconUrl || $instance.faviconUrl || '/favicon.ico'" alt="" class="icon"/>
 | 
								<img :src="$instance.iconUrl || $instance.faviconUrl || '/favicon.ico'" alt="" class="icon"/>
 | 
				
			||||||
			<span class="name">{{ $instance.name || host }}</span>
 | 
								<span class="name">{{ $instance.name || host }}</span>
 | 
				
			||||||
		</div>
 | 
							</div>
 | 
				
			||||||
| 
						 | 
					@ -59,12 +59,12 @@
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import { version, instanceName } from '@client/config';
 | 
					import { version, instanceName } from '@client/config';
 | 
				
			||||||
import FormLink from '@client/components/form/link.vue';
 | 
					import FormLink from '@client/components/debobigego/link.vue';
 | 
				
			||||||
import FormBase from '@client/components/form/base.vue';
 | 
					import FormBase from '@client/components/debobigego/base.vue';
 | 
				
			||||||
import FormGroup from '@client/components/form/group.vue';
 | 
					import FormGroup from '@client/components/debobigego/group.vue';
 | 
				
			||||||
import FormKeyValueView from '@client/components/form/key-value-view.vue';
 | 
					import FormKeyValueView from '@client/components/debobigego/key-value-view.vue';
 | 
				
			||||||
import FormTextarea from '@client/components/form/textarea.vue';
 | 
					import FormTextarea from '@client/components/debobigego/textarea.vue';
 | 
				
			||||||
import FormSuspense from '@client/components/form/suspense.vue';
 | 
					import FormSuspense from '@client/components/debobigego/suspense.vue';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
import number from '@client/filters/number';
 | 
					import number from '@client/filters/number';
 | 
				
			||||||
import * as symbols from '@client/symbols';
 | 
					import * as symbols from '@client/symbols';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -97,9 +97,9 @@ import { toUnicode } from 'punycode/';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import MkRadio from '@client/components/ui/radio.vue';
 | 
					import MkRadio from '@client/components/ui/radio.vue';
 | 
				
			||||||
import MkButton from '@client/components/ui/button.vue';
 | 
					import MkButton from '@client/components/ui/button.vue';
 | 
				
			||||||
import MkInput from '@client/components/ui/input.vue';
 | 
					import MkInput from '@client/components/form/input.vue';
 | 
				
			||||||
import MkTextarea from '@client/components/ui/textarea.vue';
 | 
					import MkTextarea from '@client/components/form/textarea.vue';
 | 
				
			||||||
import MkSelect from '@client/components/ui/select.vue';
 | 
					import MkSelect from '@client/components/form/select.vue';
 | 
				
			||||||
import MkSample from '@client/components/sample.vue';
 | 
					import MkSample from '@client/components/sample.vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { convertToMisskeyTheme, ThemeValue, convertToViewModel, ThemeViewModel } from '@client/scripts/theme-editor';
 | 
					import { convertToMisskeyTheme, ThemeValue, convertToViewModel, ThemeViewModel } from '@client/scripts/theme-editor';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -27,9 +27,9 @@
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import * as JSON5 from 'json5';
 | 
					import * as JSON5 from 'json5';
 | 
				
			||||||
import MkButton from '@client/components/ui/button.vue';
 | 
					import MkButton from '@client/components/ui/button.vue';
 | 
				
			||||||
import MkInput from '@client/components/ui/input.vue';
 | 
					import MkInput from '@client/components/form/input.vue';
 | 
				
			||||||
import MkTextarea from '@client/components/ui/textarea.vue';
 | 
					import MkTextarea from '@client/components/form/textarea.vue';
 | 
				
			||||||
import MkSwitch from '@client/components/ui/switch.vue';
 | 
					import MkSwitch from '@client/components/form/switch.vue';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
import * as symbols from '@client/symbols';
 | 
					import * as symbols from '@client/symbols';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -27,9 +27,9 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { computed, defineComponent } from 'vue';
 | 
					import { computed, defineComponent } from 'vue';
 | 
				
			||||||
import MkTextarea from '@client/components/ui/textarea.vue';
 | 
					import MkTextarea from '@client/components/form/textarea.vue';
 | 
				
			||||||
import MkButton from '@client/components/ui/button.vue';
 | 
					import MkButton from '@client/components/ui/button.vue';
 | 
				
			||||||
import MkInput from '@client/components/ui/input.vue';
 | 
					import MkInput from '@client/components/form/input.vue';
 | 
				
			||||||
import { selectFile } from '@client/scripts/select-file';
 | 
					import { selectFile } from '@client/scripts/select-file';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
import * as symbols from '@client/symbols';
 | 
					import * as symbols from '@client/symbols';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -57,7 +57,7 @@ import { defineComponent } from 'vue';
 | 
				
			||||||
import { url, lang } from '@client/config';
 | 
					import { url, lang } from '@client/config';
 | 
				
			||||||
import * as symbols from '@client/symbols';
 | 
					import * as symbols from '@client/symbols';
 | 
				
			||||||
import MkFolder from '@client/components/ui/folder.vue';
 | 
					import MkFolder from '@client/components/ui/folder.vue';
 | 
				
			||||||
import MkInput from '@client/components/ui/input.vue';
 | 
					import MkInput from '@client/components/form/input.vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default defineComponent({
 | 
					export default defineComponent({
 | 
				
			||||||
	components: {
 | 
						components: {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -29,8 +29,8 @@
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent, computed } from 'vue';
 | 
					import { defineComponent, computed } from 'vue';
 | 
				
			||||||
import MkButton from '@client/components/ui/button.vue';
 | 
					import MkButton from '@client/components/ui/button.vue';
 | 
				
			||||||
import MkInput from '@client/components/ui/input.vue';
 | 
					import MkInput from '@client/components/form/input.vue';
 | 
				
			||||||
import MkSelect from '@client/components/ui/select.vue';
 | 
					import MkSelect from '@client/components/form/select.vue';
 | 
				
			||||||
import MkFolder from '@client/components/ui/folder.vue';
 | 
					import MkFolder from '@client/components/ui/folder.vue';
 | 
				
			||||||
import MkTab from '@client/components/tab.vue';
 | 
					import MkTab from '@client/components/tab.vue';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -75,7 +75,7 @@
 | 
				
			||||||
import { computed, defineComponent } from 'vue';
 | 
					import { computed, defineComponent } from 'vue';
 | 
				
			||||||
import XUserList from '@client/components/user-list.vue';
 | 
					import XUserList from '@client/components/user-list.vue';
 | 
				
			||||||
import MkFolder from '@client/components/ui/folder.vue';
 | 
					import MkFolder from '@client/components/ui/folder.vue';
 | 
				
			||||||
import MkInput from '@client/components/ui/input.vue';
 | 
					import MkInput from '@client/components/form/input.vue';
 | 
				
			||||||
import number from '@client/filters/number';
 | 
					import number from '@client/filters/number';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
import * as symbols from '@client/symbols';
 | 
					import * as symbols from '@client/symbols';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -96,8 +96,8 @@
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import MkButton from '@client/components/ui/button.vue';
 | 
					import MkButton from '@client/components/ui/button.vue';
 | 
				
			||||||
import MkInput from '@client/components/ui/input.vue';
 | 
					import MkInput from '@client/components/form/input.vue';
 | 
				
			||||||
import MkSelect from '@client/components/ui/select.vue';
 | 
					import MkSelect from '@client/components/form/select.vue';
 | 
				
			||||||
import MkPagination from '@client/components/ui/pagination.vue';
 | 
					import MkPagination from '@client/components/ui/pagination.vue';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
import * as symbols from '@client/symbols';
 | 
					import * as symbols from '@client/symbols';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,7 +10,7 @@
 | 
				
			||||||
		</FormTextarea>
 | 
							</FormTextarea>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		<FormGroup>
 | 
							<FormGroup>
 | 
				
			||||||
			<div v-for="file in files" :key="file.id" class="_formItem _formPanel wqugxsfx" :style="{ backgroundImage: file ? `url(${ file.thumbnailUrl })` : null }">
 | 
								<div v-for="file in files" :key="file.id" class="_debobigegoItem _debobigegoPanel wqugxsfx" :style="{ backgroundImage: file ? `url(${ file.thumbnailUrl })` : null }">
 | 
				
			||||||
				<div class="name">{{ file.name }}</div>
 | 
									<div class="name">{{ file.name }}</div>
 | 
				
			||||||
				<button class="remove _button" @click="remove(file)" v-tooltip="$ts.remove"><i class="fas fa-times"></i></button>
 | 
									<button class="remove _button" @click="remove(file)" v-tooltip="$ts.remove"><i class="fas fa-times"></i></button>
 | 
				
			||||||
			</div>
 | 
								</div>
 | 
				
			||||||
| 
						 | 
					@ -29,14 +29,14 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { computed, defineComponent } from 'vue';
 | 
					import { computed, defineComponent } from 'vue';
 | 
				
			||||||
import FormButton from '@client/components/form/button.vue';
 | 
					import FormButton from '@client/components/debobigego/button.vue';
 | 
				
			||||||
import FormInput from '@client/components/form/input.vue';
 | 
					import FormInput from '@client/components/debobigego/input.vue';
 | 
				
			||||||
import FormTextarea from '@client/components/form/textarea.vue';
 | 
					import FormTextarea from '@client/components/debobigego/textarea.vue';
 | 
				
			||||||
import FormSwitch from '@client/components/form/switch.vue';
 | 
					import FormSwitch from '@client/components/debobigego/switch.vue';
 | 
				
			||||||
import FormTuple from '@client/components/form/tuple.vue';
 | 
					import FormTuple from '@client/components/debobigego/tuple.vue';
 | 
				
			||||||
import FormBase from '@client/components/form/base.vue';
 | 
					import FormBase from '@client/components/debobigego/base.vue';
 | 
				
			||||||
import FormGroup from '@client/components/form/group.vue';
 | 
					import FormGroup from '@client/components/debobigego/group.vue';
 | 
				
			||||||
import FormSuspense from '@client/components/form/suspense.vue';
 | 
					import FormSuspense from '@client/components/debobigego/suspense.vue';
 | 
				
			||||||
import { selectFile } from '@client/scripts/select-file';
 | 
					import { selectFile } from '@client/scripts/select-file';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
import * as symbols from '@client/symbols';
 | 
					import * as symbols from '@client/symbols';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -46,7 +46,7 @@
 | 
				
			||||||
import { computed, defineComponent } from 'vue';
 | 
					import { computed, defineComponent } from 'vue';
 | 
				
			||||||
import XUserList from '@client/components/user-list.vue';
 | 
					import XUserList from '@client/components/user-list.vue';
 | 
				
			||||||
import MkFolder from '@client/components/ui/folder.vue';
 | 
					import MkFolder from '@client/components/ui/folder.vue';
 | 
				
			||||||
import MkInput from '@client/components/ui/input.vue';
 | 
					import MkInput from '@client/components/form/input.vue';
 | 
				
			||||||
import MkButton from '@client/components/ui/button.vue';
 | 
					import MkButton from '@client/components/ui/button.vue';
 | 
				
			||||||
import MkTab from '@client/components/tab.vue';
 | 
					import MkTab from '@client/components/tab.vue';
 | 
				
			||||||
import MkPagination from '@client/components/ui/pagination.vue';
 | 
					import MkPagination from '@client/components/ui/pagination.vue';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,8 +3,8 @@
 | 
				
			||||||
	<FormGroup v-if="instance">
 | 
						<FormGroup v-if="instance">
 | 
				
			||||||
		<template #label>{{ instance.host }}</template>
 | 
							<template #label>{{ instance.host }}</template>
 | 
				
			||||||
		<FormGroup>
 | 
							<FormGroup>
 | 
				
			||||||
			<div class="_formItem">
 | 
								<div class="_debobigegoItem">
 | 
				
			||||||
				<div class="_formPanel fnfelxur">
 | 
									<div class="_debobigegoPanel fnfelxur">
 | 
				
			||||||
					<img :src="instance.iconUrl || instance.faviconUrl" alt="" class="icon"/>
 | 
										<img :src="instance.iconUrl || instance.faviconUrl" alt="" class="icon"/>
 | 
				
			||||||
				</div>
 | 
									</div>
 | 
				
			||||||
			</div>
 | 
								</div>
 | 
				
			||||||
| 
						 | 
					@ -60,9 +60,9 @@
 | 
				
			||||||
				<template #value>{{ instance.openRegistrations ? $ts.yes : $ts.no }}</template>
 | 
									<template #value>{{ instance.openRegistrations ? $ts.yes : $ts.no }}</template>
 | 
				
			||||||
			</FormKeyValueView>
 | 
								</FormKeyValueView>
 | 
				
			||||||
		</FormGroup>
 | 
							</FormGroup>
 | 
				
			||||||
		<div class="_formItem">
 | 
							<div class="_debobigegoItem">
 | 
				
			||||||
			<div class="_formLabel">{{ $ts.statistics }}</div>
 | 
								<div class="_debobigegoLabel">{{ $ts.statistics }}</div>
 | 
				
			||||||
			<div class="_formPanel cmhjzshl">
 | 
								<div class="_debobigegoPanel cmhjzshl">
 | 
				
			||||||
				<div class="selects">
 | 
									<div class="selects">
 | 
				
			||||||
					<MkSelect v-model="chartSrc" style="margin: 0; flex: 1;">
 | 
										<MkSelect v-model="chartSrc" style="margin: 0; flex: 1;">
 | 
				
			||||||
						<option value="requests">{{ $ts._instanceCharts.requests }}</option>
 | 
											<option value="requests">{{ $ts._instanceCharts.requests }}</option>
 | 
				
			||||||
| 
						 | 
					@ -136,15 +136,15 @@
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineAsyncComponent, defineComponent } from 'vue';
 | 
					import { defineAsyncComponent, defineComponent } from 'vue';
 | 
				
			||||||
import Chart from 'chart.js';
 | 
					import Chart from 'chart.js';
 | 
				
			||||||
import FormObjectView from '@client/components/form/object-view.vue';
 | 
					import FormObjectView from '@client/components/debobigego/object-view.vue';
 | 
				
			||||||
import FormTextarea from '@client/components/form/textarea.vue';
 | 
					import FormTextarea from '@client/components/debobigego/textarea.vue';
 | 
				
			||||||
import FormLink from '@client/components/form/link.vue';
 | 
					import FormLink from '@client/components/debobigego/link.vue';
 | 
				
			||||||
import FormBase from '@client/components/form/base.vue';
 | 
					import FormBase from '@client/components/debobigego/base.vue';
 | 
				
			||||||
import FormGroup from '@client/components/form/group.vue';
 | 
					import FormGroup from '@client/components/debobigego/group.vue';
 | 
				
			||||||
import FormButton from '@client/components/form/button.vue';
 | 
					import FormButton from '@client/components/debobigego/button.vue';
 | 
				
			||||||
import FormKeyValueView from '@client/components/form/key-value-view.vue';
 | 
					import FormKeyValueView from '@client/components/debobigego/key-value-view.vue';
 | 
				
			||||||
import FormSuspense from '@client/components/form/suspense.vue';
 | 
					import FormSuspense from '@client/components/debobigego/suspense.vue';
 | 
				
			||||||
import MkSelect from '@client/components/ui/select.vue';
 | 
					import MkSelect from '@client/components/form/select.vue';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
import number from '@client/filters/number';
 | 
					import number from '@client/filters/number';
 | 
				
			||||||
import bytes from '@client/filters/bytes';
 | 
					import bytes from '@client/filters/bytes';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -65,8 +65,8 @@
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import { parseAcct } from '@/misc/acct';
 | 
					import { parseAcct } from '@/misc/acct';
 | 
				
			||||||
import MkButton from '@client/components/ui/button.vue';
 | 
					import MkButton from '@client/components/ui/button.vue';
 | 
				
			||||||
import MkInput from '@client/components/ui/input.vue';
 | 
					import MkInput from '@client/components/form/input.vue';
 | 
				
			||||||
import MkSelect from '@client/components/ui/select.vue';
 | 
					import MkSelect from '@client/components/form/select.vue';
 | 
				
			||||||
import MkPagination from '@client/components/ui/pagination.vue';
 | 
					import MkPagination from '@client/components/ui/pagination.vue';
 | 
				
			||||||
import { acct } from '@client/filters/user';
 | 
					import { acct } from '@client/filters/user';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -44,8 +44,8 @@
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import MkButton from '@client/components/ui/button.vue';
 | 
					import MkButton from '@client/components/ui/button.vue';
 | 
				
			||||||
import MkInput from '@client/components/ui/input.vue';
 | 
					import MkInput from '@client/components/form/input.vue';
 | 
				
			||||||
import MkTextarea from '@client/components/ui/textarea.vue';
 | 
					import MkTextarea from '@client/components/form/textarea.vue';
 | 
				
			||||||
import MkRadio from '@client/components/ui/radio.vue';
 | 
					import MkRadio from '@client/components/ui/radio.vue';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
import * as symbols from '@client/symbols';
 | 
					import * as symbols from '@client/symbols';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,8 +25,8 @@
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import MkButton from '@client/components/ui/button.vue';
 | 
					import MkButton from '@client/components/ui/button.vue';
 | 
				
			||||||
import MkInput from '@client/components/ui/input.vue';
 | 
					import MkInput from '@client/components/form/input.vue';
 | 
				
			||||||
import MkTextarea from '@client/components/ui/textarea.vue';
 | 
					import MkTextarea from '@client/components/form/textarea.vue';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
import * as symbols from '@client/symbols';
 | 
					import * as symbols from '@client/symbols';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,8 +9,8 @@
 | 
				
			||||||
		</FormRadios>
 | 
							</FormRadios>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		<template v-if="provider === 'hcaptcha'">
 | 
							<template v-if="provider === 'hcaptcha'">
 | 
				
			||||||
			<div class="_formItem _formNoConcat" v-sticky-container>
 | 
								<div class="_debobigegoItem _debobigegoNoConcat" v-sticky-container>
 | 
				
			||||||
				<div class="_formLabel">hCaptcha</div>
 | 
									<div class="_debobigegoLabel">hCaptcha</div>
 | 
				
			||||||
				<div class="main">
 | 
									<div class="main">
 | 
				
			||||||
					<FormInput v-model:value="hcaptchaSiteKey">
 | 
										<FormInput v-model:value="hcaptchaSiteKey">
 | 
				
			||||||
						<template #prefix><i class="fas fa-key"></i></template>
 | 
											<template #prefix><i class="fas fa-key"></i></template>
 | 
				
			||||||
| 
						 | 
					@ -22,16 +22,16 @@
 | 
				
			||||||
					</FormInput>
 | 
										</FormInput>
 | 
				
			||||||
				</div>
 | 
									</div>
 | 
				
			||||||
			</div>
 | 
								</div>
 | 
				
			||||||
			<div class="_formItem _formNoConcat" v-sticky-container>
 | 
								<div class="_debobigegoItem _debobigegoNoConcat" v-sticky-container>
 | 
				
			||||||
				<div class="_formLabel">{{ $ts.preview }}</div>
 | 
									<div class="_debobigegoLabel">{{ $ts.preview }}</div>
 | 
				
			||||||
				<div class="_formPanel" style="padding: var(--formContentHMargin);">
 | 
									<div class="_debobigegoPanel" style="padding: var(--formContentHMargin);">
 | 
				
			||||||
					<MkCaptcha provider="hcaptcha" :sitekey="hcaptchaSiteKey || '10000000-ffff-ffff-ffff-000000000001'"/>
 | 
										<MkCaptcha provider="hcaptcha" :sitekey="hcaptchaSiteKey || '10000000-ffff-ffff-ffff-000000000001'"/>
 | 
				
			||||||
				</div>
 | 
									</div>
 | 
				
			||||||
			</div>
 | 
								</div>
 | 
				
			||||||
		</template>
 | 
							</template>
 | 
				
			||||||
		<template v-else-if="provider === 'recaptcha'">
 | 
							<template v-else-if="provider === 'recaptcha'">
 | 
				
			||||||
			<div class="_formItem _formNoConcat" v-sticky-container>
 | 
								<div class="_debobigegoItem _debobigegoNoConcat" v-sticky-container>
 | 
				
			||||||
				<div class="_formLabel">reCAPTCHA</div>
 | 
									<div class="_debobigegoLabel">reCAPTCHA</div>
 | 
				
			||||||
				<div class="main">
 | 
									<div class="main">
 | 
				
			||||||
					<FormInput v-model:value="recaptchaSiteKey">
 | 
										<FormInput v-model:value="recaptchaSiteKey">
 | 
				
			||||||
						<template #prefix><i class="fas fa-key"></i></template>
 | 
											<template #prefix><i class="fas fa-key"></i></template>
 | 
				
			||||||
| 
						 | 
					@ -43,9 +43,9 @@
 | 
				
			||||||
					</FormInput>
 | 
										</FormInput>
 | 
				
			||||||
				</div>
 | 
									</div>
 | 
				
			||||||
			</div>
 | 
								</div>
 | 
				
			||||||
			<div v-if="recaptchaSiteKey" class="_formItem _formNoConcat" v-sticky-container>
 | 
								<div v-if="recaptchaSiteKey" class="_debobigegoItem _debobigegoNoConcat" v-sticky-container>
 | 
				
			||||||
				<div class="_formLabel">{{ $ts.preview }}</div>
 | 
									<div class="_debobigegoLabel">{{ $ts.preview }}</div>
 | 
				
			||||||
				<div class="_formPanel" style="padding: var(--formContentHMargin);">
 | 
									<div class="_debobigegoPanel" style="padding: var(--formContentHMargin);">
 | 
				
			||||||
					<MkCaptcha provider="recaptcha" :sitekey="recaptchaSiteKey"/>
 | 
										<MkCaptcha provider="recaptcha" :sitekey="recaptchaSiteKey"/>
 | 
				
			||||||
				</div>
 | 
									</div>
 | 
				
			||||||
			</div>
 | 
								</div>
 | 
				
			||||||
| 
						 | 
					@ -58,13 +58,13 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineAsyncComponent, defineComponent } from 'vue';
 | 
					import { defineAsyncComponent, defineComponent } from 'vue';
 | 
				
			||||||
import FormRadios from '@client/components/form/radios.vue';
 | 
					import FormRadios from '@client/components/debobigego/radios.vue';
 | 
				
			||||||
import FormInput from '@client/components/form/input.vue';
 | 
					import FormInput from '@client/components/debobigego/input.vue';
 | 
				
			||||||
import FormButton from '@client/components/form/button.vue';
 | 
					import FormButton from '@client/components/debobigego/button.vue';
 | 
				
			||||||
import FormBase from '@client/components/form/base.vue';
 | 
					import FormBase from '@client/components/debobigego/base.vue';
 | 
				
			||||||
import FormGroup from '@client/components/form/group.vue';
 | 
					import FormGroup from '@client/components/debobigego/group.vue';
 | 
				
			||||||
import FormInfo from '@client/components/form/info.vue';
 | 
					import FormInfo from '@client/components/debobigego/info.vue';
 | 
				
			||||||
import FormSuspense from '@client/components/form/suspense.vue';
 | 
					import FormSuspense from '@client/components/debobigego/suspense.vue';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
import * as symbols from '@client/symbols';
 | 
					import * as symbols from '@client/symbols';
 | 
				
			||||||
import { fetchInstance } from '@client/instance';
 | 
					import { fetchInstance } from '@client/instance';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,11 +18,11 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import FormSuspense from '@client/components/form/suspense.vue';
 | 
					import FormSuspense from '@client/components/debobigego/suspense.vue';
 | 
				
			||||||
import FormKeyValueView from '@client/components/form/key-value-view.vue';
 | 
					import FormKeyValueView from '@client/components/debobigego/key-value-view.vue';
 | 
				
			||||||
import FormLink from '@client/components/form/link.vue';
 | 
					import FormLink from '@client/components/debobigego/link.vue';
 | 
				
			||||||
import FormBase from '@client/components/form/base.vue';
 | 
					import FormBase from '@client/components/debobigego/base.vue';
 | 
				
			||||||
import FormGroup from '@client/components/form/group.vue';
 | 
					import FormGroup from '@client/components/debobigego/group.vue';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
import * as symbols from '@client/symbols';
 | 
					import * as symbols from '@client/symbols';
 | 
				
			||||||
import bytes from '@client/filters/bytes';
 | 
					import bytes from '@client/filters/bytes';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,8 +8,8 @@
 | 
				
			||||||
				<span>{{ $ts.emailAddress }}</span>
 | 
									<span>{{ $ts.emailAddress }}</span>
 | 
				
			||||||
			</FormInput>
 | 
								</FormInput>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			<div class="_formItem _formNoConcat" v-sticky-container>
 | 
								<div class="_debobigegoItem _debobigegoNoConcat" v-sticky-container>
 | 
				
			||||||
				<div class="_formLabel">{{ $ts.smtpConfig }}</div>
 | 
									<div class="_debobigegoLabel">{{ $ts.smtpConfig }}</div>
 | 
				
			||||||
				<div class="main">
 | 
									<div class="main">
 | 
				
			||||||
					<FormInput v-model:value="smtpHost">
 | 
										<FormInput v-model:value="smtpHost">
 | 
				
			||||||
						<span>{{ $ts.smtpHost }}</span>
 | 
											<span>{{ $ts.smtpHost }}</span>
 | 
				
			||||||
| 
						 | 
					@ -38,13 +38,13 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import FormSwitch from '@client/components/form/switch.vue';
 | 
					import FormSwitch from '@client/components/debobigego/switch.vue';
 | 
				
			||||||
import FormInput from '@client/components/form/input.vue';
 | 
					import FormInput from '@client/components/debobigego/input.vue';
 | 
				
			||||||
import FormButton from '@client/components/form/button.vue';
 | 
					import FormButton from '@client/components/debobigego/button.vue';
 | 
				
			||||||
import FormBase from '@client/components/form/base.vue';
 | 
					import FormBase from '@client/components/debobigego/base.vue';
 | 
				
			||||||
import FormGroup from '@client/components/form/group.vue';
 | 
					import FormGroup from '@client/components/debobigego/group.vue';
 | 
				
			||||||
import FormInfo from '@client/components/form/info.vue';
 | 
					import FormInfo from '@client/components/debobigego/info.vue';
 | 
				
			||||||
import FormSuspense from '@client/components/form/suspense.vue';
 | 
					import FormSuspense from '@client/components/debobigego/suspense.vue';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
import * as symbols from '@client/symbols';
 | 
					import * as symbols from '@client/symbols';
 | 
				
			||||||
import { fetchInstance } from '@client/instance';
 | 
					import { fetchInstance } from '@client/instance';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -31,7 +31,7 @@
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import XModalWindow from '@client/components/ui/modal-window.vue';
 | 
					import XModalWindow from '@client/components/ui/modal-window.vue';
 | 
				
			||||||
import MkButton from '@client/components/ui/button.vue';
 | 
					import MkButton from '@client/components/ui/button.vue';
 | 
				
			||||||
import MkInput from '@client/components/ui/input.vue';
 | 
					import MkInput from '@client/components/form/input.vue';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
import { unique } from '../../../prelude/array';
 | 
					import { unique } from '../../../prelude/array';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -56,7 +56,7 @@
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { computed, defineComponent } from 'vue';
 | 
					import { computed, defineComponent } from 'vue';
 | 
				
			||||||
import MkButton from '@client/components/ui/button.vue';
 | 
					import MkButton from '@client/components/ui/button.vue';
 | 
				
			||||||
import MkInput from '@client/components/ui/input.vue';
 | 
					import MkInput from '@client/components/form/input.vue';
 | 
				
			||||||
import MkPagination from '@client/components/ui/pagination.vue';
 | 
					import MkPagination from '@client/components/ui/pagination.vue';
 | 
				
			||||||
import MkTab from '@client/components/tab.vue';
 | 
					import MkTab from '@client/components/tab.vue';
 | 
				
			||||||
import { selectFile } from '@client/scripts/select-file';
 | 
					import { selectFile } from '@client/scripts/select-file';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -37,7 +37,7 @@
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { computed, defineComponent } from 'vue';
 | 
					import { computed, defineComponent } from 'vue';
 | 
				
			||||||
import MkButton from '@client/components/ui/button.vue';
 | 
					import MkButton from '@client/components/ui/button.vue';
 | 
				
			||||||
import MkSwitch from '@client/components/ui/switch.vue';
 | 
					import MkSwitch from '@client/components/form/switch.vue';
 | 
				
			||||||
import XModalWindow from '@client/components/ui/modal-window.vue';
 | 
					import XModalWindow from '@client/components/ui/modal-window.vue';
 | 
				
			||||||
import MkDriveFileThumbnail from '@client/components/drive-file-thumbnail.vue';
 | 
					import MkDriveFileThumbnail from '@client/components/drive-file-thumbnail.vue';
 | 
				
			||||||
import Progress from '@client/scripts/loading';
 | 
					import Progress from '@client/scripts/loading';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -30,12 +30,12 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import FormSwitch from '@client/components/form/switch.vue';
 | 
					import FormSwitch from '@client/components/debobigego/switch.vue';
 | 
				
			||||||
import FormInput from '@client/components/form/input.vue';
 | 
					import FormInput from '@client/components/debobigego/input.vue';
 | 
				
			||||||
import FormButton from '@client/components/form/button.vue';
 | 
					import FormButton from '@client/components/debobigego/button.vue';
 | 
				
			||||||
import FormBase from '@client/components/form/base.vue';
 | 
					import FormBase from '@client/components/debobigego/base.vue';
 | 
				
			||||||
import FormGroup from '@client/components/form/group.vue';
 | 
					import FormGroup from '@client/components/debobigego/group.vue';
 | 
				
			||||||
import FormSuspense from '@client/components/form/suspense.vue';
 | 
					import FormSuspense from '@client/components/debobigego/suspense.vue';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
import * as symbols from '@client/symbols';
 | 
					import * as symbols from '@client/symbols';
 | 
				
			||||||
import { fetchInstance } from '@client/instance';
 | 
					import { fetchInstance } from '@client/instance';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -63,8 +63,8 @@
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import MkButton from '@client/components/ui/button.vue';
 | 
					import MkButton from '@client/components/ui/button.vue';
 | 
				
			||||||
import MkInput from '@client/components/ui/input.vue';
 | 
					import MkInput from '@client/components/form/input.vue';
 | 
				
			||||||
import MkSelect from '@client/components/ui/select.vue';
 | 
					import MkSelect from '@client/components/form/select.vue';
 | 
				
			||||||
import MkPagination from '@client/components/ui/pagination.vue';
 | 
					import MkPagination from '@client/components/ui/pagination.vue';
 | 
				
			||||||
import MkDriveFileThumbnail from '@client/components/drive-file-thumbnail.vue';
 | 
					import MkDriveFileThumbnail from '@client/components/drive-file-thumbnail.vue';
 | 
				
			||||||
import bytes from '@client/filters/bytes';
 | 
					import bytes from '@client/filters/bytes';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,8 +3,8 @@
 | 
				
			||||||
	<div class="nav" v-if="!narrow || page == null">
 | 
						<div class="nav" v-if="!narrow || page == null">
 | 
				
			||||||
		<FormBase>
 | 
							<FormBase>
 | 
				
			||||||
			<FormGroup>
 | 
								<FormGroup>
 | 
				
			||||||
				<div class="_formItem">
 | 
									<div class="_debobigegoItem">
 | 
				
			||||||
					<div class="_formPanel lxpfedzu">
 | 
										<div class="_debobigegoPanel lxpfedzu">
 | 
				
			||||||
						<img :src="$instance.iconUrl || '/favicon.ico'" alt="" class="icon"/>
 | 
											<img :src="$instance.iconUrl || '/favicon.ico'" alt="" class="icon"/>
 | 
				
			||||||
					</div>
 | 
										</div>
 | 
				
			||||||
				</div>
 | 
									</div>
 | 
				
			||||||
| 
						 | 
					@ -56,10 +56,10 @@
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { computed, defineAsyncComponent, defineComponent, nextTick, onMounted, reactive, ref, watch } from 'vue';
 | 
					import { computed, defineAsyncComponent, defineComponent, nextTick, onMounted, reactive, ref, watch } from 'vue';
 | 
				
			||||||
import { i18n } from '@client/i18n';
 | 
					import { i18n } from '@client/i18n';
 | 
				
			||||||
import FormLink from '@client/components/form/link.vue';
 | 
					import FormLink from '@client/components/debobigego/link.vue';
 | 
				
			||||||
import FormGroup from '@client/components/form/group.vue';
 | 
					import FormGroup from '@client/components/debobigego/group.vue';
 | 
				
			||||||
import FormBase from '@client/components/form/base.vue';
 | 
					import FormBase from '@client/components/debobigego/base.vue';
 | 
				
			||||||
import FormButton from '@client/components/form/button.vue';
 | 
					import FormButton from '@client/components/debobigego/button.vue';
 | 
				
			||||||
import { scroll } from '@client/scripts/scroll';
 | 
					import { scroll } from '@client/scripts/scroll';
 | 
				
			||||||
import * as symbols from '@client/symbols';
 | 
					import * as symbols from '@client/symbols';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,14 +13,14 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import FormSwitch from '@client/components/form/switch.vue';
 | 
					import FormSwitch from '@client/components/debobigego/switch.vue';
 | 
				
			||||||
import FormInput from '@client/components/form/input.vue';
 | 
					import FormInput from '@client/components/debobigego/input.vue';
 | 
				
			||||||
import FormButton from '@client/components/form/button.vue';
 | 
					import FormButton from '@client/components/debobigego/button.vue';
 | 
				
			||||||
import FormBase from '@client/components/form/base.vue';
 | 
					import FormBase from '@client/components/debobigego/base.vue';
 | 
				
			||||||
import FormGroup from '@client/components/form/group.vue';
 | 
					import FormGroup from '@client/components/debobigego/group.vue';
 | 
				
			||||||
import FormTextarea from '@client/components/form/textarea.vue';
 | 
					import FormTextarea from '@client/components/debobigego/textarea.vue';
 | 
				
			||||||
import FormInfo from '@client/components/form/info.vue';
 | 
					import FormInfo from '@client/components/debobigego/info.vue';
 | 
				
			||||||
import FormSuspense from '@client/components/form/suspense.vue';
 | 
					import FormSuspense from '@client/components/debobigego/suspense.vue';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
import * as symbols from '@client/symbols';
 | 
					import * as symbols from '@client/symbols';
 | 
				
			||||||
import { fetchInstance } from '@client/instance';
 | 
					import { fetchInstance } from '@client/instance';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -127,9 +127,9 @@ import { defineComponent, markRaw } from 'vue';
 | 
				
			||||||
import Chart from 'chart.js';
 | 
					import Chart from 'chart.js';
 | 
				
			||||||
import XModalWindow from '@client/components/ui/modal-window.vue';
 | 
					import XModalWindow from '@client/components/ui/modal-window.vue';
 | 
				
			||||||
import MkUsersDialog from '@client/components/users-dialog.vue';
 | 
					import MkUsersDialog from '@client/components/users-dialog.vue';
 | 
				
			||||||
import MkSelect from '@client/components/ui/select.vue';
 | 
					import MkSelect from '@client/components/form/select.vue';
 | 
				
			||||||
import MkButton from '@client/components/ui/button.vue';
 | 
					import MkButton from '@client/components/ui/button.vue';
 | 
				
			||||||
import MkSwitch from '@client/components/ui/switch.vue';
 | 
					import MkSwitch from '@client/components/form/switch.vue';
 | 
				
			||||||
import MkInfo from '@client/components/ui/info.vue';
 | 
					import MkInfo from '@client/components/ui/info.vue';
 | 
				
			||||||
import bytes from '@client/filters/bytes';
 | 
					import bytes from '@client/filters/bytes';
 | 
				
			||||||
import number from '@client/filters/number';
 | 
					import number from '@client/filters/number';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,12 +26,12 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import FormSwitch from '@client/components/form/switch.vue';
 | 
					import FormSwitch from '@client/components/debobigego/switch.vue';
 | 
				
			||||||
import FormInput from '@client/components/form/input.vue';
 | 
					import FormInput from '@client/components/debobigego/input.vue';
 | 
				
			||||||
import FormButton from '@client/components/form/button.vue';
 | 
					import FormButton from '@client/components/debobigego/button.vue';
 | 
				
			||||||
import FormBase from '@client/components/form/base.vue';
 | 
					import FormBase from '@client/components/debobigego/base.vue';
 | 
				
			||||||
import FormInfo from '@client/components/form/info.vue';
 | 
					import FormInfo from '@client/components/debobigego/info.vue';
 | 
				
			||||||
import FormSuspense from '@client/components/form/suspense.vue';
 | 
					import FormSuspense from '@client/components/debobigego/suspense.vue';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
import * as symbols from '@client/symbols';
 | 
					import * as symbols from '@client/symbols';
 | 
				
			||||||
import { fetchInstance } from '@client/instance';
 | 
					import { fetchInstance } from '@client/instance';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,12 +26,12 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import FormSwitch from '@client/components/form/switch.vue';
 | 
					import FormSwitch from '@client/components/debobigego/switch.vue';
 | 
				
			||||||
import FormInput from '@client/components/form/input.vue';
 | 
					import FormInput from '@client/components/debobigego/input.vue';
 | 
				
			||||||
import FormButton from '@client/components/form/button.vue';
 | 
					import FormButton from '@client/components/debobigego/button.vue';
 | 
				
			||||||
import FormBase from '@client/components/form/base.vue';
 | 
					import FormBase from '@client/components/debobigego/base.vue';
 | 
				
			||||||
import FormInfo from '@client/components/form/info.vue';
 | 
					import FormInfo from '@client/components/debobigego/info.vue';
 | 
				
			||||||
import FormSuspense from '@client/components/form/suspense.vue';
 | 
					import FormSuspense from '@client/components/debobigego/suspense.vue';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
import * as symbols from '@client/symbols';
 | 
					import * as symbols from '@client/symbols';
 | 
				
			||||||
import { fetchInstance } from '@client/instance';
 | 
					import { fetchInstance } from '@client/instance';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,12 +26,12 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import FormSwitch from '@client/components/form/switch.vue';
 | 
					import FormSwitch from '@client/components/debobigego/switch.vue';
 | 
				
			||||||
import FormInput from '@client/components/form/input.vue';
 | 
					import FormInput from '@client/components/debobigego/input.vue';
 | 
				
			||||||
import FormButton from '@client/components/form/button.vue';
 | 
					import FormButton from '@client/components/debobigego/button.vue';
 | 
				
			||||||
import FormBase from '@client/components/form/base.vue';
 | 
					import FormBase from '@client/components/debobigego/base.vue';
 | 
				
			||||||
import FormInfo from '@client/components/form/info.vue';
 | 
					import FormInfo from '@client/components/debobigego/info.vue';
 | 
				
			||||||
import FormSuspense from '@client/components/form/suspense.vue';
 | 
					import FormSuspense from '@client/components/debobigego/suspense.vue';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
import * as symbols from '@client/symbols';
 | 
					import * as symbols from '@client/symbols';
 | 
				
			||||||
import { fetchInstance } from '@client/instance';
 | 
					import { fetchInstance } from '@client/instance';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,14 +19,14 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import FormLink from '@client/components/form/link.vue';
 | 
					import FormLink from '@client/components/debobigego/link.vue';
 | 
				
			||||||
import FormInput from '@client/components/form/input.vue';
 | 
					import FormInput from '@client/components/debobigego/input.vue';
 | 
				
			||||||
import FormButton from '@client/components/form/button.vue';
 | 
					import FormButton from '@client/components/debobigego/button.vue';
 | 
				
			||||||
import FormBase from '@client/components/form/base.vue';
 | 
					import FormBase from '@client/components/debobigego/base.vue';
 | 
				
			||||||
import FormGroup from '@client/components/form/group.vue';
 | 
					import FormGroup from '@client/components/debobigego/group.vue';
 | 
				
			||||||
import FormTextarea from '@client/components/form/textarea.vue';
 | 
					import FormTextarea from '@client/components/debobigego/textarea.vue';
 | 
				
			||||||
import FormInfo from '@client/components/form/info.vue';
 | 
					import FormInfo from '@client/components/debobigego/info.vue';
 | 
				
			||||||
import FormSuspense from '@client/components/form/suspense.vue';
 | 
					import FormSuspense from '@client/components/debobigego/suspense.vue';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
import * as symbols from '@client/symbols';
 | 
					import * as symbols from '@client/symbols';
 | 
				
			||||||
import { fetchInstance } from '@client/instance';
 | 
					import { fetchInstance } from '@client/instance';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -31,9 +31,9 @@
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import MkButton from '@client/components/ui/button.vue';
 | 
					import MkButton from '@client/components/ui/button.vue';
 | 
				
			||||||
import MkInput from '@client/components/ui/input.vue';
 | 
					import MkInput from '@client/components/form/input.vue';
 | 
				
			||||||
import MkSelect from '@client/components/ui/select.vue';
 | 
					import MkSelect from '@client/components/form/select.vue';
 | 
				
			||||||
import MkTextarea from '@client/components/ui/textarea.vue';
 | 
					import MkTextarea from '@client/components/form/textarea.vue';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
import * as symbols from '@client/symbols';
 | 
					import * as symbols from '@client/symbols';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
<div class="_formItem">
 | 
					<div class="_debobigegoItem">
 | 
				
			||||||
	<div class="_formLabel"><i class="fas fa-microchip"></i> {{ $ts.cpuAndMemory }}</div>
 | 
						<div class="_debobigegoLabel"><i class="fas fa-microchip"></i> {{ $ts.cpuAndMemory }}</div>
 | 
				
			||||||
	<div class="_formPanel xhexznfu">
 | 
						<div class="_debobigegoPanel xhexznfu">
 | 
				
			||||||
		<div>
 | 
							<div>
 | 
				
			||||||
			<canvas :ref="cpumem"></canvas>
 | 
								<canvas :ref="cpumem"></canvas>
 | 
				
			||||||
		</div>
 | 
							</div>
 | 
				
			||||||
| 
						 | 
					@ -16,9 +16,9 @@
 | 
				
			||||||
		</div>
 | 
							</div>
 | 
				
			||||||
	</div>
 | 
						</div>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
<div class="_formItem">
 | 
					<div class="_debobigegoItem">
 | 
				
			||||||
	<div class="_formLabel"><i class="fas fa-hdd"></i> {{ $ts.disk }}</div>
 | 
						<div class="_debobigegoLabel"><i class="fas fa-hdd"></i> {{ $ts.disk }}</div>
 | 
				
			||||||
	<div class="_formPanel xhexznfu">
 | 
						<div class="_debobigegoPanel xhexznfu">
 | 
				
			||||||
		<div>
 | 
							<div>
 | 
				
			||||||
			<canvas :ref="disk"></canvas>
 | 
								<canvas :ref="disk"></canvas>
 | 
				
			||||||
		</div>
 | 
							</div>
 | 
				
			||||||
| 
						 | 
					@ -33,9 +33,9 @@
 | 
				
			||||||
		</div>
 | 
							</div>
 | 
				
			||||||
	</div>
 | 
						</div>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
<div class="_formItem">
 | 
					<div class="_debobigegoItem">
 | 
				
			||||||
	<div class="_formLabel"><i class="fas fa-exchange-alt"></i> {{ $ts.network }}</div>
 | 
						<div class="_debobigegoLabel"><i class="fas fa-exchange-alt"></i> {{ $ts.network }}</div>
 | 
				
			||||||
	<div class="_formPanel xhexznfu">
 | 
						<div class="_debobigegoPanel xhexznfu">
 | 
				
			||||||
		<div>
 | 
							<div>
 | 
				
			||||||
			<canvas :ref="net"></canvas>
 | 
								<canvas :ref="net"></canvas>
 | 
				
			||||||
		</div>
 | 
							</div>
 | 
				
			||||||
| 
						 | 
					@ -54,8 +54,8 @@
 | 
				
			||||||
import { defineComponent, markRaw } from 'vue';
 | 
					import { defineComponent, markRaw } from 'vue';
 | 
				
			||||||
import Chart from 'chart.js';
 | 
					import Chart from 'chart.js';
 | 
				
			||||||
import MkButton from '@client/components/ui/button.vue';
 | 
					import MkButton from '@client/components/ui/button.vue';
 | 
				
			||||||
import MkSelect from '@client/components/ui/select.vue';
 | 
					import MkSelect from '@client/components/form/select.vue';
 | 
				
			||||||
import MkInput from '@client/components/ui/input.vue';
 | 
					import MkInput from '@client/components/form/input.vue';
 | 
				
			||||||
import MkContainer from '@client/components/ui/container.vue';
 | 
					import MkContainer from '@client/components/ui/container.vue';
 | 
				
			||||||
import MkFolder from '@client/components/ui/folder.vue';
 | 
					import MkFolder from '@client/components/ui/folder.vue';
 | 
				
			||||||
import MkwFederation from '../../widgets/federation.vue';
 | 
					import MkwFederation from '../../widgets/federation.vue';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -65,12 +65,12 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import FormSwitch from '@client/components/form/switch.vue';
 | 
					import FormSwitch from '@client/components/debobigego/switch.vue';
 | 
				
			||||||
import FormInput from '@client/components/form/input.vue';
 | 
					import FormInput from '@client/components/debobigego/input.vue';
 | 
				
			||||||
import FormButton from '@client/components/form/button.vue';
 | 
					import FormButton from '@client/components/debobigego/button.vue';
 | 
				
			||||||
import FormBase from '@client/components/form/base.vue';
 | 
					import FormBase from '@client/components/debobigego/base.vue';
 | 
				
			||||||
import FormGroup from '@client/components/form/group.vue';
 | 
					import FormGroup from '@client/components/debobigego/group.vue';
 | 
				
			||||||
import FormSuspense from '@client/components/form/suspense.vue';
 | 
					import FormSuspense from '@client/components/debobigego/suspense.vue';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
import * as symbols from '@client/symbols';
 | 
					import * as symbols from '@client/symbols';
 | 
				
			||||||
import { fetchInstance } from '@client/instance';
 | 
					import { fetchInstance } from '@client/instance';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,12 +23,12 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import FormSwitch from '@client/components/form/switch.vue';
 | 
					import FormSwitch from '@client/components/debobigego/switch.vue';
 | 
				
			||||||
import FormInput from '@client/components/form/input.vue';
 | 
					import FormInput from '@client/components/debobigego/input.vue';
 | 
				
			||||||
import FormButton from '@client/components/form/button.vue';
 | 
					import FormButton from '@client/components/debobigego/button.vue';
 | 
				
			||||||
import FormBase from '@client/components/form/base.vue';
 | 
					import FormBase from '@client/components/debobigego/base.vue';
 | 
				
			||||||
import FormGroup from '@client/components/form/group.vue';
 | 
					import FormGroup from '@client/components/debobigego/group.vue';
 | 
				
			||||||
import FormSuspense from '@client/components/form/suspense.vue';
 | 
					import FormSuspense from '@client/components/debobigego/suspense.vue';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
import * as symbols from '@client/symbols';
 | 
					import * as symbols from '@client/symbols';
 | 
				
			||||||
import { fetchInstance } from '@client/instance';
 | 
					import { fetchInstance } from '@client/instance';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,8 +17,8 @@
 | 
				
			||||||
			</FormGroup>
 | 
								</FormGroup>
 | 
				
			||||||
		</FormSuspense>
 | 
							</FormSuspense>
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
		<div class="_formItem">
 | 
							<div class="_debobigegoItem">
 | 
				
			||||||
			<div class="_formPanel">
 | 
								<div class="_debobigegoPanel">
 | 
				
			||||||
				<MkInstanceStats :chart-limit="300" :detailed="true"/>
 | 
									<MkInstanceStats :chart-limit="300" :detailed="true"/>
 | 
				
			||||||
			</div>
 | 
								</div>
 | 
				
			||||||
		</div>
 | 
							</div>
 | 
				
			||||||
| 
						 | 
					@ -47,18 +47,18 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { computed, defineComponent, markRaw } from 'vue';
 | 
					import { computed, defineComponent, markRaw } from 'vue';
 | 
				
			||||||
import FormKeyValueView from '@client/components/form/key-value-view.vue';
 | 
					import FormKeyValueView from '@client/components/debobigego/key-value-view.vue';
 | 
				
			||||||
import FormInput from '@client/components/form/input.vue';
 | 
					import FormInput from '@client/components/debobigego/input.vue';
 | 
				
			||||||
import FormButton from '@client/components/form/button.vue';
 | 
					import FormButton from '@client/components/debobigego/button.vue';
 | 
				
			||||||
import FormBase from '@client/components/form/base.vue';
 | 
					import FormBase from '@client/components/debobigego/base.vue';
 | 
				
			||||||
import FormGroup from '@client/components/form/group.vue';
 | 
					import FormGroup from '@client/components/debobigego/group.vue';
 | 
				
			||||||
import FormTextarea from '@client/components/form/textarea.vue';
 | 
					import FormTextarea from '@client/components/debobigego/textarea.vue';
 | 
				
			||||||
import FormInfo from '@client/components/form/info.vue';
 | 
					import FormInfo from '@client/components/debobigego/info.vue';
 | 
				
			||||||
import FormSuspense from '@client/components/form/suspense.vue';
 | 
					import FormSuspense from '@client/components/debobigego/suspense.vue';
 | 
				
			||||||
import MkInstanceStats from '@client/components/instance-stats.vue';
 | 
					import MkInstanceStats from '@client/components/instance-stats.vue';
 | 
				
			||||||
import MkButton from '@client/components/ui/button.vue';
 | 
					import MkButton from '@client/components/ui/button.vue';
 | 
				
			||||||
import MkSelect from '@client/components/ui/select.vue';
 | 
					import MkSelect from '@client/components/form/select.vue';
 | 
				
			||||||
import MkInput from '@client/components/ui/input.vue';
 | 
					import MkInput from '@client/components/form/input.vue';
 | 
				
			||||||
import MkContainer from '@client/components/ui/container.vue';
 | 
					import MkContainer from '@client/components/ui/container.vue';
 | 
				
			||||||
import MkFolder from '@client/components/ui/folder.vue';
 | 
					import MkFolder from '@client/components/ui/folder.vue';
 | 
				
			||||||
import { version, url } from '@client/config';
 | 
					import { version, url } from '@client/config';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,14 +16,14 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import FormKeyValueView from '@client/components/form/key-value-view.vue';
 | 
					import FormKeyValueView from '@client/components/debobigego/key-value-view.vue';
 | 
				
			||||||
import FormInput from '@client/components/form/input.vue';
 | 
					import FormInput from '@client/components/debobigego/input.vue';
 | 
				
			||||||
import FormButton from '@client/components/form/button.vue';
 | 
					import FormButton from '@client/components/debobigego/button.vue';
 | 
				
			||||||
import FormBase from '@client/components/form/base.vue';
 | 
					import FormBase from '@client/components/debobigego/base.vue';
 | 
				
			||||||
import FormGroup from '@client/components/form/group.vue';
 | 
					import FormGroup from '@client/components/debobigego/group.vue';
 | 
				
			||||||
import FormTextarea from '@client/components/form/textarea.vue';
 | 
					import FormTextarea from '@client/components/debobigego/textarea.vue';
 | 
				
			||||||
import FormInfo from '@client/components/form/info.vue';
 | 
					import FormInfo from '@client/components/debobigego/info.vue';
 | 
				
			||||||
import FormSuspense from '@client/components/form/suspense.vue';
 | 
					import FormSuspense from '@client/components/debobigego/suspense.vue';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
import * as symbols from '@client/symbols';
 | 
					import * as symbols from '@client/symbols';
 | 
				
			||||||
import { fetchInstance } from '@client/instance';
 | 
					import { fetchInstance } from '@client/instance';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
<div class="_formItem">
 | 
					<div class="_debobigegoItem">
 | 
				
			||||||
	<div class="_formLabel"><slot name="title"></slot></div>
 | 
						<div class="_debobigegoLabel"><slot name="title"></slot></div>
 | 
				
			||||||
	<div class="_formPanel pumxzjhg">
 | 
						<div class="_debobigegoPanel pumxzjhg">
 | 
				
			||||||
		<div class="_table status">
 | 
							<div class="_table status">
 | 
				
			||||||
			<div class="_row">
 | 
								<div class="_row">
 | 
				
			||||||
				<div class="_cell"><div class="_label">Process</div>{{ number(activeSincePrevTick) }}</div>
 | 
									<div class="_cell"><div class="_label">Process</div>{{ number(activeSincePrevTick) }}</div>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,8 +14,8 @@
 | 
				
			||||||
import { defineComponent, markRaw } from 'vue';
 | 
					import { defineComponent, markRaw } from 'vue';
 | 
				
			||||||
import MkButton from '@client/components/ui/button.vue';
 | 
					import MkButton from '@client/components/ui/button.vue';
 | 
				
			||||||
import XQueue from './queue.chart.vue';
 | 
					import XQueue from './queue.chart.vue';
 | 
				
			||||||
import FormBase from '@client/components/form/base.vue';
 | 
					import FormBase from '@client/components/debobigego/base.vue';
 | 
				
			||||||
import FormButton from '@client/components/form/button.vue';
 | 
					import FormButton from '@client/components/debobigego/button.vue';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
import * as symbols from '@client/symbols';
 | 
					import * as symbols from '@client/symbols';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,8 +2,8 @@
 | 
				
			||||||
<FormBase class="relaycxt">
 | 
					<FormBase class="relaycxt">
 | 
				
			||||||
	<FormButton @click="addRelay" primary><i class="fas fa-plus"></i> {{ $ts.addRelay }}</FormButton>
 | 
						<FormButton @click="addRelay" primary><i class="fas fa-plus"></i> {{ $ts.addRelay }}</FormButton>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	<div class="_formItem" v-for="relay in relays" :key="relay.inbox">
 | 
						<div class="_debobigegoItem" v-for="relay in relays" :key="relay.inbox">
 | 
				
			||||||
		<div class="_formPanel" style="padding: 16px;">
 | 
							<div class="_debobigegoPanel" style="padding: 16px;">
 | 
				
			||||||
			<div>{{ relay.inbox }}</div>
 | 
								<div>{{ relay.inbox }}</div>
 | 
				
			||||||
			<div>{{ $t(`_relayStatus.${relay.status}`) }}</div>
 | 
								<div>{{ $t(`_relayStatus.${relay.status}`) }}</div>
 | 
				
			||||||
			<MkButton class="button" inline danger @click="remove(relay.inbox)"><i class="fas fa-trash-alt"></i> {{ $ts.remove }}</MkButton>
 | 
								<MkButton class="button" inline danger @click="remove(relay.inbox)"><i class="fas fa-trash-alt"></i> {{ $ts.remove }}</MkButton>
 | 
				
			||||||
| 
						 | 
					@ -15,9 +15,9 @@
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import MkButton from '@client/components/ui/button.vue';
 | 
					import MkButton from '@client/components/ui/button.vue';
 | 
				
			||||||
import MkInput from '@client/components/ui/input.vue';
 | 
					import MkInput from '@client/components/form/input.vue';
 | 
				
			||||||
import FormBase from '@client/components/form/base.vue';
 | 
					import FormBase from '@client/components/debobigego/base.vue';
 | 
				
			||||||
import FormButton from '@client/components/form/button.vue';
 | 
					import FormButton from '@client/components/debobigego/button.vue';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
import * as symbols from '@client/symbols';
 | 
					import * as symbols from '@client/symbols';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,13 +17,13 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineAsyncComponent, defineComponent } from 'vue';
 | 
					import { defineAsyncComponent, defineComponent } from 'vue';
 | 
				
			||||||
import FormLink from '@client/components/form/link.vue';
 | 
					import FormLink from '@client/components/debobigego/link.vue';
 | 
				
			||||||
import FormSwitch from '@client/components/form/switch.vue';
 | 
					import FormSwitch from '@client/components/debobigego/switch.vue';
 | 
				
			||||||
import FormButton from '@client/components/form/button.vue';
 | 
					import FormButton from '@client/components/debobigego/button.vue';
 | 
				
			||||||
import FormBase from '@client/components/form/base.vue';
 | 
					import FormBase from '@client/components/debobigego/base.vue';
 | 
				
			||||||
import FormGroup from '@client/components/form/group.vue';
 | 
					import FormGroup from '@client/components/debobigego/group.vue';
 | 
				
			||||||
import FormInfo from '@client/components/form/info.vue';
 | 
					import FormInfo from '@client/components/debobigego/info.vue';
 | 
				
			||||||
import FormSuspense from '@client/components/form/suspense.vue';
 | 
					import FormSuspense from '@client/components/debobigego/suspense.vue';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
import * as symbols from '@client/symbols';
 | 
					import * as symbols from '@client/symbols';
 | 
				
			||||||
import { fetchInstance } from '@client/instance';
 | 
					import { fetchInstance } from '@client/instance';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,12 +25,12 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import FormSwitch from '@client/components/form/switch.vue';
 | 
					import FormSwitch from '@client/components/debobigego/switch.vue';
 | 
				
			||||||
import FormInput from '@client/components/form/input.vue';
 | 
					import FormInput from '@client/components/debobigego/input.vue';
 | 
				
			||||||
import FormButton from '@client/components/form/button.vue';
 | 
					import FormButton from '@client/components/debobigego/button.vue';
 | 
				
			||||||
import FormBase from '@client/components/form/base.vue';
 | 
					import FormBase from '@client/components/debobigego/base.vue';
 | 
				
			||||||
import FormGroup from '@client/components/form/group.vue';
 | 
					import FormGroup from '@client/components/debobigego/group.vue';
 | 
				
			||||||
import FormSuspense from '@client/components/form/suspense.vue';
 | 
					import FormSuspense from '@client/components/debobigego/suspense.vue';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
import * as symbols from '@client/symbols';
 | 
					import * as symbols from '@client/symbols';
 | 
				
			||||||
import { fetchInstance } from '@client/instance';
 | 
					import { fetchInstance } from '@client/instance';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -54,14 +54,14 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import FormSwitch from '@client/components/form/switch.vue';
 | 
					import FormSwitch from '@client/components/debobigego/switch.vue';
 | 
				
			||||||
import FormInput from '@client/components/form/input.vue';
 | 
					import FormInput from '@client/components/debobigego/input.vue';
 | 
				
			||||||
import FormButton from '@client/components/form/button.vue';
 | 
					import FormButton from '@client/components/debobigego/button.vue';
 | 
				
			||||||
import FormBase from '@client/components/form/base.vue';
 | 
					import FormBase from '@client/components/debobigego/base.vue';
 | 
				
			||||||
import FormGroup from '@client/components/form/group.vue';
 | 
					import FormGroup from '@client/components/debobigego/group.vue';
 | 
				
			||||||
import FormTextarea from '@client/components/form/textarea.vue';
 | 
					import FormTextarea from '@client/components/debobigego/textarea.vue';
 | 
				
			||||||
import FormInfo from '@client/components/form/info.vue';
 | 
					import FormInfo from '@client/components/debobigego/info.vue';
 | 
				
			||||||
import FormSuspense from '@client/components/form/suspense.vue';
 | 
					import FormSuspense from '@client/components/debobigego/suspense.vue';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
import * as symbols from '@client/symbols';
 | 
					import * as symbols from '@client/symbols';
 | 
				
			||||||
import { fetchInstance } from '@client/instance';
 | 
					import { fetchInstance } from '@client/instance';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -67,8 +67,8 @@
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import MkButton from '@client/components/ui/button.vue';
 | 
					import MkButton from '@client/components/ui/button.vue';
 | 
				
			||||||
import MkInput from '@client/components/ui/input.vue';
 | 
					import MkInput from '@client/components/form/input.vue';
 | 
				
			||||||
import MkSelect from '@client/components/ui/select.vue';
 | 
					import MkSelect from '@client/components/form/select.vue';
 | 
				
			||||||
import MkPagination from '@client/components/ui/pagination.vue';
 | 
					import MkPagination from '@client/components/ui/pagination.vue';
 | 
				
			||||||
import { acct } from '@client/filters/user';
 | 
					import { acct } from '@client/filters/user';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -286,7 +286,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import MkTextarea from '@client/components/ui/textarea.vue';
 | 
					import MkTextarea from '@client/components/form/textarea.vue';
 | 
				
			||||||
import * as symbols from '@client/symbols';
 | 
					import * as symbols from '@client/symbols';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default defineComponent({
 | 
					export default defineComponent({
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -47,10 +47,10 @@
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import { defineComponent } from 'vue';
 | 
					import { defineComponent } from 'vue';
 | 
				
			||||||
import MkButton from '@client/components/ui/button.vue';
 | 
					import MkButton from '@client/components/ui/button.vue';
 | 
				
			||||||
import MkInput from '@client/components/ui/input.vue';
 | 
					import MkInput from '@client/components/form/input.vue';
 | 
				
			||||||
import MkTextarea from '@client/components/ui/textarea.vue';
 | 
					import MkTextarea from '@client/components/form/textarea.vue';
 | 
				
			||||||
import MkSelect from '@client/components/ui/select.vue';
 | 
					import MkSelect from '@client/components/form/select.vue';
 | 
				
			||||||
import MkSwitch from '@client/components/ui/switch.vue';
 | 
					import MkSwitch from '@client/components/form/switch.vue';
 | 
				
			||||||
import { getAcct } from '@/misc/acct';
 | 
					import { getAcct } from '@/misc/acct';
 | 
				
			||||||
import * as os from '@client/os';
 | 
					import * as os from '@client/os';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
Some files were not shown because too many files have changed in this diff Show more
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue