Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
29771e6
docs: v3 docs structure
ymc9 Aug 1, 2025
4a3bc18
fix build
ymc9 Aug 1, 2025
ae00828
WIP
ymc9 Aug 3, 2025
2815551
WIP
ymc9 Aug 3, 2025
f215f86
progress on ORM part
ymc9 Aug 5, 2025
a43c1d8
update
ymc9 Aug 5, 2025
f649467
update embed mechanism
ymc9 Aug 5, 2025
5cfdf6d
fix stackblitz embed
ymc9 Aug 5, 2025
2c526ff
make code tabs sync
ymc9 Aug 5, 2025
a9d76ec
complete filter section
ymc9 Aug 9, 2025
09208d3
update docs
ymc9 Aug 9, 2025
b61a2e0
progress on delete
ymc9 Aug 9, 2025
80a8026
Merge remote-tracking branch 'origin/main' into docs/v3
ymc9 Aug 10, 2025
7531a18
more progress on ORM API
ymc9 Aug 10, 2025
c608cf4
ORM docs progress
ymc9 Aug 12, 2025
710b83c
query builder docs
ymc9 Aug 12, 2025
f0014f0
computed fields
ymc9 Aug 13, 2025
016fc3d
polymorphism
ymc9 Aug 13, 2025
963d91f
plugins part
ymc9 Aug 13, 2025
dda23fc
update plugins part
ymc9 Aug 14, 2025
d7b5e4e
add logging
ymc9 Aug 14, 2025
e087eb8
add inferred types section
ymc9 Aug 15, 2025
617275e
progress
ymc9 Aug 15, 2025
6ff3510
progress
ymc9 Aug 17, 2025
22de9b9
prisma migration guide
ymc9 Aug 17, 2025
63d5c61
Merge remote-tracking branch 'origin/main' into docs/v3
ymc9 Aug 17, 2025
2fd667e
update broken links
ymc9 Aug 17, 2025
b9e6193
update
ymc9 Aug 17, 2025
1a2a102
copywriting
ymc9 Aug 18, 2025
847a11e
zmodel language reference
ymc9 Aug 19, 2025
ec14645
update
ymc9 Aug 19, 2025
3ebe44f
fix links
ymc9 Aug 19, 2025
f847870
almost done
ymc9 Aug 19, 2025
07209d7
updates
ymc9 Aug 19, 2025
16d96b1
update
ymc9 Aug 19, 2025
25822c8
update
ymc9 Aug 20, 2025
192910f
update
ymc9 Aug 21, 2025
db39b21
add feature gap
ymc9 Aug 24, 2025
3dc70c7
update
ymc9 Aug 24, 2025
2a1cbbb
use git submodules to implement code snippet loading
ymc9 Aug 24, 2025
2fe949a
addressing review comments
ymc9 Aug 24, 2025
7d880b0
update
ymc9 Aug 26, 2025
8c059c5
v3 LP
ymc9 Aug 29, 2025
790de90
update
ymc9 Aug 29, 2025
014cbbe
update
ymc9 Aug 29, 2025
1356842
update responsiveness
ymc9 Aug 29, 2025
99c6b5a
update
ymc9 Aug 29, 2025
0fdcf9c
update
ymc9 Aug 30, 2025
2e229b3
update
ymc9 Aug 30, 2025
6b9d453
update
ymc9 Aug 30, 2025
4bd1637
nav bar
ymc9 Sep 1, 2025
277f966
update
ymc9 Sep 1, 2025
0111abb
update submodules
ymc9 Sep 1, 2025
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
18 changes: 18 additions & 0 deletions .gitmodules
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
[submodule "code-repos/zenstackhq/v3-doc-orm"]
path = code-repos/zenstackhq/v3-doc-orm
url = https://github.com/zenstackhq/v3-doc-orm.git
[submodule "code-repos/zenstackhq/v3-doc-orm-computed-fields"]
path = code-repos/zenstackhq/v3-doc-orm-computed-fields
url = https://github.com/zenstackhq/v3-doc-orm-computed-fields.git
[submodule "code-repos/zenstackhq/v3-doc-orm-computed-polymorphism"]
path = code-repos/zenstackhq/v3-doc-orm-computed-polymorphism
url = https://github.com/zenstackhq/v3-doc-orm-polymorphism.git
[submodule "code-repos/zenstackhq/v3-doc-orm-typed-json"]
path = code-repos/zenstackhq/v3-doc-orm-typed-json
url = https://github.com/zenstackhq/v3-doc-orm-typed-json.git
[submodule "code-repos/zenstackhq/v3-doc-quick-start"]
path = code-repos/zenstackhq/v3-doc-quick-start
url = https://github.com/zenstackhq/v3-doc-quick-start.git
[submodule "code-repos/zenstackhq/v3-doc-orm-polymorphism"]
path = code-repos/zenstackhq/v3-doc-orm-polymorphism
url = https://github.com/zenstackhq/v3-doc-orm-polymorphism.git
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-orm
Submodule v3-doc-orm added at bafb46
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-orm-computed-fields
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-orm-polymorphism
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-orm-typed-json
Submodule v3-doc-orm-typed-json added at 710d2c
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-quick-start
Submodule v3-doc-quick-start added at 0c8786
32 changes: 32 additions & 0 deletions docusaurus.config.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -44,6 +44,10 @@ const config = {
label: '1.x',
banner: 'none',
},
'3.x': {
label: '3.0 Beta',
banner: 'none',
},
Comment thread
ymc9 marked this conversation as resolved.
},
},
blog: false,
Expand All@@ -63,6 +67,12 @@ const config = {
themeConfig:
/** @type {import('@docusaurus/preset-classic').ThemeConfig} */
{
announcementBar: {
id: 'v3_beta',
content:
'ZenStack v3 Beta is released 🚀. The new version has replaced Prisma with a brand new query engine. <a href="/v3">Check it out</a>',
isCloseable: true,
},
colorMode: {
defaultMode: 'light',
respectPrefersColorScheme: false,
Expand DownExpand Up@@ -99,6 +109,11 @@ const config = {
position: 'left',
label: 'Handbook',
},
{
to: 'v3',
position: 'left',
label: 'V3 Beta 🚀',
},
{ to: '/blog', label: 'Blog', position: 'left' },
{
href: 'https://discord.gg/Ykhr738dUe',
Expand DownExpand Up@@ -193,6 +208,23 @@ const config = {
},
],
},
{
title: 'FlatIcon Credits',
items: [
{
label: 'Endure',
href: 'https://www.flaticon.com/free-icons/endure',
},
{
label: 'Diagram by Kiranshastry',
href: 'https://www.flaticon.com/free-icons/diagram',
},
{
href: 'https://www.flaticon.com/free-icons/database',
label: 'Database by kerismaker',
},
],
},
],
copyright: `Copyright © ${new Date().getFullYear()} ZenStack, Inc.`,
},
Expand Down
6 changes: 5 additions & 1 deletion package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,7 +12,8 @@
"serve": "docusaurus serve",
"write-translations": "docusaurus write-translations",
"write-heading-ids": "docusaurus write-heading-ids",
"typecheck": "tsc"
"typecheck": "tsc",
"pull-submodules": "git submodule foreach git pull origin main"
},
"dependencies": {
"@algolia/client-search": "^4.22.1",
Expand All@@ -22,12 +23,15 @@
"@docusaurus/theme-mermaid": "3.4.0",
"@giscus/react": "^2.4.0",
"@mdx-js/react": "^3.0.1",
"@stackblitz/sdk": "^1.11.0",
"autoprefixer": "^10.4.13",
"clsx": "^1.2.1",
"is-mobile": "^5.0.0",
"postcss": "^8.4.21",
"prism-react-renderer": "^2.3.1",
"prism-svelte": "^0.5.0",
"prismjs": "^1.29.0",
"raw-loader": "^4.0.2",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-icons": "^5.0.1",
Expand Down
31 changes: 31 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

27 changes: 27 additions & 0 deletions src/components/GithubCodeBlock.tsx
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
import CodeBlock from '@theme/CodeBlock';

interface GithubCodeBlockProps {
repoPath: string;
file: string;
}

const GithubCodeBlock: React.FC<GithubCodeBlockProps> = ({ repoPath, file }) => {
const code = require(`!!raw-loader!@site/code-repos/${repoPath}/${file}`).default;

const getLanguage = (file: string): string => {
if (file.endsWith('.ts')) {
return 'typescript';
} else if (file.endsWith('.zmodel')) {
return 'zmodel';
} else {
return 'plaintext';
}
};
return (
<CodeBlock language={getLanguage(file)} title={file}>
{code}
</CodeBlock>
);
};

export default GithubCodeBlock;
26 changes: 26 additions & 0 deletions src/components/StackBlitzEmbed.tsx
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
import React, { useEffect, useRef } from 'react';
import sdk from '@stackblitz/sdk';

interface StackBlitzEmbedProps {
projectId: string;
height?: string;
}

const StackBlitzEmbed: React.FC<StackBlitzEmbedProps> = ({ projectId, height = '600px' }) => {
const containerRef = useRef<HTMLDivElement>(null);

useEffect(() => {
if (containerRef.current) {
sdk.embedProjectId(containerRef.current, projectId, {
openFile: 'main.ts',
height,
view: 'editor',
forceEmbedLayout: true,
});
}
}, [projectId, height]);

return <div ref={containerRef} style={{ width: '100%', height }} />;
};

export default StackBlitzEmbed;
44 changes: 44 additions & 0 deletions src/components/StackBlitzGithub.tsx
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
import sdk from '@stackblitz/sdk';
import React from 'react';
import GithubCodeBlock from './GithubCodeBlock';

interface StackBlitzGithubProps {
repoPath: string;
openFile?: string;
codeFiles?: string[];
startScript?: string;
}

const StackBlitzGithub: React.FC<StackBlitzGithubProps> = ({
repoPath,
openFile = 'main.ts',
codeFiles: plainCodeFiles = undefined,
startScript,
}) => {
const options = {
openFile,
view: 'editor',
startScript,
} as const;

if (!plainCodeFiles) {
plainCodeFiles = [openFile];
}

return (
<>
<div className="mb-1 italic text-sm">
Click{' '}
<a href="#" onClick={() => sdk.openGithubProject(repoPath, options)}>
here
</a>{' '}
to open an interactive playground.
</div>
Comment thread
ymc9 marked this conversation as resolved.
{plainCodeFiles.map((file) => (
<GithubCodeBlock key={file} repoPath={repoPath} file={file} />
))}
</>
);
};

export default StackBlitzGithub;
6 changes: 3 additions & 3 deletions src/components/ValueProposition.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -33,8 +33,8 @@ const FeatureList: FeatureItem[] = [
img: '/img/ai-friendly.png',
description: (
<>
Schema-first reduces code complexity, helping AI understand better with fewer hallucinations.
Schema serves as a single source of truth for AI integration.
Schema-first reduces code complexity, helping AI understand better with fewer hallucinations. Schema
serves as a single source of truth for AI integration.
</>
),
},
Expand All@@ -47,7 +47,7 @@ function Proposition({ title, img, description }: FeatureItem) {
<img className="w-48 p-10" src={img} alt={title} />
</div>
<div className="text--center padding-horiz--md">
<h3 className="text-xl text-bold text-center lg:text-2xl text-gray-700 dark:text-gray-300">{title}</h3>
<h3 className="text-xl text-center lg:text-2xl text-gray-700 dark:text-gray-300">{title}</h3>
<p className="text-center text-base lg:text-lg text-gray-600 dark:text-gray-400">{description}</p>
</div>
</div>
Expand Down
17 changes: 17 additions & 0 deletions src/css/custom.css
Original file line numberDiff line numberDiff line change
Expand Up@@ -68,3 +68,20 @@
right: 0;
pointer-events: mouse;
}

@media (max-width: 1200px) {
.navbar__items--right,
.navbar__items--left {
display: none;
}

.navbar__toggle {
display: inherit;
}
}

@media (min-width: 1201px) {
.navbar__toggle {
display: none;
}
}
15 changes: 3 additions & 12 deletions src/lib/prism-zmodel.js
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,10 @@
Prism.languages.zmodel = Prism.languages.extend('clike', {
keyword: /\b(?:datasource|enum|generator|model|type|abstract|import|extends|attribute|view|plugin|proc)\b/,
function: /@@?[A-Za-z_]\w*/,
keyword: /\b(?:datasource|enum|generator|model|type|abstract|import|extends|attribute|view|plugin|proc|with)\b/,
entity: /\b(?:Int|String|Boolean|DateTime|Float|Decimal|BigInt|Bytes|Json|Unsupported)\b/,
'type-class-name': /(\b()\s+)[\w.\\]+/,
});
Comment thread
ymc9 marked this conversation as resolved.

Prism.languages.javascript['class-name'][0].pattern =
/(\b(?:model|datasource|enum|generator|type|plugin|abstract)\s+)[\w.\\]+/;

Prism.languages.insertBefore('zmodel', 'function', {
annotation: {
pattern: /(^|[^.])@+\w+/,
lookbehind: true,
alias: 'punctuation',
},
});

Prism.languages.insertBefore('zmodel', 'punctuation', {
'type-args': /\b(?:references|fields|onDelete|onUpdate):/,
});
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
29771e6
docs: v3 docs structure
ymc9 Aug 1, 2025
4a3bc18
fix build
ymc9 Aug 1, 2025
ae00828
WIP
ymc9 Aug 3, 2025
2815551
WIP
ymc9 Aug 3, 2025
f215f86
progress on ORM part
ymc9 Aug 5, 2025
a43c1d8
update
ymc9 Aug 5, 2025
f649467
update embed mechanism
ymc9 Aug 5, 2025
5cfdf6d
fix stackblitz embed
ymc9 Aug 5, 2025
2c526ff
make code tabs sync
ymc9 Aug 5, 2025
a9d76ec
complete filter section
ymc9 Aug 9, 2025
09208d3
update docs
ymc9 Aug 9, 2025
b61a2e0
progress on delete
ymc9 Aug 9, 2025
80a8026
Merge remote-tracking branch 'origin/main' into docs/v3
ymc9 Aug 10, 2025
7531a18
more progress on ORM API
ymc9 Aug 10, 2025
c608cf4
ORM docs progress
ymc9 Aug 12, 2025
710b83c
query builder docs
ymc9 Aug 12, 2025
f0014f0
computed fields
ymc9 Aug 13, 2025
016fc3d
polymorphism
ymc9 Aug 13, 2025
963d91f
plugins part
ymc9 Aug 13, 2025
dda23fc
update plugins part
ymc9 Aug 14, 2025
d7b5e4e
add logging
ymc9 Aug 14, 2025
e087eb8
add inferred types section
ymc9 Aug 15, 2025
617275e
progress
ymc9 Aug 15, 2025
6ff3510
progress
ymc9 Aug 17, 2025
22de9b9
prisma migration guide
ymc9 Aug 17, 2025
63d5c61
Merge remote-tracking branch 'origin/main' into docs/v3
ymc9 Aug 17, 2025
2fd667e
update broken links
ymc9 Aug 17, 2025
b9e6193
update
ymc9 Aug 17, 2025
1a2a102
copywriting
ymc9 Aug 18, 2025
847a11e
zmodel language reference
ymc9 Aug 19, 2025
ec14645
update
ymc9 Aug 19, 2025
3ebe44f
fix links
ymc9 Aug 19, 2025
f847870
almost done
ymc9 Aug 19, 2025
07209d7
updates
ymc9 Aug 19, 2025
16d96b1
update
ymc9 Aug 19, 2025
25822c8
update
ymc9 Aug 20, 2025
192910f
update
ymc9 Aug 21, 2025
db39b21
add feature gap
ymc9 Aug 24, 2025
3dc70c7
update
ymc9 Aug 24, 2025
2a1cbbb
use git submodules to implement code snippet loading
ymc9 Aug 24, 2025
2fe949a
addressing review comments
ymc9 Aug 24, 2025
7d880b0
update
ymc9 Aug 26, 2025
8c059c5
v3 LP
ymc9 Aug 29, 2025
790de90
update
ymc9 Aug 29, 2025
014cbbe
update
ymc9 Aug 29, 2025
1356842
update responsiveness
ymc9 Aug 29, 2025
99c6b5a
update
ymc9 Aug 29, 2025
0fdcf9c
update
ymc9 Aug 30, 2025
2e229b3
update
ymc9 Aug 30, 2025
6b9d453
update
ymc9 Aug 30, 2025
4bd1637
nav bar
ymc9 Sep 1, 2025
277f966
update
ymc9 Sep 1, 2025
0111abb
update submodules
ymc9 Sep 1, 2025
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
18 changes: 18 additions & 0 deletions .gitmodules
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
[submodule "code-repos/zenstackhq/v3-doc-orm"]
path = code-repos/zenstackhq/v3-doc-orm
url = https://github.com/zenstackhq/v3-doc-orm.git
[submodule "code-repos/zenstackhq/v3-doc-orm-computed-fields"]
path = code-repos/zenstackhq/v3-doc-orm-computed-fields
url = https://github.com/zenstackhq/v3-doc-orm-computed-fields.git
[submodule "code-repos/zenstackhq/v3-doc-orm-computed-polymorphism"]
path = code-repos/zenstackhq/v3-doc-orm-computed-polymorphism
url = https://github.com/zenstackhq/v3-doc-orm-polymorphism.git
[submodule "code-repos/zenstackhq/v3-doc-orm-typed-json"]
path = code-repos/zenstackhq/v3-doc-orm-typed-json
url = https://github.com/zenstackhq/v3-doc-orm-typed-json.git
[submodule "code-repos/zenstackhq/v3-doc-quick-start"]
path = code-repos/zenstackhq/v3-doc-quick-start
url = https://github.com/zenstackhq/v3-doc-quick-start.git
[submodule "code-repos/zenstackhq/v3-doc-orm-polymorphism"]
path = code-repos/zenstackhq/v3-doc-orm-polymorphism
url = https://github.com/zenstackhq/v3-doc-orm-polymorphism.git
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-orm
Submodule v3-doc-orm added at bafb46
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-orm-computed-fields
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-orm-polymorphism
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-orm-typed-json
Submodule v3-doc-orm-typed-json added at 710d2c
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-quick-start
Submodule v3-doc-quick-start added at 0c8786
32 changes: 32 additions & 0 deletions docusaurus.config.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -44,6 +44,10 @@ const config = {
label: '1.x',
banner: 'none',
},
'3.x': {
label: '3.0 Beta',
banner: 'none',
},
Comment thread
ymc9 marked this conversation as resolved.
},
},
blog: false,
Expand All@@ -63,6 +67,12 @@ const config = {
themeConfig:
/** @type {import('@docusaurus/preset-classic').ThemeConfig} */
{
announcementBar: {
id: 'v3_beta',
content:
'ZenStack v3 Beta is released 🚀. The new version has replaced Prisma with a brand new query engine. <a href="/v3">Check it out</a>',
isCloseable: true,
},
colorMode: {
defaultMode: 'light',
respectPrefersColorScheme: false,
Expand DownExpand Up@@ -99,6 +109,11 @@ const config = {
position: 'left',
label: 'Handbook',
},
{
to: 'v3',
position: 'left',
label: 'V3 Beta 🚀',
},
{ to: '/blog', label: 'Blog', position: 'left' },
{
href: 'https://discord.gg/Ykhr738dUe',
Expand DownExpand Up@@ -193,6 +208,23 @@ const config = {
},
],
},
{
title: 'FlatIcon Credits',
items: [
{
label: 'Endure',
href: 'https://www.flaticon.com/free-icons/endure',
},
{
label: 'Diagram by Kiranshastry',
href: 'https://www.flaticon.com/free-icons/diagram',
},
{
href: 'https://www.flaticon.com/free-icons/database',
label: 'Database by kerismaker',
},
],
},
],
copyright: `Copyright © ${new Date().getFullYear()} ZenStack, Inc.`,
},
Expand Down
6 changes: 5 additions & 1 deletion package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,7 +12,8 @@
"serve": "docusaurus serve",
"write-translations": "docusaurus write-translations",
"write-heading-ids": "docusaurus write-heading-ids",
"typecheck": "tsc"
"typecheck": "tsc",
"pull-submodules": "git submodule foreach git pull origin main"
},
"dependencies": {
"@algolia/client-search": "^4.22.1",
Expand All@@ -22,12 +23,15 @@
"@docusaurus/theme-mermaid": "3.4.0",
"@giscus/react": "^2.4.0",
"@mdx-js/react": "^3.0.1",
"@stackblitz/sdk": "^1.11.0",
"autoprefixer": "^10.4.13",
"clsx": "^1.2.1",
"is-mobile": "^5.0.0",
"postcss": "^8.4.21",
"prism-react-renderer": "^2.3.1",
"prism-svelte": "^0.5.0",
"prismjs": "^1.29.0",
"raw-loader": "^4.0.2",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-icons": "^5.0.1",
Expand Down
31 changes: 31 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

27 changes: 27 additions & 0 deletions src/components/GithubCodeBlock.tsx
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
import CodeBlock from '@theme/CodeBlock';

interface GithubCodeBlockProps {
repoPath: string;
file: string;
}

const GithubCodeBlock: React.FC<GithubCodeBlockProps> = ({ repoPath, file }) => {
const code = require(`!!raw-loader!@site/code-repos/${repoPath}/${file}`).default;

const getLanguage = (file: string): string => {
if (file.endsWith('.ts')) {
return 'typescript';
} else if (file.endsWith('.zmodel')) {
return 'zmodel';
} else {
return 'plaintext';
}
};
return (
<CodeBlock language={getLanguage(file)} title={file}>
{code}
</CodeBlock>
);
};

export default GithubCodeBlock;
26 changes: 26 additions & 0 deletions src/components/StackBlitzEmbed.tsx
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
import React, { useEffect, useRef } from 'react';
import sdk from '@stackblitz/sdk';

interface StackBlitzEmbedProps {
projectId: string;
height?: string;
}

const StackBlitzEmbed: React.FC<StackBlitzEmbedProps> = ({ projectId, height = '600px' }) => {
const containerRef = useRef<HTMLDivElement>(null);

useEffect(() => {
if (containerRef.current) {
sdk.embedProjectId(containerRef.current, projectId, {
openFile: 'main.ts',
height,
view: 'editor',
forceEmbedLayout: true,
});
}
}, [projectId, height]);

return <div ref={containerRef} style={{ width: '100%', height }} />;
};

export default StackBlitzEmbed;
44 changes: 44 additions & 0 deletions src/components/StackBlitzGithub.tsx
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
import sdk from '@stackblitz/sdk';
import React from 'react';
import GithubCodeBlock from './GithubCodeBlock';

interface StackBlitzGithubProps {
repoPath: string;
openFile?: string;
codeFiles?: string[];
startScript?: string;
}

const StackBlitzGithub: React.FC<StackBlitzGithubProps> = ({
repoPath,
openFile = 'main.ts',
codeFiles: plainCodeFiles = undefined,
startScript,
}) => {
const options = {
openFile,
view: 'editor',
startScript,
} as const;

if (!plainCodeFiles) {
plainCodeFiles = [openFile];
}

return (
<>
<div className="mb-1 italic text-sm">
Click{' '}
<a href="#" onClick={() => sdk.openGithubProject(repoPath, options)}>
here
</a>{' '}
to open an interactive playground.
</div>
Comment thread
ymc9 marked this conversation as resolved.
{plainCodeFiles.map((file) => (
<GithubCodeBlock key={file} repoPath={repoPath} file={file} />
))}
</>
);
};

export default StackBlitzGithub;
6 changes: 3 additions & 3 deletions src/components/ValueProposition.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -33,8 +33,8 @@ const FeatureList: FeatureItem[] = [
img: '/img/ai-friendly.png',
description: (
<>
Schema-first reduces code complexity, helping AI understand better with fewer hallucinations.
Schema serves as a single source of truth for AI integration.
Schema-first reduces code complexity, helping AI understand better with fewer hallucinations. Schema
serves as a single source of truth for AI integration.
</>
),
},
Expand All@@ -47,7 +47,7 @@ function Proposition({ title, img, description }: FeatureItem) {
<img className="w-48 p-10" src={img} alt={title} />
</div>
<div className="text--center padding-horiz--md">
<h3 className="text-xl text-bold text-center lg:text-2xl text-gray-700 dark:text-gray-300">{title}</h3>
<h3 className="text-xl text-center lg:text-2xl text-gray-700 dark:text-gray-300">{title}</h3>
<p className="text-center text-base lg:text-lg text-gray-600 dark:text-gray-400">{description}</p>
</div>
</div>
Expand Down
17 changes: 17 additions & 0 deletions src/css/custom.css
Original file line numberDiff line numberDiff line change
Expand Up@@ -68,3 +68,20 @@
right: 0;
pointer-events: mouse;
}

@media (max-width: 1200px) {
.navbar__items--right,
.navbar__items--left {
display: none;
}

.navbar__toggle {
display: inherit;
}
}

@media (min-width: 1201px) {
.navbar__toggle {
display: none;
}
}
15 changes: 3 additions & 12 deletions src/lib/prism-zmodel.js
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,10 @@
Prism.languages.zmodel = Prism.languages.extend('clike', {
keyword: /\b(?:datasource|enum|generator|model|type|abstract|import|extends|attribute|view|plugin|proc)\b/,
function: /@@?[A-Za-z_]\w*/,
keyword: /\b(?:datasource|enum|generator|model|type|abstract|import|extends|attribute|view|plugin|proc|with)\b/,
entity: /\b(?:Int|String|Boolean|DateTime|Float|Decimal|BigInt|Bytes|Json|Unsupported)\b/,
'type-class-name': /(\b()\s+)[\w.\\]+/,
});
Comment thread
ymc9 marked this conversation as resolved.

Prism.languages.javascript['class-name'][0].pattern =
/(\b(?:model|datasource|enum|generator|type|plugin|abstract)\s+)[\w.\\]+/;

Prism.languages.insertBefore('zmodel', 'function', {
annotation: {
pattern: /(^|[^.])@+\w+/,
lookbehind: true,
alias: 'punctuation',
},
});

Prism.languages.insertBefore('zmodel', 'punctuation', {
'type-args': /\b(?:references|fields|onDelete|onUpdate):/,
});
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
29771e6
docs: v3 docs structure
ymc9 Aug 1, 2025
4a3bc18
fix build
ymc9 Aug 1, 2025
ae00828
WIP
ymc9 Aug 3, 2025
2815551
WIP
ymc9 Aug 3, 2025
f215f86
progress on ORM part
ymc9 Aug 5, 2025
a43c1d8
update
ymc9 Aug 5, 2025
f649467
update embed mechanism
ymc9 Aug 5, 2025
5cfdf6d
fix stackblitz embed
ymc9 Aug 5, 2025
2c526ff
make code tabs sync
ymc9 Aug 5, 2025
a9d76ec
complete filter section
ymc9 Aug 9, 2025
09208d3
update docs
ymc9 Aug 9, 2025
b61a2e0
progress on delete
ymc9 Aug 9, 2025
80a8026
Merge remote-tracking branch 'origin/main' into docs/v3
ymc9 Aug 10, 2025
7531a18
more progress on ORM API
ymc9 Aug 10, 2025
c608cf4
ORM docs progress
ymc9 Aug 12, 2025
710b83c
query builder docs
ymc9 Aug 12, 2025
f0014f0
computed fields
ymc9 Aug 13, 2025
016fc3d
polymorphism
ymc9 Aug 13, 2025
963d91f
plugins part
ymc9 Aug 13, 2025
dda23fc
update plugins part
ymc9 Aug 14, 2025
d7b5e4e
add logging
ymc9 Aug 14, 2025
e087eb8
add inferred types section
ymc9 Aug 15, 2025
617275e
progress
ymc9 Aug 15, 2025
6ff3510
progress
ymc9 Aug 17, 2025
22de9b9
prisma migration guide
ymc9 Aug 17, 2025
63d5c61
Merge remote-tracking branch 'origin/main' into docs/v3
ymc9 Aug 17, 2025
2fd667e
update broken links
ymc9 Aug 17, 2025
b9e6193
update
ymc9 Aug 17, 2025
1a2a102
copywriting
ymc9 Aug 18, 2025
847a11e
zmodel language reference
ymc9 Aug 19, 2025
ec14645
update
ymc9 Aug 19, 2025
3ebe44f
fix links
ymc9 Aug 19, 2025
f847870
almost done
ymc9 Aug 19, 2025
07209d7
updates
ymc9 Aug 19, 2025
16d96b1
update
ymc9 Aug 19, 2025
25822c8
update
ymc9 Aug 20, 2025
192910f
update
ymc9 Aug 21, 2025
db39b21
add feature gap
ymc9 Aug 24, 2025
3dc70c7
update
ymc9 Aug 24, 2025
2a1cbbb
use git submodules to implement code snippet loading
ymc9 Aug 24, 2025
2fe949a
addressing review comments
ymc9 Aug 24, 2025
7d880b0
update
ymc9 Aug 26, 2025
8c059c5
v3 LP
ymc9 Aug 29, 2025
790de90
update
ymc9 Aug 29, 2025
014cbbe
update
ymc9 Aug 29, 2025
1356842
update responsiveness
ymc9 Aug 29, 2025
99c6b5a
update
ymc9 Aug 29, 2025
0fdcf9c
update
ymc9 Aug 30, 2025
2e229b3
update
ymc9 Aug 30, 2025
6b9d453
update
ymc9 Aug 30, 2025
4bd1637
nav bar
ymc9 Sep 1, 2025
277f966
update
ymc9 Sep 1, 2025
0111abb
update submodules
ymc9 Sep 1, 2025
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
18 changes: 18 additions & 0 deletions .gitmodules
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
[submodule "code-repos/zenstackhq/v3-doc-orm"]
path = code-repos/zenstackhq/v3-doc-orm
url = https://github.com/zenstackhq/v3-doc-orm.git
[submodule "code-repos/zenstackhq/v3-doc-orm-computed-fields"]
path = code-repos/zenstackhq/v3-doc-orm-computed-fields
url = https://github.com/zenstackhq/v3-doc-orm-computed-fields.git
[submodule "code-repos/zenstackhq/v3-doc-orm-computed-polymorphism"]
path = code-repos/zenstackhq/v3-doc-orm-computed-polymorphism
url = https://github.com/zenstackhq/v3-doc-orm-polymorphism.git
[submodule "code-repos/zenstackhq/v3-doc-orm-typed-json"]
path = code-repos/zenstackhq/v3-doc-orm-typed-json
url = https://github.com/zenstackhq/v3-doc-orm-typed-json.git
[submodule "code-repos/zenstackhq/v3-doc-quick-start"]
path = code-repos/zenstackhq/v3-doc-quick-start
url = https://github.com/zenstackhq/v3-doc-quick-start.git
[submodule "code-repos/zenstackhq/v3-doc-orm-polymorphism"]
path = code-repos/zenstackhq/v3-doc-orm-polymorphism
url = https://github.com/zenstackhq/v3-doc-orm-polymorphism.git
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-orm
Submodule v3-doc-orm added at bafb46
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-orm-computed-fields
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-orm-polymorphism
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-orm-typed-json
Submodule v3-doc-orm-typed-json added at 710d2c
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-quick-start
Submodule v3-doc-quick-start added at 0c8786
32 changes: 32 additions & 0 deletions docusaurus.config.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -44,6 +44,10 @@ const config = {
label: '1.x',
banner: 'none',
},
'3.x': {
label: '3.0 Beta',
banner: 'none',
},
Comment thread
ymc9 marked this conversation as resolved.
},
},
blog: false,
Expand All@@ -63,6 +67,12 @@ const config = {
themeConfig:
/** @type {import('@docusaurus/preset-classic').ThemeConfig} */
{
announcementBar: {
id: 'v3_beta',
content:
'ZenStack v3 Beta is released 🚀. The new version has replaced Prisma with a brand new query engine. <a href="/v3">Check it out</a>',
isCloseable: true,
},
colorMode: {
defaultMode: 'light',
respectPrefersColorScheme: false,
Expand DownExpand Up@@ -99,6 +109,11 @@ const config = {
position: 'left',
label: 'Handbook',
},
{
to: 'v3',
position: 'left',
label: 'V3 Beta 🚀',
},
{ to: '/blog', label: 'Blog', position: 'left' },
{
href: 'https://discord.gg/Ykhr738dUe',
Expand DownExpand Up@@ -193,6 +208,23 @@ const config = {
},
],
},
{
title: 'FlatIcon Credits',
items: [
{
label: 'Endure',
href: 'https://www.flaticon.com/free-icons/endure',
},
{
label: 'Diagram by Kiranshastry',
href: 'https://www.flaticon.com/free-icons/diagram',
},
{
href: 'https://www.flaticon.com/free-icons/database',
label: 'Database by kerismaker',
},
],
},
],
copyright: `Copyright © ${new Date().getFullYear()} ZenStack, Inc.`,
},
Expand Down
6 changes: 5 additions & 1 deletion package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,7 +12,8 @@
"serve": "docusaurus serve",
"write-translations": "docusaurus write-translations",
"write-heading-ids": "docusaurus write-heading-ids",
"typecheck": "tsc"
"typecheck": "tsc",
"pull-submodules": "git submodule foreach git pull origin main"
},
"dependencies": {
"@algolia/client-search": "^4.22.1",
Expand All@@ -22,12 +23,15 @@
"@docusaurus/theme-mermaid": "3.4.0",
"@giscus/react": "^2.4.0",
"@mdx-js/react": "^3.0.1",
"@stackblitz/sdk": "^1.11.0",
"autoprefixer": "^10.4.13",
"clsx": "^1.2.1",
"is-mobile": "^5.0.0",
"postcss": "^8.4.21",
"prism-react-renderer": "^2.3.1",
"prism-svelte": "^0.5.0",
"prismjs": "^1.29.0",
"raw-loader": "^4.0.2",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-icons": "^5.0.1",
Expand Down
31 changes: 31 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

27 changes: 27 additions & 0 deletions src/components/GithubCodeBlock.tsx
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
import CodeBlock from '@theme/CodeBlock';

interface GithubCodeBlockProps {
repoPath: string;
file: string;
}

const GithubCodeBlock: React.FC<GithubCodeBlockProps> = ({ repoPath, file }) => {
const code = require(`!!raw-loader!@site/code-repos/${repoPath}/${file}`).default;

const getLanguage = (file: string): string => {
if (file.endsWith('.ts')) {
return 'typescript';
} else if (file.endsWith('.zmodel')) {
return 'zmodel';
} else {
return 'plaintext';
}
};
return (
<CodeBlock language={getLanguage(file)} title={file}>
{code}
</CodeBlock>
);
};

export default GithubCodeBlock;
26 changes: 26 additions & 0 deletions src/components/StackBlitzEmbed.tsx
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
import React, { useEffect, useRef } from 'react';
import sdk from '@stackblitz/sdk';

interface StackBlitzEmbedProps {
projectId: string;
height?: string;
}

const StackBlitzEmbed: React.FC<StackBlitzEmbedProps> = ({ projectId, height = '600px' }) => {
const containerRef = useRef<HTMLDivElement>(null);

useEffect(() => {
if (containerRef.current) {
sdk.embedProjectId(containerRef.current, projectId, {
openFile: 'main.ts',
height,
view: 'editor',
forceEmbedLayout: true,
});
}
}, [projectId, height]);

return <div ref={containerRef} style={{ width: '100%', height }} />;
};

export default StackBlitzEmbed;
44 changes: 44 additions & 0 deletions src/components/StackBlitzGithub.tsx
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
import sdk from '@stackblitz/sdk';
import React from 'react';
import GithubCodeBlock from './GithubCodeBlock';

interface StackBlitzGithubProps {
repoPath: string;
openFile?: string;
codeFiles?: string[];
startScript?: string;
}

const StackBlitzGithub: React.FC<StackBlitzGithubProps> = ({
repoPath,
openFile = 'main.ts',
codeFiles: plainCodeFiles = undefined,
startScript,
}) => {
const options = {
openFile,
view: 'editor',
startScript,
} as const;

if (!plainCodeFiles) {
plainCodeFiles = [openFile];
}

return (
<>
<div className="mb-1 italic text-sm">
Click{' '}
<a href="#" onClick={() => sdk.openGithubProject(repoPath, options)}>
here
</a>{' '}
to open an interactive playground.
</div>
Comment thread
ymc9 marked this conversation as resolved.
{plainCodeFiles.map((file) => (
<GithubCodeBlock key={file} repoPath={repoPath} file={file} />
))}
</>
);
};

export default StackBlitzGithub;
6 changes: 3 additions & 3 deletions src/components/ValueProposition.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -33,8 +33,8 @@ const FeatureList: FeatureItem[] = [
img: '/img/ai-friendly.png',
description: (
<>
Schema-first reduces code complexity, helping AI understand better with fewer hallucinations.
Schema serves as a single source of truth for AI integration.
Schema-first reduces code complexity, helping AI understand better with fewer hallucinations. Schema
serves as a single source of truth for AI integration.
</>
),
},
Expand All@@ -47,7 +47,7 @@ function Proposition({ title, img, description }: FeatureItem) {
<img className="w-48 p-10" src={img} alt={title} />
</div>
<div className="text--center padding-horiz--md">
<h3 className="text-xl text-bold text-center lg:text-2xl text-gray-700 dark:text-gray-300">{title}</h3>
<h3 className="text-xl text-center lg:text-2xl text-gray-700 dark:text-gray-300">{title}</h3>
<p className="text-center text-base lg:text-lg text-gray-600 dark:text-gray-400">{description}</p>
</div>
</div>
Expand Down
17 changes: 17 additions & 0 deletions src/css/custom.css
Original file line numberDiff line numberDiff line change
Expand Up@@ -68,3 +68,20 @@
right: 0;
pointer-events: mouse;
}

@media (max-width: 1200px) {
.navbar__items--right,
.navbar__items--left {
display: none;
}

.navbar__toggle {
display: inherit;
}
}

@media (min-width: 1201px) {
.navbar__toggle {
display: none;
}
}
15 changes: 3 additions & 12 deletions src/lib/prism-zmodel.js
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,10 @@
Prism.languages.zmodel = Prism.languages.extend('clike', {
keyword: /\b(?:datasource|enum|generator|model|type|abstract|import|extends|attribute|view|plugin|proc)\b/,
function: /@@?[A-Za-z_]\w*/,
keyword: /\b(?:datasource|enum|generator|model|type|abstract|import|extends|attribute|view|plugin|proc|with)\b/,
entity: /\b(?:Int|String|Boolean|DateTime|Float|Decimal|BigInt|Bytes|Json|Unsupported)\b/,
'type-class-name': /(\b()\s+)[\w.\\]+/,
});
Comment thread
ymc9 marked this conversation as resolved.

Prism.languages.javascript['class-name'][0].pattern =
/(\b(?:model|datasource|enum|generator|type|plugin|abstract)\s+)[\w.\\]+/;

Prism.languages.insertBefore('zmodel', 'function', {
annotation: {
pattern: /(^|[^.])@+\w+/,
lookbehind: true,
alias: 'punctuation',
},
});

Prism.languages.insertBefore('zmodel', 'punctuation', {
'type-args': /\b(?:references|fields|onDelete|onUpdate):/,
});
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
29771e6
docs: v3 docs structure
ymc9 Aug 1, 2025
4a3bc18
fix build
ymc9 Aug 1, 2025
ae00828
WIP
ymc9 Aug 3, 2025
2815551
WIP
ymc9 Aug 3, 2025
f215f86
progress on ORM part
ymc9 Aug 5, 2025
a43c1d8
update
ymc9 Aug 5, 2025
f649467
update embed mechanism
ymc9 Aug 5, 2025
5cfdf6d
fix stackblitz embed
ymc9 Aug 5, 2025
2c526ff
make code tabs sync
ymc9 Aug 5, 2025
a9d76ec
complete filter section
ymc9 Aug 9, 2025
09208d3
update docs
ymc9 Aug 9, 2025
b61a2e0
progress on delete
ymc9 Aug 9, 2025
80a8026
Merge remote-tracking branch 'origin/main' into docs/v3
ymc9 Aug 10, 2025
7531a18
more progress on ORM API
ymc9 Aug 10, 2025
c608cf4
ORM docs progress
ymc9 Aug 12, 2025
710b83c
query builder docs
ymc9 Aug 12, 2025
f0014f0
computed fields
ymc9 Aug 13, 2025
016fc3d
polymorphism
ymc9 Aug 13, 2025
963d91f
plugins part
ymc9 Aug 13, 2025
dda23fc
update plugins part
ymc9 Aug 14, 2025
d7b5e4e
add logging
ymc9 Aug 14, 2025
e087eb8
add inferred types section
ymc9 Aug 15, 2025
617275e
progress
ymc9 Aug 15, 2025
6ff3510
progress
ymc9 Aug 17, 2025
22de9b9
prisma migration guide
ymc9 Aug 17, 2025
63d5c61
Merge remote-tracking branch 'origin/main' into docs/v3
ymc9 Aug 17, 2025
2fd667e
update broken links
ymc9 Aug 17, 2025
b9e6193
update
ymc9 Aug 17, 2025
1a2a102
copywriting
ymc9 Aug 18, 2025
847a11e
zmodel language reference
ymc9 Aug 19, 2025
ec14645
update
ymc9 Aug 19, 2025
3ebe44f
fix links
ymc9 Aug 19, 2025
f847870
almost done
ymc9 Aug 19, 2025
07209d7
updates
ymc9 Aug 19, 2025
16d96b1
update
ymc9 Aug 19, 2025
25822c8
update
ymc9 Aug 20, 2025
192910f
update
ymc9 Aug 21, 2025
db39b21
add feature gap
ymc9 Aug 24, 2025
3dc70c7
update
ymc9 Aug 24, 2025
2a1cbbb
use git submodules to implement code snippet loading
ymc9 Aug 24, 2025
2fe949a
addressing review comments
ymc9 Aug 24, 2025
7d880b0
update
ymc9 Aug 26, 2025
8c059c5
v3 LP
ymc9 Aug 29, 2025
790de90
update
ymc9 Aug 29, 2025
014cbbe
update
ymc9 Aug 29, 2025
1356842
update responsiveness
ymc9 Aug 29, 2025
99c6b5a
update
ymc9 Aug 29, 2025
0fdcf9c
update
ymc9 Aug 30, 2025
2e229b3
update
ymc9 Aug 30, 2025
6b9d453
update
ymc9 Aug 30, 2025
4bd1637
nav bar
ymc9 Sep 1, 2025
277f966
update
ymc9 Sep 1, 2025
0111abb
update submodules
ymc9 Sep 1, 2025
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
18 changes: 18 additions & 0 deletions .gitmodules
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
[submodule "code-repos/zenstackhq/v3-doc-orm"]
path = code-repos/zenstackhq/v3-doc-orm
url = https://github.com/zenstackhq/v3-doc-orm.git
[submodule "code-repos/zenstackhq/v3-doc-orm-computed-fields"]
path = code-repos/zenstackhq/v3-doc-orm-computed-fields
url = https://github.com/zenstackhq/v3-doc-orm-computed-fields.git
[submodule "code-repos/zenstackhq/v3-doc-orm-computed-polymorphism"]
path = code-repos/zenstackhq/v3-doc-orm-computed-polymorphism
url = https://github.com/zenstackhq/v3-doc-orm-polymorphism.git
[submodule "code-repos/zenstackhq/v3-doc-orm-typed-json"]
path = code-repos/zenstackhq/v3-doc-orm-typed-json
url = https://github.com/zenstackhq/v3-doc-orm-typed-json.git
[submodule "code-repos/zenstackhq/v3-doc-quick-start"]
path = code-repos/zenstackhq/v3-doc-quick-start
url = https://github.com/zenstackhq/v3-doc-quick-start.git
[submodule "code-repos/zenstackhq/v3-doc-orm-polymorphism"]
path = code-repos/zenstackhq/v3-doc-orm-polymorphism
url = https://github.com/zenstackhq/v3-doc-orm-polymorphism.git
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-orm
Submodule v3-doc-orm added at bafb46
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-orm-computed-fields
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-orm-polymorphism
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-orm-typed-json
Submodule v3-doc-orm-typed-json added at 710d2c
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-quick-start
Submodule v3-doc-quick-start added at 0c8786
32 changes: 32 additions & 0 deletions docusaurus.config.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -44,6 +44,10 @@ const config = {
label: '1.x',
banner: 'none',
},
'3.x': {
label: '3.0 Beta',
banner: 'none',
},
Comment thread
ymc9 marked this conversation as resolved.
},
},
blog: false,
Expand All@@ -63,6 +67,12 @@ const config = {
themeConfig:
/** @type {import('@docusaurus/preset-classic').ThemeConfig} */
{
announcementBar: {
id: 'v3_beta',
content:
'ZenStack v3 Beta is released 🚀. The new version has replaced Prisma with a brand new query engine. <a href="/v3">Check it out</a>',
isCloseable: true,
},
colorMode: {
defaultMode: 'light',
respectPrefersColorScheme: false,
Expand DownExpand Up@@ -99,6 +109,11 @@ const config = {
position: 'left',
label: 'Handbook',
},
{
to: 'v3',
position: 'left',
label: 'V3 Beta 🚀',
},
{ to: '/blog', label: 'Blog', position: 'left' },
{
href: 'https://discord.gg/Ykhr738dUe',
Expand DownExpand Up@@ -193,6 +208,23 @@ const config = {
},
],
},
{
title: 'FlatIcon Credits',
items: [
{
label: 'Endure',
href: 'https://www.flaticon.com/free-icons/endure',
},
{
label: 'Diagram by Kiranshastry',
href: 'https://www.flaticon.com/free-icons/diagram',
},
{
href: 'https://www.flaticon.com/free-icons/database',
label: 'Database by kerismaker',
},
],
},
],
copyright: `Copyright © ${new Date().getFullYear()} ZenStack, Inc.`,
},
Expand Down
6 changes: 5 additions & 1 deletion package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,7 +12,8 @@
"serve": "docusaurus serve",
"write-translations": "docusaurus write-translations",
"write-heading-ids": "docusaurus write-heading-ids",
"typecheck": "tsc"
"typecheck": "tsc",
"pull-submodules": "git submodule foreach git pull origin main"
},
"dependencies": {
"@algolia/client-search": "^4.22.1",
Expand All@@ -22,12 +23,15 @@
"@docusaurus/theme-mermaid": "3.4.0",
"@giscus/react": "^2.4.0",
"@mdx-js/react": "^3.0.1",
"@stackblitz/sdk": "^1.11.0",
"autoprefixer": "^10.4.13",
"clsx": "^1.2.1",
"is-mobile": "^5.0.0",
"postcss": "^8.4.21",
"prism-react-renderer": "^2.3.1",
"prism-svelte": "^0.5.0",
"prismjs": "^1.29.0",
"raw-loader": "^4.0.2",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-icons": "^5.0.1",
Expand Down
31 changes: 31 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

27 changes: 27 additions & 0 deletions src/components/GithubCodeBlock.tsx
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
import CodeBlock from '@theme/CodeBlock';

interface GithubCodeBlockProps {
repoPath: string;
file: string;
}

const GithubCodeBlock: React.FC<GithubCodeBlockProps> = ({ repoPath, file }) => {
const code = require(`!!raw-loader!@site/code-repos/${repoPath}/${file}`).default;

const getLanguage = (file: string): string => {
if (file.endsWith('.ts')) {
return 'typescript';
} else if (file.endsWith('.zmodel')) {
return 'zmodel';
} else {
return 'plaintext';
}
};
return (
<CodeBlock language={getLanguage(file)} title={file}>
{code}
</CodeBlock>
);
};

export default GithubCodeBlock;
26 changes: 26 additions & 0 deletions src/components/StackBlitzEmbed.tsx
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
import React, { useEffect, useRef } from 'react';
import sdk from '@stackblitz/sdk';

interface StackBlitzEmbedProps {
projectId: string;
height?: string;
}

const StackBlitzEmbed: React.FC<StackBlitzEmbedProps> = ({ projectId, height = '600px' }) => {
const containerRef = useRef<HTMLDivElement>(null);

useEffect(() => {
if (containerRef.current) {
sdk.embedProjectId(containerRef.current, projectId, {
openFile: 'main.ts',
height,
view: 'editor',
forceEmbedLayout: true,
});
}
}, [projectId, height]);

return <div ref={containerRef} style={{ width: '100%', height }} />;
};

export default StackBlitzEmbed;
44 changes: 44 additions & 0 deletions src/components/StackBlitzGithub.tsx
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
import sdk from '@stackblitz/sdk';
import React from 'react';
import GithubCodeBlock from './GithubCodeBlock';

interface StackBlitzGithubProps {
repoPath: string;
openFile?: string;
codeFiles?: string[];
startScript?: string;
}

const StackBlitzGithub: React.FC<StackBlitzGithubProps> = ({
repoPath,
openFile = 'main.ts',
codeFiles: plainCodeFiles = undefined,
startScript,
}) => {
const options = {
openFile,
view: 'editor',
startScript,
} as const;

if (!plainCodeFiles) {
plainCodeFiles = [openFile];
}

return (
<>
<div className="mb-1 italic text-sm">
Click{' '}
<a href="#" onClick={() => sdk.openGithubProject(repoPath, options)}>
here
</a>{' '}
to open an interactive playground.
</div>
Comment thread
ymc9 marked this conversation as resolved.
{plainCodeFiles.map((file) => (
<GithubCodeBlock key={file} repoPath={repoPath} file={file} />
))}
</>
);
};

export default StackBlitzGithub;
6 changes: 3 additions & 3 deletions src/components/ValueProposition.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -33,8 +33,8 @@ const FeatureList: FeatureItem[] = [
img: '/img/ai-friendly.png',
description: (
<>
Schema-first reduces code complexity, helping AI understand better with fewer hallucinations.
Schema serves as a single source of truth for AI integration.
Schema-first reduces code complexity, helping AI understand better with fewer hallucinations. Schema
serves as a single source of truth for AI integration.
</>
),
},
Expand All@@ -47,7 +47,7 @@ function Proposition({ title, img, description }: FeatureItem) {
<img className="w-48 p-10" src={img} alt={title} />
</div>
<div className="text--center padding-horiz--md">
<h3 className="text-xl text-bold text-center lg:text-2xl text-gray-700 dark:text-gray-300">{title}</h3>
<h3 className="text-xl text-center lg:text-2xl text-gray-700 dark:text-gray-300">{title}</h3>
<p className="text-center text-base lg:text-lg text-gray-600 dark:text-gray-400">{description}</p>
</div>
</div>
Expand Down
17 changes: 17 additions & 0 deletions src/css/custom.css
Original file line numberDiff line numberDiff line change
Expand Up@@ -68,3 +68,20 @@
right: 0;
pointer-events: mouse;
}

@media (max-width: 1200px) {
.navbar__items--right,
.navbar__items--left {
display: none;
}

.navbar__toggle {
display: inherit;
}
}

@media (min-width: 1201px) {
.navbar__toggle {
display: none;
}
}
15 changes: 3 additions & 12 deletions src/lib/prism-zmodel.js
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,10 @@
Prism.languages.zmodel = Prism.languages.extend('clike', {
keyword: /\b(?:datasource|enum|generator|model|type|abstract|import|extends|attribute|view|plugin|proc)\b/,
function: /@@?[A-Za-z_]\w*/,
keyword: /\b(?:datasource|enum|generator|model|type|abstract|import|extends|attribute|view|plugin|proc|with)\b/,
entity: /\b(?:Int|String|Boolean|DateTime|Float|Decimal|BigInt|Bytes|Json|Unsupported)\b/,
'type-class-name': /(\b()\s+)[\w.\\]+/,
});
Comment thread
ymc9 marked this conversation as resolved.

Prism.languages.javascript['class-name'][0].pattern =
/(\b(?:model|datasource|enum|generator|type|plugin|abstract)\s+)[\w.\\]+/;

Prism.languages.insertBefore('zmodel', 'function', {
annotation: {
pattern: /(^|[^.])@+\w+/,
lookbehind: true,
alias: 'punctuation',
},
});

Prism.languages.insertBefore('zmodel', 'punctuation', {
'type-args': /\b(?:references|fields|onDelete|onUpdate):/,
});
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
29771e6
docs: v3 docs structure
ymc9 Aug 1, 2025
4a3bc18
fix build
ymc9 Aug 1, 2025
ae00828
WIP
ymc9 Aug 3, 2025
2815551
WIP
ymc9 Aug 3, 2025
f215f86
progress on ORM part
ymc9 Aug 5, 2025
a43c1d8
update
ymc9 Aug 5, 2025
f649467
update embed mechanism
ymc9 Aug 5, 2025
5cfdf6d
fix stackblitz embed
ymc9 Aug 5, 2025
2c526ff
make code tabs sync
ymc9 Aug 5, 2025
a9d76ec
complete filter section
ymc9 Aug 9, 2025
09208d3
update docs
ymc9 Aug 9, 2025
b61a2e0
progress on delete
ymc9 Aug 9, 2025
80a8026
Merge remote-tracking branch 'origin/main' into docs/v3
ymc9 Aug 10, 2025
7531a18
more progress on ORM API
ymc9 Aug 10, 2025
c608cf4
ORM docs progress
ymc9 Aug 12, 2025
710b83c
query builder docs
ymc9 Aug 12, 2025
f0014f0
computed fields
ymc9 Aug 13, 2025
016fc3d
polymorphism
ymc9 Aug 13, 2025
963d91f
plugins part
ymc9 Aug 13, 2025
dda23fc
update plugins part
ymc9 Aug 14, 2025
d7b5e4e
add logging
ymc9 Aug 14, 2025
e087eb8
add inferred types section
ymc9 Aug 15, 2025
617275e
progress
ymc9 Aug 15, 2025
6ff3510
progress
ymc9 Aug 17, 2025
22de9b9
prisma migration guide
ymc9 Aug 17, 2025
63d5c61
Merge remote-tracking branch 'origin/main' into docs/v3
ymc9 Aug 17, 2025
2fd667e
update broken links
ymc9 Aug 17, 2025
b9e6193
update
ymc9 Aug 17, 2025
1a2a102
copywriting
ymc9 Aug 18, 2025
847a11e
zmodel language reference
ymc9 Aug 19, 2025
ec14645
update
ymc9 Aug 19, 2025
3ebe44f
fix links
ymc9 Aug 19, 2025
f847870
almost done
ymc9 Aug 19, 2025
07209d7
updates
ymc9 Aug 19, 2025
16d96b1
update
ymc9 Aug 19, 2025
25822c8
update
ymc9 Aug 20, 2025
192910f
update
ymc9 Aug 21, 2025
db39b21
add feature gap
ymc9 Aug 24, 2025
3dc70c7
update
ymc9 Aug 24, 2025
2a1cbbb
use git submodules to implement code snippet loading
ymc9 Aug 24, 2025
2fe949a
addressing review comments
ymc9 Aug 24, 2025
7d880b0
update
ymc9 Aug 26, 2025
8c059c5
v3 LP
ymc9 Aug 29, 2025
790de90
update
ymc9 Aug 29, 2025
014cbbe
update
ymc9 Aug 29, 2025
1356842
update responsiveness
ymc9 Aug 29, 2025
99c6b5a
update
ymc9 Aug 29, 2025
0fdcf9c
update
ymc9 Aug 30, 2025
2e229b3
update
ymc9 Aug 30, 2025
6b9d453
update
ymc9 Aug 30, 2025
4bd1637
nav bar
ymc9 Sep 1, 2025
277f966
update
ymc9 Sep 1, 2025
0111abb
update submodules
ymc9 Sep 1, 2025
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
18 changes: 18 additions & 0 deletions .gitmodules
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
[submodule "code-repos/zenstackhq/v3-doc-orm"]
path = code-repos/zenstackhq/v3-doc-orm
url = https://github.com/zenstackhq/v3-doc-orm.git
[submodule "code-repos/zenstackhq/v3-doc-orm-computed-fields"]
path = code-repos/zenstackhq/v3-doc-orm-computed-fields
url = https://github.com/zenstackhq/v3-doc-orm-computed-fields.git
[submodule "code-repos/zenstackhq/v3-doc-orm-computed-polymorphism"]
path = code-repos/zenstackhq/v3-doc-orm-computed-polymorphism
url = https://github.com/zenstackhq/v3-doc-orm-polymorphism.git
[submodule "code-repos/zenstackhq/v3-doc-orm-typed-json"]
path = code-repos/zenstackhq/v3-doc-orm-typed-json
url = https://github.com/zenstackhq/v3-doc-orm-typed-json.git
[submodule "code-repos/zenstackhq/v3-doc-quick-start"]
path = code-repos/zenstackhq/v3-doc-quick-start
url = https://github.com/zenstackhq/v3-doc-quick-start.git
[submodule "code-repos/zenstackhq/v3-doc-orm-polymorphism"]
path = code-repos/zenstackhq/v3-doc-orm-polymorphism
url = https://github.com/zenstackhq/v3-doc-orm-polymorphism.git
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-orm
Submodule v3-doc-orm added at bafb46
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-orm-computed-fields
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-orm-polymorphism
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-orm-typed-json
Submodule v3-doc-orm-typed-json added at 710d2c
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-quick-start
Submodule v3-doc-quick-start added at 0c8786
32 changes: 32 additions & 0 deletions docusaurus.config.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -44,6 +44,10 @@ const config = {
label: '1.x',
banner: 'none',
},
'3.x': {
label: '3.0 Beta',
banner: 'none',
},
Comment thread
ymc9 marked this conversation as resolved.
},
},
blog: false,
Expand All@@ -63,6 +67,12 @@ const config = {
themeConfig:
/** @type {import('@docusaurus/preset-classic').ThemeConfig} */
{
announcementBar: {
id: 'v3_beta',
content:
'ZenStack v3 Beta is released 🚀. The new version has replaced Prisma with a brand new query engine. <a href="/v3">Check it out</a>',
isCloseable: true,
},
colorMode: {
defaultMode: 'light',
respectPrefersColorScheme: false,
Expand DownExpand Up@@ -99,6 +109,11 @@ const config = {
position: 'left',
label: 'Handbook',
},
{
to: 'v3',
position: 'left',
label: 'V3 Beta 🚀',
},
{ to: '/blog', label: 'Blog', position: 'left' },
{
href: 'https://discord.gg/Ykhr738dUe',
Expand DownExpand Up@@ -193,6 +208,23 @@ const config = {
},
],
},
{
title: 'FlatIcon Credits',
items: [
{
label: 'Endure',
href: 'https://www.flaticon.com/free-icons/endure',
},
{
label: 'Diagram by Kiranshastry',
href: 'https://www.flaticon.com/free-icons/diagram',
},
{
href: 'https://www.flaticon.com/free-icons/database',
label: 'Database by kerismaker',
},
],
},
],
copyright: `Copyright © ${new Date().getFullYear()} ZenStack, Inc.`,
},
Expand Down
6 changes: 5 additions & 1 deletion package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,7 +12,8 @@
"serve": "docusaurus serve",
"write-translations": "docusaurus write-translations",
"write-heading-ids": "docusaurus write-heading-ids",
"typecheck": "tsc"
"typecheck": "tsc",
"pull-submodules": "git submodule foreach git pull origin main"
},
"dependencies": {
"@algolia/client-search": "^4.22.1",
Expand All@@ -22,12 +23,15 @@
"@docusaurus/theme-mermaid": "3.4.0",
"@giscus/react": "^2.4.0",
"@mdx-js/react": "^3.0.1",
"@stackblitz/sdk": "^1.11.0",
"autoprefixer": "^10.4.13",
"clsx": "^1.2.1",
"is-mobile": "^5.0.0",
"postcss": "^8.4.21",
"prism-react-renderer": "^2.3.1",
"prism-svelte": "^0.5.0",
"prismjs": "^1.29.0",
"raw-loader": "^4.0.2",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-icons": "^5.0.1",
Expand Down
31 changes: 31 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

27 changes: 27 additions & 0 deletions src/components/GithubCodeBlock.tsx
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
import CodeBlock from '@theme/CodeBlock';

interface GithubCodeBlockProps {
repoPath: string;
file: string;
}

const GithubCodeBlock: React.FC<GithubCodeBlockProps> = ({ repoPath, file }) => {
const code = require(`!!raw-loader!@site/code-repos/${repoPath}/${file}`).default;

const getLanguage = (file: string): string => {
if (file.endsWith('.ts')) {
return 'typescript';
} else if (file.endsWith('.zmodel')) {
return 'zmodel';
} else {
return 'plaintext';
}
};
return (
<CodeBlock language={getLanguage(file)} title={file}>
{code}
</CodeBlock>
);
};

export default GithubCodeBlock;
26 changes: 26 additions & 0 deletions src/components/StackBlitzEmbed.tsx
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
import React, { useEffect, useRef } from 'react';
import sdk from '@stackblitz/sdk';

interface StackBlitzEmbedProps {
projectId: string;
height?: string;
}

const StackBlitzEmbed: React.FC<StackBlitzEmbedProps> = ({ projectId, height = '600px' }) => {
const containerRef = useRef<HTMLDivElement>(null);

useEffect(() => {
if (containerRef.current) {
sdk.embedProjectId(containerRef.current, projectId, {
openFile: 'main.ts',
height,
view: 'editor',
forceEmbedLayout: true,
});
}
}, [projectId, height]);

return <div ref={containerRef} style={{ width: '100%', height }} />;
};

export default StackBlitzEmbed;
44 changes: 44 additions & 0 deletions src/components/StackBlitzGithub.tsx
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
import sdk from '@stackblitz/sdk';
import React from 'react';
import GithubCodeBlock from './GithubCodeBlock';

interface StackBlitzGithubProps {
repoPath: string;
openFile?: string;
codeFiles?: string[];
startScript?: string;
}

const StackBlitzGithub: React.FC<StackBlitzGithubProps> = ({
repoPath,
openFile = 'main.ts',
codeFiles: plainCodeFiles = undefined,
startScript,
}) => {
const options = {
openFile,
view: 'editor',
startScript,
} as const;

if (!plainCodeFiles) {
plainCodeFiles = [openFile];
}

return (
<>
<div className="mb-1 italic text-sm">
Click{' '}
<a href="#" onClick={() => sdk.openGithubProject(repoPath, options)}>
here
</a>{' '}
to open an interactive playground.
</div>
Comment thread
ymc9 marked this conversation as resolved.
{plainCodeFiles.map((file) => (
<GithubCodeBlock key={file} repoPath={repoPath} file={file} />
))}
</>
);
};

export default StackBlitzGithub;
6 changes: 3 additions & 3 deletions src/components/ValueProposition.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -33,8 +33,8 @@ const FeatureList: FeatureItem[] = [
img: '/img/ai-friendly.png',
description: (
<>
Schema-first reduces code complexity, helping AI understand better with fewer hallucinations.
Schema serves as a single source of truth for AI integration.
Schema-first reduces code complexity, helping AI understand better with fewer hallucinations. Schema
serves as a single source of truth for AI integration.
</>
),
},
Expand All@@ -47,7 +47,7 @@ function Proposition({ title, img, description }: FeatureItem) {
<img className="w-48 p-10" src={img} alt={title} />
</div>
<div className="text--center padding-horiz--md">
<h3 className="text-xl text-bold text-center lg:text-2xl text-gray-700 dark:text-gray-300">{title}</h3>
<h3 className="text-xl text-center lg:text-2xl text-gray-700 dark:text-gray-300">{title}</h3>
<p className="text-center text-base lg:text-lg text-gray-600 dark:text-gray-400">{description}</p>
</div>
</div>
Expand Down
17 changes: 17 additions & 0 deletions src/css/custom.css
Original file line numberDiff line numberDiff line change
Expand Up@@ -68,3 +68,20 @@
right: 0;
pointer-events: mouse;
}

@media (max-width: 1200px) {
.navbar__items--right,
.navbar__items--left {
display: none;
}

.navbar__toggle {
display: inherit;
}
}

@media (min-width: 1201px) {
.navbar__toggle {
display: none;
}
}
15 changes: 3 additions & 12 deletions src/lib/prism-zmodel.js
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,10 @@
Prism.languages.zmodel = Prism.languages.extend('clike', {
keyword: /\b(?:datasource|enum|generator|model|type|abstract|import|extends|attribute|view|plugin|proc)\b/,
function: /@@?[A-Za-z_]\w*/,
keyword: /\b(?:datasource|enum|generator|model|type|abstract|import|extends|attribute|view|plugin|proc|with)\b/,
entity: /\b(?:Int|String|Boolean|DateTime|Float|Decimal|BigInt|Bytes|Json|Unsupported)\b/,
'type-class-name': /(\b()\s+)[\w.\\]+/,
});
Comment thread
ymc9 marked this conversation as resolved.

Prism.languages.javascript['class-name'][0].pattern =
/(\b(?:model|datasource|enum|generator|type|plugin|abstract)\s+)[\w.\\]+/;

Prism.languages.insertBefore('zmodel', 'function', {
annotation: {
pattern: /(^|[^.])@+\w+/,
lookbehind: true,
alias: 'punctuation',
},
});

Prism.languages.insertBefore('zmodel', 'punctuation', {
'type-args': /\b(?:references|fields|onDelete|onUpdate):/,
});
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
29771e6
docs: v3 docs structure
ymc9 Aug 1, 2025
4a3bc18
fix build
ymc9 Aug 1, 2025
ae00828
WIP
ymc9 Aug 3, 2025
2815551
WIP
ymc9 Aug 3, 2025
f215f86
progress on ORM part
ymc9 Aug 5, 2025
a43c1d8
update
ymc9 Aug 5, 2025
f649467
update embed mechanism
ymc9 Aug 5, 2025
5cfdf6d
fix stackblitz embed
ymc9 Aug 5, 2025
2c526ff
make code tabs sync
ymc9 Aug 5, 2025
a9d76ec
complete filter section
ymc9 Aug 9, 2025
09208d3
update docs
ymc9 Aug 9, 2025
b61a2e0
progress on delete
ymc9 Aug 9, 2025
80a8026
Merge remote-tracking branch 'origin/main' into docs/v3
ymc9 Aug 10, 2025
7531a18
more progress on ORM API
ymc9 Aug 10, 2025
c608cf4
ORM docs progress
ymc9 Aug 12, 2025
710b83c
query builder docs
ymc9 Aug 12, 2025
f0014f0
computed fields
ymc9 Aug 13, 2025
016fc3d
polymorphism
ymc9 Aug 13, 2025
963d91f
plugins part
ymc9 Aug 13, 2025
dda23fc
update plugins part
ymc9 Aug 14, 2025
d7b5e4e
add logging
ymc9 Aug 14, 2025
e087eb8
add inferred types section
ymc9 Aug 15, 2025
617275e
progress
ymc9 Aug 15, 2025
6ff3510
progress
ymc9 Aug 17, 2025
22de9b9
prisma migration guide
ymc9 Aug 17, 2025
63d5c61
Merge remote-tracking branch 'origin/main' into docs/v3
ymc9 Aug 17, 2025
2fd667e
update broken links
ymc9 Aug 17, 2025
b9e6193
update
ymc9 Aug 17, 2025
1a2a102
copywriting
ymc9 Aug 18, 2025
847a11e
zmodel language reference
ymc9 Aug 19, 2025
ec14645
update
ymc9 Aug 19, 2025
3ebe44f
fix links
ymc9 Aug 19, 2025
f847870
almost done
ymc9 Aug 19, 2025
07209d7
updates
ymc9 Aug 19, 2025
16d96b1
update
ymc9 Aug 19, 2025
25822c8
update
ymc9 Aug 20, 2025
192910f
update
ymc9 Aug 21, 2025
db39b21
add feature gap
ymc9 Aug 24, 2025
3dc70c7
update
ymc9 Aug 24, 2025
2a1cbbb
use git submodules to implement code snippet loading
ymc9 Aug 24, 2025
2fe949a
addressing review comments
ymc9 Aug 24, 2025
7d880b0
update
ymc9 Aug 26, 2025
8c059c5
v3 LP
ymc9 Aug 29, 2025
790de90
update
ymc9 Aug 29, 2025
014cbbe
update
ymc9 Aug 29, 2025
1356842
update responsiveness
ymc9 Aug 29, 2025
99c6b5a
update
ymc9 Aug 29, 2025
0fdcf9c
update
ymc9 Aug 30, 2025
2e229b3
update
ymc9 Aug 30, 2025
6b9d453
update
ymc9 Aug 30, 2025
4bd1637
nav bar
ymc9 Sep 1, 2025
277f966
update
ymc9 Sep 1, 2025
0111abb
update submodules
ymc9 Sep 1, 2025
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
18 changes: 18 additions & 0 deletions .gitmodules
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
[submodule "code-repos/zenstackhq/v3-doc-orm"]
path = code-repos/zenstackhq/v3-doc-orm
url = https://github.com/zenstackhq/v3-doc-orm.git
[submodule "code-repos/zenstackhq/v3-doc-orm-computed-fields"]
path = code-repos/zenstackhq/v3-doc-orm-computed-fields
url = https://github.com/zenstackhq/v3-doc-orm-computed-fields.git
[submodule "code-repos/zenstackhq/v3-doc-orm-computed-polymorphism"]
path = code-repos/zenstackhq/v3-doc-orm-computed-polymorphism
url = https://github.com/zenstackhq/v3-doc-orm-polymorphism.git
[submodule "code-repos/zenstackhq/v3-doc-orm-typed-json"]
path = code-repos/zenstackhq/v3-doc-orm-typed-json
url = https://github.com/zenstackhq/v3-doc-orm-typed-json.git
[submodule "code-repos/zenstackhq/v3-doc-quick-start"]
path = code-repos/zenstackhq/v3-doc-quick-start
url = https://github.com/zenstackhq/v3-doc-quick-start.git
[submodule "code-repos/zenstackhq/v3-doc-orm-polymorphism"]
path = code-repos/zenstackhq/v3-doc-orm-polymorphism
url = https://github.com/zenstackhq/v3-doc-orm-polymorphism.git
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-orm
Submodule v3-doc-orm added at bafb46
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-orm-computed-fields
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-orm-polymorphism
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-orm-typed-json
Submodule v3-doc-orm-typed-json added at 710d2c
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-quick-start
Submodule v3-doc-quick-start added at 0c8786
32 changes: 32 additions & 0 deletions docusaurus.config.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -44,6 +44,10 @@ const config = {
label: '1.x',
banner: 'none',
},
'3.x': {
label: '3.0 Beta',
banner: 'none',
},
Comment thread
ymc9 marked this conversation as resolved.
},
},
blog: false,
Expand All@@ -63,6 +67,12 @@ const config = {
themeConfig:
/** @type {import('@docusaurus/preset-classic').ThemeConfig} */
{
announcementBar: {
id: 'v3_beta',
content:
'ZenStack v3 Beta is released 🚀. The new version has replaced Prisma with a brand new query engine. <a href="/v3">Check it out</a>',
isCloseable: true,
},
colorMode: {
defaultMode: 'light',
respectPrefersColorScheme: false,
Expand DownExpand Up@@ -99,6 +109,11 @@ const config = {
position: 'left',
label: 'Handbook',
},
{
to: 'v3',
position: 'left',
label: 'V3 Beta 🚀',
},
{ to: '/blog', label: 'Blog', position: 'left' },
{
href: 'https://discord.gg/Ykhr738dUe',
Expand DownExpand Up@@ -193,6 +208,23 @@ const config = {
},
],
},
{
title: 'FlatIcon Credits',
items: [
{
label: 'Endure',
href: 'https://www.flaticon.com/free-icons/endure',
},
{
label: 'Diagram by Kiranshastry',
href: 'https://www.flaticon.com/free-icons/diagram',
},
{
href: 'https://www.flaticon.com/free-icons/database',
label: 'Database by kerismaker',
},
],
},
],
copyright: `Copyright © ${new Date().getFullYear()} ZenStack, Inc.`,
},
Expand Down
6 changes: 5 additions & 1 deletion package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,7 +12,8 @@
"serve": "docusaurus serve",
"write-translations": "docusaurus write-translations",
"write-heading-ids": "docusaurus write-heading-ids",
"typecheck": "tsc"
"typecheck": "tsc",
"pull-submodules": "git submodule foreach git pull origin main"
},
"dependencies": {
"@algolia/client-search": "^4.22.1",
Expand All@@ -22,12 +23,15 @@
"@docusaurus/theme-mermaid": "3.4.0",
"@giscus/react": "^2.4.0",
"@mdx-js/react": "^3.0.1",
"@stackblitz/sdk": "^1.11.0",
"autoprefixer": "^10.4.13",
"clsx": "^1.2.1",
"is-mobile": "^5.0.0",
"postcss": "^8.4.21",
"prism-react-renderer": "^2.3.1",
"prism-svelte": "^0.5.0",
"prismjs": "^1.29.0",
"raw-loader": "^4.0.2",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-icons": "^5.0.1",
Expand Down
31 changes: 31 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

27 changes: 27 additions & 0 deletions src/components/GithubCodeBlock.tsx
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
import CodeBlock from '@theme/CodeBlock';

interface GithubCodeBlockProps {
repoPath: string;
file: string;
}

const GithubCodeBlock: React.FC<GithubCodeBlockProps> = ({ repoPath, file }) => {
const code = require(`!!raw-loader!@site/code-repos/${repoPath}/${file}`).default;

const getLanguage = (file: string): string => {
if (file.endsWith('.ts')) {
return 'typescript';
} else if (file.endsWith('.zmodel')) {
return 'zmodel';
} else {
return 'plaintext';
}
};
return (
<CodeBlock language={getLanguage(file)} title={file}>
{code}
</CodeBlock>
);
};

export default GithubCodeBlock;
26 changes: 26 additions & 0 deletions src/components/StackBlitzEmbed.tsx
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
import React, { useEffect, useRef } from 'react';
import sdk from '@stackblitz/sdk';

interface StackBlitzEmbedProps {
projectId: string;
height?: string;
}

const StackBlitzEmbed: React.FC<StackBlitzEmbedProps> = ({ projectId, height = '600px' }) => {
const containerRef = useRef<HTMLDivElement>(null);

useEffect(() => {
if (containerRef.current) {
sdk.embedProjectId(containerRef.current, projectId, {
openFile: 'main.ts',
height,
view: 'editor',
forceEmbedLayout: true,
});
}
}, [projectId, height]);

return <div ref={containerRef} style={{ width: '100%', height }} />;
};

export default StackBlitzEmbed;
44 changes: 44 additions & 0 deletions src/components/StackBlitzGithub.tsx
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
import sdk from '@stackblitz/sdk';
import React from 'react';
import GithubCodeBlock from './GithubCodeBlock';

interface StackBlitzGithubProps {
repoPath: string;
openFile?: string;
codeFiles?: string[];
startScript?: string;
}

const StackBlitzGithub: React.FC<StackBlitzGithubProps> = ({
repoPath,
openFile = 'main.ts',
codeFiles: plainCodeFiles = undefined,
startScript,
}) => {
const options = {
openFile,
view: 'editor',
startScript,
} as const;

if (!plainCodeFiles) {
plainCodeFiles = [openFile];
}

return (
<>
<div className="mb-1 italic text-sm">
Click{' '}
<a href="#" onClick={() => sdk.openGithubProject(repoPath, options)}>
here
</a>{' '}
to open an interactive playground.
</div>
Comment thread
ymc9 marked this conversation as resolved.
{plainCodeFiles.map((file) => (
<GithubCodeBlock key={file} repoPath={repoPath} file={file} />
))}
</>
);
};

export default StackBlitzGithub;
6 changes: 3 additions & 3 deletions src/components/ValueProposition.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -33,8 +33,8 @@ const FeatureList: FeatureItem[] = [
img: '/img/ai-friendly.png',
description: (
<>
Schema-first reduces code complexity, helping AI understand better with fewer hallucinations.
Schema serves as a single source of truth for AI integration.
Schema-first reduces code complexity, helping AI understand better with fewer hallucinations. Schema
serves as a single source of truth for AI integration.
</>
),
},
Expand All@@ -47,7 +47,7 @@ function Proposition({ title, img, description }: FeatureItem) {
<img className="w-48 p-10" src={img} alt={title} />
</div>
<div className="text--center padding-horiz--md">
<h3 className="text-xl text-bold text-center lg:text-2xl text-gray-700 dark:text-gray-300">{title}</h3>
<h3 className="text-xl text-center lg:text-2xl text-gray-700 dark:text-gray-300">{title}</h3>
<p className="text-center text-base lg:text-lg text-gray-600 dark:text-gray-400">{description}</p>
</div>
</div>
Expand Down
17 changes: 17 additions & 0 deletions src/css/custom.css
Original file line numberDiff line numberDiff line change
Expand Up@@ -68,3 +68,20 @@
right: 0;
pointer-events: mouse;
}

@media (max-width: 1200px) {
.navbar__items--right,
.navbar__items--left {
display: none;
}

.navbar__toggle {
display: inherit;
}
}

@media (min-width: 1201px) {
.navbar__toggle {
display: none;
}
}
15 changes: 3 additions & 12 deletions src/lib/prism-zmodel.js
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,10 @@
Prism.languages.zmodel = Prism.languages.extend('clike', {
keyword: /\b(?:datasource|enum|generator|model|type|abstract|import|extends|attribute|view|plugin|proc)\b/,
function: /@@?[A-Za-z_]\w*/,
keyword: /\b(?:datasource|enum|generator|model|type|abstract|import|extends|attribute|view|plugin|proc|with)\b/,
entity: /\b(?:Int|String|Boolean|DateTime|Float|Decimal|BigInt|Bytes|Json|Unsupported)\b/,
'type-class-name': /(\b()\s+)[\w.\\]+/,
});
Comment thread
ymc9 marked this conversation as resolved.

Prism.languages.javascript['class-name'][0].pattern =
/(\b(?:model|datasource|enum|generator|type|plugin|abstract)\s+)[\w.\\]+/;

Prism.languages.insertBefore('zmodel', 'function', {
annotation: {
pattern: /(^|[^.])@+\w+/,
lookbehind: true,
alias: 'punctuation',
},
});

Prism.languages.insertBefore('zmodel', 'punctuation', {
'type-args': /\b(?:references|fields|onDelete|onUpdate):/,
});
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
29771e6
docs: v3 docs structure
ymc9 Aug 1, 2025
4a3bc18
fix build
ymc9 Aug 1, 2025
ae00828
WIP
ymc9 Aug 3, 2025
2815551
WIP
ymc9 Aug 3, 2025
f215f86
progress on ORM part
ymc9 Aug 5, 2025
a43c1d8
update
ymc9 Aug 5, 2025
f649467
update embed mechanism
ymc9 Aug 5, 2025
5cfdf6d
fix stackblitz embed
ymc9 Aug 5, 2025
2c526ff
make code tabs sync
ymc9 Aug 5, 2025
a9d76ec
complete filter section
ymc9 Aug 9, 2025
09208d3
update docs
ymc9 Aug 9, 2025
b61a2e0
progress on delete
ymc9 Aug 9, 2025
80a8026
Merge remote-tracking branch 'origin/main' into docs/v3
ymc9 Aug 10, 2025
7531a18
more progress on ORM API
ymc9 Aug 10, 2025
c608cf4
ORM docs progress
ymc9 Aug 12, 2025
710b83c
query builder docs
ymc9 Aug 12, 2025
f0014f0
computed fields
ymc9 Aug 13, 2025
016fc3d
polymorphism
ymc9 Aug 13, 2025
963d91f
plugins part
ymc9 Aug 13, 2025
dda23fc
update plugins part
ymc9 Aug 14, 2025
d7b5e4e
add logging
ymc9 Aug 14, 2025
e087eb8
add inferred types section
ymc9 Aug 15, 2025
617275e
progress
ymc9 Aug 15, 2025
6ff3510
progress
ymc9 Aug 17, 2025
22de9b9
prisma migration guide
ymc9 Aug 17, 2025
63d5c61
Merge remote-tracking branch 'origin/main' into docs/v3
ymc9 Aug 17, 2025
2fd667e
update broken links
ymc9 Aug 17, 2025
b9e6193
update
ymc9 Aug 17, 2025
1a2a102
copywriting
ymc9 Aug 18, 2025
847a11e
zmodel language reference
ymc9 Aug 19, 2025
ec14645
update
ymc9 Aug 19, 2025
3ebe44f
fix links
ymc9 Aug 19, 2025
f847870
almost done
ymc9 Aug 19, 2025
07209d7
updates
ymc9 Aug 19, 2025
16d96b1
update
ymc9 Aug 19, 2025
25822c8
update
ymc9 Aug 20, 2025
192910f
update
ymc9 Aug 21, 2025
db39b21
add feature gap
ymc9 Aug 24, 2025
3dc70c7
update
ymc9 Aug 24, 2025
2a1cbbb
use git submodules to implement code snippet loading
ymc9 Aug 24, 2025
2fe949a
addressing review comments
ymc9 Aug 24, 2025
7d880b0
update
ymc9 Aug 26, 2025
8c059c5
v3 LP
ymc9 Aug 29, 2025
790de90
update
ymc9 Aug 29, 2025
014cbbe
update
ymc9 Aug 29, 2025
1356842
update responsiveness
ymc9 Aug 29, 2025
99c6b5a
update
ymc9 Aug 29, 2025
0fdcf9c
update
ymc9 Aug 30, 2025
2e229b3
update
ymc9 Aug 30, 2025
6b9d453
update
ymc9 Aug 30, 2025
4bd1637
nav bar
ymc9 Sep 1, 2025
277f966
update
ymc9 Sep 1, 2025
0111abb
update submodules
ymc9 Sep 1, 2025
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
18 changes: 18 additions & 0 deletions .gitmodules
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
[submodule "code-repos/zenstackhq/v3-doc-orm"]
path = code-repos/zenstackhq/v3-doc-orm
url = https://github.com/zenstackhq/v3-doc-orm.git
[submodule "code-repos/zenstackhq/v3-doc-orm-computed-fields"]
path = code-repos/zenstackhq/v3-doc-orm-computed-fields
url = https://github.com/zenstackhq/v3-doc-orm-computed-fields.git
[submodule "code-repos/zenstackhq/v3-doc-orm-computed-polymorphism"]
path = code-repos/zenstackhq/v3-doc-orm-computed-polymorphism
url = https://github.com/zenstackhq/v3-doc-orm-polymorphism.git
[submodule "code-repos/zenstackhq/v3-doc-orm-typed-json"]
path = code-repos/zenstackhq/v3-doc-orm-typed-json
url = https://github.com/zenstackhq/v3-doc-orm-typed-json.git
[submodule "code-repos/zenstackhq/v3-doc-quick-start"]
path = code-repos/zenstackhq/v3-doc-quick-start
url = https://github.com/zenstackhq/v3-doc-quick-start.git
[submodule "code-repos/zenstackhq/v3-doc-orm-polymorphism"]
path = code-repos/zenstackhq/v3-doc-orm-polymorphism
url = https://github.com/zenstackhq/v3-doc-orm-polymorphism.git
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-orm
Submodule v3-doc-orm added at bafb46
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-orm-computed-fields
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-orm-polymorphism
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-orm-typed-json
Submodule v3-doc-orm-typed-json added at 710d2c
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-quick-start
Submodule v3-doc-quick-start added at 0c8786
32 changes: 32 additions & 0 deletions docusaurus.config.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -44,6 +44,10 @@ const config = {
label: '1.x',
banner: 'none',
},
'3.x': {
label: '3.0 Beta',
banner: 'none',
},
Comment thread
ymc9 marked this conversation as resolved.
},
},
blog: false,
Expand All@@ -63,6 +67,12 @@ const config = {
themeConfig:
/** @type {import('@docusaurus/preset-classic').ThemeConfig} */
{
announcementBar: {
id: 'v3_beta',
content:
'ZenStack v3 Beta is released 🚀. The new version has replaced Prisma with a brand new query engine. <a href="/v3">Check it out</a>',
isCloseable: true,
},
colorMode: {
defaultMode: 'light',
respectPrefersColorScheme: false,
Expand DownExpand Up@@ -99,6 +109,11 @@ const config = {
position: 'left',
label: 'Handbook',
},
{
to: 'v3',
position: 'left',
label: 'V3 Beta 🚀',
},
{ to: '/blog', label: 'Blog', position: 'left' },
{
href: 'https://discord.gg/Ykhr738dUe',
Expand DownExpand Up@@ -193,6 +208,23 @@ const config = {
},
],
},
{
title: 'FlatIcon Credits',
items: [
{
label: 'Endure',
href: 'https://www.flaticon.com/free-icons/endure',
},
{
label: 'Diagram by Kiranshastry',
href: 'https://www.flaticon.com/free-icons/diagram',
},
{
href: 'https://www.flaticon.com/free-icons/database',
label: 'Database by kerismaker',
},
],
},
],
copyright: `Copyright © ${new Date().getFullYear()} ZenStack, Inc.`,
},
Expand Down
6 changes: 5 additions & 1 deletion package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,7 +12,8 @@
"serve": "docusaurus serve",
"write-translations": "docusaurus write-translations",
"write-heading-ids": "docusaurus write-heading-ids",
"typecheck": "tsc"
"typecheck": "tsc",
"pull-submodules": "git submodule foreach git pull origin main"
},
"dependencies": {
"@algolia/client-search": "^4.22.1",
Expand All@@ -22,12 +23,15 @@
"@docusaurus/theme-mermaid": "3.4.0",
"@giscus/react": "^2.4.0",
"@mdx-js/react": "^3.0.1",
"@stackblitz/sdk": "^1.11.0",
"autoprefixer": "^10.4.13",
"clsx": "^1.2.1",
"is-mobile": "^5.0.0",
"postcss": "^8.4.21",
"prism-react-renderer": "^2.3.1",
"prism-svelte": "^0.5.0",
"prismjs": "^1.29.0",
"raw-loader": "^4.0.2",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-icons": "^5.0.1",
Expand Down
31 changes: 31 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

27 changes: 27 additions & 0 deletions src/components/GithubCodeBlock.tsx
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
import CodeBlock from '@theme/CodeBlock';

interface GithubCodeBlockProps {
repoPath: string;
file: string;
}

const GithubCodeBlock: React.FC<GithubCodeBlockProps> = ({ repoPath, file }) => {
const code = require(`!!raw-loader!@site/code-repos/${repoPath}/${file}`).default;

const getLanguage = (file: string): string => {
if (file.endsWith('.ts')) {
return 'typescript';
} else if (file.endsWith('.zmodel')) {
return 'zmodel';
} else {
return 'plaintext';
}
};
return (
<CodeBlock language={getLanguage(file)} title={file}>
{code}
</CodeBlock>
);
};

export default GithubCodeBlock;
26 changes: 26 additions & 0 deletions src/components/StackBlitzEmbed.tsx
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
import React, { useEffect, useRef } from 'react';
import sdk from '@stackblitz/sdk';

interface StackBlitzEmbedProps {
projectId: string;
height?: string;
}

const StackBlitzEmbed: React.FC<StackBlitzEmbedProps> = ({ projectId, height = '600px' }) => {
const containerRef = useRef<HTMLDivElement>(null);

useEffect(() => {
if (containerRef.current) {
sdk.embedProjectId(containerRef.current, projectId, {
openFile: 'main.ts',
height,
view: 'editor',
forceEmbedLayout: true,
});
}
}, [projectId, height]);

return <div ref={containerRef} style={{ width: '100%', height }} />;
};

export default StackBlitzEmbed;
44 changes: 44 additions & 0 deletions src/components/StackBlitzGithub.tsx
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
import sdk from '@stackblitz/sdk';
import React from 'react';
import GithubCodeBlock from './GithubCodeBlock';

interface StackBlitzGithubProps {
repoPath: string;
openFile?: string;
codeFiles?: string[];
startScript?: string;
}

const StackBlitzGithub: React.FC<StackBlitzGithubProps> = ({
repoPath,
openFile = 'main.ts',
codeFiles: plainCodeFiles = undefined,
startScript,
}) => {
const options = {
openFile,
view: 'editor',
startScript,
} as const;

if (!plainCodeFiles) {
plainCodeFiles = [openFile];
}

return (
<>
<div className="mb-1 italic text-sm">
Click{' '}
<a href="#" onClick={() => sdk.openGithubProject(repoPath, options)}>
here
</a>{' '}
to open an interactive playground.
</div>
Comment thread
ymc9 marked this conversation as resolved.
{plainCodeFiles.map((file) => (
<GithubCodeBlock key={file} repoPath={repoPath} file={file} />
))}
</>
);
};

export default StackBlitzGithub;
6 changes: 3 additions & 3 deletions src/components/ValueProposition.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -33,8 +33,8 @@ const FeatureList: FeatureItem[] = [
img: '/img/ai-friendly.png',
description: (
<>
Schema-first reduces code complexity, helping AI understand better with fewer hallucinations.
Schema serves as a single source of truth for AI integration.
Schema-first reduces code complexity, helping AI understand better with fewer hallucinations. Schema
serves as a single source of truth for AI integration.
</>
),
},
Expand All@@ -47,7 +47,7 @@ function Proposition({ title, img, description }: FeatureItem) {
<img className="w-48 p-10" src={img} alt={title} />
</div>
<div className="text--center padding-horiz--md">
<h3 className="text-xl text-bold text-center lg:text-2xl text-gray-700 dark:text-gray-300">{title}</h3>
<h3 className="text-xl text-center lg:text-2xl text-gray-700 dark:text-gray-300">{title}</h3>
<p className="text-center text-base lg:text-lg text-gray-600 dark:text-gray-400">{description}</p>
</div>
</div>
Expand Down
17 changes: 17 additions & 0 deletions src/css/custom.css
Original file line numberDiff line numberDiff line change
Expand Up@@ -68,3 +68,20 @@
right: 0;
pointer-events: mouse;
}

@media (max-width: 1200px) {
.navbar__items--right,
.navbar__items--left {
display: none;
}

.navbar__toggle {
display: inherit;
}
}

@media (min-width: 1201px) {
.navbar__toggle {
display: none;
}
}
15 changes: 3 additions & 12 deletions src/lib/prism-zmodel.js
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,10 @@
Prism.languages.zmodel = Prism.languages.extend('clike', {
keyword: /\b(?:datasource|enum|generator|model|type|abstract|import|extends|attribute|view|plugin|proc)\b/,
function: /@@?[A-Za-z_]\w*/,
keyword: /\b(?:datasource|enum|generator|model|type|abstract|import|extends|attribute|view|plugin|proc|with)\b/,
entity: /\b(?:Int|String|Boolean|DateTime|Float|Decimal|BigInt|Bytes|Json|Unsupported)\b/,
'type-class-name': /(\b()\s+)[\w.\\]+/,
});
Comment thread
ymc9 marked this conversation as resolved.

Prism.languages.javascript['class-name'][0].pattern =
/(\b(?:model|datasource|enum|generator|type|plugin|abstract)\s+)[\w.\\]+/;

Prism.languages.insertBefore('zmodel', 'function', {
annotation: {
pattern: /(^|[^.])@+\w+/,
lookbehind: true,
alias: 'punctuation',
},
});

Prism.languages.insertBefore('zmodel', 'punctuation', {
'type-args': /\b(?:references|fields|onDelete|onUpdate):/,
});
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
29771e6
docs: v3 docs structure
ymc9 Aug 1, 2025
4a3bc18
fix build
ymc9 Aug 1, 2025
ae00828
WIP
ymc9 Aug 3, 2025
2815551
WIP
ymc9 Aug 3, 2025
f215f86
progress on ORM part
ymc9 Aug 5, 2025
a43c1d8
update
ymc9 Aug 5, 2025
f649467
update embed mechanism
ymc9 Aug 5, 2025
5cfdf6d
fix stackblitz embed
ymc9 Aug 5, 2025
2c526ff
make code tabs sync
ymc9 Aug 5, 2025
a9d76ec
complete filter section
ymc9 Aug 9, 2025
09208d3
update docs
ymc9 Aug 9, 2025
b61a2e0
progress on delete
ymc9 Aug 9, 2025
80a8026
Merge remote-tracking branch 'origin/main' into docs/v3
ymc9 Aug 10, 2025
7531a18
more progress on ORM API
ymc9 Aug 10, 2025
c608cf4
ORM docs progress
ymc9 Aug 12, 2025
710b83c
query builder docs
ymc9 Aug 12, 2025
f0014f0
computed fields
ymc9 Aug 13, 2025
016fc3d
polymorphism
ymc9 Aug 13, 2025
963d91f
plugins part
ymc9 Aug 13, 2025
dda23fc
update plugins part
ymc9 Aug 14, 2025
d7b5e4e
add logging
ymc9 Aug 14, 2025
e087eb8
add inferred types section
ymc9 Aug 15, 2025
617275e
progress
ymc9 Aug 15, 2025
6ff3510
progress
ymc9 Aug 17, 2025
22de9b9
prisma migration guide
ymc9 Aug 17, 2025
63d5c61
Merge remote-tracking branch 'origin/main' into docs/v3
ymc9 Aug 17, 2025
2fd667e
update broken links
ymc9 Aug 17, 2025
b9e6193
update
ymc9 Aug 17, 2025
1a2a102
copywriting
ymc9 Aug 18, 2025
847a11e
zmodel language reference
ymc9 Aug 19, 2025
ec14645
update
ymc9 Aug 19, 2025
3ebe44f
fix links
ymc9 Aug 19, 2025
f847870
almost done
ymc9 Aug 19, 2025
07209d7
updates
ymc9 Aug 19, 2025
16d96b1
update
ymc9 Aug 19, 2025
25822c8
update
ymc9 Aug 20, 2025
192910f
update
ymc9 Aug 21, 2025
db39b21
add feature gap
ymc9 Aug 24, 2025
3dc70c7
update
ymc9 Aug 24, 2025
2a1cbbb
use git submodules to implement code snippet loading
ymc9 Aug 24, 2025
2fe949a
addressing review comments
ymc9 Aug 24, 2025
7d880b0
update
ymc9 Aug 26, 2025
8c059c5
v3 LP
ymc9 Aug 29, 2025
790de90
update
ymc9 Aug 29, 2025
014cbbe
update
ymc9 Aug 29, 2025
1356842
update responsiveness
ymc9 Aug 29, 2025
99c6b5a
update
ymc9 Aug 29, 2025
0fdcf9c
update
ymc9 Aug 30, 2025
2e229b3
update
ymc9 Aug 30, 2025
6b9d453
update
ymc9 Aug 30, 2025
4bd1637
nav bar
ymc9 Sep 1, 2025
277f966
update
ymc9 Sep 1, 2025
0111abb
update submodules
ymc9 Sep 1, 2025
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
18 changes: 18 additions & 0 deletions .gitmodules
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
[submodule "code-repos/zenstackhq/v3-doc-orm"]
path = code-repos/zenstackhq/v3-doc-orm
url = https://github.com/zenstackhq/v3-doc-orm.git
[submodule "code-repos/zenstackhq/v3-doc-orm-computed-fields"]
path = code-repos/zenstackhq/v3-doc-orm-computed-fields
url = https://github.com/zenstackhq/v3-doc-orm-computed-fields.git
[submodule "code-repos/zenstackhq/v3-doc-orm-computed-polymorphism"]
path = code-repos/zenstackhq/v3-doc-orm-computed-polymorphism
url = https://github.com/zenstackhq/v3-doc-orm-polymorphism.git
[submodule "code-repos/zenstackhq/v3-doc-orm-typed-json"]
path = code-repos/zenstackhq/v3-doc-orm-typed-json
url = https://github.com/zenstackhq/v3-doc-orm-typed-json.git
[submodule "code-repos/zenstackhq/v3-doc-quick-start"]
path = code-repos/zenstackhq/v3-doc-quick-start
url = https://github.com/zenstackhq/v3-doc-quick-start.git
[submodule "code-repos/zenstackhq/v3-doc-orm-polymorphism"]
path = code-repos/zenstackhq/v3-doc-orm-polymorphism
url = https://github.com/zenstackhq/v3-doc-orm-polymorphism.git
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-orm
Submodule v3-doc-orm added at bafb46
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-orm-computed-fields
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-orm-polymorphism
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-orm-typed-json
Submodule v3-doc-orm-typed-json added at 710d2c
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-quick-start
Submodule v3-doc-quick-start added at 0c8786
32 changes: 32 additions & 0 deletions docusaurus.config.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -44,6 +44,10 @@ const config = {
label: '1.x',
banner: 'none',
},
'3.x': {
label: '3.0 Beta',
banner: 'none',
},
Comment thread
ymc9 marked this conversation as resolved.
},
},
blog: false,
Expand All@@ -63,6 +67,12 @@ const config = {
themeConfig:
/** @type {import('@docusaurus/preset-classic').ThemeConfig} */
{
announcementBar: {
id: 'v3_beta',
content:
'ZenStack v3 Beta is released 🚀. The new version has replaced Prisma with a brand new query engine. <a href="/v3">Check it out</a>',
isCloseable: true,
},
colorMode: {
defaultMode: 'light',
respectPrefersColorScheme: false,
Expand DownExpand Up@@ -99,6 +109,11 @@ const config = {
position: 'left',
label: 'Handbook',
},
{
to: 'v3',
position: 'left',
label: 'V3 Beta 🚀',
},
{ to: '/blog', label: 'Blog', position: 'left' },
{
href: 'https://discord.gg/Ykhr738dUe',
Expand DownExpand Up@@ -193,6 +208,23 @@ const config = {
},
],
},
{
title: 'FlatIcon Credits',
items: [
{
label: 'Endure',
href: 'https://www.flaticon.com/free-icons/endure',
},
{
label: 'Diagram by Kiranshastry',
href: 'https://www.flaticon.com/free-icons/diagram',
},
{
href: 'https://www.flaticon.com/free-icons/database',
label: 'Database by kerismaker',
},
],
},
],
copyright: `Copyright © ${new Date().getFullYear()} ZenStack, Inc.`,
},
Expand Down
6 changes: 5 additions & 1 deletion package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,7 +12,8 @@
"serve": "docusaurus serve",
"write-translations": "docusaurus write-translations",
"write-heading-ids": "docusaurus write-heading-ids",
"typecheck": "tsc"
"typecheck": "tsc",
"pull-submodules": "git submodule foreach git pull origin main"
},
"dependencies": {
"@algolia/client-search": "^4.22.1",
Expand All@@ -22,12 +23,15 @@
"@docusaurus/theme-mermaid": "3.4.0",
"@giscus/react": "^2.4.0",
"@mdx-js/react": "^3.0.1",
"@stackblitz/sdk": "^1.11.0",
"autoprefixer": "^10.4.13",
"clsx": "^1.2.1",
"is-mobile": "^5.0.0",
"postcss": "^8.4.21",
"prism-react-renderer": "^2.3.1",
"prism-svelte": "^0.5.0",
"prismjs": "^1.29.0",
"raw-loader": "^4.0.2",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-icons": "^5.0.1",
Expand Down
31 changes: 31 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

27 changes: 27 additions & 0 deletions src/components/GithubCodeBlock.tsx
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
import CodeBlock from '@theme/CodeBlock';

interface GithubCodeBlockProps {
repoPath: string;
file: string;
}

const GithubCodeBlock: React.FC<GithubCodeBlockProps> = ({ repoPath, file }) => {
const code = require(`!!raw-loader!@site/code-repos/${repoPath}/${file}`).default;

const getLanguage = (file: string): string => {
if (file.endsWith('.ts')) {
return 'typescript';
} else if (file.endsWith('.zmodel')) {
return 'zmodel';
} else {
return 'plaintext';
}
};
return (
<CodeBlock language={getLanguage(file)} title={file}>
{code}
</CodeBlock>
);
};

export default GithubCodeBlock;
26 changes: 26 additions & 0 deletions src/components/StackBlitzEmbed.tsx
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
import React, { useEffect, useRef } from 'react';
import sdk from '@stackblitz/sdk';

interface StackBlitzEmbedProps {
projectId: string;
height?: string;
}

const StackBlitzEmbed: React.FC<StackBlitzEmbedProps> = ({ projectId, height = '600px' }) => {
const containerRef = useRef<HTMLDivElement>(null);

useEffect(() => {
if (containerRef.current) {
sdk.embedProjectId(containerRef.current, projectId, {
openFile: 'main.ts',
height,
view: 'editor',
forceEmbedLayout: true,
});
}
}, [projectId, height]);

return <div ref={containerRef} style={{ width: '100%', height }} />;
};

export default StackBlitzEmbed;
44 changes: 44 additions & 0 deletions src/components/StackBlitzGithub.tsx
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
import sdk from '@stackblitz/sdk';
import React from 'react';
import GithubCodeBlock from './GithubCodeBlock';

interface StackBlitzGithubProps {
repoPath: string;
openFile?: string;
codeFiles?: string[];
startScript?: string;
}

const StackBlitzGithub: React.FC<StackBlitzGithubProps> = ({
repoPath,
openFile = 'main.ts',
codeFiles: plainCodeFiles = undefined,
startScript,
}) => {
const options = {
openFile,
view: 'editor',
startScript,
} as const;

if (!plainCodeFiles) {
plainCodeFiles = [openFile];
}

return (
<>
<div className="mb-1 italic text-sm">
Click{' '}
<a href="#" onClick={() => sdk.openGithubProject(repoPath, options)}>
here
</a>{' '}
to open an interactive playground.
</div>
Comment thread
ymc9 marked this conversation as resolved.
{plainCodeFiles.map((file) => (
<GithubCodeBlock key={file} repoPath={repoPath} file={file} />
))}
</>
);
};

export default StackBlitzGithub;
6 changes: 3 additions & 3 deletions src/components/ValueProposition.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -33,8 +33,8 @@ const FeatureList: FeatureItem[] = [
img: '/img/ai-friendly.png',
description: (
<>
Schema-first reduces code complexity, helping AI understand better with fewer hallucinations.
Schema serves as a single source of truth for AI integration.
Schema-first reduces code complexity, helping AI understand better with fewer hallucinations. Schema
serves as a single source of truth for AI integration.
</>
),
},
Expand All@@ -47,7 +47,7 @@ function Proposition({ title, img, description }: FeatureItem) {
<img className="w-48 p-10" src={img} alt={title} />
</div>
<div className="text--center padding-horiz--md">
<h3 className="text-xl text-bold text-center lg:text-2xl text-gray-700 dark:text-gray-300">{title}</h3>
<h3 className="text-xl text-center lg:text-2xl text-gray-700 dark:text-gray-300">{title}</h3>
<p className="text-center text-base lg:text-lg text-gray-600 dark:text-gray-400">{description}</p>
</div>
</div>
Expand Down
17 changes: 17 additions & 0 deletions src/css/custom.css
Original file line numberDiff line numberDiff line change
Expand Up@@ -68,3 +68,20 @@
right: 0;
pointer-events: mouse;
}

@media (max-width: 1200px) {
.navbar__items--right,
.navbar__items--left {
display: none;
}

.navbar__toggle {
display: inherit;
}
}

@media (min-width: 1201px) {
.navbar__toggle {
display: none;
}
}
15 changes: 3 additions & 12 deletions src/lib/prism-zmodel.js
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,10 @@
Prism.languages.zmodel = Prism.languages.extend('clike', {
keyword: /\b(?:datasource|enum|generator|model|type|abstract|import|extends|attribute|view|plugin|proc)\b/,
function: /@@?[A-Za-z_]\w*/,
keyword: /\b(?:datasource|enum|generator|model|type|abstract|import|extends|attribute|view|plugin|proc|with)\b/,
entity: /\b(?:Int|String|Boolean|DateTime|Float|Decimal|BigInt|Bytes|Json|Unsupported)\b/,
'type-class-name': /(\b()\s+)[\w.\\]+/,
});
Comment thread
ymc9 marked this conversation as resolved.

Prism.languages.javascript['class-name'][0].pattern =
/(\b(?:model|datasource|enum|generator|type|plugin|abstract)\s+)[\w.\\]+/;

Prism.languages.insertBefore('zmodel', 'function', {
annotation: {
pattern: /(^|[^.])@+\w+/,
lookbehind: true,
alias: 'punctuation',
},
});

Prism.languages.insertBefore('zmodel', 'punctuation', {
'type-args': /\b(?:references|fields|onDelete|onUpdate):/,
});
Expand Down
Loading