@algorithm-shift/design-system 1.2.66 → 1.2.68

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.d.mts CHANGED
@@ -133,6 +133,7 @@ interface PieChartProps extends ElementProps {
133
133
  showLegends?: boolean;
134
134
  labelType?: string;
135
135
  canvasMode?: 'desktop' | 'tablet' | 'mobile';
136
+ loading?: boolean;
136
137
  }
137
138
 
138
139
  interface BarChartProps extends ElementProps {
@@ -140,6 +141,7 @@ interface BarChartProps extends ElementProps {
140
141
  chartType?: string;
141
142
  legendsPosition?: string;
142
143
  canvasMode?: 'desktop' | 'tablet' | 'mobile';
144
+ loading?: boolean;
143
145
  }
144
146
 
145
147
  interface ModalProps extends ElementProps {
@@ -319,9 +321,9 @@ declare const Spacer: ({ className, style }: ElementProps) => react_jsx_runtime.
319
321
 
320
322
  declare function Navbar({ style, badgeType, badgeCount, hideBadgeWhenZero, profileType, showName, imageUrl, altText, canvasMode, list, profileMenu, userName }: NavbarProps): react_jsx_runtime.JSX.Element;
321
323
 
322
- declare const ChartComponent: ({ className, style, ...props }: BarChartProps) => react_jsx_runtime.JSX.Element;
324
+ declare const _default$1: React$1.MemoExoticComponent<({ className, style, loading, ...props }: BarChartProps) => react_jsx_runtime.JSX.Element>;
323
325
 
324
- declare const DonutChart: ({ className, style, ...props }: PieChartProps) => react_jsx_runtime.JSX.Element;
326
+ declare const _default: React$1.MemoExoticComponent<({ className, style, loading, ...props }: PieChartProps) => react_jsx_runtime.JSX.Element>;
325
327
 
326
328
  declare function EmailComposer({ className, style, to, setTo, showCc, setShowCc, showBcc, setShowBcc, cc, setCc, bcc, setBcc, subject, setSubject, body, setBody }: EmailComposerProps): react_jsx_runtime.JSX.Element;
327
329
 
@@ -341,4 +343,4 @@ declare const Toaster: ({ ...props }: ToasterProps) => react_jsx_runtime.JSX.Ele
341
343
  declare function cn(...inputs: ClassValue[]): string;
342
344
  declare function getInitials(name: string): string;
343
345
 
344
- export { Accordion, AccordionGroup, ChartComponent as BarChart, Breadcrumb, ButtonWrapper as Button, SplitButton as ButtonGroup, CheckboxInput as Checkbox, Container, DatePicker, DateRange, Dropdown, EmailInput as Email, EmailComposer, FileInput, Flex as FlexLayout, Grid as GridLayout, Icon, ImageControl as Image, Modal, MultiCheckbox, Navbar, NumberInput, CustomPagination as Pagination, PasswordInput as Password, PhoneInput as Phone, DonutChart as PieChart, RadioInput as RadioGroup, RichText, SearchInput as Search, Shape, Slot, Spacer, StagesComponent as Stages, SwitchToggle, TabGroupComponent as TabGroup, TabList, Table, Tabs, TextInput as Text, TextInputGroup, Textarea, Toaster, Typography, UrlInput as URL, cn, getInitials, showSonnerToast };
346
+ export { Accordion, AccordionGroup, _default$1 as BarChart, Breadcrumb, ButtonWrapper as Button, SplitButton as ButtonGroup, CheckboxInput as Checkbox, Container, DatePicker, DateRange, Dropdown, EmailInput as Email, EmailComposer, FileInput, Flex as FlexLayout, Grid as GridLayout, Icon, ImageControl as Image, Modal, MultiCheckbox, Navbar, NumberInput, CustomPagination as Pagination, PasswordInput as Password, PhoneInput as Phone, _default as PieChart, RadioInput as RadioGroup, RichText, SearchInput as Search, Shape, Slot, Spacer, StagesComponent as Stages, SwitchToggle, TabGroupComponent as TabGroup, TabList, Table, Tabs, TextInput as Text, TextInputGroup, Textarea, Toaster, Typography, UrlInput as URL, cn, getInitials, showSonnerToast };
package/dist/index.d.ts CHANGED
@@ -133,6 +133,7 @@ interface PieChartProps extends ElementProps {
133
133
  showLegends?: boolean;
134
134
  labelType?: string;
135
135
  canvasMode?: 'desktop' | 'tablet' | 'mobile';
136
+ loading?: boolean;
136
137
  }
137
138
 
138
139
  interface BarChartProps extends ElementProps {
@@ -140,6 +141,7 @@ interface BarChartProps extends ElementProps {
140
141
  chartType?: string;
141
142
  legendsPosition?: string;
142
143
  canvasMode?: 'desktop' | 'tablet' | 'mobile';
144
+ loading?: boolean;
143
145
  }
144
146
 
145
147
  interface ModalProps extends ElementProps {
@@ -319,9 +321,9 @@ declare const Spacer: ({ className, style }: ElementProps) => react_jsx_runtime.
319
321
 
320
322
  declare function Navbar({ style, badgeType, badgeCount, hideBadgeWhenZero, profileType, showName, imageUrl, altText, canvasMode, list, profileMenu, userName }: NavbarProps): react_jsx_runtime.JSX.Element;
321
323
 
322
- declare const ChartComponent: ({ className, style, ...props }: BarChartProps) => react_jsx_runtime.JSX.Element;
324
+ declare const _default$1: React$1.MemoExoticComponent<({ className, style, loading, ...props }: BarChartProps) => react_jsx_runtime.JSX.Element>;
323
325
 
324
- declare const DonutChart: ({ className, style, ...props }: PieChartProps) => react_jsx_runtime.JSX.Element;
326
+ declare const _default: React$1.MemoExoticComponent<({ className, style, loading, ...props }: PieChartProps) => react_jsx_runtime.JSX.Element>;
325
327
 
326
328
  declare function EmailComposer({ className, style, to, setTo, showCc, setShowCc, showBcc, setShowBcc, cc, setCc, bcc, setBcc, subject, setSubject, body, setBody }: EmailComposerProps): react_jsx_runtime.JSX.Element;
327
329
 
@@ -341,4 +343,4 @@ declare const Toaster: ({ ...props }: ToasterProps) => react_jsx_runtime.JSX.Ele
341
343
  declare function cn(...inputs: ClassValue[]): string;
342
344
  declare function getInitials(name: string): string;
343
345
 
344
- export { Accordion, AccordionGroup, ChartComponent as BarChart, Breadcrumb, ButtonWrapper as Button, SplitButton as ButtonGroup, CheckboxInput as Checkbox, Container, DatePicker, DateRange, Dropdown, EmailInput as Email, EmailComposer, FileInput, Flex as FlexLayout, Grid as GridLayout, Icon, ImageControl as Image, Modal, MultiCheckbox, Navbar, NumberInput, CustomPagination as Pagination, PasswordInput as Password, PhoneInput as Phone, DonutChart as PieChart, RadioInput as RadioGroup, RichText, SearchInput as Search, Shape, Slot, Spacer, StagesComponent as Stages, SwitchToggle, TabGroupComponent as TabGroup, TabList, Table, Tabs, TextInput as Text, TextInputGroup, Textarea, Toaster, Typography, UrlInput as URL, cn, getInitials, showSonnerToast };
346
+ export { Accordion, AccordionGroup, _default$1 as BarChart, Breadcrumb, ButtonWrapper as Button, SplitButton as ButtonGroup, CheckboxInput as Checkbox, Container, DatePicker, DateRange, Dropdown, EmailInput as Email, EmailComposer, FileInput, Flex as FlexLayout, Grid as GridLayout, Icon, ImageControl as Image, Modal, MultiCheckbox, Navbar, NumberInput, CustomPagination as Pagination, PasswordInput as Password, PhoneInput as Phone, _default as PieChart, RadioInput as RadioGroup, RichText, SearchInput as Search, Shape, Slot, Spacer, StagesComponent as Stages, SwitchToggle, TabGroupComponent as TabGroup, TabList, Table, Tabs, TextInput as Text, TextInputGroup, Textarea, Toaster, Typography, UrlInput as URL, cn, getInitials, showSonnerToast };
package/dist/index.js CHANGED
@@ -243,11 +243,13 @@ function TabGroupComponent({
243
243
  activeTab,
244
244
  onTabChange
245
245
  }) {
246
+ const [mounted, setMounted] = (0, import_react3.useState)(false);
246
247
  (0, import_react3.useEffect)(() => {
247
- if (list && list.length > 0 && !activeTab && onTabChange) {
248
+ if (list && list.length > 0 && !activeTab && onTabChange && !mounted) {
248
249
  onTabChange(list[0]?.tabId);
250
+ setMounted(true);
249
251
  }
250
- }, [list, activeTab, onTabChange]);
252
+ }, [list, activeTab, onTabChange, mounted]);
251
253
  const formatedList = (0, import_react3.useMemo)(
252
254
  () => Array.isArray(list) ? [...list].sort((a, b) => (a.orderNumber ?? 0) - (b.orderNumber ?? 0)) : [],
253
255
  [list]
@@ -28493,7 +28495,7 @@ function DataTable({
28493
28495
  return [];
28494
28496
  };
28495
28497
  return /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)("div", { className: "overflow-hidden rounded-md w-full", children: [
28496
- /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)("div", { className: `flex ${globalSearch ? "justify-between" : "justify-end"} p-2 border-b bg-gray-50`, children: [
28498
+ /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)("div", { className: `flex ${globalSearch ? "justify-between" : "justify-end"} p-2 bg-gray-50`, children: [
28497
28499
  globalSearch && /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)("div", { className: "flex items-center gap-2 w-full max-w-sm", children: [
28498
28500
  /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)("div", { className: "relative w-full", children: [
28499
28501
  /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(
@@ -28529,7 +28531,7 @@ function DataTable({
28529
28531
  {
28530
28532
  variant: "outline",
28531
28533
  size: "sm",
28532
- className: "px-3 py-1 text-xs cursor-pointer",
28534
+ className: "px-3 py-1 text-xs cursor-pointer border-gray-300",
28533
28535
  children: "Manage Columns"
28534
28536
  }
28535
28537
  ) }),
@@ -29210,19 +29212,45 @@ function Navbar({
29210
29212
  }
29211
29213
 
29212
29214
  // src/components/Chart/BarChart.tsx
29215
+ var import_react27 = __toESM(require("react"));
29213
29216
  var import_recharts = require("recharts");
29214
29217
  var import_jsx_runtime59 = require("react/jsx-runtime");
29215
- var ChartComponent = ({ className, style, ...props }) => {
29216
- const data = Array.isArray(props?.data) ? props.data : [];
29218
+ var ChartComponent = ({ className, style, loading, ...props }) => {
29219
+ const data = Array.isArray(props.data) ? props.data : [];
29217
29220
  const chartType = props.chartType || "bar";
29218
29221
  const legendsPosition = props.legendsPosition === "middle" || props.legendsPosition === "bottom" ? props.legendsPosition : "top";
29219
- return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("div", { className: `${className} h-[400px]`, style, children: data.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_recharts.ResponsiveContainer, { width: "100%", height: "100%", children: chartType === "bar" ? /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(import_recharts.BarChart, { data, children: [
29222
+ if (loading || data.length === 0) {
29223
+ return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
29224
+ "div",
29225
+ {
29226
+ className: `flex items-center justify-center w-full h-[300px] md:h-[400px] bg-gray-50 animate-pulse rounded-lg ${className}`,
29227
+ style,
29228
+ children: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("div", { className: "text-gray-400 text-sm md:text-base", children: loading ? "Loading chart report..." : "No data available to display the chart." })
29229
+ }
29230
+ );
29231
+ }
29232
+ return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("div", { className: `${className} h-[400px]`, style, children: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_recharts.ResponsiveContainer, { width: "100%", height: "100%", children: chartType === "bar" ? /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(import_recharts.BarChart, { data, title: "Leads", desc: "content", children: [
29220
29233
  /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_recharts.CartesianGrid, { strokeDasharray: "3 3" }),
29221
29234
  /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_recharts.XAxis, { dataKey: "name" }),
29222
29235
  /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_recharts.YAxis, {}),
29223
- /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_recharts.Tooltip, {}),
29236
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_recharts.Tooltip, { formatter: (value) => `${value}k` }),
29224
29237
  /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_recharts.Legend, { verticalAlign: legendsPosition, align: "center" }),
29225
- /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_recharts.Bar, { dataKey: "value", fill: "#00695C" })
29238
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
29239
+ import_recharts.Bar,
29240
+ {
29241
+ dataKey: "value",
29242
+ fill: "#00695C",
29243
+ radius: [6, 6, 0, 0],
29244
+ isAnimationActive: false,
29245
+ children: data.map((entry, index) => /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
29246
+ "rect",
29247
+ {
29248
+ fill: entry.color || "#00695C"
29249
+ },
29250
+ `bar-${index}`
29251
+ ))
29252
+ }
29253
+ )
29226
29254
  ] }) : /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(import_recharts.AreaChart, { data, children: [
29227
29255
  /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("defs", { children: /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)("linearGradient", { id: "colorCount", x1: "0", y1: "0", x2: "0", y2: "1", children: [
29228
29256
  /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("stop", { offset: "5%", stopColor: "#00695C", stopOpacity: 0.8 }),
@@ -29231,7 +29259,7 @@ var ChartComponent = ({ className, style, ...props }) => {
29231
29259
  /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_recharts.CartesianGrid, { strokeDasharray: "3 3" }),
29232
29260
  /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_recharts.XAxis, { dataKey: "name" }),
29233
29261
  /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_recharts.YAxis, {}),
29234
- /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_recharts.Tooltip, {}),
29262
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_recharts.Tooltip, { formatter: (value) => `${value}k` }),
29235
29263
  /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
29236
29264
  import_recharts.Area,
29237
29265
  {
@@ -29239,47 +29267,44 @@ var ChartComponent = ({ className, style, ...props }) => {
29239
29267
  dataKey: "value",
29240
29268
  stroke: "#00695C",
29241
29269
  fillOpacity: 1,
29242
- fill: "url(#colorCount)"
29270
+ fill: "url(#colorCount)",
29271
+ isAnimationActive: false
29243
29272
  }
29244
29273
  )
29245
29274
  ] }) }) });
29246
29275
  };
29247
- var BarChart_default = ChartComponent;
29276
+ var BarChart_default = import_react27.default.memo(ChartComponent);
29248
29277
 
29249
29278
  // src/components/Chart/PieChart.tsx
29279
+ var import_react28 = __toESM(require("react"));
29250
29280
  var import_recharts2 = require("recharts");
29251
29281
  var import_jsx_runtime60 = require("react/jsx-runtime");
29252
- var DonutChart = ({ className, style, ...props }) => {
29253
- const data = Array.isArray(props?.data) ? props.data : [];
29254
- const total = data.reduce((sum, d) => sum + d.value, 0);
29255
- const showPercentage = props.showPercentage ?? true;
29282
+ var getRandomColor = () => {
29283
+ const palette = [
29284
+ "#2563eb",
29285
+ "#10b981",
29286
+ "#f59e0b",
29287
+ "#ef4444",
29288
+ "#8b5cf6",
29289
+ "#14b8a6",
29290
+ "#ec4899",
29291
+ "#e11d48",
29292
+ "#22c55e",
29293
+ "#3b82f6"
29294
+ ];
29295
+ return palette[Math.floor(Math.random() * palette.length)];
29296
+ };
29297
+ var DonutChart = ({ className, style, loading, ...props }) => {
29256
29298
  const showLegends = props.showLegends ?? true;
29257
29299
  const labelType = props.labelType || "inside";
29258
29300
  const canvasMode = props.canvasMode;
29259
- const renderLabel = ({ value, x, y }) => {
29260
- if (value == null) return null;
29261
- const percentage = (Number(value) / total * 100).toFixed(0);
29262
- return /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(
29263
- "text",
29264
- {
29265
- x,
29266
- y,
29267
- textAnchor: "middle",
29268
- dominantBaseline: "central",
29269
- className: "text-[10px] font-semibold",
29270
- fill: labelType === "inside" ? "#fff" : "#000",
29271
- children: [
29272
- value,
29273
- "k ",
29274
- showPercentage ? `(${percentage}%)` : ""
29275
- ]
29276
- }
29277
- );
29278
- };
29301
+ const data = (0, import_react28.useMemo)(() => {
29302
+ if (!Array.isArray(props.data)) return [];
29303
+ return props.data.map((item) => ({ ...item, color: getRandomColor() }));
29304
+ }, [props.data]);
29305
+ const total = (0, import_react28.useMemo)(() => data.reduce((sum, d) => sum + d.value, 0), [data]);
29279
29306
  const forceMobile = canvasMode === "mobile" || canvasMode === "tablet";
29280
- const forceDesktop = canvasMode === "desktop";
29281
- const wrapperClass = canvasMode ? forceDesktop ? "flex-row" : "flex-col" : "flex-col md:flex-row";
29282
- const renderLegends = () => {
29307
+ const renderLegends = (0, import_react28.useMemo)(() => {
29283
29308
  if (!showLegends) return null;
29284
29309
  return /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(import_jsx_runtime60.Fragment, { children: data.map((d) => /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(
29285
29310
  "div",
@@ -29298,23 +29323,33 @@ var DonutChart = ({ className, style, ...props }) => {
29298
29323
  },
29299
29324
  d.name
29300
29325
  )) });
29301
- };
29326
+ }, [data, showLegends]);
29327
+ if (loading || data.length === 0) {
29328
+ return /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
29329
+ "div",
29330
+ {
29331
+ className: `flex items-center justify-center w-full h-[300px] md:h-[400px] bg-gray-50 animate-pulse rounded-lg ${className}`,
29332
+ style,
29333
+ children: /* @__PURE__ */ (0, import_jsx_runtime60.jsx)("div", { className: "text-gray-400 text-sm md:text-base", children: loading ? "Loading chart report..." : "No data available to display the chart." })
29334
+ }
29335
+ );
29336
+ }
29302
29337
  return /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(
29303
29338
  "div",
29304
29339
  {
29305
- className: `relative flex items-center ${wrapperClass} ${className}`,
29340
+ className: `relative flex flex-col items-center ${className}`,
29306
29341
  style,
29307
29342
  children: [
29308
29343
  /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)("div", { className: "relative w-full md:w-[70%] h-[300px] md:h-[400px] flex items-center justify-center", children: [
29309
- data.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(import_recharts2.ResponsiveContainer, { width: "100%", height: "100%", children: /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(import_recharts2.PieChart, { children: [
29344
+ /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(import_recharts2.ResponsiveContainer, { width: "100%", height: "100%", children: /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(import_recharts2.PieChart, { children: [
29310
29345
  /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(
29311
29346
  import_recharts2.Pie,
29312
29347
  {
29313
29348
  data,
29314
29349
  cx: "50%",
29315
29350
  cy: "50%",
29316
- innerRadius: 70,
29317
- outerRadius: 120,
29351
+ innerRadius: forceMobile ? 60 : 80,
29352
+ outerRadius: forceMobile ? 100 : 140,
29318
29353
  dataKey: "value",
29319
29354
  labelLine: false,
29320
29355
  isAnimationActive: false,
@@ -29325,26 +29360,38 @@ var DonutChart = ({ className, style, ...props }) => {
29325
29360
  {
29326
29361
  dataKey: "value",
29327
29362
  position: labelType === "inside" ? "inside" : "outside",
29328
- content: renderLabel
29363
+ fill: labelType === "inside" ? "#fff" : "#000",
29364
+ fontSize: forceMobile ? 10 : 13,
29365
+ fontWeight: 600
29329
29366
  }
29330
29367
  )
29331
29368
  ]
29332
29369
  }
29333
29370
  ),
29334
- /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(import_recharts2.Tooltip, { formatter: (value, name) => [`${value}k`, name] })
29371
+ /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
29372
+ import_recharts2.Tooltip,
29373
+ {
29374
+ formatter: (value, name) => [`${value}k`, name]
29375
+ }
29376
+ )
29335
29377
  ] }) }),
29336
- /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)("div", { className: "absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 text-2xl md:text-4xl font-bold text-[#000]", children: [
29337
- total,
29338
- "k"
29339
- ] })
29378
+ /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(
29379
+ "div",
29380
+ {
29381
+ className: `absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 ${forceMobile ? "text-2xl" : "text-4xl"} font-bold text-[#000]`,
29382
+ children: [
29383
+ total,
29384
+ "k"
29385
+ ]
29386
+ }
29387
+ )
29340
29388
  ] }),
29341
- /* @__PURE__ */ (0, import_jsx_runtime60.jsx)("div", { className: `flex ${forceDesktop ? "flex-col ml-auto space-y-3" : "flex-wrap justify-center gap-2 mt-4"}
29342
- w-full md:w-auto`, children: renderLegends() })
29389
+ /* @__PURE__ */ (0, import_jsx_runtime60.jsx)("div", { className: "flex flex-wrap justify-center gap-2 mt-6 w-full md:w-auto", children: renderLegends })
29343
29390
  ]
29344
29391
  }
29345
29392
  );
29346
29393
  };
29347
- var PieChart_default = DonutChart;
29394
+ var PieChart_default = import_react28.default.memo(DonutChart);
29348
29395
 
29349
29396
  // src/components/Blocks/EmailComposer.tsx
29350
29397
  var import_jsx_runtime61 = require("react/jsx-runtime");