Compare commits
111 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
731212264c | ||
|
|
3a8dcbe22f | ||
|
|
6cbe76096b | ||
|
|
039170eae5 | ||
|
|
14ddd8b53c | ||
|
|
b60aadc4a3 | ||
|
|
79ee6607ca | ||
|
|
fe9fbe899d | ||
|
|
a196c4192a | ||
|
|
0f1085756c | ||
|
|
83f103b991 | ||
|
|
13f5446163 | ||
|
|
96c496caba | ||
|
|
7c2a59615f | ||
|
|
0ea972e4f3 | ||
|
|
d1eb252380 | ||
|
|
3e038c58a3 | ||
|
|
2cb72a607b | ||
|
|
2f7d8e5816 | ||
|
|
1337b21789 | ||
|
|
35f1b38c1b | ||
|
|
f1d613274d | ||
|
|
2423b7351d | ||
|
|
36b3b338ea | ||
|
|
103c10890e | ||
|
|
f182403a4e | ||
|
|
15b187f3f7 | ||
|
|
ed00f8f60e | ||
|
|
93a6df85dd | ||
|
|
e26028c5fb | ||
|
|
90bfa87995 | ||
|
|
414e980647 | ||
|
|
78bb85350a | ||
|
|
5a9ef1add8 | ||
|
|
e573e3d964 | ||
|
|
2d4848bdee | ||
|
|
43eb5a78e7 | ||
|
|
03a0260b46 | ||
|
|
cb9c081a52 | ||
|
|
fd652042c5 | ||
|
|
2c8316288d | ||
|
|
2a763ab384 | ||
|
|
44ec37a518 | ||
|
|
3ab726d7fb | ||
|
|
8ba2e15db0 | ||
|
|
c506ab75c1 | ||
|
|
1c088d2605 | ||
|
|
0e4be12a9f | ||
|
|
2002410e08 | ||
|
|
f4e1f06662 | ||
|
|
f2eef85206 | ||
|
|
4a701dd323 | ||
|
|
1128e230c6 | ||
|
|
48ee263c27 | ||
|
|
1a71848acd | ||
|
|
c79d0ee603 | ||
|
|
ac3b4a012b | ||
|
|
08b8fa6fdb | ||
|
|
9244af0ac4 | ||
|
|
c1f426c85c | ||
|
|
6b9402d593 | ||
|
|
9c252d0931 | ||
|
|
240211c769 | ||
|
|
dff78d9e0a | ||
|
|
0bcf23d18e | ||
|
|
1907771e73 | ||
|
|
3974dc7a97 | ||
|
|
a624881791 | ||
|
|
9df668a054 | ||
|
|
180ea7880b | ||
|
|
c952cf4057 | ||
|
|
73ce0d23ae | ||
|
|
fdb4a0892c | ||
|
|
57960120a4 | ||
|
|
d74611e04f | ||
|
|
acc0a9ad19 | ||
|
|
f809fb2fe7 | ||
|
|
feebdadaa5 | ||
|
|
8967d236fe | ||
|
|
6afcaec446 | ||
|
|
48890be4dc | ||
|
|
0ed93977bc | ||
|
|
a2d1100123 | ||
|
|
160d901358 | ||
|
|
0c613187bf | ||
|
|
1128b5ac65 | ||
|
|
c6ec07fa17 | ||
|
|
3f578fdfa9 | ||
|
|
c5cb1bbb06 | ||
|
|
3001e9f3cc | ||
|
|
eb5bdd6119 | ||
|
|
802e34890a | ||
|
|
1041429e84 | ||
|
|
5139453ae9 | ||
|
|
7b6be79bb0 | ||
|
|
3469771a02 | ||
|
|
65f15c54f4 | ||
|
|
e7478aecc6 | ||
|
|
69a18bdcea | ||
|
|
83f15b65a4 | ||
|
|
b16fc4dfbb | ||
|
|
40f7ca5a2f | ||
|
|
ab3988e253 | ||
|
|
c6cfc02e5d | ||
|
|
f93b6bae3e | ||
|
|
1b88ff9932 | ||
|
|
6e964a58c1 | ||
|
|
01b45e43b8 | ||
|
|
4f11c8347a | ||
|
|
e4530ee5ca | ||
|
|
e6d93bbf5d |
1
.frontmatter/database/pinnedItemsDb.json
Normal file
@@ -0,0 +1 @@
|
||||
{}
|
||||
22
.github/workflows/release-beta.yml
vendored
@@ -7,25 +7,33 @@ on:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: "Build and release"
|
||||
name: 'Build and release'
|
||||
runs-on: ubuntu-latest
|
||||
environment:
|
||||
name: Beta
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 16
|
||||
node-version: 18
|
||||
registry-url: https://registry.npmjs.org/
|
||||
|
||||
- name: Install the dependencies
|
||||
run: npm i
|
||||
|
||||
run: npm ci
|
||||
|
||||
- name: Prepare BETA
|
||||
run: node scripts/beta-release.js $GITHUB_RUN_ID
|
||||
|
||||
- name: Run localization sync
|
||||
run: npm run localization:sync
|
||||
env:
|
||||
TRANSLATION_API_KEY: ${{ secrets.TRANSLATION_API_KEY }}
|
||||
TRANSLATION_API_LOCATION: ${{ secrets.TRANSLATION_API_LOCATION }}
|
||||
TRANSLATION_API_URL: ${{ secrets.TRANSLATION_API_URL }}
|
||||
|
||||
- name: Publish
|
||||
run: npx @vscode/vsce publish -p ${{ secrets.VSCE_PAT }} --baseImagesUrl https://raw.githubusercontent.com/estruyf/vscode-front-matter/dev
|
||||
|
||||
- name: Publish to open-vsx.org
|
||||
run: npx ovsx publish -p ${{ secrets.OPEN_VSX_PAT }}
|
||||
|
||||
|
||||
23
.github/workflows/release.yml
vendored
@@ -7,24 +7,33 @@ on:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: "Build and release"
|
||||
name: 'Build and release'
|
||||
runs-on: ubuntu-latest
|
||||
environment:
|
||||
name: Stable
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 16
|
||||
node-version: 18
|
||||
registry-url: https://registry.npmjs.org/
|
||||
|
||||
- name: Install the dependencies
|
||||
run: npm i
|
||||
|
||||
run: npm ci
|
||||
|
||||
- name: Prepare MAIN release
|
||||
run: node scripts/main-release.js
|
||||
|
||||
- name: Run localization sync
|
||||
run: npm run localization:sync
|
||||
env:
|
||||
TRANSLATION_API_KEY: ${{ secrets.TRANSLATION_API_KEY }}
|
||||
TRANSLATION_API_LOCATION: ${{ secrets.TRANSLATION_API_LOCATION }}
|
||||
TRANSLATION_API_URL: ${{ secrets.TRANSLATION_API_URL }}
|
||||
|
||||
- name: Publish
|
||||
run: npx @vscode/vsce publish -p ${{ secrets.VSCE_PAT }}
|
||||
|
||||
- name: Publish to open-vsx.org
|
||||
run: npx ovsx publish -p ${{ secrets.OPEN_VSX_PAT }}
|
||||
run: npx ovsx publish -p ${{ secrets.OPEN_VSX_PAT }}
|
||||
|
||||
3
.gitignore
vendored
@@ -11,4 +11,5 @@ e2e/extensions
|
||||
e2e/sample
|
||||
|
||||
localization.log
|
||||
localization.md
|
||||
localization.md
|
||||
.env
|
||||
|
||||
91
CHANGELOG.md
@@ -1,5 +1,95 @@
|
||||
# Change Log
|
||||
|
||||
## [9.4.0] - 2023-xx-xx
|
||||
|
||||
### ✨ New features
|
||||
|
||||
### 🎨 Enhancements
|
||||
|
||||
- [#273](https://github.com/estruyf/vscode-front-matter/issues/273): Allow single value arrays to be set as a string with the `singleValueAsString` field property
|
||||
- [#686](https://github.com/estruyf/vscode-front-matter/issues/686): Allow script authors to ask questions during script execution
|
||||
- [#688](https://github.com/estruyf/vscode-front-matter/issues/688): Allow to show the scheduled articles in the content dashboard (filter and group)
|
||||
|
||||
### ⚡️ Optimizations
|
||||
|
||||
- Dashboard layout grid optimizations
|
||||
- Added the content-type name to the metadata section in the panel
|
||||
|
||||
### 🐞 Fixes
|
||||
|
||||
- [#685](https://github.com/estruyf/vscode-front-matter/issues/685): Fix when using non-string values in the tag picker
|
||||
- [#691](https://github.com/estruyf/vscode-front-matter/issues/691): Silent authentication retrieval for GitHub sponsors
|
||||
- [#694](https://github.com/estruyf/vscode-front-matter/issues/694): Start terminal session from the folder where the `frontmatter.json` file is located
|
||||
- [#696](https://github.com/estruyf/vscode-front-matter/issues/696): Close the local server terminal on restart
|
||||
- [#699](https://github.com/estruyf/vscode-front-matter/issues/699): Changing border theme variable for the dashboard header
|
||||
|
||||
## [9.3.1] - 2023-10-27
|
||||
|
||||
### 🐞 Fixes
|
||||
|
||||
- [#697](https://github.com/estruyf/vscode-front-matter/issues/697): Fix missing localization key
|
||||
|
||||
## [9.3.0] - 2023-10-06 - [Release notes](https://beta.frontmatter.codes/updates/v9.3.0)
|
||||
|
||||
### ✨ New features
|
||||
|
||||
- [#80](https://github.com/estruyf/vscode-front-matter/issues/80): Minimal settings view for the Front Matter CMS
|
||||
- [#553](https://github.com/estruyf/vscode-front-matter/issues/553): New `frontMatter.config.dynamicFilePath` setting which allows you to dynamically update the settings from a custom JS file
|
||||
- [#563](https://github.com/estruyf/vscode-front-matter/issues/563): New `fieldCollection` to inherit/reuse fields in multiple content-types
|
||||
- [#653](https://github.com/estruyf/vscode-front-matter/issues/653): Retrieve the Astro Content Collections to allow content type generation
|
||||
- [#675](https://github.com/estruyf/vscode-front-matter/issues/675): Pinning content to the top of the content dashboard
|
||||
|
||||
### 🎨 Enhancements
|
||||
|
||||
- [#517](https://github.com/estruyf/vscode-front-matter/issues/517): Add `contentTypes` property to custom scripts to show/hide custom actions
|
||||
- [#517](https://github.com/estruyf/vscode-front-matter/issues/517): Added `frontMatter.panel.actions.disabled` setting to define which actions should be hidden
|
||||
- [#638](https://github.com/estruyf/vscode-front-matter/issues/638): Add Hexo support for the `_drafts` folder
|
||||
- [#659](https://github.com/estruyf/vscode-front-matter/issues/659): Implement a filter for the taxonomy dashboard
|
||||
- [#662](https://github.com/estruyf/vscode-front-matter/issues/662): Always show the `all articles` tab with the page counter
|
||||
- [#663](https://github.com/estruyf/vscode-front-matter/issues/663): Make card tags clickable to filter the view
|
||||
- [#669](https://github.com/estruyf/vscode-front-matter/issues/669): Add the video preview to the details panel + caption field
|
||||
- [#674](https://github.com/estruyf/vscode-front-matter/issues/674): Specify to disable content creation for a specific page folder
|
||||
- [#676](https://github.com/estruyf/vscode-front-matter/issues/676): Allow the `frontmatter.json` file to be placed in a sub-directory
|
||||
- [#677](https://github.com/estruyf/vscode-front-matter/issues/677): Added support for [Browse Lite](https://marketplace.visualstudio.com/items?itemName=antfu.browse-lite) extension to open preview when installed
|
||||
|
||||
### 🐞 Fixes
|
||||
|
||||
- [#623](https://github.com/estruyf/vscode-front-matter/issues/623): Fix issue where metadata is not maintained on file move
|
||||
- [#629](https://github.com/estruyf/vscode-front-matter/issues/629): Fix array indent to the new property
|
||||
- [#660](https://github.com/estruyf/vscode-front-matter/issues/660): Allow only to select unique content relationship values
|
||||
- [#661](https://github.com/estruyf/vscode-front-matter/issues/661): Fixing the dropdowns when used at the bottom of a collapsible group
|
||||
- [#664](https://github.com/estruyf/vscode-front-matter/issues/664): Fix for parsing draft status in Hexo and Jekyll
|
||||
- [#665](https://github.com/estruyf/vscode-front-matter/issues/665): Added `dev` parameter to Nuxt script
|
||||
- [#668](https://github.com/estruyf/vscode-front-matter/issues/668): Reset pagination on media search
|
||||
- [#678](https://github.com/estruyf/vscode-front-matter/issues/678): Check field type of `tags` fields for tags rendering on item cards
|
||||
- [#681](https://github.com/estruyf/vscode-front-matter/issues/681): Fix SVG icons which are used in the VSCode UI
|
||||
|
||||
## [9.2.0] - 2023-09-11
|
||||
|
||||
### ✨ New features
|
||||
|
||||
- [#650](https://github.com/estruyf/vscode-front-matter/issues/650): Added template support for [Astro Starlight](https://starlight.astro.build/)
|
||||
- [#655](https://github.com/estruyf/vscode-front-matter/issues/655): Added a new command to manually refresh the settings of the Front Matter CMS
|
||||
|
||||
### 🎨 Enhancements
|
||||
|
||||
- Grouping and status tabs enhancements
|
||||
- Removed the status bar item to toggle the draft field
|
||||
- Added a FM status bar item to open the dashboard
|
||||
- [#570](https://github.com/estruyf/vscode-front-matter/issues/570): Clear empty values on content creation and editing
|
||||
- [#645](https://github.com/estruyf/vscode-front-matter/issues/645): French localization added (thanks to [Clément Barbaza](https://github.com/cba85))
|
||||
- [#649](https://github.com/estruyf/vscode-front-matter/issues/649): Parse optional variables from snippets
|
||||
- [#652](https://github.com/estruyf/vscode-front-matter/issues/652): Show the start/stop server buttons depending on the local terminal session
|
||||
- [#654](https://github.com/estruyf/vscode-front-matter/issues/654): Added a new action to open the content in the browser
|
||||
|
||||
### 🐞 Fixes
|
||||
|
||||
- [#646](https://github.com/estruyf/vscode-front-matter/issues/646): Update the Astro `3000` port to `4321`
|
||||
- [#647](https://github.com/estruyf/vscode-front-matter/issues/647): Fix the open in browser action on the preview
|
||||
- [#648](https://github.com/estruyf/vscode-front-matter/issues/648): Fix the global configuration reference to the URL of the schema file
|
||||
- [#651](https://github.com/estruyf/vscode-front-matter/issues/651): Fix settings listeners which did not push updates to the webviews
|
||||
- [#657](https://github.com/estruyf/vscode-front-matter/issues/657): Fix correctly updating front matter with scripts outcome on Windows
|
||||
|
||||
## [9.1.0] - 2023-08-31
|
||||
|
||||
### ✨ New features
|
||||
@@ -20,7 +110,6 @@
|
||||
- [#636](https://github.com/estruyf/vscode-front-matter/issues/636): Fix media browser lightbox background color
|
||||
- [#641](https://github.com/estruyf/vscode-front-matter/issues/641): Fix file parsing of the localization file
|
||||
|
||||
|
||||
## [9.0.0] - 2023-08-21 - [Release notes](https://beta.frontmatter.codes/updates/v9.0.0)
|
||||
|
||||
### 🌎 Multilingual support
|
||||
|
||||
BIN
assets/frontmatter.woff
Normal file
@@ -1,4 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="44" height="44" viewBox="0 0 24 24" stroke-width="2" stroke="#C5C5C5" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" stroke-width="2" stroke="#C5C5C5" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||
<path d="M6 15h15" />
|
||||
<path d="M21 19h-15" />
|
||||
|
||||
|
Before Width: | Height: | Size: 449 B After Width: | Height: | Size: 449 B |
@@ -1,4 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="44" height="44" viewBox="0 0 24 24" stroke-width="2" stroke="#424242" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" stroke-width="2" stroke="#424242" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||
<path d="M6 15h15" />
|
||||
<path d="M21 19h-15" />
|
||||
|
||||
|
Before Width: | Height: | Size: 449 B After Width: | Height: | Size: 449 B |
@@ -1,4 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="44" height="44" viewBox="0 0 24 24" stroke-width="2" stroke="#C5C5C5" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" stroke-width="2" stroke="#C5C5C5" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||
<path d="M7 5h6a3.5 3.5 0 0 1 0 7h-6z" />
|
||||
<path d="M13 12h1a3.5 3.5 0 0 1 0 7h-7v-7" />
|
||||
|
||||
|
Before Width: | Height: | Size: 329 B After Width: | Height: | Size: 329 B |
@@ -1,4 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="44" height="44" viewBox="0 0 24 24" stroke-width="2" stroke="#424242" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" stroke-width="2" stroke="#424242" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||
<path d="M7 5h6a3.5 3.5 0 0 1 0 7h-6z" />
|
||||
<path d="M13 12h1a3.5 3.5 0 0 1 0 7h-7v-7" />
|
||||
|
||||
|
Before Width: | Height: | Size: 329 B After Width: | Height: | Size: 329 B |
@@ -1,4 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 32 32">
|
||||
<path fill="#C5C5C5" d="M16 19a6.99 6.99 0 0 1-5.833-3.129l1.666-1.107a5 5 0 0 0 8.334 0l1.666 1.107A6.99 6.99 0 0 1 16 19zm4-11a2 2 0 1 0 2 2a1.98 1.98 0 0 0-2-2zm-8 0a2 2 0 1 0 2 2a1.98 1.98 0 0 0-2-2z"/>
|
||||
<path fill="#C5C5C5" d="M17.736 30L16 29l4-7h6a1.997 1.997 0 0 0 2-2V6a1.997 1.997 0 0 0-2-2H6a1.997 1.997 0 0 0-2 2v14a1.997 1.997 0 0 0 2 2h9v2H6a4 4 0 0 1-4-4V6a3.999 3.999 0 0 1 4-4h20a3.999 3.999 0 0 1 4 4v14a4 4 0 0 1-4 4h-4.835Z"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 540 B After Width: | Height: | Size: 540 B |
@@ -1,4 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 32 32">
|
||||
<path fill="#424242" d="M16 19a6.99 6.99 0 0 1-5.833-3.129l1.666-1.107a5 5 0 0 0 8.334 0l1.666 1.107A6.99 6.99 0 0 1 16 19zm4-11a2 2 0 1 0 2 2a1.98 1.98 0 0 0-2-2zm-8 0a2 2 0 1 0 2 2a1.98 1.98 0 0 0-2-2z"/>
|
||||
<path fill="#424242" d="M17.736 30L16 29l4-7h6a1.997 1.997 0 0 0 2-2V6a1.997 1.997 0 0 0-2-2H6a1.997 1.997 0 0 0-2 2v14a1.997 1.997 0 0 0 2 2h9v2H6a4 4 0 0 1-4-4V6a3.999 3.999 0 0 1 4-4h20a3.999 3.999 0 0 1 4 4v14a4 4 0 0 1-4 4h-4.835Z"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 540 B After Width: | Height: | Size: 540 B |
@@ -1,4 +1,4 @@
|
||||
<svg width="32px" height="32px" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" fill="#C5C5C5">
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" fill="#C5C5C5">
|
||||
<path d="M9 9H4v1h5V9z" />
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M5 3l1-1h7l1 1v7l-1 1h-2v2l-1 1H3l-1-1V6l1-1h2V3zm1 2h4l1 1v4h2V3H6v2zm4 1H3v7h7V6z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 277 B After Width: | Height: | Size: 273 B |
@@ -1,4 +1,4 @@
|
||||
<svg width="32px" height="32px" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" fill="#424242">
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" fill="#424242">
|
||||
<path d="M9 9H4v1h5V9z" />
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M5 3l1-1h7l1 1v7l-1 1h-2v2l-1 1H3l-1-1V6l1-1h2V3zm1 2h4l1 1v4h2V3H6v2zm4 1H3v7h7V6z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 277 B After Width: | Height: | Size: 273 B |
@@ -1,4 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="44" height="44" viewBox="0 0 24 24" stroke-width="2" stroke="#C5C5C5" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" stroke-width="2" stroke="#C5C5C5" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||
<polyline points="7 8 3 12 7 16" />
|
||||
<polyline points="17 8 21 12 17 16" />
|
||||
|
||||
|
Before Width: | Height: | Size: 358 B After Width: | Height: | Size: 358 B |
@@ -1,4 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="44" height="44" viewBox="0 0 24 24" stroke-width="2" stroke="#424242" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" stroke-width="2" stroke="#424242" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||
<polyline points="7 8 3 12 7 16" />
|
||||
<polyline points="17 8 21 12 17 16" />
|
||||
|
||||
|
Before Width: | Height: | Size: 358 B After Width: | Height: | Size: 358 B |
@@ -1,4 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="44" height="44" viewBox="0 0 24 24" stroke-width="2" stroke="#C5C5C5" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" stroke-width="2" stroke="#C5C5C5" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||
<path d="M9 12h6" />
|
||||
<path d="M12 9v6" />
|
||||
|
||||
|
Before Width: | Height: | Size: 422 B After Width: | Height: | Size: 422 B |
@@ -1,4 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="44" height="44" viewBox="0 0 24 24" stroke-width="2" stroke="#424242" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" stroke-width="2" stroke="#424242" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||
<path d="M9 12h6" />
|
||||
<path d="M12 9v6" />
|
||||
|
||||
|
Before Width: | Height: | Size: 422 B After Width: | Height: | Size: 422 B |
@@ -1,4 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="44" height="44" viewBox="0 0 24 24" stroke-width="2" stroke="#C5C5C5" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" stroke-width="2" stroke="#C5C5C5" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||
<path d="M7 12h10" />
|
||||
<path d="M7 4v16" />
|
||||
|
||||
|
Before Width: | Height: | Size: 400 B After Width: | Height: | Size: 400 B |
@@ -1,4 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="44" height="44" viewBox="0 0 24 24" stroke-width="2" stroke="#424242" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" stroke-width="2" stroke="#424242" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||
<path d="M7 12h10" />
|
||||
<path d="M7 4v16" />
|
||||
|
||||
|
Before Width: | Height: | Size: 400 B After Width: | Height: | Size: 400 B |
@@ -1,4 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="44" height="44" viewBox="0 0 24 24" stroke-width="2" stroke="#C5C5C5" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" stroke-width="2" stroke="#C5C5C5" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||
<line x1="11" y1="5" x2="17" y2="5" />
|
||||
<line x1="7" y1="19" x2="13" y2="19" />
|
||||
|
||||
|
Before Width: | Height: | Size: 362 B After Width: | Height: | Size: 362 B |
@@ -1,4 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="44" height="44" viewBox="0 0 24 24" stroke-width="2" stroke="#424242" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" stroke-width="2" stroke="#424242" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||
<line x1="11" y1="5" x2="17" y2="5" />
|
||||
<line x1="7" y1="19" x2="13" y2="19" />
|
||||
|
||||
|
Before Width: | Height: | Size: 362 B After Width: | Height: | Size: 362 B |
@@ -1,3 +1,3 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" className="h-5 w-5" viewBox="0 0 20 20" fill="#C5C5C5" width="24" height="24">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" className="h-5 w-5" viewBox="0 0 20 20" fill="#C5C5C5" width="16" height="16">
|
||||
<path fillRule="evenodd" d="M4 3a2 2 0 00-2 2v10a2 2 0 002 2h12a2 2 0 002-2V5a2 2 0 00-2-2H4zm12 12H4l4-8 3 6 2-4 3 6z" clipRule="evenodd" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 269 B After Width: | Height: | Size: 269 B |
@@ -1,3 +1,3 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" className="h-5 w-5" viewBox="0 0 20 20" fill="#424242" width="24" height="24">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" className="h-5 w-5" viewBox="0 0 20 20" fill="#424242" width="16" height="16">
|
||||
<path fillRule="evenodd" d="M4 3a2 2 0 00-2 2v10a2 2 0 002 2h12a2 2 0 002-2V5a2 2 0 00-2-2H4zm12 12H4l4-8 3 6 2-4 3 6z" clipRule="evenodd" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 269 B After Width: | Height: | Size: 269 B |
@@ -1,4 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="44" height="44" viewBox="0 0 24 24" stroke-width="2" stroke="#C5C5C5" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" stroke-width="2" stroke="#C5C5C5" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||
<circle cx="12" cy="12" r="9" />
|
||||
<line x1="8" y1="12" x2="8" y2="12.01" />
|
||||
|
||||
|
Before Width: | Height: | Size: 408 B After Width: | Height: | Size: 408 B |
@@ -1,4 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="44" height="44" viewBox="0 0 24 24" stroke-width="2" stroke="#424242" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" stroke-width="2" stroke="#424242" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||
<circle cx="12" cy="12" r="9" />
|
||||
<line x1="8" y1="12" x2="8" y2="12.01" />
|
||||
|
||||
|
Before Width: | Height: | Size: 408 B After Width: | Height: | Size: 408 B |
@@ -1,4 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-list-numbers" width="44" height="44" viewBox="0 0 24 24" stroke-width="2" stroke="#C5C5C5" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-list-numbers" width="16" height="16" viewBox="0 0 24 24" stroke-width="2" stroke="#C5C5C5" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||
<path d="M11 6h9" />
|
||||
<path d="M11 12h9" />
|
||||
|
||||
|
Before Width: | Height: | Size: 451 B After Width: | Height: | Size: 451 B |
@@ -1,4 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-list-numbers" width="44" height="44" viewBox="0 0 24 24" stroke-width="2" stroke="#424242" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-list-numbers" width="16" height="16" viewBox="0 0 24 24" stroke-width="2" stroke="#424242" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||
<path d="M11 6h9" />
|
||||
<path d="M11 12h9" />
|
||||
|
||||
|
Before Width: | Height: | Size: 451 B After Width: | Height: | Size: 451 B |
@@ -1,3 +1,3 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="#C5C5C5" stroke-width="2">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="#C5C5C5" stroke-width="2">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M14.121 14.121L19 19m-7-7l7-7m-7 7l-2.879 2.879M12 12L9.121 9.121m0 5.758a3 3 0 10-4.243 4.243 3 3 0 004.243-4.243zm0-5.758a3 3 0 10-4.243-4.243 3 3 0 004.243 4.243z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 357 B After Width: | Height: | Size: 380 B |
@@ -1,3 +1,3 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="#424242" stroke-width="2">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="#424242" stroke-width="2">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M14.121 14.121L19 19m-7-7l7-7m-7 7l-2.879 2.879M12 12L9.121 9.121m0 5.758a3 3 0 10-4.243 4.243 3 3 0 004.243-4.243zm0-5.758a3 3 0 10-4.243-4.243 3 3 0 004.243 4.243z" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 357 B After Width: | Height: | Size: 380 B |
@@ -1,4 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="44" height="44" viewBox="0 0 24 24" stroke-width="2" stroke="#C5C5C5" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" stroke-width="2" stroke="#C5C5C5" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||
<path d="M7 5v9a5 5 0 0 0 10 0v-9" />
|
||||
<path d="M4 12h16" />
|
||||
|
||||
|
Before Width: | Height: | Size: 301 B After Width: | Height: | Size: 301 B |
@@ -1,4 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="44" height="44" viewBox="0 0 24 24" stroke-width="2" stroke="#424242" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" stroke-width="2" stroke="#424242" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||
<path d="M7 5v9a5 5 0 0 0 10 0v-9" />
|
||||
<path d="M4 12h16" />
|
||||
|
||||
|
Before Width: | Height: | Size: 301 B After Width: | Height: | Size: 301 B |
@@ -1,4 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-list" width="44" height="44" viewBox="0 0 24 24" stroke-width="2" stroke="#C5C5C5" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-list" width="16" height="16" viewBox="0 0 24 24" stroke-width="2" stroke="#C5C5C5" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||
<line x1="9" y1="6" x2="20" y2="6" />
|
||||
<line x1="9" y1="12" x2="20" y2="12" />
|
||||
|
||||
|
Before Width: | Height: | Size: 533 B After Width: | Height: | Size: 533 B |
@@ -1,4 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-list" width="44" height="44" viewBox="0 0 24 24" stroke-width="2" stroke="#424242" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-list" width="16" height="16" viewBox="0 0 24 24" stroke-width="2" stroke="#424242" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
|
||||
<line x1="9" y1="6" x2="20" y2="6" />
|
||||
<line x1="9" y1="12" x2="20" y2="12" />
|
||||
|
||||
|
Before Width: | Height: | Size: 533 B After Width: | Height: | Size: 533 B |
@@ -66,43 +66,6 @@
|
||||
padding: 1rem 1.25rem;
|
||||
}
|
||||
|
||||
.spinner,
|
||||
.spinner:before,
|
||||
.spinner:after {
|
||||
border-radius: 50%;
|
||||
width: 2em;
|
||||
height: 2em;
|
||||
animation-fill-mode: both;
|
||||
animation: load7 1.8s infinite ease-in-out;
|
||||
}
|
||||
|
||||
.spinner {
|
||||
color: var(--vscode-panelSectionHeader-foreground);
|
||||
font-size: 10px;
|
||||
margin: 80px auto;
|
||||
position: relative;
|
||||
text-indent: -9999em;
|
||||
transform: translateZ(0);
|
||||
animation-delay: -0.16s;
|
||||
}
|
||||
|
||||
.spinner:before,
|
||||
.spinner:after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
}
|
||||
|
||||
.spinner:before {
|
||||
left: -3.5em;
|
||||
-webkit-animation-delay: -0.32s;
|
||||
animation-delay: -0.32s;
|
||||
}
|
||||
|
||||
.spinner:after {
|
||||
left: 3.5em;
|
||||
}
|
||||
|
||||
.frontmatter {
|
||||
padding-top: 0;
|
||||
padding-bottom: var(--input-margin-vertical);
|
||||
|
||||
@@ -332,5 +332,33 @@
|
||||
"dashboard.steps.stepsToGetStarted.assetsFolder.description": "Wählen Sie den Ordner aus, der Ihre Assets enthält. In diesem Ordner werden alle Ihre Mediendateien für Ihre Artikel gespeichert.",
|
||||
"dashboard.steps.stepsToGetStarted.assetsFolder.public.title": "Verwende den 'public'-Ordner",
|
||||
"dashboard.steps.stepsToGetStarted.assetsFolder.assets.title": "Verwende den Astro-Assets-Ordner (src/assets)",
|
||||
"dashboard.steps.stepsToGetStarted.assetsFolder.other.description": "Wenn Sie einen anderen Ordner konfigurieren möchten, können Sie dies manuell in der frontmatter.json-Datei tun."
|
||||
"dashboard.steps.stepsToGetStarted.assetsFolder.other.description": "Wenn Sie einen anderen Ordner konfigurieren möchten, können Sie dies manuell in der frontmatter.json-Datei tun.",
|
||||
"dashboard.steps.stepsToGetStarted.template.name": "Verwende eine Konfigurationsvorlage",
|
||||
"dashboard.steps.stepsToGetStarted.template.description": "Wählen Sie eine Vorlage aus, um die Datei frontmatter.json mit den empfohlenen Einstellungen vorzufüllen.",
|
||||
"listeners.dashboard.settingsListener.triggerTemplate.notification": "Vorlagendateien kopiert.",
|
||||
"common.openOnWebsite": "Auf der Website öffnen",
|
||||
"common.filter.value": "Filtern nach {0}",
|
||||
"dashboard.media.detailsSlideOver.unmapped.description": "Möchten Sie die Metadaten von nicht zugeordneten Dateien neu zuordnen?",
|
||||
"common.settings": "Einstellungen",
|
||||
"common.refreshSettings": "Einstellungen aktualisieren",
|
||||
"common.pin": "Stecknadel",
|
||||
"common.unpin": "Losheften",
|
||||
"settings.view.common": "Gemeinsam",
|
||||
"settings.view.contentFolders": "Inhaltsordner",
|
||||
"settings.view.astro": "Astro",
|
||||
"settings.openOnStartup": "Öffnen Sie das Dashboard beim Start",
|
||||
"settings.contentTypes": "Inhaltstypen",
|
||||
"settings.contentFolders": "Inhaltsordner",
|
||||
"settings.diagnostic": "Diagnostisch",
|
||||
"settings.diagnostic.description": "Sie können die Diagnose ausführen, um die gesamte Front Matter CMS-Konfiguration zu überprüfen.",
|
||||
"settings.diagnostic.link": "Führen Sie eine vollständige Diagnose durch",
|
||||
"settings.commonSettings.website.title": "Website- und SSG-Einstellungen",
|
||||
"settings.commonSettings.previewUrl": "Vorschau-URL",
|
||||
"settings.commonSettings.websiteUrl": "Website-URL",
|
||||
"settings.commonSettings.startCommand": "SSG/Framework-Startbefehl",
|
||||
"dashboard.contents.overview.pinned": "Angeheftet",
|
||||
"dashboard.steps.stepsToGetStarted.astroContentTypes.name": "Erstellen Sie Content-Typen für Ihre Astro Content Collections",
|
||||
"dashboard.welcomeScreen.link.documentation.label": "Dokumentation",
|
||||
"dashboard.configuration.astro.astroContentTypes.empty": "Es wurden keine Astro Content Collections gefunden.",
|
||||
"dashboard.configuration.astro.astroContentTypes.description": "Die folgenden Astro Content Collections und können verwendet werden, um einen Inhaltstyp zu generieren."
|
||||
}
|
||||
364
l10n/bundle.l10n.fr.json
Normal file
@@ -0,0 +1,364 @@
|
||||
{
|
||||
"common.add": "Ajouter",
|
||||
"common.edit": "Modifier",
|
||||
"common.delete": "Supprimer",
|
||||
"common.cancel": "Annuler",
|
||||
"common.clear": "Réinitialiser",
|
||||
"common.clear.value": "Réinitialiser la valeur",
|
||||
"common.search": "Rechercher",
|
||||
"common.save": "Sauvegarder",
|
||||
"common.menu": "Menu",
|
||||
"common.insert": "Insérer",
|
||||
"common.insert.snippet": "Insérer snippet",
|
||||
"common.title": "Titre",
|
||||
"common.description": "Description",
|
||||
"common.retry": "Réessayer",
|
||||
"common.update": "Mettre à jour",
|
||||
"common.information": "Information",
|
||||
"common.important": "Important",
|
||||
"common.sync": "Synchroniser",
|
||||
"common.slug": "Slug",
|
||||
"common.support": "Support",
|
||||
"common.remove.value": "Supprimer {0}",
|
||||
"common.error.message": "Désolé, une erreur s'est produite.",
|
||||
"developer.title": "Mode développeur",
|
||||
"developer.reload.title": "Recharger le tableau de bord",
|
||||
"developer.reload.label": "Recharger",
|
||||
"developer.devTools.title": "Ouvrir les options pour les développeurs",
|
||||
"developer.devTools.label": "Options pour les développeurs",
|
||||
"field.required": "Champ obligatoire",
|
||||
"field.unknown": "Champ inconnu",
|
||||
"dashboard.chatbot.answer.answer": "Réponse",
|
||||
"dashboard.chatbot.answer.resources": "Ressources",
|
||||
"dashboard.chatbot.answer.warning": "Attention : les réponses peuvent être fausses. En cas de doute, consultez la documentation.",
|
||||
"dashboard.chatbot.chatbot.loading": "L'assistant se charge",
|
||||
"dashboard.chatbot.chatbot.ready": "Je suis prêt, que voulez-vous savoir ?",
|
||||
"dashboard.chatbot.chatbox.placeholder": "Comment configurer Front Matter ?",
|
||||
"dashboard.chatbot.header.heading": "Demander à Front Matter AI",
|
||||
"dashboard.chatbot.header.description": "Notre IA, propulsée par mendable.ai, a élaboré la documentation et peut maintenant vous aider concernant n'importe quelle demande sur Front Matter. Allez-y, demandez lui quelque chose!",
|
||||
"dashboard.common.choiceButton.open": "Ouvrir les options",
|
||||
"dashboard.contents.contentActions.actionMenuButton.title": "Menu",
|
||||
"dashboard.contents.contentActions.menuItem.view": "Vue",
|
||||
"dashboard.contents.contentActions.alert.title": "Supprimer : {0}",
|
||||
"dashboard.contents.contentActions.alert.description": "Etes-vous sûr de vouloir supprimer le contenu \"{0}\" ?",
|
||||
"dashboard.contents.item.invalidTitle": "<titre invalide>",
|
||||
"dashboard.contents.item.invalidDescription": "<description invalide>",
|
||||
"dashboard.contents.list.title": "Titre",
|
||||
"dashboard.contents.list.date": "Date",
|
||||
"dashboard.contents.list.status": "Statut",
|
||||
"dashboard.contents.overview.noMarkdown": "Aucun Markdown à afficher",
|
||||
"dashboard.contents.overview.noFolders": "Enregistez un dossier de contenu dans votre projet pour que Front Matter puisse trouver vos contenus.",
|
||||
"dashboard.contents.status.draft": "Brouillon",
|
||||
"dashboard.contents.status.published": "En-ligne",
|
||||
"dashboard.dataView.dataForm.modify": "Modifier les données",
|
||||
"dashboard.dataView.dataForm.add": "Ajouter une nouvelle donnée",
|
||||
"dashboard.dataView.dataView.select": "Sélectionnez votre type de donnée",
|
||||
"dashboard.dataView.dataView.title": "Votre entrée de donnée {0}",
|
||||
"dashboard.dataView.dataView.add": "Ajouter une nouvelle entrée",
|
||||
"dashboard.dataView.dataView.empty": "Aucune entrée trouvée pour {0}",
|
||||
"dashboard.dataView.dataView.createOrModify": "Créer ou modifier votre donnée {0}",
|
||||
"dashboard.dataView.dataView.getStarted": "Sélectionnez un type de données pour commencer",
|
||||
"dashboard.dataView.dataView.noDataFiles": "Aucun fichier de données trouvé",
|
||||
"dashboard.dataView.dataView.getStarted.link": "En savoir plus sur l'utilisation des données",
|
||||
"dashboard.dataView.emptyView.heading": "Sélectionnez d'abord votre type de données",
|
||||
"dashboard.dataView.sortableItem.editButton.title": "Modifier \"{0}\"",
|
||||
"dashboard.dataView.sortableItem.deleteButton.title": "Supprimer \"{0}\"",
|
||||
"dashboard.dataView.sortableItem.alert.title": "Supprimer la valeur",
|
||||
"dashboard.dataView.sortableItem.alert.description": "Etes-vous sûr de vouloir supprimer cette valeur?",
|
||||
"dashboard.errorView.description": "Merci de fermer le tableau de bord et de réessayer.",
|
||||
"dashboard.header.breadcrumb.home": "Accueil",
|
||||
"dashboard.header.clearFilters.title": "Réinitialiser les filtres, les groupes et le tri",
|
||||
"dashboard.header.filter.default": "Aucun filtre",
|
||||
"dashboard.header.folders.default": "Tous les types",
|
||||
"dashboard.header.folders.menuButton.showing": "Afficher",
|
||||
"dashboard.header.grouping.option.none": "Aucun",
|
||||
"dashboard.header.grouping.option.year": "Année",
|
||||
"dashboard.header.grouping.option.draft": "Brouillon/En-ligne",
|
||||
"dashboard.header.grouping.menuButton.label": "Groupé par",
|
||||
"dashboard.header.navigation.allArticles": "Tous les articles",
|
||||
"dashboard.header.navigation.published": "En-ligne",
|
||||
"dashboard.header.navigation.draft": "Brouillon",
|
||||
"dashboard.header.header.createContent": "Créer contenu",
|
||||
"dashboard.header.header.createByContentType": "Créer par type de contenu",
|
||||
"dashboard.header.header.createByTemplate": "Créer par modèle",
|
||||
"dashboard.header.pagination.first": "Premier",
|
||||
"dashboard.header.pagination.previous": "Précédent",
|
||||
"dashboard.header.pagination.next": "suivant",
|
||||
"dashboard.header.pagination.last": "Dernier",
|
||||
"dashboard.header.paginationStatus.text": "Afficher {0} de {1} des {2} résultats",
|
||||
"dashboard.header.projectSwitcher.label": "projet",
|
||||
"dashboard.header.refreshDashboard.label": "Actualiser le dashboard",
|
||||
"dashboard.header.sorting.lastModified.asc": "Dernière modification (croissant)",
|
||||
"dashboard.header.sorting.lastModified.desc": "Dernière modification (décroissant)",
|
||||
"dashboard.header.sorting.filename.asc": "Par nom de fichier (croissant)",
|
||||
"dashboard.header.sorting.filename.desc": "Par nom de fichier (décroissant)",
|
||||
"dashboard.header.sorting.published.asc": "En-ligne (croissant)",
|
||||
"dashboard.header.sorting.published.desc": "En-ligne (décroissant)",
|
||||
"dashboard.header.sorting.size.asc": "Taille (croissant)",
|
||||
"dashboard.header.sorting.size.desc": "Taille (décroissant)",
|
||||
"dashboard.header.sorting.caption.asc": "Légende (croissant)",
|
||||
"dashboard.header.sorting.caption.desc": "Légende (décroissant)",
|
||||
"dashboard.header.sorting.alt.asc": "Alt (croissant)",
|
||||
"dashboard.header.sorting.alt.desc": "Alt (décroissant)",
|
||||
"dashboard.header.sorting.label": "Trier par",
|
||||
"dashboard.header.startup.label": "Ouvrir au démarrage?",
|
||||
"dashboard.header.tabs.contents": "Contenus",
|
||||
"dashboard.header.tabs.media": "Médias",
|
||||
"dashboard.header.tabs.snippets": "Snippets",
|
||||
"dashboard.header.tabs.data": "données",
|
||||
"dashboard.header.tabs.taxonomies": "Taxonomies",
|
||||
"dashboard.header.viewSwitch.toGrid": "Afficher en grille",
|
||||
"dashboard.header.viewSwitch.toList": "Afficher en liste",
|
||||
"dashboard.layout.sponsor.support.msg": "Soutenir Front Matter",
|
||||
"dashboard.layout.sponsor.review.label": "Donnez votre avis",
|
||||
"dashboard.layout.sponsor.review.msg": "Donnez votre avis sur Front Matter",
|
||||
"dashboard.media.common.title": "Titre",
|
||||
"dashboard.media.common.caption": "Légende",
|
||||
"dashboard.media.common.alt": "Texte alternatif",
|
||||
"dashboard.media.common.size": "Taille",
|
||||
"dashboard.media.dialog.title": "Voir les détails",
|
||||
"dashboard.media.panel.close": "Fermer le panneau",
|
||||
"dashboard.media.metadata.panel.title": "Mettre à jour les métadonnées",
|
||||
"dashboard.media.metadata.panel.description": "Spécifiez les métadonnées que vous voulez utiliser pour ce fichier.",
|
||||
"dashboard.media.metadata.panel.field.fileName": "Nom de fichier",
|
||||
"dashboard.media.metadata.panel.form.metadata.title": "Métadonnées",
|
||||
"dashboard.media.metadata.panel.form.information.title": "Information",
|
||||
"dashboard.media.metadata.panel.form.information.createdDate": "Créé",
|
||||
"dashboard.media.metadata.panel.form.information.modifiedDate": "Dernières modifications",
|
||||
"dashboard.media.metadata.panel.form.information.dimensions": "Dimensions",
|
||||
"dashboard.media.metadata.panel.form.information.folder": "Dossier",
|
||||
"dashboard.media.folderCreation.hexo.create": "Créer un dossier de ressource de l'article",
|
||||
"dashboard.media.folderCreation.folder.create": "Créer un nouveau dossier",
|
||||
"dashboard.media.item.quickAction.insert.field": "Insérer une image pour le champ \"{0}\"",
|
||||
"dashboard.media.item.quickAction.insert.markdown": "Insérer une image avec le markup markdown",
|
||||
"dashboard.media.item.quickAction.copy.path": "Copier le chemin du média",
|
||||
"dashboard.media.item.quickAction.delete": "Supprimer le fichier du média",
|
||||
"dashboard.media.item.menuItem.edit.metadata": "Modifier les métadonnées",
|
||||
"dashboard.media.item.menuItem.insert.image": "Insérer une image",
|
||||
"dashboard.media.item.menuItem.reveal.media": "Afficher le média",
|
||||
"dashboard.media.item.infoDialog.snippet.description": "Sélectionnez le snippet de média à utiliser pour le fichier de média courant.",
|
||||
"dashboard.media.item.alert.delete.description": "Etes-vous sûr de vouloir supprimer le fichier du dossier {0} ?",
|
||||
"dashboard.media.media.description": "Sélectionnez le fichier média à ajouter à votre contenu.",
|
||||
"dashboard.media.media.dragAndDrop": "Vous pouvez aussi glisser-déposer des images depuis votre bureau et les sélectionner une fois envoyés.",
|
||||
"dashboard.media.media.folder.upload": "Envoyer dans {0}",
|
||||
"dashboard.media.media.folder.default": "Aucun dossier sélectionné, les fichiers que vous envoyez seront ajoutés au dossier {0}",
|
||||
"dashboard.media.media.placeholder": "Aucun fichier de média à afficher. Vous pouvez glisser-déposer de nouveaux fichiers en maintenant la touche [shift] appuyée.",
|
||||
"dashboard.media.media.contentFolder": "Dossier de contenu",
|
||||
"dashboard.media.media.publicFolder": "Dossier public",
|
||||
"dashboard.media.mediaHeaderTop.searchbox.placeholder": "Rechercher dans le dossier",
|
||||
"dashboard.media.mediaSnippetForm.formDialog.title": "Insérer un média: {0}",
|
||||
"dashboard.media.mediaSnippetForm.formDialog.description": "Insérer le fichier de média {0} dans l'article courant",
|
||||
"dashboard.preview.input.placeholder": "Entrer une URL",
|
||||
"dashboard.preview.button.navigate.title": "Naviguer",
|
||||
"dashboard.preview.button.refresh.title": "Rafraichir",
|
||||
"dashboard.preview.button.open.title": "Ouvrir",
|
||||
"dashboard.snippetsView.item.quickAction.editSnippet": "Modifier le snippet",
|
||||
"dashboard.snippetsView.item.quickAction.deleteSnippet": "Supprimer le snippet",
|
||||
"dashboard.snippetsView.item.quickAction.viewSnippet": "Voir le fichier de snippet",
|
||||
"dashboard.snippetsView.item.insert.formDialog.title": "Insérer le snippet: {0}",
|
||||
"dashboard.snippetsView.item.insert.formDialog.description": "Insérer le snippet {0} dans l'article courant",
|
||||
"dashboard.snippetsView.item.edit.formDialog.title": "Modifier le snippet: {0}",
|
||||
"dashboard.snippetsView.item.edit.formDialog.description": "Modifier le snippet {0}",
|
||||
"dashboard.snippetsView.item.alert.title": "Supprimer le snippet : {0}",
|
||||
"dashboard.snippetsView.item.alert.description": "Etes-vous sûr de vouloir supprimer le snippet {0} ?",
|
||||
"dashboard.snippetsView.newForm.snippetInput.title.placeholder": "Titre ",
|
||||
"dashboard.snippetsView.newForm.snippetInput.description.label": "Description",
|
||||
"dashboard.snippetsView.newForm.snippetInput.description.placeholder": "Description du snippet",
|
||||
"dashboard.snippetsView.newForm.snippetInput.snippet.label": "Snippet",
|
||||
"dashboard.snippetsView.newForm.snippetInput.snippet.placeholder": "Contenu du snippet",
|
||||
"dashboard.snippetsView.newForm.snippetInput.isMediaSnippet.label": "Snippet média ?",
|
||||
"dashboard.snippetsView.newForm.snippetInput.isMediaSnippet.checkbox.label": "Snippet média",
|
||||
"dashboard.snippetsView.newForm.snippetInput.isMediaSnippet.checkbox.description": "Utiliser le snippet actuel pour insérer des fichiers médias dans votre contenu.",
|
||||
"dashboard.snippetsView.newForm.snippetInput.docsButton.title": "En savoir plus sur l'utilisation des substituts de snippet médias",
|
||||
"dashboard.snippetsView.newForm.snippetInput.docsButton.description": "Vérifier la documentation des substituts de snippet média pour savoir quel substitut utiliser.",
|
||||
"dashboard.snippetsView.snippets.ariaLabel": "En-tête de snippet",
|
||||
"dashboard.snippetsView.snippets.button.create": "Créer un nouveau snippet",
|
||||
"dashboard.snippetsView.snippets.select.description": "Sélectionnez le snippet à ajouter à votre contenu.",
|
||||
"dashboard.snippetsView.snippets.empty.message": "Aucun snippet trouvé",
|
||||
"dashboard.snippetsView.snippets.readMore": "En savoir plus sur l'utilisation des snippets",
|
||||
"dashboard.snippetsView.snippets.formDialog.title": "Créer un snippet",
|
||||
"dashboard.steps.stepsToGetStarted.button.addFolder.title": "Ajouter un dossier de contenu à Front Matter",
|
||||
"dashboard.steps.stepsToGetStarted.initializeProject.name": "Initialiser le projet",
|
||||
"dashboard.steps.stepsToGetStarted.initializeProject.description": "Initialiser le projet crée les fichiers et dossiers nécéssaire au bon fonctionnement du CMS Front Matter. Commencez par cliquer sur cette action.",
|
||||
"dashboard.steps.stepsToGetStarted.framework.name": "Réglages framework",
|
||||
"dashboard.steps.stepsToGetStarted.framework.description": "Sélectionnez votre générateur de site ou votre framework pour pré-remplir les paramètres recommandés.",
|
||||
"dashboard.steps.stepsToGetStarted.framework.select": "Sélectionnez votre framework",
|
||||
"dashboard.steps.stepsToGetStarted.framework.select.other": "autre",
|
||||
"dashboard.steps.stepsToGetStarted.assetsFolder.name": "Quel est votre dossier de ressources ?",
|
||||
"dashboard.steps.stepsToGetStarted.assetsFolder.description": "Sélectionner le dossier contenant vos ressources. Ce dossier sera utilisé pour stocker tous les fichiers médias de vos articles.",
|
||||
"dashboard.steps.stepsToGetStarted.assetsFolder.public.title": "Utiliser le dossier 'public'",
|
||||
"dashboard.steps.stepsToGetStarted.assetsFolder.assets.title": "Utiliser le dossier de ressources d'Astro (src/assets)",
|
||||
"dashboard.steps.stepsToGetStarted.assetsFolder.other.description": "Si vous voulez configurer un autre dossier, vous pouvez le faire manuellement dans le fichier frontmatter.json.",
|
||||
"dashboard.steps.stepsToGetStarted.contentFolders.name": "Enregistrer le ou less dossiers de contenus ?",
|
||||
"dashboard.steps.stepsToGetStarted.contentFolders.description": "Ajouter un des dossiers que nous avons trouvé dans votre projet en tant que dossier de contenus. Une fois ce dossier sélectionné, Front Matter pourra lister tous les contenus et vous permettra de créer vos contenus.",
|
||||
"dashboard.steps.stepsToGetStarted.contentFolders.label": "Dossiers contenant des contenus :",
|
||||
"dashboard.steps.stepsToGetStarted.contentFolders.information.description": "Vous pouvez aussi effectuer cette action en faisant un clic droit sur le dossier dans la vue d'exploration, et sélectionner le dossier à enregister.",
|
||||
"dashboard.steps.stepsToGetStarted.tags.name": "Importer tous les tags et toutes les catégories (optionnel)",
|
||||
"dashboard.steps.stepsToGetStarted.tags.description": "Maintenant que Front Matter connaît tous vos dossiers de contenus, voulez-vous importer tous les tags et toutes les catégories de ces contenus ?",
|
||||
"dashboard.steps.stepsToGetStarted.showDashboard.name": "Afficher le tableau de bord",
|
||||
"dashboard.steps.stepsToGetStarted.showDashboard.description": "Une fois que toutes ces actions sont effectuées, le tableau de bord pourra être chargé.",
|
||||
"dashboard.taxonomyView.button.add.title": "Ajouter {0} aux paramètres de taxonomie",
|
||||
"dashboard.taxonomyView.button.edit.title": "Modifier {0}",
|
||||
"dashboard.taxonomyView.button.merge.title": "Fusionner {0}",
|
||||
"dashboard.taxonomyView.button.move.title": "Déplacer dans un autre type de taxonomie",
|
||||
"dashboard.taxonomyView.button.delete.title": "Supprimer {0}",
|
||||
"dashboard.taxonomyView.taxonomyLookup.button.title": "Afficher les contenus contenants {0} dans {1}",
|
||||
"dashboard.taxonomyView.taxonomyManager.description": "Créer, modifier, et gérer le {0} de votre site",
|
||||
"dashboard.taxonomyView.taxonomyManager.button.create": "Créer une nouvelle valeur pour {0}",
|
||||
"dashboard.taxonomyView.taxonomyManager.table.heading.name": "Nom",
|
||||
"dashboard.taxonomyView.taxonomyManager.table.heading.count": "Compteur",
|
||||
"dashboard.taxonomyView.taxonomyManager.table.heading.action": "Action",
|
||||
"dashboard.taxonomyView.taxonomyManager.table.row.empty": "Aucun {0} trouvé",
|
||||
"dashboard.taxonomyView.taxonomyManager.table.unmapped.title": "Paramètre manquant",
|
||||
"dashboard.taxonomyView.taxonomyView.navigationBar.title": "Sélectionnez la taxonomie",
|
||||
"dashboard.taxonomyView.taxonomyView.button.import": "Importer la taxonomie",
|
||||
"dashboard.taxonomyView.taxonomyView.navigationItem.tags": "Tags",
|
||||
"dashboard.taxonomyView.taxonomyView.navigationItem.categories": "Catégories",
|
||||
"dashboard.unkownView.title": "La vue n'existe pas",
|
||||
"dashboard.unkownView.description": "Il semble que vous ayez fermé une vue qui n'existe plus. Merci de réouvrir votre tableau de bord.",
|
||||
"dashboard.welcomeScreen.title": "Gérer votre site statique avec Front Matter",
|
||||
"dashboard.welcomeScreen.thanks": "Merci d'utiliser Front Matter !",
|
||||
"dashboard.welcomeScreen.description": "Nous faisons de notre mieux pour faire de Front Maker un CMS facile à utiliser. Si vous avez des questions ou des suggestions, n'hésitez pas à nous contacter sur Github.",
|
||||
"dashboard.welcomeScreen.link.github.title": "GitHub",
|
||||
"dashboard.welcomeScreen.link.github.label": "GitHub / Documentation",
|
||||
"dashboard.welcomeScreen.link.sponsor.title": "Devenez contributeur",
|
||||
"dashboard.welcomeScreen.link.sponsor.label": "Contributeur",
|
||||
"dashboard.welcomeScreen.link.review.title": "Donnez votre avis",
|
||||
"dashboard.welcomeScreen.link.review.label": "Avis",
|
||||
"dashboard.welcomeScreen.actions.heading": "Effectuez les étapes suivants pour commencer à utiliser l'extension",
|
||||
"dashboard.welcomeScreen.actions.description": "Vous pouvez aussi utiliser l'extension depuis la barre latérale Front Matter. Vous trouverez les actions à effectuer spécifiquement pour vos pages.",
|
||||
"dashboard.welcomeScreen.actions.thanks": "Nous espérons que vous aimez Front Matter !",
|
||||
"panel.contentType.contentTypeValidator.title": "Type de contenu",
|
||||
"panel.contentType.contentTypeValidator.hint": "Nous avons remarqué des différences entre le type de contenu et les données front matter.\n Voulez vous créer, mettre à jour ou définir le type de contenu pour ce contenu ?",
|
||||
"panel.contentType.contentTypeValidator.button.create": "Créer un type de contenu",
|
||||
"panel.contentType.contentTypeValidator.button.add": "Ajouter les champs manquants au type de contenu",
|
||||
"panel.contentType.contentTypeValidator.button.change": "Changer le type de contenu du fichier",
|
||||
"panel.dataBlock.dataBlockField.group.selected.edit": "Modification: {0}",
|
||||
"panel.dataBlock.dataBlockField.group.selected.create": "Créer un nouveau {0}",
|
||||
"panel.dataBlock.dataBlockField.group.select": "Sélectionner un groupe",
|
||||
"panel.dataBlock.dataBlockField.add": "Ajouter {0}",
|
||||
"panel.dataBlock.dataBlockRecord.edit": "Modifier l'enregistrement",
|
||||
"panel.dataBlock.dataBlockRecord.delete": "Supprimer l'enregistrement",
|
||||
"panel.dataBlock.dataBlockRecords.label": "Enregistrements",
|
||||
"panel.dataBlock.dataBlockSelector.label": "Type de bloc",
|
||||
"panel.errorBoundary.fieldBoundary.label": "Echec d'affichage du champ",
|
||||
"panel.fields.choiceField.select": "Sélectionner {0}",
|
||||
"panel.fields.choiceField.clear": "Réinitialiser la valeur",
|
||||
"panel.fields.contentTypeRelationshipField.loading": "Récupération des valeurs possible...",
|
||||
"panel.fields.dateTimeField.button.pick": "Choisissez votre date",
|
||||
"panel.fields.dateTimeField.time": "Heure :",
|
||||
"panel.fields.fieldMessage.required": "Le champ {0} est obligatoire",
|
||||
"panel.fields.fileField.delete": "Supprimer le fichier",
|
||||
"panel.fields.fileField.add": "Ajouter votre {0}",
|
||||
"panel.fields.imageFallback.label": "L'image ne peut pas être chargée",
|
||||
"panel.fields.listField.edit": "Modifier l'enregistrement",
|
||||
"panel.fields.listField.delete": "Supprimer l'enregistrement",
|
||||
"panel.fields.previewImage.remove": "Supprimer l'image",
|
||||
"panel.fields.previewImageField.add": "Ajouter votre {0}",
|
||||
"panel.fields.slugField.update": "Mise à jour disponible",
|
||||
"panel.fields.slugField.generate": "Générer le slug",
|
||||
"panel.fields.textField.ai.message": "Utiliser Front Matter AI pour suggérer {0}",
|
||||
"panel.fields.textField.ai.generate": "Génération de la suggestion...",
|
||||
"panel.fields.textField.loading": "Chargement",
|
||||
"panel.fields.textField.limit": "Limite de champ atteinte {0}",
|
||||
"panel.fields.wrapperField.unknown": "Type de champ inconnu : {0}",
|
||||
"panel.actions.title": "Actions",
|
||||
"panel.articleDetails.title": "Plus de détails",
|
||||
"panel.articleDetails.type": "Type",
|
||||
"panel.articleDetails.total": "Total",
|
||||
"panel.articleDetails.headings": "En-têtes",
|
||||
"panel.articleDetails.paragraphs": "Paragraphes",
|
||||
"panel.articleDetails.internalLinks": "Liens internes",
|
||||
"panel.articleDetails.externalLinks": "Liens externes",
|
||||
"panel.articleDetails.images": "Images",
|
||||
"panel.baseView.initialize": "Initialiser le projet",
|
||||
"panel.baseView.actions.title": "Actions",
|
||||
"panel.baseView.action.openDashboard": "Ouvrir le tableau de bord",
|
||||
"panel.baseView.action.openPreview": "Ouvrir la prévisualisation",
|
||||
"panel.baseView.action.createContent": "Créer le contenu",
|
||||
"panel.baseView.empty": "Ouvrir un fichier pour afficher plus d'actions",
|
||||
"panel.fileList.label.singular": "fichier",
|
||||
"panel.fileList.label.plural": "fichiers",
|
||||
"panel.folderAndFiles.title": "Récemment modifié",
|
||||
"panel.globalSettings.title": "Paramètres globaux",
|
||||
"panel.globalSettings.action.modifiedDate.label": "Date de modification",
|
||||
"panel.globalSettings.action.modifiedDate.description": "Mettre à jour automatiquement la date de modification",
|
||||
"panel.globalSettings.action.frontMatter.label": "Front Matter highlight",
|
||||
"panel.globalSettings.action.frontMatter.description": "Highlight Front Matter",
|
||||
"panel.globalSettings.action.preview.label": "Prévisualisation locale",
|
||||
"panel.globalSettings.action.preview.placeholder": "Exemple : {0}",
|
||||
"panel.globalSettings.action.server.label": "Commande de server local",
|
||||
"panel.globalSettings.action.server.placeholder": "Exemple : {0}",
|
||||
"panel.metadata.title": "Métadonnées",
|
||||
"panel.otherActions.title": "Autres actions",
|
||||
"panel.otherActions.writingSettings.enabled": "Paramètres d'écriture activés",
|
||||
"panel.otherActions.writingSettings.disabled": "Activer les paramètres d'écriture",
|
||||
"panel.otherActions.centerMode": "Basculer le mode central",
|
||||
"panel.otherActions.createTemplate": "Créer modèle",
|
||||
"panel.otherActions.revealFile": "Afficher le fichier dans le dossier",
|
||||
"panel.otherActions.openProject": "Afficher le dossier du projet",
|
||||
"panel.otherActions.documentation": "Ouvrir la documentation",
|
||||
"panel.otherActions.settings": "Paramètres globaux",
|
||||
"panel.otherActions.issue": "Signaler un problème",
|
||||
"panel.preview.title": "Ouvrir la prévisualisation",
|
||||
"panel.publishAction.publish": "Publié",
|
||||
"panel.publishAction.unpublish": "Retourner au brouillon",
|
||||
"panel.seoDetails.recommended": "Recommandé",
|
||||
"panel.seoKeywordInfo.density": "Utilisation du mot clé {0} *",
|
||||
"panel.seoKeywordInfo.validInfo.label": "Utilisé dans le ou les en-tête(s)",
|
||||
"panel.seoKeywordInfo.validInfo.content": "Contenu",
|
||||
"panel.seoKeywords.title": "Mot-clés",
|
||||
"panel.seoKeywords.header.keyword": "Mot-clé",
|
||||
"panel.seoKeywords.header.details": "Détails",
|
||||
"panel.seoKeywords.density": "* Une densité de mot-clé de 1-1.5% est suffisante dans la plupart des cas",
|
||||
"panel.seoStatus.title": "Recommandations",
|
||||
"panel.seoStatus.header.property": "Propriété",
|
||||
"panel.seoStatus.header.length": "Longueur",
|
||||
"panel.seoStatus.header.valid": "Valide",
|
||||
"panel.seoStatus.seoFieldInfo.characters": "{0} caractères",
|
||||
"panel.seoStatus.seoFieldInfo.words": "{0} mots",
|
||||
"panel.seoStatus.seoFieldInfo.article": "Longueur de l'article",
|
||||
"panel.seoStatus.collapsible.title": "Statut SEO",
|
||||
"panel.seoStatus.required": "{0} ou {1} est requis.",
|
||||
"panel.slugAction.title": "Optimisation du slug",
|
||||
"panel.spinner.loading": "Chargement...",
|
||||
"panel.startServerbutton.start": "Démarrer le serveur",
|
||||
"panel.startServerbutton.stop": "Arrêter le serveur",
|
||||
"panel.tag.add": "Ajouter {0} à vos paramètres",
|
||||
"panel.tagPicker.inputPlaceholder.empty": "Choisissez votre {0}",
|
||||
"panel.tagPicker.inputPlaceholder.disabled": "Vous avez atteint la limite de {0}",
|
||||
"panel.tagPicker.ai.suggest": "Utiliser Front Matter AI pour suggérer {0}",
|
||||
"panel.tagPicker.ai.generating": "Génération des suggestions...",
|
||||
"panel.tagPicker.limit": "Max : {0}",
|
||||
"panel.tagPicker.unkown": "Ajouter le tag non-classé",
|
||||
"panel.tags.tag.warning": "Attention, ce tag \"{0}\" n'est pas enregistré dans vos paramètres. Une fois supprimé, il sera définitivement supprimé.",
|
||||
"panel.viewPanel.mediaInsert": "Continuer dans le tableau de bord des médias pour sélectionner l'image que vous voulez insérer.",
|
||||
"dashboard.steps.stepsToGetStarted.template.name": "Utiliser un modèle de configuration",
|
||||
"dashboard.steps.stepsToGetStarted.template.description": "Sélectionnez un modèle pour préremplir le fichier frontmatter.json avec les paramètres recommandés.",
|
||||
"listeners.dashboard.settingsListener.triggerTemplate.notification": "Fichiers de modèle copiés.",
|
||||
"common.openOnWebsite": "Ouvrir sur le site web",
|
||||
"common.filter.value": "Filtrer par {0}",
|
||||
"dashboard.media.detailsSlideOver.unmapped.description": "Voulez-vous remapper les métadonnées des fichiers non mappés?",
|
||||
"common.settings": "Paramètres",
|
||||
"common.refreshSettings": "Actualiser les paramètres",
|
||||
"common.pin": "Épingler",
|
||||
"common.unpin": "Détacher",
|
||||
"settings.view.common": "Commun",
|
||||
"settings.view.contentFolders": "Dossiers de contenu",
|
||||
"settings.view.astro": "Astro",
|
||||
"settings.openOnStartup": "Ouvrir le tableau de bord au démarrage",
|
||||
"settings.contentTypes": "Types de contenu",
|
||||
"settings.contentFolders": "Dossiers de contenu",
|
||||
"settings.diagnostic": "Diagnostique",
|
||||
"settings.diagnostic.description": "Vous pouvez exécuter les diagnostics pour vérifier l’ensemble de la configuration de Front Matter CMS.",
|
||||
"settings.diagnostic.link": "Exécuter des diagnostics complets",
|
||||
"settings.commonSettings.website.title": "Paramètres du site Web et SSG",
|
||||
"settings.commonSettings.previewUrl": "URL d’aperçu",
|
||||
"settings.commonSettings.websiteUrl": "URL du site Web",
|
||||
"settings.commonSettings.startCommand": "Commande de démarrage SSG/Framework",
|
||||
"dashboard.contents.overview.pinned": "Épinglé",
|
||||
"dashboard.steps.stepsToGetStarted.astroContentTypes.name": "Créer des types de contenu pour vos collections de contenu Astro",
|
||||
"dashboard.welcomeScreen.link.documentation.label": "Documentation",
|
||||
"dashboard.configuration.astro.astroContentTypes.empty": "Aucune collection de contenu Astro trouvée.",
|
||||
"dashboard.configuration.astro.astroContentTypes.description": "Les collections de contenu Astro suivantes peuvent être utilisées pour générer un type de contenu."
|
||||
}
|
||||
@@ -1,422 +1,364 @@
|
||||
{
|
||||
"common.add":"Aggiungi",
|
||||
"common.edit":"Modifica",
|
||||
"common.delete":"Elimina",
|
||||
"common.cancel":"Annulla",
|
||||
"common.clear":"Pulisci",
|
||||
"common.clear.value":"Pulisci valore",
|
||||
"common.search":"Ricerca",
|
||||
"common.save":"Salva",
|
||||
"common.menu":"Menu",
|
||||
"common.insert":"Inserisci",
|
||||
"common.insert.snippet":"Inserisci snippet",
|
||||
"common.title":"Titolo",
|
||||
"common.description":"Descrizione",
|
||||
"common.retry":"Riprova",
|
||||
"common.update":"Aggiorna",
|
||||
"common.information":"Informazioni",
|
||||
"common.important":"Importante",
|
||||
"common.sync":"Sincronizza",
|
||||
"common.slug":"Slug",
|
||||
"common.support":"Supporto",
|
||||
"common.remove.value":"Rimuovi {0}",
|
||||
"common.error.message":"Siamo spiacenti, qualcosa è andato storto.",
|
||||
|
||||
"developer.title":"Modalità sviluppatore",
|
||||
"developer.reload.title":"Ricarica la dashboard",
|
||||
"developer.reload.label":"Ricarica",
|
||||
"developer.devTools.title":"Apri DevTools",
|
||||
"developer.devTools.label":"DevTools",
|
||||
|
||||
"field.required":"Campo obbligatorio",
|
||||
"field.unknown":"Campo sconosciuto",
|
||||
|
||||
"dashboard.chatbot.answer.answer":"Risposta",
|
||||
"dashboard.chatbot.answer.resources":"Risorse",
|
||||
"dashboard.chatbot.answer.warning":"Attenzione: Answers potrebbe sbagliarsi. In caso di dubbio, si prega di consultare la documentazione.",
|
||||
|
||||
"dashboard.chatbot.chatbot.loading":"L'assistente si sta preparando",
|
||||
"dashboard.chatbot.chatbot.ready":"Sono pronto, cosa vuoi sapere?",
|
||||
|
||||
"dashboard.chatbot.chatbox.placeholder":"Come posso configurare Front Matter?",
|
||||
|
||||
"dashboard.chatbot.header.heading":"Chiedi a Front Matter AI",
|
||||
"dashboard.chatbot.header.description":"La nostra intelligenza artificiale, alimentata da mendable.ai, ha elaborato la documentazione e può assisterti con qualsiasi domanda relativa a Front Matter. Vai avanti e chiedi!",
|
||||
|
||||
"dashboard.common.choiceButton.open":"Apri opzioni",
|
||||
|
||||
"dashboard.contents.contentActions.actionMenuButton.title":"Menu",
|
||||
"dashboard.contents.contentActions.menuItem.view":"Vista",
|
||||
"dashboard.contents.contentActions.alert.title":"Elimina: {0}",
|
||||
"dashboard.contents.contentActions.alert.description":"Sei sicuro di voler eliminare il contenuto \"{0}\"?",
|
||||
|
||||
"dashboard.contents.item.invalidTitle":"<titolo non valido>",
|
||||
"dashboard.contents.item.invalidDescription":"<Descrizione non valida>",
|
||||
|
||||
"dashboard.contents.list.title":"Titolo",
|
||||
"dashboard.contents.list.date":"Data",
|
||||
"dashboard.contents.list.status":"Stato",
|
||||
|
||||
"dashboard.contents.overview.noMarkdown":"Nessun markdown da mostrare",
|
||||
"dashboard.contents.overview.noFolders":"Assicurati di aver registrato una cartella di contenuti nel tuo progetto per consentire a Front Matter di trovare il contenuto.",
|
||||
|
||||
"dashboard.contents.status.draft":"Bozza",
|
||||
"dashboard.contents.status.published":"Pubblicato",
|
||||
|
||||
"dashboard.dataView.dataForm.modify":"Modificare i dati",
|
||||
"dashboard.dataView.dataForm.add":"Aggiungere nuovi dati",
|
||||
|
||||
"dashboard.dataView.dataView.select":"Seleziona il tuo tipo di dati",
|
||||
"dashboard.dataView.dataView.title":"I tuoi {0} elementi di dati",
|
||||
"dashboard.dataView.dataView.add":"Aggiungere una nuova voce",
|
||||
"dashboard.dataView.dataView.empty":"Nessuna voce di dati {0} trovata",
|
||||
"dashboard.dataView.dataView.createOrModify":"Creare o modificare i dati {0}",
|
||||
"dashboard.dataView.dataView.getStarted":"Seleziona un tipo di dati per iniziare",
|
||||
"dashboard.dataView.dataView.noDataFiles":"Nessun file di dati trovato",
|
||||
"dashboard.dataView.dataView.getStarted.link":"Ulteriori informazioni per iniziare a utilizzare i file di dati",
|
||||
|
||||
"dashboard.dataView.emptyView.heading":"Seleziona prima il tipo di data",
|
||||
|
||||
"dashboard.dataView.sortableItem.editButton.title":"Modifica \"{0}\"",
|
||||
"dashboard.dataView.sortableItem.deleteButton.title":"Elimina \"{0}\"",
|
||||
"dashboard.dataView.sortableItem.alert.title":"Eliminare l'immissione dei dati",
|
||||
"dashboard.dataView.sortableItem.alert.description":"Sei sicuro di voler cancellare l'inserimento dei dati?",
|
||||
|
||||
"dashboard.errorView.description":"Chiudere la dashboard e riprovare.",
|
||||
|
||||
"dashboard.header.breadcrumb.home":"Home",
|
||||
"dashboard.header.clearFilters.title":"Rimuovi filtri, raggruppamento e ordinamento",
|
||||
|
||||
"dashboard.header.filter.default":"Nessun filtro",
|
||||
|
||||
"dashboard.header.folders.default":"Tutti i tipi",
|
||||
"dashboard.header.folders.menuButton.showing":"Risultati",
|
||||
|
||||
"dashboard.header.grouping.option.none":"Nessuno",
|
||||
"dashboard.header.grouping.option.year":"Anno",
|
||||
"dashboard.header.grouping.option.draft":"Bozza/Pubblicato",
|
||||
"dashboard.header.grouping.menuButton.label":"Raggruppa per",
|
||||
|
||||
"dashboard.header.navigation.allArticles":"Tutti gli articoli",
|
||||
"dashboard.header.navigation.published":"Pubblicato",
|
||||
"dashboard.header.navigation.draft":"In bozza",
|
||||
|
||||
"dashboard.header.header.createContent":"Creare contenuti",
|
||||
"dashboard.header.header.createByContentType":"Crea per tipo di contenuto",
|
||||
"dashboard.header.header.createByTemplate":"Crea da modello",
|
||||
|
||||
"dashboard.header.pagination.first":"Primo",
|
||||
"dashboard.header.pagination.previous":"Precedente",
|
||||
"dashboard.header.pagination.next":"Prossimo",
|
||||
"dashboard.header.pagination.last":"Ultimo",
|
||||
|
||||
"dashboard.header.paginationStatus.text":"Visualizzazione {0} a {1} di {2} risultati",
|
||||
|
||||
"dashboard.header.projectSwitcher.label":"progetto",
|
||||
|
||||
"dashboard.header.refreshDashboard.label":"Aggiorna dashboard",
|
||||
|
||||
"dashboard.header.sorting.lastModified.asc":"Ultima modifica (asc)",
|
||||
"dashboard.header.sorting.lastModified.desc":"Ultima modifica (desc)",
|
||||
"dashboard.header.sorting.filename.asc":"Per nome file (asc)",
|
||||
"dashboard.header.sorting.filename.desc":"Per nome file (desc)",
|
||||
"dashboard.header.sorting.published.asc":"Pubblicato (asc)",
|
||||
"dashboard.header.sorting.published.desc":"Pubblicato (desc)",
|
||||
"dashboard.header.sorting.size.asc":"Dimensione (asc)",
|
||||
"dashboard.header.sorting.size.desc":"Dimensioni (desc)",
|
||||
"dashboard.header.sorting.caption.asc":"Didascalia (asc)",
|
||||
"dashboard.header.sorting.caption.desc":"Didascalia (desc)",
|
||||
"dashboard.header.sorting.alt.asc":"Alt (asc)",
|
||||
"dashboard.header.sorting.alt.desc":"Alt (desc)",
|
||||
"dashboard.header.sorting.label":"Ordina per",
|
||||
|
||||
"dashboard.header.startup.label":"Aprire all'avvio?",
|
||||
|
||||
"dashboard.header.tabs.contents":"Contenuto",
|
||||
"dashboard.header.tabs.media":"Media",
|
||||
"dashboard.header.tabs.snippets":"Snippets",
|
||||
"dashboard.header.tabs.data":"dati",
|
||||
"dashboard.header.tabs.taxonomies":"Tassonomie",
|
||||
|
||||
"dashboard.header.viewSwitch.toGrid":"Passa alla griglia",
|
||||
"dashboard.header.viewSwitch.toList":"Passa all'elenco",
|
||||
|
||||
"dashboard.layout.sponsor.support.msg":"Supporto Front Matter",
|
||||
"dashboard.layout.sponsor.review.label":"Recensisci",
|
||||
"dashboard.layout.sponsor.review.msg":"Recensisci Front Matter",
|
||||
|
||||
"dashboard.media.common.title":"Titolo",
|
||||
"dashboard.media.common.caption":"Didascalia",
|
||||
"dashboard.media.common.alt":"Testo alternativo",
|
||||
"dashboard.media.common.size":"Dimensioni",
|
||||
|
||||
"dashboard.media.dialog.title":"Visualizza dettagli",
|
||||
"dashboard.media.panel.close":"Chiudi pannello",
|
||||
"dashboard.media.metadata.panel.title":"Aggiornare i metadati",
|
||||
"dashboard.media.metadata.panel.description":"Specificare i metadati che si desidera impostare per il file.",
|
||||
"dashboard.media.metadata.panel.field.fileName":"Filename",
|
||||
"dashboard.media.metadata.panel.form.metadata.title":"Metadati",
|
||||
"dashboard.media.metadata.panel.form.information.title":"Informazione",
|
||||
"dashboard.media.metadata.panel.form.information.createdDate":"Creato",
|
||||
"dashboard.media.metadata.panel.form.information.modifiedDate":"Ultima modifica",
|
||||
"dashboard.media.metadata.panel.form.information.dimensions":"Dimensioni",
|
||||
"dashboard.media.metadata.panel.form.information.folder":"Cartella",
|
||||
|
||||
"dashboard.media.folderCreation.hexo.create":"Creare una cartella di risorse",
|
||||
"dashboard.media.folderCreation.folder.create":"Crea nuova cartella",
|
||||
|
||||
"dashboard.media.item.quickAction.insert.field":"Inserisci immagine per il campo \"{0}\"",
|
||||
"dashboard.media.item.quickAction.insert.markdown":"Inserisci immagine con markup markdown",
|
||||
"dashboard.media.item.quickAction.copy.path":"Copia percorso",
|
||||
"dashboard.media.item.quickAction.delete":"Elimina file multimediale",
|
||||
"dashboard.media.item.menuItem.edit.metadata":"Modificare i metadati",
|
||||
"dashboard.media.item.menuItem.insert.image":"Inserisci immagine",
|
||||
"dashboard.media.item.menuItem.reveal.media":"Rivela i media",
|
||||
"dashboard.media.item.infoDialog.snippet.description":"Seleziona lo snippet del file multimediale da utilizzare per il file multimediale corrente.",
|
||||
"dashboard.media.item.alert.delete.description":"Eliminare il file dalla cartella {0}?",
|
||||
|
||||
"dashboard.media.media.description":"Selezionare il file multimediale da aggiungere al contenuto.",
|
||||
"dashboard.media.media.dragAndDrop":"Puoi anche trascinare e rilasciare le immagini dal desktop e selezionarle una volta caricate.",
|
||||
"dashboard.media.media.folder.upload":"Carica su {0}",
|
||||
"dashboard.media.media.folder.default":"Nessuna cartella selezionata, i file eliminati verranno aggiunti alla cartella {0}",
|
||||
"dashboard.media.media.placeholder":"Nessun file multimediale da mostrare. Puoi trascinare e rilasciare nuovi file tenendo premuto il tasto [Maiusc].",
|
||||
"dashboard.media.media.contentFolder":"Cartella dei contenuti",
|
||||
"dashboard.media.media.publicFolder":"Cartella pubblica",
|
||||
|
||||
"dashboard.media.mediaHeaderTop.searchbox.placeholder":"Cerca nella cartella",
|
||||
|
||||
"dashboard.media.mediaSnippetForm.formDialog.title":"Inserisci supporto: {0}",
|
||||
"dashboard.media.mediaSnippetForm.formDialog.description":"Inserire il file multimediale {0} nell'articolo corrente",
|
||||
|
||||
"dashboard.preview.input.placeholder":"Inserisci un URL",
|
||||
"dashboard.preview.button.navigate.title":"Navigare",
|
||||
"dashboard.preview.button.refresh.title":"Aggiorna",
|
||||
"dashboard.preview.button.open.title":"Apri",
|
||||
|
||||
"dashboard.snippetsView.item.quickAction.editSnippet":"Modifica snippet",
|
||||
"dashboard.snippetsView.item.quickAction.deleteSnippet":"Eliminare snippet",
|
||||
"dashboard.snippetsView.item.quickAction.viewSnippet":"Visualizza file di frammento",
|
||||
"dashboard.snippetsView.item.insert.formDialog.title":"Inserisci frammento: {0}",
|
||||
"dashboard.snippetsView.item.insert.formDialog.description":"Inserisci il frammento di {0} nell'articolo corrente",
|
||||
"dashboard.snippetsView.item.edit.formDialog.title":"Modifica Snippet: {0}",
|
||||
"dashboard.snippetsView.item.edit.formDialog.description":"Modificare lo snippet {0}",
|
||||
"dashboard.snippetsView.item.alert.title":"Elimina snippet: {0}",
|
||||
"dashboard.snippetsView.item.alert.description":"Sei sicuro di voler eliminare lo snippet {0}?",
|
||||
|
||||
"dashboard.snippetsView.newForm.snippetInput.title.placeholder":"Titolo dello snippet",
|
||||
"dashboard.snippetsView.newForm.snippetInput.description.label":"Descrizione",
|
||||
"dashboard.snippetsView.newForm.snippetInput.description.placeholder":"Descrizione dello snippet",
|
||||
"dashboard.snippetsView.newForm.snippetInput.snippet.label":"Snippet",
|
||||
"dashboard.snippetsView.newForm.snippetInput.snippet.placeholder":"Contenuto dello snippet",
|
||||
"dashboard.snippetsView.newForm.snippetInput.isMediaSnippet.label":"È uno snippet multimediale?",
|
||||
"dashboard.snippetsView.newForm.snippetInput.isMediaSnippet.checkbox.label":"Snippet multimediale",
|
||||
"dashboard.snippetsView.newForm.snippetInput.isMediaSnippet.checkbox.description":"Utilizzare lo snippet corrente per inserire file multimediali nel contenuto.",
|
||||
"dashboard.snippetsView.newForm.snippetInput.docsButton.title":"Ulteriori informazioni sull'uso dei segnaposto degli snippet multimediali",
|
||||
"dashboard.snippetsView.newForm.snippetInput.docsButton.description":"Consulta la nostra documentazione dei segnaposto degli snippet multimediali per sapere quali segnaposto puoi usare.",
|
||||
|
||||
"dashboard.snippetsView.snippets.ariaLabel":"Intestazione Snippets",
|
||||
"dashboard.snippetsView.snippets.button.create":"Creare un nuovo snippet",
|
||||
"dashboard.snippetsView.snippets.select.description":"Seleziona lo snippet da aggiungere ai tuoi contenuti.",
|
||||
"dashboard.snippetsView.snippets.empty.message":"Nessun Snippet trovato",
|
||||
"dashboard.snippetsView.snippets.readMore":"Scopri di più per iniziare a usare gli snippet",
|
||||
"dashboard.snippetsView.snippets.formDialog.title":"Creare uno snippet",
|
||||
|
||||
"dashboard.steps.stepsToGetStarted.button.addFolder.title":"Aggiungi come cartella di contenuti a Front Matter",
|
||||
"dashboard.steps.stepsToGetStarted.initializeProject.name":"Inizializzare il progetto",
|
||||
"dashboard.steps.stepsToGetStarted.initializeProject.description":"Inizializzare il progetto creerà i file e le cartelle necessari per l'utilizzo del CMS Front Matter. Inizia facendo clic su questa azione.",
|
||||
"dashboard.steps.stepsToGetStarted.framework.name":"Predefiniti del framework",
|
||||
"dashboard.steps.stepsToGetStarted.framework.description":"Seleziona il generatore di siti o il framework per precompilare alcune delle impostazioni consigliate.",
|
||||
"dashboard.steps.stepsToGetStarted.framework.select":"Seleziona il tuo framework",
|
||||
"dashboard.steps.stepsToGetStarted.framework.select.other":"Altro",
|
||||
"dashboard.steps.stepsToGetStarted.assetsFolder.name":"Qual è la cartella delle risorse?",
|
||||
"dashboard.steps.stepsToGetStarted.assetsFolder.description":"Seleziona la cartella contenente le tue risorse. Questa cartella verrà utilizzata per archiviare tutti i file multimediali per i tuoi articoli.",
|
||||
"dashboard.steps.stepsToGetStarted.assetsFolder.public.title":"Utilizzare la cartella 'pubblica'",
|
||||
"dashboard.steps.stepsToGetStarted.assetsFolder.assets.title":"Utilizzare la cartella Astro assets (src/assets)",
|
||||
"dashboard.steps.stepsToGetStarted.assetsFolder.other.description":"Nel caso in cui si desideri configurare un'altra cartella, è possibile farlo manualmente nel file frontmatter.json.",
|
||||
"dashboard.steps.stepsToGetStarted.contentFolders.name":"Registrare le cartelle dei contenuti",
|
||||
"dashboard.steps.stepsToGetStarted.contentFolders.description":"Aggiungi una delle cartelle che abbiamo trovato nel tuo progetto come cartella di contenuti. Una volta impostata una cartella, Front Matter può essere utilizzato per elencare tutti i contenuti e consentire di creare contenuti.",
|
||||
"dashboard.steps.stepsToGetStarted.contentFolders.label":"Cartelle contenenti contenuto:",
|
||||
"dashboard.steps.stepsToGetStarted.contentFolders.information.description":"È inoltre possibile eseguire questa azione facendo clic con il pulsante destro del mouse sulla cartella nella visualizzazione Esplora risorse e selezionando Registra cartella",
|
||||
"dashboard.steps.stepsToGetStarted.tags.name":"Importa tutti i tag e le categorie (facoltativo)",
|
||||
"dashboard.steps.stepsToGetStarted.tags.description":"Ora che Front Matter conosce tutte le cartelle dei contenuti. Desideri importare tutti i tag e le categorie dai contenuti disponibili?",
|
||||
"dashboard.steps.stepsToGetStarted.showDashboard.name":"Mostra il dashboard",
|
||||
"dashboard.steps.stepsToGetStarted.showDashboard.description":"Una volta completate tutte le azioni, è possibile caricare la dashboard.",
|
||||
|
||||
"dashboard.taxonomyView.button.add.title":"Aggiungere {0} alle impostazioni della tassonomia",
|
||||
"dashboard.taxonomyView.button.edit.title":"Modifica {0}",
|
||||
"dashboard.taxonomyView.button.merge.title":"Unisci {0}",
|
||||
"dashboard.taxonomyView.button.move.title":"Passare a un altro tipo di tassonomia",
|
||||
"dashboard.taxonomyView.button.delete.title":"Elimina {0}",
|
||||
|
||||
"dashboard.taxonomyView.taxonomyLookup.button.title":"Mostra contenuti con {0} in {1}",
|
||||
|
||||
"dashboard.taxonomyView.taxonomyManager.description":"Crea, modifica e gestisci le {0} del tuo sito",
|
||||
"dashboard.taxonomyView.taxonomyManager.button.create":"Creare un nuovo valore {0}",
|
||||
"dashboard.taxonomyView.taxonomyManager.table.heading.name":"Nome",
|
||||
"dashboard.taxonomyView.taxonomyManager.table.heading.count":"Conteggio",
|
||||
"dashboard.taxonomyView.taxonomyManager.table.heading.action":"Azione",
|
||||
"dashboard.taxonomyView.taxonomyManager.table.row.empty":"Nessun {0} trovato",
|
||||
"dashboard.taxonomyView.taxonomyManager.table.unmapped.title":"Manca nelle impostazioni",
|
||||
|
||||
"dashboard.taxonomyView.taxonomyView.navigationBar.title":"Selezionare la tassonomia",
|
||||
"dashboard.taxonomyView.taxonomyView.button.import":"Tassonomia delle importazioni",
|
||||
"dashboard.taxonomyView.taxonomyView.navigationItem.tags":"Tag",
|
||||
"dashboard.taxonomyView.taxonomyView.navigationItem.categories":"Categorie",
|
||||
|
||||
"dashboard.unkownView.title":"La vista non esiste",
|
||||
"dashboard.unkownView.description":"Sembra che tu sia finito su una vista che non esiste. Riapri la dashboard.",
|
||||
|
||||
"dashboard.welcomeScreen.title":"Gestisci il tuo sito statico con Front Matter",
|
||||
"dashboard.welcomeScreen.thanks":"Grazie per aver scelto Front Matter!",
|
||||
"dashboard.welcomeScreen.description":"Cerchiamo di mirare a rendere Front Matter il più facile da usare possibile, ma se avete domande o suggerimenti. Non esitare a contattarci su GitHub.",
|
||||
"dashboard.welcomeScreen.link.github.title":"GitHub",
|
||||
"dashboard.welcomeScreen.link.github.label":"GitHub / Documentazione",
|
||||
"dashboard.welcomeScreen.link.sponsor.title":"Diventa sponsor",
|
||||
"dashboard.welcomeScreen.link.sponsor.label":"Sponsor",
|
||||
"dashboard.welcomeScreen.link.review.title":"Scrivi una recensione",
|
||||
"dashboard.welcomeScreen.link.review.label":"Recensione",
|
||||
"dashboard.welcomeScreen.actions.heading":"Esegui i passaggi successivi per iniziare con l'estensione",
|
||||
"dashboard.welcomeScreen.actions.description":"È inoltre possibile utilizzare l'estensione dal pannello laterale Front Matter. Lì troverai le azioni che puoi eseguire specificamente per le tue pagine.",
|
||||
"dashboard.welcomeScreen.actions.thanks":"Ci auguriamo che Front Matter vi piaccia!",
|
||||
|
||||
"panel.contentType.contentTypeValidator.title":"Tipo di contenuto",
|
||||
"panel.contentType.contentTypeValidator.hint":"Abbiamo notato differenze di campo tra il tipo di contenuto e i dati della prima questione. \n Si desidera creare, aggiornare o impostare il tipo di contenuto per questo contenuto?",
|
||||
"panel.contentType.contentTypeValidator.button.create":"Crea tipo di contenuto",
|
||||
"panel.contentType.contentTypeValidator.button.add":"Aggiungere campi mancanti a content-type",
|
||||
"panel.contentType.contentTypeValidator.button.change":"Modificare il tipo di contenuto del file",
|
||||
|
||||
"panel.dataBlock.dataBlockField.group.selected.edit":"Modifica: {0}",
|
||||
"panel.dataBlock.dataBlockField.group.selected.create":"Creare una nuova {0}",
|
||||
"panel.dataBlock.dataBlockField.group.select":"Seleziona un gruppo",
|
||||
"panel.dataBlock.dataBlockField.add":"Aggiungi {0}",
|
||||
|
||||
"panel.dataBlock.dataBlockRecord.edit":"Modifica record",
|
||||
"panel.dataBlock.dataBlockRecord.delete":"Elimina record",
|
||||
|
||||
"panel.dataBlock.dataBlockRecords.label":"Archivio",
|
||||
|
||||
"panel.dataBlock.dataBlockSelector.label":"Tipo di blocco",
|
||||
|
||||
"panel.errorBoundary.fieldBoundary.label":"Visualizzazione del campo non riuscita",
|
||||
|
||||
"panel.fields.choiceField.select":"Seleziona {0}",
|
||||
"panel.fields.choiceField.clear":"Pulisci valore",
|
||||
|
||||
"panel.fields.contentTypeRelationshipField.loading":"Recupero di possibili valori...",
|
||||
|
||||
"panel.fields.dateTimeField.button.pick":"Scegli la tua data",
|
||||
"panel.fields.dateTimeField.time":"Ore:",
|
||||
|
||||
"panel.fields.fieldMessage.required":"Il campo {0} è obbligatorio",
|
||||
|
||||
"panel.fields.fileField.delete":"Elimina file",
|
||||
"panel.fields.fileField.add":"Aggiungi il tuo {0}",
|
||||
|
||||
"panel.fields.imageFallback.label":"L'immagine non deve essere caricata",
|
||||
|
||||
"panel.fields.listField.edit":"Modifica record",
|
||||
"panel.fields.listField.delete":"Elimina record",
|
||||
|
||||
"panel.fields.previewImage.remove":"Rimuovi immagine",
|
||||
|
||||
"panel.fields.previewImageField.add":"Aggiungi il tuo {0}",
|
||||
|
||||
"panel.fields.slugField.update":"Aggiornamento disponibile",
|
||||
"panel.fields.slugField.generate":"Genera slug",
|
||||
|
||||
"panel.fields.textField.ai.message":"Usa Front Matter AI per suggerire {0}",
|
||||
"panel.fields.textField.ai.generate":"Genera suggerimenti...",
|
||||
"panel.fields.textField.loading":"caricamento",
|
||||
"panel.fields.textField.limit":"Limite di campi raggiunto {0}",
|
||||
|
||||
"panel.fields.wrapperField.unknown":"Tipo di campo sconosciuto: {0}",
|
||||
|
||||
"panel.actions.title":"Azioni",
|
||||
|
||||
"panel.articleDetails.title":"Più dettagli",
|
||||
"panel.articleDetails.type":"Digitare",
|
||||
"panel.articleDetails.total":"Totale",
|
||||
"panel.articleDetails.headings":"Intestazioni",
|
||||
"panel.articleDetails.paragraphs":"Paragrafi",
|
||||
"panel.articleDetails.internalLinks":"Collegamenti esterni",
|
||||
"panel.articleDetails.externalLinks":"Collegamenti esterni",
|
||||
"panel.articleDetails.images":"Immagini",
|
||||
|
||||
"panel.baseView.initialize":"Inizializzare il progetto",
|
||||
"panel.baseView.actions.title":"Azioni",
|
||||
"panel.baseView.action.openDashboard":"Apri dashboard",
|
||||
"panel.baseView.action.openPreview":"Apri anteprima",
|
||||
"panel.baseView.action.createContent":"Creare contenuti",
|
||||
"panel.baseView.empty":"Apri un file per visualizzare altre azioni",
|
||||
|
||||
"panel.fileList.label.singular":"file",
|
||||
"panel.fileList.label.plural":"file",
|
||||
|
||||
"panel.folderAndFiles.title":"Modifiche recenti",
|
||||
|
||||
"panel.globalSettings.title":"Impostazioni globali",
|
||||
"panel.globalSettings.action.modifiedDate.label":"Data di modifica",
|
||||
"panel.globalSettings.action.modifiedDate.description":"Aggiornamento automatico della data di modifica",
|
||||
"panel.globalSettings.action.frontMatter.label":"Evidenziazione di Front Matter",
|
||||
"panel.globalSettings.action.frontMatter.description":"Highlight Front Matter",
|
||||
"panel.globalSettings.action.preview.label":"Anteprima locale",
|
||||
"panel.globalSettings.action.preview.placeholder":"Esempio: {0}",
|
||||
"panel.globalSettings.action.server.label":"Comando server locale",
|
||||
"panel.globalSettings.action.server.placeholder":"Esempio: {0}",
|
||||
|
||||
"panel.metadata.title":"Metadati",
|
||||
|
||||
"panel.otherActions.title":"Altre azioni",
|
||||
"panel.otherActions.writingSettings.enabled":"Impostazioni di scrittura abilitate",
|
||||
"panel.otherActions.writingSettings.disabled":"Abilitare le impostazioni di scrittura",
|
||||
"panel.otherActions.centerMode":"Attiva/disattiva la modalità centrale",
|
||||
"panel.otherActions.createTemplate":"Crea modello",
|
||||
"panel.otherActions.revealFile":"Rivela il file nella cartella",
|
||||
"panel.otherActions.openProject":"Rivela cartella del progetto",
|
||||
"panel.otherActions.documentation":"Apri la documentazione",
|
||||
"panel.otherActions.settings":"Panoramica delle impostazioni",
|
||||
"panel.otherActions.issue":"Segnala un problema",
|
||||
|
||||
"panel.preview.title":"Apri anteprima",
|
||||
|
||||
"panel.publishAction.publish":"Pubblica",
|
||||
"panel.publishAction.unpublish":"Tornare alla bozza",
|
||||
|
||||
"panel.seoDetails.recommended":"Raccomandato",
|
||||
"panel.seoKeywordInfo.density":"Utilizzo delle parole chiave {0} *",
|
||||
"panel.seoKeywordInfo.validInfo.label":"Utilizzato nelle rubriche",
|
||||
"panel.seoKeywordInfo.validInfo.content":"Contenuto",
|
||||
"panel.seoKeywords.title":"Parole chiavi",
|
||||
"panel.seoKeywords.header.keyword":"Parola chiave",
|
||||
"panel.seoKeywords.header.details":"Dettagli",
|
||||
"panel.seoKeywords.density":"* Una densità di parole chiave dell'1-1,5% è sufficiente nella maggior parte dei casi.",
|
||||
"panel.seoStatus.title":"Consigli",
|
||||
"panel.seoStatus.header.property":"Proprietà",
|
||||
"panel.seoStatus.header.length":"Lunghezza",
|
||||
"panel.seoStatus.header.valid":"Valido",
|
||||
"panel.seoStatus.seoFieldInfo.characters":"{0} caratteri",
|
||||
"panel.seoStatus.seoFieldInfo.words":"{0} parole",
|
||||
"panel.seoStatus.seoFieldInfo.article":"Lunghezza dell'articolo",
|
||||
"panel.seoStatus.collapsible.title":"Stato SEO",
|
||||
"panel.seoStatus.required":"{0} o {1} è obbligatorio.",
|
||||
|
||||
"panel.slugAction.title":"Ottimizza slug",
|
||||
|
||||
"panel.spinner.loading":"Caricamento...",
|
||||
|
||||
"panel.startServerbutton.start":"Avvia Server",
|
||||
"panel.startServerbutton.stop":"Arrestare il Server",
|
||||
|
||||
"panel.tag.add":"Aggiungi {0} alle tue impostazioni",
|
||||
|
||||
"panel.tagPicker.inputPlaceholder.empty":"Scegli il tuo {0}",
|
||||
"panel.tagPicker.inputPlaceholder.disabled":"Hai raggiunto il limite di {0}",
|
||||
"panel.tagPicker.ai.suggest":"Usa Front Matter AI per suggerire {0}",
|
||||
"panel.tagPicker.ai.generating":"Genera suggerimenti...",
|
||||
"panel.tagPicker.limit":"Max.: {0}",
|
||||
"panel.tagPicker.unkown":"Aggiungi il tag sconosciuto",
|
||||
|
||||
"panel.tags.tag.warning":"Tieni presente che questo tag \"{0}\" non viene salvato nelle tue impostazioni. Una volta rimosso, sarà eliminato per sempre.",
|
||||
|
||||
"panel.viewPanel.mediaInsert":"Continuare nella dashboard multimediale per selezionare l'immagine che si desidera inserire."
|
||||
"common.add": "Aggiungi",
|
||||
"common.edit": "Modifica",
|
||||
"common.delete": "Elimina",
|
||||
"common.cancel": "Annulla",
|
||||
"common.clear": "Pulisci",
|
||||
"common.clear.value": "Pulisci valore",
|
||||
"common.search": "Ricerca",
|
||||
"common.save": "Salva",
|
||||
"common.menu": "Menu",
|
||||
"common.insert": "Inserisci",
|
||||
"common.insert.snippet": "Inserisci snippet",
|
||||
"common.title": "Titolo",
|
||||
"common.description": "Descrizione",
|
||||
"common.retry": "Riprova",
|
||||
"common.update": "Aggiorna",
|
||||
"common.information": "Informazioni",
|
||||
"common.important": "Importante",
|
||||
"common.sync": "Sincronizza",
|
||||
"common.slug": "Slug",
|
||||
"common.support": "Supporto",
|
||||
"common.remove.value": "Rimuovi {0}",
|
||||
"common.error.message": "Siamo spiacenti, qualcosa è andato storto.",
|
||||
"developer.title": "Modalità sviluppatore",
|
||||
"developer.reload.title": "Ricarica la dashboard",
|
||||
"developer.reload.label": "Ricarica",
|
||||
"developer.devTools.title": "Apri DevTools",
|
||||
"developer.devTools.label": "DevTools",
|
||||
"field.required": "Campo obbligatorio",
|
||||
"field.unknown": "Campo sconosciuto",
|
||||
"dashboard.chatbot.answer.answer": "Risposta",
|
||||
"dashboard.chatbot.answer.resources": "Risorse",
|
||||
"dashboard.chatbot.answer.warning": "Attenzione: Answers potrebbe sbagliarsi. In caso di dubbio, si prega di consultare la documentazione.",
|
||||
"dashboard.chatbot.chatbot.loading": "L'assistente si sta preparando",
|
||||
"dashboard.chatbot.chatbot.ready": "Sono pronto, cosa vuoi sapere?",
|
||||
"dashboard.chatbot.chatbox.placeholder": "Come posso configurare Front Matter?",
|
||||
"dashboard.chatbot.header.heading": "Chiedi a Front Matter AI",
|
||||
"dashboard.chatbot.header.description": "La nostra intelligenza artificiale, alimentata da mendable.ai, ha elaborato la documentazione e può assisterti con qualsiasi domanda relativa a Front Matter. Vai avanti e chiedi!",
|
||||
"dashboard.common.choiceButton.open": "Apri opzioni",
|
||||
"dashboard.contents.contentActions.actionMenuButton.title": "Menu",
|
||||
"dashboard.contents.contentActions.menuItem.view": "Vista",
|
||||
"dashboard.contents.contentActions.alert.title": "Elimina: {0}",
|
||||
"dashboard.contents.contentActions.alert.description": "Sei sicuro di voler eliminare il contenuto \"{0}\"?",
|
||||
"dashboard.contents.item.invalidTitle": "<titolo non valido>",
|
||||
"dashboard.contents.item.invalidDescription": "<Descrizione non valida>",
|
||||
"dashboard.contents.list.title": "Titolo",
|
||||
"dashboard.contents.list.date": "Data",
|
||||
"dashboard.contents.list.status": "Stato",
|
||||
"dashboard.contents.overview.noMarkdown": "Nessun markdown da mostrare",
|
||||
"dashboard.contents.overview.noFolders": "Assicurati di aver registrato una cartella di contenuti nel tuo progetto per consentire a Front Matter di trovare il contenuto.",
|
||||
"dashboard.contents.status.draft": "Bozza",
|
||||
"dashboard.contents.status.published": "Pubblicato",
|
||||
"dashboard.dataView.dataForm.modify": "Modificare i dati",
|
||||
"dashboard.dataView.dataForm.add": "Aggiungere nuovi dati",
|
||||
"dashboard.dataView.dataView.select": "Seleziona il tuo tipo di dati",
|
||||
"dashboard.dataView.dataView.title": "I tuoi {0} elementi di dati",
|
||||
"dashboard.dataView.dataView.add": "Aggiungere una nuova voce",
|
||||
"dashboard.dataView.dataView.empty": "Nessuna voce di dati {0} trovata",
|
||||
"dashboard.dataView.dataView.createOrModify": "Creare o modificare i dati {0}",
|
||||
"dashboard.dataView.dataView.getStarted": "Seleziona un tipo di dati per iniziare",
|
||||
"dashboard.dataView.dataView.noDataFiles": "Nessun file di dati trovato",
|
||||
"dashboard.dataView.dataView.getStarted.link": "Ulteriori informazioni per iniziare a utilizzare i file di dati",
|
||||
"dashboard.dataView.emptyView.heading": "Seleziona prima il tipo di data",
|
||||
"dashboard.dataView.sortableItem.editButton.title": "Modifica \"{0}\"",
|
||||
"dashboard.dataView.sortableItem.deleteButton.title": "Elimina \"{0}\"",
|
||||
"dashboard.dataView.sortableItem.alert.title": "Eliminare l'immissione dei dati",
|
||||
"dashboard.dataView.sortableItem.alert.description": "Sei sicuro di voler cancellare l'inserimento dei dati?",
|
||||
"dashboard.errorView.description": "Chiudere la dashboard e riprovare.",
|
||||
"dashboard.header.breadcrumb.home": "Home",
|
||||
"dashboard.header.clearFilters.title": "Rimuovi filtri, raggruppamento e ordinamento",
|
||||
"dashboard.header.filter.default": "Nessun filtro",
|
||||
"dashboard.header.folders.default": "Tutti i tipi",
|
||||
"dashboard.header.folders.menuButton.showing": "Risultati",
|
||||
"dashboard.header.grouping.option.none": "Nessuno",
|
||||
"dashboard.header.grouping.option.year": "Anno",
|
||||
"dashboard.header.grouping.option.draft": "Bozza/Pubblicato",
|
||||
"dashboard.header.grouping.menuButton.label": "Raggruppa per",
|
||||
"dashboard.header.navigation.allArticles": "Tutti gli articoli",
|
||||
"dashboard.header.navigation.published": "Pubblicato",
|
||||
"dashboard.header.navigation.draft": "In bozza",
|
||||
"dashboard.header.header.createContent": "Creare contenuti",
|
||||
"dashboard.header.header.createByContentType": "Crea per tipo di contenuto",
|
||||
"dashboard.header.header.createByTemplate": "Crea da modello",
|
||||
"dashboard.header.pagination.first": "Primo",
|
||||
"dashboard.header.pagination.previous": "Precedente",
|
||||
"dashboard.header.pagination.next": "Prossimo",
|
||||
"dashboard.header.pagination.last": "Ultimo",
|
||||
"dashboard.header.paginationStatus.text": "Visualizzazione {0} a {1} di {2} risultati",
|
||||
"dashboard.header.projectSwitcher.label": "progetto",
|
||||
"dashboard.header.refreshDashboard.label": "Aggiorna dashboard",
|
||||
"dashboard.header.sorting.lastModified.asc": "Ultima modifica (asc)",
|
||||
"dashboard.header.sorting.lastModified.desc": "Ultima modifica (desc)",
|
||||
"dashboard.header.sorting.filename.asc": "Per nome file (asc)",
|
||||
"dashboard.header.sorting.filename.desc": "Per nome file (desc)",
|
||||
"dashboard.header.sorting.published.asc": "Pubblicato (asc)",
|
||||
"dashboard.header.sorting.published.desc": "Pubblicato (desc)",
|
||||
"dashboard.header.sorting.size.asc": "Dimensione (asc)",
|
||||
"dashboard.header.sorting.size.desc": "Dimensioni (desc)",
|
||||
"dashboard.header.sorting.caption.asc": "Didascalia (asc)",
|
||||
"dashboard.header.sorting.caption.desc": "Didascalia (desc)",
|
||||
"dashboard.header.sorting.alt.asc": "Alt (asc)",
|
||||
"dashboard.header.sorting.alt.desc": "Alt (desc)",
|
||||
"dashboard.header.sorting.label": "Ordina per",
|
||||
"dashboard.header.startup.label": "Aprire all'avvio?",
|
||||
"dashboard.header.tabs.contents": "Contenuto",
|
||||
"dashboard.header.tabs.media": "Media",
|
||||
"dashboard.header.tabs.snippets": "Snippets",
|
||||
"dashboard.header.tabs.data": "dati",
|
||||
"dashboard.header.tabs.taxonomies": "Tassonomie",
|
||||
"dashboard.header.viewSwitch.toGrid": "Passa alla griglia",
|
||||
"dashboard.header.viewSwitch.toList": "Passa all'elenco",
|
||||
"dashboard.layout.sponsor.support.msg": "Supporto Front Matter",
|
||||
"dashboard.layout.sponsor.review.label": "Recensisci",
|
||||
"dashboard.layout.sponsor.review.msg": "Recensisci Front Matter",
|
||||
"dashboard.media.common.title": "Titolo",
|
||||
"dashboard.media.common.caption": "Didascalia",
|
||||
"dashboard.media.common.alt": "Testo alternativo",
|
||||
"dashboard.media.common.size": "Dimensioni",
|
||||
"dashboard.media.dialog.title": "Visualizza dettagli",
|
||||
"dashboard.media.panel.close": "Chiudi pannello",
|
||||
"dashboard.media.metadata.panel.title": "Aggiornare i metadati",
|
||||
"dashboard.media.metadata.panel.description": "Specificare i metadati che si desidera impostare per il file.",
|
||||
"dashboard.media.metadata.panel.field.fileName": "Filename",
|
||||
"dashboard.media.metadata.panel.form.metadata.title": "Metadati",
|
||||
"dashboard.media.metadata.panel.form.information.title": "Informazione",
|
||||
"dashboard.media.metadata.panel.form.information.createdDate": "Creato",
|
||||
"dashboard.media.metadata.panel.form.information.modifiedDate": "Ultima modifica",
|
||||
"dashboard.media.metadata.panel.form.information.dimensions": "Dimensioni",
|
||||
"dashboard.media.metadata.panel.form.information.folder": "Cartella",
|
||||
"dashboard.media.folderCreation.hexo.create": "Creare una cartella di risorse",
|
||||
"dashboard.media.folderCreation.folder.create": "Crea nuova cartella",
|
||||
"dashboard.media.item.quickAction.insert.field": "Inserisci immagine per il campo \"{0}\"",
|
||||
"dashboard.media.item.quickAction.insert.markdown": "Inserisci immagine con markup markdown",
|
||||
"dashboard.media.item.quickAction.copy.path": "Copia percorso",
|
||||
"dashboard.media.item.quickAction.delete": "Elimina file multimediale",
|
||||
"dashboard.media.item.menuItem.edit.metadata": "Modificare i metadati",
|
||||
"dashboard.media.item.menuItem.insert.image": "Inserisci immagine",
|
||||
"dashboard.media.item.menuItem.reveal.media": "Rivela i media",
|
||||
"dashboard.media.item.infoDialog.snippet.description": "Seleziona lo snippet del file multimediale da utilizzare per il file multimediale corrente.",
|
||||
"dashboard.media.item.alert.delete.description": "Eliminare il file dalla cartella {0}?",
|
||||
"dashboard.media.media.description": "Selezionare il file multimediale da aggiungere al contenuto.",
|
||||
"dashboard.media.media.dragAndDrop": "Puoi anche trascinare e rilasciare le immagini dal desktop e selezionarle una volta caricate.",
|
||||
"dashboard.media.media.folder.upload": "Carica su {0}",
|
||||
"dashboard.media.media.folder.default": "Nessuna cartella selezionata, i file eliminati verranno aggiunti alla cartella {0}",
|
||||
"dashboard.media.media.placeholder": "Nessun file multimediale da mostrare. Puoi trascinare e rilasciare nuovi file tenendo premuto il tasto [Maiusc].",
|
||||
"dashboard.media.media.contentFolder": "Cartella dei contenuti",
|
||||
"dashboard.media.media.publicFolder": "Cartella pubblica",
|
||||
"dashboard.media.mediaHeaderTop.searchbox.placeholder": "Cerca nella cartella",
|
||||
"dashboard.media.mediaSnippetForm.formDialog.title": "Inserisci supporto: {0}",
|
||||
"dashboard.media.mediaSnippetForm.formDialog.description": "Inserire il file multimediale {0} nell'articolo corrente",
|
||||
"dashboard.preview.input.placeholder": "Inserisci un URL",
|
||||
"dashboard.preview.button.navigate.title": "Navigare",
|
||||
"dashboard.preview.button.refresh.title": "Aggiorna",
|
||||
"dashboard.preview.button.open.title": "Apri",
|
||||
"dashboard.snippetsView.item.quickAction.editSnippet": "Modifica snippet",
|
||||
"dashboard.snippetsView.item.quickAction.deleteSnippet": "Eliminare snippet",
|
||||
"dashboard.snippetsView.item.quickAction.viewSnippet": "Visualizza file di frammento",
|
||||
"dashboard.snippetsView.item.insert.formDialog.title": "Inserisci frammento: {0}",
|
||||
"dashboard.snippetsView.item.insert.formDialog.description": "Inserisci il frammento di {0} nell'articolo corrente",
|
||||
"dashboard.snippetsView.item.edit.formDialog.title": "Modifica Snippet: {0}",
|
||||
"dashboard.snippetsView.item.edit.formDialog.description": "Modificare lo snippet {0}",
|
||||
"dashboard.snippetsView.item.alert.title": "Elimina snippet: {0}",
|
||||
"dashboard.snippetsView.item.alert.description": "Sei sicuro di voler eliminare lo snippet {0}?",
|
||||
"dashboard.snippetsView.newForm.snippetInput.title.placeholder": "Titolo dello snippet",
|
||||
"dashboard.snippetsView.newForm.snippetInput.description.label": "Descrizione",
|
||||
"dashboard.snippetsView.newForm.snippetInput.description.placeholder": "Descrizione dello snippet",
|
||||
"dashboard.snippetsView.newForm.snippetInput.snippet.label": "Snippet",
|
||||
"dashboard.snippetsView.newForm.snippetInput.snippet.placeholder": "Contenuto dello snippet",
|
||||
"dashboard.snippetsView.newForm.snippetInput.isMediaSnippet.label": "È uno snippet multimediale?",
|
||||
"dashboard.snippetsView.newForm.snippetInput.isMediaSnippet.checkbox.label": "Snippet multimediale",
|
||||
"dashboard.snippetsView.newForm.snippetInput.isMediaSnippet.checkbox.description": "Utilizzare lo snippet corrente per inserire file multimediali nel contenuto.",
|
||||
"dashboard.snippetsView.newForm.snippetInput.docsButton.title": "Ulteriori informazioni sull'uso dei segnaposto degli snippet multimediali",
|
||||
"dashboard.snippetsView.newForm.snippetInput.docsButton.description": "Consulta la nostra documentazione dei segnaposto degli snippet multimediali per sapere quali segnaposto puoi usare.",
|
||||
"dashboard.snippetsView.snippets.ariaLabel": "Intestazione Snippets",
|
||||
"dashboard.snippetsView.snippets.button.create": "Creare un nuovo snippet",
|
||||
"dashboard.snippetsView.snippets.select.description": "Seleziona lo snippet da aggiungere ai tuoi contenuti.",
|
||||
"dashboard.snippetsView.snippets.empty.message": "Nessun Snippet trovato",
|
||||
"dashboard.snippetsView.snippets.readMore": "Scopri di più per iniziare a usare gli snippet",
|
||||
"dashboard.snippetsView.snippets.formDialog.title": "Creare uno snippet",
|
||||
"dashboard.steps.stepsToGetStarted.button.addFolder.title": "Aggiungi come cartella di contenuti a Front Matter",
|
||||
"dashboard.steps.stepsToGetStarted.initializeProject.name": "Inizializzare il progetto",
|
||||
"dashboard.steps.stepsToGetStarted.initializeProject.description": "Inizializzare il progetto creerà i file e le cartelle necessari per l'utilizzo del CMS Front Matter. Inizia facendo clic su questa azione.",
|
||||
"dashboard.steps.stepsToGetStarted.framework.name": "Predefiniti del framework",
|
||||
"dashboard.steps.stepsToGetStarted.framework.description": "Seleziona il generatore di siti o il framework per precompilare alcune delle impostazioni consigliate.",
|
||||
"dashboard.steps.stepsToGetStarted.framework.select": "Seleziona il tuo framework",
|
||||
"dashboard.steps.stepsToGetStarted.framework.select.other": "Altro",
|
||||
"dashboard.steps.stepsToGetStarted.assetsFolder.name": "Qual è la cartella delle risorse?",
|
||||
"dashboard.steps.stepsToGetStarted.assetsFolder.description": "Seleziona la cartella contenente le tue risorse. Questa cartella verrà utilizzata per archiviare tutti i file multimediali per i tuoi articoli.",
|
||||
"dashboard.steps.stepsToGetStarted.assetsFolder.public.title": "Utilizzare la cartella 'pubblica'",
|
||||
"dashboard.steps.stepsToGetStarted.assetsFolder.assets.title": "Utilizzare la cartella Astro assets (src/assets)",
|
||||
"dashboard.steps.stepsToGetStarted.assetsFolder.other.description": "Nel caso in cui si desideri configurare un'altra cartella, è possibile farlo manualmente nel file frontmatter.json.",
|
||||
"dashboard.steps.stepsToGetStarted.contentFolders.name": "Registrare le cartelle dei contenuti",
|
||||
"dashboard.steps.stepsToGetStarted.contentFolders.description": "Aggiungi una delle cartelle che abbiamo trovato nel tuo progetto come cartella di contenuti. Una volta impostata una cartella, Front Matter può essere utilizzato per elencare tutti i contenuti e consentire di creare contenuti.",
|
||||
"dashboard.steps.stepsToGetStarted.contentFolders.label": "Cartelle contenenti contenuto:",
|
||||
"dashboard.steps.stepsToGetStarted.contentFolders.information.description": "È inoltre possibile eseguire questa azione facendo clic con il pulsante destro del mouse sulla cartella nella visualizzazione Esplora risorse e selezionando Registra cartella",
|
||||
"dashboard.steps.stepsToGetStarted.tags.name": "Importa tutti i tag e le categorie (facoltativo)",
|
||||
"dashboard.steps.stepsToGetStarted.tags.description": "Ora che Front Matter conosce tutte le cartelle dei contenuti. Desideri importare tutti i tag e le categorie dai contenuti disponibili?",
|
||||
"dashboard.steps.stepsToGetStarted.showDashboard.name": "Mostra il dashboard",
|
||||
"dashboard.steps.stepsToGetStarted.showDashboard.description": "Una volta completate tutte le azioni, è possibile caricare la dashboard.",
|
||||
"dashboard.taxonomyView.button.add.title": "Aggiungere {0} alle impostazioni della tassonomia",
|
||||
"dashboard.taxonomyView.button.edit.title": "Modifica {0}",
|
||||
"dashboard.taxonomyView.button.merge.title": "Unisci {0}",
|
||||
"dashboard.taxonomyView.button.move.title": "Passare a un altro tipo di tassonomia",
|
||||
"dashboard.taxonomyView.button.delete.title": "Elimina {0}",
|
||||
"dashboard.taxonomyView.taxonomyLookup.button.title": "Mostra contenuti con {0} in {1}",
|
||||
"dashboard.taxonomyView.taxonomyManager.description": "Crea, modifica e gestisci le {0} del tuo sito",
|
||||
"dashboard.taxonomyView.taxonomyManager.button.create": "Creare un nuovo valore {0}",
|
||||
"dashboard.taxonomyView.taxonomyManager.table.heading.name": "Nome",
|
||||
"dashboard.taxonomyView.taxonomyManager.table.heading.count": "Conteggio",
|
||||
"dashboard.taxonomyView.taxonomyManager.table.heading.action": "Azione",
|
||||
"dashboard.taxonomyView.taxonomyManager.table.row.empty": "Nessun {0} trovato",
|
||||
"dashboard.taxonomyView.taxonomyManager.table.unmapped.title": "Manca nelle impostazioni",
|
||||
"dashboard.taxonomyView.taxonomyView.navigationBar.title": "Selezionare la tassonomia",
|
||||
"dashboard.taxonomyView.taxonomyView.button.import": "Tassonomia delle importazioni",
|
||||
"dashboard.taxonomyView.taxonomyView.navigationItem.tags": "Tag",
|
||||
"dashboard.taxonomyView.taxonomyView.navigationItem.categories": "Categorie",
|
||||
"dashboard.unkownView.title": "La vista non esiste",
|
||||
"dashboard.unkownView.description": "Sembra che tu sia finito su una vista che non esiste. Riapri la dashboard.",
|
||||
"dashboard.welcomeScreen.title": "Gestisci il tuo sito statico con Front Matter",
|
||||
"dashboard.welcomeScreen.thanks": "Grazie per aver scelto Front Matter!",
|
||||
"dashboard.welcomeScreen.description": "Cerchiamo di mirare a rendere Front Matter il più facile da usare possibile, ma se avete domande o suggerimenti. Non esitare a contattarci su GitHub.",
|
||||
"dashboard.welcomeScreen.link.github.title": "GitHub",
|
||||
"dashboard.welcomeScreen.link.github.label": "GitHub / Documentazione",
|
||||
"dashboard.welcomeScreen.link.sponsor.title": "Diventa sponsor",
|
||||
"dashboard.welcomeScreen.link.sponsor.label": "Sponsor",
|
||||
"dashboard.welcomeScreen.link.review.title": "Scrivi una recensione",
|
||||
"dashboard.welcomeScreen.link.review.label": "Recensione",
|
||||
"dashboard.welcomeScreen.actions.heading": "Esegui i passaggi successivi per iniziare con l'estensione",
|
||||
"dashboard.welcomeScreen.actions.description": "È inoltre possibile utilizzare l'estensione dal pannello laterale Front Matter. Lì troverai le azioni che puoi eseguire specificamente per le tue pagine.",
|
||||
"dashboard.welcomeScreen.actions.thanks": "Ci auguriamo che Front Matter vi piaccia!",
|
||||
"panel.contentType.contentTypeValidator.title": "Tipo di contenuto",
|
||||
"panel.contentType.contentTypeValidator.hint": "Abbiamo notato differenze di campo tra il tipo di contenuto e i dati della prima questione. \n Si desidera creare, aggiornare o impostare il tipo di contenuto per questo contenuto?",
|
||||
"panel.contentType.contentTypeValidator.button.create": "Crea tipo di contenuto",
|
||||
"panel.contentType.contentTypeValidator.button.add": "Aggiungere campi mancanti a content-type",
|
||||
"panel.contentType.contentTypeValidator.button.change": "Modificare il tipo di contenuto del file",
|
||||
"panel.dataBlock.dataBlockField.group.selected.edit": "Modifica: {0}",
|
||||
"panel.dataBlock.dataBlockField.group.selected.create": "Creare una nuova {0}",
|
||||
"panel.dataBlock.dataBlockField.group.select": "Seleziona un gruppo",
|
||||
"panel.dataBlock.dataBlockField.add": "Aggiungi {0}",
|
||||
"panel.dataBlock.dataBlockRecord.edit": "Modifica record",
|
||||
"panel.dataBlock.dataBlockRecord.delete": "Elimina record",
|
||||
"panel.dataBlock.dataBlockRecords.label": "Archivio",
|
||||
"panel.dataBlock.dataBlockSelector.label": "Tipo di blocco",
|
||||
"panel.errorBoundary.fieldBoundary.label": "Visualizzazione del campo non riuscita",
|
||||
"panel.fields.choiceField.select": "Seleziona {0}",
|
||||
"panel.fields.choiceField.clear": "Pulisci valore",
|
||||
"panel.fields.contentTypeRelationshipField.loading": "Recupero di possibili valori...",
|
||||
"panel.fields.dateTimeField.button.pick": "Scegli la tua data",
|
||||
"panel.fields.dateTimeField.time": "Ore:",
|
||||
"panel.fields.fieldMessage.required": "Il campo {0} è obbligatorio",
|
||||
"panel.fields.fileField.delete": "Elimina file",
|
||||
"panel.fields.fileField.add": "Aggiungi il tuo {0}",
|
||||
"panel.fields.imageFallback.label": "L'immagine non deve essere caricata",
|
||||
"panel.fields.listField.edit": "Modifica record",
|
||||
"panel.fields.listField.delete": "Elimina record",
|
||||
"panel.fields.previewImage.remove": "Rimuovi immagine",
|
||||
"panel.fields.previewImageField.add": "Aggiungi il tuo {0}",
|
||||
"panel.fields.slugField.update": "Aggiornamento disponibile",
|
||||
"panel.fields.slugField.generate": "Genera slug",
|
||||
"panel.fields.textField.ai.message": "Usa Front Matter AI per suggerire {0}",
|
||||
"panel.fields.textField.ai.generate": "Genera suggerimenti...",
|
||||
"panel.fields.textField.loading": "caricamento",
|
||||
"panel.fields.textField.limit": "Limite di campi raggiunto {0}",
|
||||
"panel.fields.wrapperField.unknown": "Tipo di campo sconosciuto: {0}",
|
||||
"panel.actions.title": "Azioni",
|
||||
"panel.articleDetails.title": "Più dettagli",
|
||||
"panel.articleDetails.type": "Digitare",
|
||||
"panel.articleDetails.total": "Totale",
|
||||
"panel.articleDetails.headings": "Intestazioni",
|
||||
"panel.articleDetails.paragraphs": "Paragrafi",
|
||||
"panel.articleDetails.internalLinks": "Collegamenti esterni",
|
||||
"panel.articleDetails.externalLinks": "Collegamenti esterni",
|
||||
"panel.articleDetails.images": "Immagini",
|
||||
"panel.baseView.initialize": "Inizializzare il progetto",
|
||||
"panel.baseView.actions.title": "Azioni",
|
||||
"panel.baseView.action.openDashboard": "Apri dashboard",
|
||||
"panel.baseView.action.openPreview": "Apri anteprima",
|
||||
"panel.baseView.action.createContent": "Creare contenuti",
|
||||
"panel.baseView.empty": "Apri un file per visualizzare altre azioni",
|
||||
"panel.fileList.label.singular": "file",
|
||||
"panel.fileList.label.plural": "file",
|
||||
"panel.folderAndFiles.title": "Modifiche recenti",
|
||||
"panel.globalSettings.title": "Impostazioni globali",
|
||||
"panel.globalSettings.action.modifiedDate.label": "Data di modifica",
|
||||
"panel.globalSettings.action.modifiedDate.description": "Aggiornamento automatico della data di modifica",
|
||||
"panel.globalSettings.action.frontMatter.label": "Evidenziazione di Front Matter",
|
||||
"panel.globalSettings.action.frontMatter.description": "Highlight Front Matter",
|
||||
"panel.globalSettings.action.preview.label": "Anteprima locale",
|
||||
"panel.globalSettings.action.preview.placeholder": "Esempio: {0}",
|
||||
"panel.globalSettings.action.server.label": "Comando server locale",
|
||||
"panel.globalSettings.action.server.placeholder": "Esempio: {0}",
|
||||
"panel.metadata.title": "Metadati",
|
||||
"panel.otherActions.title": "Altre azioni",
|
||||
"panel.otherActions.writingSettings.enabled": "Impostazioni di scrittura abilitate",
|
||||
"panel.otherActions.writingSettings.disabled": "Abilitare le impostazioni di scrittura",
|
||||
"panel.otherActions.centerMode": "Attiva/disattiva la modalità centrale",
|
||||
"panel.otherActions.createTemplate": "Crea modello",
|
||||
"panel.otherActions.revealFile": "Rivela il file nella cartella",
|
||||
"panel.otherActions.openProject": "Rivela cartella del progetto",
|
||||
"panel.otherActions.documentation": "Apri la documentazione",
|
||||
"panel.otherActions.settings": "Panoramica delle impostazioni",
|
||||
"panel.otherActions.issue": "Segnala un problema",
|
||||
"panel.preview.title": "Apri anteprima",
|
||||
"panel.publishAction.publish": "Pubblica",
|
||||
"panel.publishAction.unpublish": "Tornare alla bozza",
|
||||
"panel.seoDetails.recommended": "Raccomandato",
|
||||
"panel.seoKeywordInfo.density": "Utilizzo delle parole chiave {0} *",
|
||||
"panel.seoKeywordInfo.validInfo.label": "Utilizzato nelle rubriche",
|
||||
"panel.seoKeywordInfo.validInfo.content": "Contenuto",
|
||||
"panel.seoKeywords.title": "Parole chiavi",
|
||||
"panel.seoKeywords.header.keyword": "Parola chiave",
|
||||
"panel.seoKeywords.header.details": "Dettagli",
|
||||
"panel.seoKeywords.density": "* Una densità di parole chiave dell'1-1,5% è sufficiente nella maggior parte dei casi.",
|
||||
"panel.seoStatus.title": "Consigli",
|
||||
"panel.seoStatus.header.property": "Proprietà",
|
||||
"panel.seoStatus.header.length": "Lunghezza",
|
||||
"panel.seoStatus.header.valid": "Valido",
|
||||
"panel.seoStatus.seoFieldInfo.characters": "{0} caratteri",
|
||||
"panel.seoStatus.seoFieldInfo.words": "{0} parole",
|
||||
"panel.seoStatus.seoFieldInfo.article": "Lunghezza dell'articolo",
|
||||
"panel.seoStatus.collapsible.title": "Stato SEO",
|
||||
"panel.seoStatus.required": "{0} o {1} è obbligatorio.",
|
||||
"panel.slugAction.title": "Ottimizza slug",
|
||||
"panel.spinner.loading": "Caricamento...",
|
||||
"panel.startServerbutton.start": "Avvia Server",
|
||||
"panel.startServerbutton.stop": "Arrestare il Server",
|
||||
"panel.tag.add": "Aggiungi {0} alle tue impostazioni",
|
||||
"panel.tagPicker.inputPlaceholder.empty": "Scegli il tuo {0}",
|
||||
"panel.tagPicker.inputPlaceholder.disabled": "Hai raggiunto il limite di {0}",
|
||||
"panel.tagPicker.ai.suggest": "Usa Front Matter AI per suggerire {0}",
|
||||
"panel.tagPicker.ai.generating": "Genera suggerimenti...",
|
||||
"panel.tagPicker.limit": "Max.: {0}",
|
||||
"panel.tagPicker.unkown": "Aggiungi il tag sconosciuto",
|
||||
"panel.tags.tag.warning": "Tieni presente che questo tag \"{0}\" non viene salvato nelle tue impostazioni. Una volta rimosso, sarà eliminato per sempre.",
|
||||
"panel.viewPanel.mediaInsert": "Continuare nella dashboard multimediale per selezionare l'immagine che si desidera inserire.",
|
||||
"dashboard.steps.stepsToGetStarted.template.name": "Usa un modello di configurazione",
|
||||
"dashboard.steps.stepsToGetStarted.template.description": "Seleziona un modello per riempire in anticipo il file frontmatter.json con le impostazioni consigliate.",
|
||||
"listeners.dashboard.settingsListener.triggerTemplate.notification": "File del modello copiati.",
|
||||
"common.openOnWebsite": "Apri sul sito web",
|
||||
"common.filter.value": "Filtra per {0}",
|
||||
"dashboard.media.detailsSlideOver.unmapped.description": "Vuoi riassegnare i metadati dei file non mappati?",
|
||||
"common.settings": "Impostazioni",
|
||||
"common.refreshSettings": "Aggiorna impostazioni",
|
||||
"common.pin": "Spilla",
|
||||
"common.unpin": "Rimuovere",
|
||||
"settings.view.common": "Comune",
|
||||
"settings.view.contentFolders": "Cartelle di contenuto",
|
||||
"settings.view.astro": "Astro",
|
||||
"settings.openOnStartup": "Apri dashboard all'avvio",
|
||||
"settings.contentTypes": "Tipi di contenuto",
|
||||
"settings.contentFolders": "Cartelle di contenuto",
|
||||
"settings.diagnostic": "Diagnostico",
|
||||
"settings.diagnostic.description": "È possibile eseguire la diagnostica per verificare l'intera configurazione CMS di Front Matter.",
|
||||
"settings.diagnostic.link": "Eseguire la diagnostica completa",
|
||||
"settings.commonSettings.website.title": "Impostazioni del sito Web e del SSG",
|
||||
"settings.commonSettings.previewUrl": "URL di anteprima",
|
||||
"settings.commonSettings.websiteUrl": "URL del sito web",
|
||||
"settings.commonSettings.startCommand": "Comando di avvio SSG/Framework",
|
||||
"dashboard.contents.overview.pinned": "Appuntato",
|
||||
"dashboard.steps.stepsToGetStarted.astroContentTypes.name": "Crea tipi di contenuto per le tue raccolte di contenuti Astro",
|
||||
"dashboard.welcomeScreen.link.documentation.label": "Documentazione",
|
||||
"dashboard.configuration.astro.astroContentTypes.empty": "Nessuna raccolta di contenuti Astro trovata.",
|
||||
"dashboard.configuration.astro.astroContentTypes.description": "Le seguenti raccolte di contenuti Astro e possono essere utilizzate per generare un tipo di contenuto."
|
||||
}
|
||||
@@ -298,7 +298,7 @@
|
||||
"panel.preview.title": "プレビューを表示",
|
||||
"panel.publishAction.publish": "公開",
|
||||
"panel.publishAction.unpublish": "下書きに戻す",
|
||||
"panel.seoDetails.recommended": "🚧: Recommended",
|
||||
"panel.seoDetails.recommended": "推奨",
|
||||
"panel.seoKeywordInfo.density": "キーワード出現率 {0} *",
|
||||
"panel.seoKeywordInfo.validInfo.label": "見出しへの利用",
|
||||
"panel.seoKeywordInfo.validInfo.content": "本文",
|
||||
@@ -332,5 +332,33 @@
|
||||
"dashboard.steps.stepsToGetStarted.assetsFolder.description": "記事のメディアファイルを保存するためのフォルダーを選択してください。",
|
||||
"dashboard.steps.stepsToGetStarted.assetsFolder.public.title": "'public'フォルダーを使用する",
|
||||
"dashboard.steps.stepsToGetStarted.assetsFolder.assets.title": "Astroアセットフォルダー(src/assets)を使用する",
|
||||
"dashboard.steps.stepsToGetStarted.assetsFolder.other.description": "別のフォルダを設定する場合は、frontmatter.jsonファイルで手動で行うことができます。"
|
||||
"dashboard.steps.stepsToGetStarted.assetsFolder.other.description": "別のフォルダを設定する場合は、frontmatter.jsonファイルで手動で行うことができます。",
|
||||
"dashboard.steps.stepsToGetStarted.template.name": "設定テンプレートを使用する",
|
||||
"dashboard.steps.stepsToGetStarted.template.description": "おすすめの設定でfrontmatter.jsonファイルを事前に埋めるテンプレートを選択します。",
|
||||
"listeners.dashboard.settingsListener.triggerTemplate.notification": "テンプレートファイルがコピーされました。",
|
||||
"common.openOnWebsite": "ウェブサイトで開く",
|
||||
"common.filter.value": "{0} でフィルタリング",
|
||||
"dashboard.media.detailsSlideOver.unmapped.description": "未割り当てのファイルのメタデータを再マップしますか",
|
||||
"common.settings": "設定",
|
||||
"common.refreshSettings": "設定の更新",
|
||||
"common.pin": "ピン",
|
||||
"common.unpin": "解除",
|
||||
"settings.view.common": "コモン",
|
||||
"settings.view.contentFolders": "コンテンツ フォルダー",
|
||||
"settings.view.astro": "アストロ",
|
||||
"settings.openOnStartup": "起動時にダッシュボードを開く",
|
||||
"settings.contentTypes": "コンテンツ タイプ",
|
||||
"settings.contentFolders": "コンテンツ フォルダー",
|
||||
"settings.diagnostic": "診断",
|
||||
"settings.diagnostic.description": "診断プログラムを実行して、フロントマター CMS 構成全体を確認できます。",
|
||||
"settings.diagnostic.link": "完全診断を実行する",
|
||||
"settings.commonSettings.website.title": "ウェブサイトとSSGの設定",
|
||||
"settings.commonSettings.previewUrl": "URL のプレビュー",
|
||||
"settings.commonSettings.websiteUrl": "ウェブサイトの URL",
|
||||
"settings.commonSettings.startCommand": "SSG/フレームワーク起動コマンド",
|
||||
"dashboard.contents.overview.pinned": "固定",
|
||||
"dashboard.steps.stepsToGetStarted.astroContentTypes.name": "Astroコンテンツコレクションのコンテンツタイプを作成する",
|
||||
"dashboard.welcomeScreen.link.documentation.label": "ドキュメンテーション",
|
||||
"dashboard.configuration.astro.astroContentTypes.empty": "Astroコンテンツコレクションが見つかりません。",
|
||||
"dashboard.configuration.astro.astroContentTypes.description": "以下のAstroコンテンツコレクションは、コンテンツタイプを生成するために使用できます。"
|
||||
}
|
||||
@@ -20,7 +20,29 @@
|
||||
"common.slug": "Slug",
|
||||
"common.support": "Support",
|
||||
"common.remove.value": "Remove {0}",
|
||||
"common.filter.value": "Filter by {0}",
|
||||
"common.error.message": "Sorry, something went wrong.",
|
||||
"common.openOnWebsite": "Open on website",
|
||||
"common.settings": "Settings",
|
||||
"common.refreshSettings": "Refresh settings",
|
||||
"common.pin": "Pin",
|
||||
"common.unpin": "Unpin",
|
||||
"common.noResults": "No results",
|
||||
|
||||
"settings.view.common": "Common",
|
||||
"settings.view.contentFolders": "Content folders",
|
||||
"settings.view.astro": "Astro",
|
||||
"settings.openOnStartup": "Open dashboard on startup",
|
||||
"settings.contentTypes": "Content types",
|
||||
"settings.contentFolders": "Content folders",
|
||||
"settings.diagnostic": "Diagnostic",
|
||||
"settings.diagnostic.description": "You can run the diagnostics to check the whole Front Matter CMS configuration.",
|
||||
"settings.diagnostic.link": "Run full diagnostics",
|
||||
|
||||
"settings.commonSettings.website.title": "Website and SSG settings",
|
||||
"settings.commonSettings.previewUrl": "Preview URL",
|
||||
"settings.commonSettings.websiteUrl": "Website URL",
|
||||
"settings.commonSettings.startCommand": "SSG/Framework start command",
|
||||
|
||||
"developer.title": "Developer mode",
|
||||
"developer.reload.title": "Reload the dashboard",
|
||||
@@ -59,9 +81,11 @@
|
||||
|
||||
"dashboard.contents.overview.noMarkdown": "No Markdown to show",
|
||||
"dashboard.contents.overview.noFolders": "Make sure you registered a content folder in your project to let Front Matter find the contents.",
|
||||
"dashboard.contents.overview.pinned": "Pinned",
|
||||
|
||||
"dashboard.contents.status.draft": "Draft",
|
||||
"dashboard.contents.status.published": "Published",
|
||||
"dashboard.contents.status.scheduled": "Scheduled",
|
||||
|
||||
"dashboard.dataView.dataForm.modify": "Modify the data",
|
||||
"dashboard.dataView.dataForm.add": "Add new data",
|
||||
@@ -100,6 +124,7 @@
|
||||
|
||||
"dashboard.header.navigation.allArticles": "All articles",
|
||||
"dashboard.header.navigation.published": "Published",
|
||||
"dashboard.header.navigation.scheduled": "Scheduled",
|
||||
"dashboard.header.navigation.draft": "In draft",
|
||||
|
||||
"dashboard.header.header.createContent": "Create content",
|
||||
@@ -130,7 +155,7 @@
|
||||
"dashboard.header.sorting.alt.asc": "Alt (asc)",
|
||||
"dashboard.header.sorting.alt.desc": "Alt (desc)",
|
||||
"dashboard.header.sorting.label": "Sort by",
|
||||
|
||||
|
||||
"dashboard.header.startup.label": "Open on startup?",
|
||||
|
||||
"dashboard.header.tabs.contents": "Contents",
|
||||
@@ -242,6 +267,9 @@
|
||||
"dashboard.steps.stepsToGetStarted.tags.description": "Now that Front Matter knows all the content folders. Would you like to import all tags and categories from the available content?",
|
||||
"dashboard.steps.stepsToGetStarted.showDashboard.name": "Show the dashboard",
|
||||
"dashboard.steps.stepsToGetStarted.showDashboard.description": "Once all actions are completed, the dashboard can be loaded.",
|
||||
"dashboard.steps.stepsToGetStarted.template.name": "Use a configuration template",
|
||||
"dashboard.steps.stepsToGetStarted.template.description": "Select a template to prefill the frontmatter.json file with the recommended settings.",
|
||||
"dashboard.steps.stepsToGetStarted.astroContentTypes.name": "Create Content-Types for your Astro Content Collections",
|
||||
|
||||
"dashboard.taxonomyView.button.add.title": "Add {0} to taxonomy settings",
|
||||
"dashboard.taxonomyView.button.edit.title": "Edit {0}",
|
||||
@@ -271,7 +299,8 @@
|
||||
"dashboard.welcomeScreen.thanks": "Thank you for using Front Matter!",
|
||||
"dashboard.welcomeScreen.description": "We try to aim to make Front Matter as easy to use as possible, but if you have any questions or suggestions. Please don't hesitate to reach out to us on GitHub.",
|
||||
"dashboard.welcomeScreen.link.github.title": "GitHub",
|
||||
"dashboard.welcomeScreen.link.github.label": "GitHub / Documentation",
|
||||
"dashboard.welcomeScreen.link.github.label": "GitHub",
|
||||
"dashboard.welcomeScreen.link.documentation.label": "Documentation",
|
||||
"dashboard.welcomeScreen.link.sponsor.title": "Become a sponsor",
|
||||
"dashboard.welcomeScreen.link.sponsor.label": "Sponsor",
|
||||
"dashboard.welcomeScreen.link.review.title": "Write a review",
|
||||
@@ -280,6 +309,11 @@
|
||||
"dashboard.welcomeScreen.actions.description": "You can also use the extension from the Front Matter side panel. There you will find the actions you can perform specifically for your pages.",
|
||||
"dashboard.welcomeScreen.actions.thanks": "We hope you enjoy Front Matter!",
|
||||
|
||||
"dashboard.media.detailsSlideOver.unmapped.description": "Do you want to remap the metadata of unmapped files?",
|
||||
|
||||
"dashboard.configuration.astro.astroContentTypes.empty": "No Astro Content Collections found.",
|
||||
"dashboard.configuration.astro.astroContentTypes.description": "The following Astro Content Collections and can be used to generate a content-type.",
|
||||
|
||||
"panel.contentType.contentTypeValidator.title": "Content-type",
|
||||
"panel.contentType.contentTypeValidator.hint": "We noticed field differences between the content-type and the front matter data. \n Would you like to create, update, or set the content-type for this content?",
|
||||
"panel.contentType.contentTypeValidator.button.create": "Create content-type",
|
||||
@@ -346,7 +380,6 @@
|
||||
"panel.baseView.initialize": "Initialize project",
|
||||
"panel.baseView.actions.title": "Actions",
|
||||
"panel.baseView.action.openDashboard": "Open dashboard",
|
||||
"panel.baseView.action.openPreview": "Open preview",
|
||||
"panel.baseView.action.createContent": "Create content",
|
||||
"panel.baseView.empty": "Open a file to see more actions",
|
||||
|
||||
@@ -422,5 +455,7 @@
|
||||
|
||||
"panel.tags.tag.warning": "Be aware, this tag \"{0}\" is not saved in your settings. Once removed, it will be gone forever.",
|
||||
|
||||
"panel.viewPanel.mediaInsert": "Continue in the media dashboard to select the image you want to insert."
|
||||
"panel.viewPanel.mediaInsert": "Continue in the media dashboard to select the image you want to insert.",
|
||||
|
||||
"listeners.dashboard.settingsListener.triggerTemplate.notification": "Template files copied."
|
||||
}
|
||||
152
package-lock.json
generated
@@ -1,18 +1,18 @@
|
||||
{
|
||||
"name": "vscode-front-matter-beta",
|
||||
"version": "9.1.0",
|
||||
"version": "9.4.0",
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "vscode-front-matter-beta",
|
||||
"version": "9.1.0",
|
||||
"version": "9.4.0",
|
||||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
"@actions/core": "^1.10.0",
|
||||
"@bendera/vscode-webview-elements": "0.6.2",
|
||||
"@estruyf/vscode": "^1.1.0",
|
||||
"@headlessui/react": "1.5.0",
|
||||
"@headlessui/react": "^1.7.17",
|
||||
"@heroicons/react": "1.0.4",
|
||||
"@iarna/toml": "2.2.3",
|
||||
"@octokit/rest": "^18.12.0",
|
||||
@@ -41,7 +41,7 @@
|
||||
"@typescript-eslint/parser": "^5.50.0",
|
||||
"@vscode/codicons": "0.0.20",
|
||||
"@vscode/l10n": "^0.0.14",
|
||||
"@vscode/webview-ui-toolkit": "^0.9.3",
|
||||
"@vscode/webview-ui-toolkit": "^1.2.2",
|
||||
"@webpack-cli/serve": "^1.7.0",
|
||||
"ajv": "^8.12.0",
|
||||
"array-move": "^4.0.0",
|
||||
@@ -51,9 +51,11 @@
|
||||
"cheerio": "1.0.0-rc.12",
|
||||
"css-loader": "5.2.7",
|
||||
"date-fns": "2.23.0",
|
||||
"dotenv": "^16.3.1",
|
||||
"downshift": "6.0.6",
|
||||
"eslint": "^8.33.0",
|
||||
"fuse.js": "6.5.3",
|
||||
"github-directory-downloader": "^1.3.6",
|
||||
"glob": "7.1.6",
|
||||
"gray-matter": "4.0.3",
|
||||
"html-loader": "1.3.2",
|
||||
@@ -109,6 +111,7 @@
|
||||
"webpack-bundle-analyzer": "^4.7.0",
|
||||
"webpack-cli": "^4.10.0",
|
||||
"webpack-dev-server": "^4.11.1",
|
||||
"webpack-ignore-dynamic-require": "^1.0.0",
|
||||
"yaml": "^2.2.1",
|
||||
"yawn-yaml": "^1.5.0"
|
||||
},
|
||||
@@ -345,9 +348,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@headlessui/react": {
|
||||
"version": "1.5.0",
|
||||
"version": "1.7.17",
|
||||
"resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.17.tgz",
|
||||
"integrity": "sha512-4am+tzvkqDSSgiwrsEpGWqgGo9dz8qU5M3znCkC4PgkpY4HcCZzEDEvozltGGGHIKl9jbXbZPSH5TWn4sWJdow==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"client-only": "^0.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
},
|
||||
@@ -1622,13 +1629,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@vscode/webview-ui-toolkit": {
|
||||
"version": "0.9.3",
|
||||
"resolved": "https://registry.npmjs.org/@vscode/webview-ui-toolkit/-/webview-ui-toolkit-0.9.3.tgz",
|
||||
"integrity": "sha512-uEEpTVA21zkHtWMR8TPT7vbIZ1+tvfhQPThEdmmDjh0PulKPvaAVNqnGbQitU3F9GVqpq2AdIKAq6N1jFeBoXg==",
|
||||
"version": "1.2.2",
|
||||
"resolved": "https://registry.npmjs.org/@vscode/webview-ui-toolkit/-/webview-ui-toolkit-1.2.2.tgz",
|
||||
"integrity": "sha512-xIQoF4FC3Xh6d7KNKIoIezSiFWYFuf6gQMdDyKueKBFGeKwaHWEn+dY2g3makvvEsNMEDji/woEwvg9QSbuUsw==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@microsoft/fast-element": "^1.6.2",
|
||||
"@microsoft/fast-foundation": "^2.34.0",
|
||||
"@microsoft/fast-foundation": "^2.38.0",
|
||||
"@microsoft/fast-react-wrapper": "^0.1.18"
|
||||
},
|
||||
"peerDependencies": {
|
||||
@@ -2146,6 +2153,15 @@
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/at-least-node": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
|
||||
"integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">= 4.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/attr-accept": {
|
||||
"version": "2.2.2",
|
||||
"dev": true,
|
||||
@@ -2948,6 +2964,12 @@
|
||||
"node": ">= 4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/client-only": {
|
||||
"version": "0.0.1",
|
||||
"resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
|
||||
"integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/clipboardy": {
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz",
|
||||
@@ -3806,6 +3828,18 @@
|
||||
"tslib": "^1.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/dotenv": {
|
||||
"version": "16.3.1",
|
||||
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz",
|
||||
"integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/motdotla/dotenv?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/downshift": {
|
||||
"version": "6.0.6",
|
||||
"dev": true,
|
||||
@@ -4912,6 +4946,21 @@
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/fs-extra": {
|
||||
"version": "9.1.0",
|
||||
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
|
||||
"integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"at-least-node": "^1.0.0",
|
||||
"graceful-fs": "^4.2.0",
|
||||
"jsonfile": "^6.0.1",
|
||||
"universalify": "^2.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/fs-monkey": {
|
||||
"version": "1.0.3",
|
||||
"dev": true,
|
||||
@@ -5004,6 +5053,20 @@
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/github-directory-downloader": {
|
||||
"version": "1.3.6",
|
||||
"resolved": "https://registry.npmjs.org/github-directory-downloader/-/github-directory-downloader-1.3.6.tgz",
|
||||
"integrity": "sha512-k43h2cjdE5FIpM+0aYuK4DTdTZ2FcopgbY8kvzR2hihdq/gRyINrLDpLlFrkVID6sTi0vSaBqVJm7goLcbBxQg==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"fs-extra": "^9.0.1",
|
||||
"node-fetch": "^2.6.1",
|
||||
"yargs-parser": "^20.2.4"
|
||||
},
|
||||
"bin": {
|
||||
"github-directory-downloader": "bin/cli.js"
|
||||
}
|
||||
},
|
||||
"node_modules/github-from-package": {
|
||||
"version": "0.0.0",
|
||||
"resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
|
||||
@@ -12685,6 +12748,12 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/webpack-ignore-dynamic-require": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/webpack-ignore-dynamic-require/-/webpack-ignore-dynamic-require-1.0.0.tgz",
|
||||
"integrity": "sha512-WeGFPgwDochKPwizAu5XsHcPq3aaQLl2E+n1piD/VPGNUo5HIwrtURWNMfrPDfkHVOx+flkAihXbUiILAv5x4Q==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/webpack-merge": {
|
||||
"version": "5.8.0",
|
||||
"dev": true,
|
||||
@@ -13255,9 +13324,13 @@
|
||||
}
|
||||
},
|
||||
"@headlessui/react": {
|
||||
"version": "1.5.0",
|
||||
"version": "1.7.17",
|
||||
"resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.17.tgz",
|
||||
"integrity": "sha512-4am+tzvkqDSSgiwrsEpGWqgGo9dz8qU5M3znCkC4PgkpY4HcCZzEDEvozltGGGHIKl9jbXbZPSH5TWn4sWJdow==",
|
||||
"dev": true,
|
||||
"requires": {}
|
||||
"requires": {
|
||||
"client-only": "^0.0.1"
|
||||
}
|
||||
},
|
||||
"@heroicons/react": {
|
||||
"version": "1.0.4",
|
||||
@@ -14254,13 +14327,13 @@
|
||||
}
|
||||
},
|
||||
"@vscode/webview-ui-toolkit": {
|
||||
"version": "0.9.3",
|
||||
"resolved": "https://registry.npmjs.org/@vscode/webview-ui-toolkit/-/webview-ui-toolkit-0.9.3.tgz",
|
||||
"integrity": "sha512-uEEpTVA21zkHtWMR8TPT7vbIZ1+tvfhQPThEdmmDjh0PulKPvaAVNqnGbQitU3F9GVqpq2AdIKAq6N1jFeBoXg==",
|
||||
"version": "1.2.2",
|
||||
"resolved": "https://registry.npmjs.org/@vscode/webview-ui-toolkit/-/webview-ui-toolkit-1.2.2.tgz",
|
||||
"integrity": "sha512-xIQoF4FC3Xh6d7KNKIoIezSiFWYFuf6gQMdDyKueKBFGeKwaHWEn+dY2g3makvvEsNMEDji/woEwvg9QSbuUsw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@microsoft/fast-element": "^1.6.2",
|
||||
"@microsoft/fast-foundation": "^2.34.0",
|
||||
"@microsoft/fast-foundation": "^2.38.0",
|
||||
"@microsoft/fast-react-wrapper": "^0.1.18"
|
||||
}
|
||||
},
|
||||
@@ -14669,6 +14742,12 @@
|
||||
"version": "0.4.0",
|
||||
"dev": true
|
||||
},
|
||||
"at-least-node": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
|
||||
"integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
|
||||
"dev": true
|
||||
},
|
||||
"attr-accept": {
|
||||
"version": "2.2.2",
|
||||
"dev": true
|
||||
@@ -15207,6 +15286,12 @@
|
||||
"source-map": "~0.6.0"
|
||||
}
|
||||
},
|
||||
"client-only": {
|
||||
"version": "0.0.1",
|
||||
"resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
|
||||
"integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
|
||||
"dev": true
|
||||
},
|
||||
"clipboardy": {
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz",
|
||||
@@ -15803,6 +15888,12 @@
|
||||
"tslib": "^1.10.0"
|
||||
}
|
||||
},
|
||||
"dotenv": {
|
||||
"version": "16.3.1",
|
||||
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz",
|
||||
"integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==",
|
||||
"dev": true
|
||||
},
|
||||
"downshift": {
|
||||
"version": "6.0.6",
|
||||
"dev": true,
|
||||
@@ -16606,6 +16697,18 @@
|
||||
"version": "1.0.0",
|
||||
"dev": true
|
||||
},
|
||||
"fs-extra": {
|
||||
"version": "9.1.0",
|
||||
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
|
||||
"integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"at-least-node": "^1.0.0",
|
||||
"graceful-fs": "^4.2.0",
|
||||
"jsonfile": "^6.0.1",
|
||||
"universalify": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"fs-monkey": {
|
||||
"version": "1.0.3",
|
||||
"dev": true
|
||||
@@ -16660,6 +16763,17 @@
|
||||
"get-intrinsic": "^1.1.1"
|
||||
}
|
||||
},
|
||||
"github-directory-downloader": {
|
||||
"version": "1.3.6",
|
||||
"resolved": "https://registry.npmjs.org/github-directory-downloader/-/github-directory-downloader-1.3.6.tgz",
|
||||
"integrity": "sha512-k43h2cjdE5FIpM+0aYuK4DTdTZ2FcopgbY8kvzR2hihdq/gRyINrLDpLlFrkVID6sTi0vSaBqVJm7goLcbBxQg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"fs-extra": "^9.0.1",
|
||||
"node-fetch": "^2.6.1",
|
||||
"yargs-parser": "^20.2.4"
|
||||
}
|
||||
},
|
||||
"github-from-package": {
|
||||
"version": "0.0.0",
|
||||
"resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
|
||||
@@ -21814,6 +21928,12 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"webpack-ignore-dynamic-require": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/webpack-ignore-dynamic-require/-/webpack-ignore-dynamic-require-1.0.0.tgz",
|
||||
"integrity": "sha512-WeGFPgwDochKPwizAu5XsHcPq3aaQLl2E+n1piD/VPGNUo5HIwrtURWNMfrPDfkHVOx+flkAihXbUiILAv5x4Q==",
|
||||
"dev": true
|
||||
},
|
||||
"webpack-merge": {
|
||||
"version": "5.8.0",
|
||||
"dev": true,
|
||||
|
||||
400
package.json
@@ -3,14 +3,15 @@
|
||||
"displayName": "Front Matter CMS",
|
||||
"description": "Front Matter is a CMS that runs within Visual Studio Code. It gives you the power and control of a full-blown CMS while also providing you the flexibility and speed of the static site generator of your choice like: Hugo, Jekyll, Docusaurus, NextJs, Gatsby, and many more...",
|
||||
"icon": "assets/frontmatter-teal-128x128.png",
|
||||
"version": "9.1.0",
|
||||
"version": "9.4.0",
|
||||
"preview": false,
|
||||
"publisher": "eliostruyf",
|
||||
"galleryBanner": {
|
||||
"color": "#0e131f",
|
||||
"theme": "dark"
|
||||
},
|
||||
"badges": [{
|
||||
"badges": [
|
||||
{
|
||||
"description": "version",
|
||||
"url": "https://img.shields.io/github/package-json/v/estruyf/vscode-front-matter?color=green&label=vscode-front-matter&style=flat-square",
|
||||
"href": "https://github.com/estruyf/vscode-front-matter"
|
||||
@@ -55,13 +56,23 @@
|
||||
],
|
||||
"main": "./dist/extension.js",
|
||||
"contributes": {
|
||||
"icons": {
|
||||
"fm-logo": {
|
||||
"description": "Front Matter icon",
|
||||
"default": {
|
||||
"fontPath": "assets/frontmatter.woff",
|
||||
"fontCharacter": "\\e900"
|
||||
}
|
||||
}
|
||||
},
|
||||
"configurationDefaults": {
|
||||
"files.associations": {
|
||||
"**/frontmatter.json": "jsonc",
|
||||
"**/.frontmatter/config/*.json": "jsonc"
|
||||
}
|
||||
},
|
||||
"keybindings": [{
|
||||
"keybindings": [
|
||||
{
|
||||
"command": "frontMatter.dashboard",
|
||||
"key": "alt+d"
|
||||
},
|
||||
@@ -79,23 +90,25 @@
|
||||
}
|
||||
],
|
||||
"viewsContainers": {
|
||||
"activitybar": [{
|
||||
"id": "frontmatter-explorer",
|
||||
"title": "Front Matter",
|
||||
"icon": "assets/frontmatter-short-min.svg"
|
||||
}]
|
||||
"activitybar": [
|
||||
{
|
||||
"id": "frontmatter-explorer",
|
||||
"title": "FM",
|
||||
"icon": "$(fm-logo)"
|
||||
}
|
||||
]
|
||||
},
|
||||
"views": {
|
||||
"frontmatter-explorer": [{
|
||||
"id": "frontMatter.explorer",
|
||||
"name": "Front Matter",
|
||||
"icon": "assets/frontmatter-short-min.svg",
|
||||
"contextualTitle": "Front Matter",
|
||||
"type": "webview"
|
||||
}]
|
||||
"frontmatter-explorer": [
|
||||
{
|
||||
"id": "frontMatter.explorer",
|
||||
"name": "Front Matter",
|
||||
"icon": "$(fm-logo)",
|
||||
"type": "webview"
|
||||
}
|
||||
]
|
||||
},
|
||||
"configuration": {
|
||||
"$id": "#globalconfiguration",
|
||||
"title": "%settings.configuration.title%",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
@@ -115,7 +128,7 @@
|
||||
"markdownDescription": "%setting.frontMatter.projects.items.properties.default.markdownDescription%"
|
||||
},
|
||||
"configuration": {
|
||||
"$ref": "#globalconfiguration"
|
||||
"$ref": "https://frontmatter.codes/frontmatter.schema.json"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -147,6 +160,11 @@
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"frontMatter.config.dynamicFilePath": {
|
||||
"type": "string",
|
||||
"markdownDescription": "%setting.frontMatter.config.dynamicFilePath.markdownDescription%",
|
||||
"default": ""
|
||||
},
|
||||
"frontMatter.content.autoUpdateDate": {
|
||||
"type": "boolean",
|
||||
"default": false,
|
||||
@@ -156,7 +174,8 @@
|
||||
"frontMatter.content.defaultFileType": {
|
||||
"type": "string",
|
||||
"default": "md",
|
||||
"oneOf": [{
|
||||
"oneOf": [
|
||||
{
|
||||
"enum": [
|
||||
"md",
|
||||
"mdx"
|
||||
@@ -172,7 +191,8 @@
|
||||
"frontMatter.content.defaultSorting": {
|
||||
"type": "string",
|
||||
"default": "",
|
||||
"oneOf": [{
|
||||
"oneOf": [
|
||||
{
|
||||
"enum": [
|
||||
"LastModifiedAsc",
|
||||
"LastModifiedDesc",
|
||||
@@ -286,6 +306,11 @@
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"disableCreation": {
|
||||
"type": "boolean",
|
||||
"default": false,
|
||||
"description": "%setting.frontMatter.content.pageFolders.items.properties.disableCreation.description%"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false,
|
||||
@@ -519,7 +544,8 @@
|
||||
"command": {
|
||||
"$id": "#scriptCommand",
|
||||
"type": "string",
|
||||
"anyOf": [{
|
||||
"anyOf": [
|
||||
{
|
||||
"enum": [
|
||||
"node",
|
||||
"bash",
|
||||
@@ -563,6 +589,13 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"contentTypes": {
|
||||
"type": "array",
|
||||
"description": "%setting.frontMatter.custom.scripts.items.properties.contentTypes.description%",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
},
|
||||
"additionalProperties": false,
|
||||
@@ -719,7 +752,8 @@
|
||||
"title",
|
||||
"file"
|
||||
],
|
||||
"anyOf": [{
|
||||
"anyOf": [
|
||||
{
|
||||
"required": [
|
||||
"schema"
|
||||
]
|
||||
@@ -773,7 +807,8 @@
|
||||
"id",
|
||||
"path"
|
||||
],
|
||||
"anyOf": [{
|
||||
"anyOf": [
|
||||
{
|
||||
"required": [
|
||||
"schema"
|
||||
]
|
||||
@@ -966,6 +1001,20 @@
|
||||
"markdownDescription": "%setting.frontMatter.panel.freeform.markdownDescription%",
|
||||
"scope": "Panel"
|
||||
},
|
||||
"frontMatter.panel.actions.disabled": {
|
||||
"type": "array",
|
||||
"default": [],
|
||||
"markdownDescription": "%setting.frontMatter.panel.actions.disabled.markdownDescription%",
|
||||
"enum": [
|
||||
"openDashboard",
|
||||
"createContent",
|
||||
"optimizeSlug",
|
||||
"preview",
|
||||
"openOnWebsite",
|
||||
"startStopServer",
|
||||
"customActions"
|
||||
]
|
||||
},
|
||||
"frontMatter.preview.host": {
|
||||
"type": "string",
|
||||
"default": "",
|
||||
@@ -1030,6 +1079,11 @@
|
||||
],
|
||||
"description": "%setting.frontMatter.taxonomy.contentTypes.items.properties.fileType.description%"
|
||||
},
|
||||
"clearEmpty": {
|
||||
"type": "boolean",
|
||||
"default": false,
|
||||
"description": "%setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.clearEmpty.description%"
|
||||
},
|
||||
"fields": {
|
||||
"$id": "#contenttypefield",
|
||||
"type": "array",
|
||||
@@ -1061,7 +1115,8 @@
|
||||
"divider",
|
||||
"heading",
|
||||
"customField",
|
||||
"contentRelationship"
|
||||
"contentRelationship",
|
||||
"fieldCollection"
|
||||
],
|
||||
"description": "%setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.type.description%"
|
||||
},
|
||||
@@ -1141,7 +1196,8 @@
|
||||
"default": "",
|
||||
"description": "%setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.taxonomyId.description%",
|
||||
"not": {
|
||||
"anyOf": [{
|
||||
"anyOf": [
|
||||
{
|
||||
"const": ""
|
||||
},
|
||||
{
|
||||
@@ -1216,6 +1272,11 @@
|
||||
"default": 0,
|
||||
"description": "%setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.taxonomyLimit.description%"
|
||||
},
|
||||
"singleValueAsString": {
|
||||
"type": "boolean",
|
||||
"default": false,
|
||||
"description": "%setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.singleValueAsString.description%"
|
||||
},
|
||||
"isPublishDate": {
|
||||
"type": "boolean",
|
||||
"default": false,
|
||||
@@ -1330,7 +1391,8 @@
|
||||
"type",
|
||||
"name"
|
||||
],
|
||||
"allOf": [{
|
||||
"allOf": [
|
||||
{
|
||||
"if": {
|
||||
"properties": {
|
||||
"type": {
|
||||
@@ -1457,6 +1519,20 @@
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"if": {
|
||||
"properties": {
|
||||
"type": {
|
||||
"const": "fieldCollection"
|
||||
}
|
||||
}
|
||||
},
|
||||
"then": {
|
||||
"required": [
|
||||
"fieldGroup"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"if": {
|
||||
"properties": {
|
||||
@@ -1516,48 +1592,51 @@
|
||||
"fields"
|
||||
]
|
||||
},
|
||||
"default": [{
|
||||
"name": "default",
|
||||
"pageBundle": false,
|
||||
"fields": [{
|
||||
"title": "Title",
|
||||
"name": "title",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"title": "Description",
|
||||
"name": "description",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"title": "Publishing date",
|
||||
"name": "date",
|
||||
"type": "datetime",
|
||||
"default": "{{now}}",
|
||||
"isPublishDate": true
|
||||
},
|
||||
{
|
||||
"title": "Content preview",
|
||||
"name": "preview",
|
||||
"type": "image"
|
||||
},
|
||||
{
|
||||
"title": "Is in draft",
|
||||
"name": "draft",
|
||||
"type": "boolean"
|
||||
},
|
||||
{
|
||||
"title": "Tags",
|
||||
"name": "tags",
|
||||
"type": "tags"
|
||||
},
|
||||
{
|
||||
"title": "Categories",
|
||||
"name": "categories",
|
||||
"type": "categories"
|
||||
}
|
||||
]
|
||||
}],
|
||||
"default": [
|
||||
{
|
||||
"name": "default",
|
||||
"pageBundle": false,
|
||||
"fields": [
|
||||
{
|
||||
"title": "Title",
|
||||
"name": "title",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"title": "Description",
|
||||
"name": "description",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"title": "Publishing date",
|
||||
"name": "date",
|
||||
"type": "datetime",
|
||||
"default": "{{now}}",
|
||||
"isPublishDate": true
|
||||
},
|
||||
{
|
||||
"title": "Content preview",
|
||||
"name": "preview",
|
||||
"type": "image"
|
||||
},
|
||||
{
|
||||
"title": "Is in draft",
|
||||
"name": "draft",
|
||||
"type": "boolean"
|
||||
},
|
||||
{
|
||||
"title": "Tags",
|
||||
"name": "tags",
|
||||
"type": "tags"
|
||||
},
|
||||
{
|
||||
"title": "Categories",
|
||||
"name": "categories",
|
||||
"type": "categories"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"scope": "Taxonomy"
|
||||
},
|
||||
"frontMatter.taxonomy.customTaxonomy": {
|
||||
@@ -1570,7 +1649,8 @@
|
||||
"type": "string",
|
||||
"description": "%setting.frontMatter.taxonomy.customTaxonomy.items.properties.id.description%",
|
||||
"not": {
|
||||
"anyOf": [{
|
||||
"anyOf": [
|
||||
{
|
||||
"const": ""
|
||||
},
|
||||
{
|
||||
@@ -1749,15 +1829,26 @@
|
||||
"default": "yyyy-MM-dd",
|
||||
"markdownDescription": "%setting.frontMatter.templates.prefix.markdownDescription%",
|
||||
"scope": "Templates"
|
||||
},
|
||||
"frontMatter.website.host": {
|
||||
"type": "string",
|
||||
"markdownDescription": "%setting.frontMatter.website.host.markdownDescription%"
|
||||
}
|
||||
}
|
||||
},
|
||||
"commands": [{
|
||||
"commands": [
|
||||
{
|
||||
"command": "frontMatter.project.switch",
|
||||
"title": "%command.frontMatter.project.switch%",
|
||||
"category": "Front Matter",
|
||||
"icon": "$(arrow-swap)"
|
||||
},
|
||||
{
|
||||
"command": "frontMatter.settings.refresh",
|
||||
"title": "%command.frontMatter.settings.refresh%",
|
||||
"category": "Front Matter",
|
||||
"icon": "$(refresh)"
|
||||
},
|
||||
{
|
||||
"command": "frontMatter.config.reload",
|
||||
"title": "%command.frontMatter.config.reload%",
|
||||
@@ -1805,10 +1896,7 @@
|
||||
"command": "frontMatter.dashboard.close",
|
||||
"title": "%command.frontMatter.dashboard.close%",
|
||||
"category": "Front Matter",
|
||||
"icon": {
|
||||
"dark": "/assets/icons/frontmatter-small-teal.svg",
|
||||
"light": "/assets/icons/frontmatter-small-teal.svg"
|
||||
}
|
||||
"icon": "$(fm-logo)"
|
||||
},
|
||||
{
|
||||
"command": "frontMatter.markup.code",
|
||||
@@ -1953,46 +2041,31 @@
|
||||
"command": "frontMatter.dashboard",
|
||||
"title": "%command.frontMatter.dashboard%",
|
||||
"category": "Front Matter",
|
||||
"icon": {
|
||||
"dark": "/assets/icons/frontmatter-small-dark.svg",
|
||||
"light": "/assets/icons/frontmatter-small-light.svg"
|
||||
}
|
||||
"icon": "$(fm-logo)"
|
||||
},
|
||||
{
|
||||
"command": "frontMatter.dashboard.data",
|
||||
"title": "%command.frontMatter.dashboard.data%",
|
||||
"category": "Front Matter",
|
||||
"icon": {
|
||||
"dark": "/assets/icons/frontmatter-small-dark.svg",
|
||||
"light": "/assets/icons/frontmatter-small-light.svg"
|
||||
}
|
||||
"icon": "$(fm-logo)"
|
||||
},
|
||||
{
|
||||
"command": "frontMatter.dashboard.media",
|
||||
"title": "%command.frontMatter.dashboard.media%",
|
||||
"category": "Front Matter",
|
||||
"icon": {
|
||||
"dark": "/assets/icons/frontmatter-small-dark.svg",
|
||||
"light": "/assets/icons/frontmatter-small-light.svg"
|
||||
}
|
||||
"icon": "$(fm-logo)"
|
||||
},
|
||||
{
|
||||
"command": "frontMatter.dashboard.snippets",
|
||||
"title": "%command.frontMatter.dashboard.snippets%",
|
||||
"category": "Front Matter",
|
||||
"icon": {
|
||||
"dark": "/assets/icons/frontmatter-small-dark.svg",
|
||||
"light": "/assets/icons/frontmatter-small-light.svg"
|
||||
}
|
||||
"icon": "$(fm-logo)"
|
||||
},
|
||||
{
|
||||
"command": "frontMatter.dashboard.taxonomy",
|
||||
"title": "%command.frontMatter.dashboard.taxonomy%",
|
||||
"category": "Front Matter",
|
||||
"icon": {
|
||||
"dark": "/assets/icons/frontmatter-small-dark.svg",
|
||||
"light": "/assets/icons/frontmatter-small-light.svg"
|
||||
}
|
||||
"icon": "$(fm-logo)"
|
||||
},
|
||||
{
|
||||
"command": "frontMatter.markup.orderedlist",
|
||||
@@ -2081,12 +2154,15 @@
|
||||
"category": "Front Matter"
|
||||
}
|
||||
],
|
||||
"submenus": [{
|
||||
"id": "frontmatter.submenu",
|
||||
"label": "Front Matter"
|
||||
}],
|
||||
"submenus": [
|
||||
{
|
||||
"id": "frontmatter.submenu",
|
||||
"label": "Front Matter"
|
||||
}
|
||||
],
|
||||
"menus": {
|
||||
"editor/title": [{
|
||||
"editor/title": [
|
||||
{
|
||||
"command": "frontMatter.markup.heading",
|
||||
"group": "navigation@-133",
|
||||
"when": "frontMatter:file:isValid == true && frontMatter:markdown:wysiwyg"
|
||||
@@ -2167,11 +2243,14 @@
|
||||
"when": "resourceFilename == 'frontmatter.json'"
|
||||
}
|
||||
],
|
||||
"explorer/context": [{
|
||||
"submenu": "frontmatter.submenu",
|
||||
"group": "frontmatter@1"
|
||||
}],
|
||||
"frontmatter.submenu": [{
|
||||
"explorer/context": [
|
||||
{
|
||||
"submenu": "frontmatter.submenu",
|
||||
"group": "frontmatter@1"
|
||||
}
|
||||
],
|
||||
"frontmatter.submenu": [
|
||||
{
|
||||
"command": "frontMatter.createFromTemplate",
|
||||
"when": "explorerResourceIsFolder",
|
||||
"group": "frontmatter@1"
|
||||
@@ -2187,7 +2266,8 @@
|
||||
"group": "frontmatter@3"
|
||||
}
|
||||
],
|
||||
"commandPalette": [{
|
||||
"commandPalette": [
|
||||
{
|
||||
"command": "frontMatter.init",
|
||||
"when": "frontMatterCanInit"
|
||||
},
|
||||
@@ -2332,7 +2412,8 @@
|
||||
"when": "frontMatter:file:isValid == true"
|
||||
}
|
||||
],
|
||||
"view/title": [{
|
||||
"view/title": [
|
||||
{
|
||||
"command": "frontMatter.chatbot",
|
||||
"group": "navigation@0",
|
||||
"when": "view == frontMatter.explorer"
|
||||
@@ -2353,58 +2434,68 @@
|
||||
"when": "view == frontMatter.explorer && frontMatter:project:switch:enabled"
|
||||
},
|
||||
{
|
||||
"command": "frontMatter.dashboard",
|
||||
"command": "frontMatter.settings.refresh",
|
||||
"group": "navigation@4",
|
||||
"when": "view == frontMatter.explorer"
|
||||
},
|
||||
{
|
||||
"command": "frontMatter.dashboard",
|
||||
"group": "navigation@5",
|
||||
"when": "view == frontMatter.explorer || view == explorer"
|
||||
}
|
||||
]
|
||||
},
|
||||
"grammars": [{
|
||||
"path": "./syntaxes/hugo.tmLanguage.json",
|
||||
"scopeName": "frontmatter.markdown.hugo",
|
||||
"injectTo": [
|
||||
"text.html.markdown"
|
||||
]
|
||||
}],
|
||||
"walkthroughs": [{
|
||||
"id": "frontmatter.welcome",
|
||||
"title": "Get started with Front Matter",
|
||||
"description": "Discover the features of Front Matter and learn how to use the CMS for your SSG or static site.",
|
||||
"steps": [{
|
||||
"id": "frontmatter.welcome.init",
|
||||
"title": "Get started",
|
||||
"description": "Initial steps to get started.\n[Open dashboard](command:frontMatter.dashboard)",
|
||||
"media": {
|
||||
"markdown": "assets/walkthrough/get-started.md"
|
||||
"grammars": [
|
||||
{
|
||||
"path": "./syntaxes/hugo.tmLanguage.json",
|
||||
"scopeName": "frontmatter.markdown.hugo",
|
||||
"injectTo": [
|
||||
"text.html.markdown"
|
||||
]
|
||||
}
|
||||
],
|
||||
"walkthroughs": [
|
||||
{
|
||||
"id": "frontmatter.welcome",
|
||||
"title": "Get started with Front Matter",
|
||||
"description": "Discover the features of Front Matter and learn how to use the CMS for your SSG or static site.",
|
||||
"steps": [
|
||||
{
|
||||
"id": "frontmatter.welcome.init",
|
||||
"title": "Get started",
|
||||
"description": "Initial steps to get started.\n[Open dashboard](command:frontMatter.dashboard)",
|
||||
"media": {
|
||||
"markdown": "assets/walkthrough/get-started.md"
|
||||
},
|
||||
"completionEvents": [
|
||||
"onContext:frontMatterInitialized"
|
||||
]
|
||||
},
|
||||
"completionEvents": [
|
||||
"onContext:frontMatterInitialized"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "frontmatter.welcome.documentation",
|
||||
"title": "Documentation",
|
||||
"description": "Check out the documentation for Front Matter.\n[View our documentation](https://frontmatter.codes/docs)",
|
||||
"media": {
|
||||
"markdown": "assets/walkthrough/documentation.md"
|
||||
{
|
||||
"id": "frontmatter.welcome.documentation",
|
||||
"title": "Documentation",
|
||||
"description": "Check out the documentation for Front Matter.\n[View our documentation](https://frontmatter.codes/docs)",
|
||||
"media": {
|
||||
"markdown": "assets/walkthrough/documentation.md"
|
||||
},
|
||||
"completionEvents": [
|
||||
"onLink:https://frontmatter.codes/docs"
|
||||
]
|
||||
},
|
||||
"completionEvents": [
|
||||
"onLink:https://frontmatter.codes/docs"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "frontmatter.welcome.supporter",
|
||||
"title": "Support the project",
|
||||
"description": "Become a supporter.\n[Support the project](https://github.com/sponsors/estruyf)",
|
||||
"media": {
|
||||
"markdown": "assets/walkthrough/support-the-project.md"
|
||||
},
|
||||
"completionEvents": [
|
||||
"onLink:https://github.com/sponsors/estruyf"
|
||||
]
|
||||
}
|
||||
]
|
||||
}]
|
||||
{
|
||||
"id": "frontmatter.welcome.supporter",
|
||||
"title": "Support the project",
|
||||
"description": "Become a supporter.\n[Support the project](https://github.com/sponsors/estruyf)",
|
||||
"media": {
|
||||
"markdown": "assets/walkthrough/support-the-project.md"
|
||||
},
|
||||
"completionEvents": [
|
||||
"onLink:https://github.com/sponsors/estruyf"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"scripts": {
|
||||
"dev:ext": "npm run clean && npm run localization:generate && npm-run-all --parallel watch:*",
|
||||
@@ -2435,7 +2526,7 @@
|
||||
"@actions/core": "^1.10.0",
|
||||
"@bendera/vscode-webview-elements": "0.6.2",
|
||||
"@estruyf/vscode": "^1.1.0",
|
||||
"@headlessui/react": "1.5.0",
|
||||
"@headlessui/react": "^1.7.17",
|
||||
"@heroicons/react": "1.0.4",
|
||||
"@iarna/toml": "2.2.3",
|
||||
"@octokit/rest": "^18.12.0",
|
||||
@@ -2464,7 +2555,7 @@
|
||||
"@typescript-eslint/parser": "^5.50.0",
|
||||
"@vscode/codicons": "0.0.20",
|
||||
"@vscode/l10n": "^0.0.14",
|
||||
"@vscode/webview-ui-toolkit": "^0.9.3",
|
||||
"@vscode/webview-ui-toolkit": "^1.2.2",
|
||||
"@webpack-cli/serve": "^1.7.0",
|
||||
"ajv": "^8.12.0",
|
||||
"array-move": "^4.0.0",
|
||||
@@ -2474,9 +2565,11 @@
|
||||
"cheerio": "1.0.0-rc.12",
|
||||
"css-loader": "5.2.7",
|
||||
"date-fns": "2.23.0",
|
||||
"dotenv": "^16.3.1",
|
||||
"downshift": "6.0.6",
|
||||
"eslint": "^8.33.0",
|
||||
"fuse.js": "6.5.3",
|
||||
"github-directory-downloader": "^1.3.6",
|
||||
"glob": "7.1.6",
|
||||
"gray-matter": "4.0.3",
|
||||
"html-loader": "1.3.2",
|
||||
@@ -2532,10 +2625,11 @@
|
||||
"webpack-bundle-analyzer": "^4.7.0",
|
||||
"webpack-cli": "^4.10.0",
|
||||
"webpack-dev-server": "^4.11.1",
|
||||
"webpack-ignore-dynamic-require": "^1.0.0",
|
||||
"yaml": "^2.2.1",
|
||||
"yawn-yaml": "^1.5.0"
|
||||
},
|
||||
"vsce": {
|
||||
"dependencies": false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -239,5 +239,11 @@
|
||||
"setting.frontMatter.dashboard.mediaSnippet.deprecationMessage": "Diese Einstellung ist veraltet und wird in der nächsten Hauptversion entfernt. Bitte definieren Sie Ihr Medien-Snippet in der `frontMatter.content.snippet` Einstellung.",
|
||||
"setting.frontMatter.taxonomy.dateField.deprecationMessage": "Diese Einstellung ist veraltet und wird in der nächsten Hauptversion entfernt. Bitte verwenden Sie stattdessen die neuen `isPublishDate`-Einstellungen in den Datumsfeldern Ihrer Content-Typen.",
|
||||
"setting.frontMatter.taxonomy.modifiedField.deprecationMessage": "Diese Einstellung ist veraltet und wird in der nächsten Hauptversion entfernt. Bitte verwenden Sie stattdessen die neuen `isModifiedDate`-Einstellungen in den Datumsfeldern Ihrer Content-Typen.",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.customType.description": "🚧: Specify the name of the custom field type to use."
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.customType.description": "Geben Sie den Namen des zu verwendenden benutzerdefinierten Feldtyps an.",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.clearEmpty.description": "Geben Sie an, ob die leeren Werte gelöscht werden sollen.",
|
||||
"setting.frontMatter.website.host.markdownDescription": "Geben Sie die Host-URL Ihrer Website an. [Überprüfen Sie die Dokumente] (https://frontmatter.codes/docs/settings/overview#frontmatter.website.url)",
|
||||
"command.frontMatter.settings.refresh": "Aktualisieren Sie die Einstellungen für Frontmatter",
|
||||
"setting.frontMatter.config.dynamicFilePath.markdownDescription": "Geben Sie den Pfad zur dynamischen Konfigurationsdatei an (z. B. [[workspace]]/config.js). [Überprüfen Sie die Dokumente] (https://frontmatter.codes/docs/settings/overview#frontmatter.config.dynamicfilepath)",
|
||||
"setting.frontMatter.content.pageFolders.items.properties.disableCreation.description": "Deaktivieren Sie die Erstellung neuer Inhalte im Ordner.",
|
||||
"setting.frontMatter.custom.scripts.items.properties.contentTypes.description": "Definieren Sie die Inhaltstypen, für die das Skript verwendet werden soll. Wenn keine definiert sind, ist sie für alle Typen verfügbar."
|
||||
}
|
||||
@@ -50,8 +50,8 @@
|
||||
"command.frontMatter.cache.clear": "キャッシュをクリア",
|
||||
"settings.configuration.title": "Front Matter: チームで作業する場合はfrontmatter.jsonで設定してください。",
|
||||
"setting.frontMatter.projects.markdownDescription": "Front Matter CMSを利用するプロジェクトを設定します。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.projects)",
|
||||
"setting.frontMatter.projects.items.properties.name.markdownDescription": "🚧: Specify the name of the project.",
|
||||
"setting.frontMatter.projects.items.properties.default.markdownDescription": "🚧: Specify if this project is the default project to load.",
|
||||
"setting.frontMatter.projects.items.properties.name.markdownDescription": "プロジェクトの名前を指定します。",
|
||||
"setting.frontMatter.projects.items.properties.default.markdownDescription": "このプロジェクトを読み込む既定のプロジェクトにするかどうかを指定します。",
|
||||
"setting.frontMatter.sponsors.ai.enabled.markdownDescription": "AIによる提案を利用します。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.sponsors.ai.enabled)",
|
||||
"setting.frontMatter.extensibility.scripts.markdownDescription": "Front Matter CMSで読み込むスクリプトのリストを指定します。. [ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.extensibility.scripts)",
|
||||
"setting.frontMatter.experimental.markdownDescription": "実験的な機能をオンにします。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.experimental)",
|
||||
@@ -60,80 +60,80 @@
|
||||
"setting.frontMatter.content.defaultFileType.markdownDescription": "新しい記事を作成する際の既定のファイル形式を設定します。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.content.defaultfiletype)",
|
||||
"setting.frontMatter.content.defaultSorting.markdownDescription": "ダッシュボード上に表示される記事一覧の既定の並び順を設定します。Enum(列挙型)や任意のIDを指定してください。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.content.defaultsorting)",
|
||||
"setting.frontMatter.content.draftField.markdownDescription": "記事の下書きステータスを管理するフィールドを設定します。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.content.draftfield)",
|
||||
"setting.frontMatter.content.draftField.properties.type.description": "🚧: Type of the draft field you want to use",
|
||||
"setting.frontMatter.content.draftField.properties.name.description": "🚧: Name of the field to use",
|
||||
"setting.frontMatter.content.draftField.properties.invert.description": "🚧: By default the draft field is set to true when the content is a draft. Set this to true to set it to false.",
|
||||
"setting.frontMatter.content.draftField.properties.choices.description": "🚧: List of choices for the field",
|
||||
"setting.frontMatter.content.draftField.properties.type.description": "使用する下書きフィールドの種類",
|
||||
"setting.frontMatter.content.draftField.properties.name.description": "使用するフィールドの名前",
|
||||
"setting.frontMatter.content.draftField.properties.invert.description": "既定では、コンテンツが下書きの場合、下書きフィールドは true に設定されます。これを true に設定すると、false に設定されます。",
|
||||
"setting.frontMatter.content.draftField.properties.choices.description": "フィールドの選択肢のリスト",
|
||||
"setting.frontMatter.content.fmHighlight.markdownDescription": "Markdownファイル内のfront matterをハイライトします。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.content.fmhighlight)",
|
||||
"setting.frontMatter.content.hideFm.markdownDescription": "Markdownファイル内のfront matterを非表示にします。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.content.hidefm)",
|
||||
"setting.frontMatter.content.hideFmMessage.markdownDescription": "front matterが非表示の際に、編集画面に表示するメッセージを設定します。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.content.hidefmmessage)",
|
||||
"setting.frontMatter.content.pageFolders.markdownDescription": "フォルダーを配列で定義して、この拡張機能が記事を取得したり新しい記事を作成できるようにします。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.content.pagefolders)",
|
||||
"setting.frontMatter.content.pageFolders.items.properties.title.description": "🚧: Name of the folder",
|
||||
"setting.frontMatter.content.pageFolders.items.properties.path.description": "🚧: Path of the folder",
|
||||
"setting.frontMatter.content.pageFolders.items.properties.excludeSubdir.description": "🚧: Exclude sub-directories",
|
||||
"setting.frontMatter.content.pageFolders.items.properties.previewPath.description": "🚧: Defines a custom preview path for the folder.",
|
||||
"setting.frontMatter.content.pageFolders.items.properties.filePrefix.description": "🚧: Defines a prefix for the file name.",
|
||||
"setting.frontMatter.content.pageFolders.items.properties.contentTypes.description": "🚧: Defines which content types can be used for the current location. If not defined, all content types will be available.",
|
||||
"setting.frontMatter.content.pageFolders.items.properties.title.description": "フォルダの名前",
|
||||
"setting.frontMatter.content.pageFolders.items.properties.path.description": "フォルダのパス",
|
||||
"setting.frontMatter.content.pageFolders.items.properties.excludeSubdir.description": "サブディレクトリを除外する",
|
||||
"setting.frontMatter.content.pageFolders.items.properties.previewPath.description": "フォルダーのカスタム プレビュー パスを定義します。",
|
||||
"setting.frontMatter.content.pageFolders.items.properties.filePrefix.description": "ファイル名のプレフィックスを定義します。",
|
||||
"setting.frontMatter.content.pageFolders.items.properties.contentTypes.description": "現在の場所に使用できるコンテンツ タイプを定義します。定義しない場合は、すべてのコンテンツ タイプを使用できます。",
|
||||
"setting.frontMatter.content.placeholders.markdownDescription": "記事タイプとテンプレートで使用するプレースホルダーを配列で定義して、記事のfront matterを自動で入力できるようにします。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.content.placeholders)",
|
||||
"setting.frontMatter.content.placeholders.items.properties.id.description": "🚧: ID of the placeholder, in your content type or template, use it as follows: {{placeholder}}",
|
||||
"setting.frontMatter.content.placeholders.items.properties.value.description": "🚧: The placeholder its value",
|
||||
"setting.frontMatter.content.placeholders.items.properties.script.description": "🚧: The script to execute to get the value of the placeholder",
|
||||
"setting.frontMatter.content.placeholders.items.properties.id.description": "プレースホルダーの ID をコンテンツ タイプまたはテンプレートで、次のように使用します: {{placeholder}}",
|
||||
"setting.frontMatter.content.placeholders.items.properties.value.description": "プレースホルダーの値",
|
||||
"setting.frontMatter.content.placeholders.items.properties.script.description": "プレースホルダーの値を取得するために実行するスクリプト",
|
||||
"setting.frontMatter.content.publicFolder.markdownDescription": "アセットが保存されているフォルダーを設定します。例えば、Hugoでは`static`フォルダーです。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.content.publicfolder)",
|
||||
"setting.frontMatter.content.publicFolder.properties.path.description": "アセットフォルダーのパスを指定します。",
|
||||
"setting.frontMatter.content.publicFolder.properties.relative.description": "メディアファイルへのパスがコンテンツファイルに対して相対的であるかを定義します。",
|
||||
"setting.frontMatter.snippets.wrapper.enabled.markdownDescription": "スニペット挿入時にコメントでラップします。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontMatter.snippets.wrapper.enabled)",
|
||||
"setting.frontMatter.content.snippets.markdownDescription": "記事中に使用するスニペットを設定します。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.content.snippets)",
|
||||
"setting.frontMatter.content.sorting.markdownDescription": "ダッシュボード上での記事の並べ替えオプションを追加します。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.content.sorting)",
|
||||
"setting.frontMatter.content.sorting.items.properties.id.description": "🚧: The ID of the sorting option. This will be used for the storing the last used sorting option or the default option.",
|
||||
"setting.frontMatter.content.sorting.items.properties.title.description": "🚧: Name of the sorting label",
|
||||
"setting.frontMatter.content.sorting.items.properties.name.description": "🚧: Name of the metadata field to sort by",
|
||||
"setting.frontMatter.content.sorting.items.properties.order.description": "🚧: Order of the sorting",
|
||||
"setting.frontMatter.content.sorting.items.properties.type.description": "🚧: Type of the field value",
|
||||
"setting.frontMatter.content.sorting.items.properties.id.description": "並べ替えオプションの ID。これは、最後に使用した並べ替えオプションまたは既定のオプションを格納するために使用されます。",
|
||||
"setting.frontMatter.content.sorting.items.properties.title.description": "並べ替えラベルの名前",
|
||||
"setting.frontMatter.content.sorting.items.properties.name.description": "並べ替えの基準となるメタデータ フィールドの名前",
|
||||
"setting.frontMatter.content.sorting.items.properties.order.description": "ソートの順序",
|
||||
"setting.frontMatter.content.sorting.items.properties.type.description": "フィールド値の型",
|
||||
"setting.frontMatter.content.supportedFileTypes.markdownDescription": "Front Matterでサポートされるファイル形式を設定します。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.content.supportedfiletypes)",
|
||||
"setting.frontMatter.content.wysiwyg.markdownDescription": "What You See, Is What You Get(WYSIWYG)Markdownコントロールを有効にします。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.content.wysiwyg)",
|
||||
"setting.frontMatter.custom.scripts.markdownDescription": "実行するNode.jsスクリプトのパスを指定します。現在のファイルのパスが引数として渡されます。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.custom.scripts)",
|
||||
"setting.frontMatter.custom.scripts.items.properties.id.description": "🚧: ID of the script.",
|
||||
"setting.frontMatter.custom.scripts.items.properties.title.description": "🚧: Title you want to give to your script. Will be shown as the title of the button.",
|
||||
"setting.frontMatter.custom.scripts.items.properties.script.description": "🚧: Path to the script to execute",
|
||||
"setting.frontMatter.custom.scripts.items.properties.nodeBin.description": "🚧: Path to the node executable. This is required when using NVM, so that there is no confusion of which node version to use. (deprecated: use the command property instead)",
|
||||
"setting.frontMatter.custom.scripts.items.properties.bulk.description": "🚧: Run the script for all content files",
|
||||
"setting.frontMatter.custom.scripts.items.properties.output.description": "🚧: Define where you want to output your script output. Default is a notification, but you can specify to show it in an editor panel.",
|
||||
"setting.frontMatter.custom.scripts.items.properties.outputType.description": "🚧: The type of output for the editor panel. Can be used to change it to 'markdown' for example",
|
||||
"setting.frontMatter.custom.scripts.items.properties.type.description": "🚧: The type for which the script will be used.",
|
||||
"setting.frontMatter.custom.scripts.items.properties.command.description": "🚧: The type of script you want to execute.",
|
||||
"setting.frontMatter.custom.scripts.items.properties.hidden.description": "🚧: Hide the action from the UI",
|
||||
"setting.frontMatter.custom.scripts.items.properties.environments.items.properties.type.description": "🚧: The environment type for which the script needs to be used",
|
||||
"setting.frontMatter.custom.scripts.items.properties.environments.items.properties.script.description": "🚧: Path to the script to execute",
|
||||
"setting.frontMatter.custom.scripts.items.properties.id.description": "スクリプトの ID。",
|
||||
"setting.frontMatter.custom.scripts.items.properties.title.description": "スクリプトに付けるタイトル。ボタンのタイトルとして表示されます。",
|
||||
"setting.frontMatter.custom.scripts.items.properties.script.description": "実行するスクリプトへのパス",
|
||||
"setting.frontMatter.custom.scripts.items.properties.nodeBin.description": "ノード実行可能ファイルへのパス。これは、使用するノードのバージョンが混同されないように、NVM を使用するときに必要です。(非推奨: 代わりにコマンド プロパティを使用してください)",
|
||||
"setting.frontMatter.custom.scripts.items.properties.bulk.description": "すべてのコンテンツ ファイルに対してスクリプトを実行する",
|
||||
"setting.frontMatter.custom.scripts.items.properties.output.description": "スクリプト出力を出力する場所を定義します。デフォルトは通知ですが、エディターパネルに表示するように指定できます。",
|
||||
"setting.frontMatter.custom.scripts.items.properties.outputType.description": "エディター・パネルの出力のタイプ。たとえば、「マークダウン」に変更するために使用できます",
|
||||
"setting.frontMatter.custom.scripts.items.properties.type.description": "スクリプトが使用される型。",
|
||||
"setting.frontMatter.custom.scripts.items.properties.command.description": "実行するスクリプトの種類。",
|
||||
"setting.frontMatter.custom.scripts.items.properties.hidden.description": "UI からアクションを非表示にする",
|
||||
"setting.frontMatter.custom.scripts.items.properties.environments.items.properties.type.description": "スクリプトを使用する必要がある環境タイプ",
|
||||
"setting.frontMatter.custom.scripts.items.properties.environments.items.properties.script.description": "実行するスクリプトへのパス",
|
||||
"setting.frontMatter.dashboard.content.pagination.markdownDescription": "ページネーションの有効/無効を設定します。ページ数は最大52まで設定できます。規定値は`16`です。ページ分割を無効にするには`false`を設定します。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.dashboard.content.pagination)",
|
||||
"setting.frontMatter.dashboard.content.cardTags.markdownDescription": "記事一覧をカード型で表示する際、どのメタデータフィールドをタグとして使うかを指定します。空欄またはnull値の場合、タグは表示されなくなります。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.dashboard.content.cardtags)",
|
||||
"setting.frontMatter.dashboard.content.card.fields.state.markdownDescription": "記事一覧をカード型で表示する際、下書き・公開済みのステータスを表示します。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontMatter.dashboard.content.card.fields.state)",
|
||||
"setting.frontMatter.dashboard.content.card.fields.date.markdownDescription": "記事一覧をカード型で表示する際、日付を表示します。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontMatter.dashboard.content.card.fields.date)",
|
||||
"setting.frontMatter.dashboard.content.card.fields.description.markdownDescription": "記事一覧をカード型で表示する際、どのメタデータフィールドをディスクリプションとして使うかを指定します。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontMatter.dashboard.content.card.fields.description)",
|
||||
"setting.frontMatter.dashboard.content.card.fields.title.markdownDescription": "記事一覧をカード型で表示する際、どのメタデータフィールドをタイトルとして使うかを指定します。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontMatter.dashboard.content.card.fields.title)",
|
||||
"setting.frontMatter.dashboard.mediaSnippet.markdownDescription": "🚧: Specify the a snippet for your custom media insert markup. [ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.dashboard.mediasnippet)",
|
||||
"setting.frontMatter.dashboard.mediaSnippet.markdownDescription": "カスタムメディア挿入マークアップのスニペットを指定します。[ドキュメントをチェックイン](https://frontmatter.codes/docs/settings/overview#frontmatter.dashboard.mediasnippet)",
|
||||
"setting.frontMatter.dashboard.mediaSnippet.items.description": "スニペット内で `{mediaUrl}`, `{caption}`, `{alt}`, `{filename}`, `{mediaHeight}`, `{mediaWidth}` のプレースホルダーを使用して、メディア情報を自動的に挿入します。",
|
||||
"setting.frontMatter.dashboard.openOnStart.markdownDescription": "VS Codeの起動時にダッシュボードを表示します。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.dashboard.openonstart)",
|
||||
"setting.frontMatter.data.files.markdownDescription": "ウェブサイトに使用するデータのファイルを指定します。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.data.files)",
|
||||
"setting.frontMatter.data.files.items.properties.id.description": "🚧: Your unique ID you want to use for your data file.",
|
||||
"setting.frontMatter.data.files.items.properties.title.description": "🚧: Title you want to give to your data file.",
|
||||
"setting.frontMatter.data.files.items.properties.labelField.description": "🚧: The field you want to use as label for your data entries.",
|
||||
"setting.frontMatter.data.files.items.properties.file.description": "🚧: Path to the file to load. Only JSON or YAML files are supported.",
|
||||
"setting.frontMatter.data.files.items.properties.fileType.description": "🚧: Defines how you want to parse the file. JSON is the default.",
|
||||
"setting.frontMatter.data.files.items.properties.schema.description": "🚧: The JSON schema for your data which will be used to render the data form.",
|
||||
"setting.frontMatter.data.files.items.properties.schema.properties.title.description": "🚧: Title of the form.",
|
||||
"setting.frontMatter.data.files.items.properties.schema.properties.type.description": "🚧: Defines the type of the form. Default is 'object'.",
|
||||
"setting.frontMatter.data.files.items.properties.schema.properties.required.description": "🚧: Defines the required fields for the form.",
|
||||
"setting.frontMatter.data.files.items.properties.schema.properties.properties.description": "🚧: Defines the fields of the form.",
|
||||
"setting.frontMatter.data.files.items.properties.type.description": "🚧: If you are using data types, you can specify your type ID.",
|
||||
"setting.frontMatter.data.files.items.properties.singleEntry.description": "🚧: If you want to use a single entry for your data file.",
|
||||
"setting.frontMatter.data.files.items.properties.id.description": "データ ファイルに使用する一意の ID。",
|
||||
"setting.frontMatter.data.files.items.properties.title.description": "データ ファイルに付けるタイトル。",
|
||||
"setting.frontMatter.data.files.items.properties.labelField.description": "データエントリのラベルとして使用するフィールド。",
|
||||
"setting.frontMatter.data.files.items.properties.file.description": "読み込むファイルへのパス。JSON または YAML ファイルのみがサポートされています。",
|
||||
"setting.frontMatter.data.files.items.properties.fileType.description": "ファイルの解析方法を定義します。JSON がデフォルトです。",
|
||||
"setting.frontMatter.data.files.items.properties.schema.description": "データ フォームのレンダリングに使用されるデータの JSON スキーマ。",
|
||||
"setting.frontMatter.data.files.items.properties.schema.properties.title.description": "フォームのタイトル。",
|
||||
"setting.frontMatter.data.files.items.properties.schema.properties.type.description": "フォームの種類を定義します。デフォルトは 'オブジェクト' です。",
|
||||
"setting.frontMatter.data.files.items.properties.schema.properties.required.description": "フォームの必須フィールドを定義します。",
|
||||
"setting.frontMatter.data.files.items.properties.schema.properties.properties.description": "フォームのフィールドを定義します。",
|
||||
"setting.frontMatter.data.files.items.properties.type.description": "データ型を使用している場合は、型 ID を指定できます。",
|
||||
"setting.frontMatter.data.files.items.properties.singleEntry.description": "データ ファイルに 1 つのエントリを使用する場合。",
|
||||
"setting.frontMatter.data.folders.markdownDescription": "ウェブサイトに使用するデータのフォルダーを指定します。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.data.folders)",
|
||||
"setting.frontMatter.data.folders.items.properties.id.description": "🚧: Your unique ID you want to use for your data folder.",
|
||||
"setting.frontMatter.data.folders.items.properties.labelField.description": "🚧: The field you want to use as label for your data entries.",
|
||||
"setting.frontMatter.data.folders.items.properties.path.description": "🚧: Path to the folder to load files.",
|
||||
"setting.frontMatter.data.folders.items.properties.type.description": "🚧: If you are using data types, you can specify your type ID.",
|
||||
"setting.frontMatter.data.folders.items.properties.singleEntry.description": "🚧: If you want to use a single entry for your data files in the folder.",
|
||||
"setting.frontMatter.data.folders.items.properties.id.description": "データ フォルダーに使用する一意の ID。",
|
||||
"setting.frontMatter.data.folders.items.properties.labelField.description": "データエントリのラベルとして使用するフィールド。",
|
||||
"setting.frontMatter.data.folders.items.properties.path.description": "ファイルを読み込むフォルダーへのパス。",
|
||||
"setting.frontMatter.data.folders.items.properties.type.description": "データ型を使用している場合は、型 ID を指定できます。",
|
||||
"setting.frontMatter.data.folders.items.properties.singleEntry.description": "フォルダー内のデータ ファイルに 1 つのエントリを使用する場合。",
|
||||
"setting.frontMatter.data.types.markdownDescription": "データタイプを指定します。これらのタイプは、データファイルで使用できます。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.data.types)",
|
||||
"setting.frontMatter.data.types.items.properties.id.description": "🚧: Your unique ID you want to use for your data type.",
|
||||
"setting.frontMatter.data.types.items.properties.id.description": "データ型に使用する一意の ID。",
|
||||
"setting.frontMatter.file.preserveCasing.markdownDescription": "タイトルからファイル名の大文字と小文字を区別します。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.file.preservecasing)",
|
||||
"setting.frontMatter.framework.id.markdownDescription": "ウェブサイトに使用している静的サイトジェネレーターまたはフレームワークのIDを設定します。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.framework.id)",
|
||||
"setting.frontMatter.framework.startCommand.markdownDescription": "静的サイト・ジェネレーターまたはフレームワークを起動させるコマンドを指定します。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.framework.startcommand)",
|
||||
@@ -145,8 +145,8 @@
|
||||
"setting.frontMatter.git.submodule.folder.markdownDescription": "コンテンツのサブモジュールフォルダーを指定します。複数のサブモジュールを使用する場合に便利です。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.git.submodule.folder)",
|
||||
"setting.frontMatter.global.activeMode.markdownDescription": "Front Matterで有効なモードを設定します。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.global.activemode)",
|
||||
"setting.frontMatter.global.modes.markdownDescription": "Front Matterで利用するモードを設定します。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.global.modes)",
|
||||
"setting.frontMatter.global.modes.items.properties.id.description": "🚧: The ID of your mode.",
|
||||
"setting.frontMatter.global.modes.items.properties.features.description": "🚧: The features you want to use for your mode.",
|
||||
"setting.frontMatter.global.modes.items.properties.id.description": "モードの ID。",
|
||||
"setting.frontMatter.global.modes.items.properties.features.description": "モードに使用する機能。",
|
||||
"setting.frontMatter.global.notifications.markdownDescription": "表示したい通知を設定します。既定では全ての通知が表示されます。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.global.notifications)",
|
||||
"setting.frontMatter.global.disabledNotificaitons.markdownDescription": "表示しない通知を設定します。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.global.disablednotifications)",
|
||||
"setting.frontMatter.media.defaultSorting.markdownDescription": "ダッシュボードのメディア一覧での既定の並び順を設定します。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.media.defaultsorting)",
|
||||
@@ -161,66 +161,66 @@
|
||||
"setting.frontMatter.taxonomy.commaSeparatedFields.items.description": "コンマ区切りの配列として使用するフィールドの名前。",
|
||||
"setting.frontMatter.taxonomy.contentTypes.markdownDescription": "記事・ページ・その他で利用したい記事タイプを設定します。front matterで正しく`type`が設定されていることを確認してください。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.taxonomy.contenttypes)",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.description": "Front Matterで使用するコンテンツタイプを定義します。",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.name.description": "🚧: Define the type of field",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fileType.description": "🚧: Specifies the type of content you want to create.",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.description": "🚧: Define the fields of the content type",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.name.description": "フィールドの種類を定義する",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fileType.description": "作成するコンテンツの種類を指定します。",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.description": "コンテンツ タイプのフィールドを定義する",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.description": "Front Matterで使用するコンテンツタイプを定義します。",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.type.description": "🚧: Define the type of field",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.name.description": "🚧: Name of the field to use",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.title.description": "🚧: Title to show in the UI",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.description.description": "🚧: Description to show in the UI",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.default.description": "🚧: Default value",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.choices.description": "🚧: Define your choices",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.choices.items.properties.id.description": "🚧: The choice ID",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.choices.items.properties.title.description": "🚧: The choice title",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.single.description": "🚧: Is a single line field",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.wysiwyg.description": "🚧: Is a WYSIWYG field (HTML output)",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.multiple.description": "🚧: Do you allow to select multiple values?",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.isPreviewImage.description": "🚧: Specify if the image field can be used as preview. Be aware, you can only have one preview image per content type.",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.hidden.description": "🚧: Do you want to hide the field from the metadata section?",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.taxonomyId.description": "🚧: The ID of your taxonomy field. It cannot contain the \"tags\" or \"categories\" value.",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.fileExtensions.description": "🚧: Specify the file extensions to allow for the file picker",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.fieldGroup.description": "🚧: The ID(s) of your field group(s) defined in the `frontMatter.taxonomy.fieldGroups` setting",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.dataType.description": "🚧: The ID(s) of your data type(s) defined in the `frontMatter.data.types` setting",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.numberOptions.description": "🚧: Specify the options for the number field",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.numberOptions.properties.isDecimal.description": "🚧: Specify if the number is a decimal",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.numberOptions.properties.min.description": "🚧: The minimum value",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.numberOptions.properties.max.description": "🚧: The maximum value",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.numberOptions.properties.step.description": "🚧: The step value",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.taxonomyLimit.description": "🚧: Limit the number of taxonomies to select. Set to 0 to allow unlimited.",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.isPublishDate.description": "🚧: Specify if the field is the publish date field",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.isModifiedDate.description": "🚧: Specify if the field is the modified date field",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.dataFileId.description": "🚧: Specify the ID of the data file to use for this field",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.dataFileKey.description": "🚧: Specify the key of the data file to use for this field",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.dataFileValue.description": "🚧: Specify the property name that will be used to show the value for the field",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.editable.description": "🚧: Specify if the field is editable",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.encodeEmoji.description": "🚧: Specify if the field should encode emoji",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.dateFormat.description": "🚧: Specify the date format to use",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.required.description": "🚧: Specify if the field is required",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.contentTypeName.description": "🚧: Specify the content type name to filter content for the contentRelationship field",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.contentTypeValue.description": "🚧: Specify the value to insert for the contentRelationship field",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.when.description": "🚧: Specify the conditions to show the field",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.when.properties.fieldRef.description": "🚧: The field ID to use",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.when.properties.operator.description": "🚧: The operator to use",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.when.properties.value.description": "🚧: The value to compare",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.when.properties.caseSensitive.description": "🚧: Specify if the comparison is case sensitive. Default: true",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.pageBundle.description": "🚧: Specify if you want to create a folder when creating new content.",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.previewPath.description": "🚧: Defines a custom preview path for the content type.",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.template.description": "🚧: An optional template that can be used for creating new content.",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.postScript.description": "🚧: An optional post script that can be used after new content creation.",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.filePrefix.description": "🚧: Defines a prefix for the file name.",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.defaultFileName.description": "🚧: Default file name to use when creating new content.",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.type.description": "フィールドの種類を定義する",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.name.description": "使用するフィールドの名前",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.title.description": "UI に表示するタイトル",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.description.description": "UI に表示する説明",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.default.description": "既定値",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.choices.description": "選択肢を定義する",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.choices.items.properties.id.description": "選択肢 ID",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.choices.items.properties.title.description": "選択肢のタイトル",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.single.description": "単一行フィールドである",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.wysiwyg.description": "WYSIWYG フィールド (HTML 出力) である",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.multiple.description": "複数の値を選択できますか?",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.isPreviewImage.description": "画像フィールドをプレビューとして使用できるかどうかを指定します。コンテンツ タイプごとに使用できるプレビュー画像は 1 つだけです。",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.hidden.description": "メタデータ セクションからフィールドを非表示にしますか?",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.taxonomyId.description": "分類フィールドの ID。「タグ」または「カテゴリ」の値を含めることはできません。",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.fileExtensions.description": "ファイル ピッカーで許可するファイル拡張子を指定する",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.fieldGroup.description": "'frontMatter.taxonomy.fieldGroups' 設定で定義されているフィールドグループの ID",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.dataType.description": "'frontMatter.data.types' 設定で定義されているデータ型の ID",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.numberOptions.description": "数値フィールドのオプションを指定する",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.numberOptions.properties.isDecimal.description": "数値が 10 進数かどうかを指定します",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.numberOptions.properties.min.description": "最小値",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.numberOptions.properties.max.description": "最大値",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.numberOptions.properties.step.description": "ステップ値",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.taxonomyLimit.description": "選択する分類の数を制限します。無制限を許可するには 0 に設定します。",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.isPublishDate.description": "フィールドが公開日フィールドであるかどうかを指定します",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.isModifiedDate.description": "フィールドが変更日フィールドであるかどうかを指定します",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.dataFileId.description": "このフィールドに使用するデータファイルのIDを指定します",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.dataFileKey.description": "このフィールドに使用するデータファイルのキーを指定します",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.dataFileValue.description": "フィールドの値を表示するために使用するプロパティ名を指定します",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.editable.description": "フィールドが編集可能かどうかを指定します",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.encodeEmoji.description": "フィールドが絵文字をエンコードするかどうかを指定します",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.dateFormat.description": "使用する日付形式を指定する",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.required.description": "フィールドが必須かどうかを指定します",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.contentTypeName.description": "コンテンツ タイプ名を指定して、contentRelationship フィールドのコンテンツをフィルター処理します",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.contentTypeValue.description": "コンテンツリレーションシップフィールドに挿入する値を指定します",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.when.description": "フィールドを表示する条件を指定する",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.when.properties.fieldRef.description": "使用するフィールド ID",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.when.properties.operator.description": "使用する演算子",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.when.properties.value.description": "比較する値",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.when.properties.caseSensitive.description": "比較で大文字と小文字を区別するかどうかを指定します。デフォルト: 真",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.pageBundle.description": "新しいコンテンツを作成するときにフォルダーを作成するかどうかを指定します。",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.previewPath.description": "コンテンツ タイプのカスタム プレビュー パスを定義します。",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.template.description": "新しいコンテンツの作成に使用できるオプションのテンプレート。",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.postScript.description": "新しいコンテンツの作成後に使用できるオプションのポストスクリプト。",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.filePrefix.description": "ファイル名のプレフィックスを定義します。",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.defaultFileName.description": "新しいコンテンツを作成するときに使用する既定のファイル名。",
|
||||
"setting.frontMatter.taxonomy.customTaxonomy.markdownDescription": "カスタムタクソノミーのフィールドデータを設定します。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.taxonomy.tags)",
|
||||
"setting.frontMatter.taxonomy.customTaxonomy.items.properties.id.description": "🚧: ID for your taxonomy field. It cannot contain the \"tags\" or \"categories\" value.",
|
||||
"setting.frontMatter.taxonomy.customTaxonomy.items.properties.options.description": "🚧: Options from which you can pick.",
|
||||
"setting.frontMatter.taxonomy.dateField.markdownDescription": "🚧: This setting is used to define the publishing date field of your articles. [ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.taxonomy.datefield)",
|
||||
"setting.frontMatter.taxonomy.customTaxonomy.items.properties.id.description": "分類フィールドの ID。「タグ」または「カテゴリ」の値を含めることはできません。",
|
||||
"setting.frontMatter.taxonomy.customTaxonomy.items.properties.options.description": "選択できるオプション。",
|
||||
"setting.frontMatter.taxonomy.dateField.markdownDescription": "この設定は、記事の公開日フィールドを定義するために使用されます。[ドキュメントをチェックイン](https://frontmatter.codes/docs/settings/overview#frontmatter.taxonomy.datefield)",
|
||||
"setting.frontMatter.taxonomy.dateFormat.markdownDescription": "記事の日付フォーマットを指定します。詳しくは[date-fns formatting](https://date-fns.org/v2.0.1/docs/format)を確認してください。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.taxonomy.dateformat)",
|
||||
"setting.frontMatter.taxonomy.fieldGroups.markdownDescription": "ブロックフィールドで使用したいフィールドグループを設定します。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.taxonomy.fieldgroups)",
|
||||
"setting.frontMatter.taxonomy.fieldGroups.items.properties.id.description": "🚧: The name of the field group",
|
||||
"setting.frontMatter.taxonomy.fieldGroups.items.properties.labelField.description": "🚧: The name of the field to be used as display value",
|
||||
"setting.frontMatter.taxonomy.fieldGroups.items.properties.id.description": "フィールドグループの名前",
|
||||
"setting.frontMatter.taxonomy.fieldGroups.items.properties.labelField.description": "表示値として使用するフィールドの名前",
|
||||
"setting.frontMatter.taxonomy.frontMatterType.markdownDescription": "front matterの形式を設定します。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.taxonomy.frontmattertype)",
|
||||
"setting.frontMatter.taxonomy.indentArrays.markdownDescription": "front matterメタデータが配列の場合はインデント(字下げ)させます。規定値はtrueです。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.taxonomy.indentarrays)",
|
||||
"setting.frontMatter.taxonomy.modifiedField.markdownDescription": "🚧: This setting is used to define the modified date field of your articles. [ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.taxonomy.modifiedfield)",
|
||||
"setting.frontMatter.taxonomy.modifiedField.markdownDescription": "この設定は、記事の変更日フィールドを定義するために使用されます。[ドキュメントをチェックイン](https://frontmatter.codes/docs/settings/overview#frontmatter.taxonomy.modifiedfield)",
|
||||
"setting.frontMatter.taxonomy.noPropertyValueQuotes.markdownDescription": "引用符を付与しないメタデータを指定します。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.taxonomy.nopropertyvaluequotes)",
|
||||
"setting.frontMatter.taxonomy.noPropertyValueQuotes.items.description": "引用符を削除したいプロパティの名前。",
|
||||
"setting.frontMatter.taxonomy.seoContentLengh.markdownDescription": "最適な記事の長さを指定します。2021年のSEOでは、1,760語から2,400語の間が最も理想的とされています。(-1に設定するとオフになります。)[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.taxonomy.seocontentlengh)",
|
||||
@@ -236,9 +236,15 @@
|
||||
"setting.frontMatter.templates.enabled.markdownDescription": "テンプレート機能を利用します。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.templates.enabled)",
|
||||
"setting.frontMatter.templates.folder.markdownDescription": "テンプレートを保存するフォルダーを設定します。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.templates.folder)",
|
||||
"setting.frontMatter.templates.prefix.markdownDescription": "新しい記事の作成時、ファイル名に付与する接頭辞を設定します。[ドキュメントを確認](https://frontmatter.codes/docs/settings/overview#frontmatter.templates.prefix)",
|
||||
"setting.frontMatter.dashboard.mediaSnippet.deprecationMessage": "🚧: This setting is deprecated and will be removed in the next major version. Please define your media snippet in the `frontMatter.content.snippet` setting.",
|
||||
"setting.frontMatter.taxonomy.dateField.deprecationMessage": "🚧: This setting is deprecated and will be removed in the next major version. Please use the new `isPublishDate` settings instead in your content types date fields.",
|
||||
"setting.frontMatter.taxonomy.modifiedField.deprecationMessage": "🚧: This setting is deprecated and will be removed in the next major version. Please use the new `isModifiedDate` settings instead in your content types date fields.",
|
||||
"setting.frontMatter.global.disabledNotifications.markdownDescription": "🚧: This is an array with the notifications types that can be disabled for Front Matter CMS. [Check in the docs](https://frontmatter.codes/docs/settings/overview#frontmatter.global.disablednotifications)",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.customType.description": "🚧: Specify the name of the custom field type to use."
|
||||
"setting.frontMatter.dashboard.mediaSnippet.deprecationMessage": "この設定は非推奨であり、次のメジャーバージョンで削除される予定です。メディア スニペットは 'frontMatter.content.snippet' 設定で定義してください。",
|
||||
"setting.frontMatter.taxonomy.dateField.deprecationMessage": "この設定は非推奨であり、次のメジャーバージョンで削除される予定です。代わりに、コンテンツ タイプの日付フィールドで新しい 'isPublishDate' 設定を使用してください。",
|
||||
"setting.frontMatter.taxonomy.modifiedField.deprecationMessage": "この設定は非推奨であり、次のメジャーバージョンで削除される予定です。代わりに、コンテンツ タイプの日付フィールドで新しい 'isModifiedDate' 設定を使用してください。",
|
||||
"setting.frontMatter.global.disabledNotifications.markdownDescription": "これは、Front Matter CMS で無効にできる通知タイプの配列です。[ドキュメントをチェックイン](https://frontmatter.codes/docs/settings/overview#frontmatter.global.disablednotifications)",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.customType.description": "使用するユーザー設定フィールド型の名前を指定します。",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.clearEmpty.description": "空の値をクリアするかどうかを指定します。",
|
||||
"setting.frontMatter.website.host.markdownDescription": "ウェブサイトのホスト URL を指定します。[ドキュメントをチェックイン](https://frontmatter.codes/docs/settings/overview#frontmatter.website.url)",
|
||||
"command.frontMatter.settings.refresh": "フロントマター設定の更新",
|
||||
"setting.frontMatter.config.dynamicFilePath.markdownDescription": "動的構成ファイルへのパスを指定します (例: [[ワークスペース]]/config.js)。[ドキュメントをチェックイン](https://frontmatter.codes/docs/settings/overview#frontmatter.config.dynamicfilepath)",
|
||||
"setting.frontMatter.content.pageFolders.items.properties.disableCreation.description": "フォルダー内の新しいコンテンツの作成を無効にします。",
|
||||
"setting.frontMatter.custom.scripts.items.properties.contentTypes.description": "スクリプトを使用するコンテンツ タイプを定義します。何も定義されていない場合は、すべての型で使用できます。"
|
||||
}
|
||||
@@ -74,6 +74,7 @@
|
||||
"setting.frontMatter.content.pageFolders.items.properties.previewPath.description": "Defines a custom preview path for the folder.",
|
||||
"setting.frontMatter.content.pageFolders.items.properties.filePrefix.description": "Defines a prefix for the file name.",
|
||||
"setting.frontMatter.content.pageFolders.items.properties.contentTypes.description": "Defines which content types can be used for the current location. If not defined, all content types will be available.",
|
||||
"setting.frontMatter.content.pageFolders.items.properties.disableCreation.description": "Disable the creation of new content in the folder.",
|
||||
"setting.frontMatter.content.placeholders.markdownDescription": "This array of placeholders defines the placeholders that you can use in your content types and templates for automatically populating your content its front matter. [Check in the docs](https://frontmatter.codes/docs/settings/overview#frontmatter.content.placeholders)",
|
||||
"setting.frontMatter.content.placeholders.items.properties.id.description": "ID of the placeholder, in your content type or template, use it as follows: {{placeholder}}",
|
||||
"setting.frontMatter.content.placeholders.items.properties.value.description": "The placeholder its value",
|
||||
@@ -104,6 +105,7 @@
|
||||
"setting.frontMatter.custom.scripts.items.properties.hidden.description": "Hide the action from the UI",
|
||||
"setting.frontMatter.custom.scripts.items.properties.environments.items.properties.type.description": "The environment type for which the script needs to be used",
|
||||
"setting.frontMatter.custom.scripts.items.properties.environments.items.properties.script.description": "Path to the script to execute",
|
||||
"setting.frontMatter.custom.scripts.items.properties.contentTypes.description": "Define the content types for which the script will be used. If none are defined, it will be available to all types.",
|
||||
"setting.frontMatter.dashboard.content.pagination.markdownDescription": "Specify if you want to enable/disable pagination for your content. You can define your page number up to 52. Default items per page is `16`. Disabling the pagination can be done by setting it to `false`. [Check in the docs](https://frontmatter.codes/docs/settings/overview#frontmatter.dashboard.content.pagination)",
|
||||
"setting.frontMatter.dashboard.content.cardTags.markdownDescription": "Specify the name of the metadata field that will be used to show the tags on the content card. When empty or null, it will hide the tags from the card. [Check in the docs](https://frontmatter.codes/docs/settings/overview#frontmatter.dashboard.content.cardtags)",
|
||||
"setting.frontMatter.dashboard.content.card.fields.state.markdownDescription": "Specify if you want to show the state/draft status on the content card view. [Check in the docs](https://frontmatter.codes/docs/settings/overview#frontMatter.dashboard.content.card.fields.state)",
|
||||
@@ -152,6 +154,7 @@
|
||||
"setting.frontMatter.media.defaultSorting.markdownDescription": "Specify the default sorting option for the media dashboard. [Check in the docs](https://frontmatter.codes/docs/settings/overview#frontmatter.media.defaultsorting)",
|
||||
"setting.frontMatter.media.supportedMimeTypes.markdownDescription": "Specify the mime types to support for the media files. [Check in the docs](https://frontmatter.codes/docs/settings/overview#frontmatter.media.supportedmimetypes)",
|
||||
"setting.frontMatter.panel.freeform.markdownDescription": "Specifies if you want to allow yourself from entering unknown tags/categories in the tag picker (when enabled, you will have the option to store them afterwards). Default: true. [Check in the docs](https://frontmatter.codes/docs/settings/overview#frontmatter.panel.freeform)",
|
||||
"setting.frontMatter.panel.actions.disabled.markdownDescription": "Specify the actions you want to disable in the panel. [Check in the docs](https://frontmatter.codes/docs/settings/overview#frontmatter.panel.actions.disabled)",
|
||||
"setting.frontMatter.preview.host.markdownDescription": "Specify the host URL (example: http://localhost:1313) to be used when opening the preview. [Check in the docs](https://frontmatter.codes/docs/settings/overview#frontmatter.preview.host)",
|
||||
"setting.frontMatter.preview.pathName.markdownDescription": "Specify the path you want to add after the host and before your slug. This can be used for instance to include the year/month like: `yyyy/MM`. The date will be generated based on the article its date field value. [Check in the docs](https://frontmatter.codes/docs/settings/overview#frontmatter.preview.pathname)",
|
||||
"setting.frontMatter.site.baseURL.markdownDescription": "Specify the base URL of your site, this will be used for SEO checks. [Check in the docs](https://frontmatter.codes/docs/settings/overview#frontmatter.site.baseurl)",
|
||||
@@ -188,6 +191,7 @@
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.numberOptions.properties.max.description": "The maximum value",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.numberOptions.properties.step.description": "The step value",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.taxonomyLimit.description": "Limit the number of taxonomies to select. Set to 0 to allow unlimited.",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.singleValueAsString.description": "Specify if you want to store a single array value as a string instead of an array.",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.isPublishDate.description": "Specify if the field is the publish date field",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.isModifiedDate.description": "Specify if the field is the modified date field",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.dataFileId.description": "Specify the ID of the data file to use for this field",
|
||||
@@ -215,7 +219,7 @@
|
||||
"setting.frontMatter.taxonomy.customTaxonomy.items.properties.options.description": "Options from which you can pick.",
|
||||
"setting.frontMatter.taxonomy.dateField.markdownDescription": "This setting is used to define the publishing date field of your articles. [Check in the docs](https://frontmatter.codes/docs/settings/overview#frontmatter.taxonomy.datefield)",
|
||||
"setting.frontMatter.taxonomy.dateFormat.markdownDescription": "Specify the date format for your articles. Check [date-fns formating](https://date-fns.org/v2.0.1/docs/format) for more information. [Check in the docs](https://frontmatter.codes/docs/settings/overview#frontmatter.taxonomy.dateformat)",
|
||||
"setting.frontMatter.taxonomy.fieldGroups.markdownDescription": "Define the field groups you want to use for your block fields. [Check in the docs](https://frontmatter.codes/docs/settings/overview#frontmatter.taxonomy.fieldgroups)",
|
||||
"setting.frontMatter.taxonomy.fieldGroups.markdownDescription": "Define the field groups you want to use for your block fields or collection fields. [Check in the docs](https://frontmatter.codes/docs/settings/overview#frontmatter.taxonomy.fieldgroups)",
|
||||
"setting.frontMatter.taxonomy.fieldGroups.items.properties.id.description": "The name of the field group",
|
||||
"setting.frontMatter.taxonomy.fieldGroups.items.properties.labelField.description": "The name of the field to be used as display value",
|
||||
"setting.frontMatter.taxonomy.frontMatterType.markdownDescription": "Specify the type of Front Matter to use. [Check in the docs](https://frontmatter.codes/docs/settings/overview#frontmatter.taxonomy.frontmattertype)",
|
||||
@@ -239,5 +243,9 @@
|
||||
"setting.frontMatter.dashboard.mediaSnippet.deprecationMessage": "This setting is deprecated and will be removed in the next major version. Please define your media snippet in the `frontMatter.content.snippet` setting.",
|
||||
"setting.frontMatter.taxonomy.dateField.deprecationMessage": "This setting is deprecated and will be removed in the next major version. Please use the new `isPublishDate` settings instead in your content types date fields.",
|
||||
"setting.frontMatter.taxonomy.modifiedField.deprecationMessage": "This setting is deprecated and will be removed in the next major version. Please use the new `isModifiedDate` settings instead in your content types date fields.",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.customType.description": "Specify the name of the custom field type to use."
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.customType.description": "Specify the name of the custom field type to use.",
|
||||
"setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.clearEmpty.description": "Specify if the empty values should be cleared.",
|
||||
"setting.frontMatter.website.host.markdownDescription": "Specify the host URL of your website. [Check in the docs](https://frontmatter.codes/docs/settings/overview#frontmatter.website.url)",
|
||||
"command.frontMatter.settings.refresh": "Refresh Front Matter Settings",
|
||||
"setting.frontMatter.config.dynamicFilePath.markdownDescription": "Specify the path to the dynamic config file (ex: [[workspace]]/config.js). [Check in the docs](https://frontmatter.codes/docs/settings/overview#frontmatter.config.dynamicfilepath)"
|
||||
}
|
||||
@@ -1,6 +1,42 @@
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const glob = require('glob');
|
||||
const { v4: uuidv4 } = require('uuid');
|
||||
require('dotenv').config()
|
||||
|
||||
const transKey = process.env.TRANSLATION_API_KEY || "";
|
||||
const apiUrl = process.env.TRANSLATION_API_URL || "";
|
||||
const location = process.env.TRANSLATION_API_LOCATION || "";
|
||||
|
||||
const getTranslation = (translation) => {
|
||||
let value = undefined;
|
||||
|
||||
if (translation && translation.translations && translation.translations.length > 0) {
|
||||
value = translation.translations[0].text;
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
const callTranslationService = async (body, locale) => {
|
||||
const response = await fetch(`${apiUrl}/translate?api-version=3.0&from=en&to=${locale}`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Ocp-Apim-Subscription-Key': transKey,
|
||||
'Ocp-Apim-Subscription-Region': location,
|
||||
'Content-type': 'application/json',
|
||||
'Accept': 'application/json',
|
||||
'X-ClientTraceId': uuidv4().toString(),
|
||||
},
|
||||
body
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
return await response.json();
|
||||
}
|
||||
|
||||
(async () => {
|
||||
// Get all the files from the l10n directory
|
||||
@@ -11,6 +47,7 @@ const glob = require('glob');
|
||||
const enContent = JSON.parse(enFile);
|
||||
const enKeys = Object.keys(enContent);
|
||||
|
||||
console.log(`Starting l10n bundles`);
|
||||
for (const file of files) {
|
||||
if (file.endsWith(`bundle.l10n.json`)) {
|
||||
continue;
|
||||
@@ -20,17 +57,54 @@ const glob = require('glob');
|
||||
const fileContent = fs.readFileSync(path.join(__dirname, `../l10n/${file}`), 'utf8');
|
||||
let content = {};
|
||||
|
||||
// Get the locale
|
||||
const fileName = path.basename(file);
|
||||
const fileSplit = fileName.split('.');
|
||||
const locale = fileSplit[fileSplit.length - 2];
|
||||
if (!locale) {
|
||||
continue;
|
||||
}
|
||||
console.log(`- Processing: ${locale}`);
|
||||
|
||||
try {
|
||||
content = JSON.parse(fileContent);
|
||||
} catch (e) {
|
||||
// Ignore the error
|
||||
}
|
||||
|
||||
const keysToTranslate = [];
|
||||
|
||||
// Loop through the EN keys
|
||||
for (const key of enKeys) {
|
||||
// If the key does not exist in the file, add it
|
||||
if (!content[key]) {
|
||||
content[key] = `🚧: ${enContent[key]}`;
|
||||
if (!content[key] || content[key].startsWith(`🚧: `)) {
|
||||
keysToTranslate.push({
|
||||
name: key,
|
||||
value: enContent[key],
|
||||
});
|
||||
|
||||
if (!apiUrl || !transKey || !location) {
|
||||
content[key] = `${enContent[key]}`;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (apiUrl && transKey && location) {
|
||||
if (keysToTranslate.length > 0) {
|
||||
console.log(` - Translating: ${keysToTranslate.length}`);
|
||||
const body = JSON.stringify(keysToTranslate.map(key => ({ text: key.value })));
|
||||
const data = await callTranslationService(body, locale);
|
||||
|
||||
for (let i = 0; i < keysToTranslate.length; i++) {
|
||||
const keyToTranslate = keysToTranslate[i];
|
||||
const translation = getTranslation(data[i]);
|
||||
|
||||
if (keyToTranslate.name && translation) {
|
||||
content[keyToTranslate.name] = translation;
|
||||
} else {
|
||||
content[keyToTranslate.name] = `${keyToTranslate.value}`;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,21 +120,60 @@ const glob = require('glob');
|
||||
|
||||
const pkgFiles = glob.sync(path.join(__dirname, '../package.nls.*.json'));
|
||||
|
||||
console.log(``);
|
||||
console.log(`Starting nls bundles`);
|
||||
for (const file of pkgFiles) {
|
||||
const fileContent = fs.readFileSync(file, 'utf8');
|
||||
let content = {};
|
||||
|
||||
// Get the locale
|
||||
const fileName = path.basename(file);
|
||||
const fileSplit = fileName.split('.');
|
||||
const locale = fileSplit[fileSplit.length - 2];
|
||||
if (!locale) {
|
||||
continue;
|
||||
}
|
||||
console.log(`- Processing: ${locale}`);
|
||||
|
||||
try {
|
||||
content = JSON.parse(fileContent);
|
||||
} catch (e) {
|
||||
// Ignore the error
|
||||
}
|
||||
|
||||
const keysToTranslate = [];
|
||||
|
||||
// Loop through the EN keys
|
||||
for (const key of enPkgKeys) {
|
||||
// If the key does not exist in the file, add it
|
||||
if (!content[key]) {
|
||||
content[key] = `🚧: ${enPkgContent[key]}`;
|
||||
const contentValue = content[key];
|
||||
if (!contentValue || contentValue.startsWith(`🚧: `)) {
|
||||
keysToTranslate.push({
|
||||
name: key,
|
||||
value: enPkgContent[key],
|
||||
});
|
||||
|
||||
if (!apiUrl || !transKey || !location) {
|
||||
content[key] = `🚧: ${enPkgContent[key]}`;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (apiUrl && transKey && location) {
|
||||
if (keysToTranslate.length > 0) {
|
||||
console.log(` - Translating: ${keysToTranslate.length}`);
|
||||
const body = JSON.stringify(keysToTranslate.map(key => ({ text: key.value })));
|
||||
const data = await callTranslationService(body, locale);
|
||||
|
||||
for (let i = 0; i < keysToTranslate.length; i++) {
|
||||
const keyToTranslate = keysToTranslate[i];
|
||||
const translation = getTranslation(data[i]);
|
||||
|
||||
if (keyToTranslate.name && translation) {
|
||||
content[keyToTranslate.name] = translation;
|
||||
} else {
|
||||
content[keyToTranslate.name] = `${keyToTranslate.value}`;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -127,7 +127,7 @@ export class Article {
|
||||
* @param article
|
||||
*/
|
||||
public static updateDate(article: ParsedFrontMatter) {
|
||||
article.data = ArticleHelper.updateDates(article.data);
|
||||
article.data = ArticleHelper.updateDates(article);
|
||||
return article;
|
||||
}
|
||||
|
||||
@@ -227,7 +227,7 @@ export class Article {
|
||||
}
|
||||
|
||||
let filePrefix = Settings.get<string>(SETTING_TEMPLATES_PREFIX);
|
||||
const contentType = ArticleHelper.getContentType(article.data);
|
||||
const contentType = ArticleHelper.getContentType(article);
|
||||
filePrefix = ArticleHelper.getFilePrefix(filePrefix, editor.document.uri.fsPath, contentType);
|
||||
|
||||
const titleField = 'title';
|
||||
@@ -393,7 +393,7 @@ export class Article {
|
||||
|
||||
const article = ArticleHelper.getFrontMatter(editor);
|
||||
const contentType =
|
||||
article && article.data ? ArticleHelper.getContentType(article.data) : DEFAULT_CONTENT_TYPE;
|
||||
article && article.data ? ArticleHelper.getContentType(article) : DEFAULT_CONTENT_TYPE;
|
||||
|
||||
const position = editor.selection.active;
|
||||
const selectionText = editor.document.getText(editor.selection);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { commands } from 'vscode';
|
||||
import { COMMAND_NAME, ExtensionState } from '../constants';
|
||||
import { Extension, Notifications } from '../helpers';
|
||||
import { Extension, Logger, Notifications } from '../helpers';
|
||||
|
||||
export class Cache {
|
||||
public static async registerCommands() {
|
||||
@@ -29,6 +29,8 @@ export class Cache {
|
||||
|
||||
if (showNotification) {
|
||||
Notifications.info('Cache cleared');
|
||||
} else {
|
||||
Logger.info('Cache cleared');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
import { Telemetry } from './../helpers/Telemetry';
|
||||
import { TelemetryEvent, PreviewCommands, SETTING_EXPERIMENTAL } from './../constants';
|
||||
import { TelemetryEvent, PreviewCommands, GeneralCommands } from './../constants';
|
||||
import { join } from 'path';
|
||||
import { commands, Uri, ViewColumn, window } from 'vscode';
|
||||
import { Extension, Settings } from '../helpers';
|
||||
import { WebviewHelper } from '@estruyf/vscode';
|
||||
import { getLocalizationFile } from '../utils/getLocalizationFile';
|
||||
|
||||
export class Chatbot {
|
||||
/**
|
||||
@@ -30,13 +31,27 @@ export class Chatbot {
|
||||
|
||||
const cspSource = webView.webview.cspSource;
|
||||
|
||||
webView.webview.onDidReceiveMessage((message) => {
|
||||
webView.webview.onDidReceiveMessage(async (message) => {
|
||||
switch (message.command) {
|
||||
case PreviewCommands.toVSCode.open:
|
||||
if (message.data) {
|
||||
commands.executeCommand('vscode.open', message.data);
|
||||
}
|
||||
return;
|
||||
case GeneralCommands.toVSCode.getLocalization:
|
||||
const { requestId } = message;
|
||||
if (!requestId) {
|
||||
return;
|
||||
}
|
||||
|
||||
const fileContents = await getLocalizationFile();
|
||||
|
||||
webView.webview.postMessage({
|
||||
command: GeneralCommands.toVSCode.getLocalization,
|
||||
requestId,
|
||||
payload: fileContents
|
||||
});
|
||||
return;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ import {
|
||||
SETTING_EXTENSIBILITY_SCRIPTS
|
||||
} from '../constants';
|
||||
import { join } from 'path';
|
||||
import { commands, Uri, ViewColumn, Webview, WebviewPanel, window, workspace } from 'vscode';
|
||||
import { commands, Uri, ViewColumn, Webview, WebviewPanel, window } from 'vscode';
|
||||
import { Logger, Settings as SettingsHelper } from '../helpers';
|
||||
import { DashboardCommand } from '../dashboardWebView/DashboardCommand';
|
||||
import { Extension } from '../helpers/Extension';
|
||||
@@ -23,7 +23,8 @@ import {
|
||||
SnippetListener,
|
||||
TaxonomyListener,
|
||||
LogListener,
|
||||
LocalizationListener
|
||||
LocalizationListener,
|
||||
SsgListener
|
||||
} from '../listeners/dashboard';
|
||||
import { MediaListener as PanelMediaListener } from '../listeners/panel';
|
||||
import { GitListener, ModeListener } from '../listeners/general';
|
||||
@@ -134,7 +135,7 @@ export class Dashboard {
|
||||
light: Uri.file(join(extensionUri.fsPath, 'assets/icons/frontmatter-short-light.svg'))
|
||||
};
|
||||
|
||||
Dashboard.webview.webview.html = Dashboard.getWebviewContent(
|
||||
Dashboard.webview.webview.html = await Dashboard.getWebviewContent(
|
||||
Dashboard.webview.webview,
|
||||
extensionUri
|
||||
);
|
||||
@@ -160,7 +161,7 @@ export class Dashboard {
|
||||
await commands.executeCommand('setContext', CONTEXT.isDashboardOpen, false);
|
||||
});
|
||||
|
||||
SettingsHelper.onConfigChange(() => {
|
||||
SettingsHelper.attachListener('dashboard-listener', () => {
|
||||
SettingsListener.getSettings(true);
|
||||
});
|
||||
|
||||
@@ -180,6 +181,7 @@ export class Dashboard {
|
||||
GitListener.process(msg);
|
||||
TaxonomyListener.process(msg);
|
||||
LogListener.process(msg);
|
||||
SsgListener.process(msg);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -198,7 +200,12 @@ export class Dashboard {
|
||||
* Post data to the dashboard
|
||||
* @param msg
|
||||
*/
|
||||
public static postWebviewMessage(msg: { command: DashboardCommand; payload?: unknown }) {
|
||||
public static postWebviewMessage(msg: {
|
||||
command: DashboardCommand;
|
||||
requestId?: string;
|
||||
payload?: unknown;
|
||||
error?: unknown;
|
||||
}) {
|
||||
if (Dashboard.isDisposed) {
|
||||
return;
|
||||
}
|
||||
@@ -212,7 +219,7 @@ export class Dashboard {
|
||||
* Retrieve the webview HTML contents
|
||||
* @param webView
|
||||
*/
|
||||
private static getWebviewContent(webView: Webview, extensionPath: Uri): string {
|
||||
private static async getWebviewContent(webView: Webview, extensionPath: Uri): Promise<string> {
|
||||
const dashboardFile = 'dashboardWebView.js';
|
||||
const localPort = `9000`;
|
||||
const localServerUrl = `localhost:${localPort}`;
|
||||
@@ -270,10 +277,9 @@ export class Dashboard {
|
||||
}`
|
||||
];
|
||||
|
||||
const globalConfigPath = await SettingsHelper.projectConfigPath();
|
||||
const frontMatterUri = webView
|
||||
.asWebviewUri(
|
||||
SettingsHelper.projectConfigPath ? Uri.file(SettingsHelper.projectConfigPath) : Uri.file('')
|
||||
)
|
||||
.asWebviewUri(globalConfigPath ? Uri.file(globalConfigPath) : Uri.file(''))
|
||||
.toString();
|
||||
|
||||
const webviewUrl = frontMatterUri.replace(`/${SettingsHelper.globalFile}`, '');
|
||||
|
||||
@@ -95,7 +95,7 @@ export class Folders {
|
||||
return;
|
||||
}
|
||||
|
||||
const folders = Folders.get();
|
||||
const folders = Folders.get().filter((f) => !f.disableCreation);
|
||||
const location = folders.find((f) => f.title === selectedFolder);
|
||||
if (location) {
|
||||
const folderPath = Folders.getFolderPath(Uri.file(location.path));
|
||||
@@ -109,9 +109,12 @@ export class Folders {
|
||||
* Register the new folder path
|
||||
* @param folderInfo
|
||||
*/
|
||||
public static async register(folderInfo: { title: string; path: Uri } | Uri) {
|
||||
public static async register(
|
||||
folderInfo: { title: string; path: Uri; contentType: string[] } | Uri
|
||||
) {
|
||||
let folderName = folderInfo instanceof Uri ? undefined : folderInfo.title;
|
||||
const folder = folderInfo instanceof Uri ? folderInfo : folderInfo.path;
|
||||
const contentType = folderInfo instanceof Uri ? undefined : folderInfo.contentType;
|
||||
|
||||
if (folder && folder.fsPath) {
|
||||
const wslPath = folder.fsPath.replace(/\//g, '\\');
|
||||
@@ -137,10 +140,16 @@ export class Folders {
|
||||
});
|
||||
}
|
||||
|
||||
folders.push({
|
||||
const contentFolder = {
|
||||
title: folderName,
|
||||
path: folder.fsPath
|
||||
} as ContentFolder);
|
||||
} as ContentFolder;
|
||||
|
||||
if (contentType) {
|
||||
contentFolder.contentTypes = typeof contentType === 'string' ? [contentType] : contentType;
|
||||
}
|
||||
|
||||
folders.push(contentFolder);
|
||||
|
||||
folders = uniqBy(folders, (f) => f.path);
|
||||
await Folders.update(folders);
|
||||
@@ -352,7 +361,10 @@ export class Folders {
|
||||
*/
|
||||
public static get(): ContentFolder[] {
|
||||
const wsFolder = Folders.getWorkspaceFolder();
|
||||
const folders: ContentFolder[] = Settings.get(SETTING_CONTENT_PAGE_FOLDERS) as ContentFolder[];
|
||||
let folders: ContentFolder[] = Settings.get(SETTING_CONTENT_PAGE_FOLDERS) as ContentFolder[];
|
||||
|
||||
// Filter out folders without a path
|
||||
folders = folders.filter((f) => f.path);
|
||||
|
||||
const contentFolders = folders.map((folder) => {
|
||||
if (!folder.title) {
|
||||
@@ -429,9 +441,14 @@ export class Folders {
|
||||
public static getAbsFilePath(filePath: string): string {
|
||||
const wsFolder = Folders.getWorkspaceFolder();
|
||||
const isWindows = process.platform === 'win32';
|
||||
let absPath = filePath.replace(WORKSPACE_PLACEHOLDER, parseWinPath(wsFolder?.fsPath || ''));
|
||||
absPath = isWindows ? absPath.split('/').join('\\') : absPath;
|
||||
return parseWinPath(absPath);
|
||||
|
||||
if (filePath.includes(WORKSPACE_PLACEHOLDER)) {
|
||||
let absPath = filePath.replace(WORKSPACE_PLACEHOLDER, parseWinPath(wsFolder?.fsPath || ''));
|
||||
absPath = isWindows ? absPath.split('/').join('\\') : absPath;
|
||||
return parseWinPath(absPath);
|
||||
}
|
||||
|
||||
return parseWinPath(join(parseWinPath(wsFolder?.fsPath || ''), filePath));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -495,6 +512,10 @@ export class Folders {
|
||||
public static async getContentFolders() {
|
||||
// Find folders that contain files
|
||||
const wsFolder = Folders.getWorkspaceFolder();
|
||||
if (!wsFolder) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const supportedFiles =
|
||||
Settings.get<string[]>(SETTING_CONTENT_SUPPORTED_FILETYPES) || DEFAULT_FILE_TYPES;
|
||||
const patterns = supportedFiles.map(
|
||||
@@ -579,7 +600,7 @@ export class Folders {
|
||||
*/
|
||||
private static findFolders(pattern: string): Promise<string[]> {
|
||||
return new Promise((resolve) => {
|
||||
glob(pattern, { ignore: '**/node_modules/**' }, (err, files) => {
|
||||
glob(pattern, { ignore: '**/node_modules/**', dot: true }, (err, files) => {
|
||||
const allFolders = files.map((file) => dirname(file));
|
||||
const uniqueFolders = [...new Set(allFolders)];
|
||||
resolve(uniqueFolders);
|
||||
|
||||
@@ -8,11 +8,12 @@ import {
|
||||
TelemetryEvent,
|
||||
PreviewCommands,
|
||||
SETTING_EXPERIMENTAL,
|
||||
SETTING_DATE_FORMAT
|
||||
SETTING_DATE_FORMAT,
|
||||
GeneralCommands
|
||||
} from './../constants';
|
||||
import { ArticleHelper } from './../helpers/ArticleHelper';
|
||||
import { join, parse } from 'path';
|
||||
import { commands, env, Uri, ViewColumn, window, WebviewPanel } from 'vscode';
|
||||
import { commands, env, Uri, ViewColumn, window, WebviewPanel, extensions } from 'vscode';
|
||||
import { Extension, parseWinPath, processKnownPlaceholders, Settings } from '../helpers';
|
||||
import { ContentFolder, ContentType, PreviewSettings } from '../models';
|
||||
import { format } from 'date-fns';
|
||||
@@ -21,8 +22,8 @@ import { Article } from '.';
|
||||
import { urlJoin } from 'url-join-ts';
|
||||
import { WebviewHelper } from '@estruyf/vscode';
|
||||
import { Folders } from './Folders';
|
||||
import { DataListener } from '../listeners/panel';
|
||||
import { ParsedFrontMatter } from '../parsers';
|
||||
import { getLocalizationFile } from '../utils/getLocalizationFile';
|
||||
|
||||
export class Preview {
|
||||
public static filePath: string | undefined = undefined;
|
||||
@@ -46,17 +47,26 @@ export class Preview {
|
||||
return;
|
||||
}
|
||||
|
||||
const browserLiteCommand = await this.getBrowserLiteCommand();
|
||||
|
||||
const editor = window.activeTextEditor;
|
||||
const crntFilePath = editor?.document.uri.fsPath;
|
||||
this.filePath = crntFilePath;
|
||||
|
||||
if (crntFilePath && this.webviews[crntFilePath]) {
|
||||
if (crntFilePath && this.webviews[crntFilePath] && !browserLiteCommand) {
|
||||
this.webviews[crntFilePath].reveal();
|
||||
return;
|
||||
}
|
||||
|
||||
const article = editor ? ArticleHelper.getFrontMatter(editor) : null;
|
||||
const slug = await this.getContentSlug(article, editor?.document.uri.fsPath);
|
||||
const localhostUrl = await this.getLocalServerUrl();
|
||||
|
||||
if (browserLiteCommand) {
|
||||
const pageUrl = urlJoin(localhostUrl.toString(), slug || '');
|
||||
commands.executeCommand(browserLiteCommand, pageUrl);
|
||||
return;
|
||||
}
|
||||
|
||||
// Create the preview webview
|
||||
const webView = window.createWebviewPanel(
|
||||
@@ -80,36 +90,33 @@ export class Preview {
|
||||
light: Uri.file(join(extensionPath, 'assets/icons/frontmatter-short-light.svg'))
|
||||
};
|
||||
|
||||
const localhostUrl = await this.getLocalServerUrl();
|
||||
|
||||
const cspSource = webView.webview.cspSource;
|
||||
|
||||
webView.onDidDispose(() => {
|
||||
this.filePath = undefined;
|
||||
if (crntFilePath) {
|
||||
delete this.webviews[crntFilePath];
|
||||
}
|
||||
webView.dispose();
|
||||
});
|
||||
|
||||
webView.onDidChangeViewState(async (e) => {
|
||||
if (e.webviewPanel.visible) {
|
||||
this.filePath = crntFilePath;
|
||||
|
||||
if (crntFilePath) {
|
||||
const article = await ArticleHelper.getFrontMatterByPath(crntFilePath);
|
||||
DataListener.pushMetadata(article?.data);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
webView.webview.onDidReceiveMessage((message) => {
|
||||
webView.webview.onDidReceiveMessage(async (message) => {
|
||||
switch (message.command) {
|
||||
case PreviewCommands.toVSCode.open:
|
||||
if (message.data) {
|
||||
commands.executeCommand('vscode.open', message.data);
|
||||
if (message.payload) {
|
||||
commands.executeCommand('vscode.open', message.payload);
|
||||
}
|
||||
return;
|
||||
case GeneralCommands.toVSCode.getLocalization:
|
||||
const { requestId } = message;
|
||||
if (!requestId) {
|
||||
return;
|
||||
}
|
||||
|
||||
const fileContents = await getLocalizationFile();
|
||||
|
||||
webView.webview.postMessage({
|
||||
command: GeneralCommands.toVSCode.getLocalization,
|
||||
requestId,
|
||||
payload: fileContents
|
||||
});
|
||||
return;
|
||||
}
|
||||
});
|
||||
|
||||
@@ -205,8 +212,8 @@ export class Preview {
|
||||
* @param filePath
|
||||
* @returns
|
||||
*/
|
||||
private static async getContentSlug(
|
||||
article: ParsedFrontMatter | null,
|
||||
public static async getContentSlug(
|
||||
article: ParsedFrontMatter | null | undefined,
|
||||
filePath?: string
|
||||
): Promise<string | undefined> {
|
||||
if (!filePath) {
|
||||
@@ -223,7 +230,7 @@ export class Preview {
|
||||
|
||||
let contentType: ContentType | undefined = undefined;
|
||||
if (article?.data) {
|
||||
contentType = ArticleHelper.getContentType(article.data);
|
||||
contentType = ArticleHelper.getContentType(article);
|
||||
}
|
||||
|
||||
// Check if there is a pathname defined on content folder level
|
||||
@@ -242,10 +249,16 @@ export class Preview {
|
||||
|
||||
if (!selectedFolder && article?.data && contentType && !contentType.previewPath) {
|
||||
// Try to find the folder by content type
|
||||
const crntFolders = folders.filter((folder) =>
|
||||
folder.contentTypes?.includes((contentType as ContentType).name)
|
||||
let crntFolders = folders.filter(
|
||||
(folder) =>
|
||||
folder.contentTypes?.includes((contentType as ContentType).name) && folder.previewPath
|
||||
);
|
||||
|
||||
// Use file path to find the folder
|
||||
if (crntFolders.length > 0) {
|
||||
crntFolders = crntFolders.filter((folder) => filePath?.startsWith(folder.path));
|
||||
}
|
||||
|
||||
if (crntFolders && crntFolders.length === 1) {
|
||||
selectedFolder = crntFolders[0];
|
||||
} else if (crntFolders && crntFolders.length > 1) {
|
||||
@@ -322,6 +335,22 @@ export class Preview {
|
||||
return slug;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if Browser Lite is installed
|
||||
*/
|
||||
private static async getBrowserLiteCommand() {
|
||||
const ext = extensions.getExtension(`antfu.browse-lite`);
|
||||
if (ext && ext.packageJSON) {
|
||||
const hasCommand = ext.packageJSON.contributes?.commands?.find(
|
||||
(c: { command: string }) => c.command === 'browse-lite.open'
|
||||
);
|
||||
if (hasCommand) {
|
||||
return 'browse-lite.open';
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the localhost url
|
||||
* @returns
|
||||
|
||||
@@ -43,8 +43,8 @@ categories: []
|
||||
subscriptions.push(commands.registerCommand(COMMAND_NAME.switchProject, Project.switchProject));
|
||||
}
|
||||
|
||||
public static isInitialized() {
|
||||
const hasProjectFile = Settings.hasProjectFile();
|
||||
public static async isInitialized() {
|
||||
const hasProjectFile = await Settings.hasProjectFile();
|
||||
// If it has a project file, initialize the media library
|
||||
if (hasProjectFile) {
|
||||
MediaLibrary.getInstance();
|
||||
|
||||
@@ -24,23 +24,12 @@ export class StatusListener {
|
||||
* @param frontMatterSB
|
||||
* @param collection
|
||||
*/
|
||||
public static async verify(
|
||||
frontMatterSB: vscode.StatusBarItem,
|
||||
collection: vscode.DiagnosticCollection
|
||||
) {
|
||||
const draftMsg = 'in draft';
|
||||
const publishMsg = 'to publish';
|
||||
|
||||
const draft = ContentType.getDraftField();
|
||||
if (!draft || draft.type !== 'boolean') {
|
||||
frontMatterSB.hide();
|
||||
}
|
||||
|
||||
public static async verify(collection: vscode.DiagnosticCollection) {
|
||||
const editor = vscode.window.activeTextEditor;
|
||||
let document = editor?.document;
|
||||
|
||||
if (!document) {
|
||||
const filePath = Preview.filePath;
|
||||
const filePath = Preview.filePath || ArticleHelper.getActiveFile();
|
||||
if (filePath) {
|
||||
document = await vscode.workspace.openTextDocument(vscode.Uri.file(filePath));
|
||||
}
|
||||
@@ -54,17 +43,6 @@ export class StatusListener {
|
||||
? ArticleHelper.getFrontMatter(editor)
|
||||
: await ArticleHelper.getFrontMatterByPath(document.uri.fsPath);
|
||||
|
||||
// Update the StatusBar based on the article draft state
|
||||
if (article && typeof article.data['draft'] !== 'undefined') {
|
||||
if (article.data['draft'] === true) {
|
||||
frontMatterSB.text = `$(book) ${draftMsg}`;
|
||||
frontMatterSB.show();
|
||||
} else if (article.data['draft'] === false) {
|
||||
frontMatterSB.text = `$(book) ${publishMsg}`;
|
||||
frontMatterSB.show();
|
||||
}
|
||||
}
|
||||
|
||||
// Check SEO and required fields
|
||||
if (article && article.data) {
|
||||
collection.clear();
|
||||
@@ -108,8 +86,6 @@ export class StatusListener {
|
||||
DataListener.pushMetadata(null);
|
||||
}
|
||||
}
|
||||
|
||||
frontMatterSB.hide();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -165,11 +165,15 @@ export class Template {
|
||||
newFilePath
|
||||
);
|
||||
|
||||
frontMatter = Article.updateDate(frontMatter);
|
||||
const article = Article.updateDate(frontMatter);
|
||||
|
||||
if (!article) {
|
||||
return;
|
||||
}
|
||||
|
||||
await writeFileAsync(
|
||||
newFilePath,
|
||||
ArticleHelper.stringifyFrontMatter(frontMatter.content, frontMatter.data),
|
||||
ArticleHelper.stringifyFrontMatter(article.content, article.data),
|
||||
{ encoding: 'utf8' }
|
||||
);
|
||||
|
||||
|
||||
@@ -18,7 +18,6 @@ export const COMMAND_NAME = {
|
||||
setLastModifiedDate: getCommandName('setLastModifiedDate'),
|
||||
generateSlug: getCommandName('generateSlug'),
|
||||
createFromTemplate: getCommandName('createFromTemplate'),
|
||||
toggleDraft: getCommandName('toggleDraft'),
|
||||
registerFolder: getCommandName('registerFolder'),
|
||||
unregisterFolder: getCommandName('unregisterFolder'),
|
||||
createContent: getCommandName('createContent'),
|
||||
@@ -42,6 +41,9 @@ export const COMMAND_NAME = {
|
||||
|
||||
showOutputChannel: getCommandName('showOutputChannel'),
|
||||
|
||||
// Settings
|
||||
settingsRefresh: getCommandName('settings.refresh'),
|
||||
|
||||
// Insert dashboards
|
||||
insertMedia: getCommandName('insertMedia'),
|
||||
insertSnippet: getCommandName('insertSnippet'),
|
||||
|
||||
@@ -5,7 +5,7 @@ export const FrameworkDetectors = [
|
||||
dist: 'dist',
|
||||
static: ['public', 'src/assets'],
|
||||
build: 'npm run build',
|
||||
server: 'http://localhost:3000'
|
||||
server: 'http://localhost:4321'
|
||||
},
|
||||
requiredFiles: ['astro.config.mjs'],
|
||||
requiredDependencies: ['astro'],
|
||||
@@ -65,7 +65,7 @@ export const FrameworkDetectors = [
|
||||
requiredFiles: ['nuxt.config.js'],
|
||||
requiredDependencies: ['nuxt'],
|
||||
commands: {
|
||||
start: 'npx nuxt'
|
||||
start: 'npx nuxt dev'
|
||||
}
|
||||
},
|
||||
{
|
||||
|
||||
@@ -8,6 +8,7 @@ export const GeneralCommands = {
|
||||
toVSCode: {
|
||||
openLink: 'openLink',
|
||||
gitSync: 'gitSync',
|
||||
getLocalization: 'getLocalization'
|
||||
getLocalization: 'getLocalization',
|
||||
openOnWebsite: 'openOnWebsite'
|
||||
}
|
||||
};
|
||||
|
||||
@@ -4,5 +4,6 @@ export const LocalStore = {
|
||||
databaseFolder: 'database',
|
||||
templatesFolder: 'templates',
|
||||
mediaDatabaseFile: 'mediaDb.json',
|
||||
taxonomyDatabaseFile: 'taxonomyDb.json'
|
||||
taxonomyDatabaseFile: 'taxonomyDb.json',
|
||||
pinnedItemsDatabaseFile: 'pinnedItemsDb.json'
|
||||
};
|
||||
|
||||
5
src/constants/SsgScripts.ts
Normal file
@@ -0,0 +1,5 @@
|
||||
export const SsgScripts = {
|
||||
folder: '/ssg-scripts',
|
||||
astroContentCollectionScript: 'astro.collections.mjs',
|
||||
astroContentCollectionJSON: 'astro.collections.json'
|
||||
};
|
||||
3
src/constants/Templates.ts
Normal file
@@ -0,0 +1,3 @@
|
||||
export const Templates = {
|
||||
url: 'https://frontmatter.github.io/templates/templates.json'
|
||||
};
|
||||
@@ -14,8 +14,10 @@ export * from './NotificationType';
|
||||
export * from './PreviewCommands';
|
||||
export * from './SentryIgnore';
|
||||
export * from './Snippet';
|
||||
export * from './SsgScripts';
|
||||
export * from './StaticFolderPlaceholder';
|
||||
export * from './TelemetryEvent';
|
||||
export * from './Templates';
|
||||
export * from './charCode';
|
||||
export * from './charMap';
|
||||
export * from './context';
|
||||
|
||||
@@ -7,6 +7,7 @@ export const SETTING_EXPERIMENTAL = 'experimental';
|
||||
export const SETTING_EXTENSIBILITY_SCRIPTS = 'extensibility.scripts';
|
||||
|
||||
export const SETTING_EXTENDS = 'extends';
|
||||
export const SETTING_CONFIG_DYNAMIC_FILE_PATH = 'config.dynamicFilePath';
|
||||
|
||||
export const SETTING_GLOBAL_NOTIFICATIONS = 'global.notifications';
|
||||
export const SETTING_GLOBAL_NOTIFICATIONS_DISABLED = 'global.disabledNotifications';
|
||||
@@ -45,6 +46,7 @@ export const SETTING_TEMPLATES_ENABLED = 'templates.enabled';
|
||||
export const SETTING_TELEMETRY_DISABLE = 'telemetry.disable';
|
||||
|
||||
export const SETTING_PANEL_FREEFORM = 'panel.freeform';
|
||||
export const SETTING_PANEL_ACTIONS_DISABLED = 'panel.actions.disabled';
|
||||
|
||||
export const SETTING_PREVIEW_HOST = 'preview.host';
|
||||
export const SETTING_PREVIEW_PATHNAME = 'preview.pathName';
|
||||
@@ -103,6 +105,8 @@ export const SETTING_GIT_SUBMODULE_FOLDER = 'git.submodule.folder';
|
||||
|
||||
export const SETTING_SNIPPETS_WRAPPER = 'snippets.wrapper.enabled';
|
||||
|
||||
export const SETTING_WEBSITE_URL = 'website.host';
|
||||
|
||||
/**
|
||||
* Sponsors only settings
|
||||
*/
|
||||
|
||||
@@ -13,6 +13,9 @@ export enum DashboardMessage {
|
||||
setFramework = 'setFramework',
|
||||
addFolder = 'addFolder',
|
||||
addAssetsFolder = 'addAssetsFolder',
|
||||
triggerTemplate = 'triggerTemplate',
|
||||
ssgGetAstroContentTypes = 'ssgGetAstroContentTypes',
|
||||
ssgSetAstroContentTypes = 'ssgSetAstroContentTypes',
|
||||
|
||||
// Content dashboard
|
||||
getData = 'getData',
|
||||
@@ -23,6 +26,9 @@ export enum DashboardMessage {
|
||||
searchPages = 'searchPages',
|
||||
openFile = 'openFile',
|
||||
deleteFile = 'deleteFile',
|
||||
getPinnedItems = 'getPinnedItems',
|
||||
pinItem = 'pinItem',
|
||||
unpinItem = 'unpinItem',
|
||||
|
||||
// Media Dashboard
|
||||
getMedia = 'getMedia',
|
||||
@@ -36,6 +42,8 @@ export enum DashboardMessage {
|
||||
createMediaFolder = 'createMediaFolder',
|
||||
insertFile = 'insertFile',
|
||||
createHexoAssetFolder = 'createHexoAssetFolder',
|
||||
getUnmappedMedia = 'getUnmappedMedia',
|
||||
remapMediaMetadata = 'remapMediaMetadata',
|
||||
|
||||
// Data dashboard
|
||||
getDataEntries = 'getDataEntries',
|
||||
@@ -62,5 +70,9 @@ export enum DashboardMessage {
|
||||
setState = 'setState',
|
||||
runCustomScript = 'runCustomScript',
|
||||
sendTelemetry = 'sendTelemetry',
|
||||
logError = 'logError'
|
||||
logError = 'logError',
|
||||
|
||||
// Settings
|
||||
getSettings = 'getSettings',
|
||||
setSettings = 'setSettings'
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@ import { ErrorView } from './ErrorView';
|
||||
import { DashboardMessage } from '../DashboardMessage';
|
||||
import * as l10n from '@vscode/l10n';
|
||||
import { LocalizationKey } from '../../localization';
|
||||
import { SettingsView } from './SettingsView/SettingsView';
|
||||
|
||||
export interface IAppProps {
|
||||
showWelcome: boolean;
|
||||
@@ -133,6 +134,8 @@ Stack: ${componentStack}`
|
||||
<Route path={routePaths.taxonomy} element={<TaxonomyView pages={pages} />} />
|
||||
)}
|
||||
|
||||
<Route path={routePaths.settings} element={<SettingsView />} />
|
||||
|
||||
<Route path={`*`} element={<UnknownView />} />
|
||||
</Routes>
|
||||
</main>
|
||||
|
||||
@@ -9,6 +9,8 @@ import { useSettingsContext } from '../../providers/SettingsProvider';
|
||||
import { AiInitResponse } from './models/AiInitResponse';
|
||||
import * as l10n from '@vscode/l10n';
|
||||
import { LocalizationKey } from '../../../localization';
|
||||
import { messageHandler } from '@estruyf/vscode/dist/client';
|
||||
import { GeneralCommands } from '../../../constants';
|
||||
|
||||
export interface IChatbotProps { }
|
||||
|
||||
@@ -21,9 +23,19 @@ export const Chatbot: React.FunctionComponent<IChatbotProps> = ({ }: React.Props
|
||||
const [answerIds, setAnswerIds] = React.useState<number[]>([]);
|
||||
const [sources, setSources] = React.useState<string[][]>([]);
|
||||
const [loading, setLoading] = React.useState<boolean>(false);
|
||||
const [localeReady, setLocaleReady] = React.useState<boolean>(false);
|
||||
|
||||
const init = async () => {
|
||||
setLoading(true);
|
||||
messageHandler.request<any>(GeneralCommands.toVSCode.getLocalization).then((data) => {
|
||||
if (data) {
|
||||
l10n.config({
|
||||
contents: data
|
||||
});
|
||||
}
|
||||
setLocaleReady(true);
|
||||
});
|
||||
|
||||
const initResponse = await fetch(`${aiUrl}/api/ai-init`);
|
||||
|
||||
if (!initResponse.ok) {
|
||||
@@ -54,7 +66,7 @@ export const Chatbot: React.FunctionComponent<IChatbotProps> = ({ }: React.Props
|
||||
setSources(prev => [...prev, []])
|
||||
setAnswerIds(prev => [...prev, 0])
|
||||
|
||||
if (!company || !chatId) {
|
||||
if (!company || !chatId || !localeReady) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { format } from 'date-fns';
|
||||
import { format as fnsFormat } from 'date-fns';
|
||||
import * as React from 'react';
|
||||
import { DateHelper } from '../../../helpers/DateHelper';
|
||||
import useThemeColors from '../../hooks/useThemeColors';
|
||||
@@ -6,24 +6,32 @@ import useThemeColors from '../../hooks/useThemeColors';
|
||||
export interface IDateFieldProps {
|
||||
className?: string;
|
||||
value: Date | string;
|
||||
format?: string;
|
||||
}
|
||||
|
||||
export const DateField: React.FunctionComponent<IDateFieldProps> = ({
|
||||
className,
|
||||
value
|
||||
value,
|
||||
format
|
||||
}: React.PropsWithChildren<IDateFieldProps>) => {
|
||||
const [dateValue, setDateValue] = React.useState<string>('');
|
||||
const { getColors } = useThemeColors();
|
||||
|
||||
React.useEffect(() => {
|
||||
try {
|
||||
const parsedValue = typeof value === 'string' ? DateHelper.tryParse(value) : value;
|
||||
const dateString = parsedValue ? format(parsedValue, 'yyyy-MM-dd') : parsedValue;
|
||||
setDateValue(dateString || '');
|
||||
const parsedValue = typeof value === 'string' ? DateHelper.tryParse(value, format) : value;
|
||||
const dateString = parsedValue ? fnsFormat(parsedValue, 'yyyy-MM-dd') : parsedValue;
|
||||
|
||||
if (dateString) {
|
||||
setDateValue(dateString);
|
||||
} else if (!dateString && typeof value === 'string') {
|
||||
setDateValue(value);
|
||||
}
|
||||
} catch (e) {
|
||||
// Date is invalid
|
||||
setDateValue(typeof value === 'string' ? value : '');
|
||||
}
|
||||
}, [value]);
|
||||
}, [value, format]);
|
||||
|
||||
if (!dateValue) {
|
||||
return null;
|
||||
|
||||
@@ -1,23 +1,17 @@
|
||||
import * as React from 'react';
|
||||
import useThemeColors from '../../hooks/useThemeColors';
|
||||
|
||||
export interface ISpinnerProps { }
|
||||
|
||||
export const Spinner: React.FunctionComponent<ISpinnerProps> = (
|
||||
props: React.PropsWithChildren<ISpinnerProps>
|
||||
_: React.PropsWithChildren<ISpinnerProps>
|
||||
) => {
|
||||
const { getColors } = useThemeColors();
|
||||
|
||||
return (
|
||||
<div
|
||||
className={`fixed top-0 left-0 right-0 bottom-0 w-full h-full flex flex-wrap items-center justify-center z-50 ${getColors(
|
||||
`bg-black bg-opacity-50`,
|
||||
`bg-[var(--vscode-editor-background)] opacity-75`
|
||||
)
|
||||
}`}
|
||||
>
|
||||
<div className={`loader ease-linear rounded-full border-8 border-t-8 h-16 w-16 ${getColors(`border-gray-50 border-t-teal-500`, `border-[var(--vscode-activityBar-inactiveForeground)] border-t-[var(--vscode-activityBarBadge-background)]`)
|
||||
}`} />
|
||||
<div className={`z-50 fixed top-0 left-0 right-0 bottom-0 w-full h-full bg-[var(--vscode-editor-background)] opacity-75`}>
|
||||
<div
|
||||
className={`absolute top-0 w-full h-[2px] `}
|
||||
>
|
||||
<div className={`h-full absolute rounded-sm bg-[var(--vscode-activityBarBadge-background)] animate-[vscode-loader_4s_ease-in-out_infinite]`} />
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,69 @@
|
||||
import * as React from 'react';
|
||||
import * as l10n from '@vscode/l10n';
|
||||
import { messageHandler } from '@estruyf/vscode/dist/client';
|
||||
import { DashboardMessage } from '../../../DashboardMessage';
|
||||
import { AstroCollection } from '../../../../models';
|
||||
import { Settings } from '../../../models';
|
||||
import { SelectItem } from '../../Steps/SelectItem';
|
||||
import { LocalizationKey } from '../../../../localization';
|
||||
|
||||
export interface IAstroContentTypesProps {
|
||||
settings: Settings
|
||||
triggerLoading: (isLoading: boolean) => void;
|
||||
}
|
||||
|
||||
export const AstroContentTypes: React.FunctionComponent<IAstroContentTypesProps> = ({
|
||||
settings,
|
||||
triggerLoading
|
||||
}: React.PropsWithChildren<IAstroContentTypesProps>) => {
|
||||
const [collections, setCollections] = React.useState<AstroCollection[]>([]);
|
||||
|
||||
React.useEffect(() => {
|
||||
triggerLoading(true);
|
||||
messageHandler.request<AstroCollection[]>(DashboardMessage.ssgGetAstroContentTypes).then((result) => {
|
||||
triggerLoading(false);
|
||||
setCollections(result);
|
||||
});
|
||||
}, []);
|
||||
|
||||
const generateContentType = (collection: AstroCollection) => {
|
||||
triggerLoading(true);
|
||||
messageHandler.request(DashboardMessage.ssgSetAstroContentTypes, {
|
||||
collection
|
||||
}).then((result) => {
|
||||
triggerLoading(false);
|
||||
});
|
||||
}
|
||||
|
||||
if (!collections || collections.length === 0) {
|
||||
return (
|
||||
<div className='mt-1'>
|
||||
{l10n.t(LocalizationKey.dashboardConfigurationAstroAstroContentTypesEmpty)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className='mt-1'>
|
||||
<p>{l10n.t(LocalizationKey.dashboardConfigurationAstroAstroContentTypesDescription)}</p>
|
||||
|
||||
<div className='mt-2'>
|
||||
{
|
||||
(collections || []).map((collection) => {
|
||||
const ct = settings.contentTypes.find((c) => c.name === collection.name);
|
||||
|
||||
return (
|
||||
<SelectItem
|
||||
key={collection.name}
|
||||
title={collection.name}
|
||||
buttonTitle={collection.name}
|
||||
isSelected={ct !== undefined}
|
||||
onClick={() => generateContentType(collection)}
|
||||
disabled={ct !== undefined} />
|
||||
)
|
||||
})
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
@@ -0,0 +1,50 @@
|
||||
import * as React from 'react';
|
||||
import * as l10n from '@vscode/l10n';
|
||||
import { LocalizationKey } from '../../../../localization';
|
||||
import { Settings } from '../../../models';
|
||||
import { Folder } from './Folder';
|
||||
import { Messenger } from '@estruyf/vscode/dist/client';
|
||||
import { DashboardMessage } from '../../../DashboardMessage';
|
||||
|
||||
export interface IContentFoldersProps {
|
||||
settings: Settings
|
||||
triggerLoading: (isLoading: boolean) => void;
|
||||
}
|
||||
|
||||
export const ContentFolders: React.FunctionComponent<IContentFoldersProps> = ({
|
||||
settings
|
||||
}: React.PropsWithChildren<IContentFoldersProps>) => {
|
||||
|
||||
const addFolder = (folder: string) => {
|
||||
Messenger.send(DashboardMessage.addFolder, folder);
|
||||
};
|
||||
|
||||
return (
|
||||
<>
|
||||
<p>
|
||||
{l10n.t(LocalizationKey.dashboardStepsStepsToGetStartedContentFoldersDescription)}
|
||||
</p>
|
||||
|
||||
{settings?.dashboardState?.welcome?.contentFolders?.length > 0 && (
|
||||
<div className="mt-4">
|
||||
<div className="text-sm">{l10n.t(LocalizationKey.dashboardStepsStepsToGetStartedContentFoldersLabel)}</div>
|
||||
<div className="mt-1 space-y-1">
|
||||
{settings?.dashboardState?.welcome?.contentFolders?.map((folder: string) => (
|
||||
<Folder
|
||||
key={folder}
|
||||
folder={folder}
|
||||
addFolder={addFolder}
|
||||
wsFolder={settings.wsFolder}
|
||||
folders={settings.contentFolders}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
<p className={`mt-4`}>
|
||||
<b>{l10n.t(LocalizationKey.commonInformation)}</b>: {l10n.t(LocalizationKey.dashboardStepsStepsToGetStartedContentFoldersInformationDescription)}.
|
||||
</p>
|
||||
</>
|
||||
);
|
||||
};
|
||||
@@ -0,0 +1,34 @@
|
||||
import * as React from 'react';
|
||||
import { join } from 'path';
|
||||
import * as l10n from '@vscode/l10n';
|
||||
import { LocalizationKey } from '../../../../localization';
|
||||
import { ContentFolder } from '../../../../models';
|
||||
import { SelectItem } from '../../Steps/SelectItem';
|
||||
|
||||
export interface IFolderProps {
|
||||
wsFolder: string;
|
||||
folder: string;
|
||||
folders: ContentFolder[];
|
||||
addFolder: (folder: string) => void;
|
||||
}
|
||||
|
||||
export const Folder: React.FunctionComponent<IFolderProps> = ({
|
||||
wsFolder,
|
||||
folder,
|
||||
folders,
|
||||
addFolder
|
||||
}: React.PropsWithChildren<IFolderProps>) => {
|
||||
|
||||
const isAdded = React.useMemo(
|
||||
() => folders.find((f) => f.path.toLowerCase() === join(wsFolder, folder).toLowerCase()),
|
||||
[folder, folders, wsFolder]
|
||||
);
|
||||
|
||||
return (
|
||||
<SelectItem
|
||||
title={folder}
|
||||
buttonTitle={l10n.t(LocalizationKey.dashboardStepsStepsToGetStartedButtonAddFolderTitle)}
|
||||
isSelected={!!isAdded}
|
||||
onClick={() => addFolder(folder)} />
|
||||
);
|
||||
};
|
||||
@@ -1,6 +1,6 @@
|
||||
import { Messenger } from '@estruyf/vscode/dist/client';
|
||||
import { Messenger, messageHandler } from '@estruyf/vscode/dist/client';
|
||||
import { Menu } from '@headlessui/react';
|
||||
import { EyeIcon, TerminalIcon, TrashIcon } from '@heroicons/react/outline';
|
||||
import { EyeIcon, GlobeIcon, TerminalIcon, TrashIcon } from '@heroicons/react/outline';
|
||||
import * as React from 'react';
|
||||
import { CustomScript, ScriptType } from '../../../models';
|
||||
import { DashboardMessage } from '../../DashboardMessage';
|
||||
@@ -11,10 +11,16 @@ import { useState } from 'react';
|
||||
import useThemeColors from '../../hooks/useThemeColors';
|
||||
import * as l10n from '@vscode/l10n';
|
||||
import { LocalizationKey } from '../../../localization';
|
||||
import { useRecoilState, useRecoilValue } from 'recoil';
|
||||
import { SettingsSelector } from '../../state';
|
||||
import { GeneralCommands } from '../../../constants';
|
||||
import { PinIcon } from '../Icons/PinIcon';
|
||||
import { PinnedItemsAtom } from '../../state/atom/PinnedItems';
|
||||
|
||||
export interface IContentActionsProps {
|
||||
title: string;
|
||||
path: string;
|
||||
relPath: string;
|
||||
scripts: CustomScript[] | undefined;
|
||||
listView?: boolean;
|
||||
onOpen: () => void;
|
||||
@@ -23,12 +29,15 @@ export interface IContentActionsProps {
|
||||
export const ContentActions: React.FunctionComponent<IContentActionsProps> = ({
|
||||
title,
|
||||
path,
|
||||
relPath,
|
||||
scripts,
|
||||
onOpen,
|
||||
listView
|
||||
}: React.PropsWithChildren<IContentActionsProps>) => {
|
||||
const [pinnedItems, setPinnedItems] = useRecoilState(PinnedItemsAtom);
|
||||
const [showDeletionAlert, setShowDeletionAlert] = React.useState(false);
|
||||
const { getColors } = useThemeColors();
|
||||
const settings = useRecoilValue(SettingsSelector);
|
||||
|
||||
const [referenceElement, setReferenceElement] = useState<any>(null);
|
||||
const [popperElement, setPopperElement] = useState<any>(null);
|
||||
@@ -54,6 +63,30 @@ export const ContentActions: React.FunctionComponent<IContentActionsProps> = ({
|
||||
setShowDeletionAlert(false);
|
||||
};
|
||||
|
||||
const openOnWebsite = React.useCallback((e: React.MouseEvent<HTMLButtonElement>) => {
|
||||
e.stopPropagation();
|
||||
if (settings?.websiteUrl && path) {
|
||||
Messenger.send(GeneralCommands.toVSCode.openOnWebsite, {
|
||||
websiteUrl: settings.websiteUrl,
|
||||
filePath: path
|
||||
});
|
||||
}
|
||||
}, [settings?.websiteUrl, path]);
|
||||
|
||||
const pinItem = React.useCallback((e: React.MouseEvent<HTMLButtonElement>) => {
|
||||
e.stopPropagation();
|
||||
messageHandler.request<string[]>(DashboardMessage.pinItem, path).then((result) => {
|
||||
setPinnedItems(result || []);
|
||||
})
|
||||
}, [path]);
|
||||
|
||||
const unpinItem = React.useCallback((e: React.MouseEvent<HTMLButtonElement>) => {
|
||||
e.stopPropagation();
|
||||
messageHandler.request<string[]>(DashboardMessage.unpinItem, path).then((result) => {
|
||||
setPinnedItems(result || []);
|
||||
})
|
||||
}, [path]);
|
||||
|
||||
const runCustomScript = React.useCallback(
|
||||
(e: React.MouseEvent<HTMLButtonElement>, script: CustomScript) => {
|
||||
e.stopPropagation();
|
||||
@@ -62,6 +95,10 @@ export const ContentActions: React.FunctionComponent<IContentActionsProps> = ({
|
||||
[path]
|
||||
);
|
||||
|
||||
const isPinned = React.useMemo(() => {
|
||||
return pinnedItems.includes(relPath);
|
||||
}, [pinnedItems, relPath]);
|
||||
|
||||
const customScriptActions = React.useMemo(() => {
|
||||
return (scripts || [])
|
||||
.filter(
|
||||
@@ -101,11 +138,19 @@ export const ContentActions: React.FunctionComponent<IContentActionsProps> = ({
|
||||
<Menu as="div" className={`relative flex text-left`}>
|
||||
{!listView && (
|
||||
<div className="hidden group-hover/card:flex">
|
||||
<QuickAction title={`View content`} onClick={onView}>
|
||||
<QuickAction title={l10n.t(LocalizationKey.dashboardContentsContentActionsMenuItemView)} onClick={onView}>
|
||||
<EyeIcon className={`w-4 h-4`} aria-hidden="true" />
|
||||
</QuickAction>
|
||||
|
||||
<QuickAction title={`Delete content`} onClick={onDelete}>
|
||||
{
|
||||
settings?.websiteUrl && (
|
||||
<QuickAction title={l10n.t(LocalizationKey.commonOpenOnWebsite)} onClick={openOnWebsite}>
|
||||
<GlobeIcon className={`w-4 h-4`} aria-hidden="true" />
|
||||
</QuickAction>
|
||||
)
|
||||
}
|
||||
|
||||
<QuickAction title={l10n.t(LocalizationKey.commonDelete)} onClick={onDelete}>
|
||||
<TrashIcon className={`w-4 h-4`} aria-hidden="true" />
|
||||
</QuickAction>
|
||||
</div>
|
||||
@@ -126,6 +171,15 @@ export const ContentActions: React.FunctionComponent<IContentActionsProps> = ({
|
||||
widthClass="w-44"
|
||||
marginTopClass={listView ? '' : ''}
|
||||
>
|
||||
<MenuItem
|
||||
title={
|
||||
<div className="flex items-center">
|
||||
<PinIcon className={`mr-2 h-5 w-5 flex-shrink-0 ${isPinned ? "" : "-rotate-90"}`} aria-hidden={true} />{' '}
|
||||
<span>{isPinned ? l10n.t(LocalizationKey.commonUnpin) : l10n.t(LocalizationKey.commonPin)}</span>
|
||||
</div>
|
||||
}
|
||||
onClick={(_, e) => isPinned ? unpinItem(e) : pinItem(e)}
|
||||
/>
|
||||
<MenuItem
|
||||
title={
|
||||
<div className="flex items-center">
|
||||
@@ -136,6 +190,20 @@ export const ContentActions: React.FunctionComponent<IContentActionsProps> = ({
|
||||
onClick={(_, e) => onView(e)}
|
||||
/>
|
||||
|
||||
{
|
||||
settings?.websiteUrl && (
|
||||
<MenuItem
|
||||
title={
|
||||
<div className="flex items-center">
|
||||
<GlobeIcon className="mr-2 h-5 w-5 flex-shrink-0" aria-hidden={true} />{' '}
|
||||
<span>{l10n.t(LocalizationKey.commonOpenOnWebsite)}</span>
|
||||
</div>
|
||||
}
|
||||
onClick={(_, e) => openOnWebsite(e)}
|
||||
/>
|
||||
)
|
||||
}
|
||||
|
||||
{customScriptActions}
|
||||
|
||||
<MenuItem
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import * as React from 'react';
|
||||
import { useRecoilValue } from 'recoil';
|
||||
import { Page } from '../../models';
|
||||
import { SettingsSelector } from '../../state';
|
||||
import { useRecoilState, useRecoilValue } from 'recoil';
|
||||
import { NavigationType, Page } from '../../models';
|
||||
import { DashboardViewAtom, SettingsSelector } from '../../state';
|
||||
import { Overview } from './Overview';
|
||||
import { Spinner } from '../Common/Spinner';
|
||||
import { SponsorMsg } from '../Layout/SponsorMsg';
|
||||
@@ -23,10 +23,13 @@ export const Contents: React.FunctionComponent<IContentsProps> = ({
|
||||
}: React.PropsWithChildren<IContentsProps>) => {
|
||||
const settings = useRecoilValue(SettingsSelector);
|
||||
const { pageItems } = usePages(pages);
|
||||
const [, setView] = useRecoilState(DashboardViewAtom);
|
||||
|
||||
const pageFolders = [...new Set(pageItems.map((page) => page.fmFolder))];
|
||||
|
||||
useEffect(() => {
|
||||
setView(NavigationType.Contents);
|
||||
|
||||
Messenger.send(DashboardMessage.sendTelemetry, {
|
||||
event: TelemetryEvent.webviewContentsView
|
||||
});
|
||||
@@ -34,7 +37,7 @@ export const Contents: React.FunctionComponent<IContentsProps> = ({
|
||||
|
||||
return (
|
||||
<PageLayout folders={pageFolders} totalPages={pageItems.length}>
|
||||
<div className="w-full flex-grow max-w-7xl mx-auto pb-6 px-4">
|
||||
<div className="w-full flex-grow max-w-full mx-auto pb-6 px-4">
|
||||
{loading ? <Spinner /> : <Overview pages={pageItems} settings={settings} />}
|
||||
</div>
|
||||
|
||||
|
||||
@@ -8,81 +8,39 @@ import { Messenger } from '@estruyf/vscode/dist/client';
|
||||
import { DashboardViewType } from '../../models';
|
||||
import { ContentActions } from './ContentActions';
|
||||
import { useMemo } from 'react';
|
||||
import useThemeColors from '../../hooks/useThemeColors';
|
||||
import { Status } from './Status';
|
||||
import * as React from 'react';
|
||||
import useExtensibility from '../../hooks/useExtensibility';
|
||||
import * as l10n from '@vscode/l10n';
|
||||
import { LocalizationKey } from '../../../localization';
|
||||
import { useNavigate } from 'react-router-dom';
|
||||
import { routePaths } from '../..';
|
||||
import useCard from '../../hooks/useCard';
|
||||
|
||||
export interface IItemProps extends Page { }
|
||||
|
||||
const PREVIEW_IMAGE_FIELD = 'fmPreviewImage';
|
||||
|
||||
export const Item: React.FunctionComponent<IItemProps> = ({
|
||||
fmFilePath,
|
||||
date,
|
||||
title,
|
||||
description,
|
||||
type,
|
||||
...pageData
|
||||
}: React.PropsWithChildren<IItemProps>) => {
|
||||
const view = useRecoilValue(ViewSelector);
|
||||
const settings = useRecoilValue(SettingsSelector);
|
||||
const draftField = useMemo(() => settings?.draftField, [settings]);
|
||||
const cardFields = useMemo(() => settings?.dashboardState?.contents?.cardFields, [settings?.dashboardState?.contents?.cardFields]);
|
||||
const { escapedTitle, escapedDescription } = useCard(pageData, settings?.dashboardState?.contents?.cardFields);
|
||||
const navigate = useNavigate();
|
||||
const { titleHtml, descriptionHtml, dateHtml, statusHtml, tagsHtml, imageHtml, footerHtml } = useExtensibility({
|
||||
fmFilePath,
|
||||
date,
|
||||
title,
|
||||
description,
|
||||
type,
|
||||
fmFilePath: pageData.fmFilePath,
|
||||
date: pageData.date,
|
||||
title: pageData.title,
|
||||
description: pageData.description,
|
||||
type: pageData.type,
|
||||
pageData
|
||||
});
|
||||
const { getColors } = useThemeColors();
|
||||
|
||||
const escapedTitle = useMemo(() => {
|
||||
let value = title;
|
||||
|
||||
if (cardFields?.title) {
|
||||
if (cardFields.title === "description") {
|
||||
value = description;
|
||||
} else if (cardFields?.title !== "title") {
|
||||
value = pageData[cardFields?.title] || title;
|
||||
}
|
||||
} else if (cardFields?.title === null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (value && typeof value !== 'string') {
|
||||
return l10n.t(LocalizationKey.dashboardContentsItemInvalidTitle);
|
||||
}
|
||||
|
||||
return value;
|
||||
}, [title, description, cardFields?.title, pageData]);
|
||||
|
||||
const escapedDescription = useMemo(() => {
|
||||
let value = description;
|
||||
|
||||
if (cardFields?.description) {
|
||||
if (cardFields.description === "title") {
|
||||
value = title;
|
||||
} else if (cardFields?.description !== "description") {
|
||||
value = pageData[cardFields?.description] || description;
|
||||
}
|
||||
} else if (cardFields?.description === null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (value && typeof value !== 'string') {
|
||||
return l10n.t(LocalizationKey.dashboardContentsItemInvalidDescription);
|
||||
}
|
||||
|
||||
return value;
|
||||
}, [description, title, cardFields?.description, pageData]);
|
||||
|
||||
const openFile = () => {
|
||||
Messenger.send(DashboardMessage.openFile, fmFilePath);
|
||||
Messenger.send(DashboardMessage.openFile, pageData.fmFilePath);
|
||||
};
|
||||
|
||||
const tags: string[] | undefined = useMemo(() => {
|
||||
@@ -104,7 +62,8 @@ export const Item: React.FunctionComponent<IItemProps> = ({
|
||||
if (typeof tagsValue === 'string') {
|
||||
return [tagsValue];
|
||||
} else if (Array.isArray(tagsValue)) {
|
||||
return tagsValue;
|
||||
const items = tagsValue.map(t => typeof t === 'string' ? t : undefined);
|
||||
return items.filter(t => t !== undefined) as string[];
|
||||
}
|
||||
|
||||
return [];
|
||||
@@ -118,18 +77,11 @@ export const Item: React.FunctionComponent<IItemProps> = ({
|
||||
return (
|
||||
<li className="relative">
|
||||
<div
|
||||
className={`group flex flex-col items-start content-start h-full w-full text-left shadow-md dark:shadow-none hover:shadow-xl border rounded ${getColors(
|
||||
'bg-gray-50 dark:bg-vulcan-200 text-vulcan-500 dark:text-whisper-500 dark:hover:bg-vulcan-100 border-gray-200 dark:border-vulcan-50',
|
||||
'bg-[var(--vscode-sideBar-background)] hover:bg-[var(--vscode-list-hoverBackground)] text-[var(--vscode-sideBarTitle-foreground)] border-[var(--frontmatter-border)]'
|
||||
)
|
||||
}`}
|
||||
className={`group flex flex-col items-start content-start h-full w-full text-left shadow-md dark:shadow-none hover:shadow-xl border rounded bg-[var(--vscode-sideBar-background)] hover:bg-[var(--vscode-list-hoverBackground)] text-[var(--vscode-sideBarTitle-foreground)] border-[var(--frontmatter-border)]`}
|
||||
>
|
||||
<button
|
||||
onClick={openFile}
|
||||
className={`relative h-36 w-full overflow-hidden border-b cursor-pointer ${getColors(
|
||||
'border-gray-100 dark:border-vulcan-100 dark:group-hover:border-vulcan-200',
|
||||
'border-[var(--frontmatter-border)]'
|
||||
)
|
||||
className={`relative h-36 w-full overflow-hidden border-b cursor-pointer border-[var(--frontmatter-border)]
|
||||
}`}
|
||||
>
|
||||
{
|
||||
@@ -139,22 +91,14 @@ export const Item: React.FunctionComponent<IItemProps> = ({
|
||||
<img
|
||||
src={`${pageData[PREVIEW_IMAGE_FIELD]}`}
|
||||
alt={escapedTitle || ""}
|
||||
className="absolute inset-0 h-full w-full object-cover group-hover:brightness-75"
|
||||
className="absolute inset-0 h-full w-full object-cover object-left-top group-hover:brightness-75"
|
||||
loading="lazy"
|
||||
/>
|
||||
) : (
|
||||
<div
|
||||
className={`flex items-center justify-center ${getColors(
|
||||
'bg-whisper-500 dark:bg-vulcan-200 dark:group-hover:bg-vulcan-100',
|
||||
'bg-[var(--vscode-sideBar-background)] group-hover:bg-[var(--vscode-list-hoverBackground)]'
|
||||
)
|
||||
}`}
|
||||
className={`h-full flex items-center justify-center bg-[var(--vscode-sideBar-background)] group-hover:bg-[var(--vscode-list-hoverBackground)]`}
|
||||
>
|
||||
<MarkdownIcon className={`h-32 ${getColors(
|
||||
'text-vulcan-100 dark:text-whisper-100',
|
||||
'text-[var(--vscode-sideBarTitle-foreground)] opacity-80'
|
||||
)
|
||||
}`} />
|
||||
<MarkdownIcon className={`h-32 text-[var(--vscode-sideBarTitle-foreground)] opacity-80`} />
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -166,7 +110,7 @@ export const Item: React.FunctionComponent<IItemProps> = ({
|
||||
statusHtml ? (
|
||||
<div dangerouslySetInnerHTML={{ __html: statusHtml }} />
|
||||
) : (
|
||||
cardFields?.state && draftField && draftField.name && <Status draft={pageData[draftField.name]} />
|
||||
cardFields?.state && draftField && draftField.name && <Status draft={pageData[draftField.name]} published={pageData.fmPublished} />
|
||||
)
|
||||
}
|
||||
|
||||
@@ -174,14 +118,15 @@ export const Item: React.FunctionComponent<IItemProps> = ({
|
||||
dateHtml ? (
|
||||
<div className='mr-4' dangerouslySetInnerHTML={{ __html: dateHtml }} />
|
||||
) : (
|
||||
cardFields?.date && <DateField className={`mr-4`} value={date} />
|
||||
cardFields?.date && <DateField className={`mr-4`} value={pageData.date} format={pageData.fmDateFormat} />
|
||||
)
|
||||
}
|
||||
</div>
|
||||
|
||||
<ContentActions
|
||||
title={title}
|
||||
path={fmFilePath}
|
||||
title={pageData.title}
|
||||
path={pageData.fmFilePath}
|
||||
relPath={pageData.fmRelFileWsPath}
|
||||
scripts={settings?.scripts}
|
||||
onOpen={openFile}
|
||||
/>
|
||||
@@ -203,7 +148,7 @@ export const Item: React.FunctionComponent<IItemProps> = ({
|
||||
descriptionHtml ? (
|
||||
<div dangerouslySetInnerHTML={{ __html: descriptionHtml }} />
|
||||
) : (
|
||||
<p className={`text-xs ${getColors('text-vulcan-200 dark:text-whisper-800', 'text-[vara(--vscode-titleBar-activeForeground)]')}`}>{escapedDescription}</p>
|
||||
<p className={`text-xs text-[vara(--vscode-titleBar-activeForeground)]`}>{escapedDescription}</p>
|
||||
)
|
||||
}
|
||||
</button>
|
||||
@@ -216,16 +161,19 @@ export const Item: React.FunctionComponent<IItemProps> = ({
|
||||
<div className="mt-2">
|
||||
{tags.map(
|
||||
(tag, index) => tag && (
|
||||
<span
|
||||
<button
|
||||
key={index}
|
||||
className={`inline-block mr-1 mt-1 text-xs ${getColors(
|
||||
`text-[#5D561D] dark:text-[#F0ECD0]`,
|
||||
`text-[var(--vscode-textPreformat-foreground)]`
|
||||
)
|
||||
}`}
|
||||
className={`inline-block mr-1 mt-1 text-xs text-[var(--vscode-textPreformat-foreground)] hover:brightness-75 hover:underline hover:underline-offset-1`}
|
||||
title={l10n.t(LocalizationKey.commonFilterValue, tag)}
|
||||
onClick={() => {
|
||||
const tagField = settings?.dashboardState.contents.tags;
|
||||
if (tagField) {
|
||||
navigate(`${routePaths.contents}?taxonomy=${tagField}&value=${tag}`);
|
||||
}
|
||||
}}
|
||||
>
|
||||
#{tag}
|
||||
</span>
|
||||
</button>
|
||||
)
|
||||
)}
|
||||
</div>
|
||||
@@ -246,11 +194,7 @@ export const Item: React.FunctionComponent<IItemProps> = ({
|
||||
return (
|
||||
<li className="relative">
|
||||
<div
|
||||
className={`px-5 cursor-pointer w-full text-left grid grid-cols-12 gap-x-4 sm:gap-x-6 xl:gap-x-8 py-2 border-b hover:bg-opacity-70 ${getColors(
|
||||
`border-gray-300 hover:bg-gray-200 dark:border-vulcan-50 dark:hover:bg-vulcan-50`,
|
||||
`border-[var(--frontmatter-border)] hover:bg-[var(--vscode-sideBar-background)]`
|
||||
)
|
||||
}`}
|
||||
className={`px-5 cursor-pointer w-full text-left grid grid-cols-12 gap-x-4 sm:gap-x-6 xl:gap-x-8 py-2 border-b hover:bg-opacity-70 border-[var(--frontmatter-border)] hover:bg-[var(--vscode-sideBar-background)]`}
|
||||
>
|
||||
<div className="col-span-8 font-bold truncate flex items-center space-x-4">
|
||||
<button title={`Open: ${escapedTitle}`} onClick={openFile}>
|
||||
@@ -259,17 +203,18 @@ export const Item: React.FunctionComponent<IItemProps> = ({
|
||||
|
||||
<ContentActions
|
||||
title={escapedTitle || ""}
|
||||
path={fmFilePath}
|
||||
path={pageData.fmFilePath}
|
||||
relPath={pageData.fmRelFileWsPath}
|
||||
scripts={settings?.scripts}
|
||||
onOpen={openFile}
|
||||
listView
|
||||
/>
|
||||
</div>
|
||||
<div className="col-span-2">
|
||||
<DateField value={date} />
|
||||
<DateField value={pageData.date} />
|
||||
</div>
|
||||
<div className="col-span-2">
|
||||
{draftField && draftField.name && <Status draft={pageData[draftField.name]} />}
|
||||
{draftField && draftField.name && <Status draft={pageData[draftField.name]} published={pageData.fmPublished} />}
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
@@ -16,7 +16,7 @@ export const List: React.FunctionComponent<IListProps> = ({
|
||||
|
||||
let className = '';
|
||||
if (view === DashboardViewType.Grid) {
|
||||
className = `grid grid-cols-2 gap-x-4 gap-y-8 sm:grid-cols-3 sm:gap-x-6 lg:grid-cols-4 xl:gap-x-8`;
|
||||
className = `grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 gap-4`;
|
||||
} else if (view === DashboardViewType.List) {
|
||||
className = `-mx-4`;
|
||||
}
|
||||
|
||||
@@ -2,19 +2,25 @@ import { Disclosure } from '@headlessui/react';
|
||||
import { ChevronRightIcon } from '@heroicons/react/solid';
|
||||
import * as React from 'react';
|
||||
import { useCallback, useMemo } from 'react';
|
||||
import { useRecoilValue } from 'recoil';
|
||||
import { useRecoilState, useRecoilValue } from 'recoil';
|
||||
import { groupBy } from '../../../helpers/GroupBy';
|
||||
import { FrontMatterIcon } from '../../../panelWebView/components/Icons/FrontMatterIcon';
|
||||
import { GroupOption } from '../../constants/GroupOption';
|
||||
import { Page } from '../../models/Page';
|
||||
import { Settings } from '../../models/Settings';
|
||||
import { GroupingSelector, PageAtom } from '../../state';
|
||||
import { GroupingSelector, PageAtom, ViewSelector } from '../../state';
|
||||
import { Item } from './Item';
|
||||
import { List } from './List';
|
||||
import usePagination from '../../hooks/usePagination';
|
||||
import useThemeColors from '../../hooks/useThemeColors';
|
||||
import * as l10n from '@vscode/l10n';
|
||||
import { LocalizationKey } from '../../../localization';
|
||||
import { PinnedItemsAtom } from '../../state/atom/PinnedItems';
|
||||
import { messageHandler } from '@estruyf/vscode/dist/client';
|
||||
import { DashboardMessage } from '../../DashboardMessage';
|
||||
import { PinIcon } from '../Icons/PinIcon';
|
||||
import { PinnedItem } from './PinnedItem';
|
||||
import { DashboardViewType } from '../../models';
|
||||
|
||||
export interface IOverviewProps {
|
||||
pages: Page[];
|
||||
@@ -25,10 +31,13 @@ export const Overview: React.FunctionComponent<IOverviewProps> = ({
|
||||
pages,
|
||||
settings
|
||||
}: React.PropsWithChildren<IOverviewProps>) => {
|
||||
const [isReady, setIsReady] = React.useState<boolean>(false);
|
||||
const [pinnedItems, setPinnedItems] = useRecoilState(PinnedItemsAtom);
|
||||
const grouping = useRecoilValue(GroupingSelector);
|
||||
const page = useRecoilValue(PageAtom);
|
||||
const { pageSetNr } = usePagination(settings?.dashboardState.contents.pagination);
|
||||
const { getColors } = useThemeColors();
|
||||
const view = useRecoilValue(ViewSelector);
|
||||
|
||||
const pagedPages = useMemo(() => {
|
||||
if (pageSetNr) {
|
||||
@@ -36,7 +45,15 @@ export const Overview: React.FunctionComponent<IOverviewProps> = ({
|
||||
}
|
||||
|
||||
return pages;
|
||||
}, [pages, page, pageSetNr]);
|
||||
}, [pages, page, pageSetNr, pinnedItems, grouping]);
|
||||
|
||||
const pinnedPages = useMemo(() => {
|
||||
if (grouping === GroupOption.none) {
|
||||
return pages.filter((page) => pinnedItems.includes(page.fmRelFileWsPath));
|
||||
}
|
||||
|
||||
return [];
|
||||
}, [pages, pinnedItems, grouping]);
|
||||
|
||||
const groupName = useCallback(
|
||||
(groupId, groupedPages) => {
|
||||
@@ -49,6 +66,58 @@ export const Overview: React.FunctionComponent<IOverviewProps> = ({
|
||||
[grouping]
|
||||
);
|
||||
|
||||
const { groupKeys, groupedPages } = useMemo(() => {
|
||||
if (grouping === GroupOption.none) {
|
||||
return { groupKeys: [], groupedPages: {} };
|
||||
}
|
||||
|
||||
let groupedPages = groupBy(pages, grouping === GroupOption.Year ? 'fmYear' : 'fmDraft');
|
||||
let groupKeys = Object.keys(groupedPages);
|
||||
|
||||
if (grouping === GroupOption.Year) {
|
||||
groupKeys = groupKeys.sort((a, b) => {
|
||||
return parseInt(b) - parseInt(a);
|
||||
});
|
||||
} else if (grouping === GroupOption.Draft && settings?.draftField?.type !== 'choice') {
|
||||
const isInverted = settings?.draftField?.invert;
|
||||
const allPublished: Page[] = groupedPages['Published'] || [];
|
||||
const allDrafts: Page[] = groupedPages['Draft'] || [];
|
||||
|
||||
if (allPublished.length > 0) {
|
||||
const drafts = !isInverted ? allDrafts : allPublished;
|
||||
const published = (!isInverted ? allPublished : allDrafts).filter((page) => !page.fmPublished || page.fmPublished <= Date.now());
|
||||
const scheduled = (!isInverted ? allPublished : allDrafts).filter((page) => page.fmPublished && page.fmPublished > Date.now());
|
||||
|
||||
delete groupedPages["Published"];
|
||||
delete groupedPages["Draft"];
|
||||
|
||||
groupKeys = ['Scheduled', ...groupKeys];
|
||||
groupedPages = {
|
||||
"Scheduled": scheduled,
|
||||
"Published": published,
|
||||
"Draft": drafts,
|
||||
...groupedPages,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return { groupKeys, groupedPages };
|
||||
}, [pages, grouping, settings?.draftField]);
|
||||
|
||||
React.useEffect(() => {
|
||||
messageHandler.request<string[]>(DashboardMessage.getPinnedItems).then((items) => {
|
||||
setIsReady(true);
|
||||
setPinnedItems(items || []);
|
||||
}).catch(() => {
|
||||
setIsReady(true);
|
||||
setPinnedItems([]);
|
||||
});
|
||||
}, []);
|
||||
|
||||
if (!isReady) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!pages || !pages.length) {
|
||||
return (
|
||||
<div className={`flex items-center justify-center h-full`}>
|
||||
@@ -68,50 +137,67 @@ export const Overview: React.FunctionComponent<IOverviewProps> = ({
|
||||
}
|
||||
|
||||
if (grouping !== GroupOption.none) {
|
||||
const groupedPages = groupBy(pages, grouping === GroupOption.Year ? 'fmYear' : 'fmDraft');
|
||||
let groupKeys = Object.keys(groupedPages);
|
||||
|
||||
if (grouping === GroupOption.Year) {
|
||||
groupKeys = groupKeys.sort((a, b) => {
|
||||
return parseInt(b) - parseInt(a);
|
||||
});
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
{groupKeys.map((groupId, idx) => (
|
||||
<Disclosure key={groupId} as={`div`} className={`w-full`} defaultOpen>
|
||||
{({ open }) => (
|
||||
<>
|
||||
<Disclosure.Button className={`mb-4 ${idx !== 0 ? 'mt-8' : ''}`}>
|
||||
<h2 className={`text-2xl font-bold flex items-center`}>
|
||||
<ChevronRightIcon
|
||||
className={`w-8 h-8 mr-1 ${open ? 'transform rotate-90' : ''}`}
|
||||
/>
|
||||
{groupName(groupId, groupedPages)}
|
||||
</h2>
|
||||
</Disclosure.Button>
|
||||
groupedPages[groupId].length > 0 && (
|
||||
<Disclosure key={groupId} as={`div`} className={`w-full`} defaultOpen>
|
||||
{({ open }) => (
|
||||
<>
|
||||
<Disclosure.Button className={`mb-4 ${idx !== 0 ? 'mt-8' : ''}`}>
|
||||
<h2 className={`text-2xl font-bold flex items-center`}>
|
||||
<ChevronRightIcon
|
||||
className={`w-8 h-8 mr-1 ${open ? 'transform rotate-90' : ''}`}
|
||||
/>
|
||||
{groupName(groupId, groupedPages)}
|
||||
</h2>
|
||||
</Disclosure.Button>
|
||||
|
||||
<Disclosure.Panel>
|
||||
<List>
|
||||
{groupedPages[groupId].map((page: Page) => (
|
||||
<Item key={`${page.slug}-${idx}`} {...page} />
|
||||
))}
|
||||
</List>
|
||||
</Disclosure.Panel>
|
||||
</>
|
||||
)}
|
||||
</Disclosure>
|
||||
<Disclosure.Panel>
|
||||
<List>
|
||||
{groupedPages[groupId].map((page: Page) => (
|
||||
<Item key={`${page.slug}-${idx}`} {...page} />
|
||||
))}
|
||||
</List>
|
||||
</Disclosure.Panel>
|
||||
</>
|
||||
)}
|
||||
</Disclosure>
|
||||
)
|
||||
))}
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<List>
|
||||
{pagedPages.map((page, idx) => (
|
||||
<Item key={`${page.slug}-${idx}`} {...page} />
|
||||
))}
|
||||
</List>
|
||||
<div className='divide-y divide-[var(--frontmatter-border)]'>
|
||||
{
|
||||
pinnedPages.length > 0 && (
|
||||
<div className='mb-8'>
|
||||
<h1 className='text-xl flex space-x-2 items-center mb-4'>
|
||||
<PinIcon className={`-rotate-45`} />
|
||||
<span>{l10n.t(LocalizationKey.dashboardContentsOverviewPinned)}</span>
|
||||
</h1>
|
||||
<List>
|
||||
{pinnedPages.map((page, idx) => (
|
||||
view === DashboardViewType.List ? (
|
||||
<Item key={`${page.slug}-${idx}`} {...page} />
|
||||
) : (
|
||||
<PinnedItem key={`${page.slug}-${idx}`} {...page} />
|
||||
)
|
||||
))}
|
||||
</List>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
<div className={pinnedItems.length > 0 ? "pt-8" : ""}>
|
||||
<List>
|
||||
{pagedPages.map((page, idx) => (
|
||||
<Item key={`${page.slug}-${idx}`} {...page} />
|
||||
))}
|
||||
</List>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
57
src/dashboardWebView/components/Contents/PinnedItem.tsx
Normal file
@@ -0,0 +1,57 @@
|
||||
import * as React from 'react';
|
||||
import { Page } from '../../models';
|
||||
import { MarkdownIcon } from '../../../panelWebView/components/Icons/MarkdownIcon';
|
||||
import { ContentActions } from './ContentActions';
|
||||
import { DashboardMessage } from '../../DashboardMessage';
|
||||
import { messageHandler } from '@estruyf/vscode/dist/client';
|
||||
import useCard from '../../hooks/useCard';
|
||||
import { SettingsSelector } from '../../state';
|
||||
import { useRecoilValue } from 'recoil';
|
||||
|
||||
export interface IPinnedItemProps extends Page { }
|
||||
|
||||
export const PinnedItem: React.FunctionComponent<IPinnedItemProps> = ({
|
||||
...pageData
|
||||
}: React.PropsWithChildren<IPinnedItemProps>) => {
|
||||
const settings = useRecoilValue(SettingsSelector);
|
||||
const { escapedTitle } = useCard(pageData, settings?.dashboardState?.contents?.cardFields);
|
||||
|
||||
const openFile = React.useCallback(() => {
|
||||
messageHandler.send(DashboardMessage.openFile, pageData.fmFilePath);
|
||||
}, [pageData.fmFilePath]);
|
||||
|
||||
return (
|
||||
<li className='group flex w-full border border-[var(--frontmatter-border)] rounded bg-[var(--vscode-sideBar-background)] hover:bg-[var(--vscode-list-hoverBackground)] text-[var(--vscode-sideBarTitle-foreground)]'>
|
||||
<button onClick={openFile} className='relative h-full w-1/3'>
|
||||
{
|
||||
pageData["fmPreviewImage"] ? (
|
||||
<img
|
||||
src={`${pageData["fmPreviewImage"]}`}
|
||||
alt={pageData.title || ""}
|
||||
className="absolute inset-0 h-full w-full object-left-top object-cover group-hover:brightness-75"
|
||||
loading="lazy"
|
||||
/>
|
||||
) : (
|
||||
<div
|
||||
className={`h-full flex items-center justify-center bg-[var(--vscode-sideBar-background)] group-hover:bg-[var(--vscode-list-hoverBackground)] border-r border-[var(--frontmatter-border)]`}
|
||||
>
|
||||
<MarkdownIcon className={`h-8 text-[var(--vscode-sideBarTitle-foreground)] opacity-80`} />
|
||||
</div>
|
||||
)
|
||||
}
|
||||
</button>
|
||||
|
||||
<button onClick={openFile} className='relative w-2/3 p-4 pr-6 text-left flex items-start'>
|
||||
<p className='font-bold'>{escapedTitle}</p>
|
||||
|
||||
<ContentActions
|
||||
title={pageData.title}
|
||||
path={pageData.fmFilePath}
|
||||
relPath={pageData.fmRelFileWsPath}
|
||||
scripts={settings?.scripts}
|
||||
onOpen={openFile}
|
||||
/>
|
||||
</button>
|
||||
</li>
|
||||
);
|
||||
};
|
||||
@@ -1,22 +1,24 @@
|
||||
import * as React from 'react';
|
||||
import { useMemo } from 'react';
|
||||
import { useRecoilValue } from 'recoil';
|
||||
import useThemeColors from '../../hooks/useThemeColors';
|
||||
import { SettingsAtom } from '../../state';
|
||||
import { SettingsAtom, TabInfoAtom } from '../../state';
|
||||
import * as l10n from '@vscode/l10n';
|
||||
import { LocalizationKey } from '../../../localization';
|
||||
|
||||
export interface IStatusProps {
|
||||
draft: boolean | string;
|
||||
published: number | null | undefined;
|
||||
}
|
||||
|
||||
export const Status: React.FunctionComponent<IStatusProps> = ({
|
||||
draft
|
||||
draft,
|
||||
published
|
||||
}: React.PropsWithChildren<IStatusProps>) => {
|
||||
const { getColors } = useThemeColors();
|
||||
const settings = useRecoilValue(SettingsAtom);
|
||||
const tabInfo = useRecoilValue(TabInfoAtom);
|
||||
|
||||
const draftField = useMemo(() => settings?.draftField, [settings]);
|
||||
const isFuture = useMemo(() => published ? published > Date.now() : false, [published]);
|
||||
|
||||
const draftValue = useMemo(() => {
|
||||
if (draftField && draftField.type === 'choice') {
|
||||
@@ -32,7 +34,7 @@ export const Status: React.FunctionComponent<IStatusProps> = ({
|
||||
if (draftValue) {
|
||||
return (
|
||||
<span
|
||||
className={`inline-block px-2 py-1 leading-none rounded-sm font-semibold uppercase tracking-wide text-xs ${getColors(`text-whisper-200 dark:text-vulcan-500 bg-teal-500`, `text-[var(--vscode-badge-foreground)] bg-[var(--vscode-badge-background)]`)}`}
|
||||
className={`inline-block px-1 py-1 leading-none rounded-sm font-semibold uppercase tracking-wide text-[0.7rem] text-[var(--vscode-badge-foreground)] bg-[var(--vscode-badge-background)]`}
|
||||
>
|
||||
{draftValue}
|
||||
</span>
|
||||
@@ -42,17 +44,29 @@ export const Status: React.FunctionComponent<IStatusProps> = ({
|
||||
}
|
||||
}
|
||||
|
||||
if (tabInfo && Object.keys(tabInfo).length <= 1) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<span
|
||||
className={`draft__status
|
||||
inline-block px-2 py-1 leading-none rounded-sm font-semibold uppercase tracking-wide text-xs
|
||||
${getColors(`text-whisper-200 dark:text-vulcan-500`, ``)}
|
||||
inline-block px-1 py-1 leading-none rounded-sm font-semibold uppercase tracking-wide text-[0.7rem]
|
||||
${draftValue ?
|
||||
getColors(`bg-red-500`, 'bg-[var(--vscode-statusBarItem-errorBackground)] text-[var(--vscode-statusBarItem-errorForeground)]') :
|
||||
getColors(`bg-teal-500`, 'bg-[var(--vscode-badge-background)] text-[var(--vscode-badge-foreground)]')
|
||||
'bg-[var(--vscode-statusBarItem-errorBackground)] text-[var(--vscode-statusBarItem-errorForeground)]' :
|
||||
isFuture ?
|
||||
'bg-[var(--vscode-statusBarItem-warningBackground)] text-[var(--vscode-statusBarItem-warningForeground)]' :
|
||||
'bg-[var(--vscode-badge-background)] text-[var(--vscode-badge-foreground)]'
|
||||
}`}
|
||||
>
|
||||
{draftValue ? l10n.t(LocalizationKey.dashboardContentsStatusDraft) : l10n.t(LocalizationKey.dashboardContentsStatusPublished)}
|
||||
{
|
||||
draftValue ?
|
||||
l10n.t(LocalizationKey.dashboardContentsStatusDraft) : (
|
||||
isFuture ?
|
||||
l10n.t(LocalizationKey.dashboardContentsStatusScheduled) :
|
||||
l10n.t(LocalizationKey.dashboardContentsStatusPublished)
|
||||
)
|
||||
}
|
||||
</span>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -5,7 +5,6 @@ import { JSONSchemaBridge } from 'uniforms-bridge-json-schema';
|
||||
import { AutoFields, AutoForm, ErrorsField } from '../../../components/uniforms-frontmatter';
|
||||
import { ErrorBoundary } from '@sentry/react';
|
||||
import { DataFormControls } from './DataFormControls';
|
||||
import useThemeColors from '../../hooks/useThemeColors';
|
||||
import * as l10n from '@vscode/l10n';
|
||||
import { LocalizationKey } from '../../../localization';
|
||||
|
||||
@@ -24,7 +23,6 @@ export const DataForm: React.FunctionComponent<IDataFormProps> = ({
|
||||
}: React.PropsWithChildren<IDataFormProps>) => {
|
||||
const [bridge, setBridge] = useState<JSONSchemaBridge | null>(null);
|
||||
const [error, setError] = useState<string | undefined>(undefined);
|
||||
const { getColors } = useThemeColors();
|
||||
|
||||
const ajv = new Ajv({
|
||||
allErrors: true,
|
||||
@@ -81,11 +79,11 @@ export const DataForm: React.FunctionComponent<IDataFormProps> = ({
|
||||
<ErrorBoundary>
|
||||
<div className="autoform">
|
||||
{model ? (
|
||||
<h2 className={getColors(`text - gray - 500 dark: text - whisper - 900`, `text - [var(--frontmatter - secondary - text)]`)}>
|
||||
<h2 className={`text-[var(--frontmatter-secondary-text)]`}>
|
||||
{l10n.t(LocalizationKey.dashboardDataViewDataFormModify)}
|
||||
</h2>
|
||||
) : (
|
||||
<h2 className={getColors(`text - gray - 500 dark: text - whisper - 900`, `text - [var(--frontmatter - secondary - text)]`)}>
|
||||
<h2 className={`text-[var(--frontmatter-secondary-text)]`}>
|
||||
{l10n.t(LocalizationKey.dashboardDataViewDataFormAdd)}
|
||||
</h2>
|
||||
)}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import * as React from 'react';
|
||||
import { Header } from '../Header';
|
||||
import { useRecoilValue } from 'recoil';
|
||||
import { SettingsSelector } from '../../state';
|
||||
import { useRecoilState, useRecoilValue } from 'recoil';
|
||||
import { DashboardViewAtom, SettingsSelector } from '../../state';
|
||||
import { DataForm } from './DataForm';
|
||||
import { useCallback, useEffect, useMemo, useState } from 'react';
|
||||
import { DataFile } from '../../../models/DataFile';
|
||||
@@ -24,6 +24,7 @@ import { NavigationItem } from '../Layout';
|
||||
import useThemeColors from '../../hooks/useThemeColors';
|
||||
import * as l10n from '@vscode/l10n';
|
||||
import { LocalizationKey } from '../../../localization';
|
||||
import { NavigationType } from '../../models';
|
||||
|
||||
export interface IDataViewProps { }
|
||||
|
||||
@@ -35,6 +36,7 @@ export const DataView: React.FunctionComponent<IDataViewProps> = (
|
||||
const [dataEntries, setDataEntries] = useState<any | any[] | null>(null);
|
||||
const settings = useRecoilValue(SettingsSelector);
|
||||
const { getColors } = useThemeColors();
|
||||
const [, setView] = useRecoilState(DashboardViewAtom);
|
||||
|
||||
const setSchema = (dataFile: DataFile) => {
|
||||
setSelectedData(dataFile);
|
||||
@@ -135,6 +137,7 @@ export const DataView: React.FunctionComponent<IDataViewProps> = (
|
||||
}, [selectedData, , dataEntries, selectedIndex]);
|
||||
|
||||
useEffect(() => {
|
||||
setView(NavigationType.Data);
|
||||
Messenger.listen(messageListener);
|
||||
|
||||
Messenger.send(DashboardMessage.sendTelemetry, {
|
||||
|
||||
@@ -39,7 +39,7 @@ export const FilterInput: React.FunctionComponent<IFilterInputProps> = ({
|
||||
name="search"
|
||||
className={`block w-full py-2 pl-10 pr-3 sm:text-sm appearance-none disabled:opacity-50 rounded ${getColors(
|
||||
'bg-white dark:bg-vulcan-300 border border-gray-300 dark:border-vulcan-100 text-vulcan-500 dark:text-whisper-500 placeholder-gray-400 dark:placeholder-whisper-800 focus:outline-none',
|
||||
'bg-[var(--vscode-input-background)] text-[var(--vscode-input-foreground)] border-[var(--vscode-editorWidget-border)] placeholder-[var(--vscode-input-placeholderForeground)] focus:outline-[var(--vscode-focusBorder)] focus:outline-1 focus:outline-offset-0 focus:shadow-none focus:border-transparent'
|
||||
'bg-[var(--vscode-input-background)] text-[var(--vscode-input-foreground)] border-[var(--vscode-input-border)] placeholder-[var(--vscode-input-placeholderForeground)] focus:outline-[var(--vscode-focusBorder)] focus:outline-1 focus:outline-offset-0 focus:shadow-none focus:border-transparent'
|
||||
)
|
||||
}`}
|
||||
placeholder={placeholder || l10n.t(LocalizationKey.commonSearch)}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import { Menu } from '@headlessui/react';
|
||||
import * as React from 'react';
|
||||
import { useRecoilState } from 'recoil';
|
||||
import { useRecoilState, useRecoilValue } from 'recoil';
|
||||
import { GroupOption } from '../../constants/GroupOption';
|
||||
import { GroupingAtom } from '../../state';
|
||||
import { AllPagesAtom, GroupingAtom } from '../../state';
|
||||
import { MenuButton, MenuItem, MenuItems } from '../Menu';
|
||||
import * as l10n from '@vscode/l10n';
|
||||
import { LocalizationKey } from '../../../localization';
|
||||
@@ -13,15 +13,34 @@ export const Grouping: React.FunctionComponent<
|
||||
IGroupingProps
|
||||
> = ({ }: React.PropsWithChildren<IGroupingProps>) => {
|
||||
const [group, setGroup] = useRecoilState(GroupingAtom);
|
||||
const pages = useRecoilValue(AllPagesAtom);
|
||||
|
||||
const GROUP_OPTIONS = [
|
||||
{ name: l10n.t(LocalizationKey.dashboardHeaderGroupingOptionNone), id: GroupOption.none },
|
||||
{ name: l10n.t(LocalizationKey.dashboardHeaderGroupingOptionYear), id: GroupOption.Year },
|
||||
{ name: l10n.t(LocalizationKey.dashboardHeaderGroupingOptionDraft), id: GroupOption.Draft }
|
||||
];
|
||||
const GROUP_OPTIONS = React.useMemo(() => {
|
||||
let options: { name: string, id: GroupOption }[] = [];
|
||||
|
||||
if (pages.length > 0) {
|
||||
if (pages.some((x) => x.fmYear)) {
|
||||
options.push({ name: l10n.t(LocalizationKey.dashboardHeaderGroupingOptionYear), id: GroupOption.Year })
|
||||
}
|
||||
|
||||
if (pages.some((x) => x.fmDraft)) {
|
||||
options.push({ name: l10n.t(LocalizationKey.dashboardHeaderGroupingOptionDraft), id: GroupOption.Draft })
|
||||
}
|
||||
}
|
||||
|
||||
if (options.length > 0) {
|
||||
options.unshift({ name: l10n.t(LocalizationKey.dashboardHeaderGroupingOptionNone), id: GroupOption.none })
|
||||
}
|
||||
|
||||
return options;
|
||||
}, [pages])
|
||||
|
||||
const crntGroup = GROUP_OPTIONS.find((x) => x.id === group);
|
||||
|
||||
if (GROUP_OPTIONS.length === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="flex items-center">
|
||||
<Menu as="div" className="relative z-10 inline-block text-left">
|
||||
|
||||
@@ -25,12 +25,11 @@ import { Pagination } from './Pagination';
|
||||
import { GroupOption } from '../../constants/GroupOption';
|
||||
import usePagination from '../../hooks/usePagination';
|
||||
import { PaginationStatus } from './PaginationStatus';
|
||||
import useThemeColors from '../../hooks/useThemeColors';
|
||||
import { Startup } from './Startup';
|
||||
import { Navigation } from './Navigation';
|
||||
import { ProjectSwitcher } from './ProjectSwitcher';
|
||||
import * as l10n from '@vscode/l10n';
|
||||
import { LocalizationKey } from '../../../localization';
|
||||
import { SettingsLink } from '../SettingsView/SettingsLink';
|
||||
|
||||
export interface IHeaderProps {
|
||||
header?: React.ReactNode;
|
||||
@@ -55,7 +54,6 @@ export const Header: React.FunctionComponent<IHeaderProps> = ({
|
||||
const location = useLocation();
|
||||
const navigate = useNavigate();
|
||||
const { pageSetNr } = usePagination(settings?.dashboardState.contents.pagination);
|
||||
const { getColors } = useThemeColors();
|
||||
|
||||
const createContent = () => {
|
||||
Messenger.send(DashboardMessage.createContent);
|
||||
@@ -144,19 +142,15 @@ export const Header: React.FunctionComponent<IHeaderProps> = ({
|
||||
}, [location.search]);
|
||||
|
||||
return (
|
||||
<div className={`w-full sticky top-0 z-20 ${getColors(
|
||||
`bg-gray-100 dark:bg-vulcan-500`,
|
||||
`bg-[var(--vscode-editor-background)] text-[var(--vscode-editor-foreground)]`
|
||||
)
|
||||
}`}>
|
||||
<div className={`mb-0 border-b flex justify-between ${getColors(
|
||||
`bg-gray-100 dark:bg-vulcan-500 border-gray-200 dark:border-vulcan-300`,
|
||||
`bg-[var(--vscode-editor-background)] text-[var(--vscode-editor-foreground)] border-[var(--vscode-editorWidget-border)]`
|
||||
)
|
||||
}`}>
|
||||
<div className={`w-full sticky top-0 z-20 bg-[var(--vscode-editor-background)] text-[var(--vscode-editor-foreground)]`}>
|
||||
<div className={`mb-0 border-b flex justify-between bg-[var(--vscode-editor-background)] text-[var(--vscode-editor-foreground)] border-[var(--frontmatter-border)]`}>
|
||||
<Tabs onNavigate={updateView} />
|
||||
|
||||
<ProjectSwitcher />
|
||||
<div className='flex'>
|
||||
<ProjectSwitcher />
|
||||
|
||||
<SettingsLink onNavigate={updateView} />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{location.pathname === routePaths.contents && (
|
||||
@@ -165,8 +159,6 @@ export const Header: React.FunctionComponent<IHeaderProps> = ({
|
||||
<Searchbox />
|
||||
|
||||
<div className={`flex items-center justify-end space-x-4 flex-1`}>
|
||||
<Startup settings={settings} />
|
||||
|
||||
<SyncButton />
|
||||
|
||||
<ChoiceButton
|
||||
@@ -178,8 +170,7 @@ export const Header: React.FunctionComponent<IHeaderProps> = ({
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className={`px-4 flex flex-row items-center border-b justify-between ${getColors(`border-gray-200 dark:border-vulcan-100`, `border-[var(--vscode-editorWidget-border)]`)
|
||||
}`}>
|
||||
<div className={`px-4 flex flex-row items-center border-b justify-between border-[var(--frontmatter-border)]`}>
|
||||
<div>
|
||||
<Navigation totalPages={totalPages || 0} />
|
||||
</div>
|
||||
@@ -190,8 +181,7 @@ export const Header: React.FunctionComponent<IHeaderProps> = ({
|
||||
</div>
|
||||
|
||||
<div
|
||||
className={`py-4 px-5 w-full flex items-center justify-between lg:justify-end border-b space-x-4 lg:space-x-6 xl:space-x-8 ${getColors(`bg-gray-200 border-gray-300 dark:bg-vulcan-400 dark:border-vulcan-100`, `bg-[var(--vscode-panel-background)] border-[var(--vscode-editorWidget-border)]`)
|
||||
}`}
|
||||
className={`py-4 px-5 w-full flex items-center justify-between lg:justify-end border-b space-x-4 lg:space-x-6 xl:space-x-8 bg-[var(--vscode-panel-background)] border-[var(--frontmatter-border)]`}
|
||||
>
|
||||
<ClearFilters />
|
||||
|
||||
@@ -220,8 +210,7 @@ export const Header: React.FunctionComponent<IHeaderProps> = ({
|
||||
(totalPages || 0) > pageSetNr &&
|
||||
(!grouping || grouping === GroupOption.none) && (
|
||||
<div
|
||||
className={`px-4 flex justify-between py-2 border-b ${getColors(`border-gray-300 dark:border-vulcan-100`, `border-[var(--vscode-editorWidget-border)]`)
|
||||
}`}
|
||||
className={`px-4 flex justify-between py-2 border-b border-[var(--frontmatter-border)]`}
|
||||
>
|
||||
<PaginationStatus totalPages={totalPages || 0} />
|
||||
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import * as React from 'react';
|
||||
import { useRecoilState, useRecoilValue } from 'recoil';
|
||||
import { Tab } from '../../constants/Tab';
|
||||
import useThemeColors from '../../hooks/useThemeColors';
|
||||
import { SettingsAtom, TabAtom, TabInfoAtom } from '../../state';
|
||||
import * as l10n from '@vscode/l10n';
|
||||
import { LocalizationKey } from '../../../localization';
|
||||
@@ -22,7 +21,6 @@ const NavigationItem: React.FunctionComponent<INavigationItemProps> = ({
|
||||
onClick,
|
||||
children
|
||||
}: React.PropsWithChildren<INavigationItemProps>) => {
|
||||
const { getColors } = useThemeColors();
|
||||
|
||||
return (
|
||||
<button
|
||||
@@ -40,17 +38,29 @@ const NavigationItem: React.FunctionComponent<INavigationItemProps> = ({
|
||||
};
|
||||
|
||||
export const Navigation: React.FunctionComponent<INavigationProps> = ({
|
||||
totalPages
|
||||
|
||||
}: React.PropsWithChildren<INavigationProps>) => {
|
||||
const [crntTab, setCrntTab] = useRecoilState(TabAtom);
|
||||
const tabInfo = useRecoilValue(TabInfoAtom);
|
||||
const settings = useRecoilValue(SettingsAtom);
|
||||
|
||||
const tabs = [
|
||||
{ name: l10n.t(LocalizationKey.dashboardHeaderNavigationAllArticles), id: Tab.All },
|
||||
{ name: l10n.t(LocalizationKey.dashboardHeaderNavigationPublished), id: Tab.Published },
|
||||
{ name: l10n.t(LocalizationKey.dashboardHeaderNavigationDraft), id: Tab.Draft }
|
||||
];
|
||||
const tabs = React.useMemo(() => {
|
||||
const crntTabs = [
|
||||
{ name: l10n.t(LocalizationKey.dashboardHeaderNavigationAllArticles), id: Tab.All }
|
||||
];
|
||||
|
||||
if (settings?.draftField?.type === 'boolean' && tabInfo && Object.keys(tabInfo).length > 1) {
|
||||
crntTabs.push({ name: l10n.t(LocalizationKey.dashboardHeaderNavigationPublished), id: Tab.Published });
|
||||
|
||||
if (tabInfo.scheduled) {
|
||||
crntTabs.push({ name: l10n.t(LocalizationKey.dashboardHeaderNavigationScheduled), id: Tab.Scheduled });
|
||||
}
|
||||
|
||||
crntTabs.push({ name: l10n.t(LocalizationKey.dashboardHeaderNavigationDraft), id: Tab.Draft });
|
||||
}
|
||||
|
||||
return crntTabs;
|
||||
}, [settings?.draftField?.type, tabInfo]);
|
||||
|
||||
return (
|
||||
<nav className="flex-1 -mb-px flex space-x-6 xl:space-x-8" aria-label="Tabs">
|
||||
|
||||
@@ -23,7 +23,7 @@ import { LocalizationKey } from '../../../localization';
|
||||
export interface IRefreshDashboardDataProps { }
|
||||
|
||||
export const RefreshDashboardData: React.FunctionComponent<IRefreshDashboardDataProps> = (
|
||||
props: React.PropsWithChildren<IRefreshDashboardDataProps>
|
||||
{ }: React.PropsWithChildren<IRefreshDashboardDataProps>
|
||||
) => {
|
||||
const view = useRecoilValue(DashboardViewAtom);
|
||||
const [, setLoading] = useRecoilState(LoadingAtom);
|
||||
@@ -35,7 +35,6 @@ export const RefreshDashboardData: React.FunctionComponent<IRefreshDashboardData
|
||||
// Media
|
||||
const resetPage = useResetRecoilState(PageAtom);
|
||||
const selectedFolder = useRecoilValue(SelectedMediaFolderSelector);
|
||||
const { getColors } = useThemeColors();
|
||||
|
||||
const refreshPages = () => {
|
||||
setLoading(true);
|
||||
@@ -64,11 +63,7 @@ export const RefreshDashboardData: React.FunctionComponent<IRefreshDashboardData
|
||||
|
||||
return (
|
||||
<button
|
||||
className={`mr-2 ${getColors(
|
||||
'text-gray-500 hover:text-gray-600 dark:text-whisper-900 dark:hover:text-whisper-500',
|
||||
'text-[var(--vscode-foreground)] hover:text-[var(--vscode-textLink-foreground)]'
|
||||
)
|
||||
}`}
|
||||
className={`mr-2 text-[var(--vscode-foreground)] hover:text-[var(--vscode-textLink-foreground)]`}
|
||||
title={l10n.t(LocalizationKey.dashboardHeaderRefreshDashboardLabel)}
|
||||
onClick={refresh}
|
||||
>
|
||||
|
||||
@@ -56,7 +56,7 @@ export const Searchbox: React.FunctionComponent<ISearchboxProps> = ({
|
||||
name="search"
|
||||
className={`block w-full py-2 pl-10 pr-3 sm:text-sm appearance-none disabled:opacity-50 rounded ${getColors(
|
||||
'bg-white dark:bg-vulcan-300 border border-gray-300 dark:border-vulcan-100 text-vulcan-500 dark:text-whisper-500 placeholder-gray-400 dark:placeholder-whisper-800 focus:outline-none',
|
||||
'bg-[var(--vscode-input-background)] text-[var(--vscode-input-foreground)] border-[var(--vscode-editorWidget-border)] placeholder-[var(--vscode-input-placeholderForeground)] focus:outline-[var(--vscode-focusBorder)] focus:outline-1 focus:outline-offset-0 focus:shadow-none focus:border-transparent'
|
||||
'bg-[var(--vscode-input-background)] text-[var(--vscode-input-foreground)] border-[var(--vscode-input-border, --vscode-editorWidget-border)] placeholder-[var(--vscode-input-placeholderForeground)] focus:outline-[var(--vscode-focusBorder)] focus:outline-1 focus:outline-offset-0 focus:shadow-none focus:border-transparent'
|
||||
)
|
||||
}`}
|
||||
placeholder={placeholder || l10n.t(LocalizationKey.commonSearch)}
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
import * as React from 'react';
|
||||
import { Messenger } from '@estruyf/vscode/dist/client';
|
||||
import { Settings } from '../../models';
|
||||
import useThemeColors from '../../hooks/useThemeColors';
|
||||
import { DashboardMessage } from '../../DashboardMessage';
|
||||
import { SETTING_DASHBOARD_OPENONSTART } from '../../../constants';
|
||||
import * as l10n from "@vscode/l10n"
|
||||
import { LocalizationKey } from '../../../localization';
|
||||
import { VSCodeCheckbox } from '@vscode/webview-ui-toolkit/react';
|
||||
|
||||
|
||||
export interface IStartupProps {
|
||||
settings: Settings | null;
|
||||
@@ -15,13 +16,12 @@ export const Startup: React.FunctionComponent<IStartupProps> = ({
|
||||
settings
|
||||
}: React.PropsWithChildren<IStartupProps>) => {
|
||||
const [isChecked, setIsChecked] = React.useState(false);
|
||||
const { getColors } = useThemeColors();
|
||||
|
||||
const onChange = (e: React.ChangeEvent<HTMLInputElement>) => {
|
||||
setIsChecked(e.target.checked);
|
||||
const onChange = (value: boolean) => {
|
||||
setIsChecked(value);
|
||||
Messenger.send(DashboardMessage.updateSetting, {
|
||||
name: SETTING_DASHBOARD_OPENONSTART,
|
||||
value: e.target.checked
|
||||
value: value
|
||||
});
|
||||
};
|
||||
|
||||
@@ -30,35 +30,10 @@ export const Startup: React.FunctionComponent<IStartupProps> = ({
|
||||
}, [settings?.openOnStart]);
|
||||
|
||||
return (
|
||||
<div className={`relative flex items-start ml-4`}>
|
||||
<div className="flex items-center h-5">
|
||||
<input
|
||||
id="startup"
|
||||
aria-describedby="startup-description"
|
||||
name="startup"
|
||||
type="checkbox"
|
||||
checked={isChecked}
|
||||
onChange={onChange}
|
||||
className={`h-4 w-4 focus:outline-none rounded ${getColors(
|
||||
`focus:ring-teal-500 text-teal-600 border-gray-300 dark:border-vulcan-50`,
|
||||
`focus:ring-[var(--frontmatter-button-background)] text-[var(--frontmatter-button-background)] border-[var(--vscode-editorWidget-border)]`
|
||||
)
|
||||
}`}
|
||||
/>
|
||||
</div>
|
||||
<div className="ml-2 text-sm">
|
||||
<label
|
||||
id="startup-description"
|
||||
htmlFor="startup"
|
||||
className={`font-medium ${getColors(
|
||||
`text-vulcan-50 dark:text-whisper-900`,
|
||||
`text-[var(--vscode-editor-foreground)]`
|
||||
)
|
||||
}`}
|
||||
>
|
||||
{l10n.t(LocalizationKey.dashboardHeaderStartupLabel)}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<VSCodeCheckbox
|
||||
onChange={(e: React.ChangeEvent<HTMLInputElement>) => onChange(e.target.checked)}
|
||||
checked={isChecked}>
|
||||
{l10n.t(LocalizationKey.dashboardHeaderStartupLabel)}
|
||||
</VSCodeCheckbox>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import * as React from 'react';
|
||||
import { useLocation } from 'react-router-dom';
|
||||
import useThemeColors from '../../hooks/useThemeColors';
|
||||
import { NavigationType } from '../../models';
|
||||
|
||||
export interface ITabProps {
|
||||
@@ -14,7 +13,6 @@ export const Tab: React.FunctionComponent<ITabProps> = ({
|
||||
children
|
||||
}: React.PropsWithChildren<ITabProps>) => {
|
||||
const location = useLocation();
|
||||
const { getColors } = useThemeColors();
|
||||
|
||||
return (
|
||||
<button
|
||||
|
||||
13
src/dashboardWebView/components/Icons/PinIcon.tsx
Normal file
@@ -0,0 +1,13 @@
|
||||
import * as React from 'react';
|
||||
|
||||
export interface IPinIconProps {
|
||||
className?: string;
|
||||
}
|
||||
|
||||
export const PinIcon: React.FunctionComponent<IPinIconProps> = ({
|
||||
className
|
||||
}: React.PropsWithChildren<IPinIconProps>) => {
|
||||
return (
|
||||
<svg className={className || ""} stroke="currentColor" fill="currentColor" strokeWidth=".5" viewBox="0 0 16 16" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M14 5v7h-.278c-.406 0-.778-.086-1.117-.258A2.528 2.528 0 0 1 11.73 11H8.87a3.463 3.463 0 0 1-.546.828 3.685 3.685 0 0 1-.735.633c-.27.177-.565.31-.882.398a3.875 3.875 0 0 1-.985.141h-.5V9H2l-1-.5L2 8h3.222V4h.5c.339 0 .664.047.977.14.312.094.607.227.883.4A3.404 3.404 0 0 1 8.87 6h2.859a2.56 2.56 0 0 1 .875-.734c.338-.172.71-.26 1.117-.266H14zm-.778 1.086a1.222 1.222 0 0 0-.32.156 1.491 1.491 0 0 0-.43.461L12.285 7H8.183l-.117-.336a2.457 2.457 0 0 0-.711-1.047C7.027 5.331 6.427 5.09 6 5v7c.427-.088 1.027-.33 1.355-.617.328-.287.565-.636.71-1.047L8.184 10h4.102l.18.297c.057.094.122.177.195.25.073.073.153.143.242.21.088.069.195.12.32.157V6.086z"></path></svg>
|
||||
);
|
||||
};
|
||||
@@ -26,7 +26,7 @@ export const PageLayout: React.FunctionComponent<IPageLayoutProps> = ({
|
||||
<div
|
||||
className={
|
||||
contentClass ||
|
||||
'w-full flex justify-between flex-col flex-grow max-w-7xl mx-auto pt-6 px-4'
|
||||
'w-full flex justify-between flex-col flex-grow mx-auto pt-6 px-4 max-w-full xl:max-w-[90%]'
|
||||
}
|
||||
>
|
||||
{children}
|
||||
|
||||
@@ -14,12 +14,11 @@ export const DetailsInput: React.FunctionComponent<IDetailsInputProps> = ({ valu
|
||||
return (
|
||||
<textarea
|
||||
rows={3}
|
||||
className={`py-1 px-2 sm:text-sm border w-full ${
|
||||
getColors(
|
||||
'bg-white dark:bg-vulcan-300 border-gray-300 dark:border-vulcan-100 text-vulcan-500 dark:text-whisper-500 placeholder-gray-400 dark:placeholder-whisper-800 focus:outline-none',
|
||||
'bg-[var(--vscode-input-background)] text-[var(--vscode-input-foreground)] border-[var(--vscode-editorWidget-border)] placeholder-[var(--vscode-input-placeholderForeground)] focus:outline-[var(--vscode-focusBorder)] focus:outline-1 focus:outline-offset-0 focus:shadow-none focus:border-transparent'
|
||||
)
|
||||
}`}
|
||||
className={`py-1 px-2 sm:text-sm border w-full ${getColors(
|
||||
'bg-white dark:bg-vulcan-300 border-gray-300 dark:border-vulcan-100 text-vulcan-500 dark:text-whisper-500 placeholder-gray-400 dark:placeholder-whisper-800 focus:outline-none',
|
||||
'bg-[var(--vscode-input-background)] text-[var(--vscode-input-foreground)] border-[var(--vscode-input-border)] placeholder-[var(--vscode-input-placeholderForeground)] focus:outline-[var(--vscode-focusBorder)] focus:outline-1 focus:outline-offset-0 focus:shadow-none focus:border-transparent'
|
||||
)
|
||||
}`}
|
||||
value={value}
|
||||
onChange={onChange}
|
||||
/>
|
||||
@@ -28,12 +27,11 @@ export const DetailsInput: React.FunctionComponent<IDetailsInputProps> = ({ valu
|
||||
|
||||
return (
|
||||
<input
|
||||
className={`py-1 px-2 sm:text-sm border w-full ${
|
||||
getColors(
|
||||
'bg-white dark:bg-vulcan-300 border-gray-300 dark:border-vulcan-100 text-vulcan-500 dark:text-whisper-500 placeholder-gray-400 dark:placeholder-whisper-800 focus:outline-none',
|
||||
'bg-[var(--vscode-input-background)] text-[var(--vscode-input-foreground)] border-[var(--vscode-editorWidget-border)] placeholder-[var(--vscode-input-placeholderForeground)] focus:outline-[var(--vscode-focusBorder)] focus:outline-1 focus:outline-offset-0 focus:shadow-none focus:border-transparent'
|
||||
)
|
||||
}`}
|
||||
className={`py-1 px-2 sm:text-sm border w-full ${getColors(
|
||||
'bg-white dark:bg-vulcan-300 border-gray-300 dark:border-vulcan-100 text-vulcan-500 dark:text-whisper-500 placeholder-gray-400 dark:placeholder-whisper-800 focus:outline-none',
|
||||
'bg-[var(--vscode-input-background)] text-[var(--vscode-input-foreground)] border-[var(--vscode-input-border)] placeholder-[var(--vscode-input-placeholderForeground)] focus:outline-[var(--vscode-focusBorder)] focus:outline-1 focus:outline-offset-0 focus:shadow-none focus:border-transparent'
|
||||
)
|
||||
}`}
|
||||
value={value}
|
||||
onChange={onChange}
|
||||
/>
|
||||
|
||||
@@ -5,12 +5,11 @@ import { basename } from 'path';
|
||||
import * as React from 'react';
|
||||
import { Fragment, useCallback, useMemo } from 'react';
|
||||
import { DateHelper } from '../../../helpers/DateHelper';
|
||||
import { MediaInfo } from '../../../models';
|
||||
import { Messenger } from '@estruyf/vscode/dist/client';
|
||||
import { MediaInfo, UnmappedMedia } from '../../../models';
|
||||
import { Messenger, messageHandler } from '@estruyf/vscode/dist/client';
|
||||
import { DashboardMessage } from '../../DashboardMessage';
|
||||
import { useRecoilValue } from 'recoil';
|
||||
import { PageSelector, SelectedMediaFolderSelector } from '../../state';
|
||||
import useThemeColors from '../../hooks/useThemeColors';
|
||||
import { DetailsItem } from './DetailsItem';
|
||||
import { DetailsInput } from './DetailsInput';
|
||||
import * as l10n from '@vscode/l10n';
|
||||
@@ -24,6 +23,7 @@ export interface IDetailsSlideOverProps {
|
||||
media: MediaInfo;
|
||||
showForm: boolean;
|
||||
isImageFile: boolean;
|
||||
isVideoFile: boolean;
|
||||
onEdit: () => void;
|
||||
onEditClose: () => void;
|
||||
onDismiss: () => void;
|
||||
@@ -39,15 +39,16 @@ export const DetailsSlideOver: React.FunctionComponent<IDetailsSlideOverProps> =
|
||||
onEdit,
|
||||
onEditClose,
|
||||
onDismiss,
|
||||
isImageFile
|
||||
isImageFile,
|
||||
isVideoFile
|
||||
}: React.PropsWithChildren<IDetailsSlideOverProps>) => {
|
||||
const [filename, setFilename] = React.useState<string>(media.filename);
|
||||
const [caption, setCaption] = React.useState<string | undefined>(media.caption);
|
||||
const [title, setTitle] = React.useState<string | undefined>(media.title);
|
||||
const [unmapped, setUnmapped] = React.useState<UnmappedMedia[]>([]);
|
||||
const [alt, setAlt] = React.useState(media.alt);
|
||||
const selectedFolder = useRecoilValue(SelectedMediaFolderSelector);
|
||||
const page = useRecoilValue(PageSelector);
|
||||
const { getColors } = useThemeColors();
|
||||
|
||||
const createdDate = useMemo(() => DateHelper.tryParse(media.ctime), [media]);
|
||||
const modifiedDate = useMemo(() => DateHelper.tryParse(media.mtime), [media]);
|
||||
@@ -70,6 +71,17 @@ export const DetailsSlideOver: React.FunctionComponent<IDetailsSlideOverProps> =
|
||||
onEditClose();
|
||||
}, [media, filename, caption, alt, title, selectedFolder, page]);
|
||||
|
||||
const remapMetadata = useCallback((item: UnmappedMedia) => {
|
||||
Messenger.send(DashboardMessage.remapMediaMetadata, {
|
||||
file: media.fsPath,
|
||||
unmappedItem: item,
|
||||
folder: selectedFolder,
|
||||
page
|
||||
});
|
||||
|
||||
onEditClose();
|
||||
}, [media, filename, caption, alt, title, selectedFolder, page]);
|
||||
|
||||
React.useEffect(() => {
|
||||
setTitle(media.title);
|
||||
setAlt(media.alt);
|
||||
@@ -77,15 +89,21 @@ export const DetailsSlideOver: React.FunctionComponent<IDetailsSlideOverProps> =
|
||||
setFilename(media.filename);
|
||||
}, [media]);
|
||||
|
||||
React.useEffect(() => {
|
||||
if (showForm) {
|
||||
messageHandler.request<UnmappedMedia[]>(DashboardMessage.getUnmappedMedia, filename).then((result) => {
|
||||
setUnmapped(result);
|
||||
});
|
||||
} else {
|
||||
setUnmapped([]);
|
||||
}
|
||||
}, [showForm, filename]);
|
||||
|
||||
return (
|
||||
<Transition.Root show={true} as={Fragment}>
|
||||
<Dialog onClose={onDismiss} as={'div' as any} className="fixed inset-0 overflow-hidden z-50">
|
||||
<div className="absolute inset-0 overflow-hidden">
|
||||
<Dialog.Overlay className={`absolute inset-0 transition-opacity ${getColors(
|
||||
'bg-vulcan-500 bg-opacity-75',
|
||||
'bg-[var(--vscode-editor-background)] opacity-75'
|
||||
)
|
||||
}`} />
|
||||
<Dialog.Overlay className={`absolute inset-0 transition-opacity bg-[var(--vscode-editor-background)] opacity-75`} />
|
||||
|
||||
<div className="pointer-events-none fixed inset-y-0 right-0 flex max-w-full pl-10">
|
||||
<Transition.Child
|
||||
@@ -98,28 +116,16 @@ export const DetailsSlideOver: React.FunctionComponent<IDetailsSlideOverProps> =
|
||||
leaveTo="translate-x-full"
|
||||
>
|
||||
<div className="pointer-events-auto w-screen max-w-md">
|
||||
<div className={`flex h-full flex-col overflow-y-scroll border-l py-6 shadow-xl ${getColors(
|
||||
`bg-white dark:bg-vulcan-400 border-whisper-900 dark:border-vulcan-50`,
|
||||
`bg-[var(--vscode-sideBar-background)] border-[var(--frontmatter-border)]`
|
||||
)
|
||||
}`}>
|
||||
<div className={`flex h-full flex-col overflow-y-scroll border-l py-6 shadow-xl bg-[var(--vscode-sideBar-background)] border-[var(--frontmatter-border)]`}>
|
||||
<div className="px-4 sm:px-6">
|
||||
<div className="flex items-start justify-between">
|
||||
<Dialog.Title className={`text-lg font-medium ${getColors(
|
||||
'text-vulcan-300 dark:text-whisper-900',
|
||||
'text-[var(--vscode-editor-foreground)]'
|
||||
)
|
||||
}`}>
|
||||
<Dialog.Title className={`text-lg font-medium text-[var(--vscode-editor-foreground)]`}>
|
||||
{l10n.t(LocalizationKey.dashboardMediaDialogTitle)}
|
||||
</Dialog.Title>
|
||||
<div className="ml-3 flex h-7 items-center">
|
||||
<button
|
||||
type="button"
|
||||
className={`focus:outline-none ${getColors(
|
||||
'text-vulcan-300 dark:text-whisper-900 hover:text-vulcan-500 dark:hover:text-whisper-500',
|
||||
'text-[var(--vscode-titleBar-inactiveForeground)] hover:text-[var(--vscode-titleBar-activeForeground)]'
|
||||
)
|
||||
}`}
|
||||
className={`focus:outline-none text-[var(--vscode-titleBar-inactiveForeground)] hover:text-[var(--vscode-titleBar-activeForeground)]`}
|
||||
onClick={onDismiss}
|
||||
>
|
||||
<span className="sr-only">{l10n.t(LocalizationKey.dashboardMediaPanelClose)}</span>
|
||||
@@ -132,29 +138,27 @@ export const DetailsSlideOver: React.FunctionComponent<IDetailsSlideOverProps> =
|
||||
<div className="relative mt-6 flex-1 px-4 sm:px-6">
|
||||
<div className="absolute inset-0 px-4 sm:px-6 space-y-8">
|
||||
<div>
|
||||
{isImageFile && (
|
||||
<div className={`block w-full aspect-w-10 aspect-h-7 overflow-hidden border rounded ${getColors(
|
||||
'border-gray-200 dark:border-vulcan-200',
|
||||
'border-[var(--frontmatter-border)] bg-[var(--vscode-editor-background)]'
|
||||
)
|
||||
}`}>
|
||||
<img src={imgSrc} alt={media.filename} className="object-cover max-h-[300px] mx-auto" />
|
||||
{(isImageFile || isVideoFile) && (
|
||||
<div className={`block w-full aspect-w-10 aspect-h-7 overflow-hidden border rounded border-[var(--frontmatter-border)] bg-[var(--vscode-editor-background)]`}>
|
||||
{
|
||||
isImageFile && (
|
||||
<img src={imgSrc} alt={media.filename} className="object-cover max-h-[300px] mx-auto" />
|
||||
)
|
||||
}
|
||||
|
||||
{
|
||||
isVideoFile && (
|
||||
<video src={media.vsPath} className="mx-auto object-cover" controls muted />
|
||||
)
|
||||
}
|
||||
</div>
|
||||
)}
|
||||
<div className="mt-4 flex items-start justify-between">
|
||||
<div>
|
||||
<h2 className={`text-lg font-medium ${getColors(
|
||||
'text-vulcan-300 dark:text-whisper-500',
|
||||
'text-[var(--vscode-foreground)]'
|
||||
)
|
||||
}`}>
|
||||
<h2 className={`text-lg font-medium text-[var(--vscode-foreground)]`}>
|
||||
{media.filename}
|
||||
</h2>
|
||||
<p className={`text-sm font-medium ${getColors(
|
||||
'text-vulcan-100 dark:text-whisper-900',
|
||||
'text-[var(--vscode-editor-foreground)]'
|
||||
)
|
||||
}`}>
|
||||
<p className={`text-sm font-medium text-[var(--vscode-editor-foreground)]`}>
|
||||
{size}
|
||||
</p>
|
||||
</div>
|
||||
@@ -165,44 +169,53 @@ export const DetailsSlideOver: React.FunctionComponent<IDetailsSlideOverProps> =
|
||||
{/* EDIT METADATA FORM */}
|
||||
{showForm && (
|
||||
<>
|
||||
<h3 className={`text-base ${getColors(
|
||||
'text-vulcan-300 dark:text-whisper-500',
|
||||
'text-[var(--vscode-editor-foreground)]'
|
||||
)
|
||||
}`}>
|
||||
<h3 className={`text-base text-[var(--vscode-editor-foreground)]`}>
|
||||
{l10n.t(LocalizationKey.dashboardMediaMetadataPanelTitle)}
|
||||
</h3>
|
||||
<p className={`text-sm font-medium ${getColors(
|
||||
'text-vulcan-100 dark:text-whisper-900',
|
||||
'text-[var(--vscode-editor-foreground)]'
|
||||
)
|
||||
}`}>
|
||||
|
||||
{
|
||||
unmapped && unmapped.length > 0 && (
|
||||
<div className="flex flex-col py-3 space-y-3">
|
||||
<p className={`text-sm my-3 font-medium text-[var(--vscode-editor-foreground)] opacity-90`}>
|
||||
{l10n.t(LocalizationKey.dashboardMediaDetailsSlideOverUnmappedDescription)}
|
||||
</p>
|
||||
<ul className='pl-4'>
|
||||
{
|
||||
unmapped.map((item) => (
|
||||
<li className='list-disc'>
|
||||
<button
|
||||
key={item.file}
|
||||
className='text-left hover:text-[var(--frontmatter-link-hover)]'
|
||||
onClick={() => remapMetadata(item)}>
|
||||
{item.file}{item.metadata.title ? ` (${item.metadata.title})` : ''}
|
||||
</button>
|
||||
</li>
|
||||
))
|
||||
}
|
||||
</ul>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
<p className={`text-sm my-3 font-medium text-[var(--vscode-editor-foreground)] opacity-90`}>
|
||||
{l10n.t(LocalizationKey.dashboardMediaMetadataPanelDescription)}
|
||||
</p>
|
||||
<div className="flex flex-col py-3 space-y-3">
|
||||
<div>
|
||||
<label className={`block text-sm font-medium ${getColors(
|
||||
'text-gray-700 dark:text-whisper-900',
|
||||
'text-[var(--vscode-editor-foreground)]'
|
||||
)
|
||||
}`}>
|
||||
<label className={`block text-sm font-medium text-[var(--vscode-editor-foreground)]`}>
|
||||
{l10n.t(LocalizationKey.dashboardMediaMetadataPanelFieldFileName)}
|
||||
</label>
|
||||
<div className="relative mt-1">
|
||||
<DetailsInput value={name || ""} onChange={(e) => setFilename(`${e.target.value}.${extension}`)} />
|
||||
|
||||
<div className="absolute inset-y-0 right-0 pr-3 flex items-center pointer-events-none">
|
||||
<span className={`sm:text-sm ${getColors('text-gray-500', 'placeholder-[var(--vscode-input-placeholderForeground)]')}`}>.{extension}</span>
|
||||
<span className={`sm:text-sm placeholder-[var(--vscode-input-placeholderForeground)]`}>.{extension}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label className={`block text-sm font-medium ${getColors(
|
||||
'text-gray-700 dark:text-whisper-900',
|
||||
'text-[var(--vscode-editor-foreground)]'
|
||||
)
|
||||
}`}>
|
||||
<label className={`block text-sm font-medium text-[var(--vscode-editor-foreground)]`}>
|
||||
{l10n.t(LocalizationKey.dashboardMediaCommonTitle)}
|
||||
</label>
|
||||
<div className="mt-1">
|
||||
@@ -210,44 +223,32 @@ export const DetailsSlideOver: React.FunctionComponent<IDetailsSlideOverProps> =
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{(isImageFile || isVideoFile) && (
|
||||
<div>
|
||||
<label className={`block text-sm font-medium text-[var(--vscode-editor-foreground)]`}>
|
||||
{l10n.t(LocalizationKey.dashboardMediaCommonCaption)}
|
||||
</label>
|
||||
<div className="mt-1">
|
||||
<DetailsInput value={caption || ""} onChange={(e) => setCaption(e.target.value)} isTextArea />
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
{isImageFile && (
|
||||
<>
|
||||
<div>
|
||||
<label className={`block text-sm font-medium ${getColors(
|
||||
'text-gray-700 dark:text-whisper-900',
|
||||
'text-[var(--vscode-editor-foreground)]'
|
||||
)
|
||||
}`}>
|
||||
{l10n.t(LocalizationKey.dashboardMediaCommonCaption)}
|
||||
</label>
|
||||
<div className="mt-1">
|
||||
<DetailsInput value={caption || ""} onChange={(e) => setCaption(e.target.value)} isTextArea />
|
||||
</div>
|
||||
<div>
|
||||
<label className={`block text-sm font-medium text-[var(--vscode-editor-foreground)]`}>
|
||||
{l10n.t(LocalizationKey.dashboardMediaCommonAlt)}
|
||||
</label>
|
||||
<div className="mt-1">
|
||||
<DetailsInput value={alt || ""} onChange={(e) => setAlt(e.target.value)} isTextArea />
|
||||
</div>
|
||||
<div>
|
||||
<label className={`block text-sm font-medium ${getColors(
|
||||
'text-gray-700 dark:text-whisper-900',
|
||||
'text-[var(--vscode-editor-foreground)]'
|
||||
)
|
||||
}`}>
|
||||
{l10n.t(LocalizationKey.dashboardMediaCommonAlt)}
|
||||
</label>
|
||||
<div className="mt-1">
|
||||
<DetailsInput value={alt || ""} onChange={(e) => setAlt(e.target.value)} isTextArea />
|
||||
</div>
|
||||
</div>
|
||||
</>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<div className="mt-5 sm:mt-4 sm:flex sm:flex-row-reverse">
|
||||
<button
|
||||
type="button"
|
||||
className={`w-full inline-flex justify-center rounded border-transparent shadow-sm px-4 py-2 text-base font-medium sm:ml-3 sm:w-auto sm:text-sm disabled:opacity-30 ${getColors(
|
||||
'border focus:outline-none focus:ring-2 focus:ring-offset-2 text-white bg-teal-600 hover:bg-teal-700 dark:hover:bg-teal-900 focus:ring-teal-500',
|
||||
'bg-[var(--frontmatter-button-background)] hover:bg-[var(--vscode-button-hoverBackground)] text-[var(--vscode-button-foreground)] outline-[var(--vscode-focusBorder)] outline-1'
|
||||
)
|
||||
}`}
|
||||
className={`w-full inline-flex justify-center rounded border-transparent shadow-sm px-4 py-2 text-base font-medium sm:ml-3 sm:w-auto sm:text-sm disabled:opacity-30 bg-[var(--frontmatter-button-background)] hover:bg-[var(--vscode-button-hoverBackground)] text-[var(--vscode-button-foreground)] outline-[var(--vscode-focusBorder)] outline-1`}
|
||||
onClick={onSubmitMetadata}
|
||||
disabled={!filename}
|
||||
>
|
||||
@@ -255,11 +256,7 @@ export const DetailsSlideOver: React.FunctionComponent<IDetailsSlideOverProps> =
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
className={`mt-3 w-full inline-flex justify-center rounded shadow-sm px-4 py-2 text-base font-medium focus:outline-none sm:mt-0 sm:w-auto sm:text-sm ${getColors(
|
||||
'border border-gray-300 bg-white text-gray-700 hover:bg-gray-50 dark:hover:bg-gray-200',
|
||||
'bg-[var(--vscode-button-secondaryBackground)] hover:bg-[var(--vscode-button-secondaryHoverBackground)] text-[var(--vscode-button-secondaryForeground)]'
|
||||
)
|
||||
}`}
|
||||
className={`mt-3 w-full inline-flex justify-center rounded shadow-sm px-4 py-2 text-base font-medium focus:outline-none sm:mt-0 sm:w-auto sm:text-sm bg-[var(--vscode-button-secondaryBackground)] hover:bg-[var(--vscode-button-secondaryHoverBackground)] text-[var(--vscode-button-secondaryForeground)]`}
|
||||
onClick={onEditClose}
|
||||
>
|
||||
{l10n.t(LocalizationKey.commonCancel)}
|
||||
@@ -270,22 +267,14 @@ export const DetailsSlideOver: React.FunctionComponent<IDetailsSlideOverProps> =
|
||||
|
||||
{!showForm && (
|
||||
<>
|
||||
<h3 className={`text-base flex items-center ${getColors(
|
||||
'text-vulcan-300 dark:text-whisper-500',
|
||||
'text-[var(--vscode-foreground)]'
|
||||
)
|
||||
}`}>
|
||||
<h3 className={`text-base flex items-center text-[var(--vscode-foreground)]`}>
|
||||
<span>{l10n.t(LocalizationKey.dashboardMediaMetadataPanelFormMetadataTitle)}</span>
|
||||
<button onClick={onEdit}>
|
||||
<PencilAltIcon className="w-4 h-4 ml-2" aria-hidden="true" />
|
||||
<span className="sr-only">{l10n.t(LocalizationKey.commonEdit)}</span>
|
||||
</button>
|
||||
</h3>
|
||||
<dl className={`mt-2 border-t border-b divide-y ${getColors(
|
||||
'border-gray-200 dark:border-vulcan-200 divide-gray-200 dark:divide-vulcan-200',
|
||||
'border-[var(--frontmatter-border)] divide-[var(--frontmatter-border)]'
|
||||
)
|
||||
}`}>
|
||||
<dl className={`mt-2 border-t border-b divide-y border-[var(--frontmatter-border)] divide-[var(--frontmatter-border)]`}>
|
||||
<DetailsItem title={l10n.t(LocalizationKey.dashboardMediaMetadataPanelFieldFileName)} details={media.filename} />
|
||||
<DetailsItem title={l10n.t(LocalizationKey.dashboardMediaCommonTitle)} details={media.title || ""} />
|
||||
|
||||
@@ -302,18 +291,10 @@ export const DetailsSlideOver: React.FunctionComponent<IDetailsSlideOverProps> =
|
||||
|
||||
{!showForm && (
|
||||
<div>
|
||||
<h3 className={`text-base ${getColors(
|
||||
'text-vulcan-300 dark:text-whisper-500',
|
||||
'text-[var(--vscode-foreground)]'
|
||||
)
|
||||
}`}>
|
||||
<h3 className={`text-base text-[var(--vscode-foreground)]`}>
|
||||
{l10n.t(LocalizationKey.dashboardMediaMetadataPanelFormInformationTitle)}
|
||||
</h3>
|
||||
<dl className={`mt-2 border-t border-b divide-y ${getColors(
|
||||
'border-gray-200 dark:border-vulcan-200 divide-gray-200 dark:divide-vulcan-200',
|
||||
'border-[var(--frontmatter-border)] divide-[var(--frontmatter-border)]'
|
||||
)
|
||||
}`}>
|
||||
<dl className={`mt-2 border-t border-b divide-y border-[var(--frontmatter-border)] divide-[var(--frontmatter-border)]`}>
|
||||
{createdDate && (
|
||||
<DetailsItem title={l10n.t(LocalizationKey.dashboardMediaMetadataPanelFormInformationCreatedDate)} details={format(createdDate, 'MMM dd, yyyy')} />
|
||||
)}
|
||||
|
||||
@@ -433,18 +433,9 @@ export const Item: React.FunctionComponent<IItemProps> = ({
|
||||
|
||||
return (
|
||||
<>
|
||||
<li className={`group relative shadow-md hover:shadow-xl dark:shadow-none border rounded ${getColors(
|
||||
'bg-gray-50 dark:bg-vulcan-200 dark:hover:bg-vulcan-100 border-gray-200 dark:border-vulcan-50',
|
||||
'bg-[var(--vscode-sideBar-background)] hover:bg-[var(--vscode-list-hoverBackground)] text-[var(--vscode-sideBarTitle-foreground)] border-[var(--frontmatter-border)]'
|
||||
)
|
||||
}`}>
|
||||
<li className={`group relative shadow-md hover:shadow-xl dark:shadow-none border rounded bg-[var(--vscode-sideBar-background)] hover:bg-[var(--vscode-list-hoverBackground)] text-[var(--vscode-sideBarTitle-foreground)] border-[var(--frontmatter-border)]`}>
|
||||
<button
|
||||
className={`group/button relative block w-full aspect-w-10 aspect-h-7 overflow-hidden h-48 ${isImageFile ? 'cursor-pointer' : 'cursor-default'
|
||||
} ${getColors(
|
||||
`bg-gray-200 dark:bg-vulcan-300`,
|
||||
`border-b border-[var(--frontmatter-border)]`
|
||||
)
|
||||
}`}
|
||||
className={`group/button relative block w-full aspect-w-10 aspect-h-7 overflow-hidden h-48 ${isImageFile ? 'cursor-pointer' : 'cursor-default'} border-b border-[var(--frontmatter-border)]`}
|
||||
onClick={hasViewData ? undefined : openLightbox}
|
||||
>
|
||||
<div
|
||||
@@ -459,11 +450,7 @@ export const Item: React.FunctionComponent<IItemProps> = ({
|
||||
</div>
|
||||
{hasViewData && (
|
||||
<div
|
||||
className={`hidden group-hover/button:flex absolute top-0 right-0 bottom-0 left-0 items-center justify-center ${getColors(
|
||||
`bg-vulcan-500 bg-opacity-70`,
|
||||
`bg-black bg-opacity-90`
|
||||
)
|
||||
}`}
|
||||
className={`hidden group-hover/button:flex absolute top-0 right-0 bottom-0 left-0 items-center justify-center bg-black bg-opacity-70`}
|
||||
>
|
||||
<div
|
||||
className={`h-full ${showMediaSnippet ? 'w-1/3' : 'w-full'
|
||||
@@ -471,7 +458,7 @@ export const Item: React.FunctionComponent<IItemProps> = ({
|
||||
>
|
||||
<button
|
||||
title="Insert image"
|
||||
className={`h-1/3 ${getColors(`text-gray-300 hover:text-teal-600`, `text-[var(--vscode-editor-foreground)] hover:text-[var(--vscode-button-hoverBackground)]`)}`}
|
||||
className={`h-1/3 text-white hover:text-[var(--vscode-button-background)]`}
|
||||
onClick={insertToArticle}
|
||||
>
|
||||
<PlusIcon className={`w-full h-full hover:drop-shadow-md `} aria-hidden="true" />
|
||||
@@ -481,7 +468,7 @@ export const Item: React.FunctionComponent<IItemProps> = ({
|
||||
<div className={`h-full w-1/3 flex items-center justify-center`}>
|
||||
<button
|
||||
title="Insert snippet"
|
||||
className={`h-1/3 ${getColors(`text-gray-300 hover:text-teal-600`, `text-[var(--vscode-editor-foreground)] hover:text-[var(--vscode-button-hoverBackground)]`)}`}
|
||||
className={`h-1/3 text-white hover:text-[var(--vscode-button-background)]`}
|
||||
onClick={insertSnippet}
|
||||
>
|
||||
<CodeIcon
|
||||
@@ -714,6 +701,7 @@ export const Item: React.FunctionComponent<IItemProps> = ({
|
||||
media={media}
|
||||
showForm={showForm}
|
||||
isImageFile={isImageFile}
|
||||
isVideoFile={isVideoFile}
|
||||
onEdit={() => setShowForm(true)}
|
||||
onEditClose={() => setShowForm(false)}
|
||||
onDismiss={() => {
|
||||
|
||||
@@ -8,12 +8,12 @@ export const List: React.FunctionComponent<IListProps> = ({
|
||||
gap,
|
||||
children
|
||||
}: React.PropsWithChildren<IListProps>) => {
|
||||
const gapClass = gap !== undefined ? `gap-y-${gap}` : `gap-y-8`;
|
||||
const gapClass = gap !== undefined ? `gap-y-${gap}` : ``;
|
||||
|
||||
return (
|
||||
<ul
|
||||
role="list"
|
||||
className={`grid grid-cols-2 gap-x-4 ${gapClass} sm:grid-cols-3 sm:gap-x-6 lg:grid-cols-4 xl:gap-x-8`}
|
||||
className={`grid gap-4 ${gapClass} grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5`}
|
||||
>
|
||||
{children}
|
||||
</ul>
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
import { Messenger } from '@estruyf/vscode/dist/client';
|
||||
import { UploadIcon } from '@heroicons/react/outline';
|
||||
import * as React from 'react';
|
||||
import { useRecoilValue } from 'recoil';
|
||||
import { useRecoilState, useRecoilValue } from 'recoil';
|
||||
import {
|
||||
DashboardViewAtom,
|
||||
LoadingAtom,
|
||||
MediaFoldersAtom,
|
||||
SelectedMediaFolderAtom,
|
||||
@@ -28,6 +29,7 @@ import { MediaInfo } from '../../../models';
|
||||
import useThemeColors from '../../hooks/useThemeColors';
|
||||
import * as l10n from '@vscode/l10n';
|
||||
import { LocalizationKey } from '../../../localization';
|
||||
import { NavigationType } from '../../models';
|
||||
|
||||
export interface IMediaProps { }
|
||||
|
||||
@@ -41,6 +43,7 @@ export const Media: React.FunctionComponent<IMediaProps> = (
|
||||
const folders = useRecoilValue(MediaFoldersAtom);
|
||||
const loading = useRecoilValue(LoadingAtom);
|
||||
const { getColors } = useThemeColors();
|
||||
const [, setView] = useRecoilState(DashboardViewAtom);
|
||||
|
||||
const currentStaticFolder = useMemo(() => {
|
||||
if (settings?.staticFolder) {
|
||||
@@ -150,6 +153,7 @@ export const Media: React.FunctionComponent<IMediaProps> = (
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
setView(NavigationType.Media);
|
||||
Messenger.send(DashboardMessage.sendTelemetry, {
|
||||
event: TelemetryEvent.webviewMediaView
|
||||
});
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import { Messenger } from '@estruyf/vscode/dist/client';
|
||||
import { Messenger, messageHandler } from '@estruyf/vscode/dist/client';
|
||||
import { ArrowRightIcon, ExternalLinkIcon, RefreshIcon } from '@heroicons/react/outline';
|
||||
import * as React from 'react';
|
||||
import { useEffect, useRef, useState } from 'react';
|
||||
import { PreviewCommands } from '../../../constants';
|
||||
import { GeneralCommands, PreviewCommands } from '../../../constants';
|
||||
import useThemeColors from '../../hooks/useThemeColors';
|
||||
import { EventData } from '@estruyf/vscode/dist/models';
|
||||
import * as l10n from '@vscode/l10n';
|
||||
@@ -18,6 +18,7 @@ export const Preview: React.FunctionComponent<IPreviewProps> = ({
|
||||
const iframeRef = useRef<HTMLIFrameElement>(null);
|
||||
const [crntUrl, setCrntUrl] = useState<string | null>(null);
|
||||
const { getColors } = useThemeColors();
|
||||
const [localeReady, setLocaleReady] = useState<boolean>(false);
|
||||
|
||||
const onRefresh = () => {
|
||||
if (iframeRef.current?.src) {
|
||||
@@ -51,6 +52,15 @@ export const Preview: React.FunctionComponent<IPreviewProps> = ({
|
||||
useEffect(() => {
|
||||
Messenger.listen(msgListener);
|
||||
|
||||
messageHandler.request<any>(GeneralCommands.toVSCode.getLocalization).then((data) => {
|
||||
if (data) {
|
||||
l10n.config({
|
||||
contents: data
|
||||
});
|
||||
}
|
||||
setLocaleReady(true);
|
||||
});
|
||||
|
||||
return () => {
|
||||
Messenger.unlisten(msgListener);
|
||||
};
|
||||
@@ -74,31 +84,35 @@ export const Preview: React.FunctionComponent<IPreviewProps> = ({
|
||||
className="w-full m-[1px] h-full border-1 border-transparent text-xs py-1 px-2 focus:border-color-blue-500 bg-[var(--vscode-tab-activeBackground)] text-[var(--vscode-tab-inactiveForeground)] hover:text-[var(--vscode-tab-activeForeground)] focus:text-[var(--vscode-tab-activeForeground)] placeholder-[var(--vscode-input-placeholderForeground)] focus:outline-[var(--vscode-focusBorder)] focus:outline-1 focus:outline-offset-0 focus:shadow-none focus:border-[var(--vscode-focusBorder)"
|
||||
/>
|
||||
|
||||
<div
|
||||
className={`actions flex items-center space-x-2 px-2 ${getColors('text-vulcan-500 dark:text-whisper-100', 'text-[var(--vscode-list-activeSelectionForeground)]')
|
||||
}`}
|
||||
>
|
||||
<button
|
||||
title={l10n.t(LocalizationKey.dashboardPreviewButtonOpenTitle)}
|
||||
onClick={navigateToUrl}
|
||||
className={getColors(`hover:text-vulcan-500 dark:hover:text-whisper-100`, `hover:text-[var(--vscode-textLink-activeForeground)]`)}>
|
||||
<ArrowRightIcon className="w-4 h-4" aria-hidden="true" />
|
||||
</button>
|
||||
{
|
||||
localeReady && (
|
||||
<div
|
||||
className={`actions flex items-center space-x-2 px-2 ${getColors('text-vulcan-500 dark:text-whisper-100', 'text-[var(--vscode-list-activeSelectionForeground)]')
|
||||
}`}
|
||||
>
|
||||
<button
|
||||
title={l10n.t(LocalizationKey.dashboardPreviewButtonOpenTitle)}
|
||||
onClick={navigateToUrl}
|
||||
className={getColors(`hover:text-vulcan-500 dark:hover:text-whisper-100`, `hover:text-[var(--vscode-textLink-activeForeground)]`)}>
|
||||
<ArrowRightIcon className="w-4 h-4" aria-hidden="true" />
|
||||
</button>
|
||||
|
||||
<button
|
||||
title={l10n.t(LocalizationKey.dashboardPreviewButtonRefreshTitle)}
|
||||
onClick={onRefresh}
|
||||
className={`mr-2 ${getColors(`hover:text-vulcan-500 dark:hover:text-whisper-100`, `hover:text-[var(--vscode-textLink-activeForeground)]`)}`}>
|
||||
<RefreshIcon className="w-4 h-4" aria-hidden="true" />
|
||||
</button>
|
||||
<button
|
||||
title={l10n.t(LocalizationKey.dashboardPreviewButtonRefreshTitle)}
|
||||
onClick={onRefresh}
|
||||
className={`mr-2 ${getColors(`hover:text-vulcan-500 dark:hover:text-whisper-100`, `hover:text-[var(--vscode-textLink-activeForeground)]`)}`}>
|
||||
<RefreshIcon className="w-4 h-4" aria-hidden="true" />
|
||||
</button>
|
||||
|
||||
<button
|
||||
title={l10n.t(LocalizationKey.dashboardPreviewButtonOpenTitle)}
|
||||
onClick={openInBrowser}
|
||||
className={`mr-2 ${getColors(`hover:text-vulcan-500 dark:hover:text-whisper-100`, `hover:text-[var(--vscode-textLink-activeForeground)]`)}`}>
|
||||
<ExternalLinkIcon className="w-4 h-4" aria-hidden="true" />
|
||||
</button>
|
||||
</div>
|
||||
<button
|
||||
title={l10n.t(LocalizationKey.dashboardPreviewButtonOpenTitle)}
|
||||
onClick={openInBrowser}
|
||||
className={`mr-2 ${getColors(`hover:text-vulcan-500 dark:hover:text-whisper-100`, `hover:text-[var(--vscode-textLink-activeForeground)]`)}`}>
|
||||
<ExternalLinkIcon className="w-4 h-4" aria-hidden="true" />
|
||||
</button>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
</div>
|
||||
|
||||
<iframe
|
||||
|
||||
121
src/dashboardWebView/components/SettingsView/CommonSettings.tsx
Normal file
@@ -0,0 +1,121 @@
|
||||
import * as React from 'react';
|
||||
import * as l10n from '@vscode/l10n';
|
||||
import { LocalizationKey } from '../../../localization';
|
||||
import { Startup } from '../Header/Startup';
|
||||
import { useRecoilValue } from 'recoil';
|
||||
import { SettingsSelector } from '../../state';
|
||||
import { SettingsInput } from './SettingsInput';
|
||||
import { VSCodeButton } from '@vscode/webview-ui-toolkit/react';
|
||||
import { FrameworkDetectors, SETTING_FRAMEWORK_START, SETTING_PREVIEW_HOST, SETTING_WEBSITE_URL } from '../../../constants';
|
||||
import { messageHandler } from '@estruyf/vscode/dist/client';
|
||||
import { DashboardMessage } from '../../DashboardMessage';
|
||||
|
||||
export interface ICommonSettingsProps { }
|
||||
|
||||
interface Config {
|
||||
name: string;
|
||||
value: string;
|
||||
}
|
||||
|
||||
export const CommonSettings: React.FunctionComponent<ICommonSettingsProps> = (props: React.PropsWithChildren<ICommonSettingsProps>) => {
|
||||
const settings = useRecoilValue(SettingsSelector);
|
||||
const [config, setConfig] = React.useState<Config[]>([]);
|
||||
const [updated, setUpdated] = React.useState<boolean>(false);
|
||||
|
||||
const onSettingChange = React.useCallback((name: string, value: string) => {
|
||||
setConfig((prev) => {
|
||||
const setting = prev.find((c) => c.name === name);
|
||||
if (setting) {
|
||||
setting.value = value;
|
||||
} else {
|
||||
prev.push({
|
||||
name,
|
||||
value
|
||||
});
|
||||
}
|
||||
return [...prev];
|
||||
});
|
||||
setUpdated(true);
|
||||
}, [config]);
|
||||
|
||||
const retrieveSettings = () => {
|
||||
messageHandler.request<Config[]>(DashboardMessage.getSettings, [SETTING_PREVIEW_HOST, SETTING_WEBSITE_URL, SETTING_FRAMEWORK_START]).then((config) => {
|
||||
setConfig(config);
|
||||
setUpdated(false);
|
||||
});
|
||||
}
|
||||
|
||||
const saveSettings = React.useCallback(() => {
|
||||
messageHandler.request(DashboardMessage.setSettings, config).then(() => {
|
||||
retrieveSettings();
|
||||
});
|
||||
}, [config])
|
||||
|
||||
React.useEffect(() => {
|
||||
if (settings?.lastUpdated) {
|
||||
retrieveSettings();
|
||||
}
|
||||
}, [settings?.lastUpdated]);
|
||||
|
||||
return (
|
||||
<div className='w-full divide-y divide-[var(--frontmatter-border)]'>
|
||||
<div className='py-4'>
|
||||
<h2 className='text-xl mb-2'>{l10n.t(LocalizationKey.settingsOpenOnStartup)}</h2>
|
||||
|
||||
<Startup settings={settings} />
|
||||
</div>
|
||||
|
||||
<div className='py-4'>
|
||||
<h2 className='text-xl mb-2'>{l10n.t(LocalizationKey.settingsCommonSettingsWebsiteTitle)}</h2>
|
||||
|
||||
<div className='space-y-2'>
|
||||
<SettingsInput
|
||||
label={l10n.t(LocalizationKey.settingsCommonSettingsPreviewUrl)}
|
||||
name={SETTING_PREVIEW_HOST}
|
||||
value={config.find((c) => c.name === SETTING_PREVIEW_HOST)?.value || ""}
|
||||
onChange={onSettingChange}
|
||||
/>
|
||||
|
||||
<SettingsInput
|
||||
label={l10n.t(LocalizationKey.settingsCommonSettingsWebsiteUrl)}
|
||||
name={SETTING_WEBSITE_URL}
|
||||
value={config.find((c) => c.name === SETTING_WEBSITE_URL)?.value || ""}
|
||||
onChange={onSettingChange}
|
||||
/>
|
||||
|
||||
<SettingsInput
|
||||
label={l10n.t(LocalizationKey.settingsCommonSettingsStartCommand)}
|
||||
name={SETTING_FRAMEWORK_START}
|
||||
value={config.find((c) => c.name === SETTING_FRAMEWORK_START)?.value || ""}
|
||||
onChange={onSettingChange}
|
||||
fallback={FrameworkDetectors.find((f) => f.framework.name === settings?.crntFramework)?.commands.start || ""}
|
||||
/>
|
||||
|
||||
<div className={`mt-4 flex gap-2`}>
|
||||
<VSCodeButton appearance="secondary" onClick={retrieveSettings}>
|
||||
{l10n.t(LocalizationKey.commonCancel)}
|
||||
</VSCodeButton>
|
||||
<VSCodeButton disabled={!updated} onClick={saveSettings}>
|
||||
{l10n.t(LocalizationKey.commonSave)}
|
||||
</VSCodeButton>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className='py-4 space-y-2'>
|
||||
<h2 className='text-xl mb-2'>{l10n.t(LocalizationKey.settingsDiagnostic)}</h2>
|
||||
|
||||
<p>{l10n.t(LocalizationKey.settingsDiagnosticDescription)}</p>
|
||||
|
||||
<p>
|
||||
<a
|
||||
href={`command:frontMatter.diagnostics`}
|
||||
title={l10n.t(LocalizationKey.settingsDiagnosticLink)}
|
||||
className='text-[var(--vscode-textLink-foreground)] hover:text-[var(--vscode-textLink-activeForeground)]'
|
||||
>
|
||||
{l10n.t(LocalizationKey.settingsDiagnosticLink)}
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
@@ -0,0 +1,31 @@
|
||||
import { VSCodeTextField } from '@vscode/webview-ui-toolkit/react';
|
||||
import * as React from 'react';
|
||||
|
||||
export interface ISettingsInputProps {
|
||||
label: string;
|
||||
name: string;
|
||||
value: string;
|
||||
onChange: (key: string, value: string) => void;
|
||||
fallback?: string;
|
||||
}
|
||||
|
||||
export const SettingsInput: React.FunctionComponent<ISettingsInputProps> = ({
|
||||
label,
|
||||
name,
|
||||
value,
|
||||
onChange,
|
||||
fallback
|
||||
}: React.PropsWithChildren<ISettingsInputProps>) => {
|
||||
|
||||
return (
|
||||
<VSCodeTextField
|
||||
className='w-full p-0 m-0 bg-inherit border-0 focus:border-0 outline-none focus:outline-none shadow-none'
|
||||
style={{
|
||||
boxShadow: 'none'
|
||||
}}
|
||||
value={value || fallback || ""}
|
||||
onInput={(e: React.ChangeEvent<HTMLInputElement>) => onChange(name, e.target.value)}>
|
||||
{label}
|
||||
</VSCodeTextField>
|
||||
);
|
||||
};
|
||||
@@ -0,0 +1,30 @@
|
||||
import * as React from 'react';
|
||||
import { useRecoilValue } from 'recoil';
|
||||
import { SettingsSelector } from '../../state';
|
||||
import { CogIcon } from '@heroicons/react/solid';
|
||||
import { NavigationType } from '../../models';
|
||||
|
||||
export interface ISettingsLinkProps {
|
||||
onNavigate: (navigationType: NavigationType) => void;
|
||||
}
|
||||
|
||||
export const SettingsLink: React.FunctionComponent<ISettingsLinkProps> = ({
|
||||
onNavigate
|
||||
}: React.PropsWithChildren<ISettingsLinkProps>) => {
|
||||
const settings = useRecoilValue(SettingsSelector);
|
||||
|
||||
if (!settings) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<button
|
||||
className="flex items-center mr-4 hover:text-[var(--vscode-textLink-activeForeground)]"
|
||||
title={`Settings`}
|
||||
onClick={() => onNavigate(NavigationType.Settings)}
|
||||
>
|
||||
<CogIcon className="h-4 w-4" />
|
||||
<span className='sr-only'>Settings</span>
|
||||
</button>
|
||||
);
|
||||
};
|
||||
@@ -0,0 +1,98 @@
|
||||
import * as React from 'react';
|
||||
import { PageLayout } from '../Layout';
|
||||
import { SponsorMsg } from '../Layout/SponsorMsg';
|
||||
import { useRecoilValue } from 'recoil';
|
||||
import { SettingsSelector } from '../../state';
|
||||
import { Spinner } from '../Common/Spinner';
|
||||
import { AstroContentTypes } from '../Configuration/Astro/AstroContentTypes';
|
||||
import { ContentFolders } from '../Configuration/Common/ContentFolders';
|
||||
import * as l10n from '@vscode/l10n';
|
||||
import { LocalizationKey } from '../../../localization';
|
||||
import { COMMAND_NAME } from '../../../constants';
|
||||
import { RefreshIcon } from '@heroicons/react/outline';
|
||||
import { VSCodePanelTab, VSCodePanelView, VSCodePanels } from '@vscode/webview-ui-toolkit/react';
|
||||
import { CommonSettings } from './CommonSettings';
|
||||
|
||||
export interface ISettingsViewProps { }
|
||||
|
||||
export const SettingsView: React.FunctionComponent<ISettingsViewProps> = (_: React.PropsWithChildren<ISettingsViewProps>) => {
|
||||
const [loading, setLoading] = React.useState<boolean>(false);
|
||||
const settings = useRecoilValue(SettingsSelector);
|
||||
|
||||
return (
|
||||
<PageLayout>
|
||||
{
|
||||
loading && <Spinner />
|
||||
}
|
||||
|
||||
{
|
||||
settings && (
|
||||
<div className='mx-auto max-w-7xl w-full'>
|
||||
<div className='flex items-center justify-between'>
|
||||
<h1 className='text-3xl'>{l10n.t(LocalizationKey.commonSettings)}</h1>
|
||||
|
||||
<a
|
||||
type="button"
|
||||
className={`inline-flex items-center px-3 py-2 border border-transparent text-sm leading-4 font-medium focus:outline-none rounded text-[var(--vscode-button-foreground)] hover:text-[var(--vscode-button-foreground)] bg-[var(--frontmatter-button-background)] hover:bg-[var(--vscode-button-hoverBackground)] disabled:opacity-50`}
|
||||
href={`command:${COMMAND_NAME.settingsRefresh}`}
|
||||
>
|
||||
<RefreshIcon
|
||||
className={`w-4 h-4 mr-2`}
|
||||
aria-hidden="true"
|
||||
/>
|
||||
<span>{l10n.t(LocalizationKey.commonRefreshSettings)}</span>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<VSCodePanels className={`mt-4`}>
|
||||
<VSCodePanelTab id="view-1">{l10n.t(LocalizationKey.settingsViewCommon)}</VSCodePanelTab>
|
||||
<VSCodePanelTab id="view-2">{l10n.t(LocalizationKey.settingsViewContentFolders)}</VSCodePanelTab>
|
||||
|
||||
{
|
||||
settings?.crntFramework === 'astro' && (
|
||||
<VSCodePanelTab id="view-3">{l10n.t(LocalizationKey.settingsViewAstro)}</VSCodePanelTab>
|
||||
)
|
||||
}
|
||||
|
||||
<VSCodePanelView id="view-1">
|
||||
<CommonSettings />
|
||||
</VSCodePanelView>
|
||||
|
||||
<VSCodePanelView id="view-2">
|
||||
<div className='py-4'>
|
||||
<h2 className='text-xl mb-2'>{l10n.t(LocalizationKey.settingsContentFolders)}</h2>
|
||||
|
||||
<ContentFolders
|
||||
settings={settings}
|
||||
triggerLoading={(isLoading) => setLoading(isLoading)} />
|
||||
</div>
|
||||
</VSCodePanelView>
|
||||
|
||||
{
|
||||
settings?.crntFramework === 'astro' && (
|
||||
<VSCodePanelView id="view-3">
|
||||
<div className='py-4'>
|
||||
<h2 className='text-xl mb-2'>{l10n.t(LocalizationKey.settingsContentTypes)}</h2>
|
||||
|
||||
<AstroContentTypes
|
||||
settings={settings}
|
||||
triggerLoading={(isLoading) => setLoading(isLoading)} />
|
||||
</div>
|
||||
</VSCodePanelView>
|
||||
)
|
||||
}
|
||||
</VSCodePanels>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
<SponsorMsg
|
||||
beta={settings?.beta}
|
||||
version={settings?.versionInfo}
|
||||
isBacker={settings?.isBacker}
|
||||
/>
|
||||
|
||||
<img className='hidden' src="https://api.visitorbadge.io/api/visitors?path=https%3A%2F%2Ffrontmatter.codes%2Fmetrics%2Fdashboards&slug=settings" alt="Settings metrics" />
|
||||
</PageLayout >
|
||||
);
|
||||
};
|
||||