@rookcom/monarch-react 0.0.0-stage → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/README.md +4 -2
- package/dist/components/alert.d.ts +17 -0
- package/dist/components/alert.d.ts.map +1 -0
- package/dist/components/alert.js +17 -0
- package/dist/components/alert.js.map +1 -0
- package/dist/components/avatar.d.ts +16 -0
- package/dist/components/avatar.d.ts.map +1 -0
- package/dist/components/avatar.js +28 -0
- package/dist/components/avatar.js.map +1 -0
- package/dist/components/badge.d.ts +13 -0
- package/dist/components/badge.d.ts.map +1 -0
- package/dist/components/badge.js +7 -0
- package/dist/components/badge.js.map +1 -0
- package/dist/components/breadcrumb.d.ts +19 -0
- package/dist/components/breadcrumb.d.ts.map +1 -0
- package/dist/components/breadcrumb.js +19 -0
- package/dist/components/breadcrumb.js.map +1 -0
- package/dist/components/button.d.ts +32 -0
- package/dist/components/button.d.ts.map +1 -0
- package/dist/components/button.js +30 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/card.d.ts +18 -0
- package/dist/components/card.d.ts.map +1 -0
- package/dist/components/card.js +21 -0
- package/dist/components/card.js.map +1 -0
- package/dist/components/checkbox.d.ts +15 -0
- package/dist/components/checkbox.d.ts.map +1 -0
- package/dist/components/checkbox.js +23 -0
- package/dist/components/checkbox.js.map +1 -0
- package/dist/components/combobox.d.ts +35 -0
- package/dist/components/combobox.d.ts.map +1 -0
- package/dist/components/combobox.js +152 -0
- package/dist/components/combobox.js.map +1 -0
- package/dist/components/dialog.d.ts +22 -0
- package/dist/components/dialog.d.ts.map +1 -0
- package/dist/components/dialog.js +33 -0
- package/dist/components/dialog.js.map +1 -0
- package/dist/components/dropdown-menu.d.ts +24 -0
- package/dist/components/dropdown-menu.d.ts.map +1 -0
- package/dist/components/dropdown-menu.js +41 -0
- package/dist/components/dropdown-menu.js.map +1 -0
- package/dist/components/empty-state.d.ts +17 -0
- package/dist/components/empty-state.d.ts.map +1 -0
- package/dist/components/empty-state.js +10 -0
- package/dist/components/empty-state.js.map +1 -0
- package/dist/components/field.d.ts +65 -0
- package/dist/components/field.d.ts.map +1 -0
- package/dist/components/field.js +101 -0
- package/dist/components/field.js.map +1 -0
- package/dist/components/input.d.ts +15 -0
- package/dist/components/input.d.ts.map +1 -0
- package/dist/components/input.js +14 -0
- package/dist/components/input.js.map +1 -0
- package/dist/components/kbd.d.ts +4 -0
- package/dist/components/kbd.d.ts.map +1 -0
- package/dist/components/kbd.js +7 -0
- package/dist/components/kbd.js.map +1 -0
- package/dist/components/link.d.ts +13 -0
- package/dist/components/link.d.ts.map +1 -0
- package/dist/components/link.js +18 -0
- package/dist/components/link.js.map +1 -0
- package/dist/components/pagination.d.ts +18 -0
- package/dist/components/pagination.d.ts.map +1 -0
- package/dist/components/pagination.js +40 -0
- package/dist/components/pagination.js.map +1 -0
- package/dist/components/popover.d.ts +8 -0
- package/dist/components/popover.d.ts.map +1 -0
- package/dist/components/popover.js +14 -0
- package/dist/components/popover.js.map +1 -0
- package/dist/components/progress.d.ts +14 -0
- package/dist/components/progress.d.ts.map +1 -0
- package/dist/components/progress.js +12 -0
- package/dist/components/progress.js.map +1 -0
- package/dist/components/select.d.ts +27 -0
- package/dist/components/select.d.ts.map +1 -0
- package/dist/components/select.js +39 -0
- package/dist/components/select.js.map +1 -0
- package/dist/components/separator.d.ts +4 -0
- package/dist/components/separator.d.ts.map +1 -0
- package/dist/components/separator.js +9 -0
- package/dist/components/separator.js.map +1 -0
- package/dist/components/skeleton.d.ts +12 -0
- package/dist/components/skeleton.d.ts.map +1 -0
- package/dist/components/skeleton.js +10 -0
- package/dist/components/skeleton.js.map +1 -0
- package/dist/components/spinner.d.ts +12 -0
- package/dist/components/spinner.d.ts.map +1 -0
- package/dist/components/spinner.js +10 -0
- package/dist/components/spinner.js.map +1 -0
- package/dist/components/switch.d.ts +13 -0
- package/dist/components/switch.d.ts.map +1 -0
- package/dist/components/switch.js +21 -0
- package/dist/components/switch.js.map +1 -0
- package/dist/components/table.d.ts +53 -0
- package/dist/components/table.d.ts.map +1 -0
- package/dist/components/table.js +47 -0
- package/dist/components/table.js.map +1 -0
- package/dist/components/tabs.d.ts +12 -0
- package/dist/components/tabs.d.ts.map +1 -0
- package/dist/components/tabs.js +17 -0
- package/dist/components/tabs.js.map +1 -0
- package/dist/components/toast.d.ts +40 -0
- package/dist/components/toast.d.ts.map +1 -0
- package/dist/components/toast.js +67 -0
- package/dist/components/toast.js.map +1 -0
- package/dist/components/tooltip.d.ts +20 -0
- package/dist/components/tooltip.d.ts.map +1 -0
- package/dist/components/tooltip.js +12 -0
- package/dist/components/tooltip.js.map +1 -0
- package/dist/components/visually-hidden.d.ts +4 -0
- package/dist/components/visually-hidden.d.ts.map +1 -0
- package/dist/components/visually-hidden.js +7 -0
- package/dist/components/visually-hidden.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/cx.d.ts +3 -0
- package/dist/internal/cx.d.ts.map +1 -0
- package/dist/internal/cx.js +6 -0
- package/dist/internal/cx.js.map +1 -0
- package/dist/internal/icons.d.ts +12 -0
- package/dist/internal/icons.d.ts.map +1 -0
- package/dist/internal/icons.js +41 -0
- package/dist/internal/icons.js.map +1 -0
- package/dist/manifest.json +3814 -0
- package/dist/patterns/description-list.d.ts +17 -0
- package/dist/patterns/description-list.d.ts.map +1 -0
- package/dist/patterns/description-list.js +10 -0
- package/dist/patterns/description-list.js.map +1 -0
- package/dist/patterns/filter-bar.d.ts +25 -0
- package/dist/patterns/filter-bar.d.ts.map +1 -0
- package/dist/patterns/filter-bar.js +13 -0
- package/dist/patterns/filter-bar.js.map +1 -0
- package/dist/patterns/index.d.ts +9 -0
- package/dist/patterns/index.d.ts.map +1 -0
- package/dist/patterns/index.js +9 -0
- package/dist/patterns/index.js.map +1 -0
- package/dist/patterns/page-header.d.ts +17 -0
- package/dist/patterns/page-header.d.ts.map +1 -0
- package/dist/patterns/page-header.js +7 -0
- package/dist/patterns/page-header.js.map +1 -0
- package/dist/patterns/settings.d.ts +33 -0
- package/dist/patterns/settings.d.ts.map +1 -0
- package/dist/patterns/settings.js +15 -0
- package/dist/patterns/settings.js.map +1 -0
- package/dist/patterns/split-layout.d.ts +21 -0
- package/dist/patterns/split-layout.d.ts.map +1 -0
- package/dist/patterns/split-layout.js +10 -0
- package/dist/patterns/split-layout.js.map +1 -0
- package/dist/patterns/stat-card.d.ts +19 -0
- package/dist/patterns/stat-card.d.ts.map +1 -0
- package/dist/patterns/stat-card.js +11 -0
- package/dist/patterns/stat-card.js.map +1 -0
- package/dist/patterns/states.d.ts +23 -0
- package/dist/patterns/states.d.ts.map +1 -0
- package/dist/patterns/states.js +15 -0
- package/dist/patterns/states.js.map +1 -0
- package/dist/patterns/toolbar.d.ts +20 -0
- package/dist/patterns/toolbar.d.ts.map +1 -0
- package/dist/patterns/toolbar.js +46 -0
- package/dist/patterns/toolbar.js.map +1 -0
- package/dist/styles.css +1984 -0
- package/package.json +70 -4
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# @rookcom/monarch-react
|
|
2
|
+
|
|
3
|
+
## 0.2.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- Packages move to the public npm registry as `@rookcom/monarch-*` (were `@rookhq/monarch-*` on GitHub Packages). Apps install with plain `npm ci`; no registry token is needed. Releases are published from CI with npm trusted publishing and provenance.
|
|
8
|
+
- 8177b95: Add Toast (ToastProvider, useToast), Table primitives with sortable headers and selection cells, Breadcrumb, Pagination, Combobox, Separator, Progress and Link, plus the first experience patterns: PageHeader, Toolbar, FilterBar/FilterChip, SettingsSection/SettingsRow, DescriptionList, SplitLayout, StatCard, ErrorState and LoadingState. DropdownMenuItem now supports `asChild`.
|
package/README.md
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @rookcom/monarch-react
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Accessible React components for Rook apps. Import `./styles.css` once and
|
|
4
|
+
`@rookcom/monarch-tokens/css` for variables. Props and docs for every export:
|
|
5
|
+
`./manifest.json`. Contract: ../../docs/guides/component-contract.md
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { HTMLAttributes, ReactNode } from 'react';
|
|
2
|
+
export interface AlertProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {
|
|
3
|
+
tone?: 'neutral' | 'info' | 'success' | 'warning' | 'danger';
|
|
4
|
+
title?: ReactNode;
|
|
5
|
+
/** Replaces the default tone icon. Pass `null` for none. */
|
|
6
|
+
icon?: ReactNode;
|
|
7
|
+
/** Actions on the trailing edge, e.g. a Button or a dismiss IconButton. */
|
|
8
|
+
actions?: ReactNode;
|
|
9
|
+
/**
|
|
10
|
+
* Set when the alert appears in response to something the user did, so it
|
|
11
|
+
* is announced. `assertive` only for errors that block progress.
|
|
12
|
+
*/
|
|
13
|
+
live?: 'polite' | 'assertive';
|
|
14
|
+
}
|
|
15
|
+
/** Inline message about the state of a page or section. */
|
|
16
|
+
export declare function Alert({ tone, title, icon, actions, live, className, children, ...rest }: AlertProps): import("react").JSX.Element;
|
|
17
|
+
//# sourceMappingURL=alert.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alert.d.ts","sourceRoot":"","sources":["../../src/components/alert.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvD,MAAM,WAAW,UAAW,SAAQ,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAC/E,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC7D,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,4DAA4D;IAC5D,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB;;;OAGG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAC;CAC/B;AAUD,2DAA2D;AAC3D,wBAAgB,KAAK,CAAC,EACpB,IAAa,EACb,KAAK,EACL,IAAI,EACJ,OAAO,EACP,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,GAAG,IAAI,EACR,EAAE,UAAU,+BAiBZ"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cx } from '../internal/cx.js';
|
|
3
|
+
import { InfoGlyph, SuccessGlyph, WarningGlyph } from '../internal/icons.js';
|
|
4
|
+
const defaultIcon = {
|
|
5
|
+
neutral: _jsx(InfoGlyph, {}),
|
|
6
|
+
info: _jsx(InfoGlyph, {}),
|
|
7
|
+
success: _jsx(SuccessGlyph, {}),
|
|
8
|
+
warning: _jsx(WarningGlyph, {}),
|
|
9
|
+
danger: _jsx(WarningGlyph, {}),
|
|
10
|
+
};
|
|
11
|
+
/** Inline message about the state of a page or section. */
|
|
12
|
+
export function Alert({ tone = 'info', title, icon, actions, live, className, children, ...rest }) {
|
|
13
|
+
const role = live === 'assertive' ? 'alert' : live === 'polite' ? 'status' : undefined;
|
|
14
|
+
const glyph = icon === undefined ? defaultIcon[tone] : icon;
|
|
15
|
+
return (_jsxs("div", { ...rest, role: rest.role ?? role, className: cx('mn-alert', className), "data-tone": tone, children: [glyph ? (_jsx("span", { className: "mn-alert__icon", "aria-hidden": true, children: glyph })) : null, _jsxs("div", { className: "mn-alert__body", children: [title ? _jsx("p", { className: "mn-alert__title", children: title }) : null, children ? _jsx("div", { className: "mn-alert__content", children: children }) : null] }), actions ? _jsx("div", { className: "mn-alert__actions", children: actions }) : null] }));
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=alert.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alert.js","sourceRoot":"","sources":["../../src/components/alert.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAgB7E,MAAM,WAAW,GAAG;IAClB,OAAO,EAAE,KAAC,SAAS,KAAG;IACtB,IAAI,EAAE,KAAC,SAAS,KAAG;IACnB,OAAO,EAAE,KAAC,YAAY,KAAG;IACzB,OAAO,EAAE,KAAC,YAAY,KAAG;IACzB,MAAM,EAAE,KAAC,YAAY,KAAG;CAChB,CAAC;AAEX,2DAA2D;AAC3D,MAAM,UAAU,KAAK,CAAC,EACpB,IAAI,GAAG,MAAM,EACb,KAAK,EACL,IAAI,EACJ,OAAO,EACP,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,GAAG,IAAI,EACI;IACX,MAAM,IAAI,GAAG,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IACvF,MAAM,KAAK,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5D,OAAO,CACL,kBAAS,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC,eAAa,IAAI,aAC1F,KAAK,CAAC,CAAC,CAAC,CACP,eAAM,SAAS,EAAC,gBAAgB,iCAC7B,KAAK,GACD,CACR,CAAC,CAAC,CAAC,IAAI,EACR,eAAK,SAAS,EAAC,gBAAgB,aAC5B,KAAK,CAAC,CAAC,CAAC,YAAG,SAAS,EAAC,iBAAiB,YAAE,KAAK,GAAK,CAAC,CAAC,CAAC,IAAI,EACzD,QAAQ,CAAC,CAAC,CAAC,cAAK,SAAS,EAAC,mBAAmB,YAAE,QAAQ,GAAO,CAAC,CAAC,CAAC,IAAI,IAClE,EACL,OAAO,CAAC,CAAC,CAAC,cAAK,SAAS,EAAC,mBAAmB,YAAE,OAAO,GAAO,CAAC,CAAC,CAAC,IAAI,IAChE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type HTMLAttributes } from 'react';
|
|
2
|
+
export interface AvatarProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'children'> {
|
|
3
|
+
/** Person or entity name. Used for the image alt text and the initials fallback. */
|
|
4
|
+
name: string;
|
|
5
|
+
src?: string | null;
|
|
6
|
+
size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
7
|
+
shape?: 'circle' | 'square';
|
|
8
|
+
/**
|
|
9
|
+
* Set when a visible name sits next to the avatar, so screen readers do not
|
|
10
|
+
* hear the name twice.
|
|
11
|
+
*/
|
|
12
|
+
decorative?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function initials(name: string): string;
|
|
15
|
+
export declare function Avatar({ name, src, size, shape, decorative, className, style, ...rest }: AvatarProps): import("react").JSX.Element;
|
|
16
|
+
//# sourceMappingURL=avatar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar.d.ts","sourceRoot":"","sources":["../../src/components/avatar.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAY,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AAGtD,MAAM,WAAW,WAAY,SAAQ,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,EAAE,UAAU,CAAC;IACpF,oFAAoF;IACpF,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IACxC,KAAK,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC5B;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM7C;AASD,wBAAgB,MAAM,CAAC,EACrB,IAAI,EACJ,GAAG,EACH,IAAW,EACX,KAAgB,EAChB,UAAkB,EAClB,SAAS,EACT,KAAK,EACL,GAAG,IAAI,EACR,EAAE,WAAW,+BA6Bb"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
import { cx } from '../internal/cx.js';
|
|
5
|
+
export function initials(name) {
|
|
6
|
+
const parts = name.trim().split(/\s+/).filter(Boolean);
|
|
7
|
+
if (parts.length === 0)
|
|
8
|
+
return '?';
|
|
9
|
+
const first = parts[0]?.charAt(0) ?? '';
|
|
10
|
+
const last = parts.length > 1 ? (parts[parts.length - 1]?.charAt(0) ?? '') : '';
|
|
11
|
+
return (first + last).toUpperCase();
|
|
12
|
+
}
|
|
13
|
+
/** Stable hue per name so the same person gets the same fallback colour everywhere. */
|
|
14
|
+
function hueFor(name) {
|
|
15
|
+
let h = 0;
|
|
16
|
+
for (let i = 0; i < name.length; i++)
|
|
17
|
+
h = (h * 31 + name.charCodeAt(i)) % 360;
|
|
18
|
+
return h;
|
|
19
|
+
}
|
|
20
|
+
export function Avatar({ name, src, size = 'md', shape = 'circle', decorative = false, className, style, ...rest }) {
|
|
21
|
+
const [failed, setFailed] = useState(false);
|
|
22
|
+
const showImage = Boolean(src) && !failed;
|
|
23
|
+
const a11y = decorative
|
|
24
|
+
? { 'aria-hidden': true }
|
|
25
|
+
: { role: 'img', 'aria-label': name };
|
|
26
|
+
return (_jsx("span", { ...rest, ...a11y, className: cx('mn-avatar', className), "data-size": size, "data-shape": shape, style: { ...style, ['--mn-avatar-hue']: String(hueFor(name)) }, children: showImage ? (_jsx("img", { className: "mn-avatar__image", src: src ?? undefined, alt: "", onError: () => setFailed(true) })) : (_jsx("span", { className: "mn-avatar__initials", "aria-hidden": true, children: initials(name) })) }));
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=avatar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar.js","sourceRoot":"","sources":["../../src/components/avatar.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,QAAQ,EAAuB,MAAM,OAAO,CAAC;AACtD,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAevC,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACvD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IACnC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAChF,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;AACtC,CAAC;AAED,uFAAuF;AACvF,SAAS,MAAM,CAAC,IAAY;IAC1B,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;IAC9E,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,EACrB,IAAI,EACJ,GAAG,EACH,IAAI,GAAG,IAAI,EACX,KAAK,GAAG,QAAQ,EAChB,UAAU,GAAG,KAAK,EAClB,SAAS,EACT,KAAK,EACL,GAAG,IAAI,EACK;IACZ,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;IAC1C,MAAM,IAAI,GAAG,UAAU;QACrB,CAAC,CAAC,EAAE,aAAa,EAAE,IAAa,EAAE;QAClC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAc,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;IACjD,OAAO,CACL,kBACM,IAAI,KACJ,IAAI,EACR,SAAS,EAAE,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC,eAC1B,IAAI,gBACH,KAAK,EACjB,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,CAAC,iBAA2B,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,YAEvE,SAAS,CAAC,CAAC,CAAC,CACX,cACE,SAAS,EAAC,kBAAkB,EAC5B,GAAG,EAAE,GAAG,IAAI,SAAS,EACrB,GAAG,EAAC,EAAE,EACN,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAC9B,CACH,CAAC,CAAC,CAAC,CACF,eAAM,SAAS,EAAC,qBAAqB,iCAClC,QAAQ,CAAC,IAAI,CAAC,GACV,CACR,GACI,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { HTMLAttributes } from 'react';
|
|
2
|
+
export type Tone = 'neutral' | 'accent' | 'info' | 'success' | 'warning' | 'danger';
|
|
3
|
+
export interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {
|
|
4
|
+
tone?: Tone;
|
|
5
|
+
/** `subtle` (default) for status in tables, `solid` for counts, `outline` for metadata. */
|
|
6
|
+
variant?: 'subtle' | 'solid' | 'outline';
|
|
7
|
+
size?: 'sm' | 'md';
|
|
8
|
+
/** Leading status dot. */
|
|
9
|
+
dot?: boolean;
|
|
10
|
+
}
|
|
11
|
+
/** Short status or metadata label. Never the only way to convey meaning: keep the text. */
|
|
12
|
+
export declare function Badge({ tone, variant, size, dot, className, children, ...rest }: BadgeProps): import("react").JSX.Element;
|
|
13
|
+
//# sourceMappingURL=badge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"badge.d.ts","sourceRoot":"","sources":["../../src/components/badge.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAG5C,MAAM,MAAM,IAAI,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEpF,MAAM,WAAW,UAAW,SAAQ,cAAc,CAAC,eAAe,CAAC;IACjE,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,2FAA2F;IAC3F,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;IACzC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,0BAA0B;IAC1B,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,2FAA2F;AAC3F,wBAAgB,KAAK,CAAC,EACpB,IAAgB,EAChB,OAAkB,EAClB,IAAW,EACX,GAAW,EACX,SAAS,EACT,QAAQ,EACR,GAAG,IAAI,EACR,EAAE,UAAU,+BAaZ"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cx } from '../internal/cx.js';
|
|
3
|
+
/** Short status or metadata label. Never the only way to convey meaning: keep the text. */
|
|
4
|
+
export function Badge({ tone = 'neutral', variant = 'subtle', size = 'md', dot = false, className, children, ...rest }) {
|
|
5
|
+
return (_jsxs("span", { ...rest, className: cx('mn-badge', className), "data-tone": tone, "data-variant": variant, "data-size": size, children: [dot ? _jsx("span", { className: "mn-badge__dot", "aria-hidden": true }) : null, children] }));
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=badge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"badge.js","sourceRoot":"","sources":["../../src/components/badge.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAavC,2FAA2F;AAC3F,MAAM,UAAU,KAAK,CAAC,EACpB,IAAI,GAAG,SAAS,EAChB,OAAO,GAAG,QAAQ,EAClB,IAAI,GAAG,IAAI,EACX,GAAG,GAAG,KAAK,EACX,SAAS,EACT,QAAQ,EACR,GAAG,IAAI,EACI;IACX,OAAO,CACL,mBACM,IAAI,EACR,SAAS,EAAE,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC,eACzB,IAAI,kBACD,OAAO,eACV,IAAI,aAEd,GAAG,CAAC,CAAC,CAAC,eAAM,SAAS,EAAC,eAAe,wBAAe,CAAC,CAAC,CAAC,IAAI,EAC3D,QAAQ,IACJ,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type AnchorHTMLAttributes, type ElementType, type ReactNode } from 'react';
|
|
2
|
+
export interface BreadcrumbItem {
|
|
3
|
+
label: ReactNode;
|
|
4
|
+
/** Omit on the current page. */
|
|
5
|
+
href?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface BreadcrumbProps {
|
|
8
|
+
items: BreadcrumbItem[];
|
|
9
|
+
/** Show at most this many items; the middle ones collapse into a menu. Default 4. */
|
|
10
|
+
maxVisible?: number;
|
|
11
|
+
/** Link component, e.g. Next.js `Link`. Defaults to `a`. */
|
|
12
|
+
linkAs?: ElementType<AnchorHTMLAttributes<HTMLAnchorElement>>;
|
|
13
|
+
/** Accessible name of the nav. */
|
|
14
|
+
label?: string;
|
|
15
|
+
className?: string;
|
|
16
|
+
}
|
|
17
|
+
/** Location trail. The last item is the current page (`aria-current="page"`). */
|
|
18
|
+
export declare function Breadcrumb({ items, maxVisible, linkAs: LinkComp, label, className, }: BreadcrumbProps): import("react").JSX.Element;
|
|
19
|
+
//# sourceMappingURL=breadcrumb.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"breadcrumb.d.ts","sourceRoot":"","sources":["../../src/components/breadcrumb.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAY,KAAK,oBAAoB,EAAE,KAAK,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAU9F,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,SAAS,CAAC;IACjB,gCAAgC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,qFAAqF;IACrF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,WAAW,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC9D,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,iFAAiF;AACjF,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,UAAc,EACd,MAAM,EAAE,QAAc,EACtB,KAAoB,EACpB,SAAS,GACV,EAAE,eAAe,+BAoDjB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Fragment } from 'react';
|
|
4
|
+
import { cx } from '../internal/cx.js';
|
|
5
|
+
import { ChevronRightGlyph } from '../internal/icons.js';
|
|
6
|
+
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from './dropdown-menu.js';
|
|
7
|
+
/** Location trail. The last item is the current page (`aria-current="page"`). */
|
|
8
|
+
export function Breadcrumb({ items, maxVisible = 4, linkAs: LinkComp = 'a', label = 'Breadcrumb', className, }) {
|
|
9
|
+
const collapse = items.length > maxVisible;
|
|
10
|
+
const head = collapse ? items.slice(0, 1) : items;
|
|
11
|
+
const hidden = collapse ? items.slice(1, items.length - (maxVisible - 2)) : [];
|
|
12
|
+
const tail = collapse ? items.slice(items.length - (maxVisible - 2)) : [];
|
|
13
|
+
const visible = collapse ? [...head, 'menu', ...tail] : head;
|
|
14
|
+
return (_jsx("nav", { "aria-label": label, className: cx('mn-breadcrumb', className), children: _jsx("ol", { className: "mn-breadcrumb__list", children: visible.map((item, i) => {
|
|
15
|
+
const last = i === visible.length - 1;
|
|
16
|
+
return (_jsxs(Fragment, { children: [_jsx("li", { className: "mn-breadcrumb__item", children: item === 'menu' ? (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { className: "mn-breadcrumb__more", "aria-label": `Show ${hidden.length} more levels`, children: "\u2026" }), _jsx(DropdownMenuContent, { children: hidden.map((h, j) => (_jsx(DropdownMenuItem, { asChild: true, children: _jsx(LinkComp, { href: h.href, children: h.label }) }, j))) })] })) : last || !item.href ? (_jsx("span", { className: "mn-breadcrumb__current", "aria-current": last ? 'page' : undefined, children: item.label })) : (_jsx(LinkComp, { href: item.href, className: "mn-breadcrumb__link", children: item.label })) }), !last ? (_jsx("li", { "aria-hidden": true, className: "mn-breadcrumb__sep", children: _jsx(ChevronRightGlyph, {}) })) : null] }, i));
|
|
17
|
+
}) }) }));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=breadcrumb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"breadcrumb.js","sourceRoot":"","sources":["../../src/components/breadcrumb.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type ButtonHTMLAttributes, type ReactNode } from 'react';
|
|
2
|
+
export type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'danger' | 'danger-subtle';
|
|
3
|
+
export type ButtonSize = 'xs' | 'sm' | 'md' | 'lg';
|
|
4
|
+
export interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
|
|
5
|
+
/** Visual weight. Use one `primary` per view region. Default `secondary`. */
|
|
6
|
+
variant?: ButtonVariant;
|
|
7
|
+
size?: ButtonSize;
|
|
8
|
+
/** Shows a spinner, sets aria-busy and blocks clicks while keeping focus. */
|
|
9
|
+
loading?: boolean;
|
|
10
|
+
/** Icon before the label. Decorative: hidden from assistive technology. */
|
|
11
|
+
leadingIcon?: ReactNode;
|
|
12
|
+
trailingIcon?: ReactNode;
|
|
13
|
+
/** Stretch to the container width. */
|
|
14
|
+
block?: boolean;
|
|
15
|
+
/** Render the child element (e.g. a Next.js <Link>) with button styling. */
|
|
16
|
+
asChild?: boolean;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* The primary action control.
|
|
20
|
+
*
|
|
21
|
+
* Defaults to `type="button"` so a button inside a form never submits by
|
|
22
|
+
* accident; pass `type="submit"` explicitly.
|
|
23
|
+
*/
|
|
24
|
+
export declare const Button: import("react").ForwardRefExoticComponent<ButtonProps & import("react").RefAttributes<HTMLButtonElement>>;
|
|
25
|
+
export interface IconButtonProps extends Omit<ButtonProps, 'leadingIcon' | 'trailingIcon' | 'children' | 'block' | 'aria-label'> {
|
|
26
|
+
/** Required accessible name, since there is no visible text. */
|
|
27
|
+
label: string;
|
|
28
|
+
icon: ReactNode;
|
|
29
|
+
}
|
|
30
|
+
/** Square button containing only an icon. `label` is required by the type system. */
|
|
31
|
+
export declare const IconButton: import("react").ForwardRefExoticComponent<IconButtonProps & import("react").RefAttributes<HTMLButtonElement>>;
|
|
32
|
+
//# sourceMappingURL=button.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../src/components/button.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,oBAAoB,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAK9E,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,eAAe,CAAC;AAC3F,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEnD,MAAM,WAAW,WAAY,SAAQ,oBAAoB,CAAC,iBAAiB,CAAC;IAC1E,6EAA6E;IAC7E,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,sCAAsC;IACtC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;GAKG;AACH,eAAO,MAAM,MAAM,2GAyDjB,CAAC;AAEH,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAC3C,WAAW,EACX,aAAa,GAAG,cAAc,GAAG,UAAU,GAAG,OAAO,GAAG,YAAY,CACrE;IACC,gEAAgE;IAChE,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,qFAAqF;AACrF,eAAO,MAAM,UAAU,+GAmBrB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { forwardRef } from 'react';
|
|
4
|
+
import { Slot, Slottable } from '@radix-ui/react-slot';
|
|
5
|
+
import { cx } from '../internal/cx.js';
|
|
6
|
+
import { Spinner } from './spinner.js';
|
|
7
|
+
/**
|
|
8
|
+
* The primary action control.
|
|
9
|
+
*
|
|
10
|
+
* Defaults to `type="button"` so a button inside a form never submits by
|
|
11
|
+
* accident; pass `type="submit"` explicitly.
|
|
12
|
+
*/
|
|
13
|
+
export const Button = forwardRef(function Button({ variant = 'secondary', size = 'md', loading = false, leadingIcon, trailingIcon, block = false, asChild = false, disabled, type, className, children, onClick, ...rest }, ref) {
|
|
14
|
+
const Comp = asChild ? Slot : 'button';
|
|
15
|
+
// A loading button stays focusable (aria-disabled, not disabled) so keyboard
|
|
16
|
+
// users do not lose their place while the action completes.
|
|
17
|
+
const blocked = disabled || loading;
|
|
18
|
+
return (_jsxs(Comp, { ref: ref, ...rest, ...(asChild ? {} : { type: type ?? 'button', disabled: disabled || undefined }), "aria-disabled": blocked || undefined, "aria-busy": loading || undefined, "data-variant": variant, "data-size": size, "data-loading": loading || undefined, "data-block": block || undefined, className: cx('mn-button', className), onClick: (event) => {
|
|
19
|
+
if (blocked) {
|
|
20
|
+
event.preventDefault();
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
onClick?.(event);
|
|
24
|
+
}, children: [loading ? (_jsx(Spinner, { size: "sm", className: "mn-button__icon" })) : leadingIcon ? (_jsx("span", { className: "mn-button__icon", "aria-hidden": true, children: leadingIcon })) : null, _jsx(Slottable, { children: children }), trailingIcon ? (_jsx("span", { className: "mn-button__icon", "aria-hidden": true, children: trailingIcon })) : null] }));
|
|
25
|
+
});
|
|
26
|
+
/** Square button containing only an icon. `label` is required by the type system. */
|
|
27
|
+
export const IconButton = forwardRef(function IconButton({ label, icon, variant = 'ghost', className, ...rest }, ref) {
|
|
28
|
+
return (_jsx(Button, { ref: ref, ...rest, variant: variant, "aria-label": label, className: cx('mn-icon-button', className), children: rest.loading ? null : (_jsx("span", { className: "mn-button__icon", "aria-hidden": true, children: icon })) }));
|
|
29
|
+
});
|
|
30
|
+
//# sourceMappingURL=button.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button.js","sourceRoot":"","sources":["../../src/components/button.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,UAAU,EAA6C,MAAM,OAAO,CAAC;AAC9E,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAoBvC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAAiC,SAAS,MAAM,CAC9E,EACE,OAAO,GAAG,WAAW,EACrB,IAAI,GAAG,IAAI,EACX,OAAO,GAAG,KAAK,EACf,WAAW,EACX,YAAY,EACZ,KAAK,GAAG,KAAK,EACb,OAAO,GAAG,KAAK,EACf,QAAQ,EACR,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,OAAO,EACP,GAAG,IAAI,EACR,EACD,GAAG;IAEH,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC;IACvC,6EAA6E;IAC7E,4DAA4D;IAC5D,MAAM,OAAO,GAAG,QAAQ,IAAI,OAAO,CAAC;IACpC,OAAO,CACL,MAAC,IAAI,IACH,GAAG,EAAE,GAAG,KACJ,IAAI,KACJ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,QAAQ,EAAE,QAAQ,EAAE,QAAQ,IAAI,SAAS,EAAE,CAAC,mBACjE,OAAO,IAAI,SAAS,eACxB,OAAO,IAAI,SAAS,kBACjB,OAAO,eACV,IAAI,kBACD,OAAO,IAAI,SAAS,gBACtB,KAAK,IAAI,SAAS,EAC9B,SAAS,EAAE,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC,EACrC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjB,IAAI,OAAO,EAAE,CAAC;gBACZ,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,OAAO;YACT,CAAC;YACD,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC,aAEA,OAAO,CAAC,CAAC,CAAC,CACT,KAAC,OAAO,IAAC,IAAI,EAAC,IAAI,EAAC,SAAS,EAAC,iBAAiB,GAAG,CAClD,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAChB,eAAM,SAAS,EAAC,iBAAiB,iCAC9B,WAAW,GACP,CACR,CAAC,CAAC,CAAC,IAAI,EACR,KAAC,SAAS,cAAE,QAAQ,GAAa,EAChC,YAAY,CAAC,CAAC,CAAC,CACd,eAAM,SAAS,EAAC,iBAAiB,iCAC9B,YAAY,GACR,CACR,CAAC,CAAC,CAAC,IAAI,IACH,CACR,CAAC;AACJ,CAAC,CAAC,CAAC;AAWH,qFAAqF;AACrF,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAAqC,SAAS,UAAU,CAC1F,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EACtD,GAAG;IAEH,OAAO,CACL,KAAC,MAAM,IACL,GAAG,EAAE,GAAG,KACJ,IAAI,EACR,OAAO,EAAE,OAAO,gBACJ,KAAK,EACjB,SAAS,EAAE,EAAE,CAAC,gBAAgB,EAAE,SAAS,CAAC,YAEzC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CACrB,eAAM,SAAS,EAAC,iBAAiB,iCAC9B,IAAI,GACA,CACR,GACM,CACV,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { HTMLAttributes } from 'react';
|
|
2
|
+
export interface CardProps extends HTMLAttributes<HTMLDivElement> {
|
|
3
|
+
/** `outline` (default) for most content, `raised` for floating panels, `subtle` inside other cards. */
|
|
4
|
+
variant?: 'outline' | 'raised' | 'subtle';
|
|
5
|
+
/** Remove inner padding, e.g. for a card wrapping a table. */
|
|
6
|
+
flush?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function Card({ variant, flush, className, ...rest }: CardProps): import("react").JSX.Element;
|
|
9
|
+
export declare function CardHeader({ className, ...rest }: HTMLAttributes<HTMLDivElement>): import("react").JSX.Element;
|
|
10
|
+
export interface CardTitleProps extends HTMLAttributes<HTMLHeadingElement> {
|
|
11
|
+
/** Heading level that fits the page outline. Default h3. */
|
|
12
|
+
as?: 'h2' | 'h3' | 'h4';
|
|
13
|
+
}
|
|
14
|
+
export declare function CardTitle({ as: Tag, className, ...rest }: CardTitleProps): import("react").JSX.Element;
|
|
15
|
+
export declare function CardDescription({ className, ...rest }: HTMLAttributes<HTMLParagraphElement>): import("react").JSX.Element;
|
|
16
|
+
export declare function CardContent({ className, ...rest }: HTMLAttributes<HTMLDivElement>): import("react").JSX.Element;
|
|
17
|
+
export declare function CardFooter({ className, ...rest }: HTMLAttributes<HTMLDivElement>): import("react").JSX.Element;
|
|
18
|
+
//# sourceMappingURL=card.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card.d.ts","sourceRoot":"","sources":["../../src/components/card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAG5C,MAAM,WAAW,SAAU,SAAQ,cAAc,CAAC,cAAc,CAAC;IAC/D,uGAAuG;IACvG,OAAO,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC1C,8DAA8D;IAC9D,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,IAAI,CAAC,EAAE,OAAmB,EAAE,KAAa,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,SAAS,+BASzF;AAED,wBAAgB,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,cAAc,CAAC,cAAc,CAAC,+BAEhF;AAED,MAAM,WAAW,cAAe,SAAQ,cAAc,CAAC,kBAAkB,CAAC;IACxE,4DAA4D;IAC5D,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;CACzB;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,EAAE,GAAU,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,cAAc,+BAE/E;AAED,wBAAgB,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,cAAc,CAAC,oBAAoB,CAAC,+BAE3F;AAED,wBAAgB,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,cAAc,CAAC,cAAc,CAAC,+BAEjF;AAED,wBAAgB,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,cAAc,CAAC,cAAc,CAAC,+BAEhF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { cx } from '../internal/cx.js';
|
|
3
|
+
export function Card({ variant = 'outline', flush = false, className, ...rest }) {
|
|
4
|
+
return (_jsx("div", { ...rest, className: cx('mn-card', className), "data-variant": variant, "data-flush": flush || undefined }));
|
|
5
|
+
}
|
|
6
|
+
export function CardHeader({ className, ...rest }) {
|
|
7
|
+
return _jsx("div", { ...rest, className: cx('mn-card__header', className) });
|
|
8
|
+
}
|
|
9
|
+
export function CardTitle({ as: Tag = 'h3', className, ...rest }) {
|
|
10
|
+
return _jsx(Tag, { ...rest, className: cx('mn-card__title', className) });
|
|
11
|
+
}
|
|
12
|
+
export function CardDescription({ className, ...rest }) {
|
|
13
|
+
return _jsx("p", { ...rest, className: cx('mn-card__description', className) });
|
|
14
|
+
}
|
|
15
|
+
export function CardContent({ className, ...rest }) {
|
|
16
|
+
return _jsx("div", { ...rest, className: cx('mn-card__content', className) });
|
|
17
|
+
}
|
|
18
|
+
export function CardFooter({ className, ...rest }) {
|
|
19
|
+
return _jsx("div", { ...rest, className: cx('mn-card__footer', className) });
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card.js","sourceRoot":"","sources":["../../src/components/card.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AASvC,MAAM,UAAU,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,EAAE,KAAK,GAAG,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,EAAa;IACxF,OAAO,CACL,iBACM,IAAI,EACR,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,kBACrB,OAAO,gBACT,KAAK,IAAI,SAAS,GAC9B,CACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,EAAkC;IAC/E,OAAO,iBAAS,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,iBAAiB,EAAE,SAAS,CAAC,GAAI,CAAC;AACxE,CAAC;AAOD,MAAM,UAAU,SAAS,CAAC,EAAE,EAAE,EAAE,GAAG,GAAG,IAAI,EAAE,SAAS,EAAE,GAAG,IAAI,EAAkB;IAC9E,OAAO,KAAC,GAAG,OAAK,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,gBAAgB,EAAE,SAAS,CAAC,GAAI,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,EAAwC;IAC1F,OAAO,eAAO,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,sBAAsB,EAAE,SAAS,CAAC,GAAI,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,EAAkC;IAChF,OAAO,iBAAS,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,kBAAkB,EAAE,SAAS,CAAC,GAAI,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,EAAkC;IAC/E,OAAO,iBAAS,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,iBAAiB,EAAE,SAAS,CAAC,GAAI,CAAC;AACxE,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type ComponentPropsWithoutRef, type ReactNode } from 'react';
|
|
2
|
+
import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
|
|
3
|
+
export interface CheckboxProps extends ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root> {
|
|
4
|
+
/** Inline label. Omit when the checkbox sits inside a Field with a FieldLabel. */
|
|
5
|
+
label?: ReactNode;
|
|
6
|
+
/** Secondary text under an inline label. */
|
|
7
|
+
description?: ReactNode;
|
|
8
|
+
invalid?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* A checkbox with optional inline label. Supports `checked="indeterminate"`.
|
|
12
|
+
* Space toggles it; it participates in native forms via `name`/`value`.
|
|
13
|
+
*/
|
|
14
|
+
export declare const Checkbox: import("react").ForwardRefExoticComponent<CheckboxProps & import("react").RefAttributes<HTMLButtonElement>>;
|
|
15
|
+
//# sourceMappingURL=checkbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkbox.d.ts","sourceRoot":"","sources":["../../src/components/checkbox.tsx"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,wBAAwB,EAE7B,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,iBAAiB,MAAM,0BAA0B,CAAC;AAK9D,MAAM,WAAW,aAAc,SAAQ,wBAAwB,CAAC,OAAO,iBAAiB,CAAC,IAAI,CAAC;IAC5F,kFAAkF;IAClF,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,eAAO,MAAM,QAAQ,6GAqCpB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { forwardRef, useId, } from 'react';
|
|
4
|
+
import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
|
|
5
|
+
import { cx } from '../internal/cx.js';
|
|
6
|
+
import { CheckGlyph, DashGlyph } from '../internal/icons.js';
|
|
7
|
+
import { useFieldControl } from './field.js';
|
|
8
|
+
/**
|
|
9
|
+
* A checkbox with optional inline label. Supports `checked="indeterminate"`.
|
|
10
|
+
* Space toggles it; it participates in native forms via `name`/`value`.
|
|
11
|
+
*/
|
|
12
|
+
export const Checkbox = forwardRef(function Checkbox({ label, description, invalid, className, ...rest }, ref) {
|
|
13
|
+
const auto = useId();
|
|
14
|
+
const props = useFieldControl(rest, { invalid });
|
|
15
|
+
const id = props.id ?? `mn-checkbox-${auto}`;
|
|
16
|
+
const descriptionId = description ? `${id}-description` : undefined;
|
|
17
|
+
const describedBy = cx(props['aria-describedby'], descriptionId);
|
|
18
|
+
const control = (_jsx(CheckboxPrimitive.Root, { ref: ref, ...props, id: id, "aria-describedby": describedBy, className: cx('mn-checkbox', label ? undefined : className), children: _jsx(CheckboxPrimitive.Indicator, { className: "mn-checkbox__indicator", children: props.checked === 'indeterminate' ? _jsx(DashGlyph, {}) : _jsx(CheckGlyph, {}) }) }));
|
|
19
|
+
if (!label)
|
|
20
|
+
return control;
|
|
21
|
+
return (_jsxs("div", { className: cx('mn-choice', className), "data-disabled": props.disabled || undefined, children: [control, _jsxs("div", { className: "mn-choice__text", children: [_jsx("label", { htmlFor: id, className: "mn-choice__label", children: label }), description ? (_jsx("p", { id: descriptionId, className: "mn-choice__description", children: description })) : null] })] }));
|
|
22
|
+
});
|
|
23
|
+
//# sourceMappingURL=checkbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkbox.js","sourceRoot":"","sources":["../../src/components/checkbox.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EACL,UAAU,EACV,KAAK,GAIN,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,iBAAiB,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAU7C;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAChC,SAAS,QAAQ,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG;IACxE,MAAM,IAAI,GAAG,KAAK,EAAE,CAAC;IACrB,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IACjD,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,IAAI,eAAe,IAAI,EAAE,CAAC;IAC7C,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;IACpE,MAAM,WAAW,GAAG,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,aAAa,CAAC,CAAC;IACjE,MAAM,OAAO,GAAG,CACd,KAAC,iBAAiB,CAAC,IAAI,IACrB,GAAG,EAAE,GAAG,KACJ,KAAK,EACT,EAAE,EAAE,EAAE,sBACY,WAAW,EAC7B,SAAS,EAAE,EAAE,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,YAE3D,KAAC,iBAAiB,CAAC,SAAS,IAAC,SAAS,EAAC,wBAAwB,YAC5D,KAAK,CAAC,OAAO,KAAK,eAAe,CAAC,CAAC,CAAC,KAAC,SAAS,KAAG,CAAC,CAAC,CAAC,KAAC,UAAU,KAAG,GACvC,GACP,CAC1B,CAAC;IACF,IAAI,CAAC,KAAK;QAAE,OAAO,OAAO,CAAC;IAC3B,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC,mBAAiB,KAAK,CAAC,QAAQ,IAAI,SAAS,aACnF,OAAO,EACR,eAAK,SAAS,EAAC,iBAAiB,aAC9B,gBAAO,OAAO,EAAE,EAAE,EAAE,SAAS,EAAC,kBAAkB,YAC7C,KAAK,GACA,EACP,WAAW,CAAC,CAAC,CAAC,CACb,YAAG,EAAE,EAAE,aAAa,EAAE,SAAS,EAAC,wBAAwB,YACrD,WAAW,GACV,CACL,CAAC,CAAC,CAAC,IAAI,IACJ,IACF,CACP,CAAC;AACJ,CAAC,CACF,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type InputHTMLAttributes, type ReactNode } from 'react';
|
|
2
|
+
export interface ComboboxOption {
|
|
3
|
+
value: string;
|
|
4
|
+
label: string;
|
|
5
|
+
/** Secondary text under the label. */
|
|
6
|
+
description?: string;
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface ComboboxProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'value' | 'defaultValue' | 'onChange' | 'size' | 'type'> {
|
|
10
|
+
options: ComboboxOption[];
|
|
11
|
+
/** Selected option value (controlled). */
|
|
12
|
+
value?: string | null;
|
|
13
|
+
defaultValue?: string | null;
|
|
14
|
+
onValueChange?: (value: string | null) => void;
|
|
15
|
+
/** Text typed in the input (controlled). Use for server-side filtering. */
|
|
16
|
+
inputValue?: string;
|
|
17
|
+
onInputValueChange?: (text: string) => void;
|
|
18
|
+
/** Custom filter. Default: case-insensitive label match. Pass `() => true` for server-filtered lists. */
|
|
19
|
+
filter?: (option: ComboboxOption, query: string) => boolean;
|
|
20
|
+
/** Shown while options load. */
|
|
21
|
+
loading?: boolean;
|
|
22
|
+
/** Shown when no option matches. */
|
|
23
|
+
emptyMessage?: ReactNode;
|
|
24
|
+
invalid?: boolean;
|
|
25
|
+
size?: 'sm' | 'md' | 'lg';
|
|
26
|
+
/** Allow clearing the selection with the clear button / Backspace on empty input. */
|
|
27
|
+
clearable?: boolean;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Single-select with typeahead. The input is the combobox; the list is a
|
|
31
|
+
* listbox positioned by Radix Popover. Keyboard: Down/Up move, Home/End jump,
|
|
32
|
+
* Enter selects, Escape closes, typing filters.
|
|
33
|
+
*/
|
|
34
|
+
export declare const Combobox: import("react").ForwardRefExoticComponent<ComboboxProps & import("react").RefAttributes<HTMLInputElement>>;
|
|
35
|
+
//# sourceMappingURL=combobox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"combobox.d.ts","sourceRoot":"","sources":["../../src/components/combobox.tsx"],"names":[],"mappings":"AAEA,OAAO,EAOL,KAAK,mBAAmB,EAExB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAOf,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,aAAc,SAAQ,IAAI,CACzC,mBAAmB,CAAC,gBAAgB,CAAC,EACrC,OAAO,GAAG,cAAc,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,CACxD;IACC,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC/C,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,yGAAyG;IACzG,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5D,gCAAgC;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,oCAAoC;IACpC,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,qFAAqF;IACrF,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAKD;;;;GAIG;AACH,eAAO,MAAM,QAAQ,4GAwPnB,CAAC"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { forwardRef, useEffect, useId, useMemo, useRef, useState, } from 'react';
|
|
4
|
+
import * as PopoverPrimitive from '@radix-ui/react-popover';
|
|
5
|
+
import { cx } from '../internal/cx.js';
|
|
6
|
+
import { CheckGlyph, ChevronDownGlyph } from '../internal/icons.js';
|
|
7
|
+
import { useFieldControl } from './field.js';
|
|
8
|
+
import { Spinner } from './spinner.js';
|
|
9
|
+
const defaultFilter = (o, q) => o.label.toLowerCase().includes(q.toLowerCase());
|
|
10
|
+
/**
|
|
11
|
+
* Single-select with typeahead. The input is the combobox; the list is a
|
|
12
|
+
* listbox positioned by Radix Popover. Keyboard: Down/Up move, Home/End jump,
|
|
13
|
+
* Enter selects, Escape closes, typing filters.
|
|
14
|
+
*/
|
|
15
|
+
export const Combobox = forwardRef(function Combobox({ options, value: valueProp, defaultValue = null, onValueChange, inputValue: inputProp, onInputValueChange, filter = defaultFilter, loading = false, emptyMessage = 'No matches', invalid, size = 'md', clearable = true, placeholder, className, onKeyDown, onBlur, ...rest }, ref) {
|
|
16
|
+
const id = useId();
|
|
17
|
+
const listId = `mn-combobox-${id}-list`;
|
|
18
|
+
const [open, setOpen] = useState(false);
|
|
19
|
+
const [internalValue, setInternalValue] = useState(defaultValue);
|
|
20
|
+
const value = valueProp !== undefined ? valueProp : internalValue;
|
|
21
|
+
const selected = useMemo(() => options.find((o) => o.value === value) ?? null, [options, value]);
|
|
22
|
+
const [internalInput, setInternalInput] = useState(selected?.label ?? '');
|
|
23
|
+
const inputValue = inputProp !== undefined ? inputProp : internalInput;
|
|
24
|
+
const [active, setActive] = useState(0);
|
|
25
|
+
const inputRef = useRef(null);
|
|
26
|
+
const listRef = useRef(null);
|
|
27
|
+
const setInput = (text) => {
|
|
28
|
+
if (inputProp === undefined)
|
|
29
|
+
setInternalInput(text);
|
|
30
|
+
onInputValueChange?.(text);
|
|
31
|
+
};
|
|
32
|
+
const select = (next) => {
|
|
33
|
+
if (valueProp === undefined)
|
|
34
|
+
setInternalValue(next?.value ?? null);
|
|
35
|
+
onValueChange?.(next?.value ?? null);
|
|
36
|
+
setInput(next?.label ?? '');
|
|
37
|
+
setOpen(false);
|
|
38
|
+
};
|
|
39
|
+
// Keep the text in sync when the selection changes from outside.
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
if (!open && inputProp === undefined)
|
|
42
|
+
setInternalInput(selected?.label ?? '');
|
|
43
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
44
|
+
}, [selected?.label]);
|
|
45
|
+
const visible = useMemo(() => {
|
|
46
|
+
const q = inputValue.trim();
|
|
47
|
+
const typedNew = q !== '' && q !== (selected?.label ?? '');
|
|
48
|
+
return typedNew ? options.filter((o) => filter(o, q)) : options;
|
|
49
|
+
}, [options, inputValue, selected?.label, filter]);
|
|
50
|
+
useEffect(() => {
|
|
51
|
+
setActive((a) => Math.min(a, Math.max(0, visible.length - 1)));
|
|
52
|
+
}, [visible.length]);
|
|
53
|
+
useEffect(() => {
|
|
54
|
+
if (!open)
|
|
55
|
+
return;
|
|
56
|
+
const el = listRef.current?.querySelector(`[data-index="${active}"]`);
|
|
57
|
+
el?.scrollIntoView?.({ block: 'nearest' });
|
|
58
|
+
}, [active, open]);
|
|
59
|
+
const activeId = open && visible[active] ? `${listId}-opt-${active}` : undefined;
|
|
60
|
+
const handleKey = (e) => {
|
|
61
|
+
// Radix's dismissable layer prevents default on Escape before this runs,
|
|
62
|
+
// so only a consumer's own preventDefault stops the built-in handling.
|
|
63
|
+
const preventedBefore = e.defaultPrevented;
|
|
64
|
+
onKeyDown?.(e);
|
|
65
|
+
if (e.defaultPrevented && !preventedBefore)
|
|
66
|
+
return;
|
|
67
|
+
switch (e.key) {
|
|
68
|
+
case 'ArrowDown':
|
|
69
|
+
e.preventDefault();
|
|
70
|
+
if (!open)
|
|
71
|
+
setOpen(true);
|
|
72
|
+
else
|
|
73
|
+
setActive((a) => Math.min(a + 1, visible.length - 1));
|
|
74
|
+
break;
|
|
75
|
+
case 'ArrowUp':
|
|
76
|
+
e.preventDefault();
|
|
77
|
+
if (!open)
|
|
78
|
+
setOpen(true);
|
|
79
|
+
else
|
|
80
|
+
setActive((a) => Math.max(a - 1, 0));
|
|
81
|
+
break;
|
|
82
|
+
case 'Home':
|
|
83
|
+
if (open) {
|
|
84
|
+
e.preventDefault();
|
|
85
|
+
setActive(0);
|
|
86
|
+
}
|
|
87
|
+
break;
|
|
88
|
+
case 'End':
|
|
89
|
+
if (open) {
|
|
90
|
+
e.preventDefault();
|
|
91
|
+
setActive(visible.length - 1);
|
|
92
|
+
}
|
|
93
|
+
break;
|
|
94
|
+
case 'Enter':
|
|
95
|
+
if (open) {
|
|
96
|
+
e.preventDefault();
|
|
97
|
+
const opt = visible[active];
|
|
98
|
+
if (opt && !opt.disabled)
|
|
99
|
+
select(opt);
|
|
100
|
+
}
|
|
101
|
+
break;
|
|
102
|
+
case 'Escape':
|
|
103
|
+
if (open) {
|
|
104
|
+
e.preventDefault();
|
|
105
|
+
setOpen(false);
|
|
106
|
+
setInput(selected?.label ?? '');
|
|
107
|
+
}
|
|
108
|
+
break;
|
|
109
|
+
case 'Backspace':
|
|
110
|
+
if (clearable && inputValue === '' && selected)
|
|
111
|
+
select(null);
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
const fieldProps = useFieldControl(rest, { invalid });
|
|
116
|
+
return (_jsxs(PopoverPrimitive.Root, { open: open, onOpenChange: (next) => {
|
|
117
|
+
setOpen(next);
|
|
118
|
+
if (!next)
|
|
119
|
+
setInput(selected?.label ?? '');
|
|
120
|
+
}, children: [_jsx(PopoverPrimitive.Anchor, { asChild: true, children: _jsxs("div", { className: cx('mn-input', 'mn-combobox', className), "data-size": size, "data-disabled": fieldProps.disabled || undefined, children: [_jsx("input", { ref: (node) => {
|
|
121
|
+
inputRef.current = node;
|
|
122
|
+
if (typeof ref === 'function')
|
|
123
|
+
ref(node);
|
|
124
|
+
else if (ref)
|
|
125
|
+
ref.current = node;
|
|
126
|
+
}, ...fieldProps, type: "text", role: "combobox", autoComplete: "off", "aria-autocomplete": "list", "aria-expanded": open, "aria-controls": open ? listId : undefined, "aria-activedescendant": activeId, className: "mn-combobox__input", placeholder: placeholder, value: inputValue, onChange: (e) => {
|
|
127
|
+
setInput(e.target.value);
|
|
128
|
+
setActive(0);
|
|
129
|
+
if (!open)
|
|
130
|
+
setOpen(true);
|
|
131
|
+
}, onKeyDown: handleKey, onBlur: (e) => {
|
|
132
|
+
onBlur?.(e);
|
|
133
|
+
// Revert unmatched text so the input always reflects the selection.
|
|
134
|
+
if (!listRef.current?.contains(e.relatedTarget))
|
|
135
|
+
setInput(selected?.label ?? '');
|
|
136
|
+
} }), loading ? _jsx(Spinner, { size: "sm", className: "mn-combobox__spinner" }) : null, _jsx("button", { type: "button", tabIndex: -1, "aria-label": open ? 'Close options' : 'Show options', className: "mn-combobox__toggle", disabled: fieldProps.disabled, onMouseDown: (e) => e.preventDefault(), onClick: () => {
|
|
137
|
+
setOpen((o) => !o);
|
|
138
|
+
inputRef.current?.focus();
|
|
139
|
+
}, children: _jsx(ChevronDownGlyph, {}) })] }) }), _jsx(PopoverPrimitive.Portal, { children: _jsx(PopoverPrimitive.Content, { align: "start", sideOffset: 4, onOpenAutoFocus: (e) => e.preventDefault(), onCloseAutoFocus: (e) => e.preventDefault(), onInteractOutside: (e) => {
|
|
140
|
+
if (inputRef.current?.contains(e.target))
|
|
141
|
+
e.preventDefault();
|
|
142
|
+
}, className: "mn-menu mn-combobox__content", children: _jsx("div", { ref: listRef, id: listId, role: "listbox", "aria-label": rest['aria-label'] ?? 'Options', className: "mn-combobox__list", children: loading && visible.length === 0 ? (_jsx("div", { className: "mn-combobox__status", role: "status", children: "Loading\u2026" })) : visible.length === 0 ? (_jsx("div", { className: "mn-combobox__status", role: "status", children: emptyMessage })) : (visible.map((o, i) => (
|
|
143
|
+
// Options follow the aria-activedescendant pattern: the input keeps
|
|
144
|
+
// focus and handles every key, so options are deliberately not focusable.
|
|
145
|
+
// monarch-ignore-next-line a11y/click-without-key -- aria-activedescendant pattern: the input handles all keys
|
|
146
|
+
// eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/interactive-supports-focus
|
|
147
|
+
_jsxs("div", { id: `${listId}-opt-${i}`, role: "option", "aria-selected": o.value === value, "aria-disabled": o.disabled || undefined, "data-index": i, "data-highlighted": i === active || undefined, className: "mn-menu__item", onMouseEnter: () => setActive(i), onMouseDown: (e) => e.preventDefault(), onClick: () => {
|
|
148
|
+
if (!o.disabled)
|
|
149
|
+
select(o);
|
|
150
|
+
}, children: [_jsxs("span", { className: "mn-menu__text", children: [o.label, o.description ? (_jsx("span", { className: "mn-combobox__description", children: o.description })) : null] }), o.value === value ? (_jsx("span", { className: "mn-menu__indicator", children: _jsx(CheckGlyph, {}) })) : null] }, o.value)))) }) }) })] }));
|
|
151
|
+
});
|
|
152
|
+
//# sourceMappingURL=combobox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"combobox.js","sourceRoot":"","sources":["../../src/components/combobox.tsx"],"names":[],"mappings":"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"}
|