@@ -89,18 +90,17 @@ import { url } from '@@/js/config.js';
import { embedRouteWithScrollbar } from '@@/js/embed-page.js';
import type { EmbeddableEntity, EmbedParams } from '@@/js/embed-page.js';
import MkModalWindow from '@/components/MkModalWindow.vue';
+import MkPreviewWithControls from '@/components/MkPreviewWithControls.vue';
import MkInput from '@/components/MkInput.vue';
import MkSelect from '@/components/MkSelect.vue';
import MkSwitch from '@/components/MkSwitch.vue';
import MkButton from '@/components/MkButton.vue';
import MkCode from '@/components/MkCode.vue';
import MkInfo from '@/components/MkInfo.vue';
-import * as os from '@/os.js';
import { i18n } from '@/i18n.js';
import { useMkSelect } from '@/composables/use-mkselect.js';
import { copyToClipboard } from '@/utility/copy-to-clipboard.js';
import { normalizeEmbedParams, getEmbedCode } from '@/utility/get-embed-code.js';
-import { prefer } from '@/preferences.js';
const emit = defineEmits<{
(ev: 'ok'): void;
@@ -302,29 +302,6 @@ onUnmounted(() => {
height: 100%;
}
-.embedCodeGenInputRoot {
- height: 100%;
- display: grid;
- grid-template-columns: 1fr 400px;
-}
-
-.embedCodeGenPreviewRoot {
- position: relative;
- cursor: not-allowed;
- background-color: var(--MI_THEME-bg);
- background-image: linear-gradient(135deg, transparent 30%, var(--MI_THEME-panel) 30%, var(--MI_THEME-panel) 50%, transparent 50%, transparent 80%, var(--MI_THEME-panel) 80%, var(--MI_THEME-panel) 100%);
- background-size: 20px 20px;
-}
-
-.animatedBg {
- animation: bg 1.2s linear infinite;
-}
-
-@keyframes bg {
- 0% { background-position: 0 0; }
- 100% { background-position: -20px -20px; }
-}
-
.embedCodeGenPreviewWrapper {
display: flex;
flex-direction: column;
@@ -372,11 +349,6 @@ onUnmounted(() => {
color-scheme: light dark;
}
-.embedCodeGenSettings {
- padding: 24px;
- overflow-y: scroll;
-}
-
.embedCodeGenResultRoot {
box-sizing: border-box;
padding: 24px;
@@ -417,11 +389,4 @@ onUnmounted(() => {
.embedCodeGenResultButtons {
margin: 0 auto;
}
-
-@container (max-width: 800px) {
- .embedCodeGenInputRoot {
- grid-template-columns: 1fr;
- grid-template-rows: 1fr 1fr;
- }
-}
diff --git a/packages/frontend/src/components/MkForm.file.vue b/packages/frontend/src/components/MkForm.file.vue
new file mode 100644
index 0000000000..182ff3ccf5
--- /dev/null
+++ b/packages/frontend/src/components/MkForm.file.vue
@@ -0,0 +1,74 @@
+
+
+
+
+
{{ i18n.ts.selectFile }}
+
{{ friendlyFileName }}
+
+
+
+
+
+
diff --git a/packages/frontend/src/components/MkForm.vue b/packages/frontend/src/components/MkForm.vue
new file mode 100644
index 0000000000..750ffa77df
--- /dev/null
+++ b/packages/frontend/src/components/MkForm.vue
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+ ({{ i18n.ts.optional }})
+ {{ v.description }}
+
+
+ ({{ i18n.ts.optional }})
+ {{ v.description }}
+
+
+ ({{ i18n.ts.optional }})
+ {{ v.description }}
+
+
+
+ {{ v.description }}
+
+
+ ({{ i18n.ts.optional }})
+
+
+ ({{ i18n.ts.optional }})
+
+
+
+ ({{ i18n.ts.optional }})
+ {{ v.description }}
+
+
+
+
+ values[k] = f"
+ />
+
+
+
+
+
+
diff --git a/packages/frontend/src/components/MkFormDialog.file.vue b/packages/frontend/src/components/MkFormDialog.file.vue
deleted file mode 100644
index 182ff3ccf5..0000000000
--- a/packages/frontend/src/components/MkFormDialog.file.vue
+++ /dev/null
@@ -1,74 +0,0 @@
-
-
-
-
-
{{ i18n.ts.selectFile }}
-
{{ friendlyFileName }}
-
-
-
-
-
-
diff --git a/packages/frontend/src/components/MkFormDialog.vue b/packages/frontend/src/components/MkFormDialog.vue
index 142ccb12a3..e598394ec4 100644
--- a/packages/frontend/src/components/MkFormDialog.vue
+++ b/packages/frontend/src/components/MkFormDialog.vue
@@ -20,66 +20,16 @@ SPDX-License-Identifier: AGPL-3.0-only
-
-
-
-
- ({{ i18n.ts.optional }})
- {{ v.description }}
-
-
- ({{ i18n.ts.optional }})
- {{ v.description }}
-
-
- ({{ i18n.ts.optional }})
- {{ v.description }}
-
-
-
- {{ v.description }}
-
-
- ({{ i18n.ts.optional }})
-
-
- ({{ i18n.ts.optional }})
-
-
-
- ({{ i18n.ts.optional }})
- {{ v.description }}
-
-
-
-
- values[k] = f"
- />
-
-
-
+
diff --git a/packages/frontend/src/components/MkImageEffectorDialog.vue b/packages/frontend/src/components/MkImageEffectorDialog.vue
index 3d7801f925..01df7d7496 100644
--- a/packages/frontend/src/components/MkImageEffectorDialog.vue
+++ b/packages/frontend/src/components/MkImageEffectorDialog.vue
@@ -16,37 +16,36 @@ SPDX-License-Identifier: AGPL-3.0-only
>
{{ i18n.ts._imageEffector.title }}
-
-
-
-
-
-
{{ i18n.ts.preview }}
-
-
-
-
-
-
-
+
+
+
+
+
{{ i18n.ts.preview }}
+
+
-
-
-
-
-
-
{{ i18n.ts._imageEffector.addEffect }}
+
+
+
-
-
+
+
+
+
+
+
+ {{ i18n.ts._imageEffector.addEffect }}
+
+
+
@@ -56,15 +55,12 @@ import type { ImageEffectorLayer } from '@/utility/image-effector/ImageEffector.
import { i18n } from '@/i18n.js';
import { ImageEffector } from '@/utility/image-effector/ImageEffector.js';
import MkModalWindow from '@/components/MkModalWindow.vue';
-import MkSelect from '@/components/MkSelect.vue';
+import MkPreviewWithControls from '@/components/MkPreviewWithControls.vue';
import MkButton from '@/components/MkButton.vue';
-import MkInput from '@/components/MkInput.vue';
import XLayer from '@/components/MkImageEffectorDialog.Layer.vue';
import * as os from '@/os.js';
-import { deepClone } from '@/utility/clone.js';
import { FXS } from '@/utility/image-effector/fxs.js';
import { genId } from '@/utility/id.js';
-import { prefer } from '@/preferences.js';
const props = defineProps<{
image: File;
@@ -367,33 +363,6 @@ function onImagePointerdown(ev: PointerEvent) {
diff --git a/packages/frontend/src/components/MkImageEffectorFxForm.vue b/packages/frontend/src/components/MkImageEffectorFxForm.vue
index e581b1f743..51485977a9 100644
--- a/packages/frontend/src/components/MkImageEffectorFxForm.vue
+++ b/packages/frontend/src/components/MkImageEffectorFxForm.vue
@@ -48,7 +48,7 @@ SPDX-License-Identifier: AGPL-3.0-only
- {{ i18n.ts._imageEffector.nothingToConfigure }}
+ {{ i18n.ts.nothingToConfigure }}
diff --git a/packages/frontend/src/components/MkImageFrameEditorDialog.vue b/packages/frontend/src/components/MkImageFrameEditorDialog.vue
index 2a91c85952..0badda3db7 100644
--- a/packages/frontend/src/components/MkImageFrameEditorDialog.vue
+++ b/packages/frontend/src/components/MkImageFrameEditorDialog.vue
@@ -16,140 +16,139 @@ SPDX-License-Identifier: AGPL-3.0-only
>
{{ i18n.ts._imageFrameEditor.title }}
-
-
-
-
-
-
{{ i18n.ts.preview }}
-
-
-
-
-
+
+
+
+
+
{{ i18n.ts.preview }}
+
+
+
+
-
-
-
- {{ i18n.ts._imageFrameEditor.borderThickness }}
-
-
-
{ const c = getRgb(v); if (c != null) params.bgColor = c; }">
- {{ i18n.ts._imageFrameEditor.backgroundColor }}
-
-
-
{ const c = getRgb(v); if (c != null) params.fgColor = c; }">
- {{ i18n.ts._imageFrameEditor.textColor }}
-
-
-
- {{ i18n.ts._imageFrameEditor.font }}
-
-
-
- {{ i18n.ts._imageFrameEditor.header }}
-
-
-
- {{ i18n.ts.show }}
-
-
-
- {{ i18n.ts._imageFrameEditor.labelThickness }}
-
-
-
- {{ i18n.ts._imageFrameEditor.labelScale }}
-
-
-
- {{ i18n.ts._imageFrameEditor.centered }}
-
-
-
- {{ i18n.ts._imageFrameEditor.captionMain }}
-
-
-
- {{ i18n.ts._imageFrameEditor.captionSub }}
-
-
-
- {{ i18n.ts._imageFrameEditor.withQrCode }}
-
-
-
-
-
- {{ i18n.ts._imageFrameEditor.footer }}
-
-
-
- {{ i18n.ts.show }}
-
-
-
- {{ i18n.ts._imageFrameEditor.labelThickness }}
-
-
-
- {{ i18n.ts._imageFrameEditor.labelScale }}
-
-
-
- {{ i18n.ts._imageFrameEditor.centered }}
-
-
-
- {{ i18n.ts._imageFrameEditor.captionMain }}
-
-
-
- {{ i18n.ts._imageFrameEditor.captionSub }}
-
-
-
- {{ i18n.ts._imageFrameEditor.withQrCode }}
-
-
-
-
-
- {{ i18n.ts._imageFrameEditor.availableVariables }}:
- {filename} - {{ i18n.ts._imageEditing._vars.filename }}
- {filename_without_ext} - {{ i18n.ts._imageEditing._vars.filename_without_ext }}
- {caption} - {{ i18n.ts._imageEditing._vars.caption }}
- {year} - {{ i18n.ts._imageEditing._vars.year }}
- {month} - {{ i18n.ts._imageEditing._vars.month }}
- {day} - {{ i18n.ts._imageEditing._vars.day }}
- {hour} - {{ i18n.ts._imageEditing._vars.hour }}
- {minute} - {{ i18n.ts._imageEditing._vars.minute }}
- {second} - {{ i18n.ts._imageEditing._vars.second }}
- {0month} - {{ i18n.ts._imageEditing._vars.month }} ({{ i18n.ts.zeroPadding }})
- {0day} - {{ i18n.ts._imageEditing._vars.day }} ({{ i18n.ts.zeroPadding }})
- {0hour} - {{ i18n.ts._imageEditing._vars.hour }} ({{ i18n.ts.zeroPadding }})
- {0minute} - {{ i18n.ts._imageEditing._vars.minute }} ({{ i18n.ts.zeroPadding }})
- {0second} - {{ i18n.ts._imageEditing._vars.second }} ({{ i18n.ts.zeroPadding }})
- {camera_model} - {{ i18n.ts._imageEditing._vars.camera_model }}
- {camera_lens_model} - {{ i18n.ts._imageEditing._vars.camera_lens_model }}
- {camera_mm} - {{ i18n.ts._imageEditing._vars.camera_mm }}
- {camera_mm_35} - {{ i18n.ts._imageEditing._vars.camera_mm_35 }}
- {camera_f} - {{ i18n.ts._imageEditing._vars.camera_f }}
- {camera_s} - {{ i18n.ts._imageEditing._vars.camera_s }}
- {camera_iso} - {{ i18n.ts._imageEditing._vars.camera_iso }}
- {gps_lat} - {{ i18n.ts._imageEditing._vars.gps_lat }}
- {gps_long} - {{ i18n.ts._imageEditing._vars.gps_long }}
-
-
+
+
+
+
+
+ {{ i18n.ts._imageFrameEditor.borderThickness }}
+
+
+
{ const c = getRgb(v); if (c != null) params.bgColor = c; }">
+ {{ i18n.ts._imageFrameEditor.backgroundColor }}
+
+
+
{ const c = getRgb(v); if (c != null) params.fgColor = c; }">
+ {{ i18n.ts._imageFrameEditor.textColor }}
+
+
+
+ {{ i18n.ts._imageFrameEditor.font }}
+
+
+
+ {{ i18n.ts._imageFrameEditor.header }}
+
+
+
+ {{ i18n.ts.show }}
+
+
+
+ {{ i18n.ts._imageFrameEditor.labelThickness }}
+
+
+
+ {{ i18n.ts._imageFrameEditor.labelScale }}
+
+
+
+ {{ i18n.ts._imageFrameEditor.centered }}
+
+
+
+ {{ i18n.ts._imageFrameEditor.captionMain }}
+
+
+
+ {{ i18n.ts._imageFrameEditor.captionSub }}
+
+
+
+ {{ i18n.ts._imageFrameEditor.withQrCode }}
+
+
+
+
+
+ {{ i18n.ts._imageFrameEditor.footer }}
+
+
+
+ {{ i18n.ts.show }}
+
+
+
+ {{ i18n.ts._imageFrameEditor.labelThickness }}
+
+
+
+ {{ i18n.ts._imageFrameEditor.labelScale }}
+
+
+
+ {{ i18n.ts._imageFrameEditor.centered }}
+
+
+
+ {{ i18n.ts._imageFrameEditor.captionMain }}
+
+
+
+ {{ i18n.ts._imageFrameEditor.captionSub }}
+
+
+
+ {{ i18n.ts._imageFrameEditor.withQrCode }}
+
+
+
+
+
+ {{ i18n.ts._imageFrameEditor.availableVariables }}:
+ {filename} - {{ i18n.ts._imageEditing._vars.filename }}
+ {filename_without_ext} - {{ i18n.ts._imageEditing._vars.filename_without_ext }}
+ {caption} - {{ i18n.ts._imageEditing._vars.caption }}
+ {year} - {{ i18n.ts._imageEditing._vars.year }}
+ {month} - {{ i18n.ts._imageEditing._vars.month }}
+ {day} - {{ i18n.ts._imageEditing._vars.day }}
+ {hour} - {{ i18n.ts._imageEditing._vars.hour }}
+ {minute} - {{ i18n.ts._imageEditing._vars.minute }}
+ {second} - {{ i18n.ts._imageEditing._vars.second }}
+ {0month} - {{ i18n.ts._imageEditing._vars.month }} ({{ i18n.ts.zeroPadding }})
+ {0day} - {{ i18n.ts._imageEditing._vars.day }} ({{ i18n.ts.zeroPadding }})
+ {0hour} - {{ i18n.ts._imageEditing._vars.hour }} ({{ i18n.ts.zeroPadding }})
+ {0minute} - {{ i18n.ts._imageEditing._vars.minute }} ({{ i18n.ts.zeroPadding }})
+ {0second} - {{ i18n.ts._imageEditing._vars.second }} ({{ i18n.ts.zeroPadding }})
+ {camera_model} - {{ i18n.ts._imageEditing._vars.camera_model }}
+ {camera_lens_model} - {{ i18n.ts._imageEditing._vars.camera_lens_model }}
+ {camera_mm} - {{ i18n.ts._imageEditing._vars.camera_mm }}
+ {camera_mm_35} - {{ i18n.ts._imageEditing._vars.camera_mm_35 }}
+ {camera_f} - {{ i18n.ts._imageEditing._vars.camera_f }}
+ {camera_s} - {{ i18n.ts._imageEditing._vars.camera_s }}
+ {camera_iso} - {{ i18n.ts._imageEditing._vars.camera_iso }}
+ {gps_lat} - {{ i18n.ts._imageEditing._vars.gps_lat }}
+ {gps_long} - {{ i18n.ts._imageEditing._vars.gps_long }}
+
-
-
+
+
@@ -161,8 +160,8 @@ import type { ImageFrameParams, ImageFramePreset } from '@/utility/image-frame-r
import { ImageFrameRenderer } from '@/utility/image-frame-renderer/ImageFrameRenderer.js';
import { i18n } from '@/i18n.js';
import MkModalWindow from '@/components/MkModalWindow.vue';
+import MkPreviewWithControls from './MkPreviewWithControls.vue';
import MkSelect from '@/components/MkSelect.vue';
-import MkButton from '@/components/MkButton.vue';
import MkFolder from '@/components/MkFolder.vue';
import MkSwitch from '@/components/MkSwitch.vue';
import MkRange from '@/components/MkRange.vue';
@@ -173,8 +172,6 @@ import * as os from '@/os.js';
import { deepClone } from '@/utility/clone.js';
import { ensureSignin } from '@/i.js';
import { genId } from '@/utility/id.js';
-import { useMkSelect } from '@/composables/use-mkselect.js';
-import { prefer } from '@/preferences.js';
const $i = ensureSignin();
@@ -412,33 +409,6 @@ function getRgb(hex: string | number): [number, number, number] | null {
diff --git a/packages/frontend/src/components/MkPreviewWithControls.vue b/packages/frontend/src/components/MkPreviewWithControls.vue
new file mode 100644
index 0000000000..85cfa2d7e9
--- /dev/null
+++ b/packages/frontend/src/components/MkPreviewWithControls.vue
@@ -0,0 +1,93 @@
+
+
+
+
+
+
+
+
+
diff --git a/packages/frontend/src/components/MkWatermarkEditorDialog.vue b/packages/frontend/src/components/MkWatermarkEditorDialog.vue
index 6cd2111598..7fe497e455 100644
--- a/packages/frontend/src/components/MkWatermarkEditorDialog.vue
+++ b/packages/frontend/src/components/MkWatermarkEditorDialog.vue
@@ -16,50 +16,49 @@ SPDX-License-Identifier: AGPL-3.0-only
>
{{ i18n.ts._watermarkEditor.title }}
-
-
-
-
-
-
{{ i18n.ts.preview }}
-
-
-
-
-
+
+
+
+
+
{{ i18n.ts.preview }}
+
+
+
+
-
-
-
-
-
- {{ i18n.ts._watermarkEditor.text }}
- {{ i18n.ts._watermarkEditor.image }}
- {{ i18n.ts._watermarkEditor.qr }}
- {{ i18n.ts._watermarkEditor.stripe }}
- {{ i18n.ts._watermarkEditor.polkadot }}
- {{ i18n.ts._watermarkEditor.checker }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+ {{ i18n.ts._watermarkEditor.text }}
+ {{ i18n.ts._watermarkEditor.image }}
+ {{ i18n.ts._watermarkEditor.qr }}
+ {{ i18n.ts._watermarkEditor.stripe }}
+ {{ i18n.ts._watermarkEditor.polkadot }}
+ {{ i18n.ts._watermarkEditor.checker }}
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
@@ -69,6 +68,7 @@ import type { WatermarkLayers, WatermarkPreset } from '@/utility/watermark/Water
import { WatermarkRenderer } from '@/utility/watermark/WatermarkRenderer.js';
import { i18n } from '@/i18n.js';
import MkModalWindow from '@/components/MkModalWindow.vue';
+import MkPreviewWithControls from '@/components/MkPreviewWithControls.vue';
import MkSelect from '@/components/MkSelect.vue';
import MkButton from '@/components/MkButton.vue';
import MkFolder from '@/components/MkFolder.vue';
@@ -411,33 +411,6 @@ function removeLayer(layer: WatermarkPreset['layers'][number]) {
diff --git a/packages/frontend/src/components/MkWidgetSettingsDialog.vue b/packages/frontend/src/components/MkWidgetSettingsDialog.vue
new file mode 100644
index 0000000000..cebbe93986
--- /dev/null
+++ b/packages/frontend/src/components/MkWidgetSettingsDialog.vue
@@ -0,0 +1,172 @@
+
+
+
+
+ {{ widgetName }}
+
+
+
+
+
{{ i18n.ts.preview }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/frontend/src/widgets/widget.ts b/packages/frontend/src/widgets/widget.ts
index c5ca7ac26c..6c5ff36b16 100644
--- a/packages/frontend/src/widgets/widget.ts
+++ b/packages/frontend/src/widgets/widget.ts
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-only
*/
-import { reactive, watch } from 'vue';
+import { defineAsyncComponent, reactive, watch } from 'vue';
import type { Reactive } from 'vue';
import { throttle } from 'throttle-debounce';
import type { FormWithDefault, GetFormResultType } from '@/utility/form.js';
@@ -62,11 +62,36 @@ export const useWidgetPropsManager =
(
for (const item of Object.keys(form)) {
form[item].default = widgetProps[item];
}
- const { canceled, result } = await os.form(name, form);
- if (canceled) return;
- for (const key of Object.keys(result)) {
- widgetProps[key] = result[key];
+ const res = await new Promise<{
+ canceled: false;
+ result: GetFormResultType;
+ } | {
+ canceled: true;
+ }>((resolve) => {
+ const { dispose } = os.popup(defineAsyncComponent(() => import('@/components/MkWidgetSettingsDialog.vue')), {
+ widgetName: name,
+ form: form,
+ currentSettings: widgetProps,
+ }, {
+ saved: (newProps: GetFormResultType) => {
+ resolve({ canceled: false, result: newProps });
+ },
+ canceled: () => {
+ resolve({ canceled: true });
+ },
+ closed: () => {
+ dispose();
+ },
+ });
+ });
+
+ if (res.canceled) {
+ return;
+ }
+
+ for (const key of Object.keys(res.result)) {
+ widgetProps[key] = res.result[key];
}
save();
diff --git a/packages/i18n/src/autogen/locale.ts b/packages/i18n/src/autogen/locale.ts
index 96a728da63..d8571483aa 100644
--- a/packages/i18n/src/autogen/locale.ts
+++ b/packages/i18n/src/autogen/locale.ts
@@ -5639,6 +5639,10 @@ export interface Locale extends ILocale {
* ゼロ埋め
*/
"zeroPadding": string;
+ /**
+ * 設定項目はありません
+ */
+ "nothingToConfigure": string;
"_imageEditing": {
"_vars": {
/**
@@ -12763,10 +12767,6 @@ export interface Locale extends ILocale {
* 変更を破棄して終了しますか?
*/
"discardChangesConfirm": string;
- /**
- * 設定項目はありません
- */
- "nothingToConfigure": string;
/**
* 画像の読み込みに失敗しました
*/
--
cgit v1.2.3-freya