@godxjp/ui 28.0.0 → 28.2.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/dist/components/data-display/card.js +5 -0
- package/dist/components/feedback/alert.d.ts +3 -3
- package/dist/components/feedback/alert.js +5 -1
- package/dist/components/feedback/callout.d.ts +23 -0
- package/dist/components/feedback/callout.js +42 -0
- package/dist/components/feedback/index.d.ts +2 -0
- package/dist/components/feedback/index.js +2 -0
- package/dist/components/navigation/tabs.d.ts +1 -1
- package/dist/components/navigation/tabs.js +54 -6
- package/dist/components/ui/toggle-group.js +14 -3
- package/dist/components/ui/toggle.d.ts +11 -2
- package/dist/components/ui/toggle.js +3 -2
- package/dist/contracts/measurement.json +1 -1
- package/dist/props/components/data-display.prop.d.ts +15 -0
- package/dist/props/components/feedback.prop.d.ts +12 -1
- package/dist/props/components/navigation.prop.d.ts +50 -0
- package/dist/props/registry.d.ts +25 -3
- package/dist/props/registry.js +34 -3
- package/dist/props/vocabulary/index.d.ts +1 -1
- package/dist/props/vocabulary/interaction.prop.d.ts +12 -2
- package/dist/styles/alert-layout.css +28 -0
- package/dist/styles/navigation-layout.css +129 -9
- package/dist/tokens/base.css +1 -0
- package/dist/tokens/components/callout.css +13 -0
- package/dist/tokens/components/navigation.css +18 -0
- package/docs/FRAME-COVERAGE-REPORT.md +3 -2
- package/docs/data-entry/toggle-count.tsx +5 -1
- package/docs/feedback/callout.tsx +220 -0
- package/docs/navigation/card-tabs.tsx +344 -0
- package/package.json +2 -2
- package/scripts/ui-audit.mjs +83 -10
|
@@ -97,6 +97,11 @@ const Card = React.forwardRef(
|
|
|
97
97
|
value: item.key,
|
|
98
98
|
label: item.tab,
|
|
99
99
|
disabled: item.disabled,
|
|
100
|
+
// antd's per-tab remove control. Forwarded rather than dropped: `items` is built
|
|
101
|
+
// AFTER `...tabProps` above, so a consumer cannot supply these from outside —
|
|
102
|
+
// this mapping is the only place they can arrive (gh#757).
|
|
103
|
+
closable: item.closable,
|
|
104
|
+
closeIcon: item.closeIcon,
|
|
100
105
|
// The body belongs to the SELECTED tab and to no other: the card has exactly one
|
|
101
106
|
// set of children, so handing them to every panel would render them N times the
|
|
102
107
|
// moment `destroyOnHidden={false}` kept the hidden panels mounted.
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import type { ToneProp } from "../../props/vocabulary/index.js";
|
|
2
|
+
import type { AlertVariantProp, ToneProp } from "../../props/vocabulary/index.js";
|
|
3
3
|
import type { AlertQueryErrorProp } from "../../props/components/feedback.prop.js";
|
|
4
4
|
export type { AlertProp, AlertProp as AlertProps, AlertTitleProp, AlertTitleProp as AlertTitleProps, AlertContentProp, AlertContentProp as AlertContentProps, AlertDescriptionProp, AlertDescriptionProp as AlertDescriptionProps, AlertActionsProp, AlertActionsProp as AlertActionsProps, AlertQueryErrorProp, AlertQueryErrorProp as AlertQueryErrorProps, } from "../../props/components/feedback.prop.js";
|
|
5
5
|
declare const AlertBase: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & {
|
|
6
|
-
variant?:
|
|
6
|
+
variant?: AlertVariantProp;
|
|
7
7
|
tone?: ToneProp;
|
|
8
8
|
icon?: import("../../props/index.js").IconProp | false;
|
|
9
9
|
onDismiss?: import("../../props/index.js").HandlerProp;
|
|
@@ -38,7 +38,7 @@ export declare const AlertActions: React.ForwardRefExoticComponent<React.HTMLAtt
|
|
|
38
38
|
*/
|
|
39
39
|
export declare function AlertQueryError({ error, category, onRetry, onAuthAction, className, }: AlertQueryErrorProp): React.JSX.Element;
|
|
40
40
|
export declare const Alert: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & {
|
|
41
|
-
variant?:
|
|
41
|
+
variant?: AlertVariantProp;
|
|
42
42
|
tone?: ToneProp;
|
|
43
43
|
icon?: import("../../props/index.js").IconProp | false;
|
|
44
44
|
onDismiss?: import("../../props/index.js").HandlerProp;
|
|
@@ -16,6 +16,10 @@ import { Flex } from "../layout/flex.js";
|
|
|
16
16
|
import { Button } from "../general/button.js";
|
|
17
17
|
const AlertContext = React.createContext("default");
|
|
18
18
|
const ASSERTIVE_TONES = /* @__PURE__ */ new Set(["destructive", "warning"]);
|
|
19
|
+
const roleFor = (variant, tone) => {
|
|
20
|
+
if (variant === "callout") return "note";
|
|
21
|
+
return ASSERTIVE_TONES.has(tone) ? "alert" : "status";
|
|
22
|
+
};
|
|
19
23
|
const DEFAULT_ICONS = {
|
|
20
24
|
default: Info,
|
|
21
25
|
destructive: AlertCircle,
|
|
@@ -33,7 +37,7 @@ const AlertBase = React.forwardRef(
|
|
|
33
37
|
"div",
|
|
34
38
|
{
|
|
35
39
|
ref,
|
|
36
|
-
role:
|
|
40
|
+
role: roleFor(variant, tone),
|
|
37
41
|
"data-slot": "alert",
|
|
38
42
|
"data-variant": variant,
|
|
39
43
|
"data-tone": tone,
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import type { CalloutKindProp } from "../../props/vocabulary/index.js";
|
|
3
|
+
export type { CalloutProp, CalloutProp as CalloutProps, } from "../../props/components/feedback.prop.js";
|
|
4
|
+
export declare const Callout: React.ForwardRefExoticComponent<Omit<import("./alert.js").AlertProp, "onDismiss" | "variant"> & {
|
|
5
|
+
kind?: CalloutKindProp;
|
|
6
|
+
} & React.RefAttributes<HTMLDivElement>> & {
|
|
7
|
+
Title: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLParagraphElement> & {
|
|
8
|
+
className?: import("../../props/index.js").ClassNameProp;
|
|
9
|
+
children?: import("../../props/index.js").ChildrenProp;
|
|
10
|
+
} & React.RefAttributes<HTMLParagraphElement>>;
|
|
11
|
+
Content: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & {
|
|
12
|
+
className?: import("../../props/index.js").ClassNameProp;
|
|
13
|
+
children?: import("../../props/index.js").ChildrenProp;
|
|
14
|
+
} & React.RefAttributes<HTMLDivElement>>;
|
|
15
|
+
Description: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLParagraphElement> & {
|
|
16
|
+
className?: import("../../props/index.js").ClassNameProp;
|
|
17
|
+
children?: import("../../props/index.js").ChildrenProp;
|
|
18
|
+
} & React.RefAttributes<HTMLParagraphElement>>;
|
|
19
|
+
Actions: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & {
|
|
20
|
+
className?: import("../../props/index.js").ClassNameProp;
|
|
21
|
+
children?: import("../../props/index.js").ChildrenProp;
|
|
22
|
+
} & React.RefAttributes<HTMLDivElement>>;
|
|
23
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { Info, Lightbulb, MessageSquareWarning, OctagonAlert, TriangleAlert } from "lucide-react";
|
|
5
|
+
import { AlertActions, AlertBase, AlertContent, AlertDescription, AlertTitle } from "./alert.js";
|
|
6
|
+
const KINDS = {
|
|
7
|
+
note: { tone: "info", icon: Info },
|
|
8
|
+
tip: { tone: "success", icon: Lightbulb },
|
|
9
|
+
important: { tone: "neutral", icon: MessageSquareWarning },
|
|
10
|
+
warning: { tone: "warning", icon: TriangleAlert },
|
|
11
|
+
caution: { tone: "destructive", icon: OctagonAlert }
|
|
12
|
+
};
|
|
13
|
+
const CalloutBase = React.forwardRef(
|
|
14
|
+
({ kind = "note", tone, icon, ...props }, ref) => {
|
|
15
|
+
const preset = KINDS[kind];
|
|
16
|
+
return (
|
|
17
|
+
// `variant` sits AFTER the spread, as on Banner: the type already excludes it, and the
|
|
18
|
+
// runtime half of the same guarantee means a spread of leftover Alert props can never
|
|
19
|
+
// silently turn this aside back into a live region.
|
|
20
|
+
/* @__PURE__ */ jsx(
|
|
21
|
+
AlertBase,
|
|
22
|
+
{
|
|
23
|
+
ref,
|
|
24
|
+
tone: tone ?? preset.tone,
|
|
25
|
+
icon: icon ?? preset.icon,
|
|
26
|
+
...props,
|
|
27
|
+
variant: "callout"
|
|
28
|
+
}
|
|
29
|
+
)
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
);
|
|
33
|
+
CalloutBase.displayName = "Callout";
|
|
34
|
+
const Callout = Object.assign(CalloutBase, {
|
|
35
|
+
Title: AlertTitle,
|
|
36
|
+
Content: AlertContent,
|
|
37
|
+
Description: AlertDescription,
|
|
38
|
+
Actions: AlertActions
|
|
39
|
+
});
|
|
40
|
+
export {
|
|
41
|
+
Callout
|
|
42
|
+
};
|
|
@@ -10,6 +10,8 @@ export { Skeleton, SkeletonForm, SkeletonRows, SkeletonTable, SkeletonDetail, Sk
|
|
|
10
10
|
export type { SkeletonProp, SkeletonProps, SkeletonWidth, SkeletonArticleProp, SkeletonArticleProps, SkeletonAvatarProp, SkeletonAvatarProps, SkeletonButtonProp, SkeletonButtonProps, SkeletonFormProp, SkeletonFormProps, SkeletonInputProp, SkeletonInputProps, SkeletonNodeProp, SkeletonNodeProps, SkeletonImageProp, SkeletonImageProps, } from "./skeleton.js";
|
|
11
11
|
export { Banner } from "./banner.js";
|
|
12
12
|
export type { BannerProp, BannerProps } from "./banner.js";
|
|
13
|
+
export { Callout } from "./callout.js";
|
|
14
|
+
export type { CalloutProp, CalloutProps } from "./callout.js";
|
|
13
15
|
export { Alert, AlertTitle, AlertContent, AlertDescription, AlertActions, AlertQueryError, } from "./alert.js";
|
|
14
16
|
export type { AlertProp, AlertProps, AlertTitleProp, AlertTitleProps, AlertContentProp, AlertContentProps, AlertDescriptionProp, AlertDescriptionProps, AlertActionsProp, AlertActionsProps, AlertQueryErrorProp, AlertQueryErrorProps, } from "./alert.js";
|
|
15
17
|
export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } from "./tooltip.js";
|
|
@@ -57,6 +57,7 @@ import {
|
|
|
57
57
|
SkeletonImage
|
|
58
58
|
} from "./skeleton.js";
|
|
59
59
|
import { Banner } from "./banner.js";
|
|
60
|
+
import { Callout } from "./callout.js";
|
|
60
61
|
import {
|
|
61
62
|
Alert,
|
|
62
63
|
AlertTitle,
|
|
@@ -86,6 +87,7 @@ export {
|
|
|
86
87
|
AlertQueryError,
|
|
87
88
|
AlertTitle,
|
|
88
89
|
Banner,
|
|
90
|
+
Callout,
|
|
89
91
|
Dialog,
|
|
90
92
|
DialogAction,
|
|
91
93
|
DialogBody,
|
|
@@ -8,7 +8,7 @@ export type TabsProps = Omit<React.ComponentPropsWithoutRef<"div">, "defaultValu
|
|
|
8
8
|
dir?: "ltr" | "rtl";
|
|
9
9
|
activationMode?: "manual" | "automatic";
|
|
10
10
|
};
|
|
11
|
-
export declare function Tabs({ className, orientation, items, value, defaultValue, onValueChange, activationMode, dir, variant, tabPlacement, size, centered, extra, destroyOnHidden, onEdit, addIcon, hideAdd, closeIcon, onTabClick, overflow, animated, indicator, moreIcon, onTabScroll, listClassName, contentClassName, children, ...props }: TabsProps): React.JSX.Element;
|
|
11
|
+
export declare function Tabs({ className, orientation, items, value, defaultValue, onValueChange, activationMode, dir, variant, tabPlacement, size, centered, bodied, extra, destroyOnHidden, onEdit, addIcon, hideAdd, closeIcon, onTabClick, overflow, animated, indicator, moreIcon, onTabScroll, listClassName, contentClassName, children, ...props }: TabsProps): React.JSX.Element;
|
|
12
12
|
export declare const TabsList: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
|
|
13
13
|
variant?: "default" | "line";
|
|
14
14
|
/**
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
Tabs as AriaTabs
|
|
9
9
|
} from "react-aria-components";
|
|
10
10
|
import { MoreHorizontal, Plus, X } from "lucide-react";
|
|
11
|
+
import { useCounterPill } from "../ui/toggle.js";
|
|
11
12
|
import { useTranslation } from "../../i18n/use-translation.js";
|
|
12
13
|
import { useMaxWidthBreakpoint } from "../../lib/breakpoint-token.js";
|
|
13
14
|
import { cn } from "../../lib/utils.js";
|
|
@@ -31,6 +32,15 @@ function triggerSizeClassName(size) {
|
|
|
31
32
|
size === "lg" && "min-h-[var(--tabs-trigger-height-lg)] px-[var(--tabs-trigger-padding-x-lg)] text-[length:var(--tabs-trigger-font-size-lg)]"
|
|
32
33
|
);
|
|
33
34
|
}
|
|
35
|
+
function TabCount({
|
|
36
|
+
count,
|
|
37
|
+
overflowCount,
|
|
38
|
+
showZero,
|
|
39
|
+
countLabel
|
|
40
|
+
}) {
|
|
41
|
+
const { pill } = useCounterPill({ count, overflowCount, showZero, countLabel, slot: "tabs" });
|
|
42
|
+
return pill;
|
|
43
|
+
}
|
|
34
44
|
const TabsFrameContext = React.createContext({
|
|
35
45
|
orientation: "horizontal",
|
|
36
46
|
selectionSuppressed: false,
|
|
@@ -99,6 +109,7 @@ function Tabs({
|
|
|
99
109
|
tabPlacement,
|
|
100
110
|
size = "md",
|
|
101
111
|
centered,
|
|
112
|
+
bodied,
|
|
102
113
|
extra,
|
|
103
114
|
destroyOnHidden = true,
|
|
104
115
|
onEdit,
|
|
@@ -178,12 +189,13 @@ function Tabs({
|
|
|
178
189
|
const showAdd = editable && !hideAdd && Boolean(onEdit);
|
|
179
190
|
const needsBar = Boolean(extraStart || extraEnd || showAdd || collapsible);
|
|
180
191
|
const card = variant === "card" || variant === "editable-card";
|
|
192
|
+
const bodiedCard = card && Boolean(bodied);
|
|
181
193
|
const sizeTriggerClassName = triggerSizeClassName(size);
|
|
182
194
|
const CARD_FACE = {
|
|
183
|
-
top: "rounded-[var(--tabs-card-radius)_var(--tabs-card-radius)_0_0] data-[state=active]:border-b-background",
|
|
184
|
-
bottom: "rounded-[0_0_var(--tabs-card-radius)_var(--tabs-card-radius)] data-[state=active]:border-t-background",
|
|
185
|
-
start: "rounded-s-[var(--tabs-card-radius)] rounded-e-none data-[state=active]:border-e-background",
|
|
186
|
-
end: "rounded-e-[var(--tabs-card-radius)] rounded-s-none data-[state=active]:border-s-background"
|
|
195
|
+
top: "rounded-[var(--tabs-card-radius)_var(--tabs-card-radius)_0_0] data-[state=active]:border-b-[hsl(var(--tabs-panel-background,var(--background)))]",
|
|
196
|
+
bottom: "rounded-[0_0_var(--tabs-card-radius)_var(--tabs-card-radius)] data-[state=active]:border-t-[hsl(var(--tabs-panel-background,var(--background)))]",
|
|
197
|
+
start: "rounded-s-[var(--tabs-card-radius)] rounded-e-none data-[state=active]:border-e-[hsl(var(--tabs-panel-background,var(--background)))]",
|
|
198
|
+
end: "rounded-e-[var(--tabs-card-radius)] rounded-s-none data-[state=active]:border-s-[hsl(var(--tabs-panel-background,var(--background)))]"
|
|
187
199
|
};
|
|
188
200
|
const list = items ? /* @__PURE__ */ jsx(
|
|
189
201
|
TabsList,
|
|
@@ -258,6 +270,16 @@ function Tabs({
|
|
|
258
270
|
// pixel and `justify-content` has nothing left to centre — measured, the leading and
|
|
259
271
|
// trailing gaps were both 0px with `centered` on and off.
|
|
260
272
|
centered && "flex-none",
|
|
273
|
+
// LINE face: same argument as the card face below, and from the same source — antd
|
|
274
|
+
// puts no `flex-grow` on a tab of ANY `type`, so a line tab is content-width too.
|
|
275
|
+
// `card` was fixed on that reasoning (gh#736); `line` was left on the base `flex-1`
|
|
276
|
+
// and kept stretching. Measured by a consumer on a 1200px strip: three tabs at
|
|
277
|
+
// 321px each for labels needing 83 / 84 / 56px, so the active underline ran 321px
|
|
278
|
+
// under a 56px label.
|
|
279
|
+
//
|
|
280
|
+
// `centered` is NOT the escape hatch for this: it centres, which trades one wrong
|
|
281
|
+
// geometry for another, and it is antd's prop for centring rather than for width.
|
|
282
|
+
variant === "line" && "flex-none",
|
|
261
283
|
// The merged edge is the SURFACE colour, never `transparent`: the rail is an inset
|
|
262
284
|
// shadow at the strip's padding-box edge, so a see-through border would let that 1px
|
|
263
285
|
// of rail run straight across the tab it is joined to.
|
|
@@ -271,7 +293,14 @@ function Tabs({
|
|
|
271
293
|
// the × ended up 90px from the tab's own trailing edge (179px on a two-tab
|
|
272
294
|
// strip). antd's is 8px away. This is also why the face read as a free-standing
|
|
273
295
|
// bordered box rather than a tab.
|
|
274
|
-
|
|
296
|
+
//
|
|
297
|
+
// THE ACTIVE FACE IS THE BODY'S SURFACE, from the same knob the body reads
|
|
298
|
+
// (gh#762). The base trigger's `data-[state=active]:bg-background` was right only
|
|
299
|
+
// while the two could not disagree; once a service can retint the body, an active
|
|
300
|
+
// tab still painting `--background` reads as a DIFFERENT box sitting on the panel
|
|
301
|
+
// — which is the "two stacked boxes" complaint in one property. Same utilities
|
|
302
|
+
// group, so tailwind-merge drops the base step instead of stacking two fills.
|
|
303
|
+
card && "flex-none border-[color:hsl(var(--border))] bg-[hsl(var(--tabs-card-background,var(--muted)))] data-[state=active]:bg-[hsl(var(--tabs-panel-background,var(--background)))]",
|
|
275
304
|
card && CARD_FACE[placement]
|
|
276
305
|
),
|
|
277
306
|
children: [
|
|
@@ -285,6 +314,15 @@ function Tabs({
|
|
|
285
314
|
}
|
|
286
315
|
) : null,
|
|
287
316
|
item.label,
|
|
317
|
+
/* @__PURE__ */ jsx(
|
|
318
|
+
TabCount,
|
|
319
|
+
{
|
|
320
|
+
count: item.count,
|
|
321
|
+
overflowCount: item.overflowCount,
|
|
322
|
+
showZero: item.showZero,
|
|
323
|
+
countLabel: item.countLabel
|
|
324
|
+
}
|
|
325
|
+
),
|
|
288
326
|
removable ? (
|
|
289
327
|
// A POINTER SHORTCUT, not a control — and that is measured, not stylistic. antd's own
|
|
290
328
|
// TabNode puts a real <button> beside the role="tab" element; rendered through
|
|
@@ -334,6 +372,7 @@ function Tabs({
|
|
|
334
372
|
"data-placement": placement,
|
|
335
373
|
"data-size": size,
|
|
336
374
|
"data-centered": centered ? "true" : void 0,
|
|
375
|
+
"data-bodied": bodiedCard ? "true" : void 0,
|
|
337
376
|
"data-animated-ink-bar": motion.inkBar ? "true" : "false",
|
|
338
377
|
"data-animated-tab-pane": motion.tabPane ? "true" : "false",
|
|
339
378
|
"data-indicator-size": indicatorSize,
|
|
@@ -363,6 +402,7 @@ function Tabs({
|
|
|
363
402
|
"data-placement": placement,
|
|
364
403
|
"data-size": size,
|
|
365
404
|
"data-centered": centered ? "true" : void 0,
|
|
405
|
+
"data-bodied": bodiedCard ? "true" : void 0,
|
|
366
406
|
"data-animated-ink-bar": motion.inkBar ? "true" : "false",
|
|
367
407
|
"data-animated-tab-pane": motion.tabPane ? "true" : "false",
|
|
368
408
|
"data-indicator-size": indicatorSize,
|
|
@@ -493,7 +533,15 @@ const TabsTrigger = React.forwardRef(
|
|
|
493
533
|
// The line indicator lives in src/styles/navigation-layout.css so it reads --tabs-indicator-*.
|
|
494
534
|
// Selected and focused stay visually distinct (WCAG 2.4.7): selected is a 1px hairline in the
|
|
495
535
|
// border, focused is the 2px ring plus its halo outside it.
|
|
496
|
-
|
|
536
|
+
// `group-data-[variant=line]/tabs-list:flex-none` is the COMPOUND half of gh#757's
|
|
537
|
+
// width fix (gh#762). That fix landed on the `items` renderer only, which is the path
|
|
538
|
+
// the reporter measured; a hand-composed `<TabsList variant="line" className="w-full">`
|
|
539
|
+
// — what a saved-view strip that has to reach its own triggers writes — still ran on
|
|
540
|
+
// the base `flex-1`. Measured on a 1200px strip: three triggers at 394.66px each for
|
|
541
|
+
// labels needing 107 / 95 / 53px, i.e. the SAME defect one API away. antd puts no
|
|
542
|
+
// `flex-grow` on a tab of any `type`, so the rule belongs to the line STRIP rather than
|
|
543
|
+
// to one construction path; the pill strip keeps `flex-1`, which is what fills its box.
|
|
544
|
+
"text-muted-foreground ring-offset-background hover:text-foreground ui-focus-ring data-[state=active]:bg-background data-[state=active]:text-foreground group-data-[variant=default]/tabs:group-data-[variant=default]/tabs-list:data-[state=active]:border-primary/25 relative inline-flex flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-3 py-1 text-sm font-medium whitespace-nowrap transition-all group-data-[orientation=vertical]/tabs:w-full group-data-[orientation=vertical]/tabs:flex-none group-data-[orientation=vertical]/tabs:justify-start group-data-[variant=line]/tabs-list:flex-none group-data-[variant=line]/tabs-list:border-e-0 group-data-[variant=line]/tabs-list:border-b-0 disabled:pointer-events-none disabled:opacity-50 group-data-[variant=default]/tabs:group-data-[variant=default]/tabs-list:data-[state=active]:shadow-sm group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent group-data-[variant=line]/tabs-list:data-[state=active]:shadow-none",
|
|
497
545
|
// The tier the root was given. Without this the compound form ignored `size` outright.
|
|
498
546
|
triggerSizeClassName(size),
|
|
499
547
|
className
|
|
@@ -46,9 +46,14 @@ const ToggleGroup = React.forwardRef(
|
|
|
46
46
|
}, ref) => {
|
|
47
47
|
const radioSemantics = type === "single" && disallowEmptySelection === true;
|
|
48
48
|
const arrowNav = React.useRef(false);
|
|
49
|
+
const groupElement = React.useRef(null);
|
|
50
|
+
const [inToolbar, setInToolbar] = React.useState(false);
|
|
51
|
+
React.useLayoutEffect(() => {
|
|
52
|
+
setInToolbar(!!groupElement.current?.parentElement?.closest('[role="toolbar"]'));
|
|
53
|
+
}, []);
|
|
49
54
|
const context = React.useMemo(
|
|
50
|
-
() => ({ variant, size, shape, radioSemantics, arrowNav }),
|
|
51
|
-
[variant, size, shape, radioSemantics]
|
|
55
|
+
() => ({ variant, size, shape, radioSemantics, arrowNav, inToolbar }),
|
|
56
|
+
[variant, size, shape, radioSemantics, inToolbar]
|
|
52
57
|
);
|
|
53
58
|
const selectedKeys = React.useMemo(() => toSelectedKeys(value), [value]);
|
|
54
59
|
const defaultSelectedKeys = React.useMemo(() => toSelectedKeys(defaultValue), [defaultValue]);
|
|
@@ -82,6 +87,12 @@ const ToggleGroup = React.forwardRef(
|
|
|
82
87
|
{
|
|
83
88
|
...props,
|
|
84
89
|
...domProps,
|
|
90
|
+
ref: (node) => {
|
|
91
|
+
groupElement.current = node;
|
|
92
|
+
const aria = domProps.ref;
|
|
93
|
+
if (typeof aria === "function") aria(node);
|
|
94
|
+
else if (aria) aria.current = node;
|
|
95
|
+
},
|
|
85
96
|
...type === "single" && !radioSemantics ? { role: "group", "aria-orientation": void 0 } : null,
|
|
86
97
|
onKeyDownCapture: (event) => {
|
|
87
98
|
if (radioSemantics) {
|
|
@@ -134,7 +145,7 @@ const ToggleGroupItem = React.forwardRef(
|
|
|
134
145
|
const isPressed = groupState?.selectedKeys.has(value) ?? false;
|
|
135
146
|
const isSingle = groupState?.selectionMode === "single";
|
|
136
147
|
const radioSemantics = context.radioSemantics === true;
|
|
137
|
-
const rovingTabIndex = radioSemantics && groupState && groupState.selectedKeys.size > 0 ? isPressed ? 0 : -1 : void 0;
|
|
148
|
+
const rovingTabIndex = radioSemantics && !context.inToolbar && groupState && groupState.selectedKeys.size > 0 ? isPressed ? 0 : -1 : void 0;
|
|
138
149
|
return /* @__PURE__ */ jsxs(
|
|
139
150
|
ToggleButton,
|
|
140
151
|
{
|
|
@@ -42,9 +42,18 @@ type TogglePressedFields = {
|
|
|
42
42
|
/** Fired with the NEW pressed state — RAC `onChange`. */
|
|
43
43
|
onPressedChange?: (pressed: boolean) => void;
|
|
44
44
|
};
|
|
45
|
-
/**
|
|
46
|
-
|
|
45
|
+
/**
|
|
46
|
+
* Counter pill shared by `Toggle`, `ToggleGroupItem` and `Tabs` items. ACCESSIBLE NAME.
|
|
47
|
+
*
|
|
48
|
+
* `slot` names the hooks the pill emits (`data-slot="<slot>-count"` / `.ui-<slot>-count`) so a
|
|
49
|
+
* third component can reuse the whole construction — the Intl formatting, the `overflowCount`
|
|
50
|
+
* cap, and above all the `aria-hidden` + `sr-only` split that keeps «未対応12» out of the
|
|
51
|
+
* accessible name (gh#734) — without a second counting API growing beside this one (gh#762).
|
|
52
|
+
* It defaults to `toggle`, so every existing call emits the identical markup it always has.
|
|
53
|
+
*/
|
|
54
|
+
declare function useCounterPill({ count, overflowCount, showZero, countLabel, ariaLabel, slot, }: ToggleCountFields & {
|
|
47
55
|
ariaLabel?: string;
|
|
56
|
+
slot?: string;
|
|
48
57
|
}): {
|
|
49
58
|
pill: null;
|
|
50
59
|
resolvedAriaLabel: string | undefined;
|
|
@@ -50,7 +50,8 @@ function useCounterPill({
|
|
|
50
50
|
overflowCount = 99,
|
|
51
51
|
showZero = true,
|
|
52
52
|
countLabel,
|
|
53
|
-
ariaLabel
|
|
53
|
+
ariaLabel,
|
|
54
|
+
slot = "toggle"
|
|
54
55
|
}) {
|
|
55
56
|
const { locale } = useTranslation();
|
|
56
57
|
const visible = count != null && (count !== 0 || showZero);
|
|
@@ -65,7 +66,7 @@ function useCounterPill({
|
|
|
65
66
|
const spoken = countLabel ? `${formatted} ${countLabel}` : formatted;
|
|
66
67
|
return {
|
|
67
68
|
pill: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
68
|
-
/* @__PURE__ */ jsx("span", { "data-slot":
|
|
69
|
+
/* @__PURE__ */ jsx("span", { "data-slot": `${slot}-count`, className: `ui-${slot}-count`, "aria-hidden": "true", children: formatted }),
|
|
69
70
|
/* @__PURE__ */ jsx("span", { className: "sr-only", children: `, ${spoken}` })
|
|
70
71
|
] }),
|
|
71
72
|
resolvedAriaLabel: ariaLabel == null ? ariaLabel : `${ariaLabel}, ${spoken}`
|
|
@@ -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": "28.
|
|
3
|
+
"version": "28.2.0",
|
|
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,
|
|
@@ -972,4 +972,19 @@ export type CardTabItemProp = {
|
|
|
972
972
|
tab: React.ReactNode;
|
|
973
973
|
/** Ant Design `disabled` — the tab stays in the strip and in the roving focus, unselectable. */
|
|
974
974
|
disabled?: boolean;
|
|
975
|
+
/**
|
|
976
|
+
* Ant Design `closable` — honoured by `tabProps={{ variant: "editable-card" }}`, where it
|
|
977
|
+
* decides whether THIS tab gets a remove button (gh#757).
|
|
978
|
+
*
|
|
979
|
+
* Without it the strip is all-or-nothing: `editable-card` puts a × on every tab, including the
|
|
980
|
+
* one that is not deletable — a consumer measured 3 of 3 removable where 2 was right. It could
|
|
981
|
+
* not be patched from outside either, because `Card` builds `items` AFTER spreading
|
|
982
|
+
* `...tabProps`, so a hand-written `items` never survived.
|
|
983
|
+
*
|
|
984
|
+
* Default (undefined) stays removable, which is antd's own default and `Tabs`' (`closable !==
|
|
985
|
+
* false`) — this only adds the way to say no.
|
|
986
|
+
*/
|
|
987
|
+
closable?: boolean;
|
|
988
|
+
/** Ant Design `closeIcon` — replaces the default × on this tab's remove button. */
|
|
989
|
+
closeIcon?: React.ReactNode;
|
|
975
990
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/** Feedback component prop types — @see docs/COMPONENTS.md#feedback */
|
|
2
2
|
import type * as React from "react";
|
|
3
3
|
import type { QueryErrorCategory } from "../../lib/query-error.js";
|
|
4
|
-
import type { AlertVariantProp, AvatarShapeProp, CancelLabelProp, ChildrenProp, ClassNameProp, ConfirmLabelProp, ConfirmVariantProp, DefaultOpenProp, DescriptionProp, HandlerProp, IconProp, OpenProp, OnOpenChangeProp, PendingProp, ShapeProp, SizeProp, ToneProp, TitleProp } from "../vocabulary/index.js";
|
|
4
|
+
import type { AlertVariantProp, AvatarShapeProp, CalloutKindProp, CancelLabelProp, ChildrenProp, ClassNameProp, ConfirmLabelProp, ConfirmVariantProp, DefaultOpenProp, DescriptionProp, HandlerProp, IconProp, OpenProp, OnOpenChangeProp, PendingProp, ShapeProp, SizeProp, ToneProp, TitleProp } from "../vocabulary/index.js";
|
|
5
5
|
/**
|
|
6
6
|
* @see Dialog — the compound modal ROOT.
|
|
7
7
|
*
|
|
@@ -87,6 +87,17 @@ export type AlertProp = React.HTMLAttributes<HTMLDivElement> & {
|
|
|
87
87
|
* `icon`/`icon={false}` owns the leading glyph, `onDismiss` renders the built-in dismiss button.
|
|
88
88
|
*/
|
|
89
89
|
export type BannerProp = Omit<AlertProp, "variant">;
|
|
90
|
+
/**
|
|
91
|
+
* @see Callout — the in-prose aside (`<Alert variant="callout">` with the variant fixed).
|
|
92
|
+
*
|
|
93
|
+
* Same contract as {@link AlertProp} minus `variant` and `onDismiss`: a callout is part of the
|
|
94
|
+
* document the reader is reading, so it is never a live region and never dismissible. `kind` is
|
|
95
|
+
* the GitHub/Obsidian admonition preset and resolves `tone` + the leading glyph; pass `tone` or
|
|
96
|
+
* `icon` to override either per instance (gh#765).
|
|
97
|
+
*/
|
|
98
|
+
export type CalloutProp = Omit<AlertProp, "variant" | "onDismiss"> & {
|
|
99
|
+
kind?: CalloutKindProp;
|
|
100
|
+
};
|
|
90
101
|
/** @see AlertTitle */
|
|
91
102
|
export type AlertTitleProp = React.HTMLAttributes<HTMLParagraphElement> & {
|
|
92
103
|
className?: ClassNameProp;
|
|
@@ -264,6 +264,32 @@ export type TabItemProp = {
|
|
|
264
264
|
closable?: boolean;
|
|
265
265
|
/** Ant Design `Tab.closeIcon` — replaces the default × on this item's remove button. */
|
|
266
266
|
closeIcon?: React.ReactNode;
|
|
267
|
+
/**
|
|
268
|
+
* The count beside the label — 「未対応 **12**」, the list-screen pattern (gh#762).
|
|
269
|
+
*
|
|
270
|
+
* It is the SAME counter vocabulary `Button` (gh#312) and `Toggle`/`ToggleGroupItem` (gh#734)
|
|
271
|
+
* already publish, drawn by the same helper, so a counted tab and the counted chip under it
|
|
272
|
+
* are one thing at one size and one accessible shape. Formatted with `Intl.NumberFormat` in
|
|
273
|
+
* the active locale — never `String(n)`, never a hand-rolled thousands separator.
|
|
274
|
+
*
|
|
275
|
+
* WHY IT IS A SLOT AND NOT `label: <span>未対応 <Badge count={12} /></span>` (antd's answer):
|
|
276
|
+
* with the number inside the label the PACKAGE owns none of it — not the size, not the gap,
|
|
277
|
+
* not the tone as the tab moves between selected / unselected / disabled — so every consumer
|
|
278
|
+
* lands somewhere different. The slot is what lets the tab state drive the pill.
|
|
279
|
+
*/
|
|
280
|
+
count?: number;
|
|
281
|
+
/** Cap for `count` — beyond it the pill shows `{overflowCount}+` (e.g. `99+`). Default `99`. */
|
|
282
|
+
overflowCount?: number;
|
|
283
|
+
/** Render the pill when `count` is 0. Default `true`, matching Button and Toggle. */
|
|
284
|
+
showZero?: boolean;
|
|
285
|
+
/**
|
|
286
|
+
* Localized description of what the count MEANS, folded into the tab's accessible name so it
|
|
287
|
+
* never announces as label-then-bare-digits. The digits concatenate straight onto the label in
|
|
288
|
+
* the accessibility tree («未対応12», gh#734's defect), so the pill is `aria-hidden` and the
|
|
289
|
+
* spoken clause is an `sr-only` sibling: `countLabel="未対応の課題"` reads
|
|
290
|
+
* 「未対応, 12 未対応の課題」. Already localized when it arrives — pass a `t()` string.
|
|
291
|
+
*/
|
|
292
|
+
countLabel?: string;
|
|
267
293
|
/**
|
|
268
294
|
* Ant Design `Tab.forceRender`. Mounts THIS panel up front and keeps it mounted while another
|
|
269
295
|
* tab is selected, without turning that on for the whole strip the way `destroyOnHidden={false}`
|
|
@@ -404,6 +430,30 @@ export type TabsProp = {
|
|
|
404
430
|
size?: "sm" | "md" | "lg";
|
|
405
431
|
/** Ant Design `centered` — centre the trigger strip on its own inline axis. */
|
|
406
432
|
centered?: boolean;
|
|
433
|
+
/**
|
|
434
|
+
* Draw the PANEL BODY the card strip opens into, so the strip and the panel are ONE object
|
|
435
|
+
* (gh#762): a surface, a border continuous with the rail, and the radius on the two corners
|
|
436
|
+
* away from the strip. The active tab's block-end edge is repainted in that body's own colour,
|
|
437
|
+
* which is what makes it read as opened into the body rather than closed off above it.
|
|
438
|
+
*
|
|
439
|
+
* WHY IT EXISTS. `variant="card"` already repaints the active face's merged edge — antd's
|
|
440
|
+
* `genCardStyle` — but the package shipped no body for it to merge INTO, so the consumer had to
|
|
441
|
+
* supply one and every choice was wrong. Measured on 28.0.0 against a `variant="card"` strip at
|
|
442
|
+
* 1440px: `<Card>` left an 8px gap AND added a second 1px border at a 9.708px radius (two
|
|
443
|
+
* stacked boxes), `<Card variant="borderless">` left the same 8px gap with no line at all, and
|
|
444
|
+
* no box at all left the 8px gap over a transparent panel. The gap is `--tabs-root-gap`, which
|
|
445
|
+
* is correct for every OTHER variant — a body is not a gap tweak, it is the missing half of the
|
|
446
|
+
* card face.
|
|
447
|
+
*
|
|
448
|
+
* HONOURED ONLY BY `card` / `editable-card`, and that is a statement, not a limitation. The
|
|
449
|
+
* pill strip is a free-floating control and the `line` strip's own body is the CARD around it —
|
|
450
|
+
* `<Card tabList>` is that pairing, already built and already joined. Passing `bodied` to any
|
|
451
|
+
* other variant emits no attribute and changes no pixel.
|
|
452
|
+
*
|
|
453
|
+
* OPT-IN, so no strip on 28.0.0 moves. A service that wants every card strip bodied has the
|
|
454
|
+
* `card`-variant defaults as a theme decision, not a prop it must repeat.
|
|
455
|
+
*/
|
|
456
|
+
bodied?: boolean;
|
|
407
457
|
/** Ant Design `tabBarExtraContent`, renamed and made logical. @see TabsExtraProp */
|
|
408
458
|
extra?: TabsExtraProp;
|
|
409
459
|
/**
|
package/dist/props/registry.d.ts
CHANGED
|
@@ -537,7 +537,12 @@ export declare const VOCABULARY_REGISTRY: {
|
|
|
537
537
|
readonly AlertVariantProp: {
|
|
538
538
|
readonly file: "vocabulary/interaction.prop.ts";
|
|
539
539
|
readonly category: "interaction";
|
|
540
|
-
readonly description: "Alert structural axis: default inline card | banner full-bleed strip";
|
|
540
|
+
readonly description: "Alert structural axis: default inline card | banner full-bleed strip | callout in-prose aside";
|
|
541
|
+
};
|
|
542
|
+
readonly CalloutKindProp: {
|
|
543
|
+
readonly file: "vocabulary/interaction.prop.ts";
|
|
544
|
+
readonly category: "interaction";
|
|
545
|
+
readonly description: "Callout admonition preset: note | tip | important | warning | caution";
|
|
541
546
|
};
|
|
542
547
|
readonly SortDirectionProp: {
|
|
543
548
|
readonly file: "vocabulary/interaction.prop.ts";
|
|
@@ -2168,6 +2173,11 @@ export declare const COMPONENT_PROP_REGISTRY: {
|
|
|
2168
2173
|
readonly file: "components/feedback.prop.ts";
|
|
2169
2174
|
readonly vocabulary: readonly ["ToneProp", "IconProp", "OnValueChangeProp", "ClassNameProp", "ChildrenProp"];
|
|
2170
2175
|
};
|
|
2176
|
+
readonly CalloutProp: {
|
|
2177
|
+
readonly group: "feedback";
|
|
2178
|
+
readonly file: "components/feedback.prop.ts";
|
|
2179
|
+
readonly vocabulary: readonly ["CalloutKindProp", "ToneProp", "IconProp", "ClassNameProp", "ChildrenProp"];
|
|
2180
|
+
};
|
|
2171
2181
|
readonly AlertTitleProp: {
|
|
2172
2182
|
readonly group: "feedback";
|
|
2173
2183
|
readonly file: "components/feedback.prop.ts";
|
|
@@ -2350,7 +2360,11 @@ export declare const COMPONENT_PROP_REGISTRY: {
|
|
|
2350
2360
|
readonly TabsProp: {
|
|
2351
2361
|
readonly group: "navigation";
|
|
2352
2362
|
readonly file: "components/navigation.prop.ts";
|
|
2353
|
-
readonly vocabulary: readonly ["ValueProp", "DefaultValueProp", "OnValueChangeProp", "ClassNameProp", "SizeProp", "ExtraProp"
|
|
2363
|
+
readonly vocabulary: readonly ["ValueProp", "DefaultValueProp", "OnValueChangeProp", "ClassNameProp", "SizeProp", "ExtraProp", {
|
|
2364
|
+
readonly field: "bodied";
|
|
2365
|
+
readonly local: true;
|
|
2366
|
+
readonly reason: "A positive boolean for the card strip's PANEL BODY (gh#762) — an axis on Tabs rather than a `CardTabs` export, because the thing missing was a surface the existing card face already repaints its edge into, not a second component. No vocabulary type: no other component draws a body for its own panel.";
|
|
2367
|
+
}];
|
|
2354
2368
|
};
|
|
2355
2369
|
readonly TabsVariantProp: {
|
|
2356
2370
|
readonly group: "navigation";
|
|
@@ -2414,7 +2428,15 @@ export declare const COMPONENT_PROP_REGISTRY: {
|
|
|
2414
2428
|
readonly TabItemProp: {
|
|
2415
2429
|
readonly group: "navigation";
|
|
2416
2430
|
readonly file: "components/navigation.prop.ts";
|
|
2417
|
-
readonly vocabulary: readonly ["ValueProp", "LabelProp", "ChildrenProp", "DisabledProp", "IconProp"
|
|
2431
|
+
readonly vocabulary: readonly ["ValueProp", "LabelProp", "ChildrenProp", "DisabledProp", "IconProp", {
|
|
2432
|
+
readonly field: "count";
|
|
2433
|
+
readonly local: true;
|
|
2434
|
+
readonly reason: "Counter-pill vocabulary shared VERBATIM with ButtonProp and ToggleProp (count/overflowCount/showZero) and drawn by the same `useCounterPill`, so a counted tab, a counted chip and a counted button are one thing — gh#312 / gh#734 / gh#762.";
|
|
2435
|
+
}, {
|
|
2436
|
+
readonly field: "countLabel";
|
|
2437
|
+
readonly local: true;
|
|
2438
|
+
readonly reason: "Localized unit folded into the tab's accessible name («未対応, 12 件の課題»), so the digits never concatenate onto the label — gh#734's measured defect, same field name as Button/Toggle.";
|
|
2439
|
+
}];
|
|
2418
2440
|
};
|
|
2419
2441
|
readonly FormFieldArrayProp: {
|
|
2420
2442
|
readonly group: "form";
|
package/dist/props/registry.js
CHANGED
|
@@ -536,7 +536,12 @@ const VOCABULARY_REGISTRY = {
|
|
|
536
536
|
AlertVariantProp: {
|
|
537
537
|
file: "vocabulary/interaction.prop.ts",
|
|
538
538
|
category: "interaction",
|
|
539
|
-
description: "Alert structural axis: default inline card | banner full-bleed strip"
|
|
539
|
+
description: "Alert structural axis: default inline card | banner full-bleed strip | callout in-prose aside"
|
|
540
|
+
},
|
|
541
|
+
CalloutKindProp: {
|
|
542
|
+
file: "vocabulary/interaction.prop.ts",
|
|
543
|
+
category: "interaction",
|
|
544
|
+
description: "Callout admonition preset: note | tip | important | warning | caution"
|
|
540
545
|
},
|
|
541
546
|
SortDirectionProp: {
|
|
542
547
|
file: "vocabulary/interaction.prop.ts",
|
|
@@ -2545,6 +2550,11 @@ const COMPONENT_PROP_REGISTRY = {
|
|
|
2545
2550
|
file: "components/feedback.prop.ts",
|
|
2546
2551
|
vocabulary: ["ToneProp", "IconProp", "OnValueChangeProp", "ClassNameProp", "ChildrenProp"]
|
|
2547
2552
|
},
|
|
2553
|
+
CalloutProp: {
|
|
2554
|
+
group: "feedback",
|
|
2555
|
+
file: "components/feedback.prop.ts",
|
|
2556
|
+
vocabulary: ["CalloutKindProp", "ToneProp", "IconProp", "ClassNameProp", "ChildrenProp"]
|
|
2557
|
+
},
|
|
2548
2558
|
AlertTitleProp: {
|
|
2549
2559
|
group: "feedback",
|
|
2550
2560
|
file: "components/feedback.prop.ts",
|
|
@@ -2735,7 +2745,12 @@ const COMPONENT_PROP_REGISTRY = {
|
|
|
2735
2745
|
"OnValueChangeProp",
|
|
2736
2746
|
"ClassNameProp",
|
|
2737
2747
|
"SizeProp",
|
|
2738
|
-
"ExtraProp"
|
|
2748
|
+
"ExtraProp",
|
|
2749
|
+
{
|
|
2750
|
+
field: "bodied",
|
|
2751
|
+
local: true,
|
|
2752
|
+
reason: "A positive boolean for the card strip's PANEL BODY (gh#762) \u2014 an axis on Tabs rather than a `CardTabs` export, because the thing missing was a surface the existing card face already repaints its edge into, not a second component. No vocabulary type: no other component draws a body for its own panel."
|
|
2753
|
+
}
|
|
2739
2754
|
]
|
|
2740
2755
|
},
|
|
2741
2756
|
TabsVariantProp: {
|
|
@@ -2803,7 +2818,23 @@ const COMPONENT_PROP_REGISTRY = {
|
|
|
2803
2818
|
TabItemProp: {
|
|
2804
2819
|
group: "navigation",
|
|
2805
2820
|
file: "components/navigation.prop.ts",
|
|
2806
|
-
vocabulary: [
|
|
2821
|
+
vocabulary: [
|
|
2822
|
+
"ValueProp",
|
|
2823
|
+
"LabelProp",
|
|
2824
|
+
"ChildrenProp",
|
|
2825
|
+
"DisabledProp",
|
|
2826
|
+
"IconProp",
|
|
2827
|
+
{
|
|
2828
|
+
field: "count",
|
|
2829
|
+
local: true,
|
|
2830
|
+
reason: "Counter-pill vocabulary shared VERBATIM with ButtonProp and ToggleProp (count/overflowCount/showZero) and drawn by the same `useCounterPill`, so a counted tab, a counted chip and a counted button are one thing \u2014 gh#312 / gh#734 / gh#762."
|
|
2831
|
+
},
|
|
2832
|
+
{
|
|
2833
|
+
field: "countLabel",
|
|
2834
|
+
local: true,
|
|
2835
|
+
reason: "Localized unit folded into the tab's accessible name (\xAB\u672A\u5BFE\u5FDC, 12 \u4EF6\u306E\u8AB2\u984C\xBB), so the digits never concatenate onto the label \u2014 gh#734's measured defect, same field name as Button/Toggle."
|
|
2836
|
+
}
|
|
2837
|
+
]
|
|
2807
2838
|
},
|
|
2808
2839
|
FormFieldArrayProp: {
|
|
2809
2840
|
group: "form",
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
export type { ClassNameProp, ChildrenProp, IdProp, OpenProp, DefaultOpenProp, OnOpenChangeProp, HandlerProp, PendingProp, RequiredProp, DisabledProp, LabelProp, HelperProp, ErrorProp, ErrorBagProp, PlaceholderProp, NameProp, ValueProp, DefaultValueProp, OnValueChangeProp, OnChangeProp, OnClickProp, AsChildProp, FlushProp, WidthProp, ControlWidthProp, AllowClearProp, MaxTagCountProp, MaxTagPlaceholderProp, NotFoundContentProp, PopupMatchWidthProp, } from "./shared.prop.js";
|
|
3
3
|
export type { TitleProp, SubtitleProp, StatusProp, DescriptionProp, ExtraProp, FooterProp, ActionProp, IconProp, ConfirmLabelProp, CancelLabelProp, ActionsProp, EmptyMessageProp, } from "./content.prop.js";
|
|
4
4
|
export type { PageDensityProp, PageContainerVariantProp, CenteredShellWidthProp, CenteredShellAlignProp, CenteredShellPresetProp, ErrorSurfaceModeProp, ErrorSurfaceStatusProp, AuthShellPresetProp, MobileShellHeightProp, MobileShellWidthProp, OrientationProp, TableDensityProp, DensityProp, GapNameProp, PadProp, PadRawProp, PadSides, GapProp, GapStepProp, } from "./layout.prop.js";
|
|
5
|
-
export type { ButtonVariantProp, ButtonSizeProp, BadgeVariantProp, AppSettingPickerAppearanceProp, AppSettingToggleAppearanceProp, ShapeProp, AvatarShapeProp, TextSizeProp, TextToneProp, FontWeightProp, HeadingLevelProp, TextAlignProp, TextWhitespaceProp, TypographyTypeProp, TitleLevelProp, TypographyCopyConfigProp, TypographyEditConfigProp, TypographyEllipsisConfigProp, TypographyActionsConfigProp, SizeProp, ControlStatusProp, ControlVariantProp, FormLayoutProp, DescriptionsLayoutProp, BreakpointProp, ConfirmVariantProp, ToneProp, AlertVariantProp, SortDirectionProp, ColumnAlignProp, SortStateProp, RevealDelayProp, ActivityVariantProp, ActivityAnnounceProp, IconSizeProp, } from "./interaction.prop.js";
|
|
5
|
+
export type { ButtonVariantProp, ButtonSizeProp, BadgeVariantProp, AppSettingPickerAppearanceProp, AppSettingToggleAppearanceProp, ShapeProp, AvatarShapeProp, TextSizeProp, TextToneProp, FontWeightProp, HeadingLevelProp, TextAlignProp, TextWhitespaceProp, TypographyTypeProp, TitleLevelProp, TypographyCopyConfigProp, TypographyEditConfigProp, TypographyEllipsisConfigProp, TypographyActionsConfigProp, SizeProp, ControlStatusProp, ControlVariantProp, FormLayoutProp, DescriptionsLayoutProp, BreakpointProp, ConfirmVariantProp, ToneProp, AlertVariantProp, CalloutKindProp, SortDirectionProp, ColumnAlignProp, SortStateProp, RevealDelayProp, ActivityVariantProp, ActivityAnnounceProp, IconSizeProp, } from "./interaction.prop.js";
|
|
6
6
|
export type { BreadcrumbItemProp, BreadcrumbProp, BreadcrumbItemMenuProp, BreadcrumbItemMenuEntryProp, BreadcrumbSeparatorProp, BreadcrumbItemRenderProp, } from "./navigation.prop.js";
|
|
7
7
|
export type { GetRowIdProp, GetRowLabelProp, OnRowClickProp, ColumnDefProp, TablePresetProp, TableColumnPriorityProp, TableCellIndentProp, SelectedIdsProp, OnSelectChangeProp, OnTableDensityChangeProp, TableRowToneProp, RowToneProp, OnSortChangeProp, OnSearchChangeProp, OnClearFiltersProp, HasActiveFiltersProp, StickyProp, ColumnFixedProp, ColumnFilterValueProp, ColumnFilterItemProp, ColumnFilterStateProp, OnColumnFilterChangeProp, ColumnCompareProp, ColumnSorterProp, TableSelectionItemProp, TableRowSelectionProp, TableExpandableProp, TableSummaryProp, TableScrollProp, TableStickyProp, OnRowProp, TablePaginationProp, TablePaginationPositionProp, DescriptionsColumnProp, DescriptionsSpanProp, DescriptionsItemsProp, } from "./data.prop.js";
|