@opensite/ui 1.3.2 → 1.3.4

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 (167) hide show
  1. package/dist/footer-accordion-social.cjs +1344 -0
  2. package/dist/footer-accordion-social.d.cts +154 -0
  3. package/dist/footer-accordion-social.d.ts +154 -0
  4. package/dist/footer-accordion-social.js +1322 -0
  5. package/dist/footer-info-cards-accordion.cjs +1427 -0
  6. package/dist/footer-info-cards-accordion.d.cts +278 -0
  7. package/dist/footer-info-cards-accordion.d.ts +278 -0
  8. package/dist/footer-info-cards-accordion.js +1404 -0
  9. package/dist/footer-newsletter-contact.cjs +1281 -0
  10. package/dist/footer-newsletter-contact.d.cts +163 -0
  11. package/dist/footer-newsletter-contact.d.ts +163 -0
  12. package/dist/footer-newsletter-contact.js +1259 -0
  13. package/dist/footer-split-image-accordion.cjs +1395 -0
  14. package/dist/footer-split-image-accordion.d.cts +236 -0
  15. package/dist/footer-split-image-accordion.d.ts +236 -0
  16. package/dist/footer-split-image-accordion.js +1372 -0
  17. package/dist/list-achievements-showcase.cjs +1141 -0
  18. package/dist/list-achievements-showcase.d.cts +131 -0
  19. package/dist/list-achievements-showcase.d.ts +131 -0
  20. package/dist/list-achievements-showcase.js +1119 -0
  21. package/dist/list-career-timeline.cjs +531 -0
  22. package/dist/list-career-timeline.d.cts +153 -0
  23. package/dist/list-career-timeline.d.ts +153 -0
  24. package/dist/list-career-timeline.js +509 -0
  25. package/dist/list-feature-comparison.cjs +1211 -0
  26. package/dist/list-feature-comparison.d.cts +189 -0
  27. package/dist/list-feature-comparison.d.ts +189 -0
  28. package/dist/list-feature-comparison.js +1190 -0
  29. package/dist/list-metrics-dashboard.cjs +1402 -0
  30. package/dist/list-metrics-dashboard.d.cts +191 -0
  31. package/dist/list-metrics-dashboard.d.ts +191 -0
  32. package/dist/list-metrics-dashboard.js +1379 -0
  33. package/dist/list-service-category-table.cjs +762 -0
  34. package/dist/list-service-category-table.d.cts +135 -0
  35. package/dist/list-service-category-table.d.ts +135 -0
  36. package/dist/list-service-category-table.js +741 -0
  37. package/dist/offer-modal-membership-image.cjs +1361 -0
  38. package/dist/offer-modal-membership-image.d.cts +194 -0
  39. package/dist/offer-modal-membership-image.d.ts +194 -0
  40. package/dist/offer-modal-membership-image.js +1339 -0
  41. package/dist/offer-modal-newsletter-discount.cjs +1296 -0
  42. package/dist/offer-modal-newsletter-discount.d.cts +164 -0
  43. package/dist/offer-modal-newsletter-discount.d.ts +164 -0
  44. package/dist/offer-modal-newsletter-discount.js +1274 -0
  45. package/dist/offer-modal-sheet-newsletter.cjs +1360 -0
  46. package/dist/offer-modal-sheet-newsletter.d.cts +221 -0
  47. package/dist/offer-modal-sheet-newsletter.d.ts +221 -0
  48. package/dist/offer-modal-sheet-newsletter.js +1337 -0
  49. package/dist/pricing-addons-cards.cjs +1143 -0
  50. package/dist/pricing-addons-cards.d.cts +203 -0
  51. package/dist/pricing-addons-cards.d.ts +203 -0
  52. package/dist/pricing-addons-cards.js +1122 -0
  53. package/dist/pricing-addons-featured.cjs +1224 -0
  54. package/dist/pricing-addons-featured.d.cts +271 -0
  55. package/dist/pricing-addons-featured.d.ts +271 -0
  56. package/dist/pricing-addons-featured.js +1203 -0
  57. package/dist/pricing-collapsible-plans.cjs +1315 -0
  58. package/dist/pricing-collapsible-plans.d.cts +258 -0
  59. package/dist/pricing-collapsible-plans.d.ts +258 -0
  60. package/dist/pricing-collapsible-plans.js +1294 -0
  61. package/dist/pricing-columns-toggle.cjs +1234 -0
  62. package/dist/pricing-columns-toggle.d.cts +251 -0
  63. package/dist/pricing-columns-toggle.d.ts +251 -0
  64. package/dist/pricing-columns-toggle.js +1212 -0
  65. package/dist/pricing-comparison-headers.cjs +1235 -0
  66. package/dist/pricing-comparison-headers.d.cts +245 -0
  67. package/dist/pricing-comparison-headers.d.ts +245 -0
  68. package/dist/pricing-comparison-headers.js +1213 -0
  69. package/dist/pricing-comparison-table.cjs +1374 -0
  70. package/dist/pricing-comparison-table.d.cts +280 -0
  71. package/dist/pricing-comparison-table.d.ts +280 -0
  72. package/dist/pricing-comparison-table.js +1352 -0
  73. package/dist/pricing-discount-card.cjs +1217 -0
  74. package/dist/pricing-discount-card.d.cts +195 -0
  75. package/dist/pricing-discount-card.d.ts +195 -0
  76. package/dist/pricing-discount-card.js +1195 -0
  77. package/dist/pricing-enterprise-contact.cjs +1094 -0
  78. package/dist/pricing-enterprise-contact.d.cts +170 -0
  79. package/dist/pricing-enterprise-contact.d.ts +170 -0
  80. package/dist/pricing-enterprise-contact.js +1073 -0
  81. package/dist/pricing-feature-matrix.cjs +1197 -0
  82. package/dist/pricing-feature-matrix.d.cts +56 -0
  83. package/dist/pricing-feature-matrix.d.ts +56 -0
  84. package/dist/pricing-feature-matrix.js +1174 -0
  85. package/dist/pricing-four-tier-toggle.cjs +1320 -0
  86. package/dist/pricing-four-tier-toggle.d.cts +266 -0
  87. package/dist/pricing-four-tier-toggle.d.ts +266 -0
  88. package/dist/pricing-four-tier-toggle.js +1297 -0
  89. package/dist/pricing-full-comparison.cjs +1301 -0
  90. package/dist/pricing-full-comparison.d.cts +265 -0
  91. package/dist/pricing-full-comparison.d.ts +265 -0
  92. package/dist/pricing-full-comparison.js +1279 -0
  93. package/dist/pricing-gradient-cards.cjs +1248 -0
  94. package/dist/pricing-gradient-cards.d.cts +258 -0
  95. package/dist/pricing-gradient-cards.d.ts +258 -0
  96. package/dist/pricing-gradient-cards.js +1226 -0
  97. package/dist/pricing-icon-headers.cjs +1163 -0
  98. package/dist/pricing-icon-headers.d.cts +218 -0
  99. package/dist/pricing-icon-headers.d.ts +218 -0
  100. package/dist/pricing-icon-headers.js +1142 -0
  101. package/dist/pricing-minimal-cards.cjs +1146 -0
  102. package/dist/pricing-minimal-cards.d.cts +210 -0
  103. package/dist/pricing-minimal-cards.d.ts +210 -0
  104. package/dist/pricing-minimal-cards.js +1125 -0
  105. package/dist/pricing-packages-radio.cjs +1203 -0
  106. package/dist/pricing-packages-radio.d.cts +243 -0
  107. package/dist/pricing-packages-radio.d.ts +243 -0
  108. package/dist/pricing-packages-radio.js +1182 -0
  109. package/dist/pricing-popular-highlight.cjs +1293 -0
  110. package/dist/pricing-popular-highlight.d.cts +255 -0
  111. package/dist/pricing-popular-highlight.d.ts +255 -0
  112. package/dist/pricing-popular-highlight.js +1271 -0
  113. package/dist/pricing-radio-toggle.cjs +1277 -0
  114. package/dist/pricing-radio-toggle.d.cts +251 -0
  115. package/dist/pricing-radio-toggle.d.ts +251 -0
  116. package/dist/pricing-radio-toggle.js +1255 -0
  117. package/dist/pricing-responsive-table.cjs +1229 -0
  118. package/dist/pricing-responsive-table.d.cts +55 -0
  119. package/dist/pricing-responsive-table.d.ts +55 -0
  120. package/dist/pricing-responsive-table.js +1206 -0
  121. package/dist/pricing-services-cards.cjs +1209 -0
  122. package/dist/pricing-services-cards.d.cts +230 -0
  123. package/dist/pricing-services-cards.d.ts +230 -0
  124. package/dist/pricing-services-cards.js +1188 -0
  125. package/dist/pricing-simple-card.cjs +1102 -0
  126. package/dist/pricing-simple-card.d.cts +174 -0
  127. package/dist/pricing-simple-card.d.ts +174 -0
  128. package/dist/pricing-simple-card.js +1081 -0
  129. package/dist/pricing-single-card.cjs +1174 -0
  130. package/dist/pricing-single-card.d.cts +201 -0
  131. package/dist/pricing-single-card.d.ts +201 -0
  132. package/dist/pricing-single-card.js +1152 -0
  133. package/dist/pricing-split-layout.cjs +1001 -0
  134. package/dist/pricing-split-layout.d.cts +44 -0
  135. package/dist/pricing-split-layout.d.ts +44 -0
  136. package/dist/pricing-split-layout.js +980 -0
  137. package/dist/pricing-spotlight-card.cjs +1157 -0
  138. package/dist/pricing-spotlight-card.d.cts +201 -0
  139. package/dist/pricing-spotlight-card.d.ts +201 -0
  140. package/dist/pricing-spotlight-card.js +1136 -0
  141. package/dist/pricing-switch-cards.cjs +1274 -0
  142. package/dist/pricing-switch-cards.d.cts +254 -0
  143. package/dist/pricing-switch-cards.d.ts +254 -0
  144. package/dist/pricing-switch-cards.js +1252 -0
  145. package/dist/pricing-tabs-toggle.cjs +1314 -0
  146. package/dist/pricing-tabs-toggle.d.cts +274 -0
  147. package/dist/pricing-tabs-toggle.d.ts +274 -0
  148. package/dist/pricing-tabs-toggle.js +1291 -0
  149. package/dist/pricing-tier-grid.cjs +1190 -0
  150. package/dist/pricing-tier-grid.d.cts +224 -0
  151. package/dist/pricing-tier-grid.d.ts +224 -0
  152. package/dist/pricing-tier-grid.js +1169 -0
  153. package/dist/pricing-toggle-cards.cjs +1330 -0
  154. package/dist/pricing-toggle-cards.d.cts +267 -0
  155. package/dist/pricing-toggle-cards.d.ts +267 -0
  156. package/dist/pricing-toggle-cards.js +1307 -0
  157. package/dist/pricing-toggle-period.cjs +1251 -0
  158. package/dist/pricing-toggle-period.d.cts +265 -0
  159. package/dist/pricing-toggle-period.d.ts +265 -0
  160. package/dist/pricing-toggle-period.js +1230 -0
  161. package/dist/pricing-two-column-basic.cjs +1243 -0
  162. package/dist/pricing-two-column-basic.d.cts +244 -0
  163. package/dist/pricing-two-column-basic.d.ts +244 -0
  164. package/dist/pricing-two-column-basic.js +1222 -0
  165. package/dist/registry.cjs +109 -85
  166. package/dist/registry.js +931 -907
  167. package/package.json +1 -1
@@ -0,0 +1,741 @@
1
+ "use client";
2
+ import * as React from 'react';
3
+ import React__default, { useMemo } from 'react';
4
+ import { clsx } from 'clsx';
5
+ import { twMerge } from 'tailwind-merge';
6
+ import { jsx, jsxs } from 'react/jsx-runtime';
7
+
8
+ // components/blocks/list/list-service-category-table.tsx
9
+ function cn(...inputs) {
10
+ return twMerge(clsx(inputs));
11
+ }
12
+ var svgCache = /* @__PURE__ */ new Map();
13
+ function DynamicIcon({
14
+ name,
15
+ size = 28,
16
+ color,
17
+ className,
18
+ alt
19
+ }) {
20
+ const [svgContent, setSvgContent] = React.useState(null);
21
+ const [isLoading, setIsLoading] = React.useState(true);
22
+ const [error, setError] = React.useState(null);
23
+ const { url, iconName } = React.useMemo(() => {
24
+ const separator = name.includes("/") ? "/" : ":";
25
+ const [prefix, iconName2] = name.split(separator);
26
+ const baseUrl = `https://icons.opensite.ai/api/icon/${prefix}/${iconName2}?format=svg&width=${size}&height=${size}`;
27
+ return {
28
+ url: baseUrl,
29
+ iconName: iconName2
30
+ };
31
+ }, [name, size]);
32
+ React.useEffect(() => {
33
+ let isMounted = true;
34
+ const fetchSvg = async () => {
35
+ const cached = svgCache.get(url);
36
+ if (cached) {
37
+ if (isMounted) {
38
+ setSvgContent(cached);
39
+ setIsLoading(false);
40
+ }
41
+ return;
42
+ }
43
+ try {
44
+ setIsLoading(true);
45
+ setError(null);
46
+ const response = await fetch(url);
47
+ if (!response.ok) {
48
+ throw new Error(`Failed to fetch icon: ${response.status}`);
49
+ }
50
+ let svg = await response.text();
51
+ svg = processSvgForCurrentColor(svg);
52
+ svgCache.set(url, svg);
53
+ if (isMounted) {
54
+ setSvgContent(svg);
55
+ setIsLoading(false);
56
+ }
57
+ } catch (err) {
58
+ if (isMounted) {
59
+ setError(err instanceof Error ? err.message : "Failed to load icon");
60
+ setIsLoading(false);
61
+ }
62
+ }
63
+ };
64
+ fetchSvg();
65
+ return () => {
66
+ isMounted = false;
67
+ };
68
+ }, [url]);
69
+ if (isLoading) {
70
+ return /* @__PURE__ */ jsx(
71
+ "span",
72
+ {
73
+ className: cn("inline-block", className),
74
+ style: { width: size, height: size },
75
+ "aria-hidden": "true"
76
+ }
77
+ );
78
+ }
79
+ if (error || !svgContent) {
80
+ return /* @__PURE__ */ jsx(
81
+ "span",
82
+ {
83
+ className: cn("inline-block", className),
84
+ style: { width: size, height: size },
85
+ role: "img",
86
+ "aria-label": alt || iconName
87
+ }
88
+ );
89
+ }
90
+ return /* @__PURE__ */ jsx(
91
+ "span",
92
+ {
93
+ className: cn("inline-flex items-center justify-center", className),
94
+ style: {
95
+ width: size,
96
+ height: size,
97
+ color: color || "inherit"
98
+ },
99
+ role: "img",
100
+ "aria-label": alt || iconName,
101
+ dangerouslySetInnerHTML: { __html: svgContent }
102
+ }
103
+ );
104
+ }
105
+ function processSvgForCurrentColor(svg) {
106
+ let processed = svg;
107
+ processed = processed.replace(
108
+ /stroke=["'](#000000|#000|black)["']/gi,
109
+ 'stroke="currentColor"'
110
+ );
111
+ processed = processed.replace(
112
+ /fill=["'](#000000|#000|black)["']/gi,
113
+ 'fill="currentColor"'
114
+ );
115
+ return processed;
116
+ }
117
+ function Table({ className, ...props }) {
118
+ return /* @__PURE__ */ jsx(
119
+ "div",
120
+ {
121
+ "data-slot": "table-container",
122
+ className: "relative w-full overflow-x-auto",
123
+ children: /* @__PURE__ */ jsx(
124
+ "table",
125
+ {
126
+ "data-slot": "table",
127
+ className: cn("w-full caption-bottom text-sm", className),
128
+ ...props
129
+ }
130
+ )
131
+ }
132
+ );
133
+ }
134
+ function TableHeader({ className, ...props }) {
135
+ return /* @__PURE__ */ jsx(
136
+ "thead",
137
+ {
138
+ "data-slot": "table-header",
139
+ className: cn("[&_tr]:border-b", className),
140
+ ...props
141
+ }
142
+ );
143
+ }
144
+ function TableBody({ className, ...props }) {
145
+ return /* @__PURE__ */ jsx(
146
+ "tbody",
147
+ {
148
+ "data-slot": "table-body",
149
+ className: cn("[&_tr:last-child]:border-0", className),
150
+ ...props
151
+ }
152
+ );
153
+ }
154
+ function TableRow({ className, ...props }) {
155
+ return /* @__PURE__ */ jsx(
156
+ "tr",
157
+ {
158
+ "data-slot": "table-row",
159
+ className: cn(
160
+ "hover:bg-muted/50 data-[state=selected]:bg-muted border-b transition-colors",
161
+ className
162
+ ),
163
+ ...props
164
+ }
165
+ );
166
+ }
167
+ function TableHead({ className, ...props }) {
168
+ return /* @__PURE__ */ jsx(
169
+ "th",
170
+ {
171
+ "data-slot": "table-head",
172
+ className: cn(
173
+ "text-foreground h-10 px-2 text-left align-middle font-medium whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",
174
+ className
175
+ ),
176
+ ...props
177
+ }
178
+ );
179
+ }
180
+ function TableCell({ className, ...props }) {
181
+ return /* @__PURE__ */ jsx(
182
+ "td",
183
+ {
184
+ "data-slot": "table-cell",
185
+ className: cn(
186
+ "p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",
187
+ className
188
+ ),
189
+ ...props
190
+ }
191
+ );
192
+ }
193
+ var maxWidthStyles = {
194
+ sm: "max-w-screen-sm",
195
+ md: "max-w-screen-md",
196
+ lg: "max-w-screen-lg",
197
+ xl: "max-w-7xl",
198
+ "2xl": "max-w-screen-2xl",
199
+ "4xl": "max-w-[1536px]",
200
+ full: "max-w-full"
201
+ };
202
+ var Container = React__default.forwardRef(
203
+ ({ children, maxWidth = "xl", className, as = "div", ...props }, ref) => {
204
+ const Component = as;
205
+ return /* @__PURE__ */ jsx(
206
+ Component,
207
+ {
208
+ ref,
209
+ className: cn(
210
+ "mx-auto w-full px-2 sm:px-4 lg:px-8",
211
+ maxWidthStyles[maxWidth],
212
+ className
213
+ ),
214
+ ...props,
215
+ children
216
+ }
217
+ );
218
+ }
219
+ );
220
+ Container.displayName = "Container";
221
+
222
+ // lib/patternSvgs.ts
223
+ var patternSvgs = {
224
+ squareAltGrid: "https://cdn.ing/assets/files/record/286187/4gpn0yq2ptra8iwlvmwwv860ggwv",
225
+ grid1: "https://cdn.ing/assets/files/record/286186/nbdflpgp4ostrno079hygibsflp3",
226
+ noise: "https://cdn.ing/assets/i/r/286188/zrqcp9hynh3j7p2laihwzfbujgrl/noise.png",
227
+ dots: "https://cdn.ing/assets/files/record/286198/yfsjx9thvtxzhl2qtshxyhkrm524",
228
+ dotPattern: "https://cdn.ing/assets/files/record/286192/7ig0cku8aqbboiza8nuk6hw0nnsr",
229
+ dotPattern2: "https://cdn.ing/assets/files/record/286189/arez6gd2s7isn9i1o6c7sexdq7bl",
230
+ circles: "https://cdn.ing/assets/files/record/286190/gtmia3sncjtzetdshc20zf1d3c17",
231
+ waves: "https://cdn.ing/assets/files/record/286191/mqlb33fzxz9cdth1bx7if0wmpkp1",
232
+ crossPattern: "https://cdn.ing/assets/files/record/286193/9yfqwdbnqaipbp7fsb3wbzzmq472",
233
+ architect: "https://cdn.ing/assets/files/record/286194/vgs88ugpvyhxu13wqgy0acvae6re",
234
+ tinyCheckers: "https://cdn.ing/assets/files/record/286195/65efaknsw8kcpf9o3c2gybytsl5b",
235
+ p6: "https://cdn.ing/assets/i/r/286196/6kl0rqnd6mjk8j7e525fo8fo0vkc/p6.webp"
236
+ };
237
+ var maskTop = "radial-gradient(ellipse 70% 60% at 50% 0%, #000 60%, transparent 100%)";
238
+ var maskBottom = "radial-gradient(ellipse 100% 80% at 50% 100%, #000 50%, transparent 90%)";
239
+ var maskCenter = "radial-gradient(ellipse 60% 60% at 50% 50%, #000 30%, transparent 70%)";
240
+ var maskTopLeft = "radial-gradient(ellipse 80% 80% at 0% 0%, #000 50%, transparent 90%)";
241
+ var maskTopRight = "radial-gradient(ellipse 80% 80% at 100% 0%, #000 50%, transparent 90%)";
242
+ var maskBottomLeft = "radial-gradient(ellipse 80% 80% at 0% 100%, #000 50%, transparent 90%)";
243
+ var maskBottomRight = "radial-gradient(ellipse 80% 80% at 100% 100%, #000 50%, transparent 90%)";
244
+ var circuitBoardPattern = (id, mask) => /* @__PURE__ */ jsxs(
245
+ "svg",
246
+ {
247
+ className: "h-full w-full",
248
+ xmlns: "http://www.w3.org/2000/svg",
249
+ style: mask ? {
250
+ maskImage: mask,
251
+ WebkitMaskImage: mask
252
+ } : void 0,
253
+ children: [
254
+ /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsxs(
255
+ "pattern",
256
+ {
257
+ id,
258
+ x: "0",
259
+ y: "0",
260
+ width: "100",
261
+ height: "100",
262
+ patternUnits: "userSpaceOnUse",
263
+ children: [
264
+ /* @__PURE__ */ jsx(
265
+ "path",
266
+ {
267
+ d: "M0 50h40M60 50h40M50 0v40M50 60v40",
268
+ stroke: "hsl(var(--muted))",
269
+ strokeWidth: "1",
270
+ fill: "none"
271
+ }
272
+ ),
273
+ /* @__PURE__ */ jsx("circle", { cx: "50", cy: "50", r: "3", fill: "hsl(var(--muted))" }),
274
+ /* @__PURE__ */ jsx("circle", { cx: "0", cy: "50", r: "2", fill: "hsl(var(--muted))" }),
275
+ /* @__PURE__ */ jsx("circle", { cx: "100", cy: "50", r: "2", fill: "hsl(var(--muted))" }),
276
+ /* @__PURE__ */ jsx("circle", { cx: "50", cy: "0", r: "2", fill: "hsl(var(--muted))" }),
277
+ /* @__PURE__ */ jsx("circle", { cx: "50", cy: "100", r: "2", fill: "hsl(var(--muted))" })
278
+ ]
279
+ }
280
+ ) }),
281
+ /* @__PURE__ */ jsx("rect", { width: "100%", height: "100%", fill: `url(#${id})` })
282
+ ]
283
+ }
284
+ );
285
+ var gridDotsPattern = (id, mask) => /* @__PURE__ */ jsxs(
286
+ "svg",
287
+ {
288
+ className: "h-full w-full",
289
+ xmlns: "http://www.w3.org/2000/svg",
290
+ style: mask ? {
291
+ maskImage: mask,
292
+ WebkitMaskImage: mask
293
+ } : void 0,
294
+ children: [
295
+ /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsxs(
296
+ "pattern",
297
+ {
298
+ id,
299
+ x: "0",
300
+ y: "0",
301
+ width: "40",
302
+ height: "40",
303
+ patternUnits: "userSpaceOnUse",
304
+ children: [
305
+ /* @__PURE__ */ jsx(
306
+ "path",
307
+ {
308
+ d: "M0 20h40M20 0v40",
309
+ stroke: "hsl(var(--muted))",
310
+ strokeWidth: "0.5",
311
+ fill: "none"
312
+ }
313
+ ),
314
+ /* @__PURE__ */ jsx("circle", { cx: "20", cy: "20", r: "2", fill: "hsl(var(--muted))" })
315
+ ]
316
+ }
317
+ ) }),
318
+ /* @__PURE__ */ jsx("rect", { width: "100%", height: "100%", fill: `url(#${id})` })
319
+ ]
320
+ }
321
+ );
322
+ var gridPattern = (size, mask) => /* @__PURE__ */ jsx(
323
+ "div",
324
+ {
325
+ className: "h-full w-full bg-[linear-gradient(to_right,_hsl(var(--muted))_1px,_transparent_1px),linear-gradient(to_bottom,_hsl(var(--muted))_1px,_transparent_1px)]",
326
+ style: {
327
+ backgroundSize: `${size}px ${size}px`,
328
+ ...mask ? {
329
+ maskImage: mask,
330
+ WebkitMaskImage: mask
331
+ } : {}
332
+ }
333
+ }
334
+ );
335
+ var diagonalCrossPattern = (mask) => /* @__PURE__ */ jsx(
336
+ "div",
337
+ {
338
+ className: "h-full w-full",
339
+ style: {
340
+ backgroundImage: "repeating-linear-gradient(45deg, transparent, transparent 32px, hsl(var(--muted)) 32px, hsl(var(--muted)) 33px), repeating-linear-gradient(135deg, transparent, transparent 32px, hsl(var(--muted)) 32px, hsl(var(--muted)) 33px)",
341
+ ...mask ? {
342
+ maskImage: mask,
343
+ WebkitMaskImage: mask
344
+ } : {}
345
+ }
346
+ }
347
+ );
348
+ var dashedGridMaskBase = "repeating-linear-gradient(to right, black 0px, black 3px, transparent 3px, transparent 8px), repeating-linear-gradient(to bottom, black 0px, black 3px, transparent 3px, transparent 8px)";
349
+ var dashedGridPattern = (fadeMask) => {
350
+ const mask = fadeMask ? `${dashedGridMaskBase}, ${fadeMask}` : dashedGridMaskBase;
351
+ return /* @__PURE__ */ jsx(
352
+ "div",
353
+ {
354
+ className: "h-full w-full",
355
+ style: {
356
+ backgroundImage: "linear-gradient(to right, hsl(var(--muted)) 1px, transparent 1px), linear-gradient(to bottom, hsl(var(--muted)) 1px, transparent 1px)",
357
+ backgroundSize: "20px 20px",
358
+ backgroundPosition: "0 0, 0 0",
359
+ maskImage: mask,
360
+ WebkitMaskImage: mask,
361
+ maskComposite: "intersect",
362
+ WebkitMaskComposite: "source-in"
363
+ }
364
+ }
365
+ );
366
+ };
367
+ var gradientGlow = (position) => /* @__PURE__ */ jsx(
368
+ "div",
369
+ {
370
+ className: cn(
371
+ "pointer-events-none absolute left-1/2 z-0 aspect-square w-3/4 -translate-x-1/2 rounded-full opacity-50 blur-3xl",
372
+ position === "top" ? "-top-1/4" : "-bottom-1/4"
373
+ ),
374
+ style: {
375
+ background: "radial-gradient(circle, hsl(var(--primary)) 0%, transparent 70%)"
376
+ }
377
+ }
378
+ );
379
+ var spotlight = (position) => /* @__PURE__ */ jsx(
380
+ "div",
381
+ {
382
+ className: cn(
383
+ "pointer-events-none absolute top-1/2 z-0 aspect-square w-3/4 -translate-y-1/2 rounded-full opacity-40 blur-3xl",
384
+ position === "left" ? "-left-1/4" : "-right-1/4"
385
+ ),
386
+ style: {
387
+ background: "radial-gradient(circle, hsl(var(--primary)) 0%, transparent 70%)"
388
+ }
389
+ }
390
+ );
391
+ var patternOverlays = {
392
+ circuitBoardBasic: () => circuitBoardPattern("circuit-board-basic"),
393
+ circuitBoardFadeTop: () => circuitBoardPattern("circuit-board-fade-top", maskTop),
394
+ circuitBoardFadeBottom: () => circuitBoardPattern("circuit-board-fade-bottom", maskBottom),
395
+ circuitBoardFadeCenter: () => circuitBoardPattern("circuit-board-fade-center", maskCenter),
396
+ circuitBoardFadeTopLeft: () => circuitBoardPattern("circuit-board-fade-top-left", maskTopLeft),
397
+ circuitBoardFadeTopRight: () => circuitBoardPattern("circuit-board-fade-top-right", maskTopRight),
398
+ circuitBoardFadeBottomLeft: () => circuitBoardPattern("circuit-board-fade-bottom-left", maskBottomLeft),
399
+ circuitBoardFadeBottomRight: () => circuitBoardPattern("circuit-board-fade-bottom-right", maskBottomRight),
400
+ dashedGridBasic: () => dashedGridPattern(),
401
+ dashedGridFadeTop: () => dashedGridPattern(maskTop),
402
+ dashedGridFadeBottom: () => dashedGridPattern(maskBottom),
403
+ dashedGridFadeCenter: () => dashedGridPattern(maskCenter),
404
+ dashedGridFadeTopLeft: () => dashedGridPattern(maskTopLeft),
405
+ dashedGridFadeTopRight: () => dashedGridPattern(maskTopRight),
406
+ dashedGridFadeBottomLeft: () => dashedGridPattern(maskBottomLeft),
407
+ dashedGridFadeBottomRight: () => dashedGridPattern(maskBottomRight),
408
+ diagonalCrossBasic: () => diagonalCrossPattern(),
409
+ diagonalCrossFadeTop: () => diagonalCrossPattern(maskTop),
410
+ diagonalCrossFadeBottom: () => diagonalCrossPattern(maskBottom),
411
+ diagonalCrossFadeCenter: () => diagonalCrossPattern(maskCenter),
412
+ diagonalCrossFadeTopLeft: () => diagonalCrossPattern(maskTopLeft),
413
+ diagonalCrossFadeTopRight: () => diagonalCrossPattern(maskTopRight),
414
+ diagonalCrossFadeBottomLeft: () => diagonalCrossPattern(maskBottomLeft),
415
+ diagonalCrossFadeBottomRight: () => diagonalCrossPattern(maskBottomRight),
416
+ gridBasic: () => gridPattern(40),
417
+ gridFadeTop: () => gridPattern(32, maskTop),
418
+ gridFadeBottom: () => gridPattern(32, maskBottom),
419
+ gridFadeCenter: () => gridPattern(40, maskCenter),
420
+ gridFadeTopLeft: () => gridPattern(32, maskTopLeft),
421
+ gridFadeTopRight: () => gridPattern(32, maskTopRight),
422
+ gridFadeBottomLeft: () => gridPattern(32, maskBottomLeft),
423
+ gridFadeBottomRight: () => gridPattern(32, maskBottomRight),
424
+ gridDotsBasic: () => gridDotsPattern("grid-dots-basic"),
425
+ gridDotsFadeCenter: () => gridDotsPattern("grid-dots-fade-center", maskCenter),
426
+ gradientGlowTop: () => gradientGlow("top"),
427
+ gradientGlowBottom: () => gradientGlow("bottom"),
428
+ spotlightLeft: () => spotlight("left"),
429
+ spotlightRight: () => spotlight("right")
430
+ };
431
+ var inlinePatternStyles = {
432
+ radialGradientTop: {
433
+ background: "radial-gradient(125% 125% at 50% 10%, hsl(var(--background)) 40%, hsl(var(--primary)) 100%)"
434
+ },
435
+ radialGradientBottom: {
436
+ background: "radial-gradient(125% 125% at 50% 90%, hsl(var(--background)) 40%, hsl(var(--primary)) 100%)"
437
+ }
438
+ };
439
+ function PatternBackground({
440
+ pattern,
441
+ opacity = 0.08,
442
+ className,
443
+ style
444
+ }) {
445
+ if (!pattern) {
446
+ return null;
447
+ }
448
+ if (pattern in inlinePatternStyles) {
449
+ const inlineStyle = inlinePatternStyles[pattern];
450
+ return /* @__PURE__ */ jsx(
451
+ "div",
452
+ {
453
+ className: cn("pointer-events-none absolute inset-0 z-0", className),
454
+ style: { ...inlineStyle, opacity, ...style },
455
+ "aria-hidden": "true"
456
+ }
457
+ );
458
+ }
459
+ if (pattern in patternOverlays) {
460
+ const Overlay = patternOverlays[pattern];
461
+ return /* @__PURE__ */ jsx(
462
+ "div",
463
+ {
464
+ className: cn("pointer-events-none absolute inset-0 z-0", className),
465
+ style: { opacity, ...style },
466
+ "aria-hidden": "true",
467
+ children: Overlay()
468
+ }
469
+ );
470
+ }
471
+ const patternUrl = pattern in patternSvgs ? patternSvgs[pattern] : pattern;
472
+ return /* @__PURE__ */ jsx(
473
+ "div",
474
+ {
475
+ className: cn("pointer-events-none absolute inset-0 z-0", className),
476
+ style: {
477
+ backgroundImage: `url(${patternUrl})`,
478
+ backgroundRepeat: "repeat",
479
+ backgroundSize: "auto",
480
+ opacity,
481
+ ...style
482
+ },
483
+ "aria-hidden": "true"
484
+ }
485
+ );
486
+ }
487
+ var backgroundStyles = {
488
+ default: "bg-background text-foreground",
489
+ white: "bg-white text-dark",
490
+ gray: "bg-muted/30 text-foreground",
491
+ dark: "bg-foreground text-background",
492
+ transparent: "bg-transparent text-foreground",
493
+ gradient: "bg-linear-to-br from-primary via-primary/90 to-foreground text-primary-foreground",
494
+ primary: "bg-primary text-primary-foreground",
495
+ secondary: "bg-secondary text-secondary-foreground",
496
+ muted: "bg-muted text-muted-foreground"
497
+ };
498
+ var spacingStyles = {
499
+ none: "py-0 md:py-0",
500
+ sm: "py-12 md:py-16",
501
+ md: "py-16 md:py-24",
502
+ lg: "py-20 md:py-32",
503
+ xl: "py-24 md:py-40"
504
+ };
505
+ var predefinedSpacings = ["none", "sm", "md", "lg", "xl"];
506
+ var isPredefinedSpacing = (spacing) => predefinedSpacings.includes(spacing);
507
+ var Section = React__default.forwardRef(
508
+ ({
509
+ id,
510
+ title,
511
+ subtitle,
512
+ children,
513
+ className,
514
+ style,
515
+ background = "default",
516
+ spacing = "lg",
517
+ pattern,
518
+ patternOpacity,
519
+ patternClassName,
520
+ containerClassName,
521
+ containerMaxWidth = "xl",
522
+ ...props
523
+ }, ref) => {
524
+ const effectivePatternOpacity = patternOpacity !== void 0 ? patternOpacity : pattern ? 1 : 0;
525
+ return /* @__PURE__ */ jsxs(
526
+ "section",
527
+ {
528
+ ref,
529
+ id,
530
+ className: cn(
531
+ "relative",
532
+ pattern ? "overflow-hidden" : null,
533
+ backgroundStyles[background],
534
+ isPredefinedSpacing(spacing) ? spacingStyles[spacing] : spacing,
535
+ className
536
+ ),
537
+ style,
538
+ ...props,
539
+ children: [
540
+ /* @__PURE__ */ jsx(
541
+ PatternBackground,
542
+ {
543
+ pattern,
544
+ opacity: effectivePatternOpacity,
545
+ className: patternClassName
546
+ }
547
+ ),
548
+ /* @__PURE__ */ jsxs(
549
+ Container,
550
+ {
551
+ maxWidth: containerMaxWidth,
552
+ className: cn("relative z-10", containerClassName),
553
+ children: [
554
+ (title || subtitle) && /* @__PURE__ */ jsxs("div", { className: "mb-6 text-center md:mb-16", children: [
555
+ subtitle && /* @__PURE__ */ jsx("p", { className: "mb-2 text-sm font-semibold uppercase tracking-wider", children: subtitle }),
556
+ title && /* @__PURE__ */ jsx("h2", { className: "text-3xl font-bold tracking-tight md:text-4xl lg:text-5xl", children: title })
557
+ ] }),
558
+ children
559
+ ]
560
+ }
561
+ )
562
+ ]
563
+ }
564
+ );
565
+ }
566
+ );
567
+ Section.displayName = "Section";
568
+ function ListServiceCategoryTable({
569
+ heading,
570
+ headingClassName,
571
+ description,
572
+ descriptionClassName,
573
+ items,
574
+ itemsSlot,
575
+ tableWrapperClassName,
576
+ tableClassName,
577
+ headerClassName,
578
+ headerCellClassName,
579
+ rowClassName,
580
+ cellClassName,
581
+ containerClassName,
582
+ className,
583
+ background,
584
+ spacing,
585
+ pattern,
586
+ patternOpacity
587
+ }) {
588
+ const renderItems = useMemo(() => {
589
+ if (itemsSlot) return itemsSlot;
590
+ if (!items || items.length === 0) return null;
591
+ return items.map((item, idx) => /* @__PURE__ */ jsxs(
592
+ TableRow,
593
+ {
594
+ className: rowClassName,
595
+ children: [
596
+ /* @__PURE__ */ jsx(TableCell, { className: cellClassName, children: /* @__PURE__ */ jsx("div", { className: "flex items-center gap-2 align-top", children: item.icon && /* @__PURE__ */ jsx(
597
+ DynamicIcon,
598
+ {
599
+ name: item.icon,
600
+ size: 24
601
+ }
602
+ ) }) }),
603
+ /* @__PURE__ */ jsx(TableCell, { className: cn("hidden md:table-cell", cellClassName), children: item.category }),
604
+ /* @__PURE__ */ jsx(TableCell, { className: cn("pl-0 align-top md:pl-4", cellClassName), children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
605
+ /* @__PURE__ */ jsxs("div", { className: "flex items-baseline justify-between gap-1 md:hidden", children: [
606
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
607
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-medium", children: item.category }),
608
+ /* @__PURE__ */ jsxs("span", { className: "text-sm text-muted-foreground", children: [
609
+ "- ",
610
+ item.segment
611
+ ] }),
612
+ /* @__PURE__ */ jsx(
613
+ "span",
614
+ {
615
+ className: cn(
616
+ "ml-1 block h-1.5 w-4 rounded-full md:hidden",
617
+ item.offer === "Free" && "bg-accent",
618
+ item.offer === "Professional" && "bg-primary",
619
+ item.offer === "Enterprise" && "bg-secondary"
620
+ )
621
+ }
622
+ )
623
+ ] }),
624
+ /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: item.year })
625
+ ] }),
626
+ item.description && (typeof item.description === "string" ? /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground md:text-primary", children: item.description }) : /* @__PURE__ */ jsx("div", { className: "text-sm text-muted-foreground md:text-primary", children: item.description }))
627
+ ] }) }),
628
+ /* @__PURE__ */ jsx(
629
+ TableCell,
630
+ {
631
+ className: cn("hidden text-right md:table-cell", cellClassName),
632
+ children: item.year
633
+ }
634
+ ),
635
+ /* @__PURE__ */ jsx(TableCell, { className: cn("hidden md:table-cell", cellClassName), children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
636
+ /* @__PURE__ */ jsx(
637
+ "span",
638
+ {
639
+ className: cn(
640
+ "block h-6 w-1.5 rounded-full",
641
+ item.offer === "Free" && "bg-accent",
642
+ item.offer === "Professional" && "bg-primary",
643
+ item.offer === "Enterprise" && "bg-secondary"
644
+ )
645
+ }
646
+ ),
647
+ item.offer
648
+ ] }) }),
649
+ /* @__PURE__ */ jsx(TableCell, { className: cn("hidden md:table-cell", cellClassName), children: item.segment })
650
+ ]
651
+ },
652
+ `${typeof item.category === "string" ? item.category : idx}-${idx}`
653
+ ));
654
+ }, [itemsSlot, items, rowClassName, cellClassName]);
655
+ return /* @__PURE__ */ jsxs(
656
+ Section,
657
+ {
658
+ background,
659
+ spacing,
660
+ className,
661
+ pattern,
662
+ patternOpacity,
663
+ children: [
664
+ (heading || description) && /* @__PURE__ */ jsxs("div", { className: "mb-8 text-center", children: [
665
+ heading && (typeof heading === "string" ? /* @__PURE__ */ jsx(
666
+ "h2",
667
+ {
668
+ className: cn(
669
+ "text-3xl font-bold md:text-4xl",
670
+ headingClassName
671
+ ),
672
+ children: heading
673
+ }
674
+ ) : /* @__PURE__ */ jsx("div", { className: headingClassName, children: heading })),
675
+ description && (typeof description === "string" ? /* @__PURE__ */ jsx(
676
+ "p",
677
+ {
678
+ className: cn(
679
+ "mt-3 text-muted-foreground",
680
+ descriptionClassName
681
+ ),
682
+ children: description
683
+ }
684
+ ) : /* @__PURE__ */ jsx("div", { className: cn("mt-3", descriptionClassName), children: description }))
685
+ ] }),
686
+ /* @__PURE__ */ jsx("div", { className: cn("px-0", containerClassName), children: /* @__PURE__ */ jsx("div", { className: tableWrapperClassName, children: /* @__PURE__ */ jsxs(Table, { className: tableClassName, children: [
687
+ /* @__PURE__ */ jsx(TableHeader, { className: headerClassName, children: /* @__PURE__ */ jsxs(TableRow, { children: [
688
+ /* @__PURE__ */ jsx(TableHead, { className: headerCellClassName }),
689
+ /* @__PURE__ */ jsx(
690
+ TableHead,
691
+ {
692
+ className: cn(
693
+ "hidden font-bold text-primary md:table-cell",
694
+ headerCellClassName
695
+ ),
696
+ children: "Category"
697
+ }
698
+ ),
699
+ /* @__PURE__ */ jsxs(TableHead, { className: headerCellClassName, children: [
700
+ /* @__PURE__ */ jsx("span", { className: "hidden font-bold text-primary md:block", children: "Description" }),
701
+ /* @__PURE__ */ jsx("span", { className: "block font-bold text-primary md:hidden", children: "Project" })
702
+ ] }),
703
+ /* @__PURE__ */ jsx(
704
+ TableHead,
705
+ {
706
+ className: cn(
707
+ "hidden text-right font-bold text-primary md:table-cell",
708
+ headerCellClassName
709
+ ),
710
+ children: "Year"
711
+ }
712
+ ),
713
+ /* @__PURE__ */ jsx(
714
+ TableHead,
715
+ {
716
+ className: cn(
717
+ "hidden font-bold text-primary md:table-cell",
718
+ headerCellClassName
719
+ ),
720
+ children: "Offer"
721
+ }
722
+ ),
723
+ /* @__PURE__ */ jsx(
724
+ TableHead,
725
+ {
726
+ className: cn(
727
+ "hidden font-bold text-primary md:table-cell",
728
+ headerCellClassName
729
+ ),
730
+ children: "Segment"
731
+ }
732
+ )
733
+ ] }) }),
734
+ /* @__PURE__ */ jsx(TableBody, { children: renderItems })
735
+ ] }) }) })
736
+ ]
737
+ }
738
+ );
739
+ }
740
+
741
+ export { ListServiceCategoryTable };