@godxjp/ui 27.1.0 → 27.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/dist/components/data-display/badge.d.ts +10 -3
  2. package/dist/components/data-display/badge.js +14 -3
  3. package/dist/components/data-display/data-table.d.ts +20 -12
  4. package/dist/components/data-display/data-table.js +53 -5
  5. package/dist/components/data-display/range-timeline.d.ts +16 -0
  6. package/dist/components/data-display/range-timeline.js +115 -80
  7. package/dist/components/data-display/table.d.ts +16 -0
  8. package/dist/components/data-display/table.js +2 -0
  9. package/dist/components/data-entry/checkbox.js +23 -5
  10. package/dist/components/data-entry/command.d.ts +3 -1
  11. package/dist/components/data-entry/command.js +10 -2
  12. package/dist/components/data-entry/form-field.js +9 -8
  13. package/dist/components/data-entry/index.d.ts +1 -0
  14. package/dist/components/data-entry/search-select.js +145 -136
  15. package/dist/components/data-entry/select.js +38 -3
  16. package/dist/components/general/icon.d.ts +31 -0
  17. package/dist/components/general/icon.js +23 -0
  18. package/dist/components/general/index.d.ts +2 -0
  19. package/dist/components/general/index.js +2 -0
  20. package/dist/components/layout/flex.d.ts +2 -2
  21. package/dist/components/layout/flex.js +7 -1
  22. package/dist/components/layout/org-switcher.js +1 -1
  23. package/dist/components/layout/responsive-grid.d.ts +8 -2
  24. package/dist/components/layout/responsive-grid.js +2 -0
  25. package/dist/components/layout/topbar-item.d.ts +1 -0
  26. package/dist/components/layout/topbar-item.js +3 -1
  27. package/dist/contracts/measurement.json +1 -1
  28. package/dist/form/form-field-control.d.ts +1 -1
  29. package/dist/form/form-field-control.js +32 -23
  30. package/dist/i18n/messages/en.json +2 -1
  31. package/dist/i18n/messages/ja.json +2 -1
  32. package/dist/i18n/messages/vi.json +2 -1
  33. package/dist/props/components/data-display.prop.d.ts +12 -0
  34. package/dist/props/components/data-entry.prop.d.ts +10 -0
  35. package/dist/props/components/form.prop.d.ts +34 -2
  36. package/dist/props/components/general.prop.d.ts +42 -1
  37. package/dist/props/components/index.d.ts +1 -1
  38. package/dist/props/components/layout.prop.d.ts +49 -0
  39. package/dist/props/registry.d.ts +57 -3
  40. package/dist/props/registry.js +62 -2
  41. package/dist/props/vocabulary/data.prop.d.ts +27 -1
  42. package/dist/props/vocabulary/index.d.ts +2 -2
  43. package/dist/props/vocabulary/interaction.prop.d.ts +11 -0
  44. package/dist/styles/control.css +44 -1
  45. package/dist/styles/core.css +2 -0
  46. package/dist/styles/data-display-layout.css +58 -1
  47. package/dist/styles/form-layout.css +21 -0
  48. package/dist/styles/icon-layout.css +37 -0
  49. package/dist/styles/index.css +2 -0
  50. package/dist/styles/layout.css +7 -0
  51. package/dist/styles/navigation-layout.css +5 -1
  52. package/dist/styles/shell-layout.css +11 -14
  53. package/dist/styles/table-layout.css +80 -8
  54. package/dist/styles/text-layout.css +16 -8
  55. package/dist/tokens/components/control.css +5 -0
  56. package/dist/tokens/components/data-display.css +6 -0
  57. package/dist/tokens/components/navigation.css +1 -1
  58. package/dist/tokens/components/table.css +2 -0
  59. package/docs/CONSUMER-RULES.md +2 -2
  60. package/docs/DESIGN-AUTHORITY.md +32 -1
  61. package/docs/FRAME-COVERAGE-REPORT.md +3 -2
  62. package/docs/data-display/data-table/examples/server-paged.tsx +156 -0
  63. package/docs/data-display/data-table/examples/striped-list.tsx +173 -0
  64. package/docs/data-display/popover.tsx +43 -1
  65. package/docs/data-display/timeline.tsx +73 -9
  66. package/docs/data-entry/command.tsx +80 -1
  67. package/docs/data-entry/form-root.tsx +12 -2
  68. package/docs/general/icon.tsx +215 -0
  69. package/docs/layout/flex.tsx +59 -0
  70. package/docs/layout/responsive-grid.tsx +100 -0
  71. package/docs/layout/topbar-item.tsx +29 -1
  72. package/package.json +3 -2
  73. package/scripts/consumer-rule.md +18 -17
  74. package/scripts/ui-audit.mjs +128 -0
@@ -1,3 +1,3 @@
1
1
  import type { FlexProp } from "../../props/components/layout.prop.js";
2
- export type { FlexAlignProp, FlexDirectionProp, FlexJustifyProp, FlexProp, FlexProp as FlexProps, } from "../../props/components/layout.prop.js";
3
- export declare function Flex({ as: Element, direction, grow, shrink, surface, bleed, reveal, gap, gapRaw, pad, padRaw, align, justify, wrap, hideBelow, hideFrom, hideBelowRaw, hideFromRaw, fill, width, className, style, children, ...props }: FlexProp): import("react").JSX.Element;
2
+ export type { FlexAlignProp, FlexDirectionProp, FlexJustifyProp, FlexMarkerProp, FlexProp, FlexProp as FlexProps, } from "../../props/components/layout.prop.js";
3
+ export declare function Flex({ as: Element, direction, marker, grow, shrink, surface, bleed, reveal, gap, gapRaw, pad, padRaw, align, justify, wrap, hideBelow, hideFrom, hideBelowRaw, hideFromRaw, fill, width, className, style, children, ...props }: FlexProp): import("react").JSX.Element;
@@ -6,9 +6,15 @@ import { flexGapClass, padStyle, padStepToken } from "../../lib/variants.js";
6
6
  const toCssLength = (value) => typeof value === "number" ? `${value}px` : value;
7
7
  const rawBreakpoint = (value) => typeof value === "number" && Number.isFinite(value) ? value : void 0;
8
8
  const rawBreakpointRule = (axis, px) => `@media (width ${axis === "below" ? "<" : ">="} ${px}px){.ui-flex[data-hide-${axis}-raw="${px}"]{display:none}}`;
9
+ const listMarker = (element, marker) => {
10
+ if (element !== "ul" && element !== "ol") return void 0;
11
+ const resolved = marker ?? (element === "ul" ? "disc" : "decimal");
12
+ return resolved === "none" ? void 0 : resolved;
13
+ };
9
14
  function Flex({
10
15
  as: Element = "div",
11
16
  direction = "row",
17
+ marker,
12
18
  grow,
13
19
  shrink,
14
20
  surface,
@@ -65,7 +71,7 @@ function Flex({
65
71
  "data-shrink": shrink === false ? "false" : void 0,
66
72
  "data-surface": surface,
67
73
  "data-reveal": reveal,
68
- "data-list": Element === "ul" ? "disc" : Element === "ol" ? "decimal" : void 0,
74
+ "data-list": listMarker(Element, marker),
69
75
  "data-align": align,
70
76
  "data-justify": justify,
71
77
  "data-wrap": wrap ? "true" : void 0,
@@ -105,7 +105,7 @@ function OrgSwitcherPanel({
105
105
  ] }) : null
106
106
  ] });
107
107
  }
108
- return /* @__PURE__ */ jsxs(Command, { label: labels.title, className: "ui-org-switcher-command", children: [
108
+ return /* @__PURE__ */ jsxs(Command, { label: labels.title, className: "ui-org-switcher-command", split: true, children: [
109
109
  /* @__PURE__ */ jsx(CommandInput, { placeholder: labels.search, "aria-label": labels.search }),
110
110
  /* @__PURE__ */ jsxs(CommandList, { children: [
111
111
  /* @__PURE__ */ jsx(CommandEmpty, { children: labels.empty }),
@@ -1,5 +1,5 @@
1
1
  import type { ReactNode } from "react";
2
- import type { ResponsiveGridColumnsProp, ResponsiveGridFlowProp, ResponsiveGridPresetProp } from "../../props/components/layout.prop.js";
2
+ import type { ResponsiveGridAlignProp, ResponsiveGridColumnsProp, ResponsiveGridFlowProp, ResponsiveGridPresetProp } from "../../props/components/layout.prop.js";
3
3
  import type { PadProp, PadRawProp } from "../../props/vocabulary/index.js";
4
4
  import type { GapProp } from "../../props/vocabulary/layout.prop.js";
5
5
  export type ResponsiveGridProps = {
@@ -12,6 +12,12 @@ export type ResponsiveGridProps = {
12
12
  columns?: ResponsiveGridColumnsProp;
13
13
  /** Keep collections in a horizontal sequence; pair with ScrollArea orientation="horizontal". */
14
14
  flow?: ResponsiveGridFlowProp;
15
+ /**
16
+ * Block-axis alignment of the cells (antd `Row align`). `stretch` makes every cell as tall as
17
+ * the tallest — Kanban lanes, where an empty lane must stay a full-height drop zone. Omitted,
18
+ * `flow="columns"` aligns to `start` and `flow="rows"` stretches, as before.
19
+ */
20
+ align?: ResponsiveGridAlignProp;
15
21
  /**
16
22
  * Named column geometry for a recognised collection shape — see `ResponsiveGridPresetProp`.
17
23
  * Wins over `columns` when both are set, so a caller migrating to a preset does not also need
@@ -20,7 +26,7 @@ export type ResponsiveGridProps = {
20
26
  preset?: ResponsiveGridPresetProp;
21
27
  children: ReactNode;
22
28
  };
23
- export declare function ResponsiveGrid({ columns, flow, gap, pad, padRaw, preset, className, children, }: ResponsiveGridProps): import("react").JSX.Element;
29
+ export declare function ResponsiveGrid({ columns, flow, align, gap, pad, padRaw, preset, className, children, }: ResponsiveGridProps): import("react").JSX.Element;
24
30
  export declare namespace ResponsiveGrid {
25
31
  export { ResponsiveGridItem as Item };
26
32
  }
@@ -31,6 +31,7 @@ function toStyle(resolved) {
31
31
  function ResponsiveGrid({
32
32
  columns = 4,
33
33
  flow = "rows",
34
+ align,
34
35
  gap,
35
36
  pad,
36
37
  padRaw,
@@ -45,6 +46,7 @@ function ResponsiveGrid({
45
46
  className: cn("ui-responsive-grid", className),
46
47
  "data-gap": gap,
47
48
  "data-flow": flow === "columns" ? "columns" : void 0,
49
+ "data-align": align,
48
50
  style: { ...toStyle(resolved), ...padStyle(pad, padRaw) },
49
51
  "data-pad-raw": padRaw === void 0 ? void 0 : "",
50
52
  children
@@ -12,6 +12,7 @@ export type { TopbarItemProp, TopbarItemProp as TopbarItemProps, } from "../../p
12
12
  */
13
13
  export declare const TopbarItem: React.ForwardRefExoticComponent<Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "children"> & {
14
14
  hideBelow?: import("../../props/index.js").BreakpointProp;
15
+ icon?: React.ReactNode;
15
16
  badge?: React.ReactNode;
16
17
  badgeTone?: import("../../props/components/layout.prop.js").SidebarBadgeToneProp;
17
18
  asChild?: boolean;
@@ -2,9 +2,10 @@ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
2
  import * as React from "react";
3
3
  import { Slot } from "../../lib/slot.js";
4
4
  import { cn } from "../../lib/utils.js";
5
- const TopbarItem = React.forwardRef(function TopbarItem2({ asChild = false, className, type, hideBelow, badge, badgeTone, children, ...props }, ref) {
5
+ const TopbarItem = React.forwardRef(function TopbarItem2({ asChild = false, className, type, hideBelow, icon, badge, badgeTone, children, ...props }, ref) {
6
6
  const Comp = asChild ? Slot : "button";
7
7
  const showBadge = !asChild && badge !== void 0 && badge !== "";
8
+ const iconNode = !asChild && icon !== void 0 && icon !== null && icon !== false ? /* @__PURE__ */ jsx("span", { "data-slot": "topbar-item-icon", className: "ui-topbar-item-icon", children: icon }) : null;
8
9
  const badgeNode = showBadge ? /* @__PURE__ */ jsx(
9
10
  "span",
10
11
  {
@@ -24,6 +25,7 @@ const TopbarItem = React.forwardRef(function TopbarItem2({ asChild = false, clas
24
25
  type: asChild ? void 0 : type ?? "button",
25
26
  ...props,
26
27
  children: asChild ? children : /* @__PURE__ */ jsxs(Fragment, { children: [
28
+ iconNode,
27
29
  children,
28
30
  badgeNode
29
31
  ] })
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$comment": "AUTO-GENERATED by scripts/gen-measurement-contract.mjs — do not edit. Read this instead of guessing: docs/MEASUREMENT-CONTRACT.md.",
3
- "version": "27.1.0",
3
+ "version": "27.4.1",
4
4
  "targetSize": {
5
5
  "standard": "WCAG 2.2 SC 2.5.8 Target Size (Minimum), level AA — 24×24 CSS px",
6
6
  "min": 24,
@@ -2,4 +2,4 @@ import * as React from "react";
2
2
  import { type FieldValues } from "react-hook-form";
3
3
  import type { FormFieldControlProp } from "../props/components/form.prop.js";
4
4
  export type { FormFieldControlProp } from "../props/components/form.prop.js";
5
- export declare function FormFieldControl<TFieldValues extends FieldValues>({ name, id, field: fieldKey, labelAddon, layout, labelWidth, controlWidth, colSpan, label, required, helper, disabled, dependencies, getValueFromEvent, normalize, help, validateStatus, hasFeedback, feedback, preserve, className, children, }: FormFieldControlProp<TFieldValues>): React.JSX.Element;
5
+ export declare function FormFieldControl<TFieldValues extends FieldValues>({ name, id, field: fieldKey, labelAddon, layout, labelWidth, controlWidth, colSpan, label, required, helper, disabled, dependencies, getValueFromEvent, normalize, help, validateStatus, hasFeedback, feedback, preserve, className, valuePropName, children, }: FormFieldControlProp<TFieldValues>): React.JSX.Element;
@@ -51,6 +51,7 @@ function FormFieldControl({
51
51
  feedback,
52
52
  preserve,
53
53
  className,
54
+ valuePropName,
54
55
  children
55
56
  }) {
56
57
  const autoId = React.useId();
@@ -62,9 +63,23 @@ function FormFieldControl({
62
63
  const isDisabled = disabled ?? formDisabled;
63
64
  const disabledProp = isDisabled ? { disabled: true } : disabled === false ? { disabled: false } : void 0;
64
65
  const readValue = (args, previousValue) => {
65
- const raw = getValueFromEvent ? getValueFromEvent(...args) : extractControlValue(args[0]);
66
+ const extracted = getValueFromEvent ? getValueFromEvent(...args) : extractControlValue(args[0]);
67
+ const raw = valuePropName === "checked" ? extracted === true : extracted;
66
68
  return normalize ? normalize(raw, previousValue) : raw;
67
69
  };
70
+ const renderControl = (bag) => {
71
+ const render = children;
72
+ if (valuePropName === "checked") {
73
+ const { value, onChange, ...rest } = bag;
74
+ return render({
75
+ ...rest,
76
+ checked: value === true,
77
+ onCheckedChange: (checked) => onChange(checked),
78
+ ...disabledProp
79
+ });
80
+ }
81
+ return render(bindField({ ...bag, ...disabledProp }));
82
+ };
68
83
  if (adapter) {
69
84
  const fieldName = String(name);
70
85
  return /* @__PURE__ */ jsx(
@@ -81,17 +96,14 @@ function FormFieldControl({
81
96
  hasFeedback,
82
97
  feedback,
83
98
  className,
84
- children: children(
85
- bindField({
86
- id: resolvedId,
87
- name: fieldName,
88
- value: adapter.getValue(fieldName),
89
- onChange: (...args) => adapter.setValue(fieldName, readValue(args, adapter.getValue(fieldName))),
90
- onBlur: () => adapter.onBlur?.(fieldName),
91
- ref: noopRef,
92
- ...disabledProp
93
- })
94
- )
99
+ children: renderControl({
100
+ id: resolvedId,
101
+ name: fieldName,
102
+ value: adapter.getValue(fieldName),
103
+ onChange: (...args) => adapter.setValue(fieldName, readValue(args, adapter.getValue(fieldName))),
104
+ onBlur: () => adapter.onBlur?.(fieldName),
105
+ ref: noopRef
106
+ })
95
107
  }
96
108
  );
97
109
  }
@@ -125,17 +137,14 @@ function FormFieldControl({
125
137
  hasFeedback,
126
138
  feedback,
127
139
  className,
128
- children: children(
129
- bindField({
130
- id: resolvedId,
131
- name: field.name,
132
- value: field.value,
133
- onChange: (...args) => field.onChange(readValue(args, field.value)),
134
- onBlur: field.onBlur,
135
- ref: field.ref,
136
- ...disabledProp
137
- })
138
- )
140
+ children: renderControl({
141
+ id: resolvedId,
142
+ name: field.name,
143
+ value: field.value,
144
+ onChange: (...args) => field.onChange(readValue(args, field.value)),
145
+ onBlur: field.onBlur,
146
+ ref: field.ref
147
+ })
139
148
  }
140
149
  )
141
150
  }
@@ -607,7 +607,8 @@
607
607
  "trendCurrent": "current"
608
608
  },
609
609
  "rangeTimeline": {
610
- "outsideRange": "Outside the visible range",
610
+ "outsideAfter": "After the visible range",
611
+ "outsideBefore": "Before the visible range",
611
612
  "schedule": "Schedule"
612
613
  },
613
614
  "textExamples": {
@@ -594,7 +594,8 @@
594
594
  "trendCurrent": "現在"
595
595
  },
596
596
  "rangeTimeline": {
597
- "outsideRange": "表示範囲外",
597
+ "outsideAfter": "表示範囲より後",
598
+ "outsideBefore": "表示範囲より前",
598
599
  "schedule": "スケジュール"
599
600
  },
600
601
  "textExamples": {
@@ -595,7 +595,8 @@
595
595
  "trendCurrent": "hiện tại"
596
596
  },
597
597
  "rangeTimeline": {
598
- "outsideRange": "Ngoài khoảng đang xem",
598
+ "outsideAfter": "Sau khoảng đang xem",
599
+ "outsideBefore": "Trước khoảng đang xem",
599
600
  "schedule": "Lịch công việc"
600
601
  },
601
602
  "textExamples": {
@@ -294,6 +294,12 @@ export type BadgeProp = {
294
294
  * Port name `onRemove` (not `onClose`) — see {@link Badge} JSDoc and `docs/DESIGN-AUTHORITY.md`.
295
295
  */
296
296
  onRemove?: () => void;
297
+ /**
298
+ * The × button's full accessible name, verbatim (antd 5.15+ `closable={{ 'aria-label' }}`, gh#706).
299
+ * Without it the name quotes the chip's label — a string `children`, or the label's rendered text
300
+ * when `children` is a link or other node.
301
+ */
302
+ removeLabel?: string;
297
303
  };
298
304
  /** @see CredentialReveal */
299
305
  /**
@@ -403,6 +409,12 @@ export type DataTableProp<T> = {
403
409
  onRow?: OnRowProp<T>;
404
410
  /** Outer frame + vertical rules between columns (antd `bordered`). */
405
411
  bordered?: boolean;
412
+ /**
413
+ * Zebra rows by logical record (Element Plus `stripe`, Bootstrap `.table-striped`; antd has no
414
+ * prop). Omit to inherit the theme default `--table-row-striped-alpha`; `true` / `false`
415
+ * override it for this table.
416
+ */
417
+ striped?: boolean;
406
418
  /** Explain the next sort step in a tooltip on sortable headers (antd `showSorterTooltip`). */
407
419
  showSorterTooltip?: boolean;
408
420
  /** Table-wide sort cycle; a column's own `sortDirections` wins (antd `sortDirections`). */
@@ -114,6 +114,16 @@ export type ControlCountProp = {
114
114
  strategy?: (value: string) => number;
115
115
  };
116
116
  /** @see Input */
117
+ /** `Command` — the library's own knob; cmdk's root props pass through untouched beside it. */
118
+ export type CommandProp = {
119
+ /**
120
+ * antd `List` `split`: draw the list as ONE ruled box — group padding 0, rows full-bleed to the
121
+ * panel edge with a square highlight, a hairline `border-block-end` between rows and none after
122
+ * the last visible one. For option / checkbox lists (filter facets, pickers). Default `false`:
123
+ * a command palette keeps its airy, inset rows.
124
+ */
125
+ split?: boolean;
126
+ };
117
127
  export type InputProp = Omit<React.InputHTMLAttributes<HTMLInputElement>, "size" | "prefix"> & {
118
128
  onValueChange?: (value: string) => void;
119
129
  /** Control height tier: `md` (default), `sm` or `lg` — the same tiers as SelectTrigger. */
@@ -117,7 +117,12 @@ export type FormRootProp<TFieldValues extends FieldValues> = {
117
117
  /** @see FormFieldControl */
118
118
  export type FormFieldControlProp<TFieldValues extends FieldValues> = Pick<import("./data-entry.prop.js").FormFieldProp, "id" | "field" | "labelAddon" | "layout" | "labelWidth" | "controlWidth" | "colSpan"> & {
119
119
  name: FieldPath<TFieldValues>;
120
- label: LabelProp;
120
+ /**
121
+ * Field label. Optional (antd `Form.Item`): omitted, the field renders NO label row and reserves
122
+ * no space for one — the boolean-field shape, where the control carries its own inline label
123
+ * (`valuePropName="checked"` + `<Checkbox {...field}>label</Checkbox>`).
124
+ */
125
+ label?: LabelProp;
121
126
  required?: RequiredProp;
122
127
  helper?: HelperProp;
123
128
  /**
@@ -164,6 +169,12 @@ export type FormFieldControlProp<TFieldValues extends FieldValues> = Pick<import
164
169
  */
165
170
  preserve?: boolean;
166
171
  className?: string;
172
+ } & ({
173
+ /**
174
+ * Which prop of the control carries the value (antd `valuePropName`). Default `"value"`: the
175
+ * render prop receives `value` / `onChange` / `onValueChange`.
176
+ */
177
+ valuePropName?: "value";
167
178
  children: (field: {
168
179
  id: string;
169
180
  name: string;
@@ -180,7 +191,28 @@ export type FormFieldControlProp<TFieldValues extends FieldValues> = Pick<import
180
191
  /** Present (and `true`) only when the field is disabled, so `{...field}` never re-enables a control. */
181
192
  disabled?: DisabledProp;
182
193
  }) => React.ReactNode;
183
- };
194
+ } | {
195
+ /**
196
+ * `"checked"` (antd `valuePropName="checked"`) — a boolean field. The render prop receives
197
+ * `checked` / `onCheckedChange` instead of `value` / `onChange`, so
198
+ * `{(field) => <Checkbox {...field}>label</Checkbox>}` (or `<Switch {...field} />`) needs no
199
+ * wiring. The stored value is always a boolean: `"indeterminate"` and any non-`true` payload
200
+ * store `false`.
201
+ */
202
+ valuePropName: "checked";
203
+ children: (field: {
204
+ id: string;
205
+ name: string;
206
+ /** `true` only when the stored value is exactly `true`. */
207
+ checked: boolean;
208
+ onCheckedChange: (checked: boolean | "indeterminate") => void;
209
+ onBlur: () => void;
210
+ /** Same callback ref as the `"value"` bag — spreads onto `Checkbox` / `Switch` with no cast. */
211
+ ref: React.RefCallback<HTMLElement>;
212
+ /** Present (and `true`) only when the field is disabled, so `{...field}` never re-enables a control. */
213
+ disabled?: DisabledProp;
214
+ }) => React.ReactNode;
215
+ });
184
216
  /**
185
217
  * @see FormFieldArray — dynamic repeating fields (antd `Form.List`) on react-hook-form's
186
218
  * `useFieldArray`. `name` is the array field; each row hands back the dotted path prefix to build
@@ -1,6 +1,6 @@
1
1
  /** Foundation component prop types — @see docs/COMPONENTS.md#foundation */
2
2
  import type * as React from "react";
3
- import type { ActivityAnnounceProp, ActivityVariantProp, AsChildProp, ButtonSizeProp, ButtonVariantProp, ChildrenProp, ClassNameProp, DescriptionProp, DisabledProp, FontWeightProp, HeadingLevelProp, IdProp, LabelProp, OnClickProp, OnOpenChangeProp, OpenProp, PendingProp, RevealDelayProp, ShapeProp, SizeProp, TextAlignProp, TextSizeProp, TextToneProp, TextWhitespaceProp, TitleLevelProp, TypographyActionsConfigProp, TypographyCopyConfigProp, TypographyEditConfigProp, TypographyEllipsisConfigProp, TypographyTypeProp } from "../vocabulary/index.js";
3
+ import type { ActivityAnnounceProp, ActivityVariantProp, AsChildProp, ButtonSizeProp, ButtonVariantProp, ChildrenProp, ClassNameProp, DescriptionProp, DisabledProp, FontWeightProp, HeadingLevelProp, IconSizeProp, IdProp, LabelProp, OnClickProp, OnOpenChangeProp, OpenProp, PendingProp, RevealDelayProp, ShapeProp, SizeProp, TextAlignProp, TextSizeProp, TextToneProp, TextWhitespaceProp, TitleLevelProp, TypographyActionsConfigProp, TypographyCopyConfigProp, TypographyEditConfigProp, TypographyEllipsisConfigProp, TypographyTypeProp } from "../vocabulary/index.js";
4
4
  /**
5
5
  * @see Text — typographic primitive; replaces hand-rolled `<span className="text-[13px] …">`.
6
6
  *
@@ -336,6 +336,47 @@ export type ActivityProp = Omit<React.HTMLAttributes<HTMLSpanElement>, "color">
336
336
  announce?: ActivityAnnounceProp;
337
337
  className?: ClassNameProp;
338
338
  };
339
+ /**
340
+ * @see Icon — the ONE supported way to put a standalone glyph on the `--icon-size-*` scale.
341
+ *
342
+ * A lucide component carries `width="24" height="24"` of its own, and only four rules in this
343
+ * library ever re-size a glyph (`.ui-button svg`, the menu row, the topbar cell, the ListRow
344
+ * leading slot) — three of them direct-child rules. Outside those four a glyph renders at 24px
345
+ * beside 14px text, and a consumer has no supported way to fix it: `docs/CONSUMER-RULES.md` §8
346
+ * forbids `size-4`/`w-[16px]`, and `size={16}` re-derives a scale the theme owns. Measured in a
347
+ * consumer at 38 such glyphs (gh#712).
348
+ *
349
+ * Icon renders ONTO the glyph rather than wrapping it — the sized element IS the `<svg>` — so it
350
+ * composes anywhere a bare glyph does (inside `Text`, in a `Button`, in a table cell, in an `<a>`)
351
+ * and adds no box to the layout.
352
+ */
353
+ export type IconGlyphProp = Omit<React.SVGProps<SVGSVGElement>, "ref" | "children"> & {
354
+ /**
355
+ * The glyph COMPONENT — `as={Lock}`, not `<Lock />`. Any component that forwards SVG props and a
356
+ * ref qualifies (every `lucide-react` icon does); Icon hands it the class, the size attributes
357
+ * and the a11y wiring.
358
+ */
359
+ as: React.ComponentType<React.SVGProps<SVGSVGElement> & React.RefAttributes<SVGSVGElement>>;
360
+ /**
361
+ * Step of the nine-step icon scale. Default `md` (16px — "the default icon step" in
362
+ * docs/TOKENS.md). A glyph beside `Text size="sm"` wants `sm`; an empty-state mark wants `4xl`.
363
+ */
364
+ size?: IconSizeProp;
365
+ /**
366
+ * Semantic colour intent, the same vocabulary `Text` uses. Omitted by default, and that default
367
+ * is load-bearing: a glyph inherits `currentColor`, so an Icon inside a Button, a Badge or a
368
+ * toned `Text` paints in that surface's own ink without being told.
369
+ */
370
+ tone?: TextToneProp;
371
+ /**
372
+ * Accessible NAME, when the glyph carries meaning nothing else on screen says (a lock in a
373
+ * status cell with no text beside it). Localized by the consumer — the library ships no copy.
374
+ * Supplying it switches the glyph from `aria-hidden` to `role="img"` + that name; leave it off
375
+ * (the default) for a decorative glyph beside a visible label, which is the common case.
376
+ */
377
+ label?: string;
378
+ className?: ClassNameProp;
379
+ };
339
380
  /**
340
381
  * FloatButton `type` — the two fills Ant Design gives the corner mark.
341
382
  *
@@ -1,6 +1,6 @@
1
1
  export type { AppLauncherApp, AppLauncherGroup, AppLauncherLabels, AppLauncherProp, AppShellProp, AuthFooterProp, AuthIdentityProp, OrgSwitcherLabels, OrgSwitcherOrganization, OrgSwitcherProp, DragAxisProp, DragBoundsProp, DraggablePanelLabels, DraggablePanelPlacementProp, DraggablePanelPositionProp, DraggablePanelProp, PageContainerProp, PageInsetProp, SidebarItemProp, SidebarProductProp, SidebarProp, SidebarSectionProp, TopbarProp, } from "./layout.prop.js";
2
2
  export type { ButtonProp } from "./general.prop.js";
3
- export type { InputProp, TextareaProp, FormFieldProp, SearchInputProp, CheckboxProp, CheckboxGroupProp, ChoiceOptionProp, RadioProp, RadioGroupProp, SwitchProp, SliderProp, CalendarProp, DatePickerProp, TimePickerProp, ColorPickerProp, UploadProp, UploadFileItemProp, UploadVariantProp, TreeOptionProp, TreeFieldNamesProp, CascaderProp, TreeSelectProp, ShowCheckedStrategyProp, TransferProp, TransferItemProp, } from "./data-entry.prop.js";
3
+ export type { CommandProp, InputProp, TextareaProp, FormFieldProp, SearchInputProp, CheckboxProp, CheckboxGroupProp, ChoiceOptionProp, RadioProp, RadioGroupProp, SwitchProp, SliderProp, CalendarProp, DatePickerProp, TimePickerProp, ColorPickerProp, UploadProp, UploadFileItemProp, UploadVariantProp, TreeOptionProp, TreeFieldNamesProp, CascaderProp, TreeSelectProp, ShowCheckedStrategyProp, TransferProp, TransferItemProp, } from "./data-entry.prop.js";
4
4
  export type { AvatarProp, EmptyStateProp, DescriptionsProp, DescriptionsItemProp, BadgeProp, DataTableProp, QrCodeProp, } from "./data-display.prop.js";
5
5
  export type { ChartDatum, ChartSeriesProp, LineChartProp, BarChartProp, AreaChartProp, PieChartProp, } from "./charts.prop.js";
6
6
  export type { AlertQueryErrorProp, AlertProp, DialogProp, DialogContentProp, AlertTitleProp, AlertContentProp, AlertDescriptionProp, AlertActionsProp, SheetResponsiveProp, SkeletonRowsProp, } from "./feedback.prop.js";
@@ -100,6 +100,11 @@ export type PageContainerProp = {
100
100
  className?: ClassNameProp;
101
101
  };
102
102
  export type FlexDirectionProp = "row" | "col";
103
+ /**
104
+ * List marker for `as="ul"`/`as="ol"` — the CSS `list-style-type` keywords the layer implements,
105
+ * plus `none` for a list that is SEMANTIC ONLY (gh#714).
106
+ */
107
+ export type FlexMarkerProp = "disc" | "decimal" | "none";
103
108
  export type FlexAlignProp = "start" | "center" | "end" | "stretch" | "baseline";
104
109
  export type FlexJustifyProp = "start" | "center" | "end" | "between" | "around" | "evenly";
105
110
  /** @see Flex */
@@ -112,6 +117,26 @@ export type FlexProp = React.HTMLAttributes<HTMLElement> & {
112
117
  * `.ui-flex` rules carry `display: flex`, so the box is identical either way.
113
118
  */
114
119
  as?: "div" | "span" | "ul" | "ol" | "li";
120
+ /**
121
+ * Marker for a LIST element (`as="ul"` → `disc`, `as="ol"` → `decimal` by default); ignored by
122
+ * every other tag.
123
+ *
124
+ * `marker="none"` emits no `data-list` at all, so the list keeps its element, its `<li>`
125
+ * semantics and its `gap`, and loses the bullet AND the `--space-5` indent that come with it.
126
+ *
127
+ * ## Why the axis exists
128
+ *
129
+ * The bullet was unconditional, and the catalog's own idiom — `<ListRow as="li">` inside a list
130
+ * — could not live with it: `.ui-flex[data-list] > li { display: list-item }` outranks
131
+ * `[data-slot="list-row"] { display: flex }`, so every row fell out of flex layout (measured on
132
+ * this page: row height 94.58px → 41.2px once the attribute is gone). The only move left was a
133
+ * RAW `<ul>`, which carries no gap token and which the consumer rules forbid in spirit — one
134
+ * consumer kept three `Flex role="list"` divs for exactly that reason (gh#714).
135
+ *
136
+ * `disc`/`decimal` stay available so an `<ol>` can be bulleted (or a `<ul>` numbered) without a
137
+ * `list-style-type` in a className.
138
+ */
139
+ marker?: FlexMarkerProp;
115
140
  /** Lightweight surfaces for rows and notices; no Card elevation by default. */
116
141
  surface?: "muted" | "popover" | "warning";
117
142
  /** Negative inline inset, using the same spacing scale as pad. */
@@ -266,6 +291,13 @@ export type ResponsiveGridColumnsProp = number | {
266
291
  */
267
292
  export type ResponsiveGridFlowProp = "rows" | "columns";
268
293
  export type ResponsiveGridPresetProp = "pricing-plans";
294
+ /**
295
+ * Block-axis alignment of the cells in each grid row — antd `Row align`, spelled with Flex's
296
+ * `FlexAlignProp` values (antd `top` → `start`; `stretch` is the same word). `stretch` gives every
297
+ * cell the height of the tallest one, so an empty Kanban lane is still a full-height drop zone.
298
+ * Omitted, each flow keeps its own alignment: `columns` → `start`, `rows` → the grid's stretch.
299
+ */
300
+ export type ResponsiveGridAlignProp = Extract<FlexAlignProp, "start" | "stretch">;
269
301
  export type MasterDetailRailWidthProp = "narrow" | "compact" | "standard" | "wide";
270
302
  export type MasterDetailRailProp = "master" | "detail";
271
303
  /**
@@ -1307,6 +1339,23 @@ export type TopbarItemProp = Omit<React.ButtonHTMLAttributes<HTMLButtonElement>,
1307
1339
  */
1308
1340
  /** Hide below a shared responsive breakpoint, without changing cell height. */
1309
1341
  hideBelow?: BreakpointProp;
1342
+ /**
1343
+ * The cell's leading glyph, placed in a slot the CELL sizes (`--topbar-icon-size`).
1344
+ *
1345
+ * Passing the glyph as a child works too — but only while it stays a DIRECT child, because
1346
+ * `.ui-topbar-item > svg` is the rule that sizes it. The moment a cell wraps its glyph (a
1347
+ * `<Flex hideBelow>` so the icon drops at narrow widths) the rule can no longer reach it and the
1348
+ * glyph renders at lucide's intrinsic 24px: measured at 390px on an org-switcher cell, 1.5x the
1349
+ * cell's own step (gh#712). This slot survives that, because the wrapper is the one the cell
1350
+ * placed. The alternative — widening the rule to a descendant — was measured to shrink or grow
1351
+ * OTHER components' glyphs inside the cell (a Badge's 12px glyph became 16px), so it is not one.
1352
+ *
1353
+ * Decorative by convention: the cell's accessible name comes from its own `aria-label` or its
1354
+ * visible label, not from the glyph. For a glyph that must carry a name, or one that needs a
1355
+ * step other than the bar's, pass `<Icon as={…} size=… label=… />` — as this prop's value or as
1356
+ * a child — and it keeps its own metric and its own semantics.
1357
+ */
1358
+ icon?: ReactNode;
1310
1359
  /**
1311
1360
  * Unread count OVERLAID on the cell's glyph — the notification-bell affordance the cell's own use
1312
1361
  * cases name (gh#398). Pass the CONTENT ONLY, exactly like `SidebarItemProp.badge`: a number, a
@@ -352,7 +352,12 @@ export declare const VOCABULARY_REGISTRY: {
352
352
  readonly TablePaginationProp: {
353
353
  readonly file: "vocabulary/data.prop.ts";
354
354
  readonly category: "data";
355
- readonly description: "DataTable pagination object surface — 1-based current | pageSize | total | pageSizeOptions | showSizeChanger | onChange (antd TablePaginationConfig); `false` hides the pager";
355
+ readonly description: "DataTable pagination object surface — 1-based current | pageSize | total | pageSizeOptions | showSizeChanger | showTotal | position | onChange (antd TablePaginationConfig); `false` hides the pager. Without a composed DataTable.Pagination the table renders its own Pagination footer (total + page numbers, density-sized); total > data.length ≤ pageSize reads as server paging";
356
+ };
357
+ readonly TablePaginationPositionProp: {
358
+ readonly file: "vocabulary/data.prop.ts";
359
+ readonly category: "data";
360
+ readonly description: "DataTable pagination footer position (antd TablePaginationPosition, logical) — topStart | topCenter | topEnd | bottomStart | bottomCenter | bottomEnd (default) | none";
356
361
  };
357
362
  readonly TableCellIndentProp: {
358
363
  readonly file: "vocabulary/data.prop.ts";
@@ -429,6 +434,11 @@ export declare const VOCABULARY_REGISTRY: {
429
434
  readonly category: "interaction";
430
435
  readonly description: "Text size — golden-ratio type-scale steps (2xs…2xl), never an arbitrary px";
431
436
  };
437
+ readonly IconSizeProp: {
438
+ readonly file: "vocabulary/interaction.prop.ts";
439
+ readonly category: "interaction";
440
+ readonly description: "Icon size — the nine --icon-size-* scale steps (2xs…4xl), never an arbitrary px or a size- utility";
441
+ };
432
442
  readonly TextToneProp: {
433
443
  readonly file: "vocabulary/interaction.prop.ts";
434
444
  readonly category: "interaction";
@@ -741,6 +751,11 @@ export declare const COMPONENT_PROP_REGISTRY: {
741
751
  readonly file: "components/layout.prop.ts";
742
752
  readonly vocabulary: readonly [];
743
753
  };
754
+ readonly FlexMarkerProp: {
755
+ readonly group: "layout";
756
+ readonly file: "components/layout.prop.ts";
757
+ readonly vocabulary: readonly [];
758
+ };
744
759
  readonly FlexAlignProp: {
745
760
  readonly group: "layout";
746
761
  readonly file: "components/layout.prop.ts";
@@ -762,6 +777,10 @@ export declare const COMPONENT_PROP_REGISTRY: {
762
777
  readonly field: "direction";
763
778
  readonly local: true;
764
779
  readonly reason: "Flex-specific axis control.";
780
+ }, {
781
+ readonly field: "marker";
782
+ readonly local: true;
783
+ readonly reason: 'List-marker seam for as="ul"/"ol" (disc | decimal | none). marker="none" emits no data-list, so a list keeps its element, its <li> semantics and its gap token while losing the bullet and the --space-5 indent — the home <ListRow as="li"> had none of, which forced a raw <ul> (gh#714).';
765
784
  }, "GapProp", {
766
785
  readonly field: "align";
767
786
  readonly local: true;
@@ -799,6 +818,11 @@ export declare const COMPONENT_PROP_REGISTRY: {
799
818
  readonly file: "components/layout.prop.ts";
800
819
  readonly vocabulary: readonly [];
801
820
  };
821
+ readonly ResponsiveGridAlignProp: {
822
+ readonly group: "layout";
823
+ readonly file: "components/layout.prop.ts";
824
+ readonly vocabulary: readonly [];
825
+ };
802
826
  readonly MasterDetailRailWidthProp: {
803
827
  readonly group: "layout";
804
828
  readonly file: "components/layout.prop.ts";
@@ -1193,6 +1217,23 @@ export declare const COMPONENT_PROP_REGISTRY: {
1193
1217
  readonly reason: "Ambient live-region opt-in — ActivityAnnounceProp vocabulary; deliberately NOT a boolean so the value names the politeness level.";
1194
1218
  }];
1195
1219
  };
1220
+ readonly IconGlyphProp: {
1221
+ readonly group: "general";
1222
+ readonly file: "components/general.prop.ts";
1223
+ readonly vocabulary: readonly ["IconProp", "IconSizeProp", "TextToneProp", "LabelProp", "ClassNameProp", {
1224
+ readonly field: "label";
1225
+ readonly local: true;
1226
+ readonly reason: "LabelProp narrowed to string: this becomes the glyph's aria-label, and an accessible name is TEXT — a ReactNode cannot be one.";
1227
+ }, {
1228
+ readonly field: "as";
1229
+ readonly local: true;
1230
+ readonly reason: "The glyph COMPONENT to render — the IconProp concept, widened to a component that also forwards SVG props and a ref, because Icon renders ONTO the glyph (the sized element is the <svg> itself) rather than wrapping it.";
1231
+ }, {
1232
+ readonly field: "size";
1233
+ readonly local: true;
1234
+ readonly reason: "IconSizeProp, the nine-step icon scale — deliberately NOT the four-step control SizeProp: a glyph beside 2xs caption text and a 48px empty-state mark are the same primitive.";
1235
+ }];
1236
+ };
1196
1237
  readonly FloatButtonTypeProp: {
1197
1238
  readonly group: "general";
1198
1239
  readonly file: "components/general.prop.ts";
@@ -1322,6 +1363,15 @@ export declare const COMPONENT_PROP_REGISTRY: {
1322
1363
  readonly file: "components/data-entry.prop.ts";
1323
1364
  readonly vocabulary: readonly ["PlaceholderProp", "ValueProp", "DisabledProp"];
1324
1365
  };
1366
+ readonly CommandProp: {
1367
+ readonly group: "data-entry";
1368
+ readonly file: "components/data-entry.prop.ts";
1369
+ readonly vocabulary: readonly [{
1370
+ readonly field: "split";
1371
+ readonly local: true;
1372
+ readonly reason: "antd List `split` — ruled-list presentation (row dividers, 0 list padding) for option/checkbox lists; the rest of the root API is cmdk's (gh#699).";
1373
+ }];
1374
+ };
1325
1375
  readonly TextareaProp: {
1326
1376
  readonly group: "data-entry";
1327
1377
  readonly file: "components/data-entry.prop.ts";
@@ -1686,7 +1736,7 @@ export declare const COMPONENT_PROP_REGISTRY: {
1686
1736
  readonly DataTableProp: {
1687
1737
  readonly group: "data-display";
1688
1738
  readonly file: "components/data-display.prop.ts";
1689
- readonly vocabulary: readonly ["ColumnDefProp", "DensityProp", "SortStateProp", "SelectedIdsProp", "GetRowLabelProp", "HandlerProp", "TablePresetProp", "TableColumnPriorityProp", "BreakpointProp", "ColumnFixedProp", "ColumnFilterItemProp", "ColumnFilterStateProp", "ColumnSorterProp", "TableRowSelectionProp", "TableExpandableProp", "TableSummaryProp", "TableScrollProp", "TableStickyProp", "OnRowProp", "TablePaginationProp", "SortDirectionProp", "OnColumnFilterChangeProp"];
1739
+ readonly vocabulary: readonly ["ColumnDefProp", "DensityProp", "SortStateProp", "SelectedIdsProp", "GetRowLabelProp", "HandlerProp", "TablePresetProp", "TableColumnPriorityProp", "BreakpointProp", "ColumnFixedProp", "ColumnFilterItemProp", "ColumnFilterStateProp", "ColumnSorterProp", "TableRowSelectionProp", "TableExpandableProp", "TableSummaryProp", "TableScrollProp", "TableStickyProp", "OnRowProp", "TablePaginationProp", "TablePaginationPositionProp", "SortDirectionProp", "OnColumnFilterChangeProp"];
1690
1740
  };
1691
1741
  readonly ListRowDensityProp: {
1692
1742
  readonly group: "data-display";
@@ -2883,7 +2933,11 @@ export declare const COMPONENT_PROP_REGISTRY: {
2883
2933
  readonly vocabulary: readonly ["LabelProp", {
2884
2934
  readonly field: "columns";
2885
2935
  readonly local: true;
2886
- readonly reason: "Labels and positive numeric unit counts define a consumer-supplied axis.";
2936
+ readonly reason: "Labels, positive numeric unit counts and an optional muted flag (non-working period) define a consumer-supplied axis.";
2937
+ }, {
2938
+ readonly field: "bordered";
2939
+ readonly local: true;
2940
+ readonly reason: "Rules the body as a grid (row rules, header rule, a vertical rule per column); default true, same name and default as Calendar bordered.";
2887
2941
  }, {
2888
2942
  readonly field: "bands";
2889
2943
  readonly local: true;