@zekidev/ui 2.0.0

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 (135) hide show
  1. package/dist/components/theme-provider.d.ts +12 -0
  2. package/dist/components/ui/accordion.d.ts +7 -0
  3. package/dist/components/ui/badge.d.ts +9 -0
  4. package/dist/components/ui/button.d.ts +11 -0
  5. package/dist/components/ui/calendar.d.ts +4 -0
  6. package/dist/components/ui/card.d.ts +8 -0
  7. package/dist/components/ui/date-picker.d.ts +12 -0
  8. package/dist/components/ui/popover.d.ts +7 -0
  9. package/dist/components/ui/separator.d.ts +4 -0
  10. package/dist/components/ui/tabs.d.ts +7 -0
  11. package/dist/index.cjs +6141 -0
  12. package/dist/index.d.ts +61 -0
  13. package/dist/index.js +5980 -0
  14. package/dist/lib/utils.d.ts +2 -0
  15. package/dist/sections/banner/index.d.ts +5 -0
  16. package/dist/sections/banner/variants/banner-dismissible.d.ts +2 -0
  17. package/dist/sections/banner/variants/banner-simple.d.ts +2 -0
  18. package/dist/sections/cards/index.d.ts +7 -0
  19. package/dist/sections/cards/variants/cards-featured.d.ts +2 -0
  20. package/dist/sections/cards/variants/cards-grid.d.ts +2 -0
  21. package/dist/sections/cards/variants/cards-horizontal.d.ts +2 -0
  22. package/dist/sections/cards/variants/cards-pricing.d.ts +2 -0
  23. package/dist/sections/comparison/index.d.ts +6 -0
  24. package/dist/sections/comparison/variants/comparison-cards.d.ts +2 -0
  25. package/dist/sections/comparison/variants/comparison-highlights.d.ts +2 -0
  26. package/dist/sections/comparison/variants/comparison-table.d.ts +2 -0
  27. package/dist/sections/contact/index.d.ts +5 -0
  28. package/dist/sections/contact/variants/contact-simple.d.ts +2 -0
  29. package/dist/sections/contact/variants/contact-split.d.ts +2 -0
  30. package/dist/sections/cta/index.d.ts +6 -0
  31. package/dist/sections/cta/variants/cta-banner.d.ts +2 -0
  32. package/dist/sections/cta/variants/cta-centered.d.ts +2 -0
  33. package/dist/sections/cta/variants/cta-split.d.ts +2 -0
  34. package/dist/sections/downloads/index.d.ts +6 -0
  35. package/dist/sections/downloads/variants/downloads-accordion.d.ts +2 -0
  36. package/dist/sections/downloads/variants/downloads-flat.d.ts +2 -0
  37. package/dist/sections/downloads/variants/downloads-grouped.d.ts +2 -0
  38. package/dist/sections/downloads/variants/downloads-utils.d.ts +10 -0
  39. package/dist/sections/downloads/variants/file-row.d.ts +6 -0
  40. package/dist/sections/duplex/index.d.ts +6 -0
  41. package/dist/sections/duplex/variants/duplex-image-left.d.ts +2 -0
  42. package/dist/sections/duplex/variants/duplex-image-right.d.ts +2 -0
  43. package/dist/sections/duplex/variants/duplex-stacked.d.ts +2 -0
  44. package/dist/sections/event-registration/event-registration-section.d.ts +2 -0
  45. package/dist/sections/event-registration/index.d.ts +4 -0
  46. package/dist/sections/event-registration/registration-form.d.ts +11 -0
  47. package/dist/sections/event-registration/variants/registration-card.d.ts +2 -0
  48. package/dist/sections/event-registration/variants/registration-centered.d.ts +2 -0
  49. package/dist/sections/event-registration/variants/registration-split.d.ts +2 -0
  50. package/dist/sections/faq/index.d.ts +7 -0
  51. package/dist/sections/faq/variants/faq-accordion.d.ts +2 -0
  52. package/dist/sections/faq/variants/faq-cards.d.ts +2 -0
  53. package/dist/sections/faq/variants/faq-numbered.d.ts +2 -0
  54. package/dist/sections/faq/variants/faq-two-column.d.ts +2 -0
  55. package/dist/sections/features/index.d.ts +6 -0
  56. package/dist/sections/features/variants/features-alternating.d.ts +2 -0
  57. package/dist/sections/features/variants/features-bento.d.ts +2 -0
  58. package/dist/sections/features/variants/features-grid.d.ts +2 -0
  59. package/dist/sections/gallery/index.d.ts +6 -0
  60. package/dist/sections/gallery/shared/lightbox-overlay.d.ts +9 -0
  61. package/dist/sections/gallery/variants/gallery-carousel.d.ts +2 -0
  62. package/dist/sections/gallery/variants/gallery-grid.d.ts +2 -0
  63. package/dist/sections/gallery/variants/gallery-mosaic.d.ts +2 -0
  64. package/dist/sections/hero/index.d.ts +10 -0
  65. package/dist/sections/hero/variants/hero-background.d.ts +2 -0
  66. package/dist/sections/hero/variants/hero-card.d.ts +2 -0
  67. package/dist/sections/hero/variants/hero-centered.d.ts +2 -0
  68. package/dist/sections/hero/variants/hero-left.d.ts +2 -0
  69. package/dist/sections/hero/variants/hero-minimal.d.ts +2 -0
  70. package/dist/sections/hero/variants/hero-split.d.ts +2 -0
  71. package/dist/sections/hero/variants/hero-video.d.ts +2 -0
  72. package/dist/sections/iframe/index.d.ts +6 -0
  73. package/dist/sections/iframe/variants/iframe-card.d.ts +2 -0
  74. package/dist/sections/iframe/variants/iframe-responsive.d.ts +2 -0
  75. package/dist/sections/iframe/variants/iframe-simple.d.ts +2 -0
  76. package/dist/sections/kpis/index.d.ts +7 -0
  77. package/dist/sections/kpis/variants/kpis-bars.d.ts +2 -0
  78. package/dist/sections/kpis/variants/kpis-cards.d.ts +2 -0
  79. package/dist/sections/kpis/variants/kpis-counters.d.ts +2 -0
  80. package/dist/sections/kpis/variants/kpis-minimal.d.ts +2 -0
  81. package/dist/sections/logos/index.d.ts +6 -0
  82. package/dist/sections/logos/variants/logos-cloud.d.ts +2 -0
  83. package/dist/sections/logos/variants/logos-grid.d.ts +2 -0
  84. package/dist/sections/logos/variants/logos-marquee.d.ts +2 -0
  85. package/dist/sections/map/index.d.ts +6 -0
  86. package/dist/sections/map/leaflet-map-inner.d.ts +9 -0
  87. package/dist/sections/map/leaflet-map.d.ts +8 -0
  88. package/dist/sections/map/variants/map-listing.d.ts +2 -0
  89. package/dist/sections/map/variants/map-pins.d.ts +2 -0
  90. package/dist/sections/map/variants/map-split.d.ts +2 -0
  91. package/dist/sections/newsletter/index.d.ts +4 -0
  92. package/dist/sections/newsletter/newsletter-form.d.ts +10 -0
  93. package/dist/sections/newsletter/newsletter-section.d.ts +2 -0
  94. package/dist/sections/newsletter/variants/newsletter-card.d.ts +2 -0
  95. package/dist/sections/newsletter/variants/newsletter-centered.d.ts +2 -0
  96. package/dist/sections/newsletter/variants/newsletter-inline.d.ts +2 -0
  97. package/dist/sections/richtext/index.d.ts +6 -0
  98. package/dist/sections/richtext/portable-text-components.d.ts +2 -0
  99. package/dist/sections/richtext/variants/richtext-centered.d.ts +2 -0
  100. package/dist/sections/richtext/variants/richtext-two-column.d.ts +2 -0
  101. package/dist/sections/richtext/variants/richtext-wide.d.ts +2 -0
  102. package/dist/sections/scrollable/index.d.ts +7 -0
  103. package/dist/sections/scrollable/variants/scrollable-horizontal.d.ts +2 -0
  104. package/dist/sections/scrollable/variants/scrollable-marquee.d.ts +2 -0
  105. package/dist/sections/scrollable/variants/scrollable-parallax.d.ts +2 -0
  106. package/dist/sections/scrollable/variants/scrollable-timeline.d.ts +2 -0
  107. package/dist/sections/shared/dynamic-icon.d.ts +6 -0
  108. package/dist/sections/shared/section-header.d.ts +12 -0
  109. package/dist/sections/steps/index.d.ts +6 -0
  110. package/dist/sections/steps/variants/steps-horizontal.d.ts +2 -0
  111. package/dist/sections/steps/variants/steps-numbered.d.ts +2 -0
  112. package/dist/sections/steps/variants/steps-with-image.d.ts +2 -0
  113. package/dist/sections/tabs/index.d.ts +7 -0
  114. package/dist/sections/tabs/variants/tabs-pills.d.ts +2 -0
  115. package/dist/sections/tabs/variants/tabs-standard.d.ts +2 -0
  116. package/dist/sections/tabs/variants/tabs-underline.d.ts +2 -0
  117. package/dist/sections/tabs/variants/tabs-vertical.d.ts +2 -0
  118. package/dist/sections/team/index.d.ts +6 -0
  119. package/dist/sections/team/variants/team-cards.d.ts +2 -0
  120. package/dist/sections/team/variants/team-grid.d.ts +2 -0
  121. package/dist/sections/team/variants/team-minimal.d.ts +2 -0
  122. package/dist/sections/testimonials/index.d.ts +6 -0
  123. package/dist/sections/testimonials/variants/testimonials-carousel.d.ts +2 -0
  124. package/dist/sections/testimonials/variants/testimonials-featured.d.ts +2 -0
  125. package/dist/sections/testimonials/variants/testimonials-grid.d.ts +2 -0
  126. package/dist/sections/video/index.d.ts +6 -0
  127. package/dist/sections/video/variants/video-contained.d.ts +2 -0
  128. package/dist/sections/video/variants/video-full.d.ts +2 -0
  129. package/dist/sections/video/variants/video-with-text.d.ts +2 -0
  130. package/dist/sections/video/video-player.d.ts +11 -0
  131. package/dist/sections/video/video-utils.d.ts +6 -0
  132. package/dist/types/index.d.ts +440 -0
  133. package/package.json +67 -0
  134. package/src/styles/globals.css +448 -0
  135. package/tailwind.config.ts +122 -0
@@ -0,0 +1,7 @@
1
+ import type { TabsSection } from "../../types";
2
+ import { TabsStandard } from "./variants/tabs-standard";
3
+ import { TabsVertical } from "./variants/tabs-vertical";
4
+ import { TabsUnderline } from "./variants/tabs-underline";
5
+ import { TabsPills } from "./variants/tabs-pills";
6
+ export declare function TabsSection(props: TabsSection): import("react/jsx-runtime").JSX.Element;
7
+ export { TabsStandard, TabsVertical, TabsUnderline, TabsPills };
@@ -0,0 +1,2 @@
1
+ import type { TabsSection } from "../../../types";
2
+ export declare function TabsPills({ title, subtitle, content, badge, items, background }: TabsSection): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,2 @@
1
+ import type { TabsSection } from "../../../types";
2
+ export declare function TabsStandard({ title, subtitle, content, badge, items, background }: TabsSection): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,2 @@
1
+ import type { TabsSection } from "../../../types";
2
+ export declare function TabsUnderline({ title, subtitle, content, badge, items, background }: TabsSection): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,2 @@
1
+ import type { TabsSection } from "../../../types";
2
+ export declare function TabsVertical({ title, subtitle, content, badge, items, background }: TabsSection): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,6 @@
1
+ import type { TeamSection } from "../../types";
2
+ import { TeamGrid } from "./variants/team-grid";
3
+ import { TeamCards } from "./variants/team-cards";
4
+ import { TeamMinimal } from "./variants/team-minimal";
5
+ export declare function Team(props: TeamSection): import("react/jsx-runtime").JSX.Element;
6
+ export { TeamGrid, TeamCards, TeamMinimal };
@@ -0,0 +1,2 @@
1
+ import type { TeamSection } from "../../../types";
2
+ export declare function TeamCards({ title, subtitle, content, badge, items, background, }: TeamSection): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,2 @@
1
+ import type { TeamSection } from "../../../types";
2
+ export declare function TeamGrid({ title, subtitle, content, badge, items, columns, background, }: TeamSection): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,2 @@
1
+ import type { TeamSection } from "../../../types";
2
+ export declare function TeamMinimal({ title, subtitle, content, badge, items, background, }: TeamSection): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,6 @@
1
+ import type { TestimonialsSection } from "../../types";
2
+ import { TestimonialsGrid } from "./variants/testimonials-grid";
3
+ import { TestimonialsCarousel } from "./variants/testimonials-carousel";
4
+ import { TestimonialsFeatured } from "./variants/testimonials-featured";
5
+ export declare function Testimonials(props: TestimonialsSection): import("react/jsx-runtime").JSX.Element;
6
+ export { TestimonialsGrid, TestimonialsCarousel, TestimonialsFeatured };
@@ -0,0 +1,2 @@
1
+ import type { TestimonialsSection } from "../../../types";
2
+ export declare function TestimonialsCarousel({ title, subtitle, content, badge, items, background, }: TestimonialsSection): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,2 @@
1
+ import type { TestimonialsSection } from "../../../types";
2
+ export declare function TestimonialsFeatured({ title, subtitle, content, badge, items, background, }: TestimonialsSection): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,2 @@
1
+ import type { TestimonialsSection } from "../../../types";
2
+ export declare function TestimonialsGrid({ title, subtitle, content, badge, items, background, }: TestimonialsSection): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,6 @@
1
+ import type { VideoSection as VideoSectionType } from "../../types";
2
+ import { VideoFull } from "./variants/video-full";
3
+ import { VideoContained } from "./variants/video-contained";
4
+ import { VideoWithText } from "./variants/video-with-text";
5
+ export declare function VideoSection(props: VideoSectionType): import("react/jsx-runtime").JSX.Element;
6
+ export { VideoFull, VideoContained, VideoWithText };
@@ -0,0 +1,2 @@
1
+ import type { VideoSection } from "../../../types";
2
+ export declare function VideoContained({ title, subtitle, content, badge, videoUrl, poster, autoplay, loop, muted, background }: VideoSection): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,2 @@
1
+ import type { VideoSection } from "../../../types";
2
+ export declare function VideoFull({ title, subtitle, content, badge, videoUrl, poster, autoplay, loop, muted, background }: VideoSection): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,2 @@
1
+ import type { VideoSection } from "../../../types";
2
+ export declare function VideoWithText({ title, subtitle, content, badge, videoUrl, poster, autoplay, loop, muted, background }: VideoSection): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,11 @@
1
+ interface VideoPlayerProps {
2
+ url: string;
3
+ poster?: string;
4
+ autoplay?: boolean;
5
+ loop?: boolean;
6
+ muted?: boolean;
7
+ className?: string;
8
+ title?: string;
9
+ }
10
+ export declare function VideoPlayer({ url, poster, autoplay, loop, muted, className, title }: VideoPlayerProps): import("react/jsx-runtime").JSX.Element;
11
+ export {};
@@ -0,0 +1,6 @@
1
+ export type VideoType = "youtube" | "vimeo" | "native";
2
+ export interface ParsedVideo {
3
+ type: VideoType;
4
+ embedUrl: string;
5
+ }
6
+ export declare function parseVideoUrl(url: string): ParsedVideo | null;
@@ -0,0 +1,440 @@
1
+ export type ColorPalette = "default" | "rose" | "orange" | "green" | "violet" | "teal" | "yellow" | "red" | "custom";
2
+ export type ThemeMode = "light" | "dark" | "system";
3
+ export interface CustomPalette {
4
+ primary: string;
5
+ primaryForeground: string;
6
+ secondary: string;
7
+ secondaryForeground: string;
8
+ accent: string;
9
+ accentForeground: string;
10
+ background: string;
11
+ foreground: string;
12
+ muted: string;
13
+ mutedForeground: string;
14
+ border: string;
15
+ }
16
+ export interface SiteTheme {
17
+ mode: ThemeMode;
18
+ palette: ColorPalette;
19
+ customPalette?: CustomPalette;
20
+ radius?: number;
21
+ }
22
+ export interface CTAButton {
23
+ label: string;
24
+ href: string;
25
+ variant?: "default" | "outline" | "secondary" | "ghost" | "link" | "success" | "info" | "warning" | "error";
26
+ size?: "default" | "sm" | "lg" | "xl";
27
+ }
28
+ export interface MediaAsset {
29
+ url: string;
30
+ alt?: string;
31
+ width?: number;
32
+ height?: number;
33
+ }
34
+ export interface SectionBase {
35
+ _key?: string;
36
+ _type: string;
37
+ /** HTML id attribute — used for anchor scroll links (e.g. href="#contacto") */
38
+ id?: string;
39
+ variant?: string;
40
+ badge?: string;
41
+ title?: string;
42
+ subtitle?: string;
43
+ /** HTML string from TipTap, rendered below subtitle in all sections */
44
+ content?: string;
45
+ paddingTop?: "none" | "sm" | "md" | "lg" | "xl";
46
+ paddingBottom?: "none" | "sm" | "md" | "lg" | "xl";
47
+ background?: "default" | "muted" | "primary" | "secondary" | "success" | "info" | "warning" | "error";
48
+ }
49
+ export type HeroVariant = "centered" | "split" | "left" | "video" | "minimal" | "background" | "card";
50
+ export interface HeroSection extends SectionBase {
51
+ _type: "hero";
52
+ variant: HeroVariant;
53
+ heading: string;
54
+ subheading?: string;
55
+ description?: string;
56
+ primaryCTA?: CTAButton;
57
+ secondaryCTA?: CTAButton;
58
+ image?: MediaAsset;
59
+ /** Resolved URL — either from a Sanity file asset or a pasted external URL */
60
+ videoUrl?: string;
61
+ /** Thumbnail shown while the video loads (video variant only) */
62
+ videoPoster?: MediaAsset;
63
+ overlayOpacity?: number;
64
+ }
65
+ export type FAQVariant = "accordion" | "two-column" | "numbered" | "cards";
66
+ export interface FAQItem {
67
+ question: string;
68
+ answer: string;
69
+ }
70
+ export interface FAQSection extends SectionBase {
71
+ _type: "faq";
72
+ variant: FAQVariant;
73
+ items: FAQItem[];
74
+ cta?: CTAButton;
75
+ }
76
+ export type GalleryVariant = "grid" | "carousel" | "mosaic";
77
+ export interface GalleryItem {
78
+ image: MediaAsset;
79
+ caption?: string;
80
+ }
81
+ export interface GallerySection extends SectionBase {
82
+ _type: "gallery";
83
+ variant: GalleryVariant;
84
+ items: GalleryItem[];
85
+ columns?: 2 | 3 | 4;
86
+ }
87
+ export type KPIsVariant = "counters" | "cards" | "bars" | "minimal";
88
+ export interface KPIItem {
89
+ value: string;
90
+ label: string;
91
+ description?: string;
92
+ icon?: string;
93
+ prefix?: string;
94
+ suffix?: string;
95
+ }
96
+ export interface KPIsSection extends SectionBase {
97
+ _type: "kpis";
98
+ variant: KPIsVariant;
99
+ items: KPIItem[];
100
+ }
101
+ export type CardsVariant = "grid" | "horizontal" | "featured" | "pricing";
102
+ export interface CardItem {
103
+ title: string;
104
+ description?: string;
105
+ image?: MediaAsset;
106
+ icon?: string;
107
+ badge?: string;
108
+ cta?: CTAButton;
109
+ price?: string;
110
+ priceFrequency?: string;
111
+ features?: string[];
112
+ highlighted?: boolean;
113
+ }
114
+ export interface CardsSection extends SectionBase {
115
+ _type: "cards";
116
+ variant: CardsVariant;
117
+ items: CardItem[];
118
+ columns?: 2 | 3 | 4;
119
+ }
120
+ export type ScrollableVariant = "horizontal" | "timeline" | "marquee" | "parallax";
121
+ export interface ScrollableItem {
122
+ title: string;
123
+ description?: string;
124
+ image?: MediaAsset;
125
+ icon?: string;
126
+ date?: string;
127
+ label?: string;
128
+ }
129
+ export interface ScrollableSection extends SectionBase {
130
+ _type: "scrollable";
131
+ variant: ScrollableVariant;
132
+ items: ScrollableItem[];
133
+ speed?: "slow" | "normal" | "fast";
134
+ direction?: "left" | "right";
135
+ }
136
+ export type TabsVariant = "standard" | "vertical" | "underline" | "pills";
137
+ export interface TabItem {
138
+ label: string;
139
+ content: string;
140
+ image?: MediaAsset;
141
+ icon?: string;
142
+ }
143
+ export interface TabsSection extends SectionBase {
144
+ _type: "tabs";
145
+ variant: TabsVariant;
146
+ items: TabItem[];
147
+ }
148
+ export type TestimonialsVariant = "grid" | "carousel" | "featured";
149
+ export interface TestimonialItem {
150
+ quote: string;
151
+ author: string;
152
+ role?: string;
153
+ company?: string;
154
+ avatar?: MediaAsset;
155
+ rating?: number;
156
+ }
157
+ export interface TestimonialsSection extends SectionBase {
158
+ _type: "testimonials";
159
+ variant: TestimonialsVariant;
160
+ items: TestimonialItem[];
161
+ }
162
+ export type LogosVariant = "grid" | "marquee" | "cloud";
163
+ export interface LogoItem {
164
+ image: MediaAsset;
165
+ name: string;
166
+ href?: string;
167
+ }
168
+ export interface LogosSection extends SectionBase {
169
+ _type: "logos";
170
+ variant: LogosVariant;
171
+ items: LogoItem[];
172
+ }
173
+ export type CTASectionVariant = "centered" | "split" | "banner";
174
+ export interface CTASection extends SectionBase {
175
+ _type: "cta";
176
+ variant: CTASectionVariant;
177
+ heading: string;
178
+ description?: string;
179
+ primaryCTA?: CTAButton;
180
+ secondaryCTA?: CTAButton;
181
+ image?: MediaAsset;
182
+ }
183
+ export type FeaturesVariant = "grid" | "alternating" | "bento";
184
+ export interface FeatureItem {
185
+ title: string;
186
+ description?: string;
187
+ icon?: string;
188
+ image?: MediaAsset;
189
+ badge?: string;
190
+ }
191
+ export interface FeaturesSection extends SectionBase {
192
+ _type: "features";
193
+ variant: FeaturesVariant;
194
+ items: FeatureItem[];
195
+ columns?: 2 | 3 | 4;
196
+ }
197
+ export type StepsVariant = "numbered" | "horizontal" | "with-image";
198
+ export interface StepItem {
199
+ title: string;
200
+ description?: string;
201
+ image?: MediaAsset;
202
+ icon?: string;
203
+ }
204
+ export interface StepsSection extends SectionBase {
205
+ _type: "steps";
206
+ variant: StepsVariant;
207
+ items: StepItem[];
208
+ }
209
+ export type TeamVariant = "grid" | "cards" | "minimal";
210
+ export interface TeamMember {
211
+ name: string;
212
+ role?: string;
213
+ bio?: string;
214
+ avatar?: MediaAsset;
215
+ twitter?: string;
216
+ linkedin?: string;
217
+ }
218
+ export interface TeamSection extends SectionBase {
219
+ _type: "team";
220
+ variant: TeamVariant;
221
+ items: TeamMember[];
222
+ columns?: 2 | 3 | 4;
223
+ }
224
+ export type ContactVariant = "simple" | "split";
225
+ export interface ContactDetails {
226
+ email?: string;
227
+ phone?: string;
228
+ address?: string;
229
+ hours?: string;
230
+ }
231
+ export interface ContactSection extends SectionBase {
232
+ _type: "contact";
233
+ variant: ContactVariant;
234
+ details: ContactDetails;
235
+ cta?: CTAButton;
236
+ image?: MediaAsset;
237
+ }
238
+ export type BannerVariant = "simple" | "dismissible";
239
+ export interface BannerSection extends SectionBase {
240
+ _type: "banner";
241
+ variant: BannerVariant;
242
+ message: string;
243
+ cta?: CTAButton;
244
+ }
245
+ export type MapVariant = "pins" | "listing" | "split";
246
+ export type MapStyle = "standard" | "light" | "dark" | "voyager" | "topo" | "satellite" | "streets";
247
+ export interface MapLocation {
248
+ name: string;
249
+ address?: string;
250
+ phone?: string;
251
+ hours?: string;
252
+ description?: string;
253
+ lat?: number;
254
+ lng?: number;
255
+ }
256
+ export interface MapSection extends SectionBase {
257
+ _type: "maps";
258
+ variant: MapVariant;
259
+ mapStyle?: MapStyle;
260
+ locations: MapLocation[];
261
+ embedUrl?: string;
262
+ }
263
+ export type IframeVariant = "simple" | "card" | "responsive";
264
+ export interface IframeSection extends SectionBase {
265
+ _type: "iframe";
266
+ variant: IframeVariant;
267
+ src: string;
268
+ iframeTitle: string;
269
+ height?: number;
270
+ aspectRatio?: "video" | "square" | "auto";
271
+ }
272
+ export type ComparisonVariant = "table" | "cards" | "highlights";
273
+ export interface ComparisonColumn {
274
+ name: string;
275
+ description?: string;
276
+ price?: string;
277
+ priceFrequency?: string;
278
+ badge?: string;
279
+ highlighted?: boolean;
280
+ cta?: CTAButton;
281
+ /** Cell content per row, indexed to match allFeatures. Empty string = not included (shows —). */
282
+ cells: string[];
283
+ }
284
+ export interface ComparisonSection extends SectionBase {
285
+ _type: "comparison";
286
+ variant: ComparisonVariant;
287
+ columns: ComparisonColumn[];
288
+ allFeatures: string[];
289
+ }
290
+ export type DuplexVariant = "image-left" | "image-right" | "stacked";
291
+ export interface DuplexSection extends SectionBase {
292
+ _type: "duplex";
293
+ variant: DuplexVariant;
294
+ heading: string;
295
+ body?: string;
296
+ image?: MediaAsset;
297
+ videoUrl?: string;
298
+ primaryCTA?: CTAButton;
299
+ secondaryCTA?: CTAButton;
300
+ bullets?: string[];
301
+ }
302
+ export type RichtextVariant = "centered" | "wide" | "two-column";
303
+ export interface RichtextSection extends SectionBase {
304
+ _type: "richtext";
305
+ variant: RichtextVariant;
306
+ /** HTML string produced by TipTap editor — this IS the section content, not a subtitle supplement */
307
+ content: string;
308
+ }
309
+ export type VideoSectionVariant = "full" | "contained" | "with-text";
310
+ export interface VideoSection extends SectionBase {
311
+ _type: "video";
312
+ variant: VideoSectionVariant;
313
+ videoUrl: string;
314
+ poster?: MediaAsset;
315
+ autoplay?: boolean;
316
+ loop?: boolean;
317
+ muted?: boolean;
318
+ }
319
+ export type NewsletterVariant = "centered" | "card" | "inline";
320
+ export interface NewsletterSection extends SectionBase {
321
+ _type: "newsletter";
322
+ variant: NewsletterVariant;
323
+ buttonLabel?: string;
324
+ placeholder?: string;
325
+ successMessage?: string;
326
+ }
327
+ export type EventRegistrationVariant = "centered" | "card" | "split";
328
+ export type FormFieldType = "text" | "email" | "tel" | "date" | "number" | "textarea" | "select" | "image";
329
+ export interface FormField {
330
+ label: string;
331
+ fieldType: FormFieldType;
332
+ required?: boolean;
333
+ placeholder?: string;
334
+ /** Options for select fields */
335
+ options?: string[];
336
+ }
337
+ export interface EventRegistrationSection extends SectionBase {
338
+ _type: "eventRegistration";
339
+ variant: EventRegistrationVariant;
340
+ /** Unique identifier used to tag all submissions from this form */
341
+ formId: string;
342
+ fields: FormField[];
343
+ buttonLabel?: string;
344
+ successMessage?: string;
345
+ image?: MediaAsset;
346
+ }
347
+ export type DownloadsVariant = "grouped" | "accordion" | "flat";
348
+ export interface DownloadFile {
349
+ _key: string;
350
+ label: string;
351
+ file: {
352
+ url: string;
353
+ originalFilename?: string;
354
+ mimeType?: string;
355
+ size?: number;
356
+ };
357
+ }
358
+ export interface DownloadGroup {
359
+ _key: string;
360
+ title: string;
361
+ files: DownloadFile[];
362
+ }
363
+ export interface DownloadsSection extends SectionBase {
364
+ _type: "downloads";
365
+ variant: DownloadsVariant;
366
+ groups: DownloadGroup[];
367
+ }
368
+ export type WidgetType = "spotify" | "youtube";
369
+ export type WidgetPosition = "floating" | "sidebar";
370
+ export interface PageWidget {
371
+ _key: string;
372
+ type: WidgetType;
373
+ url: string;
374
+ embedUrl: string;
375
+ position: WidgetPosition;
376
+ height: number;
377
+ }
378
+ export type PageSection = HeroSection | FAQSection | GallerySection | KPIsSection | CardsSection | ScrollableSection | TabsSection | TestimonialsSection | LogosSection | CTASection | FeaturesSection | StepsSection | TeamSection | ContactSection | BannerSection | MapSection | IframeSection | ComparisonSection | DuplexSection | RichtextSection | VideoSection | EventRegistrationSection | NewsletterSection | DownloadsSection;
379
+ export interface Page {
380
+ _id: string;
381
+ _type: "page";
382
+ title: string;
383
+ slug: {
384
+ current: string;
385
+ };
386
+ sections: PageSection[];
387
+ widgets?: PageWidget[];
388
+ backgroundMusic?: BackgroundMusic;
389
+ seo?: {
390
+ title?: string;
391
+ description?: string;
392
+ image?: MediaAsset;
393
+ };
394
+ }
395
+ export type HeaderVariant = "default" | "transparent" | "centered" | "minimal" | "floating" | "dark" | "split";
396
+ export type FooterVariant = "default" | "columns" | "minimal";
397
+ export type LayoutVariant = "default" | "boxed" | "contained" | "side-nav" | "side-nav-right" | "fullscreen";
398
+ export interface BackgroundMusic {
399
+ /** Audio file URL (Sanity CDN or external) */
400
+ url: string;
401
+ loop?: boolean;
402
+ /** 0–100 */
403
+ volume?: number;
404
+ /**
405
+ * true → plays automatically after the user's first interaction (click / scroll / key).
406
+ * false → user must click the play button explicitly.
407
+ */
408
+ autoplayOnInteraction?: boolean;
409
+ }
410
+ export interface SiteSettings {
411
+ _id: string;
412
+ _type: "siteSettings";
413
+ siteName: string;
414
+ logo?: MediaAsset;
415
+ theme: SiteTheme;
416
+ headerVariant?: HeaderVariant;
417
+ footerVariant?: FooterVariant;
418
+ layoutVariant?: LayoutVariant;
419
+ navigation?: {
420
+ links: {
421
+ label: string;
422
+ href: string;
423
+ }[];
424
+ };
425
+ footer?: {
426
+ text?: string;
427
+ description?: string;
428
+ links?: {
429
+ label: string;
430
+ href: string;
431
+ }[];
432
+ columns?: {
433
+ title: string;
434
+ links: {
435
+ label: string;
436
+ href: string;
437
+ }[];
438
+ }[];
439
+ };
440
+ }
package/package.json ADDED
@@ -0,0 +1,67 @@
1
+ {
2
+ "name": "@zekidev/ui",
3
+ "version": "2.0.0",
4
+ "type": "module",
5
+ "exports": {
6
+ ".": {
7
+ "types": "./dist/index.d.ts",
8
+ "import": "./dist/index.js",
9
+ "require": "./dist/index.cjs",
10
+ "default": "./dist/index.js"
11
+ },
12
+ "./styles": "./src/styles/globals.css",
13
+ "./tailwind-config": "./tailwind.config.ts"
14
+ },
15
+ "main": "./dist/index.cjs",
16
+ "types": "./dist/index.d.ts",
17
+ "files": [
18
+ "dist",
19
+ "src/styles",
20
+ "tailwind.config.ts"
21
+ ],
22
+ "publishConfig": {
23
+ "access": "public"
24
+ },
25
+ "dependencies": {
26
+ "@portabletext/react": "^3.0.0",
27
+ "@radix-ui/react-accordion": "^1.2.0",
28
+ "@radix-ui/react-dialog": "^1.1.0",
29
+ "@radix-ui/react-navigation-menu": "^1.2.0",
30
+ "@radix-ui/react-popover": "^1.1.15",
31
+ "@radix-ui/react-separator": "^1.1.0",
32
+ "@radix-ui/react-slot": "^1.1.0",
33
+ "@radix-ui/react-tabs": "^1.1.0",
34
+ "@radix-ui/react-tooltip": "^1.1.0",
35
+ "class-variance-authority": "^0.7.0",
36
+ "clsx": "^2.1.0",
37
+ "date-fns": "^4.3.0",
38
+ "embla-carousel-react": "^8.1.0",
39
+ "framer-motion": "^11.2.0",
40
+ "leaflet": "^1.9.4",
41
+ "lucide-react": "^0.378.0",
42
+ "react-day-picker": "^10.0.1",
43
+ "react-leaflet": "^4.2.1",
44
+ "tailwind-merge": "^2.3.0",
45
+ "tailwindcss-animate": "^1.0.7"
46
+ },
47
+ "peerDependencies": {
48
+ "react": "^18.0.0 || ^19.0.0",
49
+ "react-dom": "^18.0.0 || ^19.0.0",
50
+ "tailwindcss": "^3.4.0"
51
+ },
52
+ "devDependencies": {
53
+ "@types/leaflet": "^1.9.0",
54
+ "@types/react": "^19.2.14",
55
+ "@types/react-dom": "^19.2.3",
56
+ "tailwindcss": "^3.4.0",
57
+ "tsup": "^8.0.0",
58
+ "typescript": "^5.4.0"
59
+ },
60
+ "scripts": {
61
+ "build": "tsup && tsc -p tsconfig.build.json",
62
+ "dev": "tsup --watch",
63
+ "type-check": "tsc --noEmit",
64
+ "lint": "eslint src --ext ts,tsx"
65
+ },
66
+ "module": "./dist/index.js"
67
+ }