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:
Xin
2026-01-23 23:40:29 +00:00
committed by GitHub
parent e81447e7ae
commit fa8f8554ea
27 changed files with 612 additions and 23 deletions

View File

@@ -2,6 +2,7 @@
"htmlElements": {
"tags": [
"a",
"abbr",
"annotation",
"article",
"aside",
@@ -11,9 +12,12 @@
"button",
"cite",
"code",
"dd",
"del",
"details",
"div",
"dl",
"dt",
"em",
"figcaption",
"figure",
@@ -133,6 +137,10 @@
"hextra-nav-menu-item",
"hextra-nav-menu-items",
"hextra-nav-menu-toggle",
"hextra-page-context-menu",
"hextra-page-context-menu-copy",
"hextra-page-context-menu-dropdown",
"hextra-page-context-menu-toggle",
"hextra-pdf",
"hextra-scrollbar",
"hextra-search-input",
@@ -185,6 +193,7 @@
"hx:bg-clip-text",
"hx:bg-gradient-to-r",
"hx:bg-gray-100",
"hx:bg-gray-200",
"hx:bg-green-100",
"hx:bg-indigo-100",
"hx:bg-neutral-50",
@@ -258,6 +267,7 @@
"hx:dark:bg-gray-50/10",
"hx:dark:bg-green-900/30",
"hx:dark:bg-indigo-900/30",
"hx:dark:bg-neutral-700",
"hx:dark:bg-neutral-800",
"hx:dark:bg-neutral-900",
"hx:dark:bg-orange-400/20",
@@ -306,7 +316,6 @@
"hx:dark:hover:text-white",
"hx:dark:opacity-80",
"hx:dark:placeholder:text-gray-400",
"hx:dark:ring-white/20",
"hx:dark:shadow-[0_-12px_16px_#111]",
"hx:dark:shadow-[0_-1px_0_rgba(255,255,255,.1)_inset]",
"hx:dark:shadow-none",
@@ -358,6 +367,7 @@
"hx:font-semibold",
"hx:from-gray-900",
"hx:gap-1",
"hx:gap-1.5",
"hx:gap-2",
"hx:gap-4",
"hx:gap-x-1.5",
@@ -388,24 +398,23 @@
"hx:h-7",
"hx:h-[18px]",
"hx:h-full",
"hx:h-px",
"hx:hidden",
"hx:hover:bg-gray-100",
"hx:hover:bg-gray-800/5",
"hx:hover:bg-primary-50",
"hx:hover:bg-primary-700",
"hx:hover:bg-slate-50",
"hx:hover:border-gray-200",
"hx:hover:border-gray-300",
"hx:hover:border-gray-400",
"hx:hover:border-gray-900",
"hx:hover:dark:bg-primary-500/10",
"hx:hover:dark:text-primary-600",
"hx:hover:opacity-60",
"hx:hover:opacity-75",
"hx:hover:shadow-gray-100",
"hx:hover:shadow-lg",
"hx:hover:shadow-md",
"hx:hover:text-black",
"hx:hover:text-gray-700",
"hx:hover:text-gray-800",
"hx:hover:text-gray-900",
"hx:hover:text-primary-600",
@@ -427,6 +436,7 @@
"hx:leading-7",
"hx:leading-none",
"hx:leading-tight",
"hx:left-0",
"hx:left-[24px]",
"hx:left-[36px]",
"hx:lg:grid-cols-3",
@@ -472,6 +482,7 @@
"hx:max-w-[min(calc(100vw-2rem),calc(100%+20rem))]",
"hx:max-w-none",
"hx:max-xl:hidden",
"hx:mb-0",
"hx:mb-10",
"hx:mb-12",
"hx:mb-16",
@@ -516,9 +527,11 @@
"hx:mt-5",
"hx:mt-6",
"hx:mt-8",
"hx:mt-auto",
"hx:mx-1",
"hx:mx-4",
"hx:mx-auto",
"hx:my-1",
"hx:my-1.5",
"hx:my-2",
"hx:no-underline",
@@ -527,6 +540,7 @@
"hx:opacity-80",
"hx:order-last",
"hx:origin-center",
"hx:outline-none",
"hx:overflow-auto",
"hx:overflow-hidden",
"hx:overflow-x-auto",
@@ -574,8 +588,6 @@
"hx:py-4",
"hx:relative",
"hx:right-0",
"hx:ring-1",
"hx:ring-black/5",
"hx:rounded-3xl",
"hx:rounded-full",
"hx:rounded-lg",
@@ -620,10 +632,16 @@
"hx:shadow-xl",
"hx:shadow-xs",
"hx:shrink-0",
"hx:size-4",
"hx:sm:block",
"hx:sm:flex",
"hx:sm:flex-row",
"hx:sm:items-center",
"hx:sm:items-start",
"hx:sm:justify-between",
"hx:sm:left-auto",
"hx:sm:max-lg:grid-cols-2",
"hx:sm:right-0",
"hx:sm:text-xl",
"hx:sm:w-[110%]",
"hx:sr-only",
@@ -687,6 +705,7 @@
"hx:w-max",
"hx:w-screen",
"hx:whitespace-nowrap",
"hx:wrap-break-word",
"hx:xl:block",
"hx:xl:grid-cols-4",
"hx:z-20",