From 6796ae1b44b2c52e69fa0f99354622865157d4c5 Mon Sep 17 00:00:00 2001 From: Svyatoslav Kryukov Date: Wed, 30 Oct 2024 18:18:08 +0300 Subject: [PATCH] Upstream docs for v1.3 --- .github/workflows/docs.yml | 41 + .github/workflows/push.yml | 14 +- docs/.gitignore | 3 + docs/.prettierignore | 3 + docs/.vitepress/config.mts | 156 + docs/.vitepress/theme/frameworksTabs.ts | 24 + docs/.vitepress/theme/index.ts | 22 + docs/.vitepress/theme/style.css | 175 ++ .../vitepress-plugin-tabs/ruleBlockTab.ts | 102 + .../tabsMarkdownPlugin.ts | 47 + docs/cookbook/integrating-shadcn-ui.md | 129 + docs/guide/asset-versioning.md | 22 + docs/guide/authentication.md | 5 + docs/guide/authorization.md | 28 + docs/guide/client-side-setup.md | 198 ++ docs/guide/code-splitting.md | 129 + docs/guide/csrf-protection.md | 82 + docs/guide/demo-application.md | 23 + docs/guide/error-handling.md | 154 + docs/guide/events.md | 780 +++++ docs/guide/file-uploads.md | 235 ++ docs/guide/forms.md | 803 +++++ docs/guide/how-it-works.md | 15 + docs/guide/index.md | 23 + docs/guide/links.md | 524 ++++ docs/guide/manual-visits.md | 803 +++++ docs/guide/pages.md | 510 ++++ docs/guide/partial-reloads.md | 242 ++ docs/guide/progress-indicators.md | 296 ++ docs/guide/redirects.md | 41 + docs/guide/remembering-state.md | 237 ++ docs/guide/responses.md | 228 ++ docs/guide/routing.md | 38 + docs/guide/scroll-management.md | 155 + docs/guide/server-side-rendering.md | 291 ++ docs/guide/server-side-setup.md | 188 ++ docs/guide/shared-data.md | 246 ++ docs/guide/testing.md | 70 + docs/guide/the-protocol.md | 147 + docs/guide/title-and-meta.md | 346 +++ docs/guide/validation.md | 229 ++ docs/guide/who-is-it-for.md | 13 + docs/index.md | 20 + docs/package-lock.json | 2715 +++++++++++++++++ docs/package.json | 20 + docs/prettier.config.js | 12 + docs/public/favicon.ico | Bin 0 -> 6518 bytes docs/public/logo.jpg | Bin 0 -> 8834 bytes docs/public/logo.svg | 1 + docs/public/og_image.jpg | Bin 0 -> 133318 bytes docs/public/pingcrm.png | Bin 0 -> 140937 bytes 51 files changed, 10584 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/docs.yml create mode 100644 docs/.gitignore create mode 100644 docs/.prettierignore create mode 100644 docs/.vitepress/config.mts create mode 100644 docs/.vitepress/theme/frameworksTabs.ts create mode 100644 docs/.vitepress/theme/index.ts create mode 100644 docs/.vitepress/theme/style.css create mode 100644 docs/.vitepress/vitepress-plugin-tabs/ruleBlockTab.ts create mode 100644 docs/.vitepress/vitepress-plugin-tabs/tabsMarkdownPlugin.ts create mode 100644 docs/cookbook/integrating-shadcn-ui.md create mode 100644 docs/guide/asset-versioning.md create mode 100644 docs/guide/authentication.md create mode 100644 docs/guide/authorization.md create mode 100644 docs/guide/client-side-setup.md create mode 100644 docs/guide/code-splitting.md create mode 100644 docs/guide/csrf-protection.md create mode 100644 docs/guide/demo-application.md create mode 100644 docs/guide/error-handling.md create mode 100644 docs/guide/events.md create mode 100644 docs/guide/file-uploads.md create mode 100644 docs/guide/forms.md create mode 100644 docs/guide/how-it-works.md create mode 100644 docs/guide/index.md create mode 100644 docs/guide/links.md create mode 100644 docs/guide/manual-visits.md create mode 100644 docs/guide/pages.md create mode 100644 docs/guide/partial-reloads.md create mode 100644 docs/guide/progress-indicators.md create mode 100644 docs/guide/redirects.md create mode 100644 docs/guide/remembering-state.md create mode 100644 docs/guide/responses.md create mode 100644 docs/guide/routing.md create mode 100644 docs/guide/scroll-management.md create mode 100644 docs/guide/server-side-rendering.md create mode 100644 docs/guide/server-side-setup.md create mode 100644 docs/guide/shared-data.md create mode 100644 docs/guide/testing.md create mode 100644 docs/guide/the-protocol.md create mode 100644 docs/guide/title-and-meta.md create mode 100644 docs/guide/validation.md create mode 100644 docs/guide/who-is-it-for.md create mode 100644 docs/index.md create mode 100644 docs/package-lock.json create mode 100644 docs/package.json create mode 100644 docs/prettier.config.js create mode 100644 docs/public/favicon.ico create mode 100644 docs/public/logo.jpg create mode 100644 docs/public/logo.svg create mode 100644 docs/public/og_image.jpg create mode 100644 docs/public/pingcrm.png diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000..35f16c1 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,41 @@ +name: Documentation Checks + +on: + push: + branches: + - main + paths: + - 'docs/**' + - '.github/workflows/docs.yml' + pull_request: + paths: + - 'docs/**' + - '.github/workflows/docs.yml' + +jobs: + check_formatting: + runs-on: ubuntu-latest + name: Check Documentation Formatting + + concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '22' + cache: 'npm' + cache-dependency-path: './docs/package-lock.json' + + - name: Install dependencies + working-directory: ./docs + run: npm ci + + - name: Check formatting + working-directory: ./docs + run: npm run format:check diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index fb3c2ba..de6b6b4 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -1,6 +1,18 @@ name: Testing -on: [push, pull_request] +on: + push: + branches: + - master + paths-ignore: + - 'docs/**' + - '.github/workflows/docs.yml' + - '**.md' + pull_request: + paths-ignore: + - 'docs/**' + - '.github/workflows/docs.yml' + - '**.md' jobs: test: diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 0000000..57a09c3 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,3 @@ +node_modules +.vitepress/dist +.vitepress/cache diff --git a/docs/.prettierignore b/docs/.prettierignore new file mode 100644 index 0000000..7137f7a --- /dev/null +++ b/docs/.prettierignore @@ -0,0 +1,3 @@ +**/node_modules +**/dist +**/cache diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts new file mode 100644 index 0000000..98f22f8 --- /dev/null +++ b/docs/.vitepress/config.mts @@ -0,0 +1,156 @@ +import { defineConfig } from 'vitepress' +import { tabsMarkdownPlugin } from './vitepress-plugin-tabs/tabsMarkdownPlugin' + +const title = 'Inertia Rails' +const description = 'Documentation for Inertia.js Rails adapter' +const site = 'https://inertia-rails.dev' +const image = `${site}/og_image.jpg` + +// https://vitepress.dev/reference/site-config +export default defineConfig({ + title, + description, + + markdown: { + config(md) { + md.use(tabsMarkdownPlugin) + }, + }, + + head: [ + ['link', { rel: 'icon', href: '/favicon.ico', sizes: '32x32' }], + ['link', { rel: 'icon', href: '/icon.svg', type: 'image/svg+xml' }], + + ['meta', { name: 'twitter:card', content: 'summary_large_image' }], + ['meta', { name: 'twitter:site', content: site }], + ['meta', { name: 'twitter:description', value: description }], + ['meta', { name: 'twitter:image', content: image }], + + ['meta', { property: 'og:type', content: 'website' }], + ['meta', { property: 'og:locale', content: 'en_US' }], + ['meta', { property: 'og:site', content: site }], + ['meta', { property: 'og:site_name', content: title }], + ['meta', { property: 'og:image', content: image }], + ['meta', { property: 'og:description', content: description }], + ], + themeConfig: { + // https://vitepress.dev/reference/default-theme-config + nav: [ + { text: 'Home', link: '/' }, + { text: 'Guide', link: '/guide' }, + { text: 'Cookbook', link: '/cookbook/integrating-shadcn-ui' }, + { + text: 'Links', + items: [ + { text: 'Official Inertia.js docs', link: 'https://inertiajs.com' }, + { + text: 'Gems', + items: [ + { + text: 'inertia_rails', + link: 'https://github.com/inertiajs/inertia-rails', + }, + { + text: 'inertia_rails-contrib', + link: 'https://github.com/skryukov/inertia_rails-contrib', + }, + ], + }, + ], + }, + ], + + logo: '/logo.svg', + + sidebar: { + '/guide': [ + { + items: [ + { text: 'Introduction', link: '/guide' }, + { text: 'Demo app', link: '/guide/demo-application' }, + ], + }, + { + text: 'Installation', + items: [ + { text: 'Server-side', link: '/guide/server-side-setup' }, + { text: 'Client-side', link: '/guide/client-side-setup' }, + ], + }, + { + text: 'Core concepts', + items: [ + { text: 'Who is it for', link: '/guide/who-is-it-for' }, + { text: 'How it works', link: '/guide/how-it-works' }, + { text: 'The protocol', link: '/guide/the-protocol' }, + ], + }, + { + text: 'The basics', + items: [ + { text: 'Pages', link: '/guide/pages' }, + { text: 'Responses', link: '/guide/responses' }, + { text: 'Redirects', link: '/guide/redirects' }, + { text: 'Routing', link: '/guide/routing' }, + { text: 'Title & meta', link: '/guide/title-and-meta' }, + { text: 'Links', link: '/guide/links' }, + { text: 'Manual visits', link: '/guide/manual-visits' }, + { text: 'Forms', link: '/guide/forms' }, + { text: 'File uploads', link: '/guide/file-uploads' }, + { text: 'Validation', link: '/guide/validation' }, + { text: 'Shared data', link: '/guide/shared-data' }, + ], + }, + { + text: 'Advanced', + items: [ + { text: 'Events', link: '/guide/events' }, + { text: 'Testing', link: '/guide/testing' }, + { text: 'Partial reloads', link: '/guide/partial-reloads' }, + { text: 'Scroll management', link: '/guide/scroll-management' }, + { text: 'Authentication', link: '/guide/authentication' }, + { text: 'Authorization', link: '/guide/authorization' }, + { text: 'CSRF protection', link: '/guide/csrf-protection' }, + { text: 'Error handling', link: '/guide/error-handling' }, + { text: 'Asset versioning', link: '/guide/asset-versioning' }, + { text: 'Progress indicators', link: '/guide/progress-indicators' }, + { text: 'Remembering state', link: '/guide/remembering-state' }, + { text: 'Code splitting', link: '/guide/code-splitting' }, + { + text: 'Server-side rendering', + link: '/guide/server-side-rendering', + }, + ], + }, + ], + '/cookbook': [ + { + items: [ + { + text: 'Integrations', + items: [ + { text: 'shadcn/ui', link: '/cookbook/integrating-shadcn-ui' }, + ], + }, + ], + }, + ], + }, + + search: { + provider: 'local', + }, + + editLink: { + pattern: + 'https://github.com/inertiajs/inertia-rails/edit/master/docs/:path', + text: 'Edit this page on GitHub', + }, + + socialLinks: [ + { icon: 'github', link: 'https://github.com/inertiajs/inertia-rails' }, + { icon: 'x', link: 'https://x.com/inertiajs' }, + { icon: 'discord', link: 'https://discord.gg/inertiajs' }, + ], + }, +}) diff --git a/docs/.vitepress/theme/frameworksTabs.ts b/docs/.vitepress/theme/frameworksTabs.ts new file mode 100644 index 0000000..626883d --- /dev/null +++ b/docs/.vitepress/theme/frameworksTabs.ts @@ -0,0 +1,24 @@ +const localStorageKey = 'vitepress:tabsSharedState' +const ls = typeof localStorage !== 'undefined' ? localStorage : null + +const getLocalStorageValue = (): Record => { + const rawValue = ls?.getItem(localStorageKey) + if (rawValue) { + try { + return JSON.parse(rawValue) + } catch {} + } + return {} +} + +const setLocalStorageValue = (v: Record) => { + if (!ls) return + ls.setItem(localStorageKey, JSON.stringify(v)) +} + +export const setupFrameworksTabs = () => { + const v = getLocalStorageValue() + if (!v.frameworks) { + setLocalStorageValue({ frameworks: 'React' }) + } +} diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts new file mode 100644 index 0000000..fc1acce --- /dev/null +++ b/docs/.vitepress/theme/index.ts @@ -0,0 +1,22 @@ +// https://vitepress.dev/guide/custom-theme +import type { Theme } from 'vitepress' +import { enhanceAppWithTabs } from 'vitepress-plugin-tabs/client' +import DefaultTheme from 'vitepress/theme' +import { h } from 'vue' +import { setupFrameworksTabs } from './frameworksTabs' +import './style.css' + +export default { + extends: DefaultTheme, + Layout: () => { + return h(DefaultTheme.Layout, null, { + // https://vitepress.dev/guide/extending-default-theme#layout-slots + }) + }, + enhanceApp({ app, router, siteData }) { + enhanceAppWithTabs(app) + }, + setup() { + setupFrameworksTabs() + }, +} satisfies Theme diff --git a/docs/.vitepress/theme/style.css b/docs/.vitepress/theme/style.css new file mode 100644 index 0000000..400f66d --- /dev/null +++ b/docs/.vitepress/theme/style.css @@ -0,0 +1,175 @@ +/** + * Customize default theme styling by overriding CSS variables: + * https://github.com/vuejs/vitepress/blob/main/src/client/theme-default/styles/vars.css + */ + +/** + * Colors + * + * Each colors have exact same color scale system with 3 levels of solid + * colors with different brightness, and 1 soft color. + * + * - `XXX-1`: The most solid color used mainly for colored text. It must + * satisfy the contrast ratio against when used on top of `XXX-soft`. + * + * - `XXX-2`: The color used mainly for hover state of the button. + * + * - `XXX-3`: The color for solid background, such as bg color of the button. + * It must satisfy the contrast ratio with pure white (#ffffff) text on + * top of it. + * + * - `XXX-soft`: The color used for subtle background such as custom container + * or badges. It must satisfy the contrast ratio when putting `XXX-1` colors + * on top of it. + * + * The soft color must be semi transparent alpha channel. This is crucial + * because it allows adding multiple "soft" colors on top of each other + * to create a accent, such as when having inline code block inside + * custom containers. + * + * - `default`: The color used purely for subtle indication without any + * special meanings attched to it such as bg color for menu hover state. + * + * - `brand`: Used for primary brand colors, such as link text, button with + * brand theme, etc. + * + * - `tip`: Used to indicate useful information. The default theme uses the + * brand color for this by default. + * + * - `warning`: Used to indicate warning to the users. Used in custom + * container, badges, etc. + * + * - `danger`: Used to show error, or dangerous message to the users. Used + * in custom container, badges, etc. + * -------------------------------------------------------------------------- */ + +:root { + --vp-c-default-1: var(--vp-c-gray-1); + --vp-c-default-2: var(--vp-c-gray-2); + --vp-c-default-3: var(--vp-c-gray-3); + --vp-c-default-soft: var(--vp-c-gray-soft); + + --vp-c-brand-1: var(--vp-c-purple-1); + --vp-c-brand-2: var(--vp-c-purple-2); + --vp-c-brand-3: var(--vp-c-purple-3); + --vp-c-brand-soft: var(--vp-c-purple-soft); + + --vp-c-tip-1: var(--vp-c-brand-1); + --vp-c-tip-2: var(--vp-c-brand-2); + --vp-c-tip-3: var(--vp-c-brand-3); + --vp-c-tip-soft: var(--vp-c-brand-soft); + + --vp-c-warning-1: var(--vp-c-yellow-1); + --vp-c-warning-2: var(--vp-c-yellow-2); + --vp-c-warning-3: var(--vp-c-yellow-3); + --vp-c-warning-soft: var(--vp-c-yellow-soft); + + --vp-c-danger-1: var(--vp-c-red-1); + --vp-c-danger-2: var(--vp-c-red-2); + --vp-c-danger-3: var(--vp-c-red-3); + --vp-c-danger-soft: var(--vp-c-red-soft); +} + +/** + * Component: Button + * -------------------------------------------------------------------------- */ + +:root { + --vp-button-brand-border: transparent; + --vp-button-brand-text: var(--vp-c-white); + --vp-button-brand-bg: var(--vp-c-brand-3); + --vp-button-brand-hover-border: transparent; + --vp-button-brand-hover-text: var(--vp-c-white); + --vp-button-brand-hover-bg: var(--vp-c-brand-2); + --vp-button-brand-active-border: transparent; + --vp-button-brand-active-text: var(--vp-c-white); + --vp-button-brand-active-bg: var(--vp-c-brand-1); +} + +/** + * Component: Home + * -------------------------------------------------------------------------- */ + +:root { + --vp-home-hero-name-color: transparent; + --vp-home-hero-name-background: -webkit-linear-gradient( + 0deg, + #9553e9, + #6d74ed + ); + + --vp-home-hero-image-background-image: linear-gradient( + -45deg, + #9553e9 50%, + #6d74ed 50% + ); + --vp-home-hero-image-filter: blur(44px); +} + +@media (min-width: 640px) { + :root { + --vp-home-hero-image-filter: blur(56px); + } +} + +@media (min-width: 960px) { + :root { + --vp-home-hero-image-filter: blur(68px); + } +} + +/** + * Component: Custom Block + * -------------------------------------------------------------------------- */ + +:root { + --vp-custom-block-tip-border: transparent; + --vp-custom-block-tip-text: var(--vp-c-text-1); + --vp-custom-block-tip-bg: var(--vp-c-brand-soft); + --vp-custom-block-tip-code-bg: var(--vp-c-brand-soft); +} + +/** + * Component: Algolia + * -------------------------------------------------------------------------- */ + +.DocSearch { + --docsearch-primary-color: var(--vp-c-brand-1) !important; +} + +/** + * Component: Tabs + * -------------------------------------------------------------------------- */ + +.plugin-tabs { + background-color: initial !important; +} + +.plugin-tabs--tab-list { + background-color: var(--vp-code-block-bg); +} + +.plugin-tabs--content { + padding: 0 !important; +} + +.plugin-tabs--content div[class*='language-'] { + background-color: var(--vp-code-block-bg) !important; +} + +.plugin-tabs--content div[class*='language-']:first-child { + border-top-left-radius: 0 !important; + border-top-right-radius: 0 !important; +} + +.plugin-tabs--content:has(> p:first-child) { + border-left: 2px solid var(--vp-c-divider) !important; + border-right: 2px solid var(--vp-c-divider) !important; + border-bottom: 2px solid var(--vp-c-divider) !important; + padding: 8px !important; +} + +.plugin-tabs--content:has(> p:first-child) p { + margin-top: 16px !important; + padding-left: 16px; +} diff --git a/docs/.vitepress/vitepress-plugin-tabs/ruleBlockTab.ts b/docs/.vitepress/vitepress-plugin-tabs/ruleBlockTab.ts new file mode 100644 index 0000000..ea1b618 --- /dev/null +++ b/docs/.vitepress/vitepress-plugin-tabs/ruleBlockTab.ts @@ -0,0 +1,102 @@ +import type { RuleBlock } from 'markdown-it/lib/parser_block' + +const tabMarker = '=' +const tabMarkerCode = tabMarker.charCodeAt(0) +const minTabMarkerLen = 2 + +export const ruleBlockTab: RuleBlock = (state, startLine, endLine, silent) => { + let pos = state.bMarks[startLine] + state.tShift[startLine] + const max = state.eMarks[startLine] + + // @ts-expect-error markdown-it-container uses 'container' + if (state.parentType !== 'container') { + return false + } + + if (pos + minTabMarkerLen > max) { + return false + } + + const marker = state.src.charCodeAt(pos) + if (marker !== tabMarkerCode) { + return false + } + + // scan marker length + const mem = pos + pos = state.skipChars(pos + 1, marker) + const tabMarkerLen = pos - mem + + if (tabMarkerLen < minTabMarkerLen - 1) { + return false + } + + // for validation mode + if (silent) { + return true + } + + // search for the end of the block + let nextLine = startLine + let endStart = mem + let endPos = pos + + for (;;) { + nextLine++ + if (nextLine >= endLine) { + break // unclosed block is autoclosed + } + + endStart = state.bMarks[nextLine] + state.tShift[nextLine] + const max = state.eMarks[nextLine] + + if (endStart < max && state.sCount[nextLine] < state.blkIndent) { + // non-empty line with negative indent should stop the list: + // - ``` + // test + break + } + + const startCharCode = state.src.charCodeAt(endStart) + if (startCharCode !== tabMarkerCode) { + continue + } + + const p = state.skipChars(endStart + 1, marker) + if (p - endStart !== tabMarkerLen) { + continue + } + endPos = p + break + } + + const oldParent = state.parentType + const oldLineMax = state.lineMax + // @ts-expect-error use 'tab' for this rule + state.parentType = 'tab' + // this will prevent lazy continuations from ever going past our end marker + state.lineMax = nextLine + + state.src + .slice(pos, max) + .trimStart() + .split('|') + .forEach((label) => { + const startToken = state.push('tab_open', 'div', 1) + startToken.markup = state.src.slice(mem, pos) + startToken.block = true + startToken.info = label + startToken.map = [startLine, nextLine - 1] + + state.md.block.tokenize(state, startLine + 1, nextLine) + + const endToken = state.push('tab_close', 'div', -1) + endToken.markup = state.src.slice(endStart, endPos) + endToken.block = true + }) + + state.parentType = oldParent + state.lineMax = oldLineMax + state.line = nextLine + return true +} diff --git a/docs/.vitepress/vitepress-plugin-tabs/tabsMarkdownPlugin.ts b/docs/.vitepress/vitepress-plugin-tabs/tabsMarkdownPlugin.ts new file mode 100644 index 0000000..d372397 --- /dev/null +++ b/docs/.vitepress/vitepress-plugin-tabs/tabsMarkdownPlugin.ts @@ -0,0 +1,47 @@ +import type MarkdownIt from 'markdown-it' +import container from 'markdown-it-container' +import type Renderer from 'markdown-it/lib/renderer' +import type Token from 'markdown-it/lib/token' +import { ruleBlockTab } from './ruleBlockTab' + +type Params = { + shareStateKey: string | undefined +} + +const parseTabsParams = (input: string): Params => { + const match = input.match(/key:(\S+)/) + return { + shareStateKey: match?.[1], + } +} + +export const tabsMarkdownPlugin = (md: MarkdownIt) => { + md.use(container, 'tabs', { + render(tokens: Token[], index: number) { + const token = tokens[index] + if (token.nesting === 1) { + const params = parseTabsParams(token.info) + const shareStateKeyProp = params.shareStateKey + ? `sharedStateKey="${md.utils.escapeHtml(params.shareStateKey)}"` + : '' + return `\n` + } else { + return `\n` + } + }, + }) + + md.block.ruler.after('container_tabs', 'tab', ruleBlockTab) + const renderTab: Renderer.RenderRule = (tokens, index) => { + const token = tokens[index] + if (token.nesting === 1) { + const label = token.info + const labelProp = `label="${md.utils.escapeHtml(label)}"` + return `\n` + } else { + return `\n` + } + } + md.renderer.rules['tab_open'] = renderTab + md.renderer.rules['tab_close'] = renderTab +} diff --git a/docs/cookbook/integrating-shadcn-ui.md b/docs/cookbook/integrating-shadcn-ui.md new file mode 100644 index 0000000..bf53e81 --- /dev/null +++ b/docs/cookbook/integrating-shadcn-ui.md @@ -0,0 +1,129 @@ +# Integrating `shadcn/ui` + +This guide demonstrates how to integrate [shadcn/ui](https://ui.shadcn.com) - a collection of reusable React components - with your Inertia Rails application. + +## Getting Started in 5 Minutes + +If you're starting fresh, create a new Rails application with Inertia (or skip this step if you already have one): + +:::tabs key:languages + +== TypeScript + +```bash +rails new -JA shadcn-inertia-rails +cd shadcn-inertia-rails + +rails generate inertia:install --framework=react --typescript --install-vite --install-tailwind --no-interactive +Installing Inertia's Rails adapter +... +``` + +== JavaScript + +```bash +rails new -JA shadcn-inertia-rails +cd shadcn-inertia-rails + +rails generate inertia:install --framework=react --install-vite --install-tailwind --no-interactive +Installing Inertia's Rails adapter +... +``` + +::: + +> [!NOTE] +> You can also run `rails generate inertia:install` to run the installer interactively. +> Need more details on the initial setup? Check out our [server-side setup guide](/guide/server-side-setup.md). + +## Setting Up Path Aliases + +Let's configure our project to work seamlessly with `shadcn/ui`. Choose your path based on whether you're using TypeScript or JavaScript. + +:::tabs key:languages + +== TypeScript + +You'll need to configure two files. First, update your `tsconfig.app.json`: + +```json lines +{ + "compilerOptions": { + // ... + "baseUrl": ".", + "paths": { + "@/*": ["./app/frontend/*"] + } + } + // ... +} +``` + +Then, set up your `tsconfig.json` to match `shadcn/ui`'s requirements (note the `baseUrl` and `paths` properties are different from the `tsconfig.app.json`): + +```json lines +{ + //... + "compilerOptions": { + /* Required for shadcn-ui/ui */ + "baseUrl": "./app/frontend", + "paths": { + "@/*": ["./*"] + } + } +} +``` + +== JavaScript + +Using JavaScript? It's even simpler! Just create a `jsconfig.json`: + +```json +{ + "compilerOptions": { + "baseUrl": "./app/frontend", + "paths": { + "@/*": ["./*"] + } + } +} +``` + +::: + +## Initializing `shadcn/ui` + +Now you can initialize `shadcn/ui` with a single command: + +```bash +npx shadcn@latest init + +✔ Preflight checks. +✔ Verifying framework. Found Vite. +✔ Validating Tailwind CSS. +✔ Validating import alias. +✔ Which style would you like to use? › New York +✔ Which color would you like to use as the base color? › Neutral +✔ Would you like to use CSS variables for theming? … no / yes +✔ Writing components.json. +✔ Checking registry. +✔ Updating tailwind.config.js +✔ Updating app/frontend/entrypoints/application.css +✔ Installing dependencies. +✔ Created 1 file: + - app/frontend/lib/utils.js + +Success! Project initialization completed. +You may now add components. +``` + +You're all set! Want to try it out? Add your first component: + +```shell +npx shadcn@latest add button +``` + +Now you can import and use your new button component from `@/components/ui/button`. Happy coding! + +> [!NOTE] +> Check out the [`shadcn/ui` components gallery](https://ui.shadcn.com/docs/components/accordion) to explore all the beautiful components at your disposal. diff --git a/docs/guide/asset-versioning.md b/docs/guide/asset-versioning.md new file mode 100644 index 0000000..18f48e2 --- /dev/null +++ b/docs/guide/asset-versioning.md @@ -0,0 +1,22 @@ +# Asset versioning + +One common challenge when building single-page apps is refreshing site assets when they've been changed. Thankfully, Inertia makes this easy by optionally tracking the current version of your site assets. When an asset changes, Inertia will automatically make a full page visit instead of a XHR visit on the next request. + +## Configuration + +To enable automatic asset refreshing, you need to tell Inertia the current version of your assets. This can be any arbitrary string (letters, numbers, or a file hash), as long as it changes when your assets have been updated. + +```ruby +InertiaRails.configure do |config| + config.version = ViteRuby.digest # or any other versioning method +end + +# You can also use lazy evaluation +InertiaRails.configure do |config| + config.version = lambda { ViteRuby.digest } +end +``` + +## Cache busting + +Asset refreshing in Inertia works on the assumption that a hard page visit will trigger your assets to reload. However, Inertia doesn't actually do anything to force this. Typically this is done with some form of cache busting. For example, appending a version query parameter to the end of your asset URLs. diff --git a/docs/guide/authentication.md b/docs/guide/authentication.md new file mode 100644 index 0000000..0eafb2c --- /dev/null +++ b/docs/guide/authentication.md @@ -0,0 +1,5 @@ +# Authentication + +One of the benefits of using Inertia is that you don't need a special authentication system such as OAuth to connect to your data provider (API). Also, since your data is provided via your controllers, and housed on the same domain as your JavaScript components, you don't have to worry about setting up CORS. + +Rather, when using Inertia, you can simply use whatever authentication system you like, such as solutions based on Rails' built-in `has_secure_password` method, or gems like [Devise](https://github.com/heartcombo/devise), [Sorcery](https://github.com/Sorcery/sorcery), [Authentication Zero](https://github.com/lazaronixon/authentication-zero), etc. diff --git a/docs/guide/authorization.md b/docs/guide/authorization.md new file mode 100644 index 0000000..07021b0 --- /dev/null +++ b/docs/guide/authorization.md @@ -0,0 +1,28 @@ +# Authorization + +When using Inertia, authorization is best handled server-side in your application's authorization policies. However, you may be wondering how to perform checks against your authorization policies from within your Inertia page components since you won't have access to your framework's server-side helpers. + +The simplest approach to solving this problem is to pass the results of your authorization checks as props to your page components. + +Here's an example of how you might do this in a Rails controller using the [Action Policy](https://github.com/palkan/action_policy) gem: + +```ruby +class UsersController < ApplicationController + def index + render inertia: 'Users/Index', props: { + can: { + create_user: allowed_to?(:create, User) + }, + users: User.all.map do |user| + user.as_json( + only: [:id, :first_name, :last_name, :email] + ).merge( + can: { + edit_user: allowed_to?(:edit, user) + } + ) + end + } + end +end +``` diff --git a/docs/guide/client-side-setup.md b/docs/guide/client-side-setup.md new file mode 100644 index 0000000..ff3bfa9 --- /dev/null +++ b/docs/guide/client-side-setup.md @@ -0,0 +1,198 @@ +# Client-side setup + +Once you have your [server-side framework configured](/guide/server-side-setup.md), you then need to setup your client-side framework. Inertia currently provides support for React, Vue, and Svelte. + +> [!NOTE] +> See [Rails generator](/guide/server-side-setup#rails-generator) for a quick way to setup Inertia in your Rails application. + +## Install dependencies + +First, install the Inertia client-side adapter corresponding to your framework of choice. + +:::tabs key:frameworks +== Vue + +```shell +npm install @inertiajs/vue3 vue +``` + +== React + +```shell +npm install @inertiajs/react react react-dom +``` + +== Svelte 4|Svelte 5 + +```shell +npm install @inertiajs/svelte svelte +``` + +::: + +## Initialize the Inertia app + +Next, update your main JavaScript file to boot your Inertia app. To accomplish this, we'll initialize the client-side framework with the base Inertia component. + +:::tabs key:frameworks +== Vue + +```js +// frontend/entrypoints/inertia.js +import { createApp, h } from 'vue' +import { createInertiaApp } from '@inertiajs/vue3' + +createInertiaApp({ + resolve: (name) => { + const pages = import.meta.glob('../pages/**/*.vue', { eager: true }) + return pages[`../pages/${name}.vue`] + }, + setup({ el, App, props, plugin }) { + createApp({ render: () => h(App, props) }) + .use(plugin) + .mount(el) + }, +}) +``` + +== React + +```js +// frontend/entrypoints/inertia.js +import { createInertiaApp } from '@inertiajs/react' +import { createElement } from 'react' +import { createRoot } from 'react-dom/client' + +createInertiaApp({ + resolve: (name) => { + const pages = import.meta.glob('../pages/**/*.jsx', { eager: true }) + return pages[`../pages/${name}.jsx`] + }, + setup({ el, App, props }) { + const root = createRoot(el) + root.render(createElement(App, props)) + }, +}) +``` + +== Svelte 4 + +```js +// frontend/entrypoints/inertia.js +import { createInertiaApp } from '@inertiajs/svelte' + +createInertiaApp({ + resolve: (name) => { + const pages = import.meta.glob('../pages/**/*.svelte', { eager: true }) + return pages[`../pages/${name}.svelte`] + }, + setup({ el, App, props }) { + new App({ target: el, props }) + }, +}) +``` + +== Svelte 5 + +```js +// frontend/entrypoints/inertia.js +import { createInertiaApp } from '@inertiajs/svelte' +import { mount } from 'svelte' + +createInertiaApp({ + resolve: (name) => { + const pages = import.meta.glob('./Pages/**/*.svelte', { eager: true }) + return pages[`./Pages/${name}.svelte`] + }, + setup({ el, App, props }) { + mount(App, { target: el, props }) + }, +}) +``` + +::: + +The `setup` callback receives everything necessary to initialize the client-side framework, including the root Inertia `App` component. + +# Resolving components + +The `resolve` callback tells Inertia how to load a page component. It receives a page name (string), and returns a page component module. How you implement this callback depends on which bundler (Vite or Webpack) you're using. + +:::tabs key:frameworks +== Vue + +```js +// Vite +// frontend/entrypoints/inertia.js +createInertiaApp({ + resolve: (name) => { + const pages = import.meta.glob('../pages/**/*.vue', { eager: true }) + return pages[`../pages/${name}.vue`] + }, + // ... +}) + +// Webpacker/Shakapacker +// javascript/packs/inertia.js +createInertiaApp({ + resolve: (name) => require(`../pages/${name}`), + // ... +}) +``` + +== React + +```js +// Vite +// frontend/entrypoints/inertia.js +createInertiaApp({ + resolve: (name) => { + const pages = import.meta.glob('../pages/**/*.jsx', { eager: true }) + return pages[`../pages/${name}.jsx`] + }, + //... +}) + +// Webpacker/Shakapacker +// javascript/packs/inertia.js +createInertiaApp({ + resolve: (name) => require(`../pages/${name}`), + //... +}) +``` + +== Svelte 4|Svelte 5 + +```js +// Vite +// frontend/entrypoints/inertia.js +createInertiaApp({ + resolve: (name) => { + const pages = import.meta.glob('../pages/**/*.svelte', { eager: true }) + return pages[`../pages/${name}.svelte`] + }, + //... +}) + +// Webpacker/Shakapacker +// javascript/packs/inertia.js +createInertiaApp({ + resolve: (name) => require(`../pages/${name}.svelte`), + //... +}) +``` + +::: + +By default we recommend eager loading your components, which will result in a single JavaScript bundle. However, if you'd like to lazy-load your components, see our [code splitting](/guide/code-splitting.md) documentation. + +## Defining a root element + +By default, Inertia assumes that your application's root template has a root element with an `id` of `app`. If your application's root element has a different `id`, you can provide it using the `id` property. + +```js +createInertiaApp({ + id: 'my-app', + // ... +}) +``` diff --git a/docs/guide/code-splitting.md b/docs/guide/code-splitting.md new file mode 100644 index 0000000..b62f32f --- /dev/null +++ b/docs/guide/code-splitting.md @@ -0,0 +1,129 @@ +# Code splitting + +Code splitting breaks apart the various pages of your application into smaller bundles, which are then loaded on demand when visiting new pages. This can significantly reduce the size of the initial JavaScript bundle loaded by the browser, improving the time to first render. + +While code splitting is helpful for very large projects, it does require extra requests when visiting new pages. Generally speaking, if you're able to use a single bundle, your app is going to feel snappier. + +To enable code splitting you'll need to tweak the resolve callback in your `createInertiaApp()` configuration, and how you do this is different depending on which bundler you're using. + +## Using Vite + +Vite enables code splitting (or lazy-loading as they call it) by default when using their `import.meta.glob()` function, so simply omit the `{ eager: true }` option, or set it to false, to disable eager loading. + +:::tabs key:frameworks +== Vue + +```js +// frontend/entrypoints/inertia.js +createInertiaApp({ + resolve: (name) => { + const pages = import.meta.glob('../pages/**/*.vue', { eager: true }) // [!code --] + return pages[`../pages/${name}.vue`] // [!code --] + const pages = import.meta.glob('../pages/**/*.vue') // [!code ++] + return pages[`../pages/${name}.vue`]() // [!code ++] + }, + //... +}) +``` + +== React + +```js +// frontend/entrypoints/inertia.js +createInertiaApp({ + resolve: (name) => { + const pages = import.meta.glob('../pages/**/*.jsx', { eager: true }) // [!code --] + return pages[`../pages/${name}.jsx`] // [!code --] + const pages = import.meta.glob('../pages/**/*.jsx') // [!code ++] + return pages[`../pages/${name}.jsx`]() // [!code ++] + }, + //... +}) +``` + +== Svelte 4|Svelte 5 + +```js +// frontend/entrypoints/inertia.js +createInertiaApp({ + resolve: (name) => { + const pages = import.meta.glob('../pages/**/*.svelte', { eager: true }) // [!code --] + return pages[`../pages/${name}.svelte`] // [!code --] + const pages = import.meta.glob('../pages/**/*.svelte') // [!code ++] + return pages[`../pages/${name}.svelte`]() // [!code ++] + }, + //... +}) +``` + +::: + +## Using Webpacker/Shakapacker + +> [!WARNING] +> We recommend using [Vite Ruby](https://vite-ruby.netlify.app) for new projects. + +To use code splitting with Webpack, you will first need to enable [dynamic imports](https://github.com/tc39/proposal-dynamic-import) via a Babel plugin. Let's install it now. + +```shell +npm install @babel/plugin-syntax-dynamic-import +``` + +Next, create a `.babelrc` file in your project with the following configuration: + +```json +{ + "plugins": ["@babel/plugin-syntax-dynamic-import"] +} +``` + +Finally, update the `resolve` callback in your app's initialization code to use `import` instead of `require`. + +:::tabs key:frameworks +== Vue + +```js +// javascript/packs/inertia.js +createInertiaApp({ + resolve: (name) => require(`../pages/${name}`), // [!code ii] + resolve: (name) => import(`../pages/${name}`), // [!code ++] + //... +}) +``` + +== React + +```js +// javascript/packs/inertia.js +createInertiaApp({ + resolve: (name) => require(`../pages/${name}`), // [!code ii] + resolve: (name) => import(`../pages/${name}`), // [!code ++] + //... +}) +``` + +== Svelte 4|Svelte 5 + +```js +// javascript/packs/inertia.js +createInertiaApp({ + resolve: (name) => require(`../pages/${name}.svelte`), // [!code ii] + resolve: (name) => import(`../pages/${name}.svelte`), // [!code ++] + //... +}) +``` + +::: + +You should also consider using cache busting to force browsers to load the latest version of your assets. To accomplish this, add the following configuration to your webpack configuration file. + +```js +// webpack.config.js +module.exports = { + //... + output: { + //... + chunkFilename: 'js/[name].js?id=[chunkhash]', + }, +} +``` diff --git a/docs/guide/csrf-protection.md b/docs/guide/csrf-protection.md new file mode 100644 index 0000000..e882de3 --- /dev/null +++ b/docs/guide/csrf-protection.md @@ -0,0 +1,82 @@ +# CSRF protection + +## Making requests + +Inertia's Rails adapter automatically includes the proper CSRF token when making requests via Inertia or Axios. Therefore, **no additional configuration is required**. + +However, if you need to handle CSRF protection manually, one approach is to include the CSRF token as a prop on every response. You can then use the token when making Inertia requests. + +:::tabs key:frameworks +== Vue + +```js +import { router, usePage } from '@inertiajs/vue3' + +const page = usePage() + +router.post('/users', { + _token: page.props.csrf_token, + name: 'John Doe', + email: 'john.doe@example.com', +}) +``` + +== React + +```js +import { router, usePage } from '@inertiajs/react' + +const props = usePage().props + +router.post('/users', { + _token: props.csrf_token, + name: 'John Doe', + email: 'john.doe@example.com', +}) +``` + +== Svelte 4|Svelte 5 + +```js +import { page, router } from '@inertiajs/svelte' + +router.post('/users', { + _token: $page.props.csrf_token, + name: 'John Doe', + email: 'john.doe@example.com', +}) +``` + +::: + +You can even use Inertia's [shared data](/guide/shared-data.md) functionality to automatically include the `csrf_token` with each response. + +However, a better approach is to use the CSRF functionality already built into [axios](https://github.com/axios/axios) for this. Axios is the HTTP library that Inertia uses under the hood. + +Axios automatically checks for the existence of an `XSRF-TOKEN` cookie. If it's present, it will then include the token in an `X-XSRF-TOKEN` header for any requests it makes. + +The easiest way to implement this is using server-side middleware. Simply include the `XSRF-TOKEN` cookie on each response, and then verify the token using the `X-XSRF-TOKEN` header sent in the requests from axios. (That's basically what `inertia_rails` does). + +## Handling mismatches + +When a CSRF token mismatch occurs, Rails raises the `ActionController::InvalidAuthenticityToken` error. Since that isn't a valid Inertia response, the error is shown in a modal. + +Obviously, this isn't a great user experience. A better way to handle these errors is to return a redirect back to the previous page, along with a flash message that the page expired. This will result in a valid Inertia response with the flash message available as a prop which you can then display to the user. Of course, you'll need to share your [flash messages](/guide/shared-data.md#flash-messages) with Inertia for this to work. + +You may modify your application's exception handler to automatically redirect the user back to the page they were previously on while flashing a message to the session. To accomplish this, you may use the `rescue_from` method in your `ApplicationController`. + +```ruby +class ApplicationController < ActionController::Base + rescue_from ActionController::InvalidAuthenticityToken, with: :inertia_page_expired_error + + inertia_share flash: -> { flash.to_hash } + + private + + def inertia_page_expired_error + redirect_back_or_to('/', allow_other_host: false, notice: "The page expired, please try again.") + end +end +``` + +The end result is a much better experience for your users. Instead of seeing the error modal, the user is instead presented with a message that the page "expired" and are asked to try again. diff --git a/docs/guide/demo-application.md b/docs/guide/demo-application.md new file mode 100644 index 0000000..cf9edde --- /dev/null +++ b/docs/guide/demo-application.md @@ -0,0 +1,23 @@ +# Demo application + +We've setup a demo app for Inertia.js called [Ping CRM](https://demo.inertiajs.com/login). This application is built using Laravel and Vue. You can find the source code on [GitHub](https://github.com/inertiajs/pingcrm). + +> [!NOTE] +> The Ping CRM demo is hosted on Heroku and the database is reset every hour. Please be respectful when editing data. + +[![Ping CRM demo](/pingcrm.png)](https://demo.inertiajs.com/login) + +In addition to the Vue version of Ping CRM, we also maintain a Svelte version of the application, which you can find [on GitHub](https://github.com/inertiajs/pingcrm-svelte). + +## Third party + +Beyond our official demo app, Ping CRM has also been translated into numerous different languages and frameworks. + +- [Ruby on Rails/Vue](https://github.com/ledermann/pingcrm) by Georg Ledermann +- [Ruby on Rails/Vue SSR/Vite](https://github.com/ElMassimo/pingcrm-vite) by Máximo Mussini +- [Laravel/React](https://github.com/Landish/pingcrm-react) by Lado Lomidze +- [Laravel/Svelte](https://github.com/zgabievi/pingcrm-svelte) by Zura G]abievi +- [Laravel/Mithril.js](https://github.com/tbreuss/pingcrm-mithril) by Thomas Breuss +- [Yii 2/Vue](https://github.com/tbreuss/pingcrm-yii2) by Thomas Breuss +- [Symfony/Vue](https://github.com/aleksblendwerk/pingcrm-symfony) by Aleks Seltenreich +- [Clojure/React](https://github.com/prestancedesign/pingcrm-clojure) by Michaël Salihi diff --git a/docs/guide/error-handling.md b/docs/guide/error-handling.md new file mode 100644 index 0000000..04faffc --- /dev/null +++ b/docs/guide/error-handling.md @@ -0,0 +1,154 @@ +# Error handling + +## Development + +One of the advantages to working with a robust server-side framework is the built-in exception handling you get for free. The challenge is, if you're making an XHR request (which Inertia does) and you hit a server-side error, you're typically left digging through the network tab in your browser's devtools to diagnose the problem. + +Inertia solves this issue by showing all non-Inertia responses in a modal. This means you get the same beautiful error-reporting you're accustomed to, even though you've made that request over XHR. + +## Production + +In production you will want to return a proper Inertia error response instead of relying on the modal-driven error reporting that is present during development. To accomplish this, you'll need to update your framework's default exception handler to return a custom error page. + +When building Rails applications, you can accomplish this by using the `rescue_from` method in your `ApplicationController`. + +```ruby +class ApplicationController < ActionController::Base + rescue_from StandardError, with: :inertia_error_page + + private + + def inertia_error_page(exception) + raise exception if Rails.env.local? + + status = ActionDispatch::ExceptionWrapper.new(nil, exception).status_code + + render inertia: 'Error', props: { status: }, status: + end +end +``` + +You may have noticed we're returning an `Error` page component in the example above. You'll need to actually create this component, which will serve as the generic error page for your application. Here's an example error component you can use as a starting point. + +:::tabs key:frameworks +== Vue + +```vue + + + +``` + +== React + +```jsx +export default function ErrorPage({ status }) { + const title = + { + 503: 'Service Unavailable', + 500: 'Server Error', + 404: 'Page Not Found', + 403: 'Forbidden', + }[status] || 'Unexpected error' + + const description = { + 503: 'Sorry, we are doing some maintenance. Please check back soon.', + 500: 'Whoops, something went wrong on our servers.', + 404: 'Sorry, the page you are looking for could not be found.', + 403: 'Sorry, you are forbidden from accessing this page.', + }[status] + + return ( +
+

+ {status}: {title} +

+
{description}
+
+ ) +} +``` + +== Svelte 4 + +```svelte + + +
+

{status}: {title}

+
{description}
+
+``` + +== Svelte 5 + +```svelte + + +
+

{titles[status]}

+
{description[status]}
+
+``` + +::: diff --git a/docs/guide/events.md b/docs/guide/events.md new file mode 100644 index 0000000..8ce9f96 --- /dev/null +++ b/docs/guide/events.md @@ -0,0 +1,780 @@ +# Events + +Inertia provides an event system that allows you to "hook into" the various lifecycle events of the library. + +## Registering listeners + +To register an event listener, use the `router.on()` method. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.on('start', (event) => { + console.log(`Starting a visit to ${event.detail.visit.url}`) +}) +``` + +== React + +```jsx +import { router } from '@inertiajs/react' + +router.on('start', (event) => { + console.log(`Starting a visit to ${event.detail.visit.url}`) +}) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.on('start', (event) => { + console.log(`Starting a visit to ${event.detail.visit.url}`) +}) +``` + +::: + +Under the hood, Inertia uses native browser events, so you can also interact with Inertia events using the typical event methods you may already be familiar with - just be sure to prepend `inertia:` to the event name. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +document.addEventListener('inertia:start', (event) => { + console.log(`Starting a visit to ${event.detail.visit.url}`) +}) +``` + +== React + +```jsx +import { router } from '@inertiajs/react' + +document.addEventListener('inertia:start', (event) => { + console.log(`Starting a visit to ${event.detail.visit.url}`) +}) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +document.addEventListener('inertia:start', (event) => { + console.log(`Starting a visit to ${event.detail.visit.url}`) +}) +``` + +::: + +## Removing listeners + +When you register an event listener, Inertia automatically returns a callback that can be invoked to remove the event listener. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +let removeStartEventListener = router.on('start', (event) => { + console.log(`Starting a visit to ${event.detail.visit.url}`) +}) + +// Remove the listener... +removeStartEventListener() +``` + +== React + +```jsx +import { router } from '@inertiajs/react' + +let removeStartEventListener = router.on('start', (event) => { + console.log(`Starting a visit to ${event.detail.visit.url}`) +}) + +// Remove the listener... +removeStartEventListener() +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +let removeStartEventListener = router.on('start', (event) => { + console.log(`Starting a visit to ${event.detail.visit.url}`) +}) + +// Remove the listener... +removeStartEventListener() +``` + +::: + +Combined with hooks, you can automatically remove the event listener when components unmount. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' +import { onUnmounted } from 'vue' + +onUnmounted( + router.on('start', (event) => { + console.log(`Starting a visit to ${event.detail.visit.url}`) + }), +) +``` + +== React + +```jsx +import { router } from '@inertiajs/react' +import { useEffect } from 'react' + +useEffect(() => { + return router.on('start', (event) => { + console.log(`Starting a visit to ${event.detail.visit.url}`) + }) +}, []) +``` + +== Svelte 4 + +```js +import { router } from '@inertiajs/svelte' +import { onMount } from 'svelte' + +onMount(() => { + return router.on('start', (event) => { + console.log(`Starting a visit to ${event.detail.visit.url}`) + }) +}) +``` + +== Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +$effect(() => { + return router.on('start', (event) => { + console.log(`Starting a visit to ${event.detail.visit.url}`) + }) +}) +``` + +::: + +Alternatively, if you're using native browser events, you can remove the event listener using `removeEventListener()`. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +let startEventListener = (event) => { + console.log(`Starting a visit to ${event.detail.visit.url}`) +} + +document.addEventListener('inertia:start', startEventListener) + +// Remove the listener... +document.removeEventListener('inertia:start', startEventListener) +``` + +== React + +```jsx +import { router } from '@inertiajs/react' + +let startEventListener = (event) => { + console.log(`Starting a visit to ${event.detail.visit.url}`) +} + +document.addEventListener('inertia:start', startEventListener) + +// Remove the listener... +document.removeEventListener('inertia:start', startEventListener) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +let startEventListener = (event) => { + console.log(`Starting a visit to ${event.detail.visit.url}`) +} + +document.addEventListener('inertia:start', startEventListener) + +// Remove the listener... +document.removeEventListener('inertia:start', startEventListener) +``` + +::: + +## Cancelling events + +Some events, such as `before`, `invalid`, and `error`, support cancellation, allowing you to prevent Inertia's default behavior. Just like native events, the event will be cancelled if only one event listener calls `event.preventDefault()`. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.on('before', (event) => { + if (!confirm('Are you sure you want to navigate away?')) { + event.preventDefault() + } +}) +``` + +== React + +```jsx +import { router } from '@inertiajs/react' + +router.on('before', (event) => { + if (!confirm('Are you sure you want to navigate away?')) { + event.preventDefault() + } +}) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.on('before', (event) => { + if (!confirm('Are you sure you want to navigate away?')) { + event.preventDefault() + } +}) +``` + +::: + +For convenience, if you register your event listener using `router.on()`, you can cancel the event by returning `false` from the listener. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.on('before', (event) => { + return confirm('Are you sure you want to navigate away?') +}) +``` + +== React + +```jsx +import { router } from '@inertiajs/react' + +router.on('before', (event) => { + return confirm('Are you sure you want to navigate away?') +}) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.on('before', (event) => { + return confirm('Are you sure you want to navigate away?') +}) +``` + +::: + +Note, browsers do not allow cancelling the native `popstate` event, so preventing forward and back history visits while using Inertia.js is not possible. + +## Before + +The `before` event fires when a request is about to be made to the server. This is useful for intercepting visits. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.on('before', (event) => { + console.log(`About to make a visit to ${event.detail.visit.url}`) +}) +``` + +== React + +```jsx +import { router } from '@inertiajs/react' + +router.on('before', (event) => { + console.log(`About to make a visit to ${event.detail.visit.url}`) +}) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.on('before', (event) => { + console.log(`About to make a visit to ${event.detail.visit.url}`) +}) +``` + +::: + +The primary purpose of this event is to allow you to prevent a visit from happening. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.on('before', (event) => { + return confirm('Are you sure you want to navigate away?') +}) +``` + +== React + +```jsx +import { router } from '@inertiajs/react' + +router.on('before', (event) => { + return confirm('Are you sure you want to navigate away?') +}) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.on('before', (event) => { + return confirm('Are you sure you want to navigate away?') +}) +``` + +::: + +## Start + +The `start` event fires when a request to the server has started. This is useful for displaying loading indicators. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.on('start', (event) => { + console.log(`Starting a visit to ${event.detail.visit.url}`) +}) +``` + +== React + +```jsx +import { router } from '@inertiajs/react' + +router.on('start', (event) => { + console.log(`Starting a visit to ${event.detail.visit.url}`) +}) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.on('start', (event) => { + console.log(`Starting a visit to ${event.detail.visit.url}`) +}) +``` + +::: + +The `start` event is not cancelable. + +## Progress + +The `progress` event fires as progress increments during file uploads. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.on('progress', (event) => { + this.form.progress = event.detail.progress.percentage +}) +``` + +== React + +```jsx +import { router } from '@inertiajs/react' + +router.on('progress', (event) => { + this.form.progress = event.detail.progress.percentage +}) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.on('progress', (event) => { + this.form.progress = event.detail.progress.percentage +}) +``` + +::: + +The `progress` event is not cancelable. + +## Success + +The `success` event fires on successful page visits, unless validation errors are present. However, this does not include history visits. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.on('success', (event) => { + console.log(`Successfully made a visit to ${event.detail.page.url}`) +}) +``` + +== React + +```jsx +import { router } from '@inertiajs/react' + +router.on('success', (event) => { + console.log(`Successfully made a visit to ${event.detail.page.url}`) +}) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.on('success', (event) => { + console.log(`Successfully made a visit to ${event.detail.page.url}`) +}) +``` + +::: + +The `success` event is not cancelable. + +## Error + +The `error` event fires when validation errors are present on "successful" page visits. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.on('error', (errors) => { + console.log(errors) +}) +``` + +== React + +```jsx +import { router } from '@inertiajs/react' + +router.on('error', (errors) => { + console.log(errors) +}) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.on('error', (errors) => { + console.log(errors) +}) +``` + +::: + +The `error` event is not cancelable. + +## Invalid + +The invalid event fires when a non-Inertia response is received from the server, such as an HTML or vanilla JSON response. A valid Inertia response is a response that has the `X-Inertia` header set to `true` with a json payload containing [the page object](/guide/the-protocol.md#the-page-object). + +This event is fired for all response types, including `200`, `400`, and `500` response codes. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.on('invalid', (event) => { + console.log(`An invalid Inertia response was received.`) + console.log(event.detail.response) +}) +``` + +== React + +```jsx +import { router } from '@inertiajs/react' + +router.on('invalid', (event) => { + console.log(`An invalid Inertia response was received.`) + console.log(event.detail.response) +}) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.on('invalid', (event) => { + console.log(`An invalid Inertia response was received.`) + console.log(event.detail.response) +}) +``` + +::: + +You may cancel the `invalid` event to prevent Inertia from showing the non-Inertia response modal. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.on('invalid', (event) => { + event.preventDefault() + + // Handle the invalid response yourself... +}) +``` + +== React + +```jsx +import { router } from '@inertiajs/react' + +router.on('invalid', (event) => { + event.preventDefault() + + // Handle the invalid response yourself... +}) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.on('invalid', (event) => { + event.preventDefault() + + // Handle the invalid response yourself... +}) +``` + +::: + +## Exception + +The `exception` event fires on unexpected XHR errors such as network interruptions. In addition, this event fires for errors generated when resolving page components. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.on('exception', (event) => { + console.log(`An unexpected error occurred during an Inertia visit.`) + console.log(event.detail.error) +}) +``` + +== React + +```jsx +import { router } from '@inertiajs/react' + +router.on('exception', (event) => { + console.log(`An unexpected error occurred during an Inertia visit.`) + console.log(event.detail.error) +}) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.on('exception', (event) => { + console.log(`An unexpected error occurred during an Inertia visit.`) + console.log(event.detail.error) +}) +``` + +::: + +You may cancel the `exception` event to prevent the error from being thrown. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.on('exception', (event) => { + event.preventDefault() + // Handle the error yourself +}) +``` + +== React + +```jsx +import { router } from '@inertiajs/react' + +router.on('exception', (event) => { + event.preventDefault() + // Handle the error yourself +}) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.on('exception', (event) => { + event.preventDefault() + // Handle the error yourself +}) +``` + +::: + +This event will _not_ fire for XHR requests that receive `400` and `500` level responses or for non-Inertia responses, as these situations are handled in other ways by Inertia. Please consult the [error handling](/guide/error-handling.md) documentation for more information. + +## Finish + +The `finish` event fires after an XHR request has completed for both "successful" and "unsuccessful" responses. This event is useful for hiding loading indicators. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.on('finish', (event) => { + NProgress.done() +}) +``` + +== React + +```jsx +import { router } from '@inertiajs/react' + +router.on('finish', (event) => { + NProgress.done() +}) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.on('finish', (event) => { + NProgress.done() +}) +``` + +::: + +The `finish` event is not cancelable. + +## Navigate + +The `navigate` event fires on successful page visits, as well as when navigating through history. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.on('navigate', (event) => { + console.log(`Navigated to ${event.detail.page.url}`) +}) +``` + +== React + +```jsx +import { router } from '@inertiajs/react' + +router.on('navigate', (event) => { + console.log(`Navigated to ${event.detail.page.url}`) +}) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.on('navigate', (event) => { + console.log(`Navigated to ${event.detail.page.url}`) +}) +``` + +::: + +The `navigate` event is not cancelable. + +## Event callbacks + +In addition to the global events described throughout this page, Inertia also provides a number of [event callbacks](/guide/manual-visits.md#event-callbacks) that fire when manually making Inertia visits. diff --git a/docs/guide/file-uploads.md b/docs/guide/file-uploads.md new file mode 100644 index 0000000..5046a48 --- /dev/null +++ b/docs/guide/file-uploads.md @@ -0,0 +1,235 @@ +# File uploads + +## FormData conversion + +When making Inertia requests that include files (even nested files), Inertia will automatically convert the request data into a `FormData` object. This conversion is necessary in order to submit a `multipart/form-data` request via XHR. + +If you would like the request to always use a `FormData` object regardless of whether a file is present in the data, you may provide the `forceFormData` option when making the request. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.post('/users', data, { + forceFormData: true, +}) +``` + +== React + +```jsx +import { router } from '@inertiajs/react' + +router.post('/users', data, { + forceFormData: true, +}) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.post('/users', data, { + forceFormData: true, +}) +``` + +::: + +You can learn more about the `FormData` interface via its [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/API/FormData). + +> [!WARNING] +> Prior to version 0.8.0, Inertia did not automatically convert requests to `FormData`. If you're using an Inertia release prior to this version, you will need to manually perform this conversion. + +## File upload example + +Let's examine a complete file upload example using Inertia. This example includes both a `name` text input and an `avatar` file input. + +:::tabs key:frameworks +== Vue + +```vue + + + +``` + +== React + +```jsx +import { useForm } from '@inertiajs/react' + +const { data, setData, post, progress } = useForm({ + name: null, + avatar: null, +}) + +function submit(e) { + e.preventDefault() + post('/users') +} + +return ( +
+ setData('name', e.target.value)} + /> + setData('avatar', e.target.files[0])} /> + {progress && ( + + {progress.percentage}% + + )} + +
+) +``` + +== Svelte 4 + +```svelte + + +
+ + ($form.avatar = e.target.files[0])} /> + {#if $form.progress} + + {$form.progress.percentage}% + + {/if} + +
+``` + +== Svelte 5 + +```svelte + + +
+ + ($form.avatar = e.target.files[0])} /> + {#if $form.progress} + + {$form.progress.percentage}% + + {/if} + +
+``` + +::: + +This example uses the [Inertia form helper](/guide/forms.md) for convenience, since the form helper provides easy access to the current upload progress. However, you are free to submit your forms using [manual Inertia visits](/guide/manual-visits.md) as well. + +## Multipart limitations + +Uploading files using a `multipart/form-data` request is not natively supported in some server-side frameworks when using the `PUT`, `PATCH`, or `DELETE` HTTP methods. The simplest workaround for this limitation is to simply upload files using a `POST` request instead. + +However, some frameworks, such as Laravel and Rails, support form method spoofing, which allows you to upload the files using `POST`, but have the framework handle the request as a `PUT` or `PATCH` request. This is done by including a `_method` attribute or a `X-HTTP-METHOD-OVERRIDE` header in the request. + +> [!NOTE] +> For more info see [`Rack::MethodOverride`](https://github.com/rack/rack/blob/main/lib/rack/method_override.rb). + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.post(`/users/${user.id}`, { + _method: 'put', + avatar: form.avatar, +}) + +// or + +form.post(`/users/${user.id}`, { + headers: { 'X-HTTP-METHOD-OVERRIDE': 'put' }, +}) +``` + +== React + +```js +import { router } from '@inertiajs/react' + +router.post(`/users/${user.id}`, { + _method: 'put', + avatar: form.avatar, +}) + +// or + +form.post(`/users/${user.id}`, { + headers: { 'X-HTTP-METHOD-OVERRIDE': 'put' }, +}) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.post(`/users/${user.id}`, { + _method: 'put', + avatar: form.avatar, +}) + +// or + +form.post(`/users/${user.id}`, { + headers: { 'X-HTTP-METHOD-OVERRIDE': 'put' }, +}) +``` + +::: diff --git a/docs/guide/forms.md b/docs/guide/forms.md new file mode 100644 index 0000000..0c25f01 --- /dev/null +++ b/docs/guide/forms.md @@ -0,0 +1,803 @@ +# Forms + +## Submitting forms + +While it's possible to make classic HTML form submissions with Inertia, it's not recommended since they cause full-page reloads. Instead, it's better to intercept form submissions and then make the [request using Inertia](/guide/manual-visits.md). + +:::tabs key:frameworks +== Vue + +```vue + + + +``` + +== React + +```jsx +import { useState } from 'react' +import { router } from '@inertiajs/react' + +export default function Edit() { + const [values, setValues] = useState({ + first_name: '', + last_name: '', + email: '', + }) + + function handleChange(e) { + const key = e.target.id + const value = e.target.value + setValues((values) => ({ + ...values, + [key]: value, + })) + } + + function handleSubmit(e) { + e.preventDefault() + router.post('/users', values) + } + + return ( +
+ + + + + + + + + + +
+ ) +} +``` + +== Svelte 4 + +```svelte + + +
+ + + + + + + + + + +
+``` + +== Svelte 5 + +```svelte + + +
+ + + + + + + + + + +
+``` + +::: + +As you may have noticed in the example above, when using Inertia, you don't typically need to inspect form responses client-side like you would when making XHR / fetch requests manually. + +Instead, your server-side route / controller typically issues a [redirect](/guide/redirects.md) response. And, Of course, there is nothing stopping you from redirecting the user right back to the page they were previously on. Using this approach, handling Inertia form submissions feels very similar to handling classic HTML form submissions. + +```ruby +class UsersController < ApplicationController + def create + user = User.new(user_params) + + if user.save + redirect_to users_url + else + redirect_to new_user_url, inertia: { errors: user.errors } + end + end + + private + + def user_params + params.require(:user).permit(:name, :email) + end +end +``` + +## Server-side validation + +Handling server-side validation errors in Inertia works a little different than handling errors from manual XHR / fetch requests. When making XHR / fetch requests, you typically inspect the response for a `422` status code and manually update the form's error state. + +However, when using Inertia, a `422` response is never returned by your server. Instead, as we saw in the example above, your routes / controllers will typically return a redirect response - much like a classic, full-page form submission. + +For a full discussion on handling and displaying [validation](/guide/validation.md) errors with Inertia, please consult the validation documentation. + +## Form helper + +Since working with forms is so common, Inertia includes a form helper designed to help reduce the amount of boilerplate code needed for handling typical form submissions. + +:::tabs key:frameworks +== Vue + +```vue + + + +``` + +== React + +```jsx +import { useForm } from '@inertiajs/react' + +const { data, setData, post, processing, errors } = useForm({ + email: '', + password: '', + remember: false, +}) + +function submit(e) { + e.preventDefault() + post('/login') +} + +return ( +
+ setData('email', e.target.value)} + /> + {errors.email &&
{errors.email}
} + setData('password', e.target.value)} + /> + {errors.password &&
{errors.password}
} + setData('remember', e.target.checked)} + />{' '} + Remember Me + +
+) +``` + +== Svelte 4|Svelte 5 + +```svelte + + +
+ + {#if $form.errors.email} +
{$form.errors.email}
+ {/if} + + {#if $form.errors.password} +
{$form.errors.password}
+ {/if} + Remember Me + +
+``` + +== Svelte 5 + +```svelte + + +
+ + {#if $form.errors.email} +
{$form.errors.email}
+ {/if} + + {#if $form.errors.password} +
{$form.errors.password}
+ {/if} + Remember Me + +
+``` + +::: + +To submit the form, you may use the `get`, `post`, `put`, `patch` and `delete` methods. + +:::tabs key:frameworks +== Vue + +```js +form.submit(method, url, options) +form.get(url, options) +form.post(url, options) +form.put(url, options) +form.patch(url, options) +form.delete(url, options) +``` + +== React + +```jsx +const { submit, get, post, put, patch, delete: destroy } = useForm({ ... }) + +submit(method, url, options) +get(url, options) +post(url, options) +put(url, options) +patch(url, options) +destroy(url, options) +``` + +== Svelte 4|Svelte 5 + +```js +$form.submit(method, url, options) +$form.get(url, options) +$form.post(url, options) +$form.put(url, options) +$form.patch(url, options) +$form.delete(url, options) +``` + +::: + +The submit methods support all of the typical [visit options](/guide/manual-visits.md), such as `preserveState`, `preserveScroll`, and event callbacks, which can be helpful for performing tasks on successful form submissions. For example, you might use the `onSuccess` callback to reset inputs to their original state. + +:::tabs key:frameworks +== Vue + +```js +form.post('/profile', { + preserveScroll: true, + onSuccess: () => form.reset('password'), +}) +``` + +== React + +```jsx +const { post, reset } = useForm({ ... }) + +post('/profile', { +preserveScroll: true, +onSuccess: () => reset('password'), +}) +``` + +== Svelte 4|Svelte 5 + +```js +$form.post('/profile', { + preserveScroll: true, + onSuccess: () => $form.reset('password'), +}) +``` + +::: + +If you need to modify the form data before it's sent to the server, you can do so via the `transform()` method. + +:::tabs key:frameworks +== Vue + +```js +form + .transform((data) => ({ + ...data, + remember: data.remember ? 'on' : '', + })) + .post('/login') +``` + +== React + +```jsx +const { transform } = useForm({ ... }) + +transform((data) => ({ + ...data, + remember: data.remember ? 'on' : '', +})) +``` + +== Svelte 4|Svelte 5 + +```js +$form + .transform((data) => ({ + ...data, + remember: data.remember ? 'on' : '', + })) + .post('/login') +``` + +::: + +You can use the `processing` property to track if a form is currently being submitted. This can be helpful for preventing double form submissions by disabling the submit button. + +:::tabs key:frameworks +== Vue + +```vue + +``` + +== React + +```jsx +const { processing } = useForm({ ... }) + + +``` + +== Svelte 4|Svelte 5 + +```svelte + +``` + +::: + +If your form is uploading files, the current progress event is available via the `progress` property, allowing you to easily display the upload progress. + +:::tabs key:frameworks +== Vue + +```vue + + {{ form.progress.percentage }}% + +``` + +== React + +```jsx +const { progress } = useForm({ ... }) + +{progress && ( + + {progress.percentage}% + +)} +``` + +== Svelte 4|Svelte 5 + +```svelte +{#if $form.progress} + + {$form.progress.percentage}% + +{/if} +``` + +::: + +If there are form validation errors, they are available via the `errors` property. When building Rails powered Inertia applications, form errors will automatically be populated when your application throws instances of `ActiveRecord::RecordInvalid`, such as when using `#save!`. + +:::tabs key:frameworks +== Vue + +```vue +
{{ form.errors.email }}
+``` + +== React + +```jsx +const { errors } = useForm({ ... }) + +{errors.email &&
{errors.email}
} +``` + +== Svelte 4|Svelte 5 + +```svelte +{#if $form.errors.email} +
{$form.errors.email}
+{/if} +``` + +::: + +> [!NOTE] +> For a more thorough discussion of form validation and errors, please consult the [validation documentation](/guide/validation.md). + +To determine if a form has any errors, you may use the `hasErrors` property. To clear form errors, use the `clearErrors()` method. + +:::tabs key:frameworks +== Vue + +```js +// Clear all errors... +form.clearErrors() + +// Clear errors for specific fields... +form.clearErrors('field', 'anotherfield') +``` + +== React + +```jsx +const { clearErrors } = useForm({ ... }) + +// Clear all errors... +clearErrors() + +// Clear errors for specific fields... +clearErrors('field', 'anotherfield') +``` + +== Svelte 4|Svelte 5 + +```js +// Clear all errors... +$form.clearErrors() + +// Clear errors for specific fields... +$form.clearErrors('field', 'anotherfield') +``` + +::: + +If you're using a client-side input validation libraries or do client-side validation manually, you can set your own errors on the form using the `setErrors()` method. + +:::tabs key:frameworks +== Vue + +```js +// Set a single error... +form.setError('field', 'Your error message.') + +// Set multiple errors at once... +form.setError({ + foo: 'Your error message for the foo field.', + bar: 'Some other error for the bar field.', +}) +``` + +== React + +```jsx +const { setError } = useForm({ ... }) + +// Set a single error... +setError('field', 'Your error message.'); + +// Set multiple errors at once... +setError({ + foo: 'Your error message for the foo field.', + bar: 'Some other error for the bar field.' +}); +``` + +== Svelte 4|Svelte 5 + +```js +// Set a single error +$form.setError('field', 'Your error message.') + +// Set multiple errors at once +$form.setError({ + foo: 'Your error message for the foo field.', + bar: 'Some other error for the bar field.', +}) +``` + +::: + +> [!NOTE] +> Unlike an actual form submission, the page's props remain unchanged when manually setting errors on a form instance. + +When a form has been successfully submitted, the `wasSuccessful` property will be `true`. In addition to this, forms have a `recentlySuccessful` property, which will be set to `true` for two seconds after a successful form submission. This property can be utilized to show temporary success messages. + +To reset the form's values back to their default values, you can use the `reset()` method. + +:::tabs key:frameworks +== Vue + +```js +// Reset the form... +form.reset() + +// Reset specific fields... +form.reset('field', 'anotherfield') +``` + +== React + +```jsx +const { reset } = useForm({ ... }) + +// Reset the form... +reset() + +// Reset specific fields... +reset('field', 'anotherfield') +``` + +== Svelte 4|Svelte 5 + +```js +// Reset the form... +$form.reset() + +// Reset specific fields... +$form.reset('field', 'anotherfield') +``` + +::: + +If your form's default values become outdated, you can use the `defaults()` method to update them. Then, the form will be reset to the correct values the next time the `reset()` method is invoked. + +:::tabs key:frameworks +== Vue + +```js +// Set the form's current values as the new defaults... +form.defaults() + +// Update the default value of a single field... +form.defaults('email', 'updated-default@example.com') + +// Update the default value of multiple fields... +form.defaults({ + name: 'Updated Example', + email: 'updated-default@example.com', +}) +``` + +== React + +```jsx +const { setDefaults } = useForm({ ... }) + +// Set the form's current values as the new defaults... +setDefaults() + +// Update the default value of a single field... +setDefaults('email', 'updated-default@example.com') + +// Update the default value of multiple fields... +setDefaults({ + name: 'Updated Example', + email: 'updated-default@example.com', +}) +``` + +== Svelte 4|Svelte 5 + +```js +// Set the form's current values as the new defaults... +$form.defaults() + +// Update the default value of a single field... +$form.defaults('email', 'updated-default@example.com') + +// Change the default value of multiple fields... +$form.defaults({ + name: 'Updated Example', + email: 'updated-default@example.com', +}) +``` + +::: + +To determine if a form has any changes, you may use the `isDirty` property. + +:::tabs key:frameworks +== Vue + +```vue +
There are unsaved form changes.
+``` + +== React + +```jsx +const { isDirty } = useForm({ ... }) + +{isDirty &&
There are unsaved form changes.
} +``` + +== Svelte 4|Svelte 5 + +```svelte +{#if $form.isDirty} +
There are unsaved form changes.
+{/if} +``` + +::: + +To cancel a form submission, use the `cancel()` method. + +:::tabs key:frameworks +== Vue + +```vue +form.cancel() +``` + +== React + +```jsx +const { cancel } = useForm({ ... }) + +cancel() +``` + +== Svelte 4|Svelte 5 + +```svelte +$form.cancel() +``` + +::: + +To instruct Inertia to store a form's data and errors in [history state](/guide/remembering-state.md), you can provide a unique form key as the first argument when instantiating your form. + +:::tabs key:frameworks +== Vue + +```js +import { useForm } from '@inertiajs/vue3' + +const form = useForm('CreateUser', data) +const form = useForm(`EditUser:${user.id}`, data) +``` + +== React + +```js +import { useForm } from '@inertiajs/react' + +const form = useForm('CreateUser', data) +const form = useForm(`EditUser:${user.id}`, data) +``` + +== Svelte 4|Svelte 5 + +```js +import { useForm } from '@inertiajs/svelte' + +const form = useForm('CreateUser', data) +const form = useForm(`EditUser:${user.id}`, data) +``` + +::: + +## File uploads + +When making requests or form submissions that include files, Inertia will automatically convert the request data into a `FormData` object. + +For a more thorough discussion of file uploads, please consult the [file uploads documentation](/guide/file-uploads.md). + +## XHR / fetch submissions + +Using Inertia to submit forms works great for the vast majority of situations; however, in the event that you need more control over the form submission, you're free to make plain XHR or `fetch` requests instead using the library of your choice. diff --git a/docs/guide/how-it-works.md b/docs/guide/how-it-works.md new file mode 100644 index 0000000..2c71abe --- /dev/null +++ b/docs/guide/how-it-works.md @@ -0,0 +1,15 @@ +# How it works + +With Inertia you build applications just like you've always done with your server-side web framework of choice. You use your framework's existing functionality for routing, controllers, middleware, authentication, authorization, data fetching, and more. + +However, Inertia replaces your application's view layer. Instead of using server-side rendering via PHP or Ruby templates, the views returned by your application are JavaScript page components. This allows you to build your entire frontend using React, Vue, or Svelte, while still enjoying the productivity of Laravel or your preferred server-side framework. + +As you might expect, simply creating your frontend in JavaScript doesn't give you a single-page application experience. If you were to click a link, your browser would make a full page visit, which would then cause your client-side framework to reboot on the subsequent page load. This is where Inertia changes everything. + +At its core, Inertia is essentially a client-side routing library. It allows you to make page visits without forcing a full page reload. This is done using the `` component, a light-weight wrapper around a normal anchor link. When you click an Inertia link, Inertia intercepts the click and makes the visit via XHR instead. You can even make these visits programmatically in JavaScript using `router.visit()`. + +When Inertia makes an XHR visit, the server detects that it's an Inertia visit and, instead of returning a full HTML response, it returns a JSON response with the JavaScript page component name and data (props). Inertia then dynamically swaps out the previous page component with the new page component and updates the browser's history state. + +**The end result is a silky smooth single-page experience. 🎉** + +To learn more about the nitty-gritty, technical details of how Inertia works under the hood, check out [the protocol page](/guide/the-protocol.md). diff --git a/docs/guide/index.md b/docs/guide/index.md new file mode 100644 index 0000000..de33a3f --- /dev/null +++ b/docs/guide/index.md @@ -0,0 +1,23 @@ +# Introduction + +Welcome to the documentation for [inertia_rails](https://github.com/inertiajs/inertia-rails) adapter for [Ruby on Rails](https://rubyonrails.org/) and [Inertia.js](https://inertiajs.com/). + +## Why adapter-specific documentation? + +The [official documentation for Inertia.js](https://inertiajs.com) is great, but it's not Rails-specific anymore (see the [legacy docs](https://legacy.inertiajs.com)). This documentation aims to fill in the gaps and provide Rails-specific examples and explanations. + +## JavaScript apps the monolith way + +Inertia is a new approach to building classic server-driven web apps. We call it the modern monolith. + +Inertia allows you to create fully client-side rendered, single-page apps, without the complexity that comes with modern SPAs. It does this by leveraging existing server-side patterns that you already love. + +Inertia has no client-side routing, nor does it require an API. Simply build controllers and page views like you've always done! + +### Not a framework + +Inertia isn't a framework, nor is it a replacement for your existing server-side or client-side frameworks. Rather, it's designed to work with them. Think of Inertia as glue that connects the two. Inertia does this via adapters. We currently have three official client-side adapters (React, Vue, and Svelte) and two server-side adapters (Laravel and Rails). + +### Next steps + +Want to learn a bit more before diving in? Check out the [who is it for](/guide/who-is-it-for.md) and [how it works](/guide/how-it-works.md) pages. Or, if you're ready to get started, jump right into the [installation instructions](/guide/server-side-setup.md). diff --git a/docs/guide/links.md b/docs/guide/links.md new file mode 100644 index 0000000..d7d2a53 --- /dev/null +++ b/docs/guide/links.md @@ -0,0 +1,524 @@ +# Links + +To create links to other pages within an Inertia app, you will typically use the Inertia `` component. This component is a light wrapper around a standard anchor `` link that intercepts click events and prevents full page reloads. This is [how Inertia provides a single-page app experience](/guide/how-it-works.md) once your application has been loaded. + +## Creating links + +To create an Inertia link, use the Inertia `` component. Any attributes you provide to this component will be proxied to the underlying HTML tag. + +:::tabs key:frameworks +== Vue + +```vue + + + +``` + +== React + +```jsx +import { Link } from '@inertiajs/react' + +export default () => Home +``` + +== Svelte 4|Svelte 5 + +```svelte + + +Home + +Home +``` + +> [!TIP] +> The `use:inertia` action can be applied to any HTML element. + +::: + +By default, Inertia renders links as anchor `` elements. However, you can change the tag using the `as` prop. + +:::tabs key:frameworks +== Vue + +```vue + + + +``` + +== React + +```jsx +import { Link } from '@inertiajs/react' + +export default () => ( + + Logout + +) + +// Renders as... +// +``` + +== Svelte 4|Svelte 5 + +```svelte + + +Logout + + + +``` + +::: + +> [!NOTE] +> Creating `POST/PUT/PATCH/DELETE` anchor `` links is discouraged as it causes "Open Link in New Tab / Window" accessibility issues. The component automatically renders a ` + +Logout +``` + +::: + +## Data + +When making `POST` or `PUT` requests, you may wish to add additional data to the request. You can accomplish this using the `data` prop. The provided data can be an `object` or `FormData` instance. + +:::tabs key:frameworks +== Vue + +```vue + + + +``` + +== React + +```jsx +import { Link } from '@inertiajs/react' + +export default () => ( + + Save + +) +``` + +== Svelte 4|Svelte 5 + +```svelte + + + + +Save +``` + +::: + +## Custom headers + +The `headers` prop allows you to add custom headers to an Inertia link. However, the headers Inertia uses internally to communicate its state to the server take priority and therefore cannot be overwritten. + +:::tabs key:frameworks +== Vue + +```vue + + + +``` + +== React + +```jsx +import { Link } from '@inertiajs/react' + +export default () => ( + + Save + +) +``` + +== Svelte 4|Svelte 5 + +```svelte + + + + +Save +``` + +::: + +## Browser history + +The `replace` prop allows you to specify the browser's history behavior. By default, page visits push (new) state (`window.history.pushState`) into the history; however, it's also possible to replace state (`window.history.replaceState`) by setting the `replace` prop to `true`. This will cause the visit to replace the current history state instead of adding a new history state to the stack. + +:::tabs key:frameworks +== Vue + +```vue + + + +``` + +== React + +```jsx +import { Link } from '@inertiajs/react' + +export default () => ( + + Home + +) +``` + +== Svelte 4|Svelte 5 + +```svelte + + +Home + +Home +``` + +::: + +## State preservation + +You can preserve a page component's local state using the `preserveState` prop. This will prevent a page component from fully re-rendering. The `preserveState` prop is especially helpful on pages that contain forms, since you can avoid manually repopulating input fields and can also maintain a focused input. + +:::tabs key:frameworks +== Vue + +```vue + + + +``` + +== React + +```jsx +import { Link } from '@inertiajs/react' + +export default () => ( + <> + + + + Search + + +) +``` + +== Svelte 4|Svelte 5 + +```svelte + + + + + + +Search +``` + +::: + +## Scroll preservation + +You can use the `preserveScroll` prop to prevent Inertia from automatically resetting the scroll position when making a page visit. + +:::tabs key:frameworks +== Vue + +```vue + + + +``` + +== React + +```jsx +import { Link } from '@inertiajs/react' + +export default () => ( + + Home + +) +``` + +== Svelte 4|Svelte 5 + +```svelte + + +Home + +Home +``` + +::: + +For more information on managing scroll position, please consult the documentation on [scroll management](/guide/scroll-management). + +## Partial reloads + +The `only` prop allows you to specify that only a subset of a page's props (data) should be retrieved from the server on subsequent visits to that page. + +:::tabs key:frameworks +== Vue + +```vue + + + +``` + +== React + +```jsx +import { Link } from '@inertiajs/react' + +export default () => ( + + Show active + +) +``` + +== Svelte 4|Svelte 5 + +```svelte + + +Show active + +Show active +``` + +::: + +For more information on this topic, please consult the complete documentation on [partial reloads](/guide/partial-reloads.md). + +## Active states + +It's often desirable to set an active state for navigation links based on the current page. This can be accomplished when using Inertia by inspecting the `page` object and doing string comparisons against the `page.url` and `page.component` properties. + +:::tabs key:frameworks +== Vue + +```vue + + + +``` + +== React + +```jsx +import { usePage } from '@inertiajs/react' + +export default () => { + const { url, component } = usePage() + + return ( + <> + // URL exact match... + + Users + + // Component exact match... + + Users + + // URL starts with (/users, /users/create, /users/1, etc.)... + + Users + + // Component starts with (Users/Index, Users/Create, Users/Show, etc.)... + + Users + + + ) +} +``` + +== Svelte 4|Svelte 5 + +```svelte + + + +``` + +::: + +You can perform exact match comparisons (`===`), `startsWith()` comparisons (useful for matching a subset of pages), or even more complex comparisons using regular expressions. + +Using this approach, you're not limited to just setting class names. You can use this technique to conditionally render any markup on active state, such as different link text or even an SVG icon that represents the link is active. diff --git a/docs/guide/manual-visits.md b/docs/guide/manual-visits.md new file mode 100644 index 0000000..4d7932c --- /dev/null +++ b/docs/guide/manual-visits.md @@ -0,0 +1,803 @@ +# Manual visits + +In addition to [creating links](/guide/links.md), it's also possible to manually make Inertia visits / requests programmatically via JavaScript. This is accomplished via the `router.visit()` method. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.visit(url, { + method: 'get', + data: {}, + replace: false, + preserveState: false, + preserveScroll: false, + only: [], + except: [], + headers: {}, + errorBag: null, + forceFormData: false, + queryStringArrayFormat: 'brackets', + onCancelToken: (cancelToken) => {}, + onCancel: () => {}, + onBefore: (visit) => {}, + onStart: (visit) => {}, + onProgress: (progress) => {}, + onSuccess: (page) => {}, + onError: (errors) => {}, + onFinish: (visit) => {}, +}) +``` + +== React + +```js +import { router } from '@inertiajs/react' + +router.visit(url, { + method: 'get', + data: {}, + replace: false, + preserveState: false, + preserveScroll: false, + only: [], + except: [], + headers: {}, + errorBag: null, + forceFormData: false, + queryStringArrayFormat: 'brackets', + onCancelToken: (cancelToken) => {}, + onCancel: () => {}, + onBefore: (visit) => {}, + onStart: (visit) => {}, + onProgress: (progress) => {}, + onSuccess: (page) => {}, + onError: (errors) => {}, + onFinish: (visit) => {}, +}) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.visit(url, { + method: 'get', + data: {}, + replace: false, + preserveState: false, + preserveScroll: false, + only: [], + except: [], + headers: {}, + errorBag: null, + forceFormData: false, + queryStringArrayFormat: 'brackets', + onCancelToken: (cancelToken) => {}, + onCancel: () => {}, + onBefore: (visit) => {}, + onStart: (visit) => {}, + onProgress: (progress) => {}, + onSuccess: (page) => {}, + onError: (errors) => {}, + onFinish: (visit) => {}, +}) +``` + +::: + +However, it's generally more convenient to use one of Inertia's shortcut request methods. These methods share all the same options as `router.visit()`. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.get(url, data, options) +router.post(url, data, options) +router.put(url, data, options) +router.patch(url, data, options) +router.delete(url, options) +router.reload(options) // Uses the current URL +``` + +== React + +```js +import { router } from '@inertiajs/react' + +router.get(url, data, options) +router.post(url, data, options) +router.put(url, data, options) +router.patch(url, data, options) +router.delete(url, options) +router.reload(options) // Uses the current URL +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.get(url, data, options) +router.post(url, data, options) +router.put(url, data, options) +router.patch(url, data, options) +router.delete(url, options) +router.reload(options) // Uses the current URL +``` + +::: + +The `reload()` method is a convenient, shorthand method that automatically visits the current page with `preserveState` and `preserveScroll` both set to `true`, making it the perfect method to invoke when you just want to reload the current page's data. + +## Method + +When making manual visits, you may use the `method` option to set the request's HTTP method to `get`, `post`, `put`, `patch` or `delete`. The default method is `get`. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.visit(url, { method: 'post' }) +``` + +== React + +```js +import { router } from '@inertiajs/react' + +router.visit(url, { method: 'post' }) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.visit(url, { method: 'post' }) +``` + +::: + +> [!WARNING] +> Uploading files via `put` or `patch` is not supported in Rails. Instead, make the request via `post`, including a `_method` attribute or a `X-HTTP-METHOD-OVERRIDE` header set to `put` or `patch`. For more info see [`Rack::MethodOverride`](https://github.com/rack/rack/blob/main/lib/rack/method_override.rb). + +# Data + +You may use the `data` option to add data to the request. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.visit('/users', { + method: 'post', + data: { + name: 'John Doe', + email: 'john.doe@example.com', + }, +}) +``` + +== React + +```js +import { router } from '@inertiajs/react' + +router.visit('/users', { + method: 'post', + data: { + name: 'John Doe', + email: 'john.doe@example.com', + }, +}) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.visit('/users', { + method: 'post', + data: { + name: 'John Doe', + email: 'john.doe@example.com', + }, +}) +``` + +::: + +For convenience, the `get()`, `post()`, `put()`, and `patch()` methods all accept data as their second argument. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.post('/users', { + name: 'John Doe', + email: 'john.doe@example.com', +}) +``` + +== React + +```js +import { router } from '@inertiajs/react' + +router.post('/users', { + name: 'John Doe', + email: 'john.doe@example.com', +}) +``` + +== Svelte 4|Svelte 5 + +```js + +``` + +import { router } from '@inertiajs/svelte' + +router.post('/users', { +name: 'John Doe', +email: 'john.doe@example.com', +}) +::: + +## Custom headers + +The `headers` option allows you to add custom headers to a request. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.post('/users', data, { + headers: { + 'Custom-Header': 'value', + }, +}) +``` + +== React + +```js +import { router } from '@inertiajs/react' + +router.post('/users', data, { + headers: { + 'Custom-Header': 'value', + }, +}) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.post('/users', data, { + headers: { + 'Custom-Header': 'value', + }, +}) +``` + +::: + +> [!NOTE] +> The headers Inertia uses internally to communicate its state to the server take priority and therefore cannot be overwritten. + +## File uploads + +When making visits / requests that include files, Inertia will automatically convert the request data into a `FormData` object. If you would like the request to always use a `FormData` object, you may use the `forceFormData` option. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.post('/companies', data, { + forceFormData: true, +}) +``` + +== React + +```js +import { router } from '@inertiajs/react' + +router.post('/companies', data, { + forceFormData: true, +}) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.post('/companies', data, { + forceFormData: true, +}) +``` + +::: + +For more information on uploading files, please consult the dedicated [file uploads](/guide/file-uploads.md) documentation. + +## Browser history + +When making visits, Inertia automatically adds a new entry into the browser history. However, it's also possible to replace the current history entry by setting the `replace` option to `true`. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.get('/users', { search: 'John' }, { replace: true }) +``` + +== React + +```js +import { router } from '@inertiajs/react' + +router.get('/users', { search: 'John' }, { replace: true }) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.get('/users', { search: 'John' }, { replace: true }) +``` + +::: + +> [!NOTE] +> Visits made to the same URL automatically set `replace` to `true`. + +## State preservation + +By default, page visits to the same page create a fresh page component instance. This causes any local state, such as form inputs, scroll positions, and focus states to be lost. + +However, in some situations, it's necessary to preserve the page component state. For example, when submitting a form, you need to preserve your form data in the event that form validation fails on the server. + +For this reason, the `post`, `put`, `patch`, `delete`, and `reload` methods all set the `preserveState` option to `true` by default. + +You can instruct Inertia to preserve the component's state when using the `get` method by setting the `preserveState` option to `true`. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.get('/users', { search: 'John' }, { preserveState: true }) +``` + +== React + +```js +import { router } from '@inertiajs/react' + +router.get('/users', { search: 'John' }, { preserveState: true }) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.get('/users', { search: 'John' }, { preserveState: true }) +``` + +::: + +You can also lazily evaluate the `preserveState` option based on the response by providing a callback to the `preserveState` option. + +If you'd like to only preserve state if the response includes validation errors, set the `preserveState` option to `"errors"`. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.get('/users', { search: 'John' }, { preserveState: 'errors' }) +``` + +== React + +```js +import { router } from '@inertiajs/react' + +router.get('/users', { search: 'John' }, { preserveState: 'errors' }) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.get('/users', { search: 'John' }, { preserveState: 'errors' }) +``` + +::: + +You can also lazily evaluate the `preserveState` option based on the response by providing a callback. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.post('/users', data, { + preserveState: (page) => page.props.someProp === 'value', +}) +``` + +== React + +```js +import { router } from '@inertiajs/react' + +router.post('/users', data, { + preserveState: (page) => page.props.someProp === 'value', +}) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.post('/users', data, { + preserveState: (page) => page.props.someProp === 'value', +}) +``` + +::: + +## Scroll preservation + +When navigating between pages, Inertia mimics default browser behavior by automatically resetting the scroll position of the document body (as well as any [scroll regions](/guide/scroll-management.md#scroll-regions) you've defined) back to the top of the page. + +You can disable this behaviour by setting the `preserveScroll` option to `false`. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.visit(url, { preserveScroll: false }) +``` + +== React + +```js +import { router } from '@inertiajs/react' + +router.visit(url, { preserveScroll: false }) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.visit(url, { preserveScroll: false }) +``` + +::: + +If you'd like to only preserve the scroll position if the response includes validation errors, set the `preserveScroll` option to `"errors"`. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.visit(url, { preserveScroll: 'errors' }) +``` + +== React + +```js +import { router } from '@inertiajs/react' + +router.visit(url, { preserveScroll: 'errors' }) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.visit(url, { preserveScroll: 'errors' }) +``` + +::: + +You can also lazily evaluate the `preserveScroll` option based on the response by providing a callback. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.post('/users', data, { + preserveScroll: (page) => page.props.someProp === 'value', +}) +``` + +== React + +```js +import { router } from '@inertiajs/react' + +router.post('/users', data, { + preserveScroll: (page) => page.props.someProp === 'value', +}) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.post('/users', data, { + preserveScroll: (page) => page.props.someProp === 'value', +}) +``` + +::: + +For more information regarding this feature, please consult the [scroll management](/guide/scroll-management.md) documentation. + +## Partial reloads + +The `only` option allows you to request a subset of the props (data) from the server on subsequent visits to the same page, thus making your application more efficient since it does not need to retrieve data that the page is not interested in refreshing. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.visit('/users', { search: 'John' }, { only: ['users'] }) +``` + +== React + +```js +import { router } from '@inertiajs/react' + +router.visit('/users', { search: 'John' }, { only: ['users'] }) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.visit('/users', { search: 'John' }, { only: ['users'] }) +``` + +::: + +For more information on this feature, please consult the [partial reloads](/guide/partial-reloads.md) documentation. + +## Visit cancellation + +You can cancel a visit using a cancel token, which Inertia automatically generates and provides via the `onCancelToken()` callback prior to making the visit. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.post('/users', data, { + onCancelToken: (cancelToken) => (this.cancelToken = cancelToken), +}) + +// Cancel the visit... +this.cancelToken.cancel() +``` + +== React + +```js +import { router } from '@inertiajs/react' + +router.post('/users', data, { + onCancelToken: (cancelToken) => (this.cancelToken = cancelToken), +}) + +// Cancel the visit... +this.cancelToken.cancel() +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.post('/users', data, { + onCancelToken: (cancelToken) => (this.cancelToken = cancelToken), +}) + +// Cancel the visit... +this.cancelToken.cancel() +``` + +::: + +The `onCancel()` and `onFinish()` event callbacks will be executed when a visit is cancelled. + +## Event callbacks + +In addition to Inertia's [global events](/guide/events.md), Inertia also provides a number of per-visit event callbacks. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.post('/users', data, { + onBefore: (visit) => {}, + onStart: (visit) => {}, + onProgress: (progress) => {}, + onSuccess: (page) => {}, + onError: (errors) => {}, + onCancel: () => {}, + onFinish: (visit) => {}, +}) +``` + +== React + +```js +import { router } from '@inertiajs/react' + +router.post('/users', data, { + onBefore: (visit) => {}, + onStart: (visit) => {}, + onProgress: (progress) => {}, + onSuccess: (page) => {}, + onError: (errors) => {}, + onCancel: () => {}, + onFinish: (visit) => {}, +}) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.post('/users', data, { + onBefore: (visit) => {}, + onStart: (visit) => {}, + onProgress: (progress) => {}, + onSuccess: (page) => {}, + onError: (errors) => {}, + onCancel: () => {}, + onFinish: (visit) => {}, +}) +``` + +::: + +Returning `false` from the `onBefore()` callback will cause the visit to be cancelled. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.delete(`/users/${user.id}`, { + onBefore: () => confirm('Are you sure you want to delete this user?'), +}) +``` + +== React + +```js +import { router } from '@inertiajs/react' + +router.delete(`/users/${user.id}`, { + onBefore: () => confirm('Are you sure you want to delete this user?'), +}) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.delete(`/users/${user.id}`, { + onBefore: () => confirm('Are you sure you want to delete this user?'), +}) +``` + +::: + +It's also possible to return a promise from the `onSuccess()` and `onError()` callbacks. When doing so, the "finish" event will be delayed until the promise has resolved. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.post(url, { + onSuccess: () => { + return Promise.all([this.doThing(), this.doAnotherThing()]) + }, + onFinish: (visit) => { + // This won't be called until doThing() + // and doAnotherThing() have finished. + }, +}) +``` + +== React + +```js +import { router } from '@inertiajs/react' + +router.post(url, { + onSuccess: () => { + return Promise.all([this.doThing(), this.doAnotherThing()]) + }, + onFinish: (visit) => { + // This won't be called until doThing() + // and doAnotherThing() have finished. + }, +}) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.post(url, { + onSuccess: () => { + return Promise.all([this.doThing(), this.doAnotherThing()]) + }, + onFinish: (visit) => { + // This won't be called until doThing() + // and doAnotherThing() have finished. + }, +}) +``` + +::: diff --git a/docs/guide/pages.md b/docs/guide/pages.md new file mode 100644 index 0000000..d380bcb --- /dev/null +++ b/docs/guide/pages.md @@ -0,0 +1,510 @@ +# Pages + +When building applications using Inertia, each page in your application typically has its own controller / route and a corresponding JavaScript component. This allows you to retrieve just the data necessary for that page - no API required. + +In addition, all of the data needed for the page can be retrieved before the page is ever rendered by the browser, eliminating the need for displaying "loading" states when users visit your application. + +## Creating pages + +Inertia pages are simply JavaScript components. If you have ever written a Vue, React, or Svelte component, you will feel right at home. As you can see in the example below, pages receive data from your application's controllers as props. + +:::tabs key:frameworks +== Vue + +```vue + + + +``` + +== React + +```jsx +import Layout from '../Layout' +import { Head } from '@inertiajs/react' + +export default function Welcome({ user }) { + return ( + + +

Welcome

+

Hello {user.name}, welcome to your first Inertia app!

+
+ ) +} +``` + +== Svelte 4 + +```svelte + + + + Welcome + + + +

Welcome

+

Hello {user.name}, welcome to your first Inertia app!

+
+``` + +== Svelte 5 + +```svelte + + + + Welcome + + + +

Welcome

+

Hello {user.name}, welcome to your first Inertia app!

+
+``` + +::: + +Given the page above, you can render the page by returning an Inertia response from a controller or route. In this example, let's assume this page is stored at `app/frontend/pages/User/Show.(jsx|vue|svelte)` within a Rails application. + +```ruby +class UsersController < ApplicationController + def show + user = User.find(params[:id]) + + render inertia: 'User/Show', props: { user: } + end +end +``` + +See [the responses documentation](/guide/responses) for more information on how to return Inertia responses from your controllers. + +## Creating layouts + +While not required, for most projects it makes sense to create a site layout that all of your pages can extend. You may have noticed in our page example above that we're wrapping the page content within a `` component. Here's an example of such a component: + +:::tabs key:frameworks +== Vue + +```vue + + + +``` + +== React + +```jsx +import { Link } from '@inertiajs/react' + +export default function Layout({ children }) { + return ( +
+
+ Home + About + Contact +
+
{children}
+
+ ) +} +``` + +== Svelte 4 + +```svelte + + +
+
+ Home + About + Contact +
+
+ +
+
+``` + +== Svelte 5 + +```svelte + + +
+
+ Home + About + Contact +
+
+ {@render children()} +
+
+``` + +::: + +As you can see, there is nothing Inertia specific within this template. This is just a typical component. + +## Persistent layouts + +While it's simple to implement layouts as children of page components, it forces the layout instance to be destroyed and recreated between visits. This means you cannot have persistent layout state when navigating between pages. + +For example, maybe you have an audio player on a podcast website that you want to continue playing as users navigate the site. Or, maybe you simply want to maintain the scroll position in your sidebar navigation between page visits. In these situations, the solution is to leverage Inertia's persistent layouts. + +:::tabs key:frameworks +== Vue + +```vue + + + + + +``` + +== React + +```jsx +import Layout from '../Layout' + +const Home = ({ user }) => { + return ( + <> +

Welcome

+

Hello {user.name}, welcome to your first Inertia app!

+ + ) +} + +Home.layout = (page) => + +export default Home +``` + +== Svelte 4 + +```svelte + + + + +

Welcome

+ +

Hello {user.name}, welcome to your first Inertia app!

+``` + +== Svelte 5 + +```svelte + + + + +

Welcome

+ +

Hello {user.name}, welcome to your first Inertia app!

+``` + +::: + +You can also create more complex layout arrangements using nested layouts. + +:::tabs key:frameworks +== Vue + +```vue + + + + + +``` + +If you're using Vue 3.3+, you can alternatively use [`defineOptions`](https://vuejs.org/api/sfc-script-setup.html#defineoptions) to define a layout within ` +``` + +== React + +```jsx +import SiteLayout from './SiteLayout' +import NestedLayout from './NestedLayout' + +const Home = ({ user }) => { + return ( + <> +

Welcome

+

Hello {user.name}, welcome to your first Inertia app!

+ + ) +} + +Home.layout = (page) => ( + + + +) + +export default Home +``` + +== Svelte 4 + +```svelte + + + + +

Welcome

+ +

Hello {user.name}, welcome to your first Inertia app!

+``` + +== Svelte 5 + +```svelte + + + + +

Welcome

+ +

Hello {user.name}, welcome to your first Inertia app!

+``` + +::: + +## Default layouts + +If you're using persistent layouts, you may find it convenient to define the default page layout in the `resolve()` callback of your application's main JavaScript file. + +:::tabs key:frameworks +== Vue + +```js +// frontend/entrypoints/inertia.js +import Layout from '../Layout' + +createInertiaApp({ + resolve: (name) => { + const pages = import.meta.glob('../pages/**/*.vue', { eager: true }) + let page = pages[`../pages/${name}.vue`] + page.default.layout = page.default.layout || Layout + return page + }, + // ... +}) +``` + +== React + +```js +// frontend/entrypoints/inertia.js +import Layout from '../Layout' + +createInertiaApp({ + resolve: (name) => { + const pages = import.meta.glob('../pages/**/*.jsx', { eager: true }) + let page = pages[`../pages/${name}.jsx`] + page.default.layout = + page.default.layout || ((page) => ) + return page + }, + // ... +}) +``` + +== Svelte 4|Svelte 5 + +```js +// frontend/entrypoints/inertia.js +import Layout from '../Layout' + +createInertiaApp({ + resolve: (name) => { + const pages = import.meta.glob('../pages/**/*.svelte', { eager: true }) + let page = pages[`../pages/${name}.svelte`] + return { default: page.default, layout: page.layout || Layout } + }, + // ... +}) +``` + +::: + +This will automatically set the page layout to `Layout` if a layout has not already been set for that page. + +You can even go a step further and conditionally set the default page layout based on the page `name`, which is available to the `resolve()` callback. For example, maybe you don't want the default layout to be applied to your public pages. + +:::tabs key:frameworks +== Vue + +```js +// frontend/entrypoints/inertia.js +import Layout from '../Layout' + +createInertiaApp({ + resolve: (name) => { + const pages = import.meta.glob('../pages/**/*.vue', { eager: true }) + let page = pages[`../pages/${name}.vue`] + page.default.layout = name.startsWith('Public/') ? undefined : Layout + return page + }, + // ... +}) +``` + +== React + +```js +// frontend/entrypoints/inertia.js +import Layout from '../Layout' + +createInertiaApp({ + resolve: (name) => { + const pages = import.meta.glob('../pages/**/*.jsx', { eager: true }) + let page = pages[`../pages/${name}.jsx`] + page.default.layout = name.startsWith('Public/') + ? undefined + : (page) => + return page + }, + // ... +}) +``` + +== Svelte 4|Svelte 5 + +```js +// frontend/entrypoints/inertia.js +import Layout from '../Layout' + +createInertiaApp({ + resolve: (name) => { + const pages = import.meta.glob('../pages/**/*.svelte', { eager: true }) + let page = pages[`../pages/${name}.svelte`] + return { + default: page.default, + layout: name.startsWith('Public/') ? undefined : Layout, + } + }, + // ... +}) +``` + +::: diff --git a/docs/guide/partial-reloads.md b/docs/guide/partial-reloads.md new file mode 100644 index 0000000..1589ddc --- /dev/null +++ b/docs/guide/partial-reloads.md @@ -0,0 +1,242 @@ +# Partial reloads + +When making visits to the same page you are already on, it's not always necessary to re-fetch all of the page's data from the server. In fact, selecting only a subset of the data can be a helpful performance optimization if it's acceptable that some page data becomes stale. Inertia makes this possible via its "partial reload" feature. + +As an example, consider a "user index" page that includes a list of users, as well as an option to filter the users by their company. On the first request to the page, both the `users` and `companies` props are passed to the page component. However, on subsequent visits to the same page (maybe to filter the users), you can request only the `users` data from the server without requesting the `companies` data. Inertia will then automatically merge the partial data returned from the server with the data it already has in memory client-side. + +> [!NOTE] +> Partial reloads only work for visits made to the same page component. + +## Only certain props + +To perform a partial reload, use the `only` visit option to specify which data the server should return. This option should be an array of keys which correspond to the keys of the props. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.visit(url, { + only: ['users'], +}) +``` + +== React + +```jsx +import { router } from '@inertiajs/react' + +router.visit(url, { + only: ['users'], +}) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.visit(url, { + only: ['users'], +}) +``` + +::: + +## Except certain props + +> [!WARNING] +> The `except` option is not yet supported by the Inertia Rails. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.visit(url, { + except: ['users'], +}) +``` + +== React + +```jsx +import { router } from '@inertiajs/react' + +router.visit(url, { + except: ['users'], +}) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.visit(url, { + except: ['users'], +}) +``` + +::: + +In addition to the only visit option you can also use the except option to specify which data the server should exclude. This option should also be an array of keys which correspond to the keys of the props. + +## Router shorthand + +Since partial reloads can only be made to the same page component the user is already on, it almost always makes sense to just use the `router.reload()` method, which automatically uses the current URL. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.reload({ only: ['users'] }) +``` + +== React + +```js +import { router } from '@inertiajs/react' + +router.reload({ only: ['users'] }) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.reload({ only: ['users'] }) +``` + +::: + +## Using links + +It's also possible to perform partial reloads with Inertia links using the `only` property. + +:::tabs key:frameworks +== Vue + +```vue + + + +``` + +== React + +```jsx +import { Link } from '@inertiajs/react' + +export default () => ( + + Show active + +) +``` + +== Svelte 4|Svelte 5 + +```svelte + + +Show active + +Show active +``` + +::: + +## Lazy data evaluation + +For partial reloads to be most effective, be sure to also use lazy data evaluation when returning props from your server-side routes or controllers. This can be accomplished by wrapping all optional page data in a lambda. + +```ruby +class UsersController < ApplicationController + def index + render inertia: 'Users/Index', props: { + users: -> { User.all }, + companies: -> { Company.all }, + } + end +end +``` + +When Inertia performs a request, it will determine which data is required and only then will it evaluate the closure. This can significantly increase the performance of pages that contain a lot of optional data. + +Additionally, Inertia provides an `InertiaRails.optional` method to specify that a prop should never be included unless explicitly requested using the `only` option: + +```ruby +class UsersController < ApplicationController + def index + render inertia: 'Users/Index', props: { + users: InertiaRails.optional { User.all }, + + # Also works with a lambda: + # users: InertiaRails.optional(-> { User.all }), + + # Also works with a simple value, + # but this way the prop is always evaluated, + # even if not included: + # users: InertiaRails.optional(User.all), + } + end +end +``` + +> [!NOTE] +> Prior to Inertia.js v2, the method `InertiaRails.lazy` was used. It is now deprecated and has been replaced by `InertiaRails.optional`. Please update your code accordingly to ensure compatibility with the latest version. + +On the inverse, you can use the `InertiaRails.always` method to specify that a prop should always be included, even if it has not been explicitly required in a partial reload. + +```ruby +class UsersController < ApplicationController + def index + render inertia: 'Users/Index', props: { + users: InertiaRails.always(User.all), + + # Also works with block: + # users: InertiaRails.always { User.all }, + + # Also works with a lambda: + # users: InertiaRails.always(-> { User.all }), + } + end +end +``` + +Here's a summary of each approach: + +```ruby +class UsersController < ApplicationController + def index + render inertia: 'Users/Index', props: { + # ALWAYS included on standard visits + # OPTIONALLY included on partial reloads + # ALWAYS evaluated + users: User.all, + + # ALWAYS included on standard visits + # OPTIONALLY included on partial reloads + # ONLY evaluated when needed + users: -> { User.all }, + + # NEVER included on standard visits + # OPTIONALLY included on partial reloads + # ONLY evaluated when needed + users: InertiaRails.lazy { User.all }, + } + end +end +``` diff --git a/docs/guide/progress-indicators.md b/docs/guide/progress-indicators.md new file mode 100644 index 0000000..3ca366f --- /dev/null +++ b/docs/guide/progress-indicators.md @@ -0,0 +1,296 @@ +# Progress indicators + +Since Inertia requests are made via XHR, there would typically not be a browser loading indicator when navigating from one page to another. To solve this, Inertia displays a progress indicator at the top of the page whenever you make an Inertia visit. However, [asynchronous requests](#visit-options) do not show the progress indicator unless explicitly configured. + +Of course, if you prefer, you can disable Inertia's default loading indicator and provide your own custom implementation. We'll discuss both approaches below. + +## Default + +Inertia's default progress indicator is a light-weight wrapper around the [NProgress](https://ricostacruz.com/nprogress/) library. You can customize it via the `progress` property of the `createInertiaApp()` function. + +```js +createInertiaApp({ + progress: { + // The delay after which the progress bar will appear, in milliseconds... + delay: 250, + + // The color of the progress bar... + color: '#29d', + + // Whether to include the default NProgress styles... + includeCSS: true, + + // Whether the NProgress spinner will be shown... + showSpinner: false, + }, + // ... +}) +``` + +You can disable Inertia's default loading indicator by setting the `progress` property to `false`. + +```js +createInertiaApp({ + progress: false, + // ... +}) +``` + +## Custom + +It's also possible to setup your own custom page loading indicators using [Inertia events](/guide/events.md). Let's explore how to do this using the [NProgress](https://ricostacruz.com/nprogress/) library as an example. + +First, disable Inertia's default loading indicator. + +```js +createInertiaApp({ + progress: false, + // ... +}) +``` + +Next, install the NProgress library. + +```shell +npm install nprogress +``` + +After installation, you'll need to add the [NProgress styles](https://github.com/rstacruz/nprogress/blob/master/nprogress.css) to your project. You can do this using a CDN hosted copy of the styles. + +```html + +``` + +Next, import both `NProgress` and the Inertia `router` into your application. + +:::tabs key:frameworks +== Vue + +```js +import NProgress from 'nprogress' +import { router } from '@inertiajs/vue3' +``` + +== React + +```js +import NProgress from 'nprogress' +import { router } from '@inertiajs/react' +``` + +== Svelte 4|Svelte 5 + +```js +import NProgress from 'nprogress' +import { router } from '@inertiajs/svelte' +``` + +::: + +Next, let's add a `start` event listener. We'll use this listener to show the progress bar when a new Inertia visit begins. + +```js +router.on('start', () => NProgress.start()) +``` + +Then, let's add a `finish` event listener to hide the progress bar when the page visit finishes. + +```js +router.on('finish', () => NProgress.done()) +``` + +That's it! Now, as you navigate from one page to another, the progress bar will be added and removed from the page. + +### Handling cancelled visits + +While this custom progress implementation works great for page visits that finish properly, it would be nice to handle cancelled visits as well. First, for interrupted visits (those that get cancelled as a result of a new visit), the progress bar should simply be reset back to the start position. Second, for manually cancelled visits, the progress bar should be immediately removed from the page. + +We can accomplish this by inspecting the `event.detail.visit` object that's provided to the finish event. + +```js +router.on('finish', (event) => { + if (event.detail.visit.completed) { + NProgress.done() + } else if (event.detail.visit.interrupted) { + NProgress.set(0) + } else if (event.detail.visit.cancelled) { + NProgress.done() + NProgress.remove() + } +}) +``` + +### File upload progress + +Let's take this a step further. When files are being uploaded, it would be great to update the loading indicator to reflect the upload progress. This can be done using the `progress` event. + +```js +router.on('progress', (event) => { + if (event.detail.progress.percentage) { + NProgress.set((event.detail.progress.percentage / 100) * 0.9) + } +}) +``` + +Now, instead of the progress bar "trickling" while the files are being uploaded, it will actually update it's position based on the progress of the request. We limit the progress here to 90%, since we still need to wait for a response from the server. + +### Loading indicator delay + +The last thing we're going to implement is a loading indicator delay. It's often preferable to delay showing the loading indicator until a request has taken longer than 250-500 milliseconds. This prevents the loading indicator from appearing constantly on quick page visits, which can be visually distracting. + +To implement the delay behavior, we'll use the `setTimeout` and `clearTimeout` functions. Let's start by defining a variable to keep track of the timeout. + +```js +let timeout = null +``` + +Next, let's update the `start` event listener to start a new timeout that will show the progress bar after 250 milliseconds. + +```js +router.on('start', () => { + timeout = setTimeout(() => NProgress.start(), 250) +}) +``` + +Next, we'll update the `finish` event listener to clear any existing timeouts in the event that the page visit finishes before the timeout does. + +```js +router.on('finish', (event) => { + clearTimeout(timeout) + // ... +}) +``` + +In the `finish` event listener, we need to determine if the progress bar has actually started displaying progress, otherwise we'll inadvertently cause it to show before the timeout has finished. + +```js +router.on('finish', (event) => { + clearTimeout(timeout) + if (!NProgress.isStarted()) { + return + } + // ... +}) +``` + +And, finally, we need to do the same check in the `progress` event listener. + +```js +router.on('progress', event => { + if (!NProgress.isStarted()) { + return + } + // ... +} +``` + +That's it, you now have a beautiful custom page loading indicator! + +### Complete example + +For convenience, here is the full source code of the final version of our custom loading indicator. + +:::tabs key:frameworks +== Vue + +```js +import NProgress from 'nprogress' +import { router } from '@inertiajs/vue3' + +let timeout = null + +router.on('start', () => { + timeout = setTimeout(() => NProgress.start(), 250) +}) + +router.on('progress', (event) => { + if (NProgress.isStarted() && event.detail.progress.percentage) { + NProgress.set((event.detail.progress.percentage / 100) * 0.9) + } +}) + +router.on('finish', (event) => { + clearTimeout(timeout) + if (!NProgress.isStarted()) { + return + } else if (event.detail.visit.completed) { + NProgress.done() + } else if (event.detail.visit.interrupted) { + NProgress.set(0) + } else if (event.detail.visit.cancelled) { + NProgress.done() + NProgress.remove() + } +}) +``` + +== React + +```js +import NProgress from 'nprogress' +import { router } from '@inertiajs/react' + +let timeout = null + +router.on('start', () => { + timeout = setTimeout(() => NProgress.start(), 250) +}) + +router.on('progress', (event) => { + if (NProgress.isStarted() && event.detail.progress.percentage) { + NProgress.set((event.detail.progress.percentage / 100) * 0.9) + } +}) + +router.on('finish', (event) => { + clearTimeout(timeout) + if (!NProgress.isStarted()) { + return + } else if (event.detail.visit.completed) { + NProgress.done() + } else if (event.detail.visit.interrupted) { + NProgress.set(0) + } else if (event.detail.visit.cancelled) { + NProgress.done() + NProgress.remove() + } +}) +``` + +== Svelte 4|Svelte 5 + +```js +import NProgress from 'nprogress' +import { router } from '@inertiajs/svelte' + +let timeout = null + +router.on('start', () => { + timeout = setTimeout(() => NProgress.start(), 250) +}) + +router.on('progress', (event) => { + if (NProgress.isStarted() && event.detail.progress.percentage) { + NProgress.set((event.detail.progress.percentage / 100) * 0.9) + } +}) + +router.on('finish', (event) => { + clearTimeout(timeout) + if (!NProgress.isStarted()) { + return + } else if (event.detail.visit.completed) { + NProgress.done() + } else if (event.detail.visit.interrupted) { + NProgress.set(0) + } else if (event.detail.visit.cancelled) { + NProgress.done() + NProgress.remove() + } +}) +``` + +::: diff --git a/docs/guide/redirects.md b/docs/guide/redirects.md new file mode 100644 index 0000000..303a22f --- /dev/null +++ b/docs/guide/redirects.md @@ -0,0 +1,41 @@ +# Redirects + +When making a non-GET Inertia request manually or via a `` element, you should ensure that you always respond with a proper Inertia redirect response. + +For example, if your controller is creating a new user, your "create" endpoint should return a redirect back to a standard `GET` endpoint, such as your user "index" page. Inertia will automatically follow this redirect and update the page accordingly. + +```ruby +class UsersController < ApplicationController + def create + user = User.new(user_params) + + if user.save + redirect_to users_url + else + redirect_to new_user_url, inertia: { errors: user.errors } + end + end + + private + + def user_params + params.require(:user).permit(:name, :email) + end +end +``` + +## 303 response code + +When redirecting after a `PUT`, `PATCH`, or `DELETE` request, you must use a `303` response code, otherwise the subsequent request will not be treated as a `GET` request. A `303` redirect is very similar to a `302` redirect; however, the follow-up request is explicitly changed to a `GET` request. + +If you're using one of our official server-side adapters, all redirects will automatically be converted to `303` redirects. + +## External redirects + +Sometimes it's necessary to redirect to an external website, or even another non-Inertia endpoint in your app while handling an Inertia request. This can be accomplished using a server-side initiated `window.location` visit via the `inertia_location` method. + +```ruby +inertia_location index_path +``` + +The `inertia_location` method will generate a `409 Conflict` response and include the destination URL in the `X-Inertia-Location` header. When this response is received client-side, Inertia will automatically perform a `window.location = url` visit. diff --git a/docs/guide/remembering-state.md b/docs/guide/remembering-state.md new file mode 100644 index 0000000..9c20913 --- /dev/null +++ b/docs/guide/remembering-state.md @@ -0,0 +1,237 @@ +# Remembering state + +When navigating browser history, Inertia restores pages using prop data cached in history state. However, Inertia does not restore local page component state since this is beyond its reach. This can lead to outdated pages in your browser history. + +For example, if a user partially completes a form, then navigates away, and then returns back, the form will be reset and their work will be lost. + +To mitigate this issue, you can tell Inertia which local component state to save in the browser history. + +## Saving local state + +To save local component state to the history state, use the `remember` feature to tell Inertia which data it should remember. + +:::tabs key:frameworks +== Vue + +```js +import { useRemember } from '@inertiajs/vue3' + +const form = useRemember({ + first_name: null, + last_name: null, +}) +``` + +== React + +```js +import { useRemember } from '@inertiajs/react' + +export default function Profile() { + const [formState, setFormState] = useRemember({ + first_name: null, + last_name: null, + // ... + }) + + // ... +} +``` + +== Svelte 4|Svelte 5 + +```js +import { remember } from '@inertiajs/svelte' + +const form = remember({ + first_name: null, + last_name: null, +}) + +// ... +``` + +::: + +Now, whenever your local `form` state changes, Inertia will automatically save this data to the history state and will also restore it on history navigation. + +## Multiple components + +If your page contains multiple components that use the remember functionality provided by Inertia, you need to provide a unique key for each component so that Inertia knows which data to restore to each component. + +:::tabs key:frameworks +== Vue + +```js +import { useRemember } from '@inertiajs/vue3' + +const form = useRemember( + { + first_name: null, + last_name: null, + }, + 'Users/Create', +) +``` + +== React + +```js +import { useRemember } from '@inertiajs/react' + +export default function Profile() { + const [formState, setFormState] = useRemember( + { + first_name: null, + last_name: null, + }, + 'Users/Create', + ) +} +``` + +== Svelte 4|Svelte 5 + +```js +import { page, remember } from '@inertiajs/svelte' + +let form = remember( + { + first_name: null, + last_name: null, + }, + 'Users/Create', +) +``` + +::: + +If you have multiple instances of the same component on the page using the remember functionality, be sure to also include a unique key for each component instance, such as a model identifier. + +:::tabs key:frameworks +== Vue + +```js +import { useRemember } from '@inertiajs/vue3' + +const props = defineProps({ user: Object }) + +const form = useRemember( + { + first_name: null, + last_name: null, + }, + `Users/Edit:${props.user.id}`, +) +``` + +== React + +```js +import { useRemember } from '@inertiajs/react' + +export default function Profile() { + const [formState, setFormState] = useRemember( + { + first_name: props.user.first_name, + last_name: props.user.last_name, + }, + `Users/Edit:${this.user.id}`, + ) +} +``` + +== Svelte 4|Svelte 5 + +```js +import { page, remember } from '@inertiajs/svelte' + +let form = remember( + { + first_name: $page.props.user.first_name, + last_name: $page.props.user.last_name, + }, + `Users/Edit:${$page.props.user.id}`, +) +``` + +::: + +## Form helper + +If you're using the Inertia [form helper](/guide/forms.md#form-helper), you can pass a unique form key as the first argument when instantiating your form. This will cause the form data and errors to automatically be remembered. + +:::tabs key:frameworks +== Vue + +```js +import { useForm } from '@inertiajs/vue3' + +const form = useForm('CreateUser', data) +const form = useForm(`EditUser:${props.user.id}`, data) +``` + +== React + +```js +import { useForm } from '@inertiajs/react' + +const form = useForm('CreateUser', data) +const form = useForm(`EditUser:${user.id}`, data) +``` + +== Svelte 4|Svelte 5 + +```js +import { useForm } from '@inertiajs/svelte' + +const form = useForm('CreateUser', data) +const form = useForm(`EditUser:${user.id}`, data) +``` + +::: + +## Manually saving state + +The `remember` property in Vue 2, and the `useRemember` hook in Vue 3, React, and Svelte all watch for data changes and automatically save those changes to the history state. Then, Inertia will restore the data on page load. + +However, it's also possible to manage this manually using the underlying `remember()` and `restore()` methods in Inertia. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +// Save local component state to history state... +router.remember(data, 'my-key') + +// Restore local component state from history state... +let data = router.restore('my-key') +``` + +== React + +```js +import { router } from '@inertiajs/react' + +// Save local component state to history state... +router.remember(data, 'my-key') + +// Restore local component state from history state... +let data = router.restore('my-key') +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +// Save local component state to history state... +router.remember(data, 'my-key') + +// Restore local component state from history state... +let data = router.restore('my-key') +``` + +::: diff --git a/docs/guide/responses.md b/docs/guide/responses.md new file mode 100644 index 0000000..c67d2d7 --- /dev/null +++ b/docs/guide/responses.md @@ -0,0 +1,228 @@ +# Responses + +## Creating responses + +Creating an Inertia response is simple. To get started, just use the `inertia` renderer in your controller methods, providing both the name of the [JavaScript page component](/guide/pages.md) that you wish to render, as well as any props (data) for the page. + +```ruby +class EventsController < ApplicationController + def show + event = Event.find(params[:id]) + + render inertia: 'Event/Show', props: { + event: event.as_json( + only: [:id, :title, :start_date, :description] + ) + } + end +end +``` + +Within Rails applications, the `Event/Show` page would typically correspond to the file located at `app/frontend/pages/Event/Show.(jsx|vue|svelte)`. + +> [!WARNING] +> To ensure that pages load quickly, only return the minimum data required for the page. Also, be aware that **all data returned from the controllers will be visible client-side**, so be sure to omit sensitive information. + +### Using instance variables as props + +Inertia enables the automatic passing of instance variables as props. This can be achieved by invoking the `use_inertia_instance_props` function in a controller or in a base controller from which other controllers inherit. + +```ruby +class EventsController < ApplicationController + use_inertia_instance_props + + def index + @events = Event.all + + render inertia: 'Events/Index' + end +end +``` + +This action automatically passes the `@events` instance variable as the `events` prop to the `Events/Index` page component. + +> [!NOTE] +> Manually providing any props for a response disables the instance props feature for that specific response. + +> [!NOTE] +> Instance props are only included if they are defined **after** the `use_inertia_instance_props` call, hence the order of `before_action` callbacks is crucial. + +### Automatically determine component name + +Rails conventions can be used to automatically render the correct page component by invoking `render inertia: true`: + +```ruby +class EventsController < ApplicationController + use_inertia_instance_props + + def index + @events = Event.all + + render inertia: true + end +end +``` + +This renders the `app/frontend/pages/events/index.(jsx|vue|svelte)` page component and passes the `@events` instance variable as the `events` prop. + +Setting the `default_render` configuration value to `true` establishes this as the default behavior: + +```ruby +InertiaRails.configure do |config| + config.default_render = true +end +``` + +```ruby +class EventsController < ApplicationController + use_inertia_instance_props + + def index + @events = Event.all + end +end +``` + +With this configuration, the `app/frontend/pages/events/index.(jsx|vue|svelte)` page component is rendered automatically, passing the `@events` instance variable as the `events` prop. + +## Root template data + +There are situations where you may want to access your prop data in your ERB template. For example, you may want to add a meta description tag, Twitter card meta tags, or Facebook Open Graph meta tags. You can access this data via the `page` method. + +```erb +# app/views/inertia.html.erb + +<% content_for(:head) do %> +"> +<% end %> + +
+``` + +Sometimes you may even want to provide data to the root template that will not be sent to your JavaScript page / component. This can be accomplished by passing the `view_data` option. + +```ruby +def show + event = Event.find(params[:id]) + + render inertia: 'Event', props: { event: }, view_data: { meta: event.meta } +end +``` + +You can then access this variable like a regular local variable. + +```erb +# app/views/inertia.html.erb + +<% content_for(:head) do %> +"> +<% end %> + +
+``` + +## Rails generators + +Gem `inertia_rails-contrib` provides a number of generators to help you get started with Inertia in your Rails application. You can generate controllers or use scaffolds to create a new resource with Inertia responses. + +### Scaffold generator + +To create a resource with Inertia responses, execute the following command in the terminal: + +```bash +bin/rails generate inertia:scaffold ModelName field1:type field2:type +``` + +Example output: + +```bash +$ bin/rails generate inertia:scaffold Post title:string body:text + invoke active_record + create db/migrate/20240611123952_create_posts.rb + create app/models/post.rb + invoke test_unit + create test/models/post_test.rb + create test/fixtures/posts.yml + invoke resource_route + route resources :posts + invoke scaffold_controller + create app/controllers/posts_controller.rb + invoke inertia_templates + create app/frontend/pages/Post + create app/frontend/pages/Post/Index.svelte + create app/frontend/pages/Post/Edit.svelte + create app/frontend/pages/Post/Show.svelte + create app/frontend/pages/Post/New.svelte + create app/frontend/pages/Post/Form.svelte + create app/frontend/pages/Post/Post.svelte + invoke resource_route + invoke test_unit + create test/controllers/posts_controller_test.rb + create test/system/posts_test.rb + invoke helper + create app/helpers/posts_helper.rb + invoke test_unit +``` + +#### Tailwind CSS integration + +Gem `inertia_rails-contrib` tries to detect the presence of Tailwind CSS in the application and generate the templates accordingly. If you want to specify templates type, use the `--inertia-templates` option: + +- `inertia_templates` - default +- `inertia_tw_templates` - Tailwind CSS + +### Controller generator + +To create a controller with an Inertia response, execute the following command in the terminal: + +```bash +bin/rails generate inertia:controller ControllerName action1 action2 +``` + +Example output: + +```bash +$ bin/rails generate inertia:controller pages welcome next_steps + create app/controllers/pages_controller.rb + route get 'pages/welcome' + get 'pages/next_steps' + invoke test_unit + create test/controllers/pages_controller_test.rb + invoke helper + create app/helpers/pages_helper.rb + invoke test_unit + invoke inertia_templates + create app/frontend/pages/Pages + create app/frontend/pages/Pages/Welcome.jsx + create app/frontend/pages/Pages/NextSteps.jsx +``` + +### Customizing the generator templates + +Rails generators allow templates customization. For example, to customize the controller generator view template, create a file `lib/templates/inertia_templates/controller/react/view.jsx.tt`: + +```jsx +export default function <%= @action.camelize %>() { + return ( +

Hello from my new default template

+ ); +} +``` + +You can find the default templates in the gem's source code: + +- [Default controller generator templates](https://github.com/skryukov/inertia_rails-contrib/tree/main/lib/generators/inertia_templates/controller/templates) +- [Default scaffold generator templates](https://github.com/skryukov/inertia_rails-contrib/tree/main/lib/generators/inertia_templates/scaffold/templates) +- [Tailwind controller generator templates](https://github.com/skryukov/inertia_rails-contrib/tree/main/lib/generators/inertia_tw_templates/controller/templates) +- [Tailwind scaffold generator templates](https://github.com/skryukov/inertia_rails-contrib/tree/main/lib/generators/inertia_tw_templates/scaffold/templates) + +> [!TIP] +> You can also replace the whole generator with your own implementation. See the [Rails documentation](https://guides.rubyonrails.org/generators.html#overriding-rails-generators) for more information. + +## Maximum response size + +To enable client-side history navigation, all Inertia server responses are stored in the browser's history state. However, keep in mind that some browsers impose a size limit on how much data can be saved within the history state. + +For example, [Firefox](https://developer.mozilla.org/en-US/docs/Web/API/History/pushState) has a size limit of 640k characters and throws a `NS_ERROR_ILLEGAL_VALUE` error if you exceed this limit. Typically, this is much more data than you'll ever practically need when building applications. diff --git a/docs/guide/routing.md b/docs/guide/routing.md new file mode 100644 index 0000000..9899e96 --- /dev/null +++ b/docs/guide/routing.md @@ -0,0 +1,38 @@ +# Routing + +## Defining routes + +When using Inertia, all of your application's routes are defined server-side. This means that you don't need Vue Router or React Router. Instead, you can simply define Rails routes and return Inertia responses from those routes. + +## Shorthand routes + +If you have a page that doesn't need a corresponding controller method, like an "FAQ" or "about" page, you can route directly to a component via the `inertia` method. + +```ruby +inertia 'about' => 'AboutComponent' +``` + +## Generating URLs + +Some server-side frameworks allow you to generate URLs from named routes. However, you will not have access to those helpers client-side. Here are a couple ways to still use named routes with Inertia. + +The first option is to generate URLs server-side and include them as props. Notice in this example how we're passing the `edit_url` and `create_url` to the `Users/Index` component. + +```ruby +class UsersController < ApplicationController + def index + render inertia: 'Users/Index', props: { + users: User.all.map do |user| + user.as_json( + only: [ :id, :name, :email ] + ).merge( + edit_url: edit_user_path(user) + ) + end, + create_url: new_user_path + } + end +end +``` + +Another option is to use the [`js_from_routes`](https://js-from-routes.netlify.app) gem, that makes named, server-side routes available on the client via a autogenerated helpers. diff --git a/docs/guide/scroll-management.md b/docs/guide/scroll-management.md new file mode 100644 index 0000000..c5139c5 --- /dev/null +++ b/docs/guide/scroll-management.md @@ -0,0 +1,155 @@ +# Scroll management + +## Scroll resetting + +When navigating between pages, Inertia mimics default browser behavior by automatically resetting the scroll position of the document body (as well as any [scroll regions](#scroll-regions) you've defined) back to the top. + +In addition, Inertia keeps track of the scroll position of each page and automatically restores that scroll position as you navigate forward and back in history. + +## Scroll preservation + +Sometimes it's desirable to prevent the default scroll resetting when making visits. You can disable this behaviour by setting the `preserveScroll` option to `false`. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.visit(url, { preserveScroll: false }) +``` + +== React + +```js +import { router } from '@inertiajs/react' + +router.visit(url, { preserveScroll: false }) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.visit(url, { preserveScroll: false }) +``` + +::: + +If you'd like to only preserve the scroll position if the response includes validation errors, set the `preserveScroll` option to `"errors"`. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.visit(url, { preserveScroll: 'errors' }) +``` + +== React + +```js +import { router } from '@inertiajs/react' + +router.visit(url, { preserveScroll: 'errors' }) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.visit(url, { preserveScroll: 'errors' }) +``` + +::: + +You can also lazily evaluate the `preserveScroll` option based on the response by providing a callback. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.post('/users', data, { + preserveScroll: (page) => page.props.someProp === 'value', +}) +``` + +== React + +```js +import { router } from '@inertiajs/react' + +router.post('/users', data, { + preserveScroll: (page) => page.props.someProp === 'value', +}) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.post('/users', data, { + preserveScroll: (page) => page.props.someProp === 'value', +}) +``` + +::: + +When using an [Inertia link](/guide/links), you can preserve the scroll position using the `preserveScroll` prop. + +:::tabs key:frameworks +== Vue + +```vue + + + +``` + +== React + +```jsx +import { Link } from '@inertiajs/react' + +export default () => ( + + Home + +) +``` + +== Svelte 4|Svelte 5 + +```svelte + + +Home + +Home +``` + +::: + +## Scroll regions + +If your app doesn't use document body scrolling, but instead has scrollable elements (using the `overflow` CSS property), scroll resetting will not work. + +In these situations, you must tell Inertia which scrollable elements to manage by adding the `scroll-region` attribute to the element. + +```html +
+ +
+``` diff --git a/docs/guide/server-side-rendering.md b/docs/guide/server-side-rendering.md new file mode 100644 index 0000000..27c49bc --- /dev/null +++ b/docs/guide/server-side-rendering.md @@ -0,0 +1,291 @@ +# Server-side Rendering (SSR) + +Server-side rendering pre-renders your JavaScript pages on the server, allowing your visitors to receive fully rendered HTML when they visit your application. Since fully rendered HTML is served by your application, it's also easier for search engines to index your site. + +> [!NOTE] +> Server-side rendering uses Node.js to render your pages in a background process; therefore, Node must be available on your server for server-side rendering to function properly. + +## Install dependencies + +First, install the additional dependencies required for server-side rendering. This is only necessary for the Vue adapters, so you can skip this step if you're using React or Svelte. + +:::tabs key:frameworks +== Vue + +```shell +npm install @vue/server-renderer +``` + +== React + +```shell +// No additional dependencies required +``` + +== Svelte 4|Svelte 5 + +```shell +// No additional dependencies required +``` + +::: + +## Add server entry-point + +Next, we'll create a `app/frontend/ssr/ssr.js` file within the Rails project that will serve as the SSR entry point. + +This file is going to look very similar to your regular inertia initialization file, except it's not going to run in the browser, but rather in Node.js. Here's a complete example. + +:::tabs key:frameworks +== Vue + +```js +import { createInertiaApp } from '@inertiajs/vue3' +import createServer from '@inertiajs/vue3/server' +import { renderToString } from '@vue/server-renderer' +import { createSSRApp, h } from 'vue' + +createServer((page) => + createInertiaApp({ + page, + render: renderToString, + resolve: (name) => { + const pages = import.meta.glob('../pages/**/*.vue', { eager: true }) + return pages[`../pages/${name}.vue`] + }, + setup({ App, props, plugin }) { + return createSSRApp({ + render: () => h(App, props), + }).use(plugin) + }, + }), +) +``` + +== React + +```js +import { createInertiaApp } from '@inertiajs/react' +import createServer from '@inertiajs/react/server' +import ReactDOMServer from 'react-dom/server' + +createServer((page) => + createInertiaApp({ + page, + render: ReactDOMServer.renderToString, + resolve: (name) => { + const pages = import.meta.glob('../pages/**/*.jsx', { eager: true }) + return pages[`../pages/${name}.jsx`] + }, + setup: ({ App, props }) => , + }), +) +``` + +== Svelte 4 + +```js +import { createInertiaApp } from '@inertiajs/svelte' +import createServer from '@inertiajs/svelte/server' + +createServer((page) => + createInertiaApp({ + page, + resolve: (name) => { + const pages = import.meta.glob('../pages/**/*.svelte', { eager: true }) + return pages[`../pages/${name}.svelte`] + }, + setup({ App, props }) { + return App.render(props) + }, + }), +) +``` + +== Svelte 5 + +```js +import { createInertiaApp } from '@inertiajs/svelte' +import createServer from '@inertiajs/svelte/server' +import { render } from 'svelte/server' + +createServer((page) => + createInertiaApp({ + page, + resolve: (name) => { + const pages = import.meta.glob('../pages/**/*.svelte', { eager: true }) + return pages[`../pages/${name}.svelte`] + }, + setup({ App, props }) { + return render(App, { props }) + }, + }), +) +``` + +::: + +When creating this file, be sure to add anything that's missing from your regular initialization file that makes sense to run in SSR mode, such as plugins or custom mixins. + +## Setup Vite Ruby + +Next, we need to update our Vite configuration to build our new `ssr.js` file. We can do this by adding a `ssrBuildEnabled` property to Ruby Vite plugin configuration in the `config/vite.json` file. + +```json + "production": { + "ssrBuildEnabled": true // [!code ++] + } +``` + +> [!NOTE] +> For more available properties see the [Ruby Vite documentation](https://vite-ruby.netlify.app/config/#ssr-options-experimental). + +## Enable SSR in the Inertia's Rails adapter + +```ruby +InertiaRails.configure do |config| + config.ssr_enabled = ViteRuby.config.ssr_build_enabled +end +``` + +Now you can build your server-side bundle. + +```shell +bin/vite build --ssr +``` + +## Running the SSR server + +Now that you have built both your client-side and server-side bundles, you should be able run the Node-based Inertia SSR server using the following command. + +```shell +bin/vite ssr +``` + +With the server running, you should be able to access your app within the browser with server-side rendering enabled. In fact, you should be able to disable JavaScript entirely and still navigate around your application. + +## Client side hydration + +Since your website is now being server-side rendered, you can instruct your client to "hydrate" the static markup and make it interactive instead of re-rendering all the HTML that we just generated. + +To enable client-side hydration, update your initialization file: + +:::tabs key:frameworks +== Vue + +```js +// frontend/entrypoints/inertia.js +import { createApp, h } from 'vue' // [!code --] +import { createSSRApp, h } from 'vue' // [!code ++] +import { createInertiaApp } from '@inertiajs/vue3' + +createInertiaApp({ + resolve: (name) => { + const pages = import.meta.glob('../pages/**/*.vue', { eager: true }) + return pages[`../pages/${name}.vue`] + }, + setup({ el, App, props, plugin }) { + createApp({ render: () => h(App, props) }) // [!code --] + createSSRApp({ render: () => h(App, props) }) // [!code ++] + .use(plugin) + .mount(el) + }, +}) +``` + +== React + +```js +// frontend/entrypoints/inertia.js +import { createInertiaApp } from '@inertiajs/react' +import { createRoot } from 'react-dom/client' // [!code --] +import { hydrateRoot } from 'react-dom/client' // [!code ++] + +createInertiaApp({ + resolve: (name) => { + const pages = import.meta.glob('../pages/**/*.jsx', { eager: true }) + return pages[`../pages/${name}.jsx`] + }, + setup({ el, App, props }) { + createRoot(el).render() // [!code --] + hydrateRoot(el, ) // [!code ++] + }, +}) +``` + +== Svelte 4 + +```js +// frontend/entrypoints/inertia.js +import { createInertiaApp } from '@inertiajs/svelte' + +createInertiaApp({ + resolve: (name) => { + const pages = import.meta.glob('../pages/**/*.svelte', { eager: true }) + return pages[`../pages/${name}.svelte`] + }, + setup({ el, App, props }) { + new App({ target: el, props }) // [!code --] + new App({ target: el, props, hydrate: true }) // [!code ++] + }, +}) +``` + +You will also need to set the `hydratable` compiler option to `true` in your `vite.config.js` file: + + +```js +// vite.config.js +import { svelte } from '@sveltejs/vite-plugin-svelte' +import laravel from 'laravel-vite-plugin' +import { defineConfig } from 'vite' + +export default defineConfig({ + plugins: [ + laravel.default({ + input: ['resources/css/app.css', 'resources/js/app.js'], + ssr: 'resources/js/ssr.js', + refresh: true, + }), + svelte(), // [!code --] + svelte({ // [!code ++] + // [!code ++] + compilerOptions: { // [!code ++] + // [!code ++] + hydratable: true, // [!code ++] + }, // [!code ++] + }), // [!code ++] + ], +}) +``` + +== Svelte 5 + + +```js +// frontend/entrypoints/inertia.js +import { createInertiaApp } from '@inertiajs/svelte' +import { mount } from 'svelte' // [!code --] +import { hydrate, mount } from 'svelte' // [!code ++] + +createInertiaApp({ + resolve: (name) => { + const pages = import.meta.glob('./Pages/**/*.svelte', { eager: true }) + return pages[`./Pages/${name}.svelte`] + }, + setup({ el, App, props }) { + mount(App, { target: el, props }) // [!code --] + if (el.dataset.serverRendered === 'true') { // [!code ++] + hydrate(App, { target: el, props }) // [!code ++] + } else { // [!code ++] + mount(App, { target: el, props }) // [!code ++] + } // [!code ++] + }, +}) +``` + +::: + +## Deployment + +When deploying your SSR enabled app to production, you'll need to build both the client-side (`application.js`) and server-side bundles (`ssr.js`), and then run the SSR server as a background process. diff --git a/docs/guide/server-side-setup.md b/docs/guide/server-side-setup.md new file mode 100644 index 0000000..f5e3b32 --- /dev/null +++ b/docs/guide/server-side-setup.md @@ -0,0 +1,188 @@ +# Server-side setup + +The first step when installing Inertia is to configure your server-side framework. Inertia maintains official server-side adapters for [Laravel](https://laravel.com) and [Ruby on Rails](https://rubyonrails.org). For other frameworks, please see the [community adapters](https://inertiajs.com/community-adapters). + +> [!NOTE] +> For the official Laravel adapter instructions, please see the [official documentation](https://inertiajs.com/server-side-setup). + +## Install dependencies + +First, install the Inertia server-side adapter gem and add to the application's Gemfile by executing: + +```bash +bundle add inertia_rails +``` + +## Rails generator + +If you plan to use Vite as your frontend build tool, you can use the `inertia_rails-contrib` gem to install and set up Inertia in a Rails application. It automatically detects if the [Vite Rails](https://vite-ruby.netlify.app/guide/rails.html) gem is installed and will attempt to install it if not present. + +To install and setup Inertia in a Rails application, execute the following command in the terminal: + +```bash +bundle add inertia_rails-contrib +bin/rails generate inertia:install +``` + +This command will: + +- Check for Vite Rails and install it if not present +- Ask if you want to use TypeScript +- Ask you to choose your preferred frontend framework (React, Vue, Svelte 4, or Svelte 5) +- Ask if you want to install Tailwind CSS +- Install necessary dependencies +- Set up the application to work with Inertia +- Copy example Inertia controller and views (can be skipped with the `--skip-example` option) + +> [!NOTE] +> To use TypeScript with Svelte, you need to install `@inertiajs/svelte` version `1.3.0-beta.2` or higher. You can use the `--inertia-version` option to specify the version. + +> [!NOTE] +> `inertia_rails-contrib` doesn't include [Rails scaffold generators](/guide/responses#rails-generators) for TypeScript yet. + +Example output: + +```bash +$ bin/rails generate inertia:install +Installing Inertia's Rails adapter +Could not find a package.json file to install Inertia to. +Would you like to install Vite Ruby? (y/n) y + run bundle add vite_rails from "." +Vite Rails gem successfully installed + run bundle exec vite install from "." +Vite Rails successfully installed +Would you like to use TypeScript? (y/n) y +Adding TypeScript support +What framework do you want to use with Inertia? [react, vue, svelte4, svelte] (react) + run npm add @types/react @types/react-dom typescript --silent from "." +Would you like to install Tailwind CSS? (y/n) y +Installing Tailwind CSS + run npm add tailwindcss postcss autoprefixer @tailwindcss/forms @tailwindcss/typography @tailwindcss/container-queries --silent from "." + create tailwind.config.js + create postcss.config.js + create app/frontend/entrypoints/application.css +Adding Tailwind CSS to the application layout + insert app/views/layouts/application.html.erb +Adding Inertia's Rails adapter initializer + create config/initializers/inertia_rails.rb +Installing Inertia npm packages + run npm add @vitejs/plugin-react react react-dom --silent from "." + run npm add @inertiajs/react@latest --silent from "." +Adding Vite plugin for react + insert vite.config.ts + prepend vite.config.ts +Copying inertia.ts entrypoint + create app/frontend/entrypoints/inertia.ts +Adding inertia.ts script tag to the application layout + insert app/views/layouts/application.html.erb +Adding Vite React Refresh tag to the application layout + insert app/views/layouts/application.html.erb + gsub app/views/layouts/application.html.erb +Copying example Inertia controller + create app/controllers/inertia_example_controller.rb +Adding a route for the example Inertia controller + route get 'inertia-example', to: 'inertia_example#index' +Copying page assets + create app/frontend/pages/InertiaExample.module.css + create app/frontend/assets/react.svg + create app/frontend/assets/inertia.svg + create app/frontend/assets/vite_ruby.svg + create app/frontend/pages/InertiaExample.tsx + create tsconfig.json + create tsconfig.app.json + create tsconfig.node.json + create app/frontend/vite-env.d.ts +Copying bin/dev + create bin/dev +Inertia's Rails adapter successfully installed +``` + +With that done, you can now start the Rails server and the Vite development server (we recommend using [Overmind](https://github.com/DarthSim/overmind)): + +```bash +bin/dev +``` + +And navigate to `http://localhost:3100/inertia-example` to see the example Inertia page. + +That's it! You're all set up to start using Inertia in your Rails application. Check the guide on [creating pages](/guide/pages) to know more. + +## Root template + +If you decide not to use the generator, you can manually set up Inertia in your Rails application. + +First, setup the root template that will be loaded on the first page visit. This will be used to load your site assets (CSS and JavaScript), and will also contain a root `
` to boot your JavaScript application in. + +:::tabs key:builders +== Vite + +```erb + + + + + <%= csp_meta_tag %> + + <%= inertia_headers %> + + <%# If you want to use React add `vite_react_refresh_tag` %> + <%= vite_client_tag %> + <%= vite_javascript_tag 'application' %> + + + + <%= yield %> + + +``` + +== Webpacker/Shakapacker + +```erb + + + + + <%= csp_meta_tag %> + + <%= inertia_headers %> + + <%= stylesheet_pack_tag 'application' %> + <%= javascript_pack_tag 'application', defer: true %> + + + <%= yield %> + + +``` + +::: + +This template should include your assets, as well as the `yield` method to render the Inertia page. The `inertia_headers` method is used to include the Inertia headers in the response, it's required when [SSR](/guide/server-side-rendering.md) is enabled. + +Inertia's adapter will use standard Rails layout inheritance, with `view/layouts/application.html.erb` as a default layout. If you would like to use a different default layout, you can change it using the `InertiaRails.configure`. + +```ruby +# config/initializers/inertia_rails.rb +InertiaRails.configure do |config| + config.layout = 'my_inertia_layout' +end +``` + +# Creating responses + +That's it, you're all ready to go server-side! Once you setup the [client-side](/guide/client-side-setup.md) framework, you can start start creating Inertia [pages](/guide/pages.md) and rendering them via [responses](/guide/responses.md). + +```ruby +class EventsController < ApplicationController + def show + event = Event.find(params[:id]) + + render inertia: 'Event/Show', props: { + event: event.as_json( + only: [:id, :title, :start_date, :description] + ) + } + end +end +``` diff --git a/docs/guide/shared-data.md b/docs/guide/shared-data.md new file mode 100644 index 0000000..e3781e9 --- /dev/null +++ b/docs/guide/shared-data.md @@ -0,0 +1,246 @@ +# Shared data + +Sometimes you need to access specific pieces of data on numerous pages within your application. For example, you may need to display the current user in the site header. Passing this data manually in each response across your entire application is cumbersome. Thankfully, there is a better option: shared data. + +## Sharing data + +Inertia's Rails adapter comes with the `shared_data` controller method. This method allows you to define shared data that will be automatically merged with the page props provided in your controller. + +```ruby +class EventsController < ApplicationController + # share synchronously + inertia_share app_name: env['app.name'] + + # share lazily, evaluated at render time + inertia_share do + if logged_in? + { + user: logged_in_user, + } + end + end + + # share lazily alternate syntax + inertia_share user_count: lambda { User.count } +end +``` + +> [!NOTE] +> Shared data should be used sparingly as all shared data is included with every response. + +> [!NOTE] +> Page props and shared data are merged together, so be sure to namespace your shared data appropriately to avoid collisions. + +## Accessing shared data + +Once you have shared the data server-side, you will be able to access it within any of your pages or components. Here's an example of how to access shared data in a layout component. + +:::tabs key:frameworks +== Vue + +```vue + + + +``` + +== React + +```jsx +import { usePage } from '@inertiajs/react' + +export default function Layout({ children }) { + const { auth } = usePage().props + + return ( +
+
You are logged in as: {auth.user.name}
+
{children}
+
+ ) +} +``` + +== Svelte 4|Svelte 5 + +```svelte + + +
+
+ You are logged in as: {$page.props.auth.user.name} +
+
+ +
+
+``` + +::: + +# Flash messages + +Another great use-case for shared data is flash messages. These are messages stored in the session only for the next request. For example, it's common to set a flash message after completing a task and before redirecting to a different page. + +Here's a simple way to implement flash messages in your Inertia applications. First, share the flash message on each request. + +```ruby +class ApplicationController < ActionController::Base + inertia_share flash: -> { flash.to_hash } +end +``` + +Next, display the flash message in a frontend component, such as the site layout. + +:::tabs key:frameworks +== Vue + +```vue + +``` + +== React + +```jsx +import { usePage } from '@inertiajs/react' + +export default function Layout({ children }) { + const { flash } = usePage().props + + return ( +
+
+
+ {flash.alert &&
{flash.alert}
} + {flash.notice &&
{flash.notice}
} + {children} +
+
+
+ ) +} +``` + +== Svelte 4|Svelte 5 + +```svelte + + +
+
+
+ {#if $page.props.flash.alert} +
{$page.props.flash.alert}
+ {/if} + {#if $page.props.flash.notice} +
{$page.props.flash.notice}
+ {/if} + +
+
+
+``` + +::: + +## Deep Merging Shared Data + +By default, Inertia will shallow merge data defined in an action with the shared data. You might want a deep merge. Imagine using shared data to represent defaults you'll override sometimes. + +```ruby +class ApplicationController + inertia_share do + { basketball_data: { points: 50, rebounds: 100 } } + end +end +``` + +Let's say we want a particular action to change only part of that data structure. The renderer accepts a `deep_merge` option: + +```ruby +class CrazyScorersController < ApplicationController + def index + render inertia: 'CrazyScorersComponent', + props: { basketball_data: { points: 100 } }, + deep_merge: true + end +end + +# The renderer will send this to the frontend: +{ + basketball_data: { + points: 100, + rebounds: 100, + } +} +``` + +Deep merging can be set as the project wide default via the `InertiaRails` configuration: + +```ruby +# config/initializers/some_initializer.rb +InertiaRails.configure do |config| + config.deep_merge_shared_data = true +end + +``` + +If deep merging is enabled by default, it's possible to opt out within the action: + +```ruby +class CrazyScorersController < ApplicationController + inertia_share do + { + basketball_data: { + points: 50, + rebounds: 10, + } + } + end + + def index + render inertia: 'CrazyScorersComponent', + props: { basketball_data: { points: 100 } }, + deep_merge: false + end +end + +# Even if deep merging is set by default, since the renderer has `deep_merge: false`, it will send a shallow merge to the frontend: +{ + basketball_data: { + points: 100, + } +} +``` diff --git a/docs/guide/testing.md b/docs/guide/testing.md new file mode 100644 index 0000000..02851bd --- /dev/null +++ b/docs/guide/testing.md @@ -0,0 +1,70 @@ +# Testing + +There are many different ways to test an Inertia.js app. This page provides a quick overview of the tools available. + +## End-to-end tests + +One popular approach to testing your JavaScript page components, is to use an end-to-end testing tool like [Capybara](https://github.com/teamcapybara/capybara) or [Cypress](https://www.cypress.io). These are browser automation tools that allow you to run real simulations of your app in the browser. These tests are known to be slower, and sometimes brittle, but since they test your application at the same layer as your end users, they can provide a lot of confidence that your app is working correctly. And, since these tests are run in the browser your JavaScript code is actually executed and tested as well. + +## Client-side unit tests + +Another approach to testing your page components is using a client-side unit testing framework, such as [Vitest](https://vitest.dev), [Jest](https://jestjs.io) or [Mocha](https://mochajs.org). This approach allows you to test your JavaScript page components in isolation using Node.js. + +## Endpoint tests + +In addition to testing your JavaScript page components, you'll also want to test the Inertia responses that come back from your server-side framework. A popular approach to doing this is using endpoint tests, where you make requests to your application and examine the responses. + +If you're using RSpec, Inertia Rails comes with some nice test helpers to make things simple. + +To use these helpers, just add the following require statement to your `spec/rails_helper.rb` + +```ruby +require 'inertia_rails/rspec' +``` + +And in any test you want to use the inertia helpers, add the `:inertia` flag to the block. + +```ruby +# spec/requests/events_spec.rb +RSpec.describe "/events", inertia: true do + describe '#index' do + # ... + end +end +``` + +### Assertions + +```ruby +# spec/requests/events_spec.rb +RSpec.describe '/events', inertia: true do + describe '#index' do + let!(:event) { Event.create!(title: 'Foo', start_date: '2024-02-21', description: 'Foo bar') } + + it "renders inertia component" do + get events_path + + # check the component + expect(inertia).to render_component 'Event/Index' + # or + expect_inertia.to render_component 'Event/Index' + # same as above + expect(inertia.component).to eq 'Event/Index' + + # props (including shared props) + expect(inertia).to have_exact_props({title: 'Foo', description: 'Foo bar'}) + expect(inertia).to include_props({title: 'Foo'}) + + # access props + expect(inertia.props[:title]).to eq 'Foo' + + # view data + expect(inertia).to have_exact_view_data({meta: 'Foo bar'}) + expect(inertia).to include_view_data({meta: 'Foo bar'}) + + # access view data + expect(inertia.view_data[:meta]).to eq 'Foo bar' + end + end +end +``` diff --git a/docs/guide/the-protocol.md b/docs/guide/the-protocol.md new file mode 100644 index 0000000..1145d21 --- /dev/null +++ b/docs/guide/the-protocol.md @@ -0,0 +1,147 @@ +# The protocol + +This page contains a detailed specification of the Inertia protocol. Be sure to read the [how it works](/guide/how-it-works.md) page first for a high-level overview. + +## HTML responses + +The very first request to an Inertia app is just a regular, full-page browser request, with no special Inertia headers or data. For these requests, the server returns a full HTML document. + +This HTML response includes the site assets (CSS, JavaScript) as well as a root `
` in the page's body. The root `
` serves as a mounting point for the client-side app, and includes a `data-page` attribute with a JSON encoded [page object] for the initial page. Inertia uses this information to boot your client-side framework and display the initial page component. + +```http +REQUEST +GET: http://example.com/events/80 +Accept: text/html, application/xhtml+xml + + +RESPONSE +HTTP/1.1 200 OK +Content-Type: text/html; charset=utf-8 + + + + My app + + + + + +
+ + + +``` + +> [!NOTE] +> While the initial response is HTML, Inertia does not server-side render the JavaScript page components. + +## Inertia responses + +Once the Inertia app has been booted, all subsequent requests to the site are made via XHR with a `X-Inertia` header set to `true`. This header indicates that the request is being made by Inertia and isn't a standard full-page visit. + +When the server detects the `X-Inertia` header, instead of responding with a full HTML document, it returns a JSON response with an encoded [page object]. + +```http +REQUEST +GET: http://example.com/events/80 +Accept: text/html, application/xhtml+xml +X-Requested-With: XMLHttpRequest +X-Inertia: true +X-Inertia-Version: 6b16b94d7c51cbe5b1fa42aac98241d5 + +RESPONSE +HTTP/1.1 200 OK +Content-Type: application/json +Vary: X-Inertia +X-Inertia: true + +{ + "component": "Event", + "props": { + "event": { + "id": 80, + "title": "Birthday party", + "start_date": "2019-06-02", + "description": "Come out and celebrate Jonathan's 36th birthday party!" + } + }, + "url": "/events/80", + "version": "c32b8e4965f418ad16eaebba1d4e960f" +} +``` + +## The page object + +Inertia shares data between the server and client via a page object. This object includes the necessary information required to render the page component, update the browser's history state, and track the site's asset version. The page object includes the following four properties: + +1. `component`: The name of the JavaScript page component. +2. `props`: The page props (data). +3. `url`: The page URL. +4. `version`: The current asset version. + +On standard full page visits, the page object is JSON encoded into the `data-page` attribute in the root `
`. On Inertia visits, the page object is returned as the JSON payload. + +## Asset versioning + +One common challenge with single-page apps is refreshing site assets when they've been changed. Inertia makes this easy by optionally tracking the current version of the site's assets. In the event that an asset changes, Inertia will automatically make a full-page visit instead of an XHR visit. + +The Inertia [page object] includes a `version` identifier. This version identifier is set server-side and can be a number, string, file hash, or any other value that represents the current "version" of your site's assets, as long as the value changes when the site's assets have been updated. + +Whenever an Inertia request is made, Inertia will include the current asset version in the `X-Inertia-Version` header. When the server receives the request, it compares the asset version provided in the `X-Inertia-Version` header with the current asset version. This is typically handled in the middleware layer of your server-side framework. + +If the asset versions are the same, the request simply continues as expected. However, if the asset versions are different, the server immediately returns a `409 Conflict` response, and includes the URL in a `X-Inertia-Location` header. This header is necessary, since server-side redirects may have occurred. This tells Inertia what the final intended destination URL is. + +Note, `409 Conflict` responses are only sent for `GET` requests, and not for `POST/PUT/PATCH/DELETE` requests. That said, they will be sent in the event that a `GET` redirect occurs after one of these requests. + +If "flash" session data exists when a `409 Conflict` response occurs, Inertia's server-side framework adapters will automatically reflash this data. + +```http +REQUEST +GET: http://example.com/events/80 +Accept: text/html, application/xhtml+xml +X-Requested-With: XMLHttpRequest +X-Inertia: true +X-Inertia-Version: 6b16b94d7c51cbe5b1fa42aac98241d5 + +RESPONSE +409: Conflict +X-Inertia-Location: http://example.com/events/80 +``` + +## Partial reloads + +When making Inertia requests, the partial reload option allows you to request a subset of the props (data) from the server on subsequent visits to the same page component. This can be a helpful performance optimization if it's acceptable that some page data becomes stale. + +When a partial reload request is made, Inertia includes two additional headers with the request: `X-Inertia-Partial-Data` and `X-Inertia-Partial-Component`. + +The `X-Inertia-Partial-Data` header is a comma separated list of the desired props (data) keys that should be returned. + +The `X-Inertia-Partial-Component` header includes the name of the component that is being partially reloaded. This is necessary, since partial reloads only work for requests made to the same page component. If the final destination is different for some reason (eg. the user was logged out and is now on the login page), then no partial reloading will occur. + +```http +REQUEST +GET: http://example.com/events +Accept: text/html, application/xhtml+xml +X-Requested-With: XMLHttpRequest +X-Inertia: true +X-Inertia-Version: 6b16b94d7c51cbe5b1fa42aac98241d5 +X-Inertia-Partial-Data: events +X-Inertia-Partial-Component: Events + +RESPONSE +HTTP/1.1 200 OK +Content-Type: application/json + +{ + "component": "Events", + "props": { + "auth": {...}, // NOT included + "categories": [...], // NOT included + "events": [...] // included + }, + "url": "/events/80", + "version": "c32b8e4965f418ad16eaebba1d4e960f" +} +``` + +[page object]: #the-page-object diff --git a/docs/guide/title-and-meta.md b/docs/guide/title-and-meta.md new file mode 100644 index 0000000..00745de --- /dev/null +++ b/docs/guide/title-and-meta.md @@ -0,0 +1,346 @@ +# Title & meta + +Since Inertia powered JavaScript apps are rendered within the document ``, they are unable to render markup to the document ``, as it's outside of their scope. To help with this, Inertia ships with a `` component which can be used to set the page ``, `<meta>` tags, and other `<head>` elements. + +> [!NOTE] +> The `<Head>` component will only replace `<head>` elements that are not in your server-side layout. + +> [!NOTE] +> The `<Head>` component is not available in the Svelte adapter, as Svelte already ships with its own `<svelte:head>` component. + +## Head component + +To add `<head>` elements to your page, use the `<Head>` component. Within this component, you can include the elements that you wish to add to the document `<head>`. + +:::tabs key:frameworks +== Vue + +```vue +<script setup> +import { Head } from '@inertiajs/vue3' +</script> + +<template> + <Head> + <title>Your page title + + + +``` + +== React + +```jsx +import { Head } from '@inertiajs/react' + +export default () => ( + + Your page title + + +) +``` + +== Svelte 4|Svelte 5 + +```svelte + + Your page title + + +``` + +> [!NOTE] +> The `` component is provided by Svelte. + +::: + +Title shorthand + +If you only need to add a `` to the document `<head>`, you may simply pass the title as a prop to the `<Head>` component. + +:::tabs key:frameworks +== Vue + +```vue +<script setup> +import { Head } from '@inertiajs/vue3' +</script> + +<template> + <Head title="Your page title" /> +</template> +``` + +== React + +```jsx +import { Head } from '@inertiajs/react' + +export default () => <Head title="Your page title" /> +``` + +== Svelte 4|Svelte 5 + +```js +// Not supported +``` + +::: + +## Title callback + +You can globally modify the page `<title>` using the title callback in the `createInertiaApp` setup method. Typically, this method is invoked in your application's main JavaScript file. A common use case for the title callback is automatically adding an app name before or after each page title. + +```js +createInertiaApp({ + title: (title) => `${title} - My App`, + // ... +}) +``` + +After defining the title callback, the callback will automatically be invoked when you set a title using the `<Head>` component. + +:::tabs key:frameworks +== Vue + +```vue +<script setup> +import { Head } from '@inertiajs/vue3' +</script> + +<template> + <Head title="Home" /> +</template> +``` + +== React + +```jsx +import { Head } from '@inertiajs/react' + +export default () => <Head title="Home" /> +``` + +== Svelte 4|Svelte 5 + +```js +// Not supported +``` + +::: + +Which, in this example, will result in the following `<title>` tag. + +```html +<title>Home - My App +``` + +The `title` callback will also be invoked when you set the title using a `` tag within your `<Head>` component. + +:::tabs key:frameworks +== Vue + +```vue +<script setup> +import { Head } from '@inertiajs/vue3' +</script> + +<template> + <Head> + <title>Home + + +``` + +== React + +```jsx +import { Head } from '@inertiajs/react' + +export default () => ( + + Home + +) +``` + +== Svelte 4|Svelte 5 + +```js +// Not supported +``` + +::: + +# Multiple Head instances + +It's possible to have multiple instances of the `` component throughout your application. For example, your layout can set some default `` elements, and then your individual pages can override those defaults. + +:::tabs key:frameworks +== Vue + +```vue + + + + + + + + + +``` + +== React + +```jsx +// Layout.jsx +import { Head } from '@inertiajs/react' + +export default () => ( + + My app + + + +) + +// About.jsx +import { Head } from '@inertiajs/react' + +export default () => ( + + About - My app + + +) +``` + +== Svelte 4|Svelte 5 + +```js +// Not supported +``` + +::: + +Inertia will only ever render one `` tag; however, all other tags will be stacked since it's valid to have multiple instances of them. To avoid duplicate tags in your `<head>`, you can use the `head-key` property, which will make sure the tag is only rendered once. This is illustrated in the example above for the `<meta name="description">` tag. + +The code example above will render the following HTML. + +```html +<head> + <link rel="icon" type="image/svg+xml" href="/favicon.svg" /> + <title>About - My app + + +``` + +### Head extension + +When building a real application, it can sometimes be helpful to create a custom head component that extends Inertia's `` component. This gives you a place to set app-wide defaults, such as appending the app name to the page title. + +:::tabs key:frameworks +== Vue + +```vue + + + + +``` + +== React + +```jsx +// AppHead.jsx +import { Head } from '@inertiajs/react' + +export default ({ title, children }) => { + return ( + + {title ? `${title} - My App` : 'My App'} + {children} + + ) +} +``` + +== Svelte 4|Svelte 5 + +```js +// Not supported +``` + +::: + +Once you have created the custom component, you may simply start using the custom component in your pages. + +:::tabs key:frameworks +== Vue + +```vue + + + +``` + +== React + +```jsx +import AppHead from './AppHead' + +export default () => +``` + +== Svelte 4|Svelte 5 + +```js +// Not supported +``` + +::: diff --git a/docs/guide/validation.md b/docs/guide/validation.md new file mode 100644 index 0000000..9172322 --- /dev/null +++ b/docs/guide/validation.md @@ -0,0 +1,229 @@ +# Validation + +## How it works + +Handling server-side validation errors in Inertia works differently than a classic XHR-driven form that requires you to catch the validation errors from `422` responses and manually update the form's error state - because Inertia never receives `422` responses. Instead, Inertia operates much more like a standard full page form submission. Here's how: + +First, you [submit your form using Inertia](/guide/forms.md). If there are server-side validation errors, you don't return those errors as a `422` JSON response. Instead, you redirect (server-side) the user back to the form page they were previously on, flashing the validation errors in the session. + +```ruby +class UsersController < ApplicationController + def create + user = User.new(user_params) + + if user.save + redirect_to users_url + else + redirect_to new_user_url, inertia: { errors: user.errors } + end + end + + private + + def user_params + params.require(:user).permit(:name, :email) + end +end +``` + +Next, any time these validation errors are present in the session, they automatically get shared with Inertia, making them available client-side as page props which you can display in your form. Since props are reactive, they are automatically shown when the form submission completes. + +Finally, since Inertia apps never generate `422` responses, Inertia needs another way to determine if a response includes validation errors. To do this, Inertia checks the `page.props.errors` object for the existence of any errors. In the event that errors are present, the request's `onError()` callback will be called instead of the `onSuccess()` callback. + +## Sharing errors + +In order for your server-side validation errors to be available client-side, your server-side framework must share them via the `errors` prop. Inertia's Rails adapter do this automatically. + +## Displaying errors + +Since validation errors are made available client-side as page component props, you can conditionally display them based on their existence. Remember, when using Rails server adapter, the `errors` prop will automatically be available to your page. + +:::tabs key:frameworks +== Vue + +```vue + + + +``` + +> [!NOTE] +> When using the Vue adapters, you may also access the errors via the `$page.props.errors` object. + +== React + +```jsx +import { useState } from 'react' +import { router, usePage } from '@inertiajs/react' + +export default function Edit() { + const { errors } = usePage().props + + const [values, setValues] = useState({ + first_name: null, + last_name: null, + email: null, + }) + + function handleChange(e) { + setValues((values) => ({ + ...values, + [e.target.id]: e.target.value, + })) + } + + function handleSubmit(e) { + e.preventDefault() + router.post('/users', values) + } + + return ( +
+ + + {errors.first_name &&
{errors.first_name}
} + + + {errors.last_name &&
{errors.last_name}
} + + + {errors.email &&
{errors.email}
} + +
+ ) +} +``` + +== Svelte 4|Svelte 5 + +```svelte + + +
+ + + {#if errors.first_name}
{errors.first_name}
{/if} + + + + {#if errors.last_name}
{errors.last_name}
{/if} + + + + {#if errors.email}
{errors.email}
{/if} + + +
+``` + +::: + +## Repopulating input + +While handling errors in Inertia is similar to full page form submissions, Inertia offers even more benefits. In fact, you don't even need to manually repopulate old form input data. + +When validation errors occur, the user is typically redirected back to the form page they were previously on. And, by default, Inertia automatically preserves the [component state](/guide/manual-visits.md#state-preservation) for `post`, `put`, `patch`, and `delete` requests. Therefore, all the old form input data remains exactly as it was when the user submitted the form. + +So, the only work remaining is to display any validation errors using the `errors` prop. + +## Error bags + +> [!NOTE] +> If you're using the [form helper](/guide/forms.md), it's not necessary to use error bags since validation errors are automatically scoped to the form object making the request. + +For pages that have more than one form, it's possible to encounter conflicts when displaying validation errors if two forms share the same field names. For example, imagine a "create company" form and a "create user" form that both have a `name` field. Since both forms will be displaying the `page.props.errors.name` validation error, generating a validation error for the `name` field in either form will cause the error to appear in both forms. + +To solve this issue, you can use "error bags". Error bags scope the validation errors returned from the server within a unique key specific to that form. Continuing with our example above, you might have a `createCompany` error bag for the first form and a `createUser` error bag for the second form. + +:::tabs key:frameworks +== Vue + +```js +import { router } from '@inertiajs/vue3' + +router.post('/companies', data, { + errorBag: 'createCompany', +}) + +router.post('/users', data, { + errorBag: 'createUser', +}) +``` + +== React + +```jsx +import { router } from '@inertiajs/react' + +router.post('/companies', data, { + errorBag: 'createCompany', +}) + +router.post('/users', data, { + errorBag: 'createUser', +}) +``` + +== Svelte 4|Svelte 5 + +```js +import { router } from '@inertiajs/svelte' + +router.post('/companies', data, { + errorBag: 'createCompany', +}) + +router.post('/users', data, { + errorBag: 'createUser', +}) +``` + +::: + +Specifying an error bag will cause the validation errors to come back from the server within `page.props.errors.createCompany` and `page.props.errors.createUser`. diff --git a/docs/guide/who-is-it-for.md b/docs/guide/who-is-it-for.md new file mode 100644 index 0000000..88d829b --- /dev/null +++ b/docs/guide/who-is-it-for.md @@ -0,0 +1,13 @@ +# Who is Inertia.js for? + +Inertia was crafted for development teams and solo hackers who typically build server-side rendered applications using frameworks like Laravel, Ruby on Rails, or Django. You're used to creating controllers, retrieving data from the database (via an ORM), and rendering views. + +But what happens when you want to replace your server-side rendered views with a modern, JavaScript-based single-page application frontend? The answer is always "you need to build an API". Because that's how modern SPAs are built. + +This means building a REST or GraphQL API. It means figuring out authentication and authorization for that API. It means client-side state management. It means setting up a new Git repository. It means a more complicated deployment strategy. And this list goes on. It's a complete paradigm shift, and often a complete mess. We think there is a better way. + +**Inertia empowers you to build a modern, JavaScript-based single-page application without the tiresome complexity.** + +Inertia works just like a classic server-side rendered application. You create controllers, you get data from the database (via your ORM), and you render views. But, Inertia views are JavaScript page components written in React, Vue, or Svelte. + +This means you get all the power of a client-side application and modern SPA experience, but you don't need to build an API. We think it's a breath of fresh air that will supercharge your productivity. diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..52970e0 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,20 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + name: 'Inertia.js Rails' + text: 'Build single-page apps, without building an API.' + tagline: |- + Create modern single-page React, Vue, and Svelte apps using classic server-side routing. + actions: + - theme: brand + text: Get Started + link: /guide + - theme: alt + text: Install + link: /guide/server-side-setup + image: + src: /logo.svg + alt: Inertia.js Logo +--- diff --git a/docs/package-lock.json b/docs/package-lock.json new file mode 100644 index 0000000..a803c9e --- /dev/null +++ b/docs/package-lock.json @@ -0,0 +1,2715 @@ +{ + "name": "docs", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "markdown-it-container": "^4.0.0", + "prettier": "^3.3.3", + "prettier-plugin-organize-imports": "^4.1.0", + "prettier-plugin-svelte": "^3.2.7", + "prettier-plugin-tailwindcss": "^0.6.8", + "prettier-plugin-vue": "^1.1.6", + "vitepress": "^1.2.2", + "vitepress-plugin-tabs": "^0.5.0", + "vue": "^3.4.27" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", + "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", + "@algolia/autocomplete-shared": "1.9.3" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", + "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", + "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", + "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", + "dev": true, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/cache-browser-local-storage": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.24.0.tgz", + "integrity": "sha512-t63W9BnoXVrGy9iYHBgObNXqYXM3tYXCjDSHeNwnsc324r4o5UiVKUiAB4THQ5z9U5hTj6qUvwg/Ez43ZD85ww==", + "dev": true, + "dependencies": { + "@algolia/cache-common": "4.24.0" + } + }, + "node_modules/@algolia/cache-common": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.24.0.tgz", + "integrity": "sha512-emi+v+DmVLpMGhp0V9q9h5CdkURsNmFC+cOS6uK9ndeJm9J4TiqSvPYVu+THUP8P/S08rxf5x2P+p3CfID0Y4g==", + "dev": true + }, + "node_modules/@algolia/cache-in-memory": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.24.0.tgz", + "integrity": "sha512-gDrt2so19jW26jY3/MkFg5mEypFIPbPoXsQGQWAi6TrCPsNOSEYepBMPlucqWigsmEy/prp5ug2jy/N3PVG/8w==", + "dev": true, + "dependencies": { + "@algolia/cache-common": "4.24.0" + } + }, + "node_modules/@algolia/client-account": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.24.0.tgz", + "integrity": "sha512-adcvyJ3KjPZFDybxlqnf+5KgxJtBjwTPTeyG2aOyoJvx0Y8dUQAEOEVOJ/GBxX0WWNbmaSrhDURMhc+QeevDsA==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/client-search": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-account/node_modules/@algolia/client-common": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", + "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-account/node_modules/@algolia/client-search": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", + "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.24.0.tgz", + "integrity": "sha512-y8jOZt1OjwWU4N2qr8G4AxXAzaa8DBvyHTWlHzX/7Me1LX8OayfgHexqrsL4vSBcoMmVw2XnVW9MhL+Y2ZDJXg==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/client-search": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-analytics/node_modules/@algolia/client-common": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", + "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-analytics/node_modules/@algolia/client-search": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", + "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.11.0.tgz", + "integrity": "sha512-6LAAQxMoxzYf3wk7HKee4YFNYYq56ifKz6g7JWAY2HGya20KQmDec2pQ8t4C90kUvGk69o8RVpHWoeT/wfBXbw==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.24.0.tgz", + "integrity": "sha512-l5FRFm/yngztweU0HdUzz1rC4yoWCFo3IF+dVIVTfEPg906eZg5BOd1k0K6rZx5JzyyoP4LdmOikfkfGsKVE9w==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-personalization/node_modules/@algolia/client-common": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", + "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.11.0.tgz", + "integrity": "sha512-jP94/rojiSzUTilBqPQSfidNw8KZzzKkkrUL4kPeukTqpkZdWLB0W7OtDcqOLd4vBA7FXkEFGiRaj3WQemyLhw==", + "dev": true, + "peer": true, + "dependencies": { + "@algolia/client-common": "5.11.0", + "@algolia/requester-browser-xhr": "5.11.0", + "@algolia/requester-fetch": "5.11.0", + "@algolia/requester-node-http": "5.11.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/logger-common": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.24.0.tgz", + "integrity": "sha512-LLUNjkahj9KtKYrQhFKCzMx0BY3RnNP4FEtO+sBybCjJ73E8jNdaKJ/Dd8A/VA4imVHP5tADZ8pn5B8Ga/wTMA==", + "dev": true + }, + "node_modules/@algolia/logger-console": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.24.0.tgz", + "integrity": "sha512-X4C8IoHgHfiUROfoRCV+lzSy+LHMgkoEEU1BbKcsfnV0i0S20zyy0NLww9dwVHUWNfPPxdMU+/wKmLGYf96yTg==", + "dev": true, + "dependencies": { + "@algolia/logger-common": "4.24.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.24.0.tgz", + "integrity": "sha512-P9kcgerfVBpfYHDfVZDvvdJv0lEoCvzNlOy2nykyt5bK8TyieYyiD0lguIJdRZZYGre03WIAFf14pgE+V+IBlw==", + "dev": true, + "dependencies": { + "@algolia/cache-browser-local-storage": "4.24.0", + "@algolia/cache-common": "4.24.0", + "@algolia/cache-in-memory": "4.24.0", + "@algolia/client-common": "4.24.0", + "@algolia/client-search": "4.24.0", + "@algolia/logger-common": "4.24.0", + "@algolia/logger-console": "4.24.0", + "@algolia/requester-browser-xhr": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/requester-node-http": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/recommend/node_modules/@algolia/client-common": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", + "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/recommend/node_modules/@algolia/client-search": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", + "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/recommend/node_modules/@algolia/requester-browser-xhr": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.24.0.tgz", + "integrity": "sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.24.0" + } + }, + "node_modules/@algolia/recommend/node_modules/@algolia/requester-node-http": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.24.0.tgz", + "integrity": "sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.24.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.11.0.tgz", + "integrity": "sha512-koy3lcWUrtUUfmMaDV/7zvZA7WGCFuBM+9t6KUfz93NTOmP6nQ6zcvAD66G0E1uapzj0S5Z6CA6Nd0Q5nVetcg==", + "dev": true, + "peer": true, + "dependencies": { + "@algolia/client-common": "5.11.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-common": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.24.0.tgz", + "integrity": "sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA==", + "dev": true + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.11.0.tgz", + "integrity": "sha512-kuQGSBfDwSW0uXT0GqbwEsvQNDwmgsw2gZp1TG+IR61TExHmnL1nqgsoAIrxV86O2uXlwtrkrBDW0qDbGW4BHg==", + "dev": true, + "peer": true, + "dependencies": { + "@algolia/client-common": "5.11.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.11.0.tgz", + "integrity": "sha512-7XiZuTbLmPQM5zIIEqqABU1rvpN61+qSaMPfPAiB1hhARno8Ak6/GddR1OaRTPmV/GA72AQknxYocCqUxemwzg==", + "dev": true, + "peer": true, + "dependencies": { + "@algolia/client-common": "5.11.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/transporter": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.24.0.tgz", + "integrity": "sha512-86nI7w6NzWxd1Zp9q3413dRshDqAzSbsQjhcDhPIatEFiZrL1/TjnHL8S7jVKFePlIMzDsZWXAXwXzcok9c5oA==", + "dev": true, + "dependencies": { + "@algolia/cache-common": "4.24.0", + "@algolia/logger-common": "4.24.0", + "@algolia/requester-common": "4.24.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.1.tgz", + "integrity": "sha512-reoQYNiAJreZNsJzyrDNzFQ+IQ5JFiIzAHJg9bn94S3l+4++J7RsIhNMoB+lgP/9tpmiAQqspv+xfdxTSzREOw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.26.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@docsearch/css": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.6.2.tgz", + "integrity": "sha512-vKNZepO2j7MrYBTZIGXvlUOIR+v9KRf70FApRgovWrj3GTs1EITz/Xb0AOlm1xsQBp16clVZj1SY/qaOJbQtZw==", + "dev": true + }, + "node_modules/@docsearch/js": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.6.2.tgz", + "integrity": "sha512-pS4YZF+VzUogYrkblCucQ0Oy2m8Wggk8Kk7lECmZM60hTbaydSIhJTTiCrmoxtBqV8wxORnOqcqqOfbmkkQEcA==", + "dev": true, + "dependencies": { + "@docsearch/react": "3.6.2", + "preact": "^10.0.0" + } + }, + "node_modules/@docsearch/react": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.6.2.tgz", + "integrity": "sha512-rtZce46OOkVflCQH71IdbXSFK+S8iJZlUF56XBW5rIgx/eG5qoomC7Ag3anZson1bBac/JFQn7XOBfved/IMRA==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-core": "1.9.3", + "@algolia/autocomplete-preset-algolia": "1.9.3", + "@docsearch/css": "3.6.2", + "algoliasearch": "^4.19.1" + }, + "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 + } + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.3.tgz", + "integrity": "sha512-ufb2CH2KfBWPJok95frEZZ82LtDl0A6QKTa8MoM+cWwDZvVGl5/jNb79pIhRvAalUu+7LD91VYR0nwRD799HkQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.3.tgz", + "integrity": "sha512-iAHpft/eQk9vkWIV5t22V77d90CRofgR2006UiCjHcHJFVI1E0oBkQIAbz+pLtthFw3hWEmVB4ilxGyBf48i2Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.3.tgz", + "integrity": "sha512-QPW2YmkWLlvqmOa2OwrfqLJqkHm7kJCIMq9kOz40Zo9Ipi40kf9ONG5Sz76zszrmIZZ4hgRIkez69YnTHgEz1w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.3.tgz", + "integrity": "sha512-KO0pN5x3+uZm1ZXeIfDqwcvnQ9UEGN8JX5ufhmgH5Lz4ujjZMAnxQygZAVGemFWn+ZZC0FQopruV4lqmGMshow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.24.3.tgz", + "integrity": "sha512-CsC+ZdIiZCZbBI+aRlWpYJMSWvVssPuWqrDy/zi9YfnatKKSLFCe6fjna1grHuo/nVaHG+kiglpRhyBQYRTK4A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.24.3.tgz", + "integrity": "sha512-F0nqiLThcfKvRQhZEzMIXOQG4EeX61im61VYL1jo4eBxv4aZRmpin6crnBJQ/nWnCsjH5F6J3W6Stdm0mBNqBg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.3.tgz", + "integrity": "sha512-KRSFHyE/RdxQ1CSeOIBVIAxStFC/hnBgVcaiCkQaVC+EYDtTe4X7z5tBkFyRoBgUGtB6Xg6t9t2kulnX6wJc6A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.3.tgz", + "integrity": "sha512-h6Q8MT+e05zP5BxEKz0vi0DhthLdrNEnspdLzkoFqGwnmOzakEHSlXfVyA4HJ322QtFy7biUAVFPvIDEDQa6rw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.3.tgz", + "integrity": "sha512-fKElSyXhXIJ9pqiYRqisfirIo2Z5pTTve5K438URf08fsypXrEkVmShkSfM8GJ1aUyvjakT+fn2W7Czlpd/0FQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.3.tgz", + "integrity": "sha512-YlddZSUk8G0px9/+V9PVilVDC6ydMz7WquxozToozSnfFK6wa6ne1ATUjUvjin09jp34p84milxlY5ikueoenw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.3.tgz", + "integrity": "sha512-yNaWw+GAO8JjVx3s3cMeG5Esz1cKVzz8PkTJSfYzE5u7A+NvGmbVFEHP+BikTIyYWuz0+DX9kaA3pH9Sqxp69g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.3.tgz", + "integrity": "sha512-lWKNQfsbpv14ZCtM/HkjCTm4oWTKTfxPmr7iPfp3AHSqyoTz5AgLemYkWLwOBWc+XxBbrU9SCokZP0WlBZM9lA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.3.tgz", + "integrity": "sha512-HoojGXTC2CgCcq0Woc/dn12wQUlkNyfH0I1ABK4Ni9YXyFQa86Fkt2Q0nqgLfbhkyfQ6003i3qQk9pLh/SpAYw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.3.tgz", + "integrity": "sha512-mnEOh4iE4USSccBOtcrjF5nj+5/zm6NcNhbSEfR3Ot0pxBwvEn5QVUXcuOwwPkapDtGZ6pT02xLoPaNv06w7KQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.3.tgz", + "integrity": "sha512-rMTzawBPimBQkG9NKpNHvquIUTQPzrnPxPbCY1Xt+mFkW7pshvyIS5kYgcf74goxXOQk0CP3EoOC1zcEezKXhw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.3.tgz", + "integrity": "sha512-2lg1CE305xNvnH3SyiKwPVsTVLCg4TmNCF1z7PSHX2uZY2VbUpdkgAllVoISD7JO7zu+YynpWNSKAtOrX3AiuA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.3.tgz", + "integrity": "sha512-9SjYp1sPyxJsPWuhOCX6F4jUMXGbVVd5obVpoVEi8ClZqo52ViZewA6eFz85y8ezuOA+uJMP5A5zo6Oz4S5rVQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.3.tgz", + "integrity": "sha512-HGZgRFFYrMrP3TJlq58nR1xy8zHKId25vhmm5S9jETEfDf6xybPxsavFTJaufe2zgOGYJBskGlj49CwtEuFhWQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.22.2.tgz", + "integrity": "sha512-bvIQcd8BEeR1yFvOYv6HDiyta2FFVePbzeowf5pPS1avczrPK+cjmaxxh0nx5QzbON7+Sv0sQfQVciO7bN72sg==", + "dev": true, + "dependencies": { + "@shikijs/engine-javascript": "1.22.2", + "@shikijs/engine-oniguruma": "1.22.2", + "@shikijs/types": "1.22.2", + "@shikijs/vscode-textmate": "^9.3.0", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.3" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.22.2.tgz", + "integrity": "sha512-iOvql09ql6m+3d1vtvP8fLCVCK7BQD1pJFmHIECsujB0V32BJ0Ab6hxk1ewVSMFA58FI0pR2Had9BKZdyQrxTw==", + "dev": true, + "dependencies": { + "@shikijs/types": "1.22.2", + "@shikijs/vscode-textmate": "^9.3.0", + "oniguruma-to-js": "0.4.3" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.22.2.tgz", + "integrity": "sha512-GIZPAGzQOy56mGvWMoZRPggn0dTlBf1gutV5TdceLCZlFNqWmuc7u+CzD0Gd9vQUTgLbrt0KLzz6FNprqYAxlA==", + "dev": true, + "dependencies": { + "@shikijs/types": "1.22.2", + "@shikijs/vscode-textmate": "^9.3.0" + } + }, + "node_modules/@shikijs/transformers": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.22.2.tgz", + "integrity": "sha512-8f78OiBa6pZDoZ53lYTmuvpFPlWtevn23bzG+azpPVvZg7ITax57o/K3TC91eYL3OMJOO0onPbgnQyZjRos8XQ==", + "dev": true, + "dependencies": { + "shiki": "1.22.2" + } + }, + "node_modules/@shikijs/types": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.22.2.tgz", + "integrity": "sha512-NCWDa6LGZqTuzjsGfXOBWfjS/fDIbDdmVDug+7ykVe1IKT4c1gakrvlfFYp5NhAXH/lyqLM8wsAPo5wNy73Feg==", + "dev": true, + "dependencies": { + "@shikijs/vscode-textmate": "^9.3.0", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.3.0.tgz", + "integrity": "sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==", + "dev": true + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "dev": true + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "dev": true, + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "dev": true + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", + "dev": true + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.1.4.tgz", + "integrity": "sha512-N2XSI2n3sQqp5w7Y/AN/L2XDjBIRGqXko+eDp42sydYSBeJuSm5a1sLf8zakmo8u7tA8NmBgoDLA1HeOESjp9A==", + "dev": true, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.12.tgz", + "integrity": "sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/shared": "3.5.12", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.12.tgz", + "integrity": "sha512-9G6PbJ03uwxLHKQ3P42cMTi85lDRvGLB2rSGOiQqtXELat6uI4n8cNz9yjfVHRPIu+MsK6TE418Giruvgptckg==", + "dev": true, + "dependencies": { + "@vue/compiler-core": "3.5.12", + "@vue/shared": "3.5.12" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.12.tgz", + "integrity": "sha512-2k973OGo2JuAa5+ZlekuQJtitI5CgLMOwgl94BzMCsKZCX/xiqzJYzapl4opFogKHqwJk34vfsaKpfEhd1k5nw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/compiler-core": "3.5.12", + "@vue/compiler-dom": "3.5.12", + "@vue/compiler-ssr": "3.5.12", + "@vue/shared": "3.5.12", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.11", + "postcss": "^8.4.47", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.12.tgz", + "integrity": "sha512-eLwc7v6bfGBSM7wZOGPmRavSWzNFF6+PdRhE+VFJhNCgHiF8AM7ccoqcv5kBXA2eWUfigD7byekvf/JsOfKvPA==", + "dev": true, + "dependencies": { + "@vue/compiler-dom": "3.5.12", + "@vue/shared": "3.5.12" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.5.6.tgz", + "integrity": "sha512-/7ov2ioU80fYcYENEJXp88l88gX1PJCGJdMtQmUV3VQmGgQvKrpeUoPWgkpXPkUxmAquh6PZnVtXeDpTX5mmLg==", + "dev": true, + "dependencies": { + "@vue/devtools-kit": "^7.5.6" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.5.6.tgz", + "integrity": "sha512-44qr4/l9BsNP5hKETucueP8SKkyDZBHEurV4pQnRWs906OG9f2aYWhk4vL+27tsB4ZoWJM2h3RLhygzeeKZzWg==", + "dev": true, + "dependencies": { + "@vue/devtools-shared": "^7.5.6", + "birpc": "^0.2.19", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.1" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.5.6.tgz", + "integrity": "sha512-5iq/BF6f05JTcC7J/1DTUm4CpyVVB4KiyLAo/fDcoyWR7EulharWQVbr6W7ek5lO23f5mbnJ+adA5tfFTJt6Sw==", + "dev": true, + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.12.tgz", + "integrity": "sha512-UzaN3Da7xnJXdz4Okb/BGbAaomRHc3RdoWqTzlvd9+WBR5m3J39J1fGcHes7U3za0ruYn/iYy/a1euhMEHvTAg==", + "dev": true, + "dependencies": { + "@vue/shared": "3.5.12" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.12.tgz", + "integrity": "sha512-hrMUYV6tpocr3TL3Ad8DqxOdpDe4zuQY4HPY3X/VRh+L2myQO8MFXPAMarIOSGNu0bFAjh1yBkMPXZBqCk62Uw==", + "dev": true, + "dependencies": { + "@vue/reactivity": "3.5.12", + "@vue/shared": "3.5.12" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.12.tgz", + "integrity": "sha512-q8VFxR9A2MRfBr6/55Q3umyoN7ya836FzRXajPB6/Vvuv0zOPL+qltd9rIMzG/DbRLAIlREmnLsplEF/kotXKA==", + "dev": true, + "dependencies": { + "@vue/reactivity": "3.5.12", + "@vue/runtime-core": "3.5.12", + "@vue/shared": "3.5.12", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.12.tgz", + "integrity": "sha512-I3QoeDDeEPZm8yR28JtY+rk880Oqmj43hreIBVTicisFTx/Dl7JpG72g/X7YF8hnQD3IFhkky5i2bPonwrTVPg==", + "dev": true, + "dependencies": { + "@vue/compiler-ssr": "3.5.12", + "@vue/shared": "3.5.12" + }, + "peerDependencies": { + "vue": "3.5.12" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.12.tgz", + "integrity": "sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==", + "dev": true + }, + "node_modules/@vueuse/core": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-11.1.0.tgz", + "integrity": "sha512-P6dk79QYA6sKQnghrUz/1tHi0n9mrb/iO1WTMk/ElLmTyNqgDeSZ3wcDf6fRBGzRJbeG1dxzEOvLENMjr+E3fg==", + "dev": true, + "dependencies": { + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "11.1.0", + "@vueuse/shared": "11.1.0", + "vue-demi": ">=0.14.10" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/integrations": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-11.1.0.tgz", + "integrity": "sha512-O2ZgrAGPy0qAjpoI2YR3egNgyEqwG85fxfwmA9BshRIGjV4G6yu6CfOPpMHAOoCD+UfsIl7Vb1bXJ6ifrHYDDA==", + "dev": true, + "dependencies": { + "@vueuse/core": "11.1.0", + "@vueuse/shared": "11.1.0", + "vue-demi": ">=0.14.10" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "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 + } + } + }, + "node_modules/@vueuse/integrations/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-11.1.0.tgz", + "integrity": "sha512-l9Q502TBTaPYGanl1G+hPgd3QX5s4CGnpXriVBR5fEZ/goI6fvDaVmIl3Td8oKFurOxTmbXvBPSsgrd6eu6HYg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-11.1.0.tgz", + "integrity": "sha512-YUtIpY122q7osj+zsNMFAfMTubGz0sn5QzE5gPzAIiCmtt2ha3uQUY1+JPyL4gRCTsLPX82Y9brNbo/aqlA91w==", + "dev": true, + "dependencies": { + "vue-demi": ">=0.14.10" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-typescript": { + "version": "1.4.13", + "resolved": "https://registry.npmjs.org/acorn-typescript/-/acorn-typescript-1.4.13.tgz", + "integrity": "sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q==", + "dev": true, + "peer": true, + "peerDependencies": { + "acorn": ">=8.9.0" + } + }, + "node_modules/algoliasearch": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.24.0.tgz", + "integrity": "sha512-bf0QV/9jVejssFBmz2HQLxUadxk574t4iwjCKp5E7NBzwKkrDEhKPISIIjAU/p6K5qDx3qoeh4+26zWN1jmw3g==", + "dev": true, + "dependencies": { + "@algolia/cache-browser-local-storage": "4.24.0", + "@algolia/cache-common": "4.24.0", + "@algolia/cache-in-memory": "4.24.0", + "@algolia/client-account": "4.24.0", + "@algolia/client-analytics": "4.24.0", + "@algolia/client-common": "4.24.0", + "@algolia/client-personalization": "4.24.0", + "@algolia/client-search": "4.24.0", + "@algolia/logger-common": "4.24.0", + "@algolia/logger-console": "4.24.0", + "@algolia/recommend": "4.24.0", + "@algolia/requester-browser-xhr": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/requester-node-http": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/algoliasearch/node_modules/@algolia/client-common": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", + "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/algoliasearch/node_modules/@algolia/client-search": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", + "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/algoliasearch/node_modules/@algolia/requester-browser-xhr": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.24.0.tgz", + "integrity": "sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.24.0" + } + }, + "node_modules/algoliasearch/node_modules/@algolia/requester-node-http": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.24.0.tgz", + "integrity": "sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.24.0" + } + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/birpc": { + "version": "0.2.19", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.19.tgz", + "integrity": "sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/copy-anything": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "dev": true, + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "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" + } + }, + "node_modules/esm-env": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.1.4.tgz", + "integrity": "sha512-oO82nKPHKkzIj/hbtuDYy/JHqBHFlMIW36SDiPCVsj87ntDLcWN+sJ1erdVryd4NxODacFTsdrIE3b7IamqbOg==", + "dev": true, + "peer": true + }, + "node_modules/esrap": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esrap/-/esrap-1.2.2.tgz", + "integrity": "sha512-F2pSJklxx1BlQIQgooczXCPHmcWpn6EsP5oo73LQfonG9fIlIENQ8vMmfGXeojP9MrkzUNAfyU5vdFlR9shHAw==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15", + "@types/estree": "^1.0.1" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/focus-trap": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.0.tgz", + "integrity": "sha512-1td0l3pMkWJLFipobUcGaf+5DTY4PLDDrcqoSaKP8ediO/CoWCCYk/fT/Y2A4e6TNB+Sh6clRJCjOPPnKoNHnQ==", + "dev": true, + "dependencies": { + "tabbable": "^6.2.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.3.tgz", + "integrity": "sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-reference": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", + "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", + "dev": true, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", + "dev": true, + "peer": true + }, + "node_modules/magic-string": { + "version": "0.30.12", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", + "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "dev": true + }, + "node_modules/markdown-it-container": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-container/-/markdown-it-container-4.0.0.tgz", + "integrity": "sha512-HaNccxUH0l7BNGYbFbjmGpf5aLHAMTinqRZQAEQbMr2cdD3z91Q6kIo1oUn1CQndkT03jat6ckrdRYuwwqLlQw==", + "dev": true + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/minisearch": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.1.0.tgz", + "integrity": "sha512-tv7c/uefWdEhcu6hvrfTihflgeEi2tN6VV7HJnCjK6VxM75QQJh4t9FwJCsA2EsRS8LCnu3W87CuGPWMocOLCA==", + "dev": true + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/oniguruma-to-js": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/oniguruma-to-js/-/oniguruma-to-js-0.4.3.tgz", + "integrity": "sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==", + "dev": true, + "dependencies": { + "regex": "^4.3.2" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "node_modules/postcss": { + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/preact": { + "version": "10.24.3", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.24.3.tgz", + "integrity": "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-plugin-organize-imports": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-4.1.0.tgz", + "integrity": "sha512-5aWRdCgv645xaa58X8lOxzZoiHAldAPChljr/MT0crXVOWTZ+Svl4hIWlz+niYSlO6ikE5UXkN1JrRvIP2ut0A==", + "dev": true, + "peerDependencies": { + "prettier": ">=2.0", + "typescript": ">=2.9", + "vue-tsc": "^2.1.0" + }, + "peerDependenciesMeta": { + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/prettier-plugin-svelte": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.2.7.tgz", + "integrity": "sha512-/Dswx/ea0lV34If1eDcG3nulQ63YNr5KPDfMsjbdtpSWOxKKJ7nAc2qlVuYwEvCr4raIuredNoR7K4JCkmTGaQ==", + "dev": true, + "peerDependencies": { + "prettier": "^3.0.0", + "svelte": "^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0" + } + }, + "node_modules/prettier-plugin-tailwindcss": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.8.tgz", + "integrity": "sha512-dGu3kdm7SXPkiW4nzeWKCl3uoImdd5CTZEJGxyypEPL37Wj0HT2pLqjrvSei1nTeuQfO4PUfjeW5cTUNRLZ4sA==", + "dev": true, + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "@ianvs/prettier-plugin-sort-imports": "*", + "@prettier/plugin-pug": "*", + "@shopify/prettier-plugin-liquid": "*", + "@trivago/prettier-plugin-sort-imports": "*", + "@zackad/prettier-plugin-twig-melody": "*", + "prettier": "^3.0", + "prettier-plugin-astro": "*", + "prettier-plugin-css-order": "*", + "prettier-plugin-import-sort": "*", + "prettier-plugin-jsdoc": "*", + "prettier-plugin-marko": "*", + "prettier-plugin-multiline-arrays": "*", + "prettier-plugin-organize-attributes": "*", + "prettier-plugin-organize-imports": "*", + "prettier-plugin-sort-imports": "*", + "prettier-plugin-style-order": "*", + "prettier-plugin-svelte": "*" + }, + "peerDependenciesMeta": { + "@ianvs/prettier-plugin-sort-imports": { + "optional": true + }, + "@prettier/plugin-pug": { + "optional": true + }, + "@shopify/prettier-plugin-liquid": { + "optional": true + }, + "@trivago/prettier-plugin-sort-imports": { + "optional": true + }, + "@zackad/prettier-plugin-twig-melody": { + "optional": true + }, + "prettier-plugin-astro": { + "optional": true + }, + "prettier-plugin-css-order": { + "optional": true + }, + "prettier-plugin-import-sort": { + "optional": true + }, + "prettier-plugin-jsdoc": { + "optional": true + }, + "prettier-plugin-marko": { + "optional": true + }, + "prettier-plugin-multiline-arrays": { + "optional": true + }, + "prettier-plugin-organize-attributes": { + "optional": true + }, + "prettier-plugin-organize-imports": { + "optional": true + }, + "prettier-plugin-sort-imports": { + "optional": true + }, + "prettier-plugin-style-order": { + "optional": true + }, + "prettier-plugin-svelte": { + "optional": true + } + } + }, + "node_modules/prettier-plugin-vue": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/prettier-plugin-vue/-/prettier-plugin-vue-1.1.6.tgz", + "integrity": "sha512-trQ/oY+6hSsGe2zPIFThXMIM0TbxMEbk2VOrKjwHWuSz7OEo0rnumbz9a47OxVPCaAnGY9vZG8qDTiTmk9bq0A==", + "dev": true, + "dependencies": { + "prettier": "^2.8.1" + } + }, + "node_modules/prettier-plugin-vue/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/regex": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/regex/-/regex-4.3.3.tgz", + "integrity": "sha512-r/AadFO7owAq1QJVeZ/nq9jNS1vyZt+6t1p/E59B56Rn2GCya+gr1KSyOzNL/er+r+B7phv5jG2xU2Nz1YkmJg==", + "dev": true + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true + }, + "node_modules/rollup": { + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.3.tgz", + "integrity": "sha512-HBW896xR5HGmoksbi3JBDtmVzWiPAYqp7wip50hjQ67JbDz61nyoMPdqu1DvVW9asYb2M65Z20ZHsyJCMqMyDg==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.24.3", + "@rollup/rollup-android-arm64": "4.24.3", + "@rollup/rollup-darwin-arm64": "4.24.3", + "@rollup/rollup-darwin-x64": "4.24.3", + "@rollup/rollup-freebsd-arm64": "4.24.3", + "@rollup/rollup-freebsd-x64": "4.24.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.24.3", + "@rollup/rollup-linux-arm-musleabihf": "4.24.3", + "@rollup/rollup-linux-arm64-gnu": "4.24.3", + "@rollup/rollup-linux-arm64-musl": "4.24.3", + "@rollup/rollup-linux-powerpc64le-gnu": "4.24.3", + "@rollup/rollup-linux-riscv64-gnu": "4.24.3", + "@rollup/rollup-linux-s390x-gnu": "4.24.3", + "@rollup/rollup-linux-x64-gnu": "4.24.3", + "@rollup/rollup-linux-x64-musl": "4.24.3", + "@rollup/rollup-win32-arm64-msvc": "4.24.3", + "@rollup/rollup-win32-ia32-msvc": "4.24.3", + "@rollup/rollup-win32-x64-msvc": "4.24.3", + "fsevents": "~2.3.2" + } + }, + "node_modules/search-insights": { + "version": "2.17.2", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.2.tgz", + "integrity": "sha512-zFNpOpUO+tY2D85KrxJ+aqwnIfdEGi06UH2+xEb+Bp9Mwznmauqc9djbnBibJO5mpfUPPa8st6Sx65+vbeO45g==", + "dev": true, + "peer": true + }, + "node_modules/shiki": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.22.2.tgz", + "integrity": "sha512-3IZau0NdGKXhH2bBlUk4w1IHNxPh6A5B2sUpyY+8utLu2j/h1QpFkAaUA1bAMxOWWGtTWcAh531vnS4NJKS/lA==", + "dev": true, + "dependencies": { + "@shikijs/core": "1.22.2", + "@shikijs/engine-javascript": "1.22.2", + "@shikijs/engine-oniguruma": "1.22.2", + "@shikijs/types": "1.22.2", + "@shikijs/vscode-textmate": "^9.3.0", + "@types/hast": "^3.0.4" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dev": true, + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/superjson": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.1.tgz", + "integrity": "sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==", + "dev": true, + "dependencies": { + "copy-anything": "^3.0.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/svelte": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.1.4.tgz", + "integrity": "sha512-qgHDV7AyvBZa2pbf+V0tnvWrN1LKD8LdUsBkR/SSYVVN6zXexiXnOy5Pjcjft2y/2NJJVa8ORUHFVn3oiWCLVQ==", + "dev": true, + "peer": true, + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@types/estree": "^1.0.5", + "acorn": "^8.12.1", + "acorn-typescript": "^1.4.13", + "aria-query": "^5.3.1", + "axobject-query": "^4.1.0", + "esm-env": "^1.0.0", + "esrap": "^1.2.2", + "is-reference": "^3.0.2", + "locate-character": "^3.0.0", + "magic-string": "^0.30.11", + "zimmerframe": "^1.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "dev": true + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "dev": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "5.4.10", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.10.tgz", + "integrity": "sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==", + "dev": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vitepress": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.4.2.tgz", + "integrity": "sha512-10v92Lqx0N4r7YC3cQLBvu+gRS2rHviE7vgdKiwlupUGfSWkyiQDqYccxM5iPStDGSi1Brnec1lf+lmhaQcZXw==", + "dev": true, + "dependencies": { + "@docsearch/css": "^3.6.2", + "@docsearch/js": "^3.6.2", + "@shikijs/core": "^1.22.2", + "@shikijs/transformers": "^1.22.2", + "@shikijs/types": "^1.22.2", + "@types/markdown-it": "^14.1.2", + "@vitejs/plugin-vue": "^5.1.4", + "@vue/devtools-api": "^7.5.4", + "@vue/shared": "^3.5.12", + "@vueuse/core": "^11.1.0", + "@vueuse/integrations": "^11.1.0", + "focus-trap": "^7.6.0", + "mark.js": "8.11.1", + "minisearch": "^7.1.0", + "shiki": "^1.22.2", + "vite": "^5.4.10", + "vue": "^3.5.12" + }, + "bin": { + "vitepress": "bin/vitepress.js" + }, + "peerDependencies": { + "markdown-it-mathjax3": "^4", + "postcss": "^8" + }, + "peerDependenciesMeta": { + "markdown-it-mathjax3": { + "optional": true + }, + "postcss": { + "optional": true + } + } + }, + "node_modules/vitepress-plugin-tabs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/vitepress-plugin-tabs/-/vitepress-plugin-tabs-0.5.0.tgz", + "integrity": "sha512-SIhFWwGsUkTByfc2b279ray/E0Jt8vDTsM1LiHxmCOBAEMmvzIBZSuYYT1DpdDTiS3SuJieBheJkYnwCq/yD9A==", + "dev": true, + "peerDependencies": { + "vitepress": "^1.0.0-rc.27", + "vue": "^3.3.8" + } + }, + "node_modules/vue": { + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.12.tgz", + "integrity": "sha512-CLVZtXtn2ItBIi/zHZ0Sg1Xkb7+PU32bJJ8Bmy7ts3jxXTcbfsEfBivFYYWz1Hur+lalqGAh65Coin0r+HRUfg==", + "dev": true, + "dependencies": { + "@vue/compiler-dom": "3.5.12", + "@vue/compiler-sfc": "3.5.12", + "@vue/runtime-dom": "3.5.12", + "@vue/server-renderer": "3.5.12", + "@vue/shared": "3.5.12" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/zimmerframe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.2.tgz", + "integrity": "sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==", + "dev": true, + "peer": true + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 0000000..d969a77 --- /dev/null +++ b/docs/package.json @@ -0,0 +1,20 @@ +{ + "scripts": { + "docs:dev": "vitepress dev", + "docs:build": "vitepress build", + "docs:preview": "vitepress preview", + "format:check": "prettier --check .", + "format": "prettier --write ." + }, + "devDependencies": { + "markdown-it-container": "^4.0.0", + "prettier": "^3.3.3", + "prettier-plugin-organize-imports": "^4.1.0", + "prettier-plugin-svelte": "^3.2.7", + "prettier-plugin-tailwindcss": "^0.6.8", + "prettier-plugin-vue": "^1.1.6", + "vitepress": "^1.2.2", + "vitepress-plugin-tabs": "^0.5.0", + "vue": "^3.4.27" + } +} diff --git a/docs/prettier.config.js b/docs/prettier.config.js new file mode 100644 index 0000000..60e1d04 --- /dev/null +++ b/docs/prettier.config.js @@ -0,0 +1,12 @@ +module.exports = { + printWidth: 80, + semi: false, + singleQuote: true, + tabWidth: 2, + trailingComma: 'all', + plugins: [ + 'prettier-plugin-svelte', + 'prettier-plugin-organize-imports', + 'prettier-plugin-tailwindcss', + ], +} diff --git a/docs/public/favicon.ico b/docs/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..7ed8ece69c13bc9938f96b462dc5dcab6a8e97c8 GIT binary patch literal 6518 zcmeHLSx*yD7#&S~=fNMqli_Fh3rtuGhyo%6**9e=n;?7H3ZyJ1n)u+BpoqpFprFR+ zgAcw6qOqN&r6rX@OONLcBpR6_r7>f0Cb^l+&7C{n{qA?qnR6uRgmh9$PL_C2mQqej z(iusTl9KkGPf5}__NB0oL!`58VqC1tlRgDc#^i3xoPa0G36E_YvTYP{&M@Tj4#;^! zkS`2CzSs{rzZXhD50p#YP>Q;sT<(NY(gCHk4eFIvsAVls%bTHAG(xSs2DPdIYIQxd znp$YJHPGs+q19LIwuVYr-?#E_)!#pK{xZkmP926Pb%HuW$D;!eEylR^BmIT2iZ2cs+E_Cjl% zhMe08wWJTBS09XqA-wV#-sWz`P!~V`G5?;l5d`Po7|tzX@HV-)7wtO!ZoYVLI8KkD z|LHGAAEIQTI9`={^A zfARZf=HJZvGxPkJi9crJui5+~{=d!SU+e$h(m$5|Bj5f%`Zty@VD(!WurhG`Ga!6I zT8FwrcqpHc{2*u38x+2v@B|C!2MRB+Sa^W+|AhA^bhq&Qgx;#B_WM<5nEgKgujDNH znmL191N}@9KfMg4sEs<38mg=*cKqoR^gpJdRo`NprLLv^%%8dq5Y~t8z}GX2osFR07m*b{_j4T;hWQuTUM+JW{K>sLM`#P{Be&t}bzvv4q4({m rD%SgYxi-%6+x{i=ej@QFn!iN%Px$1C)Q@=I?D{|A_m4jk9=yUIs$2P9 literal 0 HcmV?d00001 diff --git a/docs/public/logo.jpg b/docs/public/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6607a57d64b8406243998978898e91fb37be8f67 GIT binary patch literal 8834 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 literal 0 HcmV?d00001 diff --git a/docs/public/logo.svg b/docs/public/logo.svg new file mode 100644 index 0000000..61ec585 --- /dev/null +++ b/docs/public/logo.svg @@ -0,0 +1 @@ + diff --git a/docs/public/og_image.jpg b/docs/public/og_image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..63f39baa1c3cbd316464f48521a38fb97221ab51 GIT binary patch literal 133318 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ΧokFr|y?1ZT2!&eAfHxw7)eGF41@6PWN#jjD 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 literal 0 HcmV?d00001