Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
a0f8f81
update all dependencies
bryantgillespie Apr 23, 2026
693035f
add packageManager back
bryantgillespie Apr 23, 2026
40b762b
remove hardcoded url
bryantgillespie Apr 23, 2026
12e54f4
wip
bryantgillespie Apr 26, 2026
fb43401
cleanup from review
bryantgillespie Apr 26, 2026
2e61cb1
cleanup again
bryantgillespie Apr 27, 2026
1c08e8b
switch to json for storing redirects
bryantgillespie Apr 27, 2026
f785c96
convert to ts
bryantgillespie Apr 28, 2026
23d0e7f
cleanup
bryantgillespie Apr 28, 2026
94d9c40
ai cleanup
bryantgillespie Apr 28, 2026
c8949ec
Update README.md
bryantgillespie Apr 28, 2026
4e55dfb
backfill all ids
bryantgillespie Apr 28, 2026
0c01c40
feat(nav): rename Connect→APIs, Automate→Flows, Manage→Hosting
bryantgillespie Apr 28, 2026
fb26a69
feat(llms): rename guide section titles to APIs and Flows
bryantgillespie Apr 28, 2026
853c5b3
docs: replace branded "Directus Connect"/"Directus Automate" with API…
bryantgillespie Apr 28, 2026
5411aef
docs(homepage): drop Data Engine/Data Studio framing
bryantgillespie Apr 28, 2026
0548d61
fix: fold 11.integrations into 12.integrations to clear numeric colli…
bryantgillespie Apr 28, 2026
8d9a727
fix sidebar
bryantgillespie Apr 28, 2026
e1a7980
docs(nav): rename Guides→Guide, Hosting→Deploy
bryantgillespie Apr 28, 2026
2064fcb
kill editor and explorer
bryantgillespie Apr 28, 2026
d6971b0
initial moves
bryantgillespie Apr 30, 2026
bf3949e
wippity
bryantgillespie Apr 30, 2026
13fa1e4
cleanup
bryantgillespie Apr 30, 2026
5d04c17
fix nav
bryantgillespie Apr 30, 2026
8e6cdb2
extract findNavNode
bryantgillespie Apr 30, 2026
1b1f78c
vanilla to vanilla js
bryantgillespie Apr 30, 2026
91eec5c
fix claude bs
bryantgillespie Apr 30, 2026
3039cb3
oops technologies is needed for the imaages
bryantgillespie Apr 30, 2026
45877f7
add chips to tutorials with framworks
bryantgillespie Apr 30, 2026
997dbc8
more cleanup
bryantgillespie Apr 30, 2026
1c32969
All Frameworks
bryantgillespie Apr 30, 2026
7e35e8e
feat(layout): redesign docs experience
bryantgillespie May 21, 2026
459d1ad
feat(layout): add prompt and shader debug components
bryantgillespie May 21, 2026
62c0b4e
fix(layout): restore reference content and skip API prerender
bryantgillespie May 22, 2026
747cfe3
fix(build): stop masking prerender errors
bryantgillespie May 22, 2026
e7e1665
feat(layout): use Directus docs typography
bryantgillespie May 22, 2026
8c19d67
fix(build): inline unhead for preview
bryantgillespie May 22, 2026
79aea9c
chore(layout): remove unused legacy helpers
bryantgillespie May 22, 2026
e17931d
Clean up docs navigation and icons
bryantgillespie May 22, 2026
56ee43f
fix layous
bryantgillespie May 22, 2026
0697c99
Update Railway tutorial image
bryantgillespie May 23, 2026
30b9c2c
Merge origin/main
bryantgillespie May 23, 2026
90cffc0
Skip base-prefixed API prerender
bryantgillespie May 23, 2026
cb79938
fix(build): lazy-load OAS spec to reduce prerender memory
bryantgillespie May 23, 2026
510ac87
increase concurrency
bryantgillespie May 23, 2026
45bbfb2
fix icon
bryantgillespie May 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 53 additions & 11 deletions app/app.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,63 @@ export default defineAppConfig({
colors: {
primary: 'purple',
secondary: 'pink',
neutral: 'slate',
neutral: 'neutral',
},

button: {
slots: {
base: 'rounded-l-full rounded-r-full',
},
},

container: {
base: '@max-[40rem]/docs-pane:px-4! @min-[40rem]/docs-pane:px-6! @min-[64rem]/docs-pane:px-8!',
},
header: {
slots: {
left: '@max-[40rem]/docs-pane:flex-none! @min-[40rem]/docs-pane:flex-1!',
center: '@max-[40rem]/docs-pane:hidden! @min-[40rem]/docs-pane:flex!',
right: '@max-[40rem]/docs-pane:flex-none! @min-[40rem]/docs-pane:flex-1!',
toggle: '@max-[40rem]/docs-pane:flex! @min-[40rem]/docs-pane:hidden!',
content: '@max-[40rem]/docs-pane:block! @min-[40rem]/docs-pane:hidden!',
overlay: '@max-[40rem]/docs-pane:block! @min-[40rem]/docs-pane:hidden!',
},
},
contentToc: {
slots: {
bottom: '@max-[64rem]/docs-pane:hidden! @min-[64rem]/docs-pane:flex!',
},
},
content: {
callout: {
// Fix background color of pre > code blocks
wrapper: '[&_pre>code]:!bg-transparent',
},
},
page: {
contentSurround: {
slots: {
root: 'flex flex-col-reverse sm:grid sm:grid-cols-2 gap-8',
},
},
pageHeader: {
slots: {
root: 'lg:gap-8',
wrapper: '@max-[40rem]/docs-pane:flex-col! @max-[40rem]/docs-pane:items-stretch! @max-[40rem]/docs-pane:justify-start! @min-[40rem]/docs-pane:flex-row! @min-[40rem]/docs-pane:items-center! @min-[40rem]/docs-pane:justify-between!',
title: 'text-3xl sm:text-4xl text-pretty font-display font-medium text-highlighted',
},
},
prose: {
h1: {
base: 'font-display font-medium',
},
h2: {
base: 'font-display font-medium',
},
h3: {
base: 'font-display font-medium',
},
h4: {
base: 'font-display font-medium',
},
pre: {
slots: {
base: 'text-xs/4',
Expand Down Expand Up @@ -92,7 +134,7 @@ export default defineAppConfig({
{
label: 'Security',
to: '/guides/security/best-practices',
icon: 'i-ph-shield-check',
icon: 'material-symbols:verified-user-outline',
},
{
label: 'AI',
Expand All @@ -112,17 +154,17 @@ export default defineAppConfig({
{
label: 'Cloud',
to: '/cloud/getting-started/introduction',
icon: 'i-ph-cloud',
icon: 'material-symbols:cloud-outline',
},
{
label: 'Self-Hosting',
to: '/self-hosting/overview',
icon: 'i-ph-hard-drives',
icon: 'material-symbols:dns-outline',
},
{
label: 'Configuration',
to: '/configuration/intro',
icon: 'i-ph-gear',
icon: 'material-symbols:settings-outline',
},
],
},
Expand All @@ -132,22 +174,22 @@ export default defineAppConfig({
{
label: 'Frameworks',
to: '/frameworks',
icon: 'i-ph-brackets-curly',
icon: 'material-symbols:data-object',
},
{
label: 'Tutorials',
to: '/tutorials',
icon: 'i-ph-article',
icon: 'material-symbols:article-outline',
},
{
label: 'Community',
to: '/community/overview/welcome',
icon: 'i-ph-hand-heart',
icon: 'material-symbols:volunteer-activism-outline',
},
{
label: 'Releases',
to: '/releases',
icon: 'i-ph-notebook',
icon: 'material-symbols:menu-book-outline',
},
],
},
Expand Down
62 changes: 51 additions & 11 deletions app/app.vue
Original file line number Diff line number Diff line change
@@ -1,27 +1,67 @@
<script setup lang="ts">
import type { ContentNavigationItem } from '@nuxt/content';
import { spec } from '@directus/openapi';

const { data: navigation } = useAsyncData('content-navigation', () => queryCollectionNavigation('content', ['title', 'description', 'icon', 'links']));
const { data: navigation } = await useAsyncData('content-navigation', () => queryCollectionNavigation('content', ['title', 'description', 'icon', 'links']));

provide('openapi', spec);
provide('navigation', navigation as Ref<ContentNavigationItem[]>);

defineOgImage('Default', {
title: 'Directus Docs',
});

if (import.meta.client) {
const router = useRouter();

function getHashTarget(hash: string) {
const id = decodeURIComponent(hash.replace(/^#/, ''));
return document.getElementById(id) ?? document.querySelector(hash) as HTMLElement | null;
}

function scrollToHash(hash: string) {
const scroller = document.getElementById('docs-scroll');
const target = getHashTarget(hash);
if (!target) return false;

if (scroller) {
scroller.scrollTo({ top: Math.max(0, target.offsetTop - 80), behavior: 'smooth' });
}
else {
window.scrollTo({ top: Math.max(0, target.offsetTop - 80), behavior: 'smooth' });
}
return true;
}

router.options.scrollBehavior = async (to, from, savedPosition) => {
const scroller = document.getElementById('docs-scroll');
const scrollTarget = scroller ?? window;

if (savedPosition) {
scrollTarget.scrollTo(savedPosition.left ?? 0, savedPosition.top ?? 0);
return;
}

if (to.hash) {
await nextTick();
requestAnimationFrame(() => scrollToHash(to.hash));
return false;
}

if (to.path !== from.path) {
await nextTick();
scrollTarget.scrollTo(0, 0);
}
};
}
</script>

<template>
<UApp>
<NuxtLoadingIndicator color="var(--color-primary)" />
<DocsBanner />
<DocsHeader />
<UMain>
<NuxtLayout>
<NuxtPage />
</NuxtLayout>
</UMain>
<DocsFooter />
<div
id="docs-scroll"
class="h-screen min-w-0 overflow-y-auto overflow-x-hidden scroll-smooth"
>
<DocsShell />
</div>
</UApp>
</template>
71 changes: 70 additions & 1 deletion app/assets/css/main.css
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@
@import "@nuxt/ui";

@source "../../../content/**/*";
@source "../../../modules/**/*.{vue,ts}";

@theme static {
--font-sans: "Inter", sans-serif;
--font-display: "Poppins", sans-serif;
--font-display: "Source Serif 4", serif;
--font-mono: "IBM Plex Mono", monospace;

--color-purple-50: #f3f2ff;
--color-purple-100: #e9e8ff;
Expand Down Expand Up @@ -35,6 +37,14 @@
--diff-green: rgba(16, 185, 129, 0.2);
}

.dark {
--ui-bg: #090909;
}

::selection {
background: color-mix(in srgb, var(--color-primary) 50%, var(--ui-bg) 50%);
}

/*
The default border color has changed to `currentcolor` in Tailwind CSS v4,
so we've added these compatibility styles to make sure everything still
Expand Down Expand Up @@ -66,6 +76,12 @@ html {
scroll-behavior: smooth;
}

.sp-divider,
.sp-divider *,
.sp-divider > :first-child::after {
cursor: col-resize !important;
}

pre {
> code {
& .line.diff.remove {
Expand All @@ -78,3 +94,56 @@ pre {
}
}
}

html .shiki span {
color: var(--shiki-default);
background: var(--shiki-default-bg);
font-style: var(--shiki-default-font-style);
font-weight: var(--shiki-default-font-weight);
text-decoration: var(--shiki-default-text-decoration);
}

html.light .shiki span,
html .light .shiki span {
color: var(--shiki-light);
background: var(--shiki-light-bg);
font-style: var(--shiki-light-font-style);
font-weight: var(--shiki-light-font-weight);
text-decoration: var(--shiki-light-text-decoration);
}

html.dark .shiki span,
html .dark .shiki span {
color: var(--shiki-dark);
background: var(--shiki-dark-bg);
font-style: var(--shiki-dark-font-style);
font-weight: var(--shiki-dark-font-weight);
text-decoration: var(--shiki-dark-text-decoration);
}

.scrollbar-thin {
scrollbar-width: thin;
scrollbar-color: var(--ui-border-accented) var(--ui-bg-muted);
}

.scrollbar-thin::-webkit-scrollbar {
width: 8px;
height: 8px;
}

.scrollbar-thin::-webkit-scrollbar-track {
background: var(--ui-bg-muted);
border-radius: 999px;
}

.scrollbar-thin::-webkit-scrollbar-thumb {
background-color: var(--ui-border-accented);
border-radius: 999px;
border: 2px solid transparent;
background-clip: content-box;
}

.scrollbar-thin::-webkit-scrollbar-thumb:hover {
background-color: var(--ui-text-dimmed);
background-clip: content-box;
}
Loading