@inditextech/docouture-cli 0.1.0-SNAPSHOT.40.1

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.
Files changed (94) hide show
  1. package/build/bin.js +321 -0
  2. package/build/commands/build.js +22 -0
  3. package/build/commands/completion.js +69 -0
  4. package/build/commands/dev.js +67 -0
  5. package/build/commands/doctor.js +156 -0
  6. package/build/commands/eject.js +71 -0
  7. package/build/commands/new.js +512 -0
  8. package/build/commands/publish.js +111 -0
  9. package/build/commands/teardown.js +66 -0
  10. package/build/commands/upgrade.js +156 -0
  11. package/build/commands/version.js +60 -0
  12. package/build/lib/agents-md.js +67 -0
  13. package/build/lib/antora-log.js +36 -0
  14. package/build/lib/antora-yml.js +47 -0
  15. package/build/lib/args.js +26 -0
  16. package/build/lib/cli-context.js +17 -0
  17. package/build/lib/cli-info.js +20 -0
  18. package/build/lib/config-resolver.js +23 -0
  19. package/build/lib/copy-template.js +162 -0
  20. package/build/lib/debug-log.js +21 -0
  21. package/build/lib/detect-package-manager.js +79 -0
  22. package/build/lib/dev-server.js +337 -0
  23. package/build/lib/doctor-checks.js +240 -0
  24. package/build/lib/global-flags.js +31 -0
  25. package/build/lib/kroki-compose.js +54 -0
  26. package/build/lib/playbook-yml.js +90 -0
  27. package/build/lib/repo-root.js +21 -0
  28. package/build/lib/run-script.js +50 -0
  29. package/build/lib/theme.js +51 -0
  30. package/build/templates/agent-support/.claude/skills/docs-internals/SKILL.md +53 -0
  31. package/build/templates/agent-support/.claude/skills/docs-internals/reference/antora-extensions.md +54 -0
  32. package/build/templates/agent-support/.claude/skills/docs-internals/reference/naming.md +41 -0
  33. package/build/templates/agent-support/.claude/skills/docs-internals/reference/page-patterns.md +238 -0
  34. package/build/templates/agent-support/.claude/skills/docs-versioning.versioned/SKILL.md +37 -0
  35. package/build/templates/agent-support/.claude/skills/docs-versioning.versioned/reference/releasing.md +106 -0
  36. package/build/templates/agent-support/.claude/skills/documenting-your-repo/SKILL.md +55 -0
  37. package/build/templates/agent-support/.claude/skills/documenting-your-repo/reference/content-sourcing.md +55 -0
  38. package/build/templates/agent-support/.claude/skills/documenting-your-repo/reference/maintenance-loop.md +68 -0
  39. package/build/templates/agent-support/.claude/skills/documenting-your-repo/reference/structure-planning.md +102 -0
  40. package/build/templates/agent-support/.claude/skills/writing-docs-pages/SKILL.md +112 -0
  41. package/build/templates/agent-support/.claude/skills/writing-docs-pages/reference/docouture-blocks.md +170 -0
  42. package/build/templates/agent-support/.claude/skills/writing-docs-pages/reference/language-basics.md +402 -0
  43. package/build/templates/agent-support/.opencode/skills/docs-internals/SKILL.md +53 -0
  44. package/build/templates/agent-support/.opencode/skills/docs-internals/reference/antora-extensions.md +54 -0
  45. package/build/templates/agent-support/.opencode/skills/docs-internals/reference/naming.md +41 -0
  46. package/build/templates/agent-support/.opencode/skills/docs-internals/reference/page-patterns.md +238 -0
  47. package/build/templates/agent-support/.opencode/skills/docs-versioning.versioned/SKILL.md +37 -0
  48. package/build/templates/agent-support/.opencode/skills/docs-versioning.versioned/reference/releasing.md +106 -0
  49. package/build/templates/agent-support/.opencode/skills/documenting-your-repo/SKILL.md +55 -0
  50. package/build/templates/agent-support/.opencode/skills/documenting-your-repo/reference/content-sourcing.md +55 -0
  51. package/build/templates/agent-support/.opencode/skills/documenting-your-repo/reference/maintenance-loop.md +68 -0
  52. package/build/templates/agent-support/.opencode/skills/documenting-your-repo/reference/structure-planning.md +102 -0
  53. package/build/templates/agent-support/.opencode/skills/writing-docs-pages/SKILL.md +112 -0
  54. package/build/templates/agent-support/.opencode/skills/writing-docs-pages/reference/docouture-blocks.md +170 -0
  55. package/build/templates/agent-support/.opencode/skills/writing-docs-pages/reference/language-basics.md +402 -0
  56. package/build/templates/agent-support/AGENTS.md +72 -0
  57. package/build/templates/starter/antora-playbook.local.yml +99 -0
  58. package/build/templates/starter/antora-playbook.versioned.yml +167 -0
  59. package/build/templates/starter/antora-playbook.yml +189 -0
  60. package/build/templates/starter/gitignore +3 -0
  61. package/build/templates/starter/package.json +37 -0
  62. package/build/templates/starter/scripts/check-links.mjs +178 -0
  63. package/build/templates/starter/src/antora.yml +85 -0
  64. package/build/templates/starter/src/modules/ROOT/images/card-placeholder.png +0 -0
  65. package/build/templates/starter/src/modules/ROOT/images/feature-placeholder-dark.png +0 -0
  66. package/build/templates/starter/src/modules/ROOT/images/feature-placeholder.png +0 -0
  67. package/build/templates/starter/src/modules/ROOT/images/hero-placeholder.png +0 -0
  68. package/build/templates/starter/src/modules/ROOT/pages/index.adoc +124 -0
  69. package/build/templates/starter/src/modules/main/nav.adoc +19 -0
  70. package/build/templates/starter/src/modules/main/pages/app.adoc +5 -0
  71. package/build/templates/starter/src/modules/main/pages/architecture.adoc +6 -0
  72. package/build/templates/starter/src/modules/main/pages/changelog/index.adoc +9 -0
  73. package/build/templates/starter/src/modules/main/pages/components.adoc +701 -0
  74. package/build/templates/starter/src/modules/main/pages/contributing.adoc +6 -0
  75. package/build/templates/starter/src/modules/main/pages/getting-started.adoc +169 -0
  76. package/build/templates/starter/src/modules/main/pages/glossary.adoc +8 -0
  77. package/build/templates/starter/src/modules/main/pages/index.adoc +9 -0
  78. package/build/templates/starter/src/modules/main/pages/prerequisites.adoc +55 -0
  79. package/build/templates/starter/src/modules/main/pages/quickstart.adoc +21 -0
  80. package/build/templates/starter/src/modules/main/pages/release-notes/index.adoc +9 -0
  81. package/build/templates/starter/src/modules/main/pages/requirements.adoc +8 -0
  82. package/build/templates/starter/src/modules/main/pages/roadmap.adoc +4 -0
  83. package/build/templates/starter/src/modules/main/pages/structure.adoc +5 -0
  84. package/build/templates/starter/src/release-version.versioned +1 -0
  85. package/build/templates/starter/supplemental-ui/favicon.ico +0 -0
  86. package/build/templates/starter/supplemental-ui/product-logo-dark.png +0 -0
  87. package/build/templates/starter/supplemental-ui/product-logo.png +0 -0
  88. package/build/templates/workflows/docouture-kroki-cache-warm.yml +101 -0
  89. package/build/templates/workflows/docouture-pr-verify.yml +120 -0
  90. package/build/templates/workflows/docouture-publish-prerelease.yml +122 -0
  91. package/build/templates/workflows/docouture-publish.yml +138 -0
  92. package/build/templates/workflows/docouture-release-preview.yml +198 -0
  93. package/build/templates/workflows/docouture-release.yml +414 -0
  94. package/package.json +38 -0
@@ -0,0 +1,102 @@
1
+ # Structure planning
2
+
3
+ Decide what the site's shape should be before drafting any content. This builds on
4
+ `docs-internals`'s mechanics — read that skill for how `nav.adoc`/`antora.yml` actually
5
+ work; this file is about which structure to choose in the first place.
6
+
7
+ ## The target nav structure
8
+
9
+ This is the default shape to aim for — six ordered sections, each page tagged with how
10
+ essential it is. Not every repo needs every page in one pass; the tags say which ones to
11
+ skip without asking and which ones to check for before skipping:
12
+
13
+ - 🔴 required — every documented repo should end up with this page.
14
+ - 🟠 recommended — include unless there's a specific reason not to.
15
+ - 🔵 conditional — include only if the repo actually has the surface it covers; skip
16
+ cleanly (no stub) if it doesn't.
17
+ - ⚪ optional — nice to have, include when it adds value, otherwise leave out.
18
+
19
+ ```
20
+ docs
21
+ ├── 1. Overview
22
+ │ ├── about 🔴
23
+ │ ├── architecture 🔴
24
+ │ └── glossary (or basic terms) ⚪
25
+ ├── 2. Getting started
26
+ │ ├── prerequisites 🔴
27
+ │ └── quickstart 🔴
28
+ ├── 3. Guides
29
+ │ ├── overview 🔴
30
+ │ ├── <task-name> / <feature> 🔴 (≥1, repeatable pattern, i.e. "How to setup [feature]", "How to use [feature]", etc.)
31
+ │ └── development 🟠
32
+ ├── 4. Reference
33
+ │ ├── overview 🔴
34
+ │ ├── configuration 🔵 (repo has a configuration surface)
35
+ │ └── api / sdk / cli 🔵 (repo has an API/SDK/CLI surface, it can be ≥1)
36
+ ├── 5. Additional information
37
+ │ ├── overview 🔴
38
+ │ ├── changelog 🔴
39
+ │ │ ├── overview 🔴 (menu to each changelog, grouped by major if possible if standalone version, by date of publishing)
40
+ │ │ └── vX.Y.Z / stable / prerelease 🔴 (the changelog notes of the version)
41
+ │ ├── release-notes 🔴
42
+ │ │ ├── overview 🔴 (menu to each release, grouped by major if possible if standalone version, by date of publishing)
43
+ │ │ └── vX.Y.Z / stable / prerelease 🔴 (the real release notes of a version)
44
+ │ ├── faq 🟠
45
+ │ ├── security 🟠
46
+ │ └── eol / migration-guides 🔵 (repo has deprecations/major-version history)
47
+ └── 6. Contributing
48
+ └── overview 🔴
49
+ ```
50
+
51
+ ## Mapping the tree onto modules
52
+
53
+ `docouture new` scaffolds mono-module by default (single `ROOT`, one `nav.adoc`). For a small
54
+ or early-stage repo, keep the whole tree above inside `ROOT`: each numbered section becomes
55
+ a bare, unlinked list item in `nav.adoc` grouping its pages under a heading with no page of
56
+ its own (see `docs-internals/reference/page-patterns.md`'s grouping example) — sections 1,
57
+ 2, 5 and 6 stay this way even in a mature, fully multi-module site, since none of them ever
58
+ needed a "home" of their own.
59
+
60
+ **Guides** and **Reference** are the pair worth promoting to real modules once the site
61
+ outgrows `ROOT`, because they're the two sections that need a landing page a reader can
62
+ land on directly (via the module switcher) rather than always arriving through `ROOT`'s
63
+ own home page. Promote them independently and only when it earns its keep — a repo with
64
+ five guide pages and one reference page doesn't need Reference split out yet.
65
+
66
+ When in doubt, start mono-module — it's cheap to split later, see `docs-internals/
67
+ reference/page-patterns.md`'s own mono→multi migration steps. Splitting too early just
68
+ adds a module switcher nobody needs; splitting too late means a `ROOT` full of unrelated
69
+ content with no clean way to navigate it.
70
+
71
+ ## Signals worth checking against the 🔵 conditional pages
72
+
73
+ Don't assume where these live — check what's actually in the repo, in whatever form it
74
+ takes there:
75
+
76
+ - A `bin` field in `package.json`, or a `cli`/`cmd` directory → an API/CLI surface, wants
77
+ **Reference → api (or commands)**, and likely a **Guides** task page for common usage.
78
+ - An OpenAPI/GraphQL schema, or a REST/RPC handler directory → an API surface, wants
79
+ **Reference → api**.
80
+ - A config file schema (`.schema.json`, a typed config object, documented env vars in
81
+ code) → wants **Reference → configuration**.
82
+ - A changelog file, deprecation notices, major-version breaks, or an existing upgrade
83
+ guide → wants **Additional information → eol / migration-guides**.
84
+ - Multiple independently publishable packages in a monorepo → consider one **Reference**
85
+ module per package rather than forcing them into one.
86
+ - An existing `docs/`, `README.md`, `CONTRIBUTING.md`, wiki export, or similar → these
87
+ inform which pages already have real content to source from (see
88
+ `content-sourcing.md`), not just which pages to create.
89
+
90
+ Confirm the proposed set of 🔵/⚪ pages with whoever's driving before committing pages to
91
+ it — auto-detected signals can be wrong (a `bin` field for an internal-only dev tool
92
+ doesn't need a user-facing CLI guide, for instance).
93
+
94
+ ## The home page: structure now, content later
95
+
96
+ The home page's _existence and slot_ is fixed and non-negotiable, asserted in this phase:
97
+ `ROOT`'s `pages/index.adoc`, using the `page-layout: home` pattern (see `docs-internals/
98
+ reference/page-patterns.md`). It sits outside the six-section tree above — it's the site's
99
+ entry point, not a member of "Overview". Do not skip creating it, and do not spend long
100
+ drafting its real copy yet — its content is a _summary_ of everything else, so it's better
101
+ drafted roughly here (from whatever one-line description already exists) and properly
102
+ finished in the content-sourcing phase, once there's something real to summarize.
@@ -0,0 +1,112 @@
1
+ ---
2
+ name: writing-docs-pages
3
+ description: "How to author AsciiDoc content in this Antora documentation site — the content tree, xref: references, nav.adoc, admonitions, code blocks, and this site's own custom blocks (tabs, cards, accordion, feature-tabs, cta, label:/mono: macros). USE WHEN writing or editing a .adoc page, adding a page to the nav, fixing a broken xref, or reaching for a block like tabs/cards/accordion. EXAMPLES: 'add a page', 'my xref doesn't resolve', 'the build fails on a warning', 'add tabs for pnpm/npm/yarn commands', 'group these FAQ items', 'add a card grid'."
4
+ ---
5
+
6
+ # Writing docs pages
7
+
8
+ Every page here is AsciiDoc, parsed by **Asciidoctor** and orchestrated by **Antora**.
9
+ Antora restricts and reinterprets parts of the language (includes, xrefs, image paths);
10
+ where this skill and the upstream Asciidoctor docs differ, follow this skill.
11
+
12
+ - `reference/language-basics.md` — the AsciiDoc language itself: document structure,
13
+ blocks, text formatting, lists, links/xrefs, images, source blocks, admonitions, tables,
14
+ includes, conditionals, substitutions, attributes — plus a URL index into
15
+ `https://docs.asciidoctor.org/asciidoc/latest/` for anything not covered.
16
+ - `reference/docouture-blocks.md` — this site's own custom blocks, registered via
17
+ `@inditextech/docouture-asciidoc-extensions` (see `antora-playbook.yml`'s
18
+ `asciidoc.extensions`): `[tabs]`, `[cards]`, `[accordion]`, `[feature-tabs]`, `[cta]`,
19
+ `label:`/`mono:` inline macros, and a few table/video sizing attributes.
20
+
21
+ For the home page vs. content page patterns, mono- vs. multi-module sites, and the
22
+ playbook/component-descriptor mechanics, see the `docs-internals` skill.
23
+
24
+ ## Where content lives
25
+
26
+ ```
27
+ docs/src/
28
+ antora.yml component descriptor: name, title, version, nav
29
+ modules/
30
+ ROOT/ the default module; its name is omitted from resource IDs
31
+ nav.adoc the navigation tree for this module
32
+ pages/*.adoc one page per file — these become site URLs
33
+ ```
34
+
35
+ Only `pages/` exists in a freshly scaffolded site. The other family directories are
36
+ created when first needed, with these exact names — Antora keys off them and ignores
37
+ anything else:
38
+
39
+ | directory | family | referenced as |
40
+ | -------------- | ------------- | ------------------------------ |
41
+ | `pages/` | `page$` | `xref:name.adoc[]` |
42
+ | `partials/` | `partial$` | `include::partial$name.adoc[]` |
43
+ | `examples/` | `example$` | `include::example$name.json[]` |
44
+ | `images/` | `image$` | `image::name.png[]` |
45
+ | `attachments/` | `attachment$` | `xref:attachment$file.pdf[]` |
46
+
47
+ ## Resource IDs
48
+
49
+ Antora addresses content by resource ID, not by relative path:
50
+
51
+ ```
52
+ version@component:module:family$relative/path.adoc#fragment
53
+ ```
54
+
55
+ Everything left of the filename is optional and defaults to the current page's context.
56
+ Inside the same module:
57
+
58
+ | reference | means |
59
+ | -------------------------------- | ---------------------------------------------------------------------------- |
60
+ | `xref:index.adoc[Home]` | a page in the same module |
61
+ | `xref:guide/setup.adoc[]` | a page in a subdirectory of `pages/` — empty text uses the target's title |
62
+ | `xref:other-module:index.adoc[]` | a page in another module — only in a multi-module site, see `docs-internals` |
63
+ | `xref:index.adoc#install[]` | a fragment on another page |
64
+ | `include::partial$intro.adoc[]` | a partial from the same module |
65
+
66
+ `../` path traversal between pages is not how this works — a page one directory deep
67
+ still addresses its sibling as `xref:guide/other.adoc[]`, module-relative, never
68
+ file-relative.
69
+
70
+ ## Where a change goes
71
+
72
+ | you want to | do |
73
+ | ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------- |
74
+ | add a page | create `docs/src/modules/<module>/pages/name.adoc` **and** add an `xref:` to that module's `nav.adoc` |
75
+ | add a section to the nav | edit `nav.adoc` — nesting is list depth (`*`, `**`, `***`); a bare, unlinked list item can group xrefs under a heading with no page of its own |
76
+ | reuse a chunk of prose | `docs/src/modules/<module>/partials/name.adoc`, included as `partial$name.adoc` |
77
+ | add an image | `docs/src/modules/<module>/images/name.png`, referenced as `image::name.png[Alt]` |
78
+ | set a site-wide attribute | `asciidoc.attributes` in `antora-playbook.yml` |
79
+ | set a component-wide attribute | `asciidoc.attributes` in `docs/src/antora.yml` |
80
+ | set a page-scoped attribute | an attribute entry in the page header, above the first blank line |
81
+
82
+ ## Constraints that fail silently
83
+
84
+ - **A warning is a build failure.** `antora-playbook.yml` sets
85
+ `runtime.log.failure_level: warn`. A broken xref, a missing include target, an
86
+ undefined attribute reference or a bad image path exits non-zero.
87
+ - **A page missing from `nav.adoc` still builds.** It publishes at its URL, renders with
88
+ an empty navigation context and is reachable only by direct link. Nothing warns.
89
+ - **`include::` cannot read arbitrary paths.** Antora installs its own include processor
90
+ that resolves targets against the content catalog, so only the family forms
91
+ (`partial$`, `example$`, page IDs) work. A filesystem path fails at build time.
92
+ - **Attribute references are not substituted inside verbatim blocks.** `{version}`
93
+ inside `----`/`....` renders literally unless the block carries `subs=attributes+`.
94
+ - **Unconstrained formatting needs doubled marks.** `**bold**` mid-word, `__italic__`
95
+ mid-word. The single-mark form adjacent to a word character is not formatting at all.
96
+ - **A cross-module xref only resolves inside a multi-module site**, and only once both
97
+ modules are listed under `docs/src/antora.yml`'s `nav:` — see `docs-internals`.
98
+
99
+ ## Page attributes the UI reads
100
+
101
+ | attribute | effect |
102
+ | ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
103
+ | `description` | hero excerpt (below the title) AND `<meta name="description">` |
104
+ | `page-tags` | comma-separated; one label pill each in the hero |
105
+ | `page-action` / `page-action-url` | primary hero button — renders only when BOTH are set |
106
+ | `page-action-secondary` / `page-action-secondary-url` | secondary hero button, same rule |
107
+ | `page-hero-image` / `page-hero-image-alt` | hero illustration |
108
+ | `page-nav-module` | which module's nav tree the side menu shows for this page — set on `ROOT`'s own landing page in a multi-module site, since `ROOT` has no nav of its own |
109
+ | `page-layout: home` | the marketing home-page layout — see `docs-internals`'s page-patterns reference |
110
+ | `page-role: -hero` | suppresses the hero entirely |
111
+ | `page-role: -toc` | suppresses the right-hand table of contents |
112
+ | `page-pagination` | enables the previous/next footer links |
@@ -0,0 +1,170 @@
1
+ # This site's custom blocks
2
+
3
+ Registered by `@inditextech/docouture-asciidoc-extensions`, listed under
4
+ `antora-playbook.yml`'s `asciidoc.extensions`. Everything below is authored content with
5
+ no plain-AsciiDoc equivalent — the extension only emits markup, all styling comes from
6
+ the UI bundle's CSS. Every block here degrades to plain, readable HTML with JavaScript
7
+ off (sequential sections for tabs, `<details>` for accordions, real `<a href>`s).
8
+
9
+ ## Tabs
10
+
11
+ A switcher for equivalent alternatives — package-manager commands, config formats, etc.
12
+
13
+ ```adoc
14
+ [tabs]
15
+ --
16
+ [tab,label="pnpm"]
17
+ ****
18
+ [source,bash]
19
+ ----
20
+ pnpm add some-package
21
+ ----
22
+ ****
23
+
24
+ [tab,label="npm"]
25
+ ****
26
+ [source,bash]
27
+ ----
28
+ npm install some-package
29
+ ----
30
+ ****
31
+ --
32
+ ```
33
+
34
+ `[tabs]` is an open block (`--`); each `[tab,label="…"]` child is its own sidebar block
35
+ (`****`), never an example block (`====`) — this lets a tab hold anything, including a
36
+ titled source block or another nested block, without a delimiter-nesting trap.
37
+
38
+ ## Cards
39
+
40
+ A grid of entry-point cards — landing "Get started" rows, or a content page pointing at
41
+ related pages.
42
+
43
+ ```adoc
44
+ [cards,type=image-square,columns="1 s:2 m:4",width=container]
45
+ ====
46
+ [card,subheader="Category"]
47
+ .xref:module:page.adoc[Card title]
48
+ --
49
+ image::card-image.png["Alt text"]
50
+
51
+ Card description.
52
+ --
53
+
54
+ [card]
55
+ .xref:module:other.adoc[No-image card]
56
+ A card with just a title and description — no image, no open block needed.
57
+ ====
58
+ ```
59
+
60
+ - `type`: `no-image` (default), `image-landscape`, `image-square`, `image-portrait`.
61
+ - `columns`: base count, then breakpoint-prefixed overrides (`s:`, `m:`, `l:`), e.g.
62
+ `"1 s:2 m:4"` — max 4.
63
+ - `width`: `content` (default) or `container`.
64
+ - The block title (`.xref:...[Title]`) carries the link — the whole card is that link.
65
+ - A card with an image needs the open-block form (`--`/`--`); a text-only card can be a
66
+ plain paragraph under `[card]`.
67
+
68
+ ## Accordion (grouped FAQ)
69
+
70
+ Groups a run of `[%collapsible]` blocks with proper `role=group` semantics and,
71
+ optionally, single-open behaviour — the native `[%collapsible]` on its own (see
72
+ `language-basics.md`) still works for one-off collapsibles; group them with `[accordion]`
73
+ when several belong together, e.g. an FAQ section.
74
+
75
+ ```adoc
76
+ [accordion%single-open,aria-label="Frequently asked questions"]
77
+ --
78
+ .Question one?
79
+ [%collapsible]
80
+ ====
81
+ Answer one.
82
+ ====
83
+
84
+ .Question two?
85
+ [%collapsible]
86
+ ====
87
+ Answer two.
88
+ ====
89
+ --
90
+ ```
91
+
92
+ - `%single-open` (an option, like `%collapsible`'s own) makes opening one item close the
93
+ others; omit it and items are independent (the default).
94
+ - Give the group an `aria-label=` (or a block `.Title`) — a `role=group` with no
95
+ accessible name is flagged.
96
+ - `[accordion]` is an open block (`--`) so its `[%collapsible]` children stay ordinary
97
+ `====` blocks, unchanged from how they'd read standalone.
98
+
99
+ ## Feature tabs
100
+
101
+ A media-plus-prose switcher for a handful of top-level capabilities — used on the home
102
+ page (see the `docs-internals` skill's `reference/page-patterns.md`).
103
+
104
+ ```adoc
105
+ [feature-tabs]
106
+ ====
107
+ [feature,label="Capability one"]
108
+ --
109
+ image::feature-one.png[Alt text]
110
+
111
+ Prose describing this capability.
112
+
113
+ [.cta]
114
+ xref:module:page.adoc[Learn more]
115
+ --
116
+
117
+ [feature,label="Capability two"]
118
+ --
119
+ image::feature-two.png[Alt text]
120
+
121
+ Prose describing this capability.
122
+ --
123
+ ====
124
+ ```
125
+
126
+ ## CTA
127
+
128
+ A single call-to-action block — prose plus one prominent link.
129
+
130
+ ```adoc
131
+ [cta]
132
+ ====
133
+ Prose making the case for the action.
134
+
135
+ [.primary]
136
+ https://example.com/signup[Get started]
137
+ ====
138
+ ```
139
+
140
+ ## Inline macros: `label:` and `mono:`
141
+
142
+ ```adoc
143
+ label:red[Blocked] a coloured pill — variants: white, grey, red, orange, green,
144
+ blue, purple, pink, teal (grey is the default, label:[Text])
145
+ mono:[className] plain monospaced text with no code-chip styling — for a
146
+ table cell whose entire content is a bare name/token
147
+ ```
148
+
149
+ `` `backtick code` `` (see `language-basics.md`) keeps its usual code-chip styling;
150
+ `mono:[]` is the deliberate opt-out for a column where every cell is a token and the chip
151
+ would just be noise.
152
+
153
+ ## Table and video sizing attributes
154
+
155
+ ```adoc
156
+ [table-width=720px,cols="1,1"] |=== an absolute CSS width, bypassing Asciidoctor's
157
+ |=== own width= (which is percentage-only, clamped 1-100)
158
+
159
+ [cols="1,3,2",nowrap-cols="1,2"] pins white-space: nowrap to specific columns
160
+ |===
161
+ ...
162
+ |===
163
+
164
+ video::demo[youtube,640,360] sets both dimensions and locks the aspect ratio
165
+ at any narrower viewport (no CSS-only fix exists
166
+ for an iframe/video the way there is for <img>)
167
+ ```
168
+
169
+ These aren't new blocks, just extra attributes Asciidoctor's own table/video macros don't
170
+ support natively — safe to ignore if you never need an absolute width or a nowrap column.