@rinzai/zen 0.5.0 → 0.6.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 +2 -2
- package/dist/animated-number/index.js +33 -0
- package/dist/avatar/index.js +38 -0
- package/dist/backdrop/index.d.ts +7 -3
- package/dist/backdrop/index.d.ts.map +1 -1
- package/dist/backdrop/index.js +98 -0
- package/dist/badge/index.d.ts +1 -1
- package/dist/badge/index.js +24 -0
- package/dist/button/index.d.ts +10 -3
- package/dist/button/index.d.ts.map +1 -1
- package/dist/button/index.js +54 -0
- package/dist/calendar/index.d.ts +44 -0
- package/dist/calendar/index.d.ts.map +1 -0
- package/dist/calendar/index.js +161 -0
- package/dist/card/index.d.ts +15 -6
- package/dist/card/index.d.ts.map +1 -1
- package/dist/card/index.js +60 -0
- package/dist/chart/donut.d.ts +30 -0
- package/dist/chart/donut.d.ts.map +1 -0
- package/dist/chart/donut.js +96 -0
- package/dist/chart/index.d.ts +81 -0
- package/dist/chart/index.d.ts.map +1 -0
- package/dist/chart/index.js +362 -0
- package/dist/chart/tooltip.d.ts +25 -0
- package/dist/chart/tooltip.d.ts.map +1 -0
- package/dist/chart/tooltip.js +51 -0
- package/dist/checkbox/index.d.ts +20 -0
- package/dist/checkbox/index.d.ts.map +1 -0
- package/dist/checkbox/index.js +61 -0
- package/dist/chip/index.d.ts +12 -0
- package/dist/chip/index.d.ts.map +1 -0
- package/dist/chip/index.js +14 -0
- package/dist/code-block/index.js +36 -0
- package/dist/collapse/index.d.ts +17 -7
- package/dist/collapse/index.d.ts.map +1 -1
- package/dist/collapse/index.js +82 -0
- package/dist/combobox/index.d.ts +89 -0
- package/dist/combobox/index.d.ts.map +1 -0
- package/dist/combobox/index.js +262 -0
- package/dist/confirm-dialog/index.d.ts.map +1 -1
- package/dist/confirm-dialog/index.js +25 -0
- package/dist/date-picker/index.d.ts +48 -0
- package/dist/date-picker/index.d.ts.map +1 -0
- package/dist/date-picker/index.js +112 -0
- package/dist/dialog/index.d.ts +14 -2
- package/dist/dialog/index.d.ts.map +1 -1
- package/dist/dialog/index.js +77 -0
- package/dist/disclosure/index.d.ts +25 -0
- package/dist/disclosure/index.d.ts.map +1 -0
- package/dist/disclosure/index.js +66 -0
- package/dist/editable-cell/index.js +24 -0
- package/dist/field/index.d.ts +42 -3
- package/dist/field/index.d.ts.map +1 -1
- package/dist/field/index.js +66 -0
- package/dist/header/index.js +17 -0
- package/dist/icons/chevron-down.js +21 -0
- package/dist/icons/chevron-left.js +21 -0
- package/dist/icons/chevron-right.js +21 -0
- package/dist/icons/chevron-up.js +21 -0
- package/dist/icons/ellipsis.d.ts +4 -0
- package/dist/icons/ellipsis.d.ts.map +1 -0
- package/dist/icons/ellipsis.js +31 -0
- package/dist/icons/index.d.ts +1 -0
- package/dist/icons/index.d.ts.map +1 -1
- package/dist/icons/search.js +21 -0
- package/dist/icons/x-mark.js +21 -0
- package/dist/index.d.ts +22 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/input/index.d.ts.map +1 -1
- package/dist/input/index.js +16 -0
- package/dist/input-group/index.d.ts.map +1 -1
- package/dist/input-group/index.js +36 -0
- package/dist/inset/index.d.ts +16 -0
- package/dist/inset/index.d.ts.map +1 -0
- package/dist/inset/index.js +23 -0
- package/dist/lib.js +74 -0
- package/dist/menu/index.d.ts +55 -0
- package/dist/menu/index.d.ts.map +1 -0
- package/dist/menu/index.js +118 -0
- package/dist/meter/index.js +41 -0
- package/dist/money-input/index.d.ts +77 -7
- package/dist/money-input/index.d.ts.map +1 -1
- package/dist/money-input/index.js +304 -0
- package/dist/month-picker/index.d.ts +4 -3
- package/dist/month-picker/index.d.ts.map +1 -1
- package/dist/month-picker/index.js +93 -0
- package/dist/page-header/index.js +26 -0
- package/dist/pills/index.d.ts +35 -0
- package/dist/pills/index.d.ts.map +1 -0
- package/dist/pills/index.js +50 -0
- package/dist/popover/index.d.ts +41 -22
- package/dist/popover/index.d.ts.map +1 -1
- package/dist/popover/index.js +75 -0
- package/dist/progress-ring/index.js +49 -0
- package/dist/radio-cards/index.d.ts +34 -0
- package/dist/radio-cards/index.d.ts.map +1 -0
- package/dist/radio-cards/index.js +48 -0
- package/dist/radio-group/index.d.ts +39 -0
- package/dist/radio-group/index.d.ts.map +1 -0
- package/dist/radio-group/index.js +63 -0
- package/dist/segmented/index.d.ts +16 -6
- package/dist/segmented/index.d.ts.map +1 -1
- package/dist/segmented/index.js +58 -0
- package/dist/select/index.d.ts +28 -14
- package/dist/select/index.d.ts.map +1 -1
- package/dist/select/index.js +187 -0
- package/dist/side-nav/index.js +37 -0
- package/dist/skeleton/index.js +12 -0
- package/dist/slider/index.js +34 -0
- package/dist/spinner/index.js +14 -0
- package/dist/tab-bar/index.d.ts +3 -0
- package/dist/tab-bar/index.d.ts.map +1 -1
- package/dist/tab-bar/index.js +34 -0
- package/dist/table/index.js +148 -0
- package/dist/table-of-contents/index.js +37 -0
- package/dist/tabs/index.d.ts +3 -2
- package/dist/tabs/index.d.ts.map +1 -1
- package/dist/tabs/index.js +114 -0
- package/dist/tailwind.css +1 -1
- package/dist/textarea/index.d.ts.map +1 -1
- package/dist/textarea/index.js +16 -0
- package/dist/theme-toggle/index.js +43 -0
- package/dist/theme.css +178 -13
- package/dist/toast/index.d.ts +6 -1
- package/dist/toast/index.d.ts.map +1 -1
- package/dist/toast/index.js +248 -0
- package/dist/toggle/index.d.ts.map +1 -1
- package/dist/toggle/index.js +26 -0
- package/dist/tooltip/index.d.ts +25 -0
- package/dist/tooltip/index.d.ts.map +1 -0
- package/dist/tooltip/index.js +108 -0
- package/dist/tree/index.d.ts.map +1 -1
- package/dist/tree/index.js +135 -0
- package/dist/utils/cva.js +25 -0
- package/dist/utils/cx.js +6 -0
- package/dist/utils/date.d.ts +37 -0
- package/dist/utils/date.d.ts.map +1 -0
- package/dist/utils/date.js +68 -0
- package/dist/utils/field-chevron.js +19 -0
- package/dist/utils/fx.d.ts +30 -0
- package/dist/utils/fx.d.ts.map +1 -0
- package/dist/utils/fx.js +21 -0
- package/dist/utils/graphics.js +33 -0
- package/dist/utils/indicator.d.ts +24 -0
- package/dist/utils/indicator.d.ts.map +1 -0
- package/dist/utils/indicator.js +37 -0
- package/dist/utils/merge.js +305 -0
- package/dist/utils/money.js +73 -0
- package/dist/utils/month.js +46 -0
- package/dist/utils/slot.d.ts +9 -5
- package/dist/utils/slot.d.ts.map +1 -1
- package/dist/utils/slot.js +25 -0
- package/dist/utils/status-icons.js +48 -0
- package/dist/utils/styles.d.ts +6 -6
- package/dist/utils/styles.d.ts.map +1 -1
- package/dist/utils/styles.js +6 -0
- package/dist/utils/theme.js +200 -0
- package/dist/utils/useAnchoredPopup.d.ts +8 -2
- package/dist/utils/useAnchoredPopup.d.ts.map +1 -1
- package/dist/utils/useAnchoredPopup.js +63 -0
- package/dist/utils/useHydrated.js +9 -0
- package/dist/utils/useVirtualList.js +45 -0
- package/dist/variables.css +22 -0
- package/dist/zen.css +1 -1
- package/package.json +9 -4
- package/dist/actions-menu/index.d.ts +0 -18
- package/dist/actions-menu/index.d.ts.map +0 -1
- package/dist/dropdown/index.d.ts +0 -28
- package/dist/dropdown/index.d.ts.map +0 -1
- package/dist/nav-pills/index.d.ts +0 -31
- package/dist/nav-pills/index.d.ts.map +0 -1
- package/dist/zen.js +0 -2970
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cx as e } from "../utils/cx.js";
|
|
3
|
+
import { jsx as t, jsxs as n } from "react/jsx-runtime";
|
|
4
|
+
//#region packages/chart/tooltip.tsx
|
|
5
|
+
function r({ title: r, rows: a, className: o }) {
|
|
6
|
+
return /* @__PURE__ */ n("div", {
|
|
7
|
+
className: e("glass glass-blur min-w-40 rounded-xl px-3 py-2.5 text-xs whitespace-nowrap", o),
|
|
8
|
+
children: [/* @__PURE__ */ t("div", {
|
|
9
|
+
className: "text-foreground mb-1.5 font-medium",
|
|
10
|
+
children: r
|
|
11
|
+
}), /* @__PURE__ */ t("dl", {
|
|
12
|
+
className: "flex flex-col gap-1",
|
|
13
|
+
children: a.map((e) => /* @__PURE__ */ n("div", {
|
|
14
|
+
className: "flex items-center justify-between gap-4",
|
|
15
|
+
children: [/* @__PURE__ */ n("dt", {
|
|
16
|
+
className: "text-muted-foreground flex items-center gap-1.5",
|
|
17
|
+
children: [e.color && /* @__PURE__ */ t(i, {
|
|
18
|
+
color: e.color,
|
|
19
|
+
dashed: e.dashed
|
|
20
|
+
}), e.label]
|
|
21
|
+
}), /* @__PURE__ */ t("dd", {
|
|
22
|
+
className: "text-foreground font-medium tabular-nums",
|
|
23
|
+
children: e.value
|
|
24
|
+
})]
|
|
25
|
+
}, e.label))
|
|
26
|
+
})]
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
function i({ color: e, dashed: n, kind: r = "line" }) {
|
|
30
|
+
return r === "line" || n ? /* @__PURE__ */ t("svg", {
|
|
31
|
+
viewBox: "0 0 12 4",
|
|
32
|
+
"aria-hidden": !0,
|
|
33
|
+
className: "h-1 w-3 shrink-0 overflow-visible",
|
|
34
|
+
children: /* @__PURE__ */ t("line", {
|
|
35
|
+
x1: "0.5",
|
|
36
|
+
y1: "2",
|
|
37
|
+
x2: "11.5",
|
|
38
|
+
y2: "2",
|
|
39
|
+
strokeWidth: "2",
|
|
40
|
+
strokeLinecap: "round",
|
|
41
|
+
strokeDasharray: n ? "3 3" : void 0,
|
|
42
|
+
style: { stroke: e }
|
|
43
|
+
})
|
|
44
|
+
}) : /* @__PURE__ */ t("span", {
|
|
45
|
+
"aria-hidden": !0,
|
|
46
|
+
className: "size-2.5 shrink-0 rounded-[3px]",
|
|
47
|
+
style: { background: e }
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
//#endregion
|
|
51
|
+
export { r as ChartTooltipCard, i as Key };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ComponentProps, ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* A checkbox: a native one, styled, so forms, the keyboard and screen readers
|
|
4
|
+
* work as usual. The tick draws itself in when checked; `indeterminate` shows a
|
|
5
|
+
* dash (e.g. "some selected"). With children, they're its label (and
|
|
6
|
+
* `description` a line under it); without, label it yourself or put it in a Field.
|
|
7
|
+
*/
|
|
8
|
+
export default function Checkbox({ children, description, indeterminate, onChange, className, ...rest }: CheckboxProps): import('react').JSX.Element;
|
|
9
|
+
export interface CheckboxProps extends Omit<ComponentProps<'input'>, 'onChange' | 'type' | 'children'> {
|
|
10
|
+
onChange?: (checked: boolean) => void;
|
|
11
|
+
/** Shows a dash instead of the tick, e.g. when some of a group are checked. */
|
|
12
|
+
indeterminate?: boolean;
|
|
13
|
+
/** The label. */
|
|
14
|
+
children?: ReactNode;
|
|
15
|
+
/** A muted line under the label. */
|
|
16
|
+
description?: ReactNode;
|
|
17
|
+
/** Classes for the label (or, without one, the box). */
|
|
18
|
+
className?: string;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/checkbox/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAqB,MAAM,OAAO,CAAC;AAErE;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAC7B,QAAQ,EACR,WAAW,EACX,aAAqB,EACrB,QAAQ,EACR,SAAS,EACT,GAAG,IAAI,EACV,EAAE,aAAa,+BAqEf;AAED,MAAM,WAAW,aAAc,SAAQ,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,UAAU,CAAC;IAClG,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,+EAA+E;IAC/E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iBAAiB;IACjB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,oCAAoC;IACpC,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cx as e } from "../utils/cx.js";
|
|
3
|
+
import { useFieldProps as t } from "../field/index.js";
|
|
4
|
+
import { useEffect as n, useRef as r } from "react";
|
|
5
|
+
import { jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
6
|
+
//#region packages/checkbox/index.tsx
|
|
7
|
+
function o({ children: o, description: s, indeterminate: c = !1, onChange: l, className: u, ...d }) {
|
|
8
|
+
let f = r(null);
|
|
9
|
+
n(() => {
|
|
10
|
+
f.current && (f.current.indeterminate = c);
|
|
11
|
+
}, [c]);
|
|
12
|
+
let p = t(d), m = /* @__PURE__ */ a("span", {
|
|
13
|
+
className: e("zen__checkbox relative inline-grid size-[1.125rem] shrink-0 place-items-center", !o && u),
|
|
14
|
+
children: [
|
|
15
|
+
/* @__PURE__ */ i("input", {
|
|
16
|
+
ref: f,
|
|
17
|
+
type: "checkbox",
|
|
18
|
+
...d,
|
|
19
|
+
...p,
|
|
20
|
+
"aria-checked": c ? "mixed" : void 0,
|
|
21
|
+
onChange: (e) => l?.(e.target.checked),
|
|
22
|
+
className: e("peer border-tint/20 bg-tint/[0.04] m-0 size-full cursor-pointer appearance-none rounded-[5px] border", "outline-hidden transition-[background-color,border-color,box-shadow] duration-200", "hover:enabled:border-tint/35 focus-visible:ring-ring/50 focus-visible:ring-2", "checked:border-primary checked:bg-primary indeterminate:border-primary indeterminate:bg-primary", "checked:shadow-[0_0_14px_-2px_oklch(var(--glow)/0.8)] indeterminate:shadow-[0_0_14px_-2px_oklch(var(--glow)/0.8)]", "aria-invalid:border-destructive disabled:cursor-not-allowed disabled:opacity-50")
|
|
23
|
+
}),
|
|
24
|
+
/* @__PURE__ */ i("svg", {
|
|
25
|
+
viewBox: "0 0 16 16",
|
|
26
|
+
fill: "none",
|
|
27
|
+
stroke: "currentColor",
|
|
28
|
+
strokeWidth: "2.2",
|
|
29
|
+
strokeLinecap: "round",
|
|
30
|
+
strokeLinejoin: "round",
|
|
31
|
+
"aria-hidden": !0,
|
|
32
|
+
className: "text-primary-foreground pointer-events-none absolute size-3 opacity-0 transition-opacity duration-150 peer-checked:opacity-100 peer-indeterminate:hidden [&>path]:transition-[stroke-dashoffset] [&>path]:duration-300 [&>path]:ease-out [&>path]:[stroke-dasharray:16] [&>path]:[stroke-dashoffset:16] peer-checked:[&>path]:[stroke-dashoffset:0]",
|
|
33
|
+
children: /* @__PURE__ */ i("path", { d: "m3.5 8.5 3 3 6-7" })
|
|
34
|
+
}),
|
|
35
|
+
/* @__PURE__ */ i("svg", {
|
|
36
|
+
viewBox: "0 0 16 16",
|
|
37
|
+
stroke: "currentColor",
|
|
38
|
+
strokeWidth: "2.2",
|
|
39
|
+
strokeLinecap: "round",
|
|
40
|
+
"aria-hidden": !0,
|
|
41
|
+
className: "text-primary-foreground pointer-events-none absolute hidden size-3 peer-indeterminate:block",
|
|
42
|
+
children: /* @__PURE__ */ i("path", { d: "M4 8h8" })
|
|
43
|
+
})
|
|
44
|
+
]
|
|
45
|
+
});
|
|
46
|
+
return o ? /* @__PURE__ */ a("label", {
|
|
47
|
+
className: e("inline-flex cursor-pointer items-start gap-2.5 text-sm has-disabled:cursor-not-allowed has-disabled:opacity-60", u),
|
|
48
|
+
children: [/* @__PURE__ */ i("span", {
|
|
49
|
+
className: "mt-px flex",
|
|
50
|
+
children: m
|
|
51
|
+
}), /* @__PURE__ */ a("span", {
|
|
52
|
+
className: "flex flex-col gap-0.5",
|
|
53
|
+
children: [o, s && /* @__PURE__ */ i("span", {
|
|
54
|
+
className: "text-muted-foreground text-xs",
|
|
55
|
+
children: s
|
|
56
|
+
})]
|
|
57
|
+
})]
|
|
58
|
+
}) : m;
|
|
59
|
+
}
|
|
60
|
+
//#endregion
|
|
61
|
+
export { o as default };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ComponentProps } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* A small rounded button that can be pressed in, for quick picks beside a
|
|
4
|
+
* field (e.g. common tenures): `pressed` marks the one matching the field.
|
|
5
|
+
* For choosing exactly one of a few options, use Segmented.
|
|
6
|
+
*/
|
|
7
|
+
export default function Chip({ pressed, className, ...rest }: ChipProps): import('react').JSX.Element;
|
|
8
|
+
export interface ChipProps extends ComponentProps<'button'> {
|
|
9
|
+
/** Shown pressed in (aria-pressed). */
|
|
10
|
+
pressed?: boolean;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/chip/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAEvC;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,SAAS,+BActE;AAED,MAAM,WAAW,SAAU,SAAQ,cAAc,CAAC,QAAQ,CAAC;IACvD,uCAAuC;IACvC,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cx as e } from "../utils/cx.js";
|
|
3
|
+
import { jsx as t } from "react/jsx-runtime";
|
|
4
|
+
//#region packages/chip/index.tsx
|
|
5
|
+
function n({ pressed: n, className: r, ...i }) {
|
|
6
|
+
return /* @__PURE__ */ t("button", {
|
|
7
|
+
type: "button",
|
|
8
|
+
"aria-pressed": n,
|
|
9
|
+
className: e("zen__chip border-tint/10 text-muted-foreground rounded-full border px-3 py-1 text-xs outline-hidden transition-colors", "hover:border-tint/20 hover:text-foreground focus-visible:ring-ring/50 focus-visible:ring-2", "aria-pressed:border-primary/40 aria-pressed:bg-primary/15 aria-pressed:text-foreground", r),
|
|
10
|
+
...i
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
//#endregion
|
|
14
|
+
export { n as default };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cx as e } from "../utils/cx.js";
|
|
3
|
+
import { useEffect as t, useState as n } from "react";
|
|
4
|
+
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
5
|
+
//#region packages/code-block/index.tsx
|
|
6
|
+
function a({ code: a, language: o, highlight: s, copyable: c = !0, variant: l = "glass", className: u, ...d }) {
|
|
7
|
+
let f = a.trim(), [p, m] = n(!1);
|
|
8
|
+
return t(() => {
|
|
9
|
+
if (!p) return;
|
|
10
|
+
let e = setTimeout(() => m(!1), 1500);
|
|
11
|
+
return () => clearTimeout(e);
|
|
12
|
+
}, [p]), /* @__PURE__ */ i("div", {
|
|
13
|
+
className: e("zen__code-block group relative", l === "glass" && "glass glow-edge overflow-hidden rounded-xl", u),
|
|
14
|
+
"data-language": o,
|
|
15
|
+
...d,
|
|
16
|
+
children: [/* @__PURE__ */ r("pre", {
|
|
17
|
+
className: "text-foreground m-0! overflow-x-auto rounded-none! bg-transparent! p-5! font-mono text-[13px]! leading-6 font-normal!",
|
|
18
|
+
children: s ? /* @__PURE__ */ r("code", {
|
|
19
|
+
className: "bg-transparent! p-0! text-inherit!",
|
|
20
|
+
dangerouslySetInnerHTML: { __html: s(f, o) }
|
|
21
|
+
}) : /* @__PURE__ */ r("code", {
|
|
22
|
+
className: "bg-transparent! p-0! text-inherit!",
|
|
23
|
+
children: f
|
|
24
|
+
})
|
|
25
|
+
}), c && /* @__PURE__ */ r("button", {
|
|
26
|
+
type: "button",
|
|
27
|
+
onClick: async () => {
|
|
28
|
+
await navigator.clipboard?.writeText(f), m(!0);
|
|
29
|
+
},
|
|
30
|
+
className: e("text-muted-foreground hover:bg-tint/[0.07] hover:text-foreground focus-visible:ring-ring/50 absolute top-2.5 right-2.5 rounded-lg px-2.5 py-1 text-xs font-medium outline-hidden transition-[opacity,background-color,color] focus-visible:ring-2", "opacity-0 group-hover:opacity-100 focus-visible:opacity-100", p && "text-primary opacity-100"),
|
|
31
|
+
children: p ? "Copied" : "Copy"
|
|
32
|
+
})]
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
//#endregion
|
|
36
|
+
export { a as default };
|
package/dist/collapse/index.d.ts
CHANGED
|
@@ -1,14 +1,24 @@
|
|
|
1
1
|
import { BadgeProps } from '../badge';
|
|
2
|
-
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
/**
|
|
4
|
+
* A row showing as many items as fit on one line, and the rest behind a "+N"
|
|
5
|
+
* button that opens them in a popover. It measures the items as rendered (any
|
|
6
|
+
* content, font or style), and fits again whenever the row resizes. Size the
|
|
7
|
+
* row with className (e.g. w-full, max-w-md, gap-1).
|
|
8
|
+
*/
|
|
9
|
+
export default function Collapse<TData>({ items, data, children, moreLabel, badgeVariant, badgeClassName, className, }: CollapseProps<TData>): import('react').JSX.Element;
|
|
3
10
|
export interface CollapseProps<TData> {
|
|
4
11
|
items: string[];
|
|
12
|
+
/** Extra data per item, passed to `children` with it. */
|
|
5
13
|
data?: TData[];
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
font?: string;
|
|
14
|
+
/** Renders one item (in the row, or in the popover when it doesn't fit). */
|
|
15
|
+
children: (item: string, index: number, itemData?: TData) => ReactNode;
|
|
16
|
+
/** Text after the count on the "+N" button, e.g. "tags". */
|
|
17
|
+
moreLabel?: string;
|
|
11
18
|
badgeVariant?: BadgeProps['variant'];
|
|
12
|
-
|
|
19
|
+
/** Classes for the "+N" badge. */
|
|
20
|
+
badgeClassName?: string;
|
|
21
|
+
/** Classes for the row: its width, and the gap between items. */
|
|
22
|
+
className?: string;
|
|
13
23
|
}
|
|
14
24
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/collapse/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/collapse/index.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG/C,OAAO,EAAE,SAAS,EAAgD,MAAM,OAAO,CAAC;AAEhF;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,KAAK,EAAE,EACpC,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,SAAc,EACd,YAA0B,EAC1B,cAAc,EACd,SAAS,GACZ,EAAE,aAAa,CAAC,KAAK,CAAC,+BAiGtB;AAED,MAAM,WAAW,aAAa,CAAC,KAAK;IAChC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,yDAAyD;IACzD,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC;IACf,4EAA4E;IAC5E,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,KAAK,KAAK,SAAS,CAAC;IACvE,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;IACrC,kCAAkC;IAClC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cx as e } from "../utils/cx.js";
|
|
3
|
+
import t from "../badge/index.js";
|
|
4
|
+
import n, { PopoverContent as r, PopoverTrigger as i } from "../popover/index.js";
|
|
5
|
+
import { useEffect as a, useLayoutEffect as o, useRef as s, useState as c } from "react";
|
|
6
|
+
import { jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
7
|
+
//#region packages/collapse/index.tsx
|
|
8
|
+
function d({ items: d, data: f, children: p, moreLabel: m = "", badgeVariant: h = "secondary", badgeClassName: g, className: _ }) {
|
|
9
|
+
let v = s(null), [y, b] = c(null), x = s({
|
|
10
|
+
items: [],
|
|
11
|
+
more: 0,
|
|
12
|
+
gap: 0
|
|
13
|
+
}), S = d.join("\0");
|
|
14
|
+
o(() => b(null), [S]), o(() => {
|
|
15
|
+
let e = v.current;
|
|
16
|
+
if (!e) return;
|
|
17
|
+
let t = () => {
|
|
18
|
+
let { items: t, more: n, gap: r } = x.current, i = e.clientWidth;
|
|
19
|
+
if (t.reduce((e, t) => e + t, 0) + r * Math.max(0, t.length - 1) <= i) return t.length;
|
|
20
|
+
let a = n, o = 0;
|
|
21
|
+
for (; o < t.length && a + t[o] + r <= i;) a += t[o++] + r;
|
|
22
|
+
return o;
|
|
23
|
+
};
|
|
24
|
+
if (y === null) {
|
|
25
|
+
let n = Array.from(e.querySelectorAll(":scope > [data-collapse-item]")), r = e.querySelector(":scope > [data-collapse-more]");
|
|
26
|
+
x.current = {
|
|
27
|
+
items: n.map((e) => e.offsetWidth),
|
|
28
|
+
more: r?.offsetWidth ?? 0,
|
|
29
|
+
gap: parseFloat(getComputedStyle(e).columnGap) || 0
|
|
30
|
+
}, b(t());
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
if (typeof ResizeObserver > "u") return;
|
|
34
|
+
let n = new ResizeObserver(() => b(t()));
|
|
35
|
+
return n.observe(e), () => n.disconnect();
|
|
36
|
+
}, [y, S]), a(() => {
|
|
37
|
+
let e = !0;
|
|
38
|
+
return document.fonts?.ready.then(() => e && b(null)), () => {
|
|
39
|
+
e = !1;
|
|
40
|
+
};
|
|
41
|
+
}, []);
|
|
42
|
+
let C = y ?? d.length, w = d.slice(C), T = (e) => `+${e}${m ? ` ${m}` : ""}`;
|
|
43
|
+
return /* @__PURE__ */ u("div", {
|
|
44
|
+
ref: v,
|
|
45
|
+
className: e("zen__collapse flex min-w-0 items-center overflow-hidden", _),
|
|
46
|
+
children: [d.slice(0, C).map((e, t) => /* @__PURE__ */ l("span", {
|
|
47
|
+
"data-collapse-item": !0,
|
|
48
|
+
className: "flex shrink-0",
|
|
49
|
+
children: p(e, t, f?.[t])
|
|
50
|
+
}, e)), y === null ? /* @__PURE__ */ l("span", {
|
|
51
|
+
"data-collapse-more": !0,
|
|
52
|
+
"aria-hidden": !0,
|
|
53
|
+
className: "invisible flex shrink-0",
|
|
54
|
+
children: /* @__PURE__ */ l(t, {
|
|
55
|
+
variant: h,
|
|
56
|
+
className: g,
|
|
57
|
+
children: T(d.length)
|
|
58
|
+
})
|
|
59
|
+
}) : w.length > 0 && /* @__PURE__ */ u(n, { children: [/* @__PURE__ */ l(i, {
|
|
60
|
+
"data-collapse-more": !0,
|
|
61
|
+
onClick: (e) => e.stopPropagation(),
|
|
62
|
+
className: "flex shrink-0 rounded-md",
|
|
63
|
+
"aria-label": `Show ${T(w.length).slice(1)}`,
|
|
64
|
+
children: /* @__PURE__ */ l(t, {
|
|
65
|
+
variant: h,
|
|
66
|
+
className: e("cursor-pointer", g),
|
|
67
|
+
children: T(w.length)
|
|
68
|
+
})
|
|
69
|
+
}), /* @__PURE__ */ l(r, {
|
|
70
|
+
"aria-label": T(w.length).slice(1),
|
|
71
|
+
children: /* @__PURE__ */ l("div", {
|
|
72
|
+
className: "grid max-h-60 grid-flow-row grid-cols-2 gap-3 overflow-auto p-2",
|
|
73
|
+
children: w.map((e, t) => /* @__PURE__ */ l("span", {
|
|
74
|
+
className: "flex",
|
|
75
|
+
children: p(e, C + t, f?.[C + t])
|
|
76
|
+
}, e))
|
|
77
|
+
})
|
|
78
|
+
})] })]
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
//#endregion
|
|
82
|
+
export { d as default };
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { ComponentProps, ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Pick one or several items from a list you can search: a field that opens a
|
|
4
|
+
* panel with a search box and the matching items. Compose it from
|
|
5
|
+
* ComboboxTrigger, ComboboxPopup, ComboboxSearch, ComboboxList (virtualized,
|
|
6
|
+
* for long lists), ComboboxItem, ComboboxEmpty and ComboboxCreate. Keyboard:
|
|
7
|
+
* Enter, Space or ↓ on the field opens it, typing searches, ↑↓ move, Enter
|
|
8
|
+
* chooses, Escape closes. Items can be any shape: say how to read a key and
|
|
9
|
+
* text from one with `itemKey` and `itemText`.
|
|
10
|
+
*/
|
|
11
|
+
export default function Combobox<T>(props: ComboboxProps<T>): import('react').JSX.Element;
|
|
12
|
+
/**
|
|
13
|
+
* The field: shows the choice (text, or chips when `multiple`) or the
|
|
14
|
+
* placeholder, and opens the panel. Pass children to show the value your own way.
|
|
15
|
+
*/
|
|
16
|
+
export declare function ComboboxTrigger({ placeholder, disabled, className, style, children, ...rest }: ComboboxTriggerProps): import('react').JSX.Element;
|
|
17
|
+
/** The panel under the field. Put ComboboxSearch and ComboboxList in it. */
|
|
18
|
+
export declare function ComboboxPopup({ className, children }: {
|
|
19
|
+
className?: string;
|
|
20
|
+
children: ReactNode;
|
|
21
|
+
}): import('react').JSX.Element;
|
|
22
|
+
/** The search box: focused when the panel opens; ↑↓ move through the matches and Enter chooses. */
|
|
23
|
+
export declare function ComboboxSearch({ placeholder, 'aria-label': ariaLabel, }: ComboboxSearchProps): import('react').JSX.Element;
|
|
24
|
+
/**
|
|
25
|
+
* The matching items, rendered only while in view (so thousands stay fast).
|
|
26
|
+
* Rows are `itemHeight` px tall; `renderItem` draws each (default: a
|
|
27
|
+
* ComboboxItem). Put ComboboxEmpty or ComboboxCreate inside for no matches.
|
|
28
|
+
*/
|
|
29
|
+
export declare function ComboboxList<T>({ renderItem, itemHeight, children }: ComboboxListProps<T>): import('react').JSX.Element;
|
|
30
|
+
/** One item in a ComboboxList: a check when chosen, then its text (or your own content). */
|
|
31
|
+
export declare function ComboboxItem<T>({ item, className, children }: ComboboxItemProps<T>): import('react').JSX.Element;
|
|
32
|
+
/** Shown when the search matches nothing. */
|
|
33
|
+
export declare function ComboboxEmpty({ children }: {
|
|
34
|
+
children?: ReactNode;
|
|
35
|
+
}): import('react').JSX.Element | null;
|
|
36
|
+
/**
|
|
37
|
+
* Offered when the search matches nothing: adds what was typed (Enter works
|
|
38
|
+
* too). `children` renders the row from the text (default "Add …").
|
|
39
|
+
*/
|
|
40
|
+
export declare function ComboboxCreate({ onCreate, children }: ComboboxCreateProps): import('react').JSX.Element | null;
|
|
41
|
+
interface ComboboxBaseProps<T> {
|
|
42
|
+
items: readonly T[];
|
|
43
|
+
/** How to read an item's unique key (default: its `key`). */
|
|
44
|
+
itemKey?: (item: T) => string;
|
|
45
|
+
/** How to read an item's text, shown and searched (default: its `text`). */
|
|
46
|
+
itemText?: (item: T) => string;
|
|
47
|
+
/** Whether an item matches the search (default: its text contains it, any case). */
|
|
48
|
+
filter?: (item: T, query: string) => boolean;
|
|
49
|
+
/** Chosen items that aren't in `items` (e.g. just created), so the field can still show them. */
|
|
50
|
+
selectedItems?: readonly T[];
|
|
51
|
+
children: ReactNode;
|
|
52
|
+
}
|
|
53
|
+
export type ComboboxProps<T> = ComboboxBaseProps<T> & ({
|
|
54
|
+
multiple?: false;
|
|
55
|
+
value: string | null;
|
|
56
|
+
onValueChange: (key: string) => void;
|
|
57
|
+
} | {
|
|
58
|
+
multiple: true;
|
|
59
|
+
value: readonly string[];
|
|
60
|
+
onValueChange: (keys: string[]) => void;
|
|
61
|
+
});
|
|
62
|
+
export interface ComboboxTriggerProps extends Omit<ComponentProps<'div'>, 'children'> {
|
|
63
|
+
/** Shown while nothing is chosen. */
|
|
64
|
+
placeholder?: string;
|
|
65
|
+
disabled?: boolean;
|
|
66
|
+
/** Your own display of the value (default: its text, or chips). */
|
|
67
|
+
children?: ReactNode;
|
|
68
|
+
}
|
|
69
|
+
export interface ComboboxSearchProps {
|
|
70
|
+
placeholder?: string;
|
|
71
|
+
'aria-label'?: string;
|
|
72
|
+
}
|
|
73
|
+
export interface ComboboxListProps<T> {
|
|
74
|
+
renderItem?: (item: T) => ReactNode;
|
|
75
|
+
/** Height of every row, in px (default 35). */
|
|
76
|
+
itemHeight?: number;
|
|
77
|
+
children?: ReactNode;
|
|
78
|
+
}
|
|
79
|
+
export interface ComboboxItemProps<T> {
|
|
80
|
+
item: T;
|
|
81
|
+
className?: string;
|
|
82
|
+
children?: ReactNode;
|
|
83
|
+
}
|
|
84
|
+
export interface ComboboxCreateProps {
|
|
85
|
+
onCreate: (text: string) => void;
|
|
86
|
+
children?: (text: string) => ReactNode;
|
|
87
|
+
}
|
|
88
|
+
export {};
|
|
89
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/combobox/index.tsx"],"names":[],"mappings":"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"}
|