@godxjp/ui 33.20.0 → 33.21.0

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 (108) 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/CardShowcase.json +44 -0
  6. package/agent/components/CatalogCard.json +83 -0
  7. package/agent/components/CatalogDetail.json +76 -0
  8. package/agent/components/CatalogDetailSection.json +52 -0
  9. package/agent/components/CatalogDetailTag.json +27 -0
  10. package/agent/components/EditorialArticle.json +53 -0
  11. package/agent/components/EditorialAuth.json +53 -0
  12. package/agent/components/EditorialAuthCard.json +52 -0
  13. package/agent/components/EditorialBanner.json +53 -0
  14. package/agent/components/EditorialBreadcrumb.json +38 -0
  15. package/agent/components/EditorialCard.json +70 -0
  16. package/agent/components/EditorialEmptyPanel.json +57 -0
  17. package/agent/components/EditorialFilterBar.json +51 -0
  18. package/agent/components/EditorialFilterField.json +39 -0
  19. package/agent/components/EditorialFilterPanel.json +46 -0
  20. package/agent/components/EditorialFooter.json +54 -0
  21. package/agent/components/EditorialFootnote.json +36 -0
  22. package/agent/components/EditorialHero.json +52 -0
  23. package/agent/components/EditorialInlineSearch.json +54 -0
  24. package/agent/components/EditorialMasthead.json +52 -0
  25. package/agent/components/EditorialMetaBar.json +37 -0
  26. package/agent/components/EditorialPageHeader.json +73 -0
  27. package/agent/components/EditorialPanel.json +48 -0
  28. package/agent/components/EditorialPillNav.json +41 -0
  29. package/agent/components/EditorialPrompt.json +54 -0
  30. package/agent/components/EditorialSearch.json +112 -0
  31. package/agent/components/EditorialSection.json +68 -0
  32. package/agent/components/EditorialSectionHead.json +62 -0
  33. package/agent/components/EditorialStats.json +32 -0
  34. package/agent/components/EditorialTextButton.json +47 -0
  35. package/agent/components/EditorialToggleGroup.json +52 -0
  36. package/agent/components/EditorialToolbar.json +45 -0
  37. package/agent/components/Eyebrow.json +39 -0
  38. package/agent/components/HoldingCard.json +69 -0
  39. package/agent/components/HoldingCardAction.json +51 -0
  40. package/agent/components/HoldingGrid.json +37 -0
  41. package/agent/components/NumberInput.json +5 -0
  42. package/agent/components/PriceSummary.json +32 -0
  43. package/agent/components/SettingsLayout.json +31 -0
  44. package/agent/components/SettingsPanel.json +53 -0
  45. package/agent/components/ThemePicker.json +54 -0
  46. package/agent/components/TopbarItem.json +5 -0
  47. package/agent/components-index.json +292 -98
  48. package/agent/components.json +2046 -2
  49. package/agent/index.json +7 -7
  50. package/agent/llms.txt +8 -8
  51. package/agent/tokens.json +5637 -135
  52. package/dist/components/data-display/badge.js +4 -2
  53. package/dist/components/data-entry/form-field.js +2 -2
  54. package/dist/components/data-entry/number-input.d.ts +1 -0
  55. package/dist/components/data-entry/number-input.js +8 -0
  56. package/dist/components/data-entry/select.js +24 -2
  57. package/dist/components/general/button.js +7 -0
  58. package/dist/components/general/typography.d.ts +1 -1
  59. package/dist/components/layout/app-shell.d.ts +1 -1
  60. package/dist/components/layout/app-shell.js +28 -2
  61. package/dist/components/layout/centered-shell.js +4 -0
  62. package/dist/components/layout/editorial-account.d.ts +51 -0
  63. package/dist/components/layout/editorial-account.js +466 -0
  64. package/dist/components/layout/editorial-catalog.d.ts +18 -0
  65. package/dist/components/layout/editorial-catalog.js +164 -0
  66. package/dist/components/layout/editorial.d.ts +56 -0
  67. package/dist/components/layout/editorial.js +867 -0
  68. package/dist/components/layout/index.d.ts +6 -0
  69. package/dist/components/layout/index.js +98 -0
  70. package/dist/components/layout/mobile-shell.d.ts +2 -0
  71. package/dist/components/layout/mobile-shell.js +18 -11
  72. package/dist/components/layout/responsive-grid.js +9 -1
  73. package/dist/components/layout/topbar-item.d.ts +1 -0
  74. package/dist/components/layout/topbar-item.js +2 -0
  75. package/dist/contracts/measurement.json +1 -1
  76. package/dist/lib/toast-clearance.js +1 -1
  77. package/dist/props/components/data-entry.prop.d.ts +9 -0
  78. package/dist/props/components/editorial-account.prop.d.ts +249 -0
  79. package/dist/props/components/editorial-account.prop.js +0 -0
  80. package/dist/props/components/general.prop.d.ts +6 -2
  81. package/dist/props/components/layout.prop.d.ts +602 -2
  82. package/dist/props/registry.d.ts +1124 -0
  83. package/dist/props/registry.js +792 -0
  84. package/dist/styles/badge-layout.css +2 -0
  85. package/dist/styles/control.css +58 -12
  86. package/dist/styles/core.css +1 -0
  87. package/dist/styles/data-display-layout.css +9 -3
  88. package/dist/styles/editorial-account-layout.css +1130 -0
  89. package/dist/styles/focus-ring.css +33 -10
  90. package/dist/styles/form-layout.css +8 -1
  91. package/dist/styles/index.css +1 -0
  92. package/dist/styles/layers.json +248 -1
  93. package/dist/styles/layout.css +2022 -0
  94. package/dist/styles/shell-layout.css +100 -2
  95. package/dist/styles/table-layout.css +25 -13
  96. package/dist/styles/text-layout.css +6 -0
  97. package/dist/styles.css +1 -1
  98. package/dist/tokens/base.css +2 -0
  99. package/dist/tokens/components/badge.css +3 -0
  100. package/dist/tokens/components/control.css +9 -0
  101. package/dist/tokens/components/editorial-account.css +393 -0
  102. package/dist/tokens/components/editorial.css +721 -0
  103. package/dist/tokens/components/form.css +4 -0
  104. package/dist/tokens/components/shell.css +23 -0
  105. package/dist/tokens/components/table.css +1 -1
  106. package/docs/TOKENS.md +26 -0
  107. package/package.json +2 -2
  108. package/scripts/ui-audit.mjs +3 -2
@@ -847,6 +847,2031 @@
847
847
  "A chat channel page where a fixed band (channel workflow / pinned-message / connection status) must sit between the page header and the scrolling transcript — `toolbar={<Toolbar>…</Toolbar>}` with `fill` + `footer={<ChatComposer />}` (@godxjp/chat) + `stickyFooter`. The band is outside the scroller, so the transcript never travels under it and the composer stays pinned; a collection page uses the same slot for its filter strip above a full-bleed DataTable (`variant='flush'`)."
848
848
  ]
849
849
  },
850
+ {
851
+ "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>",
852
+ "group": "layout",
853
+ "importPath": "@godxjp/ui/layout",
854
+ "name": "EditorialSection",
855
+ "props": [
856
+ {
857
+ "description": "Band content, already in the landing column.",
858
+ "name": "children",
859
+ "required": true,
860
+ "type": "ReactNode"
861
+ },
862
+ {
863
+ "defaultValue": "\"default\"",
864
+ "description": "Ground: page canvas, card surface, muted, or the hero wash.",
865
+ "name": "tone",
866
+ "type": "\"default\" | \"surface\" | \"subtle\" | \"hero\""
867
+ },
868
+ {
869
+ "defaultValue": "\"none\"",
870
+ "description": "Hairlines on the block edges.",
871
+ "name": "divider",
872
+ "type": "\"none\" | \"end\" | \"both\""
873
+ },
874
+ {
875
+ "defaultValue": "\"none\"",
876
+ "description": "Section rhythm as block padding.",
877
+ "name": "spacing",
878
+ "type": "\"none\" | \"section\""
879
+ },
880
+ {
881
+ "defaultValue": "\"section\"",
882
+ "description": "Landmark element.",
883
+ "name": "as",
884
+ "type": "\"section\" | \"div\" | \"nav\""
885
+ },
886
+ {
887
+ "description": "Landmark name.",
888
+ "name": "aria-label",
889
+ "type": "string"
890
+ },
891
+ {
892
+ "description": "Landmark name reference (the section head's titleId).",
893
+ "name": "aria-labelledby",
894
+ "type": "string"
895
+ },
896
+ {
897
+ "description": "Id on the band.",
898
+ "name": "id",
899
+ "type": "string"
900
+ }
901
+ ],
902
+ "related": [
903
+ "CenteredShell — `flow=\"sections\"`.",
904
+ "EditorialHero, EditorialSectionHead — what goes inside."
905
+ ],
906
+ "rules": [
907
+ 2,
908
+ 6,
909
+ 44,
910
+ 45
911
+ ],
912
+ "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-*`.",
913
+ "usage": [
914
+ "DO stack bands directly in a `flow=\"sections\"` shell — the shell drops its column cap, gap and main padding for them.",
915
+ "DO NOT nest a band inside a capped column: it cannot reach the edges there."
916
+ ]
917
+ },
918
+ {
919
+ "example": "import { EditorialHero, EditorialSection, EditorialSearch, Eyebrow } from \"@godxjp/ui/layout\";\n\n<EditorialSection tone=\"hero\" divider=\"end\">\n <EditorialHero\n eyebrow={<Eyebrow>FOR EVERY CARD, EVERY COLLECTOR.</Eyebrow>}\n title=\"Discover. Compare.\"\n description=\"Your next favourite card.\"\n search={<EditorialSearch label=\"Card name or number\" submitLabel=\"Search\" onSearch={go} />}\n />\n</EditorialSection>",
920
+ "group": "layout",
921
+ "importPath": "@godxjp/ui/layout",
922
+ "name": "EditorialHero",
923
+ "props": [
924
+ {
925
+ "description": "The h1. Emphasise a second line with `<Text tone=\"brand\" size=\"inherit\">`.",
926
+ "name": "title",
927
+ "required": true,
928
+ "type": "ReactNode"
929
+ },
930
+ {
931
+ "description": "Kicker above the title (an Eyebrow).",
932
+ "name": "eyebrow",
933
+ "type": "ReactNode"
934
+ },
935
+ {
936
+ "description": "Lead paragraph.",
937
+ "name": "description",
938
+ "type": "ReactNode"
939
+ },
940
+ {
941
+ "description": "The search (an EditorialSearch).",
942
+ "name": "search",
943
+ "type": "ReactNode"
944
+ },
945
+ {
946
+ "description": "Suggested-query links under the search (plain links; the slot styles them).",
947
+ "name": "footer",
948
+ "type": "ReactNode"
949
+ },
950
+ {
951
+ "description": "Media column (a CardShowcase preset=\"fan\").",
952
+ "name": "media",
953
+ "type": "ReactNode"
954
+ }
955
+ ],
956
+ "related": [
957
+ "EditorialSearch, CardShowcase, Eyebrow."
958
+ ],
959
+ "rules": [
960
+ 2,
961
+ 6,
962
+ 44,
963
+ 45
964
+ ],
965
+ "tagline": "The opening of an editorial page (gh#1435): a copy column — kicker, the page's one h1, a lead, a search and a line of suggested queries — beside a media column. Put it in `EditorialSection tone=\"hero\" divider=\"end\"`. Geometry: `--editorial-hero-*` (tracks, min-height, h1 size/leading/tracking and every gap).",
966
+ "usage": [
967
+ "DO keep it the page's only h1."
968
+ ]
969
+ },
970
+ {
971
+ "example": "import { Eyebrow } from \"@godxjp/ui/layout\";\n\n<Eyebrow>THE CURATED SELECTION</Eyebrow>",
972
+ "group": "layout",
973
+ "importPath": "@godxjp/ui/layout",
974
+ "name": "Eyebrow",
975
+ "props": [
976
+ {
977
+ "description": "Kicker text.",
978
+ "name": "children",
979
+ "required": true,
980
+ "type": "ReactNode"
981
+ },
982
+ {
983
+ "defaultValue": "\"ruled\"",
984
+ "description": "With or without the leading rule.",
985
+ "name": "variant",
986
+ "type": "\"ruled\" | \"plain\""
987
+ },
988
+ {
989
+ "defaultValue": "\"p\"",
990
+ "description": "Element.",
991
+ "name": "as",
992
+ "type": "\"p\" | \"span\" | \"div\""
993
+ }
994
+ ],
995
+ "related": [
996
+ "EditorialSectionHead."
997
+ ],
998
+ "rules": [
999
+ 2,
1000
+ 6,
1001
+ 44,
1002
+ 45
1003
+ ],
1004
+ "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`.",
1005
+ "usage": [
1006
+ "DO use it in the eyebrow slot of EditorialHero / EditorialSectionHead / EditorialBanner."
1007
+ ]
1008
+ },
1009
+ {
1010
+ "example": "import { EditorialBreadcrumb, EditorialSection } from \"@godxjp/ui/layout\";\n\n<EditorialSection>\n <EditorialBreadcrumb items={[{ label: \"Home\", to: \"/\" }, { label: \"Journal\", to: \"/journal/\" }, { label: \"Price guide\" }]} />\n</EditorialSection>",
1011
+ "group": "layout",
1012
+ "importPath": "@godxjp/ui/layout",
1013
+ "name": "EditorialBreadcrumb",
1014
+ "props": [
1015
+ {
1016
+ "description": "Trail, root first; the last item is the current page.",
1017
+ "name": "items",
1018
+ "required": true,
1019
+ "type": "BreadcrumbItemProp[]"
1020
+ },
1021
+ {
1022
+ "description": "Router link for ancestors.",
1023
+ "name": "linkComponent",
1024
+ "type": "ElementType"
1025
+ },
1026
+ {
1027
+ "description": "Name of the nav landmark.",
1028
+ "name": "ariaLabel",
1029
+ "type": "string"
1030
+ }
1031
+ ],
1032
+ "related": [
1033
+ "EditorialPageHeader, Breadcrumb."
1034
+ ],
1035
+ "rules": [
1036
+ 2,
1037
+ 6,
1038
+ 44,
1039
+ 45
1040
+ ],
1041
+ "tagline": "The trail at the top of an editorial page (gh#1437): `Breadcrumb` (same `<nav>`/`<ol>`, `aria-current` on the last item, router `linkComponent`) with the editorial rhythm — top inset, gap and line height from `--editorial-breadcrumb-*`. Use it alone above a reader page; `EditorialPageHeader` renders it for a listing page.",
1042
+ "usage": [
1043
+ "DO put it first in an EditorialSection of a `flow=\"sections\"` page.",
1044
+ "DON'T nest it in a PageContainer — that page shell has its own trail."
1045
+ ]
1046
+ },
1047
+ {
1048
+ "example": "import { EditorialArticle, EditorialArticleSection, EditorialNote, Eyebrow } from \"@godxjp/ui/layout\";\n\n<EditorialArticle eyebrow={<Eyebrow>PRICE GUIDE</Eyebrow>} title=\"A fair comparison starts with the details.\" intro=\"A matching card name is only the beginning.\">\n <EditorialArticleSection title=\"Check it is the same card\" paragraphs={[\"Confirm the game, card number and set.\"]} />\n <EditorialNote>An original guide, not a price forecast.</EditorialNote>\n</EditorialArticle>",
1049
+ "group": "layout",
1050
+ "importPath": "@godxjp/ui/layout",
1051
+ "name": "EditorialArticle",
1052
+ "props": [
1053
+ {
1054
+ "description": "The page's h1.",
1055
+ "name": "title",
1056
+ "required": true,
1057
+ "type": "ReactNode"
1058
+ },
1059
+ {
1060
+ "description": "Kicker above it (an Eyebrow).",
1061
+ "name": "eyebrow",
1062
+ "type": "ReactNode"
1063
+ },
1064
+ {
1065
+ "description": "Lead paragraph under it.",
1066
+ "name": "intro",
1067
+ "type": "ReactNode"
1068
+ },
1069
+ {
1070
+ "description": "Sections, note, link.",
1071
+ "name": "children",
1072
+ "type": "ReactNode"
1073
+ },
1074
+ {
1075
+ "description": "Id on the h1.",
1076
+ "name": "titleId",
1077
+ "type": "string"
1078
+ }
1079
+ ],
1080
+ "related": [
1081
+ "EditorialBreadcrumb, EditorialTextLink, LegalDocumentShell."
1082
+ ],
1083
+ "rules": [
1084
+ 2,
1085
+ 6,
1086
+ 44,
1087
+ 45
1088
+ ],
1089
+ "subParts": [
1090
+ "EditorialArticleSection",
1091
+ "EditorialNote"
1092
+ ],
1093
+ "tagline": "The reading column of a long-form editorial page (gh#1440): the ruled kicker, the page's one h1, an intro set off by a rule, then `EditorialArticleSection`s (an h2 and paragraphs at the reading leading), an `EditorialNote` and a trailing `EditorialTextLink`. Block flow with collapsing margins, so the design's rhythm holds. Geometry: `--editorial-article-*`, `--editorial-note-*`.",
1094
+ "usage": [
1095
+ "DO put it in an EditorialSection after an EditorialBreadcrumb on a `flow=\"sections\"` page.",
1096
+ "DO pass each prose paragraph in `EditorialArticleSection paragraphs`, not raw `<p>`.",
1097
+ "DON'T use it for a versioned legal/admin document — that is LegalDocumentShell."
1098
+ ]
1099
+ },
1100
+ {
1101
+ "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>",
1102
+ "group": "layout",
1103
+ "importPath": "@godxjp/ui/layout",
1104
+ "name": "EditorialPanel",
1105
+ "props": [
1106
+ {
1107
+ "description": "The heading.",
1108
+ "name": "title",
1109
+ "required": true,
1110
+ "type": "ReactNode"
1111
+ },
1112
+ {
1113
+ "description": "Short tag above it.",
1114
+ "name": "tag",
1115
+ "type": "ReactNode"
1116
+ },
1117
+ {
1118
+ "description": "List items.",
1119
+ "name": "items",
1120
+ "type": "ReactNode[]"
1121
+ },
1122
+ {
1123
+ "description": "Anything after the list.",
1124
+ "name": "children",
1125
+ "type": "ReactNode"
1126
+ },
1127
+ {
1128
+ "defaultValue": "2",
1129
+ "description": "Heading level.",
1130
+ "name": "level",
1131
+ "type": "2 | 3"
1132
+ }
1133
+ ],
1134
+ "related": [
1135
+ "ResponsiveGrid — `preset=\"panels\"`."
1136
+ ],
1137
+ "rules": [
1138
+ 2,
1139
+ 6,
1140
+ 44,
1141
+ 45
1142
+ ],
1143
+ "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-*`.",
1144
+ "usage": [
1145
+ "DO lay a row of panels out with `ResponsiveGrid preset=\"panels\"`."
1146
+ ]
1147
+ },
1148
+ {
1149
+ "example": "import { EditorialPageHeader, EditorialSection, Eyebrow } from \"@godxjp/ui/layout\";\n\n<EditorialSection>\n <EditorialPageHeader\n breadcrumb={[{ label: \"Home\", to: \"/\" }, { label: \"Journal\" }]}\n eyebrow={<Eyebrow>THE TCG-M JOURNAL</Eyebrow>}\n title=\"A little knowledge. More enjoyment.\"\n description=\"A few helpful perspectives for finding, comparing and collecting.\"\n />\n</EditorialSection>",
1150
+ "group": "layout",
1151
+ "importPath": "@godxjp/ui/layout",
1152
+ "name": "EditorialPageHeader",
1153
+ "props": [
1154
+ {
1155
+ "description": "The page's h1.",
1156
+ "name": "title",
1157
+ "required": true,
1158
+ "type": "ReactNode"
1159
+ },
1160
+ {
1161
+ "description": "Trail above the header.",
1162
+ "name": "breadcrumb",
1163
+ "type": "BreadcrumbItemProp[]"
1164
+ },
1165
+ {
1166
+ "description": "Router link for the trail.",
1167
+ "name": "linkComponent",
1168
+ "type": "ElementType"
1169
+ },
1170
+ {
1171
+ "description": "Name of the trail's nav.",
1172
+ "name": "breadcrumbLabel",
1173
+ "type": "string"
1174
+ },
1175
+ {
1176
+ "description": "Kicker above the title (an Eyebrow).",
1177
+ "name": "eyebrow",
1178
+ "type": "ReactNode"
1179
+ },
1180
+ {
1181
+ "description": "One lead line under it.",
1182
+ "name": "description",
1183
+ "type": "ReactNode"
1184
+ },
1185
+ {
1186
+ "description": "Action at the end of the title row.",
1187
+ "name": "actions",
1188
+ "type": "ReactNode"
1189
+ },
1190
+ {
1191
+ "description": "Search under the description (an EditorialSearch).",
1192
+ "name": "search",
1193
+ "type": "ReactNode"
1194
+ },
1195
+ {
1196
+ "description": "Id on the h1.",
1197
+ "name": "titleId",
1198
+ "type": "string"
1199
+ },
1200
+ {
1201
+ "description": "Kicker from the page-header knobs, or the plain accent Eyebrow (gh#1439). Default: \"page\".",
1202
+ "name": "eyebrowTone",
1203
+ "type": "\"page\" | \"accent\""
1204
+ }
1205
+ ],
1206
+ "related": [
1207
+ "EditorialBreadcrumb, Eyebrow, EditorialSection."
1208
+ ],
1209
+ "rules": [
1210
+ 2,
1211
+ 6,
1212
+ 44,
1213
+ 45
1214
+ ],
1215
+ "tagline": "The intro of an editorial listing page (gh#1437): an optional `EditorialBreadcrumb`, then the ruled kicker, the page's one h1, one lead line, and an action at the end of the title row. Geometry: `--editorial-page-header-*` (block padding, title size/leading/margins, lead size/measure, kicker size/colour, row display — `block` stacks the action under the copy on a phone).",
1216
+ "usage": [
1217
+ "DO put it in an EditorialSection on a `flow=\"sections\"` page, so it shares the landing column.",
1218
+ "DON'T also give the page a PageContainer title — the header owns the page's one h1."
1219
+ ]
1220
+ },
1221
+ {
1222
+ "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/>",
1223
+ "group": "layout",
1224
+ "importPath": "@godxjp/ui/layout",
1225
+ "name": "EditorialSectionHead",
1226
+ "props": [
1227
+ {
1228
+ "description": "The heading.",
1229
+ "name": "title",
1230
+ "required": true,
1231
+ "type": "ReactNode"
1232
+ },
1233
+ {
1234
+ "description": "Kicker above it.",
1235
+ "name": "eyebrow",
1236
+ "type": "ReactNode"
1237
+ },
1238
+ {
1239
+ "description": "One line under it.",
1240
+ "name": "description",
1241
+ "type": "ReactNode"
1242
+ },
1243
+ {
1244
+ "description": "Trailing call to action.",
1245
+ "name": "action",
1246
+ "type": "ReactNode"
1247
+ },
1248
+ {
1249
+ "defaultValue": "2",
1250
+ "description": "Heading level.",
1251
+ "name": "level",
1252
+ "type": "2 | 3"
1253
+ },
1254
+ {
1255
+ "defaultValue": "\"section\"",
1256
+ "description": "A module's smaller head (gh#1438).",
1257
+ "name": "scale",
1258
+ "type": "\"section\" | \"module\""
1259
+ },
1260
+ {
1261
+ "description": "Id on the title, for the section's aria-labelledby.",
1262
+ "name": "titleId",
1263
+ "type": "string"
1264
+ }
1265
+ ],
1266
+ "related": [
1267
+ "EditorialSection, EditorialTextLink."
1268
+ ],
1269
+ "rules": [
1270
+ 2,
1271
+ 6,
1272
+ 44,
1273
+ 45
1274
+ ],
1275
+ "subParts": [
1276
+ "EditorialTextLink"
1277
+ ],
1278
+ "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-*`.",
1279
+ "usage": [
1280
+ "DO name the EditorialSection with `aria-labelledby={titleId}`."
1281
+ ]
1282
+ },
1283
+ {
1284
+ "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)} />",
1285
+ "group": "layout",
1286
+ "importPath": "@godxjp/ui/layout",
1287
+ "name": "EditorialSearch",
1288
+ "props": [
1289
+ {
1290
+ "description": "Accessible label (visually hidden).",
1291
+ "name": "label",
1292
+ "required": true,
1293
+ "type": "string"
1294
+ },
1295
+ {
1296
+ "description": "Site search box, or a collection's own row (visible label, live count, no button). Default: \"inset\".",
1297
+ "name": "variant",
1298
+ "type": "\"inset\" | \"inline\""
1299
+ },
1300
+ {
1301
+ "description": "Button text (inset; required there).",
1302
+ "name": "submitLabel",
1303
+ "type": "ReactNode"
1304
+ },
1305
+ {
1306
+ "description": "inline: live count at the end of the row.",
1307
+ "name": "count",
1308
+ "type": "ReactNode"
1309
+ },
1310
+ {
1311
+ "description": "inline: settle delay (ms). Default: 300.",
1312
+ "name": "debounce",
1313
+ "type": "number"
1314
+ },
1315
+ {
1316
+ "description": "Placeholder.",
1317
+ "name": "placeholder",
1318
+ "type": "string"
1319
+ },
1320
+ {
1321
+ "defaultValue": "\"q\"",
1322
+ "description": "Query parameter.",
1323
+ "name": "name",
1324
+ "type": "string"
1325
+ },
1326
+ {
1327
+ "description": "Initial query.",
1328
+ "name": "defaultValue",
1329
+ "type": "string"
1330
+ },
1331
+ {
1332
+ "description": "Form action for the no-JS submit.",
1333
+ "name": "action",
1334
+ "type": "string"
1335
+ },
1336
+ {
1337
+ "description": "Submit handler.",
1338
+ "name": "onSearch",
1339
+ "type": "(query: string) => void"
1340
+ },
1341
+ {
1342
+ "description": "A scope control at the start of the box — the kit Select (borderless, width auto) with its own aria-label and name.",
1343
+ "name": "scope",
1344
+ "type": "ReactNode"
1345
+ },
1346
+ {
1347
+ "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.",
1348
+ "name": "suggestions",
1349
+ "type": "EditorialSearchSuggestionGroupProp[]"
1350
+ },
1351
+ {
1352
+ "description": "inset: the popup's last row — all results.",
1353
+ "name": "suggestionsFooter",
1354
+ "type": "{ href: string; label: ReactNode }"
1355
+ },
1356
+ {
1357
+ "description": "inset: accessible name of the listbox (default: label).",
1358
+ "name": "suggestionsLabel",
1359
+ "type": "string"
1360
+ },
1361
+ {
1362
+ "description": "inset: field text after each edit; never mid-IME-composition, once on compositionend.",
1363
+ "name": "onQueryChange",
1364
+ "type": "(query: string) => void"
1365
+ },
1366
+ {
1367
+ "description": "inset: the element suggestion rows render as (a router Link). Default \"a\".",
1368
+ "name": "linkComponent",
1369
+ "type": "ElementType"
1370
+ },
1371
+ {
1372
+ "description": "Field id.",
1373
+ "name": "id",
1374
+ "type": "string"
1375
+ }
1376
+ ],
1377
+ "related": [
1378
+ "SearchInput — a debounced filter field.",
1379
+ "EditorialHero — the `search` slot."
1380
+ ],
1381
+ "rules": [
1382
+ 2,
1383
+ 6,
1384
+ 44,
1385
+ 45
1386
+ ],
1387
+ "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-*`.",
1388
+ "usage": [
1389
+ "DO use it for a site search that submits; use SearchInput for a live filter.",
1390
+ "DO use variant=\"inline\" for a collection's own search row (visible label, live count) — gh#1439.",
1391
+ "DO fetch suggestions yourself (debounce, abort, cache) from onQueryChange and pass the rows in; the kit neither debounces nor fetches (gh#1447).",
1392
+ "DON'T put buttons or other controls in a suggestion row — each row is one link (role=option)."
1393
+ ]
1394
+ },
1395
+ {
1396
+ "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>",
1397
+ "group": "layout",
1398
+ "importPath": "@godxjp/ui/layout",
1399
+ "name": "EditorialPillNav",
1400
+ "props": [
1401
+ {
1402
+ "description": "Landmark name.",
1403
+ "name": "aria-label",
1404
+ "required": true,
1405
+ "type": "string"
1406
+ },
1407
+ {
1408
+ "description": "EditorialPillNavItem elements.",
1409
+ "name": "children",
1410
+ "required": true,
1411
+ "type": "ReactNode"
1412
+ },
1413
+ {
1414
+ "description": "Visible lead text (aria-hidden; the landmark is named).",
1415
+ "name": "label",
1416
+ "type": "ReactNode"
1417
+ }
1418
+ ],
1419
+ "related": [
1420
+ "EditorialSection."
1421
+ ],
1422
+ "rules": [
1423
+ 2,
1424
+ 6,
1425
+ 44,
1426
+ 45
1427
+ ],
1428
+ "subParts": [
1429
+ "EditorialPillNavItem"
1430
+ ],
1431
+ "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-*`.",
1432
+ "usage": [
1433
+ "DO put it in `EditorialSection as=\"div\" tone=\"surface\" divider=\"end\"` for a band under the header."
1434
+ ]
1435
+ },
1436
+ {
1437
+ "example": "import { CardShowcase } from \"@godxjp/ui/layout\";\n\n<CardShowcase preset=\"fan\" label=\"ONE PLACE. MANY WORLDS.\" caption={{ overline: \"A whole world in your hands.\", title: \"Find your next favourite.\" }} items={cards.map((c) => <a key={c.id} href={c.href} aria-label={c.name}><img src={c.image} alt={c.name} /></a>)} />",
1438
+ "group": "layout",
1439
+ "importPath": "@godxjp/ui/layout",
1440
+ "name": "CardShowcase",
1441
+ "props": [
1442
+ {
1443
+ "description": "Composition.",
1444
+ "name": "preset",
1445
+ "required": true,
1446
+ "type": "\"fan\" | \"binder\""
1447
+ },
1448
+ {
1449
+ "description": "Pictures in reading order (links wrapping an img, or imgs).",
1450
+ "name": "items",
1451
+ "required": true,
1452
+ "type": "ReactNode[]"
1453
+ },
1454
+ {
1455
+ "description": "fan: corner label.",
1456
+ "name": "label",
1457
+ "type": "ReactNode"
1458
+ },
1459
+ {
1460
+ "description": "fan: caption card.",
1461
+ "name": "caption",
1462
+ "type": "{ icon?: ReactNode; overline?: ReactNode; title: ReactNode }"
1463
+ }
1464
+ ],
1465
+ "related": [
1466
+ "EditorialHero — the `media` slot.",
1467
+ "EditorialBanner — the `media` slot (binder)."
1468
+ ],
1469
+ "rules": [
1470
+ 2,
1471
+ 6,
1472
+ 44,
1473
+ 45
1474
+ ],
1475
+ "tagline": "A staged composition of product pictures (gh#1435). `preset=\"fan\"`: three cards fanned (start, centre, end) over ornament orbits, stars and a glow, with a corner `label` and a `caption` card. `preset=\"binder\"`: a tilted binder page of up to six pockets. Decorations are aria-hidden; each item keeps its own accessible name. Geometry: `--editorial-showcase-*`, `--editorial-binder-*`.",
1476
+ "usage": [
1477
+ "DO give each linked picture an accessible name; the stage itself is decoration."
1478
+ ]
1479
+ },
1480
+ {
1481
+ "example": "import { CardShowcase, EditorialBanner, Eyebrow } from \"@godxjp/ui/layout\";\nimport { Button } from \"@godxjp/ui/general\";\n\n<EditorialBanner eyebrow={<Eyebrow>YOUR COLLECTION HAS A STORY.</Eyebrow>} title=\"A home for the cards that matter.\" action={<Button asChild><a href=\"/collection/\">Start your collection</a></Button>} media={<CardShowcase preset=\"binder\" items={pockets} />} />",
1482
+ "group": "layout",
1483
+ "importPath": "@godxjp/ui/layout",
1484
+ "name": "EditorialBanner",
1485
+ "props": [
1486
+ {
1487
+ "description": "The heading.",
1488
+ "name": "title",
1489
+ "required": true,
1490
+ "type": "ReactNode"
1491
+ },
1492
+ {
1493
+ "description": "Kicker.",
1494
+ "name": "eyebrow",
1495
+ "type": "ReactNode"
1496
+ },
1497
+ {
1498
+ "description": "Paragraph.",
1499
+ "name": "description",
1500
+ "type": "ReactNode"
1501
+ },
1502
+ {
1503
+ "description": "Call to action (a kit Button).",
1504
+ "name": "action",
1505
+ "type": "ReactNode"
1506
+ },
1507
+ {
1508
+ "description": "Media column (a CardShowcase preset=\"binder\").",
1509
+ "name": "media",
1510
+ "type": "ReactNode"
1511
+ },
1512
+ {
1513
+ "defaultValue": "2",
1514
+ "description": "Heading level.",
1515
+ "name": "level",
1516
+ "type": "2 | 3"
1517
+ }
1518
+ ],
1519
+ "related": [
1520
+ "CardShowcase."
1521
+ ],
1522
+ "rules": [
1523
+ 2,
1524
+ 6,
1525
+ 44,
1526
+ 45
1527
+ ],
1528
+ "tagline": "A rounded brand panel inside the column (gh#1435): kicker, title, description and a call to action beside a media slot, in the inverse palette. The kit Button in `action` is re-pointed to the inverse roles. Colours and geometry: `--editorial-banner-*`.",
1529
+ "usage": [
1530
+ "DO put it in an EditorialSection with spacing=\"section\"."
1531
+ ]
1532
+ },
1533
+ {
1534
+ "example": "import { CatalogCard, CatalogCardTag } from \"@godxjp/ui/layout\";\n\n<CatalogCard media={<a href={href} tabIndex={-1} aria-hidden><img src={img} alt=\"\" /></a>} favorite={{ pressed: saved, onPressedChange: setSaved, label: saveLabel }} overline=\"Pokémon\" title={<a href={href}>{name}</a>} meta={<><span>132/106</span><CatalogCardTag>SAR</CatalogCardTag></>} price=\"¥12,800\" change=\"↓ −4.2%\" />",
1535
+ "group": "layout",
1536
+ "importPath": "@godxjp/ui/layout",
1537
+ "name": "CatalogCard",
1538
+ "props": [
1539
+ {
1540
+ "description": "The picture (a link, tabIndex -1 + aria-hidden, wrapping an img).",
1541
+ "name": "media",
1542
+ "required": true,
1543
+ "type": "ReactNode"
1544
+ },
1545
+ {
1546
+ "description": "The item link.",
1547
+ "name": "title",
1548
+ "required": true,
1549
+ "type": "ReactNode"
1550
+ },
1551
+ {
1552
+ "defaultValue": "\"card\"",
1553
+ "description": "Picture frame.",
1554
+ "name": "variant",
1555
+ "type": "\"card\" | \"sealed\""
1556
+ },
1557
+ {
1558
+ "description": "Overlaid toggle; disabled while the saved state is loading.",
1559
+ "name": "favorite",
1560
+ "type": "{ pressed: boolean; onPressedChange: (pressed: boolean) => void; label: string; disabled?: boolean }"
1561
+ },
1562
+ {
1563
+ "description": "Line above the title.",
1564
+ "name": "overline",
1565
+ "type": "ReactNode"
1566
+ },
1567
+ {
1568
+ "defaultValue": "3",
1569
+ "description": "Heading level.",
1570
+ "name": "level",
1571
+ "type": "2 | 3 | 4"
1572
+ },
1573
+ {
1574
+ "description": "Metadata row.",
1575
+ "name": "meta",
1576
+ "type": "ReactNode"
1577
+ },
1578
+ {
1579
+ "description": "Price caption.",
1580
+ "name": "priceLabel",
1581
+ "type": "ReactNode"
1582
+ },
1583
+ {
1584
+ "description": "Price figure.",
1585
+ "name": "price",
1586
+ "type": "ReactNode"
1587
+ },
1588
+ {
1589
+ "description": "Price change.",
1590
+ "name": "change",
1591
+ "type": "ReactNode"
1592
+ },
1593
+ {
1594
+ "description": "Bottom row (links inside get the row's link style).",
1595
+ "name": "footer",
1596
+ "type": "ReactNode"
1597
+ }
1598
+ ],
1599
+ "related": [
1600
+ "ResponsiveGrid — `preset=\"catalog\"`."
1601
+ ],
1602
+ "rules": [
1603
+ 2,
1604
+ 6,
1605
+ 44,
1606
+ 45
1607
+ ],
1608
+ "subParts": [
1609
+ "CatalogCardTag"
1610
+ ],
1611
+ "tagline": "A catalog tile (gh#1435): the framed picture with an overlaid circular favourite toggle, then an overline, the title (a heading wrapping the item link, clamped to two lines), a metadata row with `CatalogCardTag`s, a price caption and line (price + change), and a footer row. `variant=\"sealed\"` frames a wider, unshadowed product picture. Geometry: `--editorial-catalog-card-*`.",
1612
+ "usage": [
1613
+ "DO lay tiles out with `ResponsiveGrid preset=\"catalog\"`."
1614
+ ]
1615
+ },
1616
+ {
1617
+ "example": "import { EditorialCard } from \"@godxjp/ui/layout\";\n\n<EditorialCard variant=\"journal\" link={<a href=\"/journal/price-guide/\" />} media={<img src={cover} alt=\"\" />} overline=\"Price guide\" title=\"Why the same card has different prices.\" description=\"Condition, language and edition all move the price.\" action=\"Read the story\" />",
1618
+ "group": "layout",
1619
+ "importPath": "@godxjp/ui/layout",
1620
+ "name": "EditorialCard",
1621
+ "props": [
1622
+ {
1623
+ "description": "Shape.",
1624
+ "name": "variant",
1625
+ "required": true,
1626
+ "type": "\"journal\" | \"spotlight\""
1627
+ },
1628
+ {
1629
+ "description": "The link element the card renders into.",
1630
+ "name": "link",
1631
+ "required": true,
1632
+ "type": "ReactElement"
1633
+ },
1634
+ {
1635
+ "description": "The heading.",
1636
+ "name": "title",
1637
+ "required": true,
1638
+ "type": "ReactNode"
1639
+ },
1640
+ {
1641
+ "description": "Cover (journal) or picture (spotlight).",
1642
+ "name": "media",
1643
+ "type": "ReactNode"
1644
+ },
1645
+ {
1646
+ "description": "Category (journal) or kicker (spotlight).",
1647
+ "name": "overline",
1648
+ "type": "ReactNode"
1649
+ },
1650
+ {
1651
+ "description": "Lines under the title.",
1652
+ "name": "description",
1653
+ "type": "ReactNode"
1654
+ },
1655
+ {
1656
+ "description": "journal: footer call to action.",
1657
+ "name": "action",
1658
+ "type": "ReactNode"
1659
+ },
1660
+ {
1661
+ "defaultValue": "3",
1662
+ "description": "Heading level.",
1663
+ "name": "level",
1664
+ "type": "2 | 3 | 4"
1665
+ },
1666
+ {
1667
+ "description": "Title id (generated when omitted).",
1668
+ "name": "titleId",
1669
+ "type": "string"
1670
+ }
1671
+ ],
1672
+ "related": [
1673
+ "ResponsiveGrid — `preset=\"trio\"`."
1674
+ ],
1675
+ "rules": [
1676
+ 2,
1677
+ 6,
1678
+ 44,
1679
+ 45
1680
+ ],
1681
+ "tagline": "A whole-card link (gh#1435). `variant=\"journal\"`: an edge-to-edge cover, category, title, two lines of description and a footer with a circled arrow; the link is named by its title (aria-labelledby). `variant=\"spotlight\"`: kicker, title and a line beside a tilted picture. Pass the link element (router Link or `<a href>`) as `link`; the card content is rendered into it. Geometry: `--editorial-journal-*`, `--editorial-spotlight-*`.",
1682
+ "usage": [
1683
+ "DO lay journal cards out with `ResponsiveGrid preset=\"trio\"`."
1684
+ ]
1685
+ },
1686
+ {
1687
+ "example": "import { EditorialMasthead, EditorialMastheadAction, EditorialMastheadLink } from \"@godxjp/ui/layout\";\nimport { Moon } from \"lucide-react\";\n\n<EditorialMasthead\n brand={<a href=\"/\" aria-label=\"Home\"><img src=\"/logo.svg\" alt=\"\" /></a>}\n navLabel=\"Main navigation\"\n nav={<EditorialMastheadLink href=\"/cards/\" aria-current=\"page\">Cards</EditorialMastheadLink>}\n actions={<EditorialMastheadAction aria-label=\"Toggle colour theme\"><Moon aria-hidden /></EditorialMastheadAction>}\n/>",
1688
+ "group": "layout",
1689
+ "importPath": "@godxjp/ui/layout",
1690
+ "name": "EditorialMasthead",
1691
+ "props": [
1692
+ {
1693
+ "description": "The logo link.",
1694
+ "name": "brand",
1695
+ "required": true,
1696
+ "type": "ReactNode"
1697
+ },
1698
+ {
1699
+ "description": "Primary navigation links.",
1700
+ "name": "nav",
1701
+ "type": "ReactNode"
1702
+ },
1703
+ {
1704
+ "description": "Navigation landmark name.",
1705
+ "name": "navLabel",
1706
+ "type": "string"
1707
+ },
1708
+ {
1709
+ "description": "End actions.",
1710
+ "name": "actions",
1711
+ "type": "ReactNode"
1712
+ },
1713
+ {
1714
+ "description": "Phone-only menu trigger (a Sheet trigger).",
1715
+ "name": "menu",
1716
+ "type": "ReactNode"
1717
+ }
1718
+ ],
1719
+ "related": [
1720
+ "CenteredShell — `topbar`.",
1721
+ "Sheet + NavList — the phone menu."
1722
+ ],
1723
+ "rules": [
1724
+ 2,
1725
+ 6,
1726
+ 44,
1727
+ 45
1728
+ ],
1729
+ "subParts": [
1730
+ "EditorialMastheadLink",
1731
+ "EditorialMastheadAction"
1732
+ ],
1733
+ "tagline": "A public site's header row (gh#1435) for CenteredShell's `topbar` slot: the logo, primary navigation (`EditorialMastheadLink`; `aria-current=\"page\"` underlines the current one) and end actions (the kit `Select variant=\"borderless\" width=\"auto\"` for the interface language or the display currency — the masthead sizes its trigger, `EditorialMastheadAction` 44px icon controls, `variant=\"outline\"` for the account). The bar holding it turns sticky and translucent. `menu` is the phone-only trigger shown when the theme hides `nav`. Geometry: `--editorial-masthead-*`.",
1734
+ "usage": [
1735
+ "DO pass it as CenteredShell `topbar`; the bar becomes sticky with a blur."
1736
+ ]
1737
+ },
1738
+ {
1739
+ "example": "import { EditorialFooter } from \"@godxjp/ui/layout\";\n\n<EditorialFooter brand={<a href=\"/\" aria-label=\"Home\"><img src=\"/logo.svg\" alt=\"\" /></a>} tagline=\"Discover. Compare.\" groups={[{ title: \"DISCOVER\", links: [<a key=\"c\" href=\"/cards/\">Cards</a>] }]} legal=\"© 2026 TCG-M.\" />",
1740
+ "group": "layout",
1741
+ "importPath": "@godxjp/ui/layout",
1742
+ "name": "EditorialFooter",
1743
+ "props": [
1744
+ {
1745
+ "description": "The logo link.",
1746
+ "name": "brand",
1747
+ "required": true,
1748
+ "type": "ReactNode"
1749
+ },
1750
+ {
1751
+ "description": "Link groups.",
1752
+ "name": "groups",
1753
+ "required": true,
1754
+ "type": "{ title: ReactNode; links: ReactNode[] }[]"
1755
+ },
1756
+ {
1757
+ "description": "Line under the logo.",
1758
+ "name": "tagline",
1759
+ "type": "ReactNode"
1760
+ },
1761
+ {
1762
+ "defaultValue": "2",
1763
+ "description": "Heading level of the group titles.",
1764
+ "name": "level",
1765
+ "type": "2 | 3"
1766
+ },
1767
+ {
1768
+ "description": "Rights line.",
1769
+ "name": "legal",
1770
+ "type": "ReactNode"
1771
+ },
1772
+ {
1773
+ "description": "Note paragraph.",
1774
+ "name": "note",
1775
+ "type": "ReactNode"
1776
+ }
1777
+ ],
1778
+ "related": [
1779
+ "CenteredShell — `footer`, `footerTone=\"inverse\"`."
1780
+ ],
1781
+ "rules": [
1782
+ 2,
1783
+ 6,
1784
+ 44,
1785
+ 45
1786
+ ],
1787
+ "tagline": "A public site's footer content (gh#1435) for `CenteredShell footerTone=\"inverse\"`: logo and tagline, link groups (a heading + links each), and a bottom row with the rights line and a note. The footer holding it takes the editorial spacing. Geometry and colours: `--editorial-footer-*`.",
1788
+ "usage": [
1789
+ "DO pass plain links in each group; the footer styles them."
1790
+ ]
1791
+ },
1792
+ {
1793
+ "example": "import { EditorialFilterBar } from \"@godxjp/ui/layout\";\n\n<EditorialFilterBar aria-label=\"Selection\" value={tab} onValueChange={setTab} options={[{ value: \"all\", label: \"Selected cards\" }, { value: \"down\", label: \"Price drops\" }]} extra=\"vs. 30 days ago\" />",
1794
+ "group": "layout",
1795
+ "importPath": "@godxjp/ui/layout",
1796
+ "name": "EditorialFilterBar",
1797
+ "props": [
1798
+ {
1799
+ "description": "Group name.",
1800
+ "name": "aria-label",
1801
+ "required": true,
1802
+ "type": "string"
1803
+ },
1804
+ {
1805
+ "description": "The toggles.",
1806
+ "name": "options",
1807
+ "required": true,
1808
+ "type": "{ value: string; label: ReactNode }[]"
1809
+ },
1810
+ {
1811
+ "description": "Pressed toggle.",
1812
+ "name": "value",
1813
+ "required": true,
1814
+ "type": "string"
1815
+ },
1816
+ {
1817
+ "description": "Change handler.",
1818
+ "name": "onValueChange",
1819
+ "required": true,
1820
+ "type": "(value: string) => void"
1821
+ },
1822
+ {
1823
+ "description": "Trailing note.",
1824
+ "name": "extra",
1825
+ "type": "ReactNode"
1826
+ }
1827
+ ],
1828
+ "related": [
1829
+ "Tabs — panels.",
1830
+ "Segmented — a compact single choice."
1831
+ ],
1832
+ "rules": [
1833
+ 2,
1834
+ 6,
1835
+ 44,
1836
+ 45
1837
+ ],
1838
+ "tagline": "A row of underlined filter toggles above a collection (gh#1435): a named `role=\"group\"` of `aria-pressed` buttons (one pressed at a time) and a trailing note, over a hairline. The collection below is the consumer's. Geometry: `--editorial-filter-bar-*`.",
1839
+ "usage": [
1840
+ "DO use Tabs when each option owns a panel; this bar only filters one collection."
1841
+ ]
1842
+ },
1843
+ {
1844
+ "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 /> }]} />",
1845
+ "group": "layout",
1846
+ "importPath": "@godxjp/ui/layout",
1847
+ "name": "EditorialToggleGroup",
1848
+ "props": [
1849
+ {
1850
+ "description": "Group name.",
1851
+ "name": "aria-label",
1852
+ "required": true,
1853
+ "type": "string"
1854
+ },
1855
+ {
1856
+ "description": "The toggles; label is the text and the accessible name.",
1857
+ "name": "items",
1858
+ "required": true,
1859
+ "type": "{ value: string; label: string; icon?: ReactNode }[]"
1860
+ },
1861
+ {
1862
+ "description": "Pressed toggle.",
1863
+ "name": "value",
1864
+ "required": true,
1865
+ "type": "string"
1866
+ },
1867
+ {
1868
+ "description": "Change handler.",
1869
+ "name": "onValueChange",
1870
+ "required": true,
1871
+ "type": "(value: string) => void"
1872
+ },
1873
+ {
1874
+ "description": "Labels, or framed icon-only buttons. Default: \"text\".",
1875
+ "name": "variant",
1876
+ "type": "\"text\" | \"icon\""
1877
+ }
1878
+ ],
1879
+ "related": [
1880
+ "Segmented — a track with a lifted slab.",
1881
+ "EditorialFilterBar — underlined toggles."
1882
+ ],
1883
+ "rules": [
1884
+ 2,
1885
+ 6,
1886
+ 44,
1887
+ 45
1888
+ ],
1889
+ "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-*`.",
1890
+ "usage": [
1891
+ "DO use it above a collection to filter it or switch its view; the collection is yours.",
1892
+ "DO pass a lucide icon per item for the icon variant — the label stays the button's name."
1893
+ ]
1894
+ },
1895
+ {
1896
+ "example": "import { EditorialFilterField, EditorialFilterPanel } from \"@godxjp/ui/layout\";\nimport { Select } from \"@godxjp/ui/data-entry\";\n\n<EditorialFilterPanel aria-label=\"Filters\" action={<Button variant=\"outline\" onClick={reset}>Reset</Button>}>\n <EditorialFilterField label=\"Expansion\" htmlFor=\"f-set\"><Select id=\"f-set\" value={set} onValueChange={setSet} options={sets} /></EditorialFilterField>\n</EditorialFilterPanel>",
1897
+ "group": "layout",
1898
+ "importPath": "@godxjp/ui/layout",
1899
+ "name": "EditorialFilterPanel",
1900
+ "props": [
1901
+ {
1902
+ "description": "Group name.",
1903
+ "name": "aria-label",
1904
+ "required": true,
1905
+ "type": "string"
1906
+ },
1907
+ {
1908
+ "description": "The fields.",
1909
+ "name": "children",
1910
+ "required": true,
1911
+ "type": "ReactNode"
1912
+ },
1913
+ {
1914
+ "description": "Trailing control (reset).",
1915
+ "name": "action",
1916
+ "type": "ReactNode"
1917
+ },
1918
+ {
1919
+ "defaultValue": "\"panel\"",
1920
+ "description": "Framed panel, or a bare field row (inside a framed module).",
1921
+ "name": "variant",
1922
+ "type": "\"panel\" | \"bare\""
1923
+ }
1924
+ ],
1925
+ "related": [
1926
+ "Toolbar — application filter strip.",
1927
+ "EditorialToolbar summary — the row under it."
1928
+ ],
1929
+ "rules": [
1930
+ 2,
1931
+ 6,
1932
+ 44,
1933
+ 45
1934
+ ],
1935
+ "tagline": "A catalog's filter panel (gh#1438): one bordered surface of `EditorialFilterField`s that wrap, bottom aligned, and a trailing `action` (a reset button), as a named `role=\"group\"`. The selects inside read the panel's control scale. Geometry: `--editorial-filter-panel-*`, `--editorial-filter-field-*`.",
1936
+ "usage": [
1937
+ "DO put one control per EditorialFilterField and pass the control's id as htmlFor.",
1938
+ "DO use Toolbar for an application list's search + filters strip; this panel is the editorial catalog's."
1939
+ ]
1940
+ },
1941
+ {
1942
+ "example": "import { EditorialFilterField } from \"@godxjp/ui/layout\";\n\n<EditorialFilterField label=\"Rarity\" htmlFor=\"f-rarity\"><Select id=\"f-rarity\" value={r} onValueChange={setR} options={rarities} /></EditorialFilterField>",
1943
+ "group": "layout",
1944
+ "importPath": "@godxjp/ui/layout",
1945
+ "name": "EditorialFilterField",
1946
+ "props": [
1947
+ {
1948
+ "description": "Visible label.",
1949
+ "name": "label",
1950
+ "required": true,
1951
+ "type": "ReactNode"
1952
+ },
1953
+ {
1954
+ "description": "The control's id.",
1955
+ "name": "htmlFor",
1956
+ "required": true,
1957
+ "type": "string"
1958
+ },
1959
+ {
1960
+ "description": "The control.",
1961
+ "name": "children",
1962
+ "required": true,
1963
+ "type": "ReactNode"
1964
+ }
1965
+ ],
1966
+ "related": [
1967
+ "FormField — a form's field with help and errors."
1968
+ ],
1969
+ "rules": [
1970
+ 2,
1971
+ 6,
1972
+ 44,
1973
+ 45
1974
+ ],
1975
+ "tagline": "One field of an EditorialFilterPanel (gh#1438): a visible label (600, muted) over one control; `htmlFor` names the control.",
1976
+ "usage": [
1977
+ "DO pass the same id to the control (Select id) and to htmlFor."
1978
+ ]
1979
+ },
1980
+ {
1981
+ "example": "import { CatalogDetail, CatalogDetailTag, Eyebrow } from \"@godxjp/ui/layout\";\n\n<CatalogDetail media={<img src={src} alt={name} />} overline={<Eyebrow>Pokémon</Eyebrow>} title={name} meta={<CatalogDetailTag>SAR</CatalogDetailTag>} summary={{ label: \"Market\", price: \"¥32,800\" }} facts={[{ key: \"set\", label: \"Expansion\", value: \"151\" }]} />",
1982
+ "group": "layout",
1983
+ "importPath": "@godxjp/ui/layout",
1984
+ "name": "CatalogDetail",
1985
+ "props": [
1986
+ {
1987
+ "defaultValue": "\"card\"",
1988
+ "description": "Frame for a card or a sealed package.",
1989
+ "name": "variant",
1990
+ "type": "\"card\" | \"sealed\""
1991
+ },
1992
+ {
1993
+ "description": "The picture.",
1994
+ "name": "media",
1995
+ "required": true,
1996
+ "type": "ReactNode"
1997
+ },
1998
+ {
1999
+ "description": "Save toggle over the frame.",
2000
+ "name": "favorite",
2001
+ "type": "{ pressed; onPressedChange; label; disabled? }"
2002
+ },
2003
+ {
2004
+ "description": "Line under the frame.",
2005
+ "name": "mediaCaption",
2006
+ "type": "ReactNode"
2007
+ },
2008
+ {
2009
+ "description": "Kicker (an Eyebrow).",
2010
+ "name": "overline",
2011
+ "type": "ReactNode"
2012
+ },
2013
+ {
2014
+ "description": "The h1.",
2015
+ "name": "title",
2016
+ "required": true,
2017
+ "type": "ReactNode"
2018
+ },
2019
+ {
2020
+ "description": "CatalogDetailTags.",
2021
+ "name": "meta",
2022
+ "type": "ReactNode"
2023
+ },
2024
+ {
2025
+ "description": "Summary price block.",
2026
+ "name": "summary",
2027
+ "type": "{ label?; price; note? }"
2028
+ },
2029
+ {
2030
+ "description": "Actions under the summary.",
2031
+ "name": "actions",
2032
+ "type": "ReactNode"
2033
+ },
2034
+ {
2035
+ "description": "Facts, two columns.",
2036
+ "name": "facts",
2037
+ "type": "{ key; label; value }[]"
2038
+ }
2039
+ ],
2040
+ "related": [
2041
+ "CatalogCard — the item in a grid.",
2042
+ "CatalogDetailSection — the bands under it."
2043
+ ],
2044
+ "rules": [
2045
+ 2,
2046
+ 6,
2047
+ 44,
2048
+ 45
2049
+ ],
2050
+ "tagline": "The head of a catalog item's page (gh#1438): a framed picture with the save toggle over its corner and a caption, beside the kicker, the page's h1, a row of CatalogDetailTags, a summary price between hairlines, actions and a two-column facts list. Geometry: `--editorial-catalog-detail-*`.",
2051
+ "usage": [
2052
+ "DO pass the item's one h1 as title; the page has no other h1.",
2053
+ "DO use CatalogCard for the same item in a grid."
2054
+ ]
2055
+ },
2056
+ {
2057
+ "example": "import { CatalogDetailTag } from \"@godxjp/ui/layout\";\n\n<CatalogDetailTag>SV8 132/106</CatalogDetailTag>",
2058
+ "group": "layout",
2059
+ "importPath": "@godxjp/ui/layout",
2060
+ "name": "CatalogDetailTag",
2061
+ "props": [
2062
+ {
2063
+ "description": "Tag text.",
2064
+ "name": "children",
2065
+ "required": true,
2066
+ "type": "ReactNode"
2067
+ }
2068
+ ],
2069
+ "related": [
2070
+ "CatalogCardTag — the tag of a grid tile."
2071
+ ],
2072
+ "rules": [
2073
+ 2,
2074
+ 6,
2075
+ 44,
2076
+ 45
2077
+ ],
2078
+ "tagline": "One outlined tag (number, rarity, printed language) in a CatalogDetail meta row (gh#1438).",
2079
+ "usage": [
2080
+ "DO keep it to a short code or word."
2081
+ ]
2082
+ },
2083
+ {
2084
+ "example": "import { CatalogDetailSection } from \"@godxjp/ui/layout\";\n\n<CatalogDetailSection titleId=\"info\" title=\"Card information\" description=\"From the catalogue.\" />",
2085
+ "group": "layout",
2086
+ "importPath": "@godxjp/ui/layout",
2087
+ "name": "CatalogDetailSection",
2088
+ "props": [
2089
+ {
2090
+ "defaultValue": "\"band\"",
2091
+ "description": "Hairlined band, or a page module (no hairline, module rhythm).",
2092
+ "name": "variant",
2093
+ "type": "\"band\" | \"module\""
2094
+ },
2095
+ {
2096
+ "description": "Id on the section (in-page link target).",
2097
+ "name": "id",
2098
+ "type": "string"
2099
+ },
2100
+ {
2101
+ "description": "The h2.",
2102
+ "name": "title",
2103
+ "type": "ReactNode"
2104
+ },
2105
+ {
2106
+ "description": "Muted paragraph.",
2107
+ "name": "description",
2108
+ "type": "ReactNode"
2109
+ },
2110
+ {
2111
+ "description": "Anything after.",
2112
+ "name": "children",
2113
+ "type": "ReactNode"
2114
+ },
2115
+ {
2116
+ "description": "Id on the h2 (names the section).",
2117
+ "name": "titleId",
2118
+ "type": "string"
2119
+ }
2120
+ ],
2121
+ "related": [
2122
+ "EditorialSection — a full-width band of a sections page."
2123
+ ],
2124
+ "rules": [
2125
+ 2,
2126
+ 6,
2127
+ 44,
2128
+ 45
2129
+ ],
2130
+ "tagline": "One band of an item page under its head (gh#1438): a top hairline, an h2, a muted paragraph, then anything else. Geometry: `--editorial-catalog-detail-section-*`.",
2131
+ "usage": [
2132
+ "DO pass titleId so the section is a named region."
2133
+ ]
2134
+ },
2135
+ {
2136
+ "example": "import { PriceSummary } from \"@godxjp/ui/layout\";\n\n<PriceSummary items={[{ key: \"sell\", label: \"Asking\", value: \"¥32,800\", caption: \"Japan · JPY\" }]} context={{ label: \"Compared\", value: \"JP · NM · Raw\" }} />",
2137
+ "group": "layout",
2138
+ "importPath": "@godxjp/ui/layout",
2139
+ "name": "PriceSummary",
2140
+ "props": [
2141
+ {
2142
+ "description": "Figure cells.",
2143
+ "name": "items",
2144
+ "required": true,
2145
+ "type": "{ key; label; value; caption? }[]"
2146
+ },
2147
+ {
2148
+ "description": "Context cell (conditions compared).",
2149
+ "name": "context",
2150
+ "type": "{ label; value; caption? }"
2151
+ }
2152
+ ],
2153
+ "related": [
2154
+ "Statistic — one KPI in a dashboard."
2155
+ ],
2156
+ "rules": [
2157
+ 2,
2158
+ 6,
2159
+ 44,
2160
+ 45
2161
+ ],
2162
+ "tagline": "A joined strip of headline figures (gh#1438): one bordered surface split by hairlines, each cell a label, a figure in the number face and a caption, with an optional wider context cell on the subtle ground. Geometry: `--editorial-price-summary-*`.",
2163
+ "usage": [
2164
+ "DO keep each value one formatted figure; put the source and date in caption."
2165
+ ]
2166
+ },
2167
+ {
2168
+ "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>} />",
2169
+ "group": "layout",
2170
+ "importPath": "@godxjp/ui/layout",
2171
+ "name": "EditorialPrompt",
2172
+ "props": [
2173
+ {
2174
+ "description": "Glyph in the round badge.",
2175
+ "name": "icon",
2176
+ "type": "ReactNode"
2177
+ },
2178
+ {
2179
+ "description": "Heading.",
2180
+ "name": "title",
2181
+ "required": true,
2182
+ "type": "ReactNode"
2183
+ },
2184
+ {
2185
+ "description": "Paragraph.",
2186
+ "name": "description",
2187
+ "type": "ReactNode"
2188
+ },
2189
+ {
2190
+ "description": "Small note.",
2191
+ "name": "note",
2192
+ "type": "ReactNode"
2193
+ },
2194
+ {
2195
+ "description": "The one action.",
2196
+ "name": "action",
2197
+ "type": "ReactNode"
2198
+ },
2199
+ {
2200
+ "defaultValue": "3",
2201
+ "description": "Heading level.",
2202
+ "name": "level",
2203
+ "type": "2 | 3 | 4"
2204
+ }
2205
+ ],
2206
+ "related": [
2207
+ "Alert — status messages.",
2208
+ "EmptyState — nothing to show."
2209
+ ],
2210
+ "rules": [
2211
+ 2,
2212
+ 6,
2213
+ 44,
2214
+ 45
2215
+ ],
2216
+ "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-*`.",
2217
+ "usage": [
2218
+ "DO use Alert for a status message; this is an invitation that is there when the page loads."
2219
+ ]
2220
+ },
2221
+ {
2222
+ "example": "import { EditorialTextButton } from \"@godxjp/ui/layout\";\n\n<EditorialTextButton onClick={reset}>Reset display preferences</EditorialTextButton>",
2223
+ "group": "layout",
2224
+ "importPath": "@godxjp/ui/layout",
2225
+ "name": "EditorialTextButton",
2226
+ "props": [
2227
+ {
2228
+ "description": "Label.",
2229
+ "name": "children",
2230
+ "type": "ReactNode"
2231
+ },
2232
+ {
2233
+ "description": "Trailing glyph.",
2234
+ "name": "icon",
2235
+ "type": "ReactNode"
2236
+ },
2237
+ {
2238
+ "description": "Render the child link as the action.",
2239
+ "name": "asChild",
2240
+ "type": "boolean"
2241
+ },
2242
+ {
2243
+ "description": "Activation handler.",
2244
+ "name": "onClick",
2245
+ "type": "() => void"
2246
+ },
2247
+ {
2248
+ "description": "Native disabled.",
2249
+ "name": "disabled",
2250
+ "type": "boolean"
2251
+ }
2252
+ ],
2253
+ "related": [
2254
+ "EditorialTextLink — the bold arrow link of a section head.",
2255
+ "Button — actions with weight."
2256
+ ],
2257
+ "rules": [
2258
+ 2,
2259
+ 6,
2260
+ 44,
2261
+ 45
2262
+ ],
2263
+ "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-*`.",
2264
+ "usage": [
2265
+ "DO use it for a quiet secondary action next to copy; a primary action is a Button."
2266
+ ]
2267
+ },
2268
+ {
2269
+ "example": "import { Badge } from \"@godxjp/ui/data-display\";\nimport { EditorialMetaBar } from \"@godxjp/ui/layout\";\nimport { Lock } from \"lucide-react\";\n\n<EditorialMetaBar icon={<Lock />} start=\"Your private collection\" end={<Badge variant=\"outline\">Saved to your account</Badge>} />",
2270
+ "group": "layout",
2271
+ "importPath": "@godxjp/ui/layout",
2272
+ "name": "EditorialMetaBar",
2273
+ "props": [
2274
+ {
2275
+ "description": "Leading glyph (primary tone).",
2276
+ "name": "icon",
2277
+ "type": "ReactNode"
2278
+ },
2279
+ {
2280
+ "description": "Start line.",
2281
+ "name": "start",
2282
+ "required": true,
2283
+ "type": "ReactNode"
2284
+ },
2285
+ {
2286
+ "description": "End slot, e.g. a Badge.",
2287
+ "name": "end",
2288
+ "type": "ReactNode"
2289
+ }
2290
+ ],
2291
+ "related": [
2292
+ "EditorialPageHeader — the header above it."
2293
+ ],
2294
+ "rules": [
2295
+ 2,
2296
+ 6,
2297
+ 44,
2298
+ 45
2299
+ ],
2300
+ "tagline": "A hairline-ruled strip under a page header (gh#1439): a glyph and a line at the start (\"Your private collection\"), a badge at the end. Stacks on a phone when the theme sets `--editorial-meta-bar-align-flow: column`.",
2301
+ "usage": [
2302
+ "DO keep it to one fact and one chip."
2303
+ ]
2304
+ },
2305
+ {
2306
+ "example": "import { Button } from \"@godxjp/ui/general\";\nimport { EditorialEmptyPanel, Eyebrow } from \"@godxjp/ui/layout\";\n\n<EditorialEmptyPanel eyebrow={<Eyebrow>A PLACE FOR YOUR COLLECTION</Eyebrow>} title=\"Keep what you love, together.\" description=\"Record your cards and products.\" actions={<Button>Sign in</Button>} />",
2307
+ "group": "layout",
2308
+ "importPath": "@godxjp/ui/layout",
2309
+ "name": "EditorialEmptyPanel",
2310
+ "props": [
2311
+ {
2312
+ "description": "Illustrated guest panel or dashed empty panel. Default: \"guest\".",
2313
+ "name": "variant",
2314
+ "type": "\"guest\" | \"empty\""
2315
+ },
2316
+ {
2317
+ "description": "Kicker (an Eyebrow).",
2318
+ "name": "eyebrow",
2319
+ "type": "ReactNode"
2320
+ },
2321
+ {
2322
+ "description": "Title.",
2323
+ "name": "title",
2324
+ "required": true,
2325
+ "type": "ReactNode"
2326
+ },
2327
+ {
2328
+ "description": "Heading level. Default: 2.",
2329
+ "name": "level",
2330
+ "type": "2 | 3"
2331
+ },
2332
+ {
2333
+ "description": "Copy.",
2334
+ "name": "description",
2335
+ "type": "ReactNode"
2336
+ },
2337
+ {
2338
+ "description": "Buttons.",
2339
+ "name": "actions",
2340
+ "type": "ReactNode"
2341
+ },
2342
+ {
2343
+ "description": "Medallion glyph (variant=\"empty\").",
2344
+ "name": "icon",
2345
+ "type": "ReactNode"
2346
+ }
2347
+ ],
2348
+ "related": [
2349
+ "EmptyState — the application empty state."
2350
+ ],
2351
+ "rules": [
2352
+ 2,
2353
+ 6,
2354
+ 44,
2355
+ 45
2356
+ ],
2357
+ "tagline": "A centred panel for a signed-out or an empty state (gh#1439). `variant=\"guest\"` draws a decorative three-card stack above kicker, title, copy and centred actions; `variant=\"empty\"` is dashed with a round icon medallion. Geometry: `--editorial-empty-panel-*`.",
2358
+ "usage": [
2359
+ "DO use variant=\"guest\" where a page needs an account, variant=\"empty\" for a collection with nothing in it."
2360
+ ]
2361
+ },
2362
+ {
2363
+ "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\" }]} />",
2364
+ "group": "layout",
2365
+ "importPath": "@godxjp/ui/layout",
2366
+ "name": "EditorialStats",
2367
+ "props": [
2368
+ {
2369
+ "description": "The tiles.",
2370
+ "name": "items",
2371
+ "required": true,
2372
+ "type": "{ label: ReactNode; value: ReactNode; unit?: ReactNode; note?: ReactNode }[]"
2373
+ },
2374
+ {
2375
+ "description": "Name of the list.",
2376
+ "name": "aria-label",
2377
+ "type": "string"
2378
+ }
2379
+ ],
2380
+ "related": [
2381
+ "StatCard — an application KPI tile."
2382
+ ],
2383
+ "rules": [
2384
+ 2,
2385
+ 6,
2386
+ 44,
2387
+ 45
2388
+ ],
2389
+ "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-*`.",
2390
+ "usage": [
2391
+ "DO format the figures with Intl before passing them."
2392
+ ]
2393
+ },
2394
+ {
2395
+ "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} />} />",
2396
+ "group": "layout",
2397
+ "importPath": "@godxjp/ui/layout",
2398
+ "name": "EditorialToolbar",
2399
+ "props": [
2400
+ {
2401
+ "description": "Listing summary: result count (announced politely) and a note under it.",
2402
+ "name": "summary",
2403
+ "type": "{ count?: ReactNode; note?: ReactNode }"
2404
+ },
2405
+ {
2406
+ "description": "Start cluster.",
2407
+ "name": "start",
2408
+ "type": "ReactNode"
2409
+ },
2410
+ {
2411
+ "description": "End cluster.",
2412
+ "name": "end",
2413
+ "type": "ReactNode"
2414
+ },
2415
+ {
2416
+ "defaultValue": "false",
2417
+ "description": "Hairline under the row.",
2418
+ "name": "divider",
2419
+ "type": "boolean"
2420
+ }
2421
+ ],
2422
+ "related": [
2423
+ "Toolbar — the application filter strip.",
2424
+ "EditorialToggleGroup — the toggles it holds.",
2425
+ "EditorialFilterPanel — the filters above a listing."
2426
+ ],
2427
+ "rules": [
2428
+ 2,
2429
+ 6,
2430
+ 44,
2431
+ 45
2432
+ ],
2433
+ "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-*`.",
2434
+ "usage": [
2435
+ "DO keep the count text short; a phone theme may hide it (--editorial-toolbar-count-display).",
2436
+ "DO keep search in its own row below it."
2437
+ ]
2438
+ },
2439
+ {
2440
+ "example": "import { HoldingCard, HoldingGrid } from \"@godxjp/ui/layout\";\n\n<HoldingGrid view=\"grid\" aria-label=\"Your collection\"><HoldingCard media={<a href=\"/cards/1/\"><img src=\"/card.png\" alt=\"\" /></a>} title={<a href=\"/cards/1/\">Pikachu</a>} /></HoldingGrid>",
2441
+ "group": "layout",
2442
+ "importPath": "@godxjp/ui/layout",
2443
+ "name": "HoldingGrid",
2444
+ "props": [
2445
+ {
2446
+ "description": "Tiles or rows. Default: \"grid\".",
2447
+ "name": "view",
2448
+ "type": "\"grid\" | \"list\""
2449
+ },
2450
+ {
2451
+ "description": "Name of the list.",
2452
+ "name": "aria-label",
2453
+ "type": "string"
2454
+ },
2455
+ {
2456
+ "description": "HoldingCards.",
2457
+ "name": "children",
2458
+ "type": "ReactNode"
2459
+ }
2460
+ ],
2461
+ "related": [
2462
+ "HoldingCard — its items.",
2463
+ "CatalogCard — a catalogue tile."
2464
+ ],
2465
+ "rules": [
2466
+ 2,
2467
+ 6,
2468
+ 44,
2469
+ 45
2470
+ ],
2471
+ "tagline": "The track of HoldingCards (gh#1439): `view=\"grid\"` lays tiles on `--editorial-holding-grid-track-size` (default four columns); `view=\"list\"` turns the same cards into wide rows (`140px 1fr`, body on `1.5fr 1fr 140px`). A list (`ul`) of the cards.",
2472
+ "usage": [
2473
+ "DO switch the view with an EditorialToggleGroup variant=\"icon\"; never swap to a data table."
2474
+ ]
2475
+ },
2476
+ {
2477
+ "example": "import { HoldingCard, HoldingCardAction } from \"@godxjp/ui/layout\";\nimport { Trash2 } from \"lucide-react\";\n\n<HoldingCard media={<a href=\"/cards/1/\"><img src=\"/card.png\" alt=\"\" /></a>} overline=\"Single card\" title={<a href=\"/cards/1/\">Pikachu</a>} meta=\"025/165\" tags={[\"NM\", \"× 2\"]} purchase={{ label: \"Purchase / item\", value: \"¥1,200\" }} actions={<HoldingCardAction icon={<Trash2 />} onClick={remove}>Remove</HoldingCardAction>} />",
2478
+ "group": "layout",
2479
+ "importPath": "@godxjp/ui/layout",
2480
+ "name": "HoldingCard",
2481
+ "props": [
2482
+ {
2483
+ "description": "Link around the image (the picture ground).",
2484
+ "name": "media",
2485
+ "required": true,
2486
+ "type": "ReactNode"
2487
+ },
2488
+ {
2489
+ "description": "Line above the title.",
2490
+ "name": "overline",
2491
+ "type": "ReactNode"
2492
+ },
2493
+ {
2494
+ "description": "Title (a link).",
2495
+ "name": "title",
2496
+ "required": true,
2497
+ "type": "ReactNode"
2498
+ },
2499
+ {
2500
+ "description": "Heading level. Default: 2.",
2501
+ "name": "level",
2502
+ "type": "2 | 3"
2503
+ },
2504
+ {
2505
+ "description": "Meta line.",
2506
+ "name": "meta",
2507
+ "type": "ReactNode"
2508
+ },
2509
+ {
2510
+ "description": "Outlined tags.",
2511
+ "name": "tags",
2512
+ "type": "ReactNode[]"
2513
+ },
2514
+ {
2515
+ "description": "Purchase line.",
2516
+ "name": "purchase",
2517
+ "type": "{ label: ReactNode; value: ReactNode }"
2518
+ },
2519
+ {
2520
+ "description": "Date line.",
2521
+ "name": "date",
2522
+ "type": "ReactNode"
2523
+ },
2524
+ {
2525
+ "description": "HoldingCardAction elements.",
2526
+ "name": "actions",
2527
+ "type": "ReactNode"
2528
+ }
2529
+ ],
2530
+ "related": [
2531
+ "HoldingGrid — the track.",
2532
+ "HoldingCardAction — its actions."
2533
+ ],
2534
+ "rules": [
2535
+ 2,
2536
+ 6,
2537
+ 44,
2538
+ 45
2539
+ ],
2540
+ "tagline": "One owned item (gh#1439): a picture ground (the consumer's link around an image), overline, title, meta, outlined tags (the last set apart), the purchase line, a date and HoldingCardActions. Its geometry follows the enclosing HoldingGrid view. Geometry: `--editorial-holding-card-*`.",
2541
+ "usage": [
2542
+ "DO keep the owner's purchase price apart from reference prices."
2543
+ ]
2544
+ },
2545
+ {
2546
+ "example": "import { HoldingCardAction } from \"@godxjp/ui/layout\";\nimport { Pencil } from \"lucide-react\";\n\n<HoldingCardAction icon={<Pencil />} asChild><a href=\"/collection/1/edit/\">Edit</a></HoldingCardAction>",
2547
+ "group": "layout",
2548
+ "importPath": "@godxjp/ui/layout",
2549
+ "name": "HoldingCardAction",
2550
+ "props": [
2551
+ {
2552
+ "description": "Leading glyph.",
2553
+ "name": "icon",
2554
+ "type": "ReactNode"
2555
+ },
2556
+ {
2557
+ "description": "Label.",
2558
+ "name": "children",
2559
+ "type": "ReactNode"
2560
+ },
2561
+ {
2562
+ "description": "Render the child link as the action.",
2563
+ "name": "asChild",
2564
+ "type": "boolean"
2565
+ },
2566
+ {
2567
+ "description": "Activation handler.",
2568
+ "name": "onClick",
2569
+ "type": "() => void"
2570
+ },
2571
+ {
2572
+ "description": "Native disabled.",
2573
+ "name": "disabled",
2574
+ "type": "boolean"
2575
+ },
2576
+ {
2577
+ "description": "Accessible name when the label is not enough.",
2578
+ "name": "aria-label",
2579
+ "type": "string"
2580
+ }
2581
+ ],
2582
+ "related": [
2583
+ "HoldingCard — its card."
2584
+ ],
2585
+ "rules": [
2586
+ 2,
2587
+ 6,
2588
+ 44,
2589
+ 45
2590
+ ],
2591
+ "tagline": "A quiet glyph + label action of a HoldingCard (gh#1439): edit, remove. A `<button>` by default; `asChild` turns a router link into it.",
2592
+ "usage": [
2593
+ "DO name a destructive action with the item (\"Remove Pikachu\") through aria-label."
2594
+ ]
2595
+ },
2596
+ {
2597
+ "example": "import { SettingsLayout, SettingsPanel } from \"@godxjp/ui/layout\";\n\n<SettingsLayout aside={<p>Preferences are saved in this browser.</p>}><SettingsPanel number=\"01\" title=\"Language\" /></SettingsLayout>",
2598
+ "group": "layout",
2599
+ "importPath": "@godxjp/ui/layout",
2600
+ "name": "SettingsLayout",
2601
+ "props": [
2602
+ {
2603
+ "description": "Sticky rail.",
2604
+ "name": "aside",
2605
+ "type": "ReactNode"
2606
+ },
2607
+ {
2608
+ "description": "SettingsPanels.",
2609
+ "name": "children",
2610
+ "type": "ReactNode"
2611
+ }
2612
+ ],
2613
+ "related": [
2614
+ "SettingsPanel — the panels."
2615
+ ],
2616
+ "rules": [
2617
+ 2,
2618
+ 6,
2619
+ 44,
2620
+ 45
2621
+ ],
2622
+ "tagline": "A settings page (gh#1439): a sticky rail (`aside`, default 260px, `--editorial-settings-layout-aside-inset` from the top) beside the panels, gap 64px. A theme hides the rail on narrow screens with `--editorial-settings-layout-aside-display: none` and one track.",
2623
+ "usage": [
2624
+ "DO put a short note and one link in the rail, never controls."
2625
+ ]
2626
+ },
2627
+ {
2628
+ "example": "import { SettingsPanel } from \"@godxjp/ui/layout\";\n\n<SettingsPanel number=\"02\" title=\"Appearance\" description=\"Card artwork keeps its colours.\" />",
2629
+ "group": "layout",
2630
+ "importPath": "@godxjp/ui/layout",
2631
+ "name": "SettingsPanel",
2632
+ "props": [
2633
+ {
2634
+ "description": "Section number.",
2635
+ "name": "number",
2636
+ "type": "ReactNode"
2637
+ },
2638
+ {
2639
+ "description": "Title.",
2640
+ "name": "title",
2641
+ "required": true,
2642
+ "type": "ReactNode"
2643
+ },
2644
+ {
2645
+ "description": "Heading level. Default: 2.",
2646
+ "name": "level",
2647
+ "type": "2 | 3"
2648
+ },
2649
+ {
2650
+ "description": "Copy.",
2651
+ "name": "description",
2652
+ "type": "ReactNode"
2653
+ },
2654
+ {
2655
+ "description": "Fields.",
2656
+ "name": "children",
2657
+ "type": "ReactNode"
2658
+ },
2659
+ {
2660
+ "description": "id of the title (names the section).",
2661
+ "name": "titleId",
2662
+ "type": "string"
2663
+ }
2664
+ ],
2665
+ "related": [
2666
+ "SettingsLayout — the page.",
2667
+ "EditorialPanel — a reading-page panel."
2668
+ ],
2669
+ "rules": [
2670
+ 2,
2671
+ 6,
2672
+ 44,
2673
+ 45
2674
+ ],
2675
+ "tagline": "One bordered settings section (gh#1439): a number in the figure face beside the title and its description, then the fields (a Form). Geometry: `--editorial-settings-panel-*`.",
2676
+ "usage": [
2677
+ "DO put the fields in a Form (columns={2} for paired fields)."
2678
+ ]
2679
+ },
2680
+ {
2681
+ "example": "import { ThemePicker } from \"@godxjp/ui/layout\";\nimport { Moon, Sun } from \"lucide-react\";\n\n<ThemePicker legend=\"Choose a theme\" value={theme} onValueChange={setTheme} options={[{ value: \"light\", label: \"Light\", icon: <Sun />, preview: \"light\" }, { value: \"dark\", label: \"Dark\", icon: <Moon />, preview: \"dark\" }]} />",
2682
+ "group": "layout",
2683
+ "importPath": "@godxjp/ui/layout",
2684
+ "name": "ThemePicker",
2685
+ "props": [
2686
+ {
2687
+ "description": "Name of the group (visually hidden).",
2688
+ "name": "legend",
2689
+ "required": true,
2690
+ "type": "string"
2691
+ },
2692
+ {
2693
+ "description": "The choices.",
2694
+ "name": "options",
2695
+ "required": true,
2696
+ "type": "{ value: string; label: string; icon?: ReactNode; preview: \"light\" | \"dark\" | \"system\" }[]"
2697
+ },
2698
+ {
2699
+ "description": "Controlled value.",
2700
+ "name": "value",
2701
+ "type": "string"
2702
+ },
2703
+ {
2704
+ "description": "Uncontrolled initial value.",
2705
+ "name": "defaultValue",
2706
+ "type": "string"
2707
+ },
2708
+ {
2709
+ "description": "Change handler.",
2710
+ "name": "onValueChange",
2711
+ "type": "(value: string) => void"
2712
+ },
2713
+ {
2714
+ "description": "Name of the radio inputs.",
2715
+ "name": "name",
2716
+ "type": "string"
2717
+ }
2718
+ ],
2719
+ "related": [
2720
+ "AppSettingPicker kind=\"theme\" — a compact select.",
2721
+ "Radio — plain radios."
2722
+ ],
2723
+ "rules": [
2724
+ 2,
2725
+ 6,
2726
+ 44,
2727
+ 45
2728
+ ],
2729
+ "tagline": "An illustrated radio group for the colour theme (gh#1439): each choice is a painted preview of the interface — light, dark, or the system split — over its glyph and label. Native radios in a fieldset (arrow keys move), the checked preview ringed in the primary tone. Geometry: `--editorial-theme-picker-*`.",
2730
+ "usage": [
2731
+ "DO apply the theme at once; no Save button."
2732
+ ]
2733
+ },
2734
+ {
2735
+ "example": "import { EditorialAuth, EditorialAuthCard, Eyebrow } from \"@godxjp/ui/layout\";\n\n<EditorialAuth eyebrow={<Eyebrow>YOUR COLLECTION STARTS HERE</Eyebrow>} title=\"Make room for what you love.\" benefits={[\"A collection of your own\"]}><EditorialAuthCard title=\"Welcome back.\" /></EditorialAuth>",
2736
+ "group": "layout",
2737
+ "importPath": "@godxjp/ui/layout",
2738
+ "name": "EditorialAuth",
2739
+ "props": [
2740
+ {
2741
+ "description": "Kicker.",
2742
+ "name": "eyebrow",
2743
+ "type": "ReactNode"
2744
+ },
2745
+ {
2746
+ "description": "Display title (h1).",
2747
+ "name": "title",
2748
+ "required": true,
2749
+ "type": "ReactNode"
2750
+ },
2751
+ {
2752
+ "description": "Copy.",
2753
+ "name": "description",
2754
+ "type": "ReactNode"
2755
+ },
2756
+ {
2757
+ "description": "Picture on the front card.",
2758
+ "name": "art",
2759
+ "type": "ReactNode"
2760
+ },
2761
+ {
2762
+ "description": "Benefit lines.",
2763
+ "name": "benefits",
2764
+ "type": "ReactNode[]"
2765
+ },
2766
+ {
2767
+ "description": "EditorialAuthCard.",
2768
+ "name": "children",
2769
+ "type": "ReactNode"
2770
+ }
2771
+ ],
2772
+ "related": [
2773
+ "EditorialAuthCard — the card.",
2774
+ "CenteredShell — use variant=\"auth\" for the application sign-in shell."
2775
+ ],
2776
+ "rules": [
2777
+ 2,
2778
+ 6,
2779
+ 44,
2780
+ 45
2781
+ ],
2782
+ "tagline": "A sign-in / sign-up page (gh#1439): a story column (kicker, display title — line breaks kept —, copy, a decorative card pair carrying `art`, benefit lines with a check) beside the form card (`children`, default 460px). Geometry: `--editorial-auth-*`.",
2783
+ "usage": [
2784
+ "DO keep the form in an EditorialAuthCard with Form + FormField."
2785
+ ]
2786
+ },
2787
+ {
2788
+ "example": "import { EditorialAuthCard } from \"@godxjp/ui/layout\";\n\n<EditorialAuthCard title=\"Welcome back.\" description=\"Sign in to see your collection.\" footer=\"New here?\" />",
2789
+ "group": "layout",
2790
+ "importPath": "@godxjp/ui/layout",
2791
+ "name": "EditorialAuthCard",
2792
+ "props": [
2793
+ {
2794
+ "description": "Badge slot.",
2795
+ "name": "badge",
2796
+ "type": "ReactNode"
2797
+ },
2798
+ {
2799
+ "description": "Title.",
2800
+ "name": "title",
2801
+ "required": true,
2802
+ "type": "ReactNode"
2803
+ },
2804
+ {
2805
+ "description": "Heading level. Default: 2.",
2806
+ "name": "level",
2807
+ "type": "2 | 3"
2808
+ },
2809
+ {
2810
+ "description": "Copy.",
2811
+ "name": "description",
2812
+ "type": "ReactNode"
2813
+ },
2814
+ {
2815
+ "description": "The form.",
2816
+ "name": "children",
2817
+ "type": "ReactNode"
2818
+ },
2819
+ {
2820
+ "description": "Ruled footer line.",
2821
+ "name": "footer",
2822
+ "type": "ReactNode"
2823
+ }
2824
+ ],
2825
+ "related": [
2826
+ "EditorialAuth — the page."
2827
+ ],
2828
+ "rules": [
2829
+ 2,
2830
+ 6,
2831
+ 44,
2832
+ 45
2833
+ ],
2834
+ "tagline": "The form card of EditorialAuth (gh#1439): badge, title, copy, the form (`children`) and a ruled footer line (\"New to the site? Create an account\").",
2835
+ "usage": [
2836
+ "DO keep one form per card."
2837
+ ]
2838
+ },
2839
+ {
2840
+ "example": "import { EditorialFootnote, EditorialTextButton } from \"@godxjp/ui/layout\";\n\n<EditorialFootnote action={<EditorialTextButton onClick={reset}>Reset display preferences</EditorialTextButton>}>Changes are saved automatically.</EditorialFootnote>",
2841
+ "group": "layout",
2842
+ "importPath": "@godxjp/ui/layout",
2843
+ "name": "EditorialFootnote",
2844
+ "props": [
2845
+ {
2846
+ "description": "The note.",
2847
+ "name": "children",
2848
+ "type": "ReactNode"
2849
+ },
2850
+ {
2851
+ "description": "Trailing action.",
2852
+ "name": "action",
2853
+ "type": "ReactNode"
2854
+ },
2855
+ {
2856
+ "description": "Cross-axis alignment. Default: \"start\".",
2857
+ "name": "align",
2858
+ "type": "\"start\" | \"center\""
2859
+ }
2860
+ ],
2861
+ "related": [
2862
+ "EditorialNote — a ruled aside in a reading column."
2863
+ ],
2864
+ "rules": [
2865
+ 2,
2866
+ 6,
2867
+ 44,
2868
+ 45
2869
+ ],
2870
+ "tagline": "A quiet closing line under a collection or a settings form (gh#1439): a muted note at the start and an optional action (an EditorialTextButton) at the end. Geometry: `--editorial-footnote-*`.",
2871
+ "usage": [
2872
+ "DO keep it to one or two sentences."
2873
+ ]
2874
+ },
850
2875
  {
851
2876
  "docPath": "docs/layout/page-cover.tsx",
852
2877
  "example": "import { PageContainer } from \"@godxjp/ui/layout\";\nimport { PageCover } from \"@godxjp/ui/lab\";\nimport { Button } from \"@godxjp/ui/general\";\n\n<PageContainer\n title={page.title}\n headerScale=\"display\"\n icon={<span aria-hidden=\"true\">{page.icon}</span>}\n cover={\n <PageCover\n src={page.cover}\n alt=\"\"\n positionY={y}\n onPositionChange={setY}\n repositioning={moving}\n onRepositioningChange={setMoving}\n actions={<Button size=\"sm\" variant=\"secondary\" onClick={() => setMoving(true)}>Reposition</Button>}\n />\n }\n>\n {body}\n</PageContainer>",
@@ -1198,6 +3223,16 @@
1198
3223
  "importPath": "@godxjp/ui/layout",
1199
3224
  "name": "AppShell",
1200
3225
  "props": [
3226
+ {
3227
+ "description": "Phone-only destinations in drawer mode (<=900px). Reuses MobileShell tabBar: equal-width children, safe-area insets, aria-current=page. Reserve the measured band outside the scrolling main; the app footer flows at the end of main, leaving only this bottom navigation persistent; publishes --app-shell-mobile-tab-bar-block-size on the shell and --toast-sticky-bar-height on html. Omit/null/false for none; responsiveNavigation=none disables it. Use 3–5 Button asChild links; native Tab/Shift+Tab and Enter. Hidden on desktop and in print. External dock: reserve --app-shell-viewport-inset; bar stays inside the remaining shell viewport.",
3228
+ "name": "mobileTabBar",
3229
+ "type": "ReactNode"
3230
+ },
3231
+ {
3232
+ "description": "Navigation landmark name; defaults to the shared localized primary-navigation label (ja/en/vi).",
3233
+ "name": "mobileTabBarLabel",
3234
+ "type": "string"
3235
+ },
1201
3236
  {
1202
3237
  "description": "Optional sidebar node, typically a Sidebar. Omit or pass null/false to remove its landmark and grid track. Logo remains in the topbar; navRail is independent.",
1203
3238
  "name": "sidebar",
@@ -1280,7 +3315,7 @@
1280
3315
  "type": "string"
1281
3316
  },
1282
3317
  {
1283
- "description": "App-level footer outside the main content area.",
3318
+ "description": "App-level footer with page keyline insets (--space-page-x, --space-page-compact-x on phones). Outside main on desktop; when mobileTabBar is visible, flows at the end of the scrolling main instead of reserving persistent chrome.",
1284
3319
  "name": "footer",
1285
3320
  "type": "ReactNode"
1286
3321
  },
@@ -1810,6 +3845,11 @@
1810
3845
  "name": "labelHideBelow",
1811
3846
  "type": "BreakpointProp"
1812
3847
  },
3848
+ {
3849
+ "description": "Remove the whole cell FROM a breakpoint step upwards (Flex hideFrom's contract) — a phone-only cell such as the menu trigger that opens the same navigation in a sheet (gh#1428).",
3850
+ "name": "hideFrom",
3851
+ "type": "BreakpointProp"
3852
+ },
1813
3853
  {
1814
3854
  "description": "Overlaid count; does not change the bar cell width. Rendered under asChild too (gh#1171): the pill goes inside the child element after its children, so `<TopbarItem asChild badge={3}><a href=\"/notifications\">…</a></TopbarItem>` keeps its count. Nothing renders for `undefined`, `\"\"` or the number `0` (gh#1341) — pass the count as it is, never `count === 0 ? undefined : count`; pass the string `\"0\"` to show a zero on purpose.",
1815
3855
  "name": "badge",
@@ -6463,6 +8503,11 @@
6463
8503
  "name": "suffix",
6464
8504
  "type": "React.ReactNode"
6465
8505
  },
8506
+ {
8507
+ "description": "How the field takes its inline space, as `Select` and the pickers mean it (gh#1448). `full` fills the line; `auto` is sized to the widest value the bounds allow (formatted `min` / `max`, 6 characters when unbounded) plus the steppers — a quantity stepper outside a FormField, e.g. in a `ListRow` trailing slot; `bounded` holds `--control-bounded-width`. Inside a FormField, `controlWidth` still sizes it. Default: \"full\".",
8508
+ "name": "width",
8509
+ "type": "\"full\" | \"auto\" | \"bounded\""
8510
+ },
6466
8511
  {
6467
8512
  "description": "Form field name — submits its value natively.",
6468
8513
  "name": "name",
@@ -13411,7 +15456,6 @@
13411
15456
  "TimezonePicker",
13412
15457
  "DateFormatPicker",
13413
15458
  "TimeFormatPicker",
13414
- "ThemePicker",
13415
15459
  "DensityPicker",
13416
15460
  "AppSettingToggle"
13417
15461
  ],