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