diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7af74f86f2de..ff633c5a1f77 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,7 @@
- Enhance: サイズ制限を超過するファイルをアップロードしようとした際にエラーを出すように
- Enhance: アイコンデコレーション管理画面にプレビューを追加
- Enhance: コントロールパネル内のファイル一覧でセンシティブなファイルを区別しやすく
+- Enhance: ScratchpadにUIインスペクターを追加
- Fix: サーバーメトリクスが2つ以上あるとリロード直後の表示がおかしくなる問題を修正
- Fix: 月の違う同じ日はセパレータが表示されないのを修正
- Fix: 縦横比が極端なカスタム絵文字を表示する際にレイアウトが崩れる箇所があるのを修正
diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index a1210bad2948..2877c8fe38cd 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -592,6 +592,8 @@ ascendingOrder: "昇順"
descendingOrder: "降順"
scratchpad: "スクラッチパッド"
scratchpadDescription: "スクラッチパッドは、AiScriptの実験環境を提供します。Misskeyと対話するコードの記述、実行、結果の確認ができます。"
+uiInspector: "UIインスペクター"
+uiInspectorDescription: "メモリ上に存在しているUIコンポーネントのインスタンスの一覧を見ることができます。UIコンポーネントはUi:C:系関数により生成されます。"
output: "出力"
script: "スクリプト"
disablePagesScript: "Pagesのスクリプトを無効にする"
diff --git a/packages/frontend/src/pages/scratchpad.vue b/packages/frontend/src/pages/scratchpad.vue
index 9aaa8ff9c633..897ff6acdf09 100644
--- a/packages/frontend/src/pages/scratchpad.vue
+++ b/packages/frontend/src/pages/scratchpad.vue
@@ -30,6 +30,24 @@ SPDX-License-Identifier: AGPL-3.0-only
+
+ {{ i18n.ts.uiInspector }}
+
+
+
{{ c.value.type }}
+
{{ c.value.id }}
+
+
+
+
+
+
{{ i18n.ts.uiInspectorDescription }}
+
+
+
{{ i18n.ts.scratchpadDescription }}
@@ -43,6 +61,7 @@ import { onDeactivated, onUnmounted, Ref, ref, watch, computed } from 'vue';
import { Interpreter, Parser, utils } from '@syuilo/aiscript';
import MkContainer from '@/components/MkContainer.vue';
import MkButton from '@/components/MkButton.vue';
+import MkTextarea from '@/components/MkTextarea.vue';
import MkCodeEditor from '@/components/MkCodeEditor.vue';
import { aiScriptReadline, createAiScriptEnv } from '@/scripts/aiscript/api.js';
import * as os from '@/os.js';
@@ -61,6 +80,7 @@ const logs = ref([]);
const root = ref();
const components = ref[[]>([]);
const uiKey = ref(0);
+const uiInspectorOpenedComponents = ref(new Map);
const saved = miLocalStorage.getItem('scratchpad');
if (saved) {
@@ -71,6 +91,14 @@ watch(code, () => {
miLocalStorage.setItem('scratchpad', code.value);
});
+function stringifyUiProps(uiProps) {
+ return JSON.stringify(
+ { ...uiProps, type: undefined, id: undefined },
+ (k, v) => typeof v === 'function' ? '' : v,
+ 2
+ );
+}
+
async function run() {
if (aiscript) aiscript.abort();
root.value = undefined;
@@ -192,4 +220,35 @@ definePageMetadata(() => ({
}
}
}
+
+.uiInspector {
+ display: grid;
+ gap: 8px;
+ padding: 16px;
+}
+
+.uiInspectorType {
+ display: inline-block;
+ border: hidden;
+ border-radius: 10px;
+ background-color: var(--panelHighlight);
+ padding: 2px 8px;
+ font-size: 12px;
+}
+
+.uiInspectorId {
+ display: inline-block;
+ padding-left: 8px;
+}
+
+.uiInspectorDescription {
+ display: block;
+ font-size: 12px;
+ padding-top: 16px;
+}
+
+.uiInspectorPropsToggle {
+ background: none;
+ border: none;
+}
]