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