@electroplix/components 0.0.2 → 0.2.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 (156) hide show
  1. package/README.md +585 -3
  2. package/cli.cjs +211 -0
  3. package/dist/README.md +107 -2
  4. package/dist/index.esm.js +17803 -4325
  5. package/dist/src/__tests__/test-utils.d.ts +8 -0
  6. package/dist/src/__tests__/test-utils.d.ts.map +1 -0
  7. package/dist/src/components/blog/index.d.ts +88 -0
  8. package/dist/src/components/blog/index.d.ts.map +1 -0
  9. package/dist/src/components/buttons/index.d.ts +71 -0
  10. package/dist/src/components/buttons/index.d.ts.map +1 -0
  11. package/dist/src/components/content/BlockquoteTestimonial.d.ts +24 -0
  12. package/dist/src/components/content/BlockquoteTestimonial.d.ts.map +1 -0
  13. package/dist/src/components/content/CalloutBox.d.ts +26 -0
  14. package/dist/src/components/content/CalloutBox.d.ts.map +1 -0
  15. package/dist/src/components/content/HeadingSection.d.ts +26 -0
  16. package/dist/src/components/content/HeadingSection.d.ts.map +1 -0
  17. package/dist/src/components/content/InlineCodeText.d.ts +24 -0
  18. package/dist/src/components/content/InlineCodeText.d.ts.map +1 -0
  19. package/dist/src/components/content/ParagraphBlock.d.ts +23 -0
  20. package/dist/src/components/content/ParagraphBlock.d.ts.map +1 -0
  21. package/dist/src/components/content/RichMarkdown.d.ts +20 -0
  22. package/dist/src/components/content/RichMarkdown.d.ts.map +1 -0
  23. package/dist/src/components/content/index.d.ts +7 -0
  24. package/dist/src/components/content/index.d.ts.map +1 -0
  25. package/dist/src/components/data-display/Badge.d.ts +9 -0
  26. package/dist/src/components/data-display/Badge.d.ts.map +1 -0
  27. package/dist/src/components/data-display/BadgeGroup.d.ts +8 -0
  28. package/dist/src/components/data-display/BadgeGroup.d.ts.map +1 -0
  29. package/dist/src/components/data-display/BarChart.d.ts +12 -0
  30. package/dist/src/components/data-display/BarChart.d.ts.map +1 -0
  31. package/dist/src/components/data-display/CalendarGrid.d.ts +15 -0
  32. package/dist/src/components/data-display/CalendarGrid.d.ts.map +1 -0
  33. package/dist/src/components/data-display/DataTable.d.ts +24 -0
  34. package/dist/src/components/data-display/DataTable.d.ts.map +1 -0
  35. package/dist/src/components/data-display/LineChart.d.ts +11 -0
  36. package/dist/src/components/data-display/LineChart.d.ts.map +1 -0
  37. package/dist/src/components/data-display/PieChart.d.ts +9 -0
  38. package/dist/src/components/data-display/PieChart.d.ts.map +1 -0
  39. package/dist/src/components/data-display/ProgressBar.d.ts +11 -0
  40. package/dist/src/components/data-display/ProgressBar.d.ts.map +1 -0
  41. package/dist/src/components/data-display/RatingStars.d.ts +10 -0
  42. package/dist/src/components/data-display/RatingStars.d.ts.map +1 -0
  43. package/dist/src/components/data-display/Sparkline.d.ts +7 -0
  44. package/dist/src/components/data-display/Sparkline.d.ts.map +1 -0
  45. package/dist/src/components/data-display/Timeline.d.ts +12 -0
  46. package/dist/src/components/data-display/Timeline.d.ts.map +1 -0
  47. package/dist/src/components/data-display/index.d.ts +12 -0
  48. package/dist/src/components/data-display/index.d.ts.map +1 -0
  49. package/dist/src/components/ecommerce/index.d.ts +110 -0
  50. package/dist/src/components/ecommerce/index.d.ts.map +1 -0
  51. package/dist/src/components/forms/AddressAutocomplete.d.ts +27 -0
  52. package/dist/src/components/forms/AddressAutocomplete.d.ts.map +1 -0
  53. package/dist/src/components/forms/Captcha.d.ts +23 -0
  54. package/dist/src/components/forms/Captcha.d.ts.map +1 -0
  55. package/dist/src/components/forms/ContactForm.d.ts +28 -0
  56. package/dist/src/components/forms/ContactForm.d.ts.map +1 -0
  57. package/dist/src/components/forms/DateTimePicker.d.ts +27 -0
  58. package/dist/src/components/forms/DateTimePicker.d.ts.map +1 -0
  59. package/dist/src/components/forms/FileUploader.d.ts +24 -0
  60. package/dist/src/components/forms/FileUploader.d.ts.map +1 -0
  61. package/dist/src/components/forms/FormShell.d.ts +17 -0
  62. package/dist/src/components/forms/FormShell.d.ts.map +1 -0
  63. package/dist/src/components/forms/InputField.d.ts +32 -0
  64. package/dist/src/components/forms/InputField.d.ts.map +1 -0
  65. package/dist/src/components/forms/MultiStepWizard.d.ts +29 -0
  66. package/dist/src/components/forms/MultiStepWizard.d.ts.map +1 -0
  67. package/dist/src/components/forms/NewsletterSignup.d.ts +26 -0
  68. package/dist/src/components/forms/NewsletterSignup.d.ts.map +1 -0
  69. package/dist/src/components/forms/RadioGroup.d.ts +31 -0
  70. package/dist/src/components/forms/RadioGroup.d.ts.map +1 -0
  71. package/dist/src/components/forms/SelectDropdown.d.ts +33 -0
  72. package/dist/src/components/forms/SelectDropdown.d.ts.map +1 -0
  73. package/dist/src/components/forms/TextAreaField.d.ts +30 -0
  74. package/dist/src/components/forms/TextAreaField.d.ts.map +1 -0
  75. package/dist/src/components/forms/ToggleSwitch.d.ts +25 -0
  76. package/dist/src/components/forms/ToggleSwitch.d.ts.map +1 -0
  77. package/dist/src/components/forms/ValidationWrapper.d.ts +24 -0
  78. package/dist/src/components/forms/ValidationWrapper.d.ts.map +1 -0
  79. package/dist/src/components/forms/index.d.ts +29 -0
  80. package/dist/src/components/forms/index.d.ts.map +1 -0
  81. package/dist/src/components/hero/CTAOverlayHero.d.ts +29 -0
  82. package/dist/src/components/hero/CTAOverlayHero.d.ts.map +1 -0
  83. package/dist/src/components/hero/CarouselHero.d.ts +29 -0
  84. package/dist/src/components/hero/CarouselHero.d.ts.map +1 -0
  85. package/dist/src/components/hero/HeroShell.d.ts +18 -0
  86. package/dist/src/components/hero/HeroShell.d.ts.map +1 -0
  87. package/dist/src/components/hero/PatternedHero.d.ts +34 -0
  88. package/dist/src/components/hero/PatternedHero.d.ts.map +1 -0
  89. package/dist/src/components/hero/SplitHero.d.ts +31 -0
  90. package/dist/src/components/hero/SplitHero.d.ts.map +1 -0
  91. package/dist/src/components/hero/StaticHero.d.ts +26 -0
  92. package/dist/src/components/hero/StaticHero.d.ts.map +1 -0
  93. package/dist/src/components/hero/VideoHeaderHero.d.ts +29 -0
  94. package/dist/src/components/hero/VideoHeaderHero.d.ts.map +1 -0
  95. package/dist/src/components/hero/index.d.ts +15 -0
  96. package/dist/src/components/hero/index.d.ts.map +1 -0
  97. package/dist/src/components/lists-cards/index.d.ts +104 -0
  98. package/dist/src/components/lists-cards/index.d.ts.map +1 -0
  99. package/dist/src/components/marketing/index.d.ts +95 -0
  100. package/dist/src/components/marketing/index.d.ts.map +1 -0
  101. package/dist/src/components/media/index.d.ts +95 -0
  102. package/dist/src/components/media/index.d.ts.map +1 -0
  103. package/dist/src/components/miscellaneous/index.d.ts +63 -0
  104. package/dist/src/components/miscellaneous/index.d.ts.map +1 -0
  105. package/dist/src/components/modals/index.d.ts +83 -0
  106. package/dist/src/components/modals/index.d.ts.map +1 -0
  107. package/dist/src/components/navigation/AnchorLinks.d.ts +25 -0
  108. package/dist/src/components/navigation/AnchorLinks.d.ts.map +1 -0
  109. package/dist/src/components/navigation/Breadcrumbs.d.ts +25 -0
  110. package/dist/src/components/navigation/Breadcrumbs.d.ts.map +1 -0
  111. package/dist/src/components/navigation/LanguageSelector.d.ts +24 -0
  112. package/dist/src/components/navigation/LanguageSelector.d.ts.map +1 -0
  113. package/dist/src/components/navigation/MegaMenu.d.ts +28 -0
  114. package/dist/src/components/navigation/MegaMenu.d.ts.map +1 -0
  115. package/dist/src/components/navigation/Pagination.d.ts +18 -0
  116. package/dist/src/components/navigation/Pagination.d.ts.map +1 -0
  117. package/dist/src/{lib/Navbar.d.ts → components/navigation/PrimaryNav.d.ts} +10 -11
  118. package/dist/src/components/navigation/PrimaryNav.d.ts.map +1 -0
  119. package/dist/src/components/navigation/SideDrawerNav.d.ts +22 -0
  120. package/dist/src/components/navigation/SideDrawerNav.d.ts.map +1 -0
  121. package/dist/src/components/navigation/SidebarMenu.d.ts +25 -0
  122. package/dist/src/components/navigation/SidebarMenu.d.ts.map +1 -0
  123. package/dist/src/components/navigation/Stepper.d.ts +17 -0
  124. package/dist/src/components/navigation/Stepper.d.ts.map +1 -0
  125. package/dist/src/components/navigation/Tabs.d.ts +22 -0
  126. package/dist/src/components/navigation/Tabs.d.ts.map +1 -0
  127. package/dist/src/components/navigation/index.d.ts +21 -0
  128. package/dist/src/components/navigation/index.d.ts.map +1 -0
  129. package/dist/src/components/onboarding/index.d.ts +66 -0
  130. package/dist/src/components/onboarding/index.d.ts.map +1 -0
  131. package/dist/src/components/search/index.d.ts +58 -0
  132. package/dist/src/components/search/index.d.ts.map +1 -0
  133. package/dist/src/components/site-identity/index.d.ts +48 -0
  134. package/dist/src/components/site-identity/index.d.ts.map +1 -0
  135. package/dist/src/components/social/index.d.ts +68 -0
  136. package/dist/src/components/social/index.d.ts.map +1 -0
  137. package/dist/src/components/user-accounts/index.d.ts +68 -0
  138. package/dist/src/components/user-accounts/index.d.ts.map +1 -0
  139. package/dist/src/core/config.d.ts +37 -0
  140. package/dist/src/core/config.d.ts.map +1 -0
  141. package/dist/src/core/icons.d.ts +25 -0
  142. package/dist/src/core/icons.d.ts.map +1 -0
  143. package/dist/src/core/index.d.ts +8 -0
  144. package/dist/src/core/index.d.ts.map +1 -0
  145. package/dist/src/core/provider.d.ts +45 -0
  146. package/dist/src/core/provider.d.ts.map +1 -0
  147. package/dist/src/core/types.d.ts +145 -0
  148. package/dist/src/core/types.d.ts.map +1 -0
  149. package/dist/src/core/utils.d.ts +70 -0
  150. package/dist/src/core/utils.d.ts.map +1 -0
  151. package/dist/src/index.d.ts +19 -2
  152. package/dist/src/index.d.ts.map +1 -1
  153. package/package.json +54 -3
  154. package/dist/src/lib/Navbar.d.ts.map +0 -1
  155. package/dist/src/lib/components.d.ts +0 -3
  156. package/dist/src/lib/components.d.ts.map +0 -1
package/cli.cjs ADDED
@@ -0,0 +1,211 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * @electroplix/components CLI
5
+ *
6
+ * Usage:
7
+ * npx @electroplix/components init – scaffold electroplix.config.ts
8
+ * npx @electroplix/components add <name> – show install/import instructions
9
+ * npx @electroplix/components list – list all available components
10
+ */
11
+
12
+ const fs = require("fs");
13
+ const path = require("path");
14
+
15
+ /* ── component registry ─────────────────────────────────── */
16
+
17
+ const CATEGORIES = {
18
+ navigation: [
19
+ "AnchorLinks", "Breadcrumbs", "LanguageSelector", "MegaMenu",
20
+ "Pagination", "PrimaryNav", "SidebarMenu", "SideDrawerNav", "Stepper", "Tabs",
21
+ ],
22
+ hero: [
23
+ "HeroShell", "StaticHero", "CarouselHero", "CTAOverlayHero",
24
+ "PatternedHero", "SplitHero", "VideoHeaderHero",
25
+ ],
26
+ buttons: [
27
+ "PrimaryButton", "SecondaryButton", "TertiaryButton", "IconButton",
28
+ "FloatingActionButton", "ButtonGroup", "LoadingButton", "ShareButton",
29
+ "DownloadButton", "PrintButton",
30
+ ],
31
+ forms: [
32
+ "FormShell", "InputField", "TextAreaField", "SelectDropdown", "RadioGroup",
33
+ "ToggleSwitch", "DateTimePicker", "FileUploader", "ContactForm",
34
+ "NewsletterSignup", "MultiStepWizard", "Captcha", "AddressAutocomplete",
35
+ ],
36
+ content: [
37
+ "BlockquoteTestimonial", "CalloutBox", "HeadingSection",
38
+ "InlineCodeText", "ParagraphBlock", "RichMarkdown",
39
+ ],
40
+ "data-display": [
41
+ "Badge", "BadgeGroup", "BarChart", "LineChart", "PieChart", "Sparkline",
42
+ "ProgressBar", "RatingStars", "CalendarGrid", "DataTable", "Timeline",
43
+ ],
44
+ ecommerce: [
45
+ "CartDrawer", "MiniCartPanel", "OrderSummary", "ProductCard",
46
+ "ProductGrid", "ProductDetail", "VariantSelector", "QuickAddButton",
47
+ "WishlistButton", "PaymentButtons",
48
+ ],
49
+ "lists-cards": [
50
+ "BlockShell", "Accordion", "GenericList", "FeatureGrid",
51
+ "ItemCardGrid", "PricingTable", "SortableTable", "LCTimeline",
52
+ ],
53
+ marketing: [
54
+ "ComparisonTable", "CountdownTimer", "FeatureHighlights", "LeadMagnetGate",
55
+ "MarketingHeroBlock", "PromoPopup", "TestimonialsCarousel", "TrustBadges",
56
+ ],
57
+ media: [
58
+ "MediaShell", "ResponsiveVideo", "AudioEmbed", "AvatarProfile", "IconGrid",
59
+ "ImageGallery", "LightboxGallery", "MasonryGrid", "PolaroidImage",
60
+ "LottieOrSVG", "ImageCropperUploader",
61
+ ],
62
+ miscellaneous: [
63
+ "CookieConsent", "ScrollProgressBar", "ThemeToggle", "EmptyState",
64
+ "AppInstallBanner", "DownloadBlock", "InlineCode", "RSSFeed",
65
+ ],
66
+ modals: [
67
+ "OverlayBase", "GenericModal", "ConfirmDialog", "FormDialog",
68
+ "LoadingOverlay", "Tooltip", "ToastBanners", "CookieNotice", "WelcomePopup",
69
+ ],
70
+ onboarding: [
71
+ "FAQAccordion", "OnboardingWizard", "ProductTour", "TooltipHelp",
72
+ "SupportChat", "ContactSupportBlock",
73
+ ],
74
+ search: [
75
+ "SiteSearchBar", "AutoSuggest", "FacetFilters", "SearchResultCard",
76
+ "SearchResults", "SearchEmptyState",
77
+ ],
78
+ "site-identity": [
79
+ "LogoDisplay", "AnimatedBrandMark", "Taglines", "BrandingShell",
80
+ "BrandIconGrid", "FaviconUploader",
81
+ ],
82
+ social: [
83
+ "SocialShareBar", "SocialLoginButtons", "SocialEmbed", "FollowLike",
84
+ "ReactionsBar", "CommentsBox", "ReviewsForm",
85
+ ],
86
+ "user-accounts": [
87
+ "AuthForm", "PasswordReset", "MultiFactorAuthInput", "ProfileOverview",
88
+ "ProfileSettings", "AccountSettings", "RoleBadge",
89
+ ],
90
+ blog: [
91
+ "BlogCard", "AuthorByline", "TagList", "BlogBadge", "ReadingBar",
92
+ "ArticleRenderer", "RelatedPosts", "ArchiveList", "CommentsSection",
93
+ ],
94
+ };
95
+
96
+ const ALL_COMPONENTS = new Map();
97
+ for (const [cat, names] of Object.entries(CATEGORIES)) {
98
+ for (const n of names) ALL_COMPONENTS.set(n.toLowerCase(), { name: n, category: cat });
99
+ }
100
+
101
+ /* ── colours ────────────────────────────────────────────── */
102
+
103
+ const PURPLE = "\x1b[35m";
104
+ const GREEN = "\x1b[32m";
105
+ const CYAN = "\x1b[36m";
106
+ const DIM = "\x1b[2m";
107
+ const BOLD = "\x1b[1m";
108
+ const RESET = "\x1b[0m";
109
+
110
+ /* ── commands ───────────────────────────────────────────── */
111
+
112
+ function init() {
113
+ const configName = "electroplix.config.ts";
114
+ const target = path.join(process.cwd(), configName);
115
+
116
+ if (fs.existsSync(target)) {
117
+ console.log(`${PURPLE}electroplix${RESET} ${configName} already exists.`);
118
+ process.exit(0);
119
+ }
120
+
121
+ const template = `import { defineConfig } from "@electroplix/components/config";
122
+
123
+ export default defineConfig({
124
+ // Global theme overrides
125
+ accentColor: "#7C3AED",
126
+ textColor: "#E5E7EB",
127
+ bgColor: "#0b0b0c",
128
+ borderColor: "rgba(255,255,255,0.14)",
129
+ radius: 14,
130
+ spacing: 14,
131
+ fontFamily: "Inter, system-ui, sans-serif",
132
+ headingSize: 18,
133
+ bodySize: 14,
134
+
135
+ // Optional: configure per-category themes
136
+ // navigation: { accentColor: "#7C3AED" },
137
+ // hero: { overlayOpacity: 0.55 },
138
+ // ecommerce: { currency: "USD" },
139
+ });
140
+ `;
141
+
142
+ fs.writeFileSync(target, template, "utf-8");
143
+ console.log(`\n${PURPLE}electroplix${RESET} Created ${GREEN}${configName}${RESET}\n`);
144
+ console.log(`${DIM}Wrap your app with <ElectroplixProvider config={config}> to apply.${RESET}\n`);
145
+ }
146
+
147
+ function add(name) {
148
+ if (!name) {
149
+ console.log(`\n${PURPLE}electroplix${RESET} Usage: ${CYAN}npx @electroplix/components add <ComponentName>${RESET}\n`);
150
+ process.exit(1);
151
+ }
152
+
153
+ const entry = ALL_COMPONENTS.get(name.toLowerCase());
154
+ if (!entry) {
155
+ console.log(`\n${PURPLE}electroplix${RESET} Component "${name}" not found.\n`);
156
+ console.log(`Run ${CYAN}npx @electroplix/components list${RESET} to see all available components.\n`);
157
+ process.exit(1);
158
+ }
159
+
160
+ console.log(`
161
+ ${PURPLE}electroplix${RESET} ${BOLD}${entry.name}${RESET} ${DIM}(${entry.category})${RESET}
162
+
163
+ ${GREEN}1.${RESET} Make sure @electroplix/components is installed:
164
+
165
+ ${CYAN}npm install @electroplix/components${RESET}
166
+
167
+ ${GREEN}2.${RESET} Import the component:
168
+
169
+ ${CYAN}import { ${entry.name} } from "@electroplix/components";${RESET}
170
+
171
+ ${GREEN}3.${RESET} Use it in your JSX:
172
+
173
+ ${CYAN}<${entry.name} />${RESET}
174
+
175
+ ${DIM}All components are config-driven. Wrap your app with
176
+ <ElectroplixProvider> to customize themes globally.${RESET}
177
+ `);
178
+ }
179
+
180
+ function list() {
181
+ console.log(`\n${PURPLE}@electroplix/components${RESET} – ${BOLD}${ALL_COMPONENTS.size} components${RESET}\n`);
182
+ for (const [cat, names] of Object.entries(CATEGORIES)) {
183
+ console.log(` ${BOLD}${cat}${RESET} ${DIM}(${names.length})${RESET}`);
184
+ console.log(` ${names.map((n) => `${CYAN}${n}${RESET}`).join(", ")}`);
185
+ console.log();
186
+ }
187
+ }
188
+
189
+ /* ── main ───────────────────────────────────────────────── */
190
+
191
+ const [, , cmd, ...args] = process.argv;
192
+
193
+ switch (cmd) {
194
+ case "init":
195
+ init();
196
+ break;
197
+ case "add":
198
+ add(args[0]);
199
+ break;
200
+ case "list":
201
+ list();
202
+ break;
203
+ default:
204
+ console.log(`
205
+ ${PURPLE}@electroplix/components${RESET} CLI
206
+
207
+ ${CYAN}init${RESET} Scaffold electroplix.config.ts
208
+ ${CYAN}add <name>${RESET} Show import instructions for a component
209
+ ${CYAN}list${RESET} List all ${ALL_COMPONENTS.size} available components
210
+ `);
211
+ }
package/dist/README.md CHANGED
@@ -1,5 +1,110 @@
1
1
  # @electroplix/components
2
2
 
3
- This is the README for the Electroplix components package.
3
+ Parametric, config-driven React UI components.
4
4
 
5
- (You can update this file with your actual documentation.)
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @electroplix/components
9
+ # or
10
+ pnpm add @electroplix/components
11
+ ```
12
+
13
+ > **Peer dependencies:** `react >=18` and `react-dom >=18`.
14
+
15
+ ## Quick start
16
+
17
+ ```tsx
18
+ import { Navbar } from "@electroplix/components";
19
+
20
+ export default function Page() {
21
+ return (
22
+ <Navbar
23
+ logoText="MyBrand"
24
+ links={[
25
+ { label: "Home", href: "/" },
26
+ { label: "Docs", href: "/docs" },
27
+ ]}
28
+ ctaText="Sign Up"
29
+ />
30
+ );
31
+ }
32
+ ```
33
+
34
+ ## Global configuration
35
+
36
+ Create a config file and wrap your app with `ElectroplixProvider` to set
37
+ style defaults for **every** component instance:
38
+
39
+ ```ts
40
+ // electroplix.config.ts
41
+ import { defineConfig } from "@electroplix/components";
42
+
43
+ export default defineConfig({
44
+ navbar: {
45
+ bgColor: "#22223B",
46
+ textColor: "#F2E9E4",
47
+ accentColor: "#C9ADA7",
48
+ borderColor: "#4A4E69",
49
+ fontFamily: "Roboto, sans-serif",
50
+ height: 80,
51
+ padding: 32,
52
+ sticky: true,
53
+ showSearch: true,
54
+ showCTA: true,
55
+ },
56
+ });
57
+ ```
58
+
59
+ ```tsx
60
+ // app/layout.tsx (Next.js App Router example)
61
+ import { ElectroplixProvider } from "@electroplix/components";
62
+ import config from "../electroplix.config";
63
+
64
+ export default function RootLayout({ children }: { children: React.ReactNode }) {
65
+ return (
66
+ <html lang="en">
67
+ <body>
68
+ <ElectroplixProvider config={config}>
69
+ {children}
70
+ </ElectroplixProvider>
71
+ </body>
72
+ </html>
73
+ );
74
+ }
75
+ ```
76
+
77
+ Components will merge configuration in priority order:
78
+ 1. **Per-instance** `config` prop (highest)
79
+ 2. **Global** `ElectroplixProvider` config
80
+ 3. **Built-in** defaults
81
+
82
+ ## API reference
83
+
84
+ ### `<Navbar>`
85
+
86
+ | Prop | Type | Default | Description |
87
+ |------|------|---------|-------------|
88
+ | `logoText` | `string` | `"Electroplix"` | Brand text |
89
+ | `logoHref` | `string` | `"/"` | Logo link target |
90
+ | `links` | `NavLink[]` | `[]` | Navigation links |
91
+ | `ctaText` | `string` | `"Get Started"` | CTA button label |
92
+ | `ctaHref` | `string` | `"#"` | CTA button href |
93
+ | `searchPlaceholder` | `string` | `"Search…"` | Search input placeholder |
94
+ | `onSearch` | `(q: string) => void` | — | Search callback |
95
+ | `config` | `NavbarConfig` | — | Per-instance style overrides |
96
+
97
+ ### `NavbarConfig` (global or per-instance)
98
+
99
+ | Key | Type | Default |
100
+ |-----|------|---------|
101
+ | `bgColor` | `string` | `"#0B0B0C"` |
102
+ | `textColor` | `string` | `"#F3F4F6"` |
103
+ | `accentColor` | `string` | `"#8B5CF6"` |
104
+ | `borderColor` | `string` | `"rgba(255,255,255,0.1)"` |
105
+ | `fontFamily` | `string` | `"Inter, ui-sans-serif, system-ui"` |
106
+ | `height` | `number` | `72` |
107
+ | `padding` | `number` | `24` |
108
+ | `sticky` | `boolean` | `false` |
109
+ | `showSearch` | `boolean` | `false` |
110
+ | `showCTA` | `boolean` | `false` |