@pearpages/pulp-react 0.2.2 → 0.3.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 +14 -0
- package/dist/accordion.js +1 -1
- package/dist/alert.css +18 -0
- package/dist/alert.css.map +1 -1
- package/dist/alert.js +4 -4
- package/dist/avatar.css +46 -0
- package/dist/avatar.css.map +1 -0
- package/dist/avatar.d.ts +41 -0
- package/dist/avatar.js +5 -0
- package/dist/avatar.js.map +1 -0
- package/dist/badge.css +37 -0
- package/dist/badge.css.map +1 -1
- package/dist/badge.d.ts +22 -5
- package/dist/badge.js +2 -1
- package/dist/button.css +18 -0
- package/dist/button.css.map +1 -1
- package/dist/button.d.ts +11 -2
- package/dist/button.js +2 -2
- package/dist/calendar.js +1 -1
- package/dist/card.js +2 -2
- package/dist/checkbox.js +4 -4
- package/dist/chip.css +95 -0
- package/dist/chip.css.map +1 -0
- package/dist/chip.d.ts +43 -0
- package/dist/chip.js +4 -0
- package/dist/chip.js.map +1 -0
- package/dist/{chunk-N6E2E2OY.js → chunk-2NVC3C7K.js} +3 -3
- package/dist/{chunk-N6E2E2OY.js.map → chunk-2NVC3C7K.js.map} +1 -1
- package/dist/{chunk-MF66ICX6.js → chunk-56RSH7GQ.js} +3 -3
- package/dist/{chunk-MF66ICX6.js.map → chunk-56RSH7GQ.js.map} +1 -1
- package/dist/chunk-5TYCIBLW.js +27 -0
- package/dist/chunk-5TYCIBLW.js.map +1 -0
- package/dist/chunk-7O6FTCZL.js +101 -0
- package/dist/chunk-7O6FTCZL.js.map +1 -0
- package/dist/{chunk-N4C3NQIN.js → chunk-A7TMFEQ2.js} +3 -3
- package/dist/{chunk-N4C3NQIN.js.map → chunk-A7TMFEQ2.js.map} +1 -1
- package/dist/{chunk-2NSQPN7S.js → chunk-AZAI4OVR.js} +3 -3
- package/dist/{chunk-2NSQPN7S.js.map → chunk-AZAI4OVR.js.map} +1 -1
- package/dist/{chunk-DVZ46GQN.js → chunk-CLE2QGCU.js} +3 -3
- package/dist/{chunk-DVZ46GQN.js.map → chunk-CLE2QGCU.js.map} +1 -1
- package/dist/{chunk-5TTYVQ6Q.js → chunk-DE67ECD7.js} +5 -3
- package/dist/chunk-DE67ECD7.js.map +1 -0
- package/dist/{chunk-BAPNIZDV.js → chunk-F2YI5N4L.js} +3 -3
- package/dist/chunk-F2YI5N4L.js.map +1 -0
- package/dist/{chunk-U3N3G2UA.js → chunk-FFCEY76B.js} +10 -5
- package/dist/chunk-FFCEY76B.js.map +1 -0
- package/dist/{chunk-XWPXW46D.js → chunk-GWTHITZO.js} +3 -3
- package/dist/{chunk-XWPXW46D.js.map → chunk-GWTHITZO.js.map} +1 -1
- package/dist/chunk-HDC2IQV2.js +34 -0
- package/dist/chunk-HDC2IQV2.js.map +1 -0
- package/dist/{chunk-VQN5DQP6.js → chunk-HKNIEQ2V.js} +4 -4
- package/dist/{chunk-VQN5DQP6.js.map → chunk-HKNIEQ2V.js.map} +1 -1
- package/dist/{chunk-LA3YBXCR.js → chunk-HPQ462R5.js} +3 -3
- package/dist/{chunk-LA3YBXCR.js.map → chunk-HPQ462R5.js.map} +1 -1
- package/dist/chunk-KSLKNWWM.js +28 -0
- package/dist/chunk-KSLKNWWM.js.map +1 -0
- package/dist/chunk-OKA2PLDV.js +85 -0
- package/dist/chunk-OKA2PLDV.js.map +1 -0
- package/dist/{chunk-6BIEW4WJ.js → chunk-Q6SYKNZ5.js} +3 -3
- package/dist/{chunk-6BIEW4WJ.js.map → chunk-Q6SYKNZ5.js.map} +1 -1
- package/dist/chunk-QID6YYFF.js +33 -0
- package/dist/chunk-QID6YYFF.js.map +1 -0
- package/dist/{chunk-ZVDN3GRI.js → chunk-QJG5ILK5.js} +3 -3
- package/dist/{chunk-ZVDN3GRI.js.map → chunk-QJG5ILK5.js.map} +1 -1
- package/dist/chunk-QXHSA4QD.js +43 -0
- package/dist/chunk-QXHSA4QD.js.map +1 -0
- package/dist/chunk-S632WN4W.js +106 -0
- package/dist/chunk-S632WN4W.js.map +1 -0
- package/dist/{chunk-OFFFRIJG.js → chunk-SDIK6VSC.js} +3 -3
- package/dist/{chunk-OFFFRIJG.js.map → chunk-SDIK6VSC.js.map} +1 -1
- package/dist/{chunk-M5VL22MY.js → chunk-SXMORGSG.js} +3 -3
- package/dist/{chunk-M5VL22MY.js.map → chunk-SXMORGSG.js.map} +1 -1
- package/dist/{chunk-Z6SS4G4V.js → chunk-UMK4D234.js} +3 -3
- package/dist/{chunk-Z6SS4G4V.js.map → chunk-UMK4D234.js.map} +1 -1
- package/dist/{chunk-5PYLJQJX.js → chunk-VS2HPJIX.js} +3 -3
- package/dist/{chunk-5PYLJQJX.js.map → chunk-VS2HPJIX.js.map} +1 -1
- package/dist/{chunk-NOUUOH4R.js → chunk-WDIFWMKE.js} +3 -3
- package/dist/chunk-WDIFWMKE.js.map +1 -0
- package/dist/chunk-Y7KC2FDU.js +88 -0
- package/dist/chunk-Y7KC2FDU.js.map +1 -0
- package/dist/{chunk-OFKSU77Y.js → chunk-ZEVQQQOA.js} +3 -3
- package/dist/{chunk-OFKSU77Y.js.map → chunk-ZEVQQQOA.js.map} +1 -1
- package/dist/combobox.css +3 -0
- package/dist/combobox.css.map +1 -1
- package/dist/combobox.js +2 -2
- package/dist/component-manifest.json +679 -8
- package/dist/date-picker.js +1 -1
- package/dist/dialog.js +1 -1
- package/dist/divider.css +37 -0
- package/dist/divider.css.map +1 -0
- package/dist/divider.d.ts +35 -0
- package/dist/divider.js +4 -0
- package/dist/divider.js.map +1 -0
- package/dist/empty-state.css +175 -0
- package/dist/empty-state.css.map +1 -0
- package/dist/empty-state.d.ts +40 -0
- package/dist/empty-state.js +7 -0
- package/dist/empty-state.js.map +1 -0
- package/dist/field.js +2 -2
- package/dist/icon-button.css +18 -0
- package/dist/icon-button.css.map +1 -1
- package/dist/icon-button.js +3 -3
- package/dist/index.css +489 -0
- package/dist/index.css.map +1 -1
- package/dist/index.d.ts +8 -2
- package/dist/index.js +38 -32
- package/dist/link.css +35 -0
- package/dist/link.css.map +1 -0
- package/dist/link.d.ts +37 -0
- package/dist/link.js +5 -0
- package/dist/link.js.map +1 -0
- package/dist/listbox.js +1 -1
- package/dist/menu.js +2 -2
- package/dist/pagination.css +18 -0
- package/dist/pagination.css.map +1 -1
- package/dist/pagination.js +4 -4
- package/dist/picker.css +3 -0
- package/dist/picker.css.map +1 -1
- package/dist/picker.js +2 -2
- package/dist/popover.js +2 -2
- package/dist/radio.js +3 -3
- package/dist/segmented-control.css +111 -0
- package/dist/segmented-control.css.map +1 -0
- package/dist/segmented-control.d.ts +90 -0
- package/dist/segmented-control.js +5 -0
- package/dist/segmented-control.js.map +1 -0
- package/dist/select.js +3 -3
- package/dist/sheet.css +28 -0
- package/dist/sheet.css.map +1 -1
- package/dist/sheet.d.ts +9 -2
- package/dist/sheet.js +1 -1
- package/dist/slider.js +1 -1
- package/dist/switch.js +4 -4
- package/dist/table.js +1 -1
- package/dist/tabs.js +1 -1
- package/dist/text-field.css +63 -0
- package/dist/text-field.css.map +1 -1
- package/dist/text-field.d.ts +15 -2
- package/dist/text-field.js +3 -3
- package/dist/textarea.js +3 -3
- package/dist/toast.css +18 -0
- package/dist/toast.css.map +1 -1
- package/dist/toast.d.ts +21 -3
- package/dist/toast.js +5 -5
- package/dist/tooltip.js +2 -2
- package/package.json +36 -6
- package/dist/chunk-5TTYVQ6Q.js.map +0 -1
- package/dist/chunk-737GQSOB.js +0 -19
- package/dist/chunk-737GQSOB.js.map +0 -1
- package/dist/chunk-BAPNIZDV.js.map +0 -1
- package/dist/chunk-IFIQLIA3.js +0 -48
- package/dist/chunk-IFIQLIA3.js.map +0 -1
- package/dist/chunk-NOUUOH4R.js.map +0 -1
- package/dist/chunk-TJJBCS3N.js +0 -28
- package/dist/chunk-TJJBCS3N.js.map +0 -1
- package/dist/chunk-U3N3G2UA.js.map +0 -1
package/README.md
CHANGED
|
@@ -89,6 +89,20 @@ bundler loads first; importing `@pearpages/pulp-css` first stays the recommended
|
|
|
89
89
|
Then mount `DialogSystem` once near the root. Without the stylesheet a dialog opens unstyled; if
|
|
90
90
|
you never render a `Dialog`, skip it.
|
|
91
91
|
|
|
92
|
+
## React Server Components
|
|
93
|
+
|
|
94
|
+
Every entry that needs the browser ships with `'use client'` as its first statement, so on the
|
|
95
|
+
Next.js App Router (or any RSC setup) you import pulp from a server file and it works: the client
|
|
96
|
+
entries become client boundaries on their own. The leaf, hook-free entries carry no directive and
|
|
97
|
+
render on the server as they are: Text, Heading, Stack, Inline, Card, Divider, Badge, Skeleton,
|
|
98
|
+
Spinner, Progress, Icon, VisuallyHidden, Link, Button, IconButton, Alert, Pagination, EmptyState
|
|
99
|
+
(the `client` field of the component manifest is the list). Two things to know:
|
|
100
|
+
|
|
101
|
+
- The barrel (`@pearpages/pulp-react`) is a client module, because it re-exports everything. Import
|
|
102
|
+
from the per-component entries (`@pearpages/pulp-react/text`) to keep server-safe ones on the server.
|
|
103
|
+
- A function cannot cross from a server file into any component, pulp's or not. `<Button asChild>`
|
|
104
|
+
around a link is fine in a Server Component; `<Button onClick={…}>` belongs in a client file.
|
|
105
|
+
|
|
92
106
|
## For tooling and coding agents
|
|
93
107
|
|
|
94
108
|
`@pearpages/pulp-react/component-manifest.json` lists every component with its status, category,
|
package/dist/accordion.js
CHANGED
package/dist/alert.css
CHANGED
|
@@ -160,6 +160,24 @@
|
|
|
160
160
|
}
|
|
161
161
|
}
|
|
162
162
|
}
|
|
163
|
+
.Button_button[data-tone=danger] {
|
|
164
|
+
&[data-variant=primary] {
|
|
165
|
+
background-color: var(--button-danger-bg);
|
|
166
|
+
color: var(--button-danger-fg);
|
|
167
|
+
&:hover:not(:disabled, [aria-disabled=true]) {
|
|
168
|
+
background-color: var(--button-danger-bg-hover);
|
|
169
|
+
}
|
|
170
|
+
&:active:not(:disabled, [aria-disabled=true]) {
|
|
171
|
+
background-color: var(--button-danger-bg-active);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
&:is([data-variant=secondary], [data-variant=ghost]) {
|
|
175
|
+
color: var(--button-danger-text);
|
|
176
|
+
&:hover:not(:disabled, [aria-disabled=true]) {
|
|
177
|
+
background-color: var(--button-danger-quiet-bg-hover);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
163
181
|
.Button_label {
|
|
164
182
|
display: inline-block;
|
|
165
183
|
}
|
package/dist/alert.css.map
CHANGED
|
@@ -1 +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 reset, tokens, vendor, base, components, utilities;\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 reset, tokens, vendor, base, components, utilities;\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 reset, tokens, vendor, base, components, utilities;\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 reset, tokens, vendor, base, components, utilities;\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 -webkit-user-select: none;\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 reset, tokens, vendor, base, components, utilities;\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 reset, tokens, vendor, base, components, utilities;\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"]}
|
|
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 reset, tokens, vendor, base, components, utilities;\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 reset, tokens, vendor, base, components, utilities;\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 reset, tokens, vendor, base, components, utilities;\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 reset, tokens, vendor, base, components, utilities;\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 -webkit-user-select: none;\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 /* tone=\"danger\", after the variants so it wins at equal specificity plus one attribute. */\n .button[data-tone=\"danger\"] {\n &[data-variant=\"primary\"] {\n background-color: var(--button-danger-bg);\n color: var(--button-danger-fg);\n\n &:hover:not(:disabled, [aria-disabled=\"true\"]) {\n background-color: var(--button-danger-bg-hover);\n }\n\n &:active:not(:disabled, [aria-disabled=\"true\"]) {\n background-color: var(--button-danger-bg-active);\n }\n }\n\n &:is([data-variant=\"secondary\"], [data-variant=\"ghost\"]) {\n color: var(--button-danger-text);\n\n &:hover:not(:disabled, [aria-disabled=\"true\"]) {\n background-color: var(--button-danger-quiet-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 reset, tokens, vendor, base, components, utilities;\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 reset, tokens, vendor, base, components, utilities;\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.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
export { Alert } from './chunk-
|
|
2
|
-
import './chunk-
|
|
3
|
-
import './chunk-
|
|
1
|
+
export { Alert } from './chunk-A7TMFEQ2.js';
|
|
2
|
+
import './chunk-56RSH7GQ.js';
|
|
3
|
+
import './chunk-DE67ECD7.js';
|
|
4
4
|
import './chunk-ZL5MMRLG.js';
|
|
5
|
-
import './chunk-ZVDN3GRI.js';
|
|
6
5
|
import './chunk-IB5UUE3S.js';
|
|
7
6
|
import './chunk-O5LII5XP.js';
|
|
7
|
+
import './chunk-QJG5ILK5.js';
|
|
8
8
|
import './chunk-MI4QUKQS.js';
|
|
9
9
|
//# sourceMappingURL=alert.js.map
|
|
10
10
|
//# sourceMappingURL=alert.js.map
|
package/dist/avatar.css
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/* src/avatar/Avatar.module.css */
|
|
2
|
+
@layer reset, tokens, vendor, base, components, utilities;
|
|
3
|
+
@layer components {
|
|
4
|
+
.Avatar_root {
|
|
5
|
+
display: inline-flex;
|
|
6
|
+
flex: none;
|
|
7
|
+
align-items: center;
|
|
8
|
+
justify-content: center;
|
|
9
|
+
inline-size: var(--avatar-size-md);
|
|
10
|
+
block-size: var(--avatar-size-md);
|
|
11
|
+
overflow: hidden;
|
|
12
|
+
box-sizing: border-box;
|
|
13
|
+
border-radius: var(--avatar-radius);
|
|
14
|
+
background: var(--avatar-bg);
|
|
15
|
+
color: var(--avatar-fg);
|
|
16
|
+
font-family: var(--font-family-body);
|
|
17
|
+
font-size: var(--avatar-font-size-md);
|
|
18
|
+
font-weight: var(--avatar-weight);
|
|
19
|
+
line-height: 1;
|
|
20
|
+
vertical-align: middle;
|
|
21
|
+
&[data-fallback] {
|
|
22
|
+
border: var(--avatar-border-width) solid var(--avatar-border);
|
|
23
|
+
}
|
|
24
|
+
&[data-size=sm] {
|
|
25
|
+
inline-size: var(--avatar-size-sm);
|
|
26
|
+
block-size: var(--avatar-size-sm);
|
|
27
|
+
font-size: var(--avatar-font-size-sm);
|
|
28
|
+
}
|
|
29
|
+
&[data-size=lg] {
|
|
30
|
+
inline-size: var(--avatar-size-lg);
|
|
31
|
+
block-size: var(--avatar-size-lg);
|
|
32
|
+
font-size: var(--avatar-font-size-lg);
|
|
33
|
+
}
|
|
34
|
+
&[data-size=xl] {
|
|
35
|
+
inline-size: var(--avatar-size-xl);
|
|
36
|
+
block-size: var(--avatar-size-xl);
|
|
37
|
+
font-size: var(--avatar-font-size-xl);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
.Avatar_image {
|
|
41
|
+
inline-size: 100%;
|
|
42
|
+
block-size: 100%;
|
|
43
|
+
object-fit: cover;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/*# sourceMappingURL=avatar.css.map */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/avatar/Avatar.module.css"],"sourcesContent":["/* Every value is a token: --avatar-* in packages/tokens/tokens/component/avatar.json */\n\n@layer reset, tokens, vendor, base, components, utilities;\n\n@layer components {\n .root {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n inline-size: var(--avatar-size-md);\n block-size: var(--avatar-size-md);\n overflow: hidden;\n box-sizing: border-box;\n border-radius: var(--avatar-radius);\n background: var(--avatar-bg);\n color: var(--avatar-fg);\n font-family: var(--font-family-body);\n font-size: var(--avatar-font-size-md);\n font-weight: var(--avatar-weight);\n line-height: 1;\n vertical-align: middle;\n\n /* Initials only: a picture has its own edge. */\n &[data-fallback] {\n border: var(--avatar-border-width) solid var(--avatar-border);\n }\n\n &[data-size='sm'] {\n inline-size: var(--avatar-size-sm);\n block-size: var(--avatar-size-sm);\n font-size: var(--avatar-font-size-sm);\n }\n\n &[data-size='lg'] {\n inline-size: var(--avatar-size-lg);\n block-size: var(--avatar-size-lg);\n font-size: var(--avatar-font-size-lg);\n }\n\n &[data-size='xl'] {\n inline-size: var(--avatar-size-xl);\n block-size: var(--avatar-size-xl);\n font-size: var(--avatar-font-size-xl);\n }\n }\n\n .image {\n inline-size: 100%;\n block-size: 100%;\n object-fit: cover;\n }\n}\n"],"mappings":";AAEA;AAEA;AACE,GAACA;AACC,aAAS;AACT,UAAM;AACN,iBAAa;AACb,qBAAiB;AACjB,iBAAa,IAAI;AACjB,gBAAY,IAAI;AAChB,cAAU;AACV,gBAAY;AACZ,mBAAe,IAAI;AACnB,gBAAY,IAAI;AAChB,WAAO,IAAI;AACX,iBAAa,IAAI;AACjB,eAAW,IAAI;AACf,iBAAa,IAAI;AACjB,iBAAa;AACb,oBAAgB;AAGhB,KAAC,CAAC;AACA,cAAQ,IAAI,uBAAuB,MAAM,IAAI;AAC/C;AAEA,KAAC,CAAC;AACA,mBAAa,IAAI;AACjB,kBAAY,IAAI;AAChB,iBAAW,IAAI;AACjB;AAEA,KAAC,CAAC;AACA,mBAAa,IAAI;AACjB,kBAAY,IAAI;AAChB,iBAAW,IAAI;AACjB;AAEA,KAAC,CAAC;AACA,mBAAa,IAAI;AACjB,kBAAY,IAAI;AAChB,iBAAW,IAAI;AACjB;AACF;AAEA,GAACC;AACC,iBAAa;AACb,gBAAY;AACZ,gBAAY;AACd;AACF;","names":["root","image"]}
|
package/dist/avatar.d.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { HTMLAttributes, ReactElement, Ref } from 'react';
|
|
3
|
+
|
|
4
|
+
type AvatarSize = 'sm' | 'md' | 'lg' | 'xl';
|
|
5
|
+
interface AvatarProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'children'> {
|
|
6
|
+
/** The person's name. Its initials show when there is no image or the image fails, and it names the avatar unless `alt` does. */
|
|
7
|
+
name?: string;
|
|
8
|
+
/** Image URL. Ignored when an image element is passed as the child. */
|
|
9
|
+
src?: string;
|
|
10
|
+
/** Accessible name. Defaults to `name`. Pass `""` next to the visible name, so it is not read twice. */
|
|
11
|
+
alt?: string;
|
|
12
|
+
/** `sm` and `md` match the control heights, so an avatar lines up with a button. @default 'md' */
|
|
13
|
+
size?: AvatarSize;
|
|
14
|
+
/**
|
|
15
|
+
* An image element to use instead of `img`: a framework's image component
|
|
16
|
+
* (`<Avatar name="Ana"><Image src={url} alt="" width={40} height={40} /></Avatar>`).
|
|
17
|
+
* It receives the styles and the error handling; its own `alt` is replaced by the avatar's.
|
|
18
|
+
*/
|
|
19
|
+
children?: ReactElement;
|
|
20
|
+
ref?: Ref<HTMLSpanElement>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* A person, as a picture or as initials. The initials take over when no image
|
|
24
|
+
* is given and when the image fails to load, so a broken URL never shows a
|
|
25
|
+
* broken-image glyph. Every value comes from `--avatar-*` tokens; the
|
|
26
|
+
* background is one token for everyone, not a colour computed from the name.
|
|
27
|
+
*
|
|
28
|
+
* @status experimental
|
|
29
|
+
* @category Utilities
|
|
30
|
+
* @accessibility With an image, the `img` carries the name as its `alt`. With initials, the root is `role="img"` named by `alt` or `name`, and the letters are hidden from assistive technology ("AR" read aloud means nothing). `alt=""` makes the avatar decorative (`aria-hidden`): use it when the name is written next to it. Not focusable and not interactive; wrap it in a Link or a Button to make it one.
|
|
31
|
+
* @do Pass `name` always, even with an image: it is the fallback when the image fails.
|
|
32
|
+
* @do Pass `alt=""` when the person's name is visible beside the avatar.
|
|
33
|
+
* @dont Colour avatars per person from a hash of the name; the colours will not be tokens and will not pass contrast in both schemes.
|
|
34
|
+
* @dont Use it for a logo or an illustration; it crops to a circle and falls back to initials.
|
|
35
|
+
*/
|
|
36
|
+
declare function Avatar({ name, src, alt, size, className, ref, children, ...rest }: AvatarProps): react.JSX.Element;
|
|
37
|
+
declare namespace Avatar {
|
|
38
|
+
var displayName: string;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export { Avatar, type AvatarProps };
|
package/dist/avatar.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"avatar.js"}
|
package/dist/badge.css
CHANGED
|
@@ -24,6 +24,22 @@
|
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
+
/* src/visually-hidden/VisuallyHidden.module.css */
|
|
28
|
+
@layer reset, tokens, vendor, base, components, utilities;
|
|
29
|
+
@layer components {
|
|
30
|
+
.VisuallyHidden_root {
|
|
31
|
+
position: absolute;
|
|
32
|
+
inline-size: var(--visually-hidden-size);
|
|
33
|
+
block-size: var(--visually-hidden-size);
|
|
34
|
+
padding: 0;
|
|
35
|
+
margin: 0;
|
|
36
|
+
overflow: hidden;
|
|
37
|
+
clip-path: inset(50%);
|
|
38
|
+
white-space: nowrap;
|
|
39
|
+
border: 0;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
27
43
|
/* src/badge/Badge.module.css */
|
|
28
44
|
@layer reset, tokens, vendor, base, components, utilities;
|
|
29
45
|
@layer components {
|
|
@@ -87,5 +103,26 @@
|
|
|
87
103
|
--_fg: var(--badge-error-subtle-fg);
|
|
88
104
|
}
|
|
89
105
|
}
|
|
106
|
+
.Badge_badge[data-variant=dot] {
|
|
107
|
+
inline-size: var(--badge-dot-size);
|
|
108
|
+
block-size: var(--badge-dot-size);
|
|
109
|
+
padding: 0;
|
|
110
|
+
vertical-align: middle;
|
|
111
|
+
}
|
|
112
|
+
.Badge_badge[data-tone=neutral][data-variant=dot] {
|
|
113
|
+
--_bg: var(--badge-neutral-solid-bg);
|
|
114
|
+
}
|
|
115
|
+
.Badge_badge[data-tone=info][data-variant=dot] {
|
|
116
|
+
--_bg: var(--badge-info-solid-bg);
|
|
117
|
+
}
|
|
118
|
+
.Badge_badge[data-tone=success][data-variant=dot] {
|
|
119
|
+
--_bg: var(--badge-success-solid-bg);
|
|
120
|
+
}
|
|
121
|
+
.Badge_badge[data-tone=warning][data-variant=dot] {
|
|
122
|
+
--_bg: var(--badge-warning-solid-bg);
|
|
123
|
+
}
|
|
124
|
+
.Badge_badge[data-tone=error][data-variant=dot] {
|
|
125
|
+
--_bg: var(--badge-error-solid-bg);
|
|
126
|
+
}
|
|
90
127
|
}
|
|
91
128
|
/*# sourceMappingURL=badge.css.map */
|
package/dist/badge.css.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/icon/Icon.module.css","../src/badge/Badge.module.css"],"sourcesContent":["/* Every value is a token (--icon-*). The child SVG fills the box; colour is currentColor. */\n\n@layer reset, tokens, vendor, base, components, utilities;\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 (--badge-*). Tone × variant resolve into private custom properties. */\n\n@layer reset, tokens, vendor, base, components, utilities;\n\n@layer components {\n .badge {\n --_bg: var(--badge-neutral-subtle-bg);\n --_fg: var(--badge-neutral-subtle-fg);\n\n display: inline-flex;\n align-items: center;\n gap: var(--badge-gap);\n padding-block: var(--badge-padding-block);\n padding-inline: var(--badge-padding-inline-md);\n border-radius: var(--badge-radius);\n background-color: var(--_bg);\n color: var(--_fg);\n font-size: var(--badge-font-size-md);\n font-weight: var(--badge-font-weight);\n line-height: var(--badge-line-height);\n white-space: nowrap;\n\n &[data-size=\"sm\"] {\n padding-inline: var(--badge-padding-inline-sm);\n font-size: var(--badge-font-size-sm);\n }\n\n &[data-tone=\"neutral\"][data-variant=\"solid\"] {\n --_bg: var(--badge-neutral-solid-bg);\n --_fg: var(--badge-neutral-solid-fg);\n }\n\n &[data-tone=\"neutral\"][data-variant=\"subtle\"] {\n --_bg: var(--badge-neutral-subtle-bg);\n --_fg: var(--badge-neutral-subtle-fg);\n }\n\n &[data-tone=\"info\"][data-variant=\"solid\"] {\n --_bg: var(--badge-info-solid-bg);\n --_fg: var(--badge-info-solid-fg);\n }\n\n &[data-tone=\"info\"][data-variant=\"subtle\"] {\n --_bg: var(--badge-info-subtle-bg);\n --_fg: var(--badge-info-subtle-fg);\n }\n\n &[data-tone=\"success\"][data-variant=\"solid\"] {\n --_bg: var(--badge-success-solid-bg);\n --_fg: var(--badge-success-solid-fg);\n }\n\n &[data-tone=\"success\"][data-variant=\"subtle\"] {\n --_bg: var(--badge-success-subtle-bg);\n --_fg: var(--badge-success-subtle-fg);\n }\n\n &[data-tone=\"warning\"][data-variant=\"solid\"] {\n --_bg: var(--badge-warning-solid-bg);\n --_fg: var(--badge-warning-solid-fg);\n }\n\n &[data-tone=\"warning\"][data-variant=\"subtle\"] {\n --_bg: var(--badge-warning-subtle-bg);\n --_fg: var(--badge-warning-subtle-fg);\n }\n\n &[data-tone=\"error\"][data-variant=\"solid\"] {\n --_bg: var(--badge-error-solid-bg);\n --_fg: var(--badge-error-solid-fg);\n }\n\n &[data-tone=\"error\"][data-variant=\"subtle\"] {\n --_bg: var(--badge-error-subtle-bg);\n --_fg: var(--badge-error-subtle-fg);\n }\n }\n}\n"],"mappings":";AAEA;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;;;ACpBA;AAEA;AACE,GAACC;AACC,WAAO,IAAI;AACX,WAAO,IAAI;AAEX,aAAS;AACT,iBAAa;AACb,SAAK,IAAI;AACT,mBAAe,IAAI;AACnB,oBAAgB,IAAI;AACpB,mBAAe,IAAI;AACnB,sBAAkB,IAAI;AACtB,WAAO,IAAI;AACX,eAAW,IAAI;AACf,iBAAa,IAAI;AACjB,iBAAa,IAAI;AACjB,iBAAa;AAEb,KAAC,CAAC;AACA,sBAAgB,IAAI;AACpB,iBAAW,IAAI;AACjB;AAEA,KAAC,CAAC,kBAAoB,CAAC;AACrB,aAAO,IAAI;AACX,aAAO,IAAI;AACb;AAEA,KAAC,CAAC,kBAAoB,CAAC;AACrB,aAAO,IAAI;AACX,aAAO,IAAI;AACb;AAEA,KAAC,CAAC,eAAiB,CAAC;AAClB,aAAO,IAAI;AACX,aAAO,IAAI;AACb;AAEA,KAAC,CAAC,eAAiB,CAAC;AAClB,aAAO,IAAI;AACX,aAAO,IAAI;AACb;AAEA,KAAC,CAAC,kBAAoB,CAAC;AACrB,aAAO,IAAI;AACX,aAAO,IAAI;AACb;AAEA,KAAC,CAAC,kBAAoB,CAAC;AACrB,aAAO,IAAI;AACX,aAAO,IAAI;AACb;AAEA,KAAC,CAAC,kBAAoB,CAAC;AACrB,aAAO,IAAI;AACX,aAAO,IAAI;AACb;AAEA,KAAC,CAAC,kBAAoB,CAAC;AACrB,aAAO,IAAI;AACX,aAAO,IAAI;AACb;AAEA,KAAC,CAAC,gBAAkB,CAAC;AACnB,aAAO,IAAI;AACX,aAAO,IAAI;AACb;AAEA,KAAC,CAAC,gBAAkB,CAAC;AACnB,aAAO,IAAI;AACX,aAAO,IAAI;AACb;AACF;AACF;","names":["icon","badge"]}
|
|
1
|
+
{"version":3,"sources":["../src/icon/Icon.module.css","../src/visually-hidden/VisuallyHidden.module.css","../src/badge/Badge.module.css"],"sourcesContent":["/* Every value is a token (--icon-*). The child SVG fills the box; colour is currentColor. */\n\n@layer reset, tokens, vendor, base, components, utilities;\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 reset, tokens, vendor, base, components, utilities;\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 (--badge-*). Tone × variant resolve into private custom properties. */\n\n@layer reset, tokens, vendor, base, components, utilities;\n\n@layer components {\n .badge {\n --_bg: var(--badge-neutral-subtle-bg);\n --_fg: var(--badge-neutral-subtle-fg);\n\n display: inline-flex;\n align-items: center;\n gap: var(--badge-gap);\n padding-block: var(--badge-padding-block);\n padding-inline: var(--badge-padding-inline-md);\n border-radius: var(--badge-radius);\n background-color: var(--_bg);\n color: var(--_fg);\n font-size: var(--badge-font-size-md);\n font-weight: var(--badge-font-weight);\n line-height: var(--badge-line-height);\n white-space: nowrap;\n\n &[data-size=\"sm\"] {\n padding-inline: var(--badge-padding-inline-sm);\n font-size: var(--badge-font-size-sm);\n }\n\n &[data-tone=\"neutral\"][data-variant=\"solid\"] {\n --_bg: var(--badge-neutral-solid-bg);\n --_fg: var(--badge-neutral-solid-fg);\n }\n\n &[data-tone=\"neutral\"][data-variant=\"subtle\"] {\n --_bg: var(--badge-neutral-subtle-bg);\n --_fg: var(--badge-neutral-subtle-fg);\n }\n\n &[data-tone=\"info\"][data-variant=\"solid\"] {\n --_bg: var(--badge-info-solid-bg);\n --_fg: var(--badge-info-solid-fg);\n }\n\n &[data-tone=\"info\"][data-variant=\"subtle\"] {\n --_bg: var(--badge-info-subtle-bg);\n --_fg: var(--badge-info-subtle-fg);\n }\n\n &[data-tone=\"success\"][data-variant=\"solid\"] {\n --_bg: var(--badge-success-solid-bg);\n --_fg: var(--badge-success-solid-fg);\n }\n\n &[data-tone=\"success\"][data-variant=\"subtle\"] {\n --_bg: var(--badge-success-subtle-bg);\n --_fg: var(--badge-success-subtle-fg);\n }\n\n &[data-tone=\"warning\"][data-variant=\"solid\"] {\n --_bg: var(--badge-warning-solid-bg);\n --_fg: var(--badge-warning-solid-fg);\n }\n\n &[data-tone=\"warning\"][data-variant=\"subtle\"] {\n --_bg: var(--badge-warning-subtle-bg);\n --_fg: var(--badge-warning-subtle-fg);\n }\n\n &[data-tone=\"error\"][data-variant=\"solid\"] {\n --_bg: var(--badge-error-solid-bg);\n --_fg: var(--badge-error-solid-fg);\n }\n\n &[data-tone=\"error\"][data-variant=\"subtle\"] {\n --_bg: var(--badge-error-subtle-bg);\n --_fg: var(--badge-error-subtle-fg);\n }\n }\n\n /* A presence mark: the tone's solid fill, no text, no padding. After the tone rules so --_bg is set. */\n .badge[data-variant=\"dot\"] {\n inline-size: var(--badge-dot-size);\n block-size: var(--badge-dot-size);\n padding: 0;\n vertical-align: middle;\n }\n\n .badge[data-tone=\"neutral\"][data-variant=\"dot\"] {\n --_bg: var(--badge-neutral-solid-bg);\n }\n\n .badge[data-tone=\"info\"][data-variant=\"dot\"] {\n --_bg: var(--badge-info-solid-bg);\n }\n\n .badge[data-tone=\"success\"][data-variant=\"dot\"] {\n --_bg: var(--badge-success-solid-bg);\n }\n\n .badge[data-tone=\"warning\"][data-variant=\"dot\"] {\n --_bg: var(--badge-warning-solid-bg);\n }\n\n .badge[data-tone=\"error\"][data-variant=\"dot\"] {\n --_bg: var(--badge-error-solid-bg);\n }\n}\n"],"mappings":";AAEA;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;;;ACpBA;AAEA;AACE,GAACC;AACC,cAAU;AACV,iBAAa,IAAI;AACjB,gBAAY,IAAI;AAChB,aAAS;AACT,YAAQ;AACR,cAAU;AACV,eAAW,MAAM;AACjB,iBAAa;AACb,YAAQ;AACV;AACF;;;ACdA;AAEA;AACE,GAACC;AACC,WAAO,IAAI;AACX,WAAO,IAAI;AAEX,aAAS;AACT,iBAAa;AACb,SAAK,IAAI;AACT,mBAAe,IAAI;AACnB,oBAAgB,IAAI;AACpB,mBAAe,IAAI;AACnB,sBAAkB,IAAI;AACtB,WAAO,IAAI;AACX,eAAW,IAAI;AACf,iBAAa,IAAI;AACjB,iBAAa,IAAI;AACjB,iBAAa;AAEb,KAAC,CAAC;AACA,sBAAgB,IAAI;AACpB,iBAAW,IAAI;AACjB;AAEA,KAAC,CAAC,kBAAoB,CAAC;AACrB,aAAO,IAAI;AACX,aAAO,IAAI;AACb;AAEA,KAAC,CAAC,kBAAoB,CAAC;AACrB,aAAO,IAAI;AACX,aAAO,IAAI;AACb;AAEA,KAAC,CAAC,eAAiB,CAAC;AAClB,aAAO,IAAI;AACX,aAAO,IAAI;AACb;AAEA,KAAC,CAAC,eAAiB,CAAC;AAClB,aAAO,IAAI;AACX,aAAO,IAAI;AACb;AAEA,KAAC,CAAC,kBAAoB,CAAC;AACrB,aAAO,IAAI;AACX,aAAO,IAAI;AACb;AAEA,KAAC,CAAC,kBAAoB,CAAC;AACrB,aAAO,IAAI;AACX,aAAO,IAAI;AACb;AAEA,KAAC,CAAC,kBAAoB,CAAC;AACrB,aAAO,IAAI;AACX,aAAO,IAAI;AACb;AAEA,KAAC,CAAC,kBAAoB,CAAC;AACrB,aAAO,IAAI;AACX,aAAO,IAAI;AACb;AAEA,KAAC,CAAC,gBAAkB,CAAC;AACnB,aAAO,IAAI;AACX,aAAO,IAAI;AACb;AAEA,KAAC,CAAC,gBAAkB,CAAC;AACnB,aAAO,IAAI;AACX,aAAO,IAAI;AACb;AACF;AAGA,GA1ECA,WA0EK,CAAC;AACL,iBAAa,IAAI;AACjB,gBAAY,IAAI;AAChB,aAAS;AACT,oBAAgB;AAClB;AAEA,GAjFCA,WAiFK,CAAC,kBAAoB,CAAC;AAC1B,WAAO,IAAI;AACb;AAEA,GArFCA,WAqFK,CAAC,eAAiB,CAAC;AACvB,WAAO,IAAI;AACb;AAEA,GAzFCA,WAyFK,CAAC,kBAAoB,CAAC;AAC1B,WAAO,IAAI;AACb;AAEA,GA7FCA,WA6FK,CAAC,kBAAoB,CAAC;AAC1B,WAAO,IAAI;AACb;AAEA,GAjGCA,WAiGK,CAAC,gBAAkB,CAAC;AACxB,WAAO,IAAI;AACb;AACF;","names":["icon","root","badge"]}
|
package/dist/badge.d.ts
CHANGED
|
@@ -2,19 +2,35 @@ import * as react from 'react';
|
|
|
2
2
|
import { HTMLAttributes, ReactNode, Ref } from 'react';
|
|
3
3
|
|
|
4
4
|
type BadgeTone = 'neutral' | 'info' | 'success' | 'warning' | 'error';
|
|
5
|
-
type BadgeVariant = 'solid' | 'subtle';
|
|
5
|
+
type BadgeVariant = 'solid' | 'subtle' | 'dot';
|
|
6
6
|
type BadgeSize = 'sm' | 'md';
|
|
7
7
|
interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {
|
|
8
8
|
/** Meaning, not colour: `neutral` for counts and tags. @default 'neutral' */
|
|
9
9
|
tone?: BadgeTone;
|
|
10
|
-
/**
|
|
10
|
+
/**
|
|
11
|
+
* `solid` fills with the tone; `subtle` tints and uses the tone as text; `dot` is a
|
|
12
|
+
* small filled circle with no visible text, which needs a `label`. @default 'subtle'
|
|
13
|
+
*/
|
|
11
14
|
variant?: BadgeVariant;
|
|
12
15
|
/** @default 'md' */
|
|
13
16
|
size?: BadgeSize;
|
|
14
17
|
/** Leading glyph, decorative. */
|
|
15
18
|
icon?: ReactNode;
|
|
19
|
+
/**
|
|
20
|
+
* A number to show instead of children, clamped to `max` ("99+"). Zero or less
|
|
21
|
+
* renders nothing: an empty inbox has no badge.
|
|
22
|
+
*/
|
|
23
|
+
count?: number;
|
|
24
|
+
/** The highest count shown as is. @default 99 */
|
|
25
|
+
max?: number;
|
|
26
|
+
/**
|
|
27
|
+
* What the badge means, for assistive technology. Required for `variant="dot"`
|
|
28
|
+
* ("Unread messages"), where it is the only content. With a `count` it is read
|
|
29
|
+
* after the number: `count={3} label="unread"` is announced as "3 unread".
|
|
30
|
+
*/
|
|
31
|
+
label?: string;
|
|
16
32
|
ref?: Ref<HTMLSpanElement>;
|
|
17
|
-
children
|
|
33
|
+
children?: ReactNode;
|
|
18
34
|
}
|
|
19
35
|
/**
|
|
20
36
|
* A small label for status, counts and tags. Tone and variant resolve
|
|
@@ -24,13 +40,14 @@ interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {
|
|
|
24
40
|
*
|
|
25
41
|
* @status stable
|
|
26
42
|
* @category Feedback
|
|
27
|
-
* @accessibility Plain text: no role, no interaction. Every tone × variant pair meets WCAG AA, proven by the token tests. Tone is reinforced by the text, not only by colour.
|
|
43
|
+
* @accessibility Plain text: no role, no interaction, and deliberately no live region: a badge that is there when the page renders must not be announced as news (put `role="status"` on a wrapper yourself if a count changes while the user is on the page). A `dot` has no visible text, so its `label` is rendered visually hidden; a `count` above `max` reads as "99+", followed by the `label` if there is one. Every tone × variant pair meets WCAG AA, proven by the token tests. Tone is reinforced by the text, not only by colour.
|
|
28
44
|
* @do Keep the text to one or two words.
|
|
45
|
+
* @do Give a `dot` a `label` that says what it marks, and a `count` a `label` that says what is counted.
|
|
29
46
|
* Pair a leading icon with text, never alone.
|
|
30
47
|
* @dont Make it clickable; compose a Button for a removable chip.
|
|
31
48
|
* Use tone alone to convey meaning; say it in the text.
|
|
32
49
|
*/
|
|
33
|
-
declare function Badge({ tone, variant, size, icon, className, ref, children, ...rest }: BadgeProps): react.JSX.Element;
|
|
50
|
+
declare function Badge({ tone, variant, size, icon, count, max, label, className, ref, children, ...rest }: BadgeProps): react.JSX.Element | null;
|
|
34
51
|
declare namespace Badge {
|
|
35
52
|
var displayName: string;
|
|
36
53
|
}
|
package/dist/badge.js
CHANGED
package/dist/button.css
CHANGED
|
@@ -160,6 +160,24 @@
|
|
|
160
160
|
}
|
|
161
161
|
}
|
|
162
162
|
}
|
|
163
|
+
.Button_button[data-tone=danger] {
|
|
164
|
+
&[data-variant=primary] {
|
|
165
|
+
background-color: var(--button-danger-bg);
|
|
166
|
+
color: var(--button-danger-fg);
|
|
167
|
+
&:hover:not(:disabled, [aria-disabled=true]) {
|
|
168
|
+
background-color: var(--button-danger-bg-hover);
|
|
169
|
+
}
|
|
170
|
+
&:active:not(:disabled, [aria-disabled=true]) {
|
|
171
|
+
background-color: var(--button-danger-bg-active);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
&:is([data-variant=secondary], [data-variant=ghost]) {
|
|
175
|
+
color: var(--button-danger-text);
|
|
176
|
+
&:hover:not(:disabled, [aria-disabled=true]) {
|
|
177
|
+
background-color: var(--button-danger-quiet-bg-hover);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
163
181
|
.Button_label {
|
|
164
182
|
display: inline-block;
|
|
165
183
|
}
|
package/dist/button.css.map
CHANGED
|
@@ -1 +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"],"sourcesContent":["/* Every value is a token (--icon-*). The child SVG fills the box; colour is currentColor. */\n\n@layer reset, tokens, vendor, base, components, utilities;\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 reset, tokens, vendor, base, components, utilities;\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 reset, tokens, vendor, base, components, utilities;\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 reset, tokens, vendor, base, components, utilities;\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 -webkit-user-select: none;\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"],"mappings":"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","names":["icon","root","spinner","ring","spin","button","label"]}
|
|
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"],"sourcesContent":["/* Every value is a token (--icon-*). The child SVG fills the box; colour is currentColor. */\n\n@layer reset, tokens, vendor, base, components, utilities;\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 reset, tokens, vendor, base, components, utilities;\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 reset, tokens, vendor, base, components, utilities;\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 reset, tokens, vendor, base, components, utilities;\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 -webkit-user-select: none;\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 /* tone=\"danger\", after the variants so it wins at equal specificity plus one attribute. */\n .button[data-tone=\"danger\"] {\n &[data-variant=\"primary\"] {\n background-color: var(--button-danger-bg);\n color: var(--button-danger-fg);\n\n &:hover:not(:disabled, [aria-disabled=\"true\"]) {\n background-color: var(--button-danger-bg-hover);\n }\n\n &:active:not(:disabled, [aria-disabled=\"true\"]) {\n background-color: var(--button-danger-bg-active);\n }\n }\n\n &:is([data-variant=\"secondary\"], [data-variant=\"ghost\"]) {\n color: var(--button-danger-text);\n\n &:hover:not(:disabled, [aria-disabled=\"true\"]) {\n background-color: var(--button-danger-quiet-bg-hover);\n }\n }\n }\n\n .label {\n display: inline-block;\n }\n}\n"],"mappings":"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","names":["icon","root","spinner","ring","spin","button","label"]}
|
package/dist/button.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
2
|
import { ButtonHTMLAttributes, ReactNode, Ref } from 'react';
|
|
3
3
|
|
|
4
|
+
type ButtonTone = 'default' | 'danger';
|
|
4
5
|
type ButtonVariant = 'primary' | 'secondary' | 'ghost';
|
|
5
6
|
type ButtonSize = 'sm' | 'md' | 'lg';
|
|
6
7
|
interface ButtonProps<E extends HTMLElement = HTMLButtonElement> extends ButtonHTMLAttributes<HTMLButtonElement> {
|
|
@@ -10,6 +11,13 @@ interface ButtonProps<E extends HTMLElement = HTMLButtonElement> extends ButtonH
|
|
|
10
11
|
* @default 'primary'
|
|
11
12
|
*/
|
|
12
13
|
variant?: ButtonVariant;
|
|
14
|
+
/**
|
|
15
|
+
* `danger` for an action that destroys something (delete, remove, leave). It
|
|
16
|
+
* recolours whichever `variant` is in use, so emphasis and danger stay two
|
|
17
|
+
* separate decisions: `variant="ghost" tone="danger"` is a quiet delete.
|
|
18
|
+
* @default 'default'
|
|
19
|
+
*/
|
|
20
|
+
tone?: ButtonTone;
|
|
13
21
|
/** @default 'md' */
|
|
14
22
|
size?: ButtonSize;
|
|
15
23
|
/**
|
|
@@ -50,12 +58,13 @@ interface ButtonProps<E extends HTMLElement = HTMLButtonElement> extends ButtonH
|
|
|
50
58
|
* @accessibility A native `button` (or the child element with `asChild`). `loading` sets `aria-disabled` and `aria-busy` and keeps focus; only `disabled` removes it from the tab order. Icon-only use warns in development: use IconButton, which requires a name.
|
|
51
59
|
* @do One `primary` per view.
|
|
52
60
|
* Use `asChild` for links that look like buttons, keeping the `a` semantics.
|
|
61
|
+
* @do Use `tone="danger"` for the action that destroys, and say what it destroys in the label ("Delete place"), since colour alone must not carry it.
|
|
53
62
|
* @dont Use `loading` on a button that is not the one that started the work.
|
|
54
63
|
* Rely on colour to tell variants apart; the label carries the meaning.
|
|
55
64
|
*/
|
|
56
|
-
declare function Button<E extends HTMLElement = HTMLButtonElement>({ variant, size, loading, iconStart, iconEnd, asChild, className, disabled, type, onClick, ref, children, ...rest }: ButtonProps<E>): react.JSX.Element;
|
|
65
|
+
declare function Button<E extends HTMLElement = HTMLButtonElement>({ variant, tone, size, loading, iconStart, iconEnd, asChild, className, disabled, type, onClick, ref, children, ...rest }: ButtonProps<E>): react.JSX.Element;
|
|
57
66
|
declare namespace Button {
|
|
58
67
|
var displayName: string;
|
|
59
68
|
}
|
|
60
69
|
|
|
61
|
-
export { Button, type ButtonProps, type ButtonSize, type ButtonVariant };
|
|
70
|
+
export { Button, type ButtonProps, type ButtonSize, type ButtonTone, type ButtonVariant };
|
package/dist/button.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export { Button } from './chunk-
|
|
1
|
+
export { Button } from './chunk-DE67ECD7.js';
|
|
2
2
|
import './chunk-ZL5MMRLG.js';
|
|
3
|
-
import './chunk-ZVDN3GRI.js';
|
|
4
3
|
import './chunk-IB5UUE3S.js';
|
|
5
4
|
import './chunk-O5LII5XP.js';
|
|
5
|
+
import './chunk-QJG5ILK5.js';
|
|
6
6
|
import './chunk-MI4QUKQS.js';
|
|
7
7
|
//# sourceMappingURL=button.js.map
|
|
8
8
|
//# sourceMappingURL=button.js.map
|
package/dist/calendar.js
CHANGED
package/dist/card.js
CHANGED
package/dist/checkbox.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export { Checkbox } from './chunk-
|
|
2
|
-
import './chunk-
|
|
3
|
-
import './chunk-
|
|
4
|
-
import './chunk-
|
|
1
|
+
"use client";export { Checkbox } from './chunk-UMK4D234.js';
|
|
2
|
+
import './chunk-Q6SYKNZ5.js';
|
|
3
|
+
import './chunk-SXMORGSG.js';
|
|
4
|
+
import './chunk-QJG5ILK5.js';
|
|
5
5
|
import './chunk-MI4QUKQS.js';
|
|
6
6
|
//# sourceMappingURL=checkbox.js.map
|
|
7
7
|
//# sourceMappingURL=checkbox.js.map
|
package/dist/chip.css
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/* src/chip/Chip.module.css */
|
|
2
|
+
@layer reset, tokens, vendor, base, components, utilities;
|
|
3
|
+
@layer components {
|
|
4
|
+
.Chip_root {
|
|
5
|
+
--_bg: var(--chip-neutral-bg);
|
|
6
|
+
--_bg-hover: var(--chip-neutral-bg-hover);
|
|
7
|
+
--_fg: var(--chip-neutral-fg);
|
|
8
|
+
--_border: var(--chip-neutral-border);
|
|
9
|
+
--_selected-bg: var(--chip-neutral-selected-bg);
|
|
10
|
+
--_selected-fg: var(--chip-neutral-selected-fg);
|
|
11
|
+
--_height: var(--chip-height-md);
|
|
12
|
+
--_padding: var(--chip-padding-x-md);
|
|
13
|
+
display: inline-flex;
|
|
14
|
+
align-items: stretch;
|
|
15
|
+
box-sizing: border-box;
|
|
16
|
+
min-block-size: var(--_height);
|
|
17
|
+
max-inline-size: 100%;
|
|
18
|
+
border: var(--chip-border-width) solid var(--_border);
|
|
19
|
+
border-radius: var(--chip-radius);
|
|
20
|
+
background: var(--_bg);
|
|
21
|
+
color: var(--_fg);
|
|
22
|
+
font-family: var(--font-family-body);
|
|
23
|
+
font-size: var(--chip-font-size-md);
|
|
24
|
+
font-weight: var(--chip-weight);
|
|
25
|
+
line-height: 1;
|
|
26
|
+
white-space: nowrap;
|
|
27
|
+
vertical-align: middle;
|
|
28
|
+
&[data-tone=action] {
|
|
29
|
+
--_bg: var(--chip-action-bg);
|
|
30
|
+
--_bg-hover: var(--chip-action-bg-hover);
|
|
31
|
+
--_fg: var(--chip-action-fg);
|
|
32
|
+
--_border: var(--chip-action-border);
|
|
33
|
+
--_selected-bg: var(--chip-action-selected-bg);
|
|
34
|
+
--_selected-fg: var(--chip-action-selected-fg);
|
|
35
|
+
}
|
|
36
|
+
&[data-size=sm] {
|
|
37
|
+
--_height: var(--chip-height-sm);
|
|
38
|
+
--_padding: var(--chip-padding-x-sm);
|
|
39
|
+
font-size: var(--chip-font-size-sm);
|
|
40
|
+
}
|
|
41
|
+
&[data-size=lg] {
|
|
42
|
+
--_height: var(--chip-height-lg);
|
|
43
|
+
--_padding: var(--chip-padding-x-lg);
|
|
44
|
+
font-size: var(--chip-font-size-lg);
|
|
45
|
+
}
|
|
46
|
+
&[data-selected] {
|
|
47
|
+
border-color: var(--_selected-bg);
|
|
48
|
+
background: var(--_selected-bg);
|
|
49
|
+
color: var(--_selected-fg);
|
|
50
|
+
}
|
|
51
|
+
&[data-disabled] {
|
|
52
|
+
opacity: 0.55;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
.Chip_label,
|
|
56
|
+
.Chip_remove {
|
|
57
|
+
display: inline-flex;
|
|
58
|
+
align-items: center;
|
|
59
|
+
border: 0;
|
|
60
|
+
border-radius: var(--chip-radius);
|
|
61
|
+
background: transparent;
|
|
62
|
+
color: inherit;
|
|
63
|
+
font: inherit;
|
|
64
|
+
&:is(button) {
|
|
65
|
+
cursor: pointer;
|
|
66
|
+
}
|
|
67
|
+
&:is(button):disabled {
|
|
68
|
+
cursor: not-allowed;
|
|
69
|
+
}
|
|
70
|
+
&:focus-visible {
|
|
71
|
+
outline: var(--chip-focus-ring-width) solid var(--chip-focus-ring);
|
|
72
|
+
outline-offset: var(--chip-focus-ring-offset);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
.Chip_label {
|
|
76
|
+
min-inline-size: 0;
|
|
77
|
+
padding-block: 0;
|
|
78
|
+
padding-inline: var(--_padding);
|
|
79
|
+
overflow: hidden;
|
|
80
|
+
text-overflow: ellipsis;
|
|
81
|
+
&:not(:last-child) {
|
|
82
|
+
padding-inline-end: var(--chip-gap);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
.Chip_root:not([data-selected], [data-disabled]) button.Chip_label:hover {
|
|
86
|
+
background: var(--_bg-hover);
|
|
87
|
+
}
|
|
88
|
+
.Chip_remove {
|
|
89
|
+
flex: none;
|
|
90
|
+
justify-content: center;
|
|
91
|
+
inline-size: var(--_height);
|
|
92
|
+
padding: 0;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/*# sourceMappingURL=chip.css.map */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/chip/Chip.module.css"],"sourcesContent":["/* Every value is a token: --chip-* in packages/tokens/tokens/component/chip.json */\n\n@layer reset, tokens, vendor, base, components, utilities;\n\n@layer components {\n .root {\n --_bg: var(--chip-neutral-bg);\n --_bg-hover: var(--chip-neutral-bg-hover);\n --_fg: var(--chip-neutral-fg);\n --_border: var(--chip-neutral-border);\n --_selected-bg: var(--chip-neutral-selected-bg);\n --_selected-fg: var(--chip-neutral-selected-fg);\n --_height: var(--chip-height-md);\n --_padding: var(--chip-padding-x-md);\n\n display: inline-flex;\n align-items: stretch;\n box-sizing: border-box;\n min-block-size: var(--_height);\n max-inline-size: 100%;\n border: var(--chip-border-width) solid var(--_border);\n border-radius: var(--chip-radius);\n background: var(--_bg);\n color: var(--_fg);\n font-family: var(--font-family-body);\n font-size: var(--chip-font-size-md);\n font-weight: var(--chip-weight);\n line-height: 1;\n white-space: nowrap;\n vertical-align: middle;\n\n &[data-tone='action'] {\n --_bg: var(--chip-action-bg);\n --_bg-hover: var(--chip-action-bg-hover);\n --_fg: var(--chip-action-fg);\n --_border: var(--chip-action-border);\n --_selected-bg: var(--chip-action-selected-bg);\n --_selected-fg: var(--chip-action-selected-fg);\n }\n\n &[data-size='sm'] {\n --_height: var(--chip-height-sm);\n --_padding: var(--chip-padding-x-sm);\n\n font-size: var(--chip-font-size-sm);\n }\n\n &[data-size='lg'] {\n --_height: var(--chip-height-lg);\n --_padding: var(--chip-padding-x-lg);\n\n font-size: var(--chip-font-size-lg);\n }\n\n &[data-selected] {\n border-color: var(--_selected-bg);\n background: var(--_selected-bg);\n color: var(--_selected-fg);\n }\n\n &[data-disabled] {\n opacity: 0.55;\n }\n }\n\n /* The two controls are transparent: the pill is painted once, on the root. */\n .label,\n .remove {\n display: inline-flex;\n align-items: center;\n border: 0;\n border-radius: var(--chip-radius);\n background: transparent;\n color: inherit;\n font: inherit;\n\n &:is(button) {\n cursor: pointer;\n }\n\n &:is(button):disabled {\n cursor: not-allowed;\n }\n\n &:focus-visible {\n outline: var(--chip-focus-ring-width) solid var(--chip-focus-ring);\n outline-offset: var(--chip-focus-ring-offset);\n }\n }\n\n .label {\n min-inline-size: 0;\n padding-block: 0;\n padding-inline: var(--_padding);\n overflow: hidden;\n text-overflow: ellipsis;\n\n /* With a remove button the label gives up its end padding to it. */\n &:not(:last-child) {\n padding-inline-end: var(--chip-gap);\n }\n }\n\n /* On the label, not `.root:has(.label:hover)`: Firefox 120, the support floor, has no :has(). */\n .root:not([data-selected], [data-disabled]) button.label:hover {\n background: var(--_bg-hover);\n }\n\n .remove {\n flex: none;\n justify-content: center;\n\n /* A square as tall as the chip, so the target is never smaller than the chip itself. */\n inline-size: var(--_height);\n padding: 0;\n }\n}\n"],"mappings":";AAEA;AAEA;AACE,GAACA;AACC,WAAO,IAAI;AACX,iBAAa,IAAI;AACjB,WAAO,IAAI;AACX,eAAW,IAAI;AACf,oBAAgB,IAAI;AACpB,oBAAgB,IAAI;AACpB,eAAW,IAAI;AACf,gBAAY,IAAI;AAEhB,aAAS;AACT,iBAAa;AACb,gBAAY;AACZ,oBAAgB,IAAI;AACpB,qBAAiB;AACjB,YAAQ,IAAI,qBAAqB,MAAM,IAAI;AAC3C,mBAAe,IAAI;AACnB,gBAAY,IAAI;AAChB,WAAO,IAAI;AACX,iBAAa,IAAI;AACjB,eAAW,IAAI;AACf,iBAAa,IAAI;AACjB,iBAAa;AACb,iBAAa;AACb,oBAAgB;AAEhB,KAAC,CAAC;AACA,aAAO,IAAI;AACX,mBAAa,IAAI;AACjB,aAAO,IAAI;AACX,iBAAW,IAAI;AACf,sBAAgB,IAAI;AACpB,sBAAgB,IAAI;AACtB;AAEA,KAAC,CAAC;AACA,iBAAW,IAAI;AACf,kBAAY,IAAI;AAEhB,iBAAW,IAAI;AACjB;AAEA,KAAC,CAAC;AACA,iBAAW,IAAI;AACf,kBAAY,IAAI;AAEhB,iBAAW,IAAI;AACjB;AAEA,KAAC,CAAC;AACA,oBAAc,IAAI;AAClB,kBAAY,IAAI;AAChB,aAAO,IAAI;AACb;AAEA,KAAC,CAAC;AACA,eAAS;AACX;AACF;AAGA,GAACC;AAAA,EACD,CAACC;AACC,aAAS;AACT,iBAAa;AACb,YAAQ;AACR,mBAAe,IAAI;AACnB,gBAAY;AACZ,WAAO;AACP,UAAM;AAEN,KAAC,IAAI;AACH,cAAQ;AACV;AAEA,KAAC,IAAI,OAAO;AACV,cAAQ;AACV;AAEA,KAAC;AACC,eAAS,IAAI,yBAAyB,MAAM,IAAI;AAChD,sBAAgB,IAAI;AACtB;AACF;AAEA,GAxBCD;AAyBC,qBAAiB;AACjB,mBAAe;AACf,oBAAgB,IAAI;AACpB,cAAU;AACV,mBAAe;AAGf,KAAC,KAAK;AACJ,0BAAoB,IAAI;AAC1B;AACF;AAGA,GAnGCD,SAmGI,KAAK,CAAC,gBAAgB,CAAC,gBAAgB,MAAM,CAtCjDC,UAsCuD;AACtD,gBAAY,IAAI;AAClB;AAEA,GAzCCC;AA0CC,UAAM;AACN,qBAAiB;AAGjB,iBAAa,IAAI;AACjB,aAAS;AACX;AACF;","names":["root","label","remove"]}
|