import{_ as s}from"./plugin-vue_export-helper-DlAUqK2U.js";import{c as e,a as n,o as a}from"./app-h9l50wZ_.js";const t={};function l(r,i){return a(),e("div",null,i[0]||(i[0]=[n(`<h1 id="maintenance-page" tabindex="-1"><a class="header-anchor" href="#maintenance-page"><span>Maintenance Page</span></a></h1><p>Static maintenance page for <a href="https://ocelot.social" target="_blank" rel="noopener noreferrer">ocelot.social</a> instances. Shown to users during planned downtime, returning HTTP 503 for all routes so search engines know the outage is temporary.</p><p>Built with <strong>Nuxt 4</strong> (static generation), <strong>Tailwind CSS v4</strong>, and the <strong>@ocelot-social/ui</strong> component library. Supports 11 languages via <code>@nuxtjs/i18n</code>.</p><h2 id="development" tabindex="-1"><a class="header-anchor" href="#development"><span>Development</span></a></h2><div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">npm</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> install</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">npm</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> run</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> dev</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;">        # http://localhost:3000</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div></div></div><h2 id="testing-linting" tabindex="-1"><a class="header-anchor" href="#testing-linting"><span>Testing &amp; Linting</span></a></h2><div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">npm</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> test</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;">           # vitest</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">npm</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> run</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> lint</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;">       # eslint</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div></div></div><h2 id="production-build" tabindex="-1"><a class="header-anchor" href="#production-build"><span>Production Build</span></a></h2><p>The app is generated as a fully static site (<code>nuxt generate</code>) and served by nginx.</p><div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">npm</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> run</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> generate</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;">   # outputs to .output/public/</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">npm</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> run</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> preview</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;">    # local preview of the static build</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div></div></div><h2 id="docker" tabindex="-1"><a class="header-anchor" href="#docker"><span>Docker</span></a></h2><p>Multi-stage Dockerfile:</p><table><thead><tr><th>Stage</th><th>Purpose</th></tr></thead><tbody><tr><td><code>ui-library</code></td><td>Builds <code>@ocelot-social/ui</code> from <code>packages/ui/</code></td></tr><tr><td><code>build</code></td><td>Installs deps, applies branding, runs <code>nuxt generate</code></td></tr><tr><td><code>development</code></td><td>Hot-reload dev server (mount sources)</td></tr><tr><td><code>production</code></td><td>nginx alpine serving the static files</td></tr></tbody></table><p>Build context must be the repo root so Docker can access <code>packages/ui/</code>:</p><div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">docker</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> build</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> -f</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> maintenance/Dockerfile</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> --target</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> production</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> -t</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> maintenance</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> .</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">docker</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> run</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> -p</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> 8080:8080</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> maintenance</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div></div></div><h2 id="branding" tabindex="-1"><a class="header-anchor" href="#branding"><span>Branding</span></a></h2><p>The Dockerfile uses <code>ONBUILD</code> instructions to overlay instance-specific branding:</p><ul><li><code>branding/static/</code> — logo, favicon, and other public assets</li><li><code>branding/constants/metadata.js</code> — site name, description, etc.</li><li><code>branding/constants/emails.js</code> — contact email addresses</li><li><code>branding/locales/*.json</code> — translation overrides (merged via <code>tools/merge-locales.sh</code>)</li></ul><h2 id="nginx" tabindex="-1"><a class="header-anchor" href="#nginx"><span>Nginx</span></a></h2><p>The nginx config (<code>nginx/custom.conf</code>) returns <strong>503</strong> for all non-asset requests, serving <code>index.html</code> as the error page. This signals to search engines that the downtime is temporary.</p><h2 id="project-structure" tabindex="-1"><a class="header-anchor" href="#project-structure"><span>Project Structure</span></a></h2><div class="language-text line-numbers-mode" data-highlighter="shiki" data-ext="text" data-title="text" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code><span class="line"><span>maintenance/</span></span>
<span class="line"><span>├── app/              # Nuxt application source</span></span>
<span class="line"><span>│   ├── assets/css/   # Tailwind &amp; branding CSS</span></span>
<span class="line"><span>│   ├── components/   # Vue components</span></span>
<span class="line"><span>│   ├── constants/    # Branding constants (metadata, emails)</span></span>
<span class="line"><span>│   └── plugins/      # Nuxt plugins</span></span>
<span class="line"><span>├── locales/          # i18n translation files (11 languages)</span></span>
<span class="line"><span>├── nginx/            # nginx config for production</span></span>
<span class="line"><span>├── public/           # Static assets (favicon, logo)</span></span>
<span class="line"><span>└── tools/            # Build helper scripts</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>`,22)]))}const h=s(t,[["render",l],["__file","index.html.vue"]]),c=JSON.parse('{"path":"/maintenance/","title":"Maintenance Page","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Development","slug":"development","link":"#development","children":[]},{"level":2,"title":"Testing & Linting","slug":"testing-linting","link":"#testing-linting","children":[]},{"level":2,"title":"Production Build","slug":"production-build","link":"#production-build","children":[]},{"level":2,"title":"Docker","slug":"docker","link":"#docker","children":[]},{"level":2,"title":"Branding","slug":"branding","link":"#branding","children":[]},{"level":2,"title":"Nginx","slug":"nginx","link":"#nginx","children":[]},{"level":2,"title":"Project Structure","slug":"project-structure","link":"#project-structure","children":[]}],"git":{"createdTime":1775351521000,"updatedTime":1775351521000,"contributors":[{"name":"dependabot[bot]","email":"49699333+dependabot[bot]@users.noreply.github.com","commits":1}]},"readingTime":{"minutes":0.91,"words":273},"filePathRelative":"maintenance/README.md","localizedDate":"April 5, 2026","excerpt":"\\n<p>Static maintenance page for <a href=\\"https://ocelot.social\\" target=\\"_blank\\" rel=\\"noopener noreferrer\\">ocelot.social</a> instances. Shown to users during planned downtime, returning HTTP 503 for all routes so search engines know the outage is temporary.</p>\\n<p>Built with <strong>Nuxt 4</strong> (static generation), <strong>Tailwind CSS v4</strong>, and the <strong>@ocelot-social/ui</strong> component library. Supports 11 languages via <code>@nuxtjs/i18n</code>.</p>"}');export{h as comp,c as data};
