@gallop.software/studio 0.1.0 → 0.1.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/dist/index.js +68 -15
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +68 -15
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -10,29 +10,82 @@ function StudioButton() {
|
|
|
10
10
|
return null;
|
|
11
11
|
}
|
|
12
12
|
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
|
|
13
|
-
!isOpen && /* @__PURE__ */ _jsxruntime.
|
|
13
|
+
!isOpen && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
14
14
|
"button",
|
|
15
15
|
{
|
|
16
16
|
onClick: () => setIsOpen(true),
|
|
17
|
-
|
|
17
|
+
style: {
|
|
18
|
+
position: "fixed",
|
|
19
|
+
bottom: "24px",
|
|
20
|
+
right: "24px",
|
|
21
|
+
zIndex: 9998,
|
|
22
|
+
width: "48px",
|
|
23
|
+
height: "48px",
|
|
24
|
+
borderRadius: "50%",
|
|
25
|
+
background: "linear-gradient(to bottom right, #a855f7, #ec4899)",
|
|
26
|
+
color: "white",
|
|
27
|
+
boxShadow: "0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)",
|
|
28
|
+
display: "flex",
|
|
29
|
+
alignItems: "center",
|
|
30
|
+
justifyContent: "center",
|
|
31
|
+
border: "none",
|
|
32
|
+
cursor: "pointer",
|
|
33
|
+
transition: "all 0.2s"
|
|
34
|
+
},
|
|
18
35
|
title: "Open Studio",
|
|
19
36
|
"aria-label": "Open Studio media manager",
|
|
37
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ImageIcon, {})
|
|
38
|
+
}
|
|
39
|
+
),
|
|
40
|
+
isOpen && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
41
|
+
"div",
|
|
42
|
+
{
|
|
43
|
+
style: {
|
|
44
|
+
position: "fixed",
|
|
45
|
+
top: 0,
|
|
46
|
+
right: 0,
|
|
47
|
+
bottom: 0,
|
|
48
|
+
left: 0,
|
|
49
|
+
zIndex: 9999
|
|
50
|
+
},
|
|
20
51
|
children: [
|
|
21
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
22
|
-
|
|
52
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
53
|
+
"div",
|
|
54
|
+
{
|
|
55
|
+
style: {
|
|
56
|
+
position: "absolute",
|
|
57
|
+
top: 0,
|
|
58
|
+
right: 0,
|
|
59
|
+
bottom: 0,
|
|
60
|
+
left: 0,
|
|
61
|
+
backgroundColor: "rgba(0, 0, 0, 0.5)",
|
|
62
|
+
backdropFilter: "blur(4px)"
|
|
63
|
+
},
|
|
64
|
+
onClick: () => setIsOpen(false)
|
|
65
|
+
}
|
|
66
|
+
),
|
|
67
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
68
|
+
"div",
|
|
69
|
+
{
|
|
70
|
+
style: {
|
|
71
|
+
position: "absolute",
|
|
72
|
+
top: "32px",
|
|
73
|
+
right: "32px",
|
|
74
|
+
bottom: "32px",
|
|
75
|
+
left: "32px",
|
|
76
|
+
backgroundColor: "white",
|
|
77
|
+
borderRadius: "16px",
|
|
78
|
+
boxShadow: "0 25px 50px -12px rgba(0, 0, 0, 0.25)",
|
|
79
|
+
display: "flex",
|
|
80
|
+
flexDirection: "column",
|
|
81
|
+
overflow: "hidden"
|
|
82
|
+
},
|
|
83
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _react.Suspense, { fallback: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, LoadingState, {}), children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, StudioUI, { onClose: () => setIsOpen(false) }) })
|
|
84
|
+
}
|
|
85
|
+
)
|
|
23
86
|
]
|
|
24
87
|
}
|
|
25
|
-
)
|
|
26
|
-
isOpen && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "fixed inset-0 z-[9999]", children: [
|
|
27
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
28
|
-
"div",
|
|
29
|
-
{
|
|
30
|
-
className: "absolute inset-0 bg-black/50 backdrop-blur-sm",
|
|
31
|
-
onClick: () => setIsOpen(false)
|
|
32
|
-
}
|
|
33
|
-
),
|
|
34
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "absolute inset-8 bg-white rounded-2xl shadow-2xl flex flex-col overflow-hidden", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _react.Suspense, { fallback: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, LoadingState, {}), children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, StudioUI, { onClose: () => setIsOpen(false) }) }) })
|
|
35
|
-
] })
|
|
88
|
+
)
|
|
36
89
|
] });
|
|
37
90
|
}
|
|
38
91
|
function ImageIcon() {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/chrisb/Sites/studio/dist/index.js","../src/components/StudioButton.tsx","../src/lib/meta.ts"],"names":[],"mappings":"AAAA,22BAAY;AACZ;AACA;ACAA,8BAAyC;AA2BrC,+CAAA;AAxBJ,IAAM,SAAA,EAAW,yBAAA,CAAK,EAAA,GAAM,4DAAA,CAAO,wBAAY,GAAC,CAAA;AAezC,SAAS,YAAA,CAAA,EAAe;AAC7B,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,EAAA,EAAI,6BAAA,KAAc,CAAA;AAG1C,EAAA,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,SAAA,IAAa,aAAA,EAAe;AAC1C,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACE,8BAAA,oBAAA,EAAA,EAEG,QAAA,EAAA;AAAA,IAAA,CAAC,OAAA,mBACA,
|
|
1
|
+
{"version":3,"sources":["/Users/chrisb/Sites/studio/dist/index.js","../src/components/StudioButton.tsx","../src/lib/meta.ts"],"names":[],"mappings":"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","file":"/Users/chrisb/Sites/studio/dist/index.js","sourcesContent":[null,"'use client'\n\nimport { useState, lazy, Suspense } from 'react'\n\n// Lazy load the full Studio UI to avoid bundling in production\nconst StudioUI = lazy(() => import('./StudioUI'))\n\n/**\n * Floating button that opens the Studio modal.\n * Fixed position in bottom-right corner.\n * Only renders in development mode.\n * \n * Usage:\n * ```tsx\n * import { StudioButton } from '@gallop.software/studio'\n * \n * // In your layout\n * <StudioButton />\n * ```\n */\nexport function StudioButton() {\n const [isOpen, setIsOpen] = useState(false)\n\n // Only render in development\n if (process.env.NODE_ENV !== 'development') {\n return null\n }\n\n return (\n <>\n {/* Floating button - hidden when modal is open */}\n {!isOpen && (\n <button\n onClick={() => setIsOpen(true)}\n style={{\n position: 'fixed',\n bottom: '24px',\n right: '24px',\n zIndex: 9998,\n width: '48px',\n height: '48px',\n borderRadius: '50%',\n background: 'linear-gradient(to bottom right, #a855f7, #ec4899)',\n color: 'white',\n boxShadow: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: 'none',\n cursor: 'pointer',\n transition: 'all 0.2s',\n }}\n title=\"Open Studio\"\n aria-label=\"Open Studio media manager\"\n >\n <ImageIcon />\n </button>\n )}\n\n {/* Modal overlay with lazy-loaded UI */}\n {isOpen && (\n <div\n style={{\n position: 'fixed',\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n zIndex: 9999,\n }}\n >\n {/* Backdrop */}\n <div\n style={{\n position: 'absolute',\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n backdropFilter: 'blur(4px)',\n }}\n onClick={() => setIsOpen(false)}\n />\n\n {/* Modal */}\n <div\n style={{\n position: 'absolute',\n top: '32px',\n right: '32px',\n bottom: '32px',\n left: '32px',\n backgroundColor: 'white',\n borderRadius: '16px',\n boxShadow: '0 25px 50px -12px rgba(0, 0, 0, 0.25)',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n }}\n >\n <Suspense fallback={<LoadingState />}>\n <StudioUI onClose={() => setIsOpen(false)} />\n </Suspense>\n </div>\n </div>\n )}\n </>\n )\n}\n\nfunction ImageIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"w-6 h-6\"\n >\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\n <circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\" />\n <polyline points=\"21 15 16 10 5 21\" />\n </svg>\n )\n}\n\nfunction LoadingState() {\n return (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"flex flex-col items-center gap-4\">\n <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-purple-600\" />\n <p className=\"text-gray-500\">Loading Studio...</p>\n </div>\n </div>\n )\n}\n","import type { StudioMeta, ImageEntry, ImageSize, SizeEntry } from '../types'\n\n// Default empty meta - will be populated when reading from project\nlet _meta: StudioMeta = {\n $schema: 'https://gallop.software/schemas/studio-meta.json',\n version: 1,\n generatedAt: new Date().toISOString(),\n images: {},\n}\n\n/**\n * The meta object containing all image metadata.\n * This is read from _data/_meta.json in the consuming project.\n */\nexport const meta: StudioMeta = _meta\n\n/**\n * Initialize meta from a JSON object (called during build/runtime)\n */\nexport function initializeMeta(data: StudioMeta): void {\n _meta = data\n Object.assign(meta, data)\n}\n\n/**\n * Get the resolved URL for an image, handling CDN vs local paths\n */\nexport function getImageUrl(\n imageKey: string,\n size: ImageSize = 'medium'\n): string | undefined {\n const image = meta.images[imageKey]\n if (!image) return undefined\n\n const sizeData = image.sizes[size] || image.sizes.full\n if (!sizeData) return undefined\n\n // If synced to CDN, use CDN URL\n if (image.cdn?.synced && image.cdn.baseUrl) {\n return `${image.cdn.baseUrl}${sizeData.path}`\n }\n\n // Otherwise use local path\n return sizeData.path\n}\n\n/**\n * Get the full image entry for a key\n */\nexport function getStudioMeta(imageKey: string): ImageEntry | undefined {\n return meta.images[imageKey]\n}\n\n/**\n * Get size data for an image\n */\nexport function getImageSize(\n imageKey: string,\n size: ImageSize = 'medium'\n): SizeEntry | undefined {\n const image = meta.images[imageKey]\n if (!image) return undefined\n return image.sizes[size] || image.sizes.full\n}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -10,29 +10,82 @@ function StudioButton() {
|
|
|
10
10
|
return null;
|
|
11
11
|
}
|
|
12
12
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
13
|
-
!isOpen && /* @__PURE__ */
|
|
13
|
+
!isOpen && /* @__PURE__ */ jsx(
|
|
14
14
|
"button",
|
|
15
15
|
{
|
|
16
16
|
onClick: () => setIsOpen(true),
|
|
17
|
-
|
|
17
|
+
style: {
|
|
18
|
+
position: "fixed",
|
|
19
|
+
bottom: "24px",
|
|
20
|
+
right: "24px",
|
|
21
|
+
zIndex: 9998,
|
|
22
|
+
width: "48px",
|
|
23
|
+
height: "48px",
|
|
24
|
+
borderRadius: "50%",
|
|
25
|
+
background: "linear-gradient(to bottom right, #a855f7, #ec4899)",
|
|
26
|
+
color: "white",
|
|
27
|
+
boxShadow: "0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)",
|
|
28
|
+
display: "flex",
|
|
29
|
+
alignItems: "center",
|
|
30
|
+
justifyContent: "center",
|
|
31
|
+
border: "none",
|
|
32
|
+
cursor: "pointer",
|
|
33
|
+
transition: "all 0.2s"
|
|
34
|
+
},
|
|
18
35
|
title: "Open Studio",
|
|
19
36
|
"aria-label": "Open Studio media manager",
|
|
37
|
+
children: /* @__PURE__ */ jsx(ImageIcon, {})
|
|
38
|
+
}
|
|
39
|
+
),
|
|
40
|
+
isOpen && /* @__PURE__ */ jsxs(
|
|
41
|
+
"div",
|
|
42
|
+
{
|
|
43
|
+
style: {
|
|
44
|
+
position: "fixed",
|
|
45
|
+
top: 0,
|
|
46
|
+
right: 0,
|
|
47
|
+
bottom: 0,
|
|
48
|
+
left: 0,
|
|
49
|
+
zIndex: 9999
|
|
50
|
+
},
|
|
20
51
|
children: [
|
|
21
|
-
/* @__PURE__ */ jsx(
|
|
22
|
-
|
|
52
|
+
/* @__PURE__ */ jsx(
|
|
53
|
+
"div",
|
|
54
|
+
{
|
|
55
|
+
style: {
|
|
56
|
+
position: "absolute",
|
|
57
|
+
top: 0,
|
|
58
|
+
right: 0,
|
|
59
|
+
bottom: 0,
|
|
60
|
+
left: 0,
|
|
61
|
+
backgroundColor: "rgba(0, 0, 0, 0.5)",
|
|
62
|
+
backdropFilter: "blur(4px)"
|
|
63
|
+
},
|
|
64
|
+
onClick: () => setIsOpen(false)
|
|
65
|
+
}
|
|
66
|
+
),
|
|
67
|
+
/* @__PURE__ */ jsx(
|
|
68
|
+
"div",
|
|
69
|
+
{
|
|
70
|
+
style: {
|
|
71
|
+
position: "absolute",
|
|
72
|
+
top: "32px",
|
|
73
|
+
right: "32px",
|
|
74
|
+
bottom: "32px",
|
|
75
|
+
left: "32px",
|
|
76
|
+
backgroundColor: "white",
|
|
77
|
+
borderRadius: "16px",
|
|
78
|
+
boxShadow: "0 25px 50px -12px rgba(0, 0, 0, 0.25)",
|
|
79
|
+
display: "flex",
|
|
80
|
+
flexDirection: "column",
|
|
81
|
+
overflow: "hidden"
|
|
82
|
+
},
|
|
83
|
+
children: /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(LoadingState, {}), children: /* @__PURE__ */ jsx(StudioUI, { onClose: () => setIsOpen(false) }) })
|
|
84
|
+
}
|
|
85
|
+
)
|
|
23
86
|
]
|
|
24
87
|
}
|
|
25
|
-
)
|
|
26
|
-
isOpen && /* @__PURE__ */ jsxs("div", { className: "fixed inset-0 z-[9999]", children: [
|
|
27
|
-
/* @__PURE__ */ jsx(
|
|
28
|
-
"div",
|
|
29
|
-
{
|
|
30
|
-
className: "absolute inset-0 bg-black/50 backdrop-blur-sm",
|
|
31
|
-
onClick: () => setIsOpen(false)
|
|
32
|
-
}
|
|
33
|
-
),
|
|
34
|
-
/* @__PURE__ */ jsx("div", { className: "absolute inset-8 bg-white rounded-2xl shadow-2xl flex flex-col overflow-hidden", children: /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(LoadingState, {}), children: /* @__PURE__ */ jsx(StudioUI, { onClose: () => setIsOpen(false) }) }) })
|
|
35
|
-
] })
|
|
88
|
+
)
|
|
36
89
|
] });
|
|
37
90
|
}
|
|
38
91
|
function ImageIcon() {
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/StudioButton.tsx","../src/lib/meta.ts"],"sourcesContent":["'use client'\n\nimport { useState, lazy, Suspense } from 'react'\n\n// Lazy load the full Studio UI to avoid bundling in production\nconst StudioUI = lazy(() => import('./StudioUI'))\n\n/**\n * Floating button that opens the Studio modal.\n * Fixed position in bottom-right corner.\n * Only renders in development mode.\n * \n * Usage:\n * ```tsx\n * import { StudioButton } from '@gallop.software/studio'\n * \n * // In your layout\n * <StudioButton />\n * ```\n */\nexport function StudioButton() {\n const [isOpen, setIsOpen] = useState(false)\n\n // Only render in development\n if (process.env.NODE_ENV !== 'development') {\n return null\n }\n\n return (\n <>\n {/* Floating button - hidden when modal is open */}\n {!isOpen && (\n <button\n onClick={() => setIsOpen(true)}\n
|
|
1
|
+
{"version":3,"sources":["../src/components/StudioButton.tsx","../src/lib/meta.ts"],"sourcesContent":["'use client'\n\nimport { useState, lazy, Suspense } from 'react'\n\n// Lazy load the full Studio UI to avoid bundling in production\nconst StudioUI = lazy(() => import('./StudioUI'))\n\n/**\n * Floating button that opens the Studio modal.\n * Fixed position in bottom-right corner.\n * Only renders in development mode.\n * \n * Usage:\n * ```tsx\n * import { StudioButton } from '@gallop.software/studio'\n * \n * // In your layout\n * <StudioButton />\n * ```\n */\nexport function StudioButton() {\n const [isOpen, setIsOpen] = useState(false)\n\n // Only render in development\n if (process.env.NODE_ENV !== 'development') {\n return null\n }\n\n return (\n <>\n {/* Floating button - hidden when modal is open */}\n {!isOpen && (\n <button\n onClick={() => setIsOpen(true)}\n style={{\n position: 'fixed',\n bottom: '24px',\n right: '24px',\n zIndex: 9998,\n width: '48px',\n height: '48px',\n borderRadius: '50%',\n background: 'linear-gradient(to bottom right, #a855f7, #ec4899)',\n color: 'white',\n boxShadow: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: 'none',\n cursor: 'pointer',\n transition: 'all 0.2s',\n }}\n title=\"Open Studio\"\n aria-label=\"Open Studio media manager\"\n >\n <ImageIcon />\n </button>\n )}\n\n {/* Modal overlay with lazy-loaded UI */}\n {isOpen && (\n <div\n style={{\n position: 'fixed',\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n zIndex: 9999,\n }}\n >\n {/* Backdrop */}\n <div\n style={{\n position: 'absolute',\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n backdropFilter: 'blur(4px)',\n }}\n onClick={() => setIsOpen(false)}\n />\n\n {/* Modal */}\n <div\n style={{\n position: 'absolute',\n top: '32px',\n right: '32px',\n bottom: '32px',\n left: '32px',\n backgroundColor: 'white',\n borderRadius: '16px',\n boxShadow: '0 25px 50px -12px rgba(0, 0, 0, 0.25)',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n }}\n >\n <Suspense fallback={<LoadingState />}>\n <StudioUI onClose={() => setIsOpen(false)} />\n </Suspense>\n </div>\n </div>\n )}\n </>\n )\n}\n\nfunction ImageIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"w-6 h-6\"\n >\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\n <circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\" />\n <polyline points=\"21 15 16 10 5 21\" />\n </svg>\n )\n}\n\nfunction LoadingState() {\n return (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"flex flex-col items-center gap-4\">\n <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-purple-600\" />\n <p className=\"text-gray-500\">Loading Studio...</p>\n </div>\n </div>\n )\n}\n","import type { StudioMeta, ImageEntry, ImageSize, SizeEntry } from '../types'\n\n// Default empty meta - will be populated when reading from project\nlet _meta: StudioMeta = {\n $schema: 'https://gallop.software/schemas/studio-meta.json',\n version: 1,\n generatedAt: new Date().toISOString(),\n images: {},\n}\n\n/**\n * The meta object containing all image metadata.\n * This is read from _data/_meta.json in the consuming project.\n */\nexport const meta: StudioMeta = _meta\n\n/**\n * Initialize meta from a JSON object (called during build/runtime)\n */\nexport function initializeMeta(data: StudioMeta): void {\n _meta = data\n Object.assign(meta, data)\n}\n\n/**\n * Get the resolved URL for an image, handling CDN vs local paths\n */\nexport function getImageUrl(\n imageKey: string,\n size: ImageSize = 'medium'\n): string | undefined {\n const image = meta.images[imageKey]\n if (!image) return undefined\n\n const sizeData = image.sizes[size] || image.sizes.full\n if (!sizeData) return undefined\n\n // If synced to CDN, use CDN URL\n if (image.cdn?.synced && image.cdn.baseUrl) {\n return `${image.cdn.baseUrl}${sizeData.path}`\n }\n\n // Otherwise use local path\n return sizeData.path\n}\n\n/**\n * Get the full image entry for a key\n */\nexport function getStudioMeta(imageKey: string): ImageEntry | undefined {\n return meta.images[imageKey]\n}\n\n/**\n * Get size data for an image\n */\nexport function getImageSize(\n imageKey: string,\n size: ImageSize = 'medium'\n): SizeEntry | undefined {\n const image = meta.images[imageKey]\n if (!image) return undefined\n return image.sizes[size] || image.sizes.full\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED