@signalwire/docusaurus-theme-llms-txt
Version:
Docusaurus theme components for llms-txt plugin including CopyPageButton
304 lines (237 loc) • 9.14 kB
Markdown
> Docusaurus theme components for the llms-txt plugin, featuring a customizable copy page button
> with AI integration.
This theme package provides React components and styling for the
`@signalwire/docusaurus-plugin-llms-txt` plugin, including a sophisticated copy page button that
allows users to copy content or share it with AI tools like ChatGPT and Claude.
```bash
npm install @signalwire/docusaurus-theme-llms-txt
yarn add @signalwire/docusaurus-theme-llms-txt
```
Add the theme to your Docusaurus configuration:
```js
// docusaurus.config.js
export default {
// ... other config
themes: ['@signalwire/docusaurus-theme-llms-txt'],
plugins: [
[
'@signalwire/docusaurus-plugin-llms-txt',
{
copyPageButton: {
buttonLabel: 'Copy Page',
actions: {
markdown: true,
ai: {
chatGPT: true,
claude: true,
},
},
},
},
],
],
};
```
The main component that provides copy and AI sharing functionality. It automatically integrates with
your content pages.
**Features:**
- Copy raw markdown content
- Share content with ChatGPT or Claude AI
- Dropdown menu with configurable actions
- Success feedback with animations
- Full keyboard accessibility
- Responsive design (desktop dropdown, mobile FAB)
## CSS Customization
The theme uses CSS variables for comprehensive styling control. You can customize the appearance
without swizzling by overriding CSS variables in your custom stylesheet.
### Available CSS Variables
```css
/* Add to your custom CSS file */
.copyButton {
/* Core Button Colors */
--llms-copy-bg: transparent; /* Button background */
--llms-copy-bg-hover: rgba(0, 0, 0, 0.03); /* Button hover background */
--llms-copy-bg-active: rgba(0, 0, 0, 0.06); /* Button active background */
--llms-copy-text: var(--ifm-font-color-base); /* Button text color */
--llms-copy-text-secondary: var(--ifm-color-emphasis-600); /* Secondary text */
--llms-copy-border: rgba(0, 0, 0, 0.08); /* Button border color */
/* Layout & Spacing */
--llms-copy-padding: 9px 12px; /* Button padding */
--llms-copy-gap: 7px; /* Gap between elements */
--llms-copy-font-size: 13px; /* Button text size */
--llms-copy-font-size-dropdown: 14px; /* Dropdown text size */
--llms-copy-button-margin-left: 16px; /* Button left margin */
--llms-copy-button-margin-bottom: 8px; /* Button bottom margin */
/* Menu Item Styles */
--llms-copy-menu-item-padding: 12px 16px; /* Menu item padding */
--llms-copy-menu-item-gap: 12px; /* Gap between menu item elements */
--llms-copy-menu-item-border-radius: 8px; /* Menu item border radius */
/* Icon Styles */
--llms-copy-icon-size: 16px; /* Main icon size */
--llms-copy-arrow-icon-size: 12px; /* Dropdown arrow size */
--llms-copy-icon-container-size: 32px; /* Icon container size */
--llms-copy-icon-container-bg: rgba(0, 0, 0, 0.06); /* Icon container background */
--llms-copy-icon-container-border-radius: 6px; /* Icon container border radius */
/* Typography */
--llms-copy-font-weight: 400; /* Button font weight */
--llms-copy-label-weight: 500; /* Menu label font weight */
--llms-copy-font-size-description: 0.88em; /* Description font size */
--llms-copy-description-color: var(--ifm-color-emphasis-600); /* Description color */
--llms-copy-description-line-height: 1.3; /* Description line height */
--llms-copy-description-gap: 3px; /* Description gap */
/* Border & Shape */
--llms-copy-radius: 8px; /* Border radius */
--llms-copy-border-width: 1px; /* Border width */
--llms-copy-shadow: none; /* Button shadow */
--llms-copy-shadow-hover: 0 1px 2px rgba(0, 0, 0, 0.05); /* Hover shadow */
/* Dropdown Menu */
--llms-copy-dropdown-bg: var(--ifm-background-surface-color); /* Dropdown background */
--llms-copy-dropdown-text: var(--ifm-font-color-base); /* Dropdown text */
--llms-copy-dropdown-hover: var(--ifm-hover-overlay); /* Dropdown hover */
--llms-copy-dropdown-border: var(--ifm-color-emphasis-300); /* Dropdown border */
--llms-copy-dropdown-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); /* Dropdown shadow */
--llms-copy-dropdown-width: 280px; /* Dropdown width */
--llms-copy-dropdown-offset: 8px; /* Dropdown vertical offset */
--llms-copy-dropdown-initial-transform: -10px; /* Dropdown initial transform */
--llms-copy-dropdown-z-index: 1000; /* Dropdown stacking */
/* Animation & Transitions */
--llms-copy-transition: all 0.15s ease; /* General transition timing */
--llms-copy-animation-duration: 0.3s; /* Success animation duration */
--llms-copy-animation-timing: ease; /* Animation timing function */
--llms-copy-arrow-transition: transform 0.2s ease; /* Arrow icon transition */
--llms-copy-menuitem-transition: background-color 0.15s ease; /* Menu item transition */
/* States & Interactions */
--llms-copy-disabled-opacity: 0.6; /* Disabled state opacity */
--llms-copy-active-scale: 0.98; /* Active state scale */
--llms-copy-z-index: 10; /* Button stacking */
/* Loading Spinner */
--llms-copy-spinner-size: 16px; /* Spinner size */
--llms-copy-spinner-border-width: 2px; /* Spinner border width */
--llms-copy-spinner-animation-duration: 0.6s; /* Spinner animation duration */
}
```
```css
.copyButton {
--llms-copy-bg:
--llms-copy-bg-hover:
--llms-copy-text:
--llms-copy-border:
}
```
```css
.copyButton {
--llms-copy-padding: 12px 16px;
--llms-copy-font-size: 14px;
--llms-copy-icon-size: 18px;
--llms-copy-icon-container-size: 36px;
--llms-copy-menu-item-padding: 14px 18px;
}
```
```css
.copyButton {
--llms-copy-dropdown-width: 250px;
--llms-copy-dropdown-shadow: 0 8px 24px rgba(0, 0, 0, 0.2);
--llms-copy-dropdown-bg:
}
```
```css
[] .copyButton {
--llms-copy-bg: transparent;
--llms-copy-bg-hover: rgba(255, 255, 255, 0.03);
--llms-copy-bg-active: rgba(255, 255, 255, 0.06);
--llms-copy-border: rgba(255, 255, 255, 0.08);
--llms-copy-shadow-hover: 0 1px 2px rgba(0, 0, 0, 0.15);
--llms-copy-description-color: var(--ifm-color-emphasis-400);
--llms-copy-icon-container-bg: rgba(255, 255, 255, 0.08);
}
```
This theme provides swizzlable components for advanced customization. Use Docusaurus CLI to safely
customize components:
```bash
npx docusaurus swizzle @signalwire/docusaurus-theme-llms-txt CopyPageButton
npx docusaurus swizzle @signalwire/docusaurus-theme-llms-txt CopyPageButton --wrap
```
```bash
npx docusaurus swizzle @signalwire/docusaurus-theme-llms-txt DocItem/Content --wrap
```
After swizzling, you can customize the components:
```tsx
// src/theme/CopyPageButton/index.tsx
import React from 'react';
import OriginalCopyPageButton from '@theme-original/CopyPageButton';
export default function CopyPageButton(props) {
return (
<div className='my-custom-wrapper'>
<OriginalCopyPageButton {...props} />
<span className='my-custom-badge'>AI Ready</span>
</div>
);
}
```
Full TypeScript definitions are included:
```tsx
import type { Props as CopyPageButtonProps } from '@theme/CopyPageButton';
const CustomButton: React.FC<CopyPageButtonProps> = ({ className }) => {
// Your implementation
};
```
This theme automatically integrates with plugin configuration:
```js
// docusaurus.config.js - Plugin configuration affects theme behavior
{
copyPageButton: {
buttonLabel: 'Share Content',
actions: {
markdown: true,
ai: {
chatGPT: {
prompt: 'Help me understand this:'
},
claude: false // Disables Claude option
}
}
}
}
```
The components follow WCAG guidelines:
- Full keyboard navigation support
- ARIA attributes for screen readers
- Focus management for dropdowns
- High contrast support
- Reduced motion respect
- Modern browsers (Chrome, Firefox, Safari, Edge)
- Mobile browsers (iOS Safari, Chrome Mobile)
- Automatic graceful degradation
## Contributing
This package is part of the `@signalwire/docusaurus-plugins` monorepo. See the
[main repository](https://github.com/signalwire/docusaurus-plugins) for contribution guidelines.
## License
MIT © [SignalWire](https://signalwire.com)
---
**Related Packages:**
- [`@signalwire/docusaurus-plugin-llms-txt`](../docusaurus-plugin-llms-txt) - The main plugin
- [Docusaurus](https://docusaurus.io) - The static site generator