Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
9aa9c1a
feat(blog): editor v0
moatorres Nov 1, 2025
6808cf3
chore(repo): pruned dependencies and updated nvmrc version
moatorres Nov 2, 2025
e32b0d3
feat(blog): added system theme dropdown
moatorres Nov 7, 2025
99ff424
feat(editor): added formatters, updated context imports, reduced font…
moatorres Nov 7, 2025
23394aa
fix(ci): moved blog utils to dependencies
moatorres Nov 7, 2025
65d89c3
chore(blog): removed unused theme selector
moatorres Nov 8, 2025
335a46f
chore(blog): updated dependencies, added theme dropdown toggle, fixed…
moatorres Nov 8, 2025
7623e82
chore(editor): added missing styles
moatorres Nov 8, 2025
929f71f
feat(editor): refactored project selector and toolbar, added drag act…
moatorres Nov 9, 2025
79c8d37
chore(repo): updated vscode settings
moatorres Nov 9, 2025
fdfcbd8
feat(editor): added preview fullscreen view, improved file dragging b…
moatorres Nov 9, 2025
e30b798
feat(editor): added project selector modal
moatorres Nov 9, 2025
a31ff21
feat(ci): enabled nx cloud agents and updated pnpm setup
moatorres Nov 9, 2025
7a2d0ab
fix(ci): added pnpm/action-setup back
moatorres Nov 9, 2025
3dc9b64
feat(editor): added WebContainerContext, added monaco file sync
moatorres Nov 9, 2025
6a74de8
feat(editor): added file tree guards for creating and renaming items
moatorres Nov 10, 2025
ed4bec6
feat(editor): added atoms provider and panels atom
moatorres Nov 11, 2025
eaf0438
feat(editor): added current file atom
moatorres Nov 11, 2025
1c8a5f3
chore(editor): moved project selector dropdown
moatorres Nov 11, 2025
e445b18
chore(editor): document terminal initialization effect
moatorres Nov 11, 2025
5307837
fix(editor): adjusted editor settings to allow widgets to overflow pa…
moatorres Nov 11, 2025
d26c834
chore(editor): updated collapse folders icon
moatorres Nov 11, 2025
0667ffe
fix(blog): refactored skeletons to use deterministic logic, moved dom…
moatorres Nov 11, 2025
710ce2a
fix(editor): updated project type to include missing initial file pro…
moatorres Nov 11, 2025
a1b10f5
chore(blog): added temporary fix to nx/next plugin eslint rules
moatorres Nov 11, 2025
8a7a6ed
fix(blog): added missing project loader property
moatorres Nov 11, 2025
f28a9b8
chore(editor): updated javascript default compiler options
moatorres Nov 12, 2025
cb6efec
feat(editor): added breadcrumb to editor panel header, and other mino…
moatorres Nov 12, 2025
705a857
fix(editor): setup file watching before terminal initialization
moatorres Nov 12, 2025
76225d6
feat(editor): updated bootstrap with project loader and added initial…
moatorres Nov 12, 2025
dd34498
fix(editor): added open model hot reload and updated useTypeLoader hook
moatorres Nov 12, 2025
6f5a3ff
fix(editor): fixed type loader regression
moatorres Nov 12, 2025
a9b56f4
perf(editor): added type loading cache to avoid eager reloads
moatorres Nov 12, 2025
c1d333e
perf(editor): removed redundant type loading during terminal initiali…
moatorres Nov 12, 2025
d590dc1
feat(editor): added reset project button, minor playground project fixes
moatorres Nov 12, 2025
0c79f12
fix(ci): reordered steps to install pnpm manually
moatorres Nov 12, 2025
24cce02
fix(ci): setup distributed agents after pnpm install
moatorres Nov 12, 2025
a324d58
fix(ci): removed setup node caching
moatorres Nov 12, 2025
b7fd847
chore(ci): added env variables
moatorres Nov 12, 2025
f166f03
fix(ci): added config file path to bootstrap command
moatorres Nov 12, 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
19 changes: 12 additions & 7 deletions .github/workflows/nxcloud.yaml
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
name: NxCloud

env:
APP_CONFIG_FILE: 'apps/blog/info.json'
NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }}

on:
push:
branches:
Expand All @@ -17,19 +13,25 @@ permissions:
jobs:
main:
runs-on: ubuntu-latest

env:
NX_BASE: origin/master
NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }}

steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
filter: tree:0

- uses: actions/setup-node@v3
- uses: actions/setup-node@v6
with:
node-version: 22.8.0
node-version: 22.20.0

- uses: pnpm/action-setup@v4
name: Install pnpm
with:
version: 9.15.4
version: 10.19.0
run_install: false

- name: Get pnpm store directory
Expand All @@ -44,8 +46,11 @@ jobs:
restore-keys: |
${{ runner.os }}-pnpm-store-

- run: pnpm dlx nx-cloud start-ci-run --distribute-on="3 linux-medium-js" --stop-agents-after="build"

- name: Install dependencies
run: pnpm install --frozen-lockfile

- uses: nrwl/nx-set-shas@v4
- run: npx nx-cloud record -- nx format:check
- run: pnpm exec nx affected -t lint test build
2 changes: 1 addition & 1 deletion .nvmrc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
v22.15.1
v22.20.0
1 change: 1 addition & 0 deletions .nxignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
playground
2 changes: 2 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
/.nx/cache
/.nx/workspace-data
.next
next-env.d.ts
pnpm-lock.yaml
dist
node_modules
playground
18 changes: 10 additions & 8 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,21 +1,23 @@
{
"css.customData": [".vscode/tailwind.json"],
"editor.tabSize": 2,
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"css.validate": false,
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit"
"source.fixAll": "explicit",
"source.organizeImports": "explicit"
},
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"editor.inlineSuggest.enabled": true,
"// activates tailwindcss intellisense for libraries": "",
"editor.quickSuggestions": {
"strings": true
},
"css.validate": false,
"editor.inlineSuggest.enabled": true,
"editor.tabSize": 2,
"eslint.format.enable": true,
"eslint.validate": ["typescript", "javascript", "tsx", "jsx", "json"],
"// adds tailwindcss intellisense support within cva function calls": "",
"tailwindCSS.experimental.classRegex": [
["cva\\(((?:[^()]|\\([^()]*\\))*)\\)", "[\"'`]([^\"'`]*).*?[\"'`]"],
["cx\\(((?:[^()]|\\([^()]*\\))*)\\)", "(?:'|\"|`)([^']*)(?:'|\"|`)"]
],
"eslint.validate": ["json"]
]
}
31 changes: 17 additions & 14 deletions apps/blog/eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -1,22 +1,25 @@
import { FlatCompat } from '@eslint/eslintrc'
import { dirname } from 'path'
import { fileURLToPath } from 'url'
import js from '@eslint/js'
import { fixupConfigRules } from '@eslint/compat'
import { defineConfig } from 'eslint/config'

import nx from '@nx/eslint-plugin'
import nextPlugin from 'eslint-config-next'
import reactHooksPlugin from 'eslint-plugin-react-hooks'
import baseConfig from '../../eslint.config.mjs'
const compat = new FlatCompat({
baseDirectory: dirname(fileURLToPath(import.meta.url)),
recommendedConfig: js.configs.recommended,
})

// eslint-disable-next-line import/no-anonymous-default-export
export default [
...fixupConfigRules(compat.extends('next')),
...fixupConfigRules(compat.extends('next/core-web-vitals')),
export default defineConfig([
...baseConfig,
...nx.configs['flat/react-typescript'],
nextPlugin,
{
plugins: {
'react-hooks': reactHooksPlugin,
},
rules: {
'react-hooks/rules-of-hooks': 'warn',
'react-hooks/exhaustive-deps': 'warn',
'react-hooks/set-state-in-effect': 'warn',
},
},
{
ignores: ['.next/**/*', './src/data/**/*', './public/_*', 'next-env.d.ts'],
},
]
])
1 change: 0 additions & 1 deletion apps/blog/index.d.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
declare module '*.svg' {
const content: any
export const ReactComponent: any
Expand Down
2 changes: 1 addition & 1 deletion apps/blog/next-env.d.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/// <reference types="next" />
/// <reference types="next/image-types/global" />
/// <reference path="./.next/types/routes.d.ts" />
import "./.next/types/routes.d.ts";

// NOTE: This file should not be edited
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
30 changes: 21 additions & 9 deletions apps/blog/next.config.mjs
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
// @ts-check
import { composePlugins, withNx } from '@nx/next'

import createMDX from '@next/mdx'
import remarkGfm from 'remark-gfm'
import remarkSugarHigh from 'remark-sugar-high'
import { composePlugins } from '@nx/next'
import rehypeAutolinkHeadings from 'rehype-autolink-headings'
import rehypeSlug from 'rehype-slug'
import remarkGfm from 'remark-gfm'
import remarkSugarHigh from 'remark-sugar-high'

const ONE_YEAR_IN_SECONDS = 60 * 60 * 24 * 365

Expand Down Expand Up @@ -33,11 +32,21 @@ const nextConfig = {
},
],
},
{
source: '/:path*',
headers: [
{
key: 'Cross-Origin-Embedder-Policy',
value: 'require-corp',
},
{
key: 'Cross-Origin-Opener-Policy',
value: 'same-origin',
},
],
},
]
},
nx: {
svgr: false,
},
pageExtensions: ['js', 'jsx', 'md', 'mdx', 'ts', 'tsx'],
poweredByHeader: false,
reactStrictMode: true,
Expand All @@ -58,7 +67,10 @@ const nextConfig = {
webpack: (config, { dev }) => {
// resolve imports with extension names on dev mode (e.g. import ansi from "./ansi.js")
config.resolve.extensionAlias = {
'.js': ['.ts', '.tsx', '.js'],
'.js': ['.ts', '.tsx', '.js', '.jsx'],
'.mjs': ['.mts', '.mjs'],
'.cjs': ['.cts', '.cjs'],
'.jsx': ['.tsx', '.jsx'],
}
return config
},
Expand All @@ -83,6 +95,6 @@ const withMdx = createMDX({
},
})

const withPlugins = composePlugins(withNx, withMdx)
const withPlugins = composePlugins(withMdx)

export default withPlugins(nextConfig)
77 changes: 41 additions & 36 deletions apps/blog/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,54 +4,59 @@
"private": true,
"description": "A blog built with Next.js and MDX.",
"dependencies": {
"@effect/platform-node": "^0.86.4",
"@effect/printer": "^0.44.8",
"@effect/printer-ansi": "^0.44.8",
"@effect/rpc": "^0.62.4",
"@effect/typeclass": "^0.35.8",
"@blog/utils": "workspace:*",
"@dprint/formatter": "^0.4.1",
"@effect-atom/atom-react": "^0.4.0",
"@effect/cli": "^0.72.0",
"@effect/platform": "^0.93.0",
"@effect/platform-node": "^0.100.0",
"@monaco-editor/react": "^4.7.0",
"@shadcn/ui": "workspace:*",
"@vercel/analytics": "^1.5.0",
"@vercel/edge-config": "^1.4.0",
"@vercel/edge-config": "^1.4.3",
"@vercel/speed-insights": "^1.2.0",
"bcryptjs": "^3.0.2",
"@webcontainer/api": "^1.6.1",
"@xterm/addon-fit": "^0.10.0",
"@xterm/xterm": "^5.5.0",
"bcryptjs": "^3.0.3",
"class-variance-authority": "^0.7.1",
"codice": "^1.3.2",
"date-fns": "^3.6.0",
"effect": "^3.16.8",
"esbuild": "^0.25.10",
"framer-motion": "^12.7.4",
"jose": "^6.0.11",
"lucide-react": "^0.503.0",
"next": "^15.5.4",
"codice": "^1.5.2",
"date-fns": "^4.1.0",
"effect": "^3.19.2",
"esbuild": "^0.25.12",
"file-saver": "^2.0.5",
"framer-motion": "^12.23.24",
"jose": "^6.1.0",
"jotai": "^2.15.1",
"jszip": "^3.10.1",
"lucide-react": "^0.553.0",
"monaco-editor": "^0.54.0",
"next": "^16.0.1",
"next-themes": "^0.4.6",
"react": "^19.1.1",
"react-day-picker": "^8.10.1",
"react-dom": "^19.1.1",
"react": "^19.2.0",
"react-day-picker": "^9.7.0",
"react-dom": "^19.2.0",
"react-resizable-panels": "^3.0.6",
"recharts": "^2.15.3",
"sonner": "^2.0.3",
"tailwindcss": "^4.1.4",
"unfurl.js": "^6.4.0"
"sonner": "^2.0.7",
"tailwindcss": "^4.1.17",
"zod": "^4.1.12"
},
"devDependencies": {
"@blog/utils": "workspace:*",
"@effect/cli": "^0.64.2",
"@effect/platform": "^0.91.1",
"@mdx-js/loader": "^3.1.0",
"@mdx-js/react": "^3.1.0",
"@next/mdx": "^15.3.1",
"@shadcn/ui": "workspace:*",
"@tailwindcss/postcss": "^4.1.4",
"@tailwindcss/typography": "^0.5.16",
"@mdx-js/loader": "^3.1.1",
"@mdx-js/react": "^3.1.1",
"@next/mdx": "^16.0.1",
"@tailwindcss/postcss": "^4.1.17",
"@tailwindcss/typography": "^0.5.19",
"@types/file-saver": "^2.0.7",
"@types/mdx": "^2.0.13",
"@zod/mini": "4.0.0-beta.20250430T185432",
"clsx": "^2.1.1",
"dotenv": "^16.5.0",
"dotenv": "^17.2.3",
"image-size": "^2.0.2",
"prettier": "^3.6.2",
"postcss": "^8.5.6",
"rehype-autolink-headings": "^7.1.0",
"rehype-slug": "^6.0.0",
"remark-gfm": "^4.0.1",
"remark-sugar-high": "^0.6.0",
"tailwind-merge": "^3.2.0",
"tw-animate-css": "^1.2.9"
"tw-animate-css": "^1.4.0"
}
}
12 changes: 10 additions & 2 deletions apps/blog/project.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,27 @@
"bootstrap": {
"executor": "nx:run-commands",
"outputs": ["{projectRoot}/src/data"],
"dependsOn": ["^build"],
"options": {
"env": {
"APP_CONFIG_FILE": "apps/blog/info.json",
"NODE_OPTIONS": "--no-warnings --loader @mdx-js/node-loader"
},
"cwd": "{workspaceRoot}",
"command": "tsx apps/blog/src/utils/bootstrap.ts {projectRoot}"
}
},
"build": {
"dependsOn": ["bootstrap"]
"dependsOn": ["bootstrap"],
"options": {
"args": ["--webpack"]
}
},
"dev": {
"dependsOn": ["bootstrap"]
"dependsOn": ["bootstrap"],
"options": {
"args": ["--webpack"]
}
}
}
}
Binary file not shown.
Binary file not shown.
2 changes: 1 addition & 1 deletion apps/blog/src/app/(private)/about/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { unstable_ViewTransition as ViewTransition } from 'react'
import { ViewTransition } from 'react'

import { Page } from '@/components/page'

Expand Down
2 changes: 1 addition & 1 deletion apps/blog/src/app/(private)/about/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ export default function AboutPage() {
</div>

<div className="col-span-6">
<div className="aspect-[3/4] bg-muted overflow-hidden">
<div className="aspect-3/4 bg-muted overflow-hidden">
<Image
src="/images/about/moa-torres-by-will-stuetz.png"
alt="Portrait of Moa Torres"
Expand Down
2 changes: 1 addition & 1 deletion apps/blog/src/app/(public)/(home)/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { unstable_ViewTransition as ViewTransition } from 'react'
import { ViewTransition } from 'react'

export default function Layout({ children }: { children: React.ReactNode }) {
return <ViewTransition>{children}</ViewTransition>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { unstable_ViewTransition as ViewTransition } from 'react'
import { ViewTransition } from 'react'

import { ArticleFooter } from '@/components/article-footer'
import { FloatingActions } from '@/components/floating-actions'
Expand All @@ -11,7 +11,7 @@ export default function Layout({ children }: { children: React.ReactNode }) {
<Page>
<PageSection>
<ScrollToHash offset={10} />
<article className="prose max-w-none dark:prose-invert min-w-[100%] prose-p:text-muted-foreground prose-a:decoration-transparent prose-a:font-normal prose-headings:[>a]:font-medium prose-h1:text-3xl prose-h1:md:text-5xl prose-h1:font-bold prose-h1:tracking-tight prose-h1:leading-tight prose-h1:mb-6 prose-h2:text-2xl prose-h2:mt-12 prose-h2:mb-4 prose-h3:font-semibold prose-h3:mt-8 prose-h3:mb-3 prose-h4:font-semibold prose-h4:mt-6 prose-h4:mb-3 prose-h5:text-xs prose-h5:uppercase prose-h5:tracking-widest prose-h5:text-muted-foreground prose-h5:my-1 prose-h6:text-sm prose-h6:text-muted-foreground prose-h6:my-1 prose-pre:bg-zinc-100 prose-pre:dark:bg-(--tw-prose-pre-bg)">
<article className="prose max-w-none dark:prose-invert min-w-full prose-p:text-muted-foreground prose-a:decoration-transparent prose-a:font-normal prose-headings:[>a]:font-medium prose-h1:text-3xl prose-h1:md:text-5xl prose-h1:font-bold prose-h1:tracking-tight prose-h1:leading-tight prose-h1:mb-6 prose-h2:text-2xl prose-h2:mt-12 prose-h2:mb-4 prose-h3:font-semibold prose-h3:mt-8 prose-h3:mb-3 prose-h4:font-semibold prose-h4:mt-6 prose-h4:mb-3 prose-h5:text-xs prose-h5:uppercase prose-h5:tracking-widest prose-h5:text-muted-foreground prose-h5:my-1 prose-h6:text-sm prose-h6:text-muted-foreground prose-h6:my-1 prose-pre:bg-zinc-100 prose-pre:dark:bg-(--tw-prose-pre-bg)">
{children}
</article>
<ArticleFooter />
Expand Down
Loading