diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml
new file mode 100644
index 000000000..983219dc7
--- /dev/null
+++ b/.github/workflows/deploy-docs.yml
@@ -0,0 +1,77 @@
+name: Deploy Documentation
+
+on:
+ push:
+ branches:
+ - main
+ paths:
+ - 'docs/**'
+ - '.github/workflows/deploy-docs.yml'
+ workflow_dispatch:
+
+permissions:
+ contents: read
+ pages: write
+ id-token: write
+
+concurrency:
+ group: pages
+ cancel-in-progress: false
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ - name: Setup Node
+ uses: actions/setup-node@v4
+ with:
+ node-version: 20
+
+ - name: Setup pnpm
+ uses: pnpm/action-setup@v4
+ with:
+ version: 8
+
+ - name: Get pnpm store directory
+ shell: bash
+ run: |
+ echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
+
+ - name: Setup pnpm cache
+ uses: actions/cache@v4
+ with:
+ path: ${{ env.STORE_PATH }}
+ key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
+ restore-keys: |
+ ${{ runner.os }}-pnpm-store-
+
+ - name: Install dependencies
+ run: pnpm install --frozen-lockfile
+
+ - name: Build documentation
+ run: pnpm docs:build
+
+ - name: Setup Pages
+ uses: actions/configure-pages@v4
+
+ - name: Upload artifact
+ uses: actions/upload-pages-artifact@v3
+ with:
+ path: docs/.vitepress/dist
+
+ deploy:
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ needs: build
+ runs-on: ubuntu-latest
+ name: Deploy
+ steps:
+ - name: Deploy to GitHub Pages
+ id: deployment
+ uses: actions/deploy-pages@v4
diff --git a/.gitignore b/.gitignore
index 9d76b7f61..dfd0056a8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -36,3 +36,7 @@ Thumbs.db
# ObjectUI specific
*.umd.js
*.esm.js
+
+# VitePress build output
+docs/.vitepress/dist
+docs/.vitepress/cache
diff --git a/README.md b/README.md
index c8c3e7b1a..1bd613303 100644
--- a/README.md
+++ b/README.md
@@ -9,7 +9,7 @@ A high-performance, schema-driven UI system built on **React 18**, **Tailwind CS
[](https://github.com/objectql/object-ui/actions/workflows/ci.yml)
[](https://opensource.org/licenses/MIT)
-[Documentation](https://objectui.org) · [Playground](https://object-ui.org/playground) · [Report Bug](https://github.com/objectql/object-ui/issues)
+[Documentation](https://www.objectui.org) · [Playground](https://www.objectui.org/playground) · [Report Bug](https://github.com/objectql/object-ui/issues)
diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts
new file mode 100644
index 000000000..53aac67fc
--- /dev/null
+++ b/docs/.vitepress/config.mts
@@ -0,0 +1,84 @@
+import { defineConfig } from 'vitepress'
+
+// https://vitepress.dev/reference/site-config
+export default defineConfig({
+ title: "Object UI",
+ description: "The Modular Interface Engine for the Enterprise",
+ base: '/',
+ ignoreDeadLinks: true,
+
+ themeConfig: {
+ // https://vitepress.dev/reference/default-theme-config
+ logo: '/logo.svg',
+
+ nav: [
+ { text: 'Home', link: '/' },
+ { text: 'Guide', link: '/guide/introduction' },
+ { text: 'Roadmap', link: '/ROADMAP' },
+ { text: 'Protocol', link: '/protocol/overview' },
+ { text: 'API', link: '/api/core' }
+ ],
+
+ sidebar: {
+ '/guide/': [
+ {
+ text: 'Getting Started',
+ items: [
+ { text: 'Introduction', link: '/guide/introduction' },
+ { text: 'Quick Start', link: '/guide/quick-start' },
+ { text: 'Installation', link: '/guide/installation' }
+ ]
+ },
+ {
+ text: 'Core Concepts',
+ items: [
+ { text: 'Schema Rendering', link: '/guide/schema-rendering' },
+ { text: 'Component Registry', link: '/guide/component-registry' },
+ { text: 'Expression System', link: '/guide/expressions' }
+ ]
+ }
+ ],
+
+ '/protocol/': [
+ {
+ text: 'Protocol Specifications',
+ items: [
+ { text: 'Overview', link: '/protocol/overview' },
+ { text: 'Object', link: '/protocol/object' },
+ { text: 'View', link: '/protocol/view' },
+ { text: 'Page', link: '/protocol/page' },
+ { text: 'Form', link: '/protocol/form' },
+ { text: 'Menu', link: '/protocol/menu' },
+ { text: 'App', link: '/protocol/app' },
+ { text: 'Report', link: '/protocol/report' }
+ ]
+ }
+ ],
+
+ '/api/': [
+ {
+ text: 'API Reference',
+ items: [
+ { text: 'Core', link: '/api/core' },
+ { text: 'React', link: '/api/react' },
+ { text: 'Components', link: '/api/components' },
+ { text: 'Designer', link: '/api/designer' }
+ ]
+ }
+ ]
+ },
+
+ socialLinks: [
+ { icon: 'github', link: 'https://github.com/objectql/object-ui' }
+ ],
+
+ footer: {
+ message: 'Released under the MIT License.',
+ copyright: 'Copyright © 2024-present ObjectQL'
+ },
+
+ search: {
+ provider: 'local'
+ }
+ }
+})
diff --git a/docs/README.md b/docs/README.md
new file mode 100644
index 000000000..2652665ca
--- /dev/null
+++ b/docs/README.md
@@ -0,0 +1,81 @@
+# Object UI Documentation
+
+This directory contains the VitePress documentation site for Object UI.
+
+## Development
+
+Start the development server:
+
+```bash
+pnpm docs:dev
+```
+
+Visit `http://localhost:5173` to see the site.
+
+## Building
+
+Build the documentation:
+
+```bash
+pnpm docs:build
+```
+
+The built site will be in `docs/.vitepress/dist/`.
+
+Preview the built site:
+
+```bash
+pnpm docs:preview
+```
+
+## Deployment
+
+The documentation is automatically deployed to GitHub Pages when changes are pushed to the main branch.
+
+See `.github/workflows/deploy-docs.yml` for the deployment configuration.
+
+## Structure
+
+```
+docs/
+├── .vitepress/
+│ ├── config.mts # VitePress configuration
+│ └── dist/ # Build output (generated)
+├── guide/ # User guides
+│ ├── introduction.md
+│ ├── quick-start.md
+│ └── installation.md
+├── protocol/ # Protocol specifications
+│ ├── overview.md
+│ ├── object.md
+│ ├── view.md
+│ └── ...
+├── api/ # API documentation
+│ ├── core.md
+│ ├── react.md
+│ ├── components.md
+│ └── designer.md
+├── index.md # Homepage
+├── roadmap.md # Public roadmap
+└── package.json # Docs workspace config
+```
+
+## Adding Content
+
+### New Guide Page
+
+1. Create a new `.md` file in `guide/`
+2. Add it to the sidebar in `.vitepress/config.mts`
+
+### New Protocol Spec
+
+1. Create a new `.md` file in `protocol/`
+2. Add it to the protocol sidebar section in `.vitepress/config.mts`
+
+## Customization
+
+Edit `.vitepress/config.mts` to customize:
+- Navigation menu
+- Sidebar structure
+- Site metadata
+- Theme settings
diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md
new file mode 100644
index 000000000..3a5e7047c
--- /dev/null
+++ b/docs/ROADMAP.md
@@ -0,0 +1,295 @@
+# Object UI Roadmap
+## What's Coming Next
+
+Welcome! This roadmap shows what we're building for Object UI and when you can expect it. We're committed to transparency, so you can plan your projects around our releases.
+
+**Last Updated**: January 2026 · **Updated Monthly**
+
+---
+
+## 🎯 Our Vision
+
+Object UI makes building beautiful, performant interfaces as simple as writing JSON. No deep expertise in React, design systems, or CSS required—just describe what you want, and we handle the rest.
+
+> **"From JSON to world-class UI in minutes"**
+
+We're building this for developers who want to:
+- ⚡ **Build faster**: Stop writing repetitive UI code
+- 🎨 **Look better**: Get professional designs out of the box
+- 📱 **Work everywhere**: One codebase for web, mobile, and beyond
+- 🤝 **Collaborate easily**: Real-time editing and version control built-in
+
+---
+
+## 🚀 What Makes Object UI Different
+
+### For You as a Developer
+
+**Faster Development**
+- Create complete CRUD interfaces in minutes, not days
+- Pre-built components that just work
+- AI helps you write the JSON schema
+
+**Better Performance**
+- **3x faster** page loads than traditional low-code platforms
+- **6x smaller** bundle sizes (< 50KB vs 300KB+)
+- Built on modern React 18+ with automatic optimizations
+
+**Easy to Learn**
+- If you know React, you already know most of Object UI
+- Full TypeScript support with autocomplete
+- Works with your existing tools and workflows
+
+**Full Control**
+- Extend or customize any component
+- Use as much or as little as you need
+- Export to standard React code anytime
+
+---
+
+## 📅 Release Timeline
+
+### Q1 2026: Foundation (Available March 2026)
+
+#### Core Features You'll Get
+✅ **Schema-Driven Rendering**
+Write JSON, get beautiful UI instantly:
+
+```json
+{
+ "type": "form",
+ "title": "Contact Us",
+ "body": [
+ { "type": "input", "name": "email", "label": "Your Email" },
+ { "type": "textarea", "name": "message", "label": "Message" }
+ ]
+}
+```
+
+✅ **20+ Production-Ready Components**
+Everything you need to build real applications:
+- Forms: Input, Select, Checkbox, Radio, DatePicker, File Upload
+- Data: Table, List, Card, Tree View
+- Layout: Grid, Flex, Container, Tabs
+- Feedback: Alerts, Toasts, Dialogs, Loading States
+
+✅ **Expression System**
+Make your UI dynamic with simple expressions:
+```javascript
+// Show/hide based on conditions
+visibleOn: "${user.role === 'admin'}"
+
+// Format data on the fly
+value: "${formatDate(createdAt, 'MMM DD')}"
+```
+
+✅ **Playground & Docs**
+- Interactive playground to try everything
+- Complete documentation with examples
+- Video tutorials to get started
+
+**What this means for you**: Start building real applications with Object UI. Perfect for admin panels, dashboards, and internal tools.
+
+---
+
+### Q2 2026: Power Features (Available June 2026)
+
+#### New Features Coming
+
+🎯 **Smart Data Management**
+- Connect to any REST or GraphQL API
+- Automatic caching and pagination
+- Optimistic updates for instant UX
+- Offline support built-in
+
+🎯 **Advanced Components**
+- Rich Text Editor (like Notion)
+- Charts & Visualizations (powered by Recharts)
+- Drag-and-Drop Interfaces
+- Maps & Geolocation
+- Video Players
+- Code Editors
+
+🎯 **Theme System**
+- Light/dark mode out of the box
+- Customize colors, fonts, spacing
+- 5+ professional themes included
+- Create your own brand theme in minutes
+
+**What this means for you**: Build complex, data-driven applications. Perfect for CRMs, analytics dashboards, and content management systems.
+
+---
+
+### Q3 2026: Visual Designer (Available September 2026)
+
+This is where it gets exciting! Build UIs without writing any code.
+
+#### The Designer Experience
+
+🎨 **Drag-and-Drop Canvas**
+- Drag components from the palette
+- See exactly what you're building
+- Edit properties with a visual panel
+- Arrange layouts visually
+
+🎨 **AI-Powered**
+Just describe what you want:
+> "Create a user profile page with avatar, bio, and recent activity"
+
+The AI generates the complete schema for you. Edit visually or tweak the JSON.
+
+🎨 **Real-Time Collaboration**
+- Work with your team like in Google Docs
+- See cursor positions and changes live
+- Comment on specific components
+- No more "sending updated files"
+
+🎨 **Version Control**
+- Built-in Git integration
+- Create branches for experiments
+- Review changes before merging
+- Rollback anytime
+
+**What this means for you**: Non-developers can build UIs. Designers and developers collaborate in real-time. Everyone moves faster.
+
+---
+
+### Q4 2026: Enterprise Ready (Available December 2026)
+
+Making Object UI ready for your biggest projects.
+
+#### Enterprise Features
+
+🏢 **Security & Permissions**
+- Role-based access control
+- Field-level permissions
+- Data masking for sensitive info
+- SOC 2 compliant
+
+🏢 **Performance at Scale**
+- Virtual scrolling for huge lists (100K+ items)
+- Automatic code splitting
+- CDN optimization
+- Service Worker caching
+
+🏢 **Global Ready**
+- Support for 20+ languages
+- Right-to-left (RTL) layouts
+- Timezone handling
+- Currency formatting
+
+🏢 **Audit & Analytics**
+- Track who changed what
+- Usage analytics dashboard
+- Performance monitoring
+- Error tracking
+
+**What this means for you**: Use Object UI for mission-critical applications at any scale.
+
+---
+
+## 🎁 What You Can Do Today
+
+While we're building the future, you can already:
+
+### Try the Preview
+We have an early preview available! Check out our [Playground](https://objectui.org/playground) to see what's possible.
+
+### Join the Community
+- ⭐ **Star us on GitHub**: [objectql/object-ui](https://github.com/objectql/object-ui)
+- 📧 **Email us**: hello@objectui.org
+
+### Shape the Future
+Your feedback matters! Tell us:
+- What features do you need most?
+- What problems are you trying to solve?
+- What would make your life easier?
+
+Open an issue on GitHub or email us at hello@objectui.org
+
+---
+
+## 🔮 Beyond 2026: The Future
+
+Here's what we're dreaming about for 2027 and beyond:
+
+### Multi-Framework Support
+Use Object UI with Vue, Svelte, or any framework
+```
+React (2026) → Vue (2027) → Svelte (2027)
+```
+
+### True Cross-Platform
+One schema, truly everywhere:
+- ✅ Web (responsive)
+- 📱 Mobile (React Native)
+- 💻 Desktop (Electron)
+- 🎯 Mini Programs (WeChat, Alipay)
+
+### Next-Level AI
+- Generate entire applications from descriptions
+- Automatically optimize for performance
+- Smart accessibility improvements
+- Design suggestions based on best practices
+
+### 3D & Immersive
+- WebGL component library
+- VR/AR interface building
+- 3D data visualizations
+
+---
+
+## ❓ Frequently Asked Questions
+
+### When will Object UI be production-ready?
+**March 2026** for the core features. We have a preview available now that you can evaluate.
+
+### Will it always be open source?
+Yes! The core will always be MIT licensed. We may offer paid enterprise features, but the community edition will be powerful on its own.
+
+### How does this compare to [other tool]?
+We're focused on:
+- Modern tech stack (React 18, Tailwind, TypeScript)
+- Developer-first experience
+- Performance (3x faster, 6x smaller)
+- True modularity (use what you need)
+
+### Can I use this with my existing React app?
+Absolutely! Object UI is designed to integrate seamlessly. Use it for one page or your entire app.
+
+### What if I need a feature not on the roadmap?
+Tell us! Open a GitHub issue. For custom features, we can discuss enterprise support.
+
+### Will my schemas from Q1 work in Q4?
+Yes. We're committed to backward compatibility. Your schemas will keep working as we add features.
+
+---
+
+## 📬 Stay Updated
+
+Want to know when new features launch? Here's how to stay in the loop:
+
+- ⭐ **Star on GitHub**: Watch releases at [objectql/object-ui](https://github.com/objectql/object-ui)
+- 📧 **Email**: Contact us at hello@objectui.org for announcements
+
+We update this roadmap monthly with our progress.
+
+---
+
+## 🙏 Thank You
+
+Object UI is built by developers, for developers. Thank you for your interest and support. We can't wait to see what you build!
+
+**Questions?** Email us at hello@objectui.org
+
+**Want to contribute?** Open an issue or pull request on [GitHub](https://github.com/objectql/object-ui)
+
+---
+
+
+
+*Building the future of interface development, one JSON schema at a time* 🚀
+
+**[GitHub](https://github.com/objectql/object-ui)** · **[Documentation](https://objectui.org)** · **[Playground](https://objectui.org/playground)**
+
+
diff --git a/docs/api/components.md b/docs/api/components.md
new file mode 100644
index 000000000..280a1da63
--- /dev/null
+++ b/docs/api/components.md
@@ -0,0 +1,115 @@
+# Components API
+
+The `@object-ui/components` package provides pre-built UI components that implement the Object UI protocol.
+
+## Installation
+
+```bash
+npm install @object-ui/components
+```
+
+## Registration
+
+Register all default components:
+
+```tsx
+import { registerDefaultRenderers } from '@object-ui/components'
+
+registerDefaultRenderers()
+```
+
+Or register individual components:
+
+```tsx
+import { Button, Input, Form } from '@object-ui/components'
+import { registerRenderer } from '@object-ui/react'
+
+registerRenderer('button', Button)
+registerRenderer('input', Input)
+registerRenderer('form', Form)
+```
+
+## Component List
+
+### Form Components
+
+- `input` - Text input field
+- `textarea` - Multi-line text input
+- `select` - Dropdown select
+- `checkbox` - Checkbox input
+- `radio` - Radio button
+- `date-picker` - Date selection
+- `file-upload` - File upload
+
+### Data Display
+
+- `table` - Data table with sorting/pagination
+- `list` - List view
+- `card` - Card container
+- `tree` - Tree view
+
+### Layout
+
+- `grid` - Grid layout
+- `flex` - Flexbox layout
+- `container` - Container wrapper
+- `tabs` - Tab navigation
+
+### Feedback
+
+- `alert` - Alert messages
+- `toast` - Toast notifications
+- `dialog` - Modal dialog
+- `loading` - Loading indicators
+
+## Customization
+
+### Styling
+
+All components accept Tailwind classes:
+
+```json
+{
+ "type": "button",
+ "className": "bg-blue-500 hover:bg-blue-700 text-white"
+}
+```
+
+### Extending Components
+
+Create custom components:
+
+```tsx
+import { Button } from '@object-ui/components'
+
+function CustomButton(props) {
+ return (
+
+ )
+}
+
+registerRenderer('custom-button', CustomButton)
+```
+
+## Theming
+
+Apply themes to all components:
+
+```tsx
+import { ThemeProvider } from '@object-ui/components'
+
+
+
+
+```
+
+## API Reference
+
+Full component API documentation coming soon.
+
+For now, see:
+- [GitHub Repository](https://github.com/objectql/object-ui/tree/main/packages/components)
+- [Storybook](https://storybook.objectui.org) (coming soon)
diff --git a/docs/api/core.md b/docs/api/core.md
new file mode 100644
index 000000000..dd8872225
--- /dev/null
+++ b/docs/api/core.md
@@ -0,0 +1,117 @@
+# Core API
+
+The `@object-ui/core` package (also published as `@object-ui/protocol`) provides the foundational type definitions and schemas for Object UI.
+
+## Installation
+
+```bash
+npm install @object-ui/protocol
+```
+
+## Type Definitions
+
+### Schema Types
+
+```typescript
+import type {
+ BaseSchema,
+ PageSchema,
+ FormSchema,
+ ViewSchema,
+ ComponentSchema
+} from '@object-ui/protocol'
+```
+
+### BaseSchema
+
+All schemas extend from `BaseSchema`:
+
+```typescript
+interface BaseSchema {
+ type: string
+ id?: string
+ name?: string
+ className?: string
+ style?: React.CSSProperties
+ visible?: boolean
+ visibleOn?: string
+}
+```
+
+## Component Types
+
+### Page
+
+```typescript
+interface PageSchema extends BaseSchema {
+ type: 'page'
+ title: string
+ description?: string
+ body: ComponentSchema | ComponentSchema[]
+}
+```
+
+### Form
+
+```typescript
+interface FormSchema extends BaseSchema {
+ type: 'form'
+ title?: string
+ body: FieldSchema[]
+ actions?: ActionSchema[]
+ onSubmit?: string
+}
+```
+
+### Input
+
+```typescript
+interface InputSchema extends BaseSchema {
+ type: 'input'
+ name: string
+ label: string
+ placeholder?: string
+ required?: boolean
+ disabled?: boolean
+ inputType?: 'text' | 'email' | 'password' | 'number'
+}
+```
+
+## Validation
+
+### Using Zod
+
+```typescript
+import { PageSchema } from '@object-ui/protocol'
+import { z } from 'zod'
+
+const pageValidator = z.object({
+ type: z.literal('page'),
+ title: z.string(),
+ body: z.any()
+})
+
+// Validate
+const result = pageValidator.safeParse(mySchema)
+```
+
+## Utilities
+
+### Type Guards
+
+```typescript
+import { isPageSchema, isFormSchema } from '@object-ui/protocol'
+
+if (isPageSchema(schema)) {
+ // TypeScript knows schema is PageSchema
+ console.log(schema.title)
+}
+```
+
+## API Reference
+
+Full API documentation coming soon.
+
+For now, see:
+- [GitHub Repository](https://github.com/objectql/object-ui/tree/main/packages/protocol)
+- [TypeScript Definitions](https://github.com/objectql/object-ui/blob/main/packages/protocol/src/types)
diff --git a/docs/api/designer.md b/docs/api/designer.md
new file mode 100644
index 000000000..7583621be
--- /dev/null
+++ b/docs/api/designer.md
@@ -0,0 +1,65 @@
+# Designer API
+
+The `@object-ui/designer` package provides a visual drag-and-drop editor for creating Object UI schemas.
+
+::: warning Coming Soon
+The Designer is planned for release in Q3 2026. This documentation is a preview.
+:::
+
+## Planned Features
+
+### Visual Editor
+
+```tsx
+import { Designer } from '@object-ui/designer'
+
+function App() {
+ const [schema, setSchema] = useState(null)
+
+ return (
+
+ )
+}
+```
+
+### Component Palette
+
+Drag components from the palette to the canvas.
+
+### Property Editor
+
+Edit component properties visually with a sidebar panel.
+
+### Real-time Preview
+
+See your changes instantly with live preview.
+
+### AI Assistant
+
+Generate schemas using natural language:
+
+```tsx
+
+```
+
+### Collaboration
+
+Real-time multi-user editing like Google Docs.
+
+## Stay Updated
+
+Want to be notified when Designer launches?
+
+- ⭐ [Star on GitHub](https://github.com/objectql/object-ui)
+- 📧 [Email us](mailto:hello@objectui.org)
+- 📋 [View Roadmap](/roadmap)
+
+## Roadmap
+
+See the [full roadmap](/roadmap#q3-2026-visual-designer-available-september-2026) for Designer features and timeline.
diff --git a/docs/api/react.md b/docs/api/react.md
new file mode 100644
index 000000000..ce9c62c18
--- /dev/null
+++ b/docs/api/react.md
@@ -0,0 +1,91 @@
+# React API
+
+The `@object-ui/react` package provides React components and hooks for rendering Object UI schemas.
+
+## Installation
+
+```bash
+npm install @object-ui/react
+```
+
+## Components
+
+### SchemaRenderer
+
+The main component for rendering schemas:
+
+```tsx
+import { SchemaRenderer } from '@object-ui/react'
+
+function App() {
+ return (
+
+ )
+}
+```
+
+#### Props
+
+| Prop | Type | Description |
+|------|------|-------------|
+| `schema` | `ComponentSchema` | The schema to render |
+| `data` | `Record` | Data context for expressions |
+| `onSubmit` | `(data: any) => void` | Form submit handler |
+| `onChange` | `(data: any) => void` | Data change handler |
+
+## Hooks
+
+### useSchemaContext
+
+Access the current schema context:
+
+```tsx
+import { useSchemaContext } from '@object-ui/react'
+
+function MyComponent() {
+ const { data, updateData } = useSchemaContext()
+
+ return {data.value}
+}
+```
+
+### useRegistry
+
+Access the component registry:
+
+```tsx
+import { useRegistry } from '@object-ui/react'
+
+function MyComponent() {
+ const registry = useRegistry()
+ const Component = registry.get('button')
+
+ return
+}
+```
+
+## Context Providers
+
+### SchemaProvider
+
+Provides schema context to child components:
+
+```tsx
+import { SchemaProvider } from '@object-ui/react'
+
+
+
+
+```
+
+## API Reference
+
+Full API documentation coming soon.
+
+For now, see:
+- [GitHub Repository](https://github.com/objectql/object-ui/tree/main/packages/react)
+- [Examples](https://github.com/objectql/object-ui/tree/main/examples)
diff --git a/docs/guide/installation.md b/docs/guide/installation.md
new file mode 100644
index 000000000..dd40f23f2
--- /dev/null
+++ b/docs/guide/installation.md
@@ -0,0 +1,236 @@
+# Installation
+
+This guide covers everything you need to install and configure Object UI in your project.
+
+## Prerequisites
+
+Before installing Object UI, ensure you have:
+
+- **Node.js** 18.0 or higher
+- **React** 18.0 or higher
+- A package manager: **npm**, **yarn**, or **pnpm**
+
+## Package Overview
+
+Object UI is distributed as several packages:
+
+| Package | Description | Required |
+|---------|-------------|----------|
+| `@object-ui/protocol` | Type definitions and schemas | Optional |
+| `@object-ui/engine` | Core logic and state management | Optional |
+| `@object-ui/react` | React integration and hooks | **Yes** |
+| `@object-ui/components` | UI component library | **Yes** |
+| `@object-ui/designer` | Visual designer (Q3 2026) | Optional |
+
+## Basic Installation
+
+For most projects, you only need two packages:
+
+::: code-group
+
+```bash [npm]
+npm install @object-ui/react @object-ui/components
+```
+
+```bash [yarn]
+yarn add @object-ui/react @object-ui/components
+```
+
+```bash [pnpm]
+pnpm add @object-ui/react @object-ui/components
+```
+
+:::
+
+## Setup Steps
+
+### 1. Install Dependencies
+
+First, install the required packages as shown above.
+
+### 2. Install Peer Dependencies
+
+Object UI requires these peer dependencies:
+
+```bash
+npm install react@^18.0.0 react-dom@^18.0.0
+```
+
+### 3. Configure Tailwind CSS
+
+Object UI uses Tailwind CSS for styling. Add to your `tailwind.config.js`:
+
+```js
+/** @type {import('tailwindcss').Config} */
+module.exports = {
+ content: [
+ './src/**/*.{js,jsx,ts,tsx}',
+ './node_modules/@object-ui/components/**/*.{js,ts,jsx,tsx}'
+ ],
+ theme: {
+ extend: {},
+ },
+ plugins: [],
+}
+```
+
+### 4. Import Styles
+
+Import Tailwind and Object UI styles in your main CSS file:
+
+```css
+/* src/index.css */
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+@import '@object-ui/components/dist/style.css';
+```
+
+### 5. Register Components
+
+Register the default components in your app entry point:
+
+```tsx
+// src/main.tsx
+import { registerDefaultRenderers } from '@object-ui/components'
+
+registerDefaultRenderers()
+```
+
+## TypeScript Setup
+
+If you're using TypeScript, Object UI provides full type definitions:
+
+```json
+{
+ "compilerOptions": {
+ "types": ["@object-ui/react", "@object-ui/components"]
+ }
+}
+```
+
+## Framework Integration
+
+### Next.js
+
+For Next.js 13+ with App Router:
+
+```tsx
+// app/providers.tsx
+'use client'
+
+import { useEffect } from 'react'
+import { registerDefaultRenderers } from '@object-ui/components'
+
+export function Providers({ children }) {
+ useEffect(() => {
+ registerDefaultRenderers()
+ }, [])
+
+ return <>{children}>
+}
+```
+
+### Vite
+
+Vite works out of the box. Just ensure you have the Tailwind config.
+
+### Create React App
+
+Create React App requires no special configuration.
+
+## Optional Packages
+
+### Protocol Types
+
+For TypeScript type definitions:
+
+```bash
+npm install @object-ui/protocol
+```
+
+```typescript
+import type { PageSchema, FormSchema } from '@object-ui/protocol'
+```
+
+### Engine
+
+For advanced state management and data handling:
+
+```bash
+npm install @object-ui/engine
+```
+
+## Verification
+
+Verify your installation with this test:
+
+```tsx
+import { SchemaRenderer } from '@object-ui/react'
+
+const testSchema = {
+ type: "text",
+ value: "Hello from Object UI!"
+}
+
+function App() {
+ return
+}
+```
+
+If you see "Hello from Object UI!" rendered, you're all set! ✅
+
+## Troubleshooting
+
+### Styles Not Loading
+
+Make sure you:
+1. Added Object UI to Tailwind content paths
+2. Imported the CSS file
+3. Imported Tailwind directives
+
+### Components Not Rendering
+
+Check that you:
+1. Called `registerDefaultRenderers()`
+2. Installed all peer dependencies
+3. Used the correct schema format
+
+### TypeScript Errors
+
+Ensure you:
+1. Installed type packages
+2. Added types to `tsconfig.json`
+3. Updated TypeScript to version 5.0+
+
+## Development Setup
+
+For contributing or local development:
+
+```bash
+# Clone the repository
+git clone https://github.com/objectql/object-ui.git
+cd object-ui
+
+# Install dependencies
+pnpm install
+
+# Start development
+pnpm dev
+```
+
+## Next Steps
+
+- [Quick Start](/guide/quick-start) - Build your first app
+- [Schema Rendering](/guide/schema-rendering) - Learn core concepts
+- [Component Registry](/guide/component-registry) - Understand components
+
+## Getting Help
+
+Having trouble? We're here to help:
+
+- 📖 [Documentation](/)
+- 💬 [GitHub Discussions](https://github.com/objectql/object-ui/discussions)
+- 🐛 [Report Issues](https://github.com/objectql/object-ui/issues)
+- 📧 [Email](mailto:hello@objectui.org)
diff --git a/docs/guide/introduction.md b/docs/guide/introduction.md
new file mode 100644
index 000000000..af53907b5
--- /dev/null
+++ b/docs/guide/introduction.md
@@ -0,0 +1,161 @@
+# Introduction
+
+Welcome to Object UI! This guide will help you understand what Object UI is, why it exists, and how it can help you build better interfaces faster.
+
+## What is Object UI?
+
+Object UI is a schema-driven UI system that transforms JSON descriptions into beautiful, performant React interfaces. Instead of writing component code, you write JSON that describes what you want, and Object UI handles the rendering, styling, and behavior.
+
+### The Core Idea
+
+```json
+// You write this
+{
+ "type": "form",
+ "title": "Sign Up",
+ "body": [
+ { "type": "input", "name": "email", "label": "Email" },
+ { "type": "input-password", "name": "password", "label": "Password" }
+ ]
+}
+
+// Object UI renders a complete, functional form
+```
+
+## Why Object UI?
+
+### 1. Build Faster
+
+Stop writing repetitive UI code. A complete CRUD interface that would take days to code can be created in minutes with Object UI.
+
+**Traditional React:**
+```tsx
+// 200+ lines of code for forms, tables, validation, etc.
+```
+
+**Object UI:**
+```json
+// 20 lines of JSON
+{
+ "type": "crud",
+ "api": "/api/users",
+ "columns": [...]
+}
+```
+
+### 2. Better Performance
+
+Object UI is built on modern technologies with performance in mind:
+
+- **3x faster** page loads than traditional low-code platforms
+- **6x smaller** bundle sizes (< 50KB vs 300KB+)
+- Automatic code splitting and lazy loading
+- Zero runtime CSS overhead with Tailwind
+
+### 3. Easy to Learn
+
+If you know React and JSON, you already know most of Object UI:
+
+- Uses standard React patterns (no custom lifecycle)
+- Full TypeScript support with autocomplete
+- Works with your existing tools and workflows
+- Progressive adoption - use as much or as little as you need
+
+### 4. Full Control
+
+Unlike other low-code platforms, you're never locked in:
+
+- Extend or customize any component
+- Export to standard React code anytime
+- Mix Object UI with your existing React code
+- Override styles with Tailwind classes
+
+## How It Works
+
+Object UI follows a simple three-step process:
+
+### 1. Define Your Schema
+
+Write JSON that describes your UI:
+
+```json
+{
+ "type": "page",
+ "title": "Dashboard",
+ "body": {
+ "type": "grid",
+ "columns": 3,
+ "items": [
+ { "type": "card", "title": "Users", "value": "${stats.users}" },
+ { "type": "card", "title": "Revenue", "value": "${stats.revenue}" }
+ ]
+ }
+}
+```
+
+### 2. Render with Object UI
+
+Pass your schema to the renderer:
+
+```tsx
+import { SchemaRenderer } from '@object-ui/react'
+
+function App() {
+ return
+}
+```
+
+### 3. Get Beautiful UI
+
+Object UI automatically:
+- Renders the components
+- Applies professional styling
+- Handles validation and state
+- Manages accessibility
+- Optimizes performance
+
+## Architecture
+
+Object UI is built as a modular ecosystem:
+
+```
+@object-ui/protocol → Type definitions and schemas
+@object-ui/engine → Core logic and state management
+@object-ui/ui → UI components (Tailwind + Shadcn)
+@object-ui/renderer → Schema-to-React transformer
+@object-ui/designer → Visual editor (coming Q3 2026)
+```
+
+This modular design means:
+- Use only what you need
+- Smaller bundle sizes (tree-shakable)
+- Framework-agnostic core (Vue/Svelte adapters possible)
+- Independent versioning per package
+
+## What Can You Build?
+
+Object UI is perfect for:
+
+- **Admin Panels**: Complete CRUD interfaces in minutes
+- **Dashboards**: Data visualization and analytics
+- **Forms**: Complex multi-step forms with validation
+- **CMS**: Content management systems
+- **Internal Tools**: Business applications
+- **Prototypes**: Rapid UI prototyping
+
+## Next Steps
+
+Ready to get started?
+
+- [Quick Start](/guide/quick-start) - Build your first Object UI app
+- [Installation](/guide/installation) - Setup instructions
+- [Schema Rendering](/guide/schema-rendering) - Learn the core concepts
+- [Roadmap](/roadmap) - See what's coming next
+
+## Getting Help
+
+- 📖 [Documentation](/) - You're reading it!
+- ⭐ [GitHub](https://github.com/objectql/object-ui) - Star us and report issues
+- 📧 [Email](mailto:hello@objectui.org) - Get in touch
+
+Let's build something amazing! 🚀
diff --git a/docs/guide/quick-start.md b/docs/guide/quick-start.md
new file mode 100644
index 000000000..1cb6d3afa
--- /dev/null
+++ b/docs/guide/quick-start.md
@@ -0,0 +1,193 @@
+# Quick Start
+
+Get up and running with Object UI in less than 5 minutes.
+
+## Installation
+
+Install Object UI packages using your preferred package manager:
+
+::: code-group
+
+```bash [npm]
+npm install @object-ui/react @object-ui/components
+```
+
+```bash [yarn]
+yarn add @object-ui/react @object-ui/components
+```
+
+```bash [pnpm]
+pnpm add @object-ui/react @object-ui/components
+```
+
+:::
+
+## Your First Component
+
+Create a simple form with Object UI:
+
+```tsx
+import React from 'react'
+import { SchemaRenderer } from '@object-ui/react'
+import { registerDefaultRenderers } from '@object-ui/components'
+
+// Register the default components
+registerDefaultRenderers()
+
+const schema = {
+ type: "form",
+ title: "Contact Form",
+ body: [
+ {
+ type: "input",
+ name: "name",
+ label: "Your Name",
+ required: true
+ },
+ {
+ type: "input",
+ name: "email",
+ label: "Email",
+ inputType: "email",
+ required: true
+ },
+ {
+ type: "textarea",
+ name: "message",
+ label: "Message",
+ rows: 4
+ }
+ ],
+ actions: [
+ {
+ type: "submit",
+ label: "Send Message",
+ level: "primary"
+ }
+ ]
+}
+
+function App() {
+ const handleSubmit = (data) => {
+ console.log('Form submitted:', data)
+ }
+
+ return (
+
+ )
+}
+
+export default App
+```
+
+That's it! You now have a fully functional, validated form with professional styling.
+
+## Add Data
+
+Pass data to your components using the `data` prop:
+
+```tsx
+const data = {
+ user: {
+ name: 'John Doe',
+ email: 'john@example.com'
+ }
+}
+
+
+```
+
+Reference data in your schema using expressions:
+
+```json
+{
+ "type": "text",
+ "value": "${user.name}"
+}
+```
+
+## Conditional Rendering
+
+Show/hide components based on conditions:
+
+```json
+{
+ "type": "alert",
+ "message": "Welcome, Admin!",
+ "visibleOn": "${user.role === 'admin'}"
+}
+```
+
+## API Integration
+
+Connect to your backend API:
+
+```tsx
+const schema = {
+ type: "crud",
+ api: {
+ list: "/api/users",
+ create: "/api/users",
+ update: "/api/users/${id}",
+ delete: "/api/users/${id}"
+ },
+ columns: [
+ { name: "name", label: "Name" },
+ { name: "email", label: "Email" },
+ { name: "role", label: "Role" }
+ ]
+}
+```
+
+Object UI automatically handles:
+- Data fetching and caching
+- Pagination
+- Sorting and filtering
+- CRUD operations
+- Loading and error states
+
+## Styling
+
+Customize styles using Tailwind classes:
+
+```json
+{
+ "type": "card",
+ "className": "p-6 shadow-lg rounded-xl bg-gradient-to-r from-blue-500 to-purple-500",
+ "body": {
+ "type": "text",
+ "value": "Beautiful Card",
+ "className": "text-white text-2xl font-bold"
+ }
+}
+```
+
+## Next Steps
+
+Now that you have the basics:
+
+- [Installation Guide](/guide/installation) - Detailed setup instructions
+- [Schema Rendering](/guide/schema-rendering) - Learn the core concepts
+- [Component Registry](/guide/component-registry) - Understand component registration
+- [Expression System](/guide/expressions) - Master dynamic expressions
+
+## Examples
+
+Check out complete examples:
+
+- [Form Example](https://github.com/objectql/object-ui/tree/main/examples/forms)
+- [CRUD Example](https://github.com/objectql/object-ui/tree/main/examples/crud)
+- [Dashboard Example](https://github.com/objectql/object-ui/tree/main/examples/dashboard)
+
+## Need Help?
+
+- 📖 [Full Documentation](/)
+- 💬 [GitHub Discussions](https://github.com/objectql/object-ui/discussions)
+- 🐛 [Report Issues](https://github.com/objectql/object-ui/issues)
+- 📧 [Email Support](mailto:hello@objectui.org)
diff --git a/docs/index.md b/docs/index.md
new file mode 100644
index 000000000..e44ebaa31
--- /dev/null
+++ b/docs/index.md
@@ -0,0 +1,126 @@
+---
+layout: home
+
+hero:
+ name: "Object UI"
+ text: "The Modular Interface Engine"
+ tagline: From JSON to world-class UI in minutes
+ image:
+ src: /hero.svg
+ alt: Object UI
+ actions:
+ - theme: brand
+ text: Get Started
+ link: /guide/introduction
+ - theme: alt
+ text: View Roadmap
+ link: /roadmap
+ - theme: alt
+ text: GitHub
+ link: https://github.com/objectql/object-ui
+
+features:
+ - icon: ⚡
+ title: Blazing Fast
+ details: Built on React 18+ with automatic optimizations. 3x faster page loads and 6x smaller bundles than traditional low-code platforms.
+
+ - icon: 🎨
+ title: Beautiful by Default
+ details: Professional designs out of the box with Tailwind CSS and Shadcn/UI. Light/dark themes and full customization support.
+
+ - icon: 🔧
+ title: Developer Friendly
+ details: Full TypeScript support, standard React patterns, and complete control. Export to code anytime.
+
+ - icon: 🚀
+ title: Schema Driven
+ details: Define your UI in JSON. No deep expertise in React, design systems, or CSS required.
+
+ - icon: 🤖
+ title: AI Powered
+ details: Natural language to UI generation. Describe what you want and let AI create the schema.
+
+ - icon: 🌍
+ title: Cross Platform
+ details: One schema works everywhere - web, mobile, desktop. Build once, run anywhere.
+---
+
+## Quick Example
+
+```json
+{
+ "type": "form",
+ "title": "Contact Us",
+ "body": [
+ {
+ "type": "input",
+ "name": "email",
+ "label": "Your Email",
+ "required": true
+ },
+ {
+ "type": "textarea",
+ "name": "message",
+ "label": "Message"
+ }
+ ],
+ "actions": [
+ {
+ "type": "submit",
+ "label": "Send Message",
+ "level": "primary"
+ }
+ ]
+}
+```
+
+That's it! This JSON automatically creates a beautiful, accessible, and functional contact form.
+
+## Why Object UI?
+
+
+
From JSON to World-Class UI
+
Building beautiful, performant, and accessible interfaces shouldn't require deep expertise in design systems, state management, or CSS. With Object UI, you describe what you want in JSON, and we handle the rest.
+
+
+### Built for Speed
+
+- **3x faster** first contentful paint
+- **6x smaller** bundle sizes
+- **Zero runtime** CSS overhead
+
+### Modern Stack
+
+- React 18+ with concurrent features
+- Tailwind CSS for styling
+- Shadcn/UI components
+- TypeScript strict mode
+
+### Production Ready
+
+- WCAG 2.1 AA accessible
+- 85%+ test coverage
+- Enterprise security
+- 99.9% uptime
+
+## Getting Started
+
+
+
Object UI is currently in preview. The Q1 2026 release will be production-ready.
+
+
+```bash
+# Install the packages
+npm install @object-ui/react @object-ui/components
+
+# Start building
+import { SchemaRenderer } from '@object-ui/react'
+```
+
+[Read the full guide →](/guide/introduction)
+
+## Community
+
+- ⭐ [Star on GitHub](https://github.com/objectql/object-ui)
+- 📧 [Email us](mailto:hello@objectui.org)
+- 🐛 [Report issues](https://github.com/objectql/object-ui/issues)
diff --git a/docs/package.json b/docs/package.json
new file mode 100644
index 000000000..99a1e48e2
--- /dev/null
+++ b/docs/package.json
@@ -0,0 +1,15 @@
+{
+ "name": "object-ui-docs",
+ "version": "0.1.0",
+ "private": true,
+ "type": "module",
+ "scripts": {
+ "dev": "vitepress dev",
+ "build": "vitepress build",
+ "preview": "vitepress preview"
+ },
+ "devDependencies": {
+ "vitepress": "^1.0.0",
+ "vue": "^3.4.0"
+ }
+}
diff --git a/docs/protocol/app.md b/docs/protocol/app.md
new file mode 100644
index 000000000..c3e5084a4
--- /dev/null
+++ b/docs/protocol/app.md
@@ -0,0 +1,48 @@
+# Application Metadata
+
+Application metadata defines the high-level container for a specific set of functionality (e.g., "Sales", "HR", "Admin"). It serves effectively as a grouping mechanism for menus and other resources.
+
+## 1. File Naming
+
+**Convention:** `[app_name].app.yml`
+
+**Examples:**
+- `sales.app.yml`
+- `admin.app.yml`
+
+## 2. Structure
+
+The structure is intentionally kept simple to allow for flexibility in frontend plugins and extensions.
+
+```yaml
+name: sales
+label: Sales App
+description: Manage leads, opportunities, and customers.
+icon: currency
+logo: /assets/sales-logo.png
+homepage: /app/sales
+sort_no: 10
+is_active: true
+```
+
+## 3. Properties
+
+| Property | Type | Required | Description |
+| :--- | :--- | :--- | :--- |
+| `name` | string | **Yes** | Unique identifier for the application. |
+| `label` | string | **Yes** | Human-readable name displayed in the UI launcher. |
+| `description` | string | No | Description of the application's purpose. |
+| `icon` | string | No | Icon name (e.g., standard icon set name) for the app launcher. |
+| `logo` | string | No | URL or path to a custom logo image. |
+| `homepage` | string | No | The default path to navigate to when the app is opened. |
+| `sort_no` | number | No | Integer for sorting applications in the launcher. |
+| `is_active` | boolean | No | Whether the app is visible to users. Defaults to `true`. |
+
+## 4. Relationship with Menus
+
+Menus are defined separately in `*.menu.yml` files and can be linked to an application. This separation allows for:
+- Reusing menus across applications.
+- Keeping the application definition lightweight.
+- Frontend plugins to dynamically inject or modify menus without touching the app definition.
+
+See [Menu Metadata](./menu.md) for details on defining structure and items.
diff --git a/docs/protocol/form.md b/docs/protocol/form.md
new file mode 100644
index 000000000..106d346a3
--- /dev/null
+++ b/docs/protocol/form.md
@@ -0,0 +1,1046 @@
+# Form Metadata
+
+Form metadata defines the structure, layout, and behavior of data entry forms. Forms are the primary interface for creating and editing records. They are designed to be both functional and AI-understandable for automated form generation.
+
+## 1. Overview
+
+Form metadata provides:
+
+- **Layout definition**: Multi-column layouts, sections, tabs, wizards
+- **Field configuration**: Labels, help text, default values, placeholders
+- **Conditional logic**: Show/hide fields based on conditions
+- **Validation**: Real-time field validation with clear messages
+- **Workflow integration**: Multi-step forms, wizards
+- **Responsive design**: Mobile-optimized layouts
+- **AI assistance**: Smart defaults, auto-complete, validation helpers
+
+**File Naming Convention:** `.form.yml`
+
+The filename (without the `.form.yml` extension) automatically becomes the form's identifier. This eliminates the need for a redundant `name` property.
+
+**Examples:**
+- `project_form.form.yml` → Form name: `project_form`
+- `quick_task.form.yml` → Form name: `quick_task`
+- `customer_edit.form.yml` → Form name: `customer_edit`
+
+## 2. Root Structure with AI Context
+
+```yaml
+# File: project_form.form.yml
+# Form name is inferred from filename!
+
+label: Project Information
+type: edit # create, edit, view
+object: projects
+description: Form for creating and editing projects
+
+# AI-friendly context
+ai_context:
+ intent: "Capture essential project information for planning and tracking"
+ user_persona: "Project manager or team lead"
+ typical_completion_time: "3-5 minutes"
+
+ # Help AI understand form flow
+ user_journey: |
+ 1. Enter basic project details (name, description)
+ 2. Set timeline and budget
+ 3. Assign team members
+ 4. Review and submit
+
+ # Common issues to prevent
+ common_errors:
+ - "Forgetting to set realistic deadlines"
+ - "Not assigning budget upfront"
+ - "Missing team member assignments"
+
+ # Quality checks
+ quality_guidance: |
+ - Name should be descriptive and unique
+ - Description should explain problem being solved
+ - Budget should align with project scope
+
+# Layout Configuration
+layout:
+ columns: 2
+ sections:
+ - name: basic_info
+ label: Basic Information
+ columns: 2
+
+ ai_context:
+ intent: "Capture core identifying information"
+ user_guidance: "Start with a clear, descriptive project name"
+ completion_order: 1
+
+ fields:
+ - name
+ - status
+ - priority
+ - category
+
+ - name: details
+ label: Project Details
+ columns: 1
+
+ ai_context:
+ intent: "Document project purpose and scope"
+ user_guidance: "Be specific about what problems this project solves"
+ completion_order: 2
+
+ fields:
+ - description
+ - objectives
+ - deliverables
+
+ - name: timeline
+ label: Timeline & Budget
+ columns: 2
+
+ ai_context:
+ intent: "Set realistic expectations for duration and cost"
+ validation_focus: "Ensure dates are logical and budget is within limits"
+ completion_order: 3
+
+ fields:
+ - start_date
+ - end_date
+ - budget
+ - estimated_hours
+
+ - name: assignment
+ label: Team Assignment
+ columns: 2
+
+ ai_context:
+ intent: "Assign ownership and build project team"
+ user_guidance: "Owner is accountable for project success"
+ completion_order: 4
+
+ fields:
+ - owner
+ - team
+ - department
+
+# Field Overrides with AI Enhancement
+field_config:
+ name:
+ placeholder: "e.g., 'Q2 Website Redesign'"
+ help_text: "Choose a name that clearly identifies the project"
+
+ ai_context:
+ intent: "Unique project identifier for tracking and reporting"
+
+ # Smart suggestions
+ suggestions_based_on:
+ - "Department name"
+ - "Current quarter"
+ - "Primary deliverable"
+
+ quality_check: "Should be descriptive, not generic like 'Project 1'"
+
+ examples:
+ good: ["Website Redesign 2026", "Q1 Marketing Campaign"]
+ bad: ["Project", "Untitled", "New Project"]
+
+ description:
+ rows: 5
+ placeholder: "What is this project about? What problem does it solve?"
+ help_text: "Provide comprehensive project overview"
+
+ ai_context:
+ intent: "Clear problem statement and expected outcomes"
+ quality_check: "Should answer: What, Why, and Expected Outcome"
+ min_quality_length: 50 # Characters for meaningful description
+
+ ai_assist:
+ enabled: true
+ feature: "auto_expand"
+ prompt: "Expand this brief description into a full project overview"
+
+ status:
+ default_value: planning
+ help_text: "Current project stage"
+
+ ai_context:
+ intent: "Track project through lifecycle"
+ default_rationale: "New projects start in planning phase"
+
+ budget:
+ prefix: $
+ format: currency
+ help_text: "Total approved project budget"
+
+ ai_context:
+ intent: "Financial planning and tracking"
+
+ # Smart defaults based on project type
+ smart_defaults:
+ small_project: 25000
+ medium_project: 100000
+ large_project: 500000
+
+ # Warning thresholds (severity: info, warning, error)
+ warning_thresholds:
+ - amount: 50000
+ message: "Projects over $50K require manager approval"
+ severity: warning
+
+ - amount: 200000
+ message: "Projects over $200K require director approval"
+ severity: error
+
+ start_date:
+ default: "$today"
+
+ ai_context:
+ intent: "When project work begins"
+ smart_default_rationale: "Most projects start immediately or within days"
+
+ end_date:
+ ai_context:
+ intent: "Target completion date"
+
+ # AI can suggest realistic timelines
+ suggestions:
+ - value: "start_date + 30 days"
+ label: "1 month project"
+ - value: "start_date + 90 days"
+ label: "1 quarter project"
+ - value: "start_date + 180 days"
+ label: "6 month project"
+
+ owner:
+ default: "$current_user"
+
+ ai_context:
+ intent: "Person responsible for project success"
+ default_rationale: "Usually the person creating the project"
+
+ # Smart suggestions
+ suggestions_based_on:
+ - "Current user's manager"
+ - "Department head"
+ - "Previous project owners in same category"
+
+# Conditional Display with Business Logic
+conditional_logic:
+ - name: show_completion_fields
+
+ ai_context:
+ intent: "Show completion tracking when project is done"
+ business_rule: "Completed projects need actual dates and costs"
+
+ condition:
+ field: status
+ operator: "="
+ value: completed
+
+ actions:
+ - show_fields: [completion_date, actual_cost, completion_notes]
+ - mark_required: [completion_date, completion_notes]
+ - hide_fields: [estimated_hours]
+
+ - name: require_approval_info
+
+ ai_context:
+ intent: "High-value projects need approval tracking"
+ business_rule: "Company policy requires approval for projects > $50K"
+
+ condition:
+ field: budget
+ operator: ">"
+ value: 50000
+
+ actions:
+ - show_fields: [approval_required, approver, approval_justification]
+ - mark_required: [approver, approval_justification]
+ - show_message:
+ type: info
+ text: "This project requires management approval due to budget amount"
+
+ - name: suggest_risk_assessment
+
+ ai_context:
+ intent: "Large or complex projects should assess risks"
+ business_rule: "Projects over 6 months or $200K should document risks"
+
+ condition:
+ any_of:
+ - field: budget
+ operator: ">"
+ value: 200000
+ - field: estimated_hours
+ operator: ">"
+ value: 1000
+
+ actions:
+ - show_section: risk_assessment
+ - show_message:
+ type: warning
+ text: "Consider documenting project risks and mitigation strategies"
+
+# AI-Powered Form Features
+ai_features:
+ # Auto-complete from context
+ auto_complete:
+ enabled: true
+ fields: [description, objectives]
+
+ ai_context:
+ intent: "Help users write better project descriptions"
+ feature: "Expand brief notes into full descriptions"
+
+ # Smart validation
+ validation_assistant:
+ enabled: true
+
+ ai_context:
+ intent: "Real-time suggestions for improving data quality"
+ checks:
+ - "Description is too vague"
+ - "Budget seems unrealistic for project scope"
+ - "Timeline conflicts with resource availability"
+
+ # Similar projects
+ similar_projects:
+ enabled: true
+ match_on: [category, department, budget_range]
+
+ ai_context:
+ intent: "Show similar past projects to help with estimation"
+ use: "User can copy timeline and budget estimates from successful projects"
+
+# Actions
+actions:
+ primary:
+ - label: Save
+ action: save
+ icon: save
+ - label: Save & New
+ action: save_and_new
+ icon: add
+
+ secondary:
+ - label: Cancel
+ action: cancel
+ icon: close
+
+# Validation
+validation:
+ on_change: true
+ on_submit: true
+ show_errors_inline: true
+```
+
+## 3. Form Types
+
+| Type | Description | Use Case |
+|:---|:---|:---|
+| `create` | New record creation | Creating new entities |
+| `edit` | Record editing | Updating existing records |
+| `view` | Read-only display | Viewing record details |
+| `wizard` | Multi-step form | Complex data entry workflows |
+| `inline` | Inline editing | Quick edits in lists/grids |
+| `quick_create` | Minimal quick form | Fast record creation |
+
+## 4. Layout Sections
+
+Organize fields into logical groups:
+
+```yaml
+layout:
+ # Global layout settings
+ columns: 2
+ spacing: medium
+
+ sections:
+ # Basic Section
+ - name: personal_info
+ label: Personal Information
+ description: Employee basic details
+ columns: 2
+ collapsible: true
+ collapsed: false
+ fields:
+ - first_name
+ - last_name
+ - email
+ - phone
+
+ # Full-width Section
+ - name: address
+ label: Address
+ columns: 1
+ fields:
+ - street
+ - city
+ - state
+ - zip_code
+
+ # Nested Sections
+ - name: employment
+ label: Employment Details
+ sections:
+ - name: position
+ label: Position
+ fields:
+ - title
+ - department
+ - manager
+
+ - name: compensation
+ label: Compensation
+ fields:
+ - salary
+ - bonus
+ - stock_options
+```
+
+## 5. Field Configuration
+
+Override object-level field definitions:
+
+```yaml
+field_config:
+ # Text Field
+ email:
+ label: Email Address
+ placeholder: user@example.com
+ help_text: Primary contact email
+ required: true
+ autocomplete: email
+ validation:
+ format: email
+
+ # Number Field
+ budget:
+ label: Project Budget
+ prefix: $
+ suffix: USD
+ format: currency
+ decimal_places: 2
+ min: 0
+ max: 1000000
+ step: 1000
+ help_text: Total allocated budget
+
+ # Select Field
+ status:
+ label: Status
+ help_text: Current project status
+ default_value: draft
+ style: dropdown # dropdown, radio, buttons
+
+ # Lookup Field
+ owner:
+ label: Project Owner
+ help_text: Responsible person
+ search_fields: [name, email]
+ display_format: "{name} ({email})"
+ create_new: true # Allow creating new record
+
+ # Date Field
+ start_date:
+ label: Start Date
+ help_text: Project kickoff date
+ min_date: today
+ max_date: +1 year
+ default_value: today
+ format: MM/DD/YYYY
+
+ # Textarea
+ description:
+ label: Description
+ placeholder: Enter detailed description
+ rows: 5
+ max_length: 5000
+ show_character_count: true
+ rich_text: false
+
+ # Checkbox
+ is_public:
+ label: Public Project
+ help_text: Visible to all users
+ default_value: false
+
+ # File Upload
+ attachments:
+ label: Attachments
+ help_text: Upload relevant documents
+ multiple: true
+ accept: [.pdf, .doc, .docx, .xls, .xlsx]
+ max_size: 10MB
+ max_files: 5
+```
+
+## 6. Conditional Logic
+
+Show/hide fields and control behavior based on conditions:
+
+```yaml
+conditional_logic:
+ # Show/Hide Fields
+ - name: show_international_fields
+ condition:
+ field: country
+ operator: "!="
+ value: US
+ actions:
+ - show_fields: [passport_number, visa_status]
+ - hide_fields: [ssn]
+
+ # Make Fields Required
+ - name: require_reason_for_delay
+ condition:
+ field: status
+ operator: "="
+ value: delayed
+ actions:
+ - mark_required: [delay_reason, estimated_recovery_date]
+
+ # Change Field Properties
+ - name: readonly_after_approval
+ condition:
+ field: approval_status
+ operator: "="
+ value: approved
+ actions:
+ - readonly_fields: [budget, scope, timeline]
+
+ # Multiple Conditions (AND)
+ - name: high_value_approval
+ condition:
+ type: and
+ conditions:
+ - field: amount
+ operator: ">"
+ value: 10000
+ - field: department
+ operator: "="
+ value: finance
+ actions:
+ - show_fields: [cfo_approval]
+ - mark_required: [cfo_approval]
+
+ # Multiple Conditions (OR)
+ - name: special_handling
+ condition:
+ type: or
+ conditions:
+ - field: priority
+ operator: "="
+ value: urgent
+ - field: vip_customer
+ operator: "="
+ value: true
+ actions:
+ - show_section: special_instructions
+ - set_field_value:
+ field: requires_review
+ value: true
+```
+
+## 7. Tabs Layout
+
+Organize complex forms into tabs:
+
+```yaml
+layout:
+ type: tabs
+ tabs:
+ # Tab 1: Basic Info
+ - name: basic
+ label: Basic Information
+ icon: info
+ sections:
+ - name: details
+ fields:
+ - name
+ - description
+ - status
+
+ # Tab 2: Advanced
+ - name: advanced
+ label: Advanced Settings
+ icon: settings
+ sections:
+ - name: configuration
+ fields:
+ - priority
+ - tags
+ - custom_fields
+
+ # Tab 3: Related Records
+ - name: related
+ label: Related Items
+ icon: link
+ sections:
+ - name: tasks
+ type: related_list
+ object: tasks
+ relation: project_id
+
+ - name: documents
+ type: related_list
+ object: documents
+ relation: project_id
+```
+
+## 8. Wizard Forms
+
+Multi-step forms for complex workflows:
+
+```yaml
+name: project_wizard
+type: wizard
+object: projects
+
+steps:
+ # Step 1: Basic Info
+ - name: basic
+ label: Basic Information
+ description: Enter project fundamentals
+ fields:
+ - name
+ - description
+ - category
+ validation:
+ required: [name, category]
+
+ # Show only if validation passes
+ allow_next: true
+
+ # Step 2: Team
+ - name: team
+ label: Team Assignment
+ description: Assign team members
+ fields:
+ - owner
+ - team_members
+ - department
+
+ # Skip if single-person project
+ skip_if:
+ field: project_type
+ operator: "="
+ value: individual
+
+ # Step 3: Timeline
+ - name: timeline
+ label: Timeline & Budget
+ description: Set schedule and budget
+ fields:
+ - start_date
+ - end_date
+ - budget
+ - milestones
+
+ # Step 4: Review
+ - name: review
+ label: Review & Submit
+ description: Review all information
+ type: summary
+
+ # Show summary of all fields
+ summary_sections:
+ - label: Basic Information
+ fields: [name, description, category]
+ - label: Team
+ fields: [owner, team_members]
+ - label: Timeline
+ fields: [start_date, end_date, budget]
+
+# Wizard Navigation
+wizard_config:
+ allow_back: true
+ allow_skip: false
+ show_progress: true
+ save_draft: true
+
+ buttons:
+ back: Previous
+ next: Next
+ finish: Create Project
+```
+
+## 9. Field Groups
+
+Group related fields visually:
+
+```yaml
+layout:
+ sections:
+ - name: contact
+ label: Contact Information
+
+ # Field Groups within Section
+ field_groups:
+ # Primary Contact
+ - label: Primary Contact
+ columns: 2
+ fields:
+ - primary_email
+ - primary_phone
+
+ # Secondary Contact
+ - label: Secondary Contact
+ columns: 2
+ collapsible: true
+ collapsed: true
+ fields:
+ - secondary_email
+ - secondary_phone
+```
+
+## 10. Inline Editing
+
+Quick edit configuration:
+
+```yaml
+name: task_inline_edit
+type: inline
+object: tasks
+
+# Fields available for inline edit
+editable_fields:
+ - status
+ - priority
+ - assignee
+ - due_date
+
+# Quick action buttons
+quick_actions:
+ - label: Complete
+ action: update
+ values:
+ status: completed
+ completed_date: $current_date
+
+ - label: Reassign
+ action: show_field
+ field: assignee
+```
+
+## 11. Quick Create Form
+
+Minimal form for fast data entry:
+
+```yaml
+name: task_quick_create
+type: quick_create
+object: tasks
+label: Quick Add Task
+
+# Minimal required fields
+fields:
+ - name
+ - assignee
+ - due_date
+
+# Auto-fill fields
+defaults:
+ status: open
+ priority: medium
+ created_by: $current_user
+
+# After creation
+after_create:
+ action: close # or 'stay', 'redirect'
+ message: Task created successfully
+```
+
+## 12. Dynamic Fields
+
+Add/remove field groups dynamically:
+
+```yaml
+layout:
+ sections:
+ - name: contacts
+ label: Contact Persons
+ type: repeatable
+
+ # Field group that can be repeated
+ field_group:
+ - name
+ - email
+ - phone
+ - role
+
+ # Configuration
+ min_items: 1
+ max_items: 10
+ add_button_label: Add Contact
+ remove_button_label: Remove
+```
+
+## 13. Form Actions
+
+Define available actions on the form:
+
+```yaml
+actions:
+ # Primary Actions (prominent buttons)
+ primary:
+ - label: Save
+ action: save
+ icon: save
+ hotkey: Ctrl+S
+
+ - label: Save & Close
+ action: save_and_close
+ icon: save_close
+
+ # Secondary Actions (less prominent)
+ secondary:
+ - label: Save as Draft
+ action: save
+ values:
+ status: draft
+ icon: draft
+
+ - label: Cancel
+ action: cancel
+ icon: close
+ confirm: Discard changes?
+
+ # Custom Actions
+ custom:
+ - label: Send for Approval
+ action: custom
+ handler: send_for_approval
+ icon: send
+
+ # Only show when ready
+ visible_when:
+ field: status
+ operator: "="
+ value: ready_for_approval
+```
+
+## 14. Form Validation
+
+```yaml
+validation:
+ # When to validate
+ on_change: true # Validate as user types
+ on_blur: true # Validate when field loses focus
+ on_submit: true # Validate before submit
+
+ # How to show errors
+ show_errors_inline: true
+ show_error_summary: true
+ error_summary_position: top
+
+ # Validation rules
+ rules:
+ - fields: [start_date, end_date]
+ validator: |
+ function validate(values) {
+ return values.end_date > values.start_date;
+ }
+ message: End date must be after start date
+```
+
+## 15. Responsive Design
+
+Mobile-optimized layouts:
+
+```yaml
+layout:
+ # Desktop layout
+ desktop:
+ columns: 2
+ sections: [...]
+
+ # Tablet layout
+ tablet:
+ columns: 1
+ compact_sections: true
+
+ # Mobile layout
+ mobile:
+ columns: 1
+ stack_fields: true
+ hide_labels: false
+
+ # Show only essential fields
+ visible_fields:
+ - name
+ - status
+ - priority
+ - due_date
+```
+
+## 16. Field Dependencies
+
+Load field options based on other field values:
+
+```yaml
+field_config:
+ state:
+ type: select
+ label: State
+
+ city:
+ type: select
+ label: City
+ depends_on: state
+
+ # Load cities based on selected state
+ options_query:
+ object: cities
+ filters:
+ - field: state
+ operator: "="
+ value: $state
+ fields: [name]
+ sort:
+ - field: name
+ direction: asc
+```
+
+## 17. Auto-save
+
+Automatically save form progress:
+
+```yaml
+auto_save:
+ enabled: true
+ interval: 30000 # 30 seconds
+ mode: draft # Save as draft
+
+ # Show indicator
+ show_indicator: true
+ indicator_position: top-right
+
+ # Recovery
+ enable_recovery: true
+ recovery_prompt: You have unsaved changes. Restore?
+```
+
+## 18. Form Events & Hooks
+
+Execute logic on form events:
+
+```yaml
+events:
+ # Before form loads
+ on_load: |
+ async function onLoad(context) {
+ // Pre-populate fields
+ if (context.user.department) {
+ context.setFieldValue('department', context.user.department);
+ }
+ }
+
+ # When field changes
+ on_field_change:
+ budget:
+ handler: |
+ function onChange(value, context) {
+ // Auto-calculate tax
+ const tax = value * 0.1;
+ context.setFieldValue('estimated_tax', tax);
+ }
+
+ # Before submit
+ on_before_submit: |
+ async function beforeSubmit(values, context) {
+ // Final validation
+ if (values.amount > 10000 && !values.approval) {
+ context.showError('High-value orders require approval');
+ return false;
+ }
+ return true;
+ }
+
+ # After successful submit
+ on_success: |
+ function onSuccess(result, context) {
+ context.showMessage('Record saved successfully');
+ context.redirect(`/projects/${result.id}`);
+ }
+
+ # On error
+ on_error: |
+ function onError(error, context) {
+ context.showError(`Failed to save: ${error.message}`);
+ }
+```
+
+## 19. Form Modes
+
+Different modes for different contexts:
+
+```yaml
+modes:
+ # Create mode
+ create:
+ title: New Project
+ show_fields: [name, description, owner, start_date]
+ defaults:
+ status: draft
+ created_by: $current_user
+
+ # Edit mode
+ edit:
+ title: Edit Project
+ show_fields: [name, description, status, owner, start_date, end_date]
+ readonly_fields: [created_by, created_at]
+
+ # Clone mode
+ clone:
+ title: Clone Project
+ show_fields: [name, description, owner]
+ exclude_fields: [id, created_at, created_by]
+ field_overrides:
+ name:
+ default_value: "Copy of {original_name}"
+```
+
+## 20. Implementation Example
+
+```typescript
+// src/forms/project.form.yml
+import { FormDefinition } from '@objectql/types';
+
+export const project_form: FormDefinition = {
+ name: 'project_form',
+ type: 'edit',
+ object: 'projects',
+ layout: {
+ columns: 2,
+ sections: [
+ {
+ name: 'basic',
+ label: 'Basic Information',
+ fields: ['name', 'description', 'status']
+ }
+ ]
+ },
+ field_config: {
+ status: {
+ default_value: 'draft'
+ }
+ }
+};
+```
+
+## 21. Best Practices
+
+1. **User Experience**: Group related fields logically
+2. **Progressive Disclosure**: Show advanced fields only when needed
+3. **Clear Labels**: Use descriptive labels and help text
+4. **Validation**: Validate early and provide clear error messages
+5. **Performance**: Lazy-load heavy components
+6. **Accessibility**: Support keyboard navigation and screen readers
+7. **Mobile**: Design for mobile-first
+8. **Defaults**: Set sensible default values
+
+## 22. Related Specifications
+
+- [Objects & Fields](./object.md) - Data model
+- [Views](./view.md) - Display layouts
+- [Validation](./validation.md) - Validation rules
+- [Actions](./action.md) - Form actions
diff --git a/docs/protocol/menu.md b/docs/protocol/menu.md
new file mode 100644
index 000000000..6c88a1c5c
--- /dev/null
+++ b/docs/protocol/menu.md
@@ -0,0 +1,771 @@
+# Menu & Navigation Metadata
+
+Menu and navigation metadata defines the application structure, navigation hierarchy, and user interface organization.
+
+## 1. Overview
+
+Navigation features include:
+
+- **Menu Structures**: Top nav, side nav, context menus
+- **Hierarchical Organization**: Nested menu items and folders
+- **Dynamic Menus**: Role-based, permission-aware navigation
+- **Quick Actions**: Global actions and shortcuts
+- **Breadcrumbs**: Automatic navigation trails
+- **Search Integration**: Global search within navigation
+
+**File Naming Convention:** `.menu.yml`
+
+The filename (without the `.menu.yml` extension) automatically becomes the menu's identifier.
+
+**Examples:**
+- `main_navigation.menu.yml` → Menu name: `main_navigation`
+- `admin_menu.menu.yml` → Menu name: `admin_menu`
+
+**Note:** Menu metadata is often embedded within Application metadata (`.app.yml` files) as the `navigation` property. See [Application Metadata](./application.md) for the recommended approach.
+
+## 2. Root Structure
+
+```yaml
+# File: main_navigation.menu.yml
+# Menu name is inferred from filename!
+
+label: Main Menu
+type: sidebar # sidebar, topnav, context, mobile
+app: sales # Optional: Link to a specific application
+
+# Menu Items
+items:
+ # Dashboard
+ - name: home
+ label: Home
+ icon: home
+ path: /
+ type: page
+
+ # Sales Section
+ - name: sales
+ label: Sales
+ icon: currency
+ type: section
+ items:
+ - name: leads
+ label: Leads
+ icon: users
+ path: /sales/leads
+ object: leads
+ view: list
+
+ - name: opportunities
+ label: Opportunities
+ icon: funnel
+ path: /sales/opportunities
+ object: opportunities
+ view: kanban
+
+ - name: quotes
+ label: Quotes
+ icon: document
+ path: /sales/quotes
+ object: quotes
+
+ # Service Section
+ - name: service
+ label: Service
+ icon: support
+ type: section
+ items:
+ - name: cases
+ label: Cases
+ path: /service/cases
+ object: cases
+ badge:
+ query:
+ object: cases
+ filters: [['status', '=', 'open']]
+ function: count
+ color: red
+
+ - name: knowledge
+ label: Knowledge Base
+ path: /service/knowledge
+ object: articles
+
+ # Reports
+ - name: reports
+ label: Reports
+ icon: chart
+ type: section
+ items:
+ - name: sales_reports
+ label: Sales Reports
+ type: folder
+ items:
+ - name: revenue_report
+ label: Revenue Report
+ path: /reports/revenue
+ icon: report
+
+ - name: pipeline_report
+ label: Pipeline Report
+ path: /reports/pipeline
+ icon: report
+
+ - name: dashboards
+ label: Dashboards
+ type: folder
+ items:
+ - name: sales_dashboard
+ label: Sales Dashboard
+ path: /dashboards/sales
+ icon: dashboard
+
+ # Divider
+ - type: divider
+
+ # Settings
+ - name: settings
+ label: Settings
+ icon: settings
+ path: /settings
+ permissions:
+ - admin
+
+# Quick Actions (Global)
+quick_actions:
+ - name: new_lead
+ label: New Lead
+ icon: add
+ action: create_record
+ object: leads
+ hotkey: Ctrl+Shift+L
+
+ - name: new_case
+ label: New Case
+ icon: add
+ action: create_record
+ object: cases
+ hotkey: Ctrl+Shift+C
+
+ - name: search
+ label: Global Search
+ icon: search
+ action: open_search
+ hotkey: Ctrl+K
+```
+
+## 3. Menu Types
+
+| Type | Description | Use Case |
+|:---|:---|:---|
+| `sidebar` | Vertical side navigation | Main app navigation |
+| `topnav` | Horizontal top bar | Secondary navigation |
+| `context` | Context-sensitive menu | Right-click, actions menu |
+| `mobile` | Mobile hamburger menu | Mobile navigation |
+| `breadcrumb` | Navigation trail | Page hierarchy |
+
+## 4. Menu Item Types
+
+### 4.1 Page Links
+
+```yaml
+items:
+ - name: dashboard
+ label: Dashboard
+ type: page
+ path: /dashboard
+ icon: home
+
+ # Open behavior
+ target: _self # _self, _blank, modal
+
+ # Highlight when active
+ active_match: /dashboard*
+```
+
+### 4.2 Object Views
+
+Direct links to object list views:
+
+```yaml
+items:
+ - name: accounts
+ label: Accounts
+ type: object
+ object: accounts
+ view: list # Uses default or specified view
+ icon: company
+ path: /accounts
+
+ # Quick filters
+ default_filters:
+ - field: status
+ operator: "="
+ value: active
+```
+
+### 4.3 Sections/Folders
+
+Group related items:
+
+```yaml
+items:
+ - name: sales_section
+ label: Sales
+ type: section # or 'folder'
+ icon: currency
+
+ # Collapsible
+ collapsible: true
+ collapsed: false
+
+ # Nested items
+ items:
+ - name: leads
+ label: Leads
+ path: /leads
+
+ - name: accounts
+ label: Accounts
+ path: /accounts
+```
+
+### 4.4 Actions
+
+Execute actions from menu:
+
+```yaml
+items:
+ - name: export_data
+ label: Export Data
+ type: action
+ icon: download
+ action: export_records
+
+ # Confirmation
+ confirm: Export all data?
+
+ # Params
+ params:
+ format: csv
+```
+
+### 4.5 External Links
+
+Link to external resources:
+
+```yaml
+items:
+ - name: help_center
+ label: Help Center
+ type: external
+ url: https://help.example.com
+ icon: help
+ target: _blank
+```
+
+### 4.6 Dividers
+
+Visual separators:
+
+```yaml
+items:
+ - type: divider
+
+ # Or with label
+ - type: divider
+ label: Admin Tools
+```
+
+## 5. Dynamic Menu Items
+
+Menu items that adapt based on context:
+
+```yaml
+items:
+ # Show only if user has permission
+ - name: admin_panel
+ label: Admin Panel
+ path: /admin
+ icon: shield
+
+ permissions:
+ - admin
+
+ # Show based on feature flag
+ - name: beta_feature
+ label: Beta Feature
+ path: /beta
+
+ visible_when:
+ feature_flag: beta_features_enabled
+
+ # Show based on condition
+ - name: pending_approvals
+ label: Pending Approvals
+ path: /approvals
+
+ visible_when:
+ query:
+ object: approvals
+ filters: [['status', '=', 'pending']]
+ function: count
+ operator: ">"
+ value: 0
+```
+
+## 6. Badges & Indicators
+
+Show counts or status on menu items:
+
+```yaml
+items:
+ - name: notifications
+ label: Notifications
+ path: /notifications
+ icon: bell
+
+ # Badge configuration
+ badge:
+ # Dynamic count
+ query:
+ object: notifications
+ filters:
+ - field: read
+ operator: "="
+ value: false
+ - field: user_id
+ operator: "="
+ value: $current_user.id
+ function: count
+
+ # Styling
+ color: red # red, blue, green, yellow, gray
+ max_value: 99 # Show "99+" if exceeds
+ show_zero: false
+```
+
+## 7. Favorites & Pinned Items
+
+User-customizable favorites:
+
+```yaml
+favorites:
+ enabled: true
+
+ # Default favorites
+ default_items:
+ - dashboard
+ - my_tasks
+ - my_calendar
+
+ # Max favorites
+ max_favorites: 10
+
+ # Position
+ position: top # top, bottom, section
+
+ # Label
+ section_label: Favorites
+```
+
+## 8. Recent Items
+
+Track recently accessed items:
+
+```yaml
+recent_items:
+ enabled: true
+
+ # Number to track
+ max_items: 10
+
+ # Include types
+ include_types:
+ - page
+ - object
+ - report
+
+ # Position in menu
+ position: top
+ section_label: Recent
+```
+
+## 9. Search Integration
+
+Global search in navigation:
+
+```yaml
+search:
+ enabled: true
+
+ # Position
+ position: top
+
+ # Hotkey
+ hotkey: Ctrl+K
+
+ # Search scope
+ scope:
+ - objects
+ - reports
+ - dashboards
+ - help_articles
+
+ # Quick actions in search
+ quick_actions:
+ - label: New Lead
+ action: create_record
+ object: leads
+
+ - label: New Task
+ action: create_record
+ object: tasks
+```
+
+## 10. Breadcrumbs
+
+Automatic navigation trail:
+
+```yaml
+breadcrumbs:
+ enabled: true
+
+ # Show on pages
+ show_on:
+ - object_detail
+ - object_edit
+ - reports
+
+ # Format
+ separator: "/"
+
+ # Home link
+ include_home: true
+ home_label: Home
+
+ # Truncation
+ max_items: 5
+ truncate_middle: true
+```
+
+## 11. Multi-Level Navigation
+
+Complex nested structures:
+
+```yaml
+items:
+ - name: sales
+ label: Sales
+ type: section
+ icon: currency
+
+ items:
+ # Level 2
+ - name: pipeline
+ label: Pipeline Management
+ type: folder
+
+ items:
+ # Level 3
+ - name: leads
+ label: Leads
+ path: /sales/pipeline/leads
+
+ - name: opportunities
+ label: Opportunities
+ path: /sales/pipeline/opportunities
+
+ # Level 2
+ - name: accounts
+ label: Account Management
+ type: folder
+
+ items:
+ # Level 3
+ - name: all_accounts
+ label: All Accounts
+ path: /sales/accounts
+
+ - name: my_accounts
+ label: My Accounts
+ path: /sales/accounts/mine
+```
+
+## 12. Responsive Navigation
+
+Mobile-optimized menus:
+
+```yaml
+responsive:
+ # Mobile behavior
+ mobile:
+ type: drawer # drawer, tabs, bottom_nav
+
+ # Collapsed by default
+ collapsed: true
+
+ # Show icons only
+ compact: true
+
+ # Bottom navigation
+ bottom_nav:
+ enabled: true
+ max_items: 5
+ items:
+ - home
+ - tasks
+ - notifications
+ - profile
+
+ # Tablet
+ tablet:
+ type: sidebar
+ collapsible: true
+ width: 240
+```
+
+## 13. Context Menus
+
+Right-click and action menus:
+
+```yaml
+# File: record_context_menu.menu.yml
+# Menu name is inferred from filename!
+
+type: context
+object: tasks
+
+items:
+ - name: edit
+ label: Edit
+ icon: edit
+ action: edit_record
+
+ - name: delete
+ label: Delete
+ icon: delete
+ action: delete_record
+ confirm: Delete this task?
+ destructive: true
+
+ - type: divider
+
+ - name: duplicate
+ label: Duplicate
+ icon: copy
+ action: duplicate_record
+
+ - name: share
+ label: Share
+ icon: share
+ action: share_record
+
+ - type: divider
+
+ - name: change_status
+ label: Change Status
+ icon: status
+ type: submenu
+ items:
+ - label: Mark Complete
+ action: update_field
+ field: status
+ value: completed
+
+ - label: Mark In Progress
+ action: update_field
+ field: status
+ value: in_progress
+```
+
+## 14. Theme & Styling
+
+Customize menu appearance:
+
+```yaml
+theme:
+ # Width
+ width: 280
+ collapsed_width: 64
+
+ # Colors
+ background: "#1a1a1a"
+ text_color: "#ffffff"
+ active_background: "#2d2d2d"
+ active_text_color: "#4CAF50"
+
+ # Icons
+ icon_size: 20
+ show_icons: true
+
+ # Typography
+ font_size: 14
+ font_weight: 400
+
+ # Spacing
+ item_padding: 12
+ section_padding: 20
+
+ # Animation
+ animation_duration: 200
+ hover_effect: true
+```
+
+## 15. Keyboard Navigation
+
+Keyboard shortcuts and accessibility:
+
+```yaml
+keyboard_navigation:
+ enabled: true
+
+ # Shortcuts
+ shortcuts:
+ toggle_menu: Alt+M
+ search: Ctrl+K
+ next_item: ArrowDown
+ prev_item: ArrowUp
+ expand_section: ArrowRight
+ collapse_section: ArrowLeft
+ select: Enter
+
+ # Accessibility
+ aria_labels: true
+ focus_visible: true
+ skip_navigation: true
+```
+
+## 16. User Customization
+
+Allow users to customize navigation:
+
+```yaml
+user_customization:
+ # Reorder items
+ allow_reorder: true
+
+ # Show/hide items
+ allow_toggle_visibility: true
+
+ # Custom folders
+ allow_custom_folders: true
+
+ # Themes
+ allow_theme_selection: true
+
+ # Save preferences
+ save_preferences: true
+ per_user: true
+```
+
+## 17. Analytics & Tracking
+
+Track navigation usage:
+
+```yaml
+analytics:
+ enabled: true
+
+ # Track events
+ track:
+ - menu_item_click
+ - search_usage
+ - quick_action_usage
+
+ # Metrics
+ metrics:
+ - popular_items
+ - user_navigation_paths
+ - search_queries
+```
+
+## 18. Implementation Example
+
+Complete menu definition:
+
+```yaml
+# File: main_navigation.menu.yml
+# Menu name is inferred from filename!
+
+label: Main Navigation
+type: sidebar
+
+items:
+ - name: home
+ label: Home
+ icon: home
+ path: /
+
+ - name: sales
+ label: Sales
+ icon: currency
+ type: section
+ items:
+ - name: leads
+ label: Leads
+ path: /leads
+ object: leads
+
+ - name: accounts
+ label: Accounts
+ path: /accounts
+ object: accounts
+```
+
+**TypeScript Implementation:**
+
+```typescript
+// File: main_navigation.menu.ts
+import { MenuDefinition } from '@objectql/types';
+
+export const main_menu: MenuDefinition = {
+ type: 'sidebar',
+ items: [
+ {
+ name: 'home',
+ label: 'Home',
+ icon: 'home',
+ path: '/'
+ },
+ {
+ name: 'sales',
+ label: 'Sales',
+ icon: 'currency',
+ type: 'section',
+ items: [
+ {
+ name: 'leads',
+ label: 'Leads',
+ path: '/leads',
+ object: 'leads'
+ },
+ {
+ name: 'accounts',
+ label: 'Accounts',
+ path: '/accounts',
+ object: 'accounts'
+ }
+ ]
+ }
+ ]
+};
+```
+
+## 19. Best Practices
+
+1. **Hierarchy**: Keep menu depth to 2-3 levels maximum
+2. **Icons**: Use consistent, meaningful icons
+3. **Labels**: Clear, concise menu labels
+4. **Grouping**: Logically group related items
+5. **Performance**: Lazy-load large menus
+6. **Mobile**: Optimize for touch interfaces
+7. **Accessibility**: Support keyboard navigation and screen readers
+8. **Permissions**: Filter menu items by user permissions
+9. **Testing**: Test navigation with different user roles
+
+## 20. Related Specifications
+
+- [Permissions](./permission.md) - Access control
+- [Views](./view.md) - Page layouts
+- [Objects](./object.md) - Data models
+- [Actions](./action.md) - Menu actions
diff --git a/docs/protocol/object.md b/docs/protocol/object.md
new file mode 100644
index 000000000..c5d60af1d
--- /dev/null
+++ b/docs/protocol/object.md
@@ -0,0 +1,655 @@
+# Object Definition
+
+Object files define business entities or database tables in YAML (or JSON). They are the foundation of your application's data model and are designed to be both human-readable and AI-friendly for automated code generation.
+
+**File Naming Convention:** `.object.yml`
+
+The filename (without the `.object.yml` extension) automatically becomes the object's API name. This eliminates the need for a redundant `name` property inside the file.
+
+**Examples:**
+- `project.object.yml` → Object API name: `project`
+- `task.object.yml` → Object API name: `task`
+- `customer_order.object.yml` → Object API name: `customer_order`
+
+Files should use **snake_case** for multi-word names (e.g., `project_tasks.object.yml`).
+
+## 1. Root Properties
+
+| Property | Type | Required | Description |
+| :--- | :--- | :--- | :--- |
+| `label` | `string` | Recommended | Human-readable label (e.g., "Project Task"). Defaults to capitalized filename if omitted. |
+| `icon` | `string` | Optional | SLDS icon string (e.g., `standard:task`). |
+| `description` | `string` | Optional | Internal description of the object. |
+| `fields` | `Map` | **Required** | Dictionary of field definitions. |
+| `actions` | `Map` | Optional | Dictionary of custom action definitions. |
+| `ai_context` | `object` | Optional | AI-friendly context for code generation and understanding. |
+
+**Note:** The `name` property is **no longer needed** - it's automatically inferred from the filename.
+
+### 1.1 AI Context (Optional)
+
+The `ai_context` block provides semantic information to help AI tools understand the business purpose and usage patterns of your object. This improves code generation accuracy and enables intelligent suggestions.
+
+```yaml
+# File: project.object.yml
+
+label: Project
+
+# AI-friendly context
+ai_context:
+ # Business intent - helps AI understand the purpose
+ intent: "Manage projects with timeline, budget, and team tracking"
+
+ # Business domain classification
+ domain: project_management
+
+ # Natural language aliases for queries
+ aliases:
+ - project
+ - initiative
+ - program
+
+ # Example records for AI to understand data patterns
+ examples:
+ - name: "Website Redesign 2026"
+ status: active
+ budget: 50000
+ - name: "Q1 Marketing Campaign"
+ status: planning
+ budget: 25000
+
+ # Common queries users might ask
+ common_queries:
+ - "Find all active projects"
+ - "Show projects over budget"
+ - "List my projects due this week"
+
+fields:
+ # ... field definitions
+```
+
+| Property | Type | Description |
+| :--- | :--- | :--- |
+| `intent` | `string` | Brief description of the object's business purpose. |
+| `domain` | `string` | Business domain (e.g., `sales`, `project_management`, `hr`). |
+| `aliases` | `string[]` | Natural language terms users might use to refer to this object. |
+| `examples` | `object[]` | Sample records showing typical data patterns. |
+| `common_queries` | `string[]` | Typical questions or searches users perform. |
+
+## 2. Field Definitions
+
+Fields are defined under the `fields` key. The key for each entry corresponds to the field's API name.
+
+```yaml
+fields:
+ field_name:
+ type: text
+ label: Field Label
+```
+
+### 2.1 Common Properties
+
+| Property | Type | Description |
+| :--- | :--- | :--- |
+| `type` | `string` | **Required.** Data type of the field. |
+| `label` | `string` | Display label for UI validation messages. |
+| `required` | `boolean` | If `true`, the field cannot be null/undefined. Default: `false`. |
+| `unique` | `boolean` | If `true`, enforces unique values in the database. Default: `false`. |
+| `defaultValue` | `any` | Default value if not provided during creation. |
+| `index` | `boolean` | Creates a database index for this field. |
+| `searchable` | `boolean` | Enables traditional keyword-based search (e.g., exact match, SQL LIKE). |
+| `sortable` | `boolean` | Hint that this field can be used for sorting in UI. |
+| `description` | `string` | Help text or documentation for the field. |
+| `ai_context` | `object` | **Optional.** AI-friendly context for this specific field. |
+
+#### Field-Level AI Context
+
+Each field can include an `ai_context` block to help AI understand its purpose and usage:
+
+```yaml
+fields:
+ name:
+ type: text
+ required: true
+ label: Project Name
+
+ # AI-friendly context for this field
+ ai_context:
+ intent: "Human-readable project identifier"
+
+ # Example values help AI generate realistic data
+ examples:
+ - "Website Redesign 2026"
+ - "Q1 Marketing Campaign"
+ - "Mobile App Launch"
+
+ # Pattern guidance for generation
+ pattern: "[Department/Category] [Description] [Optional: Year/Quarter]"
+
+ # Validation hints
+ avoid_patterns:
+ - "Untitled"
+ - "Project 1"
+ - "Project 2"
+ - "New Project" # Too generic
+
+ status:
+ type: select
+ required: true
+ options:
+ - value: planning
+ label: Planning
+ - value: active
+ label: Active
+ - value: completed
+ label: Completed
+
+ ai_context:
+ intent: "Current lifecycle stage of the project"
+
+ # State machine information
+ is_state_machine: true
+ transitions:
+ planning: [active, cancelled]
+ active: [on_hold, completed, cancelled]
+ on_hold: [active, cancelled]
+ completed: [] # Terminal state
+ cancelled: [] # Terminal state
+```
+
+### 2.2 Supported Field Types
+
+| Type | Description | Specific Properties |
+| :--- | :--- | :--- |
+| **Basic Types** | | |
+| `text` | Single line text. | `min_length`, `max_length`, `regex` |
+| `textarea` | Multiline text. | `rows`, `min_length`, `max_length` |
+| `markdown` | Markdown formatted text. | |
+| `html` | Rich text content (HTML). | |
+| `number` | Numeric value (integer or float). | `precision`, `min`, `max` |
+| `currency` | Monetary value. | `scale`, `min`, `max` |
+| `percent` | Percentage value (0-1). | `scale`, `min`, `max` |
+| `boolean` | `true` or `false`. | |
+| **System/Format Types** | | |
+| `email` | Email address with validation. | |
+| `phone` | Phone number formatting. | |
+| `url` | Web URL validation. | |
+| `password` | Encrypted or masked string. | |
+| **Date & Time** | | |
+| `date` | Date only (YYYY-MM-DD). | |
+| `datetime` | Date and time (ISO string). | |
+| `time` | Time only (HH:mm:ss). | |
+| **Complex/Media** | | |
+| `file` | File attachment (stored as JSON). See [Attachment API](../api/attachments.md). | `multiple`, `accept`, `max_size` |
+| `image` | Image attachment (stored as JSON). Supports avatars, photos, galleries. See [Attachment API](../api/attachments.md). | `multiple`, `accept`, `max_size`, `max_width`, `max_height` |
+| `location` | Geolocation (lat/lng JSON). | |
+| **Relationships** | | |
+| `select` | Selection from a list. | `options`, `multiple` |
+| `lookup` | Reference to another object. | `reference_to`, `multiple` |
+| `master_detail` | Strong ownership relationship. | `reference_to` (Required) |
+| **Advanced** | | |
+| `formula` | Read-only calculated field. | `expression`, `data_type` |
+| `summary` | Roll-up summary of child records. | `summary_object`, `summary_type`, `summary_field`, `summary_filters` |
+| `auto_number` | Auto-incrementing unique identifier. | `auto_number_format` |
+| `object` | JSON object structure. | |
+| `grid` | Array of objects/rows. | |
+| `vector` | Vector embedding for AI search. | `dimension` |
+
+### 2.3 Relationship Fields
+
+Relationship fields (`lookup`, `master_detail`) connect objects together. For AI-friendly metadata, consider adding semantic context about the relationship's meaning.
+
+**Basic Relationship:**
+
+```yaml
+owner:
+ type: lookup
+ reference_to: users
+ label: Owner
+```
+
+**AI-Enhanced Relationship:**
+
+```yaml
+owner:
+ type: lookup
+ reference_to: users
+ label: Owner
+
+ ai_context:
+ intent: "The person responsible for project success"
+ semantic_type: ownership # ownership, hierarchy, association, aggregation
+
+ # Help AI suggest appropriate values
+ selection_guidance: "Usually a manager or senior team member"
+
+ # Common filters for selection
+ typical_filters:
+ - field: is_active
+ value: true
+ - field: role
+ operator: in
+ values: [manager, director]
+
+project_manager:
+ type: lookup
+ reference_to: users
+ label: Project Manager
+
+ ai_context:
+ intent: "Person managing day-to-day project execution"
+ semantic_type: hierarchy
+ differs_from: owner # Helps AI understand subtle differences
+```
+
+**Master-Detail Relationship:**
+
+```yaml
+account:
+ type: master_detail
+ reference_to: accounts
+ label: Account
+
+ ai_context:
+ intent: "Parent account owning this opportunity"
+ semantic_type: ownership
+ cascade_behavior: "Deleting account deletes all opportunities"
+```
+
+| Property | Type | Description |
+| :--- | :--- | :--- |
+| `reference_to` | `string` | **Required.** The `name` of the target object. |
+| `multiple` | `boolean` | If `true`, allows multiple selections (one-to-many). Default: `false`. |
+| `ai_context.intent` | `string` | Business purpose of this relationship. |
+| `ai_context.semantic_type` | `string` | Type: `ownership`, `hierarchy`, `association`, `aggregation`. |
+| `ai_context.selection_guidance` | `string` | Hints for selecting appropriate related records. |
+
+### 2.4 Select Options
+
+Options for `select` can be a simple list or label/value pairs. For AI-friendly metadata, you can add context to each option to explain its meaning and when it should be used.
+
+**Simple Options:**
+```yaml
+priority:
+ type: select
+ options:
+ - label: Low
+ value: low
+ - label: Medium
+ value: medium
+ - label: High
+ value: high
+```
+
+**AI-Enhanced Options with State Machine:**
+```yaml
+status:
+ type: select
+ options:
+ - value: planning
+ label: Planning
+ ai_context:
+ intent: "Initial stage - defining scope and requirements"
+ typical_duration_days: 14
+ next_states: [active, cancelled]
+ entry_requirements:
+ - "Project name must be set"
+ - "Owner must be assigned"
+
+ - value: active
+ label: Active
+ ai_context:
+ intent: "Work is being performed"
+ next_states: [on_hold, completed, cancelled]
+ entry_requirements:
+ - "Start date must be set"
+ - "Budget must be approved"
+
+ - value: on_hold
+ label: On Hold
+ ai_context:
+ intent: "Temporarily paused"
+ next_states: [active, cancelled]
+ requires_reason: true
+
+ - value: completed
+ label: Completed
+ ai_context:
+ intent: "All deliverables finished"
+ is_terminal: true # Cannot transition from this state
+ next_states: []
+
+ - value: cancelled
+ label: Cancelled
+ ai_context:
+ intent: "Project discontinued"
+ is_terminal: true
+ next_states: []
+
+ # Overall field AI context
+ ai_context:
+ intent: "Track project through its lifecycle"
+ is_state_machine: true
+ enforce_transitions: true # Only allow valid state changes
+```
+
+This state machine information enables:
+- **Validation**: Prevent invalid state transitions
+- **UI**: Show only valid next states in dropdowns
+- **Automation**: Trigger workflows on state changes
+- **AI Generation**: Generate realistic test data following proper state flow
+
+## 3. Indexes
+
+Indexes improve query performance. You can add AI context to explain the purpose of each index, helping future developers and AI tools understand optimization decisions.
+
+### 3.1 Field-Level Indexes
+
+You can define simple indexes directly on the field:
+
+```yaml
+fields:
+ email:
+ type: email
+ index: true # Creates a standard index
+ unique: true # Creates a unique index (constraint)
+
+ ai_context:
+ intent: "User's primary email for login and notifications"
+ index_rationale: "Frequently queried for user lookup and authentication"
+```
+
+### 3.2 Object-Level Indexes
+
+For composite indexes (spanning multiple fields), define them under the `indexes` key at the root of the file.
+
+```yaml
+indexes:
+ # Composite Index
+ project_status_idx:
+ fields: [project_id, status]
+ ai_context:
+ intent: "Optimize queries filtering by project and status"
+ common_query: "SELECT * FROM tasks WHERE project_id = ? AND status = ?"
+ performance_note: "Supports project task lists grouped by status"
+
+ # Unique Composite Index
+ unique_task_name:
+ fields: [project_id, name]
+ unique: true
+ ai_context:
+ intent: "Prevent duplicate task names within a project"
+ business_rule: "Task names must be unique per project"
+```
+
+| Property | Type | Description |
+| :--- | :--- | :--- |
+| `fields` | `string[]` | **Required.** List of field names to include in the index. |
+| `unique` | `boolean` | If `true`, requires values to be unique combination. Default: `false`. |
+| `ai_context.intent` | `string` | Why this index exists. |
+| `ai_context.common_query` | `string` | Typical query this index optimizes. |
+
+## 4. AI & Vector Search
+
+ObjectQL supports AI-native features like semantic search and vector embeddings directly in the schema definition.
+
+### 4.1 AI Configuration
+
+You can enable semantic search and other AI capabilities using the `ai` property at the root of the file.
+
+```yaml
+# Enable Semantic Search for this object
+ai:
+ search:
+ enabled: true
+ # Fields to generate embeddings from
+ fields: [title, description, content]
+ # Optional: Specify embedding model
+ model: text-embedding-3-small
+```
+
+| Property | Type | Description |
+| :--- | :--- | :--- |
+| `search.enabled` | `boolean` | Enables semantic search. System will automatically manage vector storage. |
+| `search.fields` | `string[]` | List of text fields to concatenate and embed. |
+| `search.model` | `string` | Model ID (e.g. `openai/text-embedding-3-small`). Defaults to system setting. |
+| `search.target_field` | `string` | Optional. The name of a manual `vector` field to store embeddings in. |
+
+### 4.2 Vector Fields
+
+For more granular control, you can define explicit `vector` fields. This is useful if you want to store embeddings from external sources or multiple embeddings per record.
+
+```yaml
+fields:
+ # Metadata
+ title:
+ type: text
+
+ # Explicit Vector Storage
+ content_embedding:
+ type: vector
+ dimension: 1536 # Required: Dimension of the vector
+ index: true # Creates a vector index (IVFFlat / HNSW)
+```
+
+## 5. Internationalization (i18n)
+
+ObjectQL is built to support creating global applications. The philosophy is to **keep the core schema clean** and manage translations separately.
+
+### 5.1 Metadata Translation (UI)
+
+All user-facing text defined in `*.object.yml` (Object Labels, Field Labels, Help Text, Select Options) should be translated via external JSON files. This separation allows AI agents to translate the entire UI in one go without touching the schema logic.
+
+**Directory Structure:**
+```
+src/
+ objects/
+ project.object.yml # Source of Truth (Default Language, usually English)
+ i18n/
+ zh-CN/
+ project.json # Chinese Translation
+ es-ES/
+ project.json # Spanish Translation
+```
+
+**Translation File Format (`project.json`):**
+The structure mirrors the object definition but only contains translatable strings.
+
+```json
+{
+ "label": "项目",
+ "description": "项目管理核心对象",
+ "fields": {
+ "status": {
+ "label": "状态",
+ "help_text": "项目的当前进展阶段",
+ "options": {
+ "planned": "计划中",
+ "in_progress": "进行中",
+ "completed": "已完成"
+ }
+ }
+ },
+ "actions": {
+ "approve": {
+ "label": "审批",
+ "confirm_text": "确认审批通过吗?"
+ }
+ }
+}
+```
+
+### 5.2 Data Content
+
+ObjectQL does **not** enforce a specific "multi-language column" format (like JSON fields) in the core spec, as this often complicates indexing and reporting.
+
+Recommended strategies for content translation:
+1. **Separate Record Strategy**: Store different language versions as separate records with a `locale` field and a `master_id`.
+2. **Translation Tables**: Use a standard relational design (e.g., `Product` -> `ProductTranslation`).
+
+
+
+
+
+## 6. Type Generation (CLI)
+
+To achieve strict type safety in your Hooks and Actions, you should use the Code Generation tool.
+
+### 6.1 Usage
+
+```bash
+# Generate types from *.object.yml to src/generated/
+npx objectql generate --source ./src --output ./src/generated
+```
+
+### 6.2 Using Generated Types
+
+Once generated, you can import the Interfaces directly. This ensures that your code is always in sync with your metadata.
+
+```typescript
+import { Todo } from './generated';
+
+const myTask: Todo = {
+ title: "Finish documentation", // Type-checked!
+ completed: false
+};
+```
+
+## 7. Complete AI-Enhanced Example
+
+Here's a complete example showing how to leverage AI context throughout your object definition:
+
+```yaml
+# File: project.object.yml
+# Object name "project" is automatically inferred from filename
+
+label: Project
+icon: standard:project
+description: Core object for project management
+
+# Object-level AI context
+ai_context:
+ intent: "Manage projects with timeline, budget, and team tracking"
+ domain: project_management
+ aliases: [project, initiative, program]
+
+ examples:
+ - name: "Website Redesign 2026"
+ status: active
+ budget: 50000
+ owner_id: user_001
+ - name: "Q1 Marketing Campaign"
+ status: planning
+ budget: 25000
+ owner_id: user_002
+
+ common_queries:
+ - "Find all active projects"
+ - "Show projects over budget"
+ - "List my projects due this week"
+
+fields:
+ name:
+ type: text
+ required: true
+ label: Project Name
+ ai_context:
+ intent: "Human-readable project identifier"
+ examples:
+ - "Website Redesign 2026"
+ - "Mobile App Launch Q2"
+ pattern: "[Category] [Description] [Optional: Year/Quarter]"
+
+ status:
+ type: select
+ required: true
+ default: planning
+ options:
+ - value: planning
+ label: Planning
+ ai_context:
+ intent: "Defining scope and requirements"
+ typical_duration_days: 14
+ next_states: [active, cancelled]
+
+ - value: active
+ label: Active
+ ai_context:
+ intent: "Work in progress"
+ next_states: [on_hold, completed, cancelled]
+
+ - value: completed
+ label: Completed
+ ai_context:
+ intent: "All deliverables finished"
+ is_terminal: true
+ next_states: []
+
+ ai_context:
+ intent: "Track project lifecycle"
+ is_state_machine: true
+ enforce_transitions: true
+
+ budget:
+ type: currency
+ required: false
+ label: Budget
+ ai_context:
+ intent: "Total approved budget in USD"
+ examples: [25000, 150000, 500000]
+ business_rules:
+ - "Budget > $50K requires manager approval"
+ - "Cannot exceed department annual budget"
+
+ owner:
+ type: lookup
+ reference_to: users
+ required: true
+ label: Owner
+ ai_context:
+ intent: "Person responsible for project success"
+ semantic_type: ownership
+ selection_guidance: "Usually a manager or team lead"
+ typical_filters:
+ - field: is_active
+ value: true
+ - field: role
+ operator: in
+ values: [manager, director]
+
+ start_date:
+ type: date
+ label: Start Date
+ ai_context:
+ intent: "When project work begins"
+ validation_hint: "Must be before end_date"
+
+ end_date:
+ type: date
+ label: End Date
+ ai_context:
+ intent: "Target completion date"
+ validation_hint: "Must be after start_date"
+
+indexes:
+ status_owner_idx:
+ fields: [status, owner_id]
+ ai_context:
+ intent: "Optimize 'my active projects' queries"
+ common_query: "status = 'active' AND owner_id = current_user"
+
+# AI-powered semantic search
+ai:
+ search:
+ enabled: true
+ fields: [name, description]
+ model: text-embedding-3-small
+```
+
+This AI-enhanced metadata enables:
+- **Better Code Generation**: AI tools understand intent and generate correct code
+- **Intelligent Validation**: AI can suggest validation rules based on business rules
+- **Realistic Test Data**: AI generates test data following proper patterns
+- **Documentation**: AI can auto-generate comprehensive documentation
+- **Query Optimization**: AI understands common access patterns for indexing
+
diff --git a/docs/protocol/overview.md b/docs/protocol/overview.md
new file mode 100644
index 000000000..cc2a6a8a8
--- /dev/null
+++ b/docs/protocol/overview.md
@@ -0,0 +1,265 @@
+# Protocol Specifications
+
+The Object UI Protocol defines the standard schemas and conventions for describing user interfaces in JSON. This protocol is the foundation of Object UI and ensures consistency across all implementations.
+
+## Overview
+
+The protocol is organized into several core types, each representing a different aspect of application UI:
+
+### Core Types
+
+- **[Object](/protocol/object)** - Data models and CRUD operations
+- **[View](/protocol/view)** - Data visualization (list, table, kanban, etc.)
+- **[Page](/protocol/page)** - Page layouts and structure
+- **[Form](/protocol/form)** - Form definitions and validation
+- **[Menu](/protocol/menu)** - Navigation menus and breadcrumbs
+- **[App](/protocol/app)** - Application configuration
+- **[Report](/protocol/report)** - Reports and analytics
+
+## Design Principles
+
+The protocol follows these key principles:
+
+### 1. JSON-First
+
+All UI definitions are valid JSON, making them:
+- Easy to serialize and transmit
+- Language-agnostic
+- Version control friendly
+- AI-friendly for generation
+
+### 2. Type-Safe
+
+Complete TypeScript definitions for all schemas:
+```typescript
+interface PageSchema {
+ type: 'page'
+ title: string
+ body: ComponentSchema | ComponentSchema[]
+ // ... more properties
+}
+```
+
+### 3. Composable
+
+Schemas can be nested and reused:
+```json
+{
+ "type": "page",
+ "body": {
+ "type": "grid",
+ "items": [
+ { "type": "card", ... },
+ { "type": "form", ... }
+ ]
+ }
+}
+```
+
+### 4. Extensible
+
+Add custom properties for your needs:
+```json
+{
+ "type": "button",
+ "label": "Click Me",
+ "customData": { ... },
+ "onCustomEvent": "handleCustom"
+}
+```
+
+## Schema Structure
+
+All schemas follow a common structure:
+
+### Base Properties
+
+Every schema includes these base properties:
+
+```typescript
+interface BaseSchema {
+ type: string // Component type
+ id?: string // Unique identifier
+ name?: string // Field name for forms
+ className?: string // Tailwind classes
+ style?: object // Inline styles
+ visible?: boolean // Visibility flag
+ visibleOn?: string // Conditional visibility
+}
+```
+
+### Type-Specific Properties
+
+Each type adds its own properties:
+
+```json
+{
+ "type": "input",
+ "name": "email",
+ "label": "Email Address",
+ "required": true,
+ "placeholder": "you@example.com"
+}
+```
+
+## Expression System
+
+The protocol includes a powerful expression system for dynamic behavior:
+
+### Variable References
+
+```json
+{
+ "value": "${data.user.name}"
+}
+```
+
+### Computed Values
+
+```json
+{
+ "value": "${data.price * data.quantity}"
+}
+```
+
+### Conditional Logic
+
+```json
+{
+ "visibleOn": "${user.role === 'admin'}"
+}
+```
+
+### Function Calls
+
+```json
+{
+ "value": "${formatDate(data.createdAt, 'YYYY-MM-DD')}"
+}
+```
+
+## Validation
+
+All schemas can be validated using:
+
+1. **JSON Schema** - Standard JSON validation
+2. **Zod** - Runtime TypeScript validation
+3. **TypeScript** - Compile-time type checking
+
+Example validation:
+
+```typescript
+import { PageSchema } from '@object-ui/protocol'
+import { z } from 'zod'
+
+const pageSchema = z.object({
+ type: z.literal('page'),
+ title: z.string(),
+ body: z.any()
+})
+
+// Validate at runtime
+pageSchema.parse(myPageData)
+```
+
+## Versioning
+
+The protocol follows semantic versioning:
+
+- **Major** version: Breaking changes
+- **Minor** version: New features (backward compatible)
+- **Patch** version: Bug fixes
+
+Current version: **0.1.0** (Preview)
+
+## Migration
+
+When the protocol changes:
+
+1. **Backward compatibility**: Old schemas continue to work
+2. **Deprecation warnings**: Get notified of deprecated features
+3. **Migration tools**: Automated schema updates
+4. **Documentation**: Clear migration guides
+
+## Example: Complete Page
+
+Here's a complete example using multiple protocol types:
+
+```json
+{
+ "type": "page",
+ "title": "User Management",
+ "body": {
+ "type": "crud",
+ "api": "/api/users",
+ "columns": [
+ {
+ "name": "name",
+ "label": "Name",
+ "type": "text"
+ },
+ {
+ "name": "email",
+ "label": "Email",
+ "type": "email"
+ },
+ {
+ "name": "role",
+ "label": "Role",
+ "type": "select",
+ "options": ["admin", "user", "guest"]
+ }
+ ],
+ "actions": [
+ {
+ "type": "button",
+ "label": "Add User",
+ "action": "create"
+ }
+ ]
+ }
+}
+```
+
+This single schema creates a complete user management interface with:
+- Data table with sorting and pagination
+- Search functionality
+- Create/edit/delete operations
+- Form validation
+- API integration
+
+## Reference Implementation
+
+The reference implementation is available in TypeScript:
+
+```bash
+npm install @object-ui/protocol
+```
+
+```typescript
+import {
+ PageSchema,
+ ViewSchema,
+ ObjectSchema
+} from '@object-ui/protocol'
+```
+
+## Contributing
+
+Help us improve the protocol:
+
+1. [Report issues](https://github.com/objectql/object-ui/issues)
+2. [Propose changes](https://github.com/objectql/object-ui/pulls)
+3. [Join discussions](https://github.com/objectql/object-ui/discussions)
+
+## Next Steps
+
+- [Object Protocol](/protocol/object) - Learn about data models
+- [View Protocol](/protocol/view) - Understand data visualization
+- [Page Protocol](/protocol/page) - Master page layouts
+
+---
+
+**Version**: 0.1.0 (Preview)
+**Last Updated**: January 2026
+**Status**: Active Development
diff --git a/docs/protocol/page.md b/docs/protocol/page.md
new file mode 100644
index 000000000..42c6962cf
--- /dev/null
+++ b/docs/protocol/page.md
@@ -0,0 +1,476 @@
+# Page Specification
+
+## Overview
+
+Pages are the visual interface layer in ObjectQL applications. They define composable UI layouts that can render data from objects, display custom components, and orchestrate user interactions. Pages are defined using `*.page.yml` files and follow a declarative, component-based architecture.
+
+## File Convention
+
+```
+src/
+ ├── dashboard.page.yml
+ ├── project_detail.page.yml
+ └── create_wizard.page.yml
+```
+
+## Schema
+
+### Root Structure
+
+```typescript
+interface PageConfig {
+ // Identity
+ name: string; // Unique identifier
+ label: string; // Display name
+ description?: string; // Page description
+ icon?: string; // Icon identifier
+
+ // Layout
+ body: SchemaNode | SchemaNode[]; // The schema body, following the JSON Schema Rendering spec.
+
+
+ // Data & Logic
+ data_sources?: Record;
+ actions?: Record;
+
+ // Styling & Behavior
+ style?: ComponentStyle;
+ responsive?: ResponsiveConfig;
+
+ // Access Control
+ permissions?: {
+ view?: string[];
+ edit?: string[];
+ };
+
+ // Metadata
+ meta?: {
+ title?: string;
+ description?: string;
+ keywords?: string[];
+ };
+
+ // State Management
+ state?: {
+ initial?: Record;
+ persist?: boolean;
+ storage_key?: string;
+ };
+
+ // Features
+ realtime?: boolean;
+ refresh_interval?: number;
+
+ // AI Context
+ ai_context?: {
+ intent?: string;
+ persona?: string;
+ tasks?: string[];
+ };
+}
+```
+
+### Layout Types
+
+```typescript
+type PageLayoutType =
+ | 'single_column' // Single vertical column
+ | 'two_column' // Left and right columns
+ | 'three_column' // Left, center, right
+ | 'dashboard' // Grid-based dashboard
+ | 'canvas' // Free-form positioning
+ | 'tabs' // Tab-based layout
+ | 'wizard' // Multi-step wizard
+ | 'custom'; // Custom layout
+```
+
+### Component Types
+
+```typescript
+type PageComponentType =
+ // Data Display
+ | 'data_grid' // Table/grid
+ | 'detail_view' // Record details
+ | 'list' // List view
+ | 'chart' // Visualizations
+ | 'metric' // KPI display
+ | 'calendar' // Calendar view
+ | 'kanban' // Kanban board
+ | 'timeline' // Timeline/Gantt
+
+ // Data Input
+ | 'form' // Data entry form
+ | 'button' // Action button
+
+ // Layout
+ | 'container' // Group components
+ | 'tabs' // Tab container
+ | 'divider' // Visual separator
+
+ // Content
+ | 'text' // Text/markdown
+ | 'html' // Custom HTML
+ | 'image' // Image display
+ | 'iframe' // Embedded content
+
+ | 'custom'; // Custom component
+```
+
+### Component Structure
+
+```typescript
+interface PageComponent {
+ id: string; // Unique component ID
+ type: PageComponentType; // Component type
+ label?: string; // Display label
+ description?: string; // Description
+
+ // Data binding
+ data_source?: ComponentDataSource;
+
+ // Component configuration
+ config?: Record;
+
+ // Actions
+ actions?: {
+ on_click?: ComponentAction;
+ on_submit?: ComponentAction;
+ on_load?: ComponentAction;
+ on_change?: ComponentAction;
+ [key: string]: ComponentAction | undefined;
+ };
+
+ // Styling
+ style?: ComponentStyle;
+ responsive?: ResponsiveConfig;
+
+ // Visibility & Access
+ visible_when?: Record;
+ permissions?: string[];
+
+ // Nested components
+ components?: PageComponent[];
+
+ // Grid positioning (for dashboard layout)
+ grid?: {
+ x: number; // Column (0-11)
+ y: number; // Row
+ w: number; // Width in grid units
+ h: number; // Height in grid units
+ };
+
+ // Custom component reference
+ component?: string;
+}
+```
+
+### Data Sources
+
+```typescript
+interface ComponentDataSource {
+ object?: string; // Object to query
+ filters?: any[]; // Filter conditions
+ fields?: string[]; // Fields to display
+ sort?: Array<[string, 'asc' | 'desc']>;
+ limit?: number;
+ paginate?: boolean;
+ expand?: Record; // Related objects
+ query?: any; // Custom query
+}
+```
+
+### Actions
+
+```typescript
+interface ComponentAction {
+ type: 'navigate' | 'open_modal' | 'run_action' | 'submit_form' | 'refresh' | 'custom';
+
+ // Navigation
+ path?: string;
+
+ // Modal
+ modal?: string;
+
+ // Action execution
+ action?: string;
+ object?: string;
+
+ // Custom handler
+ handler?: string;
+
+ // User feedback
+ confirm?: string;
+ success_message?: string;
+ on_error?: 'show_toast' | 'show_modal' | 'ignore';
+}
+```
+
+### Responsive Configuration
+
+```typescript
+interface ResponsiveConfig {
+ mobile?: {
+ columns?: number;
+ visible?: boolean;
+ order?: number;
+ };
+ tablet?: {
+ columns?: number;
+ visible?: boolean;
+ order?: number;
+ };
+ desktop?: {
+ columns?: number;
+ visible?: boolean;
+ order?: number;
+ };
+}
+```
+
+## Examples
+
+### Dashboard Layout
+
+```yaml
+name: dashboard
+label: Project Dashboard
+layout: dashboard
+
+components:
+ # KPI Metric
+ - id: total_projects
+ type: metric
+ label: Total Projects
+ data_source:
+ object: projects
+ query:
+ op: count
+ config:
+ format: number
+ icon: folder
+ color: blue
+ grid:
+ x: 0
+ y: 0
+ w: 3
+ h: 2
+
+ # Chart
+ - id: status_chart
+ type: chart
+ label: Projects by Status
+ data_source:
+ object: projects
+ fields: ['status']
+ query:
+ op: group_by
+ field: status
+ aggregate: count
+ config:
+ chart_type: pie
+ grid:
+ x: 3
+ y: 0
+ w: 6
+ h: 4
+
+ # Data Grid
+ - id: tasks_grid
+ type: data_grid
+ label: Recent Tasks
+ data_source:
+ object: tasks
+ fields: ['name', 'status', 'due_date']
+ sort: [['created_at', 'desc']]
+ limit: 10
+ grid:
+ x: 0
+ y: 2
+ w: 12
+ h: 6
+
+permissions:
+ view: ['admin', 'manager', 'user']
+```
+
+### Two-Column Detail Page
+
+```yaml
+name: project_detail
+label: Project Details
+layout: two_column
+
+sections:
+ # Main content
+ - id: main_content
+ type: content
+ style:
+ width: 70%
+ components:
+ - id: edit_form
+ type: form
+ label: Project Information
+ data_source:
+ object: projects
+ query:
+ op: findOne
+ filter: [['_id', '=', '{{route.params.id}}']]
+ config:
+ mode: edit
+ fields:
+ - name: name
+ label: Name
+ type: text
+ - name: description
+ label: Description
+ type: textarea
+ actions:
+ on_submit:
+ type: run_action
+ object: projects
+ action: update
+
+ # Sidebar
+ - id: sidebar
+ type: sidebar
+ style:
+ width: 30%
+ components:
+ - id: stats
+ type: metric
+ label: Task Count
+ data_source:
+ object: tasks
+ filters:
+ - ['project', '=', '{{route.params.id}}']
+ query:
+ op: count
+```
+
+### Wizard Layout
+
+```yaml
+name: create_project
+label: Create Project
+layout: wizard
+
+components:
+ # Step 1
+ - id: step_basic
+ type: container
+ label: Basic Information
+ config:
+ step: 1
+ components:
+ - id: basic_form
+ type: form
+ config:
+ fields:
+ - name: name
+ label: Name
+ type: text
+ required: true
+
+ # Step 2
+ - id: step_team
+ type: container
+ label: Team
+ config:
+ step: 2
+ components:
+ - id: team_form
+ type: form
+ config:
+ fields:
+ - name: owner
+ label: Owner
+ type: lookup
+ reference_to: users
+
+actions:
+ submit_wizard:
+ type: run_action
+ object: projects
+ action: create
+ success_message: Project created!
+```
+
+## Usage in Applications
+
+Pages can be referenced in application navigation:
+
+```yaml
+# app.yml
+navigation:
+ type: sidebar
+ items:
+ - type: page
+ name: dashboard
+ label: Dashboard
+ icon: dashboard
+ path: /dashboard
+
+ - type: section
+ label: Projects
+ items:
+ - type: page
+ name: project_list
+ path: /projects
+```
+
+## Best Practices
+
+1. **Component IDs**: Use descriptive IDs (e.g., `tasks_grid` not `grid1`)
+2. **Data Binding**: Leverage `{{}}` syntax for dynamic values
+3. **Responsive Design**: Always configure responsive behavior
+4. **Access Control**: Define clear permissions
+5. **AI Context**: Provide intent and tasks for AI understanding
+6. **State Management**: Use page state for complex interactions
+7. **Performance**: Use pagination and limits for large datasets
+
+## Validation Rules
+
+- `name` must be unique within the application
+- `layout` is required
+- Either `sections` or `components` must be defined (not both for simple layouts)
+- Component `id` must be unique within the page
+- Grid positions must not overlap in dashboard layouts
+- Responsive breakpoints must be valid
+
+## File Loading
+
+Pages are automatically loaded from `*.page.yml` files by the ObjectQL loader:
+
+```typescript
+// Automatically registered
+loader.load('./src');
+
+// Access via registry
+const page = registry.get('page', 'dashboard');
+```
+
+## Integration with Studio
+
+The ObjectQL Studio provides a visual interface for:
+- Browsing registered pages
+- Previewing page layouts
+- Editing page metadata
+- Testing responsive behavior
+- Managing permissions
+
+## See Also
+
+- [Application Configuration](./application.md)
+- [Form Specification](./form.md)
+- [View Specification](./view.md)
+- [Component Library](../guide/components.md)
+
+### 1.5 JSON Logic & Expressions
+
+The schema supports expression evaluation for dynamic behavior, using a syntax similar to template strings.
+
+- **Variables**: `${data.username}`
+- **Ternary**: `${isAdmin ? 'Show' : 'Hide'}`
+- **Filters**: `${value | date: 'YYYY-MM-DD'}`
+
+See [Schema Rendering Specification](../spec/schema-rendering.md) for deeper details on the rendering engine.
diff --git a/docs/protocol/report.md b/docs/protocol/report.md
new file mode 100644
index 000000000..731469253
--- /dev/null
+++ b/docs/protocol/report.md
@@ -0,0 +1,789 @@
+# Report & Dashboard Metadata
+
+Report and dashboard metadata defines data visualization, analytics, and reporting capabilities. This enables business intelligence directly from ObjectQL metadata.
+
+## 1. Overview
+
+Reporting features include:
+
+- **Multiple Report Types**: Tabular, summary, matrix (pivot), chart
+- **Multi-Object Joins**: Query across related objects
+- **Grouping & Aggregations**: COUNT, SUM, AVG, MIN, MAX
+- **Filtering**: Dynamic filters and criteria
+- **Scheduling**: Automated report generation and delivery
+- **Export**: PDF, Excel, CSV formats
+- **Dashboards**: Combine multiple reports and charts
+
+**File Naming Convention:** `.report.yml`, `.dashboard.yml`
+
+The filename (without the `.report.yml` or `.dashboard.yml` extension) automatically becomes the report/dashboard identifier.
+
+**Examples:**
+- `sales_summary.report.yml` → Report name: `sales_summary`
+- `executive_dashboard.dashboard.yml` → Dashboard name: `executive_dashboard`
+
+## 2. Report Types
+
+| Type | Description | Use Case |
+|:---|:---|:---|
+| `tabular` | Simple list/table | Flat data lists, exports |
+| `summary` | Grouped with subtotals | Sales by region, tasks by status |
+| `matrix` | Pivot table/cross-tab | Time-series analysis, comparisons |
+| `chart` | Visualization only | Dashboards, presentations |
+
+## 3. Tabular Reports
+
+Simple list reports with columns and filters:
+
+```yaml
+# File: open_tasks.report.yml
+# Report name is inferred from filename!
+
+label: Open Tasks
+type: tabular
+object: tasks
+
+# Columns
+columns:
+ - field: name
+ label: Task Name
+ width: 300
+
+ - field: assignee.name
+ label: Assigned To
+ width: 150
+
+ - field: priority
+ label: Priority
+ width: 100
+
+ - field: due_date
+ label: Due Date
+ width: 120
+ format: MM/DD/YYYY
+
+ - field: project.name
+ label: Project
+ width: 200
+
+# Filters
+filters:
+ - field: status
+ operator: "!="
+ value: completed
+
+ - field: due_date
+ operator: ">="
+ value: $today
+
+# Sorting
+sort:
+ - field: priority
+ direction: desc
+ - field: due_date
+ direction: asc
+
+# Limit
+limit: 1000
+
+# Allow export
+export:
+ enabled: true
+ formats: [csv, excel, pdf]
+```
+
+## 4. Summary Reports
+
+Grouped reports with aggregations:
+
+```yaml
+name: sales_by_region
+label: Sales Summary by Region
+type: summary
+object: orders
+
+# Grouping Levels
+groupings:
+ # Primary grouping
+ - field: customer.region
+ label: Region
+ sort: asc
+
+ # Secondary grouping
+ - field: product_category
+ label: Category
+ sort: asc
+
+# Detail Columns
+columns:
+ - field: order_number
+ label: Order #
+
+ - field: customer.name
+ label: Customer
+
+ - field: order_date
+ label: Date
+ format: MM/DD/YYYY
+
+ - field: amount
+ label: Amount
+ format: currency
+
+# Aggregations
+aggregations:
+ # Count of records
+ - function: count
+ field: id
+ label: Total Orders
+ display_at: [group, total]
+
+ # Sum
+ - function: sum
+ field: amount
+ label: Total Sales
+ format: currency
+ display_at: [group, total]
+
+ # Average
+ - function: avg
+ field: amount
+ label: Average Order Value
+ format: currency
+ display_at: [group, total]
+
+ # Min/Max
+ - function: min
+ field: order_date
+ label: First Order
+ format: date
+ display_at: [group]
+
+ - function: max
+ field: order_date
+ label: Last Order
+ format: date
+ display_at: [group]
+
+# Filters
+filters:
+ - field: status
+ operator: "="
+ value: completed
+
+ - field: order_date
+ operator: between
+ value: [$start_of_year, $end_of_year]
+
+# Chart
+chart:
+ enabled: true
+ type: bar
+ x_axis: customer.region
+ y_axis: amount
+ aggregation: sum
+```
+
+## 5. Matrix Reports
+
+Pivot table / cross-tab reports:
+
+```yaml
+name: sales_by_month_and_product
+label: Sales Matrix
+type: matrix
+object: orders
+
+# Row Grouping
+row_groupings:
+ - field: product.category
+ label: Product Category
+ sort: asc
+
+ - field: product.name
+ label: Product
+ sort: asc
+
+# Column Grouping
+column_groupings:
+ - field: order_date
+ label: Month
+ date_function: month # year, quarter, month, week, day
+ format: MMM YYYY
+
+# Measure (Value in cells)
+measure:
+ function: sum
+ field: amount
+ label: Total Sales
+ format: currency
+
+# Show Totals
+totals:
+ row_totals: true
+ column_totals: true
+ grand_total: true
+
+# Filters
+filters:
+ - field: order_date
+ operator: ">="
+ value: $start_of_year
+
+ - field: status
+ operator: "="
+ value: completed
+
+# Chart
+chart:
+ enabled: true
+ type: stacked_bar
+```
+
+## 6. Chart Reports
+
+Visualization-focused reports:
+
+```yaml
+name: revenue_trend
+label: Revenue Trend
+type: chart
+object: orders
+
+# Chart Configuration
+chart:
+ type: line # line, bar, pie, donut, area, scatter
+ title: Monthly Revenue Trend
+
+ # Data
+ x_axis:
+ field: order_date
+ label: Month
+ date_function: month
+ format: MMM YYYY
+
+ y_axis:
+ function: sum
+ field: amount
+ label: Revenue
+ format: currency
+
+ # Multiple series
+ series:
+ field: product_category
+ label: Category
+
+ # Styling
+ height: 400
+ show_legend: true
+ show_grid: true
+ show_data_labels: false
+
+ # Colors
+ color_scheme: default # default, blue, green, red, custom
+
+ # Interactive
+ interactive: true
+ allow_drill_down: true
+
+# Filters
+filters:
+ - field: order_date
+ operator: ">="
+ value: $start_of_year
+
+ - field: status
+ operator: "="
+ value: completed
+```
+
+### 6.1 Chart Types
+
+```yaml
+# Bar Chart
+chart:
+ type: bar
+ orientation: vertical # vertical, horizontal
+ stacked: false
+
+# Line Chart
+chart:
+ type: line
+ smooth: true
+ fill_area: false
+
+# Pie/Donut Chart
+chart:
+ type: pie # or donut
+ show_percentage: true
+ show_labels: true
+
+# Area Chart
+chart:
+ type: area
+ stacked: true
+
+# Scatter Plot
+chart:
+ type: scatter
+ x_axis: { field: quantity }
+ y_axis: { field: price }
+ size_by: { field: discount }
+
+# Combo Chart
+chart:
+ type: combo
+ series:
+ - type: bar
+ field: revenue
+ y_axis: primary
+ - type: line
+ field: profit_margin
+ y_axis: secondary
+```
+
+## 7. Dashboard Configuration
+
+Combine multiple reports and charts:
+
+```yaml
+name: sales_dashboard
+label: Sales Dashboard
+description: Executive sales overview
+
+# Layout
+layout:
+ columns: 12 # Grid system
+
+ # Widgets
+ widgets:
+ # KPI Cards
+ - type: metric
+ title: Total Revenue
+ position: { row: 1, col: 1, width: 3, height: 2 }
+ metric:
+ object: orders
+ function: sum
+ field: amount
+ format: currency
+ filters:
+ - field: status
+ value: completed
+
+ # Comparison
+ compare_to: previous_month
+ show_trend: true
+
+ - type: metric
+ title: Active Customers
+ position: { row: 1, col: 4, width: 3, height: 2 }
+ metric:
+ object: customers
+ function: count
+ field: id
+ filters:
+ - field: status
+ value: active
+
+ - type: metric
+ title: Avg Order Value
+ position: { row: 1, col: 7, width: 3, height: 2 }
+ metric:
+ object: orders
+ function: avg
+ field: amount
+ format: currency
+
+ - type: metric
+ title: Conversion Rate
+ position: { row: 1, col: 10, width: 3, height: 2 }
+ metric:
+ formula: (completed_orders / total_leads) * 100
+ format: percentage
+
+ # Chart Widget
+ - type: chart
+ title: Revenue Trend
+ position: { row: 3, col: 1, width: 8, height: 4 }
+ report: revenue_trend
+
+ # Table Widget
+ - type: table
+ title: Top Products
+ position: { row: 3, col: 9, width: 4, height: 4 }
+ report: top_products
+ limit: 10
+
+ # Chart Widget 2
+ - type: chart
+ title: Sales by Region
+ position: { row: 7, col: 1, width: 6, height: 4 }
+ report: sales_by_region
+
+ # Chart Widget 3
+ - type: chart
+ title: Product Mix
+ position: { row: 7, col: 7, width: 6, height: 4 }
+ chart:
+ type: pie
+ object: order_items
+ measure: { function: sum, field: quantity }
+ grouping: product_category
+
+# Filters (apply to all widgets)
+filters:
+ - name: date_range
+ label: Date Range
+ type: date_range
+ default: this_month
+
+ - name: region
+ label: Region
+ type: select
+ object: regions
+ field: name
+ allow_all: true
+
+# Refresh
+refresh:
+ auto_refresh: true
+ interval: 300 # 5 minutes
+
+# Permissions
+permissions:
+ view: [admin, manager, sales]
+ edit: [admin]
+```
+
+## 8. Report Filters
+
+### 8.1 Standard Filters
+
+```yaml
+filters:
+ # Equality
+ - field: status
+ operator: "="
+ value: active
+
+ # Comparison
+ - field: amount
+ operator: ">"
+ value: 1000
+
+ # Range
+ - field: created_date
+ operator: between
+ value: [2024-01-01, 2024-12-31]
+
+ # List
+ - field: category
+ operator: in
+ value: [electronics, computers, phones]
+
+ # String matching
+ - field: name
+ operator: contains
+ value: laptop
+
+ # Null check
+ - field: deleted_date
+ operator: is_null
+```
+
+### 8.2 Dynamic Filters
+
+```yaml
+filters:
+ # Current user
+ - field: owner_id
+ operator: "="
+ value: $current_user.id
+
+ # Date functions
+ - field: created_date
+ operator: "="
+ value: $today
+
+ # Relative dates
+ - field: created_date
+ operator: ">="
+ value: $start_of_month
+
+ # Formulas
+ - field: total
+ operator: ">"
+ value: $average_order_value * 2
+```
+
+### 8.3 User Filters
+
+Allow users to customize filters:
+
+```yaml
+user_filters:
+ - name: date_range
+ label: Date Range
+ field: order_date
+ type: date_range
+ default: this_month
+ required: false
+
+ - name: status
+ label: Status
+ field: status
+ type: multi_select
+ options:
+ - draft
+ - pending
+ - completed
+ default: [pending, completed]
+
+ - name: region
+ label: Region
+ field: customer.region
+ type: lookup
+ object: regions
+ allow_all: true
+
+ - name: amount_min
+ label: Min Amount
+ field: amount
+ type: number
+ operator: ">="
+```
+
+## 9. Formulas & Calculated Fields
+
+Create computed values:
+
+```yaml
+columns:
+ # Simple calculation
+ - name: profit
+ label: Profit
+ formula: revenue - cost
+ format: currency
+
+ # Percentage
+ - name: profit_margin
+ label: Profit Margin
+ formula: (revenue - cost) / revenue * 100
+ format: percentage
+
+ # Conditional
+ - name: status_category
+ label: Category
+ formula: |
+ if (amount > 10000) {
+ return 'High Value';
+ } else if (amount > 1000) {
+ return 'Medium Value';
+ } else {
+ return 'Low Value';
+ }
+
+ # Date calculations
+ - name: days_open
+ label: Days Open
+ formula: $today - created_date
+ format: number
+
+ # Lookup
+ - name: account_owner_name
+ label: Account Owner
+ formula: customer.account.owner.name
+```
+
+## 10. Scheduling & Distribution
+
+Automate report generation:
+
+```yaml
+schedule:
+ # Enable scheduling
+ enabled: true
+
+ # Frequency
+ frequency: weekly # daily, weekly, monthly, custom
+
+ # Custom schedule
+ cron: "0 9 * * 1" # Every Monday at 9 AM
+
+ # Time zone
+ timezone: America/New_York
+
+ # Distribution
+ recipients:
+ - email: sales-team@company.com
+ - user_id: manager_123
+ - role: executive
+
+ # Email settings
+ email:
+ subject: Weekly Sales Report - ${date}
+ body: |
+ Please find attached the weekly sales report.
+
+ Report Period: ${start_date} to ${end_date}
+
+ # Attachment format
+ format: pdf # pdf, excel, csv
+
+ # Inline preview
+ include_preview: true
+
+ # Filters for scheduled run
+ filter_values:
+ date_range: last_week
+ region: all
+```
+
+## 11. Export Configuration
+
+```yaml
+export:
+ enabled: true
+
+ # Available formats
+ formats:
+ - csv
+ - excel
+ - pdf
+
+ # Excel options
+ excel:
+ sheet_name: Sales Report
+ include_filters: true
+ include_chart: true
+ freeze_header: true
+
+ # PDF options
+ pdf:
+ page_size: letter # letter, a4, legal
+ orientation: portrait # portrait, landscape
+ include_logo: true
+ header: Company Sales Report
+ footer: "Page ${page} of ${total_pages}"
+
+ # CSV options
+ csv:
+ delimiter: ","
+ include_header: true
+ encoding: utf-8
+```
+
+## 12. Performance Optimization
+
+```yaml
+performance:
+ # Caching
+ cache:
+ enabled: true
+ ttl: 3600 # 1 hour
+
+ # Cache key includes
+ cache_key_fields:
+ - filters
+ - user_id
+
+ # Pagination
+ pagination:
+ enabled: true
+ page_size: 100
+ max_records: 10000
+
+ # Indexing hints
+ use_indexes:
+ - customer.region
+ - order_date
+
+ # Query optimization
+ optimize:
+ push_down_filters: true
+ parallel_execution: true
+```
+
+## 13. Access Control
+
+```yaml
+permissions:
+ # Who can view
+ view:
+ - admin
+ - manager
+ - sales_rep
+
+ # Who can edit report definition
+ edit:
+ - admin
+
+ # Row-level security
+ row_level_security:
+ enabled: true
+ filter:
+ # Users only see their own data
+ field: owner_id
+ operator: "="
+ value: $current_user.id
+
+ # Except for admins
+ bypass_roles:
+ - admin
+ - manager
+
+ # Field-level security
+ field_restrictions:
+ cost:
+ visible_to: [admin, finance]
+
+ profit_margin:
+ visible_to: [admin, executive]
+```
+
+## 14. Implementation Example
+
+```typescript
+// src/reports/sales_summary.report.yml
+import { ReportDefinition } from '@objectql/types';
+
+export const sales_summary: ReportDefinition = {
+ name: 'sales_summary',
+ type: 'summary',
+ object: 'orders',
+ groupings: [
+ { field: 'customer.region', label: 'Region' }
+ ],
+ aggregations: [
+ { function: 'sum', field: 'amount', label: 'Total Sales' },
+ { function: 'count', field: 'id', label: 'Order Count' }
+ ],
+ filters: [
+ ['status', '=', 'completed']
+ ],
+ chart: {
+ enabled: true,
+ type: 'bar',
+ x_axis: 'customer.region',
+ y_axis: 'amount'
+ }
+};
+```
+
+## 15. Best Practices
+
+1. **Performance**: Use indexes, limit record counts
+2. **Filters**: Provide sensible default filters
+3. **Aggregations**: Use appropriate summary functions
+4. **Formatting**: Apply proper number/date formatting
+5. **Permissions**: Implement row-level security
+6. **Caching**: Enable caching for frequently-run reports
+7. **Naming**: Use clear, descriptive names
+8. **Documentation**: Document report purpose and filters
+
+## 16. Related Specifications
+
+- [Objects & Fields](./object.md) - Data models
+- [Query Language](./query-language.md) - Query syntax
+- [Views](./view.md) - Display layouts
+- [Permissions](./permission.md) - Access control
diff --git a/docs/protocol/view.md b/docs/protocol/view.md
new file mode 100644
index 000000000..4f899bd44
--- /dev/null
+++ b/docs/protocol/view.md
@@ -0,0 +1,416 @@
+# View & Layout Metadata
+
+Views define how data is presented to users in different contexts (list, detail, grid, kanban, calendar, etc.). They are the UI presentation layer of ObjectQL metadata.
+
+## 1. Overview
+
+View metadata separates the presentation logic from the data model, allowing the same object to be displayed differently based on context, user role, or device type.
+
+**File Naming Convention:** `.view.yml`
+
+The filename (without the `.view.yml` extension) automatically becomes the view's identifier. This eliminates the need for a redundant `name` property.
+
+**Examples:**
+- `task_list.view.yml` → View name: `task_list`
+- `customer_kanban.view.yml` → View name: `customer_kanban`
+- `project_calendar.view.yml` → View name: `project_calendar`
+
+## 2. View Types
+
+ObjectQL supports multiple view types for different use cases:
+
+| View Type | Description | Use Case |
+|:---|:---|:---|
+| `list` | Tabular list of records | Default view for browsing data |
+| `grid` | Data grid with inline editing | Power user data entry |
+| `kanban` | Kanban board grouped by field | Task/project management |
+| `calendar` | Calendar view with events | Scheduling, timeline views |
+| `timeline` | Gantt-style timeline | Project planning |
+| `card` | Card-based layout | Mobile-friendly browsing |
+| `detail` | Single record detail view | Record inspection |
+| `form` | Editable form layout | Data entry/editing |
+
+## 3. Root Properties
+
+```yaml
+# File: task_list.view.yml
+# View name is inferred from filename!
+
+label: Task List
+type: list
+object: tasks # Must specify which object to display
+description: Default task listing view
+
+# View Configuration
+config:
+ columns: [...]
+ filters: [...]
+ sort: [...]
+ actions: [...]
+```
+
+| Property | Type | Required | Description |
+|:---|:---|:---|:---|
+| `label` | `string` | ✓ | Display name for the view |
+| `type` | `ViewType` | ✓ | Type of view (list, grid, kanban, etc.) |
+| `object` | `string` | ✓ | Target object name |
+| `description` | `string` | | Help text or purpose |
+| `icon` | `string` | | Icon identifier |
+| `default` | `boolean` | | Whether this is the default view for the object |
+| `config` | `object` | ✓ | View-specific configuration |
+
+**Note:** The `name` property is **no longer needed** - it's automatically inferred from the filename.
+
+## 4. List View Configuration
+
+The most common view type for browsing records.
+
+```yaml
+# File: task_list.view.yml
+
+type: list
+object: tasks
+config:
+ # Column Definitions
+ columns:
+ - field: name
+ label: Task Name
+ width: 300
+ sortable: true
+ searchable: true
+
+ - field: status
+ label: Status
+ width: 120
+ renderer: badge
+
+ - field: priority
+ label: Priority
+ width: 100
+ renderer: priority_indicator
+
+ - field: assignee.name
+ label: Assigned To
+ width: 150
+
+ - field: due_date
+ label: Due Date
+ width: 120
+ renderer: date
+ format: MM/DD/YYYY
+
+ # Default Filters
+ default_filters:
+ - field: status
+ operator: "!="
+ value: completed
+
+ # Default Sort Order
+ default_sort:
+ - field: priority
+ direction: desc
+ - field: due_date
+ direction: asc
+
+ # Pagination
+ page_size: 50
+
+ # Available Actions
+ row_actions:
+ - complete_task
+ - edit
+ - delete
+
+ bulk_actions:
+ - bulk_assign
+ - bulk_delete
+```
+
+### 4.1 Column Configuration
+
+| Property | Type | Description |
+|:---|:---|:---|
+| `field` | `string` | Field path (supports dot notation for related fields) |
+| `label` | `string` | Column header text |
+| `width` | `number` | Column width in pixels |
+| `sortable` | `boolean` | Enable column sorting |
+| `searchable` | `boolean` | Include in search filter |
+| `renderer` | `string` | Custom renderer type (badge, link, date, etc.) |
+| `format` | `string` | Format string for dates/numbers |
+| `hidden` | `boolean` | Hide by default (user can unhide) |
+
+## 5. Kanban View Configuration
+
+Kanban views group records by a specific field value.
+
+```yaml
+name: task_kanban
+type: kanban
+object: tasks
+config:
+ # Grouping Field
+ group_by: status
+
+ # Card Configuration
+ card:
+ title_field: name
+ subtitle_field: assignee.name
+ description_field: description
+ image_field: cover_image
+
+ # Additional fields to display on card
+ fields:
+ - field: priority
+ renderer: badge
+ - field: due_date
+ renderer: date_badge
+
+ # Card Actions
+ actions:
+ - edit
+ - delete
+
+ # Column Configuration
+ columns:
+ - value: backlog
+ label: Backlog
+ color: gray
+
+ - value: in_progress
+ label: In Progress
+ color: blue
+ limit: 5 # WIP limit
+
+ - value: done
+ label: Done
+ color: green
+
+ # Enable drag & drop between columns
+ draggable: true
+
+ # Filter
+ filters:
+ - field: archived
+ operator: "="
+ value: false
+```
+
+## 6. Calendar View Configuration
+
+Calendar views display records as events on a timeline.
+
+```yaml
+name: event_calendar
+type: calendar
+object: events
+config:
+ # Date Field Mapping
+ start_date_field: start_time
+ end_date_field: end_time
+ all_day_field: is_all_day
+
+ # Event Display
+ title_field: name
+ color_field: event_type
+
+ # Color Mapping
+ color_mapping:
+ meeting: blue
+ deadline: red
+ holiday: green
+
+ # Default View
+ default_view: month # month, week, day, agenda
+
+ # Allow creation via click
+ allow_create: true
+
+ # Actions
+ event_actions:
+ - edit
+ - delete
+ - duplicate
+```
+
+## 7. Detail View Configuration
+
+Detail views show a single record with full field display.
+
+```yaml
+name: project_detail
+type: detail
+object: projects
+config:
+ # Layout Sections
+ sections:
+ - name: overview
+ label: Project Overview
+ columns: 2
+ fields:
+ - name
+ - status
+ - owner
+ - start_date
+ - end_date
+ - budget
+
+ - name: description
+ label: Description
+ columns: 1
+ fields:
+ - description
+ - objectives
+
+ - name: team
+ label: Team Members
+ type: related_list
+ relation: team_members
+ columns:
+ - member.name
+ - role
+ - hours_allocated
+
+ # Related Lists (child objects)
+ related_lists:
+ - object: tasks
+ relation_field: project_id
+ label: Project Tasks
+ default_view: task_list
+ allow_create: true
+
+ - object: files
+ relation_field: project_id
+ label: Attachments
+ view_type: grid
+```
+
+## 8. Responsive Design
+
+Views can define responsive breakpoints for mobile/tablet optimization.
+
+```yaml
+config:
+ responsive:
+ mobile:
+ # Show fewer columns on mobile
+ columns:
+ - name
+ - status
+
+ # Use card layout instead of table
+ layout: card
+
+ tablet:
+ columns:
+ - name
+ - status
+ - assignee
+ - due_date
+```
+
+## 9. Conditional Rendering
+
+Show/hide elements based on conditions.
+
+```yaml
+config:
+ columns:
+ - field: internal_notes
+ label: Internal Notes
+ # Only show to admins
+ visible_if:
+ user_role: admin
+
+ - field: approval_status
+ label: Approval
+ # Only show if amount > 1000
+ visible_if:
+ field: amount
+ operator: ">"
+ value: 1000
+```
+
+## 10. Custom Renderers
+
+Define custom rendering logic for specific field types.
+
+```yaml
+config:
+ renderers:
+ priority_indicator:
+ type: component
+ component: PriorityBadge
+ props:
+ showIcon: true
+
+ status_badge:
+ type: badge
+ color_mapping:
+ draft: gray
+ pending: yellow
+ approved: green
+ rejected: red
+```
+
+## 11. View Permissions
+
+Control who can see and use specific views.
+
+```yaml
+permissions:
+ # Who can see this view
+ read:
+ - admin
+ - manager
+ - user
+
+ # Who can modify view settings
+ modify:
+ - admin
+
+ # Field-level visibility
+ field_permissions:
+ salary:
+ visible_to: [admin, hr_manager]
+```
+
+## 12. Implementation Example
+
+```typescript
+// src/views/task_list.view.yml
+import { ViewDefinition } from '@objectql/types';
+
+export const task_list: ViewDefinition = {
+ name: 'task_list',
+ type: 'list',
+ object: 'tasks',
+ config: {
+ columns: [
+ { field: 'name', label: 'Task', width: 300 },
+ { field: 'status', label: 'Status', renderer: 'badge' }
+ ],
+ default_filters: [
+ ['status', '!=', 'completed']
+ ],
+ default_sort: [
+ ['priority', 'desc']
+ ]
+ }
+};
+```
+
+## 13. Best Practices
+
+1. **Start Simple**: Begin with list and detail views, add specialized views as needed
+2. **Reusable Renderers**: Create custom renderers for commonly used patterns
+3. **Mobile First**: Always define responsive behavior for mobile devices
+4. **Performance**: Limit initial column count for large datasets
+5. **User Customization**: Allow users to save personal view preferences
+6. **Accessibility**: Ensure proper ARIA labels and keyboard navigation
+
+## 14. Related Specifications
+
+- [Objects & Fields](./object.md) - Data model definition
+- [Forms](./form.md) - Editable form layouts
+- [Permissions](./permission.md) - Access control
+- [Actions](./action.md) - Available operations
diff --git a/docs/public/CNAME b/docs/public/CNAME
new file mode 100644
index 000000000..d002be35f
--- /dev/null
+++ b/docs/public/CNAME
@@ -0,0 +1 @@
+www.objectui.org
\ No newline at end of file
diff --git a/docs/public/logo.svg b/docs/public/logo.svg
new file mode 100644
index 000000000..18a03b2c4
--- /dev/null
+++ b/docs/public/logo.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/package.json b/package.json
index b1b7a1f26..f7e339b7e 100644
--- a/package.json
+++ b/package.json
@@ -1,13 +1,18 @@
{
"name": "object-ui-monorepo",
"private": true,
+ "homepage": "https://www.objectui.org",
"workspaces": [
"packages/*",
- "examples/*"
+ "examples/*",
+ "docs"
],
"scripts": {
"build": "pnpm -r build",
- "test": "vitest run",
+ "test": "pnpm -r test",
+ "docs:dev": "pnpm --filter object-ui-docs dev",
+ "docs:build": "pnpm --filter object-ui-docs build",
+ "docs:preview": "pnpm --filter object-ui-docs preview",
"test:watch": "vitest",
"test:ui": "vitest --ui",
"test:coverage": "vitest run --coverage",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index c8fe4d81c..37ec7029c 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -63,6 +63,15 @@ importers:
specifier: ^4.0.17
version: 4.0.17(@types/node@24.10.7)(@vitest/ui@4.0.17)(happy-dom@20.1.0)(jiti@1.21.7)(jsdom@27.4.0)(lightningcss@1.30.2)
+ docs:
+ devDependencies:
+ vitepress:
+ specifier: ^1.0.0
+ version: 1.6.4(@algolia/client-search@5.46.2)(@types/node@24.10.7)(@types/react@19.2.8)(lightningcss@1.30.2)(postcss@8.5.6)(react-dom@19.2.3(react@19.2.3))(react@18.3.1)(search-insights@2.17.3)(typescript@5.9.3)
+ vue:
+ specifier: ^3.4.0
+ version: 3.5.26(typescript@5.9.3)
+
examples/awesome-components:
dependencies:
'@objectql/types':
@@ -470,6 +479,82 @@ packages:
'@adobe/css-tools@4.4.4':
resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==}
+ '@algolia/abtesting@1.12.2':
+ resolution: {integrity: sha512-oWknd6wpfNrmRcH0vzed3UPX0i17o4kYLM5OMITyMVM2xLgaRbIafoxL0e8mcrNNb0iORCJA0evnNDKRYth5WQ==}
+ engines: {node: '>= 14.0.0'}
+
+ '@algolia/autocomplete-core@1.17.7':
+ resolution: {integrity: sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==}
+
+ '@algolia/autocomplete-plugin-algolia-insights@1.17.7':
+ resolution: {integrity: sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==}
+ peerDependencies:
+ search-insights: '>= 1 < 3'
+
+ '@algolia/autocomplete-preset-algolia@1.17.7':
+ resolution: {integrity: sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==}
+ peerDependencies:
+ '@algolia/client-search': '>= 4.9.1 < 6'
+ algoliasearch: '>= 4.9.1 < 6'
+
+ '@algolia/autocomplete-shared@1.17.7':
+ resolution: {integrity: sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==}
+ peerDependencies:
+ '@algolia/client-search': '>= 4.9.1 < 6'
+ algoliasearch: '>= 4.9.1 < 6'
+
+ '@algolia/client-abtesting@5.46.2':
+ resolution: {integrity: sha512-oRSUHbylGIuxrlzdPA8FPJuwrLLRavOhAmFGgdAvMcX47XsyM+IOGa9tc7/K5SPvBqn4nhppOCEz7BrzOPWc4A==}
+ engines: {node: '>= 14.0.0'}
+
+ '@algolia/client-analytics@5.46.2':
+ resolution: {integrity: sha512-EPBN2Oruw0maWOF4OgGPfioTvd+gmiNwx0HmD9IgmlS+l75DatcBkKOPNJN+0z3wBQWUO5oq602ATxIfmTQ8bA==}
+ engines: {node: '>= 14.0.0'}
+
+ '@algolia/client-common@5.46.2':
+ resolution: {integrity: sha512-Hj8gswSJNKZ0oyd0wWissqyasm+wTz1oIsv5ZmLarzOZAp3vFEda8bpDQ8PUhO+DfkbiLyVnAxsPe4cGzWtqkg==}
+ engines: {node: '>= 14.0.0'}
+
+ '@algolia/client-insights@5.46.2':
+ resolution: {integrity: sha512-6dBZko2jt8FmQcHCbmNLB0kCV079Mx/DJcySTL3wirgDBUH7xhY1pOuUTLMiGkqM5D8moVZTvTdRKZUJRkrwBA==}
+ engines: {node: '>= 14.0.0'}
+
+ '@algolia/client-personalization@5.46.2':
+ resolution: {integrity: sha512-1waE2Uqh/PHNeDXGn/PM/WrmYOBiUGSVxAWqiJIj73jqPqvfzZgzdakHscIVaDl6Cp+j5dwjsZ5LCgaUr6DtmA==}
+ engines: {node: '>= 14.0.0'}
+
+ '@algolia/client-query-suggestions@5.46.2':
+ resolution: {integrity: sha512-EgOzTZkyDcNL6DV0V/24+oBJ+hKo0wNgyrOX/mePBM9bc9huHxIY2352sXmoZ648JXXY2x//V1kropF/Spx83w==}
+ engines: {node: '>= 14.0.0'}
+
+ '@algolia/client-search@5.46.2':
+ resolution: {integrity: sha512-ZsOJqu4HOG5BlvIFnMU0YKjQ9ZI6r3C31dg2jk5kMWPSdhJpYL9xa5hEe7aieE+707dXeMI4ej3diy6mXdZpgA==}
+ engines: {node: '>= 14.0.0'}
+
+ '@algolia/ingestion@1.46.2':
+ resolution: {integrity: sha512-1Uw2OslTWiOFDtt83y0bGiErJYy5MizadV0nHnOoHFWMoDqWW0kQoMFI65pXqRSkVvit5zjXSLik2xMiyQJDWQ==}
+ engines: {node: '>= 14.0.0'}
+
+ '@algolia/monitoring@1.46.2':
+ resolution: {integrity: sha512-xk9f+DPtNcddWN6E7n1hyNNsATBCHIqAvVGG2EAGHJc4AFYL18uM/kMTiOKXE/LKDPyy1JhIerrh9oYb7RBrgw==}
+ engines: {node: '>= 14.0.0'}
+
+ '@algolia/recommend@5.46.2':
+ resolution: {integrity: sha512-NApbTPj9LxGzNw4dYnZmj2BoXiAc8NmbbH6qBNzQgXklGklt/xldTvu+FACN6ltFsTzoNU6j2mWNlHQTKGC5+Q==}
+ engines: {node: '>= 14.0.0'}
+
+ '@algolia/requester-browser-xhr@5.46.2':
+ resolution: {integrity: sha512-ekotpCwpSp033DIIrsTpYlGUCF6momkgupRV/FA3m62SreTSZUKjgK6VTNyG7TtYfq9YFm/pnh65bATP/ZWJEg==}
+ engines: {node: '>= 14.0.0'}
+
+ '@algolia/requester-fetch@5.46.2':
+ resolution: {integrity: sha512-gKE+ZFi/6y7saTr34wS0SqYFDcjHW4Wminv8PDZEi0/mE99+hSrbKgJWxo2ztb5eqGirQTgIh1AMVacGGWM1iw==}
+ engines: {node: '>= 14.0.0'}
+
+ '@algolia/requester-node-http@5.46.2':
+ resolution: {integrity: sha512-ciPihkletp7ttweJ8Zt+GukSVLp2ANJHU+9ttiSxsJZThXc4Y2yJ8HGVWesW5jN1zrsZsezN71KrMx/iZsOYpg==}
+ engines: {node: '>= 14.0.0'}
+
'@alloc/quick-lru@5.2.0':
resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
engines: {node: '>=10'}
@@ -667,102 +752,227 @@ packages:
'@date-fns/tz@1.4.1':
resolution: {integrity: sha512-P5LUNhtbj6YfI3iJjw5EL9eUAG6OitD0W3fWQcpQjDRc/QIsL0tRNuO1PcDvPccWL1fSTXXdE1ds+l95DV/OFA==}
+ '@docsearch/css@3.8.2':
+ resolution: {integrity: sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==}
+
+ '@docsearch/js@3.8.2':
+ resolution: {integrity: sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==}
+
+ '@docsearch/react@3.8.2':
+ resolution: {integrity: sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==}
+ peerDependencies:
+ '@types/react': '>= 16.8.0 < 19.0.0'
+ react: '>= 16.8.0 < 19.0.0'
+ react-dom: '>= 16.8.0 < 19.0.0'
+ search-insights: '>= 1 < 3'
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ react:
+ optional: true
+ react-dom:
+ optional: true
+ search-insights:
+ optional: true
+
+ '@esbuild/aix-ppc64@0.21.5':
+ resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [aix]
+
'@esbuild/aix-ppc64@0.27.2':
resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [aix]
+ '@esbuild/android-arm64@0.21.5':
+ resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [android]
+
'@esbuild/android-arm64@0.27.2':
resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==}
engines: {node: '>=18'}
cpu: [arm64]
os: [android]
+ '@esbuild/android-arm@0.21.5':
+ resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [android]
+
'@esbuild/android-arm@0.27.2':
resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==}
engines: {node: '>=18'}
cpu: [arm]
os: [android]
+ '@esbuild/android-x64@0.21.5':
+ resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [android]
+
'@esbuild/android-x64@0.27.2':
resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==}
engines: {node: '>=18'}
cpu: [x64]
os: [android]
+ '@esbuild/darwin-arm64@0.21.5':
+ resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [darwin]
+
'@esbuild/darwin-arm64@0.27.2':
resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [darwin]
+ '@esbuild/darwin-x64@0.21.5':
+ resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [darwin]
+
'@esbuild/darwin-x64@0.27.2':
resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==}
engines: {node: '>=18'}
cpu: [x64]
os: [darwin]
+ '@esbuild/freebsd-arm64@0.21.5':
+ resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [freebsd]
+
'@esbuild/freebsd-arm64@0.27.2':
resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==}
engines: {node: '>=18'}
cpu: [arm64]
os: [freebsd]
+ '@esbuild/freebsd-x64@0.21.5':
+ resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [freebsd]
+
'@esbuild/freebsd-x64@0.27.2':
resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==}
engines: {node: '>=18'}
cpu: [x64]
os: [freebsd]
+ '@esbuild/linux-arm64@0.21.5':
+ resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [linux]
+
'@esbuild/linux-arm64@0.27.2':
resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [linux]
+ '@esbuild/linux-arm@0.21.5':
+ resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [linux]
+
'@esbuild/linux-arm@0.27.2':
resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==}
engines: {node: '>=18'}
cpu: [arm]
os: [linux]
+ '@esbuild/linux-ia32@0.21.5':
+ resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [linux]
+
'@esbuild/linux-ia32@0.27.2':
resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==}
engines: {node: '>=18'}
cpu: [ia32]
os: [linux]
+ '@esbuild/linux-loong64@0.21.5':
+ resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==}
+ engines: {node: '>=12'}
+ cpu: [loong64]
+ os: [linux]
+
'@esbuild/linux-loong64@0.27.2':
resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==}
engines: {node: '>=18'}
cpu: [loong64]
os: [linux]
+ '@esbuild/linux-mips64el@0.21.5':
+ resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==}
+ engines: {node: '>=12'}
+ cpu: [mips64el]
+ os: [linux]
+
'@esbuild/linux-mips64el@0.27.2':
resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==}
engines: {node: '>=18'}
cpu: [mips64el]
os: [linux]
+ '@esbuild/linux-ppc64@0.21.5':
+ resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [linux]
+
'@esbuild/linux-ppc64@0.27.2':
resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [linux]
+ '@esbuild/linux-riscv64@0.21.5':
+ resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==}
+ engines: {node: '>=12'}
+ cpu: [riscv64]
+ os: [linux]
+
'@esbuild/linux-riscv64@0.27.2':
resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==}
engines: {node: '>=18'}
cpu: [riscv64]
os: [linux]
+ '@esbuild/linux-s390x@0.21.5':
+ resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==}
+ engines: {node: '>=12'}
+ cpu: [s390x]
+ os: [linux]
+
'@esbuild/linux-s390x@0.27.2':
resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==}
engines: {node: '>=18'}
cpu: [s390x]
os: [linux]
+ '@esbuild/linux-x64@0.21.5':
+ resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [linux]
+
'@esbuild/linux-x64@0.27.2':
resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==}
engines: {node: '>=18'}
@@ -775,6 +985,12 @@ packages:
cpu: [arm64]
os: [netbsd]
+ '@esbuild/netbsd-x64@0.21.5':
+ resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [netbsd]
+
'@esbuild/netbsd-x64@0.27.2':
resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==}
engines: {node: '>=18'}
@@ -787,6 +1003,12 @@ packages:
cpu: [arm64]
os: [openbsd]
+ '@esbuild/openbsd-x64@0.21.5':
+ resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [openbsd]
+
'@esbuild/openbsd-x64@0.27.2':
resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==}
engines: {node: '>=18'}
@@ -799,24 +1021,48 @@ packages:
cpu: [arm64]
os: [openharmony]
+ '@esbuild/sunos-x64@0.21.5':
+ resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [sunos]
+
'@esbuild/sunos-x64@0.27.2':
resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==}
engines: {node: '>=18'}
cpu: [x64]
os: [sunos]
+ '@esbuild/win32-arm64@0.21.5':
+ resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [win32]
+
'@esbuild/win32-arm64@0.27.2':
resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [win32]
+ '@esbuild/win32-ia32@0.21.5':
+ resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [win32]
+
'@esbuild/win32-ia32@0.27.2':
resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==}
engines: {node: '>=18'}
cpu: [ia32]
os: [win32]
+ '@esbuild/win32-x64@0.21.5':
+ resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [win32]
+
'@esbuild/win32-x64@0.27.2':
resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==}
engines: {node: '>=18'}
@@ -923,6 +1169,12 @@ packages:
resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
engines: {node: '>=18.18'}
+ '@iconify-json/simple-icons@1.2.66':
+ resolution: {integrity: sha512-D1OnnXwiQXFkVMw5M+Bt8mPsXeMkQyGmMdrmN7lsQlKMUkfLOp6JWhnUJ92po51WXT046aF/zzqSmkKqg08p4Q==}
+
+ '@iconify/types@2.0.0':
+ resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
+
'@jridgewell/gen-mapping@0.3.13':
resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
@@ -1826,6 +2078,30 @@ packages:
cpu: [x64]
os: [win32]
+ '@shikijs/core@2.5.0':
+ resolution: {integrity: sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==}
+
+ '@shikijs/engine-javascript@2.5.0':
+ resolution: {integrity: sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==}
+
+ '@shikijs/engine-oniguruma@2.5.0':
+ resolution: {integrity: sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==}
+
+ '@shikijs/langs@2.5.0':
+ resolution: {integrity: sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==}
+
+ '@shikijs/themes@2.5.0':
+ resolution: {integrity: sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==}
+
+ '@shikijs/transformers@2.5.0':
+ resolution: {integrity: sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==}
+
+ '@shikijs/types@2.5.0':
+ resolution: {integrity: sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==}
+
+ '@shikijs/vscode-textmate@10.0.2':
+ resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==}
+
'@standard-schema/spec@1.1.0':
resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
@@ -2006,9 +2282,24 @@ packages:
'@types/estree@1.0.8':
resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
+ '@types/hast@3.0.4':
+ resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
+
'@types/json-schema@7.0.15':
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+ '@types/linkify-it@5.0.0':
+ resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==}
+
+ '@types/markdown-it@14.1.2':
+ resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==}
+
+ '@types/mdast@4.0.4':
+ resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
+
+ '@types/mdurl@2.0.0':
+ resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==}
+
'@types/node@20.19.28':
resolution: {integrity: sha512-VyKBr25BuFDzBFCK5sUM6ZXiWfqgCTwTAOK8qzGV/m9FCirXYDlmczJ+d5dXBAQALGCdRRdbteKYfJ84NGEusw==}
@@ -2029,6 +2320,12 @@ packages:
'@types/resolve@1.20.2':
resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==}
+ '@types/unist@3.0.3':
+ resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
+
+ '@types/web-bluetooth@0.0.21':
+ resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==}
+
'@types/whatwg-mimetype@3.0.2':
resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==}
@@ -2103,6 +2400,13 @@ packages:
peerDependencies:
vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0
+ '@vitejs/plugin-vue@5.2.4':
+ resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ peerDependencies:
+ vite: ^5.0.0 || ^6.0.0
+ vue: ^3.2.25
+
'@vitest/coverage-v8@4.0.17':
resolution: {integrity: sha512-/6zU2FLGg0jsd+ePZcwHRy3+WpNTBBhDY56P4JTRqUN/Dp6CvOEa9HrikcQ4KfV2b2kAHUFB4dl1SuocWXSFEw==}
peerDependencies:
@@ -2146,6 +2450,94 @@ packages:
'@vitest/utils@4.0.17':
resolution: {integrity: sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==}
+ '@vue/compiler-core@3.5.26':
+ resolution: {integrity: sha512-vXyI5GMfuoBCnv5ucIT7jhHKl55Y477yxP6fc4eUswjP8FG3FFVFd41eNDArR+Uk3QKn2Z85NavjaxLxOC19/w==}
+
+ '@vue/compiler-dom@3.5.26':
+ resolution: {integrity: sha512-y1Tcd3eXs834QjswshSilCBnKGeQjQXB6PqFn/1nxcQw4pmG42G8lwz+FZPAZAby6gZeHSt/8LMPfZ4Rb+Bd/A==}
+
+ '@vue/compiler-sfc@3.5.26':
+ resolution: {integrity: sha512-egp69qDTSEZcf4bGOSsprUr4xI73wfrY5oRs6GSgXFTiHrWj4Y3X5Ydtip9QMqiCMCPVwLglB9GBxXtTadJ3mA==}
+
+ '@vue/compiler-ssr@3.5.26':
+ resolution: {integrity: sha512-lZT9/Y0nSIRUPVvapFJEVDbEXruZh2IYHMk2zTtEgJSlP5gVOqeWXH54xDKAaFS4rTnDeDBQUYDtxKyoW9FwDw==}
+
+ '@vue/devtools-api@7.7.9':
+ resolution: {integrity: sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==}
+
+ '@vue/devtools-kit@7.7.9':
+ resolution: {integrity: sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==}
+
+ '@vue/devtools-shared@7.7.9':
+ resolution: {integrity: sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==}
+
+ '@vue/reactivity@3.5.26':
+ resolution: {integrity: sha512-9EnYB1/DIiUYYnzlnUBgwU32NNvLp/nhxLXeWRhHUEeWNTn1ECxX8aGO7RTXeX6PPcxe3LLuNBFoJbV4QZ+CFQ==}
+
+ '@vue/runtime-core@3.5.26':
+ resolution: {integrity: sha512-xJWM9KH1kd201w5DvMDOwDHYhrdPTrAatn56oB/LRG4plEQeZRQLw0Bpwih9KYoqmzaxF0OKSn6swzYi84e1/Q==}
+
+ '@vue/runtime-dom@3.5.26':
+ resolution: {integrity: sha512-XLLd/+4sPC2ZkN/6+V4O4gjJu6kSDbHAChvsyWgm1oGbdSO3efvGYnm25yCjtFm/K7rrSDvSfPDgN1pHgS4VNQ==}
+
+ '@vue/server-renderer@3.5.26':
+ resolution: {integrity: sha512-TYKLXmrwWKSodyVuO1WAubucd+1XlLg4set0YoV+Hu8Lo79mp/YMwWV5mC5FgtsDxX3qo1ONrxFaTP1OQgy1uA==}
+ peerDependencies:
+ vue: 3.5.26
+
+ '@vue/shared@3.5.26':
+ resolution: {integrity: sha512-7Z6/y3uFI5PRoKeorTOSXKcDj0MSasfNNltcslbFrPpcw6aXRUALq4IfJlaTRspiWIUOEZbrpM+iQGmCOiWe4A==}
+
+ '@vueuse/core@12.8.2':
+ resolution: {integrity: sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==}
+
+ '@vueuse/integrations@12.8.2':
+ resolution: {integrity: sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==}
+ peerDependencies:
+ async-validator: ^4
+ axios: ^1
+ change-case: ^5
+ drauu: ^0.4
+ focus-trap: ^7
+ fuse.js: ^7
+ idb-keyval: ^6
+ jwt-decode: ^4
+ nprogress: ^0.2
+ qrcode: ^1.5
+ sortablejs: ^1
+ universal-cookie: ^7
+ peerDependenciesMeta:
+ async-validator:
+ optional: true
+ axios:
+ optional: true
+ change-case:
+ optional: true
+ drauu:
+ optional: true
+ focus-trap:
+ optional: true
+ fuse.js:
+ optional: true
+ idb-keyval:
+ optional: true
+ jwt-decode:
+ optional: true
+ nprogress:
+ optional: true
+ qrcode:
+ optional: true
+ sortablejs:
+ optional: true
+ universal-cookie:
+ optional: true
+
+ '@vueuse/metadata@12.8.2':
+ resolution: {integrity: sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==}
+
+ '@vueuse/shared@12.8.2':
+ resolution: {integrity: sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==}
+
accepts@1.3.8:
resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
engines: {node: '>= 0.6'}
@@ -2167,6 +2559,10 @@ packages:
ajv@6.12.6:
resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+ algoliasearch@5.46.2:
+ resolution: {integrity: sha512-qqAXW9QvKf2tTyhpDA4qXv1IfBwD2eduSW6tUEBFIfCeE9gn9HQ9I5+MaKoenRuHrzk5sQoNh1/iof8mY7uD6Q==}
+ engines: {node: '>= 14.0.0'}
+
ansi-regex@5.0.1:
resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
engines: {node: '>=8'}
@@ -2241,6 +2637,9 @@ packages:
resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
engines: {node: '>=8'}
+ birpc@2.9.0:
+ resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==}
+
body-parser@1.20.4:
resolution: {integrity: sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==}
engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
@@ -2296,6 +2695,9 @@ packages:
caniuse-lite@1.0.30001764:
resolution: {integrity: sha512-9JGuzl2M+vPL+pz70gtMF9sHdMFbY9FJaQBi186cHKH3pSzDvzoUJUPV6fqiKIMyXbud9ZLg4F3Yza1vJ1+93g==}
+ ccount@2.0.1:
+ resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
+
chai@6.2.2:
resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==}
engines: {node: '>=18'}
@@ -2304,6 +2706,12 @@ packages:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
engines: {node: '>=10'}
+ character-entities-html4@2.1.0:
+ resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==}
+
+ character-entities-legacy@3.0.0:
+ resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==}
+
chokidar@3.6.0:
resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
engines: {node: '>= 8.10.0'}
@@ -2335,6 +2743,9 @@ packages:
colord@2.9.3:
resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==}
+ comma-separated-tokens@2.0.3:
+ resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
+
commander@4.1.1:
resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
engines: {node: '>= 6'}
@@ -2385,6 +2796,10 @@ packages:
resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==}
engines: {node: '>=18'}
+ copy-anything@4.0.5:
+ resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==}
+ engines: {node: '>=18'}
+
cross-spawn@7.0.6:
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
engines: {node: '>= 8'}
@@ -2558,6 +2973,9 @@ packages:
detect-node-es@1.1.0:
resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==}
+ devlop@1.1.0:
+ resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
+
didyoumean@1.2.2:
resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
@@ -2613,6 +3031,9 @@ packages:
embla-carousel@8.6.0:
resolution: {integrity: sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==}
+ emoji-regex-xs@1.0.0:
+ resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==}
+
encodeurl@2.0.0:
resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
engines: {node: '>= 0.8'}
@@ -2628,6 +3049,10 @@ packages:
resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==}
engines: {node: '>=0.12'}
+ entities@7.0.0:
+ resolution: {integrity: sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ==}
+ engines: {node: '>=0.12'}
+
es-define-property@1.0.1:
resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
engines: {node: '>= 0.4'}
@@ -2643,6 +3068,11 @@ packages:
resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
engines: {node: '>= 0.4'}
+ esbuild@0.21.5:
+ resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==}
+ engines: {node: '>=12'}
+ hasBin: true
+
esbuild@0.27.2:
resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==}
engines: {node: '>=18'}
@@ -2820,6 +3250,9 @@ packages:
flatted@3.3.3:
resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==}
+ focus-trap@7.8.0:
+ resolution: {integrity: sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==}
+
forwarded@0.2.0:
resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
engines: {node: '>= 0.6'}
@@ -2923,12 +3356,21 @@ packages:
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
engines: {node: '>= 0.4'}
+ hast-util-to-html@9.0.5:
+ resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==}
+
+ hast-util-whitespace@3.0.0:
+ resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==}
+
hermes-estree@0.25.1:
resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==}
hermes-parser@0.25.1:
resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==}
+ hookable@5.5.3:
+ resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==}
+
html-encoding-sniffer@6.0.0:
resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==}
engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
@@ -2936,6 +3378,9 @@ packages:
html-escaper@2.0.2:
resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
+ html-void-elements@3.0.0:
+ resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==}
+
http-errors@2.0.1:
resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==}
engines: {node: '>= 0.8'}
@@ -3043,6 +3488,10 @@ packages:
is-reference@1.2.1:
resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==}
+ is-what@5.5.0:
+ resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==}
+ engines: {node: '>=18'}
+
isbot@5.1.32:
resolution: {integrity: sha512-VNfjM73zz2IBZmdShMfAUg10prm6t7HFUQmNAEOAVS4YH92ZrZcvkMcGX6cIgBJAzWDzPent/EeAtYEHNPNPBQ==}
engines: {node: '>=18'}
@@ -3094,11 +3543,6 @@ packages:
engines: {node: '>=6'}
hasBin: true
- jsesc@3.1.0:
- resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
- engines: {node: '>=6'}
- hasBin: true
-
json-buffer@3.0.1:
resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
@@ -3254,10 +3698,16 @@ packages:
resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==}
engines: {node: '>=10'}
+ mark.js@8.11.1:
+ resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==}
+
math-intrinsics@1.1.0:
resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
engines: {node: '>= 0.4'}
+ mdast-util-to-hast@13.2.1:
+ resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==}
+
mdn-data@2.0.14:
resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==}
@@ -3279,6 +3729,21 @@ packages:
resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==}
engines: {node: '>= 0.6'}
+ micromark-util-character@2.1.1:
+ resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==}
+
+ micromark-util-encode@2.0.1:
+ resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==}
+
+ micromark-util-sanitize-uri@2.0.1:
+ resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==}
+
+ micromark-util-symbol@2.0.1:
+ resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==}
+
+ micromark-util-types@2.0.2:
+ resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==}
+
micromatch@4.0.8:
resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
engines: {node: '>=8.6'}
@@ -3315,6 +3780,12 @@ packages:
resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
engines: {node: '>=16 || 14 >=14.17'}
+ minisearch@7.2.0:
+ resolution: {integrity: sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==}
+
+ mitt@3.0.1:
+ resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==}
+
morgan@1.10.1:
resolution: {integrity: sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==}
engines: {node: '>= 0.8.0'}
@@ -3398,6 +3869,9 @@ packages:
once@1.4.0:
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+ oniguruma-to-es@3.1.1:
+ resolution: {integrity: sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==}
+
optionator@0.9.4:
resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
engines: {node: '>= 0.8.0'}
@@ -3461,6 +3935,9 @@ packages:
pathe@2.0.3:
resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
+ perfect-debounce@1.0.0:
+ resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==}
+
picocolors@1.1.1:
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
@@ -3740,6 +4217,9 @@ packages:
resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
engines: {node: ^10 || ^12 || >=14}
+ preact@10.28.2:
+ resolution: {integrity: sha512-lbteaWGzGHdlIuiJ0l2Jq454m6kcpI1zNje6d8MlGAFlYvP2GO4ibnat7P74Esfz4sPTdM6UxtTwh/d3pwM9JA==}
+
prelude-ls@1.2.1:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
engines: {node: '>= 0.8.0'}
@@ -3760,6 +4240,9 @@ packages:
prop-types@15.8.1:
resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
+ property-information@7.1.0:
+ resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==}
+
proxy-addr@2.0.7:
resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
engines: {node: '>= 0.10'}
@@ -3908,6 +4391,15 @@ packages:
resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==}
engines: {node: '>=8'}
+ regex-recursion@6.0.2:
+ resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==}
+
+ regex-utilities@2.3.0:
+ resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==}
+
+ regex@6.1.0:
+ resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==}
+
require-from-string@2.0.2:
resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
engines: {node: '>=0.10.0'}
@@ -3929,6 +4421,9 @@ packages:
resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+ rfdc@1.4.1:
+ resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
+
rimraf@3.0.2:
resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
deprecated: Rimraf versions prior to v4 are no longer supported
@@ -3975,6 +4470,9 @@ packages:
scheduler@0.27.0:
resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==}
+ search-insights@2.17.3:
+ resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==}
+
semver@6.3.1:
resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
hasBin: true
@@ -4006,6 +4504,9 @@ packages:
resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
engines: {node: '>=8'}
+ shiki@2.5.0:
+ resolution: {integrity: sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==}
+
side-channel-list@1.0.0:
resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
engines: {node: '>= 0.4'}
@@ -4046,6 +4547,13 @@ packages:
resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
engines: {node: '>=0.10.0'}
+ space-separated-tokens@2.0.2:
+ resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
+
+ speakingurl@14.0.1:
+ resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==}
+ engines: {node: '>=0.10.0'}
+
stable@0.1.8:
resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==}
deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility'
@@ -4063,6 +4571,9 @@ packages:
string-hash@1.1.3:
resolution: {integrity: sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==}
+ stringify-entities@4.0.4:
+ resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==}
+
strip-ansi@6.0.1:
resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
engines: {node: '>=8'}
@@ -4089,6 +4600,10 @@ packages:
engines: {node: '>=16 || 14 >=14.17'}
hasBin: true
+ superjson@2.2.6:
+ resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==}
+ engines: {node: '>=16'}
+
supports-color@7.2.0:
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
engines: {node: '>=8'}
@@ -4105,6 +4620,9 @@ packages:
symbol-tree@3.2.4:
resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
+ tabbable@6.4.0:
+ resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==}
+
tailwind-merge@3.4.0:
resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==}
@@ -4175,6 +4693,9 @@ packages:
resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==}
engines: {node: '>=20'}
+ trim-lines@3.0.1:
+ resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
+
ts-api-utils@2.4.0:
resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==}
engines: {node: '>=18.12'}
@@ -4264,6 +4785,21 @@ packages:
undici-types@7.16.0:
resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==}
+ unist-util-is@6.0.1:
+ resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==}
+
+ unist-util-position@5.0.0:
+ resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==}
+
+ unist-util-stringify-position@4.0.0:
+ resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==}
+
+ unist-util-visit-parents@6.0.2:
+ resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==}
+
+ unist-util-visit@5.0.0:
+ resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==}
+
unpipe@1.0.0:
resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
engines: {node: '>= 0.8'}
@@ -4327,6 +4863,12 @@ packages:
react: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc
react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc
+ vfile-message@4.0.3:
+ resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==}
+
+ vfile@6.0.3:
+ resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
+
victory-vendor@36.9.2:
resolution: {integrity: sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==}
@@ -4343,27 +4885,22 @@ packages:
vite:
optional: true
- vite@7.3.1:
- resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==}
- engines: {node: ^20.19.0 || >=22.12.0}
+ vite@5.4.21:
+ resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==}
+ engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true
peerDependencies:
- '@types/node': ^20.19.0 || >=22.12.0
- jiti: '>=1.21.0'
- less: ^4.0.0
+ '@types/node': ^18.0.0 || >=20.0.0
+ less: '*'
lightningcss: ^1.21.0
- sass: ^1.70.0
- sass-embedded: ^1.70.0
- stylus: '>=0.54.8'
- sugarss: ^5.0.0
- terser: ^5.16.0
- tsx: ^4.8.1
- yaml: ^2.4.2
+ sass: '*'
+ sass-embedded: '*'
+ stylus: '*'
+ sugarss: '*'
+ terser: ^5.4.0
peerDependenciesMeta:
'@types/node':
optional: true
- jiti:
- optional: true
less:
optional: true
lightningcss:
@@ -4378,10 +4915,58 @@ packages:
optional: true
terser:
optional: true
- tsx:
- optional: true
- yaml:
- optional: true
+
+ vite@7.3.1:
+ resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': ^20.19.0 || >=22.12.0
+ jiti: '>=1.21.0'
+ less: ^4.0.0
+ lightningcss: ^1.21.0
+ sass: ^1.70.0
+ sass-embedded: ^1.70.0
+ stylus: '>=0.54.8'
+ sugarss: ^5.0.0
+ terser: ^5.16.0
+ tsx: ^4.8.1
+ yaml: ^2.4.2
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ jiti:
+ optional: true
+ less:
+ optional: true
+ lightningcss:
+ optional: true
+ sass:
+ optional: true
+ sass-embedded:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+ tsx:
+ optional: true
+ yaml:
+ optional: true
+
+ vitepress@1.6.4:
+ resolution: {integrity: sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg==}
+ hasBin: true
+ peerDependencies:
+ markdown-it-mathjax3: ^4
+ postcss: ^8
+ peerDependenciesMeta:
+ markdown-it-mathjax3:
+ optional: true
+ postcss:
+ optional: true
vitest@4.0.17:
resolution: {integrity: sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==}
@@ -4417,6 +5002,14 @@ packages:
jsdom:
optional: true
+ vue@3.5.26:
+ resolution: {integrity: sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA==}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
w3c-xmlserializer@5.0.0:
resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==}
engines: {node: '>=18'}
@@ -4493,12 +5086,127 @@ packages:
zod@4.3.5:
resolution: {integrity: sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==}
+ zwitch@2.0.4:
+ resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
+
snapshots:
'@acemir/cssom@0.9.31': {}
'@adobe/css-tools@4.4.4': {}
+ '@algolia/abtesting@1.12.2':
+ dependencies:
+ '@algolia/client-common': 5.46.2
+ '@algolia/requester-browser-xhr': 5.46.2
+ '@algolia/requester-fetch': 5.46.2
+ '@algolia/requester-node-http': 5.46.2
+
+ '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.46.2)(algoliasearch@5.46.2)(search-insights@2.17.3)':
+ dependencies:
+ '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.46.2)(algoliasearch@5.46.2)(search-insights@2.17.3)
+ '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.46.2)(algoliasearch@5.46.2)
+ transitivePeerDependencies:
+ - '@algolia/client-search'
+ - algoliasearch
+ - search-insights
+
+ '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.46.2)(algoliasearch@5.46.2)(search-insights@2.17.3)':
+ dependencies:
+ '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.46.2)(algoliasearch@5.46.2)
+ search-insights: 2.17.3
+ transitivePeerDependencies:
+ - '@algolia/client-search'
+ - algoliasearch
+
+ '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.46.2)(algoliasearch@5.46.2)':
+ dependencies:
+ '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.46.2)(algoliasearch@5.46.2)
+ '@algolia/client-search': 5.46.2
+ algoliasearch: 5.46.2
+
+ '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.46.2)(algoliasearch@5.46.2)':
+ dependencies:
+ '@algolia/client-search': 5.46.2
+ algoliasearch: 5.46.2
+
+ '@algolia/client-abtesting@5.46.2':
+ dependencies:
+ '@algolia/client-common': 5.46.2
+ '@algolia/requester-browser-xhr': 5.46.2
+ '@algolia/requester-fetch': 5.46.2
+ '@algolia/requester-node-http': 5.46.2
+
+ '@algolia/client-analytics@5.46.2':
+ dependencies:
+ '@algolia/client-common': 5.46.2
+ '@algolia/requester-browser-xhr': 5.46.2
+ '@algolia/requester-fetch': 5.46.2
+ '@algolia/requester-node-http': 5.46.2
+
+ '@algolia/client-common@5.46.2': {}
+
+ '@algolia/client-insights@5.46.2':
+ dependencies:
+ '@algolia/client-common': 5.46.2
+ '@algolia/requester-browser-xhr': 5.46.2
+ '@algolia/requester-fetch': 5.46.2
+ '@algolia/requester-node-http': 5.46.2
+
+ '@algolia/client-personalization@5.46.2':
+ dependencies:
+ '@algolia/client-common': 5.46.2
+ '@algolia/requester-browser-xhr': 5.46.2
+ '@algolia/requester-fetch': 5.46.2
+ '@algolia/requester-node-http': 5.46.2
+
+ '@algolia/client-query-suggestions@5.46.2':
+ dependencies:
+ '@algolia/client-common': 5.46.2
+ '@algolia/requester-browser-xhr': 5.46.2
+ '@algolia/requester-fetch': 5.46.2
+ '@algolia/requester-node-http': 5.46.2
+
+ '@algolia/client-search@5.46.2':
+ dependencies:
+ '@algolia/client-common': 5.46.2
+ '@algolia/requester-browser-xhr': 5.46.2
+ '@algolia/requester-fetch': 5.46.2
+ '@algolia/requester-node-http': 5.46.2
+
+ '@algolia/ingestion@1.46.2':
+ dependencies:
+ '@algolia/client-common': 5.46.2
+ '@algolia/requester-browser-xhr': 5.46.2
+ '@algolia/requester-fetch': 5.46.2
+ '@algolia/requester-node-http': 5.46.2
+
+ '@algolia/monitoring@1.46.2':
+ dependencies:
+ '@algolia/client-common': 5.46.2
+ '@algolia/requester-browser-xhr': 5.46.2
+ '@algolia/requester-fetch': 5.46.2
+ '@algolia/requester-node-http': 5.46.2
+
+ '@algolia/recommend@5.46.2':
+ dependencies:
+ '@algolia/client-common': 5.46.2
+ '@algolia/requester-browser-xhr': 5.46.2
+ '@algolia/requester-fetch': 5.46.2
+ '@algolia/requester-node-http': 5.46.2
+
+ '@algolia/requester-browser-xhr@5.46.2':
+ dependencies:
+ '@algolia/client-common': 5.46.2
+
+ '@algolia/requester-fetch@5.46.2':
+ dependencies:
+ '@algolia/client-common': 5.46.2
+
+ '@algolia/requester-node-http@5.46.2':
+ dependencies:
+ '@algolia/client-common': 5.46.2
+
'@alloc/quick-lru@5.2.0': {}
'@asamuzakjp/css-color@4.1.1':
@@ -4553,7 +5261,7 @@ snapshots:
'@babel/types': 7.28.6
'@jridgewell/gen-mapping': 0.3.13
'@jridgewell/trace-mapping': 0.3.31
- jsesc: 3.1.0
+ jsesc: 3.0.2
'@babel/helper-annotate-as-pure@7.27.3':
dependencies:
@@ -4743,81 +5451,177 @@ snapshots:
'@date-fns/tz@1.4.1': {}
+ '@docsearch/css@3.8.2': {}
+
+ '@docsearch/js@3.8.2(@algolia/client-search@5.46.2)(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@18.3.1)(search-insights@2.17.3)':
+ dependencies:
+ '@docsearch/react': 3.8.2(@algolia/client-search@5.46.2)(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@18.3.1)(search-insights@2.17.3)
+ preact: 10.28.2
+ transitivePeerDependencies:
+ - '@algolia/client-search'
+ - '@types/react'
+ - react
+ - react-dom
+ - search-insights
+
+ '@docsearch/react@3.8.2(@algolia/client-search@5.46.2)(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@18.3.1)(search-insights@2.17.3)':
+ dependencies:
+ '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.46.2)(algoliasearch@5.46.2)(search-insights@2.17.3)
+ '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.46.2)(algoliasearch@5.46.2)
+ '@docsearch/css': 3.8.2
+ algoliasearch: 5.46.2
+ optionalDependencies:
+ '@types/react': 19.2.8
+ react: 18.3.1
+ react-dom: 19.2.3(react@19.2.3)
+ search-insights: 2.17.3
+ transitivePeerDependencies:
+ - '@algolia/client-search'
+
+ '@esbuild/aix-ppc64@0.21.5':
+ optional: true
+
'@esbuild/aix-ppc64@0.27.2':
optional: true
+ '@esbuild/android-arm64@0.21.5':
+ optional: true
+
'@esbuild/android-arm64@0.27.2':
optional: true
+ '@esbuild/android-arm@0.21.5':
+ optional: true
+
'@esbuild/android-arm@0.27.2':
optional: true
+ '@esbuild/android-x64@0.21.5':
+ optional: true
+
'@esbuild/android-x64@0.27.2':
optional: true
+ '@esbuild/darwin-arm64@0.21.5':
+ optional: true
+
'@esbuild/darwin-arm64@0.27.2':
optional: true
+ '@esbuild/darwin-x64@0.21.5':
+ optional: true
+
'@esbuild/darwin-x64@0.27.2':
optional: true
+ '@esbuild/freebsd-arm64@0.21.5':
+ optional: true
+
'@esbuild/freebsd-arm64@0.27.2':
optional: true
+ '@esbuild/freebsd-x64@0.21.5':
+ optional: true
+
'@esbuild/freebsd-x64@0.27.2':
optional: true
+ '@esbuild/linux-arm64@0.21.5':
+ optional: true
+
'@esbuild/linux-arm64@0.27.2':
optional: true
+ '@esbuild/linux-arm@0.21.5':
+ optional: true
+
'@esbuild/linux-arm@0.27.2':
optional: true
+ '@esbuild/linux-ia32@0.21.5':
+ optional: true
+
'@esbuild/linux-ia32@0.27.2':
optional: true
+ '@esbuild/linux-loong64@0.21.5':
+ optional: true
+
'@esbuild/linux-loong64@0.27.2':
optional: true
+ '@esbuild/linux-mips64el@0.21.5':
+ optional: true
+
'@esbuild/linux-mips64el@0.27.2':
optional: true
+ '@esbuild/linux-ppc64@0.21.5':
+ optional: true
+
'@esbuild/linux-ppc64@0.27.2':
optional: true
+ '@esbuild/linux-riscv64@0.21.5':
+ optional: true
+
'@esbuild/linux-riscv64@0.27.2':
optional: true
+ '@esbuild/linux-s390x@0.21.5':
+ optional: true
+
'@esbuild/linux-s390x@0.27.2':
optional: true
+ '@esbuild/linux-x64@0.21.5':
+ optional: true
+
'@esbuild/linux-x64@0.27.2':
optional: true
'@esbuild/netbsd-arm64@0.27.2':
optional: true
+ '@esbuild/netbsd-x64@0.21.5':
+ optional: true
+
'@esbuild/netbsd-x64@0.27.2':
optional: true
'@esbuild/openbsd-arm64@0.27.2':
optional: true
+ '@esbuild/openbsd-x64@0.21.5':
+ optional: true
+
'@esbuild/openbsd-x64@0.27.2':
optional: true
'@esbuild/openharmony-arm64@0.27.2':
optional: true
+ '@esbuild/sunos-x64@0.21.5':
+ optional: true
+
'@esbuild/sunos-x64@0.27.2':
optional: true
+ '@esbuild/win32-arm64@0.21.5':
+ optional: true
+
'@esbuild/win32-arm64@0.27.2':
optional: true
+ '@esbuild/win32-ia32@0.21.5':
+ optional: true
+
'@esbuild/win32-ia32@0.27.2':
optional: true
+ '@esbuild/win32-x64@0.21.5':
+ optional: true
+
'@esbuild/win32-x64@0.27.2':
optional: true
@@ -4933,6 +5737,12 @@ snapshots:
'@humanwhocodes/retry@0.4.3': {}
+ '@iconify-json/simple-icons@1.2.66':
+ dependencies:
+ '@iconify/types': 2.0.0
+
+ '@iconify/types@2.0.0': {}
+
'@jridgewell/gen-mapping@0.3.13':
dependencies:
'@jridgewell/sourcemap-codec': 1.5.5
@@ -5842,6 +6652,46 @@ snapshots:
'@rollup/rollup-win32-x64-msvc@4.55.1':
optional: true
+ '@shikijs/core@2.5.0':
+ dependencies:
+ '@shikijs/engine-javascript': 2.5.0
+ '@shikijs/engine-oniguruma': 2.5.0
+ '@shikijs/types': 2.5.0
+ '@shikijs/vscode-textmate': 10.0.2
+ '@types/hast': 3.0.4
+ hast-util-to-html: 9.0.5
+
+ '@shikijs/engine-javascript@2.5.0':
+ dependencies:
+ '@shikijs/types': 2.5.0
+ '@shikijs/vscode-textmate': 10.0.2
+ oniguruma-to-es: 3.1.1
+
+ '@shikijs/engine-oniguruma@2.5.0':
+ dependencies:
+ '@shikijs/types': 2.5.0
+ '@shikijs/vscode-textmate': 10.0.2
+
+ '@shikijs/langs@2.5.0':
+ dependencies:
+ '@shikijs/types': 2.5.0
+
+ '@shikijs/themes@2.5.0':
+ dependencies:
+ '@shikijs/types': 2.5.0
+
+ '@shikijs/transformers@2.5.0':
+ dependencies:
+ '@shikijs/core': 2.5.0
+ '@shikijs/types': 2.5.0
+
+ '@shikijs/types@2.5.0':
+ dependencies:
+ '@shikijs/vscode-textmate': 10.0.2
+ '@types/hast': 3.0.4
+
+ '@shikijs/vscode-textmate@10.0.2': {}
+
'@standard-schema/spec@1.1.0': {}
'@standard-schema/utils@0.3.0': {}
@@ -6006,8 +6856,25 @@ snapshots:
'@types/estree@1.0.8': {}
+ '@types/hast@3.0.4':
+ dependencies:
+ '@types/unist': 3.0.3
+
'@types/json-schema@7.0.15': {}
+ '@types/linkify-it@5.0.0': {}
+
+ '@types/markdown-it@14.1.2':
+ dependencies:
+ '@types/linkify-it': 5.0.0
+ '@types/mdurl': 2.0.0
+
+ '@types/mdast@4.0.4':
+ dependencies:
+ '@types/unist': 3.0.3
+
+ '@types/mdurl@2.0.0': {}
+
'@types/node@20.19.28':
dependencies:
undici-types: 6.21.0
@@ -6030,6 +6897,10 @@ snapshots:
'@types/resolve@1.20.2': {}
+ '@types/unist@3.0.3': {}
+
+ '@types/web-bluetooth@0.0.21': {}
+
'@types/whatwg-mimetype@3.0.2': {}
'@types/ws@8.18.1':
@@ -6141,6 +7012,11 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@vitejs/plugin-vue@5.2.4(vite@5.4.21(@types/node@24.10.7)(lightningcss@1.30.2))(vue@3.5.26(typescript@5.9.3))':
+ dependencies:
+ vite: 5.4.21(@types/node@24.10.7)(lightningcss@1.30.2)
+ vue: 3.5.26(typescript@5.9.3)
+
'@vitest/coverage-v8@4.0.17(vitest@4.0.17)':
dependencies:
'@bcoe/v8-coverage': 1.0.2
@@ -6205,6 +7081,105 @@ snapshots:
'@vitest/pretty-format': 4.0.17
tinyrainbow: 3.0.3
+ '@vue/compiler-core@3.5.26':
+ dependencies:
+ '@babel/parser': 7.28.6
+ '@vue/shared': 3.5.26
+ entities: 7.0.0
+ estree-walker: 2.0.2
+ source-map-js: 1.2.1
+
+ '@vue/compiler-dom@3.5.26':
+ dependencies:
+ '@vue/compiler-core': 3.5.26
+ '@vue/shared': 3.5.26
+
+ '@vue/compiler-sfc@3.5.26':
+ dependencies:
+ '@babel/parser': 7.28.6
+ '@vue/compiler-core': 3.5.26
+ '@vue/compiler-dom': 3.5.26
+ '@vue/compiler-ssr': 3.5.26
+ '@vue/shared': 3.5.26
+ estree-walker: 2.0.2
+ magic-string: 0.30.21
+ postcss: 8.5.6
+ source-map-js: 1.2.1
+
+ '@vue/compiler-ssr@3.5.26':
+ dependencies:
+ '@vue/compiler-dom': 3.5.26
+ '@vue/shared': 3.5.26
+
+ '@vue/devtools-api@7.7.9':
+ dependencies:
+ '@vue/devtools-kit': 7.7.9
+
+ '@vue/devtools-kit@7.7.9':
+ dependencies:
+ '@vue/devtools-shared': 7.7.9
+ birpc: 2.9.0
+ hookable: 5.5.3
+ mitt: 3.0.1
+ perfect-debounce: 1.0.0
+ speakingurl: 14.0.1
+ superjson: 2.2.6
+
+ '@vue/devtools-shared@7.7.9':
+ dependencies:
+ rfdc: 1.4.1
+
+ '@vue/reactivity@3.5.26':
+ dependencies:
+ '@vue/shared': 3.5.26
+
+ '@vue/runtime-core@3.5.26':
+ dependencies:
+ '@vue/reactivity': 3.5.26
+ '@vue/shared': 3.5.26
+
+ '@vue/runtime-dom@3.5.26':
+ dependencies:
+ '@vue/reactivity': 3.5.26
+ '@vue/runtime-core': 3.5.26
+ '@vue/shared': 3.5.26
+ csstype: 3.2.3
+
+ '@vue/server-renderer@3.5.26(vue@3.5.26(typescript@5.9.3))':
+ dependencies:
+ '@vue/compiler-ssr': 3.5.26
+ '@vue/shared': 3.5.26
+ vue: 3.5.26(typescript@5.9.3)
+
+ '@vue/shared@3.5.26': {}
+
+ '@vueuse/core@12.8.2(typescript@5.9.3)':
+ dependencies:
+ '@types/web-bluetooth': 0.0.21
+ '@vueuse/metadata': 12.8.2
+ '@vueuse/shared': 12.8.2(typescript@5.9.3)
+ vue: 3.5.26(typescript@5.9.3)
+ transitivePeerDependencies:
+ - typescript
+
+ '@vueuse/integrations@12.8.2(focus-trap@7.8.0)(typescript@5.9.3)':
+ dependencies:
+ '@vueuse/core': 12.8.2(typescript@5.9.3)
+ '@vueuse/shared': 12.8.2(typescript@5.9.3)
+ vue: 3.5.26(typescript@5.9.3)
+ optionalDependencies:
+ focus-trap: 7.8.0
+ transitivePeerDependencies:
+ - typescript
+
+ '@vueuse/metadata@12.8.2': {}
+
+ '@vueuse/shared@12.8.2(typescript@5.9.3)':
+ dependencies:
+ vue: 3.5.26(typescript@5.9.3)
+ transitivePeerDependencies:
+ - typescript
+
accepts@1.3.8:
dependencies:
mime-types: 2.1.35
@@ -6225,6 +7200,23 @@ snapshots:
json-schema-traverse: 0.4.1
uri-js: 4.4.1
+ algoliasearch@5.46.2:
+ dependencies:
+ '@algolia/abtesting': 1.12.2
+ '@algolia/client-abtesting': 5.46.2
+ '@algolia/client-analytics': 5.46.2
+ '@algolia/client-common': 5.46.2
+ '@algolia/client-insights': 5.46.2
+ '@algolia/client-personalization': 5.46.2
+ '@algolia/client-query-suggestions': 5.46.2
+ '@algolia/client-search': 5.46.2
+ '@algolia/ingestion': 1.46.2
+ '@algolia/monitoring': 1.46.2
+ '@algolia/recommend': 5.46.2
+ '@algolia/requester-browser-xhr': 5.46.2
+ '@algolia/requester-fetch': 5.46.2
+ '@algolia/requester-node-http': 5.46.2
+
ansi-regex@5.0.1: {}
ansi-styles@4.3.0:
@@ -6296,6 +7288,8 @@ snapshots:
binary-extensions@2.3.0: {}
+ birpc@2.9.0: {}
+
body-parser@1.20.4:
dependencies:
bytes: 3.1.2
@@ -6365,6 +7359,8 @@ snapshots:
caniuse-lite@1.0.30001764: {}
+ ccount@2.0.1: {}
+
chai@6.2.2: {}
chalk@4.1.2:
@@ -6372,6 +7368,10 @@ snapshots:
ansi-styles: 4.3.0
supports-color: 7.2.0
+ character-entities-html4@2.1.0: {}
+
+ character-entities-legacy@3.0.0: {}
+
chokidar@3.6.0:
dependencies:
anymatch: 3.1.3
@@ -6414,6 +7414,8 @@ snapshots:
colord@2.9.3: {}
+ comma-separated-tokens@2.0.3: {}
+
commander@4.1.1: {}
commander@7.2.0: {}
@@ -6458,6 +7460,10 @@ snapshots:
cookie@1.1.1: {}
+ copy-anything@4.0.5:
+ dependencies:
+ is-what: 5.5.0
+
cross-spawn@7.0.6:
dependencies:
path-key: 3.1.1
@@ -6624,6 +7630,10 @@ snapshots:
detect-node-es@1.1.0: {}
+ devlop@1.1.0:
+ dependencies:
+ dequal: 2.0.3
+
didyoumean@1.2.2: {}
dlv@1.1.3: {}
@@ -6681,6 +7691,8 @@ snapshots:
embla-carousel@8.6.0: {}
+ emoji-regex-xs@1.0.0: {}
+
encodeurl@2.0.0: {}
enhanced-resolve@5.18.4:
@@ -6692,6 +7704,8 @@ snapshots:
entities@6.0.1: {}
+ entities@7.0.0: {}
+
es-define-property@1.0.1: {}
es-errors@1.3.0: {}
@@ -6702,6 +7716,32 @@ snapshots:
dependencies:
es-errors: 1.3.0
+ esbuild@0.21.5:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.21.5
+ '@esbuild/android-arm': 0.21.5
+ '@esbuild/android-arm64': 0.21.5
+ '@esbuild/android-x64': 0.21.5
+ '@esbuild/darwin-arm64': 0.21.5
+ '@esbuild/darwin-x64': 0.21.5
+ '@esbuild/freebsd-arm64': 0.21.5
+ '@esbuild/freebsd-x64': 0.21.5
+ '@esbuild/linux-arm': 0.21.5
+ '@esbuild/linux-arm64': 0.21.5
+ '@esbuild/linux-ia32': 0.21.5
+ '@esbuild/linux-loong64': 0.21.5
+ '@esbuild/linux-mips64el': 0.21.5
+ '@esbuild/linux-ppc64': 0.21.5
+ '@esbuild/linux-riscv64': 0.21.5
+ '@esbuild/linux-s390x': 0.21.5
+ '@esbuild/linux-x64': 0.21.5
+ '@esbuild/netbsd-x64': 0.21.5
+ '@esbuild/openbsd-x64': 0.21.5
+ '@esbuild/sunos-x64': 0.21.5
+ '@esbuild/win32-arm64': 0.21.5
+ '@esbuild/win32-ia32': 0.21.5
+ '@esbuild/win32-x64': 0.21.5
+
esbuild@0.27.2:
optionalDependencies:
'@esbuild/aix-ppc64': 0.27.2
@@ -6996,6 +8036,10 @@ snapshots:
flatted@3.3.3: {}
+ focus-trap@7.8.0:
+ dependencies:
+ tabbable: 6.4.0
+
forwarded@0.2.0: {}
fraction.js@5.3.4: {}
@@ -7097,12 +8141,32 @@ snapshots:
dependencies:
function-bind: 1.1.2
+ hast-util-to-html@9.0.5:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ ccount: 2.0.1
+ comma-separated-tokens: 2.0.3
+ hast-util-whitespace: 3.0.0
+ html-void-elements: 3.0.0
+ mdast-util-to-hast: 13.2.1
+ property-information: 7.1.0
+ space-separated-tokens: 2.0.2
+ stringify-entities: 4.0.4
+ zwitch: 2.0.4
+
+ hast-util-whitespace@3.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+
hermes-estree@0.25.1: {}
hermes-parser@0.25.1:
dependencies:
hermes-estree: 0.25.1
+ hookable@5.5.3: {}
+
html-encoding-sniffer@6.0.0:
dependencies:
'@exodus/bytes': 1.8.0
@@ -7111,6 +8175,8 @@ snapshots:
html-escaper@2.0.2: {}
+ html-void-elements@3.0.0: {}
+
http-errors@2.0.1:
dependencies:
depd: 2.0.0
@@ -7206,6 +8272,8 @@ snapshots:
dependencies:
'@types/estree': 1.0.8
+ is-what@5.5.0: {}
+
isbot@5.1.32: {}
isexe@2.0.0: {}
@@ -7265,8 +8333,6 @@ snapshots:
jsesc@3.0.2: {}
- jsesc@3.1.0: {}
-
json-buffer@3.0.1: {}
json-schema-traverse@0.4.1: {}
@@ -7385,8 +8451,22 @@ snapshots:
dependencies:
semver: 7.7.3
+ mark.js@8.11.1: {}
+
math-intrinsics@1.1.0: {}
+ mdast-util-to-hast@13.2.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ '@ungap/structured-clone': 1.3.0
+ devlop: 1.1.0
+ micromark-util-sanitize-uri: 2.0.1
+ trim-lines: 3.0.1
+ unist-util-position: 5.0.0
+ unist-util-visit: 5.0.0
+ vfile: 6.0.3
+
mdn-data@2.0.14: {}
mdn-data@2.12.2: {}
@@ -7399,6 +8479,23 @@ snapshots:
methods@1.1.2: {}
+ micromark-util-character@2.1.1:
+ dependencies:
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-util-encode@2.0.1: {}
+
+ micromark-util-sanitize-uri@2.0.1:
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-encode: 2.0.1
+ micromark-util-symbol: 2.0.1
+
+ micromark-util-symbol@2.0.1: {}
+
+ micromark-util-types@2.0.2: {}
+
micromatch@4.0.8:
dependencies:
braces: 3.0.3
@@ -7428,6 +8525,10 @@ snapshots:
dependencies:
brace-expansion: 2.0.2
+ minisearch@7.2.0: {}
+
+ mitt@3.0.1: {}
+
morgan@1.10.1:
dependencies:
basic-auth: 2.0.1
@@ -7495,6 +8596,12 @@ snapshots:
dependencies:
wrappy: 1.0.2
+ oniguruma-to-es@3.1.1:
+ dependencies:
+ emoji-regex-xs: 1.0.0
+ regex: 6.1.0
+ regex-recursion: 6.0.2
+
optionator@0.9.4:
dependencies:
deep-is: 0.1.4
@@ -7549,6 +8656,8 @@ snapshots:
pathe@2.0.3: {}
+ perfect-debounce@1.0.0: {}
+
picocolors@1.1.1: {}
picomatch@2.3.1: {}
@@ -7797,6 +8906,8 @@ snapshots:
picocolors: 1.1.1
source-map-js: 1.2.1
+ preact@10.28.2: {}
+
prelude-ls@1.2.1: {}
prettier@3.7.4: {}
@@ -7815,6 +8926,8 @@ snapshots:
object-assign: 4.1.1
react-is: 16.13.1
+ property-information@7.1.0: {}
+
proxy-addr@2.0.7:
dependencies:
forwarded: 0.2.0
@@ -7958,6 +9071,16 @@ snapshots:
indent-string: 4.0.0
strip-indent: 3.0.0
+ regex-recursion@6.0.2:
+ dependencies:
+ regex-utilities: 2.3.0
+
+ regex-utilities@2.3.0: {}
+
+ regex@6.1.0:
+ dependencies:
+ regex-utilities: 2.3.0
+
require-from-string@2.0.2: {}
resolve-from@4.0.0: {}
@@ -7972,6 +9095,8 @@ snapshots:
reusify@1.1.0: {}
+ rfdc@1.4.1: {}
+
rimraf@3.0.2:
dependencies:
glob: 7.2.3
@@ -8052,6 +9177,8 @@ snapshots:
scheduler@0.27.0: {}
+ search-insights@2.17.3: {}
+
semver@6.3.1: {}
semver@7.7.3: {}
@@ -8093,6 +9220,17 @@ snapshots:
shebang-regex@3.0.0: {}
+ shiki@2.5.0:
+ dependencies:
+ '@shikijs/core': 2.5.0
+ '@shikijs/engine-javascript': 2.5.0
+ '@shikijs/engine-oniguruma': 2.5.0
+ '@shikijs/langs': 2.5.0
+ '@shikijs/themes': 2.5.0
+ '@shikijs/types': 2.5.0
+ '@shikijs/vscode-textmate': 10.0.2
+ '@types/hast': 3.0.4
+
side-channel-list@1.0.0:
dependencies:
es-errors: 1.3.0
@@ -8143,6 +9281,10 @@ snapshots:
source-map@0.6.1: {}
+ space-separated-tokens@2.0.2: {}
+
+ speakingurl@14.0.1: {}
+
stable@0.1.8: {}
stackback@0.0.2: {}
@@ -8153,6 +9295,11 @@ snapshots:
string-hash@1.1.3: {}
+ stringify-entities@4.0.4:
+ dependencies:
+ character-entities-html4: 2.1.0
+ character-entities-legacy: 3.0.0
+
strip-ansi@6.0.1:
dependencies:
ansi-regex: 5.0.1
@@ -8181,6 +9328,10 @@ snapshots:
tinyglobby: 0.2.15
ts-interface-checker: 0.1.13
+ superjson@2.2.6:
+ dependencies:
+ copy-anything: 4.0.5
+
supports-color@7.2.0:
dependencies:
has-flag: 4.0.0
@@ -8199,6 +9350,8 @@ snapshots:
symbol-tree@3.2.4: {}
+ tabbable@6.4.0: {}
+
tailwind-merge@3.4.0: {}
tailwindcss@3.4.19:
@@ -8278,6 +9431,8 @@ snapshots:
dependencies:
punycode: 2.3.1
+ trim-lines@3.0.1: {}
+
ts-api-utils@2.4.0(typescript@5.9.3):
dependencies:
typescript: 5.9.3
@@ -8347,6 +9502,29 @@ snapshots:
undici-types@7.16.0: {}
+ unist-util-is@6.0.1:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-position@5.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-stringify-position@4.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-visit-parents@6.0.2:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.1
+
+ unist-util-visit@5.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.1
+ unist-util-visit-parents: 6.0.2
+
unpipe@1.0.0: {}
update-browserslist-db@1.2.3(browserslist@4.28.1):
@@ -8397,6 +9575,16 @@ snapshots:
- '@types/react'
- '@types/react-dom'
+ vfile-message@4.0.3:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-stringify-position: 4.0.0
+
+ vfile@6.0.3:
+ dependencies:
+ '@types/unist': 3.0.3
+ vfile-message: 4.0.3
+
victory-vendor@36.9.2:
dependencies:
'@types/d3-array': 3.2.2
@@ -8446,6 +9634,16 @@ snapshots:
- supports-color
- typescript
+ vite@5.4.21(@types/node@24.10.7)(lightningcss@1.30.2):
+ dependencies:
+ esbuild: 0.21.5
+ postcss: 8.5.6
+ rollup: 4.55.1
+ optionalDependencies:
+ '@types/node': 24.10.7
+ fsevents: 2.3.3
+ lightningcss: 1.30.2
+
vite@7.3.1(@types/node@22.19.5)(jiti@2.6.1)(lightningcss@1.30.2):
dependencies:
esbuild: 0.27.2
@@ -8488,6 +9686,55 @@ snapshots:
jiti: 2.6.1
lightningcss: 1.30.2
+ vitepress@1.6.4(@algolia/client-search@5.46.2)(@types/node@24.10.7)(@types/react@19.2.8)(lightningcss@1.30.2)(postcss@8.5.6)(react-dom@19.2.3(react@19.2.3))(react@18.3.1)(search-insights@2.17.3)(typescript@5.9.3):
+ dependencies:
+ '@docsearch/css': 3.8.2
+ '@docsearch/js': 3.8.2(@algolia/client-search@5.46.2)(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@18.3.1)(search-insights@2.17.3)
+ '@iconify-json/simple-icons': 1.2.66
+ '@shikijs/core': 2.5.0
+ '@shikijs/transformers': 2.5.0
+ '@shikijs/types': 2.5.0
+ '@types/markdown-it': 14.1.2
+ '@vitejs/plugin-vue': 5.2.4(vite@5.4.21(@types/node@24.10.7)(lightningcss@1.30.2))(vue@3.5.26(typescript@5.9.3))
+ '@vue/devtools-api': 7.7.9
+ '@vue/shared': 3.5.26
+ '@vueuse/core': 12.8.2(typescript@5.9.3)
+ '@vueuse/integrations': 12.8.2(focus-trap@7.8.0)(typescript@5.9.3)
+ focus-trap: 7.8.0
+ mark.js: 8.11.1
+ minisearch: 7.2.0
+ shiki: 2.5.0
+ vite: 5.4.21(@types/node@24.10.7)(lightningcss@1.30.2)
+ vue: 3.5.26(typescript@5.9.3)
+ optionalDependencies:
+ postcss: 8.5.6
+ transitivePeerDependencies:
+ - '@algolia/client-search'
+ - '@types/node'
+ - '@types/react'
+ - async-validator
+ - axios
+ - change-case
+ - drauu
+ - fuse.js
+ - idb-keyval
+ - jwt-decode
+ - less
+ - lightningcss
+ - nprogress
+ - qrcode
+ - react
+ - react-dom
+ - sass
+ - sass-embedded
+ - search-insights
+ - sortablejs
+ - stylus
+ - sugarss
+ - terser
+ - typescript
+ - universal-cookie
+
vitest@4.0.17(@types/node@24.10.7)(@vitest/ui@4.0.17)(happy-dom@20.1.0)(jiti@1.21.7)(jsdom@27.4.0)(lightningcss@1.30.2):
dependencies:
'@vitest/expect': 4.0.17
@@ -8528,6 +9775,16 @@ snapshots:
- tsx
- yaml
+ vue@3.5.26(typescript@5.9.3):
+ dependencies:
+ '@vue/compiler-dom': 3.5.26
+ '@vue/compiler-sfc': 3.5.26
+ '@vue/runtime-dom': 3.5.26
+ '@vue/server-renderer': 3.5.26(vue@3.5.26(typescript@5.9.3))
+ '@vue/shared': 3.5.26
+ optionalDependencies:
+ typescript: 5.9.3
+
w3c-xmlserializer@5.0.0:
dependencies:
xml-name-validator: 5.0.0
@@ -8573,3 +9830,5 @@ snapshots:
zod: 4.3.5
zod@4.3.5: {}
+
+ zwitch@2.0.4: {}
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 15989339b..dd8cb5185 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -1,3 +1,4 @@
packages:
- 'packages/*'
- 'examples/*'
+ - 'docs'