@teamblind-chorus/ui 1.2.0 → 2.0.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/README.md +3 -3
- package/agents/AGENTS.md +6 -6
- package/agents/DESIGN.md +245 -244
- package/agents/LOVABLE.md +40 -11
- package/agents/catalog.md +4 -4
- package/agents/components/avatar-rail/avatar-rail.md +2 -4
- package/agents/components/avatar-rail/avatar-rail.spec.json +10 -14
- package/agents/components/badge/role.md +7 -9
- package/agents/components/badge/role.spec.json +6 -6
- package/agents/components/badge/update.md +6 -8
- package/agents/components/badge/update.spec.json +5 -5
- package/agents/components/banner/banner.md +16 -18
- package/agents/components/banner/banner.spec.json +14 -14
- package/agents/components/bottom-sheet/bottom-sheet.md +4 -6
- package/agents/components/bottom-sheet/bottom-sheet.spec.json +5 -5
- package/agents/components/bubble/bubble.md +8 -10
- package/agents/components/bubble/bubble.spec.json +11 -11
- package/agents/components/button/button.md +1 -1
- package/agents/components/button/check.md +9 -11
- package/agents/components/button/check.spec.json +8 -10
- package/agents/components/button/fab.md +7 -9
- package/agents/components/button/fab.spec.json +10 -12
- package/agents/components/button/group.spec.json +4 -4
- package/agents/components/button/icon.md +21 -23
- package/agents/components/button/icon.spec.json +12 -14
- package/agents/components/button/standard.md +40 -42
- package/agents/components/button/standard.spec.json +20 -22
- package/agents/components/button/text.md +21 -23
- package/agents/components/button/text.spec.json +13 -15
- package/agents/components/button/toggle.md +7 -9
- package/agents/components/button/toggle.spec.json +10 -12
- package/agents/components/button/toolbar.md +24 -26
- package/agents/components/button/toolbar.spec.json +10 -12
- package/agents/components/carousel/carousel.md +1 -1
- package/agents/components/carousel/post.md +15 -21
- package/agents/components/carousel/post.spec.json +17 -17
- package/agents/components/carousel/profile.md +9 -45
- package/agents/components/carousel/profile.spec.json +17 -17
- package/agents/components/chip/chip.md +1 -1
- package/agents/components/chip/filter.md +22 -24
- package/agents/components/chip/filter.spec.json +17 -13
- package/agents/components/chip/tag.md +22 -24
- package/agents/components/chip/tag.spec.json +19 -15
- package/agents/components/dialog/dialog.md +1 -3
- package/agents/components/dialog/dialog.spec.json +3 -3
- package/agents/components/directory-list/directory-list.md +1 -3
- package/agents/components/directory-list/directory-list.spec.json +2 -2
- package/agents/components/divider/divider.family.json +1 -1
- package/agents/components/divider/divider.md +12 -14
- package/agents/components/divider/divider.spec.json +8 -8
- package/agents/components/empty-state/empty-state.md +9 -9
- package/agents/components/empty-state/empty-state.spec.json +14 -14
- package/agents/components/feed/ad.md +2 -4
- package/agents/components/feed/ad.spec.json +10 -10
- package/agents/components/feed/post.md +41 -43
- package/agents/components/feed/post.spec.json +35 -39
- package/agents/components/form-field/form-field.md +1 -1
- package/agents/components/form-field/input.md +32 -34
- package/agents/components/form-field/input.spec.json +34 -33
- package/agents/components/form-field/search.md +2 -4
- package/agents/components/form-field/search.spec.json +19 -18
- package/agents/components/form-field/select.md +18 -20
- package/agents/components/form-field/select.spec.json +30 -29
- package/agents/components/form-field/textarea.md +3 -5
- package/agents/components/form-field/textarea.spec.json +32 -31
- package/agents/components/header/main.md +4 -6
- package/agents/components/header/main.spec.json +3 -3
- package/agents/components/header/sub.md +6 -8
- package/agents/components/header/sub.spec.json +3 -3
- package/agents/components/list/accordion.md +34 -45
- package/agents/components/list/accordion.spec.json +20 -20
- package/agents/components/list/entry.md +59 -81
- package/agents/components/list/entry.spec.json +20 -23
- package/agents/components/list/list.md +2 -2
- package/agents/components/list/radio.md +13 -20
- package/agents/components/list/radio.spec.json +16 -20
- package/agents/components/list/standard.md +50 -72
- package/agents/components/list/standard.spec.json +18 -21
- package/agents/components/metadata/compact.md +4 -6
- package/agents/components/metadata/compact.spec.json +6 -6
- package/agents/components/metadata/metadata.md +1 -1
- package/agents/components/metadata/standard.md +12 -14
- package/agents/components/metadata/standard.spec.json +10 -10
- package/agents/components/nav-card/nav-card.md +25 -27
- package/agents/components/nav-card/nav-card.spec.json +19 -19
- package/agents/components/nav-list/nav-list.md +2 -8
- package/agents/components/nav-list/nav-list.spec.json +3 -3
- package/agents/components/navigation-bar/main.md +9 -11
- package/agents/components/navigation-bar/main.spec.json +6 -6
- package/agents/components/navigation-bar/search.md +6 -8
- package/agents/components/navigation-bar/search.spec.json +9 -9
- package/agents/components/navigation-bar/sub.md +9 -11
- package/agents/components/navigation-bar/sub.spec.json +7 -7
- package/agents/components/pagination/pagination.family.json +1 -1
- package/agents/components/pagination/pagination.md +3 -3
- package/agents/components/pagination/pagination.spec.json +5 -5
- package/agents/components/profile-header/profile-header.md +9 -11
- package/agents/components/profile-header/profile-header.spec.json +9 -9
- package/agents/components/progress/progress.family.json +1 -1
- package/agents/components/progress/progress.md +5 -5
- package/agents/components/progress/progress.spec.json +8 -8
- package/agents/components/side-sheet/side-sheet.md +11 -13
- package/agents/components/side-sheet/side-sheet.spec.json +3 -3
- package/agents/components/skeleton/skeleton.md +7 -9
- package/agents/components/skeleton/skeleton.spec.json +5 -5
- package/agents/components/spinner/spinner.family.json +1 -1
- package/agents/components/spinner/spinner.md +8 -10
- package/agents/components/spinner/spinner.spec.json +9 -9
- package/agents/components/status-tag/status-tag.md +7 -9
- package/agents/components/status-tag/status-tag.spec.json +5 -5
- package/agents/components/suggestion-list/suggestion-list.md +3 -7
- package/agents/components/suggestion-list/suggestion-list.spec.json +8 -12
- package/agents/components/switch/switch.md +12 -14
- package/agents/components/switch/switch.spec.json +17 -18
- package/agents/components/tab-bar/tab-bar.md +9 -11
- package/agents/components/tab-bar/tab-bar.spec.json +25 -27
- package/agents/components/tabs/rounded.md +6 -8
- package/agents/components/tabs/rounded.spec.json +17 -15
- package/agents/components/tabs/segmented.md +4 -6
- package/agents/components/tabs/segmented.spec.json +4 -8
- package/agents/components/tabs/underline.md +9 -11
- package/agents/components/tabs/underline.spec.json +14 -16
- package/agents/components/thumbnail/thumbnail.md +5 -7
- package/agents/components/thumbnail/thumbnail.spec.json +8 -8
- package/agents/components/toast/toast.md +5 -7
- package/agents/components/toast/toast.spec.json +3 -3
- package/agents/components/tooltip/tooltip.md +6 -8
- package/agents/components/tooltip/tooltip.spec.json +4 -4
- package/agents/tokens.usage.json +71 -226
- package/dist/index.cjs +212 -223
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +16 -16
- package/dist/index.d.ts +16 -16
- package/dist/index.js +212 -223
- package/dist/index.js.map +1 -1
- package/dist/styles.css +386 -387
- package/eslint/rules.js +7 -7
- package/package.json +2 -3
- package/agents/anti-patterns.md +0 -533
- package/agents/compose.md +0 -240
- package/agents/images.md +0 -66
package/dist/index.d.cts
CHANGED
|
@@ -32,9 +32,9 @@ export type BadgeProps =
|
|
|
32
32
|
// ── Banner (banner/banner) ──
|
|
33
33
|
interface BannerPropsOwn {
|
|
34
34
|
appearance?: "default" | "accent" | "destructive";
|
|
35
|
-
/** Paints a `sys.borderWidth.hairline` (1) inset stroke around the container, toned to the appearance's color family and kept deliberately faint so it reads as a soft edge of the same tint, not a frame — the subtle gray hairline (`sys.color.
|
|
35
|
+
/** Paints a `sys.borderWidth.hairline` (1) inset stroke around the container, toned to the appearance's color family and kept deliberately faint so it reads as a soft edge of the same tint, not a frame — the subtle gray hairline (`sys.color.border.default`) on `default`'s gray-tinted fill, `primary` at 40% (`color-mix(sys.color.background.primary, 40%)`) on `accent`'s blue-tinted fill, `error` at 40% on `destructive`. Rendered as an inset box-shadow, never a real border, so toggling it cannot change the banner's footprint (see DESIGN.md → Border & Stroke). Reach for it when the tinted fill alone doesn't separate the banner from its host surface. */
|
|
36
36
|
outlined?: boolean;
|
|
37
|
-
/** On `accent`, paints the title + body in the neutral default foreground (`sys.color.
|
|
37
|
+
/** On `accent`, paints the title + body in the neutral default foreground (`sys.color.text.default`) and steps the action to `sys.color.background.primary` — i.e. the **Default appearance's** foreground treatment laid over the accent fill, decoupling the background tone from the text tone. Reach for it when the `primaryContainer` tint should still pull the eye but the copy should read as quiet, high-legibility body text rather than tonal `onPrimaryContainer` primary-family text (long-form explainers, dense asides). No effect on `default` (already `onSurface`) or `destructive` (the warning tone must carry through the copy). */
|
|
38
38
|
neutralBody?: boolean;
|
|
39
39
|
/** Optional heading line above the body. label.md (14 / Semibold 600) in the container's foreground, separated from the body by `sys.layout.stack.2xs` (4). Reach for it when the aside needs a scannable lead-in; omit for single-thought asides where the body carries itself. */
|
|
40
40
|
title?: React.ReactNode;
|
|
@@ -269,11 +269,11 @@ export interface DirectoryListProps extends Omit<React.HTMLAttributes<HTMLElemen
|
|
|
269
269
|
|
|
270
270
|
// ── EmptyState (empty-state/empty-state) ──
|
|
271
271
|
interface EmptyStatePropsOwn {
|
|
272
|
-
/** Optional leading glyph or illustration, centered above the headline. Sized to a `ref.space.600` (48) box — larger than `sys.icon.lg` (24), realizing DESIGN.md's `icon.xl` or larger intent (no `icon.xl` icon-size rung exists; the icon scale stops at `lg`). Painted in `sys.color.
|
|
272
|
+
/** Optional leading glyph or illustration, centered above the headline. Sized to a `ref.space.600` (48) box — larger than `sys.icon.lg` (24), realizing DESIGN.md's `icon.xl` or larger intent (no `icon.xl` icon-size rung exists; the icon scale stops at `lg`). Painted in `sys.color.text.subtle` via `currentColor` so it reads as quiet, monochrome chrome — illustrations stay monochrome unless they carry deliberate brand-moment intent. Separated from the headline by `sys.layout.stack.sm` (12). */
|
|
273
273
|
illustration?: React.ReactNode;
|
|
274
|
-
/** The required lead line. `sys.typo.heading.sm` in `sys.color.
|
|
274
|
+
/** The required lead line. `sys.typo.heading.sm` in `sys.color.text.default`. Names what the surface is for / why it is empty in one short line (e.g. 'No posts yet'). */
|
|
275
275
|
headline: React.ReactNode;
|
|
276
|
-
/** Optional supporting line below the headline. `sys.typo.body.sm` in `sys.color.
|
|
276
|
+
/** Optional supporting line below the headline. `sys.typo.body.sm` in `sys.color.text.subtle`, separated from the headline by `sys.layout.stack.2xs` (4). One sentence — the second of the three lines (e.g. 'Conversations you start or join will appear here'). */
|
|
277
277
|
body?: React.ReactNode;
|
|
278
278
|
/** { label, href?, onClick? } — the primary CTA. Renders a default-size primary `Button` (the surface's primary action — the one thing that fills the empty surface). Placed below the body with a `sys.layout.stack.md` (16) gap. There is NO `cta` slot to fill with a custom button; pass the action object so the primary Button is composed for you. */
|
|
279
279
|
action?: Record<string, unknown>;
|
|
@@ -304,7 +304,7 @@ interface FeedPropsOwn {
|
|
|
304
304
|
thumbnail?: Record<string, unknown>;
|
|
305
305
|
/** { label, participants } — inline poll banner. `label` is constrained to the literal `"Poll"` (the banner is editorial — see `tagBanner.labelEnum`); `participants` is the participant count shown after the divider. */
|
|
306
306
|
poll?: Record<string, unknown>;
|
|
307
|
-
/** { label, participants } — inline offer-evaluation banner. Same chrome as `poll` (surfaceVariant slab, leading glyph + label + divider + participant count), but the leading icon is `CompensationFillIcon` and the glyph + label paint in `sys.color.success` (resolves to `ref.palette.green.500`). Surfaces a 'compensation / offer evaluation' post — the author publishes their current salary or a competing offer and asks the community for better-option signals. `label` is constrained to the literal `"Offer"` (see `tagBanner.labelEnum`); `participants` is the participant count shown after the divider. */
|
|
307
|
+
/** { label, participants } — inline offer-evaluation banner. Same chrome as `poll` (surfaceVariant slab, leading glyph + label + divider + participant count), but the leading icon is `CompensationFillIcon` and the glyph + label paint in `sys.color.text.success` (resolves to `ref.palette.green.500`). Surfaces a 'compensation / offer evaluation' post — the author publishes their current salary or a competing offer and asks the community for better-option signals. `label` is constrained to the literal `"Offer"` (see `tagBanner.labelEnum`); `participants` is the participant count shown after the divider. */
|
|
308
308
|
offer?: Record<string, unknown>;
|
|
309
309
|
/** { title, source, src? } — inline link-share card. */
|
|
310
310
|
citation?: Record<string, unknown>;
|
|
@@ -345,7 +345,7 @@ interface FormFieldInputPropsOwn {
|
|
|
345
345
|
placeholder?: string;
|
|
346
346
|
/** Visible label rendered above the field box and associated with it (`<label htmlFor>`). */
|
|
347
347
|
label?: React.ReactNode;
|
|
348
|
-
/** Assistive text rendered below the field box, left-aligned. **Optional on every appearance** — omit the prop to render the field without an assistive rung; the box and label keep their footprint. On the `error` appearance the helper re-tones to `sys.color.
|
|
348
|
+
/** Assistive text rendered below the field box, left-aligned. **Optional on every appearance** — omit the prop to render the field without an assistive rung; the box and label keep their footprint. On the `error` appearance the helper re-tones to `sys.color.text.danger` so the message reads as the error caption; an error field may still be shown without a helper, in which case only the field box re-tones. Mutually exclusive with `maxLength` — if both are given, the character count is shown and `helper` is ignored. */
|
|
349
349
|
helper?: React.ReactNode;
|
|
350
350
|
/** Caps the input length and renders a `current/max` character count below the field box, right-aligned. Mutually exclusive with `helper`. */
|
|
351
351
|
maxLength?: number;
|
|
@@ -361,7 +361,7 @@ interface FormFieldTextareaPropsOwn {
|
|
|
361
361
|
placeholder?: string;
|
|
362
362
|
/** Visible label rendered above the field box and associated with it (`<label htmlFor>`). */
|
|
363
363
|
label?: React.ReactNode;
|
|
364
|
-
/** Assistive text rendered below the field box, left-aligned. Same rules as [input.helper](./input.md): mutually exclusive with `maxLength`, optional on every appearance, re-tones to `sys.color.
|
|
364
|
+
/** Assistive text rendered below the field box, left-aligned. Same rules as [input.helper](./input.md): mutually exclusive with `maxLength`, optional on every appearance, re-tones to `sys.color.text.danger` on the error appearance. */
|
|
365
365
|
helper?: React.ReactNode;
|
|
366
366
|
/** Caps the value length and renders a `current/max` character count below the box, right-aligned. Mutually exclusive with `helper`. */
|
|
367
367
|
maxLength?: number;
|
|
@@ -390,7 +390,7 @@ interface FormFieldSelectPropsOwn {
|
|
|
390
390
|
placeholder?: string;
|
|
391
391
|
label?: React.ReactNode;
|
|
392
392
|
helper?: React.ReactNode;
|
|
393
|
-
/** Optional 16px (`sys.icon.md`) decorative glyph pinned at the inner-left edge of the field. Tracks the field's active text colour (`sys.color.
|
|
393
|
+
/** Optional 16px (`sys.icon.md`) decorative glyph pinned at the inner-left edge of the field. Tracks the field's active text colour (`sys.color.text.default` on the default appearance, `sys.color.text.danger` on `error`) so the glyph reads as part of the typed content. */
|
|
394
394
|
leadingIcon?: React.ReactNode;
|
|
395
395
|
/** Fired when the field box or the trailing chevron is clicked. Consumers use this to raise a `BottomSheet` with the option list. */
|
|
396
396
|
onOpen?: (...args: any[]) => any;
|
|
@@ -503,7 +503,7 @@ interface MetadataStandardPropsOwn {
|
|
|
503
503
|
name: string;
|
|
504
504
|
/** Destination URL for the entity name. When present, the name renders as an `<a>`; otherwise as a `<span>`. */
|
|
505
505
|
nameHref?: string;
|
|
506
|
-
/** Inline timestamp painted after the name on the primary line, in `label.sm` / `sys.color.
|
|
506
|
+
/** Inline timestamp painted after the name on the primary line, in `label.sm` / `sys.color.border.boldest` — one tonal step further than the name. Reach for it on Feed Post; omit on Feed Ad. */
|
|
507
507
|
timestamp?: string;
|
|
508
508
|
/** Whether to paint the inline follow toggle after the timestamp. When `true`, a dot separator + Follow/Following text toggle render at the primary line's trailing edge. State is controlled via `followed` + `onFollowChange`. */
|
|
509
509
|
followAction?: boolean;
|
|
@@ -526,7 +526,7 @@ interface MetadataCompactPropsOwn {
|
|
|
526
526
|
avatar?: Record<string, unknown>;
|
|
527
527
|
/** Array of independently-linked identity items — canonical fill is `[company name, nickname]`, the nickname canonically last, displayed bare (no @ prefix). Each entry is either a string (renders as a stub-href link) or a `{ label, href, badge }` object — `badge` is an optional SINGLE presentational mark node rendered AFTER the item's link, outside the <a> (canonical fill: Badge variant="role" on the trailing nickname item). Items separate by middot. Same grammar as the standard sub's `meta`; here it is the whole cluster, so it is required. */
|
|
528
528
|
meta: React.ReactNode;
|
|
529
|
-
/** Posting time at the line's trailing edge — plain text (never a link), in `label.sm` / `sys.color.
|
|
529
|
+
/** Posting time at the line's trailing edge — plain text (never a link), in `label.sm` / `sys.color.border.boldest` so it recedes behind the identity links. NOT preceded by a middot: the time is separated from the identity cluster by an `inline.md` (8) gap so it reads as a distinct trailing element rather than another identity item (mirrors the Standard head's name↔time treatment). Required: the timestamp is what distinguishes a compact attribution from a bare identity row. */
|
|
530
530
|
timestamp: string;
|
|
531
531
|
}
|
|
532
532
|
export interface MetadataCompactProps extends Omit<React.HTMLAttributes<HTMLDivElement>, keyof MetadataCompactPropsOwn>, MetadataCompactPropsOwn {}
|
|
@@ -547,7 +547,7 @@ interface NavCardPropsOwn {
|
|
|
547
547
|
leading?: React.ReactNode;
|
|
548
548
|
/** Overrides the variant's trailing affordance. Pass a custom 16px glyph when the action isn't a navigation drill-in (inline expand-down arrow, external-link arrow). On `variant="default"` no trailing renders unless `trailingIcon` is supplied; on `variant="nav"` the auto-chevron is replaced. */
|
|
549
549
|
trailingIcon?: React.ReactNode;
|
|
550
|
-
/** Container fill. `default` is transparent — the card's identity is the outlined chrome (hairline + radius + label + chevron) and the host surface tone reads through. `surface` paints `sys.color.surface` so the card reads as its own opaque tier; reach for it when the card sits on a transparent / non-`surface` host (between bare-surface sections, on a tonal band the card needs to break out of). */
|
|
550
|
+
/** Container fill. `default` is transparent — the card's identity is the outlined chrome (hairline + radius + label + chevron) and the host surface tone reads through. `surface` paints `sys.color.surface.default` so the card reads as its own opaque tier; reach for it when the card sits on a transparent / non-`surface` host (between bare-surface sections, on a tonal band the card needs to break out of). */
|
|
551
551
|
appearance?: "default" | "surface";
|
|
552
552
|
/** When provided, renders as `<a href>` instead of `<button>`. Mutually exclusive with `onClick` as the primary commit, though either may be combined for analytics. */
|
|
553
553
|
href?: string;
|
|
@@ -589,7 +589,7 @@ export interface NavigationBarMainProps extends Omit<React.HTMLAttributes<HTMLEl
|
|
|
589
589
|
|
|
590
590
|
interface NavigationBarSubPropsOwn {
|
|
591
591
|
variant: "sub";
|
|
592
|
-
/** Container fill and foreground tone. `surface` (default) — opaque `sys.color.surface` fill, `onSurface` icons and title; the canonical page-chrome treatment. `overlay` — transparent container with **fixed white** icons (`ref.palette.white.1000`), used when the bar floats over a hero/cover image (e.g. inside [Profile header](../profile-header/profile-header.md)). In `overlay`, the title slot is intentionally muted — pass `title=""` (empty string) when the host already carries page identity below the bar. */
|
|
592
|
+
/** Container fill and foreground tone. `surface` (default) — opaque `sys.color.surface.default` fill, `onSurface` icons and title; the canonical page-chrome treatment. `overlay` — transparent container with **fixed white** icons (`ref.palette.white.1000`), used when the bar floats over a hero/cover image (e.g. inside [Profile header](../profile-header/profile-header.md)). In `overlay`, the title slot is intentionally muted — pass `title=""` (empty string) when the host already carries page identity below the bar. */
|
|
593
593
|
appearance?: "surface" | "overlay";
|
|
594
594
|
/** Page name. Optional — omit it for bars whose side actions say everything (canonical: the composer text-button pair, Cancel / Post). A title-less bar renders a non-heading placeholder in the centre cell so the side slots stay in their 1fr/auto/1fr columns. Pass an empty string in `overlay` appearance when the host (e.g. ProfileHeader) carries the identity directly below the bar. */
|
|
595
595
|
title?: string;
|
|
@@ -663,7 +663,7 @@ interface ProfileHeaderPropsOwn {
|
|
|
663
663
|
visibility?: "public" | "private";
|
|
664
664
|
/** Override the visibility label text — used for localisation (e.g. '공개' / '비공개'). When omitted, defaults to 'Public' / 'Private' based on `visibility`. */
|
|
665
665
|
visibilityLabel?: string;
|
|
666
|
-
/** Follower count line — formatted by the consumer so the unit / locale stays in their hands (e.g. '999 followers', '12.4K followers', '999 팔로워'). Paints in `sys.typo.body.sm` / `sys.color.
|
|
666
|
+
/** Follower count line — formatted by the consumer so the unit / locale stays in their hands (e.g. '999 followers', '12.4K followers', '999 팔로워'). Paints in `sys.typo.body.sm` / `sys.color.text.subtle` to the right of a bullet separator on the meta row. */
|
|
667
667
|
followers: string;
|
|
668
668
|
/** Whether the viewer is following this entity. Drives the trailing [Toggle Button](../button/toggle.md): false → 'Follow' (primary fill); true → 'Following' (transparent fill + hairline outline so the committed state recedes against any host surface tier). */
|
|
669
669
|
followed?: boolean;
|
|
@@ -749,7 +749,7 @@ export interface SkeletonProps extends Omit<React.HTMLAttributes<HTMLSpanElement
|
|
|
749
749
|
interface SpinnerPropsOwn {
|
|
750
750
|
/** Selects the arc diameter off the `icon.*` ladder. `medium` paints at `sys.icon.lg` (24px); `small` at `sys.icon.md` (16px). */
|
|
751
751
|
size?: "medium" | "small";
|
|
752
|
-
/** Optional loading copy rendered beside the arc in `sys.typo.body.sm` / `sys.color.
|
|
752
|
+
/** Optional loading copy rendered beside the arc in `sys.typo.body.sm` / `sys.color.text.subtle`. When present it also supplies the accessible name, so `aria-label` is not required. */
|
|
753
753
|
label?: React.ReactNode;
|
|
754
754
|
/** Accessible label announced by screen readers. Defaults to `'Loading'`. Supply a more specific name (e.g. `'Signing in'`) when the wait scope is meaningful. Redundant when a visible `label` is passed. */
|
|
755
755
|
"aria-label"?: string;
|
|
@@ -850,7 +850,7 @@ interface ThumbnailPropsOwn {
|
|
|
850
850
|
updateDot?: boolean;
|
|
851
851
|
/** { src, alt } — 16×16 circular badge at the bottom-right. */
|
|
852
852
|
logoBadge?: Record<string, unknown>;
|
|
853
|
-
/** When `true`, paints a 2-token-wide `sys.color.surface` outline around the Thumbnail container as an outset halo. The outline reads as an isolation ring that separates the Thumbnail's circular edge from anything visually noisy underneath it. Painted as `box-shadow: 0 0 0 sys.borderWidth.thin sys.color.surface` so it never reflows the slot's intrinsic diameter — same no-layout-stroke idiom the rest of the system uses. Pair with hosts whose chrome reads as a `surface*` tier (so the halo blends in) and whose backdrop differs from that tier (so the halo actually separates). */
|
|
853
|
+
/** When `true`, paints a 2-token-wide `sys.color.surface.default` outline around the Thumbnail container as an outset halo. The outline reads as an isolation ring that separates the Thumbnail's circular edge from anything visually noisy underneath it. Painted as `box-shadow: 0 0 0 sys.borderWidth.thin sys.color.surface.default` so it never reflows the slot's intrinsic diameter — same no-layout-stroke idiom the rest of the system uses. Pair with hosts whose chrome reads as a `surface*` tier (so the halo blends in) and whose backdrop differs from that tier (so the halo actually separates). */
|
|
854
854
|
outlined?: boolean;
|
|
855
855
|
}
|
|
856
856
|
export interface ThumbnailProps extends Omit<React.HTMLAttributes<HTMLDivElement>, keyof ThumbnailPropsOwn>, ThumbnailPropsOwn {}
|
package/dist/index.d.ts
CHANGED
|
@@ -32,9 +32,9 @@ export type BadgeProps =
|
|
|
32
32
|
// ── Banner (banner/banner) ──
|
|
33
33
|
interface BannerPropsOwn {
|
|
34
34
|
appearance?: "default" | "accent" | "destructive";
|
|
35
|
-
/** Paints a `sys.borderWidth.hairline` (1) inset stroke around the container, toned to the appearance's color family and kept deliberately faint so it reads as a soft edge of the same tint, not a frame — the subtle gray hairline (`sys.color.
|
|
35
|
+
/** Paints a `sys.borderWidth.hairline` (1) inset stroke around the container, toned to the appearance's color family and kept deliberately faint so it reads as a soft edge of the same tint, not a frame — the subtle gray hairline (`sys.color.border.default`) on `default`'s gray-tinted fill, `primary` at 40% (`color-mix(sys.color.background.primary, 40%)`) on `accent`'s blue-tinted fill, `error` at 40% on `destructive`. Rendered as an inset box-shadow, never a real border, so toggling it cannot change the banner's footprint (see DESIGN.md → Border & Stroke). Reach for it when the tinted fill alone doesn't separate the banner from its host surface. */
|
|
36
36
|
outlined?: boolean;
|
|
37
|
-
/** On `accent`, paints the title + body in the neutral default foreground (`sys.color.
|
|
37
|
+
/** On `accent`, paints the title + body in the neutral default foreground (`sys.color.text.default`) and steps the action to `sys.color.background.primary` — i.e. the **Default appearance's** foreground treatment laid over the accent fill, decoupling the background tone from the text tone. Reach for it when the `primaryContainer` tint should still pull the eye but the copy should read as quiet, high-legibility body text rather than tonal `onPrimaryContainer` primary-family text (long-form explainers, dense asides). No effect on `default` (already `onSurface`) or `destructive` (the warning tone must carry through the copy). */
|
|
38
38
|
neutralBody?: boolean;
|
|
39
39
|
/** Optional heading line above the body. label.md (14 / Semibold 600) in the container's foreground, separated from the body by `sys.layout.stack.2xs` (4). Reach for it when the aside needs a scannable lead-in; omit for single-thought asides where the body carries itself. */
|
|
40
40
|
title?: React.ReactNode;
|
|
@@ -269,11 +269,11 @@ export interface DirectoryListProps extends Omit<React.HTMLAttributes<HTMLElemen
|
|
|
269
269
|
|
|
270
270
|
// ── EmptyState (empty-state/empty-state) ──
|
|
271
271
|
interface EmptyStatePropsOwn {
|
|
272
|
-
/** Optional leading glyph or illustration, centered above the headline. Sized to a `ref.space.600` (48) box — larger than `sys.icon.lg` (24), realizing DESIGN.md's `icon.xl` or larger intent (no `icon.xl` icon-size rung exists; the icon scale stops at `lg`). Painted in `sys.color.
|
|
272
|
+
/** Optional leading glyph or illustration, centered above the headline. Sized to a `ref.space.600` (48) box — larger than `sys.icon.lg` (24), realizing DESIGN.md's `icon.xl` or larger intent (no `icon.xl` icon-size rung exists; the icon scale stops at `lg`). Painted in `sys.color.text.subtle` via `currentColor` so it reads as quiet, monochrome chrome — illustrations stay monochrome unless they carry deliberate brand-moment intent. Separated from the headline by `sys.layout.stack.sm` (12). */
|
|
273
273
|
illustration?: React.ReactNode;
|
|
274
|
-
/** The required lead line. `sys.typo.heading.sm` in `sys.color.
|
|
274
|
+
/** The required lead line. `sys.typo.heading.sm` in `sys.color.text.default`. Names what the surface is for / why it is empty in one short line (e.g. 'No posts yet'). */
|
|
275
275
|
headline: React.ReactNode;
|
|
276
|
-
/** Optional supporting line below the headline. `sys.typo.body.sm` in `sys.color.
|
|
276
|
+
/** Optional supporting line below the headline. `sys.typo.body.sm` in `sys.color.text.subtle`, separated from the headline by `sys.layout.stack.2xs` (4). One sentence — the second of the three lines (e.g. 'Conversations you start or join will appear here'). */
|
|
277
277
|
body?: React.ReactNode;
|
|
278
278
|
/** { label, href?, onClick? } — the primary CTA. Renders a default-size primary `Button` (the surface's primary action — the one thing that fills the empty surface). Placed below the body with a `sys.layout.stack.md` (16) gap. There is NO `cta` slot to fill with a custom button; pass the action object so the primary Button is composed for you. */
|
|
279
279
|
action?: Record<string, unknown>;
|
|
@@ -304,7 +304,7 @@ interface FeedPropsOwn {
|
|
|
304
304
|
thumbnail?: Record<string, unknown>;
|
|
305
305
|
/** { label, participants } — inline poll banner. `label` is constrained to the literal `"Poll"` (the banner is editorial — see `tagBanner.labelEnum`); `participants` is the participant count shown after the divider. */
|
|
306
306
|
poll?: Record<string, unknown>;
|
|
307
|
-
/** { label, participants } — inline offer-evaluation banner. Same chrome as `poll` (surfaceVariant slab, leading glyph + label + divider + participant count), but the leading icon is `CompensationFillIcon` and the glyph + label paint in `sys.color.success` (resolves to `ref.palette.green.500`). Surfaces a 'compensation / offer evaluation' post — the author publishes their current salary or a competing offer and asks the community for better-option signals. `label` is constrained to the literal `"Offer"` (see `tagBanner.labelEnum`); `participants` is the participant count shown after the divider. */
|
|
307
|
+
/** { label, participants } — inline offer-evaluation banner. Same chrome as `poll` (surfaceVariant slab, leading glyph + label + divider + participant count), but the leading icon is `CompensationFillIcon` and the glyph + label paint in `sys.color.text.success` (resolves to `ref.palette.green.500`). Surfaces a 'compensation / offer evaluation' post — the author publishes their current salary or a competing offer and asks the community for better-option signals. `label` is constrained to the literal `"Offer"` (see `tagBanner.labelEnum`); `participants` is the participant count shown after the divider. */
|
|
308
308
|
offer?: Record<string, unknown>;
|
|
309
309
|
/** { title, source, src? } — inline link-share card. */
|
|
310
310
|
citation?: Record<string, unknown>;
|
|
@@ -345,7 +345,7 @@ interface FormFieldInputPropsOwn {
|
|
|
345
345
|
placeholder?: string;
|
|
346
346
|
/** Visible label rendered above the field box and associated with it (`<label htmlFor>`). */
|
|
347
347
|
label?: React.ReactNode;
|
|
348
|
-
/** Assistive text rendered below the field box, left-aligned. **Optional on every appearance** — omit the prop to render the field without an assistive rung; the box and label keep their footprint. On the `error` appearance the helper re-tones to `sys.color.
|
|
348
|
+
/** Assistive text rendered below the field box, left-aligned. **Optional on every appearance** — omit the prop to render the field without an assistive rung; the box and label keep their footprint. On the `error` appearance the helper re-tones to `sys.color.text.danger` so the message reads as the error caption; an error field may still be shown without a helper, in which case only the field box re-tones. Mutually exclusive with `maxLength` — if both are given, the character count is shown and `helper` is ignored. */
|
|
349
349
|
helper?: React.ReactNode;
|
|
350
350
|
/** Caps the input length and renders a `current/max` character count below the field box, right-aligned. Mutually exclusive with `helper`. */
|
|
351
351
|
maxLength?: number;
|
|
@@ -361,7 +361,7 @@ interface FormFieldTextareaPropsOwn {
|
|
|
361
361
|
placeholder?: string;
|
|
362
362
|
/** Visible label rendered above the field box and associated with it (`<label htmlFor>`). */
|
|
363
363
|
label?: React.ReactNode;
|
|
364
|
-
/** Assistive text rendered below the field box, left-aligned. Same rules as [input.helper](./input.md): mutually exclusive with `maxLength`, optional on every appearance, re-tones to `sys.color.
|
|
364
|
+
/** Assistive text rendered below the field box, left-aligned. Same rules as [input.helper](./input.md): mutually exclusive with `maxLength`, optional on every appearance, re-tones to `sys.color.text.danger` on the error appearance. */
|
|
365
365
|
helper?: React.ReactNode;
|
|
366
366
|
/** Caps the value length and renders a `current/max` character count below the box, right-aligned. Mutually exclusive with `helper`. */
|
|
367
367
|
maxLength?: number;
|
|
@@ -390,7 +390,7 @@ interface FormFieldSelectPropsOwn {
|
|
|
390
390
|
placeholder?: string;
|
|
391
391
|
label?: React.ReactNode;
|
|
392
392
|
helper?: React.ReactNode;
|
|
393
|
-
/** Optional 16px (`sys.icon.md`) decorative glyph pinned at the inner-left edge of the field. Tracks the field's active text colour (`sys.color.
|
|
393
|
+
/** Optional 16px (`sys.icon.md`) decorative glyph pinned at the inner-left edge of the field. Tracks the field's active text colour (`sys.color.text.default` on the default appearance, `sys.color.text.danger` on `error`) so the glyph reads as part of the typed content. */
|
|
394
394
|
leadingIcon?: React.ReactNode;
|
|
395
395
|
/** Fired when the field box or the trailing chevron is clicked. Consumers use this to raise a `BottomSheet` with the option list. */
|
|
396
396
|
onOpen?: (...args: any[]) => any;
|
|
@@ -503,7 +503,7 @@ interface MetadataStandardPropsOwn {
|
|
|
503
503
|
name: string;
|
|
504
504
|
/** Destination URL for the entity name. When present, the name renders as an `<a>`; otherwise as a `<span>`. */
|
|
505
505
|
nameHref?: string;
|
|
506
|
-
/** Inline timestamp painted after the name on the primary line, in `label.sm` / `sys.color.
|
|
506
|
+
/** Inline timestamp painted after the name on the primary line, in `label.sm` / `sys.color.border.boldest` — one tonal step further than the name. Reach for it on Feed Post; omit on Feed Ad. */
|
|
507
507
|
timestamp?: string;
|
|
508
508
|
/** Whether to paint the inline follow toggle after the timestamp. When `true`, a dot separator + Follow/Following text toggle render at the primary line's trailing edge. State is controlled via `followed` + `onFollowChange`. */
|
|
509
509
|
followAction?: boolean;
|
|
@@ -526,7 +526,7 @@ interface MetadataCompactPropsOwn {
|
|
|
526
526
|
avatar?: Record<string, unknown>;
|
|
527
527
|
/** Array of independently-linked identity items — canonical fill is `[company name, nickname]`, the nickname canonically last, displayed bare (no @ prefix). Each entry is either a string (renders as a stub-href link) or a `{ label, href, badge }` object — `badge` is an optional SINGLE presentational mark node rendered AFTER the item's link, outside the <a> (canonical fill: Badge variant="role" on the trailing nickname item). Items separate by middot. Same grammar as the standard sub's `meta`; here it is the whole cluster, so it is required. */
|
|
528
528
|
meta: React.ReactNode;
|
|
529
|
-
/** Posting time at the line's trailing edge — plain text (never a link), in `label.sm` / `sys.color.
|
|
529
|
+
/** Posting time at the line's trailing edge — plain text (never a link), in `label.sm` / `sys.color.border.boldest` so it recedes behind the identity links. NOT preceded by a middot: the time is separated from the identity cluster by an `inline.md` (8) gap so it reads as a distinct trailing element rather than another identity item (mirrors the Standard head's name↔time treatment). Required: the timestamp is what distinguishes a compact attribution from a bare identity row. */
|
|
530
530
|
timestamp: string;
|
|
531
531
|
}
|
|
532
532
|
export interface MetadataCompactProps extends Omit<React.HTMLAttributes<HTMLDivElement>, keyof MetadataCompactPropsOwn>, MetadataCompactPropsOwn {}
|
|
@@ -547,7 +547,7 @@ interface NavCardPropsOwn {
|
|
|
547
547
|
leading?: React.ReactNode;
|
|
548
548
|
/** Overrides the variant's trailing affordance. Pass a custom 16px glyph when the action isn't a navigation drill-in (inline expand-down arrow, external-link arrow). On `variant="default"` no trailing renders unless `trailingIcon` is supplied; on `variant="nav"` the auto-chevron is replaced. */
|
|
549
549
|
trailingIcon?: React.ReactNode;
|
|
550
|
-
/** Container fill. `default` is transparent — the card's identity is the outlined chrome (hairline + radius + label + chevron) and the host surface tone reads through. `surface` paints `sys.color.surface` so the card reads as its own opaque tier; reach for it when the card sits on a transparent / non-`surface` host (between bare-surface sections, on a tonal band the card needs to break out of). */
|
|
550
|
+
/** Container fill. `default` is transparent — the card's identity is the outlined chrome (hairline + radius + label + chevron) and the host surface tone reads through. `surface` paints `sys.color.surface.default` so the card reads as its own opaque tier; reach for it when the card sits on a transparent / non-`surface` host (between bare-surface sections, on a tonal band the card needs to break out of). */
|
|
551
551
|
appearance?: "default" | "surface";
|
|
552
552
|
/** When provided, renders as `<a href>` instead of `<button>`. Mutually exclusive with `onClick` as the primary commit, though either may be combined for analytics. */
|
|
553
553
|
href?: string;
|
|
@@ -589,7 +589,7 @@ export interface NavigationBarMainProps extends Omit<React.HTMLAttributes<HTMLEl
|
|
|
589
589
|
|
|
590
590
|
interface NavigationBarSubPropsOwn {
|
|
591
591
|
variant: "sub";
|
|
592
|
-
/** Container fill and foreground tone. `surface` (default) — opaque `sys.color.surface` fill, `onSurface` icons and title; the canonical page-chrome treatment. `overlay` — transparent container with **fixed white** icons (`ref.palette.white.1000`), used when the bar floats over a hero/cover image (e.g. inside [Profile header](../profile-header/profile-header.md)). In `overlay`, the title slot is intentionally muted — pass `title=""` (empty string) when the host already carries page identity below the bar. */
|
|
592
|
+
/** Container fill and foreground tone. `surface` (default) — opaque `sys.color.surface.default` fill, `onSurface` icons and title; the canonical page-chrome treatment. `overlay` — transparent container with **fixed white** icons (`ref.palette.white.1000`), used when the bar floats over a hero/cover image (e.g. inside [Profile header](../profile-header/profile-header.md)). In `overlay`, the title slot is intentionally muted — pass `title=""` (empty string) when the host already carries page identity below the bar. */
|
|
593
593
|
appearance?: "surface" | "overlay";
|
|
594
594
|
/** Page name. Optional — omit it for bars whose side actions say everything (canonical: the composer text-button pair, Cancel / Post). A title-less bar renders a non-heading placeholder in the centre cell so the side slots stay in their 1fr/auto/1fr columns. Pass an empty string in `overlay` appearance when the host (e.g. ProfileHeader) carries the identity directly below the bar. */
|
|
595
595
|
title?: string;
|
|
@@ -663,7 +663,7 @@ interface ProfileHeaderPropsOwn {
|
|
|
663
663
|
visibility?: "public" | "private";
|
|
664
664
|
/** Override the visibility label text — used for localisation (e.g. '공개' / '비공개'). When omitted, defaults to 'Public' / 'Private' based on `visibility`. */
|
|
665
665
|
visibilityLabel?: string;
|
|
666
|
-
/** Follower count line — formatted by the consumer so the unit / locale stays in their hands (e.g. '999 followers', '12.4K followers', '999 팔로워'). Paints in `sys.typo.body.sm` / `sys.color.
|
|
666
|
+
/** Follower count line — formatted by the consumer so the unit / locale stays in their hands (e.g. '999 followers', '12.4K followers', '999 팔로워'). Paints in `sys.typo.body.sm` / `sys.color.text.subtle` to the right of a bullet separator on the meta row. */
|
|
667
667
|
followers: string;
|
|
668
668
|
/** Whether the viewer is following this entity. Drives the trailing [Toggle Button](../button/toggle.md): false → 'Follow' (primary fill); true → 'Following' (transparent fill + hairline outline so the committed state recedes against any host surface tier). */
|
|
669
669
|
followed?: boolean;
|
|
@@ -749,7 +749,7 @@ export interface SkeletonProps extends Omit<React.HTMLAttributes<HTMLSpanElement
|
|
|
749
749
|
interface SpinnerPropsOwn {
|
|
750
750
|
/** Selects the arc diameter off the `icon.*` ladder. `medium` paints at `sys.icon.lg` (24px); `small` at `sys.icon.md` (16px). */
|
|
751
751
|
size?: "medium" | "small";
|
|
752
|
-
/** Optional loading copy rendered beside the arc in `sys.typo.body.sm` / `sys.color.
|
|
752
|
+
/** Optional loading copy rendered beside the arc in `sys.typo.body.sm` / `sys.color.text.subtle`. When present it also supplies the accessible name, so `aria-label` is not required. */
|
|
753
753
|
label?: React.ReactNode;
|
|
754
754
|
/** Accessible label announced by screen readers. Defaults to `'Loading'`. Supply a more specific name (e.g. `'Signing in'`) when the wait scope is meaningful. Redundant when a visible `label` is passed. */
|
|
755
755
|
"aria-label"?: string;
|
|
@@ -850,7 +850,7 @@ interface ThumbnailPropsOwn {
|
|
|
850
850
|
updateDot?: boolean;
|
|
851
851
|
/** { src, alt } — 16×16 circular badge at the bottom-right. */
|
|
852
852
|
logoBadge?: Record<string, unknown>;
|
|
853
|
-
/** When `true`, paints a 2-token-wide `sys.color.surface` outline around the Thumbnail container as an outset halo. The outline reads as an isolation ring that separates the Thumbnail's circular edge from anything visually noisy underneath it. Painted as `box-shadow: 0 0 0 sys.borderWidth.thin sys.color.surface` so it never reflows the slot's intrinsic diameter — same no-layout-stroke idiom the rest of the system uses. Pair with hosts whose chrome reads as a `surface*` tier (so the halo blends in) and whose backdrop differs from that tier (so the halo actually separates). */
|
|
853
|
+
/** When `true`, paints a 2-token-wide `sys.color.surface.default` outline around the Thumbnail container as an outset halo. The outline reads as an isolation ring that separates the Thumbnail's circular edge from anything visually noisy underneath it. Painted as `box-shadow: 0 0 0 sys.borderWidth.thin sys.color.surface.default` so it never reflows the slot's intrinsic diameter — same no-layout-stroke idiom the rest of the system uses. Pair with hosts whose chrome reads as a `surface*` tier (so the halo blends in) and whose backdrop differs from that tier (so the halo actually separates). */
|
|
854
854
|
outlined?: boolean;
|
|
855
855
|
}
|
|
856
856
|
export interface ThumbnailProps extends Omit<React.HTMLAttributes<HTMLDivElement>, keyof ThumbnailPropsOwn>, ThumbnailPropsOwn {}
|