@mieweb/ui 0.2.0 → 0.2.2

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.
Files changed (85) hide show
  1. package/README.md +28 -0
  2. package/dist/ag-grid.cjs +753 -0
  3. package/dist/ag-grid.cjs.map +1 -0
  4. package/dist/ag-grid.d.cts +193 -0
  5. package/dist/ag-grid.d.ts +193 -0
  6. package/dist/ag-grid.js +698 -0
  7. package/dist/ag-grid.js.map +1 -0
  8. package/dist/brands/bluehive.css +20 -0
  9. package/dist/brands/enterprise-health.css +32 -4
  10. package/dist/brands/index.cjs +12 -7
  11. package/dist/brands/index.d.cts +3 -1
  12. package/dist/brands/index.d.ts +3 -1
  13. package/dist/brands/index.js +3 -2
  14. package/dist/brands/mieweb.css +20 -0
  15. package/dist/brands/ozwell.cjs +12 -0
  16. package/dist/brands/ozwell.cjs.map +1 -0
  17. package/dist/brands/ozwell.css +165 -0
  18. package/dist/brands/ozwell.d.cts +17 -0
  19. package/dist/brands/ozwell.d.ts +17 -0
  20. package/dist/brands/ozwell.js +3 -0
  21. package/dist/brands/ozwell.js.map +1 -0
  22. package/dist/brands/waggleline.css +46 -0
  23. package/dist/brands/webchart.css +20 -0
  24. package/dist/chunk-4DJNHPHB.js +82 -0
  25. package/dist/chunk-4DJNHPHB.js.map +1 -0
  26. package/dist/{chunk-CLJZHS7Y.cjs → chunk-B5364UWR.cjs} +3 -2
  27. package/dist/chunk-B5364UWR.cjs.map +1 -0
  28. package/dist/chunk-EYH7OUX5.js +445 -0
  29. package/dist/chunk-EYH7OUX5.js.map +1 -0
  30. package/dist/{chunk-UBRDKNLQ.js → chunk-GHRQ3ZJH.js} +178 -51
  31. package/dist/chunk-GHRQ3ZJH.js.map +1 -0
  32. package/dist/{chunk-AKTUXJPI.cjs → chunk-INFSKLXE.cjs} +178 -51
  33. package/dist/chunk-INFSKLXE.cjs.map +1 -0
  34. package/dist/chunk-KEIA2G6O.cjs +84 -0
  35. package/dist/chunk-KEIA2G6O.cjs.map +1 -0
  36. package/dist/{chunk-WN2FJE23.js → chunk-KWDTTGH2.js} +3 -3
  37. package/dist/{chunk-WN2FJE23.js.map → chunk-KWDTTGH2.js.map} +1 -1
  38. package/dist/{chunk-MKJDBXX4.cjs → chunk-PEH4ZOEM.cjs} +4 -4
  39. package/dist/{chunk-MKJDBXX4.cjs.map → chunk-PEH4ZOEM.cjs.map} +1 -1
  40. package/dist/chunk-QUA7WVHK.cjs +188 -0
  41. package/dist/chunk-QUA7WVHK.cjs.map +1 -0
  42. package/dist/{chunk-S4DK5WN6.js → chunk-RYQ5NEKH.js} +3 -2
  43. package/dist/chunk-RYQ5NEKH.js.map +1 -0
  44. package/dist/chunk-SSKI6VTW.cjs +449 -0
  45. package/dist/chunk-SSKI6VTW.cjs.map +1 -0
  46. package/dist/{chunk-SN52QMRT.js → chunk-TPGT236K.js} +28 -24
  47. package/dist/chunk-TPGT236K.js.map +1 -0
  48. package/dist/{chunk-N5EKL4DH.js → chunk-VBHPXSCV.js} +4 -4
  49. package/dist/{chunk-N5EKL4DH.js.map → chunk-VBHPXSCV.js.map} +1 -1
  50. package/dist/{chunk-B7DA35BY.cjs → chunk-VZUVYJFU.cjs} +14 -14
  51. package/dist/{chunk-B7DA35BY.cjs.map → chunk-VZUVYJFU.cjs.map} +1 -1
  52. package/dist/{chunk-KMN7JX2X.cjs → chunk-WH6I7CMP.cjs} +28 -24
  53. package/dist/chunk-WH6I7CMP.cjs.map +1 -0
  54. package/dist/chunk-Y22SOAJM.js +3 -0
  55. package/dist/chunk-Y22SOAJM.js.map +1 -0
  56. package/dist/components/AudioPlayer/index.cjs +6 -6
  57. package/dist/components/AudioPlayer/index.d.cts +24 -10
  58. package/dist/components/AudioPlayer/index.d.ts +24 -10
  59. package/dist/components/AudioPlayer/index.js +1 -1
  60. package/dist/components/Button/index.cjs +3 -3
  61. package/dist/components/Button/index.js +1 -1
  62. package/dist/components/DateInput/index.cjs +3 -3
  63. package/dist/components/DateInput/index.js +2 -2
  64. package/dist/index.cjs +4556 -2833
  65. package/dist/index.cjs.map +1 -1
  66. package/dist/index.d.cts +411 -227
  67. package/dist/index.d.ts +411 -227
  68. package/dist/index.js +4093 -2349
  69. package/dist/index.js.map +1 -1
  70. package/dist/styles.css +2 -2
  71. package/dist/tailwind-preset.cjs +4 -4
  72. package/dist/tailwind-preset.js +1 -1
  73. package/dist/utils/index.cjs +9 -9
  74. package/dist/utils/index.js +1 -1
  75. package/package.json +53 -38
  76. package/dist/chunk-AKTUXJPI.cjs.map +0 -1
  77. package/dist/chunk-CLJZHS7Y.cjs.map +0 -1
  78. package/dist/chunk-KMN7JX2X.cjs.map +0 -1
  79. package/dist/chunk-O7WRE2WX.js +0 -195
  80. package/dist/chunk-O7WRE2WX.js.map +0 -1
  81. package/dist/chunk-S4DK5WN6.js.map +0 -1
  82. package/dist/chunk-SJ3BF4BO.cjs +0 -199
  83. package/dist/chunk-SJ3BF4BO.cjs.map +0 -1
  84. package/dist/chunk-SN52QMRT.js.map +0 -1
  85. package/dist/chunk-UBRDKNLQ.js.map +0 -1
@@ -0,0 +1,698 @@
1
+ import { Mail, Phone, Globe, CheckCircle, Clock } from './chunk-Y22SOAJM.js';
2
+ import { cn } from './chunk-F3SOEIN2.js';
3
+ import * as React from 'react';
4
+ import { memo } from 'react';
5
+ import { AgGridReact } from 'ag-grid-react';
6
+ export { AgGridReact } from 'ag-grid-react';
7
+ import { ModuleRegistry, AllCommunityModule } from 'ag-grid-community';
8
+ import { cva } from 'class-variance-authority';
9
+ import { jsx, jsxs } from 'react/jsx-runtime';
10
+ import { Linkedin } from 'lucide-react';
11
+
12
+ ModuleRegistry.registerModules([AllCommunityModule]);
13
+ var agGridVariants = cva("ag-theme-custom w-full", {
14
+ variants: {
15
+ /**
16
+ * Visual variant of the grid
17
+ */
18
+ variant: {
19
+ default: "",
20
+ bordered: "[&_.ag-root-wrapper]:border [&_.ag-root-wrapper]:border-border [&_.ag-root-wrapper]:rounded-lg",
21
+ striped: "[&_.ag-row-odd]:bg-muted/50",
22
+ card: "[&_.ag-root-wrapper]:shadow-card [&_.ag-root-wrapper]:rounded-lg [&_.ag-root-wrapper]:border-0"
23
+ },
24
+ /**
25
+ * Size/density of the grid rows
26
+ */
27
+ size: {
28
+ xs: "[&_.ag-row]:h-7 [&_.ag-header-row]:h-7 text-xs [&_.ag-cell]:px-2",
29
+ sm: "[&_.ag-row]:h-8 [&_.ag-header-row]:h-8 text-xs [&_.ag-cell]:px-3",
30
+ md: "[&_.ag-row]:h-10 [&_.ag-header-row]:h-10 text-sm [&_.ag-cell]:px-4",
31
+ lg: "[&_.ag-row]:h-12 [&_.ag-header-row]:h-12 text-base [&_.ag-cell]:px-4",
32
+ xl: "[&_.ag-row]:h-14 [&_.ag-header-row]:h-14 text-base [&_.ag-cell]:px-6"
33
+ },
34
+ /**
35
+ * Brand theme variant
36
+ */
37
+ brand: {
38
+ default: "",
39
+ mieweb: "ag-brand-mieweb",
40
+ bluehive: "ag-brand-bluehive",
41
+ waggleline: "ag-brand-waggleline",
42
+ webchart: "ag-brand-webchart",
43
+ "enterprise-health": "ag-brand-enterprise-health"
44
+ }
45
+ },
46
+ defaultVariants: {
47
+ variant: "default",
48
+ size: "md",
49
+ brand: "default"
50
+ }
51
+ });
52
+ var sizeToRowHeight = {
53
+ xs: { rowHeight: 28, headerHeight: 28, containerHeight: 280 },
54
+ sm: { rowHeight: 32, headerHeight: 32, containerHeight: 320 },
55
+ md: { rowHeight: 40, headerHeight: 40, containerHeight: 400 },
56
+ lg: { rowHeight: 48, headerHeight: 48, containerHeight: 480 },
57
+ xl: { rowHeight: 56, headerHeight: 56, containerHeight: 560 }
58
+ };
59
+ var getDefaultColDef = (sortable, filterable, resizable) => ({
60
+ sortable,
61
+ filter: filterable,
62
+ resizable,
63
+ minWidth: 100,
64
+ flex: 1,
65
+ suppressMovable: false,
66
+ headerClass: "ag-header-cell-custom",
67
+ cellClass: "ag-cell-custom"
68
+ });
69
+ function AGGridInner({
70
+ className,
71
+ variant,
72
+ size,
73
+ brand,
74
+ height,
75
+ loading = false,
76
+ columnDefs,
77
+ rowData,
78
+ defaultColDef: userDefaultColDef,
79
+ onGridReady,
80
+ onRowClick,
81
+ gridRef,
82
+ rowSelection,
83
+ brandConfig,
84
+ pagination = false,
85
+ resizable = true,
86
+ sortable = true,
87
+ filterable = true,
88
+ noDataMessage = "No data to display",
89
+ loadingMessage = "Loading...",
90
+ ...props
91
+ }, ref) {
92
+ const internalRef = React.useRef(null);
93
+ const gridApiRef = React.useRef(null);
94
+ const resolvedRef = gridRef || ref || internalRef;
95
+ const handleGridReady = React.useCallback(
96
+ (event) => {
97
+ gridApiRef.current = event.api;
98
+ onGridReady?.(event);
99
+ },
100
+ [onGridReady]
101
+ );
102
+ const handleRowClicked = React.useCallback(
103
+ (event) => {
104
+ onRowClick?.(event);
105
+ },
106
+ [onRowClick]
107
+ );
108
+ const mergedDefaultColDef = React.useMemo(
109
+ () => ({
110
+ ...getDefaultColDef(sortable, filterable, resizable),
111
+ ...userDefaultColDef
112
+ }),
113
+ [userDefaultColDef, sortable, filterable, resizable]
114
+ );
115
+ const resolvedRowSelection = React.useMemo(() => {
116
+ if (!rowSelection) return void 0;
117
+ if (typeof rowSelection === "object") {
118
+ return rowSelection;
119
+ }
120
+ if (rowSelection === "multiple") {
121
+ return {
122
+ mode: "multiRow",
123
+ enableClickSelection: true
124
+ };
125
+ }
126
+ if (rowSelection === "single") {
127
+ return {
128
+ mode: "singleRow",
129
+ enableClickSelection: true
130
+ };
131
+ }
132
+ return void 0;
133
+ }, [rowSelection]);
134
+ React.useEffect(() => {
135
+ if (gridApiRef.current) {
136
+ if (loading) {
137
+ gridApiRef.current.showLoadingOverlay();
138
+ } else {
139
+ gridApiRef.current.hideOverlay();
140
+ }
141
+ }
142
+ }, [loading]);
143
+ const sizeConfig = sizeToRowHeight[size || "md"];
144
+ const resolvedHeight = height ?? sizeConfig.containerHeight;
145
+ return /* @__PURE__ */ jsx(
146
+ "div",
147
+ {
148
+ className: cn(agGridVariants({ variant, size, brand }), className),
149
+ style: {
150
+ height: typeof resolvedHeight === "number" ? `${resolvedHeight}px` : resolvedHeight,
151
+ ...brandConfig && {
152
+ "--ag-primary-color": brandConfig.colors.primary[600],
153
+ "--ag-font-family": brandConfig.typography.fontFamily.sans.join(", ")
154
+ }
155
+ },
156
+ "data-brand": brand,
157
+ children: /* @__PURE__ */ jsx(
158
+ AgGridReact,
159
+ {
160
+ ref: resolvedRef,
161
+ columnDefs,
162
+ rowData,
163
+ defaultColDef: mergedDefaultColDef,
164
+ onGridReady: handleGridReady,
165
+ onRowClicked: handleRowClicked,
166
+ animateRows: true,
167
+ enableBrowserTooltips: true,
168
+ rowSelection: resolvedRowSelection,
169
+ pagination,
170
+ paginationPageSize: pagination ? 50 : void 0,
171
+ paginationPageSizeSelector: pagination ? [25, 50, 100, 200] : void 0,
172
+ rowHeight: sizeConfig.rowHeight,
173
+ headerHeight: sizeConfig.headerHeight,
174
+ noRowsOverlayComponent: () => /* @__PURE__ */ jsx("div", { className: "text-muted-foreground py-8 text-center", children: noDataMessage }),
175
+ loadingOverlayComponent: () => /* @__PURE__ */ jsx("div", { className: "text-muted-foreground py-8 text-center", children: loadingMessage }),
176
+ theme: "legacy",
177
+ ...props
178
+ }
179
+ )
180
+ }
181
+ );
182
+ }
183
+ var AGGrid = React.forwardRef(AGGridInner);
184
+ AGGrid.displayName = "AGGrid";
185
+ function getNestedValue(obj, path) {
186
+ if (!obj || !path) return void 0;
187
+ const parts = path.split(".");
188
+ let current = obj;
189
+ for (const part of parts) {
190
+ if (current === null || current === void 0) return void 0;
191
+ if (typeof current === "object") {
192
+ current = current[part];
193
+ } else {
194
+ return void 0;
195
+ }
196
+ }
197
+ return current;
198
+ }
199
+ function getFaviconUrl(domain) {
200
+ if (!domain || typeof domain !== "string") return null;
201
+ const cleanDomain = domain.replace(/^https?:\/\//, "").replace(/\/.*$/, "").trim();
202
+ if (!cleanDomain) return null;
203
+ return `https://www.google.com/s2/favicons?domain=${cleanDomain}&sz=64`;
204
+ }
205
+ function formatPhoneDisplay(phone) {
206
+ if (!phone) return "";
207
+ const cleaned = phone.replace(/\D/g, "");
208
+ if (cleaned.length === 10) {
209
+ return `${cleaned.slice(0, 3)}-${cleaned.slice(3, 6)}-${cleaned.slice(6)}`;
210
+ }
211
+ if (cleaned.length === 11 && cleaned.startsWith("1")) {
212
+ return `${cleaned[0]}-${cleaned.slice(1, 4)}-${cleaned.slice(4, 7)}-${cleaned.slice(7)}`;
213
+ }
214
+ return phone;
215
+ }
216
+ function getInitials(name) {
217
+ if (!name || typeof name !== "string") return "??";
218
+ const parts = name.split(" ").filter(Boolean);
219
+ if (parts.length >= 2) {
220
+ return `${parts[0][0]}${parts[parts.length - 1][0]}`.toUpperCase();
221
+ }
222
+ return name.substring(0, 2).toUpperCase();
223
+ }
224
+ function getAvatarColor(name) {
225
+ const colors = [
226
+ "bg-primary-600",
227
+ "bg-green-600",
228
+ "bg-orange-600",
229
+ "bg-secondary-600",
230
+ "bg-pink-600",
231
+ "bg-primary-700",
232
+ "bg-teal-600",
233
+ "bg-amber-600"
234
+ ];
235
+ if (!name || typeof name !== "string") return colors[0];
236
+ let hash = 0;
237
+ for (let i = 0; i < name.length; i++) {
238
+ hash = name.charCodeAt(i) + ((hash << 5) - hash);
239
+ }
240
+ return colors[Math.abs(hash) % colors.length];
241
+ }
242
+ function cellRendererPropsAreEqual(prevProps, nextProps) {
243
+ if (prevProps.value !== nextProps.value) return false;
244
+ if (prevProps.data !== nextProps.data) return false;
245
+ if (prevProps.node?.rowIndex !== nextProps.node?.rowIndex) return false;
246
+ return true;
247
+ }
248
+ var statusColors = {
249
+ active: {
250
+ label: "Active",
251
+ bgClass: "bg-green-100 dark:bg-green-900/30",
252
+ textClass: "text-green-600 dark:text-green-400"
253
+ },
254
+ inactive: {
255
+ label: "Inactive",
256
+ bgClass: "bg-gray-200 dark:bg-gray-700",
257
+ textClass: "text-gray-600 dark:text-gray-400"
258
+ },
259
+ pending: {
260
+ label: "Pending",
261
+ bgClass: "bg-amber-100 dark:bg-amber-900/30",
262
+ textClass: "text-amber-600 dark:text-amber-400"
263
+ },
264
+ new: {
265
+ label: "New",
266
+ bgClass: "bg-primary-100 dark:bg-primary-900/30",
267
+ textClass: "text-primary-600 dark:text-primary-400"
268
+ },
269
+ verified: {
270
+ label: "Verified",
271
+ bgClass: "bg-green-100 dark:bg-green-900/30",
272
+ textClass: "text-green-600 dark:text-green-400"
273
+ },
274
+ flagged: {
275
+ label: "Flagged",
276
+ bgClass: "bg-red-100 dark:bg-red-900/30",
277
+ textClass: "text-red-600 dark:text-red-400"
278
+ }
279
+ };
280
+ function AvatarNameRenderer(props) {
281
+ const { data, value } = props;
282
+ if (!data && !value) return /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "--" });
283
+ const displayName = typeof value === "string" && value ? value : "Unknown";
284
+ const isSystemValue = ["Unknown", "Unassigned", "System"].includes(
285
+ displayName
286
+ );
287
+ const avatarUrl = props.avatarField && data ? getNestedValue(data, props.avatarField) : data?.avatarUrl;
288
+ const domain = props.domainField && data ? getNestedValue(data, props.domainField) : data?.company?.domain || data?.domain;
289
+ const faviconUrl = getFaviconUrl(domain);
290
+ const initials = getInitials(displayName);
291
+ const imageUrl = avatarUrl || faviconUrl;
292
+ if (isSystemValue) {
293
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 py-1", children: [
294
+ /* @__PURE__ */ jsx("div", { className: "flex h-7 w-7 items-center justify-center rounded-full bg-gray-200 text-xs font-semibold text-gray-400 dark:bg-gray-700 dark:text-gray-500", children: displayName === "Unassigned" ? "\u2014" : "??" }),
295
+ /* @__PURE__ */ jsx("span", { className: "truncate text-gray-400 italic dark:text-gray-500", children: displayName })
296
+ ] });
297
+ }
298
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 py-1", children: [
299
+ imageUrl ? /* @__PURE__ */ jsx(
300
+ "img",
301
+ {
302
+ src: imageUrl,
303
+ alt: displayName,
304
+ className: "h-7 w-7 rounded-full bg-white object-cover ring-2 ring-white dark:ring-gray-700",
305
+ onError: (e) => {
306
+ const target = e.target;
307
+ target.style.display = "none";
308
+ const sibling = target.nextElementSibling;
309
+ if (sibling) sibling.style.display = "flex";
310
+ }
311
+ }
312
+ ) : null,
313
+ /* @__PURE__ */ jsx(
314
+ "div",
315
+ {
316
+ className: cn(
317
+ "flex h-7 w-7 items-center justify-center rounded-full text-xs font-semibold text-white",
318
+ getAvatarColor(displayName)
319
+ ),
320
+ style: { display: imageUrl ? "none" : "flex" },
321
+ children: initials
322
+ }
323
+ ),
324
+ /* @__PURE__ */ jsx("span", { className: "text-foreground truncate font-medium", children: displayName })
325
+ ] });
326
+ }
327
+ function StatusBadgeRenderer(props) {
328
+ const { value, statusConfig = statusColors } = props;
329
+ if (!value) return /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "--" });
330
+ const normalizedValue = String(value).toLowerCase().replace(/\s+/g, "_");
331
+ const config = statusConfig[normalizedValue] || {
332
+ label: value,
333
+ bgClass: "bg-gray-200 dark:bg-gray-700",
334
+ textClass: "text-gray-600 dark:text-gray-400"
335
+ };
336
+ return /* @__PURE__ */ jsx(
337
+ "span",
338
+ {
339
+ className: cn(
340
+ "inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 text-xs font-medium",
341
+ config.bgClass,
342
+ config.textClass
343
+ ),
344
+ children: config.label
345
+ }
346
+ );
347
+ }
348
+ function getEngagementScoreColors(score) {
349
+ if (score >= 70)
350
+ return {
351
+ barColor: "bg-green-500",
352
+ textColor: "text-green-600 dark:text-green-400"
353
+ };
354
+ if (score >= 40)
355
+ return {
356
+ barColor: "bg-amber-500",
357
+ textColor: "text-amber-600 dark:text-amber-400"
358
+ };
359
+ if (score >= 20)
360
+ return {
361
+ barColor: "bg-orange-500",
362
+ textColor: "text-orange-600 dark:text-orange-400"
363
+ };
364
+ return {
365
+ barColor: "bg-gray-400",
366
+ textColor: "text-gray-600 dark:text-gray-400"
367
+ };
368
+ }
369
+ function EngagementScoreRenderer(props) {
370
+ const { value } = props;
371
+ if (value == null) return /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "--" });
372
+ const score = Number(value);
373
+ const percentage = Math.min(100, Math.max(0, score));
374
+ const { barColor, textColor } = getEngagementScoreColors(score);
375
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 py-1", children: [
376
+ /* @__PURE__ */ jsx("div", { className: "h-1.5 w-16 overflow-hidden rounded-full bg-gray-200 dark:bg-gray-700", children: /* @__PURE__ */ jsx(
377
+ "div",
378
+ {
379
+ className: cn("h-full rounded-full transition-all", barColor),
380
+ style: { width: `${percentage}%` }
381
+ }
382
+ ) }),
383
+ /* @__PURE__ */ jsx("span", { className: cn("text-sm font-medium", textColor), children: score })
384
+ ] });
385
+ }
386
+ function EmailRenderer(props) {
387
+ const { value } = props;
388
+ if (!value) return /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "--" });
389
+ return /* @__PURE__ */ jsxs(
390
+ "a",
391
+ {
392
+ href: `mailto:${value}`,
393
+ className: "text-primary-600 dark:text-primary-400 inline-flex items-center gap-1.5 hover:underline",
394
+ onClick: (e) => e.stopPropagation(),
395
+ children: [
396
+ /* @__PURE__ */ jsx(Mail, { className: "h-3 w-3 opacity-60" }),
397
+ /* @__PURE__ */ jsx("span", { className: "truncate", children: value })
398
+ ]
399
+ }
400
+ );
401
+ }
402
+ function PhoneRenderer(props) {
403
+ const { value } = props;
404
+ if (!value) return /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "--" });
405
+ const displayValue = formatPhoneDisplay(value);
406
+ return /* @__PURE__ */ jsxs(
407
+ "a",
408
+ {
409
+ href: `tel:${value}`,
410
+ className: "text-foreground hover:text-primary-600 dark:hover:text-primary-400 inline-flex items-center gap-1.5",
411
+ onClick: (e) => e.stopPropagation(),
412
+ children: [
413
+ /* @__PURE__ */ jsx(Phone, { className: "h-3 w-3 text-green-500 opacity-70" }),
414
+ /* @__PURE__ */ jsx("span", { children: displayValue })
415
+ ]
416
+ }
417
+ );
418
+ }
419
+ function DomainRenderer(props) {
420
+ const { value } = props;
421
+ if (!value) return /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "--" });
422
+ const url = value.startsWith("http") ? value : `https://${value}`;
423
+ const displayDomain = value.replace(/^https?:\/\//, "").replace(/\/$/, "");
424
+ return /* @__PURE__ */ jsxs(
425
+ "a",
426
+ {
427
+ href: url,
428
+ target: "_blank",
429
+ rel: "noopener noreferrer",
430
+ className: "text-primary-600 dark:text-primary-400 inline-flex items-center gap-1.5 hover:underline",
431
+ onClick: (e) => e.stopPropagation(),
432
+ children: [
433
+ /* @__PURE__ */ jsx(Globe, { className: "h-3 w-3 opacity-60" }),
434
+ /* @__PURE__ */ jsx("span", { className: "truncate", children: displayDomain })
435
+ ]
436
+ }
437
+ );
438
+ }
439
+ function LinkedInRenderer(props) {
440
+ const { value } = props;
441
+ if (!value) return /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "--" });
442
+ return /* @__PURE__ */ jsxs(
443
+ "a",
444
+ {
445
+ href: value,
446
+ target: "_blank",
447
+ rel: "noopener noreferrer",
448
+ className: "inline-flex items-center gap-1.5 text-[#0A66C2] hover:underline",
449
+ onClick: (e) => e.stopPropagation(),
450
+ children: [
451
+ /* @__PURE__ */ jsx(Linkedin, { className: "h-4 w-4" }),
452
+ /* @__PURE__ */ jsx("span", { className: "truncate text-sm", children: "LinkedIn" })
453
+ ]
454
+ }
455
+ );
456
+ }
457
+ function CurrencyRenderer(props) {
458
+ const { value } = props;
459
+ if (value == null) return /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "--" });
460
+ const formatted = new Intl.NumberFormat("en-US", {
461
+ style: "currency",
462
+ currency: "USD",
463
+ minimumFractionDigits: 0,
464
+ maximumFractionDigits: 0
465
+ }).format(value);
466
+ return /* @__PURE__ */ jsx("span", { className: "text-foreground font-medium tabular-nums", children: formatted });
467
+ }
468
+ function NumberRenderer(props) {
469
+ const { value } = props;
470
+ if (value == null) return /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "--" });
471
+ const formatted = Number(value).toLocaleString();
472
+ return /* @__PURE__ */ jsx("span", { className: "text-foreground tabular-nums", children: formatted });
473
+ }
474
+ function DateRenderer(props) {
475
+ const { value, format = "medium" } = props;
476
+ if (!value) return /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "--" });
477
+ const date = value instanceof Date ? value : new Date(value);
478
+ if (isNaN(date.getTime())) {
479
+ return /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "--" });
480
+ }
481
+ if (format === "relative") {
482
+ const now = /* @__PURE__ */ new Date();
483
+ const diff = now.getTime() - date.getTime();
484
+ const days = Math.floor(diff / (1e3 * 60 * 60 * 24));
485
+ let relativeText;
486
+ if (days === 0) {
487
+ relativeText = "Today";
488
+ } else if (days === 1) {
489
+ relativeText = "Yesterday";
490
+ } else if (days < 7) {
491
+ relativeText = `${days} days ago`;
492
+ } else if (days < 30) {
493
+ const weeks = Math.floor(days / 7);
494
+ relativeText = `${weeks} week${weeks > 1 ? "s" : ""} ago`;
495
+ } else if (days < 365) {
496
+ const months = Math.floor(days / 30);
497
+ relativeText = `${months} month${months > 1 ? "s" : ""} ago`;
498
+ } else {
499
+ const years = Math.floor(days / 365);
500
+ relativeText = `${years} year${years > 1 ? "s" : ""} ago`;
501
+ }
502
+ return /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: relativeText });
503
+ }
504
+ const dateOptions = format === "short" ? { month: "numeric", day: "numeric" } : format === "long" ? { month: "long", day: "numeric", year: "numeric" } : { month: "short", day: "numeric", year: "numeric" };
505
+ if (format === "datetime") {
506
+ const formatted2 = date.toLocaleDateString("en-US", {
507
+ month: "short",
508
+ day: "numeric",
509
+ year: "numeric",
510
+ hour: "numeric",
511
+ minute: "2-digit"
512
+ });
513
+ return /* @__PURE__ */ jsx("span", { className: "text-foreground", children: formatted2 });
514
+ }
515
+ const formatted = date.toLocaleDateString("en-US", dateOptions);
516
+ return /* @__PURE__ */ jsx("span", { className: "text-foreground", children: formatted });
517
+ }
518
+ function BooleanRenderer(props) {
519
+ const { value } = props;
520
+ if (value == null) return /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "--" });
521
+ const isTrue = Boolean(value);
522
+ return /* @__PURE__ */ jsxs(
523
+ "span",
524
+ {
525
+ className: cn(
526
+ "inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium",
527
+ isTrue ? "bg-green-100 text-green-600 dark:bg-green-900/30 dark:text-green-400" : "bg-gray-200 text-gray-600 dark:bg-gray-700 dark:text-gray-400"
528
+ ),
529
+ children: [
530
+ isTrue ? /* @__PURE__ */ jsx(CheckCircle, { className: "h-3 w-3" }) : /* @__PURE__ */ jsx(Clock, { className: "h-3 w-3" }),
531
+ isTrue ? "Yes" : "No"
532
+ ]
533
+ }
534
+ );
535
+ }
536
+ function CompanyRenderer(props) {
537
+ const { data, value } = props;
538
+ if (!value) return /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "--" });
539
+ const domain = props.domainField && data ? getNestedValue(data, props.domainField) : data?.company?.domain || data?.domain;
540
+ const faviconUrl = getFaviconUrl(domain);
541
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 py-0.5", children: [
542
+ faviconUrl ? /* @__PURE__ */ jsx(
543
+ "img",
544
+ {
545
+ src: faviconUrl,
546
+ alt: value,
547
+ className: "h-5 w-5 rounded bg-white object-contain",
548
+ onError: (e) => {
549
+ const target = e.target;
550
+ target.style.display = "none";
551
+ const sibling = target.nextElementSibling;
552
+ if (sibling) sibling.style.display = "flex";
553
+ }
554
+ }
555
+ ) : null,
556
+ /* @__PURE__ */ jsx(
557
+ "div",
558
+ {
559
+ className: "bg-primary-100 text-primary-600 dark:bg-primary-900/30 dark:text-primary-400 flex h-5 w-5 items-center justify-center rounded text-[9px] font-semibold",
560
+ style: { display: faviconUrl ? "none" : "flex" },
561
+ children: getInitials(value)
562
+ }
563
+ ),
564
+ /* @__PURE__ */ jsx("span", { className: "truncate font-medium", children: value })
565
+ ] });
566
+ }
567
+ function ProgressRenderer(props) {
568
+ const { value, barColor = "bg-primary-500", max = 100 } = props;
569
+ if (value == null) return /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "--" });
570
+ const percentage = Math.min(100, Math.max(0, Number(value) / max * 100));
571
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 py-1", children: [
572
+ /* @__PURE__ */ jsx("div", { className: "h-2 w-20 overflow-hidden rounded-full bg-gray-200 dark:bg-gray-700", children: /* @__PURE__ */ jsx(
573
+ "div",
574
+ {
575
+ className: cn("h-full rounded-full transition-all", barColor),
576
+ style: { width: `${percentage}%` }
577
+ }
578
+ ) }),
579
+ /* @__PURE__ */ jsxs("span", { className: "text-muted-foreground text-xs font-medium", children: [
580
+ Math.round(percentage),
581
+ "%"
582
+ ] })
583
+ ] });
584
+ }
585
+ function TagsRenderer(props) {
586
+ const { value } = props;
587
+ if (!value || !Array.isArray(value) || value.length === 0) {
588
+ return /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "--" });
589
+ }
590
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-1", children: [
591
+ value.slice(0, 3).map((tag, index) => /* @__PURE__ */ jsx(
592
+ "span",
593
+ {
594
+ className: "inline-flex items-center rounded-full bg-gray-100 px-2 py-0.5 text-xs font-medium text-gray-600 dark:bg-gray-800 dark:text-gray-400",
595
+ children: tag
596
+ },
597
+ index
598
+ )),
599
+ value.length > 3 && /* @__PURE__ */ jsxs("span", { className: "text-muted-foreground text-xs", children: [
600
+ "+",
601
+ value.length - 3
602
+ ] })
603
+ ] });
604
+ }
605
+ var MemoizedAvatarNameRenderer = memo(
606
+ AvatarNameRenderer,
607
+ cellRendererPropsAreEqual
608
+ );
609
+ var MemoizedStatusBadgeRenderer = memo(
610
+ StatusBadgeRenderer,
611
+ cellRendererPropsAreEqual
612
+ );
613
+ var MemoizedEngagementScoreRenderer = memo(
614
+ EngagementScoreRenderer,
615
+ cellRendererPropsAreEqual
616
+ );
617
+ var MemoizedEmailRenderer = memo(
618
+ EmailRenderer,
619
+ cellRendererPropsAreEqual
620
+ );
621
+ var MemoizedPhoneRenderer = memo(
622
+ PhoneRenderer,
623
+ cellRendererPropsAreEqual
624
+ );
625
+ var MemoizedLinkedInRenderer = memo(
626
+ LinkedInRenderer,
627
+ cellRendererPropsAreEqual
628
+ );
629
+ var MemoizedDomainRenderer = memo(
630
+ DomainRenderer,
631
+ cellRendererPropsAreEqual
632
+ );
633
+ var MemoizedCurrencyRenderer = memo(
634
+ CurrencyRenderer,
635
+ cellRendererPropsAreEqual
636
+ );
637
+ var MemoizedNumberRenderer = memo(
638
+ NumberRenderer,
639
+ cellRendererPropsAreEqual
640
+ );
641
+ var MemoizedDateRenderer = memo(
642
+ DateRenderer,
643
+ cellRendererPropsAreEqual
644
+ );
645
+ var MemoizedBooleanRenderer = memo(
646
+ BooleanRenderer,
647
+ cellRendererPropsAreEqual
648
+ );
649
+ var MemoizedCompanyRenderer = memo(
650
+ CompanyRenderer,
651
+ cellRendererPropsAreEqual
652
+ );
653
+ var MemoizedProgressRenderer = memo(
654
+ ProgressRenderer,
655
+ cellRendererPropsAreEqual
656
+ );
657
+ var MemoizedTagsRenderer = memo(
658
+ TagsRenderer,
659
+ cellRendererPropsAreEqual
660
+ );
661
+ var CellRenderers = {
662
+ // Original renderers
663
+ AvatarNameRenderer,
664
+ StatusBadgeRenderer,
665
+ EngagementScoreRenderer,
666
+ EmailRenderer,
667
+ PhoneRenderer,
668
+ LinkedInRenderer,
669
+ DomainRenderer,
670
+ CurrencyRenderer,
671
+ NumberRenderer,
672
+ DateRenderer,
673
+ BooleanRenderer,
674
+ CompanyRenderer,
675
+ ProgressRenderer,
676
+ TagsRenderer,
677
+ // Memoized renderers (recommended for performance)
678
+ MemoizedAvatarNameRenderer,
679
+ MemoizedStatusBadgeRenderer,
680
+ MemoizedEngagementScoreRenderer,
681
+ MemoizedEmailRenderer,
682
+ MemoizedPhoneRenderer,
683
+ MemoizedLinkedInRenderer,
684
+ MemoizedDomainRenderer,
685
+ MemoizedCurrencyRenderer,
686
+ MemoizedNumberRenderer,
687
+ MemoizedDateRenderer,
688
+ MemoizedBooleanRenderer,
689
+ MemoizedCompanyRenderer,
690
+ MemoizedProgressRenderer,
691
+ MemoizedTagsRenderer,
692
+ // Utility functions
693
+ formatPhoneDisplay
694
+ };
695
+
696
+ export { AGGrid, AvatarNameRenderer, BooleanRenderer, CellRenderers, CompanyRenderer, CurrencyRenderer, DateRenderer, DomainRenderer, EmailRenderer, EngagementScoreRenderer, LinkedInRenderer, MemoizedAvatarNameRenderer, MemoizedBooleanRenderer, MemoizedCompanyRenderer, MemoizedCurrencyRenderer, MemoizedDateRenderer, MemoizedDomainRenderer, MemoizedEmailRenderer, MemoizedEngagementScoreRenderer, MemoizedLinkedInRenderer, MemoizedNumberRenderer, MemoizedPhoneRenderer, MemoizedProgressRenderer, MemoizedStatusBadgeRenderer, MemoizedTagsRenderer, NumberRenderer, PhoneRenderer, ProgressRenderer, StatusBadgeRenderer, TagsRenderer, formatPhoneDisplay, statusColors };
697
+ //# sourceMappingURL=ag-grid.js.map
698
+ //# sourceMappingURL=ag-grid.js.map