@pnx-mixtape/mxds 0.1.0-rc.4 → 0.1.0-rc.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/skills/create-mxds-component/SKILL.md +77 -0
- package/DESIGN.md +595 -0
- package/README.md +2 -3
- package/dist/build/accordion.entry.js +2 -1
- package/dist/build/autocomplete.entry.js +1 -1
- package/dist/build/back-to-top.css +1 -0
- package/dist/build/back-to-top.entry.js +1 -0
- package/dist/build/base.css +1 -1
- package/dist/build/button.css +1 -1
- package/dist/build/card.css +1 -1
- package/dist/build/chunks/Accordion-Bqe8vTNR.js +44 -0
- package/dist/build/chunks/AccordionGroup-BYtoAFxg.js +47 -0
- package/dist/build/chunks/AccordionMobile-D517oXYZ.js +26 -0
- package/dist/build/chunks/Autocomplete-kRo8RNbC.js +135 -0
- package/dist/build/chunks/BackToTop-4M-Wl7z3.js +64 -0
- package/dist/build/chunks/ClosableAlert-CZ114JsL.js +55 -0
- package/dist/build/chunks/CookieConsent-wd8gQ2Oe.js +18 -0
- package/dist/build/chunks/Dialog-DoYcGqhW.js +48 -0
- package/dist/build/chunks/DropMenu-CSTZq0Zt.js +68 -0
- package/dist/build/chunks/FeedbackForm-BsL7fv8s.js +64 -0
- package/dist/build/chunks/Gallery-DqJPujX5.js +165 -0
- package/dist/build/chunks/GlobalToggle-7H3F1Wvc.js +82 -0
- package/dist/build/chunks/InPageNavigation-D7m3IN89.js +86 -0
- package/dist/build/chunks/Navigation-CRModT40.js +142 -0
- package/dist/build/chunks/Popover-CiTAftNU.js +30 -0
- package/dist/build/chunks/Sticky-C1H8MNqK.js +51 -0
- package/dist/build/chunks/Tabs-BJD3kABL.js +160 -0
- package/dist/build/chunks/Translate-yAgySwet.js +46 -0
- package/dist/build/chunks/cookie-compliance-CG6x-TcV.js +119 -0
- package/dist/build/chunks/enums-BrHxPZZ_.js +36 -0
- package/dist/build/chunks/polyfills-D-qh1a_2.js +33 -0
- package/dist/build/chunks/utilities-B9mNRs7V.js +255 -0
- package/dist/build/content-block.css +1 -1
- package/dist/build/cookie-consent.entry.js +1 -1
- package/dist/build/dialog.entry.js +1 -1
- package/dist/build/drop-menu.entry.js +1 -1
- package/dist/build/elements.js +147 -1
- package/dist/build/feedback-form.css +1 -0
- package/dist/build/feedback-form.entry.js +1 -0
- package/dist/build/filters.entry.js +145 -1
- package/dist/build/form.css +1 -1
- package/dist/build/gallery.entry.js +1 -1
- package/dist/build/global-alert.entry.js +1 -1
- package/dist/build/header.css +1 -1
- package/dist/build/header.entry.js +1 -1
- package/dist/build/icon.css +1 -1
- package/dist/build/in-page-navigation.entry.js +1 -1
- package/dist/build/navigation.css +1 -1
- package/dist/build/navigation.entry.js +1 -1
- package/dist/build/pagination.css +1 -1
- package/dist/build/popover.entry.js +1 -1
- package/dist/build/react.js +2291 -1
- package/dist/build/side-navigation.css +1 -1
- package/dist/build/sidebar.css +1 -1
- package/dist/build/sticky.entry.js +1 -1
- package/dist/build/tabs.entry.js +1 -1
- package/dist/build/translate.css +1 -0
- package/dist/build/translate.entry.js +1 -0
- package/dist/build/utility-list.entry.js +53 -1
- package/dist/types/Component/BackToTop/BackToTop.d.ts +20 -0
- package/dist/types/Component/BackToTop/BackToTop.d.ts.map +1 -0
- package/dist/types/Component/BackToTop/Elements/BackToTop.d.ts +27 -0
- package/dist/types/Component/BackToTop/Elements/BackToTop.d.ts.map +1 -0
- package/dist/types/Component/BackToTop/back-to-top.entry.d.ts +2 -0
- package/dist/types/Component/BackToTop/back-to-top.entry.d.ts.map +1 -0
- package/dist/types/Component/DropMenu/DropMenu.d.ts +2 -1
- package/dist/types/Component/DropMenu/DropMenu.d.ts.map +1 -1
- package/dist/types/Component/Navigation/Elements/Navigation.d.ts +2 -3
- package/dist/types/Component/Navigation/Elements/Navigation.d.ts.map +1 -1
- package/dist/types/Component/SideNavigation/Components/SideNavigationTree.d.ts +3 -3
- package/dist/types/Component/SideNavigation/Components/SideNavigationTree.d.ts.map +1 -1
- package/dist/types/Component/SideNavigation/SideNavigation.d.ts +3 -1
- package/dist/types/Component/SideNavigation/SideNavigation.d.ts.map +1 -1
- package/dist/types/Component/Tabs/Components/TabDropMenu.d.ts.map +1 -1
- package/dist/types/Component/Tabs/Elements/Tabs.d.ts.map +1 -1
- package/dist/types/Component/Translate/Elements/Translate.d.ts +23 -0
- package/dist/types/Component/Translate/Elements/Translate.d.ts.map +1 -0
- package/dist/types/Component/Translate/Translate.d.ts +37 -0
- package/dist/types/Component/Translate/Translate.d.ts.map +1 -0
- package/dist/types/Component/Translate/languages.d.ts +11 -0
- package/dist/types/Component/Translate/languages.d.ts.map +1 -0
- package/dist/types/Component/Translate/translate.entry.d.ts +2 -0
- package/dist/types/Component/Translate/translate.entry.d.ts.map +1 -0
- package/dist/types/Form/FeedbackForm/Elements/FeedbackForm.d.ts +37 -0
- package/dist/types/Form/FeedbackForm/Elements/FeedbackForm.d.ts.map +1 -0
- package/dist/types/Form/FeedbackForm/FeedbackForm.d.ts +36 -0
- package/dist/types/Form/FeedbackForm/FeedbackForm.d.ts.map +1 -0
- package/dist/types/Form/FeedbackForm/feedback-form.entry.d.ts +2 -0
- package/dist/types/Form/FeedbackForm/feedback-form.entry.d.ts.map +1 -0
- package/dist/types/Utility/Elements/google-translate-widget.d.ts +91 -0
- package/dist/types/Utility/Elements/google-translate-widget.d.ts.map +1 -0
- package/dist/types/Utility/utilities.d.ts +2 -0
- package/dist/types/Utility/utilities.d.ts.map +1 -1
- package/dist/types/elements.d.ts +3 -0
- package/dist/types/elements.d.ts.map +1 -1
- package/dist/types/enums.d.ts +3 -1
- package/dist/types/enums.d.ts.map +1 -1
- package/dist/types/react.d.ts +3 -0
- package/dist/types/react.d.ts.map +1 -1
- package/dist/types/tokens.d.ts +1 -0
- package/dist/types/tokens.d.ts.map +1 -1
- package/docs/API.md +1215 -0
- package/docs/CSSGuidelines.md +893 -0
- package/docs/CodeQuality.md +940 -0
- package/docs/ComponentArchitecture.md +714 -0
- package/docs/Contributing.md +626 -0
- package/docs/MemoryManagement.md +598 -0
- package/docs/Migrations.md +6 -0
- package/docs/README.md +100 -0
- package/docs/Security.md +444 -0
- package/docs/Testing.md +739 -0
- package/docs/Troubleshooting.md +674 -0
- package/package.json +9 -6
- package/src/Atom/Button/Button.tsx +1 -1
- package/src/Atom/Button/__snapshots__/Button.stories.tsx.snap +2 -2
- package/src/Atom/Button/_buttons.css +1 -0
- package/src/Atom/Icon/README.md +1 -1
- package/src/Atom/Icon/_icon.css +1 -0
- package/src/Atom/Icon/images/thumb.svg +1 -0
- package/src/Atom/Link/_links.css +1 -0
- package/src/Atom/Media/__snapshots__/Media.stories.ts.snap +4 -9
- package/src/Atom/Media/media.twig +4 -5
- package/src/Component/BackToTop/BackToTop.stories.ts +127 -0
- package/src/Component/BackToTop/BackToTop.stories.tsx +53 -0
- package/src/Component/BackToTop/BackToTop.tsx +120 -0
- package/src/Component/BackToTop/Elements/BackToTop.ts +119 -0
- package/src/Component/BackToTop/README.md +164 -0
- package/src/Component/BackToTop/__snapshots__/BackToTop.stories.ts.snap +24 -0
- package/src/Component/BackToTop/__snapshots__/BackToTop.stories.tsx.snap +3 -0
- package/src/Component/BackToTop/back-to-top.css +70 -0
- package/src/Component/BackToTop/back-to-top.entry.js +1 -0
- package/src/Component/BackToTop/back-to-top.twig +26 -0
- package/src/Component/Card/Components/CardContent.tsx +1 -1
- package/src/Component/Card/Components/CardMedia.tsx +1 -1
- package/src/Component/Card/__snapshots__/Card.stories.tsx.snap +3 -3
- package/src/Component/Card/card.css +1 -1
- package/src/Component/Carousel/Carousel.stories.ts +66 -36
- package/src/Component/Carousel/__snapshots__/Carousel.stories.tsx.snap +5 -5
- package/src/Component/ContentBlock/Components/ContentBlockMedia.tsx +1 -1
- package/src/Component/ContentBlock/content-block.css +1 -1
- package/src/Component/DropMenu/DropMenu.stories.ts +21 -2
- package/src/Component/DropMenu/DropMenu.tsx +14 -4
- package/src/Component/DropMenu/__snapshots__/DropMenu.stories.ts.snap +3 -3
- package/src/Component/DropMenu/__snapshots__/DropMenu.stories.tsx.snap +2 -2
- package/src/Component/DropMenu/drop-menu.twig +7 -1
- package/src/Component/HeroBanner/__snapshots__/HeroBanner.stories.tsx.snap +1 -1
- package/src/Component/InPageNavigation/__snapshots__/InPageNavigation.stories.ts.snap +48 -13
- package/src/Component/InPageNavigation/in-page-navigation.twig +4 -6
- package/src/Component/ListItem/Components/ListItemMedia.tsx +1 -1
- package/src/Component/Navigation/Elements/Navigation.ts +25 -29
- package/src/Component/Navigation/README.md +11 -10
- package/src/Component/Navigation/__snapshots__/Navigation.stories.ts.snap +8 -8
- package/src/Component/Navigation/_navigation-dropdown.css +9 -11
- package/src/Component/Navigation/_navigation-mega.css +5 -11
- package/src/Component/Navigation/_navigation.css +5 -3
- package/src/Component/Navigation/menu.twig +1 -1
- package/src/Component/Navigation/navigation.twig +0 -1
- package/src/Component/Pagination/Pagination.stories.ts +57 -27
- package/src/Component/Pagination/pagination.css +16 -7
- package/src/Component/Popover/__snapshots__/Popover.stories.tsx.snap +3 -3
- package/src/Component/SideNavigation/Components/SideNavigationTree.tsx +68 -24
- package/src/Component/SideNavigation/README.md +78 -32
- package/src/Component/SideNavigation/SideNavigation.stories.ts +41 -2
- package/src/Component/SideNavigation/SideNavigation.stories.tsx +31 -0
- package/src/Component/SideNavigation/SideNavigation.tsx +13 -3
- package/src/Component/SideNavigation/__snapshots__/SideNavigation.stories.ts.snap +87 -3
- package/src/Component/SideNavigation/__snapshots__/SideNavigation.stories.tsx.snap +2 -0
- package/src/Component/SideNavigation/side-navigation.css +3 -3
- package/src/Component/SideNavigation/side-navigation.twig +10 -3
- package/src/Component/Tabs/Components/TabDropMenu.tsx +7 -1
- package/src/Component/Tabs/Elements/Tabs.ts +13 -3
- package/src/Component/Tabs/Tabs.stories.ts +33 -12
- package/src/Component/Tabs/Tabs.stories.tsx +28 -14
- package/src/Component/Tabs/__snapshots__/Tabs.stories.ts.snap +3 -3
- package/src/Component/Tabs/__snapshots__/Tabs.stories.tsx.snap +2 -2
- package/src/Component/Translate/Elements/Translate.ts +76 -0
- package/src/Component/Translate/README.md +285 -0
- package/src/Component/Translate/Translate.stories.ts +87 -0
- package/src/Component/Translate/Translate.stories.tsx +77 -0
- package/src/Component/Translate/Translate.tsx +213 -0
- package/src/Component/Translate/__snapshots__/Translate.stories.ts.snap +18 -0
- package/src/Component/Translate/__snapshots__/Translate.stories.tsx.snap +3 -0
- package/src/Component/Translate/languages.ts +39 -0
- package/src/Component/Translate/translate.css +62 -0
- package/src/Component/Translate/translate.entry.js +1 -0
- package/src/Component/Translate/translate.twig +44 -0
- package/src/Form/Autocomplete/Autocomplete.stories.tsx +2 -1
- package/src/Form/FeedbackForm/Elements/FeedbackForm.ts +122 -0
- package/src/Form/FeedbackForm/FeedbackForm.stories.ts +99 -0
- package/src/Form/FeedbackForm/FeedbackForm.stories.tsx +73 -0
- package/src/Form/FeedbackForm/FeedbackForm.tsx +196 -0
- package/src/Form/FeedbackForm/README.md +233 -0
- package/src/Form/FeedbackForm/__snapshots__/FeedbackForm.stories.ts.snap +125 -0
- package/src/Form/FeedbackForm/__snapshots__/FeedbackForm.stories.tsx.snap +5 -0
- package/src/Form/FeedbackForm/feedback-form.css +74 -0
- package/src/Form/FeedbackForm/feedback-form.entry.js +1 -0
- package/src/Form/FeedbackForm/feedback-form.twig +80 -0
- package/src/Form/form.css +17 -19
- package/src/Introduction.mdx +1 -1
- package/src/Layout/Footer/__snapshots__/Footer.stories.ts.snap +3 -3
- package/src/Layout/Header/Components/GlobalToggle.tsx +1 -1
- package/src/Layout/Header/Header.stories.ts +53 -48
- package/src/Layout/Header/Header.stories.tsx +35 -22
- package/src/Layout/Header/Header.tsx +2 -2
- package/src/Layout/Header/__snapshots__/Header.stories.ts.snap +18 -14
- package/src/Layout/Header/__snapshots__/Header.stories.tsx.snap +2 -2
- package/src/Layout/Header/_toggles.css +7 -7
- package/src/Layout/Page/__snapshots__/Page.stories.tsx.snap +1 -1
- package/src/Layout/Sidebar/sidebar.css +10 -3
- package/src/Utility/Elements/google-translate-widget.ts +293 -0
- package/src/Utility/global.d.ts +4 -0
- package/src/Utility/utilities.ts +2 -0
- package/src/_custom-media.css +2 -0
- package/src/elements.ts +3 -0
- package/src/enums.ts +2 -0
- package/src/react.ts +3 -0
- package/src/tokens.js +1 -0
- package/dist/build/chunks/Accordion-GN0sME4W.js +0 -1
- package/dist/build/chunks/AccordionGroup-Bzqp5__q.js +0 -1
- package/dist/build/chunks/AccordionMobile-DG5jSe8Q.js +0 -1
- package/dist/build/chunks/Autocomplete-B4RtkAyh.js +0 -1
- package/dist/build/chunks/ClosableAlert-DEhj8Nxm.js +0 -1
- package/dist/build/chunks/CookieConsent-BkCMRVST.js +0 -1
- package/dist/build/chunks/Dialog-Haahn-Yn.js +0 -1
- package/dist/build/chunks/DropMenu-1baQc8Yc.js +0 -1
- package/dist/build/chunks/Gallery-D8NGXy2Q.js +0 -1
- package/dist/build/chunks/GlobalToggle-B52fdBQu.js +0 -1
- package/dist/build/chunks/InPageNavigation-Dyn2TR-N.js +0 -1
- package/dist/build/chunks/Navigation-hOrfLq7h.js +0 -1
- package/dist/build/chunks/Popover-Cxg-s5Jn.js +0 -1
- package/dist/build/chunks/Sticky-BGCuuEJK.js +0 -1
- package/dist/build/chunks/Tabs-DYy1YTdU.js +0 -15
- package/dist/build/chunks/cookie-compliance-Bbm-0vpj.js +0 -1
- package/dist/build/chunks/enums-DLV_1NAf.js +0 -1
- package/dist/build/chunks/polyfills-C7pRt54M.js +0 -1
- package/dist/build/chunks/utilities-_Bq3TxAQ.js +0 -1
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: create-mxds-component
|
|
3
|
+
description: Scaffold a new mxds component (React/Twig/Web-Component) via tools/scaffold-component.mjs, then fill in real props/markup/CSS/stories/README. Use when asked to create/add a new mxds component in this repo.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Create an mxds component
|
|
7
|
+
|
|
8
|
+
This repo has no manual scaffolding step for new components — use `tools/scaffold-component.mjs` to generate the boilerplate, then fill in the real implementation. Follow every step below as a directive, not a suggestion.
|
|
9
|
+
|
|
10
|
+
## Prerequisites
|
|
11
|
+
|
|
12
|
+
1. Decide the **category**: `Atom`, `Component`, `Form`, or `Layout` (no Molecule tier exists).
|
|
13
|
+
2. Decide the **PascalName** (e.g. `SocialShare`).
|
|
14
|
+
3. Read `docs/ComponentArchitecture.md` if you haven't already this session.
|
|
15
|
+
4. Pick one existing component in the same category as a reference for structure and tone (e.g. `src/Component/Tag` for a simple one, `src/Component/Sticky` for one with a Web Component).
|
|
16
|
+
5. **If the new component composes or embeds another existing mxds component** (e.g. it renders a `Button`, `Icon`, or `Tag` internally), read that component's **full README**, not just its prop table, before writing any markup that uses its classes. Modifier classes are frequently only valid in combination — e.g. Button's README documents under `### Outline combination` that `mx-button--outline` has no effect on its own and must be paired with a colour modifier like `mx-button--dark`. Guessing a class name from memory or from the enum list alone will produce output that looks plausible but is wrong; the README is the source of truth for combination rules.
|
|
17
|
+
|
|
18
|
+
## Step 1 — Run the CLI
|
|
19
|
+
|
|
20
|
+
Dry-run first if you're unsure which stacks apply:
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
node tools/scaffold-component.mjs <Category> <PascalName> --dry-run
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Passing no `--react`/`--webcomponent`/`--twig` flags generates all three (the default — most components provide all three formats). Pass specific flags to scaffold only what's needed (e.g. `--twig` only, for Twig-only additions).
|
|
27
|
+
|
|
28
|
+
Then run for real (drop `--dry-run`) and **confirm the printed barrel diff looks right** — it shows the exact lines inserted into `src/elements.ts` and `src/react.ts`.
|
|
29
|
+
|
|
30
|
+
Flags:
|
|
31
|
+
|
|
32
|
+
- `--description="..."` — one-line summary used in the generated README.
|
|
33
|
+
- `--force` — allow overwriting an existing `src/<Category>/<PascalName>/` directory.
|
|
34
|
+
- `--prefix=mx` — only change this for the external-reuse case documented in `notes/ComponentToolingPlan.md`; real mxds components always use the default `mx-` prefix.
|
|
35
|
+
|
|
36
|
+
## Step 2 — Fill in the stubs
|
|
37
|
+
|
|
38
|
+
The generator produces minimal-but-valid files, not finished components. Replace every `TODO` and placeholder:
|
|
39
|
+
|
|
40
|
+
- **Props/types** — real prop names, types, and defaults (defaults live in destructuring, not the type alias).
|
|
41
|
+
- **Twig** — real variables, `attributes` usage, any conditional markup.
|
|
42
|
+
- **CSS** — real `mx-` BEM classes, logical properties, `/* @public */` markers above overridable custom properties.
|
|
43
|
+
- **Web Component** — real lifecycle behaviour (event listeners registered with `{ signal: this.controller.signal }`, cleaned up via `disconnectedCallback()`).
|
|
44
|
+
- **Stories** — real variants beyond the single generated `Default`-style story.
|
|
45
|
+
- **README** — section order is fixed: `## CSS Import` → `## Twig` → `## HTML` (+ `Web Component` if applicable) → `## React` → `## Modifiers` → `## Accessibility` → `## Customisation`. Cross-stack behavioural differences go in a `### React ⇄ Twig parity` subsection. Add a `→ Used in context:` footer if the component ends up used in `mockups/`.
|
|
46
|
+
- **`{Pascal}.figma.ts`** (generated whenever `--react` is included) — this is only a shell: a `url=TODO` header comment and a minimal `figma.code` example. Don't hand-write the real mapping from guesswork. Once the component has a real Figma frame to map to, load the **`code-to-figma-code-connect`** skill (it should be available as a global skill; if not yet installed, prompt the user to add it from the pnx skills repo) and follow its `.figma.ts` authoring cookbook (slots, enums, instance-swaps) rather than improvising the file's shape.
|
|
47
|
+
- Known gap as of this writing: `import figma from "figma"` resolves via the `@figma/code-connect` devDependency, which exists on the `figma-connect` branch but not yet on `main`/this branch. Until those branches converge, a freshly generated `.figma.ts` will fail `pnpm lint-ts` with `Cannot find module 'figma'` — that's expected, not something to "fix" by improvising a workaround in the generated file.
|
|
48
|
+
|
|
49
|
+
## Step 3 — Checklist
|
|
50
|
+
|
|
51
|
+
Run through `docs/ComponentArchitecture.md`'s "Component Checklist" section before considering the component done.
|
|
52
|
+
|
|
53
|
+
## Step 4 — Verify before done
|
|
54
|
+
|
|
55
|
+
Run, in order, and fix anything that fails:
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
pnpm lint-classes
|
|
59
|
+
pnpm audit-parity --component <Name>
|
|
60
|
+
pnpm lint
|
|
61
|
+
pnpm test
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
`lint-classes`/`audit-parity` aren't wired into `pnpm lint`/CI yet (the baseline had pre-existing findings that need triage first — see `tools/lint-classnames.allowlist.json` / `docs/ParityMatrix.md`), so run them explicitly. Anything they flag on your new component is real signal — fix it, or if it's an intentional divergence, document it (a `### React ⇄ Twig parity` README subsection, or an allowlist entry with a reason) rather than ignoring the output.
|
|
65
|
+
|
|
66
|
+
Then manually check the component renders correctly in both `pnpm dev-html` (Twig/Web-Component Storybook) and `pnpm dev-react` (React Storybook).
|
|
67
|
+
|
|
68
|
+
Before calling it done, grep your new files for any class borrowed from another mxds component (e.g. `mx-button--`, `mx-icon--`) and re-open that component's README to confirm the usage matches its documented combination rules — don't rely on memory from Prerequisites step 5.
|
|
69
|
+
|
|
70
|
+
## Step 5 — Update DESIGN.md
|
|
71
|
+
|
|
72
|
+
`DESIGN.md` is a separate, hand-maintained reference for AI design tools (Claude Design etc.) — it is **not** regenerated automatically from `src/`, and forgetting this step is easy since nothing in `pnpm lint`/`pnpm test` catches the omission. A component isn't done until it's listed here too. Add two entries, in the category matching where you scaffolded (`Atom`/`Component`/`Form`/`Layout`):
|
|
73
|
+
|
|
74
|
+
1. **Component Inventory** (`## Component Inventory` → the `### Atoms`/`### Components`/`### Forms`/`### Layout` table for your category) — one row: `` `PascalName` `` + a one-line description matching the README's opening line.
|
|
75
|
+
2. **Canonical class inventory** (`## Canonical class inventory` → the matching `### Atoms`/`### Components`/`### Forms`/`### Layout` table) — one row listing every public `mx-*` class the component's CSS defines (grep `\.mx-[a-zA-Z0-9_-]+` across the component's own `.css` files — skip classes borrowed from other components, e.g. `mx-carousel`/`mx-dialog` inside a Gallery that composes them, since those are already listed under their own component).
|
|
76
|
+
|
|
77
|
+
Keep both tables in the same alphabetical order as the surrounding rows, then run `npx oxfmt DESIGN.md` to fix table column alignment before finishing.
|