@starci/grammar 0.8.4 → 0.9.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/.build-stamp.json +4 -4
- package/dist/common/components-navigation.css +3 -0
- package/dist/common/components-overlays.css +11 -0
- package/dist/common/registry.d.ts +7 -5
- package/dist/common/registry.d.ts.map +1 -1
- package/dist/common/registry.js +2 -2
- package/dist/common/registry.js.map +1 -1
- package/dist/common/renderers-forms.d.ts +2 -2
- package/dist/common/renderers-forms.d.ts.map +1 -1
- package/dist/common/renderers-forms.js.map +1 -1
- package/dist/common/renderers-navigation.d.ts +1 -1
- package/dist/common/renderers.d.ts +2 -0
- package/dist/common/renderers.d.ts.map +1 -1
- package/dist/common/renderers.js +2 -0
- package/dist/common/renderers.js.map +1 -1
- package/dist/common/styles.css +215 -11
- package/dist/core/branch/AlertDialog/index.d.ts.map +1 -1
- package/dist/core/branch/AlertDialog/index.js +1 -0
- package/dist/core/branch/AlertDialog/index.js.map +1 -1
- package/dist/core/branch/Dialog/index.d.ts.map +1 -1
- package/dist/core/branch/Dialog/index.js +1 -0
- package/dist/core/branch/Dialog/index.js.map +1 -1
- package/dist/core/branch/Drawer/index.d.ts.map +1 -1
- package/dist/core/branch/Drawer/index.js +1 -0
- package/dist/core/branch/Drawer/index.js.map +1 -1
- package/dist/core/branch/Rail/index.d.ts.map +1 -1
- package/dist/core/branch/Rail/index.js +1 -0
- package/dist/core/branch/Rail/index.js.map +1 -1
- package/dist/core/branch/Subnav/index.d.ts.map +1 -1
- package/dist/core/branch/Subnav/index.js +1 -0
- package/dist/core/branch/Subnav/index.js.map +1 -1
- package/dist/core/branch/SurfaceAccordionCard/index.d.ts.map +1 -1
- package/dist/core/branch/SurfaceAccordionCard/index.js +1 -0
- package/dist/core/branch/SurfaceAccordionCard/index.js.map +1 -1
- package/dist/core/branch/SurfaceCard/index.d.ts.map +1 -1
- package/dist/core/branch/SurfaceCard/index.js +1 -0
- package/dist/core/branch/SurfaceCard/index.js.map +1 -1
- package/dist/core/branch/SurfaceListCard/index.d.ts.map +1 -1
- package/dist/core/branch/SurfaceListCard/index.js +1 -0
- package/dist/core/branch/SurfaceListCard/index.js.map +1 -1
- package/dist/core/branch/Tooltip/index.d.ts.map +1 -1
- package/dist/core/branch/Tooltip/index.js +1 -0
- package/dist/core/branch/Tooltip/index.js.map +1 -1
- package/dist/core/composite/Alert/index.d.ts.map +1 -1
- package/dist/core/composite/Alert/index.js +1 -0
- package/dist/core/composite/Alert/index.js.map +1 -1
- package/dist/core/composite/ChatBubble/index.d.ts +32 -0
- package/dist/core/composite/ChatBubble/index.d.ts.map +1 -0
- package/dist/core/composite/ChatBubble/index.js +12 -0
- package/dist/core/composite/ChatBubble/index.js.map +1 -0
- package/dist/core/composite/FillViewport/index.d.ts +28 -0
- package/dist/core/composite/FillViewport/index.d.ts.map +1 -0
- package/dist/core/composite/FillViewport/index.js +55 -0
- package/dist/core/composite/FillViewport/index.js.map +1 -0
- package/dist/core/composition/BottomNav/index.d.ts.map +1 -1
- package/dist/core/composition/BottomNav/index.js +1 -1
- package/dist/core/composition/BottomNav/index.js.map +1 -1
- package/dist/core/composition/PrimaryRailLayout/index.d.ts +6 -1
- package/dist/core/composition/PrimaryRailLayout/index.d.ts.map +1 -1
- package/dist/core/composition/PrimaryRailLayout/index.js +1 -1
- package/dist/core/composition/PrimaryRailLayout/index.js.map +1 -1
- package/dist/core/composition/WorkspaceShell/index.js +1 -1
- package/dist/core/composition/WorkspaceShell/index.js.map +1 -1
- package/dist/core/primitive/IconButton/index.d.ts +12 -1
- package/dist/core/primitive/IconButton/index.d.ts.map +1 -1
- package/dist/core/primitive/IconButton/index.js +13 -2
- package/dist/core/primitive/IconButton/index.js.map +1 -1
- package/dist/core/primitive/Image/index.d.ts +6 -1
- package/dist/core/primitive/Image/index.d.ts.map +1 -1
- package/dist/core/primitive/Image/index.js +2 -2
- package/dist/core/primitive/Image/index.js.map +1 -1
- package/dist/core/primitive/Input/index.d.ts +8 -3
- package/dist/core/primitive/Input/index.d.ts.map +1 -1
- package/dist/core/primitive/Input/index.js +21 -4
- package/dist/core/primitive/Input/index.js.map +1 -1
- package/dist/core/primitive/PinnedActionBar/index.d.ts.map +1 -1
- package/dist/core/primitive/PinnedActionBar/index.js +1 -1
- package/dist/core/primitive/PinnedActionBar/index.js.map +1 -1
- package/dist/core/primitive/Textarea/index.d.ts +38 -2
- package/dist/core/primitive/Textarea/index.d.ts.map +1 -1
- package/dist/core/primitive/Textarea/index.js +106 -4
- package/dist/core/primitive/Textarea/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,11 +1,22 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Button as HeroButton, cn, skeletonVariants } from "@heroui/react";
|
|
3
3
|
import { Icon } from "../Icon/index.js";
|
|
4
|
+
/** What the badge plate prints: nothing for 0 / empty, the capped number, or the given text. */
|
|
5
|
+
export const iconButtonBadgeText = (badge, max = 99) => {
|
|
6
|
+
if (badge === undefined || badge === "" || badge === 0)
|
|
7
|
+
return null;
|
|
8
|
+
if (typeof badge === "number")
|
|
9
|
+
return badge > max ? `${max}+` : String(badge);
|
|
10
|
+
return badge;
|
|
11
|
+
};
|
|
4
12
|
/**
|
|
5
13
|
* The pill corner is SHIPPED by `.starci-core-icon-button` in `src/common/styles.css`, for the
|
|
6
14
|
* resolved action and its resting shimmer alike; only the shimmer itself comes from the vendor.
|
|
7
15
|
*/
|
|
8
16
|
const SKELETON_CLASS_NAME = skeletonVariants({ animationType: "shimmer" }).base();
|
|
9
17
|
/** Circular glyph-only action with a mandatory accessible name (A11Y-2, ICON-5). */
|
|
10
|
-
export const IconButton = ({ source, label, variant = "tertiary", isActive = false, isDisabled = false, isSkeleton = false, onPress, "aria-controls": controls, "aria-expanded": expanded,
|
|
18
|
+
export const IconButton = ({ source, label, variant = "tertiary", isActive = false, isDisabled = false, isSkeleton = false, onPress, "aria-controls": controls, "aria-expanded": expanded, badge, badgeLabel, badgeMax = 99, }) => {
|
|
19
|
+
const badgeText = isSkeleton ? null : iconButtonBadgeText(badge, badgeMax);
|
|
20
|
+
return (_jsxs(HeroButton, { "data-tier": "atom", "data-component": "IconButton", "data-contract": "A11Y-2 ICON-5", "data-active": isActive ? "true" : "false", "data-variant": variant, "data-loading": isSkeleton ? "true" : "false", type: "button", variant: variant, className: cn("starci-core-icon-button", isSkeleton ? SKELETON_CLASS_NAME : undefined) ?? "starci-core-icon-button", isIconOnly: true, isDisabled: isDisabled || isSkeleton, "aria-label": badgeText !== null && badgeLabel !== undefined ? `${label}, ${badgeLabel}` : label, "data-grammar-icon-button-badge": badgeText === null ? "none" : "present", ...(controls === undefined ? {} : { "aria-controls": controls }), ...(expanded === undefined ? {} : { "aria-expanded": expanded }), ...(isDisabled || isSkeleton || onPress === undefined ? {} : { onPress }), children: [isSkeleton ? null : _jsx(Icon, { source: source, usage: "leading" }), badgeText === null ? null : _jsx("span", { "aria-hidden": true, className: "starci-core-icon-button-badge", "data-contract": "TONE-2", children: badgeText })] }));
|
|
21
|
+
};
|
|
11
22
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/primitive/IconButton/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,EAAE,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAC1E,OAAO,EAAE,IAAI,EAAmB,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/primitive/IconButton/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,EAAE,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAC1E,OAAO,EAAE,IAAI,EAAmB,MAAM,kBAAkB,CAAA;AAiCxD,gGAAgG;AAChG,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,KAAkC,EAAE,GAAG,GAAG,EAAE,EAAiB,EAAE;IAC/F,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IACnE,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC7E,OAAO,KAAK,CAAA;AAChB,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;AAEjF,oFAAoF;AACpF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EACvB,MAAM,EACN,KAAK,EACL,OAAO,GAAG,UAAU,EACpB,QAAQ,GAAG,KAAK,EAChB,UAAU,GAAG,KAAK,EAClB,UAAU,GAAG,KAAK,EAClB,OAAO,EACP,eAAe,EAAE,QAAQ,EACzB,eAAe,EAAE,QAAQ,EACzB,KAAK,EACL,UAAU,EACV,QAAQ,GAAG,EAAE,GACC,EAAE,EAAE;IAClB,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;IAC1E,OAAO,CACP,MAAC,UAAU,iBACG,MAAM,oBACD,YAAY,mBACb,eAAe,iBAChB,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,kBAC1B,OAAO,kBACP,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAC3C,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,EAAE,CAAC,yBAAyB,EAAE,UAAU,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,yBAAyB,EACnH,UAAU,QACV,UAAU,EAAE,UAAU,IAAI,UAAU,gBACxB,SAAS,KAAK,IAAI,IAAI,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,UAAU,EAAE,CAAC,CAAC,CAAC,KAAK,oCAC9D,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,KACnE,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,KAC7D,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,KAC7D,CAAC,UAAU,IAAI,UAAU,IAAI,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,aAEzE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAC,SAAS,GAAG,EAC5D,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,oCAAkB,SAAS,EAAC,+BAA+B,mBAAe,QAAQ,YAAE,SAAS,GAAQ,IACzH,CACZ,CAAA;AACL,CAAC,CAAA"}
|
|
@@ -19,6 +19,11 @@ export type ImageProps = AssetSlotProps & {
|
|
|
19
19
|
readonly width?: number;
|
|
20
20
|
readonly height?: number;
|
|
21
21
|
readonly onLoadStateChange?: (state: ImageLoadState) => void;
|
|
22
|
+
/**
|
|
23
|
+
* `default` paints the neutral loading plate behind the picture; `none` keeps the box transparent for cut-out art
|
|
24
|
+
* (a mascot or logo with an alpha channel) that must sit directly on its surface.
|
|
25
|
+
*/
|
|
26
|
+
readonly plate?: "default" | "none";
|
|
22
27
|
readonly className?: string;
|
|
23
28
|
};
|
|
24
29
|
/**
|
|
@@ -28,5 +33,5 @@ export type ImageProps = AssetSlotProps & {
|
|
|
28
33
|
* `MediaFrame` frames approved art with a caption; `Image` is the element inside or outside it.
|
|
29
34
|
* Contract: box MEDIA-2 MEDIA-5 (reserved ratio, load states), img MEDIA-4 MOTION-2, fallback MEDIA-4 MEDIA-5.
|
|
30
35
|
*/
|
|
31
|
-
export declare const Image: ({ src, alt, aspect, fit, fallback, loading, srcSet, sizes, width, height, onLoadStateChange, className, ...assetSlot }: ImageProps) => import("react").JSX.Element;
|
|
36
|
+
export declare const Image: ({ src, alt, aspect, fit, fallback, loading, srcSet, sizes, width, height, onLoadStateChange, plate, className, ...assetSlot }: ImageProps) => import("react").JSX.Element;
|
|
32
37
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/primitive/Image/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA+B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAEnE,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEzE,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,WAAW,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,CAAA;AAC/E,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAA;AAE3D,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG;IACtC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,4DAA4D;IAC5D,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,0FAA0F;IAC1F,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;IAC7B,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IAClC,2DAA2D;IAC3D,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;IAC7B,0EAA0E;IAC1E,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAA;IAC5D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC9B,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,KAAK,GAAI,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/primitive/Image/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA+B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAEnE,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEzE,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,WAAW,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,CAAA;AAC/E,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAA;AAE3D,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG;IACtC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,4DAA4D;IAC5D,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,0FAA0F;IAC1F,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;IAC7B,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IAClC,2DAA2D;IAC3D,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;IAC7B,0EAA0E;IAC1E,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAA;IAC5D;;;OAGG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,CAAA;IACnC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC9B,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,KAAK,GAAI,+HAenB,UAAU,gCAqDZ,CAAA"}
|
|
@@ -10,7 +10,7 @@ import { assetSlotAttributes } from "./assetSlot.js";
|
|
|
10
10
|
* `MediaFrame` frames approved art with a caption; `Image` is the element inside or outside it.
|
|
11
11
|
* Contract: box MEDIA-2 MEDIA-5 (reserved ratio, load states), img MEDIA-4 MOTION-2, fallback MEDIA-4 MEDIA-5.
|
|
12
12
|
*/
|
|
13
|
-
export const Image = ({ src, alt, aspect = "auto", fit = "cover", fallback, loading = "lazy", srcSet, sizes, width, height, onLoadStateChange, className, ...assetSlot }) => {
|
|
13
|
+
export const Image = ({ src, alt, aspect = "auto", fit = "cover", fallback, loading = "lazy", srcSet, sizes, width, height, onLoadStateChange, plate = "default", className, ...assetSlot }) => {
|
|
14
14
|
const [state, setState] = useState("loading");
|
|
15
15
|
const imageRef = useRef(null);
|
|
16
16
|
const report = (next) => {
|
|
@@ -25,6 +25,6 @@ export const Image = ({ src, alt, aspect = "auto", fit = "cover", fallback, load
|
|
|
25
25
|
report("loaded");
|
|
26
26
|
}, [src]);
|
|
27
27
|
const showFallback = state === "error" && fallback !== undefined;
|
|
28
|
-
return (_jsx("span", { className: navigationClassName("starci-core-image", className), "data-component": "Image", "data-contract": "MEDIA-2 MEDIA-5", "data-tier": "atom", "data-grammar-image-aspect": aspect, "data-grammar-image-fit": fit, "data-grammar-image-state": state, ...assetSlotAttributes(assetSlot), children: showFallback ? (_jsx("span", { className: "starci-core-image-fallback", "data-contract": "MEDIA-4 MEDIA-5", "data-grammar-image-fallback": "true", ...(alt === "" ? { "aria-hidden": true } : { role: "img", "aria-label": alt }), children: fallback })) : (_jsx("img", { ref: imageRef, alt: alt, className: "starci-core-image-element", "data-contract": "MEDIA-4 MOTION-2", decoding: "async", loading: loading, src: src, ...(srcSet === undefined ? {} : { srcSet }), ...(sizes === undefined ? {} : { sizes }), ...(width === undefined ? {} : { width }), ...(height === undefined ? {} : { height }), onError: () => report("error"), onLoad: () => report("loaded") })) }));
|
|
28
|
+
return (_jsx("span", { className: navigationClassName("starci-core-image", className), "data-component": "Image", "data-contract": "MEDIA-2 MEDIA-5", "data-tier": "atom", "data-grammar-image-aspect": aspect, "data-grammar-image-fit": fit, "data-grammar-image-state": state, "data-grammar-image-plate": plate, ...assetSlotAttributes(assetSlot), children: showFallback ? (_jsx("span", { className: "starci-core-image-fallback", "data-contract": "MEDIA-4 MEDIA-5", "data-grammar-image-fallback": "true", ...(alt === "" ? { "aria-hidden": true } : { role: "img", "aria-label": alt }), children: fallback })) : (_jsx("img", { ref: imageRef, alt: alt, className: "starci-core-image-element", "data-contract": "MEDIA-4 MOTION-2", decoding: "async", loading: loading, src: src, ...(srcSet === undefined ? {} : { srcSet }), ...(sizes === undefined ? {} : { sizes }), ...(width === undefined ? {} : { width }), ...(height === undefined ? {} : { height }), onError: () => report("error"), onLoad: () => report("loaded") })) }));
|
|
29
29
|
};
|
|
30
30
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/primitive/Image/index.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAA;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAA;AACnE,OAAO,EAAE,mBAAmB,EAAuB,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/primitive/Image/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -21,11 +21,16 @@ export type InputProps = {
|
|
|
21
21
|
readonly isSkeleton?: boolean;
|
|
22
22
|
/** The value can be focused, selected and copied but not changed (unlike `isDisabled`, it stays at full contrast). */
|
|
23
23
|
readonly isReadOnly?: boolean;
|
|
24
|
-
/**
|
|
24
|
+
/**
|
|
25
|
+
* Adds a copy action inside the field, at its end (after the reveal toggle of a secret), that copies the current value;
|
|
26
|
+
* needs `copyLabel` (its accessible name, and its visible text when no `copyIcon` is given).
|
|
27
|
+
*/
|
|
25
28
|
readonly isCopyable?: boolean;
|
|
26
29
|
readonly copyLabel?: string;
|
|
27
|
-
/**
|
|
30
|
+
/** Announced (and shown, without `copiedIcon`) on the copy action for a moment after a successful copy. */
|
|
28
31
|
readonly copiedLabel?: string;
|
|
32
|
+
readonly copyIcon?: InputIcon;
|
|
33
|
+
readonly copiedIcon?: InputIcon;
|
|
29
34
|
/** Called with the copied value after it reached the clipboard. */
|
|
30
35
|
readonly onCopy?: (value: string) => void;
|
|
31
36
|
readonly revealLabel?: string;
|
|
@@ -35,6 +40,6 @@ export type InputProps = {
|
|
|
35
40
|
readonly onValueChange?: (value: string) => void;
|
|
36
41
|
};
|
|
37
42
|
/** Core ownership boundary for label, guidance, control state, and validation copy. */
|
|
38
|
-
export declare const Input: ({ id, name, label, kind: kindName, variant, placeholder, defaultValue, value, hint, errorMessage, isError, isDisabled, isRequired, isSkeleton, isReadOnly, isCopyable, copyLabel, copiedLabel, onCopy, revealLabel, hideLabel, revealIcon: RevealIcon, hideIcon: HideIcon, onValueChange, }: InputProps) => import("react").JSX.Element;
|
|
43
|
+
export declare const Input: ({ id, name, label, kind: kindName, variant, placeholder, defaultValue, value, hint, errorMessage, isError, isDisabled, isRequired, isSkeleton, isReadOnly, isCopyable, copyLabel, copiedLabel, copyIcon: CopyIcon, copiedIcon: CopiedIcon, onCopy, revealLabel, hideLabel, revealIcon: RevealIcon, hideIcon: HideIcon, onValueChange, }: InputProps) => import("react").JSX.Element;
|
|
39
44
|
export {};
|
|
40
45
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/primitive/Input/index.tsx"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/primitive/Input/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAgD,KAAK,aAAa,EAAsB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAU5H,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,KAAK,GAAG,UAAU,GAAG,aAAa,GAAG,MAAM,GAAG,MAAM,CAAA;AACtF,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,WAAW,CAAA;AAElD,KAAK,SAAS,GAAG,aAAa,CAAC;IAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAA;AAE/D,MAAM,MAAM,UAAU,GAAG;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAA;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAA;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,CAAA;IAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAA;IACzB,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,CAAA;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;IAC7B,sHAAsH;IACtH,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;IAC7B;;;OAGG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,2GAA2G;IAC3G,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,CAAA;IAC/B,mEAAmE;IACnE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACzC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,CAAA;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;IAC7B,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CACnD,CAAA;AAWD,uFAAuF;AACvF,eAAO,MAAM,KAAK,GAAI,yUA2BnB,UAAU,gCAiIZ,CAAA"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { useEffect, useState } from "react";
|
|
3
|
+
import { useEffect, useLayoutEffect, useRef, useState } from "react";
|
|
4
4
|
import { Description as HeroDescription, ErrorMessage as HeroErrorMessage, Input as HeroInput, Label as HeroLabel, Skeleton as HeroSkeleton, TextField as HeroTextField, } from "@heroui/react";
|
|
5
|
-
import { Button } from "../Button/index.js";
|
|
6
5
|
const KINDS = {
|
|
7
6
|
email: { type: "email", autoComplete: "email", inputMode: "email" },
|
|
8
7
|
tel: { type: "tel", autoComplete: "tel", inputMode: "tel" },
|
|
@@ -12,7 +11,7 @@ const KINDS = {
|
|
|
12
11
|
text: { type: "text", autoComplete: "off", inputMode: "text" },
|
|
13
12
|
};
|
|
14
13
|
/** Core ownership boundary for label, guidance, control state, and validation copy. */
|
|
15
|
-
export const Input = ({ id, name, label, kind: kindName = "text", variant = "primary", placeholder, defaultValue, value, hint, errorMessage, isError = false, isDisabled = false, isRequired = false, isSkeleton = false, isReadOnly = false, isCopyable = false, copyLabel, copiedLabel, onCopy, revealLabel, hideLabel, revealIcon: RevealIcon, hideIcon: HideIcon, onValueChange, }) => {
|
|
14
|
+
export const Input = ({ id, name, label, kind: kindName = "text", variant = "primary", placeholder, defaultValue, value, hint, errorMessage, isError = false, isDisabled = false, isRequired = false, isSkeleton = false, isReadOnly = false, isCopyable = false, copyLabel, copiedLabel, copyIcon: CopyIcon, copiedIcon: CopiedIcon, onCopy, revealLabel, hideLabel, revealIcon: RevealIcon, hideIcon: HideIcon, onValueChange, }) => {
|
|
16
15
|
const [isRevealed, setIsRevealed] = useState(false);
|
|
17
16
|
const kind = KINDS[kindName];
|
|
18
17
|
const isSecret = kindName === "password" || kindName === "newPassword";
|
|
@@ -21,6 +20,24 @@ export const Input = ({ id, name, label, kind: kindName = "text", variant = "pri
|
|
|
21
20
|
const ToggleIcon = isRevealed ? HideIcon : RevealIcon;
|
|
22
21
|
const [isCopied, setIsCopied] = useState(false);
|
|
23
22
|
const canCopy = isCopyable && copyLabel !== undefined;
|
|
23
|
+
const canReveal = isSecret && toggleLabel !== undefined;
|
|
24
|
+
const copyName = isCopied && copiedLabel !== undefined ? copiedLabel : copyLabel;
|
|
25
|
+
const CopyGlyph = isCopied && CopiedIcon !== undefined ? CopiedIcon : CopyIcon;
|
|
26
|
+
// The in-field actions overlay the field's end; the field reserves exactly their measured width so the value never runs under them.
|
|
27
|
+
const actions = useRef(null);
|
|
28
|
+
const [actionsWidth, setActionsWidth] = useState(null);
|
|
29
|
+
useLayoutEffect(() => {
|
|
30
|
+
const node = actions.current;
|
|
31
|
+
if (node === null)
|
|
32
|
+
return;
|
|
33
|
+
const measure = () => setActionsWidth(node.getBoundingClientRect().width);
|
|
34
|
+
measure();
|
|
35
|
+
if (typeof ResizeObserver === "undefined")
|
|
36
|
+
return;
|
|
37
|
+
const observer = new ResizeObserver(measure);
|
|
38
|
+
observer.observe(node);
|
|
39
|
+
return () => observer.disconnect();
|
|
40
|
+
}, [canCopy, canReveal]);
|
|
24
41
|
useEffect(() => {
|
|
25
42
|
if (!isCopied)
|
|
26
43
|
return;
|
|
@@ -49,6 +66,6 @@ export const Input = ({ id, name, label, kind: kindName = "text", variant = "pri
|
|
|
49
66
|
}
|
|
50
67
|
return (_jsxs(HeroTextField, { "data-tier": "atom", "data-component": "Input", fullWidth: true, variant: variant, "data-grammar-variant": variant, isInvalid: invalid, isDisabled: isDisabled, isRequired: isRequired, isReadOnly: isReadOnly, ...(value === undefined
|
|
51
68
|
? defaultValue === undefined ? {} : { defaultValue }
|
|
52
|
-
: { value }), onChange: (next) => onValueChange?.(next), "data-grammar-readonly": isReadOnly ? "true" : "false", "data-contract": "GAP-2", className: "starci-core-input", children: [_jsx(HeroLabel, { children: label }), hint == null ? null : _jsx(HeroDescription, { children: hint }), _jsxs("div", { className: "starci-core-input-
|
|
69
|
+
: { value }), onChange: (next) => onValueChange?.(next), "data-grammar-readonly": isReadOnly ? "true" : "false", "data-contract": "GAP-2", className: "starci-core-input", children: [_jsx(HeroLabel, { children: label }), hint == null ? null : _jsx(HeroDescription, { children: hint }), _jsxs("div", { className: "starci-core-input-control", "data-reveal": canReveal ? "true" : "false", "data-copyable": canCopy ? "true" : "false", style: actionsWidth === null ? undefined : { "--starci-core-input-actions-width": `${actionsWidth}px` }, children: [_jsx(HeroInput, { id: id, name: name, type: isSecret && isRevealed ? "text" : kind.type, autoComplete: kind.autoComplete, inputMode: kind.inputMode, ...(placeholder === undefined ? {} : { placeholder }), fullWidth: true, className: "starci-core-input-field" }), canReveal || canCopy ? (_jsxs("span", { ref: actions, className: "starci-core-input-actions", children: [canReveal ? (_jsx("button", { type: "button", "aria-label": toggleLabel, disabled: isDisabled, "data-contract": "TONE-2", className: "starci-core-input-reveal", onClick: () => setIsRevealed((current) => !current), children: ToggleIcon === undefined ? _jsx("span", { "data-contract": "FONT-1", className: "starci-core-input-reveal-label", children: toggleLabel }) : _jsx(ToggleIcon, { className: "starci-core-input-reveal-icon" }) })) : null, canCopy ? (_jsx("button", { type: "button", "aria-label": copyName, disabled: isDisabled, "data-contract": "TONE-2", "data-copied": isCopied ? "true" : "false", className: "starci-core-input-reveal starci-core-input-copy", onClick: () => void copy(), children: CopyGlyph === undefined ? _jsx("span", { "data-contract": "FONT-1", className: "starci-core-input-reveal-label", children: copyName }) : _jsx(CopyGlyph, { className: "starci-core-input-reveal-icon" }) })) : null, _jsx("span", { className: "starci-core-input-live", "aria-live": "polite", children: isCopied ? copiedLabel ?? "" : "" })] })) : null] }), errorMessage == null ? null : _jsx(HeroErrorMessage, { children: errorMessage })] }));
|
|
53
70
|
};
|
|
54
71
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/primitive/Input/index.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,SAAS,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/primitive/Input/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/primitive/PinnedActionBar/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,8HAA8H;AAC9H,MAAM,MAAM,yBAAyB,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAE3D,MAAM,MAAM,oBAAoB,GAAG;IAC/B,8FAA8F;IAC9F,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAA;IAC5B,+EAA+E;IAC/E,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,wBAAwB;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,yBAAyB,CAAA;CAClD,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAAI,iCAA4C,oBAAoB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/primitive/PinnedActionBar/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,8HAA8H;AAC9H,MAAM,MAAM,yBAAyB,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAE3D,MAAM,MAAM,oBAAoB,GAAG;IAC/B,8FAA8F;IAC9F,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAA;IAC5B,+EAA+E;IAC/E,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,wBAAwB;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,yBAAyB,CAAA;CAClD,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAAI,iCAA4C,oBAAoB,gCAa/F,CAAA"}
|
|
@@ -6,5 +6,5 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
6
6
|
* inset. It holds one Button; it is not navigation (that is `BottomNav`). Hidden at 48rem and wider unless
|
|
7
7
|
* `visibility="always"`, so the same command is shown once per viewport (LAYOUT-4 case-2).
|
|
8
8
|
*/
|
|
9
|
-
export const PinnedActionBar = ({ children, label, visibility = "narrow" }) => (_jsx("div", { "aria-label": label, className: "starci-core-pinned-action-bar", "data-component": "PinnedActionBar", "data-contract": "BOUNDARY-1", "data-grammar-pinned-visibility": visibility, "data-tier": "atom", role: "group", children: children }));
|
|
9
|
+
export const PinnedActionBar = ({ children, label, visibility = "narrow" }) => (_jsx("div", { "aria-label": label, className: "starci-core-pinned-action-bar", "data-component": "PinnedActionBar", "data-grammar-bottom-chrome": "true", "data-contract": "BOUNDARY-1", "data-grammar-pinned-visibility": visibility, "data-tier": "atom", role: "group", children: children }));
|
|
10
10
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/primitive/PinnedActionBar/index.tsx"],"names":[],"mappings":";AAcA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,GAAG,QAAQ,EAAwB,EAAE,EAAE,CAAC,CACjG,4BACgB,KAAK,EACjB,SAAS,EAAC,+BAA+B,oBAC1B,iBAAiB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/primitive/PinnedActionBar/index.tsx"],"names":[],"mappings":";AAcA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,GAAG,QAAQ,EAAwB,EAAE,EAAE,CAAC,CACjG,4BACgB,KAAK,EACjB,SAAS,EAAC,+BAA+B,oBAC1B,iBAAiB,gCACL,MAAM,mBACnB,YAAY,oCACM,UAAU,eAChC,MAAM,EAChB,IAAI,EAAC,OAAO,YAEX,QAAQ,GACP,CACT,CAAA"}
|
|
@@ -1,4 +1,24 @@
|
|
|
1
1
|
import { type FieldControlProps } from "../Field/index.js";
|
|
2
|
+
/** One person or agent the reader can mention. `label` is what is inserted after the trigger. */
|
|
3
|
+
export type TextareaMentionOption = {
|
|
4
|
+
readonly id: string;
|
|
5
|
+
readonly label: string;
|
|
6
|
+
/** A second muted line in the suggestion list (role, handle). */
|
|
7
|
+
readonly description?: string;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Mention suggestions: typing the trigger (default `@`) at a word start opens a list filtered by what follows it;
|
|
11
|
+
* ArrowUp/ArrowDown move, Enter or Tab inserts `trigger + label + space`, Escape closes. Works on a controlled value
|
|
12
|
+
* (`value` + `onValueChange`), because inserting a mention rewrites the text.
|
|
13
|
+
*/
|
|
14
|
+
export type TextareaMentions = {
|
|
15
|
+
readonly options: ReadonlyArray<TextareaMentionOption>;
|
|
16
|
+
/** Accessible name of the suggestion list, e.g. "People to mention". */
|
|
17
|
+
readonly label: string;
|
|
18
|
+
readonly trigger?: string;
|
|
19
|
+
/** Called after a mention was inserted. */
|
|
20
|
+
readonly onSelect?: (option: TextareaMentionOption) => void;
|
|
21
|
+
};
|
|
2
22
|
export type TextareaProps = FieldControlProps & {
|
|
3
23
|
readonly id?: string;
|
|
4
24
|
readonly placeholder?: string;
|
|
@@ -12,7 +32,23 @@ export type TextareaProps = FieldControlProps & {
|
|
|
12
32
|
readonly onValueChange?: (value: string) => void;
|
|
13
33
|
/** Layer variant: `secondary` when the control sits on a surface (ANATOMY-2 case-1). */
|
|
14
34
|
readonly variant?: "primary" | "secondary";
|
|
35
|
+
/**
|
|
36
|
+
* Chat composer shortcut: Enter (without Shift, outside an IME composition and with no suggestion list open) calls this
|
|
37
|
+
* instead of breaking the line; Shift+Enter still breaks the line.
|
|
38
|
+
*/
|
|
39
|
+
readonly onSubmitShortcut?: () => void;
|
|
40
|
+
readonly mentions?: TextareaMentions;
|
|
41
|
+
};
|
|
42
|
+
type MentionQuery = {
|
|
43
|
+
readonly start: number;
|
|
44
|
+
readonly end: number;
|
|
45
|
+
readonly text: string;
|
|
15
46
|
};
|
|
16
|
-
/**
|
|
17
|
-
export declare const
|
|
47
|
+
/** The trigger word that ends at the caret (`@an` in "hi @an|"), or null. The trigger must start the text or follow a space. */
|
|
48
|
+
export declare const findMentionQuery: (text: string, caret: number, trigger?: string) => MentionQuery | null;
|
|
49
|
+
/** Options whose label (accent- and case-insensitive) contains the query, at most eight. */
|
|
50
|
+
export declare const filterMentionOptions: (options: ReadonlyArray<TextareaMentionOption>, query: string) => ReadonlyArray<TextareaMentionOption>;
|
|
51
|
+
/** Multi-line text with the shared field anatomy, an optional Enter-to-submit shortcut and optional mention suggestions. */
|
|
52
|
+
export declare const Textarea: ({ id, placeholder, value, defaultValue, rows, maxLength, minLength, onValueChange, variant, onSubmitShortcut, mentions, ...field }: TextareaProps) => import("react").JSX.Element;
|
|
53
|
+
export {};
|
|
18
54
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/primitive/Textarea/index.tsx"],"names":[],"mappings":"AAIA,OAAO,EAOH,KAAK,iBAAiB,EACzB,MAAM,mBAAmB,CAAA;AAE1B,MAAM,MAAM,aAAa,GAAG,iBAAiB,GAAG;IAC5C,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,iFAAiF;IACjF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,2DAA2D;IAC3D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAChD,wFAAwF;IACxF,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/primitive/Textarea/index.tsx"],"names":[],"mappings":"AAIA,OAAO,EAOH,KAAK,iBAAiB,EACzB,MAAM,mBAAmB,CAAA;AAE1B,iGAAiG;AACjG,MAAM,MAAM,qBAAqB,GAAG;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,iEAAiE;IACjE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAChC,CAAA;AAED;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC3B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,qBAAqB,CAAC,CAAA;IACtD,wEAAwE;IACxE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,2CAA2C;IAC3C,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,qBAAqB,KAAK,IAAI,CAAA;CAC9D,CAAA;AAED,MAAM,MAAM,aAAa,GAAG,iBAAiB,GAAG;IAC5C,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,iFAAiF;IACjF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,2DAA2D;IAC3D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAChD,wFAAwF;IACxF,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,CAAA;IAC1C;;;OAGG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAA;IACtC,QAAQ,CAAC,QAAQ,CAAC,EAAE,gBAAgB,CAAA;CACvC,CAAA;AAED,KAAK,YAAY,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAI3F,gIAAgI;AAChI,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,EAAE,OAAO,MAAM,EAAE,gBAAa,KAAG,YAAY,GAAG,IAQ5F,CAAA;AAED,4FAA4F;AAC5F,eAAO,MAAM,oBAAoB,GAAI,SAAS,aAAa,CAAC,qBAAqB,CAAC,EAAE,OAAO,MAAM,KAAG,aAAa,CAAC,qBAAqB,CAGtI,CAAA;AAQD,4HAA4H;AAC5H,eAAO,MAAM,QAAQ,GAAI,oIAatB,aAAa,gCA4Jf,CAAA"}
|
|
@@ -1,20 +1,122 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { TextArea as HeroTextArea, TextField as HeroTextField } from "@heroui/react";
|
|
4
|
-
import { useState } from "react";
|
|
4
|
+
import { useId, useMemo, useState } from "react";
|
|
5
5
|
import { FieldDescription, FieldErrorText, FieldLabel, fieldVariantAttributes, isFieldInvalid, vendorFieldProps, } from "../Field/index.js";
|
|
6
|
+
const fold = (s) => s.normalize("NFD").replace(/\p{Diacritic}/gu, "").toLowerCase();
|
|
7
|
+
/** The trigger word that ends at the caret (`@an` in "hi @an|"), or null. The trigger must start the text or follow a space. */
|
|
8
|
+
export const findMentionQuery = (text, caret, trigger = "@") => {
|
|
9
|
+
const before = text.slice(0, caret);
|
|
10
|
+
const at = before.lastIndexOf(trigger);
|
|
11
|
+
if (at < 0)
|
|
12
|
+
return null;
|
|
13
|
+
if (at > 0 && !/\s/.test(before.charAt(at - 1)))
|
|
14
|
+
return null;
|
|
15
|
+
const query = before.slice(at + trigger.length);
|
|
16
|
+
if (/\s/.test(query))
|
|
17
|
+
return null;
|
|
18
|
+
return { start: at, end: caret, text: query };
|
|
19
|
+
};
|
|
20
|
+
/** Options whose label (accent- and case-insensitive) contains the query, at most eight. */
|
|
21
|
+
export const filterMentionOptions = (options, query) => {
|
|
22
|
+
const q = fold(query);
|
|
23
|
+
return options.filter((o) => fold(o.label).includes(q) || fold(o.description ?? "").includes(q)).slice(0, 8);
|
|
24
|
+
};
|
|
6
25
|
/*
|
|
7
26
|
* Consumer hook: `starci-core-textarea` names this control's root for a consumer or family
|
|
8
27
|
* stylesheet. No shipped sheet paints it: the root is drawn as a whole by `.starci-core-field`, so
|
|
9
28
|
* a rule on the hook adds to the shared anatomy and never has to replace it.
|
|
10
29
|
*/
|
|
11
|
-
/** Multi-line text with the shared field anatomy. */
|
|
12
|
-
export const Textarea = ({ id, placeholder, value, defaultValue, rows = 4, maxLength, minLength, onValueChange, variant = "primary", ...field }) => {
|
|
30
|
+
/** Multi-line text with the shared field anatomy, an optional Enter-to-submit shortcut and optional mention suggestions. */
|
|
31
|
+
export const Textarea = ({ id, placeholder, value, defaultValue, rows = 4, maxLength, minLength, onValueChange, variant = "primary", onSubmitShortcut, mentions, ...field }) => {
|
|
13
32
|
const [uncontrolledLength, setUncontrolledLength] = useState((defaultValue ?? "").length);
|
|
14
33
|
const length = value === undefined ? uncontrolledLength : value.length;
|
|
34
|
+
const generatedId = useId();
|
|
35
|
+
const controlId = id ?? `textarea-${generatedId}`;
|
|
36
|
+
const listId = `${controlId}-mentions`;
|
|
37
|
+
const trigger = mentions?.trigger ?? "@";
|
|
38
|
+
const [query, setQuery] = useState(null);
|
|
39
|
+
const [active, setActive] = useState(0);
|
|
40
|
+
const suggestions = useMemo(() => (mentions === undefined || query === null ? [] : filterMentionOptions(mentions.options, query.text)), [mentions, query]);
|
|
41
|
+
const isOpen = suggestions.length > 0;
|
|
42
|
+
const readQuery = (control) => {
|
|
43
|
+
if (mentions === undefined)
|
|
44
|
+
return;
|
|
45
|
+
const next = control.selectionStart === control.selectionEnd ? findMentionQuery(control.value, control.selectionStart, trigger) : null;
|
|
46
|
+
setQuery(next);
|
|
47
|
+
setActive(0);
|
|
48
|
+
};
|
|
49
|
+
const insert = (option) => {
|
|
50
|
+
const control = document.getElementById(controlId);
|
|
51
|
+
if (!(control instanceof HTMLTextAreaElement) || query === null)
|
|
52
|
+
return;
|
|
53
|
+
const text = control.value;
|
|
54
|
+
const inserted = `${trigger}${option.label} `;
|
|
55
|
+
const next = `${text.slice(0, query.start)}${inserted}${text.slice(query.end)}`;
|
|
56
|
+
const caret = query.start + inserted.length;
|
|
57
|
+
onValueChange?.(next);
|
|
58
|
+
setUncontrolledLength(next.length);
|
|
59
|
+
setQuery(null);
|
|
60
|
+
mentions?.onSelect?.(option);
|
|
61
|
+
requestAnimationFrame(() => {
|
|
62
|
+
control.focus();
|
|
63
|
+
control.setSelectionRange(caret, caret);
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
const onKeyDown = (event) => {
|
|
67
|
+
if (isOpen) {
|
|
68
|
+
if (event.key === "ArrowDown" || event.key === "ArrowUp") {
|
|
69
|
+
event.preventDefault();
|
|
70
|
+
const step = event.key === "ArrowDown" ? 1 : -1;
|
|
71
|
+
setActive((current) => (current + step + suggestions.length) % suggestions.length);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (event.key === "Enter" || event.key === "Tab") {
|
|
75
|
+
event.preventDefault();
|
|
76
|
+
const option = suggestions[active];
|
|
77
|
+
if (option !== undefined)
|
|
78
|
+
insert(option);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (event.key === "Escape") {
|
|
82
|
+
event.preventDefault();
|
|
83
|
+
setQuery(null);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (onSubmitShortcut !== undefined && event.key === "Enter" && !event.shiftKey && !event.nativeEvent.isComposing) {
|
|
88
|
+
event.preventDefault();
|
|
89
|
+
onSubmitShortcut();
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
const activeId = isOpen ? `${listId}-${suggestions[active]?.id ?? ""}` : undefined;
|
|
15
93
|
return (_jsxs(HeroTextField, { "data-tier": "atom", "data-component": "Textarea", "data-contract": "A11Y-1 FIELD-1 FIELD-2 FIELD-3", className: "starci-core-field starci-core-textarea", fullWidth: true, variant: variant, ...fieldVariantAttributes(variant), ...vendorFieldProps(field), isReadOnly: field.isReadOnly === true, ...(value === undefined ? defaultValue === undefined ? {} : { defaultValue } : { value }), ...(maxLength === undefined ? {} : { maxLength }), ...(minLength === undefined ? {} : { minLength }), onChange: (next) => {
|
|
16
94
|
setUncontrolledLength(next.length);
|
|
17
95
|
onValueChange?.(next);
|
|
18
|
-
|
|
96
|
+
// Text can arrive without a key release (IME, paste, a phone keyboard, dictation): re-read the trigger then too.
|
|
97
|
+
if (mentions !== undefined) {
|
|
98
|
+
queueMicrotask(() => {
|
|
99
|
+
const control = document.getElementById(controlId);
|
|
100
|
+
if (control instanceof HTMLTextAreaElement)
|
|
101
|
+
readQuery(control);
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}, children: [_jsx(FieldLabel, { isHidden: field.isLabelHidden, isRequired: field.isRequired, children: field.label }), _jsxs("div", { className: "starci-core-textarea-anchor", children: [_jsx(HeroTextArea, { id: controlId, rows: rows, ...(placeholder === undefined ? {} : { placeholder }), className: "starci-core-textarea-control", "data-grammar-field-control": "true", onKeyDown: onKeyDown, ...(mentions === undefined
|
|
105
|
+
? {}
|
|
106
|
+
: {
|
|
107
|
+
onKeyUp: (event) => {
|
|
108
|
+
if (!["ArrowDown", "ArrowUp", "Enter", "Tab", "Escape"].includes(event.key))
|
|
109
|
+
readQuery(event.currentTarget);
|
|
110
|
+
},
|
|
111
|
+
onClick: (event) => readQuery(event.currentTarget),
|
|
112
|
+
onBlur: () => setQuery(null),
|
|
113
|
+
"aria-autocomplete": "list",
|
|
114
|
+
// A textbox may carry aria-controls / aria-autocomplete / aria-activedescendant, not aria-expanded (ARIA 1.2);
|
|
115
|
+
// both references are set only while the list exists, so they never point at a missing element.
|
|
116
|
+
...(activeId === undefined ? {} : { "aria-controls": listId, "aria-activedescendant": activeId }),
|
|
117
|
+
}) }), mentions === undefined || !isOpen ? null : (_jsx("ul", { id: listId, role: "listbox", "aria-label": mentions.label, className: "starci-core-mention-list", "data-grammar-mention-list": "true", children: suggestions.map((option, index) => (_jsxs("li", { id: `${listId}-${option.id}`, role: "option", "aria-selected": index === active, className: "starci-core-mention-option", "data-grammar-mention-active": index === active ? "true" : "false", onMouseDown: (event) => {
|
|
118
|
+
event.preventDefault();
|
|
119
|
+
insert(option);
|
|
120
|
+
}, onMouseEnter: () => setActive(index), children: [_jsx("span", { className: "starci-core-mention-label", children: option.label }), option.description === undefined ? null : _jsx("span", { className: "starci-core-mention-description", children: option.description })] }, option.id))) }))] }), field.description == null && maxLength === undefined ? null : (_jsxs("div", { className: "starci-core-field-meta", children: [_jsx(FieldDescription, { children: field.description }), maxLength === undefined ? null : (_jsxs("span", { className: "starci-core-field-count", "data-grammar-field-count": "true", "data-grammar-invalid": isFieldInvalid(field) || length > maxLength ? "true" : "false", children: [length, "/", maxLength] }))] })), _jsx(FieldErrorText, { children: field.errorMessage })] }));
|
|
19
121
|
};
|
|
20
122
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/primitive/Textarea/index.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,eAAe,CAAA;AACpF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/primitive/Textarea/index.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@starci/grammar",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "Reusable StarCi React components, compositions, and packaged visual DNA.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"starci",
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
"scripts": {
|
|
60
60
|
"build": "node scripts/clean.mjs && tsc -p tsconfig.build.json && node scripts/copy-css.mjs && node scripts/build-stamp.mjs",
|
|
61
61
|
"typecheck": "tsc -p tsconfig.build.json --noEmit && tsc -p tsconfig.stories.json",
|
|
62
|
-
"test": "npm run build && node --test src/common/index.spec.mjs src/core/index.spec.mjs src/offset-pop/index.spec.mjs src/package-boundary.spec.mjs && vitest run --config vitest.config.ts src/shipped-geometry.spec.ts src/core/shipped-claims.spec.tsx src/common/conformance.spec.ts src/common/styles.spec.ts src/core/family.spec.tsx src/core/styles.spec.ts src/core/surface-card-family.spec.tsx src/core/scrollable-surfaces.spec.tsx src/core/primitive/Badge/index.spec.tsx src/core/primitive/Button/index.spec.tsx src/core/primitive/Divider/index.spec.tsx src/core/primitive/Region/index.spec.tsx src/core/primitive/NavLandmark/index.spec.tsx src/core/primitive/List/index.spec.tsx src/core/primitive/Heading/index.spec.tsx src/core/primitive/Icon/index.spec.tsx src/core/primitive/IconButton/index.spec.tsx src/core/primitive/IconTile/index.spec.tsx src/core/primitive/Input/index.spec.tsx src/core/primitive/Input/copyable.spec.tsx src/core/primitive/PressableField/index.spec.tsx src/core/primitive/Progress/index.spec.tsx src/core/primitive/Text/index.spec.tsx src/core/primitive/TextAction/index.spec.tsx src/core/primitive/Label/index.spec.tsx src/core/primitive/RankArtwork/index.spec.tsx src/core/composite/EmptyNotice/index.spec.tsx src/core/branch/Tabs/index.spec.tsx src/core/branch/Subnav/index.spec.tsx src/core/branch/Subnav/styles.spec.ts src/core/branch/Tooltip/index.spec.tsx src/core/composition/NavigationFeatureNav/index.spec.tsx src/core/composition/NavigationFeatureNav/styles.spec.ts src/core/composition/Sidebar/index.spec.tsx src/core/composition/Sidebar/styles.spec.ts src/core/composition/collapse.spec.tsx src/core/composition/WorkspaceShell/index.spec.tsx src/core/composition/ChatWorkspace/index.spec.tsx src/heritage/index.spec.tsx src/heritage/styles.spec.ts src/offset-pop/index.spec.tsx src/offset-pop/render.spec.tsx src/offset-pop/styles.spec.ts src/offset-pop/family.spec.tsx src/offset-pop/shipped-claims.spec.tsx src/offset-pop/surface-card-family.spec.tsx src/offset-pop/scrollable-surfaces.spec.tsx src/offset-pop/conformance.spec.ts src/core/branch/Accordion/index.spec.tsx src/core/branch/AlertDialog/index.spec.tsx src/core/branch/Calendar/index.spec.tsx src/core/branch/ComboBox/index.spec.tsx src/core/branch/DataTable/index.spec.tsx src/core/branch/DatePicker/index.spec.tsx src/core/branch/DateRangePicker/index.spec.tsx src/core/branch/Dialog/index.spec.tsx src/core/branch/Disclosure/index.spec.tsx src/core/branch/Drawer/index.spec.tsx src/core/branch/DropdownMenu/index.spec.tsx src/core/branch/ListBox/index.spec.tsx src/core/branch/Popover/index.spec.tsx src/core/branch/Select/index.spec.tsx src/core/branch/Toast/index.spec.tsx src/core/composite/Alert/index.spec.tsx src/core/composite/AvatarGroup/index.spec.tsx src/core/composite/Breadcrumbs/index.spec.tsx src/core/composite/ButtonGroup/index.spec.tsx src/core/composite/CheckboxGroup/index.spec.tsx src/core/composite/DescriptionList/index.spec.tsx src/core/composite/Fieldset/index.spec.tsx src/core/composite/Form/index.spec.tsx src/core/composite/Pagination/index.spec.tsx src/core/composite/RadioGroup/index.spec.tsx src/core/composite/SegmentedControl/index.spec.tsx src/core/composite/Stepper/index.spec.tsx src/core/composite/TagGroup/index.spec.tsx src/core/composite/Timeline/index.spec.tsx src/core/composition/BottomNav/index.spec.tsx src/core/composition/Footer/index.spec.tsx src/core/composition/TopBar/index.spec.tsx src/core/primitive/Avatar/index.spec.tsx src/core/primitive/Checkbox/index.spec.tsx src/core/primitive/CloseButton/index.spec.tsx src/core/primitive/DateField/index.spec.tsx src/core/primitive/Field/index.spec.tsx src/core/primitive/FileDropzone/index.spec.tsx src/core/primitive/Image/index.spec.tsx src/core/primitive/Kbd/index.spec.tsx src/core/primitive/Link/index.spec.tsx src/core/primitive/Meter/index.spec.tsx src/core/primitive/NumberField/index.spec.tsx src/core/primitive/ProgressCircle/index.spec.tsx src/core/primitive/Rating/index.spec.tsx src/core/primitive/SearchField/index.spec.tsx src/core/primitive/Skeleton/index.spec.tsx src/core/primitive/Slider/index.spec.tsx src/core/primitive/Spinner/index.spec.tsx src/core/primitive/Switch/index.spec.tsx src/core/primitive/Textarea/index.spec.tsx src/core/primitive/TimeField/index.spec.tsx src/offset-pop/components-forms.spec.ts src/offset-pop/components-navigation.spec.ts src/offset-pop/components-overlays.spec.ts src/core/branch/SurfaceCard/index.spec.tsx src/core/branch/SurfaceListCard/index.spec.tsx src/core/branch/SurfaceAccordionCard/index.spec.tsx src/core/branch/Rail/index.spec.tsx src/core/branch/MarkdownArticle/index.spec.tsx src/core/composite/VerticalScrollRegion/index.spec.tsx src/core/primitive/SectionHeader/index.spec.tsx src/core/primitive/PinnedActionBar/index.spec.tsx src/core/branch/SurfaceCard/ink.spec.ts src/core/data-component.spec.tsx src/core/OtpInput.spec.tsx src/core/field-variant.spec.tsx src/stories/catalog.spec.ts",
|
|
62
|
+
"test": "npm run build && node --test src/common/index.spec.mjs src/core/index.spec.mjs src/offset-pop/index.spec.mjs src/package-boundary.spec.mjs && vitest run --config vitest.config.ts src/shipped-geometry.spec.ts src/core/shipped-claims.spec.tsx src/common/conformance.spec.ts src/common/styles.spec.ts src/core/family.spec.tsx src/core/styles.spec.ts src/core/surface-card-family.spec.tsx src/core/scrollable-surfaces.spec.tsx src/core/primitive/Badge/index.spec.tsx src/core/primitive/Button/index.spec.tsx src/core/primitive/Divider/index.spec.tsx src/core/primitive/Region/index.spec.tsx src/core/primitive/NavLandmark/index.spec.tsx src/core/primitive/List/index.spec.tsx src/core/primitive/Heading/index.spec.tsx src/core/primitive/Icon/index.spec.tsx src/core/primitive/IconButton/index.spec.tsx src/core/primitive/IconTile/index.spec.tsx src/core/primitive/Input/index.spec.tsx src/core/primitive/Input/copyable.spec.tsx src/core/composite/ChatBubble/index.spec.tsx src/core/composite/FillViewport/index.spec.tsx src/core/primitive/IconButton/badge.spec.tsx src/core/primitive/Textarea/mentions.spec.tsx src/core/v090.spec.tsx src/core/primitive/PressableField/index.spec.tsx src/core/primitive/Progress/index.spec.tsx src/core/primitive/Text/index.spec.tsx src/core/primitive/TextAction/index.spec.tsx src/core/primitive/Label/index.spec.tsx src/core/primitive/RankArtwork/index.spec.tsx src/core/composite/EmptyNotice/index.spec.tsx src/core/branch/Tabs/index.spec.tsx src/core/branch/Subnav/index.spec.tsx src/core/branch/Subnav/styles.spec.ts src/core/branch/Tooltip/index.spec.tsx src/core/composition/NavigationFeatureNav/index.spec.tsx src/core/composition/NavigationFeatureNav/styles.spec.ts src/core/composition/Sidebar/index.spec.tsx src/core/composition/Sidebar/styles.spec.ts src/core/composition/collapse.spec.tsx src/core/composition/WorkspaceShell/index.spec.tsx src/core/composition/ChatWorkspace/index.spec.tsx src/heritage/index.spec.tsx src/heritage/styles.spec.ts src/offset-pop/index.spec.tsx src/offset-pop/render.spec.tsx src/offset-pop/styles.spec.ts src/offset-pop/family.spec.tsx src/offset-pop/shipped-claims.spec.tsx src/offset-pop/surface-card-family.spec.tsx src/offset-pop/scrollable-surfaces.spec.tsx src/offset-pop/conformance.spec.ts src/core/branch/Accordion/index.spec.tsx src/core/branch/AlertDialog/index.spec.tsx src/core/branch/Calendar/index.spec.tsx src/core/branch/ComboBox/index.spec.tsx src/core/branch/DataTable/index.spec.tsx src/core/branch/DatePicker/index.spec.tsx src/core/branch/DateRangePicker/index.spec.tsx src/core/branch/Dialog/index.spec.tsx src/core/branch/Disclosure/index.spec.tsx src/core/branch/Drawer/index.spec.tsx src/core/branch/DropdownMenu/index.spec.tsx src/core/branch/ListBox/index.spec.tsx src/core/branch/Popover/index.spec.tsx src/core/branch/Select/index.spec.tsx src/core/branch/Toast/index.spec.tsx src/core/composite/Alert/index.spec.tsx src/core/composite/AvatarGroup/index.spec.tsx src/core/composite/Breadcrumbs/index.spec.tsx src/core/composite/ButtonGroup/index.spec.tsx src/core/composite/CheckboxGroup/index.spec.tsx src/core/composite/DescriptionList/index.spec.tsx src/core/composite/Fieldset/index.spec.tsx src/core/composite/Form/index.spec.tsx src/core/composite/Pagination/index.spec.tsx src/core/composite/RadioGroup/index.spec.tsx src/core/composite/SegmentedControl/index.spec.tsx src/core/composite/Stepper/index.spec.tsx src/core/composite/TagGroup/index.spec.tsx src/core/composite/Timeline/index.spec.tsx src/core/composition/BottomNav/index.spec.tsx src/core/composition/Footer/index.spec.tsx src/core/composition/TopBar/index.spec.tsx src/core/primitive/Avatar/index.spec.tsx src/core/primitive/Checkbox/index.spec.tsx src/core/primitive/CloseButton/index.spec.tsx src/core/primitive/DateField/index.spec.tsx src/core/primitive/Field/index.spec.tsx src/core/primitive/FileDropzone/index.spec.tsx src/core/primitive/Image/index.spec.tsx src/core/primitive/Kbd/index.spec.tsx src/core/primitive/Link/index.spec.tsx src/core/primitive/Meter/index.spec.tsx src/core/primitive/NumberField/index.spec.tsx src/core/primitive/ProgressCircle/index.spec.tsx src/core/primitive/Rating/index.spec.tsx src/core/primitive/SearchField/index.spec.tsx src/core/primitive/Skeleton/index.spec.tsx src/core/primitive/Slider/index.spec.tsx src/core/primitive/Spinner/index.spec.tsx src/core/primitive/Switch/index.spec.tsx src/core/primitive/Textarea/index.spec.tsx src/core/primitive/TimeField/index.spec.tsx src/offset-pop/components-forms.spec.ts src/offset-pop/components-navigation.spec.ts src/offset-pop/components-overlays.spec.ts src/core/branch/SurfaceCard/index.spec.tsx src/core/branch/SurfaceListCard/index.spec.tsx src/core/branch/SurfaceAccordionCard/index.spec.tsx src/core/branch/Rail/index.spec.tsx src/core/branch/MarkdownArticle/index.spec.tsx src/core/composite/VerticalScrollRegion/index.spec.tsx src/core/primitive/SectionHeader/index.spec.tsx src/core/primitive/PinnedActionBar/index.spec.tsx src/core/branch/SurfaceCard/ink.spec.ts src/core/data-component.spec.tsx src/core/OtpInput.spec.tsx src/core/field-variant.spec.tsx src/stories/catalog.spec.ts",
|
|
63
63
|
"test:a11y": "vitest run --config vitest.a11y.config.ts",
|
|
64
64
|
"pack:check": "npm run build && node --test src/package-boundary.spec.mjs",
|
|
65
65
|
"prepack": "npm run typecheck && npm test",
|