@godxjp/ui 33.20.0 → 33.22.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 (116) hide show
  1. package/README.md +4 -4
  2. package/agent/START-HERE.md +7 -7
  3. package/agent/components/AppSettingPicker.json +0 -1
  4. package/agent/components/AppShell.json +11 -1
  5. package/agent/components/BlockEditor.json +6 -1
  6. package/agent/components/Button.json +1 -1
  7. package/agent/components/CardShowcase.json +44 -0
  8. package/agent/components/CatalogCard.json +83 -0
  9. package/agent/components/CatalogDetail.json +76 -0
  10. package/agent/components/CatalogDetailSection.json +52 -0
  11. package/agent/components/CatalogDetailTag.json +27 -0
  12. package/agent/components/EditorialArticle.json +53 -0
  13. package/agent/components/EditorialAuth.json +53 -0
  14. package/agent/components/EditorialAuthCard.json +52 -0
  15. package/agent/components/EditorialBanner.json +53 -0
  16. package/agent/components/EditorialBreadcrumb.json +38 -0
  17. package/agent/components/EditorialCard.json +70 -0
  18. package/agent/components/EditorialEmptyPanel.json +57 -0
  19. package/agent/components/EditorialFilterBar.json +51 -0
  20. package/agent/components/EditorialFilterField.json +39 -0
  21. package/agent/components/EditorialFilterPanel.json +46 -0
  22. package/agent/components/EditorialFooter.json +54 -0
  23. package/agent/components/EditorialFootnote.json +36 -0
  24. package/agent/components/EditorialHero.json +52 -0
  25. package/agent/components/EditorialInlineSearch.json +54 -0
  26. package/agent/components/EditorialMasthead.json +52 -0
  27. package/agent/components/EditorialMetaBar.json +37 -0
  28. package/agent/components/EditorialPageHeader.json +73 -0
  29. package/agent/components/EditorialPanel.json +48 -0
  30. package/agent/components/EditorialPillNav.json +41 -0
  31. package/agent/components/EditorialPrompt.json +54 -0
  32. package/agent/components/EditorialSearch.json +112 -0
  33. package/agent/components/EditorialSection.json +68 -0
  34. package/agent/components/EditorialSectionHead.json +62 -0
  35. package/agent/components/EditorialStats.json +32 -0
  36. package/agent/components/EditorialTextButton.json +47 -0
  37. package/agent/components/EditorialToggleGroup.json +52 -0
  38. package/agent/components/EditorialToolbar.json +45 -0
  39. package/agent/components/Eyebrow.json +39 -0
  40. package/agent/components/HoldingCard.json +69 -0
  41. package/agent/components/HoldingCardAction.json +51 -0
  42. package/agent/components/HoldingGrid.json +37 -0
  43. package/agent/components/Markdown.json +6 -0
  44. package/agent/components/NumberInput.json +5 -0
  45. package/agent/components/PriceSummary.json +32 -0
  46. package/agent/components/SettingsLayout.json +31 -0
  47. package/agent/components/SettingsPanel.json +53 -0
  48. package/agent/components/ThemePicker.json +54 -0
  49. package/agent/components/TopbarItem.json +5 -0
  50. package/agent/components-index.json +292 -98
  51. package/agent/components.json +2059 -4
  52. package/agent/index.json +7 -7
  53. package/agent/llms.txt +8 -8
  54. package/agent/tokens.json +5640 -132
  55. package/dist/components/data-display/badge.js +4 -2
  56. package/dist/components/data-display/image.js +6 -0
  57. package/dist/components/data-entry/form-field.js +2 -2
  58. package/dist/components/data-entry/number-input.d.ts +1 -0
  59. package/dist/components/data-entry/number-input.js +8 -0
  60. package/dist/components/data-entry/select.js +24 -2
  61. package/dist/components/general/button.js +14 -1
  62. package/dist/components/general/typography.d.ts +1 -1
  63. package/dist/components/layout/app-shell.d.ts +1 -1
  64. package/dist/components/layout/app-shell.js +28 -2
  65. package/dist/components/layout/centered-shell.js +4 -0
  66. package/dist/components/layout/editorial-account.d.ts +51 -0
  67. package/dist/components/layout/editorial-account.js +466 -0
  68. package/dist/components/layout/editorial-catalog.d.ts +18 -0
  69. package/dist/components/layout/editorial-catalog.js +164 -0
  70. package/dist/components/layout/editorial.d.ts +56 -0
  71. package/dist/components/layout/editorial.js +867 -0
  72. package/dist/components/layout/index.d.ts +6 -0
  73. package/dist/components/layout/index.js +98 -0
  74. package/dist/components/layout/mobile-shell.d.ts +2 -0
  75. package/dist/components/layout/mobile-shell.js +18 -11
  76. package/dist/components/layout/responsive-grid.js +9 -1
  77. package/dist/components/layout/topbar-item.d.ts +1 -0
  78. package/dist/components/layout/topbar-item.js +2 -0
  79. package/dist/contracts/measurement.json +1 -1
  80. package/dist/lab/legal-document-shell.js +61 -51
  81. package/dist/lib/toast-clearance.js +1 -1
  82. package/dist/props/components/data-display.prop.d.ts +2 -0
  83. package/dist/props/components/data-entry.prop.d.ts +9 -0
  84. package/dist/props/components/editorial-account.prop.d.ts +249 -0
  85. package/dist/props/components/editorial-account.prop.js +0 -0
  86. package/dist/props/components/general.prop.d.ts +6 -2
  87. package/dist/props/components/layout.prop.d.ts +602 -2
  88. package/dist/props/registry.d.ts +1124 -0
  89. package/dist/props/registry.js +792 -0
  90. package/dist/styles/badge-layout.css +2 -0
  91. package/dist/styles/control.css +60 -13
  92. package/dist/styles/core.css +1 -0
  93. package/dist/styles/data-display-layout.css +9 -3
  94. package/dist/styles/editorial-account-layout.css +1130 -0
  95. package/dist/styles/focus-ring.css +33 -10
  96. package/dist/styles/form-layout.css +8 -1
  97. package/dist/styles/index.css +1 -0
  98. package/dist/styles/layers.json +248 -1
  99. package/dist/styles/layout.css +2031 -0
  100. package/dist/styles/logo-layout.css +27 -0
  101. package/dist/styles/shell-layout.css +101 -3
  102. package/dist/styles/table-layout.css +25 -13
  103. package/dist/styles/text-layout.css +6 -0
  104. package/dist/styles.css +1 -1
  105. package/dist/tokens/base.css +2 -0
  106. package/dist/tokens/components/badge.css +3 -0
  107. package/dist/tokens/components/control.css +9 -0
  108. package/dist/tokens/components/editorial-account.css +393 -0
  109. package/dist/tokens/components/editorial.css +721 -0
  110. package/dist/tokens/components/form.css +4 -0
  111. package/dist/tokens/components/logo.css +2 -0
  112. package/dist/tokens/components/shell.css +23 -0
  113. package/dist/tokens/components/table.css +1 -1
  114. package/docs/TOKENS.md +26 -0
  115. package/package.json +2 -2
  116. package/scripts/ui-audit.mjs +3 -2
@@ -0,0 +1,48 @@
1
+ {
2
+ "example": "import { EditorialPanel, ResponsiveGrid } from \"@godxjp/ui/layout\";\n\n<ResponsiveGrid preset=\"panels\">\n <EditorialPanel tag=\"NEXT\" title=\"More ways to discover.\" items={[\"Products and their contents\"]} />\n</ResponsiveGrid>",
3
+ "group": "layout",
4
+ "importPath": "@godxjp/ui/layout",
5
+ "name": "EditorialPanel",
6
+ "props": [
7
+ {
8
+ "description": "The heading.",
9
+ "name": "title",
10
+ "required": true,
11
+ "type": "ReactNode"
12
+ },
13
+ {
14
+ "description": "Short tag above it.",
15
+ "name": "tag",
16
+ "type": "ReactNode"
17
+ },
18
+ {
19
+ "description": "List items.",
20
+ "name": "items",
21
+ "type": "ReactNode[]"
22
+ },
23
+ {
24
+ "description": "Anything after the list.",
25
+ "name": "children",
26
+ "type": "ReactNode"
27
+ },
28
+ {
29
+ "defaultValue": "2",
30
+ "description": "Heading level.",
31
+ "name": "level",
32
+ "type": "2 | 3"
33
+ }
34
+ ],
35
+ "related": [
36
+ "ResponsiveGrid — `preset=\"panels\"`."
37
+ ],
38
+ "rules": [
39
+ 2,
40
+ 6,
41
+ 44,
42
+ 45
43
+ ],
44
+ "tagline": "A bordered panel with a short tag, a heading and a list (gh#1440) — a roadmap group. Lay a row of them out with `ResponsiveGrid preset=\"panels\"` (tracks and gap are `--responsive-grid-panels-*`, re-declared at the theme's own steps). Geometry: `--editorial-panel-*`.",
45
+ "usage": [
46
+ "DO lay a row of panels out with `ResponsiveGrid preset=\"panels\"`."
47
+ ]
48
+ }
@@ -0,0 +1,41 @@
1
+ {
2
+ "example": "import { EditorialPillNav, EditorialPillNavItem } from \"@godxjp/ui/layout\";\n\n<EditorialPillNav aria-label=\"Browse by game\" label=\"YOUR GAME\">\n <EditorialPillNavItem asChild icon=\"dot\"><a href=\"/cards/?game=pokemon\">Pokémon</a></EditorialPillNavItem>\n</EditorialPillNav>",
3
+ "group": "layout",
4
+ "importPath": "@godxjp/ui/layout",
5
+ "name": "EditorialPillNav",
6
+ "props": [
7
+ {
8
+ "description": "Landmark name.",
9
+ "name": "aria-label",
10
+ "required": true,
11
+ "type": "string"
12
+ },
13
+ {
14
+ "description": "EditorialPillNavItem elements.",
15
+ "name": "children",
16
+ "required": true,
17
+ "type": "ReactNode"
18
+ },
19
+ {
20
+ "description": "Visible lead text (aria-hidden; the landmark is named).",
21
+ "name": "label",
22
+ "type": "ReactNode"
23
+ }
24
+ ],
25
+ "related": [
26
+ "EditorialSection."
27
+ ],
28
+ "rules": [
29
+ 2,
30
+ 6,
31
+ 44,
32
+ 45
33
+ ],
34
+ "subParts": [
35
+ "EditorialPillNavItem"
36
+ ],
37
+ "tagline": "A horizontal band of section links (gh#1435) — a site's \"browse by game\" row: an optional lead label, then `EditorialPillNavItem`s (an icon or a small `\"dot\"` marker; `aria-current=\"page\"` on the link marks the current one). Scrolls sideways when it overflows. Geometry: `--editorial-pill-*`.",
38
+ "usage": [
39
+ "DO put it in `EditorialSection as=\"div\" tone=\"surface\" divider=\"end\"` for a band under the header."
40
+ ]
41
+ }
@@ -0,0 +1,54 @@
1
+ {
2
+ "example": "import { EditorialPrompt } from \"@godxjp/ui/layout\";\nimport { Lock } from \"lucide-react\";\n\n<EditorialPrompt icon={<Lock />} title=\"See more when you sign in\" description=\"Per-market prices and history are for members.\" action={<Button asChild><a href=\"/login\">Sign in</a></Button>} />",
3
+ "group": "layout",
4
+ "importPath": "@godxjp/ui/layout",
5
+ "name": "EditorialPrompt",
6
+ "props": [
7
+ {
8
+ "description": "Glyph in the round badge.",
9
+ "name": "icon",
10
+ "type": "ReactNode"
11
+ },
12
+ {
13
+ "description": "Heading.",
14
+ "name": "title",
15
+ "required": true,
16
+ "type": "ReactNode"
17
+ },
18
+ {
19
+ "description": "Paragraph.",
20
+ "name": "description",
21
+ "type": "ReactNode"
22
+ },
23
+ {
24
+ "description": "Small note.",
25
+ "name": "note",
26
+ "type": "ReactNode"
27
+ },
28
+ {
29
+ "description": "The one action.",
30
+ "name": "action",
31
+ "type": "ReactNode"
32
+ },
33
+ {
34
+ "defaultValue": "3",
35
+ "description": "Heading level.",
36
+ "name": "level",
37
+ "type": "2 | 3 | 4"
38
+ }
39
+ ],
40
+ "related": [
41
+ "Alert — status messages.",
42
+ "EmptyState — nothing to show."
43
+ ],
44
+ "rules": [
45
+ 2,
46
+ 6,
47
+ 44,
48
+ 45
49
+ ],
50
+ "tagline": "A polite inline invitation (gh#1438): a round glyph, a heading, a short paragraph and a note, with one action at the end (\"sign in to see more\"). Not a live region. Geometry: `--editorial-prompt-*`.",
51
+ "usage": [
52
+ "DO use Alert for a status message; this is an invitation that is there when the page loads."
53
+ ]
54
+ }
@@ -0,0 +1,112 @@
1
+ {
2
+ "example": "import { EditorialSearch } from \"@godxjp/ui/layout\";\n\n<EditorialSearch label=\"Card name or number\" placeholder=\"Search a card\" submitLabel=\"Search\" action=\"/cards/\" onSearch={(q) => navigate(q)} />",
3
+ "group": "layout",
4
+ "importPath": "@godxjp/ui/layout",
5
+ "name": "EditorialSearch",
6
+ "props": [
7
+ {
8
+ "description": "Accessible label (visually hidden).",
9
+ "name": "label",
10
+ "required": true,
11
+ "type": "string"
12
+ },
13
+ {
14
+ "description": "Site search box, or a collection's own row (visible label, live count, no button). Default: \"inset\".",
15
+ "name": "variant",
16
+ "type": "\"inset\" | \"inline\""
17
+ },
18
+ {
19
+ "description": "Button text (inset; required there).",
20
+ "name": "submitLabel",
21
+ "type": "ReactNode"
22
+ },
23
+ {
24
+ "description": "inline: live count at the end of the row.",
25
+ "name": "count",
26
+ "type": "ReactNode"
27
+ },
28
+ {
29
+ "description": "inline: settle delay (ms). Default: 300.",
30
+ "name": "debounce",
31
+ "type": "number"
32
+ },
33
+ {
34
+ "description": "Placeholder.",
35
+ "name": "placeholder",
36
+ "type": "string"
37
+ },
38
+ {
39
+ "defaultValue": "\"q\"",
40
+ "description": "Query parameter.",
41
+ "name": "name",
42
+ "type": "string"
43
+ },
44
+ {
45
+ "description": "Initial query.",
46
+ "name": "defaultValue",
47
+ "type": "string"
48
+ },
49
+ {
50
+ "description": "Form action for the no-JS submit.",
51
+ "name": "action",
52
+ "type": "string"
53
+ },
54
+ {
55
+ "description": "Submit handler.",
56
+ "name": "onSearch",
57
+ "type": "(query: string) => void"
58
+ },
59
+ {
60
+ "description": "A scope control at the start of the box — the kit Select (borderless, width auto) with its own aria-label and name.",
61
+ "name": "scope",
62
+ "type": "ReactNode"
63
+ },
64
+ {
65
+ "description": "inset (gh#1447): grouped rows { id, label, items: [{ id, href, label, description?, media?, meta? }] } under the focused box; the field becomes an ARIA combobox.",
66
+ "name": "suggestions",
67
+ "type": "EditorialSearchSuggestionGroupProp[]"
68
+ },
69
+ {
70
+ "description": "inset: the popup's last row — all results.",
71
+ "name": "suggestionsFooter",
72
+ "type": "{ href: string; label: ReactNode }"
73
+ },
74
+ {
75
+ "description": "inset: accessible name of the listbox (default: label).",
76
+ "name": "suggestionsLabel",
77
+ "type": "string"
78
+ },
79
+ {
80
+ "description": "inset: field text after each edit; never mid-IME-composition, once on compositionend.",
81
+ "name": "onQueryChange",
82
+ "type": "(query: string) => void"
83
+ },
84
+ {
85
+ "description": "inset: the element suggestion rows render as (a router Link). Default \"a\".",
86
+ "name": "linkComponent",
87
+ "type": "ElementType"
88
+ },
89
+ {
90
+ "description": "Field id.",
91
+ "name": "id",
92
+ "type": "string"
93
+ }
94
+ ],
95
+ "related": [
96
+ "SearchInput — a debounced filter field.",
97
+ "EditorialHero — the `search` slot."
98
+ ],
99
+ "rules": [
100
+ 2,
101
+ 6,
102
+ 44,
103
+ 45
104
+ ],
105
+ "tagline": "The inset site search (gh#1435): ONE bordered box holding a search glyph, the field and the submit button, under a visually hidden label that also names the `role=\"search\"` landmark. `onSearch` gets the trimmed query; without JavaScript the form GETs `action`. Geometry: `--editorial-search-*`.",
106
+ "usage": [
107
+ "DO use it for a site search that submits; use SearchInput for a live filter.",
108
+ "DO use variant=\"inline\" for a collection's own search row (visible label, live count) — gh#1439.",
109
+ "DO fetch suggestions yourself (debounce, abort, cache) from onQueryChange and pass the rows in; the kit neither debounces nor fetches (gh#1447).",
110
+ "DON'T put buttons or other controls in a suggestion row — each row is one link (role=option)."
111
+ ]
112
+ }
@@ -0,0 +1,68 @@
1
+ {
2
+ "example": "import { CenteredShell, EditorialSection, EditorialSectionHead } from \"@godxjp/ui/layout\";\n\n<CenteredShell preset=\"public-landing\" flow=\"sections\" topbar={<SiteHeader />} footer={<SiteFooter />}>\n <EditorialSection tone=\"subtle\" divider=\"both\" spacing=\"section\" aria-labelledby=\"sets\">\n <EditorialSectionHead titleId=\"sets\" title=\"Every expansion, a new chapter.\" />\n </EditorialSection>\n</CenteredShell>",
3
+ "group": "layout",
4
+ "importPath": "@godxjp/ui/layout",
5
+ "name": "EditorialSection",
6
+ "props": [
7
+ {
8
+ "description": "Band content, already in the landing column.",
9
+ "name": "children",
10
+ "required": true,
11
+ "type": "ReactNode"
12
+ },
13
+ {
14
+ "defaultValue": "\"default\"",
15
+ "description": "Ground: page canvas, card surface, muted, or the hero wash.",
16
+ "name": "tone",
17
+ "type": "\"default\" | \"surface\" | \"subtle\" | \"hero\""
18
+ },
19
+ {
20
+ "defaultValue": "\"none\"",
21
+ "description": "Hairlines on the block edges.",
22
+ "name": "divider",
23
+ "type": "\"none\" | \"end\" | \"both\""
24
+ },
25
+ {
26
+ "defaultValue": "\"none\"",
27
+ "description": "Section rhythm as block padding.",
28
+ "name": "spacing",
29
+ "type": "\"none\" | \"section\""
30
+ },
31
+ {
32
+ "defaultValue": "\"section\"",
33
+ "description": "Landmark element.",
34
+ "name": "as",
35
+ "type": "\"section\" | \"div\" | \"nav\""
36
+ },
37
+ {
38
+ "description": "Landmark name.",
39
+ "name": "aria-label",
40
+ "type": "string"
41
+ },
42
+ {
43
+ "description": "Landmark name reference (the section head's titleId).",
44
+ "name": "aria-labelledby",
45
+ "type": "string"
46
+ },
47
+ {
48
+ "description": "Id on the band.",
49
+ "name": "id",
50
+ "type": "string"
51
+ }
52
+ ],
53
+ "related": [
54
+ "CenteredShell — `flow=\"sections\"`.",
55
+ "EditorialHero, EditorialSectionHead — what goes inside."
56
+ ],
57
+ "rules": [
58
+ 2,
59
+ 6,
60
+ 44,
61
+ 45
62
+ ],
63
+ "tagline": "One full-width band of an editorial page (gh#1435): put it straight inside `CenteredShell preset=\"public-landing\" flow=\"sections\"`. Its ground (`tone`) and block hairlines (`divider`) run edge to edge while its content sits in the landing column (max width + gutter). `spacing=\"section\"` pads it by the section rhythm. Geometry: `--editorial-section-*`.",
64
+ "usage": [
65
+ "DO stack bands directly in a `flow=\"sections\"` shell — the shell drops its column cap, gap and main padding for them.",
66
+ "DO NOT nest a band inside a capped column: it cannot reach the edges there."
67
+ ]
68
+ }
@@ -0,0 +1,62 @@
1
+ {
2
+ "example": "import { EditorialSectionHead, EditorialTextLink, Eyebrow } from \"@godxjp/ui/layout\";\n\n<EditorialSectionHead\n eyebrow={<Eyebrow>THE TCG-M JOURNAL</Eyebrow>}\n title=\"A little knowledge. More enjoyment.\"\n titleId=\"journal\"\n action={<EditorialTextLink asChild><a href=\"/journal/\">View all</a></EditorialTextLink>}\n/>",
3
+ "group": "layout",
4
+ "importPath": "@godxjp/ui/layout",
5
+ "name": "EditorialSectionHead",
6
+ "props": [
7
+ {
8
+ "description": "The heading.",
9
+ "name": "title",
10
+ "required": true,
11
+ "type": "ReactNode"
12
+ },
13
+ {
14
+ "description": "Kicker above it.",
15
+ "name": "eyebrow",
16
+ "type": "ReactNode"
17
+ },
18
+ {
19
+ "description": "One line under it.",
20
+ "name": "description",
21
+ "type": "ReactNode"
22
+ },
23
+ {
24
+ "description": "Trailing call to action.",
25
+ "name": "action",
26
+ "type": "ReactNode"
27
+ },
28
+ {
29
+ "defaultValue": "2",
30
+ "description": "Heading level.",
31
+ "name": "level",
32
+ "type": "2 | 3"
33
+ },
34
+ {
35
+ "defaultValue": "\"section\"",
36
+ "description": "A module's smaller head (gh#1438).",
37
+ "name": "scale",
38
+ "type": "\"section\" | \"module\""
39
+ },
40
+ {
41
+ "description": "Id on the title, for the section's aria-labelledby.",
42
+ "name": "titleId",
43
+ "type": "string"
44
+ }
45
+ ],
46
+ "related": [
47
+ "EditorialSection, EditorialTextLink."
48
+ ],
49
+ "rules": [
50
+ 2,
51
+ 6,
52
+ 44,
53
+ 45
54
+ ],
55
+ "subParts": [
56
+ "EditorialTextLink"
57
+ ],
58
+ "tagline": "A section's head (gh#1435): kicker, an editorial h2, one line of description and a trailing action on the title's row — usually an `EditorialTextLink` \"view all →\" (an inline-flex link with a trailing arrow, `asChild` for a router link). Geometry: `--editorial-section-head-*`, `--editorial-text-link-*`.",
59
+ "usage": [
60
+ "DO name the EditorialSection with `aria-labelledby={titleId}`."
61
+ ]
62
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "example": "import { EditorialStats } from \"@godxjp/ui/layout\";\n\n<EditorialStats aria-label=\"Collection totals\" items={[{ label: \"Items in your collection\", value: \"12\", unit: \"items\", note: \"A collection of things you love.\" }, { label: \"Single cards\", value: \"9\", unit: \"items\" }, { label: \"Sealed products\", value: \"3\", unit: \"items\" }]} />",
3
+ "group": "layout",
4
+ "importPath": "@godxjp/ui/layout",
5
+ "name": "EditorialStats",
6
+ "props": [
7
+ {
8
+ "description": "The tiles.",
9
+ "name": "items",
10
+ "required": true,
11
+ "type": "{ label: ReactNode; value: ReactNode; unit?: ReactNode; note?: ReactNode }[]"
12
+ },
13
+ {
14
+ "description": "Name of the list.",
15
+ "name": "aria-label",
16
+ "type": "string"
17
+ }
18
+ ],
19
+ "related": [
20
+ "StatCard — an application KPI tile."
21
+ ],
22
+ "rules": [
23
+ 2,
24
+ 6,
25
+ 44,
26
+ 45
27
+ ],
28
+ "tagline": "A strip of figure tiles on unequal tracks (gh#1439, default `1.4fr 1fr 1fr`): label, large tabular figure with a small unit, optional note. The first tile is the lead (quiet ground; a theme can span it across a phone row with its figure beside the label). Geometry: `--editorial-stats-*`.",
29
+ "usage": [
30
+ "DO format the figures with Intl before passing them."
31
+ ]
32
+ }
@@ -0,0 +1,47 @@
1
+ {
2
+ "example": "import { EditorialTextButton } from \"@godxjp/ui/layout\";\n\n<EditorialTextButton onClick={reset}>Reset display preferences</EditorialTextButton>",
3
+ "group": "layout",
4
+ "importPath": "@godxjp/ui/layout",
5
+ "name": "EditorialTextButton",
6
+ "props": [
7
+ {
8
+ "description": "Label.",
9
+ "name": "children",
10
+ "type": "ReactNode"
11
+ },
12
+ {
13
+ "description": "Trailing glyph.",
14
+ "name": "icon",
15
+ "type": "ReactNode"
16
+ },
17
+ {
18
+ "description": "Render the child link as the action.",
19
+ "name": "asChild",
20
+ "type": "boolean"
21
+ },
22
+ {
23
+ "description": "Activation handler.",
24
+ "name": "onClick",
25
+ "type": "() => void"
26
+ },
27
+ {
28
+ "description": "Native disabled.",
29
+ "name": "disabled",
30
+ "type": "boolean"
31
+ }
32
+ ],
33
+ "related": [
34
+ "EditorialTextLink — the bold arrow link of a section head.",
35
+ "Button — actions with weight."
36
+ ],
37
+ "rules": [
38
+ 2,
39
+ 6,
40
+ 44,
41
+ 45
42
+ ],
43
+ "tagline": "An underlined text action in the primary tone (gh#1439): \"Reset display preferences\", \"Your collection →\". A `<button>` by default; `asChild` turns a router link into it; `icon` trails the label. Geometry: `--editorial-text-button-*`.",
44
+ "usage": [
45
+ "DO use it for a quiet secondary action next to copy; a primary action is a Button."
46
+ ]
47
+ }
@@ -0,0 +1,52 @@
1
+ {
2
+ "example": "import { EditorialToggleGroup } from \"@godxjp/ui/layout\";\nimport { Grid2x2, List } from \"lucide-react\";\n\n<EditorialToggleGroup aria-label=\"View\" variant=\"icon\" value={view} onValueChange={setView} items={[{ value: \"grid\", label: \"Grid view\", icon: <Grid2x2 /> }, { value: \"list\", label: \"List view\", icon: <List /> }]} />",
3
+ "group": "layout",
4
+ "importPath": "@godxjp/ui/layout",
5
+ "name": "EditorialToggleGroup",
6
+ "props": [
7
+ {
8
+ "description": "Group name.",
9
+ "name": "aria-label",
10
+ "required": true,
11
+ "type": "string"
12
+ },
13
+ {
14
+ "description": "The toggles; label is the text and the accessible name.",
15
+ "name": "items",
16
+ "required": true,
17
+ "type": "{ value: string; label: string; icon?: ReactNode }[]"
18
+ },
19
+ {
20
+ "description": "Pressed toggle.",
21
+ "name": "value",
22
+ "required": true,
23
+ "type": "string"
24
+ },
25
+ {
26
+ "description": "Change handler.",
27
+ "name": "onValueChange",
28
+ "required": true,
29
+ "type": "(value: string) => void"
30
+ },
31
+ {
32
+ "description": "Labels, or framed icon-only buttons. Default: \"text\".",
33
+ "name": "variant",
34
+ "type": "\"text\" | \"icon\""
35
+ }
36
+ ],
37
+ "related": [
38
+ "Segmented — a track with a lifted slab.",
39
+ "EditorialFilterBar — underlined toggles."
40
+ ],
41
+ "rules": [
42
+ 2,
43
+ 6,
44
+ 44,
45
+ 45
46
+ ],
47
+ "tagline": "One-of-N toggles of the editorial account family (gh#1439): a named `role=\"group\"` of `aria-pressed` buttons. `variant=\"text\"` is a filter row (pressed = filled, bordered); `variant=\"icon\"` a framed icon-only switch such as grid / list view, each button named by its label. Geometry: `--editorial-toggle-group-*`.",
48
+ "usage": [
49
+ "DO use it above a collection to filter it or switch its view; the collection is yours.",
50
+ "DO pass a lucide icon per item for the icon variant — the label stays the button's name."
51
+ ]
52
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "example": "import { Select } from \"@godxjp/ui/data-entry\";\nimport { Button } from \"@godxjp/ui/general\";\nimport { EditorialToggleGroup, EditorialToolbar } from \"@godxjp/ui/layout\";\n\n<EditorialToolbar divider start={<EditorialToggleGroup aria-label=\"Type\" value={type} onValueChange={setType} items={[{ value: \"all\", label: \"All items\" }, { value: \"card\", label: \"Cards\" }]} />} end={<Button>Add an item</Button>} />\n<EditorialToolbar summary={{ count: \"396 results\", note: \"Prices are reference values.\" }} end={<Select aria-label=\"Sort\" value={sort} onValueChange={setSort} options={sorts} />} />",
3
+ "group": "layout",
4
+ "importPath": "@godxjp/ui/layout",
5
+ "name": "EditorialToolbar",
6
+ "props": [
7
+ {
8
+ "description": "Listing summary: result count (announced politely) and a note under it.",
9
+ "name": "summary",
10
+ "type": "{ count?: ReactNode; note?: ReactNode }"
11
+ },
12
+ {
13
+ "description": "Start cluster.",
14
+ "name": "start",
15
+ "type": "ReactNode"
16
+ },
17
+ {
18
+ "description": "End cluster.",
19
+ "name": "end",
20
+ "type": "ReactNode"
21
+ },
22
+ {
23
+ "defaultValue": "false",
24
+ "description": "Hairline under the row.",
25
+ "name": "divider",
26
+ "type": "boolean"
27
+ }
28
+ ],
29
+ "related": [
30
+ "Toolbar — the application filter strip.",
31
+ "EditorialToggleGroup — the toggles it holds.",
32
+ "EditorialFilterPanel — the filters above a listing."
33
+ ],
34
+ "rules": [
35
+ 2,
36
+ 6,
37
+ 44,
38
+ 45
39
+ ],
40
+ "tagline": "The row above a collection (gh#1438, gh#1439): an optional `summary` (result count as a polite live region + a short note), a start cluster (an EditorialToggleGroup filter) and an end cluster (order Select, view switch, primary action), optionally over a hairline (`divider`). With a summary it is a listing row that keeps one line; without one a theme stacks it on a phone with `--editorial-toolbar-display: block`. Geometry: `--editorial-toolbar-*`.",
41
+ "usage": [
42
+ "DO keep the count text short; a phone theme may hide it (--editorial-toolbar-count-display).",
43
+ "DO keep search in its own row below it."
44
+ ]
45
+ }
@@ -0,0 +1,39 @@
1
+ {
2
+ "example": "import { Eyebrow } from \"@godxjp/ui/layout\";\n\n<Eyebrow>THE CURATED SELECTION</Eyebrow>",
3
+ "group": "layout",
4
+ "importPath": "@godxjp/ui/layout",
5
+ "name": "Eyebrow",
6
+ "props": [
7
+ {
8
+ "description": "Kicker text.",
9
+ "name": "children",
10
+ "required": true,
11
+ "type": "ReactNode"
12
+ },
13
+ {
14
+ "defaultValue": "\"ruled\"",
15
+ "description": "With or without the leading rule.",
16
+ "name": "variant",
17
+ "type": "\"ruled\" | \"plain\""
18
+ },
19
+ {
20
+ "defaultValue": "\"p\"",
21
+ "description": "Element.",
22
+ "name": "as",
23
+ "type": "\"p\" | \"span\" | \"div\""
24
+ }
25
+ ],
26
+ "related": [
27
+ "EditorialSectionHead."
28
+ ],
29
+ "rules": [
30
+ 2,
31
+ 6,
32
+ 44,
33
+ 45
34
+ ],
35
+ "tagline": "The small uppercase kicker above an editorial heading (gh#1435), led by a short ornament rule (`variant=\"ruled\"`, default) or bare (`\"plain\"`). Face, size, tracking, colour and rule: `--editorial-eyebrow-*`, `--editorial-kicker-*`, `--editorial-ornament-color`.",
36
+ "usage": [
37
+ "DO use it in the eyebrow slot of EditorialHero / EditorialSectionHead / EditorialBanner."
38
+ ]
39
+ }