Skip to content

Fix the docs site's Fulldev Scan findings - #31

Merged
silveltman merged 2 commits into
mainfrom
scan-fixes
Oct 17, 2026
Merged

silveltman merged 2 commits into
mainfrom
scan-fixes

Conversation

@silveltman

@silveltman silveltman commented Oct 17, 2026 •

Copy link
Copy Markdown
Contributor

Fixes what Fulldev Scan found on sitex.full.dev.

Changes

  1. Contrast. The theme tokens in apps/docs/src/index.css take the Fulldev colours: light primary #1442e9 with white text (7.0:1), text #1d1f24, muted text #555861, background #fbfaf8; dark background #0c0b09, text #f2f1ee, primary #d34110 with white text (4.63:1). The homepage button was white on #ff5e00 (3.06:1) in the default dark theme. Two follow-on changes keep both modes passing: typography links use the foreground in dark mode (orange text on the dark background is 4.2:1, Fulldev's own rule), and code blocks sit on bg-card so light syntax colours keep their contrast on the stone page.
  2. Landmarks. SidebarInset renders a div instead of a second main (marked Local: in the shadcn copy), so the layout's LayoutMain is the one top-level main and the header becomes the banner. The sidebar's logo and links sit in a nav labelled "Site navigation". Docs app only, so no package release; the changeset is empty like earlier docs-only PRs.
  3. Framing. netlify.toml sends Content-Security-Policy: frame-ancestors 'self', as ui.full.dev does. Nothing in the repo or the fulldev monorepo embeds the docs.
  4. JSON-LD. The home layout adds a WebSite with Fulldev (https://full.dev) as the publishing Organization, unless the page sets its own jsonLd.
  5. llms.txt. A small build plugin in apps/docs/vite.config.ts writes /llms.txt from the sidebar navigation in src/globals/index.yaml and each page's frontmatter: title, URL and description per page, grouped as Docs and Components, in the ui.full.dev format.
  6. Analytics. posthog.tsx imports PostHog after the window load event and then requestIdleCallback (timeout 1000, setTimeout fallback), as fulldotdev/ui does.

Verification

  • vp run check and vp run build pass.
  • axe (Playwright, built output, 1440px and 390px, light and dark) on the homepage and all 18 docs pages: no color-contrast on .bg-primary, no landmark-main-is-top-level, landmark-no-duplicate-main, landmark-unique or region left. Light-mode code had failing syntax colours before; on bg-card only the github-light orange #e36209 remains (3.5:1, 12 nodes), plus one scrollable-region-focusable code block on /docs/installation. Both predate this PR and are not in the scan.
  • dist/index.html has the WebSite JSON-LD; docs pages have none.
  • dist/llms.txt lists all 18 docs pages.
  • With the built site served as sitex.full.dev, the analytics chunk is requested after the load event. Lighthouse was not rerun.
  • The Content-Security-Policy header is checked in netlify.toml only. The Deploy Preview will show it live.

Notes

  • The light sidebar and the content panel now share the stone background, as do the dark ones, so the panel is set apart by its shadow only. The logo tile stays Sitex's own orange.
  • Local installs need PNPM_CONFIG_VIRTUAL_STORE_TYPE=isolated on Macs with pnpm's global virtual store: vitest resolves to vite-plus-test 0.1.24, whose vite-plus-core cannot find vite-plus/binding from the global store. CI and Netlify use the normal store and are unaffected.

🤖 Generated with Claude Code

- Theme tokens take the Fulldev colours in light and dark mode, so white
  text on the primary passes contrast. Links use the foreground in dark
  mode and code blocks sit on the card colour.
- The sidebar inset is a div and the sidebar a labelled nav, so the page
  has one top-level main and no content outside landmarks.
- Netlify sends Content-Security-Policy: frame-ancestors 'self'.
- The homepage carries WebSite JSON-LD with Fulldev as publisher.
- The build writes /llms.txt from the docs navigation and frontmatter.
- Analytics starts after the load event and an idle callback.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@netlify

netlify Bot commented Oct 17, 2026 •

Copy link
Copy Markdown

✅ Deploy Preview for fulldev-sitex ready!

Name Link
🔨 Latest commit 65df6d2
🔍 Latest deploy log https://app.netlify.com/projects/fulldev-sitex/deploys/6ad3e4b19f87a882daae91a3
😎 Deploy Preview https://deploy-preview-31--fulldev-sitex.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
🤖 Make changes Run an agent on this branch

To edit notification comments on pull requests, go to your Netlify project configuration.

@silveltman
silveltman marked this pull request as ready for review October 17, 2026 21:19
@silveltman
silveltman merged commit a4219c0 into main Oct 17, 2026
11 checks passed
@silveltman
silveltman deleted the scan-fixes branch October 17, 2026 21:31
silveltman added a commit that referenced this pull request Oct 19, 2026
…nt docs to Fulldev UI (#34)

Follows up on last night's Fulldev Scan of sitex.full.dev, and moves the
component documentation to Fulldev UI: Sitex is the framework, and
Fulldev UI holds the React components.

## Changes

1. **Markdown versions.** Every page has a Markdown version at its path
with `.md`, the homepage at `/index.md`, as on full.dev and ui.full.dev.
The build plugin in `apps/docs/vite.config.ts` (`markdown()`, which also
writes llms.txt) serves each MDX file as written; the homepage's hero
and features, which its layout renders from the frontmatter, follow as
Markdown. Each page links its version with `<link rel="alternate"
type="text/markdown">`, and llms.txt links to the `.md` files. Netlify
serves `.md` as `text/markdown`; `netlify.toml` adds `X-Robots-Tag:
noindex` for them, like ui.full.dev. The scan probes the alternate link,
`/path.md` and `/index.md`, so it finds them. No `Accept: text/markdown`
negotiation: full.dev and ui.full.dev do not have it either, and on
Netlify it would need an edge function.
2. **Site name.** The site's name is Sitex: `og:site_name`, the WebSite
structured data (from the globals, not the page title) and llms.txt's
heading. The scan's "Business name written in several ways" compares
`og:site_name` with the names of organizations that are top-level or the
WebSite's `publisher`, `about`, `mainEntity`, `copyrightHolder` or
`owner`. Fulldev is now the WebSite's `creator`: it made Sitex, and the
site's own name stays Sitex. Page titles are unchanged.
3. **Load time.** `netlify.toml` lets browsers keep the hashed files in
`/assets/` for a year (`immutable`), as full.dev and ui.full.dev do for
`/_astro/`. They were `max-age=0, must-revalidate`, so every page view
checked the stylesheet again before rendering.
4. **Component docs moved to Fulldev UI.** `/docs/components` and its 13
component pages are gone, with their navigation, Markdown versions,
llms.txt and sitemap entries. Their framework part (static rendering,
client directives, prefetch) is now `/docs/rendering`, where the older
rendering addresses point again. The layouts page and the package README
point to [Fulldev UI's React components](https://ui.full.dev/react/) for
ready-made components. Redirects (301):
- `/docs/components` and `/docs/ui/components` to
`https://ui.full.dev/react/components/`
-
`/docs/components/{banner,header,layout,marquee,price,rating,section,theme-toggle,toc,typography}`
to the same name under `https://ui.full.dev/react/components/`
- `/docs/components/*` (code, gradient, tile) and `/docs/ui` to
`https://ui.full.dev/react/`
- `/docs/ui/installation` to
`https://ui.full.dev/react/docs/installation/`
- `/docs/ui/*` still to `/docs/components/:splat`, which then redirects
as above

## Not changed

- **Component code and registry.** `apps/docs/src/components/ui` stays.
The docs site renders with code, header, layout, section, theme-toggle,
toc and typography, and `apps/docs/registry.json` still publishes all 13
at `https://sitex.full.dev/r/*.json`; banner, gradient, marquee, price,
rating and tile are only in that registry. The framework package uses
none of them. Retiring the Sitex registry is a separate decision.
- **Unused JavaScript.** Analytics already loads after the load event
and idle time (#31); Lighthouse counts it because it downloads within
its measuring window. The rest is React in `islandClient`, which the
theme toggle on every page needs.
- **Render-blocking CSS.** One 14.5 KB (gzip) stylesheet. Removing the
delay means inlining CSS, a framework change in `packages/sitex`.
full.dev has the same hint.

## Verification

- `vp run fix`, `vp run check`, `vp run build` and `changeset status
--since=origin/main` pass.
- `dist` has 6 pages, each with its `.md`; llms.txt and the sitemap list
those 6.
- Deploy Preview: every redirect above ends in a 200; `/docs/rendering`,
the old rendering addresses and `/r/*.json` answer; `.md` files are
`text/markdown`, which the Scan's Markdown test counts as usable;
`/assets/*` has `max-age=31536000, immutable`. Previews mark every
response noindex, so the `.md` noindex rule shows only in production.
- Playwright on the Deploy Preview in Chromium, Firefox and WebKit at
1280 and 390 px: the 6 pages load without errors, every link and
Markdown version answers 200, nothing links to `/docs/components`, and
the sidebar and mobile navigation list Introduction, Installation,
Pages, Layouts and Rendering.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Sil Veltman <otis@otis.tailb5cb80.ts.net>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant