Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 2 additions & 2 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ An interactive reference for ECMA-376 (Office Open XML) built by the [SuperDoc](

## Why This Exists

The official ECMA-376 spec is 5,000+ pages. Most of it you'll never need, and the parts you do need often omit critical rendering details that only surface when you compare against Word's actual behavior. This site fills that gap with implementation notes from building SuperDoc — a document editor that renders OOXML natively in the browser.
The official ECMA-376 spec is 5,000+ pages. Most of it you'll never need, and the parts you do need often omit critical rendering details that only surface when you compare against Word's actual behavior. This site fills that gap with implementation notes from building SuperDoc — a document engine that renders OOXML natively in the browser.

This is also how people discover SuperDoc. By sharing what we've learned, we position ourselves as the OOXML experts. Every page should reflect that authority: practical, specific, from-experience.

Expand Down Expand Up @@ -97,7 +97,7 @@ The XML you provide is wrapped in a minimal `w:document > w:body` structure auto

## MCP Server

Cloudflare Worker exposing three MCP tools for AI-powered spec search:
Cloudflare Worker exposing three MCP tools for semantic spec search:

- `search_ecma_spec` — semantic vector search across 18,000+ spec chunks
- `get_section` — fetch a specific section by ID (e.g., "17.3.1.24")
Expand Down
4 changes: 2 additions & 2 deletions apps/web/public/llms.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

> The OOXML spec, explained by people who actually implemented it.

ooxml.dev is an interactive reference for ECMA-376 (Office Open XML), the standard behind .docx, .xlsx, and .pptx files. It features live previews, real-world implementation gotchas, and AI-powered spec search. Built by the SuperDoc team (https://www.superdoc.dev).
ooxml.dev is an interactive reference for ECMA-376 (Office Open XML), the standard behind .docx, .xlsx, and .pptx files. It features live previews, real-world implementation gotchas, and semantic spec search. Built by the SuperDoc team (https://www.superdoc.dev).

## Main Pages

Expand Down Expand Up @@ -36,4 +36,4 @@ The ooxml.dev MCP server provides AI assistants with access to the ECMA-376 spec

## About

ooxml.dev is built and maintained by the SuperDoc team (https://www.superdoc.dev). SuperDoc is a document engine that implements the OOXML specification. The content on ooxml.dev comes from real-world experience building a full OOXML renderer and editor.
ooxml.dev is built and maintained by the SuperDoc team (https://www.superdoc.dev). SuperDoc is a document engine that implements the OOXML specification. The content on ooxml.dev comes from real-world experience building a full OOXML document engine.
2 changes: 1 addition & 1 deletion apps/web/scripts/prerender.ts
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ function homePageHtml(): string {
return `<main>
<h1>ooxml.dev</h1>
<p>The OOXML spec, explained by people who actually implemented it.</p>
<p>Interactive examples, real-world gotchas, live previews, and AI-powered search.</p>
<p>Interactive examples, real-world gotchas, live previews, and semantic spec search.</p>
<a href="/docs">Browse Reference</a>
${navHtml()}
</main>`;
Expand Down
34 changes: 25 additions & 9 deletions apps/web/src/data/docs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ export const docs: Record<string, DocPage> = {
type: "note",
noteType: "info",
title: "Work in Progress",
text: "This reference is actively being expanded. We're adding new sections, examples, and implementation notes regularly. Check our [GitHub](https://github.com/superdoc-dev/ooxml-dev) for updates and how to contribute.",
text: "This reference is actively being expanded. New sections, examples, and implementation notes land regularly. Check the [GitHub](https://github.com/superdoc-dev/ooxml-dev) for updates and how to contribute.",
},
{ type: "heading", level: 2, text: "What's Different Here" },
{
Expand Down Expand Up @@ -502,7 +502,7 @@ w:rPr (run properties)
{ type: "heading", level: 2, text: "Alignment with Bidi" },
{
type: "paragraph",
text: 'The `w:jc` element uses logical values `start` and `end` that flip based on paragraph direction. `start` means the leading edge: left for LTR, right for RTL. `end` means the trailing edge. The values `left`, `right`, and `center` are always physical and don\'t flip. Arabic justify variants (`lowKashida`, `mediumKashida`, `highKashida`) extend joiners between characters instead of adding word spacing.',
text: "The `w:jc` element uses logical values `start` and `end` that flip based on paragraph direction. `start` means the leading edge: left for LTR, right for RTL. `end` means the trailing edge. The values `left`, `right`, and `center` are always physical and don't flip. Arabic justify variants (`lowKashida`, `mediumKashida`, `highKashida`) extend joiners between characters instead of adding word spacing.",
},
{
type: "preview",
Expand Down Expand Up @@ -655,7 +655,7 @@ w:rPr (run properties)
type: "note",
noteType: "warning",
title: "start/end are logical, left/right are physical",
text: "`jc=\"start\"` flips with direction; `jc=\"left\"` does not. Don't resolve `start` → `left` during import — you'll lose the logical intent. Same applies to `w:ind start`/`end` attributes.",
text: '`jc="start"` flips with direction; `jc="left"` does not. Don\'t resolve `start` → `left` during import — you\'ll lose the logical intent. Same applies to `w:ind start`/`end` attributes.',
app: "Word",
},
{
Expand All @@ -669,22 +669,38 @@ w:rPr (run properties)
type: "table",
headers: ["Element", "Parent", "Description"],
rows: [
["`w:bidi`", "`w:pPr`", "Paragraph base direction — sets RTL layout for indentation, alignment, tabs"],
[
"`w:bidi`",
"`w:pPr`",
"Paragraph base direction — sets RTL layout for indentation, alignment, tabs",
],
["`w:rtl`", "`w:rPr`", "Run reading order — right-to-left character ordering"],
["`w:cs`", "`w:rPr`", "Complex script flag — forces complex script font/size"],
["`w:bidi`", "`w:sectPr`", "Section layout direction — page-level RTL (separate from paragraph bidi)"],
[
"`w:bidi`",
"`w:sectPr`",
"Section layout direction — page-level RTL (separate from paragraph bidi)",
],
],
},
{
type: "table",
headers: ["Attribute / Value", "Context", "Description"],
rows: [
["`w:jc val=\"start\"`", "`w:pPr`", "Leading edge alignment — left for LTR, right for RTL"],
["`w:jc val=\"end\"`", "`w:pPr`", "Trailing edge alignment — right for LTR, left for RTL"],
['`w:jc val="start"`', "`w:pPr`", "Leading edge alignment — left for LTR, right for RTL"],
['`w:jc val="end"`', "`w:pPr`", "Trailing edge alignment — right for LTR, left for RTL"],
["`w:ind start`", "`w:pPr`", "Leading edge indent — right side for RTL"],
["`w:ind end`", "`w:pPr`", "Trailing edge indent — left side for RTL"],
["`w:tab pos`", "`w:pPr > w:tabs`", "Tab position from leading edge — from right for RTL"],
["`w:lang bidi`", "`w:rPr`", "Bidi language tag (ar-SA, he-IL) — affects neutral char resolution"],
[
"`w:tab pos`",
"`w:pPr > w:tabs`",
"Tab position from leading edge — from right for RTL",
],
[
"`w:lang bidi`",
"`w:rPr`",
"Bidi language tag (ar-SA, he-IL) — affects neutral char resolution",
],
],
},
{
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/pages/Home.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ export function Home() {
The OOXML spec, explained by people who actually implemented it.
<br className="hidden sm:block" />
<span className="sm:hidden"> </span>
Interactive examples, real-world gotchas, live previews, and AI-powered search.
Interactive examples, real-world gotchas, live previews, and semantic spec search.
</p>
<div className="flex justify-center gap-4 mb-6">
<Link
Expand Down