From be158d43652999f0c8fcbd04088aca02a966d1d7 Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Thu, 3 Jul 2025 20:17:44 +0200 Subject: [PATCH 01/11] Update docs --- README.beta.md | 4 ++-- README.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.beta.md b/README.beta.md index d81c6404..e6d6a43d 100644 --- a/README.beta.md +++ b/README.beta.md @@ -117,7 +117,7 @@ In version v2 we released the re-designed sidebar panel with improved SEO suppor You can get the extension via: - The VS Code marketplace: [VS Code Marketplace - Front Matter](https://marketplace.visualstudio.com/items?itemName=eliostruyf.vscode-front-matter). -- The extension CLI: `ext install eliostruyf.vscode-front-matter` +- The extension CLI: `code --install-extension eliostruyf.vscode-front-matter` - Or by clicking on the following link: open extension in VS Code > **Info**: The docs can be found on [frontmatter.codes](https://frontmatter.codes). @@ -129,7 +129,7 @@ If you have the courage to test out the beta features, we made available a beta - Uninstall the main Front Matter version - Install the beta version - VS Code marketplace: [VS Code Marketplace - Front Matter BETA](https://marketplace.visualstudio.com/items?itemName=eliostruyf.vscode-front-matter-beta). - - The extension CLI: `ext install eliostruyf.vscode-front-matter-beta` + - The extension CLI: `code --install-extension eliostruyf.vscode-front-matter-beta` - Or by clicking on the following link: open extension in VS Code > **Info**: The BETA docs can be found on [beta.frontmatter.codes](https://beta.frontmatter.codes). diff --git a/README.md b/README.md index 45fc04ad..7407286d 100644 --- a/README.md +++ b/README.md @@ -115,7 +115,7 @@ In version v2 we released the re-designed sidebar panel with improved SEO suppor You can get the extension via: - The VS Code marketplace: [VS Code Marketplace - Front Matter](https://marketplace.visualstudio.com/items?itemName=eliostruyf.vscode-front-matter). -- The extension CLI: `ext install eliostruyf.vscode-front-matter` +- The extension CLI: `code --install-extension eliostruyf.vscode-front-matter` - Or by clicking on the following link: open extension in VS Code > **Info**: The docs can be found on [frontmatter.codes](https://frontmatter.codes). @@ -127,7 +127,7 @@ If you have the courage to test out the beta features, we made available a beta - Uninstall the main Front Matter version - Install the beta version - VS Code marketplace: [VS Code Marketplace - Front Matter BETA](https://marketplace.visualstudio.com/items?itemName=eliostruyf.vscode-front-matter-beta). - - The extension CLI: `ext install eliostruyf.vscode-front-matter-beta` + - The extension CLI: `code --install-extension eliostruyf.vscode-front-matter-beta` - Or by clicking on the following link: open extension in VS Code > **Info**: The BETA docs can be found on [beta.frontmatter.codes](https://beta.frontmatter.codes). From 99405042ed26f6f287d4f35854df3a7bb1e73ef4 Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Mon, 14 Jul 2025 21:24:31 +0200 Subject: [PATCH 02/11] Refactor date change handling in DateTimeField to ensure proper timezone formatting and fallback to ISO string --- src/panelWebView/components/Fields/DateTimeField.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/panelWebView/components/Fields/DateTimeField.tsx b/src/panelWebView/components/Fields/DateTimeField.tsx index 9d6e06af..c9c0f152 100644 --- a/src/panelWebView/components/Fields/DateTimeField.tsx +++ b/src/panelWebView/components/Fields/DateTimeField.tsx @@ -40,11 +40,13 @@ export const DateTimeField: React.FunctionComponent = ({ const onDateChange = React.useCallback((date: Date) => { setDateValue(date); if (format) { + // Always use DateHelper.formatInTimezone when a format is provided onChange(DateHelper.formatInTimezone(date, format, timezone) || ""); } else { + // Only fallback to ISO string if no format is provided onChange(date.toISOString()); } - }, [format, onChange]); + }, [format, timezone, onChange]); const showRequiredState = useMemo(() => { return required && !dateValue; From 43a6a22721a7d1cd133eb4a6c16ce8cdc19b8f70 Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Tue, 15 Jul 2025 23:26:45 +0200 Subject: [PATCH 03/11] Fix typo #969 --- l10n/bundle.l10n.json | 2 +- src/localization/localization.enum.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/l10n/bundle.l10n.json b/l10n/bundle.l10n.json index bd58e0fd..ac5791ce 100644 --- a/l10n/bundle.l10n.json +++ b/l10n/bundle.l10n.json @@ -332,7 +332,7 @@ "dashboard.steps.stepsToGetStarted.tags.name": "Import all tags and categories (optional)", "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.git.name": "Do you want to enable Git synchronization?", - "dashboard.steps.stepsToGetStarted.git.description": "Enable Git synchronization to eaily sync your changes with your repository.", + "dashboard.steps.stepsToGetStarted.git.description": "Enable Git synchronization to easily sync your changes with your repository.", "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", diff --git a/src/localization/localization.enum.ts b/src/localization/localization.enum.ts index 4845ee59..27926593 100644 --- a/src/localization/localization.enum.ts +++ b/src/localization/localization.enum.ts @@ -1108,7 +1108,7 @@ export enum LocalizationKey { */ dashboardStepsStepsToGetStartedGitName = 'dashboard.steps.stepsToGetStarted.git.name', /** - * Enable Git synchronization to eaily sync your changes with your repository. + * Enable Git synchronization to easily sync your changes with your repository. */ dashboardStepsStepsToGetStartedGitDescription = 'dashboard.steps.stepsToGetStarted.git.description', /** From a6188b00603b917dbe47cd74a79044442daf4841 Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Tue, 15 Jul 2025 23:27:28 +0200 Subject: [PATCH 04/11] Add entry for version 10.10.0 to CHANGELOG with typo fix on welcome screen --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 021100b6..29bd8f33 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [10.10.0] - 2025-xx-xx + +- [#969](https://github.com/estruyf/vscode-front-matter/issues/969): Fix typo on welcome screen + ## [10.9.0] - 2025-07-01 - [Release notes](https://beta.frontmatter.codes/updates/v10.9.0) ### 🎨 Enhancements From 0c7e3fb42b6019d14f97f208c7335f5bf58354fd Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Mon, 8 Sep 2025 21:48:30 +0200 Subject: [PATCH 05/11] Enhancement: Support for numbers (int) in Snippets Fixes #973 --- .../components/Common/NumberField.tsx | 68 +++++++++++++++++++ .../SnippetsView/SnippetInputField.tsx | 12 ++++ .../components/SnippetsView/Snippets.tsx | 4 +- 3 files changed, 81 insertions(+), 3 deletions(-) create mode 100644 src/dashboardWebView/components/Common/NumberField.tsx diff --git a/src/dashboardWebView/components/Common/NumberField.tsx b/src/dashboardWebView/components/Common/NumberField.tsx new file mode 100644 index 00000000..f3714237 --- /dev/null +++ b/src/dashboardWebView/components/Common/NumberField.tsx @@ -0,0 +1,68 @@ +import { XCircleIcon } from '@heroicons/react/24/solid'; +import * as React from 'react'; + +export interface INumberFieldProps { + name: string; + value?: string; + placeholder?: string; + description?: string; + icon?: JSX.Element; + disabled?: boolean; + autoFocus?: boolean; + onChange?: (value: string) => void; + onReset?: () => void; +} + +export const NumberField: React.FunctionComponent = ({ + name, + value, + placeholder, + description, + icon, + autoFocus, + disabled, + onChange, + onReset +}: React.PropsWithChildren) => { + return ( + <> +
+ { + icon && ( +
+ {icon} +
+ ) + } + + onChange && onChange(e.target.value)} + disabled={!!disabled} + /> + + {(value && onReset) && ( + + )} +
+ + { + description && ( +

+ {description} +

+ ) + } + + ); +}; diff --git a/src/dashboardWebView/components/SnippetsView/SnippetInputField.tsx b/src/dashboardWebView/components/SnippetsView/SnippetInputField.tsx index d71e0b1f..199154f6 100644 --- a/src/dashboardWebView/components/SnippetsView/SnippetInputField.tsx +++ b/src/dashboardWebView/components/SnippetsView/SnippetInputField.tsx @@ -3,6 +3,7 @@ import { ChevronDownIcon } from '@heroicons/react/24/outline'; import { Choice, SnippetField, SnippetInfoField } from '../../../models'; import { useEffect } from 'react'; import { TextField } from '../Common/TextField'; +import { NumberField } from '../Common/NumberField'; export interface ISnippetInputFieldProps { field: SnippetField; @@ -78,6 +79,17 @@ export const SnippetInputField: React.FunctionComponent ); } + if (field.type === 'number') { + return ( + onValueChange(field, e)} + /> + ); + } + return ( = ( - _: React.PropsWithChildren -) => { +export const Snippets: React.FunctionComponent = () => { const settings = useRecoilValue(SettingsSelector); const viewData = useRecoilValue(ViewDataSelector); const mode = useRecoilValue(ModeAtom); From bb535961a3fcb0fc74ab2fd241fb53b226bc592a Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Mon, 8 Sep 2025 21:49:21 +0200 Subject: [PATCH 06/11] Update CHANGELOG for version 10.10.0: Add enhancements and fixes sections --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 29bd8f33..8ecf243d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ ## [10.10.0] - 2025-xx-xx +### 🎨 Enhancements + +- [#973](https://github.com/estruyf/vscode-front-matter/issues/973): Support for number fields in the snippets + +### 🐞 Fixes + - [#969](https://github.com/estruyf/vscode-front-matter/issues/969): Fix typo on welcome screen ## [10.9.0] - 2025-07-01 - [Release notes](https://beta.frontmatter.codes/updates/v10.9.0) From beef6f36d8de7e66fbf9614f597326dc8156c793 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 8 Sep 2025 20:07:41 +0000 Subject: [PATCH 08/11] Implement first paragraph keyword check for SEO validation Co-authored-by: estruyf <2900833+estruyf@users.noreply.github.com> --- l10n/bundle.l10n.json | 1 + src/helpers/ArticleHelper.ts | 21 +++++++++++++++++-- src/localization/localization.enum.ts | 4 ++++ .../components/ArticleDetails.tsx | 1 + .../components/SeoKeywordInfo.tsx | 12 +++++++---- src/panelWebView/components/SeoKeywords.tsx | 1 + src/panelWebView/components/SeoStatus.tsx | 1 + 7 files changed, 35 insertions(+), 6 deletions(-) diff --git a/l10n/bundle.l10n.json b/l10n/bundle.l10n.json index bd58e0fd..e09ea624 100644 --- a/l10n/bundle.l10n.json +++ b/l10n/bundle.l10n.json @@ -504,6 +504,7 @@ "panel.seoKeywords.density": "Keyword density", "panel.seoKeywordInfo.validInfo.label": "Heading(s)", "panel.seoKeywordInfo.validInfo.content": "Content", + "panel.seoKeywordInfo.validInfo.firstParagraph": "First paragraph", "panel.seoKeywordInfo.density.tooltip": "Recommended frequency: 0.75% - 1.5%", "panel.seoKeywords.title": "Keywords", diff --git a/src/helpers/ArticleHelper.ts b/src/helpers/ArticleHelper.ts index 9f96db7a..bb592b8d 100644 --- a/src/helpers/ArticleHelper.ts +++ b/src/helpers/ArticleHelper.ts @@ -807,7 +807,8 @@ export class ArticleHelper { const elms: Parent[] | Link[] = this.getAllElms(mdTree); const headings = elms.filter((node) => node.type === 'heading'); - const paragraphs = elms.filter((node) => node.type === 'paragraph').length; + const paragraphNodes = elms.filter((node) => node.type === 'paragraph'); + const paragraphs = paragraphNodes.length; const images = elms.filter((node) => node.type === 'image').length; const links: string[] = elms .filter((node) => node.type === 'link') @@ -836,6 +837,21 @@ export class ArticleHelper { } } + // Extract first paragraph text for SEO keyword checking + let firstParagraph = ''; + if (paragraphNodes.length > 0) { + const firstParagraphNode = paragraphNodes[0]; + const extractTextFromNode = (node: any): string => { + if (node.type === 'text') { + return node.value || ''; + } else if (node.children && Array.isArray(node.children)) { + return node.children.map(extractTextFromNode).join(''); + } + return ''; + }; + firstParagraph = extractTextFromNode(firstParagraphNode); + } + const wordCount = this.wordCount(0, mdTree); return { @@ -846,7 +862,8 @@ export class ArticleHelper { internalLinks, externalLinks: externalLinks.length, wordCount, - content: article.content + content: article.content, + firstParagraph }; } diff --git a/src/localization/localization.enum.ts b/src/localization/localization.enum.ts index 4845ee59..d7ba0350 100644 --- a/src/localization/localization.enum.ts +++ b/src/localization/localization.enum.ts @@ -1632,6 +1632,10 @@ export enum LocalizationKey { * Content */ panelSeoKeywordInfoValidInfoContent = 'panel.seoKeywordInfo.validInfo.content', + /** + * First paragraph + */ + panelSeoKeywordInfoValidInfoFirstParagraph = 'panel.seoKeywordInfo.validInfo.firstParagraph', /** * Recommended frequency: 0.75% - 1.5% */ diff --git a/src/panelWebView/components/ArticleDetails.tsx b/src/panelWebView/components/ArticleDetails.tsx index 747d100a..8fd7ddb2 100644 --- a/src/panelWebView/components/ArticleDetails.tsx +++ b/src/panelWebView/components/ArticleDetails.tsx @@ -11,6 +11,7 @@ export interface IArticleDetailsProps { internalLinks: number; externalLinks: number; images: number; + firstParagraph?: string; }; } diff --git a/src/panelWebView/components/SeoKeywordInfo.tsx b/src/panelWebView/components/SeoKeywordInfo.tsx index bb3b78d1..094fc442 100644 --- a/src/panelWebView/components/SeoKeywordInfo.tsx +++ b/src/panelWebView/components/SeoKeywordInfo.tsx @@ -16,6 +16,7 @@ export interface ISeoKeywordInfoProps { content: string; wordCount?: number; headings?: string[]; + firstParagraph?: string; } const SeoKeywordInfo: React.FunctionComponent = ({ @@ -26,7 +27,8 @@ const SeoKeywordInfo: React.FunctionComponent = ({ slug, content, wordCount, - headings + headings, + firstParagraph }: React.PropsWithChildren) => { const density = () => { @@ -90,9 +92,10 @@ const SeoKeywordInfo: React.FunctionComponent = ({ (slug.toLowerCase().includes(keyword.toLowerCase()) || slug.toLowerCase().includes(keyword.replace(/ /g, '-').toLowerCase())), content: !!content && content.toLowerCase().includes(keyword.toLowerCase()), - heading: checkHeadings() + heading: checkHeadings(), + firstParagraph: !!firstParagraph && firstParagraph.toLowerCase().includes(keyword.toLowerCase()) }; - }, [title, description, slug, content, headings, wordCount]); + }, [title, description, slug, content, headings, wordCount, firstParagraph]); const tooltipContent = React.useMemo(() => { return ( @@ -102,7 +105,8 @@ const SeoKeywordInfo: React.FunctionComponent = ({ {localize(LocalizationKey.commonDescription)}
{localize(LocalizationKey.commonSlug)}
{localize(LocalizationKey.panelSeoKeywordInfoValidInfoContent)}
- {localize(LocalizationKey.panelSeoKeywordInfoValidInfoLabel)} + {localize(LocalizationKey.panelSeoKeywordInfoValidInfoLabel)}
+ {localize(LocalizationKey.panelSeoKeywordInfoValidInfoFirstParagraph)} ) }, [checks]); diff --git a/src/panelWebView/components/SeoKeywords.tsx b/src/panelWebView/components/SeoKeywords.tsx index 15fb3ad7..fc459ab6 100644 --- a/src/panelWebView/components/SeoKeywords.tsx +++ b/src/panelWebView/components/SeoKeywords.tsx @@ -14,6 +14,7 @@ export interface ISeoKeywordsProps { content: string; headings?: string[]; wordCount?: number; + firstParagraph?: string; } const SeoKeywords: React.FunctionComponent = ({ diff --git a/src/panelWebView/components/SeoStatus.tsx b/src/panelWebView/components/SeoStatus.tsx index af28b788..aeb3cf27 100644 --- a/src/panelWebView/components/SeoStatus.tsx +++ b/src/panelWebView/components/SeoStatus.tsx @@ -96,6 +96,7 @@ const SeoStatus: React.FunctionComponent = ({ headings={metadata?.articleDetails?.headingsText} wordCount={metadata?.articleDetails?.wordCount} content={metadata?.articleDetails?.content} + firstParagraph={metadata?.articleDetails?.firstParagraph} /> From c8ebac32d3c04d29e65abcda5c441d5c03633f28 Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Tue, 9 Sep 2025 09:42:13 +0200 Subject: [PATCH 09/11] Update CHANGELOG for version 10.10.0: Add SEO keyword support enhancement --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ecf243d..d8260315 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ### 🎨 Enhancements +- [#965](https://github.com/estruyf/vscode-front-matter/issues/965): Added SEO support for the keyword in the first paragraph - [#973](https://github.com/estruyf/vscode-front-matter/issues/973): Support for number fields in the snippets ### 🐞 Fixes From 24c26ac85553aa917f195d5dd934964b5f37c8e7 Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Tue, 9 Sep 2025 19:50:21 +0200 Subject: [PATCH 10/11] Refactor StructureView and Overview components for improved readability; remove unused sorting logic and adjust layout styles --- .../components/Contents/Overview.tsx | 6 ++-- .../components/Contents/StructureView.tsx | 14 ++------- .../components/Header/Pagination.tsx | 30 +++++++++++-------- 3 files changed, 23 insertions(+), 27 deletions(-) diff --git a/src/dashboardWebView/components/Contents/Overview.tsx b/src/dashboardWebView/components/Contents/Overview.tsx index 45dbedd1..7e7d4c2f 100644 --- a/src/dashboardWebView/components/Contents/Overview.tsx +++ b/src/dashboardWebView/components/Contents/Overview.tsx @@ -146,10 +146,10 @@ export const Overview: React.FunctionComponent = ({ /> {settings && settings?.contentFolders?.length > 0 ? (

{localize(LocalizationKey.dashboardContentsOverviewNoMarkdown)}

- + ) : (

{localize(LocalizationKey.dashboardContentsOverviewNoFolders)}

- + )} @@ -202,7 +202,7 @@ export const Overview: React.FunctionComponent = ({

{localize(LocalizationKey.dashboardContentsOverviewPinned)} - +

{pinnedPages.map((page, idx) => ( diff --git a/src/dashboardWebView/components/Contents/StructureView.tsx b/src/dashboardWebView/components/Contents/StructureView.tsx index 30b9c083..b73cc15c 100644 --- a/src/dashboardWebView/components/Contents/StructureView.tsx +++ b/src/dashboardWebView/components/Contents/StructureView.tsx @@ -20,7 +20,6 @@ interface FolderNode { export const StructureView: React.FunctionComponent = ({ pages }: React.PropsWithChildren) => { - const folderTree = useMemo(() => { const root: FolderNode = { name: '', @@ -125,15 +124,6 @@ export const StructureView: React.FunctionComponent = ({ } } - // Sort folders and pages - const sortNode = (node: FolderNode) => { - node.children.sort((a, b) => a.name.localeCompare(b.name)); - node.pages.sort((a, b) => a.title.localeCompare(b.title)); - node.children.forEach(sortNode); - }; - - sortNode(root); - return root; }, [pages]); @@ -150,13 +140,13 @@ export const StructureView: React.FunctionComponent = ({ if (isRoot) { // For root node, render children and pages directly return ( -
+
{/* Root level folders */} {node.children.map(child => renderFolderNode(child, depth + 1))} {/* Root level pages */} {node.pages.length > 0 && ( -
+

Root Files

diff --git a/src/dashboardWebView/components/Header/Pagination.tsx b/src/dashboardWebView/components/Header/Pagination.tsx index 5a68be1a..d044f11d 100644 --- a/src/dashboardWebView/components/Header/Pagination.tsx +++ b/src/dashboardWebView/components/Header/Pagination.tsx @@ -2,10 +2,11 @@ import * as React from 'react'; import { useCallback, useEffect, useMemo } from 'react'; import { useRecoilState, useRecoilValue } from 'recoil'; import usePagination from '../../hooks/usePagination'; -import { MediaTotalSelector, PageAtom, SettingsAtom } from '../../state'; +import { MediaTotalSelector, PageAtom, SettingsAtom, ViewSelector } from '../../state'; import { PaginationButton } from './PaginationButton'; import * as l10n from '@vscode/l10n'; import { LocalizationKey } from '../../../localization'; +import { DashboardViewType } from '../../models'; export interface IPaginationProps { totalPages?: number; @@ -17,6 +18,7 @@ export const Pagination: React.FunctionComponent = ({ const [page, setPage] = useRecoilState(PageAtom); const totalMedia = useRecoilValue(MediaTotalSelector); const settings = useRecoilValue(SettingsAtom); + const view = useRecoilValue(ViewSelector); const { pageSetNr, totalPagesNr } = usePagination( settings?.dashboardState.contents.pagination, totalPages, @@ -33,17 +35,17 @@ export const Pagination: React.FunctionComponent = ({ if (i >= 0 && i <= totalPagesNr) { buttons.push( + key={i} + disabled={i === page} + onClick={() => { + setPage(i); + }} + className={`max-h-8 rounded ${page === i + ? `px-2 bg-[var(--vscode-list-activeSelectionBackground)] text-[var(--vscode-list-activeSelectionForeground)]` + : `text-[var(--vscode-editor-foreground)] hover:text-[var(--vscode-list-activeSelectionForeground)]`}`} + > + {i + 1} + ); } } @@ -58,6 +60,10 @@ export const Pagination: React.FunctionComponent = ({ setPage(0); }, []); + if (view === DashboardViewType.Structure) { + return null; + } + return (
Date: Tue, 9 Sep 2025 19:52:33 +0200 Subject: [PATCH 11/11] Enhancement: Dashboard "Structure" for Docs Fixes #937 --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d8260315..18ffe3b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ### 🎨 Enhancements +- [#937](https://github.com/estruyf/vscode-front-matter/issues/937): Dashboard "Structure" view for documentation sites - [#965](https://github.com/estruyf/vscode-front-matter/issues/965): Added SEO support for the keyword in the first paragraph - [#973](https://github.com/estruyf/vscode-front-matter/issues/973): Support for number fields in the snippets