@godxjp/ui 28.12.0 → 28.13.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.
- package/agent/START-HERE.md +1 -1
- package/agent/components/AppLauncher.json +10 -0
- package/agent/components/Attachments.json +26 -1
- package/agent/components/BranchScopePicker.json +10 -0
- package/agent/components/Cascader.json +5 -0
- package/agent/components/Checkbox.json +6 -0
- package/agent/components/CredentialReveal.json +21 -0
- package/agent/components/InputOTP.json +35 -0
- package/agent/components/PermissionMatrix.json +5 -0
- package/agent/components/SearchInput.json +5 -0
- package/agent/components/ServiceRolePanel.json +5 -0
- package/agent/components/Switch.json +6 -0
- package/agent/components/Tabs.json +10 -0
- package/agent/components/TimeRangePicker.json +5 -0
- package/agent/components/Transfer.json +5 -0
- package/agent/components/Upload.json +5 -0
- package/agent/components.json +159 -1
- package/agent/index.json +2 -2
- package/agent/llms.txt +3 -3
- package/dist/contracts/measurement.json +1 -1
- package/dist/i18n/messages/en.json +0 -697
- package/dist/i18n/messages/ja.json +0 -691
- package/dist/i18n/messages/vi.json +0 -691
- package/docs/DESIGN-AUTHORITY.md +13 -0
- package/docs/i18n/messages/en.json +699 -0
- package/docs/i18n/messages/ja.json +693 -0
- package/docs/i18n/messages/vi.json +693 -0
- package/docs/showcase/marketing-page.tsx +3 -2
- package/docs/showcase/theme-customization.tsx +2 -1
- package/package.json +2 -2
package/agent/START-HERE.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
You are about to write code against a design system you did not author. This file is the whole
|
|
4
4
|
contract. Read it before you write JSX.
|
|
5
5
|
|
|
6
|
-
**This catalog describes `@godxjp/ui` 28.
|
|
6
|
+
**This catalog describes `@godxjp/ui` 28.13.0.** If the project you are editing has a different
|
|
7
7
|
version in its `package.json`, read the pinned catalog for THAT version instead
|
|
8
8
|
(`…/v<their-version>/agent/…`). A catalog newer than the installed package describes props that do
|
|
9
9
|
not exist yet; older, and it hides props that do. Neither failure announces itself.
|
|
@@ -60,6 +60,16 @@
|
|
|
60
60
|
"name": "appearance",
|
|
61
61
|
"type": "\"bar\" | \"icon\""
|
|
62
62
|
},
|
|
63
|
+
{
|
|
64
|
+
"description": "Which way the panel opens. DERIVED from `appearance` when unset — `bottom` in a bar (the panel drops below the trigger, the only direction that does not cover the bar itself), `right` otherwise, because a rail is vertical and its panel goes beside it. State it when the chrome can be RE-DOCKED: `appearance` says the trigger is NOT in a bar, and it cannot say which way is out — a rail pinned to the top edge is not a bar and still opens downward. Measured without it, an embedded bar trigger at (2,50) put its panel at (12,90), lying over the host application's sidebar. Not used by `responsive=\"fullscreen\"`, which has no side.",
|
|
65
|
+
"name": "side",
|
|
66
|
+
"type": "\"top\" | \"right\" | \"bottom\" | \"left\""
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"description": "Where the panel sits along the `side` edge — the cross-axis half of the same decision, and derived the same way: `end` in a bar (the Workspace shape, flush with the bar's end), `start` otherwise (aligned to the rail trigger's own start). State it alongside `side` when you state either.",
|
|
70
|
+
"name": "align",
|
|
71
|
+
"type": "\"start\" | \"center\" | \"end\""
|
|
72
|
+
},
|
|
63
73
|
{
|
|
64
74
|
"description": "Controlled open state.",
|
|
65
75
|
"name": "open",
|
|
@@ -50,6 +50,31 @@
|
|
|
50
50
|
"description": "Child mode: visible trigger; upload runs through a hidden input beside it.",
|
|
51
51
|
"name": "children",
|
|
52
52
|
"type": "ReactElement"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"description": "antd Upload `onRemove`, narrowed to the attachment row. RETURNING `false` (or a promise of it) VETOES the removal and the card stays — anything else, including `undefined`, lets it go. That is how you gate a removal behind a confirm dialog without owning `items` yourself. It is awaited, so an async guard works.",
|
|
56
|
+
"name": "onRemove",
|
|
57
|
+
"type": "(item: AttachmentsItemProp) => boolean | void | Promise<boolean | void>"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"description": "Ant Design X `classNames` — per-part classes (root, list, card, file, upload, placeholder). DECLARED AND FORWARDED, and the only semantic part map in this package: docs/DESIGN-AUTHORITY.md rules that antd's `classNames`/`styles` maps are NOT adopted because this library answers that layer with tokens (cardinal rule #45), and Attachments is the one component that carries them anyway. Recorded there as a contradiction, not a pattern — do not copy it onto another component, and retune through `--attachments-*` instead.",
|
|
61
|
+
"name": "classNames",
|
|
62
|
+
"type": "Partial<Record<AttachmentsSemanticProp, string>>"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"description": "Ant Design X `styles` — the same part map as `classNames`, as inline styles, and under the same standing ruling against it. Inline styles beat every stylesheet rule, so this is the one handle in the package that can take a part off the design system entirely. The `--attachments-*` tokens are the supported route.",
|
|
66
|
+
"name": "styles",
|
|
67
|
+
"type": "Partial<Record<AttachmentsSemanticProp, React.CSSProperties>>"
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"description": "Ant Design X `rootClassName` — the outermost node. It is not a duplicate of `className`: in the full-screen-drop mode (`getDropContainer`) the outermost node is the OVERLAY rather than the inline tray, which is why antd separates the two. Both are applied.",
|
|
71
|
+
"name": "rootClassName",
|
|
72
|
+
"type": "string"
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"description": "ACCEPTED AND INERT. Ant Design X forwards it to its own Image preview; this package has no Image primitive yet, so the prop exists only so an Ant X call site type-checks, and passing it changes nothing on screen. Do not reach for it expecting a preview knob.",
|
|
76
|
+
"name": "imageProps",
|
|
77
|
+
"type": "Record<string, unknown>"
|
|
53
78
|
}
|
|
54
79
|
],
|
|
55
80
|
"related": [
|
|
@@ -67,7 +92,7 @@
|
|
|
67
92
|
"usage": [
|
|
68
93
|
"DO keep antd field names on each item (`thumbUrl`, `originFileObj`, `uid`) — an Ant X call site should compile unchanged.",
|
|
69
94
|
"DO use `ref.select({ accept, multiple })` to open the picker programmatically (Ant X 2.0).",
|
|
70
|
-
"
|
|
95
|
+
"Ant X's `classNames` / `styles` / `rootClassName` ARE declared and forwarded, although docs/DESIGN-AUTHORITY.md rules that antd's semantic part maps are not adopted here. The older note in this slot said not to expect them at all; the type has never agreed with it, so an agent reading only the catalog was told the opposite of what autocomplete offered. Retune through the `--attachments-*` tokens, and treat the maps as a recorded contradiction on this one component rather than a pattern to reuse.",
|
|
71
96
|
"The card is a FIXED box — 268x68 (Ant X's own), from `--attachments-card-size` (inline) and `--attachments-card-block-size`. The block size is also the `+` tile's square and the `overflow=\"scrollY\"` one-row viewport, so retune it once and all three follow. The file input is `sr-only`: never style it visible."
|
|
72
97
|
],
|
|
73
98
|
"useCases": [
|
|
@@ -63,6 +63,16 @@
|
|
|
63
63
|
"description": "Override the localized radio labels (e.g. domain wording like 全店舗).",
|
|
64
64
|
"name": "allLabel / selectedLabel",
|
|
65
65
|
"type": "ReactNode"
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"description": "Native form name, forwarded to the MODE radio group — the all / selected choice is what submits under it. The checked branch ids are not native fields; they live in the single `{ mode, branchIds }` value and are yours to serialise.",
|
|
69
|
+
"name": "name",
|
|
70
|
+
"type": "string"
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"description": "DOM id on the picker root, and the SEED for the ids beneath it — the validation message is `${id}-error`, which is what `aria-errormessage` points at. Left out, a `useId`-based id is generated, so the association still holds; set it when a server-rendered page needs those ids to be stable.",
|
|
74
|
+
"name": "id",
|
|
75
|
+
"type": "string"
|
|
66
76
|
}
|
|
67
77
|
],
|
|
68
78
|
"related": [
|
|
@@ -175,6 +175,11 @@
|
|
|
175
175
|
"description": "Search query change (antd `showSearch.onSearch`).",
|
|
176
176
|
"name": "onSearchChange",
|
|
177
177
|
"type": "(query: string) => void"
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
"description": "Accessible name for the COMBOBOX TRIGGER — the element a keyboard user lands on, not the panel. Inside a FormField it is injected for you and you do not pass it; on a bare Cascader (a toolbar scope filter, a compact drilldown with no label row) it is the only name the control has, and cardinal rule 227 requires one. Route it through t(). The rest of the field-a11y contract — aria-labelledby / describedby / errormessage / invalid / required — is accepted on every form-capable component here and is FormField's to wire.",
|
|
181
|
+
"name": "aria-label",
|
|
182
|
+
"type": "string"
|
|
178
183
|
}
|
|
179
184
|
],
|
|
180
185
|
"related": [
|
|
@@ -29,6 +29,12 @@
|
|
|
29
29
|
"name": "id",
|
|
30
30
|
"type": "string"
|
|
31
31
|
},
|
|
32
|
+
{
|
|
33
|
+
"defaultValue": "false",
|
|
34
|
+
"description": "Keeps its HTML spelling here and becomes react-aria's `isRequired`, so unlike Switch — where the same prop only ANNOUNCES the requirement — this is real constraint validation on the underlying input: an unchecked box blocks native form submission. The consent checkbox is the case it exists for. It does not render an asterisk; the required MARK belongs to FormField's label.",
|
|
35
|
+
"name": "required",
|
|
36
|
+
"type": "boolean"
|
|
37
|
+
},
|
|
32
38
|
{
|
|
33
39
|
"description": "antd `<Checkbox>label</Checkbox>` — the INLINE label: box first, label at inline-end on the same line, the same markup as a `Checkbox.Group` option. A real `<label for>`: clicking the text toggles the box and the text is its accessible name. `className` then styles the labelled row.",
|
|
34
40
|
"name": "children",
|
|
@@ -46,12 +46,23 @@
|
|
|
46
46
|
"name": "onAcknowledge",
|
|
47
47
|
"type": "() => void"
|
|
48
48
|
},
|
|
49
|
+
{
|
|
50
|
+
"description": "Copy on the button `onAcknowledge` creates. Defaults to a localized \"I've saved it\" — override it when the confirmation claims something more specific than having read the secret (\"保管しました\", \"Stored in 1Password\"). Consumer-owned wording: route it through t().",
|
|
51
|
+
"name": "acknowledgeLabel",
|
|
52
|
+
"type": "React.ReactNode"
|
|
53
|
+
},
|
|
49
54
|
{
|
|
50
55
|
"defaultValue": "false",
|
|
51
56
|
"description": "Offer a download-as-file button.",
|
|
52
57
|
"name": "downloadable",
|
|
53
58
|
"type": "boolean"
|
|
54
59
|
},
|
|
60
|
+
{
|
|
61
|
+
"defaultValue": "\"credential.txt\"",
|
|
62
|
+
"description": "Name of the file `downloadable` writes. The default is deliberately anonymous; set it when the user will hold several at once (`api-key-prod.txt`) so the saved files are still telling apart in a downloads folder.",
|
|
63
|
+
"name": "downloadFileName",
|
|
64
|
+
"type": "string"
|
|
65
|
+
},
|
|
55
66
|
{
|
|
56
67
|
"defaultValue": "\"md\"",
|
|
57
68
|
"description": "Action button size tier.",
|
|
@@ -63,6 +74,16 @@
|
|
|
63
74
|
"description": "Caution banner severity.",
|
|
64
75
|
"name": "tone",
|
|
65
76
|
"type": "\"warning\" | \"destructive\" | \"info\""
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"description": "DOM id on the root. Useful here because the surface is usually inside a Dialog: it is what a `aria-describedby` on the dialog, or a deep link back to the issued credential, can point at.",
|
|
80
|
+
"name": "id",
|
|
81
|
+
"type": "string"
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"description": "Accessible name for the credential region when `label` is not set or is a non-string node. `label` is the VISIBLE caption and already names the region when it is a plain string, so reach for this only when the caption is rich content or when the surrounding dialog title is the only thing saying which secret this is.",
|
|
85
|
+
"name": "aria-label",
|
|
86
|
+
"type": "string"
|
|
66
87
|
}
|
|
67
88
|
],
|
|
68
89
|
"related": [
|
|
@@ -70,6 +70,41 @@
|
|
|
70
70
|
"description": "Main-axis alignment of the whole code row (groups + separators) inside the field. `center` is the canonical auth challenge. Before this existed, every consumer wrapped the OTP in their own flex-centring div — do not. A service that wants all code fields centred sets `--otp-container-align` once instead.",
|
|
71
71
|
"name": "align",
|
|
72
72
|
"type": "\"start\" | \"center\" | \"end\""
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"description": "Fires ONCE the last slot fills, whether the user typed it or pasted the whole code. This is the auto-submit hook: a 2FA challenge with a visible submit button is a step nobody wants, and the alternative — watching `value.length === maxLength` in an effect — re-fires on every re-render. Keep the submit button anyway for the paste-then-correct case.",
|
|
76
|
+
"name": "onComplete",
|
|
77
|
+
"type": "(value: string) => void"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"description": "Rewrites CLIPBOARD text before it reaches the field. Distinct from `formatter`, which normalises every value: this one only sees a paste, which is where the junk arrives — `\"123 456\"`, `\"code: 123456\"`, a copied SMS line. Note the order the field applies them: `pattern` is matched against the RAW keystroke first, so a pattern must accept what a user actually types, not only what these two produce.",
|
|
81
|
+
"name": "pasteTransformer",
|
|
82
|
+
"type": "(pasted: string) => string"
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"description": "Class on the ROW container `input-otp` renders (the slots' flex parent), which `className` cannot reach — `className` lands on the hidden input, because that is the real field. Prefer `align` and the `--otp-*` tokens; this is the vendored escape hatch underneath them.",
|
|
86
|
+
"name": "containerClassName",
|
|
87
|
+
"type": "string"
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"description": "`input-otp`'s answer to the 1Password / LastPass badge that browsers float over a code field and that covers the last slot. `increase-width` (its default) reserves room so the badge sits beside the row; `none` turns the accommodation off, which is what a row already centred by `align` usually wants. Pure layout — it changes no value and no keyboard behaviour.",
|
|
91
|
+
"name": "pushPasswordManagerStrategy",
|
|
92
|
+
"type": "\"increase-width\" | \"none\""
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"description": "The `<noscript>` stylesheet `input-otp` injects so the slots are still visible with JS disabled. Pass `null` to suppress it — the one real reason being a CSP that forbids inline styles and that `nonce` cannot satisfy. Leave it alone otherwise.",
|
|
96
|
+
"name": "noScriptCSSFallback",
|
|
97
|
+
"type": "string | null"
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"description": "CSP nonce stamped on the stylesheet `input-otp` injects. Required only under a `style-src 'nonce-…'` policy, where the field otherwise renders unstyled and the console reports a blocked inline style. Pass the same nonce the document was served with.",
|
|
101
|
+
"name": "nonce",
|
|
102
|
+
"type": "string"
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"description": "`input-otp`'s headless mode: you draw the entire row from the slot state instead of composing InputOTPGroup / InputOTPSlot. It is mutually exclusive with `children` — the vendor types the two as a union and this component keeps that union. Reaching for it means giving up the slot styling, the group outline and the separator this package owns, so it is the last resort, not a customisation point.",
|
|
106
|
+
"name": "render",
|
|
107
|
+
"type": "(props: InputOTPRenderProps) => React.ReactNode"
|
|
73
108
|
}
|
|
74
109
|
],
|
|
75
110
|
"related": [
|
|
@@ -54,6 +54,11 @@
|
|
|
54
54
|
"description": "Accessible table name (localized default).",
|
|
55
55
|
"name": "label",
|
|
56
56
|
"type": "string"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"description": "DOM id on the grid root. Worth setting on a permissions page that also renders a summary or a legend elsewhere: it is the anchor those can point at, and the stable handle for an E2E selector that must not depend on the localized `label`.",
|
|
60
|
+
"name": "id",
|
|
61
|
+
"type": "string"
|
|
57
62
|
}
|
|
58
63
|
],
|
|
59
64
|
"related": [
|
|
@@ -67,6 +67,11 @@
|
|
|
67
67
|
"description": "Disable search input and clearing.",
|
|
68
68
|
"name": "disabled",
|
|
69
69
|
"type": "boolean"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"description": "Class on the `<input>` itself. SearchInput renders a WRAPPER (label, icon, clear button, input), so `className` lands on that wrapper and never reaches the field — this is the second handle, for the case where the field and its chrome need different treatment. Layout and colour still belong to tokens; use it for the rare geometry a token cannot reach.",
|
|
73
|
+
"name": "inputClassName",
|
|
74
|
+
"type": "string"
|
|
70
75
|
}
|
|
71
76
|
],
|
|
72
77
|
"related": [
|
|
@@ -56,6 +56,11 @@
|
|
|
56
56
|
"description": "Forwarded to MasterDetail (localized region labels by default). Never re-derive tracks or breakpoints in the app.",
|
|
57
57
|
"name": "railWidth / masterViewport / collapseBelow / masterLabel / detailLabel",
|
|
58
58
|
"type": "MasterDetail geometry + region labels"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"description": "DOM id on the panel root — the two-region MasterDetail wrapper, not the rail or the detail. It is the handle for a deep link onto the roles panel of a settings page, and for an E2E selector that must survive `masterLabel` being localized.",
|
|
62
|
+
"name": "id",
|
|
63
|
+
"type": "string"
|
|
59
64
|
}
|
|
60
65
|
],
|
|
61
66
|
"related": [
|
|
@@ -47,6 +47,12 @@
|
|
|
47
47
|
"name": "id",
|
|
48
48
|
"type": "string"
|
|
49
49
|
},
|
|
50
|
+
{
|
|
51
|
+
"defaultValue": "false",
|
|
52
|
+
"description": "ANNOUNCES the requirement; it does not enforce it. react-aria's Switch omits `isRequired`, and a switch is never the target of native constraint validation in this library, so this writes `aria-required=\"true\"` onto the real input and stops there. The form layer (FormField / your schema) still owns whether an unflipped switch blocks submit — pairing this with nothing that validates is how a screen reader ends up promising a check the form never makes.",
|
|
53
|
+
"name": "required",
|
|
54
|
+
"type": "boolean"
|
|
55
|
+
},
|
|
50
56
|
{
|
|
51
57
|
"defaultValue": "false",
|
|
52
58
|
"description": "Disable the toggle.",
|
|
@@ -116,6 +116,16 @@
|
|
|
116
116
|
"description": "Ant Design `onTabScroll`, fired whenever the trigger strip's own scrollport moves — a swipe, a wheel, or the component re-pinning the active trigger (antd reports its own re-pins too). LOGICAL VALUES instead of antd's `left | right | top | bottom`: two of those four are just the other axis of the same event, and upstream's pair is read off the sign of an inner transform, so in an RTL strip its `left` means the opposite of what it means in LTR. `start`/`end` say the same thing on whichever axis and in whichever direction the strip is written. Only fires for the `items` API, which is the path that owns the strip element.",
|
|
117
117
|
"name": "onTabScroll",
|
|
118
118
|
"type": "(info: { direction: \"start\" | \"end\" }) => void"
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
"description": "Class on the TRIGGER STRIP (`TabsList`) under the `items` API — the handle that composing the tree manually gives you as `<TabsList className>`. `className` reaches only the root, which holds the strip AND the panels, so anything meant for the bar alone belongs here. Almost always unnecessary: placement, size, centring and the card rail are props and `--tabs-*` tokens.",
|
|
122
|
+
"name": "listClassName",
|
|
123
|
+
"type": "string"
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
"description": "Class on EVERY panel (`TabsContent`) under the `items` API. It is written so it can WIN: the joined card body travels to CSS as `data-bodied` on the root rather than as a class, precisely so a consumer class on the panel is not fighting a utility the component already claimed (gh#762). Reach for the `bodied` prop and the `--tabs-panel-*` tokens first — this is for the geometry no token exposes.",
|
|
127
|
+
"name": "contentClassName",
|
|
128
|
+
"type": "string"
|
|
119
129
|
}
|
|
120
130
|
],
|
|
121
131
|
"related": [
|
|
@@ -30,6 +30,11 @@
|
|
|
30
30
|
"name": "allowEmpty",
|
|
31
31
|
"type": "[boolean,boolean]"
|
|
32
32
|
},
|
|
33
|
+
{
|
|
34
|
+
"description": "A PAIR, one per endpoint — TimePicker's single-string `placeholder` is omitted from this type on purpose, because a range has two empty fields and one string would label both of them the same. Route both through t().",
|
|
35
|
+
"name": "placeholder",
|
|
36
|
+
"type": "[string,string]"
|
|
37
|
+
},
|
|
33
38
|
{
|
|
34
39
|
"description": "Native names are name_from and name_to.",
|
|
35
40
|
"name": "name",
|
|
@@ -94,6 +94,11 @@
|
|
|
94
94
|
"name": "className",
|
|
95
95
|
"type": "string"
|
|
96
96
|
},
|
|
97
|
+
{
|
|
98
|
+
"description": "Lands on the `role=\"group\"` shuttle container, not on any one input — a two-pane shuttle has no single labelable control, so this is what a FormField label points at. FormField injects it; pass it yourself only for a bare Transfer.",
|
|
99
|
+
"name": "id",
|
|
100
|
+
"type": "string"
|
|
101
|
+
},
|
|
97
102
|
{
|
|
98
103
|
"description": "Controlled selection state as a tuple: index 0 = keys checked in the source panel, index 1 = keys checked in the target panel. Omit to use internal (uncontrolled) selection state. Must be paired with `onSelectChange` when provided.",
|
|
99
104
|
"name": "selectedKeys",
|
|
@@ -67,6 +67,11 @@
|
|
|
67
67
|
"name": "className",
|
|
68
68
|
"type": "string"
|
|
69
69
|
},
|
|
70
|
+
{
|
|
71
|
+
"description": "Lands on the native `<input type=\"file\">`, NOT on the wrapper — the hidden input is the semantic focus target, so this is what makes a `<label htmlFor>` (or FormField, which injects it) actually focus the picker. Putting it on the visible dropzone instead is the usual reason a label click does nothing.",
|
|
72
|
+
"name": "id",
|
|
73
|
+
"type": "string"
|
|
74
|
+
},
|
|
70
75
|
{
|
|
71
76
|
"description": "Custom button label for variant='button'. Falls back to the i18n 'Upload file' string.",
|
|
72
77
|
"name": "children",
|
package/agent/components.json
CHANGED
|
@@ -441,6 +441,11 @@
|
|
|
441
441
|
"name": "allowEmpty",
|
|
442
442
|
"type": "[boolean,boolean]"
|
|
443
443
|
},
|
|
444
|
+
{
|
|
445
|
+
"description": "A PAIR, one per endpoint — TimePicker's single-string `placeholder` is omitted from this type on purpose, because a range has two empty fields and one string would label both of them the same. Route both through t().",
|
|
446
|
+
"name": "placeholder",
|
|
447
|
+
"type": "[string,string]"
|
|
448
|
+
},
|
|
444
449
|
{
|
|
445
450
|
"description": "Native names are name_from and name_to.",
|
|
446
451
|
"name": "name",
|
|
@@ -4366,12 +4371,23 @@
|
|
|
4366
4371
|
"name": "onAcknowledge",
|
|
4367
4372
|
"type": "() => void"
|
|
4368
4373
|
},
|
|
4374
|
+
{
|
|
4375
|
+
"description": "Copy on the button `onAcknowledge` creates. Defaults to a localized \"I've saved it\" — override it when the confirmation claims something more specific than having read the secret (\"保管しました\", \"Stored in 1Password\"). Consumer-owned wording: route it through t().",
|
|
4376
|
+
"name": "acknowledgeLabel",
|
|
4377
|
+
"type": "React.ReactNode"
|
|
4378
|
+
},
|
|
4369
4379
|
{
|
|
4370
4380
|
"defaultValue": "false",
|
|
4371
4381
|
"description": "Offer a download-as-file button.",
|
|
4372
4382
|
"name": "downloadable",
|
|
4373
4383
|
"type": "boolean"
|
|
4374
4384
|
},
|
|
4385
|
+
{
|
|
4386
|
+
"defaultValue": "\"credential.txt\"",
|
|
4387
|
+
"description": "Name of the file `downloadable` writes. The default is deliberately anonymous; set it when the user will hold several at once (`api-key-prod.txt`) so the saved files are still telling apart in a downloads folder.",
|
|
4388
|
+
"name": "downloadFileName",
|
|
4389
|
+
"type": "string"
|
|
4390
|
+
},
|
|
4375
4391
|
{
|
|
4376
4392
|
"defaultValue": "\"md\"",
|
|
4377
4393
|
"description": "Action button size tier.",
|
|
@@ -4383,6 +4399,16 @@
|
|
|
4383
4399
|
"description": "Caution banner severity.",
|
|
4384
4400
|
"name": "tone",
|
|
4385
4401
|
"type": "\"warning\" | \"destructive\" | \"info\""
|
|
4402
|
+
},
|
|
4403
|
+
{
|
|
4404
|
+
"description": "DOM id on the root. Useful here because the surface is usually inside a Dialog: it is what a `aria-describedby` on the dialog, or a deep link back to the issued credential, can point at.",
|
|
4405
|
+
"name": "id",
|
|
4406
|
+
"type": "string"
|
|
4407
|
+
},
|
|
4408
|
+
{
|
|
4409
|
+
"description": "Accessible name for the credential region when `label` is not set or is a non-string node. `label` is the VISIBLE caption and already names the region when it is a plain string, so reach for this only when the caption is rich content or when the surrounding dialog title is the only thing saying which secret this is.",
|
|
4410
|
+
"name": "aria-label",
|
|
4411
|
+
"type": "string"
|
|
4386
4412
|
}
|
|
4387
4413
|
],
|
|
4388
4414
|
"related": [
|
|
@@ -5835,6 +5861,11 @@
|
|
|
5835
5861
|
"description": "Disable search input and clearing.",
|
|
5836
5862
|
"name": "disabled",
|
|
5837
5863
|
"type": "boolean"
|
|
5864
|
+
},
|
|
5865
|
+
{
|
|
5866
|
+
"description": "Class on the `<input>` itself. SearchInput renders a WRAPPER (label, icon, clear button, input), so `className` lands on that wrapper and never reaches the field — this is the second handle, for the case where the field and its chrome need different treatment. Layout and colour still belong to tokens; use it for the rare geometry a token cannot reach.",
|
|
5867
|
+
"name": "inputClassName",
|
|
5868
|
+
"type": "string"
|
|
5838
5869
|
}
|
|
5839
5870
|
],
|
|
5840
5871
|
"related": [
|
|
@@ -6310,6 +6341,12 @@
|
|
|
6310
6341
|
"name": "id",
|
|
6311
6342
|
"type": "string"
|
|
6312
6343
|
},
|
|
6344
|
+
{
|
|
6345
|
+
"defaultValue": "false",
|
|
6346
|
+
"description": "ANNOUNCES the requirement; it does not enforce it. react-aria's Switch omits `isRequired`, and a switch is never the target of native constraint validation in this library, so this writes `aria-required=\"true\"` onto the real input and stops there. The form layer (FormField / your schema) still owns whether an unflipped switch blocks submit — pairing this with nothing that validates is how a screen reader ends up promising a check the form never makes.",
|
|
6347
|
+
"name": "required",
|
|
6348
|
+
"type": "boolean"
|
|
6349
|
+
},
|
|
6313
6350
|
{
|
|
6314
6351
|
"defaultValue": "false",
|
|
6315
6352
|
"description": "Disable the toggle.",
|
|
@@ -6542,6 +6579,12 @@
|
|
|
6542
6579
|
"name": "id",
|
|
6543
6580
|
"type": "string"
|
|
6544
6581
|
},
|
|
6582
|
+
{
|
|
6583
|
+
"defaultValue": "false",
|
|
6584
|
+
"description": "Keeps its HTML spelling here and becomes react-aria's `isRequired`, so unlike Switch — where the same prop only ANNOUNCES the requirement — this is real constraint validation on the underlying input: an unchecked box blocks native form submission. The consent checkbox is the case it exists for. It does not render an asterisk; the required MARK belongs to FormField's label.",
|
|
6585
|
+
"name": "required",
|
|
6586
|
+
"type": "boolean"
|
|
6587
|
+
},
|
|
6545
6588
|
{
|
|
6546
6589
|
"description": "antd `<Checkbox>label</Checkbox>` — the INLINE label: box first, label at inline-end on the same line, the same markup as a `Checkbox.Group` option. A real `<label for>`: clicking the text toggles the box and the text is its accessible name. `className` then styles the labelled row.",
|
|
6547
6590
|
"name": "children",
|
|
@@ -7682,6 +7725,16 @@
|
|
|
7682
7725
|
"description": "Ant Design `onTabScroll`, fired whenever the trigger strip's own scrollport moves — a swipe, a wheel, or the component re-pinning the active trigger (antd reports its own re-pins too). LOGICAL VALUES instead of antd's `left | right | top | bottom`: two of those four are just the other axis of the same event, and upstream's pair is read off the sign of an inner transform, so in an RTL strip its `left` means the opposite of what it means in LTR. `start`/`end` say the same thing on whichever axis and in whichever direction the strip is written. Only fires for the `items` API, which is the path that owns the strip element.",
|
|
7683
7726
|
"name": "onTabScroll",
|
|
7684
7727
|
"type": "(info: { direction: \"start\" | \"end\" }) => void"
|
|
7728
|
+
},
|
|
7729
|
+
{
|
|
7730
|
+
"description": "Class on the TRIGGER STRIP (`TabsList`) under the `items` API — the handle that composing the tree manually gives you as `<TabsList className>`. `className` reaches only the root, which holds the strip AND the panels, so anything meant for the bar alone belongs here. Almost always unnecessary: placement, size, centring and the card rail are props and `--tabs-*` tokens.",
|
|
7731
|
+
"name": "listClassName",
|
|
7732
|
+
"type": "string"
|
|
7733
|
+
},
|
|
7734
|
+
{
|
|
7735
|
+
"description": "Class on EVERY panel (`TabsContent`) under the `items` API. It is written so it can WIN: the joined card body travels to CSS as `data-bodied` on the root rather than as a class, precisely so a consumer class on the panel is not fighting a utility the component already claimed (gh#762). Reach for the `bodied` prop and the `--tabs-panel-*` tokens first — this is for the geometry no token exposes.",
|
|
7736
|
+
"name": "contentClassName",
|
|
7737
|
+
"type": "string"
|
|
7685
7738
|
}
|
|
7686
7739
|
],
|
|
7687
7740
|
"related": [
|
|
@@ -8741,6 +8794,11 @@
|
|
|
8741
8794
|
"description": "Search query change (antd `showSearch.onSearch`).",
|
|
8742
8795
|
"name": "onSearchChange",
|
|
8743
8796
|
"type": "(query: string) => void"
|
|
8797
|
+
},
|
|
8798
|
+
{
|
|
8799
|
+
"description": "Accessible name for the COMBOBOX TRIGGER — the element a keyboard user lands on, not the panel. Inside a FormField it is injected for you and you do not pass it; on a bare Cascader (a toolbar scope filter, a compact drilldown with no label row) it is the only name the control has, and cardinal rule 227 requires one. Route it through t(). The rest of the field-a11y contract — aria-labelledby / describedby / errormessage / invalid / required — is accepted on every form-capable component here and is FormField's to wire.",
|
|
8800
|
+
"name": "aria-label",
|
|
8801
|
+
"type": "string"
|
|
8744
8802
|
}
|
|
8745
8803
|
],
|
|
8746
8804
|
"related": [
|
|
@@ -9101,6 +9159,11 @@
|
|
|
9101
9159
|
"name": "className",
|
|
9102
9160
|
"type": "string"
|
|
9103
9161
|
},
|
|
9162
|
+
{
|
|
9163
|
+
"description": "Lands on the `role=\"group\"` shuttle container, not on any one input — a two-pane shuttle has no single labelable control, so this is what a FormField label points at. FormField injects it; pass it yourself only for a bare Transfer.",
|
|
9164
|
+
"name": "id",
|
|
9165
|
+
"type": "string"
|
|
9166
|
+
},
|
|
9104
9167
|
{
|
|
9105
9168
|
"description": "Controlled selection state as a tuple: index 0 = keys checked in the source panel, index 1 = keys checked in the target panel. Omit to use internal (uncontrolled) selection state. Must be paired with `onSelectChange` when provided.",
|
|
9106
9169
|
"name": "selectedKeys",
|
|
@@ -9215,6 +9278,11 @@
|
|
|
9215
9278
|
"name": "className",
|
|
9216
9279
|
"type": "string"
|
|
9217
9280
|
},
|
|
9281
|
+
{
|
|
9282
|
+
"description": "Lands on the native `<input type=\"file\">`, NOT on the wrapper — the hidden input is the semantic focus target, so this is what makes a `<label htmlFor>` (or FormField, which injects it) actually focus the picker. Putting it on the visible dropzone instead is the usual reason a label click does nothing.",
|
|
9283
|
+
"name": "id",
|
|
9284
|
+
"type": "string"
|
|
9285
|
+
},
|
|
9218
9286
|
{
|
|
9219
9287
|
"description": "Custom button label for variant='button'. Falls back to the i18n 'Upload file' string.",
|
|
9220
9288
|
"name": "children",
|
|
@@ -12082,6 +12150,41 @@
|
|
|
12082
12150
|
"description": "Main-axis alignment of the whole code row (groups + separators) inside the field. `center` is the canonical auth challenge. Before this existed, every consumer wrapped the OTP in their own flex-centring div — do not. A service that wants all code fields centred sets `--otp-container-align` once instead.",
|
|
12083
12151
|
"name": "align",
|
|
12084
12152
|
"type": "\"start\" | \"center\" | \"end\""
|
|
12153
|
+
},
|
|
12154
|
+
{
|
|
12155
|
+
"description": "Fires ONCE the last slot fills, whether the user typed it or pasted the whole code. This is the auto-submit hook: a 2FA challenge with a visible submit button is a step nobody wants, and the alternative — watching `value.length === maxLength` in an effect — re-fires on every re-render. Keep the submit button anyway for the paste-then-correct case.",
|
|
12156
|
+
"name": "onComplete",
|
|
12157
|
+
"type": "(value: string) => void"
|
|
12158
|
+
},
|
|
12159
|
+
{
|
|
12160
|
+
"description": "Rewrites CLIPBOARD text before it reaches the field. Distinct from `formatter`, which normalises every value: this one only sees a paste, which is where the junk arrives — `\"123 456\"`, `\"code: 123456\"`, a copied SMS line. Note the order the field applies them: `pattern` is matched against the RAW keystroke first, so a pattern must accept what a user actually types, not only what these two produce.",
|
|
12161
|
+
"name": "pasteTransformer",
|
|
12162
|
+
"type": "(pasted: string) => string"
|
|
12163
|
+
},
|
|
12164
|
+
{
|
|
12165
|
+
"description": "Class on the ROW container `input-otp` renders (the slots' flex parent), which `className` cannot reach — `className` lands on the hidden input, because that is the real field. Prefer `align` and the `--otp-*` tokens; this is the vendored escape hatch underneath them.",
|
|
12166
|
+
"name": "containerClassName",
|
|
12167
|
+
"type": "string"
|
|
12168
|
+
},
|
|
12169
|
+
{
|
|
12170
|
+
"description": "`input-otp`'s answer to the 1Password / LastPass badge that browsers float over a code field and that covers the last slot. `increase-width` (its default) reserves room so the badge sits beside the row; `none` turns the accommodation off, which is what a row already centred by `align` usually wants. Pure layout — it changes no value and no keyboard behaviour.",
|
|
12171
|
+
"name": "pushPasswordManagerStrategy",
|
|
12172
|
+
"type": "\"increase-width\" | \"none\""
|
|
12173
|
+
},
|
|
12174
|
+
{
|
|
12175
|
+
"description": "The `<noscript>` stylesheet `input-otp` injects so the slots are still visible with JS disabled. Pass `null` to suppress it — the one real reason being a CSP that forbids inline styles and that `nonce` cannot satisfy. Leave it alone otherwise.",
|
|
12176
|
+
"name": "noScriptCSSFallback",
|
|
12177
|
+
"type": "string | null"
|
|
12178
|
+
},
|
|
12179
|
+
{
|
|
12180
|
+
"description": "CSP nonce stamped on the stylesheet `input-otp` injects. Required only under a `style-src 'nonce-…'` policy, where the field otherwise renders unstyled and the console reports a blocked inline style. Pass the same nonce the document was served with.",
|
|
12181
|
+
"name": "nonce",
|
|
12182
|
+
"type": "string"
|
|
12183
|
+
},
|
|
12184
|
+
{
|
|
12185
|
+
"description": "`input-otp`'s headless mode: you draw the entire row from the slot state instead of composing InputOTPGroup / InputOTPSlot. It is mutually exclusive with `children` — the vendor types the two as a union and this component keeps that union. Reaching for it means giving up the slot styling, the group outline and the separator this package owns, so it is the last resort, not a customisation point.",
|
|
12186
|
+
"name": "render",
|
|
12187
|
+
"type": "(props: InputOTPRenderProps) => React.ReactNode"
|
|
12085
12188
|
}
|
|
12086
12189
|
],
|
|
12087
12190
|
"related": [
|
|
@@ -13849,6 +13952,16 @@
|
|
|
13849
13952
|
"name": "appearance",
|
|
13850
13953
|
"type": "\"bar\" | \"icon\""
|
|
13851
13954
|
},
|
|
13955
|
+
{
|
|
13956
|
+
"description": "Which way the panel opens. DERIVED from `appearance` when unset — `bottom` in a bar (the panel drops below the trigger, the only direction that does not cover the bar itself), `right` otherwise, because a rail is vertical and its panel goes beside it. State it when the chrome can be RE-DOCKED: `appearance` says the trigger is NOT in a bar, and it cannot say which way is out — a rail pinned to the top edge is not a bar and still opens downward. Measured without it, an embedded bar trigger at (2,50) put its panel at (12,90), lying over the host application's sidebar. Not used by `responsive=\"fullscreen\"`, which has no side.",
|
|
13957
|
+
"name": "side",
|
|
13958
|
+
"type": "\"top\" | \"right\" | \"bottom\" | \"left\""
|
|
13959
|
+
},
|
|
13960
|
+
{
|
|
13961
|
+
"description": "Where the panel sits along the `side` edge — the cross-axis half of the same decision, and derived the same way: `end` in a bar (the Workspace shape, flush with the bar's end), `start` otherwise (aligned to the rail trigger's own start). State it alongside `side` when you state either.",
|
|
13962
|
+
"name": "align",
|
|
13963
|
+
"type": "\"start\" | \"center\" | \"end\""
|
|
13964
|
+
},
|
|
13852
13965
|
{
|
|
13853
13966
|
"description": "Controlled open state.",
|
|
13854
13967
|
"name": "open",
|
|
@@ -14037,6 +14150,11 @@
|
|
|
14037
14150
|
"description": "Accessible table name (localized default).",
|
|
14038
14151
|
"name": "label",
|
|
14039
14152
|
"type": "string"
|
|
14153
|
+
},
|
|
14154
|
+
{
|
|
14155
|
+
"description": "DOM id on the grid root. Worth setting on a permissions page that also renders a summary or a legend elsewhere: it is the anchor those can point at, and the stable handle for an E2E selector that must not depend on the localized `label`.",
|
|
14156
|
+
"name": "id",
|
|
14157
|
+
"type": "string"
|
|
14040
14158
|
}
|
|
14041
14159
|
],
|
|
14042
14160
|
"related": [
|
|
@@ -14127,6 +14245,16 @@
|
|
|
14127
14245
|
"description": "Override the localized radio labels (e.g. domain wording like 全店舗).",
|
|
14128
14246
|
"name": "allLabel / selectedLabel",
|
|
14129
14247
|
"type": "ReactNode"
|
|
14248
|
+
},
|
|
14249
|
+
{
|
|
14250
|
+
"description": "Native form name, forwarded to the MODE radio group — the all / selected choice is what submits under it. The checked branch ids are not native fields; they live in the single `{ mode, branchIds }` value and are yours to serialise.",
|
|
14251
|
+
"name": "name",
|
|
14252
|
+
"type": "string"
|
|
14253
|
+
},
|
|
14254
|
+
{
|
|
14255
|
+
"description": "DOM id on the picker root, and the SEED for the ids beneath it — the validation message is `${id}-error`, which is what `aria-errormessage` points at. Left out, a `useId`-based id is generated, so the association still holds; set it when a server-rendered page needs those ids to be stable.",
|
|
14256
|
+
"name": "id",
|
|
14257
|
+
"type": "string"
|
|
14130
14258
|
}
|
|
14131
14259
|
],
|
|
14132
14260
|
"related": [
|
|
@@ -14209,6 +14337,11 @@
|
|
|
14209
14337
|
"description": "Forwarded to MasterDetail (localized region labels by default). Never re-derive tracks or breakpoints in the app.",
|
|
14210
14338
|
"name": "railWidth / masterViewport / collapseBelow / masterLabel / detailLabel",
|
|
14211
14339
|
"type": "MasterDetail geometry + region labels"
|
|
14340
|
+
},
|
|
14341
|
+
{
|
|
14342
|
+
"description": "DOM id on the panel root — the two-region MasterDetail wrapper, not the rail or the detail. It is the handle for a deep link onto the roles panel of a settings page, and for an E2E selector that must survive `masterLabel` being localized.",
|
|
14343
|
+
"name": "id",
|
|
14344
|
+
"type": "string"
|
|
14212
14345
|
}
|
|
14213
14346
|
],
|
|
14214
14347
|
"related": [
|
|
@@ -15117,6 +15250,31 @@
|
|
|
15117
15250
|
"description": "Child mode: visible trigger; upload runs through a hidden input beside it.",
|
|
15118
15251
|
"name": "children",
|
|
15119
15252
|
"type": "ReactElement"
|
|
15253
|
+
},
|
|
15254
|
+
{
|
|
15255
|
+
"description": "antd Upload `onRemove`, narrowed to the attachment row. RETURNING `false` (or a promise of it) VETOES the removal and the card stays — anything else, including `undefined`, lets it go. That is how you gate a removal behind a confirm dialog without owning `items` yourself. It is awaited, so an async guard works.",
|
|
15256
|
+
"name": "onRemove",
|
|
15257
|
+
"type": "(item: AttachmentsItemProp) => boolean | void | Promise<boolean | void>"
|
|
15258
|
+
},
|
|
15259
|
+
{
|
|
15260
|
+
"description": "Ant Design X `classNames` — per-part classes (root, list, card, file, upload, placeholder). DECLARED AND FORWARDED, and the only semantic part map in this package: docs/DESIGN-AUTHORITY.md rules that antd's `classNames`/`styles` maps are NOT adopted because this library answers that layer with tokens (cardinal rule #45), and Attachments is the one component that carries them anyway. Recorded there as a contradiction, not a pattern — do not copy it onto another component, and retune through `--attachments-*` instead.",
|
|
15261
|
+
"name": "classNames",
|
|
15262
|
+
"type": "Partial<Record<AttachmentsSemanticProp, string>>"
|
|
15263
|
+
},
|
|
15264
|
+
{
|
|
15265
|
+
"description": "Ant Design X `styles` — the same part map as `classNames`, as inline styles, and under the same standing ruling against it. Inline styles beat every stylesheet rule, so this is the one handle in the package that can take a part off the design system entirely. The `--attachments-*` tokens are the supported route.",
|
|
15266
|
+
"name": "styles",
|
|
15267
|
+
"type": "Partial<Record<AttachmentsSemanticProp, React.CSSProperties>>"
|
|
15268
|
+
},
|
|
15269
|
+
{
|
|
15270
|
+
"description": "Ant Design X `rootClassName` — the outermost node. It is not a duplicate of `className`: in the full-screen-drop mode (`getDropContainer`) the outermost node is the OVERLAY rather than the inline tray, which is why antd separates the two. Both are applied.",
|
|
15271
|
+
"name": "rootClassName",
|
|
15272
|
+
"type": "string"
|
|
15273
|
+
},
|
|
15274
|
+
{
|
|
15275
|
+
"description": "ACCEPTED AND INERT. Ant Design X forwards it to its own Image preview; this package has no Image primitive yet, so the prop exists only so an Ant X call site type-checks, and passing it changes nothing on screen. Do not reach for it expecting a preview knob.",
|
|
15276
|
+
"name": "imageProps",
|
|
15277
|
+
"type": "Record<string, unknown>"
|
|
15120
15278
|
}
|
|
15121
15279
|
],
|
|
15122
15280
|
"related": [
|
|
@@ -15134,7 +15292,7 @@
|
|
|
15134
15292
|
"usage": [
|
|
15135
15293
|
"DO keep antd field names on each item (`thumbUrl`, `originFileObj`, `uid`) — an Ant X call site should compile unchanged.",
|
|
15136
15294
|
"DO use `ref.select({ accept, multiple })` to open the picker programmatically (Ant X 2.0).",
|
|
15137
|
-
"
|
|
15295
|
+
"Ant X's `classNames` / `styles` / `rootClassName` ARE declared and forwarded, although docs/DESIGN-AUTHORITY.md rules that antd's semantic part maps are not adopted here. The older note in this slot said not to expect them at all; the type has never agreed with it, so an agent reading only the catalog was told the opposite of what autocomplete offered. Retune through the `--attachments-*` tokens, and treat the maps as a recorded contradiction on this one component rather than a pattern to reuse.",
|
|
15138
15296
|
"The card is a FIXED box — 268x68 (Ant X's own), from `--attachments-card-size` (inline) and `--attachments-card-block-size`. The block size is also the `+` tile's square and the `overflow=\"scrollY\"` one-row viewport, so retune it once and all three follow. The file input is `sr-only`: never style it visible."
|
|
15139
15297
|
],
|
|
15140
15298
|
"useCases": [
|
package/agent/index.json
CHANGED
|
@@ -48,9 +48,9 @@
|
|
|
48
48
|
"note": "Pin to the tag that matches the @godxjp/ui version you installed. A catalog newer than your package describes props you do not have; older, and it hides props you do.",
|
|
49
49
|
"read": {
|
|
50
50
|
"live": "https://raw.githubusercontent.com/godx-jp/godxjp-ui/main/agent/index.json",
|
|
51
|
-
"pinned": "https://raw.githubusercontent.com/godx-jp/godxjp-ui/v28.
|
|
51
|
+
"pinned": "https://raw.githubusercontent.com/godx-jp/godxjp-ui/v28.13.0/agent/index.json"
|
|
52
52
|
},
|
|
53
53
|
"source": "mcp/src/data — the same data @godxjp/ui-mcp serves",
|
|
54
54
|
"start": "https://raw.githubusercontent.com/godx-jp/godxjp-ui/main/agent/START-HERE.md",
|
|
55
|
-
"version": "28.
|
|
55
|
+
"version": "28.13.0"
|
|
56
56
|
}
|