@aback-ui/ui 0.0.0-stage → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +69 -2
- package/dist/components/accordion.d.ts +8 -0
- package/dist/components/accordion.d.ts.map +1 -0
- package/dist/components/accordion.js +17 -0
- package/dist/components/accordion.js.map +1 -0
- package/dist/components/alert-dialog.d.ts +15 -0
- package/dist/components/alert-dialog.d.ts.map +1 -0
- package/dist/components/alert-dialog.js +38 -0
- package/dist/components/alert-dialog.js.map +1 -0
- package/dist/components/alert.d.ts +12 -0
- package/dist/components/alert.d.ts.map +1 -0
- package/dist/components/alert.js +28 -0
- package/dist/components/alert.js.map +1 -0
- package/dist/components/avatar.d.ts +25 -0
- package/dist/components/avatar.d.ts.map +1 -0
- package/dist/components/avatar.js +34 -0
- package/dist/components/avatar.js.map +1 -0
- package/dist/components/badge.d.ts +15 -0
- package/dist/components/badge.d.ts.map +1 -0
- package/dist/components/badge.js +27 -0
- package/dist/components/badge.js.map +1 -0
- package/dist/components/breadcrumbs.d.ts +11 -0
- package/dist/components/breadcrumbs.d.ts.map +1 -0
- package/dist/components/breadcrumbs.js +11 -0
- package/dist/components/breadcrumbs.js.map +1 -0
- package/dist/components/button.d.ts +12 -0
- package/dist/components/button.d.ts.map +1 -0
- package/dist/components/button.js +43 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/calendar.d.ts +25 -0
- package/dist/components/calendar.d.ts.map +1 -0
- package/dist/components/calendar.js +87 -0
- package/dist/components/calendar.js.map +1 -0
- package/dist/components/card.d.ts +12 -0
- package/dist/components/card.d.ts.map +1 -0
- package/dist/components/card.js +25 -0
- package/dist/components/card.js.map +1 -0
- package/dist/components/checkbox.d.ts +5 -0
- package/dist/components/checkbox.d.ts.map +1 -0
- package/dist/components/checkbox.js +10 -0
- package/dist/components/checkbox.js.map +1 -0
- package/dist/components/code-block.d.ts +25 -0
- package/dist/components/code-block.d.ts.map +1 -0
- package/dist/components/code-block.js +19 -0
- package/dist/components/code-block.js.map +1 -0
- package/dist/components/collapsible.d.ts +7 -0
- package/dist/components/collapsible.d.ts.map +1 -0
- package/dist/components/collapsible.js +11 -0
- package/dist/components/collapsible.js.map +1 -0
- package/dist/components/combobox.d.ts +40 -0
- package/dist/components/combobox.d.ts.map +1 -0
- package/dist/components/combobox.js +27 -0
- package/dist/components/combobox.js.map +1 -0
- package/dist/components/command.d.ts +24 -0
- package/dist/components/command.d.ts.map +1 -0
- package/dist/components/command.js +35 -0
- package/dist/components/command.js.map +1 -0
- package/dist/components/copy-button.d.ts +32 -0
- package/dist/components/copy-button.d.ts.map +1 -0
- package/dist/components/copy-button.js +65 -0
- package/dist/components/copy-button.js.map +1 -0
- package/dist/components/date-picker.d.ts +66 -0
- package/dist/components/date-picker.d.ts.map +1 -0
- package/dist/components/date-picker.js +75 -0
- package/dist/components/date-picker.js.map +1 -0
- package/dist/components/description-list.d.ts +29 -0
- package/dist/components/description-list.d.ts.map +1 -0
- package/dist/components/description-list.js +28 -0
- package/dist/components/description-list.js.map +1 -0
- package/dist/components/dialog.d.ts +16 -0
- package/dist/components/dialog.d.ts.map +1 -0
- package/dist/components/dialog.js +29 -0
- package/dist/components/dialog.js.map +1 -0
- package/dist/components/dropdown-menu.d.ts +26 -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/dropzone.d.ts +47 -0
- package/dist/components/dropzone.d.ts.map +1 -0
- package/dist/components/dropzone.js +125 -0
- package/dist/components/dropzone.js.map +1 -0
- package/dist/components/empty-state.d.ts +10 -0
- package/dist/components/empty-state.d.ts.map +1 -0
- package/dist/components/empty-state.js +8 -0
- package/dist/components/empty-state.js.map +1 -0
- package/dist/components/field.d.ts +17 -0
- package/dist/components/field.d.ts.map +1 -0
- package/dist/components/field.js +13 -0
- package/dist/components/field.js.map +1 -0
- package/dist/components/hover-card.d.ts +7 -0
- package/dist/components/hover-card.d.ts.map +1 -0
- package/dist/components/hover-card.js +11 -0
- package/dist/components/hover-card.js.map +1 -0
- package/dist/components/input-group.d.ts +26 -0
- package/dist/components/input-group.d.ts.map +1 -0
- package/dist/components/input-group.js +41 -0
- package/dist/components/input-group.js.map +1 -0
- package/dist/components/input.d.ts +5 -0
- package/dist/components/input.d.ts.map +1 -0
- package/dist/components/input.js +19 -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/label.d.ts +4 -0
- package/dist/components/label.d.ts.map +1 -0
- package/dist/components/label.js +9 -0
- package/dist/components/label.js.map +1 -0
- package/dist/components/layout.d.ts +69 -0
- package/dist/components/layout.d.ts.map +1 -0
- package/dist/components/layout.js +61 -0
- package/dist/components/layout.js.map +1 -0
- package/dist/components/page-header.d.ts +20 -0
- package/dist/components/page-header.d.ts.map +1 -0
- package/dist/components/page-header.js +11 -0
- package/dist/components/page-header.js.map +1 -0
- package/dist/components/pagination.d.ts +20 -0
- package/dist/components/pagination.d.ts.map +1 -0
- package/dist/components/pagination.js +51 -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 +12 -0
- package/dist/components/popover.js.map +1 -0
- package/dist/components/progress.d.ts +12 -0
- package/dist/components/progress.d.ts.map +1 -0
- package/dist/components/progress.js +11 -0
- package/dist/components/progress.js.map +1 -0
- package/dist/components/radio-group.d.ts +6 -0
- package/dist/components/radio-group.d.ts.map +1 -0
- package/dist/components/radio-group.js +12 -0
- package/dist/components/radio-group.js.map +1 -0
- package/dist/components/rating.d.ts +33 -0
- package/dist/components/rating.d.ts.map +1 -0
- package/dist/components/rating.js +52 -0
- package/dist/components/rating.js.map +1 -0
- package/dist/components/reading-progress.d.ts +16 -0
- package/dist/components/reading-progress.d.ts.map +1 -0
- package/dist/components/reading-progress.js +54 -0
- package/dist/components/reading-progress.js.map +1 -0
- package/dist/components/relative-time.d.ts +26 -0
- package/dist/components/relative-time.d.ts.map +1 -0
- package/dist/components/relative-time.js +83 -0
- package/dist/components/relative-time.js.map +1 -0
- package/dist/components/scroll-area.d.ts +10 -0
- package/dist/components/scroll-area.d.ts.map +1 -0
- package/dist/components/scroll-area.js +9 -0
- package/dist/components/scroll-area.js.map +1 -0
- package/dist/components/section-heading.d.ts +28 -0
- package/dist/components/section-heading.d.ts.map +1 -0
- package/dist/components/section-heading.js +23 -0
- package/dist/components/section-heading.js.map +1 -0
- package/dist/components/select.d.ts +5 -0
- package/dist/components/select.d.ts.map +1 -0
- package/dist/components/select.js +17 -0
- package/dist/components/select.js.map +1 -0
- package/dist/components/separator.d.ts +5 -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/share-buttons.d.ts +25 -0
- package/dist/components/share-buttons.d.ts.map +1 -0
- package/dist/components/share-buttons.js +67 -0
- package/dist/components/share-buttons.js.map +1 -0
- package/dist/components/sheet.d.ts +18 -0
- package/dist/components/sheet.d.ts.map +1 -0
- package/dist/components/sheet.js +35 -0
- package/dist/components/sheet.js.map +1 -0
- package/dist/components/skeleton.d.ts +4 -0
- package/dist/components/skeleton.d.ts.map +1 -0
- package/dist/components/skeleton.js +7 -0
- package/dist/components/skeleton.js.map +1 -0
- package/dist/components/skip-link.d.ts +13 -0
- package/dist/components/skip-link.d.ts.map +1 -0
- package/dist/components/skip-link.js +12 -0
- package/dist/components/skip-link.js.map +1 -0
- package/dist/components/slider.d.ts +9 -0
- package/dist/components/slider.d.ts.map +1 -0
- package/dist/components/slider.js +9 -0
- package/dist/components/slider.js.map +1 -0
- package/dist/components/spinner.d.ts +14 -0
- package/dist/components/spinner.d.ts.map +1 -0
- package/dist/components/spinner.js +13 -0
- package/dist/components/spinner.js.map +1 -0
- package/dist/components/stat.d.ts +54 -0
- package/dist/components/stat.d.ts.map +1 -0
- package/dist/components/stat.js +62 -0
- package/dist/components/stat.js.map +1 -0
- package/dist/components/steps.d.ts +21 -0
- package/dist/components/steps.d.ts.map +1 -0
- package/dist/components/steps.js +26 -0
- package/dist/components/steps.js.map +1 -0
- package/dist/components/switch.d.ts +5 -0
- package/dist/components/switch.d.ts.map +1 -0
- package/dist/components/switch.js +9 -0
- package/dist/components/switch.js.map +1 -0
- package/dist/components/table-of-contents.d.ts +28 -0
- package/dist/components/table-of-contents.d.ts.map +1 -0
- package/dist/components/table-of-contents.js +79 -0
- package/dist/components/table-of-contents.js.map +1 -0
- package/dist/components/table.d.ts +15 -0
- package/dist/components/table.d.ts.map +1 -0
- package/dist/components/table.js +29 -0
- package/dist/components/table.js.map +1 -0
- package/dist/components/tabs.d.ts +8 -0
- package/dist/components/tabs.d.ts.map +1 -0
- package/dist/components/tabs.js +16 -0
- package/dist/components/tabs.js.map +1 -0
- package/dist/components/textarea.d.ts +5 -0
- package/dist/components/textarea.d.ts.map +1 -0
- package/dist/components/textarea.js +18 -0
- package/dist/components/textarea.js.map +1 -0
- package/dist/components/theme-toggle.d.ts +43 -0
- package/dist/components/theme-toggle.d.ts.map +1 -0
- package/dist/components/theme-toggle.js +99 -0
- package/dist/components/theme-toggle.js.map +1 -0
- package/dist/components/toaster.d.ts +27 -0
- package/dist/components/toaster.d.ts.map +1 -0
- package/dist/components/toaster.js +52 -0
- package/dist/components/toaster.js.map +1 -0
- package/dist/components/toggle-group.d.ts +12 -0
- package/dist/components/toggle-group.d.ts.map +1 -0
- package/dist/components/toggle-group.js +39 -0
- package/dist/components/toggle-group.js.map +1 -0
- package/dist/components/tooltip.d.ts +10 -0
- package/dist/components/tooltip.d.ts.map +1 -0
- package/dist/components/tooltip.js +14 -0
- package/dist/components/tooltip.js.map +1 -0
- package/dist/index.d.ts +59 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +59 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +6 -0
- package/dist/lib/utils.js.map +1 -0
- package/package.json +76 -4
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { IconStar, IconStarFilled } from "@tabler/icons-react";
|
|
5
|
+
import { cn } from "../lib/utils.js";
|
|
6
|
+
const iconSize = {
|
|
7
|
+
sm: "size-4",
|
|
8
|
+
default: "size-5",
|
|
9
|
+
lg: "size-6",
|
|
10
|
+
};
|
|
11
|
+
function defaultItemLabel(value) {
|
|
12
|
+
return `${value} ${value === 1 ? "star" : "stars"}`;
|
|
13
|
+
}
|
|
14
|
+
function Star({ fill, size }) {
|
|
15
|
+
// A partial fill clips the filled glyph over the outline, so read-only
|
|
16
|
+
// averages such as 4.5 render without a second icon set.
|
|
17
|
+
const percent = Math.round(Math.min(Math.max(fill, 0), 1) * 100);
|
|
18
|
+
return (_jsxs("span", { "aria-hidden": "true", className: cn("relative inline-flex shrink-0", iconSize[size]), children: [_jsx(IconStar, { className: "size-full text-muted-foreground" }), percent > 0 ? (_jsx("span", { className: "absolute inset-y-0 left-0 overflow-hidden", style: { width: `${percent}%` }, children: _jsx(IconStarFilled, { className: cn("text-warning", iconSize[size]) }) })) : null] }));
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* A star rating. Interactive ratings are a native radio group, so arrow keys,
|
|
22
|
+
* Tab, and form submission work without custom key handling. Name the group
|
|
23
|
+
* with `aria-label` or `aria-labelledby`.
|
|
24
|
+
*/
|
|
25
|
+
function Rating({ value: valueProp, defaultValue = 0, onValueChange, max = 5, name, readOnly = false, disabled = false, clearable = false, size = "default", getItemLabel = defaultItemLabel, getValueLabel = (value, total) => `Rated ${value} out of ${total}`, className, onMouseLeave, ...props }) {
|
|
26
|
+
const generatedName = React.useId();
|
|
27
|
+
const [uncontrolled, setUncontrolled] = React.useState(defaultValue);
|
|
28
|
+
const [hovered, setHovered] = React.useState(null);
|
|
29
|
+
const value = valueProp ?? uncontrolled;
|
|
30
|
+
const stars = Array.from({ length: max }, (_, index) => index + 1);
|
|
31
|
+
if (readOnly) {
|
|
32
|
+
return (_jsx("div", { role: "img", "aria-label": getValueLabel(value, max), "data-slot": "rating", "data-readonly": "", className: cn("inline-flex items-center gap-0.5", className), ...props, children: stars.map((star) => (_jsx(Star, { fill: value - (star - 1), size: size }, star))) }));
|
|
33
|
+
}
|
|
34
|
+
function commit(next) {
|
|
35
|
+
if (valueProp === undefined)
|
|
36
|
+
setUncontrolled(next);
|
|
37
|
+
onValueChange?.(next);
|
|
38
|
+
}
|
|
39
|
+
const shown = hovered ?? value;
|
|
40
|
+
return (_jsx("div", { role: "radiogroup", "data-slot": "rating", "data-disabled": disabled ? "" : undefined, "aria-disabled": disabled || undefined, className: cn("inline-flex items-center gap-0.5", disabled && "opacity-50", className), onMouseLeave: (event) => {
|
|
41
|
+
onMouseLeave?.(event);
|
|
42
|
+
setHovered(null);
|
|
43
|
+
}, ...props, children: stars.map((star) => (_jsxs("label", { "data-slot": "rating-item", "data-state": star <= value ? "on" : "off", onMouseEnter: () => {
|
|
44
|
+
if (!disabled)
|
|
45
|
+
setHovered(star);
|
|
46
|
+
}, className: cn("relative inline-flex p-0.5 transition-transform duration-150", "has-[input:focus-visible]:ring-2 has-[input:focus-visible]:ring-focus-ring", disabled ? "cursor-not-allowed" : "cursor-pointer hover:scale-110 motion-reduce:hover:scale-100"), children: [_jsx("input", { type: "radio", className: "sr-only", name: name ?? generatedName, value: star, checked: value === star, disabled: disabled, onChange: () => commit(star), onClick: () => {
|
|
47
|
+
if (clearable && value === star)
|
|
48
|
+
commit(0);
|
|
49
|
+
} }), _jsx(Star, { fill: star <= shown ? 1 : 0, size: size }), _jsx("span", { className: "sr-only", children: getItemLabel(star, max) })] }, star))) }));
|
|
50
|
+
}
|
|
51
|
+
export { Rating };
|
|
52
|
+
//# sourceMappingURL=rating.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rating.js","sourceRoot":"","sources":["../../src/components/rating.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
export interface ReadingProgressProps extends Omit<React.ComponentProps<"div">, "children"> {
|
|
3
|
+
/**
|
|
4
|
+
* The element whose length is being read, such as the article. Without it,
|
|
5
|
+
* progress follows the whole document.
|
|
6
|
+
*/
|
|
7
|
+
target?: React.RefObject<HTMLElement | null>;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* A thin bar along the top of the viewport that fills as the reader scrolls.
|
|
11
|
+
* It is decorative and hidden from assistive technology. Updates run once per
|
|
12
|
+
* frame and write a transform directly, so scrolling never re-renders React.
|
|
13
|
+
*/
|
|
14
|
+
declare function ReadingProgress({ target, className, ...props }: ReadingProgressProps): React.JSX.Element;
|
|
15
|
+
export { ReadingProgress };
|
|
16
|
+
//# sourceMappingURL=reading-progress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reading-progress.d.ts","sourceRoot":"","sources":["../../src/components/reading-progress.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;IACzF;;;OAGG;IACH,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;CAC9C;AAcD;;;;GAIG;AACH,iBAAS,eAAe,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,oBAAoB,qBA4C7E;AAED,OAAO,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { cn } from "../lib/utils.js";
|
|
5
|
+
function measure(target) {
|
|
6
|
+
if (!target) {
|
|
7
|
+
const root = document.documentElement;
|
|
8
|
+
const scrollable = root.scrollHeight - root.clientHeight;
|
|
9
|
+
return scrollable > 0 ? root.scrollTop / scrollable : 0;
|
|
10
|
+
}
|
|
11
|
+
const rect = target.getBoundingClientRect();
|
|
12
|
+
const scrollable = rect.height - window.innerHeight;
|
|
13
|
+
if (scrollable <= 0)
|
|
14
|
+
return rect.top <= 0 ? 1 : 0;
|
|
15
|
+
return -rect.top / scrollable;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* A thin bar along the top of the viewport that fills as the reader scrolls.
|
|
19
|
+
* It is decorative and hidden from assistive technology. Updates run once per
|
|
20
|
+
* frame and write a transform directly, so scrolling never re-renders React.
|
|
21
|
+
*/
|
|
22
|
+
function ReadingProgress({ target, className, ...props }) {
|
|
23
|
+
const bar = React.useRef(null);
|
|
24
|
+
React.useEffect(() => {
|
|
25
|
+
let frame = 0;
|
|
26
|
+
let pending = false;
|
|
27
|
+
function update() {
|
|
28
|
+
const progress = Math.min(Math.max(measure(target?.current), 0), 1);
|
|
29
|
+
if (bar.current)
|
|
30
|
+
bar.current.style.transform = `scaleX(${progress})`;
|
|
31
|
+
}
|
|
32
|
+
function schedule() {
|
|
33
|
+
if (pending)
|
|
34
|
+
return;
|
|
35
|
+
pending = true;
|
|
36
|
+
frame = window.requestAnimationFrame(() => {
|
|
37
|
+
pending = false;
|
|
38
|
+
update();
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
update();
|
|
42
|
+
window.addEventListener("scroll", schedule, { passive: true });
|
|
43
|
+
window.addEventListener("resize", schedule);
|
|
44
|
+
return () => {
|
|
45
|
+
window.removeEventListener("scroll", schedule);
|
|
46
|
+
window.removeEventListener("resize", schedule);
|
|
47
|
+
if (pending)
|
|
48
|
+
window.cancelAnimationFrame(frame);
|
|
49
|
+
};
|
|
50
|
+
}, [target]);
|
|
51
|
+
return (_jsx("div", { "aria-hidden": "true", "data-slot": "reading-progress", className: cn("pointer-events-none fixed inset-x-0 top-0 z-[100] h-[3px] print:hidden", className), ...props, children: _jsx("div", { ref: bar, "data-slot": "reading-progress-bar", className: "h-full origin-left bg-linear-to-r from-primary-400 to-primary-600", style: { transform: "scaleX(0)" } }) }));
|
|
52
|
+
}
|
|
53
|
+
export { ReadingProgress };
|
|
54
|
+
//# sourceMappingURL=reading-progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reading-progress.js","sourceRoot":"","sources":["../../src/components/reading-progress.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAUlC,SAAS,OAAO,CAAC,MAA2B;IAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe,CAAC;QACtC,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACzD,OAAO,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,qBAAqB,EAAE,CAAC;IAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC;IACpD,IAAI,UAAU,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC;AAChC,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,EAAwB;IAC5E,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAiB,IAAI,CAAC,CAAC;IAE/C,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,SAAS,MAAM;YACb,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACpE,IAAI,GAAG,CAAC,OAAO;gBAAE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,UAAU,QAAQ,GAAG,CAAC;QACvE,CAAC;QACD,SAAS,QAAQ;YACf,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,KAAK,GAAG,MAAM,CAAC,qBAAqB,CAAC,GAAG,EAAE;gBACxC,OAAO,GAAG,KAAK,CAAC;gBAChB,MAAM,EAAE,CAAC;YACX,CAAC,CAAC,CAAC;QACL,CAAC;QAED,MAAM,EAAE,CAAC;QACT,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC5C,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC/C,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC/C,IAAI,OAAO;gBAAE,MAAM,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAClD,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,OAAO,CACL,6BACc,MAAM,eACR,kBAAkB,EAC5B,SAAS,EAAE,EAAE,CAAC,wEAAwE,EAAE,SAAS,CAAC,KAC9F,KAAK,YAET,cACE,GAAG,EAAE,GAAG,eACE,sBAAsB,EAChC,SAAS,EAAC,mEAAmE,EAC7E,KAAK,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,GACjC,GACE,CACP,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
/**
|
|
3
|
+
* "3 hours ago", "yesterday", "in 2 days", localized by Intl. Differences
|
|
4
|
+
* under 45 seconds read as "now". Counts are truncated, so 2 h 50 min is
|
|
5
|
+
* "2 hours ago", never a rounded-up time that has not happened yet.
|
|
6
|
+
*/
|
|
7
|
+
declare function formatRelativeTime(value: Date | string | number, now?: number, locale?: string): string;
|
|
8
|
+
export interface RelativeTimeProps extends Omit<React.ComponentProps<"time">, "dateTime" | "children"> {
|
|
9
|
+
/** The moment to describe. Accepts a Date, an ISO string, or a timestamp. */
|
|
10
|
+
date: Date | string | number;
|
|
11
|
+
/** BCP 47 locale. Defaults to the browser's language. */
|
|
12
|
+
locale?: string;
|
|
13
|
+
/** How often the text updates, in milliseconds. 0 renders once. */
|
|
14
|
+
refreshInterval?: number;
|
|
15
|
+
/** Format of the server render and the hover title. */
|
|
16
|
+
absoluteFormat?: Intl.DateTimeFormatOptions;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* A relative timestamp that is safe on cached and server-rendered pages. The
|
|
20
|
+
* server and the first client render show the absolute date, so hydration
|
|
21
|
+
* matches; the relative phrase replaces it after mount. The absolute date
|
|
22
|
+
* stays available as the title and in the machine-readable `dateTime`.
|
|
23
|
+
*/
|
|
24
|
+
declare function RelativeTime({ date, locale, refreshInterval, absoluteFormat, title, ...props }: RelativeTimeProps): React.JSX.Element | null;
|
|
25
|
+
export { RelativeTime, formatRelativeTime };
|
|
26
|
+
//# sourceMappingURL=relative-time.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relative-time.d.ts","sourceRoot":"","sources":["../../src/components/relative-time.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAe/B;;;;GAIG;AACH,iBAAS,kBAAkB,CACzB,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,EAC7B,GAAG,GAAE,MAAmB,EACxB,MAAM,CAAC,EAAE,MAAM,UAUhB;AAwCD,MAAM,WAAW,iBACf,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;IACnE,6EAA6E;IAC7E,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;IAC7B,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uDAAuD;IACvD,cAAc,CAAC,EAAE,IAAI,CAAC,qBAAqB,CAAC;CAC7C;AAQD;;;;;GAKG;AACH,iBAAS,YAAY,CAAC,EACpB,IAAI,EACJ,MAAM,EACN,eAAwB,EACxB,cAAiC,EACjC,KAAK,EACL,GAAG,KAAK,EACT,EAAE,iBAAiB,4BA0BnB;AAED,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
const UNITS = [
|
|
5
|
+
["year", 31_536_000],
|
|
6
|
+
["month", 2_592_000],
|
|
7
|
+
["week", 604_800],
|
|
8
|
+
["day", 86_400],
|
|
9
|
+
["hour", 3_600],
|
|
10
|
+
["minute", 60],
|
|
11
|
+
];
|
|
12
|
+
function toDate(value) {
|
|
13
|
+
return value instanceof Date ? value : new Date(value);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* "3 hours ago", "yesterday", "in 2 days", localized by Intl. Differences
|
|
17
|
+
* under 45 seconds read as "now". Counts are truncated, so 2 h 50 min is
|
|
18
|
+
* "2 hours ago", never a rounded-up time that has not happened yet.
|
|
19
|
+
*/
|
|
20
|
+
function formatRelativeTime(value, now = Date.now(), locale) {
|
|
21
|
+
const date = toDate(value);
|
|
22
|
+
const seconds = (date.getTime() - now) / 1000;
|
|
23
|
+
const format = new Intl.RelativeTimeFormat(locale, { numeric: "auto" });
|
|
24
|
+
if (Math.abs(seconds) < 45)
|
|
25
|
+
return format.format(0, "second");
|
|
26
|
+
for (const [unit, size] of UNITS) {
|
|
27
|
+
if (Math.abs(seconds) >= size)
|
|
28
|
+
return format.format(Math.trunc(seconds / size), unit);
|
|
29
|
+
}
|
|
30
|
+
return format.format(Math.trunc(seconds / 60) || (seconds < 0 ? -1 : 1), "minute");
|
|
31
|
+
}
|
|
32
|
+
// One shared clock per refresh interval, so a list of a hundred timestamps
|
|
33
|
+
// re-renders on one timer instead of a hundred. Nothing runs until a
|
|
34
|
+
// component subscribes, and the timer stops with the last subscriber.
|
|
35
|
+
const clocks = new Map();
|
|
36
|
+
function clockFor(interval) {
|
|
37
|
+
let clock = clocks.get(interval);
|
|
38
|
+
if (!clock) {
|
|
39
|
+
clock = { now: Date.now(), listeners: new Set() };
|
|
40
|
+
clocks.set(interval, clock);
|
|
41
|
+
}
|
|
42
|
+
return clock;
|
|
43
|
+
}
|
|
44
|
+
function subscribeClock(interval, listener) {
|
|
45
|
+
const clock = clockFor(interval);
|
|
46
|
+
clock.listeners.add(listener);
|
|
47
|
+
if (!clock.timer && interval > 0) {
|
|
48
|
+
clock.timer = setInterval(() => {
|
|
49
|
+
clock.now = Date.now();
|
|
50
|
+
clock.listeners.forEach((notify) => notify());
|
|
51
|
+
}, interval);
|
|
52
|
+
}
|
|
53
|
+
return () => {
|
|
54
|
+
clock.listeners.delete(listener);
|
|
55
|
+
if (clock.listeners.size === 0) {
|
|
56
|
+
if (clock.timer)
|
|
57
|
+
clearInterval(clock.timer);
|
|
58
|
+
clocks.delete(interval);
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
const DEFAULT_ABSOLUTE = {
|
|
63
|
+
dateStyle: "medium",
|
|
64
|
+
timeStyle: "short",
|
|
65
|
+
timeZone: "UTC",
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* A relative timestamp that is safe on cached and server-rendered pages. The
|
|
69
|
+
* server and the first client render show the absolute date, so hydration
|
|
70
|
+
* matches; the relative phrase replaces it after mount. The absolute date
|
|
71
|
+
* stays available as the title and in the machine-readable `dateTime`.
|
|
72
|
+
*/
|
|
73
|
+
function RelativeTime({ date, locale, refreshInterval = 60_000, absoluteFormat = DEFAULT_ABSOLUTE, title, ...props }) {
|
|
74
|
+
const subscribe = React.useCallback((listener) => subscribeClock(refreshInterval, listener), [refreshInterval]);
|
|
75
|
+
const now = React.useSyncExternalStore(subscribe, () => clockFor(refreshInterval).now, () => null);
|
|
76
|
+
const value = toDate(date);
|
|
77
|
+
if (Number.isNaN(value.getTime()))
|
|
78
|
+
return null;
|
|
79
|
+
const absolute = new Intl.DateTimeFormat(locale ?? "en-US", absoluteFormat).format(value);
|
|
80
|
+
return (_jsx("time", { "data-slot": "relative-time", dateTime: value.toISOString(), title: title ?? absolute, ...props, children: now === null ? absolute : formatRelativeTime(value, now, locale) }));
|
|
81
|
+
}
|
|
82
|
+
export { RelativeTime, formatRelativeTime };
|
|
83
|
+
//# sourceMappingURL=relative-time.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relative-time.js","sourceRoot":"","sources":["../../src/components/relative-time.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { ScrollArea as ScrollAreaPrimitive } from "radix-ui";
|
|
3
|
+
type ScrollbarVisibility = NonNullable<React.ComponentProps<typeof ScrollAreaPrimitive.Root>["type"]>;
|
|
4
|
+
export interface ScrollAreaProps extends React.ComponentProps<typeof ScrollAreaPrimitive.Root> {
|
|
5
|
+
/** When the custom scrollbar is visible. Defaults to Radix's hover behavior. */
|
|
6
|
+
scrollbarVisibility?: ScrollbarVisibility;
|
|
7
|
+
}
|
|
8
|
+
declare function ScrollArea({ className, children, scrollbarVisibility, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, ...props }: ScrollAreaProps): React.JSX.Element;
|
|
9
|
+
export { ScrollArea };
|
|
10
|
+
//# sourceMappingURL=scroll-area.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scroll-area.d.ts","sourceRoot":"","sources":["../../src/components/scroll-area.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,UAAU,IAAI,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAI7D,KAAK,mBAAmB,GAAG,WAAW,CACpC,KAAK,CAAC,cAAc,CAAC,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAC9D,CAAC;AAEF,MAAM,WAAW,eACf,SAAQ,KAAK,CAAC,cAAc,CAAC,OAAO,mBAAmB,CAAC,IAAI,CAAC;IAC7D,gFAAgF;IAChF,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;CAC3C;AAED,iBAAS,UAAU,CAAC,EAClB,SAAS,EACT,QAAQ,EACR,mBAA6B,EAC7B,YAAY,EAAE,SAAS,EACvB,iBAAiB,EAAE,cAAc,EACjC,GAAG,KAAK,EACT,EAAE,eAAe,qBA+BjB;AAED,OAAO,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { ScrollArea as ScrollAreaPrimitive } from "radix-ui";
|
|
4
|
+
import { cn } from "../lib/utils.js";
|
|
5
|
+
function ScrollArea({ className, children, scrollbarVisibility = "hover", "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, ...props }) {
|
|
6
|
+
return (_jsxs(ScrollAreaPrimitive.Root, { "data-slot": "scroll-area", type: scrollbarVisibility, className: cn("relative overflow-hidden", className), ...props, children: [_jsx(ScrollAreaPrimitive.Viewport, { "data-slot": "scroll-area-viewport", tabIndex: 0, role: ariaLabel || ariaLabelledBy ? "region" : undefined, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, className: "size-full outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-focus-ring", children: children }), _jsx(ScrollAreaPrimitive.Scrollbar, { "data-slot": "scroll-area-scrollbar", orientation: "vertical", className: "flex touch-none select-none border-l border-transparent p-px transition-colors", children: _jsx(ScrollAreaPrimitive.Thumb, { "data-slot": "scroll-area-thumb", className: "relative flex-1 bg-scrollbar-thumb hover:bg-scrollbar-thumb-hover" }) }), _jsx(ScrollAreaPrimitive.Corner, {})] }));
|
|
7
|
+
}
|
|
8
|
+
export { ScrollArea };
|
|
9
|
+
//# sourceMappingURL=scroll-area.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scroll-area.js","sourceRoot":"","sources":["../../src/components/scroll-area.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EAAE,UAAU,IAAI,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAE7D,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAYlC,SAAS,UAAU,CAAC,EAClB,SAAS,EACT,QAAQ,EACR,mBAAmB,GAAG,OAAO,EAC7B,YAAY,EAAE,SAAS,EACvB,iBAAiB,EAAE,cAAc,EACjC,GAAG,KAAK,EACQ;IAChB,OAAO,CACL,MAAC,mBAAmB,CAAC,IAAI,iBACb,aAAa,EACvB,IAAI,EAAE,mBAAmB,EACzB,SAAS,EAAE,EAAE,CAAC,0BAA0B,EAAE,SAAS,CAAC,KAChD,KAAK,aAET,KAAC,mBAAmB,CAAC,QAAQ,iBACjB,sBAAsB,EAChC,QAAQ,EAAE,CAAC,EACX,IAAI,EAAE,SAAS,IAAI,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,gBAC5C,SAAS,qBACJ,cAAc,EAC/B,SAAS,EAAC,oGAAoG,YAE7G,QAAQ,GACoB,EAC/B,KAAC,mBAAmB,CAAC,SAAS,iBAClB,uBAAuB,EACjC,WAAW,EAAC,UAAU,EACtB,SAAS,EAAC,gFAAgF,YAE1F,KAAC,mBAAmB,CAAC,KAAK,iBACd,mBAAmB,EAC7B,SAAS,EAAC,mEAAmE,GAC7E,GAC4B,EAChC,KAAC,mBAAmB,CAAC,MAAM,KAAG,IACL,CAC5B,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
declare const titleSizes: {
|
|
3
|
+
readonly sm: "text-xl font-semibold";
|
|
4
|
+
readonly default: "text-2xl font-bold sm:text-3xl";
|
|
5
|
+
readonly lg: "text-3xl font-bold sm:text-4xl";
|
|
6
|
+
};
|
|
7
|
+
export interface SectionHeadingProps extends Omit<React.ComponentProps<"div">, "title"> {
|
|
8
|
+
title: React.ReactNode;
|
|
9
|
+
/** A short label above the title. */
|
|
10
|
+
eyebrow?: React.ReactNode;
|
|
11
|
+
description?: React.ReactNode;
|
|
12
|
+
/** A link or button that belongs to the section, such as "View all". */
|
|
13
|
+
action?: React.ReactNode;
|
|
14
|
+
/** Heading level. A section under the page title is an h2. */
|
|
15
|
+
as?: "h2" | "h3" | "h4";
|
|
16
|
+
size?: keyof typeof titleSizes;
|
|
17
|
+
align?: "start" | "center";
|
|
18
|
+
/** Id for the heading, so the section can use `aria-labelledby`. */
|
|
19
|
+
headingId?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* The heading of a page section: eyebrow, title, one-line description, and an
|
|
23
|
+
* optional action that moves to the right on wide screens. PageHeader is for
|
|
24
|
+
* the page's h1; this is for everything below it.
|
|
25
|
+
*/
|
|
26
|
+
declare function SectionHeading({ title, eyebrow, description, action, as: Heading, size, align, headingId, className, ...props }: SectionHeadingProps): React.JSX.Element;
|
|
27
|
+
export { SectionHeading };
|
|
28
|
+
//# sourceMappingURL=section-heading.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"section-heading.d.ts","sourceRoot":"","sources":["../../src/components/section-heading.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,QAAA,MAAM,UAAU;;;;CAIN,CAAC;AAQX,MAAM,WAAW,mBAAoB,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACrF,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,qCAAqC;IACrC,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,wEAAwE;IACxE,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,8DAA8D;IAC9D,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,OAAO,UAAU,CAAC;IAC/B,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC3B,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,iBAAS,cAAc,CAAC,EACtB,KAAK,EACL,OAAO,EACP,WAAW,EACX,MAAM,EACN,EAAE,EAAE,OAAc,EAClB,IAAgB,EAChB,KAAe,EACf,SAAS,EACT,SAAS,EACT,GAAG,KAAK,EACT,EAAE,mBAAmB,qBA+BrB;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from "../lib/utils.js";
|
|
3
|
+
const titleSizes = {
|
|
4
|
+
sm: "text-xl font-semibold",
|
|
5
|
+
default: "text-2xl font-bold sm:text-3xl",
|
|
6
|
+
lg: "text-3xl font-bold sm:text-4xl",
|
|
7
|
+
};
|
|
8
|
+
const descriptionSizes = {
|
|
9
|
+
sm: "text-sm",
|
|
10
|
+
default: "text-base",
|
|
11
|
+
lg: "text-lg",
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* The heading of a page section: eyebrow, title, one-line description, and an
|
|
15
|
+
* optional action that moves to the right on wide screens. PageHeader is for
|
|
16
|
+
* the page's h1; this is for everything below it.
|
|
17
|
+
*/
|
|
18
|
+
function SectionHeading({ title, eyebrow, description, action, as: Heading = "h2", size = "default", align = "start", headingId, className, ...props }) {
|
|
19
|
+
const centered = align === "center";
|
|
20
|
+
return (_jsxs("div", { "data-slot": "section-heading", className: cn("flex flex-col gap-4", centered ? "items-center text-center" : "md:flex-row md:items-end md:justify-between", className), ...props, children: [_jsxs("div", { className: cn("flex max-w-2xl flex-col gap-2", centered && "items-center"), children: [eyebrow ? (_jsx("p", { className: "text-xs font-semibold uppercase tracking-wide text-link", children: eyebrow })) : null, _jsx(Heading, { id: headingId, className: cn("leading-tight tracking-tight text-foreground text-balance", titleSizes[size]), children: title }), description ? (_jsx("p", { className: cn("leading-relaxed text-muted-foreground text-pretty", descriptionSizes[size]), children: description })) : null] }), action ? _jsx("div", { className: "shrink-0", children: action }) : null] }));
|
|
21
|
+
}
|
|
22
|
+
export { SectionHeading };
|
|
23
|
+
//# sourceMappingURL=section-heading.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"section-heading.js","sourceRoot":"","sources":["../../src/components/section-heading.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC,MAAM,UAAU,GAAG;IACjB,EAAE,EAAE,uBAAuB;IAC3B,OAAO,EAAE,gCAAgC;IACzC,EAAE,EAAE,gCAAgC;CAC5B,CAAC;AAEX,MAAM,gBAAgB,GAAG;IACvB,EAAE,EAAE,SAAS;IACb,OAAO,EAAE,WAAW;IACpB,EAAE,EAAE,SAAS;CACL,CAAC;AAiBX;;;;GAIG;AACH,SAAS,cAAc,CAAC,EACtB,KAAK,EACL,OAAO,EACP,WAAW,EACX,MAAM,EACN,EAAE,EAAE,OAAO,GAAG,IAAI,EAClB,IAAI,GAAG,SAAS,EAChB,KAAK,GAAG,OAAO,EACf,SAAS,EACT,SAAS,EACT,GAAG,KAAK,EACY;IACpB,MAAM,QAAQ,GAAG,KAAK,KAAK,QAAQ,CAAC;IACpC,OAAO,CACL,4BACY,iBAAiB,EAC3B,SAAS,EAAE,EAAE,CACX,qBAAqB,EACrB,QAAQ,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,6CAA6C,EACrF,SAAS,CACV,KACG,KAAK,aAET,eAAK,SAAS,EAAE,EAAE,CAAC,+BAA+B,EAAE,QAAQ,IAAI,cAAc,CAAC,aAC5E,OAAO,CAAC,CAAC,CAAC,CACT,YAAG,SAAS,EAAC,yDAAyD,YAAE,OAAO,GAAK,CACrF,CAAC,CAAC,CAAC,IAAI,EACR,KAAC,OAAO,IACN,EAAE,EAAE,SAAS,EACb,SAAS,EAAE,EAAE,CAAC,2DAA2D,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,YAE3F,KAAK,GACE,EACT,WAAW,CAAC,CAAC,CAAC,CACb,YAAG,SAAS,EAAE,EAAE,CAAC,mDAAmD,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC,YAC1F,WAAW,GACV,CACL,CAAC,CAAC,CAAC,IAAI,IACJ,EACL,MAAM,CAAC,CAAC,CAAC,cAAK,SAAS,EAAC,UAAU,YAAE,MAAM,GAAO,CAAC,CAAC,CAAC,IAAI,IACrD,CACP,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
declare const selectClassName: string;
|
|
3
|
+
declare const Select: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.SelectHTMLAttributes<HTMLSelectElement>, HTMLSelectElement>, "ref"> & React.RefAttributes<HTMLSelectElement>>;
|
|
4
|
+
export { Select, selectClassName };
|
|
5
|
+
//# sourceMappingURL=select.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../src/components/select.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,QAAA,MAAM,eAAe,QAMV,CAAC;AAEZ,QAAA,MAAM,MAAM,kLAmBX,CAAC;AAGF,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { IconChevronDown } from "@tabler/icons-react";
|
|
4
|
+
import { cn } from "../lib/utils.js";
|
|
5
|
+
const selectClassName = [
|
|
6
|
+
"h-9 w-full appearance-none border border-input bg-background px-3 pr-9 text-sm text-foreground shadow-xs",
|
|
7
|
+
"outline-none transition-[color,background-color,border-color,box-shadow] duration-200",
|
|
8
|
+
"focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-focus-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
|
|
9
|
+
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
10
|
+
"aria-invalid:border-destructive aria-invalid:ring-destructive/20",
|
|
11
|
+
].join(" ");
|
|
12
|
+
const Select = React.forwardRef(function Select({ className, children, ...props }, ref) {
|
|
13
|
+
return (_jsxs("div", { "data-slot": "select", className: "relative w-full", children: [_jsx("select", { ref: ref, "data-slot": "select-control", className: cn(selectClassName, className), ...props, children: children }), _jsx(IconChevronDown, { "aria-hidden": "true", className: "pointer-events-none absolute right-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground" })] }));
|
|
14
|
+
});
|
|
15
|
+
Select.displayName = "Select";
|
|
16
|
+
export { Select, selectClassName };
|
|
17
|
+
//# sourceMappingURL=select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select.js","sourceRoot":"","sources":["../../src/components/select.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC,MAAM,eAAe,GAAG;IACtB,0GAA0G;IAC1G,uFAAuF;IACvF,+IAA+I;IAC/I,iDAAiD;IACjD,kEAAkE;CACnE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEZ,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAC7B,SAAS,MAAM,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG;IACpD,OAAO,CACL,4BAAe,QAAQ,EAAC,SAAS,EAAC,iBAAiB,aACjD,iBACE,GAAG,EAAE,GAAG,eACE,gBAAgB,EAC1B,SAAS,EAAE,EAAE,CAAC,eAAe,EAAE,SAAS,CAAC,KACrC,KAAK,YAER,QAAQ,GACF,EACT,KAAC,eAAe,mBACF,MAAM,EAClB,SAAS,EAAC,4FAA4F,GACtG,IACE,CACP,CAAC;AACJ,CAAC,CACF,CAAC;AACF,MAAM,CAAC,WAAW,GAAG,QAAQ,CAAC;AAE9B,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { Separator as SeparatorPrimitive } from "radix-ui";
|
|
3
|
+
declare function Separator({ className, orientation, decorative, ...props }: React.ComponentProps<typeof SeparatorPrimitive.Root>): React.JSX.Element;
|
|
4
|
+
export { Separator };
|
|
5
|
+
//# sourceMappingURL=separator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"separator.d.ts","sourceRoot":"","sources":["../../src/components/separator.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,SAAS,IAAI,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAI3D,iBAAS,SAAS,CAAC,EACjB,SAAS,EACT,WAA0B,EAC1B,UAAiB,EACjB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,kBAAkB,CAAC,IAAI,CAAC,qBAetD;AAED,OAAO,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { Separator as SeparatorPrimitive } from "radix-ui";
|
|
4
|
+
import { cn } from "../lib/utils.js";
|
|
5
|
+
function Separator({ className, orientation = "horizontal", decorative = true, ...props }) {
|
|
6
|
+
return (_jsx(SeparatorPrimitive.Root, { "data-slot": "separator", decorative: decorative, orientation: orientation, className: cn("shrink-0 bg-separator", "data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full", "data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px", className), ...props }));
|
|
7
|
+
}
|
|
8
|
+
export { Separator };
|
|
9
|
+
//# sourceMappingURL=separator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"separator.js","sourceRoot":"","sources":["../../src/components/separator.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EAAE,SAAS,IAAI,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAE3D,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC,SAAS,SAAS,CAAC,EACjB,SAAS,EACT,WAAW,GAAG,YAAY,EAC1B,UAAU,GAAG,IAAI,EACjB,GAAG,KAAK,EAC6C;IACrD,OAAO,CACL,KAAC,kBAAkB,CAAC,IAAI,iBACZ,WAAW,EACrB,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,EAAE,CACX,uBAAuB,EACvB,yEAAyE,EACzE,qEAAqE,EACrE,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
export type ShareNetwork = "x" | "linkedin" | "facebook" | "whatsapp" | "reddit" | "email";
|
|
3
|
+
/** Builds the share URL for one network. Exported for custom layouts. */
|
|
4
|
+
declare function shareUrl(network: ShareNetwork, url: string, title?: string): string;
|
|
5
|
+
export interface ShareButtonsProps extends Omit<React.ComponentProps<"div">, "title"> {
|
|
6
|
+
/** The absolute URL being shared. */
|
|
7
|
+
url: string;
|
|
8
|
+
/** Used as the post text or email subject where the network supports it. */
|
|
9
|
+
title?: string;
|
|
10
|
+
networks?: ShareNetwork[];
|
|
11
|
+
/** Add a copy-link button. */
|
|
12
|
+
copyLink?: boolean;
|
|
13
|
+
/** Add a native share button where the browser offers the Web Share API. */
|
|
14
|
+
nativeShare?: boolean;
|
|
15
|
+
/** Show network names next to the icons. */
|
|
16
|
+
showLabels?: boolean;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Share links for a page. Each network is a plain link that opens in a new
|
|
20
|
+
* tab with `noopener`, so nothing loads from a third party until someone
|
|
21
|
+
* chooses to share. Every control has an accessible name.
|
|
22
|
+
*/
|
|
23
|
+
declare function ShareButtons({ url, title, networks: selected, copyLink, nativeShare, showLabels, className, "aria-label": ariaLabel, ...props }: ShareButtonsProps): React.JSX.Element;
|
|
24
|
+
export { ShareButtons, shareUrl };
|
|
25
|
+
//# sourceMappingURL=share-buttons.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"share-buttons.d.ts","sourceRoot":"","sources":["../../src/components/share-buttons.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAgB/B,MAAM,MAAM,YAAY,GAAG,GAAG,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAC;AA4C3F,yEAAyE;AACzE,iBAAS,QAAQ,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,SAAK,UAE/D;AAMD,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACnF,qCAAqC;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;IAC1B,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4EAA4E;IAC5E,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;;GAIG;AACH,iBAAS,YAAY,CAAC,EACpB,GAAG,EACH,KAAU,EACV,QAAQ,EAAE,QAA4B,EACtC,QAAe,EACf,WAAmB,EACnB,UAAkB,EAClB,SAAS,EACT,YAAY,EAAE,SAAmB,EACjC,GAAG,KAAK,EACT,EAAE,iBAAiB,qBA8DnB;AAED,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { IconBrandFacebook, IconBrandLinkedin, IconBrandReddit, IconBrandWhatsapp, IconBrandX, IconMail, IconShare, } from "@tabler/icons-react";
|
|
5
|
+
import { cn } from "../lib/utils.js";
|
|
6
|
+
import { buttonVariants } from "./button.js";
|
|
7
|
+
import { CopyButton } from "./copy-button.js";
|
|
8
|
+
const networks = {
|
|
9
|
+
x: {
|
|
10
|
+
name: "X",
|
|
11
|
+
icon: IconBrandX,
|
|
12
|
+
href: (url, title) => `https://x.com/intent/post?url=${encodeURIComponent(url)}&text=${encodeURIComponent(title)}`,
|
|
13
|
+
},
|
|
14
|
+
linkedin: {
|
|
15
|
+
name: "LinkedIn",
|
|
16
|
+
icon: IconBrandLinkedin,
|
|
17
|
+
href: (url) => `https://www.linkedin.com/sharing/share-offsite/?url=${encodeURIComponent(url)}`,
|
|
18
|
+
},
|
|
19
|
+
facebook: {
|
|
20
|
+
name: "Facebook",
|
|
21
|
+
icon: IconBrandFacebook,
|
|
22
|
+
href: (url) => `https://www.facebook.com/sharer/sharer.php?u=${encodeURIComponent(url)}`,
|
|
23
|
+
},
|
|
24
|
+
whatsapp: {
|
|
25
|
+
name: "WhatsApp",
|
|
26
|
+
icon: IconBrandWhatsapp,
|
|
27
|
+
href: (url, title) => `https://wa.me/?text=${encodeURIComponent(title ? `${title} ${url}` : url)}`,
|
|
28
|
+
},
|
|
29
|
+
reddit: {
|
|
30
|
+
name: "Reddit",
|
|
31
|
+
icon: IconBrandReddit,
|
|
32
|
+
href: (url, title) => `https://www.reddit.com/submit?url=${encodeURIComponent(url)}&title=${encodeURIComponent(title)}`,
|
|
33
|
+
},
|
|
34
|
+
email: {
|
|
35
|
+
name: "email",
|
|
36
|
+
icon: IconMail,
|
|
37
|
+
href: (url, title) => `mailto:?subject=${encodeURIComponent(title)}&body=${encodeURIComponent(url)}`,
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
/** Builds the share URL for one network. Exported for custom layouts. */
|
|
41
|
+
function shareUrl(network, url, title = "") {
|
|
42
|
+
return networks[network].href(url, title);
|
|
43
|
+
}
|
|
44
|
+
function subscribeNothing() {
|
|
45
|
+
return () => { };
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Share links for a page. Each network is a plain link that opens in a new
|
|
49
|
+
* tab with `noopener`, so nothing loads from a third party until someone
|
|
50
|
+
* chooses to share. Every control has an accessible name.
|
|
51
|
+
*/
|
|
52
|
+
function ShareButtons({ url, title = "", networks: selected = ["x", "linkedin"], copyLink = true, nativeShare = false, showLabels = false, className, "aria-label": ariaLabel = "Share", ...props }) {
|
|
53
|
+
const canShare = React.useSyncExternalStore(subscribeNothing, () => typeof navigator !== "undefined" && typeof navigator.share === "function", () => false);
|
|
54
|
+
const size = showLabels ? "sm" : "icon-sm";
|
|
55
|
+
return (_jsxs("div", { role: "group", "aria-label": ariaLabel, "data-slot": "share-buttons", className: cn("flex flex-wrap items-center gap-1.5", className), ...props, children: [nativeShare && canShare ? (_jsxs("button", { type: "button", className: buttonVariants({ variant: "outline", size }), "aria-label": showLabels ? undefined : "Share", onClick: () => {
|
|
56
|
+
navigator.share({ url, title: title || undefined }).catch(() => {
|
|
57
|
+
// The visitor closed the share sheet; nothing to report.
|
|
58
|
+
});
|
|
59
|
+
}, children: [_jsx(IconShare, { "aria-hidden": "true" }), showLabels ? "Share" : null] })) : null, selected.map((network) => {
|
|
60
|
+
const config = networks[network];
|
|
61
|
+
const Icon = config.icon;
|
|
62
|
+
const label = network === "email" ? "Share by email" : `Share on ${config.name}`;
|
|
63
|
+
return (_jsxs("a", { href: shareUrl(network, url, title), target: network === "email" ? undefined : "_blank", rel: network === "email" ? undefined : "noopener noreferrer", "aria-label": showLabels ? undefined : label, title: showLabels ? undefined : label, className: cn(buttonVariants({ variant: "outline", size }), "text-muted-foreground hover:text-foreground"), children: [_jsx(Icon, { "aria-hidden": "true" }), showLabels ? _jsx("span", { children: network === "email" ? "Email" : config.name }) : null] }, network));
|
|
64
|
+
}), copyLink ? (_jsx(CopyButton, { value: url, variant: "outline", label: "Copy link", copiedLabel: "Link copied", showLabel: showLabels, className: "text-muted-foreground hover:text-foreground" })) : null] }));
|
|
65
|
+
}
|
|
66
|
+
export { ShareButtons, shareUrl };
|
|
67
|
+
//# sourceMappingURL=share-buttons.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"share-buttons.js","sourceRoot":"","sources":["../../src/components/share-buttons.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,UAAU,EACV,QAAQ,EACR,SAAS,GAEV,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAU3C,MAAM,QAAQ,GAAwC;IACpD,CAAC,EAAE;QACD,IAAI,EAAE,GAAG;QACT,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CACnB,iCAAiC,kBAAkB,CAAC,GAAG,CAAC,SAAS,kBAAkB,CAAC,KAAK,CAAC,EAAE;KAC/F;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,uDAAuD,kBAAkB,CAAC,GAAG,CAAC,EAAE;KAChG;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,gDAAgD,kBAAkB,CAAC,GAAG,CAAC,EAAE;KACzF;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,uBAAuB,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;KACnG;IACD,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CACnB,qCAAqC,kBAAkB,CAAC,GAAG,CAAC,UAAU,kBAAkB,CAAC,KAAK,CAAC,EAAE;KACpG;IACD,KAAK,EAAE;QACL,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CACnB,mBAAmB,kBAAkB,CAAC,KAAK,CAAC,SAAS,kBAAkB,CAAC,GAAG,CAAC,EAAE;KACjF;CACF,CAAC;AAEF,yEAAyE;AACzE,SAAS,QAAQ,CAAC,OAAqB,EAAE,GAAW,EAAE,KAAK,GAAG,EAAE;IAC9D,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,gBAAgB;IACvB,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;AAClB,CAAC;AAgBD;;;;GAIG;AACH,SAAS,YAAY,CAAC,EACpB,GAAG,EACH,KAAK,GAAG,EAAE,EACV,QAAQ,EAAE,QAAQ,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,EACtC,QAAQ,GAAG,IAAI,EACf,WAAW,GAAG,KAAK,EACnB,UAAU,GAAG,KAAK,EAClB,SAAS,EACT,YAAY,EAAE,SAAS,GAAG,OAAO,EACjC,GAAG,KAAK,EACU;IAClB,MAAM,QAAQ,GAAG,KAAK,CAAC,oBAAoB,CACzC,gBAAgB,EAChB,GAAG,EAAE,CAAC,OAAO,SAAS,KAAK,WAAW,IAAI,OAAO,SAAS,CAAC,KAAK,KAAK,UAAU,EAC/E,GAAG,EAAE,CAAC,KAAK,CACZ,CAAC;IACF,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IAE3C,OAAO,CACL,eACE,IAAI,EAAC,OAAO,gBACA,SAAS,eACX,eAAe,EACzB,SAAS,EAAE,EAAE,CAAC,qCAAqC,EAAE,SAAS,CAAC,KAC3D,KAAK,aAER,WAAW,IAAI,QAAQ,CAAC,CAAC,CAAC,CACzB,kBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,cAAc,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,gBAC3C,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,EAC5C,OAAO,EAAE,GAAG,EAAE;oBACZ,SAAS,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,IAAI,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;wBAC7D,yDAAyD;oBAC3D,CAAC,CAAC,CAAC;gBACL,CAAC,aAED,KAAC,SAAS,mBAAa,MAAM,GAAG,EAC/B,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IACrB,CACV,CAAC,CAAC,CAAC,IAAI,EACP,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;gBACxB,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;gBACjC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;gBACzB,MAAM,KAAK,GAAG,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,YAAY,MAAM,CAAC,IAAI,EAAE,CAAC;gBACjF,OAAO,CACL,aAEE,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,EACnC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAClD,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,qBAAqB,gBAChD,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,EAC1C,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,EACrC,SAAS,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,6CAA6C,CAAC,aAE1G,KAAC,IAAI,mBAAa,MAAM,GAAG,EAC1B,UAAU,CAAC,CAAC,CAAC,yBAAO,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,GAAQ,CAAC,CAAC,CAAC,IAAI,KAT1E,OAAO,CAUV,CACL,CAAC;YACJ,CAAC,CAAC,EACD,QAAQ,CAAC,CAAC,CAAC,CACV,KAAC,UAAU,IACT,KAAK,EAAE,GAAG,EACV,OAAO,EAAC,SAAS,EACjB,KAAK,EAAC,WAAW,EACjB,WAAW,EAAC,aAAa,EACzB,SAAS,EAAE,UAAU,EACrB,SAAS,EAAC,6CAA6C,GACvD,CACH,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { Dialog as SheetPrimitive } from "radix-ui";
|
|
3
|
+
declare const Sheet: React.FC<SheetPrimitive.DialogProps>;
|
|
4
|
+
declare const SheetTrigger: React.ForwardRefExoticComponent<SheetPrimitive.DialogTriggerProps & React.RefAttributes<HTMLButtonElement>>;
|
|
5
|
+
declare const SheetClose: React.ForwardRefExoticComponent<SheetPrimitive.DialogCloseProps & React.RefAttributes<HTMLButtonElement>>;
|
|
6
|
+
declare const SheetPortal: React.FC<SheetPrimitive.DialogPortalProps>;
|
|
7
|
+
type SheetSide = "top" | "right" | "bottom" | "left";
|
|
8
|
+
declare function SheetOverlay({ className, ...props }: React.ComponentProps<typeof SheetPrimitive.Overlay>): React.JSX.Element;
|
|
9
|
+
declare function SheetContent({ className, children, side, showCloseButton, ...props }: React.ComponentProps<typeof SheetPrimitive.Content> & {
|
|
10
|
+
side?: SheetSide;
|
|
11
|
+
showCloseButton?: boolean;
|
|
12
|
+
}): React.JSX.Element;
|
|
13
|
+
declare function SheetHeader({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
14
|
+
declare function SheetFooter({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
15
|
+
declare function SheetTitle({ className, ...props }: React.ComponentProps<typeof SheetPrimitive.Title>): React.JSX.Element;
|
|
16
|
+
declare function SheetDescription({ className, ...props }: React.ComponentProps<typeof SheetPrimitive.Description>): React.JSX.Element;
|
|
17
|
+
export { Sheet, SheetTrigger, SheetClose, SheetPortal, SheetOverlay, SheetContent, SheetHeader, SheetFooter, SheetTitle, SheetDescription, };
|
|
18
|
+
//# sourceMappingURL=sheet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sheet.d.ts","sourceRoot":"","sources":["../../src/components/sheet.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,MAAM,IAAI,cAAc,EAAE,MAAM,UAAU,CAAC;AAKpD,QAAA,MAAM,KAAK,sCAAsB,CAAC;AAClC,QAAA,MAAM,YAAY,6GAAyB,CAAC;AAC5C,QAAA,MAAM,UAAU,2GAAuB,CAAC;AACxC,QAAA,MAAM,WAAW,4CAAwB,CAAC;AAE1C,KAAK,SAAS,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAarD,iBAAS,YAAY,CAAC,EACpB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,cAAc,CAAC,OAAO,CAAC,qBAarD;AAED,iBAAS,YAAY,CAAC,EACpB,SAAS,EACT,QAAQ,EACR,IAAc,EACd,eAAsB,EACtB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,cAAc,CAAC,OAAO,CAAC,GAAG;IACvD,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,qBA4BA;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAExE;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQxE;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,cAAc,CAAC,KAAK,CAAC,qBAQ7F;AAED,iBAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,cAAc,CAAC,WAAW,CAAC,qBAQzD;AAED,OAAO,EACL,KAAK,EACL,YAAY,EACZ,UAAU,EACV,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,WAAW,EACX,UAAU,EACV,gBAAgB,GACjB,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Dialog as SheetPrimitive } from "radix-ui";
|
|
4
|
+
import { IconX } from "@tabler/icons-react";
|
|
5
|
+
import { cn } from "../lib/utils.js";
|
|
6
|
+
const Sheet = SheetPrimitive.Root;
|
|
7
|
+
const SheetTrigger = SheetPrimitive.Trigger;
|
|
8
|
+
const SheetClose = SheetPrimitive.Close;
|
|
9
|
+
const SheetPortal = SheetPrimitive.Portal;
|
|
10
|
+
const sideClasses = {
|
|
11
|
+
right: "inset-y-0 right-0 h-full w-3/4 max-w-sm border-l data-[state=open]:slide-in-from-right data-[state=closed]:slide-out-to-right",
|
|
12
|
+
left: "inset-y-0 left-0 h-full w-3/4 max-w-sm border-r data-[state=open]:slide-in-from-left data-[state=closed]:slide-out-to-left",
|
|
13
|
+
top: "inset-x-0 top-0 h-auto max-h-[85dvh] w-full border-b data-[state=open]:slide-in-from-top data-[state=closed]:slide-out-to-top",
|
|
14
|
+
bottom: "inset-x-0 bottom-0 h-auto max-h-[85dvh] w-full border-t data-[state=open]:slide-in-from-bottom data-[state=closed]:slide-out-to-bottom",
|
|
15
|
+
};
|
|
16
|
+
function SheetOverlay({ className, ...props }) {
|
|
17
|
+
return (_jsx(SheetPrimitive.Overlay, { "data-slot": "sheet-overlay", className: cn("fixed inset-0 z-50 bg-black/50 backdrop-blur-sm dark:bg-black/70", "data-[state=open]:animate-in data-[state=open]:fade-in-0", "data-[state=closed]:animate-out data-[state=closed]:fade-out-0", className), ...props }));
|
|
18
|
+
}
|
|
19
|
+
function SheetContent({ className, children, side = "right", showCloseButton = true, ...props }) {
|
|
20
|
+
return (_jsxs(SheetPortal, { children: [_jsx(SheetOverlay, {}), _jsxs(SheetPrimitive.Content, { "data-slot": "sheet-content", "data-side": side, className: cn("fixed z-50 flex flex-col gap-4 overflow-y-auto border-border bg-popover p-6 text-popover-foreground shadow-2xl", "duration-300 data-[state=open]:animate-in data-[state=open]:duration-500 data-[state=closed]:animate-out", sideClasses[side], className), ...props, children: [children, showCloseButton ? (_jsxs(SheetPrimitive.Close, { "data-slot": "sheet-close", className: "absolute right-3 top-3 inline-flex size-8 items-center justify-center text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:ring-2 focus-visible:ring-focus-ring focus-visible:ring-offset-2 focus-visible:ring-offset-popover focus-visible:outline-none", children: [_jsx(IconX, { "aria-hidden": "true", className: "size-4" }), _jsx("span", { className: "sr-only", children: "Close" })] })) : null] })] }));
|
|
21
|
+
}
|
|
22
|
+
function SheetHeader({ className, ...props }) {
|
|
23
|
+
return _jsx("div", { "data-slot": "sheet-header", className: cn("flex flex-col gap-1.5 pr-6", className), ...props });
|
|
24
|
+
}
|
|
25
|
+
function SheetFooter({ className, ...props }) {
|
|
26
|
+
return (_jsx("div", { "data-slot": "sheet-footer", className: cn("mt-auto flex flex-col-reverse gap-2 sm:flex-row sm:justify-end", className), ...props }));
|
|
27
|
+
}
|
|
28
|
+
function SheetTitle({ className, ...props }) {
|
|
29
|
+
return (_jsx(SheetPrimitive.Title, { "data-slot": "sheet-title", className: cn("text-lg font-semibold tracking-tight", className), ...props }));
|
|
30
|
+
}
|
|
31
|
+
function SheetDescription({ className, ...props }) {
|
|
32
|
+
return (_jsx(SheetPrimitive.Description, { "data-slot": "sheet-description", className: cn("text-sm leading-relaxed text-muted-foreground", className), ...props }));
|
|
33
|
+
}
|
|
34
|
+
export { Sheet, SheetTrigger, SheetClose, SheetPortal, SheetOverlay, SheetContent, SheetHeader, SheetFooter, SheetTitle, SheetDescription, };
|
|
35
|
+
//# sourceMappingURL=sheet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sheet.js","sourceRoot":"","sources":["../../src/components/sheet.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EAAE,MAAM,IAAI,cAAc,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAE5C,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC;AAClC,MAAM,YAAY,GAAG,cAAc,CAAC,OAAO,CAAC;AAC5C,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC;AACxC,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC;AAI1C,MAAM,WAAW,GAA8B;IAC7C,KAAK,EACH,+HAA+H;IACjI,IAAI,EACF,4HAA4H;IAC9H,GAAG,EACD,+HAA+H;IACjI,MAAM,EACJ,wIAAwI;CAC3I,CAAC;AAEF,SAAS,YAAY,CAAC,EACpB,SAAS,EACT,GAAG,KAAK,EAC4C;IACpD,OAAO,CACL,KAAC,cAAc,CAAC,OAAO,iBACX,eAAe,EACzB,SAAS,EAAE,EAAE,CACX,kEAAkE,EAClE,0DAA0D,EAC1D,gEAAgE,EAChE,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,EACpB,SAAS,EACT,QAAQ,EACR,IAAI,GAAG,OAAO,EACd,eAAe,GAAG,IAAI,EACtB,GAAG,KAAK,EAIT;IACC,OAAO,CACL,MAAC,WAAW,eACV,KAAC,YAAY,KAAG,EAChB,MAAC,cAAc,CAAC,OAAO,iBACX,eAAe,eACd,IAAI,EACf,SAAS,EAAE,EAAE,CACX,gHAAgH,EAChH,0GAA0G,EAC1G,WAAW,CAAC,IAAI,CAAC,EACjB,SAAS,CACV,KACG,KAAK,aAER,QAAQ,EACR,eAAe,CAAC,CAAC,CAAC,CACjB,MAAC,cAAc,CAAC,KAAK,iBACT,aAAa,EACvB,SAAS,EAAC,gSAAgS,aAE1S,KAAC,KAAK,mBAAa,MAAM,EAAC,SAAS,EAAC,QAAQ,GAAG,EAC/C,eAAM,SAAS,EAAC,SAAS,sBAAa,IACjB,CACxB,CAAC,CAAC,CAAC,IAAI,IACe,IACb,CACf,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAA+B;IACvE,OAAO,2BAAe,cAAc,EAAC,SAAS,EAAE,EAAE,CAAC,4BAA4B,EAAE,SAAS,CAAC,KAAM,KAAK,GAAI,CAAC;AAC7G,CAAC;AAED,SAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAA+B;IACvE,OAAO,CACL,2BACY,cAAc,EACxB,SAAS,EAAE,EAAE,CAAC,gEAAgE,EAAE,SAAS,CAAC,KACtF,KAAK,GACT,CACH,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAqD;IAC5F,OAAO,CACL,KAAC,cAAc,CAAC,KAAK,iBACT,aAAa,EACvB,SAAS,EAAE,EAAE,CAAC,sCAAsC,EAAE,SAAS,CAAC,KAC5D,KAAK,GACT,CACH,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,GAAG,KAAK,EACgD;IACxD,OAAO,CACL,KAAC,cAAc,CAAC,WAAW,iBACf,mBAAmB,EAC7B,SAAS,EAAE,EAAE,CAAC,+CAA+C,EAAE,SAAS,CAAC,KACrE,KAAK,GACT,CACH,CAAC;AACJ,CAAC;AAED,OAAO,EACL,KAAK,EACL,YAAY,EACZ,UAAU,EACV,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,WAAW,EACX,UAAU,EACV,gBAAgB,GACjB,CAAC"}
|