Document license sync delay when changing Growth plan seats - #3285
Merged
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Collaborator
Author
|
LGTM, mergeable whenever you want 🚀 |
Contributor
@pwizla could you merge? I'm not able to |
pwizla
added a commit
that referenced
this pull request
Jun 24, 2026
pwizla
added a commit
that referenced
this pull request
Jun 29, 2026
* Port redesign, add JS API layout variant, reconstruct Document Service pages
* Update homepage stats to 300+ plugins and 72k+ GitHub stars
* Reconstruct REST locale, sort-pagination, status pages with 2-column layout
* Reconstruct REST filters page: 2-column layout plus populate notes
* Reconstruct REST rest, populate-select, understanding-populate with main content
* Reconstruct Document Service fields and populate pages with JS layout
* Reconstruct quick-start page with StepDetails and NextSteps components
* Remove new and updated sidebar badges for the v7 release
* Restore Page summary label and icon on Tldr in elegant mode
* Fix broken quick-start anchor in REST intro after StepDetails conversion
* Fix StepDetails: github-slugger anchors plus manual click-to-toggle completion
* Restore quick-start step anchor link in REST intro
* Redirect content auto-sync to the redesign release branch via TARGET_BRANCH
* Port documentId char-count fix (#3275) onto redesign branch
PR #3275 normalised the example documentId values (24 chars) in document-service.md and use-document-id.md on main. document-service.md was reconstructed into <Endpoint kind="js"> on this branch, so the values are ported manually; use-document-id.md is taken verbatim from main.
* Fix documentId in discardDraft request example missed by #3275
PR #3275 normalised all example documentId values to 24 chars but left the discardDraft() request codeTab at 23. Aligns it to the canonical a1b2c3d4e5f6g7h8i9j0klmn so the whole page is consistent.
* Update agent authoring tooling for redesign components
Teach <Endpoint> (kind http/js) instead of the legacy <ApiCall>/<Request>/<Response> trio across the API guide, template, and drafter prompt; add endpoint/step-details/next-steps component guides; add a known-pitfalls guardrail; fix dead templates/INDEX.md references.
* Remove redundant imports of globally-registered components
<Endpoint> and <StepDetails> are registered as global MDX components, so the explicit import lines on these API and quick-start pages were redundant. The component usage is unchanged.
* Remove unused ApiDocLayout component superseded by Endpoint
ApiDocLayout was the first-draft 2-column API wrapper, replaced by <Endpoint> and never used in any docs page. Removes the component and its global MDX registration.
* Fix duplicate anchor IDs on API pages by dropping Endpoint id
37 <Endpoint id> values duplicated the auto-generated anchor of an adjacent heading, producing two DOM elements with the same id. Removed the id only on those colliding blocks; the heading keeps the anchor so inbound links still resolve. Endpoints whose id is the sole anchor source are untouched.
* Add license sync delay info to the seats note
* Revert "Add license sync delay info to the seats note"
This reverts commit b15d95c6f02e41c272dc4a9bb0c9cbeb0cd5b3ba.
* Constrain code blocks to content width on API pages without Endpoint
On API pages that use <ApiCall> but no <Endpoint> (e.g. GraphQL), MDX wraps standalone code blocks in an unclassed <div> child of .theme-doc-markdown that no width-constraint selector matched, so they ignored the content-width selector and spanned full width. Added > [class*="language-"], > div:not([class]) to the four constraint rule blocks so code blocks follow the selected content width like prose.
* Constrain direct images to content width on API pages
Standalone images (ThemedImage) placed as direct children of .theme-doc-markdown on API pages spanned full width and ignored the content-width selector, same class of bug as the code blocks. Added > img, > [class*="themedComponent"] to the four constraint blocks. Verified the GraphQL playground image now tracks the toggle (720/960/full); no regression on Endpoint pages.
* Attempt: center prose on non-Endpoint API pages via markdown centering + api-call breakout
Centers the markdown column at --doc-content-max-width on pages with <ApiCall> but no <Endpoint> (GraphQL), so prose/headings/images/code are centered like a normal doc page (fixes the left-flush bug). KNOWN ISSUE in this attempt: the .api-call breakout uses 100vw which overshoots (ignores the sidebar) and causes ~4px horizontal overflow. Prose centering is correct; the breakout width needs fixing next.
* Attempt: fixed-width centering for prose on non-Endpoint API pages
Replaces the 100vw breakout (which overflowed) with fixed width + auto margins per prose child, and api-call at width 100% of the full markdown. No more horizontal overflow. Paragraphs and code blocks now center, but headings and images are still left-flushed (a more specific margin rule overrides margin:auto on them) - next step is to find and override that.
* Attempt: add display:block to center prose children (images/code now centered)
display:block lets margin:auto center images and code blocks. Headings still resist because code.scss forces h1-h5 to display:inline-block !important, which outranks this. No horizontal overflow. Next: either override that !important for this context, or switch to centering the markdown column with a bounded api-call breakout.
* Center prose on non-Endpoint API pages by overriding heading display
Final fix: on pages with <ApiCall> but no <Endpoint> (GraphQL), prose children get fixed content width + auto margins + display:block, and an explicit display:block !important override on headings to beat code.scss's inline-block !important. Now headings, paragraphs, images, and code blocks all center symmetrically while .api-call stays full width. Verified no regression on REST and document-service (Endpoint pages: prose stays left-flushed at 50%) or content-api (normal page: unchanged). No horizontal overflow on any page.
* Fix footer tags wrapping by excluding footer rows from TOC placeholder padding
The TOC-placeholder rule (.row:not(:has(.col--3)) { padding-right: 280px }) was also matching the footer .row elements (tags row, edit-meta row), stealing 280px from the tags column and forcing long tag lists onto a second line. Excluded :not([class*="theme-doc-footer"]) so footer rows use the full content width. Verified: document-service (5 tags) now fits on one line; main content rows keep their 280px placeholder; pages with genuinely too many tags for the width still wrap, which is expected.
* Increase StepDetails content left padding for breathing room from accent bar
Quick-start step content (e.g. numbered list markers) sat too close to the colored left accent bar. Bumped the StepDetails content padding-left from 28px to 40px so list markers and text have more space from the bar.
* Turn StepDetails title and disclosure arrow green when step is completed
Previously only the left accent bar and checkmark turned green on completion. Now the summary title text and the disclosure arrow (summary::before borders) also go green, for a clearer completed state.
* Add intro tip explaining collapsible, completable steps in quick-start
A short :::tip near the top of the Quick Start Guide tells readers they can expand/collapse steps, mark them completed via the circle (completed steps turn green), and that a progress summary at the bottom-right tracks how far along they are.
* Add floating step-progress widget for quick-start pages
New StepProgress widget (bottom-right) shows X/Y completed steps, a progress bar, and an expandable list of steps that scroll to the step on click. Mounted via DocItem/Footer; renders only on pages that contain <StepDetails>. StepDetails now emits a 'strapi-steps-changed' event and exposes data-step-* attributes; the widget reads completion from sessionStorage (written before the event) to avoid racing the React re-render. sessionStorage persistence unchanged.
* Strip Step N prefix from titles in the progress widget
Each Part of the quick-start restarts its step numbering at 1, so the flat progress list showed repeating 'Step 1:', 'Step 2:'... which read as confusing. The widget now strips the 'Step N:' prefix and keeps only the descriptive title.
* Add balanced padding around StepDetails body content
Step content sat flush against the borders: no top padding under the summary divider and asymmetric left/right (40/28). Now symmetric 40px horizontal padding, 24px top padding on the first content block (space below the summary), summary 20px/32px, and 28px bottom padding so every side has breathing room.
* Inset framed StepDetails blocks via margin so their borders clear the edges
Switched the body content horizontal padding to margin so framed children (code blocks, images, admonitions) have their whole box — background and border included — inset from the left accent bar and right border, not just their inner text. Bounded width to calc(100% - 80px) so an image sized to the content column does not overflow the right margin. Verified terminal, admonition, image and paragraphs all sit 40px from both edges with no overflow.
* Make StepDetails disclosure arrow visible in dark mode
In dark mode the summary disclosure arrow was invisible: its ::before border width collapsed to 0 (so recoloring alone did nothing). Force a full 2px white arrow for non-completed steps in dark, and use full border shorthands (width+style+color) for the completed (green) arrow too so it cannot collapse either.
* Flatten Endpoint component in Markdown view mode
In Markdown mode the <Endpoint> API block kept its 2-column grid, colored required/optional pills, and framed code/response panels. Linearized it to a single column with params as a flat list, plain-text pills, and unframed code/response, consistent with the flat monospace markdown look. Other components (StepDetails, Tldr, IdentityCard, badges) still pending.
* Flatten StepDetails, Tldr, IdentityCard and badges in Markdown view mode
Markdown mode now neutralizes more components: StepDetails content indent collapsed to 16px (the details.alert flattening already removed its frame/accent bar); Tldr rendered as a plain left-border quote; IdentityCard stripped of its card frame/background; badges shown as plain inline text instead of colored chips. Consistent flat monospace look across these components.
* Fix images and hide step controls in Markdown view mode
Three markdown-mode issues on quick-start: (1) images (ThemedImage = .themedComponent_*, and images nested in StepDetails) had no max-width on desktop and rendered at natural size up to 3600px — added a desktop article img/themedComponent max-width:100% rule (the existing one was mobile-only and targeted the wrong class). (2) The StepDetails completion checkmark is hidden in markdown (no interaction in raw view). (3) The floating StepProgress widget now returns null in markdown mode. Verified images no longer overflow, and checkmark + widget reappear in elegant mode.
* Reposition step-progress widget into docs content area in AI mode
In AI mode the 50vw AI panel covers the right half of the screen, so the fixed step-progress widget (right: 24px) overlapped it. Added a stable .step-progress-widget class and offset it to right: calc(50vw + 24px) in AI mode (40vw on small-to-medium, hidden on small-down where the panel is full-screen), matching the existing back-to-top treatment. Verified it sits bottom-right of the docs content (left of the AI panel) in AI mode and returns to right:24px in elegant.
* Fix Tldr hydration mismatch by replacing its inner p wrapper with a div
The Tldr component wrapped its children in a <p>; MDX wraps prose children in their own <p>, producing invalid <p>-in-<p> nesting that the browser reparents, causing a React #418 hydration error on ~100 pages. Switching the wrapper to a div makes the nesting valid. This bug pre-existed on main and is not a redesign regression.
* Fix horizontal overflow on legacy ApiCall pages by restoring their 2-col grid
A high-specificity rule in _base.scss forced display:flex on .api-call for legacy pages without <Endpoint>, overriding the 2-column grid from api-call.scss. The blocks collapsed to a single full-width column, so a wide code line (e.g. the reset-password curl on users-permissions/rest-api) pushed the page ~182px into horizontal overflow. Dropping the display override lets the grid apply again; also added min-width:0 to the request/response children so code blocks scroll inside their track. Prose centering on GraphQL pages is preserved.
* Change homepage plugins card CTA from Browse plugins to Learn more
* Fix indentation and line break in homepage Fully Customizable code snippet
The inline lifecycles.js example rendered flat: collapsed whitespace dropped the indentation and a stray newline glued the two closing braces onto one line. Added white-space:pre-wrap to keep the leading spaces and replaced the literal newline with a line break so the snippet reads like real, nested code.
* Add missing pageCount field to API Explorer GraphQL pagination example
The GraphQL connection example queried pageInfo with page, pageSize and total but omitted pageCount, which the GraphQL API docs include. Added pageCount to both the query and the simulated response so the example matches the documented pageInfo shape.
* Brighten Use MCP popover icons in dark mode for legibility
In the Kapa Use MCP popover, the client logos (Cursor, VS Code, Claude Code) are monochrome currentColor SVGs that the generic popover rule forced to a dull gray, making them barely visible on the dark dropdown. Raised the generic popover icon color to a lighter gray and set the MCP client logos to near-white so they read clearly.
* Flatten collapsible details fully in Markdown view mode
In Markdown view mode, details.alert blocks (Prerequisites, the release-notes version-numbers note, etc.) kept a 3px left accent bar, so they still read as framed callouts instead of flat raw markdown. Removed the left border; the 16px content indent is kept to set the block apart. StepDetails (Quick Start) are excluded via :not([data-step-details]) so that page is untouched.
* Move older release notes (5.x and 6.x) to a dedicated archives page
The release-notes page had grown to 78 versions. Moved the full 5.x and 6.x history to a new release-notes-archives page and kept only the header (intro, version-numbers explainer, reminder) plus a 'See older release notes' link on the main page. Keeps the main page light while the 7.0.0 redesign entry will land there.
* Flatten Annotation tooltips in Markdown view mode
In Markdown view mode, the Annotation '+' toggle and its popover made no sense for raw-markdown reading. The annotated word now gets a plain asterisk and the annotation content always renders in the DOM (hidden in elegant/AI via CSS) as a flat block right after the word, so it reads inline below the paragraph. Elegant and AI modes are unchanged.
* Keep a gap below the navbar for the sticky table of contents on scroll
The collapsible TOC wrapper was sticky at top: navbar-height, so on scroll it pinned flush against the navigation bar with no breathing room. Added a 28px offset to the sticky top (and to max-height) so the TOC keeps the same spacing below the navbar it has at the top of the page, whether collapsed or expanded.
* Document license sync delay when changing Growth plan seats (#3285) (#3287)
* Document license sync delay when adding Growth plan seats
* Clarify billing vs. CMS license sync timing
* Merge billing and license sync notes into a single block
* Simplify mixed seats+SSO wording
* Restore spacing between summary and content in collapsible details
A rule zeroed the top padding of the details content wrapper (> div:first-of-type), so the open content sat flush against the summary and its bottom border. Scoped the reset to only the first inner element's margin/padding, letting the content wrapper keep its 16px padding-top for clear separation. Markdown view mode and Quick Start StepDetails are unaffected.
* Align table of contents top offset with the left navigation (24px)
Reduced the sticky TOC top gap from 28px to 24px so the 'On this page' panel sits at the same distance below the navbar as the left sidebar navigation.
* Align content-width toggle top offset with the sidebars on scroll (24px)
The floating content-width selector pinned ~16px below the navbar on scroll. Set its sticky top to navbar + 24px so it stays detached from the top like the sidebars and the table of contents.
* Align view-mode switcher top offset with the sidebars on scroll (24px)
The Elegant/Markdown/AI mode switcher pinned only 8px below the navbar on scroll. Set its sticky top to navbar + 24px so it stays detached from the top like the sidebars and the table of contents.
* Rewrite the What's new page around the redesigned docs experience
Replaced the Strapi 5 product/content highlights with the documentation experience features introduced by the redesign: the three reading modes (Elegant, Markdown, AI), the content-width selector, collapsible sidebars, the new homepage, the 2-column API reference layout, and the page feedback widget. Same format as before: short intro plus one icon line per feature with a link.
* Reduce sticky top offset of floating controls to 18px
The table of contents, content-width toggle, and view-mode switcher sat a touch too low at navbar + 24px. Reduced the offset to navbar + 18px so they sit slightly higher while staying detached from the navbar.
* Make doc card grids fill the available width instead of capping at 2 columns
The card wrapper was a flex layout capped at 640px with cards forced to 50% width, so it stayed at two columns even in max-width content mode. Switched to a CSS grid with repeat(auto-fill, minmax(min(240px, 100%), 1fr)) so cards fill the available space: 2 columns at normal width, 3-4+ in wide/max mode. The min(240px, 100%) bound prevents overflow in narrow contexts like the AI-mode panel, where the grid cleanly falls back to fewer columns with everything visible.
* Describe both feedback modes on the What's new page
Clarified the page feedback entry: readers can leave general feedback with the bottom-of-page widget, or select text and use the floating 'Leave feedback' button for specific feedback about that content.
* Add a selection bar with Copy code action inside code blocks
Selecting text inside a code block now shows the floating feedback bar (previously suppressed for <pre>). In code blocks the bar carries two actions: the existing 'Leave feedback' button and a new 'Copy code' button that copies just the selected code to the clipboard. Prose selections are unchanged (single 'Leave feedback' button). Inputs, textareas, search, and the Kapa modal stay excluded.
* Keep details blocks open and non-interactive in Markdown view mode
Force-opened details were still toggleable in markdown mode: clicking the summary (or any code path removing the open attribute) could re-collapse them, hiding content. Disabled pointer events on the summary so it cannot be toggled, and extended the MutationObserver to watch the open attribute and re-open any details that gets closed. Elegant mode is untouched (summary stays interactive).
* Mention code selection in the What's new feedback entry
Selecting text now also works inside code blocks, so the feedback feature line reads 'select some text or code'.
* Remove tag underline in Markdown view mode except on hover
In markdown mode the generic 'article a' underline rule also underlined the footer tag pills, which read as links rather than pills. Removed the underline on tag links at rest and restored it only on hover.
* Improve readability of the server getters reference page
Transposed the Full getter reference table so Top-level and Global are the two columns and the getter types (Service, Controller, Content-type, Policy, Middleware, Routes, Configuration) are the rows; the previous 7-column table overflowed even at full width. Also added a missing line break between the Usage examples heading and its first subsection.
* Reveal all expandable content in Markdown view mode
Show more/Show less blocks hid content in markdown mode. For ExpandableContent (CSS truncation) the collapsed max-height, fade gradient, and toggle are neutralized via view-modes.scss. For ExpandableDocCardsWrapper (which only renders the first N cards in the DOM) the component now renders all cards and hides the toggle when the view mode is markdown, detected post-hydration to avoid an SSR mismatch. Elegant and AI modes are unchanged.
* Simplify terminal-style code blocks in Markdown view mode
In markdown mode the macOS-terminal chrome on code blocks (three window dots, language badge, framed title bar) added noise. Hid the dots and the language badge, flattened the title bar (transparent, no border, no min-height), and kept the filename label as quiet plain text. Elegant and AI modes keep the full terminal styling.
* Fix collapsed details content staying hidden in Markdown view mode
Force-opening details via JS left Docusaurus' collapsible wrapper with its inline height:0 / overflow:hidden / display:none animation state, so the content was clipped to zero height even though the block was open. Override height and overflow on the content wrapper in markdown mode so every details block is fully expanded and flat. Verified on upgrades and the migration FAQ (all blocks visible); elegant mode still collapses normally.
* Fix typo in react-router-dom page title (users to uses)
The page heading read 'Strapi users react-router-dom v6' instead of 'Strapi uses react-router-dom v6'.
* Make details disclosure chevron visible in dark mode
The chevron used the accent color, which could be too dark on the dark background, leaving the open/close handle invisible on some details blocks. In dark mode the chevron now follows the summary text color (currentColor) for every details type, so it is always visible.
* Improve highlighted code line contrast in dark mode
The highlighted line used #11111B, the same color as the dark code surface, making it invisible. Switched to the neutral-150 token so the highlight clearly stands out. Light mode is unchanged.
* Refine code blocks in Markdown mode and content padding in AI mode
Markdown mode: tightened the vertical padding around terminal code blocks and removed the blinking terminal cursor. AI mode: added 20px right padding to the content article so text no longer touches the edge next to the AI panel.
* Add redirects so breadcrumb category segments resolve (group A)
Several breadcrumb segments were clickable but 404'd because the category URL has no page. Added vercel.json redirects (same pattern as the existing /cms and /cloud ones) for the 7 segments that have a natural index page: /cms/api, /cms/api/rest/guides, /cms/migration/v4-to-v5, /cms/migration/v4-to-v5/additional-resources, /cloud/cli, /cloud/getting-started, and /cloud/projects. No slug changes, no internal links touched.
* Remove outdated not-updated-to-v5 callout from pass-data guide
The page is up to date for Strapi 5, so the WIP <NotV5/> callout (and its import) at the top no longer applies.
* Fix invisible details chevron in dark mode (undefined accent token)
Root cause: --strapi-primary-400 is undefined, so --details-accent-color was empty in dark mode. The chevron's 'border: 2px solid var(--details-accent-color)' became invalid and collapsed to 0 width, hiding the open/close handle on details.alert blocks. Pointed the dark accent at the defined --strapi-primary-500 token so the chevron renders (2px, violet) in both themes. Replaces the earlier currentColor attempt, which only changed the color, not the missing width.
* Resolve remaining breadcrumb category 404s (group B)
Sidebar categories with a real child set (AI, Features, Plugins development, Account management, Advanced configuration) now use a generated-index page at their own path, so the breadcrumb segment resolves to a page listing the children. The path-only segments that are not sidebar categories (configurations/guides, configurations/sso-providers, data-management, getting-started, migration, plugins-development/guides, backend-customization/guides, and cms/plugins) get vercel.json redirects to a representative child page. Combined with group A, no breadcrumb segment 404s anymore.
* Stop underlining tag pills on hover in Markdown mode
The markdown tag rule re-added an underline on hover; removed it so tag pills never underline (the border color change on hover is the only hover affordance), consistent with light and dark elegant mode.
* Fix AI mode content gutter so wide elements clear the panel divider
The earlier padding-right on <article> did not constrain full-width children (tables, code blocks, admonitions), which still ran up to the AI panel divider. Moved the gutter to .theme-doc-markdown (padding-right + border-box) so every content child stops ~20px before the divider.
* Harden width toggle active state to prevent two buttons looking selected
Reported intermittently (e.g. after a sidebar collapse/expand re-layout) two width buttons appeared selected. Keyed the active style on aria-checked (always unique) instead of the CSS-module .active class, and removed the background transition that could leave the previous button briefly colored during a switch. Logic unchanged; this only hardens the visual state.
* Keep regular font on TOC and feedback widget in Markdown mode
Markdown mode switched the secondary sidebar (On this page) and the page feedback widget to the monospace technical font. Those are UI chrome, not raw page content, so they now keep the regular body font (only the article content stays monospace).
* Align pagination hover color with content links in dark mode
The previous/next pagination titles turned #4945FF on hover in dark mode, more saturated than other links. Pointed the hover color at --ifm-link-color (#7B79FF in dark, #4945FF in light) so it matches in-content links. Also fixed the selector: the nested 'A:hover B' under @include dark was injecting html[data-theme=dark] twice, so the rule never matched.
* Add hint under AI panel title on how to leave AI mode
Below 'Strapi Docs AI Assistant' the panel now shows a small line: 'To get back to elegant or markdown mode, click the [x]' with the phosphor x icon, so users know how to exit AI mode.
* Keep AI mode pagination clear of the panel divider
The content area starts ~52px from the left (sidebar offset), so capping it at a flat 50vw pushed its right edge past the AI panel, tucking the next-page pagination title under the panel. Capped main/row/col/pagination at calc(50vw - 60px) so the content (pagination included) stays left of the divider with a gutter.
* Refine AI panel exit hint (italic, fuller text, tighter spacing)
Italicized the hint, completed it to 'click the x in the upper right corner', and moved it closer to the title with a bit more room before the bottom border.
* Add more space above the page feedback widget
Raised the feedback widget top margin so it no longer reads as glued to the last paragraph.
* Preserve feedback widget top spacing in Markdown view mode
The markdown 'tighten all vertical spacing' rules zeroed the page feedback widget's top margin, gluing it to the last paragraph. Restored a generous top margin on the widget in markdown mode so it matches elegant mode.
* Fix ballooned feedback widget in Markdown mode (over-broad selector)
The previous fix used [class*=pageFeedback], which also matched every pageFeedback__* sub-element, stacking the 5.5rem top margin and inflating the box to ~338px. Scoped the top-margin rule to the widget root via [aria-label=Page feedback] so only the outer spacing is affected; box height is back to normal in both modes.
* Align mode and width selectors with the sidebar labels
The view-mode switcher sat ~13px lower than NAVIGATION / ON THIS PAGE and the content-width toggle. Pulled the switcher up (it sits at the top of the article flow) and nudged the width toggle so the top of all four (left nav label, mode switcher, width toggle, TOC label) line up.
* Make Markdown tables span the full content width
Tables shrank to their content, so different tables on a page had different widths. Set width:100% in markdown mode so every table fills the available content width (whichever the content-width selector picked).
* Left-align StepDetails titles and move the completion pill before the title
Step titles were centered with the completion pill pushed to the far right of the row. Left-aligned the summary and reordered the pill (order:-1) so it sits right after the disclosure arrow, just before the title, with a small gap on each side.
* Make StepProgress popup tall enough to show all steps without scrolling
The expanded progress popup capped its list at 240px, forcing a scroll for 10 steps. Raised the cap to min(70vh, 640px) so all steps are visible at once, still bounded to the viewport on short screens.
* Reduce feedback widget top margin to 36px
5.5rem (88px) left the widget feeling too isolated from the content. Set it to 2.25rem (36px) in both elegant and markdown modes.
* Drive width toggle active state from the shared DOM attribute
Each WidthToggle instance kept its own state seeded from localStorage, so a stale instance (e.g. after a sidebar collapse/expand re-layout, or if more than one is mounted during a transition) could keep showing the old active button — typically 'default' (narrow) — while the real width was different. The toggle now reads the active width from data-content-width on <html> (the single shared source of truth) and observes it via MutationObserver, so every instance always reflects the current width and only one button is ever active.
* Add spacing between stacked tab variants in Markdown mode
In markdown mode the JS/TS tab variants stack vertically; added 32px top padding above the second variant so it is easy to see where one example ends and the next begins. Also fixed the selector, which compiled with a duplicated data-view-mode prefix on the sibling and never matched.
* Redesign generated-index category pages with custom doc cards
The generated-index pages (e.g. /cms/features, /cms/ai) used the default Docusaurus DocCardList, which looks unstyled. Swizzled DocCategoryGeneratedIndexPage to render the site's CustomDocCard/CustomDocCardsWrapper instead, and added a short intro under the H1: 'This is an auto-generated page listing all the pages belonging to the "<title>" topic.'
* Keep mode switcher toolbar at a fixed height across view modes
Switching to markdown zeroed the switcher's negative top margin (via the 'tighten everything' rules), dropping the toolbar ~13px lower than in elegant mode. Re-applied the margin in markdown so the toolbar stays 16px below the navbar in both modes.
* Increase space above the AI panel title to 24px
Bumped the AI panel header top padding from 18px to 24px so the 'Strapi Docs AI Assistant' title lines up with the elegant/markdown/AI toolbar on the left.
* Constrain generated-index pages to the regular content width
These pages inherited the default 75% max-width, making them much wider than every other page. Set max-width to --doc-content-max-width so they match the normal content width and follow the content-width selector.
* Add space below the Page summary block in Markdown mode
Bumped the Tldr bottom margin to 28px (+20px) in markdown so the page content is clearly separated from the 'Page summary' block.
* Make tables under list items span the full content width
A table written under a list item was indented by the list padding (32px in elegant, 24px in markdown), so it was narrower than top-level tables. Added a negative margin to pull it back to the full content width in both modes; verified all tables now align at the same width with no overflow.
* Add inner padding to tab panels
Tab panel content was flush against the container border. Added 16px/20px padding inside the panel (top, bottom, left, right); nested tab panels keep zero padding to avoid doubling.
* Use a neutral left border on details blocks instead of the accent bar
The details.alert blocks had a 3px violet accent bar on the left (a pseudo-element) that clashed with the neutral frame on the other three sides. Removed it and restored a 1px neutral left border matching the rest of the frame. Markdown mode (flat, no border) is unchanged.
* Keep pagination divider neutral on hover
Hovering a previous/next pagination link turned the vertical divider near-black (Infima recolors the border with the hover text color). Pinned the next link's left border to the neutral border color on hover so the divider stays subtle.
* Fill generated-index cards with each page's description
Elegant-mode generated-index cards were empty (title only), leaving big blank boxes. Each card now pulls the target page's frontmatter description via useDocById, so cards show real, non-hallucinated descriptions; falls back to a child count for sub-categories. Markdown mode keeps its bullet list.
* Keep feature badges unchanged in Markdown view mode
Flattening the Growth/Enterprise/version badges in markdown removed the colored chip but left the label text white, making it invisible on the light background, and made the tooltip look broken. Removed the markdown override so badges keep their elegant appearance (chip + tooltip) in markdown too.
* Make configurations/guides an auto-generated index page
/cms/configurations/guides was a vercel redirect to one child. Declared a 'Guides' generated-index subcategory under Configurations (slug /cms/configurations/guides) listing the four guide pages, and removed the redirect. Bonus: those guides were orphaned from the sidebar and are now navigable.
* Fix StepDetails summary layout and restore its frame
Three fixes on Quick Start step blocks: restored the full neutral border (lost when the accent bar was removed), moved the completion pill back after the title (removed order:-1; it now follows the title in DOM order), and top-aligned the summary (align-items:flex-start) so the arrow, wrapped title, and pill line up at the top instead of being vertically centered.
* Add spacing between StepDetails and align the arrow with the title
Consecutive step blocks were touching; added a 16px bottom margin. With the top-aligned summary, the disclosure arrow sat too high relative to the title text, so nudged it down 5px to line up with the first line.
* Remove underline on badge labels in Markdown mode
Badge labels are links shown inside a colored chip; the generic 'article a' underline rule was underlining them in markdown. Excluded .badge__link so the label stays clean, matching elegant mode.
* Lower the StepDetails disclosure arrow to align with the title
The arrow still sat well above the title text; increased its top margin from 5px to 15px so it lines up with the first line of the title.
* Tighten the 'What's next?' spacing on the Quick Start Guide
On the Quick Start Guide only, the gap between the 'What's next?' heading and the step cards was too large (the markdown h2 margin stacked with the NextSteps wrapper's 48px top margin). Wrapped the section in .qsg-whats-next and added page-scoped styles: a bit more space above the heading and roughly half the gap below it.
* Center the StepDetails disclosure arrow on the title line
15px overshot (arrow sat ~5px below the title's vertical center). Measured the first-line center at ~34px below the summary top and the 7px arrow box; set margin-top to 10px so the arrow center lands at ~33.5px, exactly on the title line.
* Nudge StepDetails arrow down 2px and tighten the title-to-checkbox gap
Arrow: margin-top 10px to 12px so it sits ~2px below the title's center, as requested. Checkbox: reduced its margin-left from 12px to 6px so the visible gap between the title and the checkbox circle is ~10px (was ~20px).
* Reduce the StepDetails arrow offset to 1px below the title center
2px was too much; set margin-top to 11px so the arrow sits exactly 1px below the title line center.
* Offset step-progress scroll so the step title clears the navbar
Clicking a step in the quick-start progress widget used scrollIntoView({ block: 'start' }), which aligned the step top with the viewport top so the sticky navbar (~64px) hid the title. Now scroll manually with an offset of the navbar's real rendered height + 16px so the clicked step title stays visible below the navbar.
* Number the Quick Start steps continuously from 1 to 10
Each Part (A/B/C/D) restarted its step numbering at 1, so the page jumped 1, 2, 1, 2, 1, 2, 3... Renumbered all ten StepDetails sequentially (Step 1 to Step 10). Updated the REST API cross-link to the new #step-8-set-roles--permissions anchor.
* Document MCP capability builder helpers for plugin development (#3263) (#3288)
* Document MCP capability builder helpers for plugins
* Clarify builder helpers intro with explicit link to registerTool()
* Apply suggestion from @pwizla
* Restrict MCP capability registration to the register() lifecycle phase
* Remove unnecessary mcp.isEnabled() check from registration examples
* Downplay defineTool builder helpers to keep registerTool() primary
Apply review feedback from strapi/strapi#26603: keep the inline
registerTool() approach as the primary, recommended way to register a
custom MCP tool, and make the builder helpers (defineTool/defineResource/
definePrompt) clearly optional to avoid confusion.
- Mark the builder-helpers section as "(optional)" and add a caution
note stating builders are a TypeScript-only convenience that is never
required to register a capability.
- Reframe the section intro so registration always goes through
registerTool()/registerResource()/registerPrompt(), with builders
serving only type inference.
Claude-Session: https://claude.ai/code/session_01UsHBxNANgu9HRkeSiaoFJQ
* Apply suggestion from @pwizla
* Remove beta badge from MCP server feature page
---------
Co-authored-by: Claude <noreply@anthropic.com>
* Remove underlines on NextSteps cards in Markdown mode
The whole 'What's next?' card is a link, so the generic markdown 'article a' underline rule was underlining the number, title, and description, which looked noisy (especially in dark mode). Suppressed text-decoration on the step link and all its descendants.
* Extract code from API components into llms-code.txt
llms-code.txt only read Markdown code fences and Tabs, so it was blind to code carried in <Endpoint>/<ApiCall> props (codeTabs, responses, Request/Response children). All API pages whose code lives only in those components produced 0 snippets and were skipped: REST, Document Service, Entity Service, GraphQL, Query Engine.
Added scripts/lib/api-components.js, a shared pure-function extractor (JSX block scanner + prop/array/template-literal parsers + language detection), and wired generate-llms-code.js to append the API-component snippets. Recovered ~11 previously-skipped pages and ~96KB of code; strict validation and full build pass.
The shared scanner also fixes a template-literal interpolation bug (every ${...} left brace depth unbalanced, overrunning the component) and unescapes backticks/${ in extracted code.
* Convert ExternalLink components to Markdown links in llms-full.txt
<ExternalLink to= text=/> is self-closing with its label and URL in props, so the generic JSX stripper deleted all ~530 of them, dropping the link text and target from llms-full.txt. Added a transformInlineComponents pass (before the stripper) that rewrites them to [text](to) Markdown links. Verified 0 ExternalLink remain and ~329 external links are now present; full build passes.
* Mark --help as not required in CLI command tables
In the CLI reference, the four command tables that have a Required column left the --help row's Required cell empty. Filled them with No for consistency with the other options.
* Convert CustomDocCard components to Markdown bullets in llms-full.txt
<CustomDocCard title= description= link=/> is self-closing (148 uses on landing/index pages), so the generic stripper deleted every navigation card. Now rewritten to '- [title](link): description' bullets in the same transformInlineComponents pass. Verified 0 cards remain; full build passes.
* Emit all docs in llms-full.txt and render BreakingChangeIdCard facts
generate-llms.js only walked sidebars.js, so pages surfaced via generated-index categories or summary tables were never emitted: only 153 of 279 docs reached llms-full.txt, including none of the 52 v4-to-v5 breaking-change pages.
Coverage: after the sidebar walk, sweep the cms/ and cloud/ doc trees and emit any page not already covered (dedup by docId, skip AGENTS/templates, handle .md/.mdx and index files). Now all 279 pages are emitted.
BreakingChangeIdCard: transform the self-closing card (affects plugins? / handled by a codemod? + codemod link + info note) into a short fact list, now visible on the breaking-change pages the coverage fix unlocked.
* Preserve title prop of titled components in llms-full.txt
StepDetails, SubtleCallout, and IdentityCardItem keep their children through the generic stripper but lose their title= prop, which holds a step/section heading (e.g. 'Step 2: Register the first local administrator user', 'Related concept', 'Package name'). Now surface the title as a bold line before the children, using the bracket-aware JSX scanner so nested components and braces in props are handled. Verified 0 of these components remain as raw JSX; build passes.
* Wrap the project-structure caption in a block element on the Configurations page
The caption under the config-files excerpt was a bare inline <em>, so in Markdown view mode the following '## Base configurations' heading rendered on the same line. Wrapped it in a block-level <p> so the heading starts on its own line in every view mode.
* Inline snippet-backed components into llms-full.txt
Components imported from /docs/snippets/*.md (Intro, MigrationIntro, Prerequisite, ConfigDone, ConditionalFields, QueryEnginePrereqs...) are used self-closing, so the generic stripper deleted them and their content never appeared anywhere (snippets aren't in the sidebar, so they're not emitted as pages either).
Before stripping imports, build a name to snippet-file map from the import lines, read each snippet, strip its frontmatter/imports, and substitute the Markdown wherever the component is used (self-closing or paired). Verified 0 snippet components remain as JSX; prerequisites/migration intros now appear inline; build passes.
* Deduplicate JSX scanners by reusing the shared api-components module
generate-llms.js had its own copies of extractJsxBlock and the prop/array/template-literal helpers, duplicating scripts/lib/api-components.js (added in Lot A and used by generate-llms-code.js). Replaced them with delegations to the shared module, so there is now a single source of truth.
Side effect: the shared scanner fixes a template-literal interpolation bug (every ${...} left brace depth unbalanced) that the old inline copies had, so Endpoint examples with interpolation that were silently truncated/skipped now appear in full. Diff vs before is +646 lines, 0 removed; generate-llms-code.js and the full build still pass.
* Generate per-page Markdown and serve it to agents
Content negotiation, phase 1 (URL-suffix, zero-infra). generate-llms.js now writes one clean .md per page into the build (e.g. build/cms/api/rest.md), reusing the same cleanContent() output as llms-full.txt so there is a single Markdown source of truth (lots A-H: resolved JSX, inlined snippets, API code, full 279-page coverage). Guarded to only run for real builds, not the static/ dev path.
Fixed the plugin to pass an absolute site URL so Source: lines are fully-qualified (was //cms/...). Repointed the AiToolbar Copy markdown action to fetch the clean .md first, falling back to the raw GitHub MDX. Verified docusaurus serve returns the .md as text/markdown while HTML pages are unaffected.
Generated .md live only in build/ (gitignored), never committed. The Accept-header middleware (phase 2) is deferred: it needs Vercel access.
* Disable zoom on Mermaid fallback images
When Mermaid fails to render, a static fallback image is shown. It was made zoomable twice — explicitly via medium-zoom AND through the site-wide zoom (medium-zoom-image class + data-zoomable) — which double-bound the zoom and broke the layout. Removed the medium-zoom useEffect and the zoom-triggering class/attributes/cursor, and dropped the hover-scale so the fallback is a plain, non-zoomable image.
* Add View as Markdown affordances (global button + markdown-mode link)
Adds a 'View as Markdown' action to the AiToolbar (visible in all view modes) that opens the page's clean .md (getCleanMarkdownUrl, fallback raw GitHub) — the same generated Markdown as llms-full.txt, not the raw MDX source.
Also adds a discreet 'View this page as .md' link rendered after the H1 but shown ONLY in markdown view mode (CSS-gated on html[data-view-mode=markdown]). Verified: link hidden in elegant mode, visible in markdown mode, both pointing at <page>.md; toolbar button present after opening the dropdown.
* Add rel=alternate link to each page's Markdown twin
Emits <link rel="alternate" type="text/markdown" href="<page>.md"> in the head of every doc page (on the H1), a standard machine-readable signal pointing agents/crawlers to the clean Markdown version generated at build time. Homepage is excluded (HTML only). Verified the link is present with an absolute URL on doc pages and absent on the homepage.
* Point llms.txt entries at the per-page Markdown (.md) URLs
llms.txt is meant to list LLM-readable resources, so its links now target each page's clean .md twin instead of the HTML page. Path-less URLs (homepage) are left unchanged, and existing .md suffixes are not doubled.
* Move 'View as Markdown' to a right-aligned toolbar button
Replaced the under-the-H1 markdown-mode link with a standalone 'View this page as .md' button pinned to the right of the AI toolbar, visible in all view modes. In markdown view mode the redundant 'View as Markdown' entry is now hidden from the toolbar dropdown. Removed the now-unused MarkdownModeLink component and its styles. Verified: right button present in both modes; dropdown entry present in elegant, hidden in markdown.
* Mention clean Markdown / agent access on the What's new page
Added a 'Clean Markdown for AI agents' entry describing the .md per-page URLs, the 'View this page as .md' button, and the aggregated llms.txt/llms-full.txt/llms-code.txt files. Verified all links resolve (HTTP 200) on the served build.
* Show the .md button only in markdown mode, styled like the toolbar
Corrected the UX: the standalone 'View this page as .md' button now appears ONLY in markdown view mode (in elegant/AI modes the action stays in the toolbar dropdown, which is hidden in markdown mode — so the action shows in exactly one place per mode). Positioned 36px to the right of the toolbar group (flex-start + gap, not pushed to the line edge), and matched to the toolbar button's background and text color in both light and dark mode.
* Strengthen toolbar hover contrast in dark mode and clarify What's new
Dark-mode hover used neutral-100, which is DARKER than the neutral-0 button background (the scale inverts in dark), so hovers were nearly invisible. Switched the Copy button, caret, dropdown items, and the standalone .md button to neutral-200 (#4A4A6A) on hover — clearly lighter than the #212134 background and on-palette. Also tightened the .md button gap from 36px to 18px.
What's new: rewrote the Clean Markdown entry to spell out the three access paths — the toolbar 'View as Markdown' option (Elegant/AI modes), the 'View this page as .md' button (Markdown mode), and the direct .md URL.
* Prevent the collapsed left sidebar from flashing open on navigation
The <aside> is server-rendered with an inline width:280px, so a collapsed sidebar (state in localStorage) flashed open on every page load before React hydrated and re-applied 52px.
Added a head script (same anti-FOUC pattern as content-width/view-mode) that sets html[data-sidebar-collapsed=true] from localStorage before paint, plus CSS that forces the 52px collapsed look (with !important to beat the inline SSR width). React removes the attribute on mount so its inline width takes over and re-expanding still works. Verified: width stays 52px from DOMContentLoaded (no 280px flash), 280px when not collapsed, and collapse→expand goes 52→280.
* Make AI mode use full width regardless of the content-width setting
In AI mode the content kept the manually selected content-width (e.g. narrow), but it should use the full available width. Override --doc-content-max-width to 100% under [data-view-mode=ai]. Done in CSS rather than the WidthToggle JS, so leaving AI mode automatically restores the user's chosen width (data-content-width is never touched). Verified: default 720px in elegant, 100% in AI mode, back to 720px on return.
* Fix Configuration heading layout on the Preview page
A multi-line HTML comment (<!-- ... -->) wrapping a disabled Guideflow iframe sat between a ThemedImage and the '## Configuration' heading. MDX mishandled it, so the heading rendered beside the image instead of on its own line. Converted it to a proper MDX/JSX comment ({/* ... */}), which MDX ignores cleanly. Verified the heading now starts on its own line below the image and the comment content doesn't leak into the page.
* Add the content-width selector to generated-index pages
Generated-index pages (e.g. /cms/features) already followed --doc-content-max-width, but they didn't render the WidthToggle, so there was no way to change the width from those pages — you were stuck with whatever setting was inherited from elsewhere (e.g. narrow). Mounted WidthToggle on the generated-index layout like on regular doc pages. Verified the selector appears and the card grid resizes (720px default → 1104px on max).
* Center generated-index content instead of pinning it left
The generated-index block had max-width but margin:0, so it stuck to the left with a large empty gutter on the right (these pages have no right-hand TOC). Added margin-inline:auto to center it in the available area, matching the balanced placement of other pages. Verified left/right gaps are now roughly equal in default and wide widths.
* Align the first view-mode tab with the page H1
The view-mode switcher row is inset by the tab buttons' horizontal padding, so the first tab (ELEGANT MODE) sat ~16px to the right of the H1, noticeable in max width. Pull the first button left by 16px so its content lines up with the H1 and the page body. Verified delta is 0 vs the H1.
* Stop the cards-to-list flash on generated-index pages in markdown mode
CustomDocCard and CustomDocCardsWrapper rendered different markup in markdown mode (a <ul>/<li> list) than in SSR (a card grid). On generated-index pages the SSR cards painted first, then React swapped them for a list on hydration — a visible flash.
Markdown mode already has full CSS (view-modes.scss) that flattens the card grid into a bullet list, so the JS branches were redundant. Removed them: both components now render the same markup in every mode (no SSR/hydration DOM swap), and the CSS — applied before paint via the data-view-mode anti-FOUC attribute — renders the list immediately. Also added .custom-cards-wrapper to the markdown flatten selectors (the existing ones only matched the camelCase class). Verified: a single stable state in markdown (no flash), and elegant mode still shows the grid.
* Collapse card height in the markdown bullet list
On generated-index pages in markdown mode, each bullet kept the card's grid-cell height (~136px) because the card and its inner link inherited a fixed height from the elegant grid layout, leaving large vertical gaps between items. Forced height:auto / min-height:0 on the card and its link so each bullet hugs its content (now ~45px). Gap between items stays the intended 4px.
* Stop forcing headings to display:inline-block
code.scss forced all h1-h5 to display:inline-block !important, so two consecutive headings (e.g. ## then ### on /cms/deployment and /cms/configurations/guides/configure-sso) rendered side by side on wide viewports instead of stacking. A partial workaround existed in _base.scss but only covered direct-child headings. Removed the rule (it was orphaned — no inline heading background depends on it); headings return to block flow. Verified the two reported pages stack correctly and a heading-with-badge page is unaffected.
* Title the Configurations guides generated-index 'Configuration guides'
The /cms/configurations/guides generated-index had no explicit title, so it fell back to the category label 'Guides' — ambiguous out of context (and the auto-generated intro sentence repeated it). Added title:'Configuration guides' to the generated-index link; the H1 and the intro sentence now both read 'Configuration guides'. The sidebar label stays 'Guides'.
* Keep inline code inline in headings so titles don't break apart
Anchor headings render as flex containers, which turned each text run and each inline <code> into a separate flex item. A title like 'Example: bypass the command line prompts with ' scattered into oversized chunks, worst at narrow widths and in markdown mode. Forced .markdown headings to display:block and their <code> to display:inline so the title flows and wraps as one phrase. Verified across elegant/markdown and default/max widths.
* Reserve a right gutter on generated-index pages in max width
In max width the card grid touched the right edge because these pages have no right-hand TOC. Reserve a 52px right padding (equal to a collapsed TOC rail on regular pages) so the grid keeps breathing room. Scoped to max width only via html[data-content-width=max]; in default/wide the existing margin-inline:auto centering already balances the gutters, so no padding is added there. Verified: 52px gap in max, centered with 0 padding in default.
* Fix the Advanced example #2 details summary on the CRON page
The second details had its <summary> immediately followed by text with no blank line, so MDX/Docusaurus didn't recognize it as the summary: it injected a default 'Details' summary and pushed the real title into the body (looking like a nested details). Added the blank line after </summary> like the sibling details blocks. Verified all three details now show 'Advanced example #1/#2/#3'.
* Fix view-mode switcher showing the wrong active tab after navigation
The switcher is server-rendered with viewMode='elegant'; React kept that SSR markup on hydration even after the state was corrected from localStorage, so the 'Elegant' tab stayed highlighted while the page was actually in markdown (notably after breadcrumb navigation). Gated the active-tab highlight on a post-mount flag so it always reflects the real viewMode after hydration, without a hydration mismatch. The provider still initializes straight from storage, so content (cards, details) shows the right mode on first render with no flash. Verified: correct active tab on load and after client-side nav, elegant still correct, and no card flash.
* Align ApiCall blocks with the content column at all widths
<ApiCall> blocks were forced to width:100% of the article, while prose is constrained to --doc-content-max-width and centered. So on narrow/wide the 2-col Request/Response grid overflowed the content column on both sides (e.g. /cms/features/users-permissions/rest-api looked broken). Constrained .api-call to the same width as prose (var(--doc-content-max-width)) with margin auto; the 2-col grid now lays out within that width. Verified left-aligned with the prose and no overflow in default/wide/max, grid preserved (2x350/470/482px).
* Align tables with the content column on ApiCall pages
On pages with <ApiCall> the markdown wrapper stays full-width and each prose child is re-centered to the content width. Tables ignored this because table.scss sets min-width:100% (100% of the full-width wrapper), overriding the centered width — so tables overflowed the prose column to the left at narrow/wide widths (e.g. the 'Possible errors' table on /cms/features/users-permissions/rest-api). Reset min-width:0 on those tables so they honor the content width. Verified tables now left-align with the prose and don't overflow in default/wide/max.
* Show the AI toolbar on pages with a front-matter-only title
The AiToolbar is mounted on the markdown H1 (MDXComponents/Heading). Pages without a markdown '# ' (title from front matter only) get a synthetic H1 rendered via @theme/Heading in DocItem/Content, which bypasses that swizzle — so they had no toolbar (e.g. /cms/getting-started/setting-up-admin-panel). Swizzled DocItem/Content to mount the AiToolbar (and the markdown alternate link) after the synthetic H1. syntheticTitle is null when a markdown H1 exists, so pages keep getting exactly one toolbar — verified 1 toolbar on the 2 affected pages and no duplicate on normal pages.
* Replace emoji heading icons with Phosphor icons
Three headings still used emoji icons instead of the Phosphor <Icon> used elsewhere: deployment-cli 'What to do next?' (replaced the fast-forward emoji with <Icon name=fast-forward/>, matching deployment.md/docker.md), understanding-populate (brain), and populate-creator-fields (wrench). Verified all three render a Phosphor icon and no emoji remains.
* Make AI mode content fill the left half at narrow content-width
In AI mode the TOC is hidden, so the 'no-TOC' rule applied a 280px right padding placeholder to the content row (.row:not(:has(.col--3))), squeezing the content — visible at default content-width where it stayed narrow instead of filling the left half. Removed that placeholder padding in AI mode (like wide/max already did), and forced the content column to full width with the TOC gone. Verified the content now fills the left half identically across default/wide/max content-width.
* Stack the footer into one left-aligned column in AI mode
In AI mode the content sits in the narrow left half, but the 4-column footer kept full-width columns that wrapped and collided (category titles ran into the previous column's links). Stack the footer columns vertically at full width with spacing between categories, all left-aligned. Verified the 4 category titles and links now share the same left edge.
* Center expandable-content and card wrappers on API pages
On API pages (api-call / endpoint contexts) the markdown stays full-width and prose children are re-centered to the content width, but .expandable-content (the 'Show more' code-example blocks) and .custom-cards-wrapper weren't in the centered selector list, so they spanned the full article width and overflowed the content column to the left (e.g. the GraphQL API page in narrow/wide). Added them to the centering rule across all four content-width contexts. Verified 0 misaligned children on /cms/api/graphql in default and wide.
* Balance code-only endpoint pages to the content width
Endpoint blocks without params render code-only (no 2-col grid). On pages where ALL endpoints are code-only (e.g. document-service/filters and /fields), the half-width left-aligned prose + full-width code looked unbalanced (squeezed left, nothing on the right). Tag each Endpoint with api-endpoint-block--columns or --codeonly, and when a page has no 2-col endpoint, constrain prose and endpoints to --doc-content-max-width and center them like a normal doc page. Pages with real 2-col endpoints (e.g. /cms/api/rest) keep the half-width prose + full-width grid. Verified filters/fields now centered at content width, rest unchanged.
* Add frontmatter with cmsSidebar to the GraphQL locale page
/cms/api/graphql/locale had no frontmatter at all, so it didn't display the cmsSidebar like its neighbors. Added a frontmatter block with displayed_sidebar: cmsSidebar plus title/description/sidebar_label/tags consistent with the sibling locale pages. Verified the CMS sidebar now renders (80 nav items).
* Honor front-matter slug when generating per-page .md URLs
Pages with a custom front-matter slug (e.g. cloud/getting-started/cloud-fundamentals served at /cloud/cloud-fundamentals) had their .md written at the doc-id path, so the real URL's .md (e.g. /cloud/cloud-fundamentals.md) 404'd and the llms.txt link pointed to the wrong path. generatePageUrl now uses the slug when present. Verified the .md is emitted at the slug path (200, text/markdown), no duplicate at the old path, and llms.txt links are correct, for all three slugged pages (cloud-fundamentals, cms/intro, cloud/intro).
* Fix AI-mode footer width and center tables on code-only endpoint pages
AI mode: the footer used .row/.col classes, so the generic half-width cap squeezed it and the TOC-placeholder margin pushed it right. Excluded the footer from those rules and reset its container margin/max-width so it spans the full page width below the content, stacked and left-aligned.
Code-only endpoint pages (e.g. document-service/filters): tables kept min-width:100% of the full-width wrapper, overriding the centered content width, so they pinned left while prose centered (elegant and markdown). Reset min-width:0 so tables honor the content width and center with the prose. Verified aligned in elegant/markdown across wide/max.
* Fix API-page content alignment in markdown mode and AI-mode footer logo
Markdown mode on API pages (e.g. GraphQL): admonitions, flat tabs, and the cards wrapper were left-shifted/overflowing the centered content column (18 misaligned blocks at narrow width). Admonitions used margin:8px 0 which reset the centering margins → use margin:8px auto; .tabs-flat wrapper carried a class so the base centering didn't match it → constrain it to the content width and center; the cards wrapper's width:100% override broke centering on API pages → keep it at the content width there. Now 0 misaligned blocks.
content-api: the Integrations admonition was inside <CustomDocCardsWrapper>, so it rendered as a grid cell beside the cards; moved it after the wrapper.
AI-mode footer: the absolutely-positioned logo (~140px) overlapped the first stacked category; bumped the links container top margin to 120px so the first title clears the logo.
* Clarify Markdown actions per view mode on the AI for developers page
Updated the toolbar actions table: Copy Markdown now describes the clean Markdown (not the raw repo source) and notes it's available in Elegant/AI modes, with Markdown mode using the 'View this page as .md' button instead. Added the 'View as Markdown' action row with the same per-mode availability note, and updated the Copy Markdown section to match the actual button names and behavior.
* Format the View as Markdown cell: line break, quotes, icon
Added a <br/> before 'Available', wrapped the button name in quotes, and prefixed it with the <Icon name=markdown-logo /> matching the actual button. Verified the cell renders the break and the Phosphor icon.
* Explain AI mode in the AI chatbot section
Added an 'AI mode entry point' subsection describing the third reading mode: how to switch to it via the mode selector, the two-column layout (content + AI assistant panel), the page summary and question box scoped to the current page (Kapa-powered), and how to leave it. Complements the existing sidebar and code-block chatbot entry points.
* Tighten the AI-mode footer logo-to-links gap
120px top margin left too much empty space between the footer logo and the first category in AI mode. Halved it to 60px: the first category now sits just below the logo without overlap.
* Raise self-healing workflow max-turns: triage Haiku 10 to 20, drafter Sonnet 25 to 50
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Fix encoding, find() tab label, and merge tips on the Controllers page
Three fixes on the Controllers page: (1) repaired double-encoded UTF-8 mojibake — Strapi's MVC pattern and the "cleaned" quotes; (2) removed the stray backticks around the 'find()' tab label so it matches the other tabs (findOne(), create()…); (3) merged the two consecutive tips about extending core controllers into a single tip with one bullet per point.
* Prevent the collapsed TOC from flashing open on navigation
Same FOUC as the left sidebar (fixed yesterday) but for the right TOC: it is server-rendered expanded (React reads localStorage only client-side), so a collapsed TOC flashed open on every page load before hydration re-collapsed it.
Added a head script (same anti-FOUC pattern as view-mode/content-width/left-sidebar) that sets html[data-toc-collapsed=true] from localStorage before paint, plus CSS that shrinks the TOC column to 44px and hides the TOC list until React takes over. CollapsibleTOC removes the attribute on mount so its state drives the TOC and re-expanding still works. Verified: col width stays 44px from DOMContentLoaded (no 280px flash), 280px when not collapsed.
* Prefix Cloud page titles with 'Cloud' for context
Several Cloud pages had generic titles (Projects overview, Logs, Database, Collaboration, Notifications, Profile settings, etc.) that read ambiguously out of context. Prefixed the H1 (and the frontmatter title where present) with 'Cloud' on 14…
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR adds a tip to the billing portal page explaining that Strapi reloads the online license on startup and every 12 hours. After adding seats, users may need to restart their Strapi instance for changes to appear immediately.
Direct preview link 👉 here