@pearpages/pulp-react 0.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/LICENSE +21 -0
- package/README.md +65 -0
- package/dist/ListboxOptions-DLsT-dkV.d.ts +11 -0
- package/dist/ToggleField-C-qKSgHh.d.ts +3 -0
- package/dist/accordion.css +90 -0
- package/dist/accordion.css.map +1 -0
- package/dist/accordion.d.ts +71 -0
- package/dist/accordion.js +6 -0
- package/dist/accordion.js.map +1 -0
- package/dist/alert.css +246 -0
- package/dist/alert.css.map +1 -0
- package/dist/alert.d.ts +46 -0
- package/dist/alert.js +10 -0
- package/dist/alert.js.map +1 -0
- package/dist/badge.css +89 -0
- package/dist/badge.css.map +1 -0
- package/dist/badge.d.ts +38 -0
- package/dist/badge.js +5 -0
- package/dist/badge.js.map +1 -0
- package/dist/button.css +162 -0
- package/dist/button.css.map +1 -0
- package/dist/button.d.ts +61 -0
- package/dist/button.js +8 -0
- package/dist/button.js.map +1 -0
- package/dist/calendar.css +128 -0
- package/dist/calendar.css.map +1 -0
- package/dist/calendar.d.ts +48 -0
- package/dist/calendar.js +6 -0
- package/dist/calendar.js.map +1 -0
- package/dist/card.css +66 -0
- package/dist/card.css.map +1 -0
- package/dist/card.d.ts +69 -0
- package/dist/card.js +5 -0
- package/dist/card.js.map +1 -0
- package/dist/checkbox.css +106 -0
- package/dist/checkbox.css.map +1 -0
- package/dist/checkbox.d.ts +41 -0
- package/dist/checkbox.js +7 -0
- package/dist/checkbox.js.map +1 -0
- package/dist/chunk-2PXTVZ7H.js +95 -0
- package/dist/chunk-2PXTVZ7H.js.map +1 -0
- package/dist/chunk-2ZP4ZBI5.js +43 -0
- package/dist/chunk-2ZP4ZBI5.js.map +1 -0
- package/dist/chunk-3GWESUGD.js +28 -0
- package/dist/chunk-3GWESUGD.js.map +1 -0
- package/dist/chunk-4HRNRTXI.js +25 -0
- package/dist/chunk-4HRNRTXI.js.map +1 -0
- package/dist/chunk-5SBKZS56.js +56 -0
- package/dist/chunk-5SBKZS56.js.map +1 -0
- package/dist/chunk-6I26MMQF.js +19 -0
- package/dist/chunk-6I26MMQF.js.map +1 -0
- package/dist/chunk-75GTNRBH.js +45 -0
- package/dist/chunk-75GTNRBH.js.map +1 -0
- package/dist/chunk-7DS4I7OJ.js +30 -0
- package/dist/chunk-7DS4I7OJ.js.map +1 -0
- package/dist/chunk-ASNTNTJW.js +27 -0
- package/dist/chunk-ASNTNTJW.js.map +1 -0
- package/dist/chunk-ASOQ2MVR.js +19 -0
- package/dist/chunk-ASOQ2MVR.js.map +1 -0
- package/dist/chunk-AWQHULJC.js +31 -0
- package/dist/chunk-AWQHULJC.js.map +1 -0
- package/dist/chunk-BBV4L5WO.js +43 -0
- package/dist/chunk-BBV4L5WO.js.map +1 -0
- package/dist/chunk-CZBCGLEM.js +9 -0
- package/dist/chunk-CZBCGLEM.js.map +1 -0
- package/dist/chunk-DWE374JX.js +65 -0
- package/dist/chunk-DWE374JX.js.map +1 -0
- package/dist/chunk-DXOOW6Q6.js +159 -0
- package/dist/chunk-DXOOW6Q6.js.map +1 -0
- package/dist/chunk-F3OFZGGE.js +116 -0
- package/dist/chunk-F3OFZGGE.js.map +1 -0
- package/dist/chunk-FH54XQ35.js +125 -0
- package/dist/chunk-FH54XQ35.js.map +1 -0
- package/dist/chunk-FXRSZUDH.js +38 -0
- package/dist/chunk-FXRSZUDH.js.map +1 -0
- package/dist/chunk-GTTXRDXV.js +181 -0
- package/dist/chunk-GTTXRDXV.js.map +1 -0
- package/dist/chunk-I4KC4V6A.js +31 -0
- package/dist/chunk-I4KC4V6A.js.map +1 -0
- package/dist/chunk-I5OZ63W7.js +50 -0
- package/dist/chunk-I5OZ63W7.js.map +1 -0
- package/dist/chunk-IDNGNQNV.js +41 -0
- package/dist/chunk-IDNGNQNV.js.map +1 -0
- package/dist/chunk-J5S2HVHO.js +67 -0
- package/dist/chunk-J5S2HVHO.js.map +1 -0
- package/dist/chunk-K5QGGQOV.js +84 -0
- package/dist/chunk-K5QGGQOV.js.map +1 -0
- package/dist/chunk-KPQGS4PG.js +77 -0
- package/dist/chunk-KPQGS4PG.js.map +1 -0
- package/dist/chunk-MI4QUKQS.js +8 -0
- package/dist/chunk-MI4QUKQS.js.map +1 -0
- package/dist/chunk-MRQWUCBA.js +57 -0
- package/dist/chunk-MRQWUCBA.js.map +1 -0
- package/dist/chunk-MXWXJZFS.js +48 -0
- package/dist/chunk-MXWXJZFS.js.map +1 -0
- package/dist/chunk-N7L66GMG.js +129 -0
- package/dist/chunk-N7L66GMG.js.map +1 -0
- package/dist/chunk-NAYFLTK6.js +32 -0
- package/dist/chunk-NAYFLTK6.js.map +1 -0
- package/dist/chunk-O6OBFL3Q.js +155 -0
- package/dist/chunk-O6OBFL3Q.js.map +1 -0
- package/dist/chunk-OGIQRHNF.js +52 -0
- package/dist/chunk-OGIQRHNF.js.map +1 -0
- package/dist/chunk-OUFAFINB.js +45 -0
- package/dist/chunk-OUFAFINB.js.map +1 -0
- package/dist/chunk-OXYP34CG.js +43 -0
- package/dist/chunk-OXYP34CG.js.map +1 -0
- package/dist/chunk-P5C2U5ZF.js +73 -0
- package/dist/chunk-P5C2U5ZF.js.map +1 -0
- package/dist/chunk-PM4YO67Q.js +53 -0
- package/dist/chunk-PM4YO67Q.js.map +1 -0
- package/dist/chunk-Q6J6BMSB.js +86 -0
- package/dist/chunk-Q6J6BMSB.js.map +1 -0
- package/dist/chunk-T76YSNTZ.js +33 -0
- package/dist/chunk-T76YSNTZ.js.map +1 -0
- package/dist/chunk-TGMDOQCL.js +53 -0
- package/dist/chunk-TGMDOQCL.js.map +1 -0
- package/dist/chunk-TVI5AXLE.js +41 -0
- package/dist/chunk-TVI5AXLE.js.map +1 -0
- package/dist/chunk-U6QRAD73.js +22 -0
- package/dist/chunk-U6QRAD73.js.map +1 -0
- package/dist/chunk-UX42PQLT.js +76 -0
- package/dist/chunk-UX42PQLT.js.map +1 -0
- package/dist/chunk-XDVS7HX7.js +100 -0
- package/dist/chunk-XDVS7HX7.js.map +1 -0
- package/dist/chunk-Y4TZA77G.js +57 -0
- package/dist/chunk-Y4TZA77G.js.map +1 -0
- package/dist/chunk-YUHS5S5Y.js +12 -0
- package/dist/chunk-YUHS5S5Y.js.map +1 -0
- package/dist/chunk-Z4PN6B2C.js +17 -0
- package/dist/chunk-Z4PN6B2C.js.map +1 -0
- package/dist/chunk-ZVDN3GRI.js +49 -0
- package/dist/chunk-ZVDN3GRI.js.map +1 -0
- package/dist/combobox.css +280 -0
- package/dist/combobox.css.map +1 -0
- package/dist/combobox.d.ts +75 -0
- package/dist/combobox.js +10 -0
- package/dist/combobox.js.map +1 -0
- package/dist/component-manifest.json +3370 -0
- package/dist/date-picker.css +267 -0
- package/dist/date-picker.css.map +1 -0
- package/dist/date-picker.d.ts +59 -0
- package/dist/date-picker.js +8 -0
- package/dist/date-picker.js.map +1 -0
- package/dist/dialog.css +62 -0
- package/dist/dialog.css.map +1 -0
- package/dist/dialog.d.ts +56 -0
- package/dist/dialog.js +3 -0
- package/dist/dialog.js.map +1 -0
- package/dist/field.css +28 -0
- package/dist/field.css.map +1 -0
- package/dist/field.d.ts +98 -0
- package/dist/field.js +5 -0
- package/dist/field.js.map +1 -0
- package/dist/floating-Bw-LN_QT.d.ts +5 -0
- package/dist/heading.css +30 -0
- package/dist/heading.css.map +1 -0
- package/dist/heading.d.ts +316 -0
- package/dist/heading.js +4 -0
- package/dist/heading.js.map +1 -0
- package/dist/icon-button.css +177 -0
- package/dist/icon-button.css.map +1 -0
- package/dist/icon-button.d.ts +29 -0
- package/dist/icon-button.js +9 -0
- package/dist/icon-button.js.map +1 -0
- package/dist/icon.css +25 -0
- package/dist/icon.css.map +1 -0
- package/dist/icon.d.ts +33 -0
- package/dist/icon.js +4 -0
- package/dist/icon.js.map +1 -0
- package/dist/index.css +2345 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/inline.css +63 -0
- package/dist/inline.css.map +1 -0
- package/dist/inline.d.ts +322 -0
- package/dist/inline.js +4 -0
- package/dist/inline.js.map +1 -0
- package/dist/listbox.css +95 -0
- package/dist/listbox.css.map +1 -0
- package/dist/listbox.d.ts +47 -0
- package/dist/listbox.js +7 -0
- package/dist/listbox.js.map +1 -0
- package/dist/menu.css +102 -0
- package/dist/menu.css.map +1 -0
- package/dist/menu.d.ts +76 -0
- package/dist/menu.js +9 -0
- package/dist/menu.js.map +1 -0
- package/dist/pagination.css +212 -0
- package/dist/pagination.css.map +1 -0
- package/dist/pagination.d.ts +52 -0
- package/dist/pagination.js +10 -0
- package/dist/pagination.js.map +1 -0
- package/dist/picker.css +209 -0
- package/dist/picker.css.map +1 -0
- package/dist/picker.d.ts +57 -0
- package/dist/picker.js +8 -0
- package/dist/picker.js.map +1 -0
- package/dist/popover.css +48 -0
- package/dist/popover.css.map +1 -0
- package/dist/popover.d.ts +68 -0
- package/dist/popover.js +7 -0
- package/dist/popover.js.map +1 -0
- package/dist/progress.css +83 -0
- package/dist/progress.css.map +1 -0
- package/dist/progress.d.ts +40 -0
- package/dist/progress.js +5 -0
- package/dist/progress.js.map +1 -0
- package/dist/radio.css +107 -0
- package/dist/radio.css.map +1 -0
- package/dist/radio.d.ts +68 -0
- package/dist/radio.js +6 -0
- package/dist/radio.js.map +1 -0
- package/dist/select.css +98 -0
- package/dist/select.css.map +1 -0
- package/dist/select.d.ts +39 -0
- package/dist/select.js +6 -0
- package/dist/select.js.map +1 -0
- package/dist/skeleton.css +59 -0
- package/dist/skeleton.css.map +1 -0
- package/dist/skeleton.d.ts +34 -0
- package/dist/skeleton.js +4 -0
- package/dist/skeleton.js.map +1 -0
- package/dist/slider.css +126 -0
- package/dist/slider.css.map +1 -0
- package/dist/slider.d.ts +61 -0
- package/dist/slider.js +5 -0
- package/dist/slider.js.map +1 -0
- package/dist/spinner.css +60 -0
- package/dist/spinner.css.map +1 -0
- package/dist/spinner.d.ts +34 -0
- package/dist/spinner.js +5 -0
- package/dist/spinner.js.map +1 -0
- package/dist/stack.css +60 -0
- package/dist/stack.css.map +1 -0
- package/dist/stack.d.ts +319 -0
- package/dist/stack.js +4 -0
- package/dist/stack.js.map +1 -0
- package/dist/switch.css +97 -0
- package/dist/switch.css.map +1 -0
- package/dist/switch.d.ts +35 -0
- package/dist/switch.js +7 -0
- package/dist/switch.js.map +1 -0
- package/dist/table.css +188 -0
- package/dist/table.css.map +1 -0
- package/dist/table.d.ts +137 -0
- package/dist/table.js +6 -0
- package/dist/table.js.map +1 -0
- package/dist/tabs.css +75 -0
- package/dist/tabs.css.map +1 -0
- package/dist/tabs.d.ts +73 -0
- package/dist/tabs.js +5 -0
- package/dist/tabs.js.map +1 -0
- package/dist/text-field.css +75 -0
- package/dist/text-field.css.map +1 -0
- package/dist/text-field.d.ts +43 -0
- package/dist/text-field.js +6 -0
- package/dist/text-field.js.map +1 -0
- package/dist/text.css +53 -0
- package/dist/text.css.map +1 -0
- package/dist/text.d.ts +331 -0
- package/dist/text.js +4 -0
- package/dist/text.js.map +1 -0
- package/dist/textarea.css +84 -0
- package/dist/textarea.css.map +1 -0
- package/dist/textarea.d.ts +40 -0
- package/dist/textarea.js +6 -0
- package/dist/textarea.js.map +1 -0
- package/dist/toast.css +300 -0
- package/dist/toast.css.map +1 -0
- package/dist/toast.d.ts +60 -0
- package/dist/toast.js +11 -0
- package/dist/toast.js.map +1 -0
- package/dist/tooltip.css +36 -0
- package/dist/tooltip.css.map +1 -0
- package/dist/tooltip.d.ts +34 -0
- package/dist/tooltip.js +5 -0
- package/dist/tooltip.js.map +1 -0
- package/dist/visually-hidden.css +15 -0
- package/dist/visually-hidden.css.map +1 -0
- package/dist/visually-hidden.d.ts +308 -0
- package/dist/visually-hidden.js +4 -0
- package/dist/visually-hidden.js.map +1 -0
- package/package.json +261 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Pere Pages
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# @pearpages/pulp-react
|
|
2
|
+
|
|
3
|
+
The React components of [pulp](https://pulp.pearpages.com): accessible, driven by tokens, styled
|
|
4
|
+
with CSS modules, one entry point per component. Docs, live examples and each component's
|
|
5
|
+
accessibility notes are at https://pulp.pearpages.com.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
npm install @pearpages/pulp-react @pearpages/pulp-css @pearpages/pulp-tokens
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Requires React 19 and `react-dom`. `@pearpages/pulp-tokens` is a peer dependency.
|
|
14
|
+
|
|
15
|
+
## Use
|
|
16
|
+
|
|
17
|
+
Load the styles once:
|
|
18
|
+
|
|
19
|
+
```css
|
|
20
|
+
@import "@pearpages/pulp-css";
|
|
21
|
+
@import "@pearpages/pulp-react/styles.css";
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Every component also has its own stylesheet (`@pearpages/pulp-react/button.css`, …) if you load
|
|
25
|
+
only what you use.
|
|
26
|
+
|
|
27
|
+
Import each component from its own entry point, or everything from the package root:
|
|
28
|
+
|
|
29
|
+
```tsx
|
|
30
|
+
import { Button } from '@pearpages/pulp-react/button';
|
|
31
|
+
|
|
32
|
+
<html data-brand="bitepals" data-scheme="dark">
|
|
33
|
+
<Button variant="secondary" size="lg">Save</Button>
|
|
34
|
+
</html>
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
`data-brand` (`pulp` or `bitepals`) and `data-scheme` (`light`, `dark`, or none to follow the OS)
|
|
38
|
+
theme everything inside the element they're on.
|
|
39
|
+
|
|
40
|
+
## Components
|
|
41
|
+
|
|
42
|
+
- **Typography**: `Heading`, `Text`
|
|
43
|
+
- **Layout**: `Card`, `Stack`, `Inline`
|
|
44
|
+
- **Actions**: `Button`, `IconButton`
|
|
45
|
+
- **Forms**: `Field`, `TextField`, `Textarea`, `Select`, `Checkbox`, `Switch`, `RadioGroup`,
|
|
46
|
+
`Radio`, `Combobox`, `Listbox`, `Picker`, `Calendar`, `DatePicker`, `Slider`
|
|
47
|
+
- **Navigation**: `Tabs`, `Accordion`, `Pagination`
|
|
48
|
+
- **Overlays**: `Dialog`, `DialogSystem`, `Menu`, `Popover`, `Tooltip`
|
|
49
|
+
- **Feedback**: `Alert`, `Badge`, `ToastProvider` and `useToast`, `Progress`, `Skeleton`, `Spinner`
|
|
50
|
+
- **Data**: `Table`
|
|
51
|
+
- **Utilities**: `Icon`, `VisuallyHidden`
|
|
52
|
+
|
|
53
|
+
`Combobox`, `Listbox`, `Picker`, `Calendar`, `DatePicker`, `Slider`, `Table` and `Pagination` are
|
|
54
|
+
**experimental**: their API may still change in a minor release. All but `Pagination` build on
|
|
55
|
+
React Aria Components, installed with this package and tree-shaken per entry. Their props are
|
|
56
|
+
pulp's, and dates cross the API as `YYYY-MM-DD` strings.
|
|
57
|
+
|
|
58
|
+
## For tooling and coding agents
|
|
59
|
+
|
|
60
|
+
`@pearpages/pulp-react/component-manifest.json` lists every component with its status, category,
|
|
61
|
+
props, accessibility notes and do/don't guidance.
|
|
62
|
+
|
|
63
|
+
## License
|
|
64
|
+
|
|
65
|
+
MIT
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** One option. `id` is the value; `label` is what the user sees and types against. */
|
|
2
|
+
interface ListboxItem {
|
|
3
|
+
id: string;
|
|
4
|
+
label: string;
|
|
5
|
+
/** A second, muted line under the label. */
|
|
6
|
+
description?: string;
|
|
7
|
+
/** @default false */
|
|
8
|
+
disabled?: boolean;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export type { ListboxItem as L };
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/* src/icon/Icon.module.css */
|
|
2
|
+
@layer components {
|
|
3
|
+
.Icon_icon {
|
|
4
|
+
display: inline-flex;
|
|
5
|
+
flex: none;
|
|
6
|
+
inline-size: 1em;
|
|
7
|
+
block-size: 1em;
|
|
8
|
+
font-size: var(--icon-size-md);
|
|
9
|
+
vertical-align: middle;
|
|
10
|
+
&[data-size=sm] {
|
|
11
|
+
font-size: var(--icon-size-sm);
|
|
12
|
+
}
|
|
13
|
+
&[data-size=lg] {
|
|
14
|
+
font-size: var(--icon-size-lg);
|
|
15
|
+
}
|
|
16
|
+
&[data-size=inherit] {
|
|
17
|
+
font-size: inherit;
|
|
18
|
+
}
|
|
19
|
+
& > * {
|
|
20
|
+
inline-size: 100%;
|
|
21
|
+
block-size: 100%;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/* src/accordion/Accordion.module.css */
|
|
27
|
+
@layer components {
|
|
28
|
+
.Accordion_accordion {
|
|
29
|
+
display: flex;
|
|
30
|
+
flex-direction: column;
|
|
31
|
+
border: var(--size-hairline) solid var(--accordion-border);
|
|
32
|
+
border-radius: var(--accordion-radius);
|
|
33
|
+
font-family: var(--font-family-body);
|
|
34
|
+
}
|
|
35
|
+
.Accordion_item {
|
|
36
|
+
border-block-end: var(--size-hairline) solid var(--accordion-border);
|
|
37
|
+
&:last-child {
|
|
38
|
+
border-block-end: none;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
.Accordion_heading {
|
|
42
|
+
margin: 0;
|
|
43
|
+
font-size: inherit;
|
|
44
|
+
font-weight: inherit;
|
|
45
|
+
}
|
|
46
|
+
.Accordion_trigger {
|
|
47
|
+
display: flex;
|
|
48
|
+
gap: var(--accordion-trigger-gap);
|
|
49
|
+
align-items: center;
|
|
50
|
+
inline-size: 100%;
|
|
51
|
+
padding-block: var(--accordion-trigger-padding-block);
|
|
52
|
+
padding-inline: var(--accordion-trigger-padding-inline);
|
|
53
|
+
border: none;
|
|
54
|
+
background-color: transparent;
|
|
55
|
+
color: var(--accordion-trigger-fg);
|
|
56
|
+
font-size: var(--accordion-trigger-font-size);
|
|
57
|
+
font-weight: var(--accordion-trigger-font-weight);
|
|
58
|
+
text-align: start;
|
|
59
|
+
cursor: pointer;
|
|
60
|
+
transition: background-color var(--accordion-duration) var(--motion-easing-standard);
|
|
61
|
+
&:focus-visible {
|
|
62
|
+
outline: var(--accordion-focus-ring-width) solid var(--accordion-focus-ring);
|
|
63
|
+
outline-offset: calc(-1 * var(--accordion-focus-ring-offset));
|
|
64
|
+
}
|
|
65
|
+
&:disabled {
|
|
66
|
+
cursor: not-allowed;
|
|
67
|
+
opacity: 0.55;
|
|
68
|
+
}
|
|
69
|
+
&:hover:not(:disabled) {
|
|
70
|
+
background-color: var(--accordion-trigger-bg-hover);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
.Accordion_label {
|
|
74
|
+
flex: 1;
|
|
75
|
+
}
|
|
76
|
+
.Accordion_chevron {
|
|
77
|
+
color: var(--accordion-trigger-chevron);
|
|
78
|
+
transition: rotate var(--accordion-duration) var(--motion-easing-standard);
|
|
79
|
+
}
|
|
80
|
+
.Accordion_trigger[data-state=open] .Accordion_chevron {
|
|
81
|
+
rotate: 180deg;
|
|
82
|
+
}
|
|
83
|
+
.Accordion_panel {
|
|
84
|
+
padding-block: var(--accordion-panel-padding-block);
|
|
85
|
+
padding-inline: var(--accordion-panel-padding-inline);
|
|
86
|
+
color: var(--accordion-panel-fg);
|
|
87
|
+
font-size: var(--accordion-panel-font-size);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/*# sourceMappingURL=accordion.css.map */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/icon/Icon.module.css","../src/accordion/Accordion.module.css"],"sourcesContent":["/* Every value is a token (--icon-*). The child SVG fills the box; colour is currentColor. */\n\n@layer components {\n .icon {\n display: inline-flex;\n flex: none;\n inline-size: 1em;\n block-size: 1em;\n font-size: var(--icon-size-md);\n vertical-align: middle;\n\n &[data-size=\"sm\"] { font-size: var(--icon-size-sm); }\n &[data-size=\"lg\"] { font-size: var(--icon-size-lg); }\n &[data-size=\"inherit\"] { font-size: inherit; }\n\n & > * {\n inline-size: 100%;\n block-size: 100%;\n }\n }\n}\n","/* Every value is a token (--accordion-*). Open state is a data attribute; the chevron rotates on it. */\n\n@layer components {\n .accordion {\n display: flex;\n flex-direction: column;\n border: var(--size-hairline) solid var(--accordion-border);\n border-radius: var(--accordion-radius);\n font-family: var(--font-family-body);\n }\n\n .item {\n border-block-end: var(--size-hairline) solid var(--accordion-border);\n\n &:last-child {\n border-block-end: none;\n }\n }\n\n .heading {\n margin: 0;\n font-size: inherit;\n font-weight: inherit;\n }\n\n .trigger {\n display: flex;\n gap: var(--accordion-trigger-gap);\n align-items: center;\n inline-size: 100%;\n padding-block: var(--accordion-trigger-padding-block);\n padding-inline: var(--accordion-trigger-padding-inline);\n border: none;\n background-color: transparent;\n color: var(--accordion-trigger-fg);\n font-size: var(--accordion-trigger-font-size);\n font-weight: var(--accordion-trigger-font-weight);\n text-align: start;\n cursor: pointer;\n transition: background-color var(--accordion-duration) var(--motion-easing-standard);\n\n &:focus-visible {\n outline: var(--accordion-focus-ring-width) solid var(--accordion-focus-ring);\n outline-offset: calc(-1 * var(--accordion-focus-ring-offset));\n }\n\n &:disabled {\n cursor: not-allowed;\n opacity: 0.55;\n }\n\n &:hover:not(:disabled) {\n background-color: var(--accordion-trigger-bg-hover);\n }\n }\n\n .label {\n flex: 1;\n }\n\n .chevron {\n color: var(--accordion-trigger-chevron);\n transition: rotate var(--accordion-duration) var(--motion-easing-standard);\n }\n\n .trigger[data-state=\"open\"] .chevron {\n rotate: 180deg;\n }\n\n .panel {\n padding-block: var(--accordion-panel-padding-block);\n padding-inline: var(--accordion-panel-padding-inline);\n color: var(--accordion-panel-fg);\n font-size: var(--accordion-panel-font-size);\n }\n}\n"],"mappings":";AAEA;AACE,GAACA;AACC,aAAS;AACT,UAAM;AACN,iBAAa;AACb,gBAAY;AACZ,eAAW,IAAI;AACf,oBAAgB;AAEhB,KAAC,CAAC;AAAkB,iBAAW,IAAI;AAAiB;AACpD,KAAC,CAAC;AAAkB,iBAAW,IAAI;AAAiB;AACpD,KAAC,CAAC;AAAuB,iBAAW;AAAS;AAE7C,MAAE,EAAE;AACF,mBAAa;AACb,kBAAY;AACd;AACF;AACF;;;AClBA;AACE,GAACC;AACC,aAAS;AACT,oBAAgB;AAChB,YAAQ,IAAI,iBAAiB,MAAM,IAAI;AACvC,mBAAe,IAAI;AACnB,iBAAa,IAAI;AACnB;AAEA,GAACC;AACC,sBAAkB,IAAI,iBAAiB,MAAM,IAAI;AAEjD,KAAC;AACC,wBAAkB;AACpB;AACF;AAEA,GAACC;AACC,YAAQ;AACR,eAAW;AACX,iBAAa;AACf;AAEA,GAACC;AACC,aAAS;AACT,SAAK,IAAI;AACT,iBAAa;AACb,iBAAa;AACb,mBAAe,IAAI;AACnB,oBAAgB,IAAI;AACpB,YAAQ;AACR,sBAAkB;AAClB,WAAO,IAAI;AACX,eAAW,IAAI;AACf,iBAAa,IAAI;AACjB,gBAAY;AACZ,YAAQ;AACR,gBAAY,iBAAiB,IAAI,sBAAsB,IAAI;AAE3D,KAAC;AACC,eAAS,IAAI,8BAA8B,MAAM,IAAI;AACrD,sBAAgB,KAAK,GAAG,EAAE,IAAI;AAChC;AAEA,KAAC;AACC,cAAQ;AACR,eAAS;AACX;AAEA,KAAC,MAAM,KAAK;AACV,wBAAkB,IAAI;AACxB;AACF;AAEA,GAACC;AACC,UAAM;AACR;AAEA,GAACC;AACC,WAAO,IAAI;AACX,gBAAY,OAAO,IAAI,sBAAsB,IAAI;AACnD;AAEA,GAxCCF,iBAwCO,CAAC,iBAAmB,CAL3BE;AAMC,YAAQ;AACV;AAEA,GAACC;AACC,mBAAe,IAAI;AACnB,oBAAgB,IAAI;AACpB,WAAO,IAAI;AACX,eAAW,IAAI;AACjB;AACF;","names":["icon","accordion","item","heading","trigger","label","chevron","panel"]}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { HTMLAttributes, Ref, ReactNode, ButtonHTMLAttributes } from 'react';
|
|
3
|
+
|
|
4
|
+
type AccordionType = 'single' | 'multiple';
|
|
5
|
+
type AccordionHeadingLevel = 2 | 3 | 4 | 5 | 6;
|
|
6
|
+
interface AccordionProps extends Omit<HTMLAttributes<HTMLDivElement>, 'defaultValue' | 'onChange'> {
|
|
7
|
+
/** `single` keeps one item open; `multiple` allows any number. @default 'single' */
|
|
8
|
+
type?: AccordionType;
|
|
9
|
+
/** Controlled open item(s): a string for `single`, an array for `multiple`. */
|
|
10
|
+
value?: string | string[];
|
|
11
|
+
defaultValue?: string | string[];
|
|
12
|
+
onValueChange?: (value: string | string[]) => void;
|
|
13
|
+
/** In `single` mode, whether the open item can be closed again. @default true */
|
|
14
|
+
collapsible?: boolean;
|
|
15
|
+
/** The heading level of every trigger, for the document outline. @default 3 */
|
|
16
|
+
headingLevel?: AccordionHeadingLevel;
|
|
17
|
+
ref?: Ref<HTMLDivElement>;
|
|
18
|
+
children: ReactNode;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Vertically stacked sections that expand one at a time or independently.
|
|
22
|
+
* Each trigger is a button inside a real heading, each panel a labelled
|
|
23
|
+
* region; arrows, Home and End move between triggers. Controlled or
|
|
24
|
+
* uncontrolled by `value`. Compose with `Accordion.Item`,
|
|
25
|
+
* `Accordion.Trigger` and `Accordion.Panel`.
|
|
26
|
+
*
|
|
27
|
+
* @status stable
|
|
28
|
+
* @category Navigation
|
|
29
|
+
* @accessibility Each trigger is a `button` inside a heading of the given `headingLevel`; each panel is a `region` labelled by its trigger. Arrows, Home and End move between triggers; Enter or Space toggles.
|
|
30
|
+
* @do Set `headingLevel` to fit the page outline.
|
|
31
|
+
* Use `multiple` when sections are independent reference material.
|
|
32
|
+
* @dont Nest interactive content in the trigger; it is one button.
|
|
33
|
+
* Use it for a single show-more; use Popover or plain content instead.
|
|
34
|
+
*/
|
|
35
|
+
declare function Accordion({ type, value, defaultValue, onValueChange, collapsible, headingLevel, className, onKeyDown, ref, children, ...rest }: AccordionProps): react.JSX.Element;
|
|
36
|
+
declare namespace Accordion {
|
|
37
|
+
var displayName: string;
|
|
38
|
+
var Item: typeof AccordionItem;
|
|
39
|
+
var Trigger: typeof AccordionTrigger;
|
|
40
|
+
var Panel: typeof AccordionPanel;
|
|
41
|
+
}
|
|
42
|
+
interface AccordionItemProps extends HTMLAttributes<HTMLDivElement> {
|
|
43
|
+
value: string;
|
|
44
|
+
disabled?: boolean;
|
|
45
|
+
ref?: Ref<HTMLDivElement>;
|
|
46
|
+
children: ReactNode;
|
|
47
|
+
}
|
|
48
|
+
declare function AccordionItem({ value, disabled, className, ref, children, ...rest }: AccordionItemProps): react.JSX.Element;
|
|
49
|
+
declare namespace AccordionItem {
|
|
50
|
+
var displayName: string;
|
|
51
|
+
}
|
|
52
|
+
interface AccordionTriggerProps extends ButtonHTMLAttributes<HTMLButtonElement> {
|
|
53
|
+
ref?: Ref<HTMLButtonElement>;
|
|
54
|
+
children: ReactNode;
|
|
55
|
+
}
|
|
56
|
+
declare function AccordionTrigger({ className, onClick, ref, children, ...rest }: AccordionTriggerProps): react.DetailedReactHTMLElement<{
|
|
57
|
+
className: string | undefined;
|
|
58
|
+
}, HTMLElement>;
|
|
59
|
+
declare namespace AccordionTrigger {
|
|
60
|
+
var displayName: string;
|
|
61
|
+
}
|
|
62
|
+
interface AccordionPanelProps extends HTMLAttributes<HTMLDivElement> {
|
|
63
|
+
ref?: Ref<HTMLDivElement>;
|
|
64
|
+
children: ReactNode;
|
|
65
|
+
}
|
|
66
|
+
declare function AccordionPanel({ className, ref, children, ...rest }: AccordionPanelProps): react.JSX.Element;
|
|
67
|
+
declare namespace AccordionPanel {
|
|
68
|
+
var displayName: string;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export { Accordion, type AccordionHeadingLevel, type AccordionProps, type AccordionType };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"accordion.js"}
|
package/dist/alert.css
ADDED
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
/* src/icon/Icon.module.css */
|
|
2
|
+
@layer components {
|
|
3
|
+
.Icon_icon {
|
|
4
|
+
display: inline-flex;
|
|
5
|
+
flex: none;
|
|
6
|
+
inline-size: 1em;
|
|
7
|
+
block-size: 1em;
|
|
8
|
+
font-size: var(--icon-size-md);
|
|
9
|
+
vertical-align: middle;
|
|
10
|
+
&[data-size=sm] {
|
|
11
|
+
font-size: var(--icon-size-sm);
|
|
12
|
+
}
|
|
13
|
+
&[data-size=lg] {
|
|
14
|
+
font-size: var(--icon-size-lg);
|
|
15
|
+
}
|
|
16
|
+
&[data-size=inherit] {
|
|
17
|
+
font-size: inherit;
|
|
18
|
+
}
|
|
19
|
+
& > * {
|
|
20
|
+
inline-size: 100%;
|
|
21
|
+
block-size: 100%;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/* src/visually-hidden/VisuallyHidden.module.css */
|
|
27
|
+
@layer components {
|
|
28
|
+
.VisuallyHidden_root {
|
|
29
|
+
position: absolute;
|
|
30
|
+
inline-size: var(--visually-hidden-size);
|
|
31
|
+
block-size: var(--visually-hidden-size);
|
|
32
|
+
padding: 0;
|
|
33
|
+
margin: 0;
|
|
34
|
+
overflow: hidden;
|
|
35
|
+
clip-path: inset(50%);
|
|
36
|
+
white-space: nowrap;
|
|
37
|
+
border: 0;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/* src/spinner/Spinner.module.css */
|
|
42
|
+
@layer components {
|
|
43
|
+
.Spinner_spinner {
|
|
44
|
+
--_size: var(--spinner-size-md);
|
|
45
|
+
--_track: var(--spinner-track);
|
|
46
|
+
--_indicator: var(--spinner-indicator);
|
|
47
|
+
display: inline-flex;
|
|
48
|
+
flex: none;
|
|
49
|
+
inline-size: var(--_size);
|
|
50
|
+
block-size: var(--_size);
|
|
51
|
+
vertical-align: middle;
|
|
52
|
+
&[data-size=sm] {
|
|
53
|
+
--_size: var(--spinner-size-sm);
|
|
54
|
+
}
|
|
55
|
+
&[data-size=lg] {
|
|
56
|
+
--_size: var(--spinner-size-lg);
|
|
57
|
+
}
|
|
58
|
+
&[data-size=inherit] {
|
|
59
|
+
--_size: 1em;
|
|
60
|
+
}
|
|
61
|
+
&[data-tone=inherit] {
|
|
62
|
+
--_track: transparent;
|
|
63
|
+
--_indicator: currentcolor;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
.Spinner_ring {
|
|
67
|
+
inline-size: 100%;
|
|
68
|
+
block-size: 100%;
|
|
69
|
+
border: var(--spinner-width) solid var(--_track);
|
|
70
|
+
border-block-start-color: var(--_indicator);
|
|
71
|
+
border-radius: var(--radius-full);
|
|
72
|
+
animation: Spinner_spin var(--spinner-duration) linear infinite;
|
|
73
|
+
}
|
|
74
|
+
@keyframes Spinner_spin {
|
|
75
|
+
to {
|
|
76
|
+
rotate: 1turn;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
@media (prefers-reduced-motion: reduce) {
|
|
80
|
+
.Spinner_ring {
|
|
81
|
+
animation: none;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/* src/button/Button.module.css */
|
|
87
|
+
@layer components {
|
|
88
|
+
.Button_button {
|
|
89
|
+
display: inline-flex;
|
|
90
|
+
align-items: center;
|
|
91
|
+
justify-content: center;
|
|
92
|
+
gap: var(--button-gap);
|
|
93
|
+
min-block-size: var(--button-height-md);
|
|
94
|
+
padding-block: 0;
|
|
95
|
+
padding-inline: var(--button-padding-inline-md);
|
|
96
|
+
border: 1px solid transparent;
|
|
97
|
+
border-radius: var(--button-radius);
|
|
98
|
+
font-family: var(--button-font-family);
|
|
99
|
+
font-size: var(--button-font-size-md);
|
|
100
|
+
font-weight: var(--button-font-weight);
|
|
101
|
+
line-height: 1;
|
|
102
|
+
text-decoration: none;
|
|
103
|
+
white-space: nowrap;
|
|
104
|
+
cursor: pointer;
|
|
105
|
+
user-select: none;
|
|
106
|
+
transition:
|
|
107
|
+
background-color var(--button-motion-duration) var(--motion-easing-standard),
|
|
108
|
+
border-color var(--button-motion-duration) var(--motion-easing-standard),
|
|
109
|
+
color var(--button-motion-duration) var(--motion-easing-standard);
|
|
110
|
+
&:focus-visible {
|
|
111
|
+
outline: var(--button-focus-ring-width) solid var(--button-focus-ring);
|
|
112
|
+
outline-offset: var(--button-focus-ring-offset);
|
|
113
|
+
}
|
|
114
|
+
&:disabled,
|
|
115
|
+
&[aria-disabled=true] {
|
|
116
|
+
cursor: not-allowed;
|
|
117
|
+
opacity: 0.55;
|
|
118
|
+
}
|
|
119
|
+
&[data-loading] {
|
|
120
|
+
cursor: progress;
|
|
121
|
+
}
|
|
122
|
+
&[data-size=sm] {
|
|
123
|
+
min-block-size: var(--button-height-sm);
|
|
124
|
+
padding-inline: var(--button-padding-inline-sm);
|
|
125
|
+
font-size: var(--button-font-size-sm);
|
|
126
|
+
}
|
|
127
|
+
&[data-size=lg] {
|
|
128
|
+
min-block-size: var(--button-height-lg);
|
|
129
|
+
padding-inline: var(--button-padding-inline-lg);
|
|
130
|
+
font-size: var(--button-font-size-lg);
|
|
131
|
+
}
|
|
132
|
+
&[data-variant=primary] {
|
|
133
|
+
background-color: var(--button-primary-bg);
|
|
134
|
+
color: var(--button-primary-fg);
|
|
135
|
+
&:hover:not(:disabled, [aria-disabled=true]) {
|
|
136
|
+
background-color: var(--button-primary-bg-hover);
|
|
137
|
+
}
|
|
138
|
+
&:active:not(:disabled, [aria-disabled=true]) {
|
|
139
|
+
background-color: var(--button-primary-bg-active);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
&[data-variant=secondary] {
|
|
143
|
+
background-color: var(--button-secondary-bg);
|
|
144
|
+
border-color: var(--button-secondary-border);
|
|
145
|
+
color: var(--button-secondary-fg);
|
|
146
|
+
&:hover:not(:disabled, [aria-disabled=true]) {
|
|
147
|
+
background-color: var(--button-secondary-bg-hover);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
&[data-variant=ghost] {
|
|
151
|
+
background-color: transparent;
|
|
152
|
+
color: var(--button-ghost-fg);
|
|
153
|
+
&:hover:not(:disabled, [aria-disabled=true]) {
|
|
154
|
+
background-color: var(--button-ghost-bg-hover);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
.Button_label {
|
|
159
|
+
display: inline-block;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/* src/icon-button/IconButton.module.css */
|
|
164
|
+
@layer components {
|
|
165
|
+
.IconButton_iconButton[data-icon-only] {
|
|
166
|
+
gap: 0;
|
|
167
|
+
inline-size: var(--icon-button-size-md);
|
|
168
|
+
padding-inline: 0;
|
|
169
|
+
&[data-size=sm] {
|
|
170
|
+
inline-size: var(--icon-button-size-sm);
|
|
171
|
+
}
|
|
172
|
+
&[data-size=lg] {
|
|
173
|
+
inline-size: var(--icon-button-size-lg);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/* src/alert/Alert.module.css */
|
|
179
|
+
@layer components {
|
|
180
|
+
.Alert_alert {
|
|
181
|
+
--_bg: var(--alert-info-bg);
|
|
182
|
+
--_accent: var(--alert-info-accent);
|
|
183
|
+
--_title: var(--alert-info-title);
|
|
184
|
+
display: flex;
|
|
185
|
+
align-items: flex-start;
|
|
186
|
+
gap: var(--alert-gap);
|
|
187
|
+
padding: var(--alert-padding);
|
|
188
|
+
border: var(--alert-border-width) solid var(--_accent);
|
|
189
|
+
border-inline-start-width: var(--alert-accent-width);
|
|
190
|
+
border-radius: var(--alert-radius);
|
|
191
|
+
background-color: var(--_bg);
|
|
192
|
+
color: var(--alert-fg);
|
|
193
|
+
font-size: var(--alert-font-size);
|
|
194
|
+
&[data-tone=info] {
|
|
195
|
+
--_bg: var(--alert-info-bg);
|
|
196
|
+
--_accent: var(--alert-info-accent);
|
|
197
|
+
--_title: var(--alert-info-title);
|
|
198
|
+
}
|
|
199
|
+
&[data-tone=success] {
|
|
200
|
+
--_bg: var(--alert-success-bg);
|
|
201
|
+
--_accent: var(--alert-success-accent);
|
|
202
|
+
--_title: var(--alert-success-title);
|
|
203
|
+
}
|
|
204
|
+
&[data-tone=warning] {
|
|
205
|
+
--_bg: var(--alert-warning-bg);
|
|
206
|
+
--_accent: var(--alert-warning-accent);
|
|
207
|
+
--_title: var(--alert-warning-title);
|
|
208
|
+
}
|
|
209
|
+
&[data-tone=error] {
|
|
210
|
+
--_bg: var(--alert-error-bg);
|
|
211
|
+
--_accent: var(--alert-error-accent);
|
|
212
|
+
--_title: var(--alert-error-title);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
.Alert_icon {
|
|
216
|
+
flex: none;
|
|
217
|
+
color: var(--_accent);
|
|
218
|
+
}
|
|
219
|
+
.Alert_body {
|
|
220
|
+
display: flex;
|
|
221
|
+
flex: 1;
|
|
222
|
+
flex-direction: column;
|
|
223
|
+
gap: var(--space-1);
|
|
224
|
+
min-inline-size: 0;
|
|
225
|
+
}
|
|
226
|
+
.Alert_title {
|
|
227
|
+
margin: 0;
|
|
228
|
+
color: var(--_title);
|
|
229
|
+
font-weight: var(--alert-title-font-weight);
|
|
230
|
+
}
|
|
231
|
+
.Alert_content {
|
|
232
|
+
overflow-wrap: anywhere;
|
|
233
|
+
}
|
|
234
|
+
.Alert_action {
|
|
235
|
+
display: flex;
|
|
236
|
+
flex-wrap: wrap;
|
|
237
|
+
gap: var(--space-2);
|
|
238
|
+
margin-block-start: var(--space-1);
|
|
239
|
+
}
|
|
240
|
+
.Alert_dismiss {
|
|
241
|
+
flex: none;
|
|
242
|
+
margin-block: calc(-1 * var(--space-1));
|
|
243
|
+
margin-inline-end: calc(-1 * var(--space-2));
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/*# sourceMappingURL=alert.css.map */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/icon/Icon.module.css","../src/visually-hidden/VisuallyHidden.module.css","../src/spinner/Spinner.module.css","../src/button/Button.module.css","../src/icon-button/IconButton.module.css","../src/alert/Alert.module.css"],"sourcesContent":["/* Every value is a token (--icon-*). The child SVG fills the box; colour is currentColor. */\n\n@layer components {\n .icon {\n display: inline-flex;\n flex: none;\n inline-size: 1em;\n block-size: 1em;\n font-size: var(--icon-size-md);\n vertical-align: middle;\n\n &[data-size=\"sm\"] { font-size: var(--icon-size-sm); }\n &[data-size=\"lg\"] { font-size: var(--icon-size-lg); }\n &[data-size=\"inherit\"] { font-size: inherit; }\n\n & > * {\n inline-size: 100%;\n block-size: 100%;\n }\n }\n}\n","/* The clip-path technique: present in the accessibility tree, absent from the layout. */\n\n@layer components {\n .root {\n position: absolute;\n inline-size: var(--visually-hidden-size);\n block-size: var(--visually-hidden-size);\n padding: 0;\n margin: 0;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n }\n}\n","/* Every value is a token (--spinner-*). The ring is a border with one coloured side. */\n\n@layer components {\n .spinner {\n --_size: var(--spinner-size-md);\n --_track: var(--spinner-track);\n --_indicator: var(--spinner-indicator);\n\n display: inline-flex;\n flex: none;\n inline-size: var(--_size);\n block-size: var(--_size);\n vertical-align: middle;\n\n &[data-size=\"sm\"] { --_size: var(--spinner-size-sm); }\n &[data-size=\"lg\"] { --_size: var(--spinner-size-lg); }\n &[data-size=\"inherit\"] { --_size: 1em; }\n\n &[data-tone=\"inherit\"] {\n --_track: transparent;\n --_indicator: currentcolor;\n }\n }\n\n .ring {\n inline-size: 100%;\n block-size: 100%;\n border: var(--spinner-width) solid var(--_track);\n border-block-start-color: var(--_indicator);\n border-radius: var(--radius-full);\n animation: spin var(--spinner-duration) linear infinite;\n }\n\n @keyframes spin {\n to {\n rotate: 1turn;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .ring {\n animation: none;\n }\n }\n}\n","/*\n * Every value is a token. State is expressed through data attributes so the\n * styling hooks survive a change of styling tool, and so tests and agents can\n * read state off the DOM.\n */\n\n@layer components {\n .button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--button-gap);\n min-block-size: var(--button-height-md);\n padding-block: 0;\n padding-inline: var(--button-padding-inline-md);\n border: 1px solid transparent;\n border-radius: var(--button-radius);\n font-family: var(--button-font-family);\n font-size: var(--button-font-size-md);\n font-weight: var(--button-font-weight);\n line-height: 1;\n text-decoration: none;\n white-space: nowrap;\n cursor: pointer;\n user-select: none;\n transition:\n background-color var(--button-motion-duration) var(--motion-easing-standard),\n border-color var(--button-motion-duration) var(--motion-easing-standard),\n color var(--button-motion-duration) var(--motion-easing-standard);\n\n &:focus-visible {\n outline: var(--button-focus-ring-width) solid var(--button-focus-ring);\n outline-offset: var(--button-focus-ring-offset);\n }\n\n &:disabled,\n &[aria-disabled=\"true\"] {\n cursor: not-allowed;\n opacity: 0.55;\n }\n\n &[data-loading] {\n cursor: progress;\n }\n\n &[data-size=\"sm\"] {\n min-block-size: var(--button-height-sm);\n padding-inline: var(--button-padding-inline-sm);\n font-size: var(--button-font-size-sm);\n }\n\n &[data-size=\"lg\"] {\n min-block-size: var(--button-height-lg);\n padding-inline: var(--button-padding-inline-lg);\n font-size: var(--button-font-size-lg);\n }\n\n &[data-variant=\"primary\"] {\n background-color: var(--button-primary-bg);\n color: var(--button-primary-fg);\n\n &:hover:not(:disabled, [aria-disabled=\"true\"]) {\n background-color: var(--button-primary-bg-hover);\n }\n\n &:active:not(:disabled, [aria-disabled=\"true\"]) {\n background-color: var(--button-primary-bg-active);\n }\n }\n\n &[data-variant=\"secondary\"] {\n background-color: var(--button-secondary-bg);\n border-color: var(--button-secondary-border);\n color: var(--button-secondary-fg);\n\n &:hover:not(:disabled, [aria-disabled=\"true\"]) {\n background-color: var(--button-secondary-bg-hover);\n }\n }\n\n &[data-variant=\"ghost\"] {\n background-color: transparent;\n color: var(--button-ghost-fg);\n\n &:hover:not(:disabled, [aria-disabled=\"true\"]) {\n background-color: var(--button-ghost-bg-hover);\n }\n }\n }\n\n .label {\n display: inline-block;\n }\n}\n","/* Squares a Button. Selectors carry the data attribute so they outrank Button's own size rules. */\n\n@layer components {\n .iconButton[data-icon-only] {\n gap: 0;\n inline-size: var(--icon-button-size-md);\n padding-inline: 0;\n\n &[data-size=\"sm\"] { inline-size: var(--icon-button-size-sm); }\n &[data-size=\"lg\"] { inline-size: var(--icon-button-size-lg); }\n }\n}\n","/* Every value is a token (--alert-*). Tone resolves into private custom properties. */\n\n@layer components {\n .alert {\n --_bg: var(--alert-info-bg);\n --_accent: var(--alert-info-accent);\n --_title: var(--alert-info-title);\n\n display: flex;\n align-items: flex-start;\n gap: var(--alert-gap);\n padding: var(--alert-padding);\n border: var(--alert-border-width) solid var(--_accent);\n border-inline-start-width: var(--alert-accent-width);\n border-radius: var(--alert-radius);\n background-color: var(--_bg);\n color: var(--alert-fg);\n font-size: var(--alert-font-size);\n\n &[data-tone=\"info\"] {\n --_bg: var(--alert-info-bg);\n --_accent: var(--alert-info-accent);\n --_title: var(--alert-info-title);\n }\n\n &[data-tone=\"success\"] {\n --_bg: var(--alert-success-bg);\n --_accent: var(--alert-success-accent);\n --_title: var(--alert-success-title);\n }\n\n &[data-tone=\"warning\"] {\n --_bg: var(--alert-warning-bg);\n --_accent: var(--alert-warning-accent);\n --_title: var(--alert-warning-title);\n }\n\n &[data-tone=\"error\"] {\n --_bg: var(--alert-error-bg);\n --_accent: var(--alert-error-accent);\n --_title: var(--alert-error-title);\n }\n }\n\n .icon {\n flex: none;\n color: var(--_accent);\n }\n\n .body {\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: var(--space-1);\n min-inline-size: 0;\n }\n\n .title {\n margin: 0;\n color: var(--_title);\n font-weight: var(--alert-title-font-weight);\n }\n\n .content {\n overflow-wrap: anywhere;\n }\n\n .action {\n display: flex;\n flex-wrap: wrap;\n gap: var(--space-2);\n margin-block-start: var(--space-1);\n }\n\n .dismiss {\n flex: none;\n margin-block: calc(-1 * var(--space-1));\n margin-inline-end: calc(-1 * var(--space-2));\n }\n}\n"],"mappings":"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","names":["icon","root","spinner","ring","spin","button","label","iconButton","alert","icon","body","title","content","action","dismiss"]}
|
package/dist/alert.d.ts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { HTMLAttributes, ReactNode, Ref } from 'react';
|
|
3
|
+
|
|
4
|
+
type AlertTone = 'info' | 'success' | 'warning' | 'error';
|
|
5
|
+
type AlertLive = 'polite' | 'assertive' | 'off';
|
|
6
|
+
interface AlertProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {
|
|
7
|
+
/** @default 'info' */
|
|
8
|
+
tone?: AlertTone;
|
|
9
|
+
title?: ReactNode;
|
|
10
|
+
/** Replaces the tone's default glyph; `null` shows none. */
|
|
11
|
+
icon?: ReactNode | null;
|
|
12
|
+
/** Buttons or links placed under the body. */
|
|
13
|
+
action?: ReactNode;
|
|
14
|
+
/** Renders a dismiss button that calls this. */
|
|
15
|
+
onDismiss?: () => void;
|
|
16
|
+
/** @default 'Dismiss' */
|
|
17
|
+
dismissLabel?: string;
|
|
18
|
+
/**
|
|
19
|
+
* How assistive technology announces it: `assertive` (`role="alert"`),
|
|
20
|
+
* `polite` (`role="status"`) or `off` (no live role, for content present at
|
|
21
|
+
* page load or inside another live region). Defaults to assertive for
|
|
22
|
+
* `error`, polite otherwise.
|
|
23
|
+
*/
|
|
24
|
+
live?: AlertLive;
|
|
25
|
+
ref?: Ref<HTMLDivElement>;
|
|
26
|
+
children?: ReactNode;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* An inline message with a tone. Tint, accent and title colour come from
|
|
30
|
+
* the status tokens; the body keeps the default text colour so long
|
|
31
|
+
* messages stay readable. Toast renders one Alert per notification.
|
|
32
|
+
*
|
|
33
|
+
* @status stable
|
|
34
|
+
* @category Feedback
|
|
35
|
+
* @accessibility `role="alert"` for `tone="error"` (assertive), `role="status"` otherwise (polite); `live="off"` opts out. The glyph is decorative; the tone is carried by the title and text, never by colour alone.
|
|
36
|
+
* @do Give it a `title` when the body is more than one sentence.
|
|
37
|
+
* Use `onDismiss` for messages the user can act on and clear.
|
|
38
|
+
* @dont Announce errors through both an Alert and a Toast.
|
|
39
|
+
* Use it as a page-level banner for marketing copy.
|
|
40
|
+
*/
|
|
41
|
+
declare function Alert({ tone, title, icon, action, onDismiss, dismissLabel, live, className, ref, children, ...rest }: AlertProps): react.JSX.Element;
|
|
42
|
+
declare namespace Alert {
|
|
43
|
+
var displayName: string;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export { Alert, type AlertLive, type AlertProps, type AlertTone };
|
package/dist/alert.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { Alert } from './chunk-PM4YO67Q.js';
|
|
2
|
+
import './chunk-FXRSZUDH.js';
|
|
3
|
+
import './chunk-KPQGS4PG.js';
|
|
4
|
+
import './chunk-I4KC4V6A.js';
|
|
5
|
+
import './chunk-ZVDN3GRI.js';
|
|
6
|
+
import './chunk-Z4PN6B2C.js';
|
|
7
|
+
import './chunk-ASNTNTJW.js';
|
|
8
|
+
import './chunk-MI4QUKQS.js';
|
|
9
|
+
//# sourceMappingURL=alert.js.map
|
|
10
|
+
//# sourceMappingURL=alert.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"alert.js"}
|