` component in any route `page.tsx`.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+A few things of note about this component:
+
+- You will need to import and configure any number of [Shiki themes](https://shiki.style/themes).
+- You will need to import and configure any number of [supported languages](https://shiki.style/languages).
+- The component has been implemented using Skeleton's [component style guidelines](http://localhost:4321/docs/resources/contribute/components).
+- This provides a number of style props for easy customization via Skeleton's standard conventions.
+- The component exposes `code`, `lang`, and `theme` properties to configure on-the-fly.
+- The Code Block `` tag is auto-generated by Shiki; target utility classes with: `[&>pre]:myClassHere`.
+
+## Programmatic Usage
+
+
+
This use case falls outside the scope of Skeleton. The following is provided merely as guidance.
+
+
+In some cases you may not have direct access to the source code, such as content from a blog posts or CMS pages. In fact the code may even come pre-baked with surrounding `` or `` elements. For this, you'll need to follow the general steps below. Specific implementation may differ based on your app and meta-framework.
+
+1. Query all `` or `` blocks using Javascript tools like `document.querySelectorAll()`. Be as specific as possible.
+2. Ensure you have a clean instance of the source code itself, with no extra markup injected within.
+3. Use Shiki's [codeToHtml](https://shiki.style/guide/install#shorthands) feature to parse the code as styled HTML markup.
+4. Then append each instance of the code blocks in your DOM.
+
+## Custom Themes
+
+Shiki provides support for generating a custom highlighter theme:
+
+- [Loading Custom Themes](https://shiki.style/guide/load-theme)
+- [List of Bundled Themes](https://shiki.style/themes)
+
+Shiki theme values can be defined using Skeleton custom theme properties, such as `rgba(--color-primary-500)`.
+
+## Accessibility
+
+See [Salma Alam-Naylor's](https://whitep4nth3r.com/about/) guidelines for [creating accessible code blocks](https://whitep4nth3r.com/blog/how-to-make-your-code-blocks-accessible-on-your-website/) that meet WGAC standards.
diff --git a/sites/skeleton.dev/src/content/docs/integrations/code-block/svelte.mdx b/sites/skeleton.dev/src/content/docs/integrations/code-block/svelte.mdx
new file mode 100644
index 0000000000..8a7909e5d8
--- /dev/null
+++ b/sites/skeleton.dev/src/content/docs/integrations/code-block/svelte.mdx
@@ -0,0 +1,89 @@
+---
+layout: '@layouts/LayoutDoc.astro'
+---
+
+export const components = componentSet;
+
+import Example from '@examples/integrations/code-block/Example.astro';
+import SvelteComponentRaw from '@examples/integrations/code-block/SvelteComponent.txt?raw';
+import SveltePageRaw from '@examples/integrations/code-block/SveltePage.txt?raw';
+import TypesRaw from '@examples/integrations/code-block/Types.txt?raw';
+
+{/* --- */}
+
+
+ Shiki (式, a Japanese word for "Style") is a beautiful and powerful syntax highlighter based on TextMate grammar and themes, the same
+ engine as VS Code's syntax highlighting. It provides accurate and fast syntax highlighting for almost any mainstream programming language.
+
+
+
+
+ Shiki Documentation →
+
+
+
+## Installation
+
+[Install Shiki](https://shiki.style/guide/install) with your preferred package manager.
+
+```console
+npm install -D shiki
+```
+
+## Create a Component
+
+A reusable component should suffice in most projects. Tap the `code` tab below to access the source, then follow the steps below.
+
+1. Implement a new `` component in `/src/lib/components/CodeBlock/CodeBlock.svelte`.
+2. Implement the required component prop types in `/src/lib/components/CodeBlock/types.ts`.
+3. Implement several variations of our `` component in any SvelteKit route `+page.svelte`.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+A few things of note about this component:
+
+- You will need to import and configure any number of [Shiki themes](https://shiki.style/themes).
+- You will need to import and configure any number of [supported languages](https://shiki.style/languages).
+- The component has been implemented using Skeleton's [component style guidelines](http://localhost:4321/docs/resources/contribute/components).
+- This provides a number of style props for easy customization via Skeleton's standard conventions.
+- The component exposes `code`, `lang`, and `theme` properties to configure on-the-fly.
+- The Code Block `` tag is auto-generated by Shiki; target utility classes with: `[&>pre]:myClassHere`.
+
+## Programmatic Usage
+
+
+
This use case falls outside the scope of Skeleton. The following is provided merely as guidance.
+
+
+In some cases you may not have direct access to the source code, such as content from a blog posts or CMS pages. In fact the code may even come pre-baked with surrounding `` or `` elements. For this, you'll need to follow the general steps below. Specific implementation may differ based on your app and meta-framework.
+
+1. Query all `` or `` blocks using Javascript tools like `document.querySelectorAll()`. Be as specific as possible.
+2. Ensure you have a clean instance of the source code itself, with no extra markup injected within.
+3. Use Shiki's [codeToHtml](https://shiki.style/guide/install#shorthands) feature to parse the code as styled HTML markup.
+4. Then append each instance of the code blocks in your DOM.
+
+For more instructions, please refer to this guide by [Joy of Code](https://joyofcode.xyz/) explaining how to [implement Shiki via MDX](https://joyofcode.xyz/sveltekit-markdown-blog#using-components-inside-markdown).
+
+## Custom Themes
+
+Shiki provides support for generating a custom highlighter theme:
+
+- [Loading Custom Themes](https://shiki.style/guide/load-theme)
+- [List of Bundled Themes](https://shiki.style/themes)
+
+Shiki theme values can be defined using Skeleton custom theme properties, such as `rgba(--color-primary-500)`.
+
+## Accessibility
+
+See [Salma Alam-Naylor's](https://whitep4nth3r.com/about/) guidelines for [creating accessible code blocks](https://whitep4nth3r.com/blog/how-to-make-your-code-blocks-accessible-on-your-website/) that meet WGAC standards.
diff --git a/sites/skeleton.dev/src/content/docs/integrations/iconography/meta.mdx b/sites/skeleton.dev/src/content/docs/integrations/iconography/meta.mdx
new file mode 100644
index 0000000000..7c3ba5bd90
--- /dev/null
+++ b/sites/skeleton.dev/src/content/docs/integrations/iconography/meta.mdx
@@ -0,0 +1,5 @@
+---
+title: Iconography
+description: Learn how to integrate Lucide for iconography in Skeleton.
+showDocsUrl: true
+---
diff --git a/sites/skeleton.dev/src/content/docs/integrations/iconography/react.mdx b/sites/skeleton.dev/src/content/docs/integrations/iconography/react.mdx
new file mode 100644
index 0000000000..0d11a2190f
--- /dev/null
+++ b/sites/skeleton.dev/src/content/docs/integrations/iconography/react.mdx
@@ -0,0 +1,48 @@
+---
+layout: '@layouts/LayoutDoc.astro'
+---
+
+import { Triangle, Heart, UserRound } from 'lucide-react';
+
+export const components = componentSet;
+
+
+ Skeleton takes an agnostic approach to icons, meaning you can use any combination of SVGs, emoji, unicode, or dedicated icon libraries.
+ Mix and match to fulfill your project's unique requirements.
+
+
+## Lucide
+
+
+
+
+
+
+
+
+
+If you're looking for an opinionated solution, Skeleton recommends [Lucide](https://lucide.dev/). This provides a huge selection of icons that are available to all popular frameworks and feature a clean and modern style. All code examples in this documentation site implement Lucide, but feel free to replace with any alternative.
+
+## Installation
+
+Follow the official instructions to install [Lucide for React](https://lucide.dev/guide/packages/lucide-react).
+
+## Usage
+
+```tsx
+import { Skull as IconSkull } from 'lucide-react';
+
+const App = () => {
+ return ;
+};
+
+export default App;
+```
+
+## Alternatives
+
+- [Radix Icons](https://www.radix-ui.com/icons) - features modern styles and a large selection, supports React only.
+- [Iconify](https://iconify.design/) - provides a vast array of icon sets supported by popular icon libraries.
+- [Font Awesome](https://fontawesome.com/) - provides a huge variety of icons in their free tier.
+- [HeroIcons](https://heroicons.com/) - from the makers of Tailwind CSS, supports React and Vue.
+- [SimpleIcons](https://simpleicons.org/) - provides an excellent selection of brand icons.
diff --git a/sites/skeleton.dev/src/content/docs/integrations/iconography/svelte.mdx b/sites/skeleton.dev/src/content/docs/integrations/iconography/svelte.mdx
new file mode 100644
index 0000000000..bc2d0d6625
--- /dev/null
+++ b/sites/skeleton.dev/src/content/docs/integrations/iconography/svelte.mdx
@@ -0,0 +1,46 @@
+---
+layout: '@layouts/LayoutDoc.astro'
+---
+
+import { Triangle, Heart, UserRound } from 'lucide-react';
+
+export const components = componentSet;
+
+
+ Skeleton takes an agnostic approach to icons, meaning you can use any combination of SVGs, emoji, unicode, or dedicated icon libraries.
+ Mix and match to fulfill your project's unique requirements.
+
+
+## Lucide
+
+
+
+
+
+
+
+
+
+If you're looking for an opinionated solution, Skeleton recommends [Lucide](https://lucide.dev/). This provides a huge selection of icons that are available to all popular frameworks and feature a clean and modern style. All code examples in this documentation site implement Lucide, but feel free to replace with any alternative.
+
+### Installation
+
+Follow the official instructions to install [Lucide for Svelte](https://lucide.dev/guide/packages/lucide-svelte).
+
+## Usage
+
+For optimal performance we recommend importing each icon using the full path.
+
+```svelte
+
+
+
+```
+
+## Alternatives
+
+- [Iconify](https://iconify.design/) - provides a vast array of icon sets supported by popular icon libraries.
+- [Font Awesome](https://fontawesome.com/) - provides a huge variety of icons in their free tier.
+- [SimpleIcons](https://simpleicons.org/) - provides an excellent selection of brand icons.
diff --git a/sites/skeleton.dev/src/content/docs/resources/_markdown.mdx b/sites/skeleton.dev/src/content/docs/resources/_markdown.mdx
new file mode 100644
index 0000000000..f719d20689
--- /dev/null
+++ b/sites/skeleton.dev/src/content/docs/resources/_markdown.mdx
@@ -0,0 +1,201 @@
+---
+layout: '@layouts/LayoutDoc.astro'
+title: Markdown
+description: An MDX kitchen sink to test parsing and styles.
+---
+
+export const components = componentSet;
+
+{/* --- This is a Comment --- */}
+
+
+ This is the `React` panel!
+ This is the `Svelte` panel!
+ {/* This is the Vue panel! */}
+
+
+## Tailwind
+
+
+
+## Text
+
+Text can be **bold**, _italic_, or ~~strikethrough~~.
+
+[Link to another page](https://github.com/)
+
+There should be whitespace between paragraphs.
+
+There should be whitespace between paragraphs. We recommend including a README, or a file with information about your project.
+
+# Heading 1
+
+## Heading 2
+
+### Heading 3
+
+#### Heading 4
+
+##### Heading 5
+
+###### Heading 6
+
+This is a normal paragraph following a header. GitHub is a code hosting platform for version control and collaboration. It lets you and others work together on projects from anywhere.
+
+## Blockquotes
+
+> This is a blockquote following a header.
+>
+> When something is important enough, you do it even if the odds are not in your favor.
+
+## Fenced Code Blocks
+
+```ts title="my-test-file.js"
+const toggleDarkMode = document.querySelector('.preset-filled');
+
+jtd.addEvent(toggleDarkMode, 'click', function () {
+ if (jtd.getTheme() === 'dark') {
+ jtd.setTheme('light');
+ toggleDarkMode.textContent = 'Preview dark color scheme';
+ } else {
+ jtd.setTheme('dark');
+ toggleDarkMode.textContent = 'Return to the light side';
+ }
+});
+```
+
+```js
+// Javascript code with syntax highlighting.
+var fun = function lang(l) {
+ dateformat.i18n = require('./lang/' + l);
+ return true;
+};
+```
+
+```ruby
+# Ruby code with syntax highlighting
+GitHubPages::Dependencies.gems.each do |gem, version|
+ s.add_dependency(gem, "= #{version}")
+end
+```
+
+## Inline Code elements
+
+`inline code element`
+
+## Tables
+
+| head1 | head two | three |
+| :----------- | :---------------- | :---- |
+| ok | good swedish fish | nice |
+| out of stock | good and plenty | nice |
+| ok | good `oreos` | hmm |
+| ok | good `zoute` drop | yumm |
+
+### There's are horizontal rules below this.
+
+---
+
+---
+
+## Unordered list
+
+- This is an unordered list following a header.
+- This is an unordered list following a header.
+- This is an unordered list following a header.
+
+## Ordered List
+
+1. This is an ordered list following a header.
+2. This is an ordered list following a header.
+3. This is an ordered list following a header.
+
+### And an ordered list:
+
+1. Item one
+1. Item two
+1. Item three
+1. Item four
+
+### And an ordered list, continued:
+
+1. Item one
+1. Item two
+
+### And a nested list:
+
+- level 1 item
+ - level 2 item
+ - level 2 item
+ - level 3 item
+ - level 3 item
+- level 1 item
+ - level 2 item
+ - level 2 item
+ - level 2 item
+- level 1 item
+ - level 2 item
+ - level 2 item
+- level 1 item
+
+### Nesting an ol in ul in an ol
+
+- level 1 item (ul)
+ 1. level 2 item (ol)
+ 1. level 2 item (ol)
+ - level 3 item (ul)
+ - level 3 item (ul)
+- level 1 item (ul)
+ 1. level 2 item (ol)
+ 1. level 2 item (ol)
+ - level 3 item (ul)
+ - level 3 item (ul)
+ 1. level 4 item (ol)
+ 1. level 4 item (ol)
+ - level 3 item (ul)
+ - level 3 item (ul)
+- level 1 item (ul)
+
+### And a task list
+
+- [ ] Hello, this is a TODO item
+- [ ] Hello, this is another TODO item
+- [x] Goodbye, this item is done
+
+### Nesting task lists
+
+- [ ] level 1 item (task)
+ - [ ] level 2 item (task)
+ - [ ] level 2 item (task)
+- [ ] level 1 item (task)
+- [ ] level 1 item (task)
+
+### Nesting a ul in a task list
+
+- [ ] level 1 item (task)
+ - level 2 item (ul)
+ - level 2 item (ul)
+- [ ] level 1 item (task)
+- [ ] level 1 item (task)
+
+### Nesting a task list in a ul
+
+- level 1 item (ul)
+ - [ ] level 2 item (task)
+ - [ ] level 2 item (task)
+- level 1 item (ul)
+- level 1 item (ul) \*/}
+
+### Image
+
+
+
+### Text Styles
+
+**bold**
+
+_italic_
+
+**_bold + italic_**
diff --git a/sites/skeleton.dev/src/content/docs/resources/contribute.mdx b/sites/skeleton.dev/src/content/docs/resources/contribute.mdx
new file mode 100644
index 0000000000..08d240e853
--- /dev/null
+++ b/sites/skeleton.dev/src/content/docs/resources/contribute.mdx
@@ -0,0 +1,13 @@
+---
+layout: '@layouts/LayoutDoc.astro'
+title: Contribute
+description: Learn how to contribute to Skeleton.
+---
+
+export const components = componentSet;
+
+import NavGrid from '@components/docs/NavGrid.astro';
+
+{/* --- */}
+
+
diff --git a/sites/skeleton.dev/src/content/docs/resources/contribute/components.mdx b/sites/skeleton.dev/src/content/docs/resources/contribute/components.mdx
new file mode 100644
index 0000000000..f9ca18b122
--- /dev/null
+++ b/sites/skeleton.dev/src/content/docs/resources/contribute/components.mdx
@@ -0,0 +1,375 @@
+---
+layout: '@layouts/LayoutDoc.astro'
+title: Components
+description: Guidelines for contributing new Skeleton components.
+order: 10
+---
+
+export const components = componentSet;
+
+### Dev Server
+
+To run all packages/playgrounds/sites in watch mode, use the following command in the monorepo root:
+
+```shell
+pnpm dev
+```
+
+If you wish to focus on a specific framework you may run the framework-specific dev command:
+
+```shell
+pnpm dev:{framework}
+```
+
+This will limit the monorepo to only running the framework package (and its dependencies) and the corresponding playground for the specified framework and thus reduce resource usage and console bloat.
+
+### Server Ports
+
+The following represents the _default_ localhost address and port for each project. This will be displayed in the terminal when starting each dev server.
+
+- Documentation Site: `http://localhost:4321/`
+- Svelte Playground: `http://localhost:5173/`
+- React Playground: `http://localhost:3000/`
+
+You may run the sites and playgrounds in parallel at the same time. If a server shares a port, this will increment by one for the next server (ex: `5174`, `5175`, etc). Keep your eye on the terminal to retrieve the specific local address for each.
+
+### Zag.js
+
+Skeleton components are built using a foundation of [Zag.js](https://zagjs.com/). This provides a suite of headless component primitives that handle logic and state, while providing a universal set of features per all supported frameworks. The Skeleton design system is then implemented as a layer on top of this.
+
+When introducing a new Skeleton component, please refer to the documentation for each respective framework. For example:
+
+- Avatar (React): https://zagjs.com/components/react/avatar
+- Avatar (Svelte): https://zagjs.com/components/svelte/avatar
+
+Continue reading below to learn how implement the Zag primitives as components using Skeleton-specific conventions.
+
+---
+
+## Adding Components
+
+### Anatomy
+
+When creating a component, start by breaking it down into its core parts. If the component utilizes a [Zag primitive](https://zagjs.com/components/svelte/avatar), you may copy the source [directly from Zag's Usage section](https://zagjs.com/components/svelte/avatar#usage). For custom in-house components, you may use Skeleton's common terminology and discuss the potential anatomy with the Skeleton team.
+
+For example, the Zag Avatar component utilizes the following DOM structure:
+
+```html
+
+
![]()
+
...
+
+```
+
+As such, we'll implement one component part respective of each element:
+
+- `` - the root element
+- `` - the child image
+- `` - the fallback span
+
+We'll also include two special components:
+
+- `` - Similar to `` but allows the user to pass in the api.
+- `` - Provides access to the component tree's Context API.
+
+### Directory and File Names
+
+Components are housed in the following location per framework:
+
+| Framework | Directory |
+| --------- | ----------------- |
+| React | `/src/components` |
+| Svelte | `/src/components` |
+
+Skeleton uses a consistent naming convention per component:
+
+```
+avatar/
+├── anatomy/
+│ ├── fallback.{tsx|svelte}
+│ ├── image.{tsx|svelte}
+│ ├── root-context.{tsx|svelte}
+│ ├── root-provider.{tsx|svelte}
+│ └── root.{tsx|svelte}
+├── modules/
+│ ├── anatomy.ts
+│ ├── use-{component}.{ts|svelte.ts}
+│ └── root-context.ts
+└── index.ts
+```
+
+### Anatomy Folder
+
+The anatomy folder contains each component part inside a seperate file.
+
+### Component Part File
+
+Every component part should export their component as a default export and their prop types as named exports.
+
+**React**
+
+```tsx title="avatar-root.tsx"
+export interface AvatarRootProps {
+ // ...
+}
+
+export default function (props: AvatarRootProps) {
+ // ...
+}
+```
+
+**Svelte**
+
+```svelte title="avatar-root.svelte"
+
+
+
+
+
+```
+
+Note that you may need to extend or omit portions of the type to avoid conflicts between Zag and HTML attributes.
+
+#### Extend
+
+- `PropsWithElement` - from Skeleton's `@/internal/props-with-element`; allow for HTML template overrides.
+- `HTMLAttributes` - from Skeleton's `@/internal/html-attributes`; allow for standard HTML attributes.
+
+#### Omit
+
+- `Omit` - omit the `id` field from the `Props` interface as they will be provided inside the component itself.
+
+### Modules Folder
+
+#### Anatomy File
+
+The `anatomy.ts` file contains the exported anatomy, which enables the friendly dot notation syntax when consumed.
+
+```ts title="avatar-anatomy.ts"
+import Fallback from '../anatomy/fallback';
+import Image from '../anatomy/image';
+import Root from '../anatomy/root';
+
+export const Avatar = Object.assign(
+ Root, //
+ {
+ Image: Image, //
+ Fallback: Fallback, //
+ },
+);
+```
+
+#### Context Part File
+
+The `{part}-context.ts` file contains the exported context for each part's [context](/docs/resources/contribute/components#context-api). This pattern enables strong typing.
+
+For most components this will only be necessary for the root component, some components however may require context for other parts as well, reference other components for examples.
+
+```ts title="avatar-root-context.ts"
+import type { useAvatar } from './use-avatar';
+import { createContext } from '@/internal/create-context';
+
+export const AvatarContext = createContext>();
+```
+
+#### Index File
+
+The index prepares all above files for export.
+
+```ts
+export { Avatar } from './modules/anatomy';
+export { useAvatar } from './modules/use-avatar';
+export type { AvatarRootProps } from './anatomy/root';
+export type { AvatarRootProviderProps } from './anatomy/root-provider';
+export type { AvatarRootContextProps } from './anatomy/root-context';
+export type { AvatarImageProps } from './anatomy/image';
+export type { AvatarFallbackProps } from './anatomy/fallback';
+```
+
+### Component Exports
+
+Finally, make sure to export the new component for each respective component's framework package. This is handled in `/packages/skeleton-{framework}/src/index.ts`.
+
+```ts
+export * from './components/accordion/index';
+export * from './components/avatar/index';
+// ...
+```
+
+---
+
+## Using Zag Primitives
+
+### Source Code
+
+Locate the respective framework component source code on the Zag website. Here's Avatars for example:
+
+| Framework | Directory |
+| --------- | --------------------------------------------------------------- |
+| React | [Avatar Docs](https://zagjs.com/components/react/avatar#usage) |
+| Svelte | [Avatar Docs](https://zagjs.com/components/svelte/avatar#usage) |
+
+In most cases, Zag provides all source code in a single file. Take care when splitting this into multiple component parts. We recommend starting with the root component - including the primitive imports, and defining the `machine` and `api`. Then utilize Context API and child components for each additional sub-component.
+
+### Context API
+
+In some cases you may need to pass data from parent down to child components. For this, we can utilize each framework's Context API:
+
+| Framework | Documentation |
+| --------- | ----------------------------------------------------------------------------------------------------------- |
+| React | [View Component API docs](https://svelte.dev/docs/kit/state-management#Using-state-and-stores-with-context) |
+| Svelte | [View Component API docs](https://react.dev/learn/passing-data-deeply-with-context) |
+
+Note that Skeleton implements a [set convention for Context API](/docs/resources/contribute/components#context-file) to enable strong typing.
+
+### Common Conventions
+
+While each component will present a unique set of challenges, we recommend you reference other existing components to understand how they were implemented. But there are a few common conventions we'll detail below.
+
+- Try to stick as close to the Zag implementation DOM structure and naming as possible; don't get creative.
+- Use whitespace to seperate Zag versus Skeleton logic, such as props, attributes, and context definitions.
+- Avoid hardcoded english text or icons. Consider pass-throughs using props, snippets, or sub-components.
+- Default to the named import pattern, such as `import { foo, bar, fizz } from 'whatever';` (Including Zag's imports, even though Zag uses catch-all imports in their docs).
+
+#### React Specific
+
+- Pass the `id` field into the `useMachine` hook using the `useId()` hook from `react`.
+- Consume context using `use()` from `react`.
+- Use the `className` attribute to pass Skeleton classes.
+
+#### Svelte Specific
+
+- Pass the `id` field into the `useMachine` function using the `props.id()` rune from `svelte`.
+- Consume context using the `{context}.consume()`.
+- Use the `class` attribute to pass Skeleton classes.
+
+> NOTE: if you're a contributor reading this and you feel there are more conventions to share. Please consider bringing this up with the Skeleton team. We might ask you to append these as you work on your contributions. The more knowledge we share, the more everyone benefits!
+
+---
+
+## Styling Components
+
+Styles are common and shared between all framework iterations of the same component. These reside in the `skeleton-common` package and are named to match their respective component.
+
+```
+packages/
+└── skeleton-common/
+ └── src/
+ ├── classes/
+ | ├── accordion.ts
+ | ├── avatar.ts
+ | └── ...
+ └── index.ts
+```
+
+Here's an example of the Avatar styles found in `avatar.ts`:
+
+```ts title="avatar.ts"
+import { defineSkeletonClasses } from '../internal/define-skeleton-classes.js' with { type: 'macro' };
+
+export const classesAvatar = defineSkeletonClasses({
+ root: 'isolate bg-surface-400-600 size-16 rounded-full overflow-hidden',
+ image: 'w-full object-cover',
+ fallback: 'size-full flex justify-center items-center',
+});
+```
+
+- We'll cover the import `{ type: 'macro' }` in the [style prefix](#style-prefix) section.
+- Use the naming convention of `classes{Component}`
+- Create a key for each component part.
+- Set the value to each component's default class list.
+- You can optionally pass an array of strings `['', '']` to document multi-line.
+- Make sure to export the component class file in `index.ts`.
+
+### Array Notation
+
+You can optionally provide an array of strings whenever the class list is long or can be split into logical sections. This improves readability. The `defineSkeletonClasses` function will flatten the array into a single string at build time.
+
+```ts title="avatar.ts"
+import { defineSkeletonClasses } from '../internal/define-skeleton-classes' with { type: 'macro' };
+
+export const classesProgressLinear = defineSkeletonClasses({
+ root: [
+ // Common
+ 'items-center justify-center gap-2',
+ // Horizontal Orientation
+ 'data-[orientation=horizontal]:flex data-[orientation=horizontal]:flex-row data-[orientation=horizontal]:w-full',
+ // Vertical Orientation
+ 'data-[orientation=vertical]:inline-flex data-[orientation=vertical]:flex-col',
+ ],
+ // ...
+});
+```
+
+### Style Prefix
+
+It's worth noting that during build time, Skeleton will automatically prefix each class in the class list with `skb:` (short for "Skeleton Base"). By applying `with { type: 'macro' }` to the import, the import will run `defineSkeletonClasses` specifically at build time. This variant prefix will assign each class to the Tailwind `@base` layer, ensuring user-provided classes take precedence over our internally defined classes. This is accomplished using the following Tailwind custom variant.
+
+```css title="/packages/skeleton/src/variants/base.css"
+@custom-variant skb {
+ @layer base {
+ @slot;
+ }
+}
+```
+
+If you need to prevent a class from being prefixed at build time, apply a variant of `not-skb:` to that class.
+
+> NOTE: This should be a rare use-case requiring discussion with the Skeleton team prior to implementation as it means the user won't be able to override that specific class without using the anti-pattern: `!` for `!important`.
+
+### Importing Class Lists
+
+For Zag primitives, you can import and implement each class list Using Zag's `mergeProps` utility for attributes.
+
+```tsx title="avatar-root.tsx" {1,2,9}
+import { classesAvatar } from '@skeletonlabs/skeleton-common';
+import { mergeProps } from '@zag-js/react';
+
+export default function (props: AvatarRootProps) {
+ const { children, ...rest } = props;
+
+ const attributes = mergeProps(
+ api.getRootProps(),
+ {
+ className: classesAvatar.root,
+ },
+ rest,
+ );
+
+ return {children}
;
+}
+```
+
+The process is similar for custom components without Zag primitives. We still use the Zag `mergeProps` utility.
+
+```tsx title="navigation-root.tsx"
+import { classesNavigation } from '@skeletonlabs/skeleton-common';
+import { mergeProps } from '@zag-js/react';
+
+export default function (props: NavigationRootProps) {
+ const { children, ...rest } = props;
+
+ const attributes = mergeProps(
+ {
+ className: classesNavigation.root,
+ },
+ rest,
+ );
+
+ return {children}
;
+}
+```
+
+## Additional Resources
+
+- [Component Party](https://component-party.dev/) - easily compare features between each framework
+- [React Documentation](https://react.dev/) - the React documentation website.
+- [Svelte Documentation](https://svelte.dev/) - the Svelte documentation website.
diff --git a/sites/skeleton.dev/src/content/docs/resources/contribute/documentation.mdx b/sites/skeleton.dev/src/content/docs/resources/contribute/documentation.mdx
new file mode 100644
index 0000000000..95ebf20be8
--- /dev/null
+++ b/sites/skeleton.dev/src/content/docs/resources/contribute/documentation.mdx
@@ -0,0 +1,209 @@
+---
+layout: '@layouts/LayoutDoc.astro'
+title: Documentation
+description: Guidelines for contributing to the Skeleton documentation website.
+order: 20
+---
+
+export const components = componentSet;
+
+## Astro
+
+The Skeleton documentation website is maintained using the Astro framework.
+
+
+
+ Astro Documentation →
+
+
+
+### Integrations
+
+Review the full list of integrations in `astro.config.js`.
+
+- [Partytown](https://docs.astro.build/en/guides/integrations-guide/partytown/)
+- [Svelte](https://docs.astro.build/en/guides/integrations-guide/svelte/)
+- [React](https://docs.astro.build/en/guides/integrations-guide/react/)
+- [Expressive Code](https://expressive-code.com/)
+- [Icon](https://www.astroicon.dev/)
+- [AutoImport](https://github.com/delucis/astro-auto-import)
+- [MDX (Markdown + JSX)](https://docs.astro.build/en/guides/markdown-content/)
+
+## App Structure
+
+Navigate the app structure within the `/src` directory. This includes the following directories:
+
+| Path | Description |
+| ------------- | ----------------------------------------------------------------------------------------------------------------------------- |
+| `/components` | Contains our components. |
+| `/content` | Contains our MDX content managed with [Astro's content collections](https://docs.astro.build/en/guides/content-collections/). |
+| `/examples` | Contains our code examples. |
+| `/icons` | Contains our SVG icons. |
+| `/images` | Contains our images. |
+| `/layouts` | Contains our layouts. |
+| `/lib` | Contains our typescript modules. |
+| `/pages` | Contains our pages. |
+| `/stores` | Contains data stores for state management. |
+| `/styles` | Contains our stylesheets. |
+
+## Pages
+
+### Standard Pages
+
+1. Browse to `/content/docs/` and create a new `.mdx` file
+2. Populate all required Frontmatter metadata within the frontmatter `---` fences, see the content configuration in `/src/content.config.ts` for which properties need to be set.
+3. New pages will be automatically added to the sidebar navigation.
+
+### Component Pages
+
+Component page content is split into three files within `/content/docs/components//`.
+
+- `meta.mdx` - common frontmatter metadata for the page header (ex: title, description, etc).
+- `react.mdx` - examples and usage information specific to the React page.
+- `svelte.mdx` - examples and usage information specific to the Svelte page.
+
+### Hidden Pages
+
+If you wish to prevent a page from showing in the navigation, prefix it with an understore: `_example.mdx`.
+
+## Using MDX
+
+View the [Astro MDX Documentation](https://docs.astro.build/en/guides/markdown-content/) or refer to `/src/content/docs/resources/_markdown.md` for a "kitchen sink" example page.
+
+### MDX Components
+
+This application makes use of [custom MDX components](https://mdxjs.com/table-of-components/) to enable Skeleton typography styles for page contents. Browse these components within `/src/components/mdx`. To enable MDX components for your page, add the following import.
+
+```mdx
+---
+{ /* (frontmatter) */ }
+---
+
+export const components = componentSet {/* <-- ADD THIS! */}
+
+{/* (content) */}
+```
+
+## Doc-Only Components
+
+Functional components for the Astro project are housed in `/src/components`. These support Astro/Svelte/React.
+
+- Astro - used for simple presentational components without logic.
+- React/Svelte - functional components that implement state, logic, or interaction.
+
+## Global Components
+
+A suite of global components are automatically imported within MDX pages via [astro-auto-importer](https://github.com/delucis/astro-auto-import/tree/main/packages/astro-auto-import).
+
+> TIP: These components are configure via `astro.config.mjs` > `AutoImport()` in the project root.
+
+### Essential Code
+
+Code Blocks are provided via [Expressive Code](https://expressive-code.com/) via either the `` component or Markdown fences. This is powered by the [Shiki](https://shiki.matsu.io/) syntax highlighter. View the [list of supported languages](https://github.com/shikijs/textmate-grammars-themes/blob/main/packages/tm-grammars/README.md).
+
+```tsx
+Skeleton`} lang="html" />
+```
+
+
Skeleton\n```'} lang="mdx" />
+
+### Preview
+
+Allows you to quickly toggle between an example component and it's source code.
+
+```ts
+import Example from '@examples/foo/Example.astro';
+import ExampleRaw from '@examples/foo/Example.astro?raw';
+```
+
+```astro
+