### Install Dependencies and Run Development Server
Source: https://github.com/nightsquawk/astrowind/blob/main/QUICK_START.md
Installs project dependencies using npm and starts the development server for the Astrowind project. This command is typically run after initial setup.
```bash
npm install
npm run dev
```
--------------------------------
### Run Astrowind Client Setup Scripts
Source: https://github.com/nightsquawk/astrowind/blob/main/QUICK_START.md
Executes the setup scripts for the Astrowind client. It provides commands for both Linux/Mac (bash) and Windows (powershell) environments.
```bash
# On Linux/Mac
bash .github/scripts/setup-client.sh
```
```powershell
# On Windows
powershell .github/scripts/setup-client.ps1
```
--------------------------------
### Install and Run AstroWind Project
Source: https://github.com/nightsquawk/astrowind/blob/main/README.md
This snippet guides users through cloning the repository, installing dependencies, setting up environment variables, and starting the development server. It requires Node.js 18.0.0+ and npm 9.0.0+.
```bash
git clone https://github.com/NightSquawk/astrowind.git
cd astrowind
npm install
cp .env.example .env
# Edit .env with your configuration
npm run dev
```
--------------------------------
### Astro Component Usage Example
Source: https://github.com/nightsquawk/astrowind/blob/main/QUICK_START.md
Demonstrates how to import and use UI components like 'Button' and 'Features' within an Astro file. This shows basic component integration.
```astro
---
import Button from '~/components/ui/Button.astro';
import Features from '~/components/widgets/Features.astro';
---
```
--------------------------------
### Install and Run AstroWind Development Server
Source: https://github.com/nightsquawk/astrowind/blob/main/CLAUDE.md
Installs project dependencies and starts the development server for AstroWind. It's the primary command for local development and testing.
```bash
npm install
npm run dev
npm run start
```
--------------------------------
### Client Setup Script (Shell)
Source: https://github.com/nightsquawk/astrowind/blob/main/CLAUDE.md
Executes a setup script to customize the project for a new client. This script is located in the `.github/scripts/` directory and is available for both Linux/macOS (shell) and Windows (.ps1).
```shell
# Run on Linux/macOS
.github/scripts/setup-client.sh
```
```powershell
# Run on Windows
.github/scripts/setup-client.ps1
```
--------------------------------
### Clone Astrowind Template Repository
Source: https://github.com/nightsquawk/astrowind/blob/main/QUICK_START.md
Clones the Astrowind template repository to a specified client directory and navigates into it. This is the first step to start a new project.
```bash
git clone client-name
cd client-name
```
--------------------------------
### Astro Component Import Example
Source: https://github.com/nightsquawk/astrowind/blob/main/TEMPLATE_GUIDE.md
Demonstrates how Astro components are imported and how the client override system automatically resolves imports to client versions if they exist. No code changes are required to utilize overrides.
```astro
import Button from '~/components/ui/Button.astro';
```
--------------------------------
### Environment Variable Configuration Example
Source: https://github.com/nightsquawk/astrowind/blob/main/README.md
This bash script shows an example `.env` file for configuring various aspects of the Astrowind project, including site URL, analytics IDs (Google Analytics, Tag Manager, Clarity, Datadog), Google Maps API key, GoHighLevel integration, and Mux credentials. Mux tokens are sensitive and should be kept secret.
```bash
# Site Configuration
PUBLIC_SITE_URL=https://yoursite.com
# Analytics
PUBLIC_GOOGLE_ANALYTICS_ID=G-XXXXXXXXXX
PUBLIC_GOOGLE_TAG_MANAGER_ID=GTM-XXXXXXX
PUBLIC_MICROSOFT_CLARITY_PROJECT_ID=xxxxx
PUBLIC_DATADOG_APPLICATION_ID=
PUBLIC_DATADOG_CLIENT_TOKEN=
# Maps
PUBLIC_GOOGLE_MAPS_API_KEY=
# Optional: GoHighLevel
PUBLIC_GO_HIGH_LEVEL_TRACKING_ID=
PUBLIC_GO_HIGH_LEVEL_SCRIPT_URL=
# Mux (keep secret!)
MUX_TOKEN_ID=your-token-id
MUX_TOKEN_SECRET=your-token-secret
```
--------------------------------
### Client Setup Script for AstroWind
Source: https://github.com/nightsquawk/astrowind/blob/main/README.md
This script facilitates the setup process for new clients by updating configurations and replacing project assets. It supports Linux/Mac and Windows environments.
```bash
# Linux/Mac
bash .github/scripts/setup-client.sh
# or
# Windows
.github/scripts/setup-client.ps1
# Update configuration
# Edit src/config.yaml with client details
# Replace src/components/Logo.astro with client logo
# Add content to src/content/
```
--------------------------------
### Configure Astrowind Site Settings
Source: https://github.com/nightsquawk/astrowind/blob/main/QUICK_START.md
Edits the `src/config.yaml` file to configure site-specific settings such as the site name, URL, and theme colors. This is part of the initial project setup.
```yaml
site:
name: "Your Client Name"
site: "https://yourclient.com"
theme:
colors:
primary: 'rgb(YOUR_PRIMARY_COLOR)'
secondary: 'rgb(YOUR_SECONDARY_COLOR)'
accent: 'rgb(YOUR_ACCENT_COLOR)'
```
--------------------------------
### Astro Card Components Example
Source: https://context7.com/nightsquawk/astrowind/llms.txt
Demonstrates the usage of various Astro Card components, including CardHeader, CardTitle, CardDescription, CardContent, and CardFooter, along with integrated Button and Badge components. This example showcases a modern card layout for displaying plan details and actions.
```astro
---
// Usage example - Modern card layout
import Card from '~/components/ui/shadcn/Card.astro';
import CardHeader from '~/components/ui/shadcn/CardHeader.astro';
import CardTitle from '~/components/ui/shadcn/CardTitle.astro';
import CardDescription from '~/components/ui/shadcn/CardDescription.astro';
import CardContent from '~/components/ui/shadcn/CardContent.astro';
import CardFooter from '~/components/ui/shadcn/CardFooter.astro';
import Button from '~/components/ui/shadcn/Button.astro';
import Badge from '~/components/ui/shadcn/Badge.astro';
---
Basic Plan
PopularPerfect for individuals and small teams
$29/month
✓ 10 projects
✓ 5GB storage
✓ Email support
Pro Plan
Best ValueFor growing businesses and teams
$99/month
✓ Unlimited projects
✓ 50GB storage
✓ Priority support
✓ Advanced analytics
```
--------------------------------
### Blog Post Frontmatter with Video (Markdown)
Source: https://github.com/nightsquawk/astrowind/blob/main/CLAUDE.md
Example frontmatter for a blog post that includes Mux video playback details. The video will be automatically displayed when the post is rendered.
```markdown
---
title: 'My Post'
video:
playbackId: 'abc123'
type: 'video'
aspectRatio: '16:9'
---
```
--------------------------------
### Check Mux Package Installation (Bash)
Source: https://github.com/nightsquawk/astrowind/blob/main/src/plugins/mux/README.md
Verifies that the required Mux player and Node.js packages are installed in the project. Useful for troubleshooting player loading issues.
```bash
npm list @mux/mux-player @mux/mux-audio @mux/mux-node
```
--------------------------------
### Setup Mux API Credentials (Bash)
Source: https://github.com/nightsquawk/astrowind/blob/main/CLAUDE.md
Configures Mux API credentials using environment variables. For production, it suggests using Cloudflare secrets for secure storage.
```bash
MUX_TOKEN_ID=your-token-id
MUX_TOKEN_SECRET=your-token-secret
```
```bash
wrangler secret put MUX_TOKEN_ID
wrangler secret put MUX_TOKEN_SECRET
```
--------------------------------
### Install Mux Dependencies
Source: https://github.com/nightsquawk/astrowind/blob/main/src/plugins/mux/README.md
Installs the necessary Mux Node.js and player packages for video and audio streaming integration. These are typically pre-installed in the AstroWind template.
```bash
npm install @mux/mux-node @mux/mux-player @mux/mux-audio
```
--------------------------------
### Podcast Episode Frontmatter with Audio (Markdown)
Source: https://github.com/nightsquawk/astrowind/blob/main/CLAUDE.md
Example frontmatter for a podcast episode that includes Mux audio playback details. The audio player will be automatically displayed when the episode is rendered.
```markdown
---
title: 'Episode 1'
audio:
playbackId: 'xyz789'
type: 'audio'
title: 'Episode 1: Introduction'
---
```
--------------------------------
### Astro Component Override Example
Source: https://github.com/nightsquawk/astrowind/blob/main/src/components/README.md
This example shows how to override a base Astro component (e.g., Button) by creating a corresponding file in the `src/client/components/` directory. This feature, powered by a Vite plugin, allows for seamless customization of components without altering their original import paths. The overridden component can introduce new props or modify existing behavior.
```astro
---
// src/client/components/ui/Button.astro
// This file automatically overrides the base Button component
interface Props {
variant?: 'primary' | 'secondary' | 'outline' | 'ghost'; // Added ghost
// ... other props
}
---
```
```astro
---
// No changes needed! Import works the same way
import Button from '~/components/ui/Button.astro'; // Uses client version automatically
---
```
--------------------------------
### Environment Variables Example (.env)
Source: https://github.com/nightsquawk/astrowind/blob/main/CLAUDE.md
Lists common environment variables used by the project, including public-facing variables (prefixed with PUBLIC_) and private secrets. `.env` file should be used for local development.
```env
PUBLIC_SITE_URL=https://example.com
PUBLIC_GOOGLE_ANALYTICS_ID=G-XXXXXXXXXX
PUBLIC_GOOGLE_TAG_MANAGER_ID=GTM-XXXXXXXX
PUBLIC_GOOGLE_MAPS_API_KEY=YOUR_MAPS_API_KEY
MUX_TOKEN_ID=your-mux-token-id
MUX_TOKEN_SECRET=your-mux-token-secret
```
--------------------------------
### Create Custom Page Layout in AstroWind
Source: https://github.com/nightsquawk/astrowind/blob/main/TEMPLATE_GUIDE.md
Illustrates creating a custom page, `custom-page.astro`, in `src/client/pages/` or `src/pages/`. This example uses base layouts and widgets to build a unique page structure, adhering to Level 3 customization.
```astro
---
import Layout from '~/layouts/Layout.astro';
import Features from '~/components/widgets/Features.astro';
---
```
--------------------------------
### Using Theme Variables in CSS
Source: https://github.com/nightsquawk/astrowind/blob/main/src/client/components/README.md
Demonstrates how to use predefined CSS variables from `src/components/CustomStyles.astro` for consistent theming of custom components. It shows examples for primary color, page background, and heading font.
```css
.my-component {
color: var(--aw-color-primary); /* Primary brand color */
background: var(--aw-color-bg-page); /* Page background */
font-family: var(--aw-font-heading); /* Heading font */
}
```
--------------------------------
### Mux Environment Variable Setup
Source: https://context7.com/nightsquawk/astrowind/llms.txt
Provides instructions for setting up environment variables for Mux API credentials and Cloudflare Workers secrets. It specifies the MUX_TOKEN_ID and MUX_TOKEN_SECRET for API authentication and how to set them as secrets in Cloudflare Workers.
```bash
# .env - Mux API credentials (keep secret!)
MUX_TOKEN_ID=your-mux-token-id
MUX_TOKEN_SECRET=your-mux-token-secret
# Cloudflare Workers production secrets
wrangler secret put MUX_TOKEN_ID
wrangler secret put MUX_TOKEN_SECRET
```
--------------------------------
### YAML Configuration for Theme Colors
Source: https://github.com/nightsquawk/astrowind/blob/main/TEMPLATE_GUIDE.md
Illustrates how to change brand colors by modifying the `theme.colors` section in the `src/config.yaml` file. This allows for easy customization of primary and secondary colors.
```yaml
theme:
colors:
primary: 'rgb(YOUR_COLOR)'
secondary: 'rgb(YOUR_COLOR)'
```
--------------------------------
### Client-Specific Component Override Example
Source: https://github.com/nightsquawk/astrowind/blob/main/CLAUDE.md
Illustrates how client-specific components can override base components in AstroWind by placing them in `src/client/components/` and using the `~` path alias. This allows for easy customization without modifying the core template.
```astro
---
// Example: Overriding a header component
// Assumes a base component at src/components/Header.astro
// This client-specific version is at src/client/components/Header.astro
import BaseHeader from '~/components/Header.astro'; // '~' resolves to '/src'
---
```
--------------------------------
### Configure Markdown Plugins in Astro
Source: https://context7.com/nightsquawk/astrowind/llms.txt
Configures remark and rehype plugins for Astro's markdown processing. Includes plugins for reading time, responsive tables, and lazy loading images. This setup in `astro.config.mts` determines how markdown content is transformed during the build.
```typescript
// astro.config.mts - Markdown plugins configuration
import {
readingTimeRemarkPlugin,
responsiveTablesRehypePlugin,
lazyImagesRehypePlugin
} from './src/utils/frontmatter.js';
export default defineConfig({
markdown: {
remarkPlugins: [
readingTimeRemarkPlugin, // Calculates reading time, adds to frontmatter
],
rehypePlugins: [
responsiveTablesRehypePlugin, // Wraps tables in scrollable divs
lazyImagesRehypePlugin, // Adds loading="lazy" to images
],
},
});
```
--------------------------------
### Create Custom Client Component in AstroWind
Source: https://github.com/nightsquawk/astrowind/blob/main/TEMPLATE_GUIDE.md
Demonstrates creating a custom client-side component, `ClientHero.astro`, within the `src/client/components/` directory. This allows for custom UI elements not present in the base library, a part of Level 2 customization.
```astro
---
import Button from '~/components/ui/Button.astro';
---
Welcome to Client Name
```
--------------------------------
### Add Custom Font with @fontsource
Source: https://github.com/nightsquawk/astrowind/blob/main/QUICK_START.md
Installs a custom font using the @fontsource npm package, imports it into a custom Astro component, and updates the theme configuration. This allows for custom typography.
```bash
npm install @fontsource-variable/your-font
# Import in src/components/CustomStyles.astro
# Update theme.fonts in config.yaml
```
--------------------------------
### YAML Configuration for Custom Fonts
Source: https://github.com/nightsquawk/astrowind/blob/main/TEMPLATE_GUIDE.md
Shows how to configure custom fonts by updating the `theme.fonts` section in `src/config.yaml`. This assumes the font package has been installed and imported in `src/components/CustomStyles.astro`.
```yaml
theme:
fonts:
sans: 'Your Font Variable'
```
--------------------------------
### Extend Tailwind CSS Configuration in AstroWind
Source: https://github.com/nightsquawk/astrowind/blob/main/TEMPLATE_GUIDE.md
Provides an example of extending the `tailwind.config.js` file to introduce custom CSS utilities for theme extensions, a part of Level 4 customization. This allows for defining project-specific styling rules.
```css
/* src/client/styles/custom.css */
.client-specific-class {
/* Custom styles */
}
```
--------------------------------
### Google Tag Manager Integration Setup (Astro)
Source: https://github.com/nightsquawk/astrowind/blob/main/CLAUDE.md
Details the integration of Google Tag Manager using the GoogleTagManager.astro component and associated helper functions in `gtm-events.ts`. This setup allows for custom dataLayer events and runs in parallel with Google Analytics 4. The `PUBLIC_GOOGLE_TAG_MANAGER_ID` environment variable is required.
```astro
export function trackCustomEvent(eventName: string, eventData: Record) {
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
event: eventName,
...eventData
});
}
```
--------------------------------
### Configure Mux Environment Variables
Source: https://github.com/nightsquawk/astrowind/blob/main/src/plugins/mux/README.md
Sets up Mux API credentials using environment variables for both local development (.env) and production environments (Cloudflare Secrets). Requires MUX_TOKEN_ID and MUX_TOKEN_SECRET.
```bash
# Local Development (.env):
MUX_TOKEN_ID=your-token-id
MUX_TOKEN_SECRET=your-token-secret
# Production (Cloudflare Secrets):
wrangler secret put MUX_TOKEN_ID
wrangler secret put MUX_TOKEN_SECRET
```
--------------------------------
### Build and Preview AstroWind Production Site
Source: https://github.com/nightsquawk/astrowind/blob/main/CLAUDE.md
Builds the AstroWind project for production and previews it locally. This is used to test the final output before deployment.
```bash
npm run build
npm run preview
```
--------------------------------
### Markdown Content with Mux Audio Asset
Source: https://context7.com/nightsquawk/astrowind/llms.txt
Demonstrates embedding Mux audio assets within Markdown content files for Astro. The frontmatter includes configuration for the audio playbackId, type, title, and duration, enabling the display of podcast episodes with associated metadata directly in the content.
```markdown
---
# src/content/podcast-episodes/episode-001.md
title: 'Episode 1: Getting Started'
episodeNumber: 1
pubDate: 2024-01-15
audio:
playbackId: 'abc123xyz'
type: 'audio'
title: 'Episode 1: Getting Started'
duration: 3600
---
In this inaugural episode, we discuss...
```
--------------------------------
### Deployment Command for Cloudflare Workers
Source: https://github.com/nightsquawk/astrowind/blob/main/README.md
These bash commands demonstrate how to build and deploy an Astrowind project to Cloudflare Workers. The `npm run deploy` command automates the build and deployment process. Alternatively, manual deployment involves running `npm run build` followed by `wrangler deploy`.
```bash
# Build and deploy
npm run deploy
# Or manually
npm run build
wrangler deploy
```
--------------------------------
### Using Icon Libraries in AstroWind
Source: https://github.com/nightsquawk/astrowind/blob/main/README.md
Demonstrates how to integrate and use various icon libraries (Tabler, MDI, Lucide) within Astro components using the `astro-icon` package. Icons are styled using Tailwind CSS classes.
```astro
import { Icon } from 'astro-icon/components';
```
--------------------------------
### Define Content Collections in AstroWind
Source: https://github.com/nightsquawk/astrowind/blob/main/CLAUDE.md
Illustrates the definition of content collections in `src/content/config.ts` using Astro's content layer. It includes examples for blog posts, podcast episodes, campaigns, and coupons with their respective schemas.
```typescript
import { defineCollection, z } from 'astro:content';
const postCollection = defineCollection({
type: 'content',
schema: ({ image }) => z.object({
title: z.string(),
date: z.date(),
tags: z.array(z.string()),
author: z.string().optional(),
image: image().refEl('src/assets/blog/default.webp').optional(),
draft: z.boolean().optional(),
}),
});
// ... other collections like podcast-episodes, campaigns, coupons
```
--------------------------------
### Render Astro Blog Post Page with Mux Video
Source: https://context7.com/nightsquawk/astrowind/llms.txt
Renders an individual blog post page using Astro's content collections. It dynamically fetches posts, supports Mux video playback if available in the post data, and uses a `PageLayout` component. The `getStaticPaths` function generates static routes for each post.
```astro
---
// src/pages/blog/[...slug].astro - Blog post page with Mux video
import { getCollection } from 'astro:content';
import Layout from '~/layouts/PageLayout.astro';
import MuxVideoPlayer from '~/plugins/mux/components/MuxVideoPlayer.astro';
export async function getStaticPaths() {
const posts = await getCollection('post');
return posts.map(post => ({
params: { slug: post.id },
props: { post },
}));
}
const { post } = Astro.props;
const { Content } = await post.render();
---
{post.data.title}
{post.data.video && (
)}
```
--------------------------------
### Configure Client Information in AstroWind
Source: https://github.com/nightsquawk/astrowind/blob/main/TEMPLATE_GUIDE.md
This snippet shows how to update the `src/config.yaml` file to configure client-specific information, including site details, theme colors, fonts, and analytics IDs. This is the primary method for Level 1 customization.
```yaml
# src/config.yaml
site:
name: "Client Name"
site: "https://client.com"
theme:
colors:
primary: 'rgb(255 0 0)' # Client brand color
secondary: 'rgb(200 0 0)'
accent: 'rgb(150 0 0)'
```
--------------------------------
### Implement Markdown Plugins for Astro
Source: https://context7.com/nightsquawk/astrowind/llms.txt
Provides the implementations for custom remark and rehype markdown plugins. This includes calculating reading time using the 'reading-time' package, wrapping HTML tables in scrollable divs, and adding 'loading="lazy"' attributes to images using AST traversal utilities.
```typescript
// src/utils/frontmatter.ts - Plugin implementations
import getReadingTime from 'reading-time';
import { toString } from 'mdast-util-to-string';
import { visit } from 'unist-util-visit';
// Reading time plugin - automatically calculates and adds readingTime field
export const readingTimeRemarkPlugin = () => {
return function (tree, file) {
const textOnPage = toString(tree);
const readingTime = Math.ceil(getReadingTime(textOnPage).minutes);
if (file?.data?.astro?.frontmatter) {
file.data.astro.frontmatter.readingTime = readingTime;
}
};
};
// Responsive tables - wraps tables in scrollable containers
export const responsiveTablesRehypePlugin = () => {
return function (tree) {
for (let i = 0; i < tree.children.length; i++) {
const child = tree.children[i];
if (child.type === 'element' && child.tagName === 'table') {
tree.children[i] = {
type: 'element',
tagName: 'div',
properties: { style: 'overflow:auto' },
children: [child],
};
i++;
}
}
};
};
// Lazy images - adds loading="lazy" to all images
export const lazyImagesRehypePlugin = () => {
return function (tree) {
visit(tree, 'element', function (node) {
if (node.tagName === 'img') {
node.properties.loading = 'lazy';
}
});
};
};
// Usage in content - reading time is automatically available
// {post.data.readingTime} minutes read
```
--------------------------------
### Use Custom Client Component in AstroWind Page
Source: https://github.com/nightsquawk/astrowind/blob/main/TEMPLATE_GUIDE.md
Shows how to import and use a custom client component, `ClientHero.astro`, within an Astro page, typically `src/pages/index.astro`. This integrates custom UI elements into the client's website structure.
```astro
---
import ClientHero from '~/client/components/ClientHero.astro';
---
```
--------------------------------
### Create Custom Client Hero Component (Astro)
Source: https://github.com/nightsquawk/astrowind/blob/main/src/client/components/README.md
An example of creating a completely new, client-specific component named `ClientHero.astro`. This component composes existing base components (`Button` and `Headline`) to provide unique client-side functionality and layout.
```astro
---
// src/client/components/custom/ClientHero.astro
import Button from '~/components/ui/Button.astro';
import Headline from '~/components/ui/Headline.astro';
---
```
--------------------------------
### Import Configuration from Virtual Module in Astro
Source: https://context7.com/nightsquawk/astrowind/llms.txt
This snippet demonstrates how to import configuration settings from the 'astrowind:config' virtual module into Astro components or TypeScript files. It shows accessing site information, theme colors, font settings, and blog-related configurations. No external dependencies are required beyond the AstroWind integration.
```typescript
import { SITE, THEME, METADATA, APP_BLOG, UI, ANALYTICS, I18N } from 'astrowind:config';
// Access site information
const siteName = SITE.name;
const siteUrl = SITE.site;
// Access theme colors for dynamic styling
const primaryColor = THEME.colors.primary;
const heading = THEME.fonts.heading;
// Access blog configuration
const postsPerPage = APP_BLOG.postsPerPage;
const blogPath = APP_BLOG.list.pathname;
```
--------------------------------
### AstroWind Theme Color Configuration
Source: https://github.com/nightsquawk/astrowind/blob/main/TEMPLATE_GUIDE.md
Details the theme color settings within `src/config.yaml`, showing how primary, secondary, accent, text, and background colors (for both light and dark modes) are defined. These settings are applied globally via CSS variables.
```yaml
theme:
colors:
primary: 'rgb(1 97 239)' # Main brand color
secondary: 'rgb(1 84 207)' # Secondary brand color
accent: 'rgb(109 40 217)' # Accent color
text:
heading: 'rgb(0 0 0)' # Heading text color
default: 'rgb(16 16 16)' # Body text color
muted: 'rgb(16 16 16 / 66%)' # Muted text color
textDark: # Dark mode text colors
heading: 'rgb(247, 248, 248)'
default: 'rgb(229 236 246)'
muted: 'rgb(229 236 246 / 66%)'
background:
page: 'rgb(255 255 255)' # Light mode background
pageDark: 'rgb(3 6 32)' # Dark mode background
fonts:
sans: 'Inter Variable' # Body font
serif: 'Inter Variable' # Serif font
heading: 'Inter Variable' # Heading font
selection:
light:
background: 'lavender' # Light mode selection
dark:
background: 'black' # Dark mode selection
color: 'snow'
```
--------------------------------
### Astro Component Import and Auto-Resolution
Source: https://github.com/nightsquawk/astrowind/blob/main/src/client/components/README.md
Demonstrates how to import an Astro component and how the Vite plugin automatically resolves it to a client version if one exists in the specified path. This mechanism allows for overriding base components without altering import statements.
```astro
import Button from '~/components/ui/Button.astro';
```
--------------------------------
### Create Custom Feature Section Component
Source: https://github.com/nightsquawk/astrowind/blob/main/src/client/components/README.md
An Astro component example for `ClientFeatures.astro` that creates a custom feature section. It imports and uses the base `Features.astro` widget and defines its own HTML structure and styling, demonstrating composition and theme variable usage.
```astro
---
// src/client/components/custom/ClientFeatures.astro
import Features from '~/components/widgets/Features.astro';
const features = [
{ title: "Feature 1", icon: "tabler:check" },
{ title: "Feature 2", icon: "tabler:check" },
];
---