@pieai/swimmer-ui-kit 2.3.0 → 2.5.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/CHANGELOG.md +145 -1
- package/README.md +14 -5
- package/dist/index.d.ts +73 -5
- package/dist/index.js +1384 -1141
- package/dist/preview.css +1 -1
- package/dist/styles.css +1 -1
- package/package.json +4 -2
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,149 @@
|
|
|
3
3
|
All notable changes to `@pieai/swimmer-ui-kit`.
|
|
4
4
|
Format: [Keep a Changelog](https://keepachangelog.com); versioning: semver.
|
|
5
5
|
|
|
6
|
+
## 2.5.0 — 2026-09-12
|
|
7
|
+
|
|
8
|
+
### Find the right component before reading the whole API
|
|
9
|
+
|
|
10
|
+
- README now starts with a task-based component selection guide. A primary
|
|
11
|
+
button is `GameButton variant="primary"`; a liquid CTA adds
|
|
12
|
+
`surface="liquid"`. The documented README → recipe → live story path takes
|
|
13
|
+
no more than three steps. Preview opens with the same primary-action examples;
|
|
14
|
+
code recipes wrap and the existing showcase navigation fits narrow screens.
|
|
15
|
+
Preview-only grid, asset-path and construction-status wrapping fixes prevent
|
|
16
|
+
horizontal page overflow; anchored headings stay below the sticky navigation.
|
|
17
|
+
These shelf-layout fixes do not alter consumer component styles.
|
|
18
|
+
- A TypeScript-generated inventory classifies all **272** existing named root
|
|
19
|
+
exports (**121 values / 151 types**) and links their definitions. The frozen
|
|
20
|
+
audit records actual local symbol references and read-only University imports;
|
|
21
|
+
no observed import is not evidence that a public helper is safe to remove.
|
|
22
|
+
`pnpm api:inventory` regenerates the index; `pnpm api:check` joins `verify`.
|
|
23
|
+
- **No root export was removed, renamed or moved to a new package subpath.**
|
|
24
|
+
Package export routes, existing class/token names, the ESM-only / zero-runtime-
|
|
25
|
+
dependency contract and all twelve liquid forms remain intact.
|
|
26
|
+
|
|
27
|
+
### A ready-to-use liquid CTA, not another liquid engine
|
|
28
|
+
|
|
29
|
+
- Add optional `GameButton.fullWidth`. Both the native button and its liquid
|
|
30
|
+
silhouette fill the available row; omitted/false preserves existing layout.
|
|
31
|
+
Native disabled, submit, keyboard, focus, pointer-cancel and reduced-motion
|
|
32
|
+
behavior remain. Preview and Storybook include ordinary, liquid, full-width
|
|
33
|
+
and disabled examples, with browser and markup regression tests.
|
|
34
|
+
- Reuse the existing `press` form and its non-uniform squash / `wobbly` rebound.
|
|
35
|
+
There is **no new `cta` form and no retuning of the 2.4.0 liquid engine,
|
|
36
|
+
geometry, shadows or presets**. Newcomers no longer need to assemble a CTA
|
|
37
|
+
from `LiquidGroup` physics knobs.
|
|
38
|
+
|
|
39
|
+
### Documentation and evidence convergence
|
|
40
|
+
|
|
41
|
+
- Retire the ambiguous `doc/` tree: preserve the six historical tutorials and
|
|
42
|
+
unimplemented 3D-icon research in `docs/archive/legacy-doc/`; reconcile the
|
|
43
|
+
active liquid-primitives and game-surface guides in `docs/reference/`.
|
|
44
|
+
- Archive the extraction report, retired July upgrade plan and version-scoped
|
|
45
|
+
edge/shadow measurements. The July plan is **not** marked wholly completed.
|
|
46
|
+
Original archive bodies and all pre-existing PNG bytes/paths are retained.
|
|
47
|
+
The [relocation map](docs/archive/relocations-2.5.0.json) records every reason.
|
|
48
|
+
- Keep `PRODUCT.md` and `CONCEPTS.md` as tool adapters pointing to the design
|
|
49
|
+
guide; keep `AGENTS.md`, its `CLAUDE.md` symlink and live donor provenance.
|
|
50
|
+
Label historical `artifacts/` and six `SCRATCH/` captures instead of deleting
|
|
51
|
+
evidence with unenumerated external readers. Ignore new scratch output.
|
|
52
|
+
- Record the next-stage matte/glossy liquid catalog, widget coverage and donor
|
|
53
|
+
investigation in `docs/reference/liquid-next-stage-research.md`.
|
|
54
|
+
**That roadmap is research, not a shipped finish API or new widget suite.**
|
|
55
|
+
|
|
56
|
+
### Consumer action: University 2.4.0 → 2.5.0
|
|
57
|
+
|
|
58
|
+
Pin **all three** packages (`packages/ui`, `packages/world`, `apps/university`)
|
|
59
|
+
to 2.5.0, then run the product's own gates. Existing imports need no migration.
|
|
60
|
+
University was inspected read-only; it was **not** modified by this release.
|
|
61
|
+
|
|
62
|
+
Migrating its custom `LiquidCtaButton` is a separate optional change:
|
|
63
|
+
`width="full"` maps to `fullWidth`, while the product keeps destination
|
|
64
|
+
registration, routing and `LiquidCtaTransition`. Its old uniform `scale=0.95`
|
|
65
|
+
/ `bouncy` motion deliberately changes to the kit's existing `press` behavior
|
|
66
|
+
only when that custom wrapper is migrated. Preserve transition source geometry,
|
|
67
|
+
callback ordering and tests; do not discard the 823-line transition as if the
|
|
68
|
+
kit had absorbed it. See the [upgrade playbook](docs/reference/usage-and-upgrade-playbook.md)
|
|
69
|
+
for exact commands, CSS ownership, acceptance cases and rollback.
|
|
70
|
+
|
|
71
|
+
This is a **minor**: additive opt-in layout and discovery, not a public-export
|
|
72
|
+
restructure. Any future restructure still requires a major and compatibility path.
|
|
73
|
+
|
|
74
|
+
## 2.4.0 — 2026-09-11
|
|
75
|
+
|
|
76
|
+
Minor: additive. One new token, six new form names, and a cast shadow that
|
|
77
|
+
every liquid body was missing.
|
|
78
|
+
|
|
79
|
+
### Added
|
|
80
|
+
|
|
81
|
+
- **A cast shadow on the single-body forms.** `LiquidSurface` accepted a
|
|
82
|
+
`shadow` and no form set one, so every liquid button floated: the flat button
|
|
83
|
+
standing next to it carries a solid lip *and* `--game-ui-shadow-button`, and
|
|
84
|
+
the liquid one carried neither. `press`, `settle`, `drain`, and the new
|
|
85
|
+
`swell`, `reach`, `ripple` and `set` now carry two layers each — a tight,
|
|
86
|
+
barely-offset seat that says the body is touching, and a wide low cast that
|
|
87
|
+
gives it height. Compared at device ratio 1 against the flat control, a seat
|
|
88
|
+
alone glues the body to the page and a cast alone leaves it hovering.
|
|
89
|
+
|
|
90
|
+
Every layer is outer and spreadless, which is the case
|
|
91
|
+
`compositorDropShadowFilter` lifts onto the compositor: it costs no filter
|
|
92
|
+
area and it hugs the poured outline rather than a rounded rectangle. A caller
|
|
93
|
+
that wants its own ground still passes `shadow`, and `shadow="none"` removes
|
|
94
|
+
it.
|
|
95
|
+
|
|
96
|
+
- **`--game-ui-shadow-liquid-ink`.** The colour a liquid body casts, per theme.
|
|
97
|
+
It is a solid colour rather than a finished shadow, so a form states strength
|
|
98
|
+
and offset without restating the room's light. Deliberately **not** added to
|
|
99
|
+
`GAME_UI_THEME_CONTRACT`: that list is exported for downstream themes to
|
|
100
|
+
self-check, and adding an entry would turn a consumer's green check red for a
|
|
101
|
+
token they have never heard of. A theme that does not define it gets the
|
|
102
|
+
light theme's warm brown ink.
|
|
103
|
+
|
|
104
|
+
- **`shadowEngaged` on a form, and a shadow that answers the gesture.** A
|
|
105
|
+
pressed body is nearer the ground, so its seat hardens and its cast collapses
|
|
106
|
+
toward it; `settle` rests mid-air with no seat at all and gains one on
|
|
107
|
+
landing, which is the moment that form exists to mark. The silhouette's
|
|
108
|
+
filter transitions, so the shadow no longer arrives before the thing casting
|
|
109
|
+
it.
|
|
110
|
+
|
|
111
|
+
- **Six more forms: `set`, `swell`, `reach`, `ripple`, `split`, `bead`.** Each
|
|
112
|
+
says something none of the previous six could. `set` is the only one that
|
|
113
|
+
stops being liquid — everything else is a degree of wetness — and it snaps
|
|
114
|
+
rather than tweening, because setting is a discontinuity. `swell` is
|
|
115
|
+
attention with nothing touching it, so it is the one moving form with no
|
|
116
|
+
squash. `reach` is the only form with a direction. `ripple` says 「no」 by
|
|
117
|
+
moving and leaves its shape alone. `split` is `merge` backwards with a harder
|
|
118
|
+
edge and more recoil. `bead` is the one relationship form that pours, because
|
|
119
|
+
its bodies are the message rather than the neck between them.
|
|
120
|
+
|
|
121
|
+
- **`kind` on every form, and `LiquidFormKind`.** A form is one body or a
|
|
122
|
+
relationship between siblings. `LiquidSurface` can only draw the first;
|
|
123
|
+
handing it a group form used to render a correct-looking body that silently
|
|
124
|
+
never moved, and it now warns once, in every build.
|
|
125
|
+
|
|
126
|
+
- **`groupEngaged` on a form.** Group knobs that change while engaged. Only
|
|
127
|
+
`set` uses it. `blob` is path data and `gloss` is a filter pass, so neither
|
|
128
|
+
tweens — they snap, which is right for one form and a flicker for any other.
|
|
129
|
+
|
|
130
|
+
- **`LIQUID_BLOB_MAX_FRACTION`.** The share of a box's shorter side a poured
|
|
131
|
+
outline may swell by (0.18). Exported because it is why one `blob` value can
|
|
132
|
+
be handed to a 44px button and a 14px meter, and a number written in three
|
|
133
|
+
places drifts in two.
|
|
134
|
+
|
|
135
|
+
- **A Liquid page on the showcase site, at `/liquid.html`.** Every form live and
|
|
136
|
+
triggerable, at a control size and a meter size, on any of the four tones, in
|
|
137
|
+
both themes, with its knobs — including the derived edge width in px — written
|
|
138
|
+
out beside it.
|
|
139
|
+
|
|
140
|
+
### Changed
|
|
141
|
+
|
|
142
|
+
- **`GameUiPreview`'s liquid section is smaller.** It keeps what a component
|
|
143
|
+
gallery is for — `surface` is a second axis on `GameButton` — and links out to
|
|
144
|
+
the Liquid page for the vocabulary. Two shelves meant two to update and, in
|
|
145
|
+
practice, one of them lagging. Hosts that render `<GameUiPreview />` and do
|
|
146
|
+
not serve `liquid.html` will have a link that does not resolve; the section
|
|
147
|
+
otherwise stands on its own.
|
|
148
|
+
|
|
6
149
|
## 2.3.0 — 2026-09-11
|
|
7
150
|
|
|
8
151
|
Minor: additive, plus one token value change on the default liquid fill.
|
|
@@ -196,7 +339,8 @@ removed member never worked makes the removal correct, not non-breaking.
|
|
|
196
339
|
WebKit CPU-rasterises large SVG blurs. Inset and spread stay in SVG; they
|
|
197
340
|
are not expressible as `drop-shadow()` and they are cheap. The pad no longer
|
|
198
341
|
reserves the outer blur. Visual comparison of the segmented indicator and
|
|
199
|
-
the merged-blob story is in `
|
|
342
|
+
the merged-blob story is in `docs/archive/measurements/liquid-shadow-cost-2.0.0.md`
|
|
343
|
+
(formerly `SHADOW-COST.md`).
|
|
200
344
|
|
|
201
345
|
- **Two authoring warnings were still dead in the published bundle.** 1.11.2
|
|
202
346
|
unblocked the budget warnings; `LiquidGroup.Item` children-with-border and
|
package/README.md
CHANGED
|
@@ -9,10 +9,14 @@ Source is publicly readable. Use is governed by the
|
|
|
9
9
|
[PieAI Limited Use License](./LICENSE), not an open-source license. The visual
|
|
10
10
|
assets may not be extracted, modified, or redistributed as a standalone pack.
|
|
11
11
|
|
|
12
|
+
- **Start here / 我该用哪个组件?**
|
|
13
|
+
[Primary button, liquid CTA, forms, panels and other tasks](docs/reference/component-selection-guide.md)
|
|
12
14
|
- Design system truth (tokens, theming, motion, a11y):
|
|
13
|
-
|
|
15
|
+
[Design system guide](docs/reference/design-system-guide.md)
|
|
14
16
|
- Consumer onboarding / upgrade SOP / release checklist:
|
|
15
|
-
|
|
17
|
+
[Usage and upgrade playbook](docs/reference/usage-and-upgrade-playbook.md)
|
|
18
|
+
- Exhaustive reference (not the starting point):
|
|
19
|
+
[Generated public API inventory](docs/reference/public-api-inventory.md)
|
|
16
20
|
- Live catalog: `pnpm dev` (preview page) and `pnpm storybook`
|
|
17
21
|
|
|
18
22
|
## Install
|
|
@@ -20,7 +24,7 @@ assets may not be extracted, modified, or redistributed as a standalone pack.
|
|
|
20
24
|
```json
|
|
21
25
|
{
|
|
22
26
|
"dependencies": {
|
|
23
|
-
"@pieai/swimmer-ui-kit": "2.
|
|
27
|
+
"@pieai/swimmer-ui-kit": "2.5.0"
|
|
24
28
|
}
|
|
25
29
|
}
|
|
26
30
|
```
|
|
@@ -48,7 +52,7 @@ import '@pieai/swimmer-ui-kit/tailwind.css';
|
|
|
48
52
|
|
|
49
53
|
## What's inside
|
|
50
54
|
|
|
51
|
-
-
|
|
55
|
+
- **Ready-to-use components** across: core controls (`GameButton`,
|
|
52
56
|
`LiquidMetalButton`, `GameTabs`,
|
|
53
57
|
`GameSlider`, `GameToggle`, `GameForms` inputs…), panels and windows
|
|
54
58
|
(`GamePanel`, `GameCollapsiblePanel`, `GameWindowPanel`, `GameModal` on
|
|
@@ -145,10 +149,15 @@ See `CHANGELOG.md` for release history and migration notes.
|
|
|
145
149
|
pnpm install
|
|
146
150
|
pnpm dev # preview page (token ledger + all surfaces)
|
|
147
151
|
pnpm storybook # component catalog
|
|
148
|
-
pnpm
|
|
152
|
+
pnpm verify && pnpm docs:check
|
|
153
|
+
pnpm api:inventory # regenerate the public API index after a reviewed API change
|
|
149
154
|
```
|
|
150
155
|
|
|
151
156
|
Releases use GitHub Actions Trusted Publishing: bump `package.json`, commit and
|
|
152
157
|
push `main`, then run `gh workflow run npm-publish.yml --ref main`. The manual
|
|
153
158
|
workflow is the release safety switch; it publishes to npmjs with short-lived
|
|
154
159
|
OIDC credentials and provenance, without a local login or stored npm token.
|
|
160
|
+
|
|
161
|
+
The former `doc/` tutorials and one-off root reports are catalogued in the
|
|
162
|
+
[documentation and evidence relocation record](docs/archive/relocations-2.5.0.json). Historical
|
|
163
|
+
material is retained, but installation and component selection follow the guides above.
|
package/dist/index.d.ts
CHANGED
|
@@ -1376,10 +1376,12 @@ export declare interface GameBuildLibraryProps {
|
|
|
1376
1376
|
'data-testid'?: string | undefined;
|
|
1377
1377
|
}
|
|
1378
1378
|
|
|
1379
|
-
export declare function GameButton({ children, className, onClick, sound, static: isStatic, surface, type, variant, ...props }: GameButtonProps): ReactNode;
|
|
1379
|
+
export declare function GameButton({ children, className, fullWidth, onClick, sound, static: isStatic, surface, type, variant, ...props }: GameButtonProps): ReactNode;
|
|
1380
1380
|
|
|
1381
1381
|
export declare interface GameButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
|
|
1382
1382
|
children: ReactNode;
|
|
1383
|
+
/** Fill the available row, including the liquid silhouette and hit target. */
|
|
1384
|
+
fullWidth?: boolean;
|
|
1383
1385
|
sound?: GameInteractionSoundOptions | false;
|
|
1384
1386
|
/** Disable the scale-on-press feedback where the motion would distract. */
|
|
1385
1387
|
static?: boolean;
|
|
@@ -2353,10 +2355,22 @@ export declare const LIQUID_FORMS: Readonly<Record<LiquidForm, LiquidFormSpec>>;
|
|
|
2353
2355
|
export declare const LIQUID_GOOEY_WAVINESS_MAX_FRACTION = 0.3;
|
|
2354
2356
|
|
|
2355
2357
|
/**
|
|
2356
|
-
* The named looks
|
|
2357
|
-
*
|
|
2358
|
+
* The named looks.
|
|
2359
|
+
*
|
|
2360
|
+
* Bodies first, then the forms that only mean something between siblings, and
|
|
2361
|
+
* within each run they are ordered by how much cohesion the liquid is losing:
|
|
2362
|
+
* `set` stops being liquid at all, `press` barely deforms, `drain` stops being
|
|
2363
|
+
* a shape.
|
|
2364
|
+
*
|
|
2365
|
+
* Six of these were the whole vocabulary until the brand needed more of it,
|
|
2366
|
+
* and six is worth saying out loud as *where it got to* rather than as a
|
|
2367
|
+
* complete set. A form earns its place by having something to say that none of
|
|
2368
|
+
* the others says. That is the only entry requirement — and it is also why a
|
|
2369
|
+
* form existing here is not permission to put it on a screen: the recorded
|
|
2370
|
+
* finding is that gooey on a static solid block reads as damage, and that one
|
|
2371
|
+
* screen wants one liquid element carrying one layer of intent.
|
|
2358
2372
|
*/
|
|
2359
|
-
export declare type LiquidForm = 'press' | 'settle' | '
|
|
2373
|
+
export declare type LiquidForm = 'set' | 'press' | 'swell' | 'settle' | 'fill' | 'reach' | 'ripple' | 'drain' | 'follow' | 'merge' | 'split' | 'bead';
|
|
2360
2374
|
|
|
2361
2375
|
/** Filter-level knobs a form fixes on the group. */
|
|
2362
2376
|
export declare interface LiquidFormGroup {
|
|
@@ -2377,6 +2391,32 @@ export declare interface LiquidFormGroup {
|
|
|
2377
2391
|
*/
|
|
2378
2392
|
readonly gloss: number;
|
|
2379
2393
|
readonly filterPadding: number;
|
|
2394
|
+
/**
|
|
2395
|
+
* What the body casts on the ground at rest, in CSS box-shadow syntax.
|
|
2396
|
+
*
|
|
2397
|
+
* Every liquid button floated before this existed: the flat button has a lip
|
|
2398
|
+
* *and* `--game-ui-shadow-button`, and the liquid one had neither, which is
|
|
2399
|
+
* most of why it read flatter than its own flat twin. A form is where this
|
|
2400
|
+
* belongs rather than a call site, because how far a body sits off the
|
|
2401
|
+
* surface is part of what the form means.
|
|
2402
|
+
*
|
|
2403
|
+
* Keep it to outer layers with no spread. `liquidGooeyShadow` compiles those
|
|
2404
|
+
* to a CSS `drop-shadow()` on the silhouette — the compositor does the blur,
|
|
2405
|
+
* the shadow hugs the poured outline rather than a rounded rectangle, and it
|
|
2406
|
+
* is allowed to paint outside the filter region. Inset and spread are legal
|
|
2407
|
+
* but stay inside the SVG filter and are charged against the filter-area
|
|
2408
|
+
* budget, so they are a deliberate purchase, not a default.
|
|
2409
|
+
*/
|
|
2410
|
+
readonly shadow?: string;
|
|
2411
|
+
/**
|
|
2412
|
+
* What it casts while the form is engaged, when that differs.
|
|
2413
|
+
*
|
|
2414
|
+
* A body that squashes toward the surface gets *closer* to it, and a real
|
|
2415
|
+
* contact shadow answers by tightening and darkening rather than staying
|
|
2416
|
+
* put. Leaving this out is fine; the rest shadow then holds through the
|
|
2417
|
+
* whole gesture, which is what a form with no vertical travel wants.
|
|
2418
|
+
*/
|
|
2419
|
+
readonly shadowEngaged?: string;
|
|
2380
2420
|
}
|
|
2381
2421
|
|
|
2382
2422
|
/**
|
|
@@ -2399,10 +2439,37 @@ export declare interface LiquidFormItem {
|
|
|
2399
2439
|
/** Resolve a form into item props, with the same merge-don't-replace rule. */
|
|
2400
2440
|
export declare function liquidFormItem(form: LiquidForm, overrides?: LiquidFormItem): LiquidFormItem;
|
|
2401
2441
|
|
|
2442
|
+
/**
|
|
2443
|
+
* Whether a form describes one body or a relationship between siblings.
|
|
2444
|
+
*
|
|
2445
|
+
* `LiquidSurface` draws one silhouette, so it can only honour a `body` form;
|
|
2446
|
+
* a `group` form says something about the space *between* items and needs a
|
|
2447
|
+
* `LiquidGroup` the caller arranges. That distinction used to live in a
|
|
2448
|
+
* parenthetical — `ENGAGED` carried two entries marked 「present for
|
|
2449
|
+
* exhaustiveness」 — which meant picking the wrong one failed silently, by
|
|
2450
|
+
* rendering a body that never moves. Naming it lets a shelf group itself, lets
|
|
2451
|
+
* a caller check, and lets the kit say so out loud in development.
|
|
2452
|
+
*/
|
|
2453
|
+
export declare type LiquidFormKind = 'body' | 'group';
|
|
2454
|
+
|
|
2402
2455
|
export declare interface LiquidFormSpec {
|
|
2403
2456
|
/** One sentence on what a viewer sees, for docs and for picking. */
|
|
2404
2457
|
readonly summary: string;
|
|
2458
|
+
/** One body, or a relationship between siblings the caller arranges. */
|
|
2459
|
+
readonly kind: LiquidFormKind;
|
|
2405
2460
|
readonly group: LiquidFormGroup;
|
|
2461
|
+
/**
|
|
2462
|
+
* Group knobs that change while the form is engaged.
|
|
2463
|
+
*
|
|
2464
|
+
* Only `set` uses this, and only because `set` is the one form whose subject
|
|
2465
|
+
* is *stopping* being liquid — without it the vocabulary can say a dozen
|
|
2466
|
+
* degrees of liquid and never say 「solid」. Be careful with it: `blob` is
|
|
2467
|
+
* path data and `gloss` is a filter pass, so neither tweens. They snap. For
|
|
2468
|
+
* `set` that snap is the gesture — a thing clicking into place — and for
|
|
2469
|
+
* anything continuous it would be a flicker, which is why this is not a
|
|
2470
|
+
* general-purpose second bundle.
|
|
2471
|
+
*/
|
|
2472
|
+
readonly groupEngaged?: Partial<LiquidFormGroup>;
|
|
2406
2473
|
readonly item: LiquidFormItem;
|
|
2407
2474
|
}
|
|
2408
2475
|
|
|
@@ -2557,7 +2624,7 @@ export declare interface LiquidMetalButtonProps extends ButtonHTMLAttributes<HTM
|
|
|
2557
2624
|
|
|
2558
2625
|
export declare type LiquidMetalRendererMode = 'auto' | 'css' | 'webgl';
|
|
2559
2626
|
|
|
2560
|
-
export declare function LiquidSurface({ children, form, active, fill, stroke, shadow, radius, className, style, }: LiquidSurfaceProps): ReactNode;
|
|
2627
|
+
export declare function LiquidSurface({ children, form, active, fill, stroke, shadow: shadowOverride, radius, className, style, }: LiquidSurfaceProps): ReactNode;
|
|
2561
2628
|
|
|
2562
2629
|
export declare interface LiquidSurfaceProps {
|
|
2563
2630
|
children: ReactNode;
|
|
@@ -2571,6 +2638,7 @@ export declare interface LiquidSurfaceProps {
|
|
|
2571
2638
|
/** Silhouette paint. Defaults to the kit's raised surface token. */
|
|
2572
2639
|
fill?: string;
|
|
2573
2640
|
stroke?: string;
|
|
2641
|
+
/** Overrides the form's own cast shadow. `none` removes it. */
|
|
2574
2642
|
shadow?: string;
|
|
2575
2643
|
/** Corner radius of the body, in px. 999 gives a pill. */
|
|
2576
2644
|
radius?: number;
|