@sonordev/agency-site-kit 0.1.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/BeforeAfterSection-6QUJOBO2.js +176 -0
- package/dist/BeforeAfterSection-6QUJOBO2.js.map +1 -0
- package/dist/BeforeAfterSection-DVAWWE4K.cjs +181 -0
- package/dist/BeforeAfterSection-DVAWWE4K.cjs.map +1 -0
- package/dist/CTASection-4JKLXEUF.cjs +111 -0
- package/dist/CTASection-4JKLXEUF.cjs.map +1 -0
- package/dist/CTASection-BJA72XIL.js +106 -0
- package/dist/CTASection-BJA72XIL.js.map +1 -0
- package/dist/ChallengesSection-GEQGVSJN.js +180 -0
- package/dist/ChallengesSection-GEQGVSJN.js.map +1 -0
- package/dist/ChallengesSection-IZ3DHECS.cjs +182 -0
- package/dist/ChallengesSection-IZ3DHECS.cjs.map +1 -0
- package/dist/ConversionFunnelSection-AUUSJ5HQ.cjs +209 -0
- package/dist/ConversionFunnelSection-AUUSJ5HQ.cjs.map +1 -0
- package/dist/ConversionFunnelSection-D3GE4NKE.js +203 -0
- package/dist/ConversionFunnelSection-D3GE4NKE.js.map +1 -0
- package/dist/DetailsSection-FB763FS7.js +135 -0
- package/dist/DetailsSection-FB763FS7.js.map +1 -0
- package/dist/DetailsSection-OACJFGH7.cjs +137 -0
- package/dist/DetailsSection-OACJFGH7.cjs.map +1 -0
- package/dist/FeatureSpotlightSection-B7P3JGNL.js +205 -0
- package/dist/FeatureSpotlightSection-B7P3JGNL.js.map +1 -0
- package/dist/FeatureSpotlightSection-WRHXS7TU.cjs +210 -0
- package/dist/FeatureSpotlightSection-WRHXS7TU.cjs.map +1 -0
- package/dist/GallerySection-VMKORC47.js +218 -0
- package/dist/GallerySection-VMKORC47.js.map +1 -0
- package/dist/GallerySection-WJ4PQDBI.cjs +219 -0
- package/dist/GallerySection-WJ4PQDBI.cjs.map +1 -0
- package/dist/MetricsTimelineSection-4L6DUHJ5.cjs +258 -0
- package/dist/MetricsTimelineSection-4L6DUHJ5.cjs.map +1 -0
- package/dist/MetricsTimelineSection-6BT5GNFV.js +253 -0
- package/dist/MetricsTimelineSection-6BT5GNFV.js.map +1 -0
- package/dist/ResultsSection-DFUJ5U6M.js +93 -0
- package/dist/ResultsSection-DFUJ5U6M.js.map +1 -0
- package/dist/ResultsSection-XLGMMQKY.cjs +95 -0
- package/dist/ResultsSection-XLGMMQKY.cjs.map +1 -0
- package/dist/ServicesSection-D5V3Q4GR.js +118 -0
- package/dist/ServicesSection-D5V3Q4GR.js.map +1 -0
- package/dist/ServicesSection-WJMGK2MF.cjs +120 -0
- package/dist/ServicesSection-WJMGK2MF.cjs.map +1 -0
- package/dist/StrategySection-3ED3QW4R.cjs +180 -0
- package/dist/StrategySection-3ED3QW4R.cjs.map +1 -0
- package/dist/StrategySection-VUWMIYYP.js +175 -0
- package/dist/StrategySection-VUWMIYYP.js.map +1 -0
- package/dist/TeamSection-DZVSNZE6.cjs +112 -0
- package/dist/TeamSection-DZVSNZE6.cjs.map +1 -0
- package/dist/TeamSection-HGKFW6PQ.js +107 -0
- package/dist/TeamSection-HGKFW6PQ.js.map +1 -0
- package/dist/TechStackSection-OCUYG4XT.js +90 -0
- package/dist/TechStackSection-OCUYG4XT.js.map +1 -0
- package/dist/TechStackSection-VKJK4KQB.cjs +91 -0
- package/dist/TechStackSection-VKJK4KQB.cjs.map +1 -0
- package/dist/TestimonialSection-6RGSMXQB.js +122 -0
- package/dist/TestimonialSection-6RGSMXQB.js.map +1 -0
- package/dist/TestimonialSection-XPTFUQIN.cjs +124 -0
- package/dist/TestimonialSection-XPTFUQIN.cjs.map +1 -0
- package/dist/VideoSection-4A2HC6K6.js +117 -0
- package/dist/VideoSection-4A2HC6K6.js.map +1 -0
- package/dist/VideoSection-G3DFS7UH.cjs +118 -0
- package/dist/VideoSection-G3DFS7UH.cjs.map +1 -0
- package/dist/chunk-2VNNFAG6.js +415 -0
- package/dist/chunk-2VNNFAG6.js.map +1 -0
- package/dist/chunk-2Y4O3LWM.js +53 -0
- package/dist/chunk-2Y4O3LWM.js.map +1 -0
- package/dist/chunk-5FKOLIV6.cjs +221 -0
- package/dist/chunk-5FKOLIV6.cjs.map +1 -0
- package/dist/chunk-7CFFAKDM.js +74 -0
- package/dist/chunk-7CFFAKDM.js.map +1 -0
- package/dist/chunk-A4I4IK7V.js +69 -0
- package/dist/chunk-A4I4IK7V.js.map +1 -0
- package/dist/chunk-IKBK7HYX.cjs +79 -0
- package/dist/chunk-IKBK7HYX.cjs.map +1 -0
- package/dist/chunk-KEOHORIH.cjs +79 -0
- package/dist/chunk-KEOHORIH.cjs.map +1 -0
- package/dist/chunk-NAS4K5UR.cjs +139 -0
- package/dist/chunk-NAS4K5UR.cjs.map +1 -0
- package/dist/chunk-QBLWP25X.cjs +73 -0
- package/dist/chunk-QBLWP25X.cjs.map +1 -0
- package/dist/chunk-QIC6JFFD.js +210 -0
- package/dist/chunk-QIC6JFFD.js.map +1 -0
- package/dist/chunk-TAPNXT7X.cjs +422 -0
- package/dist/chunk-TAPNXT7X.cjs.map +1 -0
- package/dist/chunk-XCKXHK44.js +15 -0
- package/dist/chunk-XCKXHK44.js.map +1 -0
- package/dist/chunk-XMC4DN6G.js +131 -0
- package/dist/chunk-XMC4DN6G.js.map +1 -0
- package/dist/chunk-XONXEFJY.cjs +58 -0
- package/dist/chunk-XONXEFJY.cjs.map +1 -0
- package/dist/chunk-XQNJED46.cjs +19 -0
- package/dist/chunk-XQNJED46.cjs.map +1 -0
- package/dist/chunk-YB4B3OMC.js +74 -0
- package/dist/chunk-YB4B3OMC.js.map +1 -0
- package/dist/index.cjs +271 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +137 -0
- package/dist/index.d.ts +137 -0
- package/dist/index.js +197 -0
- package/dist/index.js.map +1 -0
- package/dist/layout/index.cjs +13 -0
- package/dist/layout/index.cjs.map +1 -0
- package/dist/layout/index.d.cts +54 -0
- package/dist/layout/index.d.ts +54 -0
- package/dist/layout/index.js +4 -0
- package/dist/layout/index.js.map +1 -0
- package/dist/portfolio/client.cjs +18 -0
- package/dist/portfolio/client.cjs.map +1 -0
- package/dist/portfolio/client.d.cts +97 -0
- package/dist/portfolio/client.d.ts +97 -0
- package/dist/portfolio/client.js +6 -0
- package/dist/portfolio/client.js.map +1 -0
- package/dist/portfolio/index.cjs +41 -0
- package/dist/portfolio/index.cjs.map +1 -0
- package/dist/portfolio/index.d.cts +12 -0
- package/dist/portfolio/index.d.ts +12 -0
- package/dist/portfolio/index.js +8 -0
- package/dist/portfolio/index.js.map +1 -0
- package/dist/portfolio/sections.cjs +20 -0
- package/dist/portfolio/sections.cjs.map +1 -0
- package/dist/portfolio/sections.d.cts +42 -0
- package/dist/portfolio/sections.d.ts +42 -0
- package/dist/portfolio/sections.js +4 -0
- package/dist/portfolio/sections.js.map +1 -0
- package/dist/portfolio/server.cjs +141 -0
- package/dist/portfolio/server.cjs.map +1 -0
- package/dist/portfolio/server.d.cts +68 -0
- package/dist/portfolio/server.d.ts +68 -0
- package/dist/portfolio/server.js +134 -0
- package/dist/portfolio/server.js.map +1 -0
- package/dist/types-BMUhBhWx.d.cts +346 -0
- package/dist/types-BMUhBhWx.d.ts +346 -0
- package/package.json +71 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { GlassCard } from './chunk-YB4B3OMC.js';
|
|
2
|
+
import { ScrollReveal } from './chunk-7CFFAKDM.js';
|
|
3
|
+
import Image from 'next/image';
|
|
4
|
+
import Link from 'next/link';
|
|
5
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
function PortfolioCard({ item, className = "" }) {
|
|
8
|
+
const thumbnailSrc = item.hero_screenshots?.desktop || item.hero_image;
|
|
9
|
+
const kpis = Array.isArray(item.kpis) ? item.kpis : [];
|
|
10
|
+
const services = Array.isArray(item.services) ? item.services : [];
|
|
11
|
+
const kpiPreview = kpis.slice(0, 3);
|
|
12
|
+
const servicePreview = services.slice(0, 3);
|
|
13
|
+
return /* @__PURE__ */ jsx(Link, { href: `/portfolio/${item.slug}`, className: `block group ${className}`, children: /* @__PURE__ */ jsx(GlassCard, { padding: "sm", hover: true, children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4", children: [
|
|
14
|
+
thumbnailSrc && /* @__PURE__ */ jsxs(
|
|
15
|
+
"div",
|
|
16
|
+
{
|
|
17
|
+
className: "relative w-full overflow-hidden rounded-xl",
|
|
18
|
+
style: { aspectRatio: "16/10" },
|
|
19
|
+
children: [
|
|
20
|
+
/* @__PURE__ */ jsx(
|
|
21
|
+
Image,
|
|
22
|
+
{
|
|
23
|
+
src: thumbnailSrc,
|
|
24
|
+
alt: item.hero_image_alt || item.title,
|
|
25
|
+
fill: true,
|
|
26
|
+
sizes: "(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw",
|
|
27
|
+
className: "object-cover object-top transition-transform duration-500 group-hover:scale-105"
|
|
28
|
+
}
|
|
29
|
+
),
|
|
30
|
+
/* @__PURE__ */ jsx(
|
|
31
|
+
"span",
|
|
32
|
+
{
|
|
33
|
+
className: "absolute top-3 left-3 px-3 py-1 rounded-full text-[11px] uppercase tracking-wider font-semibold",
|
|
34
|
+
style: {
|
|
35
|
+
background: "color-mix(in srgb, var(--sk-primary, #6366f1) 80%, transparent)",
|
|
36
|
+
color: "#ffffff",
|
|
37
|
+
backdropFilter: "blur(8px)"
|
|
38
|
+
},
|
|
39
|
+
children: item.category
|
|
40
|
+
}
|
|
41
|
+
)
|
|
42
|
+
]
|
|
43
|
+
}
|
|
44
|
+
),
|
|
45
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2 px-2 pb-2", children: [
|
|
46
|
+
/* @__PURE__ */ jsx(
|
|
47
|
+
"h3",
|
|
48
|
+
{
|
|
49
|
+
className: "text-lg font-semibold line-clamp-1",
|
|
50
|
+
style: { color: "var(--sk-text-primary, #ffffff)" },
|
|
51
|
+
children: item.title
|
|
52
|
+
}
|
|
53
|
+
),
|
|
54
|
+
item.subtitle && /* @__PURE__ */ jsx(
|
|
55
|
+
"p",
|
|
56
|
+
{
|
|
57
|
+
className: "text-sm line-clamp-2",
|
|
58
|
+
style: { color: "var(--sk-text-tertiary, #71717a)" },
|
|
59
|
+
children: item.subtitle
|
|
60
|
+
}
|
|
61
|
+
),
|
|
62
|
+
kpiPreview.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex items-center gap-4 mt-1", children: kpiPreview.map((kpi, i) => /* @__PURE__ */ jsxs("div", { className: "flex flex-col", children: [
|
|
63
|
+
/* @__PURE__ */ jsxs(
|
|
64
|
+
"span",
|
|
65
|
+
{
|
|
66
|
+
className: "text-base font-bold",
|
|
67
|
+
style: { color: "var(--sk-primary, #6366f1)" },
|
|
68
|
+
children: [
|
|
69
|
+
kpi.prefix || "",
|
|
70
|
+
kpi.value.toLocaleString(),
|
|
71
|
+
kpi.suffix
|
|
72
|
+
]
|
|
73
|
+
}
|
|
74
|
+
),
|
|
75
|
+
/* @__PURE__ */ jsx(
|
|
76
|
+
"span",
|
|
77
|
+
{
|
|
78
|
+
className: "text-[10px] uppercase tracking-wider font-medium",
|
|
79
|
+
style: { color: "var(--sk-text-tertiary, #71717a)" },
|
|
80
|
+
children: kpi.label
|
|
81
|
+
}
|
|
82
|
+
)
|
|
83
|
+
] }, i)) }),
|
|
84
|
+
servicePreview.length > 0 && /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-1.5 mt-2", children: [
|
|
85
|
+
servicePreview.map((service) => /* @__PURE__ */ jsx(
|
|
86
|
+
"span",
|
|
87
|
+
{
|
|
88
|
+
className: "px-2.5 py-0.5 rounded-full text-[11px] font-medium",
|
|
89
|
+
style: {
|
|
90
|
+
background: "var(--sk-surface, rgba(255,255,255,0.05))",
|
|
91
|
+
color: "var(--sk-text-secondary, #a1a1aa)",
|
|
92
|
+
border: "1px solid var(--sk-border, rgba(255,255,255,0.1))"
|
|
93
|
+
},
|
|
94
|
+
children: service
|
|
95
|
+
},
|
|
96
|
+
service
|
|
97
|
+
)),
|
|
98
|
+
services.length > 3 && /* @__PURE__ */ jsxs(
|
|
99
|
+
"span",
|
|
100
|
+
{
|
|
101
|
+
className: "px-2.5 py-0.5 rounded-full text-[11px] font-medium",
|
|
102
|
+
style: {
|
|
103
|
+
background: "var(--sk-surface, rgba(255,255,255,0.05))",
|
|
104
|
+
color: "var(--sk-text-tertiary, #71717a)"
|
|
105
|
+
},
|
|
106
|
+
children: [
|
|
107
|
+
"+",
|
|
108
|
+
item.services.length - 3
|
|
109
|
+
]
|
|
110
|
+
}
|
|
111
|
+
)
|
|
112
|
+
] })
|
|
113
|
+
] })
|
|
114
|
+
] }) }) });
|
|
115
|
+
}
|
|
116
|
+
function PortfolioGrid({ items, className = "" }) {
|
|
117
|
+
return /* @__PURE__ */ jsx(ScrollReveal, { stagger: 0.1, children: /* @__PURE__ */ jsx(
|
|
118
|
+
"div",
|
|
119
|
+
{
|
|
120
|
+
className: `grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 ${className}`,
|
|
121
|
+
style: {
|
|
122
|
+
gap: "var(--sk-grid-gap, 24px)"
|
|
123
|
+
},
|
|
124
|
+
children: items.map((item) => /* @__PURE__ */ jsx(PortfolioCard, { item }, item.id))
|
|
125
|
+
}
|
|
126
|
+
) });
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export { PortfolioCard, PortfolioGrid };
|
|
130
|
+
//# sourceMappingURL=chunk-XMC4DN6G.js.map
|
|
131
|
+
//# sourceMappingURL=chunk-XMC4DN6G.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/portfolio/components/PortfolioCard.tsx","../src/portfolio/components/PortfolioGrid.tsx"],"names":["jsx"],"mappings":"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","file":"chunk-XMC4DN6G.js","sourcesContent":["'use client';\n\nimport React from 'react';\nimport Image from 'next/image';\nimport Link from 'next/link';\nimport type { PortfolioItem } from '../../types';\nimport GlassCard from './primitives/GlassCard';\n\ninterface PortfolioCardProps {\n item: PortfolioItem;\n className?: string;\n}\n\nexport default function PortfolioCard({ item, className = '' }: PortfolioCardProps) {\n // Use hero_screenshots desktop as thumbnail, fall back to hero_image\n const thumbnailSrc = item.hero_screenshots?.desktop || item.hero_image;\n const kpis = Array.isArray(item.kpis) ? item.kpis : [];\n const services = Array.isArray(item.services) ? item.services : [];\n const kpiPreview = kpis.slice(0, 3);\n const servicePreview = services.slice(0, 3);\n\n return (\n <Link href={`/portfolio/${item.slug}`} className={`block group ${className}`}>\n <GlassCard padding=\"sm\" hover>\n <div className=\"flex flex-col gap-4\">\n {/* Thumbnail */}\n {thumbnailSrc && (\n <div\n className=\"relative w-full overflow-hidden rounded-xl\"\n style={{ aspectRatio: '16/10' }}\n >\n <Image\n src={thumbnailSrc}\n alt={item.hero_image_alt || item.title}\n fill\n sizes=\"(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw\"\n className=\"object-cover object-top transition-transform duration-500 group-hover:scale-105\"\n />\n {/* Category badge */}\n <span\n className=\"absolute top-3 left-3 px-3 py-1 rounded-full text-[11px] uppercase tracking-wider font-semibold\"\n style={{\n background: 'color-mix(in srgb, var(--sk-primary, #6366f1) 80%, transparent)',\n color: '#ffffff',\n backdropFilter: 'blur(8px)',\n }}\n >\n {item.category}\n </span>\n </div>\n )}\n\n {/* Text content */}\n <div className=\"flex flex-col gap-2 px-2 pb-2\">\n <h3\n className=\"text-lg font-semibold line-clamp-1\"\n style={{ color: 'var(--sk-text-primary, #ffffff)' }}\n >\n {item.title}\n </h3>\n\n {item.subtitle && (\n <p\n className=\"text-sm line-clamp-2\"\n style={{ color: 'var(--sk-text-tertiary, #71717a)' }}\n >\n {item.subtitle}\n </p>\n )}\n\n {/* KPI preview */}\n {kpiPreview.length > 0 && (\n <div className=\"flex items-center gap-4 mt-1\">\n {kpiPreview.map((kpi, i) => (\n <div key={i} className=\"flex flex-col\">\n <span\n className=\"text-base font-bold\"\n style={{ color: 'var(--sk-primary, #6366f1)' }}\n >\n {kpi.prefix || ''}\n {kpi.value.toLocaleString()}\n {kpi.suffix}\n </span>\n <span\n className=\"text-[10px] uppercase tracking-wider font-medium\"\n style={{ color: 'var(--sk-text-tertiary, #71717a)' }}\n >\n {kpi.label}\n </span>\n </div>\n ))}\n </div>\n )}\n\n {/* Services tags */}\n {servicePreview.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5 mt-2\">\n {servicePreview.map((service) => (\n <span\n key={service}\n className=\"px-2.5 py-0.5 rounded-full text-[11px] font-medium\"\n style={{\n background: 'var(--sk-surface, rgba(255,255,255,0.05))',\n color: 'var(--sk-text-secondary, #a1a1aa)',\n border: '1px solid var(--sk-border, rgba(255,255,255,0.1))',\n }}\n >\n {service}\n </span>\n ))}\n {services.length > 3 && (\n <span\n className=\"px-2.5 py-0.5 rounded-full text-[11px] font-medium\"\n style={{\n background: 'var(--sk-surface, rgba(255,255,255,0.05))',\n color: 'var(--sk-text-tertiary, #71717a)',\n }}\n >\n +{item.services.length - 3}\n </span>\n )}\n </div>\n )}\n </div>\n </div>\n </GlassCard>\n </Link>\n );\n}\n","'use client';\n\nimport React from 'react';\nimport type { PortfolioItem } from '../../types';\nimport ScrollReveal from './primitives/ScrollReveal';\nimport PortfolioCard from './PortfolioCard';\n\ninterface PortfolioGridProps {\n items: PortfolioItem[];\n className?: string;\n}\n\nexport default function PortfolioGrid({ items, className = '' }: PortfolioGridProps) {\n return (\n <ScrollReveal stagger={0.1}>\n <div\n className={`grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 ${className}`}\n style={{\n gap: 'var(--sk-grid-gap, 24px)',\n }}\n >\n {items.map((item) => (\n <PortfolioCard key={item.id} item={item} />\n ))}\n </div>\n </ScrollReveal>\n );\n}\n"]}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
var gsap = require('gsap');
|
|
5
|
+
var ScrollTrigger = require('gsap/ScrollTrigger');
|
|
6
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
7
|
+
|
|
8
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
+
|
|
10
|
+
var gsap__default = /*#__PURE__*/_interopDefault(gsap);
|
|
11
|
+
|
|
12
|
+
// src/portfolio/components/primitives/AnimatedCounter.tsx
|
|
13
|
+
function AnimatedCounter({
|
|
14
|
+
value,
|
|
15
|
+
suffix = "",
|
|
16
|
+
prefix = "",
|
|
17
|
+
duration = 2,
|
|
18
|
+
decimals = 0,
|
|
19
|
+
className,
|
|
20
|
+
once = true
|
|
21
|
+
}) {
|
|
22
|
+
const ref = react.useRef(null);
|
|
23
|
+
const [display, setDisplay] = react.useState(`${prefix}0${suffix}`);
|
|
24
|
+
react.useEffect(() => {
|
|
25
|
+
gsap__default.default.registerPlugin(ScrollTrigger.ScrollTrigger);
|
|
26
|
+
const el = ref.current;
|
|
27
|
+
if (!el) return;
|
|
28
|
+
const prefersReducedMotion = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
29
|
+
if (prefersReducedMotion) {
|
|
30
|
+
setDisplay(`${prefix}${value.toFixed(decimals)}${suffix}`);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const counter = { val: 0 };
|
|
34
|
+
const ctx = gsap__default.default.context(() => {
|
|
35
|
+
gsap__default.default.to(counter, {
|
|
36
|
+
val: value,
|
|
37
|
+
duration,
|
|
38
|
+
ease: "power2.out",
|
|
39
|
+
snap: decimals === 0 ? { val: 1 } : void 0,
|
|
40
|
+
scrollTrigger: {
|
|
41
|
+
trigger: el,
|
|
42
|
+
start: "top 85%",
|
|
43
|
+
toggleActions: once ? "play none none none" : "play reverse play reverse"
|
|
44
|
+
},
|
|
45
|
+
onUpdate() {
|
|
46
|
+
const formatted = decimals > 0 ? counter.val.toFixed(decimals) : Math.round(counter.val).toLocaleString();
|
|
47
|
+
setDisplay(`${prefix}${formatted}${suffix}`);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}, el);
|
|
51
|
+
return () => ctx.revert();
|
|
52
|
+
}, [value, suffix, prefix, duration, decimals, once]);
|
|
53
|
+
return /* @__PURE__ */ jsxRuntime.jsx("span", { ref, className, children: display });
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
exports.AnimatedCounter = AnimatedCounter;
|
|
57
|
+
//# sourceMappingURL=chunk-XONXEFJY.cjs.map
|
|
58
|
+
//# sourceMappingURL=chunk-XONXEFJY.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/portfolio/components/primitives/AnimatedCounter.tsx"],"names":["useRef","useState","useEffect","gsap","ScrollTrigger","jsx"],"mappings":";;;;;;;;;;;;AAgBe,SAAR,eAAA,CAAiC;AAAA,EACtC,KAAA;AAAA,EACA,MAAA,GAAS,EAAA;AAAA,EACT,MAAA,GAAS,EAAA;AAAA,EACT,QAAA,GAAW,CAAA;AAAA,EACX,QAAA,GAAW,CAAA;AAAA,EACX,SAAA;AAAA,EACA,IAAA,GAAO;AACT,CAAA,EAAyB;AACvB,EAAA,MAAM,GAAA,GAAMA,aAAwB,IAAI,CAAA;AACxC,EAAA,MAAM,CAAC,SAAS,UAAU,CAAA,GAAIC,eAAS,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAA;AAE5D,EAAAC,eAAA,CAAU,MAAM;AACd,IAAAC,qBAAA,CAAK,eAAeC,2BAAa,CAAA;AAEjC,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AACf,IAAA,IAAI,CAAC,EAAA,EAAI;AAGT,IAAA,MAAM,oBAAA,GAAuB,MAAA,CAAO,UAAA,CAAW,kCAAkC,CAAA,CAAE,OAAA;AACnF,IAAA,IAAI,oBAAA,EAAsB;AACxB,MAAA,UAAA,CAAW,CAAA,EAAG,MAAM,CAAA,EAAG,KAAA,CAAM,QAAQ,QAAQ,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,CAAA;AACzD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,EAAE,GAAA,EAAK,CAAA,EAAE;AAEzB,IAAA,MAAM,GAAA,GAAMD,qBAAA,CAAK,OAAA,CAAQ,MAAM;AAC7B,MAAAA,qBAAA,CAAK,GAAG,OAAA,EAAS;AAAA,QACf,GAAA,EAAK,KAAA;AAAA,QACL,QAAA;AAAA,QACA,IAAA,EAAM,YAAA;AAAA,QACN,MAAM,QAAA,KAAa,CAAA,GAAI,EAAE,GAAA,EAAK,GAAE,GAAI,MAAA;AAAA,QACpC,aAAA,EAAe;AAAA,UACb,OAAA,EAAS,EAAA;AAAA,UACT,KAAA,EAAO,SAAA;AAAA,UACP,aAAA,EAAe,OAAO,qBAAA,GAAwB;AAAA,SAChD;AAAA,QACA,QAAA,GAAW;AACT,UAAA,MAAM,SAAA,GAAY,QAAA,GAAW,CAAA,GACzB,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,QAAQ,CAAA,GAC5B,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,GAAG,EAAE,cAAA,EAAe;AAC3C,UAAA,UAAA,CAAW,GAAG,MAAM,CAAA,EAAG,SAAS,CAAA,EAAG,MAAM,CAAA,CAAE,CAAA;AAAA,QAC7C;AAAA,OACD,CAAA;AAAA,IACH,GAAG,EAAE,CAAA;AAEL,IAAA,OAAO,MAAM,IAAI,MAAA,EAAO;AAAA,EAC1B,CAAA,EAAG,CAAC,KAAA,EAAO,MAAA,EAAQ,QAAQ,QAAA,EAAU,QAAA,EAAU,IAAI,CAAC,CAAA;AAEpD,EAAA,uBACEE,cAAA,CAAC,MAAA,EAAA,EAAK,GAAA,EAAU,SAAA,EACb,QAAA,EAAA,OAAA,EACH,CAAA;AAEJ","file":"chunk-XONXEFJY.cjs","sourcesContent":["'use client';\n\nimport React, { useRef, useEffect, useState } from 'react';\nimport gsap from 'gsap';\nimport { ScrollTrigger } from 'gsap/ScrollTrigger';\n\ninterface AnimatedCounterProps {\n value: number;\n suffix?: string;\n prefix?: string;\n duration?: number;\n decimals?: number;\n className?: string;\n once?: boolean;\n}\n\nexport default function AnimatedCounter({\n value,\n suffix = '',\n prefix = '',\n duration = 2,\n decimals = 0,\n className,\n once = true,\n}: AnimatedCounterProps) {\n const ref = useRef<HTMLSpanElement>(null);\n const [display, setDisplay] = useState(`${prefix}0${suffix}`);\n\n useEffect(() => {\n gsap.registerPlugin(ScrollTrigger);\n\n const el = ref.current;\n if (!el) return;\n\n // Respect prefers-reduced-motion\n const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n if (prefersReducedMotion) {\n setDisplay(`${prefix}${value.toFixed(decimals)}${suffix}`);\n return;\n }\n\n const counter = { val: 0 };\n\n const ctx = gsap.context(() => {\n gsap.to(counter, {\n val: value,\n duration,\n ease: 'power2.out',\n snap: decimals === 0 ? { val: 1 } : undefined,\n scrollTrigger: {\n trigger: el,\n start: 'top 85%',\n toggleActions: once ? 'play none none none' : 'play reverse play reverse',\n },\n onUpdate() {\n const formatted = decimals > 0\n ? counter.val.toFixed(decimals)\n : Math.round(counter.val).toLocaleString();\n setDisplay(`${prefix}${formatted}${suffix}`);\n },\n });\n }, el);\n\n return () => ctx.revert();\n }, [value, suffix, prefix, duration, decimals, once]);\n\n return (\n <span ref={ref} className={className}>\n {display}\n </span>\n );\n}\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/portfolio/sections.ts
|
|
4
|
+
var sectionRenderers = {};
|
|
5
|
+
function registerSectionRenderer(sectionType, renderer) {
|
|
6
|
+
sectionRenderers[sectionType] = renderer;
|
|
7
|
+
}
|
|
8
|
+
function getSectionRenderer(sectionType) {
|
|
9
|
+
return sectionRenderers[sectionType] ?? null;
|
|
10
|
+
}
|
|
11
|
+
function getRegisteredSectionTypes() {
|
|
12
|
+
return Object.keys(sectionRenderers);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
exports.getRegisteredSectionTypes = getRegisteredSectionTypes;
|
|
16
|
+
exports.getSectionRenderer = getSectionRenderer;
|
|
17
|
+
exports.registerSectionRenderer = registerSectionRenderer;
|
|
18
|
+
//# sourceMappingURL=chunk-XQNJED46.cjs.map
|
|
19
|
+
//# sourceMappingURL=chunk-XQNJED46.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/portfolio/sections.ts"],"names":[],"mappings":";;;AAuCA,IAAM,mBAA2E,EAAC;AAK3E,SAAS,uBAAA,CACd,aACA,QAAA,EACM;AACN,EAAA,gBAAA,CAAiB,WAAW,CAAA,GAAI,QAAA;AAClC;AAMO,SAAS,mBACd,WAAA,EACwB;AACxB,EAAA,OAAO,gBAAA,CAAiB,WAAW,CAAA,IAAK,IAAA;AAC1C;AAKO,SAAS,yBAAA,GAAoD;AAClE,EAAA,OAAO,MAAA,CAAO,KAAK,gBAAgB,CAAA;AACrC","file":"chunk-XQNJED46.cjs","sourcesContent":["'use client';\n\n/**\n * @sonordev/agency-site-kit/portfolio/sections — Section component barrel\n *\n * All portfolio section components are client components (they use\n * animations, interactivity, and browser APIs). This barrel marks the\n * client boundary and re-exports each section renderer.\n *\n * Section components will be added here as they are implemented.\n * Each section component follows the pattern:\n *\n * interface Props { data: Portfolio[SectionName]Data; className?: string; }\n * export function Portfolio[SectionName]Section({ data, className }: Props) { ... }\n *\n * For now, export the section type map and a placeholder renderer registry\n * so that consuming code can be written against the final API.\n */\n\nimport type {\n PortfolioSectionType,\n PortfolioSectionData,\n PortfolioSectionDataMap,\n} from '../types';\n\n/**\n * Section renderer function signature.\n * Each section component conforms to this interface.\n */\nexport type SectionRenderer<T extends PortfolioSectionType = PortfolioSectionType> = (props: {\n data: T extends keyof PortfolioSectionDataMap ? PortfolioSectionDataMap[T] : PortfolioSectionData;\n className?: string;\n}) => React.ReactElement | null;\n\n/**\n * Registry of section renderers, keyed by section type.\n * Components register themselves here as they are implemented.\n * Consuming code can look up a renderer by section type string.\n */\nconst sectionRenderers: Partial<Record<PortfolioSectionType, SectionRenderer>> = {};\n\n/**\n * Register a section renderer for a given section type.\n */\nexport function registerSectionRenderer<T extends PortfolioSectionType>(\n sectionType: T,\n renderer: SectionRenderer<T>,\n): void {\n sectionRenderers[sectionType] = renderer as SectionRenderer;\n}\n\n/**\n * Look up a registered section renderer by type.\n * Returns null if no renderer is registered for the given type.\n */\nexport function getSectionRenderer(\n sectionType: PortfolioSectionType,\n): SectionRenderer | null {\n return sectionRenderers[sectionType] ?? null;\n}\n\n/**\n * Returns all registered section types.\n */\nexport function getRegisteredSectionTypes(): PortfolioSectionType[] {\n return Object.keys(sectionRenderers) as PortfolioSectionType[];\n}\n\n// Re-export section data types for convenience\nexport type {\n SectionRenderer as PortfolioSectionRenderer,\n};\n"]}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { useRef, useCallback } from 'react';
|
|
3
|
+
import gsap from 'gsap';
|
|
4
|
+
import { jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
// src/portfolio/components/primitives/GlassCard.tsx
|
|
7
|
+
var paddingMap = {
|
|
8
|
+
sm: "16px",
|
|
9
|
+
md: "24px",
|
|
10
|
+
lg: "32px"
|
|
11
|
+
};
|
|
12
|
+
function GlassCard({
|
|
13
|
+
children,
|
|
14
|
+
className = "",
|
|
15
|
+
hover = true,
|
|
16
|
+
padding = "md",
|
|
17
|
+
onClick
|
|
18
|
+
}) {
|
|
19
|
+
const ref = useRef(null);
|
|
20
|
+
const handleMouseEnter = useCallback(() => {
|
|
21
|
+
if (!hover || !ref.current) return;
|
|
22
|
+
gsap.to(ref.current, {
|
|
23
|
+
y: -6,
|
|
24
|
+
scale: 1.015,
|
|
25
|
+
duration: 0.3,
|
|
26
|
+
ease: "power2.out"
|
|
27
|
+
});
|
|
28
|
+
gsap.to(ref.current, {
|
|
29
|
+
boxShadow: "0 20px 40px -12px rgba(0,0,0,0.25), 0 0 0 1px var(--sk-primary, #6366f1)",
|
|
30
|
+
duration: 0.3,
|
|
31
|
+
ease: "power2.out"
|
|
32
|
+
});
|
|
33
|
+
}, [hover]);
|
|
34
|
+
const handleMouseLeave = useCallback(() => {
|
|
35
|
+
if (!hover || !ref.current) return;
|
|
36
|
+
gsap.to(ref.current, {
|
|
37
|
+
y: 0,
|
|
38
|
+
scale: 1,
|
|
39
|
+
duration: 0.3,
|
|
40
|
+
ease: "power2.out"
|
|
41
|
+
});
|
|
42
|
+
gsap.to(ref.current, {
|
|
43
|
+
boxShadow: "0 4px 16px -4px rgba(0,0,0,0.1), 0 0 0 1px var(--sk-border, rgba(255,255,255,0.1))",
|
|
44
|
+
duration: 0.3,
|
|
45
|
+
ease: "power2.out"
|
|
46
|
+
});
|
|
47
|
+
}, [hover]);
|
|
48
|
+
return /* @__PURE__ */ jsx(
|
|
49
|
+
"div",
|
|
50
|
+
{
|
|
51
|
+
ref,
|
|
52
|
+
className,
|
|
53
|
+
onClick,
|
|
54
|
+
onMouseEnter: handleMouseEnter,
|
|
55
|
+
onMouseLeave: handleMouseLeave,
|
|
56
|
+
style: {
|
|
57
|
+
padding: paddingMap[padding],
|
|
58
|
+
background: "var(--sk-surface, rgba(255,255,255,0.05))",
|
|
59
|
+
backdropFilter: "blur(16px)",
|
|
60
|
+
WebkitBackdropFilter: "blur(16px)",
|
|
61
|
+
border: "1px solid var(--sk-border, rgba(255,255,255,0.1))",
|
|
62
|
+
borderRadius: "16px",
|
|
63
|
+
boxShadow: "0 4px 16px -4px rgba(0,0,0,0.1), 0 0 0 1px var(--sk-border, rgba(255,255,255,0.1))",
|
|
64
|
+
cursor: onClick ? "pointer" : void 0,
|
|
65
|
+
willChange: hover ? "transform" : void 0
|
|
66
|
+
},
|
|
67
|
+
children
|
|
68
|
+
}
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export { GlassCard };
|
|
73
|
+
//# sourceMappingURL=chunk-YB4B3OMC.js.map
|
|
74
|
+
//# sourceMappingURL=chunk-YB4B3OMC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/portfolio/components/primitives/GlassCard.tsx"],"names":[],"mappings":";;;;;AAaA,IAAM,UAAA,GAAa;AAAA,EACjB,EAAA,EAAI,MAAA;AAAA,EACJ,EAAA,EAAI,MAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEe,SAAR,SAAA,CAA2B;AAAA,EAChC,QAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,KAAA,GAAQ,IAAA;AAAA,EACR,OAAA,GAAU,IAAA;AAAA,EACV;AACF,CAAA,EAAmB;AACjB,EAAA,MAAM,GAAA,GAAM,OAAuB,IAAI,CAAA;AAEvC,EAAA,MAAM,gBAAA,GAAmB,YAAY,MAAM;AACzC,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,GAAA,CAAI,OAAA,EAAS;AAC5B,IAAA,IAAA,CAAK,EAAA,CAAG,IAAI,OAAA,EAAS;AAAA,MACnB,CAAA,EAAG,EAAA;AAAA,MACH,KAAA,EAAO,KAAA;AAAA,MACP,QAAA,EAAU,GAAA;AAAA,MACV,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,IAAA,CAAK,EAAA,CAAG,IAAI,OAAA,EAAS;AAAA,MACnB,SAAA,EAAW,0EAAA;AAAA,MACX,QAAA,EAAU,GAAA;AAAA,MACV,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,gBAAA,GAAmB,YAAY,MAAM;AACzC,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,GAAA,CAAI,OAAA,EAAS;AAC5B,IAAA,IAAA,CAAK,EAAA,CAAG,IAAI,OAAA,EAAS;AAAA,MACnB,CAAA,EAAG,CAAA;AAAA,MACH,KAAA,EAAO,CAAA;AAAA,MACP,QAAA,EAAU,GAAA;AAAA,MACV,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,IAAA,CAAK,EAAA,CAAG,IAAI,OAAA,EAAS;AAAA,MACnB,SAAA,EAAW,oFAAA;AAAA,MACX,QAAA,EAAU,GAAA;AAAA,MACV,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,YAAA,EAAc,gBAAA;AAAA,MACd,YAAA,EAAc,gBAAA;AAAA,MACd,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,WAAW,OAAO,CAAA;AAAA,QAC3B,UAAA,EAAY,2CAAA;AAAA,QACZ,cAAA,EAAgB,YAAA;AAAA,QAChB,oBAAA,EAAsB,YAAA;AAAA,QACtB,MAAA,EAAQ,mDAAA;AAAA,QACR,YAAA,EAAc,MAAA;AAAA,QACd,SAAA,EAAW,oFAAA;AAAA,QACX,MAAA,EAAQ,UAAU,SAAA,GAAY,MAAA;AAAA,QAC9B,UAAA,EAAY,QAAQ,WAAA,GAAc;AAAA,OACpC;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ","file":"chunk-YB4B3OMC.js","sourcesContent":["'use client';\n\nimport React, { useRef, useCallback } from 'react';\nimport gsap from 'gsap';\n\ninterface GlassCardProps {\n children: React.ReactNode;\n className?: string;\n hover?: boolean;\n padding?: 'sm' | 'md' | 'lg';\n onClick?: () => void;\n}\n\nconst paddingMap = {\n sm: '16px',\n md: '24px',\n lg: '32px',\n} as const;\n\nexport default function GlassCard({\n children,\n className = '',\n hover = true,\n padding = 'md',\n onClick,\n}: GlassCardProps) {\n const ref = useRef<HTMLDivElement>(null);\n\n const handleMouseEnter = useCallback(() => {\n if (!hover || !ref.current) return;\n gsap.to(ref.current, {\n y: -6,\n scale: 1.015,\n duration: 0.3,\n ease: 'power2.out',\n });\n gsap.to(ref.current, {\n boxShadow: '0 20px 40px -12px rgba(0,0,0,0.25), 0 0 0 1px var(--sk-primary, #6366f1)',\n duration: 0.3,\n ease: 'power2.out',\n });\n }, [hover]);\n\n const handleMouseLeave = useCallback(() => {\n if (!hover || !ref.current) return;\n gsap.to(ref.current, {\n y: 0,\n scale: 1,\n duration: 0.3,\n ease: 'power2.out',\n });\n gsap.to(ref.current, {\n boxShadow: '0 4px 16px -4px rgba(0,0,0,0.1), 0 0 0 1px var(--sk-border, rgba(255,255,255,0.1))',\n duration: 0.3,\n ease: 'power2.out',\n });\n }, [hover]);\n\n return (\n <div\n ref={ref}\n className={className}\n onClick={onClick}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n style={{\n padding: paddingMap[padding],\n background: 'var(--sk-surface, rgba(255,255,255,0.05))',\n backdropFilter: 'blur(16px)',\n WebkitBackdropFilter: 'blur(16px)',\n border: '1px solid var(--sk-border, rgba(255,255,255,0.1))',\n borderRadius: '16px',\n boxShadow: '0 4px 16px -4px rgba(0,0,0,0.1), 0 0 0 1px var(--sk-border, rgba(255,255,255,0.1))',\n cursor: onClick ? 'pointer' : undefined,\n willChange: hover ? 'transform' : undefined,\n }}\n >\n {children}\n </div>\n );\n}\n"]}
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkTAPNXT7X_cjs = require('./chunk-TAPNXT7X.cjs');
|
|
4
|
+
require('./chunk-XONXEFJY.cjs');
|
|
5
|
+
var chunkXQNJED46_cjs = require('./chunk-XQNJED46.cjs');
|
|
6
|
+
var chunkNAS4K5UR_cjs = require('./chunk-NAS4K5UR.cjs');
|
|
7
|
+
var chunk5FKOLIV6_cjs = require('./chunk-5FKOLIV6.cjs');
|
|
8
|
+
var chunkQBLWP25X_cjs = require('./chunk-QBLWP25X.cjs');
|
|
9
|
+
require('./chunk-KEOHORIH.cjs');
|
|
10
|
+
require('./chunk-IKBK7HYX.cjs');
|
|
11
|
+
var React = require('react');
|
|
12
|
+
|
|
13
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
14
|
+
|
|
15
|
+
var React__default = /*#__PURE__*/_interopDefault(React);
|
|
16
|
+
|
|
17
|
+
var ICON_REGISTRY = {
|
|
18
|
+
"arrow-up": {
|
|
19
|
+
viewBox: "0 0 24 24",
|
|
20
|
+
paths: ["M12 19V5", "M5 12l7-7 7 7"]
|
|
21
|
+
},
|
|
22
|
+
"arrow-down": {
|
|
23
|
+
viewBox: "0 0 24 24",
|
|
24
|
+
paths: ["M12 5v14", "M19 12l-7 7-7-7"]
|
|
25
|
+
},
|
|
26
|
+
"chart-bar": {
|
|
27
|
+
viewBox: "0 0 24 24",
|
|
28
|
+
paths: ["M12 20V10", "M18 20V4", "M6 20v-4"]
|
|
29
|
+
},
|
|
30
|
+
check: {
|
|
31
|
+
viewBox: "0 0 24 24",
|
|
32
|
+
paths: ["M20 6L9 17l-5-5"]
|
|
33
|
+
},
|
|
34
|
+
clock: {
|
|
35
|
+
viewBox: "0 0 24 24",
|
|
36
|
+
paths: ["M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20z", "M12 6v6l4 2"]
|
|
37
|
+
},
|
|
38
|
+
code: {
|
|
39
|
+
viewBox: "0 0 24 24",
|
|
40
|
+
paths: ["M16 18l6-6-6-6", "M8 6l-6 6 6 6"]
|
|
41
|
+
},
|
|
42
|
+
globe: {
|
|
43
|
+
viewBox: "0 0 24 24",
|
|
44
|
+
paths: [
|
|
45
|
+
"M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20z",
|
|
46
|
+
"M2 12h20",
|
|
47
|
+
"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10A15.3 15.3 0 0 1 12 2z"
|
|
48
|
+
]
|
|
49
|
+
},
|
|
50
|
+
layout: {
|
|
51
|
+
viewBox: "0 0 24 24",
|
|
52
|
+
paths: [
|
|
53
|
+
"M19 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2z",
|
|
54
|
+
"M3 9h18",
|
|
55
|
+
"M9 21V9"
|
|
56
|
+
]
|
|
57
|
+
},
|
|
58
|
+
lightning: {
|
|
59
|
+
viewBox: "0 0 24 24",
|
|
60
|
+
paths: ["M13 2L3 14h9l-1 8 10-12h-9l1-8"]
|
|
61
|
+
},
|
|
62
|
+
link: {
|
|
63
|
+
viewBox: "0 0 24 24",
|
|
64
|
+
paths: [
|
|
65
|
+
"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71",
|
|
66
|
+
"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"
|
|
67
|
+
]
|
|
68
|
+
},
|
|
69
|
+
lock: {
|
|
70
|
+
viewBox: "0 0 24 24",
|
|
71
|
+
paths: [
|
|
72
|
+
"M19 11H5a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7a2 2 0 0 0-2-2z",
|
|
73
|
+
"M7 11V7a5 5 0 0 1 10 0v4"
|
|
74
|
+
]
|
|
75
|
+
},
|
|
76
|
+
mail: {
|
|
77
|
+
viewBox: "0 0 24 24",
|
|
78
|
+
paths: [
|
|
79
|
+
"M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z",
|
|
80
|
+
"M22 6l-10 7L2 6"
|
|
81
|
+
]
|
|
82
|
+
},
|
|
83
|
+
monitor: {
|
|
84
|
+
viewBox: "0 0 24 24",
|
|
85
|
+
paths: [
|
|
86
|
+
"M20 3H4a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2z",
|
|
87
|
+
"M8 21h8",
|
|
88
|
+
"M12 17v4"
|
|
89
|
+
]
|
|
90
|
+
},
|
|
91
|
+
palette: {
|
|
92
|
+
viewBox: "0 0 24 24",
|
|
93
|
+
paths: [
|
|
94
|
+
"M12 2C6.49 2 2 6.49 2 12s4.49 10 10 10a2 2 0 0 0 2-2v-.09a1.65 1.65 0 0 1 .92-1.48A1.65 1.65 0 0 1 16.5 19H19a2 2 0 0 0 2-2 10 10 0 0 0-9-15z",
|
|
95
|
+
"M6.5 11.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3z",
|
|
96
|
+
"M10 7.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3z",
|
|
97
|
+
"M14 7.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3z",
|
|
98
|
+
"M17.5 11.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3z"
|
|
99
|
+
]
|
|
100
|
+
},
|
|
101
|
+
rocket: {
|
|
102
|
+
viewBox: "0 0 24 24",
|
|
103
|
+
paths: [
|
|
104
|
+
"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z",
|
|
105
|
+
"M12 15l-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z",
|
|
106
|
+
"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0",
|
|
107
|
+
"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5"
|
|
108
|
+
]
|
|
109
|
+
},
|
|
110
|
+
search: {
|
|
111
|
+
viewBox: "0 0 24 24",
|
|
112
|
+
paths: [
|
|
113
|
+
"M11 19a8 8 0 1 0 0-16 8 8 0 0 0 0 16z",
|
|
114
|
+
"M21 21l-4.35-4.35"
|
|
115
|
+
]
|
|
116
|
+
},
|
|
117
|
+
settings: {
|
|
118
|
+
viewBox: "0 0 24 24",
|
|
119
|
+
paths: [
|
|
120
|
+
"M12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6z",
|
|
121
|
+
"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09a1.65 1.65 0 0 0-1.08-1.51 1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09a1.65 1.65 0 0 0 1.51-1.08 1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9c.26.604.852.997 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1.08z"
|
|
122
|
+
]
|
|
123
|
+
},
|
|
124
|
+
shield: {
|
|
125
|
+
viewBox: "0 0 24 24",
|
|
126
|
+
paths: ["M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"]
|
|
127
|
+
},
|
|
128
|
+
star: {
|
|
129
|
+
viewBox: "0 0 24 24",
|
|
130
|
+
paths: [
|
|
131
|
+
"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"
|
|
132
|
+
]
|
|
133
|
+
},
|
|
134
|
+
target: {
|
|
135
|
+
viewBox: "0 0 24 24",
|
|
136
|
+
paths: [
|
|
137
|
+
"M12 22a10 10 0 1 0 0-20 10 10 0 0 0 0 20z",
|
|
138
|
+
"M12 18a6 6 0 1 0 0-12 6 6 0 0 0 0 12z",
|
|
139
|
+
"M12 14a2 2 0 1 0 0-4 2 2 0 0 0 0 4z"
|
|
140
|
+
]
|
|
141
|
+
},
|
|
142
|
+
"trending-up": {
|
|
143
|
+
viewBox: "0 0 24 24",
|
|
144
|
+
paths: ["M23 6l-9.5 9.5-5-5L1 18", "M17 6h6v6"]
|
|
145
|
+
},
|
|
146
|
+
users: {
|
|
147
|
+
viewBox: "0 0 24 24",
|
|
148
|
+
paths: [
|
|
149
|
+
"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2",
|
|
150
|
+
"M9 11a4 4 0 1 0 0-8 4 4 0 0 0 0 8z",
|
|
151
|
+
"M23 21v-2a4 4 0 0 0-3-3.87",
|
|
152
|
+
"M16 3.13a4 4 0 0 1 0 7.75"
|
|
153
|
+
]
|
|
154
|
+
},
|
|
155
|
+
zap: {
|
|
156
|
+
viewBox: "0 0 24 24",
|
|
157
|
+
paths: ["M13 2L3 14h9l-1 8 10-12h-9l1-8"]
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
function getIconDefinition(name) {
|
|
161
|
+
return ICON_REGISTRY[name] ?? null;
|
|
162
|
+
}
|
|
163
|
+
function getIconPaths(name) {
|
|
164
|
+
const def = ICON_REGISTRY[name];
|
|
165
|
+
return def ? def.paths : null;
|
|
166
|
+
}
|
|
167
|
+
function getAvailableIcons() {
|
|
168
|
+
return Object.keys(ICON_REGISTRY);
|
|
169
|
+
}
|
|
170
|
+
function renderIcon(name, size = 24, className) {
|
|
171
|
+
const def = ICON_REGISTRY[name];
|
|
172
|
+
if (!def) return null;
|
|
173
|
+
return React__default.default.createElement(
|
|
174
|
+
"svg",
|
|
175
|
+
{
|
|
176
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
177
|
+
width: size,
|
|
178
|
+
height: size,
|
|
179
|
+
viewBox: def.viewBox,
|
|
180
|
+
fill: "none",
|
|
181
|
+
stroke: "currentColor",
|
|
182
|
+
strokeWidth: 2,
|
|
183
|
+
strokeLinecap: "round",
|
|
184
|
+
strokeLinejoin: "round",
|
|
185
|
+
className,
|
|
186
|
+
"aria-hidden": "true"
|
|
187
|
+
},
|
|
188
|
+
...def.paths.map(
|
|
189
|
+
(d, i) => React__default.default.createElement("path", { key: i, d })
|
|
190
|
+
)
|
|
191
|
+
);
|
|
192
|
+
}
|
|
193
|
+
function Icon({
|
|
194
|
+
name,
|
|
195
|
+
size = 24,
|
|
196
|
+
className
|
|
197
|
+
}) {
|
|
198
|
+
return renderIcon(name, size, className);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
Object.defineProperty(exports, "PORTFOLIO_SECTION_TYPES", {
|
|
202
|
+
enumerable: true,
|
|
203
|
+
get: function () { return chunkTAPNXT7X_cjs.PORTFOLIO_SECTION_TYPES; }
|
|
204
|
+
});
|
|
205
|
+
Object.defineProperty(exports, "PortfolioPage", {
|
|
206
|
+
enumerable: true,
|
|
207
|
+
get: function () { return chunkTAPNXT7X_cjs.PortfolioPage; }
|
|
208
|
+
});
|
|
209
|
+
Object.defineProperty(exports, "getRegisteredSectionTypes", {
|
|
210
|
+
enumerable: true,
|
|
211
|
+
get: function () { return chunkXQNJED46_cjs.getRegisteredSectionTypes; }
|
|
212
|
+
});
|
|
213
|
+
Object.defineProperty(exports, "getSectionRenderer", {
|
|
214
|
+
enumerable: true,
|
|
215
|
+
get: function () { return chunkXQNJED46_cjs.getSectionRenderer; }
|
|
216
|
+
});
|
|
217
|
+
Object.defineProperty(exports, "registerSectionRenderer", {
|
|
218
|
+
enumerable: true,
|
|
219
|
+
get: function () { return chunkXQNJED46_cjs.registerSectionRenderer; }
|
|
220
|
+
});
|
|
221
|
+
Object.defineProperty(exports, "PortfolioCard", {
|
|
222
|
+
enumerable: true,
|
|
223
|
+
get: function () { return chunkNAS4K5UR_cjs.PortfolioCard; }
|
|
224
|
+
});
|
|
225
|
+
Object.defineProperty(exports, "PortfolioGrid", {
|
|
226
|
+
enumerable: true,
|
|
227
|
+
get: function () { return chunkNAS4K5UR_cjs.PortfolioGrid; }
|
|
228
|
+
});
|
|
229
|
+
Object.defineProperty(exports, "AgencySiteKitLayout", {
|
|
230
|
+
enumerable: true,
|
|
231
|
+
get: function () { return chunk5FKOLIV6_cjs.AgencySiteKitLayout; }
|
|
232
|
+
});
|
|
233
|
+
Object.defineProperty(exports, "DEFAULT_BRAND_CONFIG", {
|
|
234
|
+
enumerable: true,
|
|
235
|
+
get: function () { return chunk5FKOLIV6_cjs.DEFAULT_BRAND_CONFIG; }
|
|
236
|
+
});
|
|
237
|
+
Object.defineProperty(exports, "DEFAULT_DARK_MODE", {
|
|
238
|
+
enumerable: true,
|
|
239
|
+
get: function () { return chunk5FKOLIV6_cjs.DEFAULT_DARK_MODE; }
|
|
240
|
+
});
|
|
241
|
+
Object.defineProperty(exports, "generateBrandCSS", {
|
|
242
|
+
enumerable: true,
|
|
243
|
+
get: function () { return chunk5FKOLIV6_cjs.generateBrandCSS; }
|
|
244
|
+
});
|
|
245
|
+
Object.defineProperty(exports, "hexToRgb", {
|
|
246
|
+
enumerable: true,
|
|
247
|
+
get: function () { return chunk5FKOLIV6_cjs.hexToRgb; }
|
|
248
|
+
});
|
|
249
|
+
Object.defineProperty(exports, "mergeBrandConfig", {
|
|
250
|
+
enumerable: true,
|
|
251
|
+
get: function () { return chunk5FKOLIV6_cjs.mergeBrandConfig; }
|
|
252
|
+
});
|
|
253
|
+
Object.defineProperty(exports, "apiFetch", {
|
|
254
|
+
enumerable: true,
|
|
255
|
+
get: function () { return chunkQBLWP25X_cjs.apiFetch; }
|
|
256
|
+
});
|
|
257
|
+
Object.defineProperty(exports, "apiGet", {
|
|
258
|
+
enumerable: true,
|
|
259
|
+
get: function () { return chunkQBLWP25X_cjs.apiGet; }
|
|
260
|
+
});
|
|
261
|
+
Object.defineProperty(exports, "getApiConfig", {
|
|
262
|
+
enumerable: true,
|
|
263
|
+
get: function () { return chunkQBLWP25X_cjs.getApiConfig; }
|
|
264
|
+
});
|
|
265
|
+
exports.Icon = Icon;
|
|
266
|
+
exports.getAvailableIcons = getAvailableIcons;
|
|
267
|
+
exports.getIconDefinition = getIconDefinition;
|
|
268
|
+
exports.getIconPaths = getIconPaths;
|
|
269
|
+
exports.renderIcon = renderIcon;
|
|
270
|
+
//# sourceMappingURL=index.cjs.map
|
|
271
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shared/icons.ts"],"names":["React"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * @sonordev/agency-site-kit — Icon registry\n *\n * Lightweight icon system that maps string names to SVG path data.\n * No external icon library dependency — keeps the bundle small.\n * Icons are rendered as inline SVGs.\n */\n\nimport React from 'react';\n\ninterface IconDefinition {\n viewBox: string;\n paths: string[];\n /** Optional fill-rule for complex paths */\n fillRule?: 'evenodd' | 'nonzero';\n}\n\n/**\n * Icon registry — 24x24 viewBox icons (matching Lucide/Heroicons conventions).\n * All paths use stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\".\n */\nconst ICON_REGISTRY: Record<string, IconDefinition> = {\n 'arrow-up': {\n viewBox: '0 0 24 24',\n paths: ['M12 19V5', 'M5 12l7-7 7 7'],\n },\n 'arrow-down': {\n viewBox: '0 0 24 24',\n paths: ['M12 5v14', 'M19 12l-7 7-7-7'],\n },\n 'chart-bar': {\n viewBox: '0 0 24 24',\n paths: ['M12 20V10', 'M18 20V4', 'M6 20v-4'],\n },\n check: {\n viewBox: '0 0 24 24',\n paths: ['M20 6L9 17l-5-5'],\n },\n clock: {\n viewBox: '0 0 24 24',\n paths: ['M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20z', 'M12 6v6l4 2'],\n },\n code: {\n viewBox: '0 0 24 24',\n paths: ['M16 18l6-6-6-6', 'M8 6l-6 6 6 6'],\n },\n globe: {\n viewBox: '0 0 24 24',\n paths: [\n 'M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20z',\n 'M2 12h20',\n 'M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10A15.3 15.3 0 0 1 12 2z',\n ],\n },\n layout: {\n viewBox: '0 0 24 24',\n paths: [\n 'M19 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2z',\n 'M3 9h18',\n 'M9 21V9',\n ],\n },\n lightning: {\n viewBox: '0 0 24 24',\n paths: ['M13 2L3 14h9l-1 8 10-12h-9l1-8'],\n },\n link: {\n viewBox: '0 0 24 24',\n paths: [\n 'M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71',\n 'M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71',\n ],\n },\n lock: {\n viewBox: '0 0 24 24',\n paths: [\n 'M19 11H5a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7a2 2 0 0 0-2-2z',\n 'M7 11V7a5 5 0 0 1 10 0v4',\n ],\n },\n mail: {\n viewBox: '0 0 24 24',\n paths: [\n 'M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z',\n 'M22 6l-10 7L2 6',\n ],\n },\n monitor: {\n viewBox: '0 0 24 24',\n paths: [\n 'M20 3H4a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2z',\n 'M8 21h8',\n 'M12 17v4',\n ],\n },\n palette: {\n viewBox: '0 0 24 24',\n paths: [\n 'M12 2C6.49 2 2 6.49 2 12s4.49 10 10 10a2 2 0 0 0 2-2v-.09a1.65 1.65 0 0 1 .92-1.48A1.65 1.65 0 0 1 16.5 19H19a2 2 0 0 0 2-2 10 10 0 0 0-9-15z',\n 'M6.5 11.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3z',\n 'M10 7.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3z',\n 'M14 7.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3z',\n 'M17.5 11.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3z',\n ],\n },\n rocket: {\n viewBox: '0 0 24 24',\n paths: [\n 'M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z',\n 'M12 15l-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z',\n 'M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0',\n 'M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5',\n ],\n },\n search: {\n viewBox: '0 0 24 24',\n paths: [\n 'M11 19a8 8 0 1 0 0-16 8 8 0 0 0 0 16z',\n 'M21 21l-4.35-4.35',\n ],\n },\n settings: {\n viewBox: '0 0 24 24',\n paths: [\n 'M12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6z',\n 'M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09a1.65 1.65 0 0 0-1.08-1.51 1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09a1.65 1.65 0 0 0 1.51-1.08 1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9c.26.604.852.997 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1.08z',\n ],\n },\n shield: {\n viewBox: '0 0 24 24',\n paths: ['M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z'],\n },\n star: {\n viewBox: '0 0 24 24',\n paths: [\n 'M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z',\n ],\n },\n target: {\n viewBox: '0 0 24 24',\n paths: [\n 'M12 22a10 10 0 1 0 0-20 10 10 0 0 0 0 20z',\n 'M12 18a6 6 0 1 0 0-12 6 6 0 0 0 0 12z',\n 'M12 14a2 2 0 1 0 0-4 2 2 0 0 0 0 4z',\n ],\n },\n 'trending-up': {\n viewBox: '0 0 24 24',\n paths: ['M23 6l-9.5 9.5-5-5L1 18', 'M17 6h6v6'],\n },\n users: {\n viewBox: '0 0 24 24',\n paths: [\n 'M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2',\n 'M9 11a4 4 0 1 0 0-8 4 4 0 0 0 0 8z',\n 'M23 21v-2a4 4 0 0 0-3-3.87',\n 'M16 3.13a4 4 0 0 1 0 7.75',\n ],\n },\n zap: {\n viewBox: '0 0 24 24',\n paths: ['M13 2L3 14h9l-1 8 10-12h-9l1-8'],\n },\n};\n\n/**\n * Returns the icon definition (viewBox + paths) for a given icon name.\n * Returns null if the icon is not found.\n */\nexport function getIconDefinition(name: string): IconDefinition | null {\n return ICON_REGISTRY[name] ?? null;\n}\n\n/**\n * Returns just the SVG path strings for a given icon name.\n * Useful when building custom SVG elements.\n */\nexport function getIconPaths(name: string): string[] | null {\n const def = ICON_REGISTRY[name];\n return def ? def.paths : null;\n}\n\n/**\n * Returns a list of all available icon names.\n */\nexport function getAvailableIcons(): string[] {\n return Object.keys(ICON_REGISTRY);\n}\n\n/**\n * Renders an icon as a React SVG element.\n *\n * @param name Icon name from the registry\n * @param size Width/height in pixels (default 24)\n * @param className Optional CSS class name\n * @returns React SVG element, or null if icon not found\n */\nexport function renderIcon(\n name: string,\n size: number = 24,\n className?: string,\n): React.ReactElement | null {\n const def = ICON_REGISTRY[name];\n if (!def) return null;\n\n return React.createElement(\n 'svg',\n {\n xmlns: 'http://www.w3.org/2000/svg',\n width: size,\n height: size,\n viewBox: def.viewBox,\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round' as const,\n strokeLinejoin: 'round' as const,\n className,\n 'aria-hidden': 'true',\n },\n ...def.paths.map((d, i) =>\n React.createElement('path', { key: i, d }),\n ),\n );\n}\n\n/**\n * Icon component for use in JSX.\n *\n * Usage:\n * ```tsx\n * <Icon name=\"trending-up\" size={20} className=\"text-green-500\" />\n * ```\n */\nexport function Icon({\n name,\n size = 24,\n className,\n}: {\n name: string;\n size?: number;\n className?: string;\n}): React.ReactElement | null {\n return renderIcon(name, size, className);\n}\n"]}
|