@medialane/ui 0.1.5 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/brand-icon.cjs +0 -9
- package/dist/components/brand-icon.cjs.map +1 -1
- package/dist/components/brand-icon.js +0 -9
- package/dist/components/brand-icon.js.map +1 -1
- package/dist/components/collection-card.cjs +124 -0
- package/dist/components/collection-card.cjs.map +1 -0
- package/dist/components/collection-card.d.cts +13 -0
- package/dist/components/collection-card.d.ts +13 -0
- package/dist/components/collection-card.js +89 -0
- package/dist/components/collection-card.js.map +1 -0
- package/dist/components/motion-primitives.cjs +126 -0
- package/dist/components/motion-primitives.cjs.map +1 -0
- package/dist/components/motion-primitives.d.cts +36 -0
- package/dist/components/motion-primitives.d.ts +36 -0
- package/dist/components/motion-primitives.js +96 -0
- package/dist/components/motion-primitives.js.map +1 -0
- package/dist/components/scroll-section.cjs +72 -0
- package/dist/components/scroll-section.cjs.map +1 -0
- package/dist/components/scroll-section.d.cts +18 -0
- package/dist/components/scroll-section.d.ts +18 -0
- package/dist/components/scroll-section.js +38 -0
- package/dist/components/scroll-section.js.map +1 -0
- package/dist/components/share-button.cjs +86 -0
- package/dist/components/share-button.cjs.map +1 -0
- package/dist/components/share-button.d.cts +12 -0
- package/dist/components/share-button.d.ts +12 -0
- package/dist/components/share-button.js +62 -0
- package/dist/components/share-button.js.map +1 -0
- package/dist/components/token-card.cjs +281 -0
- package/dist/components/token-card.cjs.map +1 -0
- package/dist/components/token-card.d.cts +31 -0
- package/dist/components/token-card.d.ts +31 -0
- package/dist/components/token-card.js +256 -0
- package/dist/components/token-card.js.map +1 -0
- package/dist/index.cjs +31 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -1
- package/package.json +15 -9
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import { motion } from "framer-motion";
|
|
4
|
+
const SPRING = { type: "spring", stiffness: 400, damping: 28 };
|
|
5
|
+
const EASE_OUT = [0.25, 0.46, 0.45, 0.94];
|
|
6
|
+
function MotionCard({ children, className, ...props }) {
|
|
7
|
+
return /* @__PURE__ */ jsx(
|
|
8
|
+
motion.div,
|
|
9
|
+
{
|
|
10
|
+
className,
|
|
11
|
+
whileTap: { scale: 0.96 },
|
|
12
|
+
transition: SPRING,
|
|
13
|
+
...props,
|
|
14
|
+
children
|
|
15
|
+
}
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
function FadeIn({ children, className, delay = 0, y = 20 }) {
|
|
19
|
+
return /* @__PURE__ */ jsx(
|
|
20
|
+
motion.div,
|
|
21
|
+
{
|
|
22
|
+
className,
|
|
23
|
+
initial: { opacity: 0, y },
|
|
24
|
+
whileInView: { opacity: 1, y: 0 },
|
|
25
|
+
viewport: { once: true, margin: "-60px" },
|
|
26
|
+
transition: { duration: 0.5, delay, ease: EASE_OUT },
|
|
27
|
+
children
|
|
28
|
+
}
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
function Stagger({ children, className, staggerDelay = 0.07 }) {
|
|
32
|
+
return /* @__PURE__ */ jsx(
|
|
33
|
+
motion.div,
|
|
34
|
+
{
|
|
35
|
+
className,
|
|
36
|
+
initial: "hidden",
|
|
37
|
+
whileInView: "show",
|
|
38
|
+
viewport: { once: true, margin: "-60px" },
|
|
39
|
+
variants: {
|
|
40
|
+
hidden: {},
|
|
41
|
+
show: { transition: { staggerChildren: staggerDelay } }
|
|
42
|
+
},
|
|
43
|
+
children
|
|
44
|
+
}
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
function StaggerItem({ children, className }) {
|
|
48
|
+
return /* @__PURE__ */ jsx(
|
|
49
|
+
motion.div,
|
|
50
|
+
{
|
|
51
|
+
className,
|
|
52
|
+
variants: {
|
|
53
|
+
hidden: { opacity: 0, y: 20 },
|
|
54
|
+
show: { opacity: 1, y: 0, transition: { duration: 0.45, ease: EASE_OUT } }
|
|
55
|
+
},
|
|
56
|
+
children
|
|
57
|
+
}
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
function KineticWords({ text, className }) {
|
|
61
|
+
const words = text.split(" ");
|
|
62
|
+
return /* @__PURE__ */ jsx(
|
|
63
|
+
motion.span,
|
|
64
|
+
{
|
|
65
|
+
className,
|
|
66
|
+
initial: "hidden",
|
|
67
|
+
animate: "show",
|
|
68
|
+
variants: {
|
|
69
|
+
hidden: {},
|
|
70
|
+
show: { transition: { staggerChildren: 0.08, delayChildren: 0.1 } }
|
|
71
|
+
},
|
|
72
|
+
children: words.map((word, i) => /* @__PURE__ */ jsx(
|
|
73
|
+
motion.span,
|
|
74
|
+
{
|
|
75
|
+
className: "inline-block mr-[0.25em]",
|
|
76
|
+
variants: {
|
|
77
|
+
hidden: { opacity: 0, y: 24, rotateX: -20 },
|
|
78
|
+
show: { opacity: 1, y: 0, rotateX: 0, transition: { duration: 0.5, ease: EASE_OUT } }
|
|
79
|
+
},
|
|
80
|
+
children: word
|
|
81
|
+
},
|
|
82
|
+
i
|
|
83
|
+
))
|
|
84
|
+
}
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
export {
|
|
88
|
+
EASE_OUT,
|
|
89
|
+
FadeIn,
|
|
90
|
+
KineticWords,
|
|
91
|
+
MotionCard,
|
|
92
|
+
SPRING,
|
|
93
|
+
Stagger,
|
|
94
|
+
StaggerItem
|
|
95
|
+
};
|
|
96
|
+
//# sourceMappingURL=motion-primitives.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/motion-primitives.tsx"],"sourcesContent":["\"use client\";\n\nimport { motion, type HTMLMotionProps } from \"framer-motion\";\n\nexport const SPRING = { type: \"spring\", stiffness: 400, damping: 28 } as const;\nexport const EASE_OUT = [0.25, 0.46, 0.45, 0.94] as const;\n\n// ─── Press-able card wrapper ──────────────────────────────────────────────────\n\ninterface MotionCardProps extends HTMLMotionProps<\"div\"> {\n children: React.ReactNode;\n}\n\nexport function MotionCard({ children, className, ...props }: MotionCardProps) {\n return (\n <motion.div\n className={className}\n whileTap={{ scale: 0.96 }}\n transition={SPRING}\n {...props}\n >\n {children}\n </motion.div>\n );\n}\n\n// ─── Scroll-triggered fade-in ─────────────────────────────────────────────────\n\ninterface FadeInProps {\n children: React.ReactNode;\n className?: string;\n delay?: number;\n y?: number;\n}\n\nexport function FadeIn({ children, className, delay = 0, y = 20 }: FadeInProps) {\n return (\n <motion.div\n className={className}\n initial={{ opacity: 0, y }}\n whileInView={{ opacity: 1, y: 0 }}\n viewport={{ once: true, margin: \"-60px\" }}\n transition={{ duration: 0.5, delay, ease: EASE_OUT }}\n >\n {children}\n </motion.div>\n );\n}\n\n// ─── Stagger container ────────────────────────────────────────────────────────\n\ninterface StaggerProps {\n children: React.ReactNode;\n className?: string;\n staggerDelay?: number;\n}\n\nexport function Stagger({ children, className, staggerDelay = 0.07 }: StaggerProps) {\n return (\n <motion.div\n className={className}\n initial=\"hidden\"\n whileInView=\"show\"\n viewport={{ once: true, margin: \"-60px\" }}\n variants={{\n hidden: {},\n show: { transition: { staggerChildren: staggerDelay } },\n }}\n >\n {children}\n </motion.div>\n );\n}\n\nexport function StaggerItem({ children, className }: { children: React.ReactNode; className?: string }) {\n return (\n <motion.div\n className={className}\n variants={{\n hidden: { opacity: 0, y: 20 },\n show: { opacity: 1, y: 0, transition: { duration: 0.45, ease: EASE_OUT } },\n }}\n >\n {children}\n </motion.div>\n );\n}\n\n// ─── Kinetic headline words ───────────────────────────────────────────────────\n\nexport function KineticWords({ text, className }: { text: string; className?: string }) {\n const words = text.split(\" \");\n return (\n <motion.span\n className={className}\n initial=\"hidden\"\n animate=\"show\"\n variants={{\n hidden: {},\n show: { transition: { staggerChildren: 0.08, delayChildren: 0.1 } },\n }}\n >\n {words.map((word, i) => (\n <motion.span\n key={i}\n className=\"inline-block mr-[0.25em]\"\n variants={{\n hidden: { opacity: 0, y: 24, rotateX: -20 },\n show: { opacity: 1, y: 0, rotateX: 0, transition: { duration: 0.5, ease: EASE_OUT } },\n }}\n >\n {word}\n </motion.span>\n ))}\n </motion.span>\n );\n}\n"],"mappings":";AAeI;AAbJ,SAAS,cAAoC;AAEtC,MAAM,SAAS,EAAE,MAAM,UAAU,WAAW,KAAK,SAAS,GAAG;AAC7D,MAAM,WAAW,CAAC,MAAM,MAAM,MAAM,IAAI;AAQxC,SAAS,WAAW,EAAE,UAAU,WAAW,GAAG,MAAM,GAAoB;AAC7E,SACE;AAAA,IAAC,OAAO;AAAA,IAAP;AAAA,MACC;AAAA,MACA,UAAU,EAAE,OAAO,KAAK;AAAA,MACxB,YAAY;AAAA,MACX,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;AAWO,SAAS,OAAO,EAAE,UAAU,WAAW,QAAQ,GAAG,IAAI,GAAG,GAAgB;AAC9E,SACE;AAAA,IAAC,OAAO;AAAA,IAAP;AAAA,MACC;AAAA,MACA,SAAS,EAAE,SAAS,GAAG,EAAE;AAAA,MACzB,aAAa,EAAE,SAAS,GAAG,GAAG,EAAE;AAAA,MAChC,UAAU,EAAE,MAAM,MAAM,QAAQ,QAAQ;AAAA,MACxC,YAAY,EAAE,UAAU,KAAK,OAAO,MAAM,SAAS;AAAA,MAElD;AAAA;AAAA,EACH;AAEJ;AAUO,SAAS,QAAQ,EAAE,UAAU,WAAW,eAAe,KAAK,GAAiB;AAClF,SACE;AAAA,IAAC,OAAO;AAAA,IAAP;AAAA,MACC;AAAA,MACA,SAAQ;AAAA,MACR,aAAY;AAAA,MACZ,UAAU,EAAE,MAAM,MAAM,QAAQ,QAAQ;AAAA,MACxC,UAAU;AAAA,QACR,QAAQ,CAAC;AAAA,QACT,MAAM,EAAE,YAAY,EAAE,iBAAiB,aAAa,EAAE;AAAA,MACxD;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;AAEO,SAAS,YAAY,EAAE,UAAU,UAAU,GAAsD;AACtG,SACE;AAAA,IAAC,OAAO;AAAA,IAAP;AAAA,MACC;AAAA,MACA,UAAU;AAAA,QACR,QAAQ,EAAE,SAAS,GAAG,GAAG,GAAG;AAAA,QAC5B,MAAM,EAAE,SAAS,GAAG,GAAG,GAAG,YAAY,EAAE,UAAU,MAAM,MAAM,SAAS,EAAE;AAAA,MAC3E;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;AAIO,SAAS,aAAa,EAAE,MAAM,UAAU,GAAyC;AACtF,QAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,SACE;AAAA,IAAC,OAAO;AAAA,IAAP;AAAA,MACC;AAAA,MACA,SAAQ;AAAA,MACR,SAAQ;AAAA,MACR,UAAU;AAAA,QACR,QAAQ,CAAC;AAAA,QACT,MAAM,EAAE,YAAY,EAAE,iBAAiB,MAAM,eAAe,IAAI,EAAE;AAAA,MACpE;AAAA,MAEC,gBAAM,IAAI,CAAC,MAAM,MAChB;AAAA,QAAC,OAAO;AAAA,QAAP;AAAA,UAEC,WAAU;AAAA,UACV,UAAU;AAAA,YACR,QAAQ,EAAE,SAAS,GAAG,GAAG,IAAI,SAAS,IAAI;AAAA,YAC1C,MAAM,EAAE,SAAS,GAAG,GAAG,GAAG,SAAS,GAAG,YAAY,EAAE,UAAU,KAAK,MAAM,SAAS,EAAE;AAAA,UACtF;AAAA,UAEC;AAAA;AAAA,QAPI;AAAA,MAQP,CACD;AAAA;AAAA,EACH;AAEJ;","names":[]}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
var __create = Object.create;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
8
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
+
var __export = (target, all) => {
|
|
10
|
+
for (var name in all)
|
|
11
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
12
|
+
};
|
|
13
|
+
var __copyProps = (to, from, except, desc) => {
|
|
14
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
15
|
+
for (let key of __getOwnPropNames(from))
|
|
16
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
17
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
18
|
+
}
|
|
19
|
+
return to;
|
|
20
|
+
};
|
|
21
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
22
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
23
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
24
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
25
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
26
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
27
|
+
mod
|
|
28
|
+
));
|
|
29
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
30
|
+
var scroll_section_exports = {};
|
|
31
|
+
__export(scroll_section_exports, {
|
|
32
|
+
ScrollSection: () => ScrollSection
|
|
33
|
+
});
|
|
34
|
+
module.exports = __toCommonJS(scroll_section_exports);
|
|
35
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
36
|
+
var import_link = __toESM(require("next/link"), 1);
|
|
37
|
+
var import_lucide_react = require("lucide-react");
|
|
38
|
+
function ScrollSection({
|
|
39
|
+
icon,
|
|
40
|
+
iconBg,
|
|
41
|
+
title,
|
|
42
|
+
href,
|
|
43
|
+
linkLabel = "See all",
|
|
44
|
+
children
|
|
45
|
+
}) {
|
|
46
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: "space-y-4", children: [
|
|
47
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
48
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2.5", children: [
|
|
49
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: `h-7 w-7 rounded-lg flex items-center justify-center ${iconBg}`, children: icon }),
|
|
50
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { className: "text-lg sm:text-xl font-semibold", children: title })
|
|
51
|
+
] }),
|
|
52
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
53
|
+
import_link.default,
|
|
54
|
+
{
|
|
55
|
+
href,
|
|
56
|
+
className: "inline-flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground px-3 py-1.5 rounded-md hover:bg-accent transition-colors",
|
|
57
|
+
children: [
|
|
58
|
+
linkLabel,
|
|
59
|
+
" ",
|
|
60
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ArrowRight, { className: "h-3.5 w-3.5" })
|
|
61
|
+
]
|
|
62
|
+
}
|
|
63
|
+
)
|
|
64
|
+
] }),
|
|
65
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "w-full overflow-x-auto scrollbar-hide", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex gap-4 snap-x snap-mandatory pb-2", style: { width: "max-content" }, children }) })
|
|
66
|
+
] });
|
|
67
|
+
}
|
|
68
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
69
|
+
0 && (module.exports = {
|
|
70
|
+
ScrollSection
|
|
71
|
+
});
|
|
72
|
+
//# sourceMappingURL=scroll-section.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/scroll-section.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { ArrowRight } from \"lucide-react\";\n\nexport interface ScrollSectionProps {\n /** Icon element rendered inside the colored badge */\n icon: React.ReactNode;\n /** Tailwind classes for the icon badge (background + shadow) */\n iconBg: string;\n title: string;\n /** \"See all\" link destination */\n href: string;\n /** Button label — defaults to \"See all\" */\n linkLabel?: string;\n /** Scroll items: wrap each in a sized snap-start div */\n children: React.ReactNode;\n}\n\nexport function ScrollSection({\n icon,\n iconBg,\n title,\n href,\n linkLabel = \"See all\",\n children,\n}: ScrollSectionProps) {\n return (\n <section className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2.5\">\n <div className={`h-7 w-7 rounded-lg flex items-center justify-center ${iconBg}`}>\n {icon}\n </div>\n <h2 className=\"text-lg sm:text-xl font-semibold\">{title}</h2>\n </div>\n <Link\n href={href}\n className=\"inline-flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground px-3 py-1.5 rounded-md hover:bg-accent transition-colors\"\n >\n {linkLabel} <ArrowRight className=\"h-3.5 w-3.5\" />\n </Link>\n </div>\n\n <div className=\"w-full overflow-x-auto scrollbar-hide\">\n <div className=\"flex gap-4 snap-x snap-mandatory pb-2\" style={{ width: \"max-content\" }}>\n {children}\n </div>\n </div>\n </section>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA8BQ;AA5BR,kBAAiB;AACjB,0BAA2B;AAgBpB,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AACF,GAAuB;AACrB,SACE,6CAAC,aAAQ,WAAU,aACjB;AAAA,iDAAC,SAAI,WAAU,qCACb;AAAA,mDAAC,SAAI,WAAU,6BACb;AAAA,oDAAC,SAAI,WAAW,uDAAuD,MAAM,IAC1E,gBACH;AAAA,QACA,4CAAC,QAAG,WAAU,oCAAoC,iBAAM;AAAA,SAC1D;AAAA,MACA;AAAA,QAAC,YAAAA;AAAA,QAAA;AAAA,UACC;AAAA,UACA,WAAU;AAAA,UAET;AAAA;AAAA,YAAU;AAAA,YAAC,4CAAC,kCAAW,WAAU,eAAc;AAAA;AAAA;AAAA,MAClD;AAAA,OACF;AAAA,IAEA,4CAAC,SAAI,WAAU,yCACb,sDAAC,SAAI,WAAU,yCAAwC,OAAO,EAAE,OAAO,cAAc,GAClF,UACH,GACF;AAAA,KACF;AAEJ;","names":["Link"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
interface ScrollSectionProps {
|
|
4
|
+
/** Icon element rendered inside the colored badge */
|
|
5
|
+
icon: React.ReactNode;
|
|
6
|
+
/** Tailwind classes for the icon badge (background + shadow) */
|
|
7
|
+
iconBg: string;
|
|
8
|
+
title: string;
|
|
9
|
+
/** "See all" link destination */
|
|
10
|
+
href: string;
|
|
11
|
+
/** Button label — defaults to "See all" */
|
|
12
|
+
linkLabel?: string;
|
|
13
|
+
/** Scroll items: wrap each in a sized snap-start div */
|
|
14
|
+
children: React.ReactNode;
|
|
15
|
+
}
|
|
16
|
+
declare function ScrollSection({ icon, iconBg, title, href, linkLabel, children, }: ScrollSectionProps): react_jsx_runtime.JSX.Element;
|
|
17
|
+
|
|
18
|
+
export { ScrollSection, type ScrollSectionProps };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
interface ScrollSectionProps {
|
|
4
|
+
/** Icon element rendered inside the colored badge */
|
|
5
|
+
icon: React.ReactNode;
|
|
6
|
+
/** Tailwind classes for the icon badge (background + shadow) */
|
|
7
|
+
iconBg: string;
|
|
8
|
+
title: string;
|
|
9
|
+
/** "See all" link destination */
|
|
10
|
+
href: string;
|
|
11
|
+
/** Button label — defaults to "See all" */
|
|
12
|
+
linkLabel?: string;
|
|
13
|
+
/** Scroll items: wrap each in a sized snap-start div */
|
|
14
|
+
children: React.ReactNode;
|
|
15
|
+
}
|
|
16
|
+
declare function ScrollSection({ icon, iconBg, title, href, linkLabel, children, }: ScrollSectionProps): react_jsx_runtime.JSX.Element;
|
|
17
|
+
|
|
18
|
+
export { ScrollSection, type ScrollSectionProps };
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import Link from "next/link";
|
|
4
|
+
import { ArrowRight } from "lucide-react";
|
|
5
|
+
function ScrollSection({
|
|
6
|
+
icon,
|
|
7
|
+
iconBg,
|
|
8
|
+
title,
|
|
9
|
+
href,
|
|
10
|
+
linkLabel = "See all",
|
|
11
|
+
children
|
|
12
|
+
}) {
|
|
13
|
+
return /* @__PURE__ */ jsxs("section", { className: "space-y-4", children: [
|
|
14
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
|
|
15
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2.5", children: [
|
|
16
|
+
/* @__PURE__ */ jsx("div", { className: `h-7 w-7 rounded-lg flex items-center justify-center ${iconBg}`, children: icon }),
|
|
17
|
+
/* @__PURE__ */ jsx("h2", { className: "text-lg sm:text-xl font-semibold", children: title })
|
|
18
|
+
] }),
|
|
19
|
+
/* @__PURE__ */ jsxs(
|
|
20
|
+
Link,
|
|
21
|
+
{
|
|
22
|
+
href,
|
|
23
|
+
className: "inline-flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground px-3 py-1.5 rounded-md hover:bg-accent transition-colors",
|
|
24
|
+
children: [
|
|
25
|
+
linkLabel,
|
|
26
|
+
" ",
|
|
27
|
+
/* @__PURE__ */ jsx(ArrowRight, { className: "h-3.5 w-3.5" })
|
|
28
|
+
]
|
|
29
|
+
}
|
|
30
|
+
)
|
|
31
|
+
] }),
|
|
32
|
+
/* @__PURE__ */ jsx("div", { className: "w-full overflow-x-auto scrollbar-hide", children: /* @__PURE__ */ jsx("div", { className: "flex gap-4 snap-x snap-mandatory pb-2", style: { width: "max-content" }, children }) })
|
|
33
|
+
] });
|
|
34
|
+
}
|
|
35
|
+
export {
|
|
36
|
+
ScrollSection
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=scroll-section.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/scroll-section.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { ArrowRight } from \"lucide-react\";\n\nexport interface ScrollSectionProps {\n /** Icon element rendered inside the colored badge */\n icon: React.ReactNode;\n /** Tailwind classes for the icon badge (background + shadow) */\n iconBg: string;\n title: string;\n /** \"See all\" link destination */\n href: string;\n /** Button label — defaults to \"See all\" */\n linkLabel?: string;\n /** Scroll items: wrap each in a sized snap-start div */\n children: React.ReactNode;\n}\n\nexport function ScrollSection({\n icon,\n iconBg,\n title,\n href,\n linkLabel = \"See all\",\n children,\n}: ScrollSectionProps) {\n return (\n <section className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2.5\">\n <div className={`h-7 w-7 rounded-lg flex items-center justify-center ${iconBg}`}>\n {icon}\n </div>\n <h2 className=\"text-lg sm:text-xl font-semibold\">{title}</h2>\n </div>\n <Link\n href={href}\n className=\"inline-flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground px-3 py-1.5 rounded-md hover:bg-accent transition-colors\"\n >\n {linkLabel} <ArrowRight className=\"h-3.5 w-3.5\" />\n </Link>\n </div>\n\n <div className=\"w-full overflow-x-auto scrollbar-hide\">\n <div className=\"flex gap-4 snap-x snap-mandatory pb-2\" style={{ width: \"max-content\" }}>\n {children}\n </div>\n </div>\n </section>\n );\n}\n"],"mappings":";AA8BQ,SACE,KADF;AA5BR,OAAO,UAAU;AACjB,SAAS,kBAAkB;AAgBpB,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AACF,GAAuB;AACrB,SACE,qBAAC,aAAQ,WAAU,aACjB;AAAA,yBAAC,SAAI,WAAU,qCACb;AAAA,2BAAC,SAAI,WAAU,6BACb;AAAA,4BAAC,SAAI,WAAW,uDAAuD,MAAM,IAC1E,gBACH;AAAA,QACA,oBAAC,QAAG,WAAU,oCAAoC,iBAAM;AAAA,SAC1D;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,WAAU;AAAA,UAET;AAAA;AAAA,YAAU;AAAA,YAAC,oBAAC,cAAW,WAAU,eAAc;AAAA;AAAA;AAAA,MAClD;AAAA,OACF;AAAA,IAEA,oBAAC,SAAI,WAAU,yCACb,8BAAC,SAAI,WAAU,yCAAwC,OAAO,EAAE,OAAO,cAAc,GAClF,UACH,GACF;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
var share_button_exports = {};
|
|
21
|
+
__export(share_button_exports, {
|
|
22
|
+
ShareButton: () => ShareButton
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(share_button_exports);
|
|
25
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
26
|
+
var import_react = require("react");
|
|
27
|
+
var import_lucide_react = require("lucide-react");
|
|
28
|
+
var import_sonner = require("sonner");
|
|
29
|
+
var import_cn = require("../utils/cn.js");
|
|
30
|
+
const VARIANT_CLASSES = {
|
|
31
|
+
outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
|
|
32
|
+
ghost: "hover:bg-accent hover:text-accent-foreground",
|
|
33
|
+
default: "bg-primary text-primary-foreground hover:bg-primary/90"
|
|
34
|
+
};
|
|
35
|
+
const SIZE_CLASSES = {
|
|
36
|
+
sm: "h-9 px-3 text-xs rounded-md",
|
|
37
|
+
default: "h-10 px-4 py-2 text-sm rounded-md",
|
|
38
|
+
lg: "h-11 px-8 text-sm rounded-md",
|
|
39
|
+
icon: "h-9 w-9 rounded-md"
|
|
40
|
+
};
|
|
41
|
+
function ShareButton({
|
|
42
|
+
title,
|
|
43
|
+
url,
|
|
44
|
+
variant = "outline",
|
|
45
|
+
size = "sm",
|
|
46
|
+
className
|
|
47
|
+
}) {
|
|
48
|
+
const [copied, setCopied] = (0, import_react.useState)(false);
|
|
49
|
+
const handleShare = async () => {
|
|
50
|
+
const shareUrl = url ?? (typeof window !== "undefined" ? window.location.href : "");
|
|
51
|
+
if (typeof navigator !== "undefined" && navigator.share) {
|
|
52
|
+
try {
|
|
53
|
+
await navigator.share({ title, url: shareUrl });
|
|
54
|
+
} catch {
|
|
55
|
+
}
|
|
56
|
+
} else {
|
|
57
|
+
await navigator.clipboard.writeText(shareUrl);
|
|
58
|
+
setCopied(true);
|
|
59
|
+
import_sonner.toast.success("Link copied to clipboard");
|
|
60
|
+
setTimeout(() => setCopied(false), 2e3);
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
64
|
+
"button",
|
|
65
|
+
{
|
|
66
|
+
onClick: handleShare,
|
|
67
|
+
className: (0, import_cn.cn)(
|
|
68
|
+
"inline-flex items-center justify-center font-medium transition-colors",
|
|
69
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
70
|
+
"disabled:pointer-events-none disabled:opacity-50",
|
|
71
|
+
VARIANT_CLASSES[variant],
|
|
72
|
+
SIZE_CLASSES[size],
|
|
73
|
+
className
|
|
74
|
+
),
|
|
75
|
+
children: [
|
|
76
|
+
copied ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Check, { className: "h-3.5 w-3.5 text-emerald-500" }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Share2, { className: "h-3.5 w-3.5" }),
|
|
77
|
+
size !== "icon" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "ml-1.5", children: copied ? "Copied" : "Share" })
|
|
78
|
+
]
|
|
79
|
+
}
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
83
|
+
0 && (module.exports = {
|
|
84
|
+
ShareButton
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=share-button.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/share-button.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { Share2, Check } from \"lucide-react\";\nimport { toast } from \"sonner\";\nimport { cn } from \"../utils/cn.js\";\n\nexport interface ShareButtonProps {\n title: string;\n url?: string;\n variant?: \"outline\" | \"ghost\" | \"default\";\n size?: \"sm\" | \"default\" | \"lg\" | \"icon\";\n className?: string;\n}\n\nconst VARIANT_CLASSES: Record<NonNullable<ShareButtonProps[\"variant\"]>, string> = {\n outline: \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n};\n\nconst SIZE_CLASSES: Record<NonNullable<ShareButtonProps[\"size\"]>, string> = {\n sm: \"h-9 px-3 text-xs rounded-md\",\n default: \"h-10 px-4 py-2 text-sm rounded-md\",\n lg: \"h-11 px-8 text-sm rounded-md\",\n icon: \"h-9 w-9 rounded-md\",\n};\n\nexport function ShareButton({\n title,\n url,\n variant = \"outline\",\n size = \"sm\",\n className,\n}: ShareButtonProps) {\n const [copied, setCopied] = useState(false);\n\n const handleShare = async () => {\n const shareUrl = url ?? (typeof window !== \"undefined\" ? window.location.href : \"\");\n if (typeof navigator !== \"undefined\" && navigator.share) {\n try {\n await navigator.share({ title, url: shareUrl });\n } catch {\n // User cancelled — ignore\n }\n } else {\n await navigator.clipboard.writeText(shareUrl);\n setCopied(true);\n toast.success(\"Link copied to clipboard\");\n setTimeout(() => setCopied(false), 2000);\n }\n };\n\n return (\n <button\n onClick={handleShare}\n className={cn(\n \"inline-flex items-center justify-center font-medium transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n VARIANT_CLASSES[variant],\n SIZE_CLASSES[size],\n className\n )}\n >\n {copied\n ? <Check className=\"h-3.5 w-3.5 text-emerald-500\" />\n : <Share2 className=\"h-3.5 w-3.5\" />\n }\n {size !== \"icon\" && (\n <span className=\"ml-1.5\">{copied ? \"Copied\" : \"Share\"}</span>\n )}\n </button>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAsDI;AApDJ,mBAAyB;AACzB,0BAA8B;AAC9B,oBAAsB;AACtB,gBAAmB;AAUnB,MAAM,kBAA4E;AAAA,EAChF,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AACX;AAEA,MAAM,eAAsE;AAAA,EAC1E,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,IAAI;AAAA,EACJ,MAAM;AACR;AAEO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP;AACF,GAAqB;AACnB,QAAM,CAAC,QAAQ,SAAS,QAAI,uBAAS,KAAK;AAE1C,QAAM,cAAc,YAAY;AAC9B,UAAM,WAAW,QAAQ,OAAO,WAAW,cAAc,OAAO,SAAS,OAAO;AAChF,QAAI,OAAO,cAAc,eAAe,UAAU,OAAO;AACvD,UAAI;AACF,cAAM,UAAU,MAAM,EAAE,OAAO,KAAK,SAAS,CAAC;AAAA,MAChD,QAAQ;AAAA,MAER;AAAA,IACF,OAAO;AACL,YAAM,UAAU,UAAU,UAAU,QAAQ;AAC5C,gBAAU,IAAI;AACd,0BAAM,QAAQ,0BAA0B;AACxC,iBAAW,MAAM,UAAU,KAAK,GAAG,GAAI;AAAA,IACzC;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,SAAS;AAAA,MACT,eAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA,gBAAgB,OAAO;AAAA,QACvB,aAAa,IAAI;AAAA,QACjB;AAAA,MACF;AAAA,MAEC;AAAA,iBACG,4CAAC,6BAAM,WAAU,gCAA+B,IAChD,4CAAC,8BAAO,WAAU,eAAc;AAAA,QAEnC,SAAS,UACR,4CAAC,UAAK,WAAU,UAAU,mBAAS,WAAW,SAAQ;AAAA;AAAA;AAAA,EAE1D;AAEJ;","names":[]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
interface ShareButtonProps {
|
|
4
|
+
title: string;
|
|
5
|
+
url?: string;
|
|
6
|
+
variant?: "outline" | "ghost" | "default";
|
|
7
|
+
size?: "sm" | "default" | "lg" | "icon";
|
|
8
|
+
className?: string;
|
|
9
|
+
}
|
|
10
|
+
declare function ShareButton({ title, url, variant, size, className, }: ShareButtonProps): react_jsx_runtime.JSX.Element;
|
|
11
|
+
|
|
12
|
+
export { ShareButton, type ShareButtonProps };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
interface ShareButtonProps {
|
|
4
|
+
title: string;
|
|
5
|
+
url?: string;
|
|
6
|
+
variant?: "outline" | "ghost" | "default";
|
|
7
|
+
size?: "sm" | "default" | "lg" | "icon";
|
|
8
|
+
className?: string;
|
|
9
|
+
}
|
|
10
|
+
declare function ShareButton({ title, url, variant, size, className, }: ShareButtonProps): react_jsx_runtime.JSX.Element;
|
|
11
|
+
|
|
12
|
+
export { ShareButton, type ShareButtonProps };
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { Share2, Check } from "lucide-react";
|
|
5
|
+
import { toast } from "sonner";
|
|
6
|
+
import { cn } from "../utils/cn.js";
|
|
7
|
+
const VARIANT_CLASSES = {
|
|
8
|
+
outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
|
|
9
|
+
ghost: "hover:bg-accent hover:text-accent-foreground",
|
|
10
|
+
default: "bg-primary text-primary-foreground hover:bg-primary/90"
|
|
11
|
+
};
|
|
12
|
+
const SIZE_CLASSES = {
|
|
13
|
+
sm: "h-9 px-3 text-xs rounded-md",
|
|
14
|
+
default: "h-10 px-4 py-2 text-sm rounded-md",
|
|
15
|
+
lg: "h-11 px-8 text-sm rounded-md",
|
|
16
|
+
icon: "h-9 w-9 rounded-md"
|
|
17
|
+
};
|
|
18
|
+
function ShareButton({
|
|
19
|
+
title,
|
|
20
|
+
url,
|
|
21
|
+
variant = "outline",
|
|
22
|
+
size = "sm",
|
|
23
|
+
className
|
|
24
|
+
}) {
|
|
25
|
+
const [copied, setCopied] = useState(false);
|
|
26
|
+
const handleShare = async () => {
|
|
27
|
+
const shareUrl = url ?? (typeof window !== "undefined" ? window.location.href : "");
|
|
28
|
+
if (typeof navigator !== "undefined" && navigator.share) {
|
|
29
|
+
try {
|
|
30
|
+
await navigator.share({ title, url: shareUrl });
|
|
31
|
+
} catch {
|
|
32
|
+
}
|
|
33
|
+
} else {
|
|
34
|
+
await navigator.clipboard.writeText(shareUrl);
|
|
35
|
+
setCopied(true);
|
|
36
|
+
toast.success("Link copied to clipboard");
|
|
37
|
+
setTimeout(() => setCopied(false), 2e3);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
return /* @__PURE__ */ jsxs(
|
|
41
|
+
"button",
|
|
42
|
+
{
|
|
43
|
+
onClick: handleShare,
|
|
44
|
+
className: cn(
|
|
45
|
+
"inline-flex items-center justify-center font-medium transition-colors",
|
|
46
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
47
|
+
"disabled:pointer-events-none disabled:opacity-50",
|
|
48
|
+
VARIANT_CLASSES[variant],
|
|
49
|
+
SIZE_CLASSES[size],
|
|
50
|
+
className
|
|
51
|
+
),
|
|
52
|
+
children: [
|
|
53
|
+
copied ? /* @__PURE__ */ jsx(Check, { className: "h-3.5 w-3.5 text-emerald-500" }) : /* @__PURE__ */ jsx(Share2, { className: "h-3.5 w-3.5" }),
|
|
54
|
+
size !== "icon" && /* @__PURE__ */ jsx("span", { className: "ml-1.5", children: copied ? "Copied" : "Share" })
|
|
55
|
+
]
|
|
56
|
+
}
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
export {
|
|
60
|
+
ShareButton
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=share-button.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/share-button.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { Share2, Check } from \"lucide-react\";\nimport { toast } from \"sonner\";\nimport { cn } from \"../utils/cn.js\";\n\nexport interface ShareButtonProps {\n title: string;\n url?: string;\n variant?: \"outline\" | \"ghost\" | \"default\";\n size?: \"sm\" | \"default\" | \"lg\" | \"icon\";\n className?: string;\n}\n\nconst VARIANT_CLASSES: Record<NonNullable<ShareButtonProps[\"variant\"]>, string> = {\n outline: \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n};\n\nconst SIZE_CLASSES: Record<NonNullable<ShareButtonProps[\"size\"]>, string> = {\n sm: \"h-9 px-3 text-xs rounded-md\",\n default: \"h-10 px-4 py-2 text-sm rounded-md\",\n lg: \"h-11 px-8 text-sm rounded-md\",\n icon: \"h-9 w-9 rounded-md\",\n};\n\nexport function ShareButton({\n title,\n url,\n variant = \"outline\",\n size = \"sm\",\n className,\n}: ShareButtonProps) {\n const [copied, setCopied] = useState(false);\n\n const handleShare = async () => {\n const shareUrl = url ?? (typeof window !== \"undefined\" ? window.location.href : \"\");\n if (typeof navigator !== \"undefined\" && navigator.share) {\n try {\n await navigator.share({ title, url: shareUrl });\n } catch {\n // User cancelled — ignore\n }\n } else {\n await navigator.clipboard.writeText(shareUrl);\n setCopied(true);\n toast.success(\"Link copied to clipboard\");\n setTimeout(() => setCopied(false), 2000);\n }\n };\n\n return (\n <button\n onClick={handleShare}\n className={cn(\n \"inline-flex items-center justify-center font-medium transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n VARIANT_CLASSES[variant],\n SIZE_CLASSES[size],\n className\n )}\n >\n {copied\n ? <Check className=\"h-3.5 w-3.5 text-emerald-500\" />\n : <Share2 className=\"h-3.5 w-3.5\" />\n }\n {size !== \"icon\" && (\n <span className=\"ml-1.5\">{copied ? \"Copied\" : \"Share\"}</span>\n )}\n </button>\n );\n}\n"],"mappings":";AAsDI,SAYM,KAZN;AApDJ,SAAS,gBAAgB;AACzB,SAAS,QAAQ,aAAa;AAC9B,SAAS,aAAa;AACtB,SAAS,UAAU;AAUnB,MAAM,kBAA4E;AAAA,EAChF,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AACX;AAEA,MAAM,eAAsE;AAAA,EAC1E,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,IAAI;AAAA,EACJ,MAAM;AACR;AAEO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP;AACF,GAAqB;AACnB,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAE1C,QAAM,cAAc,YAAY;AAC9B,UAAM,WAAW,QAAQ,OAAO,WAAW,cAAc,OAAO,SAAS,OAAO;AAChF,QAAI,OAAO,cAAc,eAAe,UAAU,OAAO;AACvD,UAAI;AACF,cAAM,UAAU,MAAM,EAAE,OAAO,KAAK,SAAS,CAAC;AAAA,MAChD,QAAQ;AAAA,MAER;AAAA,IACF,OAAO;AACL,YAAM,UAAU,UAAU,UAAU,QAAQ;AAC5C,gBAAU,IAAI;AACd,YAAM,QAAQ,0BAA0B;AACxC,iBAAW,MAAM,UAAU,KAAK,GAAG,GAAI;AAAA,IACzC;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,SAAS;AAAA,MACT,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA,gBAAgB,OAAO;AAAA,QACvB,aAAa,IAAI;AAAA,QACjB;AAAA,MACF;AAAA,MAEC;AAAA,iBACG,oBAAC,SAAM,WAAU,gCAA+B,IAChD,oBAAC,UAAO,WAAU,eAAc;AAAA,QAEnC,SAAS,UACR,oBAAC,UAAK,WAAU,UAAU,mBAAS,WAAW,SAAQ;AAAA;AAAA;AAAA,EAE1D;AAEJ;","names":[]}
|