feat: add full-screen support to code input (#6453)

#### What type of PR is this?

/area ui
/kind feature
/milestone 2.19.x

#### What this PR does / why we need it:

Code 输入框支持全屏编辑。

<img width="530" alt="image" src="https://github.com/user-attachments/assets/c8465388-10fa-4b04-be52-c6a5bda6a2bc">

<img width="1906" alt="image" src="https://github.com/user-attachments/assets/aa6d14da-ef35-49b9-8d63-fde928d1f8e4">


#### Which issue(s) this PR fixes:

Fixes #6308 

#### Special notes for your reviewer:

需要在任意 Code 输入框中测试全屏功能是否正常。

#### Does this PR introduce a user-facing change?

```release-note
Code 输入框支持全屏编辑。
```
pull/6470/head
Ryan Wang 2024-08-13 11:44:56 +08:00 committed by GitHub
parent ddd59680e9
commit c2ac19f9d3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 247 additions and 18 deletions

View File

@ -108,7 +108,7 @@
},
"devDependencies": {
"@changesets/cli": "^2.25.2",
"@iconify/json": "^2.2.117",
"@iconify/json": "^2.2.235",
"@intlify/unplugin-vue-i18n": "^4.0.0",
"@rushstack/eslint-patch": "^1.3.2",
"@tailwindcss/aspect-ratio": "^0.4.2",
@ -151,7 +151,7 @@
"tailwindcss-safe-area": "^0.2.2",
"tailwindcss-themer": "^2.0.3",
"typescript": "~5.5.4",
"unplugin-icons": "^0.14.15",
"unplugin-icons": "^0.19.2",
"vite": "^5.2.11",
"vite-plugin-externals": "^0.6.2",
"vite-plugin-html": "^3.2.2",

View File

@ -208,8 +208,8 @@ importers:
specifier: ^2.25.2
version: 2.25.2
'@iconify/json':
specifier: ^2.2.117
version: 2.2.147
specifier: ^2.2.235
version: 2.2.235
'@intlify/unplugin-vue-i18n':
specifier: ^4.0.0
version: 4.0.0(rollup@4.17.2)(vue-i18n@9.13.1(vue@3.4.27(typescript@5.5.4)))
@ -337,8 +337,8 @@ importers:
specifier: ~5.5.4
version: 5.5.4
unplugin-icons:
specifier: ^0.14.15
version: 0.14.15(@vue/compiler-sfc@3.4.27)(vue-template-compiler@2.7.14)
specifier: ^0.19.2
version: 0.19.2(@vue/compiler-sfc@3.4.27)(vue-template-compiler@2.7.14)
vite:
specifier: ^5.2.11
version: 5.2.11(@types/node@18.13.0)(less@4.2.0)(sass@1.60.0)(terser@5.31.0)
@ -649,6 +649,12 @@ packages:
'@antfu/install-pkg@0.1.1':
resolution: {integrity: sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ==}
'@antfu/install-pkg@0.3.3':
resolution: {integrity: sha512-nHHsk3NXQ6xkCfiRRC8Nfrg8pU5kkr3P3Y9s9dKqiuRmBD0Yap7fymNDjGFKeWhZQHqqbCS5CfeMy9wtExM24w==}
'@antfu/utils@0.7.10':
resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==}
'@antfu/utils@0.7.6':
resolution: {integrity: sha512-pvFiLP2BeOKA/ZOS6jxx4XhKzdVLHDhGlFEaZ2flWWYf2xOqVniqpk38I04DFRyz+L0ASggl7SkItTc+ZLju4w==}
@ -2449,12 +2455,18 @@ packages:
'@iconify/json@2.2.147':
resolution: {integrity: sha512-VTW1vVivOq5RVcZu7xqCXWptGH7fo6VPsUxT5QBlbBS042859YZnK1JTXHJu4InMuTwQC/3KLP+InJJ5kawOGg==}
'@iconify/json@2.2.235':
resolution: {integrity: sha512-8a5r/uIZY3DvJPCkRCMly0BgmsxItMTR6RjGnifQ0kGrLSE7TpdYIfQya9Ckd2qfWjD20WZmWblpFm1FcF6ybQ==}
'@iconify/types@2.0.0':
resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
'@iconify/utils@2.1.12':
resolution: {integrity: sha512-7vf3Uk6H7TKX4QMs2gbg5KR1X9J0NJzKSRNWhMZ+PWN92l0t6Q3tj2ZxLDG07rC3ppWBtTtA4FPmkQphuEmdsg==}
'@iconify/utils@2.1.30':
resolution: {integrity: sha512-bY0IO5xLOlbzJBnjWLxknp6Sss3yla03sVY9VeUz9nT6dbc+EGKlLfCt+6uytJnWm5CUvTF/BNotsLWF7kI61A==}
'@interactjs/actions@1.10.17':
resolution: {integrity: sha512-wyB1ZqpaZy5gmz6VDqK9KWh98xKnFgL7VyLvxHODFi9V0IYX4HJAAOBlhtfze0D1R1f1cY+gqPDK+dLaHMlE+w==}
peerDependencies:
@ -2651,6 +2663,10 @@ packages:
'@jridgewell/trace-mapping@0.3.25':
resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
'@jsdevtools/ez-spawn@3.0.4':
resolution: {integrity: sha512-f5DRIOZf7wxogefH03RjMPMdBF7ADTWUMoOs9kaJo06EfwF+aFhMZMDZxHg/Xe12hptN9xoZjGso2fdjapBRIA==}
engines: {node: '>=10'}
'@juggle/resize-observer@3.4.0':
resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==}
@ -4545,6 +4561,11 @@ packages:
engines: {node: '>=0.4.0'}
hasBin: true
acorn@8.12.1:
resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==}
engines: {node: '>=0.4.0'}
hasBin: true
acorn@8.8.2:
resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==}
engines: {node: '>=0.4.0'}
@ -4969,6 +4990,9 @@ packages:
resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==}
engines: {node: '>= 0.4'}
call-me-maybe@1.0.2:
resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==}
callsites@3.1.0:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
engines: {node: '>=6'}
@ -5045,6 +5069,10 @@ packages:
resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
engines: {node: '>= 8.10.0'}
chokidar@3.6.0:
resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
engines: {node: '>= 8.10.0'}
chownr@1.1.4:
resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==}
@ -5215,6 +5243,9 @@ packages:
engines: {node: '>=10.0.0'}
hasBin: true
confbox@0.1.7:
resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==}
config-chain@1.1.13:
resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==}
@ -5430,6 +5461,15 @@ packages:
supports-color:
optional: true
debug@4.3.6:
resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==}
engines: {node: '>=6.0'}
peerDependencies:
supports-color: '*'
peerDependenciesMeta:
supports-color:
optional: true
decamelize-keys@1.1.0:
resolution: {integrity: sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==}
engines: {node: '>=0.10.0'}
@ -7377,6 +7417,10 @@ packages:
resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==}
engines: {node: '>=14'}
local-pkg@0.5.0:
resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==}
engines: {node: '>=14'}
locate-path@3.0.0:
resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==}
engines: {node: '>=6'}
@ -7723,6 +7767,9 @@ packages:
mlly@1.4.2:
resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==}
mlly@1.7.1:
resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==}
mri@1.2.0:
resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
engines: {node: '>=4'}
@ -8249,6 +8296,9 @@ packages:
pkg-types@1.0.3:
resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==}
pkg-types@1.1.3:
resolution: {integrity: sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==}
pngjs@5.0.0:
resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==}
engines: {node: '>=10.13.0'}
@ -9768,6 +9818,9 @@ packages:
ufo@1.3.2:
resolution: {integrity: sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==}
ufo@1.5.4:
resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==}
uglify-js@3.17.4:
resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==}
engines: {node: '>=0.8.0'}
@ -9856,6 +9909,30 @@ packages:
vue-template-es2015-compiler:
optional: true
unplugin-icons@0.19.2:
resolution: {integrity: sha512-QkQJ/Iz3PFr/EoiOvFUQYvqbbJZ7Vs3hObKAFHh5eywTU1PQagSNeXKGRD+JpzXSTnUNLtG0u/xEA5Ec2OeANQ==}
peerDependencies:
'@svgr/core': '>=7.0.0'
'@svgx/core': ^1.0.1
'@vue/compiler-sfc': ^3.0.2 || ^2.7.0
vue-template-compiler: ^2.6.12
vue-template-es2015-compiler: ^1.9.0
peerDependenciesMeta:
'@svgr/core':
optional: true
'@svgx/core':
optional: true
'@vue/compiler-sfc':
optional: true
vue-template-compiler:
optional: true
vue-template-es2015-compiler:
optional: true
unplugin@1.12.1:
resolution: {integrity: sha512-aXEH9c5qi3uYZHo0niUtxDlT9ylG/luMW/dZslSCkbtC31wCyFkmM0kyoBBh+Grhn7CL+/kvKLfN61/EdxPxMQ==}
engines: {node: '>=14.0.0'}
unplugin@1.5.1:
resolution: {integrity: sha512-0QkvG13z6RD+1L1FoibQqnvTwVBXvS4XSPwAyinVgoOCl2jAgwzdUKmEj05o4Lt8xwQI85Hb6mSyYkcAGwZPew==}
@ -10274,6 +10351,9 @@ packages:
webpack-virtual-modules@0.6.1:
resolution: {integrity: sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==}
webpack-virtual-modules@0.6.2:
resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
webpack@5.89.0:
resolution: {integrity: sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==}
engines: {node: '>=10.13.0'}
@ -10560,6 +10640,12 @@ snapshots:
execa: 5.1.1
find-up: 5.0.0
'@antfu/install-pkg@0.3.3':
dependencies:
'@jsdevtools/ez-spawn': 3.0.4
'@antfu/utils@0.7.10': {}
'@antfu/utils@0.7.6': {}
'@antfu/utils@0.7.7': {}
@ -12802,6 +12888,11 @@ snapshots:
'@iconify/types': 2.0.0
pathe: 1.1.1
'@iconify/json@2.2.235':
dependencies:
'@iconify/types': 2.0.0
pathe: 1.1.2
'@iconify/types@2.0.0': {}
'@iconify/utils@2.1.12':
@ -12815,6 +12906,18 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@iconify/utils@2.1.30':
dependencies:
'@antfu/install-pkg': 0.1.1
'@antfu/utils': 0.7.10
'@iconify/types': 2.0.0
debug: 4.3.6
kolorist: 1.8.0
local-pkg: 0.5.0
mlly: 1.7.1
transitivePeerDependencies:
- supports-color
'@interactjs/actions@1.10.17(@interactjs/core@1.10.17(@interactjs/utils@1.10.17))(@interactjs/utils@1.10.17)':
dependencies:
'@interactjs/core': 1.10.17(@interactjs/utils@1.10.17)
@ -13079,6 +13182,13 @@ snapshots:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.4.15
'@jsdevtools/ez-spawn@3.0.4':
dependencies:
call-me-maybe: 1.0.2
cross-spawn: 7.0.3
string-argv: 0.3.1
type-detect: 4.0.8
'@juggle/resize-observer@3.4.0': {}
'@lezer/common@1.0.1': {}
@ -15655,6 +15765,8 @@ snapshots:
acorn@8.11.3: {}
acorn@8.12.1: {}
acorn@8.8.2: {}
address@1.2.2: {}
@ -16150,6 +16262,8 @@ snapshots:
get-intrinsic: 1.2.4
set-function-length: 1.2.2
call-me-maybe@1.0.2: {}
callsites@3.1.0: {}
camel-case@4.1.2:
@ -16226,6 +16340,18 @@ snapshots:
optionalDependencies:
fsevents: 2.3.2
chokidar@3.6.0:
dependencies:
anymatch: 3.1.2
braces: 3.0.2
glob-parent: 5.1.2
is-binary-path: 2.1.0
is-glob: 4.0.3
normalize-path: 3.0.0
readdirp: 3.6.0
optionalDependencies:
fsevents: 2.3.3
chownr@1.1.4: {}
chownr@2.0.0: {}
@ -16396,6 +16522,8 @@ snapshots:
tree-kill: 1.2.2
yargs: 16.2.0
confbox@0.1.7: {}
config-chain@1.1.13:
dependencies:
ini: 1.3.8
@ -16645,6 +16773,10 @@ snapshots:
optionalDependencies:
supports-color: 8.1.1
debug@4.3.6:
dependencies:
ms: 2.1.2
decamelize-keys@1.1.0:
dependencies:
decamelize: 1.2.0
@ -18935,6 +19067,11 @@ snapshots:
local-pkg@0.4.3: {}
local-pkg@0.5.0:
dependencies:
mlly: 1.4.2
pkg-types: 1.0.3
locate-path@3.0.0:
dependencies:
p-locate: 3.0.0
@ -19245,7 +19382,7 @@ snapshots:
mlly@1.4.0:
dependencies:
acorn: 8.10.0
acorn: 8.11.3
pathe: 1.1.2
pkg-types: 1.0.3
ufo: 1.2.0
@ -19257,6 +19394,13 @@ snapshots:
pkg-types: 1.0.3
ufo: 1.3.2
mlly@1.7.1:
dependencies:
acorn: 8.11.3
pathe: 1.1.2
pkg-types: 1.1.3
ufo: 1.5.4
mri@1.2.0: {}
mrmime@1.0.1: {}
@ -19753,6 +19897,12 @@ snapshots:
mlly: 1.4.2
pathe: 1.1.2
pkg-types@1.1.3:
dependencies:
confbox: 0.1.7
mlly: 1.7.1
pathe: 1.1.2
pngjs@5.0.0: {}
polished@4.2.2:
@ -21251,7 +21401,7 @@ snapshots:
terser@5.24.0:
dependencies:
'@jridgewell/source-map': 0.3.5
acorn: 8.11.2
acorn: 8.11.3
commander: 2.20.3
source-map-support: 0.5.21
@ -21498,6 +21648,8 @@ snapshots:
ufo@1.3.2: {}
ufo@1.5.4: {}
uglify-js@3.17.4:
optional: true
@ -21603,6 +21755,28 @@ snapshots:
transitivePeerDependencies:
- supports-color
unplugin-icons@0.19.2(@vue/compiler-sfc@3.4.27)(vue-template-compiler@2.7.14):
dependencies:
'@antfu/install-pkg': 0.3.3
'@antfu/utils': 0.7.10
'@iconify/utils': 2.1.30
debug: 4.3.6
kolorist: 1.8.0
local-pkg: 0.5.0
unplugin: 1.12.1
optionalDependencies:
'@vue/compiler-sfc': 3.4.27
vue-template-compiler: 2.7.14
transitivePeerDependencies:
- supports-color
unplugin@1.12.1:
dependencies:
acorn: 8.12.1
chokidar: 3.6.0
webpack-sources: 3.2.3
webpack-virtual-modules: 0.6.2
unplugin@1.5.1:
dependencies:
acorn: 8.11.2
@ -22145,6 +22319,8 @@ snapshots:
webpack-virtual-modules@0.6.1: {}
webpack-virtual-modules@0.6.2: {}
webpack@5.89.0(esbuild@0.18.20):
dependencies:
'@types/eslint-scope': 3.7.7

View File

@ -1,6 +1,9 @@
<script lang="ts" setup>
import type { FormKitFrameworkContext } from "@formkit/core";
import type { PropType } from "vue";
import { VButton, VPageHeader } from "@halo-dev/components";
import { useEventListener } from "@vueuse/core";
import { computed, ref, type PropType } from "vue";
import RiFullscreenLine from "~icons/ri/fullscreen-line";
const props = defineProps({
context: {
@ -9,24 +12,62 @@ const props = defineProps({
},
});
const height = props.context.height as string;
const codeInputWrapperRef = ref();
const language = props.context.language as string;
const onChange = (value: string) => {
props.context.node.input(value);
};
const fullscreen = ref(false);
const height = computed(() => {
return fullscreen.value ? "100%" : (props.context.height as string);
});
useEventListener(codeInputWrapperRef, "keydown", (e: KeyboardEvent) => {
if (e.key === "Escape" && fullscreen.value) {
fullscreen.value = false;
}
});
</script>
<template>
<Suspense>
<VCodemirror
:model-value="props.context._value"
v-bind="context.attrs"
:height="height"
:language="language"
class="block w-full"
@change="onChange"
/>
<div
ref="codeInputWrapperRef"
:style="{ height }"
:class="{ '!fixed inset-0 z-[999] !block bg-white': fullscreen }"
class="group relative w-full"
>
<VPageHeader v-if="fullscreen" :title="context.label" class="border-b">
<template #actions>
<VButton @click="fullscreen = false">
{{ $t("core.formkit.code.fullscreen.exit") }}
</VButton>
</template>
</VPageHeader>
<VCodemirror
:model-value="props.context._value"
v-bind="context.attrs"
height="100%"
:language="language"
class="block w-full"
@change="onChange"
/>
<button
v-if="!fullscreen"
v-tooltip="$t('core.formkit.code.fullscreen.enter')"
class="absolute bottom-2 right-2 inline-flex cursor-pointer items-center justify-center rounded-full bg-primary p-1.5 text-white opacity-0 transition-all hover:!opacity-90 hover:shadow group-hover:opacity-100"
@click="fullscreen = true"
>
<RiFullscreenLine class="text-xs" />
</button>
</div>
<template #fallback>
<span class="p-1 text-xs text-gray-400">
{{ $t("core.common.status.loading") }}...

View File

@ -1725,6 +1725,10 @@ core:
fields:
description: Description
string_data: String Data
code:
fullscreen:
exit: Exit fullscreen
enter: Enter fullscreen to edit
common:
buttons:
save: Save

View File

@ -1640,6 +1640,10 @@ core:
fields:
description: 备注
string_data: 字符串数据
code:
fullscreen:
exit: 退出全屏
enter: 全屏编辑
common:
buttons:
save: 保存

View File

@ -1597,6 +1597,10 @@ core:
fields:
description: 備註
string_data: 字符串數據
code:
fullscreen:
exit: 退出全屏
enter: 全屏编辑
common:
buttons:
save: 保存