feat(context-menu): add page context menu for copy/view Markdown (#908)
* feat(context-menu): implement page context menu for copy Markdown - Added a context menu to Markdown pages allowing users to copy content as Markdown or view it in a new tab. - Introduced new layout files for Markdown rendering and updated existing layouts to include the context menu. - Enhanced configuration options to enable or disable the context menu globally or per page. - Updated internationalization files to support new context menu actions. - Improved documentation to guide users on the new features and their usage. * feat(context-menu): enhance dropdown positioning and responsiveness - Updated the context menu dropdown to use responsive positioning classes for better alignment on different screen sizes. - Added new CSS classes to ensure the dropdown appears correctly on smaller devices, improving user experience. * refactor(context-menu): adjust button styles for improved layout and usability - Modified button classes in the page context menu to enhance spacing and alignment. - Reduced padding and gap sizes for a more compact design, improving overall user experience. * refactor(styles): update CSS classes for improved layout and consistency - Removed outdated ring classes and adjusted padding and border styles in various components for a cleaner design. - Enhanced hover effects and gap sizes for better user experience across language switcher, navbar, and theme toggle elements. - Standardized rounded styles to maintain visual consistency throughout the interface. * feat(context-menu): add custom links to page context menu - Introduced new configuration options for custom links in the page context menu, allowing users to open documentation in ChatGPT and Claude. - Updated the context menu layout to include a separator and display the new links with appropriate styling. - Enhanced the CSS classes for better visual integration with existing context menu elements. * feat(icons): add new AI icons and update context menu links - Introduced new icons for AI tools including ChatGPT, Claude, Gemini, and others in the icons.yaml file. - Enhanced the page context menu in multiple languages to include links for opening documentation in ChatGPT and Claude, improving user accessibility to AI resources. - Updated internationalization files to reflect new context menu options and additional copy functionalities. * refactor(layouts): simplify page structure in glossary and section layouts - Removed the conditional rendering of page links in the glossary and section layouts to streamline the markup. - Adjusted the blog and docs list layouts to ensure consistent closing of HTML tags and improved formatting. * feat(context-menu): add outbound icons to external links Add arrow-up-right icons to "View as Markdown" and custom links in the page context menu to indicate they open in new tabs. * Revert "feat(context-menu): add outbound icons to external links" This reverts commit 670175e200f091ed89b15bd16f44a585355db57d. * chore: rebuild css * chore: update stats json * chore: rename project and update context menu structure - Changed project name from "wizardly-wing" to "hextra" in package-lock.json. - Refactored context menu structure in hugo.yaml to improve organization and consistency across multiple languages. - Updated context menu links to ensure proper functionality and accessibility. * feat(context-menu): enhance clipboard functionality and pre-fetching - Implemented pre-fetching of markdown content for copy buttons to improve performance and avoid clipboard access issues in Safari. - Updated click event handlers to utilize cached content for clipboard operations, with a fallback to fetch content if not pre-fetched. - Added checks to ensure elements exist before performing actions, enhancing robustness of the context menu interactions. * fix(context-menu): improve hover effects and border styles - Enhanced the context menu's border styles with transition effects for better visual feedback on hover. - Updated CSS classes to ensure consistent styling across different themes, improving user experience. * feat(context-menu): add page context menu functionality across multiple languages - Introduced a page context menu that allows users to copy content as Markdown or view the raw Markdown source, enhancing usability for documentation sites. - Added configuration options to enable the context menu globally and control it on a per-page basis. - Implemented support for custom links in the context menu, allowing integration with external services. - Updated documentation in Persian, Japanese, Chinese, and English to reflect these new features. * fix(icons): update SVG definitions for Gemini and add fill attribute - Updated the SVG definition for the Gemini icon to include the 'fill' attribute for better rendering. - Ensured consistency in the SVG structure for the Gemini icon while maintaining the existing definitions for ChatGPT and Claude. * chore: rebuild css * chore: remove Claude links from context menu in multiple languages - Removed the "Open in Claude" option from the context menu for Persian, Japanese, and Simplified Chinese languages to streamline the user experience. * fix(context-menu): update cursor styles for buttons in context menu - Changed cursor style from default to pointer for buttons in the page context menu to enhance user interaction feedback.
This commit is contained in:
85
layouts/_partials/components/page-context-menu.html
Normal file
85
layouts/_partials/components/page-context-menu.html
Normal file
@@ -0,0 +1,85 @@
|
||||
{{- $enableGlobal := site.Params.page.contextMenu.enable | default false -}}
|
||||
{{- $enablePage := .Params.contextMenu -}}
|
||||
{{- $enable := cond (ne $enablePage nil) $enablePage $enableGlobal -}}
|
||||
{{- $customLinks := site.Params.page.contextMenu.links | default slice -}}
|
||||
|
||||
{{- if $enable -}}
|
||||
{{- with .OutputFormats.Get "markdown" -}}
|
||||
{{- $markdownURL := .Permalink -}}
|
||||
{{- $pageURL := $.Permalink -}}
|
||||
{{- $pageTitle := $.Title -}}
|
||||
<div class="hextra-page-context-menu hx:relative hx:inline-flex hx:shrink-0">
|
||||
<div class="hx:inline-flex hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:transition-colors hx:hover:border-gray-300 hx:dark:border-neutral-800 hx:dark:hover:border-neutral-700">
|
||||
<button
|
||||
class="hextra-page-context-menu-copy hx:group/copybtn hx:inline-flex hx:cursor-pointer hx:items-center hx:gap-1.5 hx:bg-transparent hx:px-2.5 hx:py-1 hx:text-sm hx:font-medium hx:text-gray-700 hx:transition-colors hx:hover:bg-slate-50 hx:dark:text-gray-300 hx:dark:hover:bg-neutral-900"
|
||||
data-url="{{ $markdownURL }}"
|
||||
title="{{ i18n "copyAsMarkdown" }}"
|
||||
aria-label="{{ i18n "copyAsMarkdown" }}"
|
||||
>
|
||||
<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:size-4">
|
||||
{{- partial "utils/icon.html" (dict "name" "copy" "attributes" "height=16 width=16") -}}
|
||||
</div>
|
||||
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:size-4">
|
||||
{{- partial "utils/icon.html" (dict "name" "check" "attributes" "height=16 width=16") -}}
|
||||
</div>
|
||||
<span>{{ i18n "copyPage" }}</span>
|
||||
</button>
|
||||
<button
|
||||
class="hextra-page-context-menu-toggle hx:inline-flex hx:cursor-pointer hx:items-center hx:justify-center hx:bg-transparent hx:px-1.5 hx:py-1 hx:text-gray-500 hx:transition-colors hx:hover:bg-slate-50 hx:hover:text-gray-700 hx:dark:text-gray-400 hx:dark:hover:bg-neutral-900 hx:dark:hover:text-gray-300"
|
||||
data-state="closed"
|
||||
aria-label="Toggle page context menu"
|
||||
>
|
||||
<div class="hx:size-4 hx:transition-transform hx:duration-200" data-chevron>
|
||||
{{- partial "utils/icon.html" (dict "name" "chevron-down" "attributes" "height=16 width=16") -}}
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
<ul class="hextra-page-context-menu-dropdown not-prose hx:hidden hx:absolute hx:top-full hx:left-0 hx:sm:left-auto hx:sm:right-0 hx:mt-1 hx:z-20 hx:max-h-64 hx:overflow-auto hx:rounded-lg hx:border hx:border-gray-200 hx:bg-white hx:p-1 hx:text-sm hx:shadow-lg hx:dark:border-neutral-700 hx:dark:bg-neutral-900">
|
||||
<li>
|
||||
<button
|
||||
data-action="copy"
|
||||
class="hx:flex hx:w-full hx:cursor-pointer hx:select-none hx:items-center hx:gap-2 hx:whitespace-nowrap hx:rounded-sm hx:px-2 hx:py-1.5 hx:text-sm hx:text-gray-700 hx:outline-none hx:transition-colors hx:hover:bg-gray-100 hx:hover:text-gray-900 hx:dark:text-gray-300 hx:dark:hover:bg-neutral-800 hx:dark:hover:text-gray-100"
|
||||
>
|
||||
<div class="hx:size-4 hx:shrink-0 hx:text-gray-500 hx:dark:text-gray-400">
|
||||
{{- partial "utils/icon.html" (dict "name" "copy" "attributes" "height=16 width=16") -}}
|
||||
</div>
|
||||
{{ i18n "copyAsMarkdown" }}
|
||||
</button>
|
||||
</li>
|
||||
<li>
|
||||
<button
|
||||
data-action="view"
|
||||
data-url="{{ $markdownURL }}"
|
||||
class="hx:flex hx:w-full hx:cursor-pointer hx:select-none hx:items-center hx:gap-2 hx:whitespace-nowrap hx:rounded-sm hx:px-2 hx:py-1.5 hx:text-sm hx:text-gray-700 hx:outline-none hx:transition-colors hx:hover:bg-gray-100 hx:hover:text-gray-900 hx:dark:text-gray-300 hx:dark:hover:bg-neutral-800 hx:dark:hover:text-gray-100"
|
||||
>
|
||||
<div class="hx:size-4 hx:shrink-0 hx:text-gray-500 hx:dark:text-gray-400">
|
||||
{{- partial "utils/icon.html" (dict "name" "markdown" "attributes" "height=16 width=16") -}}
|
||||
</div>
|
||||
{{ i18n "viewAsMarkdown" }}
|
||||
</button>
|
||||
</li>
|
||||
{{- if $customLinks -}}
|
||||
<li class="hx:my-1 hx:h-px hx:bg-gray-200 hx:dark:bg-neutral-700" role="separator"></li>
|
||||
{{- range $customLinks -}}
|
||||
{{- $linkURL := partial "utils/template-url.html" (dict "template" .url "values" (dict "url" $pageURL "title" $pageTitle "markdown_url" $markdownURL)) -}}
|
||||
<li>
|
||||
<a
|
||||
href="{{ $linkURL }}"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="hx:flex hx:w-full hx:cursor-pointer hx:select-none hx:items-center hx:gap-2 hx:whitespace-nowrap hx:rounded-sm hx:px-2 hx:py-1.5 hx:text-sm hx:text-gray-700 hx:outline-none hx:transition-colors hx:hover:bg-gray-100 hx:hover:text-gray-900 hx:dark:text-gray-300 hx:dark:hover:bg-neutral-800 hx:dark:hover:text-gray-100"
|
||||
>
|
||||
{{- with .icon -}}
|
||||
<div class="hx:size-4 hx:shrink-0 hx:text-gray-500 hx:dark:text-gray-400">
|
||||
{{- partial "utils/icon.html" (dict "name" . "attributes" "height=16 width=16") -}}
|
||||
</div>
|
||||
{{- end -}}
|
||||
{{ .name }}
|
||||
</a>
|
||||
</li>
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
</ul>
|
||||
</div>
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
@@ -26,7 +26,7 @@
|
||||
</div>
|
||||
</button>
|
||||
<ul
|
||||
class="hextra-language-options hx:hidden hx:z-20 hx:max-h-64 hx:overflow-auto hx:rounded-md hx:ring-1 hx:ring-black/5 hx:bg-white hx:py-1 hx:text-sm hx:shadow-lg hx:dark:ring-white/20 hx:dark:bg-neutral-800"
|
||||
class="hextra-language-options hx:hidden hx:z-20 hx:max-h-64 hx:overflow-auto hx:rounded-lg hx:border hx:border-gray-200 hx:bg-white hx:p-1 hx:text-sm hx:shadow-lg hx:dark:border-neutral-700 hx:dark:bg-neutral-900"
|
||||
style="position: fixed; inset: auto auto 0px 0px; margin: 0px; min-width: 100px;"
|
||||
>
|
||||
{{ range site.Languages }}
|
||||
@@ -34,7 +34,7 @@
|
||||
<li class="hx:flex hx:flex-col">
|
||||
<a
|
||||
href="{{ $link }}"
|
||||
class="hx:text-gray-800 hx:dark:text-gray-100 hx:hover:bg-primary-50 hx:hover:text-primary-600 hx:hover:dark:bg-primary-500/10 hx:hover:dark:text-primary-600 hx:relative hx:cursor-pointer hx:whitespace-nowrap hx:py-1.5 hx:transition-colors hx:ltr:pl-3 hx:ltr:pr-9 hx:rtl:pr-3 hx:rtl:pl-9"
|
||||
class="hx:text-gray-700 hx:dark:text-gray-300 hx:hover:bg-gray-100 hx:hover:text-gray-900 hx:dark:hover:bg-neutral-800 hx:dark:hover:text-gray-100 hx:relative hx:cursor-pointer hx:whitespace-nowrap hx:rounded-sm hx:py-1.5 hx:transition-colors hx:ltr:pl-3 hx:ltr:pr-9 hx:rtl:pr-3 hx:rtl:pl-9"
|
||||
>
|
||||
{{- .LanguageName -}}
|
||||
{{- if eq .LanguageName site.Language.LanguageName -}}
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
{{- partial "utils/icon.html" (dict "name" "chevron-down" "attributes" "height=12 class=\"hx:transition-transform hx:duration-200 hx:ease-in-out\"") -}}
|
||||
</button>
|
||||
<ul
|
||||
class="hextra-nav-menu-items hx:hidden hx:z-20 hx:max-h-64 hx:overflow-auto hx:rounded-md hx:ring-1 hx:ring-black/5 hx:bg-white hx:py-1 hx:text-sm hx:shadow-lg hx:dark:ring-white/20 hx:dark:bg-neutral-800"
|
||||
class="hextra-nav-menu-items hx:hidden hx:z-20 hx:max-h-64 hx:overflow-auto hx:rounded-lg hx:border hx:border-gray-200 hx:bg-white hx:p-1 hx:text-sm hx:shadow-lg hx:dark:border-neutral-700 hx:dark:bg-neutral-900"
|
||||
style="min-width: 100px;"
|
||||
>
|
||||
{{ range $item.Children }}
|
||||
@@ -43,7 +43,7 @@
|
||||
<a
|
||||
href="{{ $link }}"
|
||||
{{ if $external }}target="_blank" rel="noreferrer"{{ end }}
|
||||
class="hx:text-gray-600 hx:hover:text-gray-800 hx:dark:text-gray-400 hx:dark:hover:text-gray-200 hx:relative hx:cursor-pointer hx:whitespace-nowrap hx:py-1.5 hx:transition-colors hx:ltr:pl-3 hx:ltr:pr-9 hx:rtl:pr-3 hx:rtl:pl-9 hx:flex hx:items-center hx:gap-1"
|
||||
class="hx:text-gray-600 hx:hover:text-gray-800 hx:dark:text-gray-400 hx:dark:hover:text-gray-200 hx:relative hx:cursor-pointer hx:whitespace-nowrap hx:rounded-sm hx:py-1.5 hx:transition-colors hx:ltr:pl-3 hx:ltr:pr-9 hx:rtl:pr-3 hx:rtl:pl-9 hx:flex hx:items-center hx:gap-1 hx:hover:bg-gray-100 hx:dark:hover:bg-neutral-800"
|
||||
>
|
||||
{{- if and (eq .Params.type "link") .Params.icon -}}
|
||||
<span class="hx:inline-flex hx:items-center">
|
||||
|
||||
@@ -27,14 +27,14 @@
|
||||
</div>
|
||||
</button>
|
||||
<ul
|
||||
class="hextra-theme-toggle-options hx:hidden hx:z-20 hx:max-h-64 hx:overflow-auto hx:rounded-md hx:ring-1 hx:ring-black/5 hx:bg-white hx:py-1 hx:text-sm hx:shadow-lg hx:dark:ring-white/20 hx:dark:bg-neutral-800"
|
||||
class="hextra-theme-toggle-options hx:hidden hx:z-20 hx:max-h-64 hx:overflow-auto hx:rounded-lg hx:border hx:border-gray-200 hx:bg-white hx:p-1 hx:text-sm hx:shadow-lg hx:dark:border-neutral-700 hx:dark:bg-neutral-900"
|
||||
style="position: fixed; inset: auto auto 0px 0px; margin: 0px; min-width: 100px;"
|
||||
data-theme="light"
|
||||
>
|
||||
<li class="hx:flex hx:flex-col">
|
||||
<p
|
||||
data-item="light"
|
||||
class="hx:text-gray-800 hx:dark:text-gray-100 hx:hover:bg-primary-50 hx:hover:text-primary-600 hx:hover:dark:bg-primary-500/10 hx:hover:dark:text-primary-600 hx:relative hx:cursor-pointer hx:whitespace-nowrap hx:py-1.5 hx:transition-colors hx:ltr:pl-3 hx:ltr:pr-9 hx:rtl:pr-3 hx:rtl:pl-9"
|
||||
class="hx:text-gray-700 hx:dark:text-gray-300 hx:hover:bg-gray-100 hx:hover:text-gray-900 hx:dark:hover:bg-neutral-800 hx:dark:hover:text-gray-100 hx:relative hx:cursor-pointer hx:whitespace-nowrap hx:rounded-sm hx:py-1.5 hx:transition-colors hx:ltr:pl-3 hx:ltr:pr-9 hx:rtl:pr-3 hx:rtl:pl-9"
|
||||
>
|
||||
{{ $light }}
|
||||
<span class="hx:absolute hx:inset-y-0 hx:flex hx:items-center hx:ltr:right-3 hx:rtl:left-3 hx:group-data-[theme=dark]:hidden hx:group-data-[theme=system]:hidden">
|
||||
@@ -45,7 +45,7 @@
|
||||
<li class="hx:flex hx:flex-col">
|
||||
<p
|
||||
data-item="dark"
|
||||
class="hx:text-gray-800 hx:dark:text-gray-100 hx:hover:bg-primary-50 hx:hover:text-primary-600 hx:hover:dark:bg-primary-500/10 hx:hover:dark:text-primary-600 hx:relative hx:cursor-pointer hx:whitespace-nowrap hx:py-1.5 hx:transition-colors hx:ltr:pl-3 hx:ltr:pr-9 hx:rtl:pr-3 hx:rtl:pl-9"
|
||||
class="hx:text-gray-700 hx:dark:text-gray-300 hx:hover:bg-gray-100 hx:hover:text-gray-900 hx:dark:hover:bg-neutral-800 hx:dark:hover:text-gray-100 hx:relative hx:cursor-pointer hx:whitespace-nowrap hx:rounded-sm hx:py-1.5 hx:transition-colors hx:ltr:pl-3 hx:ltr:pr-9 hx:rtl:pr-3 hx:rtl:pl-9"
|
||||
>
|
||||
{{ $dark }}
|
||||
<span class="hx:absolute hx:inset-y-0 hx:flex hx:items-center hx:ltr:right-3 hx:rtl:left-3 hx:group-data-[theme=light]:hidden hx:group-data-[theme=system]:hidden">
|
||||
@@ -56,7 +56,7 @@
|
||||
<li class="hx:flex hx:flex-col">
|
||||
<p
|
||||
data-item="system"
|
||||
class="hx:text-gray-800 hx:dark:text-gray-100 hx:hover:bg-primary-50 hx:hover:text-primary-600 hx:hover:dark:bg-primary-500/10 hx:hover:dark:text-primary-600 hx:relative hx:cursor-pointer hx:whitespace-nowrap hx:py-1.5 hx:transition-colors hx:ltr:pl-3 hx:ltr:pr-9 hx:rtl:pr-3 hx:rtl:pl-9"
|
||||
class="hx:text-gray-700 hx:dark:text-gray-300 hx:hover:bg-gray-100 hx:hover:text-gray-900 hx:dark:hover:bg-neutral-800 hx:dark:hover:text-gray-100 hx:relative hx:cursor-pointer hx:whitespace-nowrap hx:rounded-sm hx:py-1.5 hx:transition-colors hx:ltr:pl-3 hx:ltr:pr-9 hx:rtl:pr-3 hx:rtl:pl-9"
|
||||
>
|
||||
{{ $system }}
|
||||
<span class="hx:absolute hx:inset-y-0 hx:flex hx:items-center hx:ltr:right-3 hx:rtl:left-3 hx:group-data-[theme=dark]:hidden hx:group-data-[theme=light]:hidden">
|
||||
|
||||
18
layouts/_partials/utils/template-url.html
Normal file
18
layouts/_partials/utils/template-url.html
Normal file
@@ -0,0 +1,18 @@
|
||||
{{/*
|
||||
This utility replaces placeholders in a URL template string.
|
||||
|
||||
Usage:
|
||||
{{ partial "utils/template-url.html" (dict "template" .url "values" (dict "url" $pageURL "title" $pageTitle "markdown_url" $markdownURL)) }}
|
||||
|
||||
Placeholders use the format {key} and values are URL-encoded automatically.
|
||||
*/}}
|
||||
{{- $template := .template -}}
|
||||
{{- $values := .values | default dict -}}
|
||||
|
||||
{{- range $key, $value := $values -}}
|
||||
{{- $placeholder := printf "{%s}" $key -}}
|
||||
{{- $encoded := $value | urlquery -}}
|
||||
{{- $template = replace $template $placeholder $encoded -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- return $template -}}
|
||||
@@ -28,7 +28,7 @@
|
||||
<p class="hx:opacity-50 hx:text-sm hx:mt-4 hx:leading-7">{{ partial "utils/format-date" .Date }}</p>
|
||||
</div>
|
||||
{{ end -}}
|
||||
|
||||
|
||||
{{- if gt $paginator.TotalPages 1 -}}
|
||||
{{ partial "components/blog-pager.html" $paginator }}
|
||||
{{- end -}}
|
||||
@@ -36,4 +36,4 @@
|
||||
</article>
|
||||
<div class="hx:max-xl:hidden hx:h-0 hx:w-64 hx:shrink-0"></div>
|
||||
</div>
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
@@ -5,7 +5,12 @@
|
||||
<article class="hx:w-full hx:break-words hx:flex hx:min-h-[calc(100vh-var(--navbar-height))] hx:min-w-0 hx:justify-center hx:pb-8 hx:pr-[calc(env(safe-area-inset-right)-1.5rem)]">
|
||||
<main class="hx:w-full hx:min-w-0 hx:max-w-6xl hx:px-6 hx:pt-4 hx:md:px-12">
|
||||
{{ partial "breadcrumb.html" (dict "page" . "enable" true) }}
|
||||
{{ if .Title }}<h1 class="hx:mt-2 hx:text-4xl hx:font-bold hx:tracking-tight hx:text-slate-900 hx:dark:text-slate-100">{{ .Title }}</h1>{{ end }}
|
||||
{{ if .Title }}
|
||||
<div class="hx:flex hx:flex-col hx:sm:flex-row hx:items-start hx:sm:items-center hx:sm:justify-between hx:gap-4 hx:mt-2">
|
||||
<h1 class="hx:mb-0 hx:text-4xl hx:font-bold hx:tracking-tight hx:text-slate-900 hx:dark:text-slate-100">{{ .Title }}</h1>
|
||||
{{ partial "components/page-context-menu" . }}
|
||||
</div>
|
||||
{{ end }}
|
||||
<div class="hx:mt-4 hx:mb-16 hx:text-gray-500 hx:dark:text-gray-400 hx:text-sm hx:flex hx:items-center hx:flex-wrap hx:gap-y-2">
|
||||
{{- with $date := .Date }}<span class="hx:mr-1">{{ partial "utils/format-date" $date }}</span>{{ end -}}
|
||||
{{- $lazyLoading := site.Params.enableImageLazyLoading | default true -}}
|
||||
|
||||
@@ -6,7 +6,12 @@
|
||||
<main class="hx:w-full hx:min-w-0 hx:max-w-6xl hx:px-6 hx:pt-4 hx:md:px-12">
|
||||
{{ partial "breadcrumb.html" (dict "page" . "enable" true) }}
|
||||
<div class="content">
|
||||
{{ if .Title }}<h1>{{ .Title }}</h1>{{ end }}
|
||||
{{ if .Title }}
|
||||
<div class="hx:flex hx:flex-col hx:sm:flex-row hx:items-start hx:sm:items-center hx:sm:justify-between hx:gap-4 hx:mb-4">
|
||||
<h1 class="hx:mb-0">{{ .Title }}</h1>
|
||||
{{ partial "components/page-context-menu" . }}
|
||||
</div>
|
||||
{{ end }}
|
||||
{{ .Content }}
|
||||
</div>
|
||||
{{ partial "components/last-updated.html" . }}
|
||||
@@ -15,4 +20,4 @@
|
||||
</main>
|
||||
</article>
|
||||
</div>
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
|
||||
@@ -6,7 +6,12 @@
|
||||
<main class="hx:w-full hx:min-w-0 hx:max-w-6xl hx:px-6 hx:pt-4 hx:md:px-12">
|
||||
{{ partial "breadcrumb.html" (dict "page" . "enable" true) }}
|
||||
<div class="content">
|
||||
{{ if .Title }}<h1>{{ .Title }}</h1>{{ end }}
|
||||
{{ if .Title }}
|
||||
<div class="hx:flex hx:flex-col hx:sm:flex-row hx:items-start hx:sm:items-center hx:sm:justify-between hx:gap-4 hx:mb-4">
|
||||
<h1 class="hx:mb-0">{{ .Title }}</h1>
|
||||
{{ partial "components/page-context-menu" . }}
|
||||
</div>
|
||||
{{ end }}
|
||||
{{ .Content }}
|
||||
</div>
|
||||
{{ partial "components/last-updated.html" . }}
|
||||
|
||||
3
layouts/glossary.markdown.md
Normal file
3
layouts/glossary.markdown.md
Normal file
@@ -0,0 +1,3 @@
|
||||
{{- .Title | replaceRE "\n" " " | printf "# %s" -}}
|
||||
|
||||
{{ .RawContent }}
|
||||
3
layouts/page.markdown.md
Normal file
3
layouts/page.markdown.md
Normal file
@@ -0,0 +1,3 @@
|
||||
{{- .Title | replaceRE "\n" " " | printf "# %s" -}}
|
||||
|
||||
{{ .RawContent }}
|
||||
3
layouts/section.markdown.md
Normal file
3
layouts/section.markdown.md
Normal file
@@ -0,0 +1,3 @@
|
||||
{{- .Title | replaceRE "\n" " " | printf "# %s" -}}
|
||||
|
||||
{{ .RawContent }}
|
||||
3
layouts/wide.markdown.md
Normal file
3
layouts/wide.markdown.md
Normal file
@@ -0,0 +1,3 @@
|
||||
{{- .Title | replaceRE "\n" " " | printf "# %s" -}}
|
||||
|
||||
{{ .RawContent }}
|
||||
Reference in New Issue
Block a user