@africode/core 5.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 (136) hide show
  1. package/AFRICODE_FRAMEWORK_GUIDE.md +707 -0
  2. package/LICENSE +623 -0
  3. package/README.md +442 -0
  4. package/bin/africode.js +73 -0
  5. package/bin/africode.js.1758507140 +343 -0
  6. package/bin/cli.ts +83 -0
  7. package/bin/create-africode.js +158 -0
  8. package/bin/scaffold.ts +219 -0
  9. package/components/accordion.js +183 -0
  10. package/components/alert.js +131 -0
  11. package/components/auth.js +172 -0
  12. package/components/avatar.js +117 -0
  13. package/components/badge.js +104 -0
  14. package/components/base.d.ts +139 -0
  15. package/components/base.js +184 -0
  16. package/components/button.js +164 -0
  17. package/components/card.js +137 -0
  18. package/components/cultural-card.js +243 -0
  19. package/components/divider.js +83 -0
  20. package/components/dropdown.js +171 -0
  21. package/components/error-boundary.js +155 -0
  22. package/components/form.js +131 -0
  23. package/components/grid.js +273 -0
  24. package/components/hero.js +138 -0
  25. package/components/icon.js +36 -0
  26. package/components/index.js +57 -0
  27. package/components/input.js +256 -0
  28. package/components/kanga-card.js +185 -0
  29. package/components/language-switcher.js +108 -0
  30. package/components/loader.js +80 -0
  31. package/components/modal.js +262 -0
  32. package/components/motion.js +84 -0
  33. package/components/navbar.js +236 -0
  34. package/components/pattern-showcase.js +225 -0
  35. package/components/progress.js +134 -0
  36. package/components/react.js +111 -0
  37. package/components/section.js +54 -0
  38. package/components/select.js +322 -0
  39. package/components/sidebar.js +180 -0
  40. package/components/skeleton.js +85 -0
  41. package/components/table.js +181 -0
  42. package/components/tabs.js +202 -0
  43. package/components/theme-toggle.js +82 -0
  44. package/components/toast.js +139 -0
  45. package/components/tooltip.js +167 -0
  46. package/core/a2ui-schema-manager.js +344 -0
  47. package/core/a2ui.js +431 -0
  48. package/core/bun-runtime.js +799 -0
  49. package/core/cli/commands/add.js +23 -0
  50. package/core/cli/commands/audit.js +58 -0
  51. package/core/cli/commands/build.js +137 -0
  52. package/core/cli/commands/create-plugin.js +241 -0
  53. package/core/cli/commands/dev.js +228 -0
  54. package/core/cli/commands/lint.js +23 -0
  55. package/core/cli/commands/test.js +34 -0
  56. package/core/cli/migrator.js +71 -0
  57. package/core/cli/ui.js +46 -0
  58. package/core/compliance.js +628 -0
  59. package/core/config.js +263 -0
  60. package/core/db-advanced.js +481 -0
  61. package/core/db.js +284 -0
  62. package/core/enhanced-hmr.js +404 -0
  63. package/core/errors.js +222 -0
  64. package/core/file-router.js +290 -0
  65. package/core/heartbeat.js +64 -0
  66. package/core/hmr-client.js +204 -0
  67. package/core/hmr.js +196 -0
  68. package/core/html.d.ts +116 -0
  69. package/core/html.js +160 -0
  70. package/core/hydration.js +52 -0
  71. package/core/lipa-namba-journey.js +572 -0
  72. package/core/motion.js +106 -0
  73. package/core/nida-cig-middleware.js +455 -0
  74. package/core/patterns.d.ts +124 -0
  75. package/core/patterns.js +833 -0
  76. package/core/plugins/index.js +312 -0
  77. package/core/router.js +387 -0
  78. package/core/sdk-client.js +62 -0
  79. package/core/sdk.d.ts +133 -0
  80. package/core/sdk.js +123 -0
  81. package/core/seo.js +76 -0
  82. package/core/server/auth-endpoints.js +339 -0
  83. package/core/server/auth.js +180 -0
  84. package/core/server/csrf.js +206 -0
  85. package/core/server/db.js +39 -0
  86. package/core/server/middleware.js +324 -0
  87. package/core/server/rate-limit.js +238 -0
  88. package/core/server/render.js +69 -0
  89. package/core/server/router.js +120 -0
  90. package/core/shim.js +28 -0
  91. package/core/state.d.ts +86 -0
  92. package/core/state.js +242 -0
  93. package/core/store.d.ts +122 -0
  94. package/core/store.js +61 -0
  95. package/core/validation.d.ts +233 -0
  96. package/core/validation.js +590 -0
  97. package/core/websocket.js +639 -0
  98. package/dist/africode.js +2905 -0
  99. package/dist/africode.js.map +61 -0
  100. package/dist/build-info.json +23 -0
  101. package/dist/components.js +2888 -0
  102. package/dist/components.js.map +58 -0
  103. package/dist/styles/africanity.css +322 -0
  104. package/dist/styles/typography.css +141 -0
  105. package/docs/IDE-Guide.md +50 -0
  106. package/package.json +110 -0
  107. package/src/index.ts +196 -0
  108. package/styles/africanity.css +322 -0
  109. package/styles/typography.css +141 -0
  110. package/templates/starter/.env.example +15 -0
  111. package/templates/starter/africode.config.js +40 -0
  112. package/templates/starter/package.json +14 -0
  113. package/templates/starter/src/pages/index.html +46 -0
  114. package/templates/starter/src/pages/index.js +32 -0
  115. package/templates/starter/src/styles/main.css +4 -0
  116. package/templates/starter-3d/.env.example +7 -0
  117. package/templates/starter-3d/africode.config.js +29 -0
  118. package/templates/starter-3d/components/af-model-viewer.js +125 -0
  119. package/templates/starter-3d/package.json +15 -0
  120. package/templates/starter-3d/src/pages/index.html +46 -0
  121. package/templates/starter-3d/src/pages/index.js +50 -0
  122. package/templates/starter-3d/src/styles/main.css +4 -0
  123. package/templates/starter-react/.env.example +15 -0
  124. package/templates/starter-react/africode.config.js +40 -0
  125. package/templates/starter-react/package.json +16 -0
  126. package/templates/starter-react/src/pages/index.html +46 -0
  127. package/templates/starter-react/src/pages/index.js +68 -0
  128. package/templates/starter-react/src/styles/main.css +4 -0
  129. package/templates/starter-tailwind/.env.example +15 -0
  130. package/templates/starter-tailwind/africode.config.js +40 -0
  131. package/templates/starter-tailwind/package.json +20 -0
  132. package/templates/starter-tailwind/src/pages/index.html +46 -0
  133. package/templates/starter-tailwind/src/pages/index.js +37 -0
  134. package/templates/starter-tailwind/src/styles/main.css +4 -0
  135. package/templates/starter-tailwind/src/styles/tailwind.css +1 -0
  136. package/templates/starter-tailwind/src/tailwind-loader.js +30 -0
@@ -0,0 +1,61 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["..\\core\\state.js", "..\\core\\store.js", "..\\core\\patterns.js", "..\\core\\html.js", "..\\components\\base.js", "..\\components\\button.js", "..\\components\\card.js", "..\\components\\navbar.js", "..\\node_modules\\zod\\v3\\helpers\\util.js", "..\\node_modules\\zod\\v3\\ZodError.js", "..\\node_modules\\zod\\v3\\locales\\en.js", "..\\node_modules\\zod\\v3\\errors.js", "..\\node_modules\\zod\\v3\\helpers\\parseUtil.js", "..\\node_modules\\zod\\v3\\helpers\\errorUtil.js", "..\\node_modules\\zod\\v3\\types.js", "..\\node_modules\\zod\\v3\\external.js", "..\\node_modules\\zod\\index.js", "..\\core\\config.js", "..\\core\\validation.js", "..\\components\\input.js", "..\\components\\alert.js", "..\\components\\grid.js", "..\\components\\section.js", "..\\components\\icon.js", "..\\components\\accordion.js", "..\\components\\hero.js", "..\\components\\table.js", "..\\components\\modal.js", "..\\components\\tabs.js", "..\\components\\sidebar.js", "..\\components\\dropdown.js", "..\\components\\select.js", "..\\components\\form.js", "..\\components\\tooltip.js", "..\\components\\toast.js", "..\\components\\badge.js", "..\\components\\avatar.js", "..\\components\\progress.js", "..\\components\\loader.js", "..\\components\\skeleton.js", "..\\components\\divider.js", "..\\components\\kanga-card.js", "..\\components\\cultural-card.js", "..\\components\\pattern-showcase.js", "..\\components\\language-switcher.js", "..\\components\\auth.js", "..\\components\\theme-toggle.js", "..\\core\\sdk-client.js", "..\\core\\motion.js", "..\\core\\hydration.js", "..\\components\\index.js", "..\\components\\error-boundary.js"],
4
+ "sourcesContent": [
5
+ "/**\r\n * AfriCode Reactive State System\r\n * \r\n * A lightweight, Proxy-based reactive state management system\r\n * following the African Fractal philosophy - simple at the core,\r\n * powerful through composition.\r\n * \r\n * @module core/state\r\n */\r\n\r\n// Store for all subscribers per state\r\nconst stateSubscribers = new WeakMap();\r\n\r\n// Track nested proxies to avoid duplicates\r\nconst proxyCache = new WeakMap();\r\n\r\n/**\r\n * Creates a deeply reactive state object using Proxy\r\n * State changes automatically notify all subscribers\r\n * \r\n * @param {Object} initialState - The initial state object\r\n * @returns {Proxy} A reactive proxy of the state\r\n * \r\n * @example\r\n * const state = createReactiveState({ count: 0, user: { name: 'Amara' } });\r\n * subscribe(() => console.log('State changed!'));\r\n * state.count++; // Logs: \"State changed!\"\r\n */\r\nexport function createReactiveState(initialState) {\r\n // Return cached proxy if already created\r\n if (proxyCache.has(initialState)) {\r\n return proxyCache.get(initialState);\r\n }\r\n\r\n const handler = {\r\n get(target, property, receiver) {\r\n const value = Reflect.get(target, property, receiver);\r\n\r\n // Recursively wrap nested objects\r\n if (value !== null && typeof value === 'object') {\r\n return createReactiveState(value);\r\n }\r\n\r\n return value;\r\n },\r\n\r\n set(target, property, value, receiver) {\r\n const oldValue = Reflect.get(target, property, receiver);\r\n\r\n // Only notify if value actually changed\r\n if (oldValue !== value) {\r\n const result = Reflect.set(target, property, value, receiver);\r\n\r\n if (result) {\r\n notifySubscribers(receiver, value, oldValue, property);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n return true;\r\n },\r\n\r\n deleteProperty(target, property) {\r\n const oldValue = Reflect.get(target, property);\r\n const result = Reflect.deleteProperty(target, property);\r\n\r\n if (result) {\r\n const proxy = proxyCache.get(target);\r\n notifySubscribers(proxy, undefined, oldValue, property);\r\n }\r\n\r\n return result;\r\n }\r\n };\r\n\r\n const proxy = new Proxy(initialState, handler);\r\n proxyCache.set(initialState, proxy);\r\n\r\n return proxy;\r\n}\r\n\r\n/**\r\n * Subscribe to state changes\r\n * \r\n * @param {Proxy} state - The reactive state to subscribe to\r\n * @param {Function} callback - Function to call when state changes\r\n * @returns {Function} Unsubscribe function\r\n * \r\n * @example\r\n * const state = createReactiveState({ count: 0 });\r\n * const unsubscribe = subscribe(state, () => updateUI());\r\n * // Later: unsubscribe();\r\n */\r\nexport function subscribe(state, callback) {\r\n if (!stateSubscribers.has(state)) {\r\n stateSubscribers.set(state, new Set());\r\n }\r\n \r\n const subscribers = stateSubscribers.get(state);\r\n subscribers.add(callback);\r\n\r\n // Return unsubscribe function\r\n return () => {\r\n subscribers.delete(callback);\r\n };\r\n}\r\n\r\n/**\r\n * Notify all subscribers of state change\r\n * Uses microtask queue for batched updates\r\n */\r\nfunction notifySubscribers(state, newValue, oldValue, property) {\r\n // For testing, make synchronous. In production, use microtask\r\n const subscribers = stateSubscribers.get(state);\r\n if (!subscribers) {return;}\r\n \r\n subscribers.forEach(callback => {\r\n try {\r\n callback(newValue, oldValue, property);\r\n } catch (error) {\r\n console.error('[AfriCode State] Subscriber error:', error);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Create a computed value that updates when dependencies change\r\n * \r\n * @param {Function} computeFn - Function that computes the derived value\r\n * @returns {Function} Getter function for the computed value\r\n * \r\n * @example\r\n * const state = createReactiveState({ price: 100, quantity: 2 });\r\n * const total = computed(() => state.price * state.quantity);\r\n * console.log(total()); // 200\r\n */\r\nexport function computed(computeFn) {\r\n let cachedValue;\r\n let isDirty = true;\r\n\r\n subscribe(() => {\r\n isDirty = true;\r\n });\r\n\r\n return () => {\r\n if (isDirty) {\r\n cachedValue = computeFn();\r\n isDirty = false;\r\n }\r\n return cachedValue;\r\n };\r\n}\r\n\r\n/**\r\n * Batch multiple state changes into a single notification\r\n * \r\n * @param {Function} updateFn - Function containing multiple state updates\r\n * \r\n * @example\r\n * batch(() => {\r\n * state.name = 'Kwame';\r\n * state.age = 25;\r\n * state.country = 'Ghana';\r\n * }); // Only one notification\r\n */\r\nexport function batch(state, updateFn) {\r\n const subscribers = stateSubscribers.get(state) || new Set();\r\n const originalSubscribers = new Set(subscribers);\r\n subscribers.clear();\r\n\r\n try {\r\n updateFn();\r\n } finally {\r\n originalSubscribers.forEach(sub => subscribers.add(sub));\r\n notifySubscribers(state);\r\n }\r\n}\r\n\r\n/**\r\n * Create a simple signal (getter/setter pair)\r\n * \r\n * @param {*} initialValue - The initial value\r\n * @returns {[Function, Function]} [getter, setter]\r\n * \r\n * @example\r\n * const [count, setCount] = createSignal(0);\r\n * console.log(count()); // 0\r\n * setCount(5);\r\n * console.log(count()); // 5\r\n */\r\nexport function createSignal(initialValue) {\r\n let value = initialValue;\r\n const signalSubscribers = new Set();\r\n\r\n const getter = () => {\r\n return value;\r\n };\r\n\r\n const setter = (newValue) => {\r\n if (value !== newValue) {\r\n value = typeof newValue === 'function' ? newValue(value) : newValue;\r\n signalSubscribers.forEach(fn => fn());\r\n notifySubscribers();\r\n }\r\n };\r\n\r\n // Allow effects to subscribe to this signal\r\n getter.subscribe = (fn) => {\r\n signalSubscribers.add(fn);\r\n return () => signalSubscribers.delete(fn);\r\n };\r\n\r\n return [getter, setter];\r\n}\r\n\r\n/**\r\n * Create an effect that runs when reactive dependencies change\r\n * \r\n * @param {Function} effectFn - The effect function to run\r\n * @returns {Function} Cleanup function\r\n * \r\n * @example\r\n * const [count, setCount] = createSignal(0);\r\n * createEffect(() => console.log('Count is:', count()));\r\n */\r\nexport function createEffect(effectFn) {\r\n // Run immediately\r\n effectFn();\r\n // Subscribe to future changes\r\n return subscribe(effectFn);\r\n}\r\n\r\n// Default export for convenience\r\nexport default {\r\n createReactiveState,\r\n subscribe,\r\n computed,\r\n batch,\r\n createSignal,\r\n createEffect\r\n};\r\n",
6
+ "/**\r\n * AfriCode Global Store\r\n * \r\n * Centralized state container for the application UI.\r\n * Powered by the core reactive engine.\r\n * \r\n * @module core/store\r\n */\r\n\r\nimport { createReactiveState } from './state.js';\r\n\r\n// Initial default state\r\nconst initialState = {\r\n theme: 'light', // Top-level theme\r\n language: 'en', // Top-level language\r\n ui: {\r\n sidebarCollapsed: false,\r\n theme: 'dark', // 'dark', 'light', 'system'\r\n activePage: 'home'\r\n },\r\n user: {\r\n name: 'Guest',\r\n permissions: []\r\n },\r\n config: {\r\n animationsEnabled: true,\r\n soundEnabled: false\r\n }\r\n};\r\n\r\n// Create the global store\r\nexport const store = createReactiveState(initialState);\r\n\r\n// Actions (Helper functions to modify state)\r\nexport const actions = {\r\n setTheme(theme) {\r\n if (['dark', 'light', 'system'].includes(theme)) {\r\n store.theme = theme;\r\n // Also update ui.theme for consistency\r\n store.ui.theme = theme;\r\n }\r\n },\r\n\r\n setLanguage(language) {\r\n store.language = language;\r\n },\r\n\r\n toggleSidebar(collapsed) {\r\n if (typeof collapsed === 'boolean') {\r\n store.ui.sidebarCollapsed = collapsed;\r\n } else {\r\n store.ui.sidebarCollapsed = !store.ui.sidebarCollapsed;\r\n }\r\n },\r\n\r\n setActivePage(pageName) {\r\n store.ui.activePage = pageName;\r\n }\r\n};\r\n\r\nexport default { store, actions };\r\n",
7
+ "/**\r\n * AfriCode Procedural SVG Pattern Engine\r\n * \r\n * Generates lightweight, on-the-fly SVG patterns inspired by\r\n * African textiles from across the continent:\r\n * \r\n * EAST AFRICA: Maasai Shuka, Kanga, Kitenge, Hadzabe\r\n * WEST AFRICA: Ghana Kente, Adinkra, Nigeria Aso-Oke, Ankara\r\n * SOUTHERN AFRICA: Ndebele, Zulu, Swazi/Eswatini, Xhosa\r\n * \r\n * @module core/patterns\r\n */\r\n\r\n/**\r\n * Generate a polygon with n sides\r\n * Based on the mathematical formula:\r\n * x_i = cx + r * cos(2πi/n)\r\n * y_i = cy + r * sin(2πi/n)\r\n */\r\nexport function generatePolygon(n, r, cx = 50, cy = 50) {\r\n const points = [];\r\n for (let i = 0; i < n; i++) {\r\n const angle = (2 * Math.PI * i) / n - Math.PI / 2;\r\n const x = cx + r * Math.cos(angle);\r\n const y = cy + r * Math.sin(angle);\r\n points.push(`${x.toFixed(2)},${y.toFixed(2)}`);\r\n }\r\n return points.join(' ');\r\n}\r\n\r\n// ============================================\r\n// EAST AFRICAN PATTERNS\r\n// ============================================\r\n\r\n/**\r\n * Generate Maasai Shuka tartan pattern (Tanzania/Kenya)\r\n * Traditional red checkered blanket with overlapping stripes\r\n */\r\nexport function generateShuka({\r\n primaryColor = '#FF0000',\r\n secondaryColor = '#000000',\r\n backgroundColor = '#8B0000',\r\n stripeWidth = 4,\r\n size = 40\r\n} = {}) {\r\n const svg = `\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 ${size} ${size}\">\r\n <rect width=\"${size}\" height=\"${size}\" fill=\"${backgroundColor}\"/>\r\n <rect x=\"0\" y=\"0\" width=\"${size}\" height=\"${stripeWidth}\" fill=\"${primaryColor}\" opacity=\"0.8\"/>\r\n <rect x=\"0\" y=\"${size / 2 - stripeWidth / 2}\" width=\"${size}\" height=\"${stripeWidth}\" fill=\"${secondaryColor}\" opacity=\"0.6\"/>\r\n <rect x=\"0\" y=\"${size - stripeWidth}\" width=\"${size}\" height=\"${stripeWidth}\" fill=\"${primaryColor}\" opacity=\"0.8\"/>\r\n <rect x=\"0\" y=\"0\" width=\"${stripeWidth}\" height=\"${size}\" fill=\"${primaryColor}\" opacity=\"0.5\"/>\r\n <rect x=\"${size / 2 - stripeWidth / 2}\" y=\"0\" width=\"${stripeWidth}\" height=\"${size}\" fill=\"${secondaryColor}\" opacity=\"0.4\"/>\r\n <rect x=\"${size - stripeWidth}\" y=\"0\" width=\"${stripeWidth}\" height=\"${size}\" fill=\"${primaryColor}\" opacity=\"0.5\"/>\r\n </svg>\r\n `;\r\n return `data:image/svg+xml,${encodeURIComponent(svg.trim())}`;\r\n}\r\n\r\n/**\r\n * Generate Hadzabe pattern (Tanzania)\r\n * Inspired by cave paintings and natural earth tones\r\n * Hunter-gatherer tribe with ancient artistic traditions\r\n */\r\nexport function generateHadzabe({\r\n earthColor = '#8B4513',\r\n ochreColor = '#CD853F',\r\n charcoalColor = '#2F2F2F',\r\n size = 50\r\n} = {}) {\r\n const svg = `\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 ${size} ${size}\">\r\n <rect width=\"${size}\" height=\"${size}\" fill=\"${earthColor}\"/>\r\n <!-- Cave art inspired figures -->\r\n <circle cx=\"${size * 0.3}\" cy=\"${size * 0.3}\" r=\"${size * 0.08}\" fill=\"${ochreColor}\"/>\r\n <line x1=\"${size * 0.3}\" y1=\"${size * 0.38}\" x2=\"${size * 0.3}\" y2=\"${size * 0.6}\" stroke=\"${charcoalColor}\" stroke-width=\"2\"/>\r\n <line x1=\"${size * 0.2}\" y1=\"${size * 0.45}\" x2=\"${size * 0.4}\" y2=\"${size * 0.45}\" stroke=\"${charcoalColor}\" stroke-width=\"2\"/>\r\n <!-- Animal figure -->\r\n <ellipse cx=\"${size * 0.7}\" cy=\"${size * 0.5}\" rx=\"${size * 0.15}\" ry=\"${size * 0.08}\" fill=\"${ochreColor}\"/>\r\n <line x1=\"${size * 0.6}\" y1=\"${size * 0.58}\" x2=\"${size * 0.6}\" y2=\"${size * 0.7}\" stroke=\"${charcoalColor}\" stroke-width=\"2\"/>\r\n <line x1=\"${size * 0.8}\" y1=\"${size * 0.58}\" x2=\"${size * 0.8}\" y2=\"${size * 0.7}\" stroke=\"${charcoalColor}\" stroke-width=\"2\"/>\r\n <!-- Dots like ancient markings -->\r\n <circle cx=\"${size * 0.15}\" cy=\"${size * 0.8}\" r=\"3\" fill=\"${ochreColor}\"/>\r\n <circle cx=\"${size * 0.85}\" cy=\"${size * 0.2}\" r=\"3\" fill=\"${ochreColor}\"/>\r\n </svg>\r\n `;\r\n return `data:image/svg+xml,${encodeURIComponent(svg.trim())}`;\r\n}\r\n\r\n/**\r\n * Generate Kanga border pattern (Tanzania/Kenya)\r\n */\r\nexport function generateKangaBorder({\r\n primaryColor = '#1EB53A', // Simple Green (Tanzania)\r\n accentColor = '#FCD116', // Gold\r\n size = 30\r\n} = {}) {\r\n const svg = `\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 ${size} ${size}\">\r\n <rect width=\"${size}\" height=\"${size}\" fill=\"${primaryColor}\"/>\r\n <!-- Pindo (Border) Motifs: Cashew/Triangle -->\r\n <path d=\"M0,0 L${size / 2},${size / 2} L0,${size} Z\" fill=\"${accentColor}\"/>\r\n <path d=\"M${size},0 L${size / 2},${size / 2} L${size},${size} Z\" fill=\"${accentColor}\"/>\r\n <circle cx=\"${size / 2}\" cy=\"${size / 2}\" r=\"${size * 0.15}\" fill=\"none\" stroke=\"${accentColor}\" stroke-width=\"2\"/>\r\n </svg>\r\n `;\r\n return `data:image/svg+xml,${encodeURIComponent(svg.trim())}`;\r\n}\r\n\r\n/**\r\n * Generate Kanga traditional Swahili cloth pattern (East Africa)\r\n */\r\nexport function generateKanga({\r\n primaryColor = '#FF6B00',\r\n secondaryColor = '#002B5C',\r\n backgroundColor = '#FFFFFF',\r\n size = 40\r\n} = {}) {\r\n const svg = `\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 ${size} ${size}\">\r\n <rect width=\"${size}\" height=\"${size}\" fill=\"${backgroundColor}\"/>\r\n <!-- Border pattern -->\r\n <rect x=\"0\" y=\"0\" width=\"${size}\" height=\"${size * 0.1}\" fill=\"${primaryColor}\"/>\r\n <rect x=\"0\" y=\"${size * 0.9}\" width=\"${size}\" height=\"${size * 0.1}\" fill=\"${primaryColor}\"/>\r\n <rect x=\"0\" y=\"0\" width=\"${size * 0.1}\" height=\"${size}\" fill=\"${primaryColor}\"/>\r\n <rect x=\"${size * 0.9}\" y=\"0\" width=\"${size * 0.1}\" height=\"${size}\" fill=\"${primaryColor}\"/>\r\n <!-- Center motif -->\r\n <circle cx=\"${size * 0.5}\" cy=\"${size * 0.5}\" r=\"${size * 0.15}\" fill=\"${secondaryColor}\"/>\r\n <text x=\"${size * 0.5}\" y=\"${size * 0.55}\" text-anchor=\"middle\" fill=\"${primaryColor}\" font-size=\"${size * 0.08}\">KANGA</text>\r\n </svg>\r\n `;\r\n return `data:image/svg+xml,${encodeURIComponent(svg.trim())}`;\r\n}\r\n\r\n/**\r\n * Generate Kuba Border pattern (Congo)\r\n */\r\nexport function generateKubaBorder({\r\n primaryColor = '#8B4513',\r\n secondaryColor = '#DAA520',\r\n backgroundColor = '#F5F5DC',\r\n size = 30\r\n} = {}) {\r\n const svg = `\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 ${size} ${size}\">\r\n <rect width=\"${size}\" height=\"${size}\" fill=\"${backgroundColor}\"/>\r\n <!-- Kuba geometric border -->\r\n <polygon points=\"0,0 ${size * 0.3},0 0,${size * 0.3}\" fill=\"${primaryColor}\"/>\r\n <polygon points=\"${size},0 ${size * 0.7},0 ${size},${size * 0.3}\" fill=\"${primaryColor}\"/>\r\n <polygon points=\"0,${size} ${size * 0.3},${size} 0,${size * 0.7}\" fill=\"${primaryColor}\"/>\r\n <polygon points=\"${size},${size} ${size * 0.7},${size} ${size},${size * 0.7}\" fill=\"${primaryColor}\"/>\r\n <!-- Center diamond -->\r\n <polygon points=\"${size * 0.5},${size * 0.3} ${size * 0.7},${size * 0.5} ${size * 0.5},${size * 0.7} ${size * 0.3},${size * 0.5}\" fill=\"${secondaryColor}\"/>\r\n </svg>\r\n `;\r\n return `data:image/svg+xml,${encodeURIComponent(svg.trim())}`;\r\n}\r\n\r\n/**\r\n * Generate Zulu Beads pattern (South Africa)\r\n */\r\nexport function generateZuluBeads({\r\n primaryColor = '#FF0000',\r\n secondaryColor = '#000000',\r\n accentColor = '#FFFFFF',\r\n size = 40\r\n} = {}) {\r\n const svg = `\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 ${size} ${size}\">\r\n <rect width=\"${size}\" height=\"${size}\" fill=\"${accentColor}\"/>\r\n <!-- Bead pattern -->\r\n <circle cx=\"${size * 0.2}\" cy=\"${size * 0.2}\" r=\"${size * 0.08}\" fill=\"${primaryColor}\"/>\r\n <circle cx=\"${size * 0.5}\" cy=\"${size * 0.2}\" r=\"${size * 0.08}\" fill=\"${secondaryColor}\"/>\r\n <circle cx=\"${size * 0.8}\" cy=\"${size * 0.2}\" r=\"${size * 0.08}\" fill=\"${primaryColor}\"/>\r\n <circle cx=\"${size * 0.2}\" cy=\"${size * 0.5}\" r=\"${size * 0.08}\" fill=\"${secondaryColor}\"/>\r\n <circle cx=\"${size * 0.5}\" cy=\"${size * 0.5}\" r=\"${size * 0.08}\" fill=\"${primaryColor}\"/>\r\n <circle cx=\"${size * 0.8}\" cy=\"${size * 0.5}\" r=\"${size * 0.08}\" fill=\"${secondaryColor}\"/>\r\n <circle cx=\"${size * 0.2}\" cy=\"${size * 0.8}\" r=\"${size * 0.08}\" fill=\"${primaryColor}\"/>\r\n <circle cx=\"${size * 0.5}\" cy=\"${size * 0.8}\" r=\"${size * 0.08}\" fill=\"${secondaryColor}\"/>\r\n <circle cx=\"${size * 0.8}\" cy=\"${size * 0.8}\" r=\"${size * 0.08}\" fill=\"${primaryColor}\"/>\r\n </svg>\r\n `;\r\n return `data:image/svg+xml,${encodeURIComponent(svg.trim())}`;\r\n}\r\n\r\n/**\r\n * Generate Maasai Shield pattern (Kenya/Tanzania)\r\n */\r\nexport function generateMasaiShield({\r\n primaryColor = '#8B0000',\r\n secondaryColor = '#FFD700',\r\n backgroundColor = '#654321',\r\n size = 50\r\n} = {}) {\r\n const svg = `\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 ${size} ${size}\">\r\n <ellipse cx=\"${size * 0.5}\" cy=\"${size * 0.5}\" rx=\"${size * 0.4}\" ry=\"${size * 0.45}\" fill=\"${backgroundColor}\"/>\r\n <!-- Shield patterns -->\r\n <ellipse cx=\"${size * 0.5}\" cy=\"${size * 0.3}\" rx=\"${size * 0.2}\" ry=\"${size * 0.15}\" fill=\"${primaryColor}\"/>\r\n <rect x=\"${size * 0.4}\" y=\"${size * 0.5}\" width=\"${size * 0.2}\" height=\"${size * 0.3}\" fill=\"${secondaryColor}\"/>\r\n <!-- Decorative lines -->\r\n <line x1=\"${size * 0.3}\" y1=\"${size * 0.2}\" x2=\"${size * 0.7}\" y2=\"${size * 0.2}\" stroke=\"${primaryColor}\" stroke-width=\"3\"/>\r\n <line x1=\"${size * 0.3}\" y1=\"${size * 0.8}\" x2=\"${size * 0.7}\" y2=\"${size * 0.8}\" stroke=\"${primaryColor}\" stroke-width=\"3\"/>\r\n </svg>\r\n `;\r\n return `data:image/svg+xml,${encodeURIComponent(svg.trim())}`;\r\n}\r\n\r\n/**\r\n * Generate Ndebele Paint house pattern (South Africa)\r\n */\r\nexport function generateNdebelePaint({\r\n primaryColor = '#FF1493',\r\n secondaryColor = '#00FF00',\r\n accentColor = '#FFFF00',\r\n backgroundColor = '#FFFFFF',\r\n size = 50\r\n} = {}) {\r\n const svg = `\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 ${size} ${size}\">\r\n <rect width=\"${size}\" height=\"${size}\" fill=\"${backgroundColor}\"/>\r\n <!-- Ndebele geometric patterns -->\r\n <polygon points=\"${size * 0.2},${size * 0.2} ${size * 0.4},${size * 0.2} ${size * 0.3},${size * 0.4}\" fill=\"${primaryColor}\"/>\r\n <polygon points=\"${size * 0.6},${size * 0.2} ${size * 0.8},${size * 0.2} ${size * 0.7},${size * 0.4}\" fill=\"${secondaryColor}\"/>\r\n <polygon points=\"${size * 0.2},${size * 0.6} ${size * 0.4},${size * 0.6} ${size * 0.3},${size * 0.8}\" fill=\"${accentColor}\"/>\r\n <polygon points=\"${size * 0.6},${size * 0.6} ${size * 0.8},${size * 0.6} ${size * 0.7},${size * 0.8}\" fill=\"${primaryColor}\"/>\r\n <!-- Center design -->\r\n <circle cx=\"${size * 0.5}\" cy=\"${size * 0.5}\" r=\"${size * 0.15}\" fill=\"${secondaryColor}\"/>\r\n <rect x=\"${size * 0.45}\" y=\"${size * 0.45}\" width=\"${size * 0.1}\" height=\"${size * 0.1}\" fill=\"${accentColor}\"/>\r\n </svg>\r\n `;\r\n return `data:image/svg+xml,${encodeURIComponent(svg.trim())}`;\r\n}\r\n\r\n/**\r\n * Generate Kitenge floral pattern (East Africa)\r\n */\r\nexport function generateKitenge({\r\n primaryColor = '#00A3DD',\r\n secondaryColor = '#FCD116',\r\n backgroundColor = '#1EB53A',\r\n size = 50\r\n} = {}) {\r\n const svg = `\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 ${size} ${size}\">\r\n <rect width=\"${size}\" height=\"${size}\" fill=\"${backgroundColor}\"/>\r\n <circle cx=\"${size * 0.25}\" cy=\"${size * 0.25}\" r=\"${size * 0.2}\" fill=\"${primaryColor}\" opacity=\"0.8\"/>\r\n <circle cx=\"${size * 0.75}\" cy=\"${size * 0.75}\" r=\"${size * 0.2}\" fill=\"${primaryColor}\" opacity=\"0.8\"/>\r\n <circle cx=\"${size * 0.25}\" cy=\"${size * 0.25}\" r=\"${size * 0.1}\" fill=\"${secondaryColor}\"/>\r\n <circle cx=\"${size * 0.75}\" cy=\"${size * 0.75}\" r=\"${size * 0.1}\" fill=\"${secondaryColor}\"/>\r\n <circle cx=\"${size * 0.75}\" cy=\"${size * 0.25}\" r=\"${size * 0.08}\" fill=\"${secondaryColor}\" opacity=\"0.6\"/>\r\n <circle cx=\"${size * 0.25}\" cy=\"${size * 0.75}\" r=\"${size * 0.08}\" fill=\"${secondaryColor}\" opacity=\"0.6\"/>\r\n </svg>\r\n `;\r\n return `data:image/svg+xml,${encodeURIComponent(svg.trim())}`;\r\n}\r\n\r\n// ============================================\r\n// WEST AFRICAN PATTERNS\r\n// ============================================\r\n\r\n/**\r\n * Generate Ghana Kente cloth pattern\r\n * Royal cloth of the Ashanti people with geometric strips\r\n * Colors: Gold (royalty), Green (harvest), Red (blood/sacrifice)\r\n */\r\nexport function generateKente({\r\n colors = ['#FFD700', '#228B22', '#DC143C', '#000000'],\r\n size = 60\r\n} = {}) {\r\n const [gold, green, red, black] = colors;\r\n const stripe = size / 6;\r\n\r\n const svg = `\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 ${size} ${size}\">\r\n <rect width=\"${size}\" height=\"${size}\" fill=\"${black}\"/>\r\n <!-- Horizontal bands -->\r\n <rect x=\"0\" y=\"0\" width=\"${size}\" height=\"${stripe}\" fill=\"${gold}\"/>\r\n <rect x=\"0\" y=\"${stripe}\" width=\"${size}\" height=\"${stripe}\" fill=\"${green}\"/>\r\n <rect x=\"0\" y=\"${stripe * 2}\" width=\"${size}\" height=\"${stripe}\" fill=\"${red}\"/>\r\n <rect x=\"0\" y=\"${stripe * 3}\" width=\"${size}\" height=\"${stripe}\" fill=\"${gold}\"/>\r\n <rect x=\"0\" y=\"${stripe * 4}\" width=\"${size}\" height=\"${stripe}\" fill=\"${green}\"/>\r\n <rect x=\"0\" y=\"${stripe * 5}\" width=\"${size}\" height=\"${stripe}\" fill=\"${red}\"/>\r\n <!-- Vertical accents -->\r\n <rect x=\"${size * 0.2}\" y=\"0\" width=\"3\" height=\"${size}\" fill=\"${black}\" opacity=\"0.5\"/>\r\n <rect x=\"${size * 0.4}\" y=\"0\" width=\"3\" height=\"${size}\" fill=\"${black}\" opacity=\"0.5\"/>\r\n <rect x=\"${size * 0.6}\" y=\"0\" width=\"3\" height=\"${size}\" fill=\"${black}\" opacity=\"0.5\"/>\r\n <rect x=\"${size * 0.8}\" y=\"0\" width=\"3\" height=\"${size}\" fill=\"${black}\" opacity=\"0.5\"/>\r\n <!-- Kente squares -->\r\n <rect x=\"${size * 0.1}\" y=\"${size * 0.1}\" width=\"${size * 0.15}\" height=\"${size * 0.15}\" fill=\"${gold}\" stroke=\"${black}\" stroke-width=\"1\"/>\r\n <rect x=\"${size * 0.75}\" y=\"${size * 0.75}\" width=\"${size * 0.15}\" height=\"${size * 0.15}\" fill=\"${red}\" stroke=\"${black}\" stroke-width=\"1\"/>\r\n </svg>\r\n `;\r\n return `data:image/svg+xml,${encodeURIComponent(svg.trim())}`;\r\n}\r\n\r\n/**\r\n * Generate Ghana Adinkra symbols pattern\r\n * Philosophical symbols of the Akan people\r\n * Each symbol represents concepts like wisdom, strength, unity\r\n */\r\nexport function generateAdinkra({\r\n symbolColor = '#000000',\r\n backgroundColor = '#CD853F',\r\n size = 50\r\n} = {}) {\r\n // Gye Nyame symbol (Supremacy of God) simplified\r\n const svg = `\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 ${size} ${size}\">\r\n <rect width=\"${size}\" height=\"${size}\" fill=\"${backgroundColor}\"/>\r\n <!-- Sankofa-inspired heart shape (go back and get it) -->\r\n <path d=\"M${size * 0.5} ${size * 0.2} \r\n C${size * 0.3} ${size * 0.1} ${size * 0.15} ${size * 0.3} ${size * 0.25} ${size * 0.5}\r\n L${size * 0.5} ${size * 0.8}\r\n L${size * 0.75} ${size * 0.5}\r\n C${size * 0.85} ${size * 0.3} ${size * 0.7} ${size * 0.1} ${size * 0.5} ${size * 0.2}\" \r\n fill=\"none\" stroke=\"${symbolColor}\" stroke-width=\"3\"/>\r\n <!-- Spiral detail -->\r\n <circle cx=\"${size * 0.35}\" cy=\"${size * 0.45}\" r=\"${size * 0.08}\" fill=\"none\" stroke=\"${symbolColor}\" stroke-width=\"2\"/>\r\n <circle cx=\"${size * 0.65}\" cy=\"${size * 0.45}\" r=\"${size * 0.08}\" fill=\"none\" stroke=\"${symbolColor}\" stroke-width=\"2\"/>\r\n </svg>\r\n `;\r\n return `data:image/svg+xml,${encodeURIComponent(svg.trim())}`;\r\n}\r\n\r\n/**\r\n * Generate Nigeria Aso-Oke pattern (Yoruba)\r\n * Hand-woven cloth with intricate strip patterns\r\n * Traditional for special occasions\r\n */\r\nexport function generateAsoOke({\r\n colors = ['#4B0082', '#FFD700', '#FFFFFF'],\r\n size = 50\r\n} = {}) {\r\n const [indigo, gold, white] = colors;\r\n const stripe = size / 10;\r\n\r\n const svg = `\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 ${size} ${size}\">\r\n <rect width=\"${size}\" height=\"${size}\" fill=\"${indigo}\"/>\r\n <!-- Horizontal stripes -->\r\n <rect x=\"0\" y=\"${stripe}\" width=\"${size}\" height=\"${stripe * 0.5}\" fill=\"${gold}\"/>\r\n <rect x=\"0\" y=\"${stripe * 3}\" width=\"${size}\" height=\"${stripe * 0.5}\" fill=\"${white}\"/>\r\n <rect x=\"0\" y=\"${stripe * 5}\" width=\"${size}\" height=\"${stripe * 0.5}\" fill=\"${gold}\"/>\r\n <rect x=\"0\" y=\"${stripe * 7}\" width=\"${size}\" height=\"${stripe * 0.5}\" fill=\"${white}\"/>\r\n <rect x=\"0\" y=\"${stripe * 9}\" width=\"${size}\" height=\"${stripe * 0.5}\" fill=\"${gold}\"/>\r\n <!-- Vertical accent lines -->\r\n <rect x=\"${size * 0.48}\" y=\"0\" width=\"${stripe * 0.4}\" height=\"${size}\" fill=\"${gold}\" opacity=\"0.7\"/>\r\n <!-- Diamond motifs -->\r\n <polygon points=\"${size * 0.25},${size * 0.3} ${size * 0.35},${size * 0.5} ${size * 0.25},${size * 0.7} ${size * 0.15},${size * 0.5}\" \r\n fill=\"${gold}\" stroke=\"${white}\" stroke-width=\"1\"/>\r\n <polygon points=\"${size * 0.75},${size * 0.3} ${size * 0.85},${size * 0.5} ${size * 0.75},${size * 0.7} ${size * 0.65},${size * 0.5}\" \r\n fill=\"${gold}\" stroke=\"${white}\" stroke-width=\"1\"/>\r\n </svg>\r\n `;\r\n return `data:image/svg+xml,${encodeURIComponent(svg.trim())}`;\r\n}\r\n\r\n/**\r\n * Generate Nigeria Ankara/African wax print pattern\r\n * Bold, colorful designs popular across Africa\r\n */\r\nexport function generateAnkara({\r\n primaryColor = '#FF6B00',\r\n secondaryColor = '#00A86B',\r\n accentColor = '#FFD700',\r\n backgroundColor = '#FFFFFF',\r\n size = 60\r\n} = {}) {\r\n const svg = `\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 ${size} ${size}\">\r\n <rect width=\"${size}\" height=\"${size}\" fill=\"${backgroundColor}\"/>\r\n <!-- Bold circular motifs -->\r\n <circle cx=\"${size * 0.3}\" cy=\"${size * 0.3}\" r=\"${size * 0.25}\" fill=\"${primaryColor}\"/>\r\n <circle cx=\"${size * 0.3}\" cy=\"${size * 0.3}\" r=\"${size * 0.15}\" fill=\"${secondaryColor}\"/>\r\n <circle cx=\"${size * 0.3}\" cy=\"${size * 0.3}\" r=\"${size * 0.08}\" fill=\"${accentColor}\"/>\r\n \r\n <circle cx=\"${size * 0.8}\" cy=\"${size * 0.8}\" r=\"${size * 0.2}\" fill=\"${secondaryColor}\"/>\r\n <circle cx=\"${size * 0.8}\" cy=\"${size * 0.8}\" r=\"${size * 0.1}\" fill=\"${primaryColor}\"/>\r\n \r\n <!-- Connecting lines -->\r\n <line x1=\"${size * 0.45}\" y1=\"${size * 0.45}\" x2=\"${size * 0.65}\" y2=\"${size * 0.65}\" \r\n stroke=\"${primaryColor}\" stroke-width=\"4\"/>\r\n \r\n <!-- Small dots -->\r\n <circle cx=\"${size * 0.1}\" cy=\"${size * 0.8}\" r=\"${size * 0.05}\" fill=\"${accentColor}\"/>\r\n <circle cx=\"${size * 0.9}\" cy=\"${size * 0.2}\" r=\"${size * 0.05}\" fill=\"${accentColor}\"/>\r\n </svg>\r\n `;\r\n return `data:image/svg+xml,${encodeURIComponent(svg.trim())}`;\r\n}\r\n\r\n// ============================================\r\n// CENTRAL & NORTH AFRICAN PATTERNS\r\n// ============================================\r\n\r\n/**\r\n * Generate Bogolanfini (Mud Cloth) pattern (Mali)\r\n * Geometric abstract designs in earth tones\r\n */\r\nexport function generateBogolan({\r\n primaryColor = '#000000',\r\n secondaryColor = '#FFFFFF',\r\n accentColor = '#8B4513',\r\n size = 60\r\n} = {}) {\r\n const svg = `\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 ${size} ${size}\">\r\n <rect width=\"${size}\" height=\"${size}\" fill=\"${primaryColor}\"/>\r\n <!-- Zigzags -->\r\n <polyline points=\"0,${size * 0.2} ${size * 0.25},0 ${size * 0.5},${size * 0.2} ${size * 0.75},0 ${size},${size * 0.2}\" \r\n fill=\"none\" stroke=\"${secondaryColor}\" stroke-width=\"3\"/>\r\n <polyline points=\"0,${size * 0.8} ${size * 0.25},${size} ${size * 0.5},${size * 0.8} ${size * 0.75},${size} ${size},${size * 0.8}\" \r\n fill=\"none\" stroke=\"${secondaryColor}\" stroke-width=\"3\"/>\r\n <!-- Crosses -->\r\n <line x1=\"${size * 0.25}\" y1=\"${size * 0.4}\" x2=\"${size * 0.25}\" y2=\"${size * 0.6}\" stroke=\"${secondaryColor}\" stroke-width=\"2\"/>\r\n <line x1=\"${size * 0.15}\" y1=\"${size * 0.5}\" x2=\"${size * 0.35}\" y2=\"${size * 0.5}\" stroke=\"${secondaryColor}\" stroke-width=\"2\"/>\r\n <line x1=\"${size * 0.75}\" y1=\"${size * 0.4}\" x2=\"${size * 0.75}\" y2=\"${size * 0.6}\" stroke=\"${secondaryColor}\" stroke-width=\"2\"/>\r\n <line x1=\"${size * 0.65}\" y1=\"${size * 0.5}\" x2=\"${size * 0.85}\" y2=\"${size * 0.5}\" stroke=\"${secondaryColor}\" stroke-width=\"2\"/>\r\n <!-- Dots -->\r\n <circle cx=\"${size * 0.5}\" cy=\"${size * 0.5}\" r=\"${size * 0.08}\" fill=\"${accentColor}\"/>\r\n </svg>\r\n `;\r\n return `data:image/svg+xml,${encodeURIComponent(svg.trim())}`;\r\n}\r\n\r\n/**\r\n * Generate Kuba Shoowa pattern (DRC)\r\n * Complex interlocking geometric shapes\r\n */\r\nexport function generateKuba({\r\n primaryColor = '#D2B48C',\r\n secondaryColor = '#3E2723',\r\n size = 60\r\n} = {}) {\r\n const svg = `\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 ${size} ${size}\">\r\n <rect width=\"${size}\" height=\"${size}\" fill=\"${primaryColor}\"/>\r\n <!-- Interlocking diamonds/rectangles -->\r\n <rect x=\"${size * 0.1}\" y=\"${size * 0.1}\" width=\"${size * 0.3}\" height=\"${size * 0.3}\" fill=\"${secondaryColor}\"/>\r\n <rect x=\"${size * 0.6}\" y=\"${size * 0.6}\" width=\"${size * 0.3}\" height=\"${size * 0.3}\" fill=\"${secondaryColor}\"/>\r\n <rect x=\"${size * 0.6}\" y=\"${size * 0.1}\" width=\"${size * 0.3}\" height=\"${size * 0.3}\" \r\n fill=\"none\" stroke=\"${secondaryColor}\" stroke-width=\"4\"/>\r\n <rect x=\"${size * 0.1}\" y=\"${size * 0.6}\" width=\"${size * 0.3}\" height=\"${size * 0.3}\" \r\n fill=\"none\" stroke=\"${secondaryColor}\" stroke-width=\"4\"/>\r\n <!-- Center lines -->\r\n <line x1=\"${size * 0.4}\" y1=\"${size * 0.5}\" x2=\"${size * 0.6}\" y2=\"${size * 0.5}\" stroke=\"${secondaryColor}\" stroke-width=\"2\"/>\r\n <line x1=\"${size * 0.5}\" y1=\"${size * 0.4}\" x2=\"${size * 0.5}\" y2=\"${size * 0.6}\" stroke=\"${secondaryColor}\" stroke-width=\"2\"/>\r\n </svg>\r\n `;\r\n return `data:image/svg+xml,${encodeURIComponent(svg.trim())}`;\r\n}\r\n\r\n/**\r\n * Generate Imigongo pattern (Rwanda)\r\n * Spiral/Geometric ridges traditionally made from cow dung\r\n */\r\nexport function generateImigongo({\r\n primaryColor = '#000000',\r\n secondaryColor = '#FFFFFF',\r\n accentColor = '#B22222',\r\n size = 60\r\n} = {}) {\r\n const svg = `\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 ${size} ${size}\">\r\n <rect width=\"${size}\" height=\"${size}\" fill=\"${secondaryColor}\"/>\r\n <!-- Spiral/Diamond Motif -->\r\n <path d=\"M${size * 0.5} ${size * 0.1} \r\n L${size * 0.9} ${size * 0.5} \r\n L${size * 0.5} ${size * 0.9} \r\n L${size * 0.1} ${size * 0.5} Z\" \r\n fill=\"${primaryColor}\"/>\r\n <path d=\"M${size * 0.5} ${size * 0.3} \r\n L${size * 0.7} ${size * 0.5} \r\n L${size * 0.5} ${size * 0.7} \r\n L${size * 0.3} ${size * 0.5} Z\" \r\n fill=\"${secondaryColor}\"/>\r\n <circle cx=\"${size * 0.5}\" cy=\"${size * 0.5}\" r=\"${size * 0.1}\" fill=\"${accentColor}\"/>\r\n </svg>\r\n `;\r\n return `data:image/svg+xml,${encodeURIComponent(svg.trim())}`;\r\n}\r\n\r\n/**\r\n * Generate Ethiopian Tibeb pattern\r\n * Vibrant woven geometric borders\r\n */\r\nexport function generateTibeb({\r\n colors = ['#009E60', '#FCDD09', '#EF3340'], // Ethiopian flag colors\r\n backgroundColor = '#FFFFFF',\r\n size = 40\r\n} = {}) {\r\n const [c1, c2, c3] = colors;\r\n const svg = `\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 ${size} ${size}\">\r\n <rect width=\"${size}\" height=\"${size}\" fill=\"${backgroundColor}\"/>\r\n <!-- Diamond Chain -->\r\n <polygon points=\"${size * 0.5},0 ${size},${size * 0.5} ${size * 0.5},${size} 0,${size * 0.5}\" \r\n fill=\"${c1}\" opacity=\"0.2\"/>\r\n <polygon points=\"${size * 0.5},${size * 0.2} ${size * 0.8},${size * 0.5} ${size * 0.5},${size * 0.8} ${size * 0.2},${size * 0.5}\" \r\n fill=\"${c2}\"/>\r\n <rect x=\"${size * 0.4}\" y=\"${size * 0.4}\" width=\"${size * 0.2}\" height=\"${size * 0.2}\" fill=\"${c3}\"/>\r\n <!-- Side accents -->\r\n <line x1=\"0\" y1=\"0\" x2=\"0\" y2=\"${size}\" stroke=\"${c1}\" stroke-width=\"4\"/>\r\n <line x1=\"${size}\" y1=\"0\" x2=\"${size}\" y2=\"${size}\" stroke=\"${c1}\" stroke-width=\"4\"/>\r\n </svg>\r\n `;\r\n return `data:image/svg+xml,${encodeURIComponent(svg.trim())}`;\r\n}\r\n\r\n// ============================================\r\n// SOUTHERN AFRICAN PATTERNS\r\n// ============================================\r\n\r\n/**\r\n * Generate Ndebele geometric mural pattern (South Africa)\r\n */\r\nexport function generateNdebele({\r\n colors = ['#FFD700', '#4169E1', '#FF69B4', '#228B22'],\r\n size = 60,\r\n strokeWidth = 2\r\n} = {}) {\r\n const [c1, c2, c3, c4] = colors;\r\n const svg = `\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 ${size} ${size}\">\r\n <rect width=\"${size}\" height=\"${size}\" fill=\"#FFFFFF\"/>\r\n <rect x=\"${strokeWidth}\" y=\"${strokeWidth}\" \r\n width=\"${size - strokeWidth * 2}\" height=\"${size - strokeWidth * 2}\" \r\n fill=\"none\" stroke=\"#000000\" stroke-width=\"${strokeWidth}\"/>\r\n <rect x=\"${size * 0.15}\" y=\"${size * 0.15}\" width=\"${size * 0.35}\" height=\"${size * 0.35}\" \r\n fill=\"${c1}\" stroke=\"#000000\" stroke-width=\"${strokeWidth / 2}\"/>\r\n <rect x=\"${size * 0.5}\" y=\"${size * 0.15}\" width=\"${size * 0.35}\" height=\"${size * 0.35}\" \r\n fill=\"${c2}\" stroke=\"#000000\" stroke-width=\"${strokeWidth / 2}\"/>\r\n <rect x=\"${size * 0.15}\" y=\"${size * 0.5}\" width=\"${size * 0.35}\" height=\"${size * 0.35}\" \r\n fill=\"${c3}\" stroke=\"#000000\" stroke-width=\"${strokeWidth / 2}\"/>\r\n <rect x=\"${size * 0.5}\" y=\"${size * 0.5}\" width=\"${size * 0.35}\" height=\"${size * 0.35}\" \r\n fill=\"${c4}\" stroke=\"#000000\" stroke-width=\"${strokeWidth / 2}\"/>\r\n <polygon points=\"${size / 2},${size * 0.3} ${size * 0.7},${size / 2} ${size / 2},${size * 0.7} ${size * 0.3},${size / 2}\"\r\n fill=\"#FFFFFF\" stroke=\"#000000\" stroke-width=\"${strokeWidth}\"/>\r\n </svg>\r\n `;\r\n return `data:image/svg+xml,${encodeURIComponent(svg.trim())}`;\r\n}\r\n\r\n/**\r\n * Generate Zulu beadwork pattern (South Africa)\r\n * Traditional \"love letter\" beadwork with symbolic colors\r\n * Colors carry deep meaning in Zulu courtship\r\n */\r\nexport function generateZulu({\r\n colors = ['#FFFFFF', '#000000', '#FF0000', '#00A86B', '#FFD700'],\r\n size = 50\r\n} = {}) {\r\n const [white, black, red, green, gold] = colors;\r\n const bead = size / 10;\r\n\r\n const svg = `\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 ${size} ${size}\">\r\n <rect width=\"${size}\" height=\"${size}\" fill=\"${black}\"/>\r\n <!-- Triangle pattern (isivivane - sacred cairn) -->\r\n <polygon points=\"${size * 0.5},${size * 0.1} ${size * 0.9},${size * 0.9} ${size * 0.1},${size * 0.9}\" \r\n fill=\"none\" stroke=\"${white}\" stroke-width=\"2\"/>\r\n <polygon points=\"${size * 0.5},${size * 0.25} ${size * 0.75},${size * 0.75} ${size * 0.25},${size * 0.75}\" \r\n fill=\"${red}\"/>\r\n <!-- Beadwork dots -->\r\n <circle cx=\"${size * 0.5}\" cy=\"${size * 0.35}\" r=\"${bead}\" fill=\"${white}\"/>\r\n <circle cx=\"${size * 0.35}\" cy=\"${size * 0.6}\" r=\"${bead}\" fill=\"${green}\"/>\r\n <circle cx=\"${size * 0.65}\" cy=\"${size * 0.6}\" r=\"${bead}\" fill=\"${gold}\"/>\r\n <circle cx=\"${size * 0.5}\" cy=\"${size * 0.8}\" r=\"${bead}\" fill=\"${white}\"/>\r\n <!-- Border dots -->\r\n <circle cx=\"${size * 0.1}\" cy=\"${size * 0.1}\" r=\"${bead * 0.7}\" fill=\"${red}\"/>\r\n <circle cx=\"${size * 0.9}\" cy=\"${size * 0.1}\" r=\"${bead * 0.7}\" fill=\"${green}\"/>\r\n </svg>\r\n `;\r\n return `data:image/svg+xml,${encodeURIComponent(svg.trim())}`;\r\n}\r\n\r\n/**\r\n * Generate Swazi/Eswatini pattern\r\n * Inspired by Ligwalagwala (purple-crested turaco) and royal patterns\r\n * Traditional shields and ceremonial designs\r\n */\r\nexport function generateSwazi({\r\n colors = ['#3E5EB9', '#FECD00', '#B10C0C', '#FFFFFF'],\r\n size = 50\r\n} = {}) {\r\n const [blue, gold, red, white] = colors;\r\n\r\n const svg = `\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 ${size} ${size}\">\r\n <rect width=\"${size}\" height=\"${size}\" fill=\"${blue}\"/>\r\n <!-- Shield shape (central to Eswatini culture) -->\r\n <ellipse cx=\"${size * 0.5}\" cy=\"${size * 0.45}\" rx=\"${size * 0.35}\" ry=\"${size * 0.4}\" \r\n fill=\"${gold}\" stroke=\"${red}\" stroke-width=\"3\"/>\r\n <!-- Inner pattern -->\r\n <ellipse cx=\"${size * 0.5}\" cy=\"${size * 0.45}\" rx=\"${size * 0.2}\" ry=\"${size * 0.25}\" \r\n fill=\"${red}\"/>\r\n <!-- Feather accents -->\r\n <line x1=\"${size * 0.5}\" y1=\"${size * 0.05}\" x2=\"${size * 0.5}\" y2=\"${size * 0.2}\" \r\n stroke=\"${white}\" stroke-width=\"3\"/>\r\n <line x1=\"${size * 0.4}\" y1=\"${size * 0.08}\" x2=\"${size * 0.45}\" y2=\"${size * 0.15}\" \r\n stroke=\"${white}\" stroke-width=\"2\"/>\r\n <line x1=\"${size * 0.6}\" y1=\"${size * 0.08}\" x2=\"${size * 0.55}\" y2=\"${size * 0.15}\" \r\n stroke=\"${white}\" stroke-width=\"2\"/>\r\n <!-- Spear points -->\r\n <polygon points=\"${size * 0.1},${size * 0.3} ${size * 0.05},${size * 0.5} ${size * 0.15},${size * 0.5}\" fill=\"${white}\"/>\r\n <polygon points=\"${size * 0.9},${size * 0.3} ${size * 0.85},${size * 0.5} ${size * 0.95},${size * 0.5}\" fill=\"${white}\"/>\r\n </svg>\r\n `;\r\n return `data:image/svg+xml,${encodeURIComponent(svg.trim())}`;\r\n}\r\n\r\n/**\r\n * Generate Xhosa pattern (South Africa)\r\n * Inspired by traditional Xhosa beadwork and blanket designs\r\n * Known for bold geometric patterns\r\n */\r\nexport function generateXhosa({\r\n primaryColor = '#FFFFFF',\r\n accentColor = '#00A86B',\r\n backgroundColor = '#1a1a2e',\r\n size = 50\r\n} = {}) {\r\n const svg = `\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 ${size} ${size}\">\r\n <rect width=\"${size}\" height=\"${size}\" fill=\"${backgroundColor}\"/>\r\n <!-- Horizontal bands -->\r\n <rect x=\"0\" y=\"${size * 0.2}\" width=\"${size}\" height=\"${size * 0.1}\" fill=\"${primaryColor}\"/>\r\n <rect x=\"0\" y=\"${size * 0.7}\" width=\"${size}\" height=\"${size * 0.1}\" fill=\"${primaryColor}\"/>\r\n <!-- Vertical bands -->\r\n <rect x=\"${size * 0.2}\" y=\"0\" width=\"${size * 0.1}\" height=\"${size}\" fill=\"${accentColor}\"/>\r\n <rect x=\"${size * 0.7}\" y=\"0\" width=\"${size * 0.1}\" height=\"${size}\" fill=\"${accentColor}\"/>\r\n <!-- Central diamond -->\r\n <polygon points=\"${size * 0.5},${size * 0.35} ${size * 0.65},${size * 0.5} ${size * 0.5},${size * 0.65} ${size * 0.35},${size * 0.5}\" \r\n fill=\"${accentColor}\" stroke=\"${primaryColor}\" stroke-width=\"2\"/>\r\n <!-- Corner triangles -->\r\n <polygon points=\"0,0 ${size * 0.15},0 0,${size * 0.15}\" fill=\"${accentColor}\"/>\r\n <polygon points=\"${size},0 ${size * 0.85},0 ${size},${size * 0.15}\" fill=\"${accentColor}\"/>\r\n <polygon points=\"0,${size} ${size * 0.15},${size} 0,${size * 0.85}\" fill=\"${accentColor}\"/>\r\n <polygon points=\"${size},${size} ${size * 0.85},${size} ${size},${size * 0.85}\" fill=\"${accentColor}\"/>\r\n </svg>\r\n `;\r\n return `data:image/svg+xml,${encodeURIComponent(svg.trim())}`;\r\n}\r\n\r\n/**\r\n * Apply pattern as background to an element\r\n */\r\nexport function applyPattern(element, patternUrl) {\r\n element.style.backgroundImage = `url(\"${patternUrl}\")`;\r\n element.style.backgroundRepeat = 'repeat';\r\n}\r\n\r\n// ============================================\r\n// NORTH AFRICAN PATTERNS\r\n// ============================================\r\n\r\n/**\r\n * Generate Berber pattern (North Africa)\r\n * Geometric designs inspired by Amazigh rugs and tattoos\r\n * Symbols of protection, fertility, and nature\r\n */\r\nexport function generateBerber({\r\n primaryColor = '#8B0000', // Deep red\r\n secondaryColor = '#000000',\r\n accentColor = '#FFD700',\r\n backgroundColor = '#F5F5DC', // Beige/Wool\r\n size = 60\r\n} = {}) {\r\n const svg = `\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 ${size} ${size}\">\r\n <rect width=\"${size}\" height=\"${size}\" fill=\"${backgroundColor}\"/>\r\n <!-- Lozenge (Diamond) - universal protective symbol -->\r\n <polygon points=\"${size * 0.5},${size * 0.1} ${size * 0.9},${size * 0.5} ${size * 0.5},${size * 0.9} ${size * 0.1},${size * 0.5}\" \r\n fill=\"${primaryColor}\" stroke=\"${secondaryColor}\" stroke-width=\"2\"/>\r\n <!-- Inner geometric details -->\r\n <line x1=\"${size * 0.5}\" y1=\"${size * 0.1}\" x2=\"${size * 0.5}\" y2=\"${size * 0.9}\" stroke=\"${accentColor}\" stroke-width=\"2\"/>\r\n <line x1=\"${size * 0.1}\" y1=\"${size * 0.5}\" x2=\"${size * 0.9}\" y2=\"${size * 0.5}\" stroke=\"${accentColor}\" stroke-width=\"2\"/>\r\n <!-- X symbols (Fibula/Cross) -->\r\n <line x1=\"${size * 0.4}\" y1=\"${size * 0.4}\" x2=\"${size * 0.6}\" y2=\"${size * 0.6}\" stroke=\"${secondaryColor}\" stroke-width=\"2\"/>\r\n <line x1=\"${size * 0.6}\" y1=\"${size * 0.4}\" x2=\"${size * 0.4}\" y2=\"${size * 0.6}\" stroke=\"${secondaryColor}\" stroke-width=\"2\"/>\r\n </svg>\r\n `;\r\n return `data:image/svg+xml,${encodeURIComponent(svg.trim())}`;\r\n}\r\n\r\n/**\r\n * Generate Adire Oniko (Yoruba Indigo) pattern\r\n * Resist-dyed circles and ripples\r\n * \"Tie and dye\" technique simulation\r\n */\r\nexport function generateAdire({\r\n primaryColor = '#4B0082', // Indigo\r\n secondaryColor = '#8A2BE2', // Light Indigo\r\n accentColor = '#FFFFFF',\r\n size = 50\r\n} = {}) {\r\n const svg = `\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 ${size} ${size}\">\r\n <rect width=\"${size}\" height=\"${size}\" fill=\"${primaryColor}\"/>\r\n <!-- Resist circles (Oniko) -->\r\n <circle cx=\"${size * 0.5}\" cy=\"${size * 0.5}\" r=\"${size * 0.35}\" fill=\"none\" stroke=\"${secondaryColor}\" stroke-width=\"3\"/>\r\n <circle cx=\"${size * 0.5}\" cy=\"${size * 0.5}\" r=\"${size * 0.25}\" fill=\"none\" stroke=\"${accentColor}\" stroke-width=\"2\" stroke-dasharray=\"4 2\"/>\r\n <circle cx=\"${size * 0.5}\" cy=\"${size * 0.5}\" r=\"${size * 0.1}\" fill=\"${accentColor}\" opacity=\"0.8\"/>\r\n <!-- Corner ripples -->\r\n <path d=\"M0,0 Q${size * 0.2},0 ${size * 0.2},${size * 0.2} Q0,${size * 0.2} 0,0\" fill=\"${secondaryColor}\"/>\r\n <path d=\"M${size},${size} Q${size * 0.8},${size} ${size * 0.8},${size * 0.8} Q${size},${size * 0.8} ${size},${size}\" fill=\"${secondaryColor}\"/>\r\n </svg>\r\n `;\r\n return `data:image/svg+xml,${encodeURIComponent(svg.trim())}`;\r\n}\r\n\r\n// Export all generators\r\nexport default {\r\n // East Africa\r\n generatePolygon,\r\n generateShuka,\r\n generateHadzabe,\r\n generateKanga,\r\n generateKangaBorder,\r\n generateKitenge,\r\n generateMasaiShield,\r\n generateTibeb, // Ethiopia\r\n generateImigongo, // Rwanda\r\n // West Africa\r\n generateKente,\r\n generateAdinkra,\r\n generateAsoOke,\r\n generateAnkara,\r\n generateBogolan, // Mali/West\r\n generateAdire, // Nigeria (Indigo)\r\n // Central Africa\r\n generateKuba, // DRC\r\n generateKubaBorder,\r\n // North Africa\r\n generateBerber, // Amazigh\r\n // Southern Africa\r\n generateNdebele,\r\n generateNdebelePaint,\r\n generateZulu,\r\n generateZuluBeads,\r\n generateSwazi,\r\n generateXhosa,\r\n // Utilities\r\n applyPattern,\r\n // Tech Patterns\r\n generateTuareg,\r\n generateGeez,\r\n generateBoli,\r\n generateCircuit,\r\n circuit: generateCircuit\r\n};\r\n\r\n/**\r\n * Generate Tuareg Indigo pattern (Sahara/Berber)\r\n * Inspired by the \"Blue Men of the Sahara\" and their geometric silver jewelry/stars\r\n */\r\nexport function generateTuareg({\r\n primaryColor = '#2D3D6B', // Tuareg Indigo\r\n secondaryColor = '#6B8CC7', // Sky Blue\r\n accentColor = '#FFFFFF', // Silver/White\r\n size = 60\r\n} = {}) {\r\n const svg = `\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 ${size} ${size}\">\r\n <rect width=\"${size}\" height=\"${size}\" fill=\"${primaryColor}\"/>\r\n <!-- Southern Cross / Tuareg Star -->\r\n <path d=\"M${size * 0.5} 0 L${size * 0.6} ${size * 0.4} L${size} ${size * 0.5} L${size * 0.6} ${size * 0.6} L${size * 0.5} ${size} L${size * 0.4} ${size * 0.6} L0 ${size * 0.5} L${size * 0.4} ${size * 0.4} Z\" \r\n fill=\"none\" stroke=\"${accentColor}\" stroke-width=\"2\"/>\r\n <circle cx=\"${size * 0.5}\" cy=\"${size * 0.5}\" r=\"${size * 0.1}\" fill=\"${secondaryColor}\"/>\r\n </svg>\r\n `;\r\n return `data:image/svg+xml,${encodeURIComponent(svg.trim())}`;\r\n}\r\n\r\n/**\r\n * Generate Ge'ez Script pattern (Ethiopia/Eritrea)\r\n * Abstract calligraphic strokes inspired by one of the world's oldest scripts\r\n */\r\nexport function generateGeez({\r\n inkColor = '#3A2E2C',\r\n parchmentColor = '#F4E4BC',\r\n size = 50\r\n} = {}) {\r\n const svg = `\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 ${size} ${size}\">\r\n <rect width=\"${size}\" height=\"${size}\" fill=\"${parchmentColor}\"/>\r\n <path d=\"M${size * 0.2} ${size * 0.2} L${size * 0.4} ${size * 0.2} M${size * 0.3} ${size * 0.2} L${size * 0.3} ${size * 0.5} Q${size * 0.4} ${size * 0.6} ${size * 0.2} ${size * 0.7}\" \r\n fill=\"none\" stroke=\"${inkColor}\" stroke-width=\"3\" stroke-linecap=\"round\"/>\r\n <path d=\"M${size * 0.6} ${size * 0.3} C${size * 0.8} ${size * 0.3} ${size * 0.8} ${size * 0.6} ${size * 0.6} ${size * 0.6} L${size * 0.8} ${size * 0.8}\" \r\n fill=\"none\" stroke=\"${inkColor}\" stroke-width=\"3\" stroke-linecap=\"round\"/>\r\n </svg>\r\n `;\r\n return `data:image/svg+xml,${encodeURIComponent(svg.trim())}`;\r\n}\r\n\r\n/**\r\n * Generate Boli pattern (Mali/Bambara)\r\n * Abstract organic shapes inspired by mud-based ritual objects\r\n */\r\nexport function generateBoli({\r\n clayColor = '#4E342E',\r\n earthColor = '#3E2723',\r\n accentColor = '#BCAAA4',\r\n size = 60\r\n} = {}) {\r\n const svg = `\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 ${size} ${size}\">\r\n <rect width=\"${size}\" height=\"${size}\" fill=\"${earthColor}\"/>\r\n <path d=\"M${size * 0.2} ${size * 0.5} Q${size * 0.3} ${size * 0.2} ${size * 0.5} ${size * 0.3} T${size * 0.8} ${size * 0.5} Q${size * 0.7} ${size * 0.8} ${size * 0.5} ${size * 0.7} T${size * 0.2} ${size * 0.5}\" \r\n fill=\"${clayColor}\" stroke=\"${accentColor}\" stroke-width=\"2\"/>\r\n </svg>\r\n `;\r\n return `data:image/svg+xml,${encodeURIComponent(svg.trim())}`;\r\n}\r\n\r\nexport function generateCircuit({\r\n primaryColor = '#334155',\r\n secondaryColor = '#1e293b',\r\n size = 100\r\n} = {}) {\r\n const svg = `\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 100 100\">\r\n <rect width=\"100\" height=\"100\" fill=\"${secondaryColor}\"/>\r\n <path d=\"M10 10 H90 V90 H10 Z\" fill=\"none\" stroke=\"${primaryColor}\" stroke-width=\"0.5\" opacity=\"0.3\"/>\r\n <path d=\"M20 20 V50 H50 V80 H80\" fill=\"none\" stroke=\"${primaryColor}\" stroke-width=\"1\"/>\r\n <circle cx=\"20\" cy=\"20\" r=\"2\" fill=\"${primaryColor}\"/>\r\n <circle cx=\"80\" cy=\"80\" r=\"2\" fill=\"${primaryColor}\"/>\r\n <circle cx=\"50\" cy=\"50\" r=\"1.5\" fill=\"${primaryColor}\"/>\r\n </svg>\r\n `;\r\n return `data:image/svg+xml,${encodeURIComponent(svg.trim())}`;\r\n}\r\n",
8
+ "/**\r\n * AfriCode HTML Template Engine\r\n * \r\n * Provides the `html` tagged template literal for writing markup in JavaScript.\r\n * This is a lightweight, zero-compile template system (JSX alternative).\r\n * \r\n * @module core/html\r\n */\r\n\r\n/**\r\n * RawHtml wrapper class\r\n * Marks HTML content as safe and prevents escaping when interpolated\r\n * \r\n * @class RawHtml\r\n * @param {string} content - The raw HTML content\r\n */\r\nexport class RawHtml {\r\n constructor(content) {\r\n this.content = content;\r\n }\r\n\r\n toString() {\r\n return this.content;\r\n }\r\n\r\n valueOf() {\r\n return this.content;\r\n }\r\n}\r\n\r\n/**\r\n * Escape HTML special characters to prevent XSS\r\n * \r\n * @param {any} str - Value to escape\r\n * @returns {string} Escaped string\r\n */\r\nfunction escapeHtml(str) {\r\n if (typeof str !== 'string') {return str;}\r\n \r\n const map = {\r\n '&': '&amp;',\r\n '<': '&lt;',\r\n '>': '&gt;',\r\n '\"': '&quot;',\r\n \"'\": '&#039;'\r\n };\r\n \r\n return str.replace(/[&<>\"']/g, char => map[char]);\r\n}\r\n\r\n/**\r\n * Safely interpolate a value into HTML\r\n * - If RawHtml: insert as raw markup\r\n * - If array: recursively process and join\r\n * - If null/undefined/false: render empty string\r\n * - Otherwise: escape as text\r\n * \r\n * @param {any} value - Value to interpolate\r\n * @returns {string}\r\n */\r\nfunction interpolateValue(value) {\r\n // RawHtml: insert as raw markup (safe for nested templates)\r\n if (value instanceof RawHtml) {\r\n return value.toString();\r\n }\r\n \r\n // Arrays: recursively process and join\r\n if (Array.isArray(value)) {\r\n return value.map(v => interpolateValue(v)).join('');\r\n }\r\n \r\n // Falsy values: render empty string\r\n if (value === null || value === undefined || value === false) {\r\n return '';\r\n }\r\n \r\n // Functions: convert to string (for component functions, better to call them first)\r\n if (typeof value === 'function') {\r\n return escapeHtml(String(value));\r\n }\r\n \r\n // Everything else: escape as text\r\n return escapeHtml(String(value));\r\n}\r\n\r\n/**\r\n * Tagged template literal for HTML\r\n * Safely handles nested templates, arrays, and text escaping.\r\n * \r\n * Returns a RawHtml wrapper so nested templates aren't double-escaped.\r\n * \r\n * @param {TemplateStringsArray} strings \r\n * @param {...any} values \r\n * @returns {RawHtml}\r\n * \r\n * @example\r\n * // Nested templates (no escaping of markup)\r\n * const button = html`<af-button>Click</af-button>`;\r\n * const page = html`<div>${button}</div>`;\r\n * // Output: <div><af-button>Click</af-button></div>\r\n * \r\n * @example\r\n * // Plain text (escaped for safety)\r\n * const user = html`<p>${userInput}</p>`;\r\n * // If userInput = \"<script>alert('xss')</script>\"\r\n * // Output: <p>&lt;script&gt;alert('xss')&lt;/script&gt;</p>\r\n * \r\n * @example\r\n * // Arrays of templates\r\n * const items = [html`<li>Item 1</li>`, html`<li>Item 2</li>`];\r\n * const list = html`<ul>${items}</ul>`;\r\n * // Output: <ul><li>Item 1</li><li>Item 2</li></ul>\r\n */\r\nexport function html(strings, ...values) {\r\n let result = '';\r\n\r\n for (let i = 0; i < values.length; i++) {\r\n result += strings[i];\r\n result += interpolateValue(values[i]);\r\n }\r\n\r\n result += strings[strings.length - 1];\r\n \r\n // Return as RawHtml so nested html() calls aren't escaped\r\n return new RawHtml(result);\r\n}\r\n\r\n/**\r\n * Standard Root Layout\r\n * Similar to Next.js layout.js concept\r\n * \r\n * @param {Object} options\r\n * @param {string} options.title - Page title\r\n * @param {string} options.meta - Meta tags\r\n * @param {RawHtml|string} options.children - Page content\r\n * @returns {RawHtml}\r\n */\r\nexport function Layout({ title = 'AfriCode App', meta = '', children }) {\r\n return html`<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n <meta charset=\"UTF-8\">\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n <title>${title}</title>\r\n ${meta}\r\n <link rel=\"stylesheet\" href=\"/styles/africanity.css\">\r\n <script type=\"module\" src=\"/core/sdk.js\"></script>\r\n <script type=\"module\">\r\n import { init } from '/core/sdk.js';\r\n init();\r\n </script>\r\n</head>\r\n<body>\r\n ${children}\r\n</body>\r\n</html>`;\r\n}\r\n\r\n\r\nexport default { html, Layout, RawHtml };\r\n",
9
+ "/**\r\n * AfriCode Base Component\r\n * \r\n * Abstract base class for all AfriCode Web Components.\r\n * Provides common utilities and enforces the Shadow DOM pattern.\r\n * \r\n * @module components/base\r\n */\r\n\r\nimport { html } from '../core/html.js';\r\n\r\n/**\r\n * Base class for AfriCode components\r\n * All components extend this to inherit common functionality\r\n */\r\nexport class AfriCodeComponent extends HTMLElement {\r\n constructor() {\r\n super();\r\n this.attachShadow({ mode: 'open' });\r\n \r\n // Native Web Component Error Boundary: intercept child render calls\r\n const originalRender = this.render;\r\n if (originalRender && typeof originalRender === 'function') {\r\n this.render = () => {\r\n try {\r\n originalRender.call(this);\r\n this.removeAttribute('has-error');\r\n } catch (error) {\r\n console.error(`[AfriCode] Rendering error in <${this.localName}>:`, error);\r\n this.setAttribute('has-error', 'true');\r\n this.shadowRoot.innerHTML = `\r\n <style>\r\n .af-local-error {\r\n padding: 1rem;\r\n border: 1px dashed rgba(220, 20, 60, 0.4);\r\n border-radius: 4px;\r\n color: #DC143C;\r\n font-family: 'Inter', system-ui, sans-serif;\r\n font-size: 0.85rem;\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n background: rgba(220, 20, 60, 0.05);\r\n }\r\n </style>\r\n <div class=\"af-local-error\">\r\n <span aria-hidden=\"true\">⚠️</span>\r\n <span>Failed to render</span>\r\n </div>\r\n `;\r\n this.emit('af-component-error', { \r\n component: this.localName, \r\n message: error.message,\r\n stack: error.stack \r\n });\r\n }\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Component lifecycle - connected to DOM\r\n * Empty base implementation to support super calls in subclasses.\r\n */\r\n connectedCallback() { }\r\n\r\n /**\r\n * Load shared Africanity styles into Shadow DOM\r\n */\r\n // Static cache for Constructable Stylesheets to prevent fetch waterfall\r\n static styleCache = new Map();\r\n\r\n /**\r\n * Global stylesheets injected by adapters (e.g. Tailwind, custom design systems).\r\n * Each entry must be a CSSStyleSheet instance.\r\n * Usage: AfriCodeComponent.injectGlobalSheet(sheet)\r\n * @type {CSSStyleSheet[]}\r\n */\r\n static globalSheets = [];\r\n\r\n /**\r\n * Inject a global CSSStyleSheet into every AfriCode component's Shadow DOM.\r\n * This is the primary integration point for external CSS frameworks like Tailwind.\r\n * @param {CSSStyleSheet} sheet - A Constructable Stylesheet instance\r\n */\r\n static injectGlobalSheet(sheet) {\r\n if (!(sheet instanceof CSSStyleSheet)) {\r\n console.error('[AfriCode] injectGlobalSheet requires a CSSStyleSheet instance.');\r\n return;\r\n }\r\n if (!AfriCodeComponent.globalSheets.includes(sheet)) {\r\n AfriCodeComponent.globalSheets.push(sheet);\r\n }\r\n }\r\n\r\n /**\r\n * Load shared Africanity styles into Shadow DOM.\r\n * Optimized to fetch only once per session.\r\n * Also adopts any globally injected sheets (e.g. Tailwind utilities).\r\n */\r\n async loadStyles() {\r\n const styleUrl = '/styles/africanity.css';\r\n\r\n // 1. Check cache first\r\n if (AfriCodeComponent.styleCache.has(styleUrl)) {\r\n this.shadowRoot.adoptedStyleSheets = [\r\n AfriCodeComponent.styleCache.get(styleUrl),\r\n ...AfriCodeComponent.globalSheets\r\n ];\r\n return;\r\n }\r\n\r\n // 2. Fetch if not cached (Single Request)\r\n try {\r\n const response = await fetch(styleUrl);\r\n const css = await response.text();\r\n\r\n const styleSheet = new CSSStyleSheet();\r\n styleSheet.replaceSync(css);\r\n\r\n // Cache it\r\n AfriCodeComponent.styleCache.set(styleUrl, styleSheet);\r\n\r\n // Apply core + any global sheets\r\n this.shadowRoot.adoptedStyleSheets = [\r\n styleSheet,\r\n ...AfriCodeComponent.globalSheets\r\n ];\r\n } catch (err) {\r\n console.warn('AfriCode: Failed to load core styles', err);\r\n }\r\n }\r\n\r\n /**\r\n * Get Fibonacci spacing value\r\n * @param {number} index - Fibonacci sequence index (1,2,3,5,8,13,21,34,55)\r\n * @returns {string} CSS variable reference\r\n */\r\n spacing(index) {\r\n return `var(--space-${index})`;\r\n }\r\n\r\n /**\r\n * Create element with classes and attributes\r\n * @param {string} tag - HTML tag name\r\n * @param {Object} options - Element options\r\n * @returns {HTMLElement}\r\n */\r\n createElement(tag, { classes = [], attributes = {}, text = '' } = {}) {\r\n const el = document.createElement(tag);\r\n if (classes.length) {el.classList.add(...classes);}\r\n Object.entries(attributes).forEach(([key, value]) => el.setAttribute(key, value));\r\n if (text) {el.textContent = text;}\r\n return el;\r\n }\r\n\r\n\r\n /**\r\n * Emit a custom event\r\n * @param {string} name - Event name\r\n * @param {*} detail - Event detail data\r\n */\r\n emit(name, detail) {\r\n this.dispatchEvent(new CustomEvent(name, {\r\n detail,\r\n bubbles: true,\r\n composed: true\r\n }));\r\n }\r\n}\r\n\r\n/**\r\n * Register a component with the Custom Elements registry\r\n * @param {string} name - Component tag name (must include hyphen)\r\n * @param {typeof HTMLElement} component - Component class\r\n */\r\nexport function registerComponent(name, component) {\r\n if (!customElements.get(name)) {\r\n customElements.define(name, component);\r\n }\r\n}\r\n\r\nexport { html };\r\nexport default { AfriCodeComponent, registerComponent, html };\r\n",
10
+ "/**\r\n * AfriCode Button Component\r\n * \r\n * Versatile button with multiple variants, sizes, and cultural themes.\r\n * Suitable for: E-commerce, Healthcare, Education, Finance, Government\r\n * \r\n * @module components/button\r\n */\r\n\r\nimport { AfriCodeComponent, registerComponent } from './base.js';\r\n\r\nexport class AfriButton extends AfriCodeComponent {\r\n static get observedAttributes() {\r\n return ['variant', 'size', 'theme', 'disabled', 'loading', 'icon', 'aria-label'];\r\n }\r\n\r\n constructor() {\r\n super();\r\n this.render();\r\n }\r\n\r\n connectedCallback() {\r\n const button = this.shadowRoot.querySelector('button');\r\n button?.addEventListener('click', (e) => {\r\n if (this.hasAttribute('disabled') || this.hasAttribute('loading')) {\r\n e.preventDefault();\r\n return;\r\n }\r\n this.emit('af-click', { originalEvent: e });\r\n });\r\n }\r\n\r\n attributeChangedCallback() {\r\n this.render();\r\n }\r\n\r\n render() {\r\n const variant = this.getAttribute('variant') || 'primary';\r\n const size = this.getAttribute('size') || 'md';\r\n const theme = this.getAttribute('theme') || 'tanzania';\r\n const isDisabled = this.hasAttribute('disabled');\r\n const isLoading = this.hasAttribute('loading');\r\n const icon = this.getAttribute('icon');\r\n const ariaLabel = this.getAttribute('aria-label');\r\n\r\n const themes = {\r\n tanzania: { primary: '#1EB53A', accent: '#FCD116', text: '#FFFFFF' },\r\n maasai: { primary: '#FF0000', accent: '#8B0000', text: '#FFFFFF' },\r\n ndebele: { primary: '#4169E1', accent: '#FFD700', text: '#FFFFFF' },\r\n ocean: { primary: '#00A3DD', accent: '#0077BE', text: '#FFFFFF' }\r\n };\r\n\r\n const t = themes[theme] || themes.tanzania;\r\n\r\n this.shadowRoot.innerHTML = `\r\n <style>\r\n :host {\r\n display: inline-block;\r\n }\r\n\r\n button {\r\n font-family: 'Inter', system-ui, sans-serif;\r\n font-weight: 600;\r\n border: none;\r\n border-radius: 5px;\r\n cursor: pointer;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 8px;\r\n transition: all 200ms ease-out;\r\n position: relative;\r\n overflow: hidden;\r\n }\r\n\r\n /* Sizes */\r\n .size-sm { padding: 5px 13px; font-size: 13px; }\r\n .size-md { padding: 8px 21px; font-size: 15px; }\r\n .size-lg { padding: 13px 34px; font-size: 17px; }\r\n\r\n /* Variants */\r\n .variant-primary {\r\n background: ${t.primary};\r\n color: ${t.text};\r\n }\r\n .variant-primary:hover:not(:disabled) {\r\n filter: brightness(1.1);\r\n transform: translateY(-2px);\r\n box-shadow: 0 4px 12px rgba(0,0,0,0.2);\r\n }\r\n\r\n .variant-secondary {\r\n background: transparent;\r\n color: ${t.primary};\r\n border: 2px solid ${t.primary};\r\n }\r\n .variant-secondary:hover:not(:disabled) {\r\n background: ${t.primary};\r\n color: ${t.text};\r\n }\r\n\r\n .variant-ghost {\r\n background: transparent;\r\n color: ${t.primary};\r\n }\r\n .variant-ghost:hover:not(:disabled) {\r\n background: rgba(0,0,0,0.05);\r\n }\r\n\r\n .variant-gradient {\r\n background: linear-gradient(135deg, ${t.primary} 0%, ${t.accent} 100%);\r\n color: ${t.text};\r\n }\r\n .variant-gradient:hover:not(:disabled) {\r\n transform: translateY(-2px);\r\n box-shadow: 0 6px 20px rgba(0,0,0,0.25);\r\n }\r\n\r\n /* States */\r\n button:disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n }\r\n\r\n button:active:not(:disabled) {\r\n transform: translateY(0);\r\n }\r\n\r\n /* Loading spinner */\r\n .spinner {\r\n width: 16px;\r\n height: 16px;\r\n border: 2px solid transparent;\r\n border-top-color: currentColor;\r\n border-radius: 50%;\r\n animation: spin 0.8s linear infinite;\r\n }\r\n\r\n @keyframes spin {\r\n to { transform: rotate(360deg); }\r\n }\r\n\r\n /* Icon */\r\n .icon {\r\n font-size: 1.1em;\r\n }\r\n </style>\r\n\r\n <button \r\n class=\"variant-${variant} size-${size}\"\r\n ${isDisabled ? 'disabled' : ''}\r\n ${ariaLabel ? `aria-label=\"${ariaLabel}\"` : ''}\r\n ${isLoading ? 'aria-busy=\"true\"' : ''}\r\n >\r\n ${isLoading ? '<span class=\"spinner\"></span>' : ''}\r\n ${icon && !isLoading ? `<span class=\"icon\">${icon}</span>` : ''}\r\n <slot></slot>\r\n </button>\r\n `;\r\n }\r\n}\r\n\r\nregisterComponent('af-button', AfriButton);\r\nexport default AfriButton;\r\n",
11
+ "/**\r\n * AfriCode Simple Card Component\r\n * \r\n * Versatile content card for various use cases.\r\n * Suitable for: Product cards, Blog posts, Team members, Stats\r\n * \r\n * @module components/card\r\n */\r\n\r\nimport { AfriCodeComponent, registerComponent } from './base.js';\r\n\r\nexport class AfriCard extends AfriCodeComponent {\r\n static get observedAttributes() {\r\n return ['theme', 'variant', 'clickable', 'image'];\r\n }\r\n\r\n constructor() {\r\n super();\r\n this.render();\r\n }\r\n\r\n connectedCallback() {\r\n if (this.hasAttribute('clickable')) {\r\n this.shadowRoot.querySelector('.card').addEventListener('click', () => {\r\n this.emit('af-click');\r\n });\r\n }\r\n }\r\n\r\n attributeChangedCallback() {\r\n this.render();\r\n }\r\n\r\n render() {\r\n const theme = this.getAttribute('theme') || 'default';\r\n const variant = this.getAttribute('variant') || 'elevated';\r\n const clickable = this.hasAttribute('clickable');\r\n const image = this.getAttribute('image');\r\n\r\n const themes = {\r\n default: { accent: '#333', border: '#eee' },\r\n tanzania: { accent: '#1EB53A', border: '#1EB53A' },\r\n maasai: { accent: '#FF0000', border: '#8B0000' },\r\n ndebele: { accent: '#4169E1', border: '#4169E1' }\r\n };\r\n const t = themes[theme] || themes.default;\r\n\r\n const variants = {\r\n elevated: 'box-shadow: 0 2px 12px rgba(0,0,0,0.1);',\r\n outlined: `border: 2px solid ${t.border};`,\r\n flat: 'background: #f8f9fa;'\r\n };\r\n\r\n this.shadowRoot.innerHTML = html`\r\n <style>\r\n :host {\r\n display: block;\r\n font-family: var(--font-body, 'Inter', sans-serif);\r\n }\r\n\r\n .card {\r\n background: var(--glass-bg, rgba(15, 23, 42, 0.7));\r\n backdrop-filter: blur(var(--glass-blur, 12px));\r\n border: 1px solid var(--glass-border, rgba(255, 255, 255, 0.1));\r\n border-radius: var(--radius-lg, 16px);\r\n overflow: hidden;\r\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\r\n position: relative;\r\n ${clickable ? 'cursor: pointer;' : ''}\r\n }\r\n\r\n .card::before {\r\n content: '';\r\n position: absolute;\r\n inset: 0;\r\n background: radial-gradient(circle at top left, rgba(255,255,255,0.05), transparent);\r\n pointer-events: none;\r\n }\r\n\r\n ${clickable ? `\r\n .card:hover {\r\n transform: translateY(-8px);\r\n border-color: rgba(252, 209, 22, 0.4);\r\n box-shadow: 0 20px 40px rgba(0,0,0,0.4);\r\n }\r\n ` : ''}\r\n\r\n .card-image {\r\n width: 100%;\r\n height: 200px;\r\n object-fit: cover;\r\n border-bottom: 1px solid var(--glass-border);\r\n }\r\n\r\n .card-body {\r\n padding: 32px;\r\n }\r\n\r\n ::slotted(h1), ::slotted(h2), ::slotted(h3), ::slotted(h4) {\r\n margin: 0 0 12px 0;\r\n font-family: 'Outfit', sans-serif;\r\n font-weight: 700;\r\n color: var(--text-primary, #fff);\r\n letter-spacing: -0.02em;\r\n }\r\n\r\n ::slotted(p) {\r\n margin: 0;\r\n color: var(--text-muted, #94a3b8);\r\n line-height: 1.6;\r\n font-size: 0.95rem;\r\n }\r\n\r\n .card-footer {\r\n padding: 20px 32px;\r\n background: rgba(0,0,0,0.2);\r\n border-top: 1px solid var(--glass-border);\r\n }\r\n </style>\r\n\r\n <article class=\"card\">\r\n ${image ? `<img class=\"card-image\" src=\"${image}\" alt=\"\" />` : ''}\r\n <div class=\"card-body\">\r\n <slot></slot>\r\n </div>\r\n ${this.querySelector('[slot=\"footer\"]') ? `\r\n <div class=\"card-footer\">\r\n <slot name=\"footer\"></slot>\r\n </div>\r\n ` : ''}\r\n </article>\r\n `;\r\n }\r\n}\r\n\r\nregisterComponent('af-card', AfriCard);\r\nexport default AfriCard;\r\n",
12
+ "/**\r\n * AfriCode Navigation Bar Component\r\n * \r\n * Responsive navigation with logo, links, and mobile menu.\r\n * Suitable for: All websites and web applications\r\n * \r\n * @module components/navbar\r\n */\r\n\r\nimport { AfriCodeComponent, registerComponent } from './base.js';\r\nimport { store } from '../core/store.js';\r\nimport { subscribe } from '../core/state.js';\r\n\r\nexport class AfriNavbar extends AfriCodeComponent {\r\n static get observedAttributes() {\r\n return ['theme', 'logo', 'sticky'];\r\n }\r\n\r\n constructor() {\r\n super();\r\n this._isOpen = false;\r\n this._unsubscribe = null;\r\n this.render();\r\n }\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n\r\n // Mobile toggle\r\n this.shadowRoot.querySelector('.menu-toggle')?.addEventListener('click', () => {\r\n this._isOpen = !this._isOpen;\r\n const navLinks = this.shadowRoot.querySelector('.nav-links');\r\n const toggle = this.shadowRoot.querySelector('.menu-toggle');\r\n if (navLinks) {navLinks.classList.toggle('open', this._isOpen);}\r\n if (toggle) {\r\n toggle.classList.toggle('open', this._isOpen);\r\n toggle.setAttribute('aria-expanded', String(this._isOpen));\r\n }\r\n });\r\n }\r\n\r\n disconnectedCallback() {\r\n if (this._unsubscribe) {this._unsubscribe();}\r\n }\r\n\r\n attributeChangedCallback() {\r\n this.render();\r\n }\r\n\r\n render() {\r\n const theme = this.getAttribute('theme') || 'dark';\r\n const logo = this.getAttribute('logo') || 'AfriCode';\r\n const sticky = this.hasAttribute('sticky');\r\n\r\n this.shadowRoot.innerHTML = `\r\n <style>\r\n :host {\r\n display: block;\r\n --nav-height: 80px;\r\n }\r\n\r\n nav {\r\n height: var(--nav-height);\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding-inline: 5%;\r\n background: var(--glass-bg);\r\n backdrop-filter: blur(12px);\r\n -webkit-backdrop-filter: blur(12px);\r\n border-bottom: 1px solid var(--glass-border);\r\n position: fixed;\r\n top: 0;\r\n inset-inline: 0;\r\n z-index: 1000;\r\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\r\n }\r\n\r\n .logo-container {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n text-decoration: none;\r\n z-index: 1002;\r\n }\r\n\r\n .logo-mark {\r\n width: 32px;\r\n height: 32px;\r\n background: linear-gradient(135deg, var(--afri-green, #1eb53a), var(--afri-gold, #fcd116));\r\n border-radius: 8px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-weight: 900;\r\n color: black;\r\n font-size: 1rem;\r\n }\r\n\r\n .logo-text {\r\n font-family: 'Outfit', 'Space Grotesk', sans-serif;\r\n font-size: 1.5rem;\r\n font-weight: 800;\r\n color: var(--text-primary);\r\n letter-spacing: -0.02em;\r\n }\r\n\r\n .nav-links {\r\n display: flex;\r\n gap: 32px;\r\n align-items: center;\r\n list-style: none;\r\n margin: 0;\r\n padding: 0;\r\n }\r\n\r\n .nav-links ::slotted(a) {\r\n color: var(--text-muted);\r\n text-decoration: none;\r\n font-size: 0.95rem;\r\n font-weight: 500;\r\n transition: all 0.2s ease;\r\n position: relative;\r\n padding: 8px 0;\r\n }\r\n\r\n .nav-links ::slotted(a:hover),\r\n .nav-links ::slotted(a.active) {\r\n color: var(--text-primary);\r\n }\r\n\r\n .nav-links ::slotted(a)::after {\r\n content: '';\r\n position: absolute;\r\n bottom: 0;\r\n left: 50%;\r\n width: 0;\r\n height: 2px;\r\n background: var(--afri-gold, #fcd116);\r\n transition: all 0.3s ease;\r\n transform: translateX(-50%);\r\n }\r\n\r\n .nav-links ::slotted(a:hover)::after,\r\n .nav-links ::slotted(a.active)::after {\r\n width: 100%;\r\n }\r\n\r\n /* Mobile Toggle */\r\n .menu-toggle {\r\n display: none;\r\n flex-direction: column;\r\n gap: 6px;\r\n background: none;\r\n border: none;\r\n cursor: pointer;\r\n z-index: 1002;\r\n padding: 8px;\r\n }\r\n\r\n .menu-toggle span {\r\n width: 24px;\r\n height: 2px;\r\n background: var(--text-primary);\r\n border-radius: 2px;\r\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\r\n }\r\n\r\n /* Mobile State */\r\n .menu-toggle.open span:nth-child(1) { transform: translateY(8px) rotate(45deg); }\r\n .menu-toggle.open span:nth-child(2) { opacity: 0; transform: translateX(-10px); }\r\n .menu-toggle.open span:nth-child(3) { transform: translateY(-8px) rotate(-45deg); }\r\n\r\n @media (max-width: 768px) {\r\n .menu-toggle {\r\n display: flex;\r\n }\r\n\r\n .nav-links {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100vh;\r\n background: var(--bg-base, #020617);\r\n flex-direction: column;\r\n justify-content: center;\r\n align-items: center;\r\n gap: 24px;\r\n opacity: 0;\r\n visibility: hidden;\r\n transform: translateY(-20px);\r\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\r\n z-index: 1001;\r\n }\r\n\r\n .nav-links.open {\r\n opacity: 1;\r\n visibility: visible;\r\n transform: translateY(0);\r\n }\r\n\r\n .nav-links ::slotted(a) {\r\n font-size: 1.5rem;\r\n font-weight: 700;\r\n }\r\n }\r\n </style>\r\n\r\n <nav>\r\n <a href=\"/\" class=\"logo-container\">\r\n <div class=\"logo-mark\">A</div>\r\n <span class=\"logo-text\">${logo}</span>\r\n </a>\r\n\r\n <button\r\n class=\"menu-toggle\"\r\n aria-label=\"Toggle menu\"\r\n aria-controls=\"nav-links\"\r\n aria-expanded=\"${this._isOpen}\"\r\n >\r\n <span></span>\r\n <span></span>\r\n <span></span>\r\n </button>\r\n\r\n <div id=\"nav-links\" class=\"nav-links ${this._isOpen ? 'open' : ''}\">\r\n <slot></slot>\r\n </div>\r\n </nav>\r\n `;\r\n }\r\n}\r\n\r\nregisterComponent('af-navbar', AfriNavbar);\r\nexport default AfriNavbar;\r\n",
13
+ "export var util;\n(function (util) {\n util.assertEqual = (_) => { };\n function assertIs(_arg) { }\n util.assertIs = assertIs;\n function assertNever(_x) {\n throw new Error();\n }\n util.assertNever = assertNever;\n util.arrayToEnum = (items) => {\n const obj = {};\n for (const item of items) {\n obj[item] = item;\n }\n return obj;\n };\n util.getValidEnumValues = (obj) => {\n const validKeys = util.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== \"number\");\n const filtered = {};\n for (const k of validKeys) {\n filtered[k] = obj[k];\n }\n return util.objectValues(filtered);\n };\n util.objectValues = (obj) => {\n return util.objectKeys(obj).map(function (e) {\n return obj[e];\n });\n };\n util.objectKeys = typeof Object.keys === \"function\" // eslint-disable-line ban/ban\n ? (obj) => Object.keys(obj) // eslint-disable-line ban/ban\n : (object) => {\n const keys = [];\n for (const key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n keys.push(key);\n }\n }\n return keys;\n };\n util.find = (arr, checker) => {\n for (const item of arr) {\n if (checker(item))\n return item;\n }\n return undefined;\n };\n util.isInteger = typeof Number.isInteger === \"function\"\n ? (val) => Number.isInteger(val) // eslint-disable-line ban/ban\n : (val) => typeof val === \"number\" && Number.isFinite(val) && Math.floor(val) === val;\n function joinValues(array, separator = \" | \") {\n return array.map((val) => (typeof val === \"string\" ? `'${val}'` : val)).join(separator);\n }\n util.joinValues = joinValues;\n util.jsonStringifyReplacer = (_, value) => {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n };\n})(util || (util = {}));\nexport var objectUtil;\n(function (objectUtil) {\n objectUtil.mergeShapes = (first, second) => {\n return {\n ...first,\n ...second, // second overwrites first\n };\n };\n})(objectUtil || (objectUtil = {}));\nexport const ZodParsedType = util.arrayToEnum([\n \"string\",\n \"nan\",\n \"number\",\n \"integer\",\n \"float\",\n \"boolean\",\n \"date\",\n \"bigint\",\n \"symbol\",\n \"function\",\n \"undefined\",\n \"null\",\n \"array\",\n \"object\",\n \"unknown\",\n \"promise\",\n \"void\",\n \"never\",\n \"map\",\n \"set\",\n]);\nexport const getParsedType = (data) => {\n const t = typeof data;\n switch (t) {\n case \"undefined\":\n return ZodParsedType.undefined;\n case \"string\":\n return ZodParsedType.string;\n case \"number\":\n return Number.isNaN(data) ? ZodParsedType.nan : ZodParsedType.number;\n case \"boolean\":\n return ZodParsedType.boolean;\n case \"function\":\n return ZodParsedType.function;\n case \"bigint\":\n return ZodParsedType.bigint;\n case \"symbol\":\n return ZodParsedType.symbol;\n case \"object\":\n if (Array.isArray(data)) {\n return ZodParsedType.array;\n }\n if (data === null) {\n return ZodParsedType.null;\n }\n if (data.then && typeof data.then === \"function\" && data.catch && typeof data.catch === \"function\") {\n return ZodParsedType.promise;\n }\n if (typeof Map !== \"undefined\" && data instanceof Map) {\n return ZodParsedType.map;\n }\n if (typeof Set !== \"undefined\" && data instanceof Set) {\n return ZodParsedType.set;\n }\n if (typeof Date !== \"undefined\" && data instanceof Date) {\n return ZodParsedType.date;\n }\n return ZodParsedType.object;\n default:\n return ZodParsedType.unknown;\n }\n};\n",
14
+ "import { util } from \"./helpers/util.js\";\nexport const ZodIssueCode = util.arrayToEnum([\n \"invalid_type\",\n \"invalid_literal\",\n \"custom\",\n \"invalid_union\",\n \"invalid_union_discriminator\",\n \"invalid_enum_value\",\n \"unrecognized_keys\",\n \"invalid_arguments\",\n \"invalid_return_type\",\n \"invalid_date\",\n \"invalid_string\",\n \"too_small\",\n \"too_big\",\n \"invalid_intersection_types\",\n \"not_multiple_of\",\n \"not_finite\",\n]);\nexport const quotelessJson = (obj) => {\n const json = JSON.stringify(obj, null, 2);\n return json.replace(/\"([^\"]+)\":/g, \"$1:\");\n};\nexport class ZodError extends Error {\n get errors() {\n return this.issues;\n }\n constructor(issues) {\n super();\n this.issues = [];\n this.addIssue = (sub) => {\n this.issues = [...this.issues, sub];\n };\n this.addIssues = (subs = []) => {\n this.issues = [...this.issues, ...subs];\n };\n const actualProto = new.target.prototype;\n if (Object.setPrototypeOf) {\n // eslint-disable-next-line ban/ban\n Object.setPrototypeOf(this, actualProto);\n }\n else {\n this.__proto__ = actualProto;\n }\n this.name = \"ZodError\";\n this.issues = issues;\n }\n format(_mapper) {\n const mapper = _mapper ||\n function (issue) {\n return issue.message;\n };\n const fieldErrors = { _errors: [] };\n const processError = (error) => {\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\") {\n issue.unionErrors.map(processError);\n }\n else if (issue.code === \"invalid_return_type\") {\n processError(issue.returnTypeError);\n }\n else if (issue.code === \"invalid_arguments\") {\n processError(issue.argumentsError);\n }\n else if (issue.path.length === 0) {\n fieldErrors._errors.push(mapper(issue));\n }\n else {\n let curr = fieldErrors;\n let i = 0;\n while (i < issue.path.length) {\n const el = issue.path[i];\n const terminal = i === issue.path.length - 1;\n if (!terminal) {\n curr[el] = curr[el] || { _errors: [] };\n // if (typeof el === \"string\") {\n // curr[el] = curr[el] || { _errors: [] };\n // } else if (typeof el === \"number\") {\n // const errorArray: any = [];\n // errorArray._errors = [];\n // curr[el] = curr[el] || errorArray;\n // }\n }\n else {\n curr[el] = curr[el] || { _errors: [] };\n curr[el]._errors.push(mapper(issue));\n }\n curr = curr[el];\n i++;\n }\n }\n }\n };\n processError(this);\n return fieldErrors;\n }\n static assert(value) {\n if (!(value instanceof ZodError)) {\n throw new Error(`Not a ZodError: ${value}`);\n }\n }\n toString() {\n return this.message;\n }\n get message() {\n return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2);\n }\n get isEmpty() {\n return this.issues.length === 0;\n }\n flatten(mapper = (issue) => issue.message) {\n const fieldErrors = {};\n const formErrors = [];\n for (const sub of this.issues) {\n if (sub.path.length > 0) {\n const firstEl = sub.path[0];\n fieldErrors[firstEl] = fieldErrors[firstEl] || [];\n fieldErrors[firstEl].push(mapper(sub));\n }\n else {\n formErrors.push(mapper(sub));\n }\n }\n return { formErrors, fieldErrors };\n }\n get formErrors() {\n return this.flatten();\n }\n}\nZodError.create = (issues) => {\n const error = new ZodError(issues);\n return error;\n};\n",
15
+ "import { ZodIssueCode } from \"../ZodError.js\";\nimport { util, ZodParsedType } from \"../helpers/util.js\";\nconst errorMap = (issue, _ctx) => {\n let message;\n switch (issue.code) {\n case ZodIssueCode.invalid_type:\n if (issue.received === ZodParsedType.undefined) {\n message = \"Required\";\n }\n else {\n message = `Expected ${issue.expected}, received ${issue.received}`;\n }\n break;\n case ZodIssueCode.invalid_literal:\n message = `Invalid literal value, expected ${JSON.stringify(issue.expected, util.jsonStringifyReplacer)}`;\n break;\n case ZodIssueCode.unrecognized_keys:\n message = `Unrecognized key(s) in object: ${util.joinValues(issue.keys, \", \")}`;\n break;\n case ZodIssueCode.invalid_union:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_union_discriminator:\n message = `Invalid discriminator value. Expected ${util.joinValues(issue.options)}`;\n break;\n case ZodIssueCode.invalid_enum_value:\n message = `Invalid enum value. Expected ${util.joinValues(issue.options)}, received '${issue.received}'`;\n break;\n case ZodIssueCode.invalid_arguments:\n message = `Invalid function arguments`;\n break;\n case ZodIssueCode.invalid_return_type:\n message = `Invalid function return type`;\n break;\n case ZodIssueCode.invalid_date:\n message = `Invalid date`;\n break;\n case ZodIssueCode.invalid_string:\n if (typeof issue.validation === \"object\") {\n if (\"includes\" in issue.validation) {\n message = `Invalid input: must include \"${issue.validation.includes}\"`;\n if (typeof issue.validation.position === \"number\") {\n message = `${message} at one or more positions greater than or equal to ${issue.validation.position}`;\n }\n }\n else if (\"startsWith\" in issue.validation) {\n message = `Invalid input: must start with \"${issue.validation.startsWith}\"`;\n }\n else if (\"endsWith\" in issue.validation) {\n message = `Invalid input: must end with \"${issue.validation.endsWith}\"`;\n }\n else {\n util.assertNever(issue.validation);\n }\n }\n else if (issue.validation !== \"regex\") {\n message = `Invalid ${issue.validation}`;\n }\n else {\n message = \"Invalid\";\n }\n break;\n case ZodIssueCode.too_small:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `more than`} ${issue.minimum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `over`} ${issue.minimum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${issue.minimum}`;\n else if (issue.type === \"bigint\")\n message = `Number must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${issue.minimum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${new Date(Number(issue.minimum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.too_big:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `less than`} ${issue.maximum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `under`} ${issue.maximum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`;\n else if (issue.type === \"bigint\")\n message = `BigInt must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact ? `exactly` : issue.inclusive ? `smaller than or equal to` : `smaller than`} ${new Date(Number(issue.maximum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.custom:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_intersection_types:\n message = `Intersection results could not be merged`;\n break;\n case ZodIssueCode.not_multiple_of:\n message = `Number must be a multiple of ${issue.multipleOf}`;\n break;\n case ZodIssueCode.not_finite:\n message = \"Number must be finite\";\n break;\n default:\n message = _ctx.defaultError;\n util.assertNever(issue);\n }\n return { message };\n};\nexport default errorMap;\n",
16
+ "import defaultErrorMap from \"./locales/en.js\";\nlet overrideErrorMap = defaultErrorMap;\nexport { defaultErrorMap };\nexport function setErrorMap(map) {\n overrideErrorMap = map;\n}\nexport function getErrorMap() {\n return overrideErrorMap;\n}\n",
17
+ "import { getErrorMap } from \"../errors.js\";\nimport defaultErrorMap from \"../locales/en.js\";\nexport const makeIssue = (params) => {\n const { data, path, errorMaps, issueData } = params;\n const fullPath = [...path, ...(issueData.path || [])];\n const fullIssue = {\n ...issueData,\n path: fullPath,\n };\n if (issueData.message !== undefined) {\n return {\n ...issueData,\n path: fullPath,\n message: issueData.message,\n };\n }\n let errorMessage = \"\";\n const maps = errorMaps\n .filter((m) => !!m)\n .slice()\n .reverse();\n for (const map of maps) {\n errorMessage = map(fullIssue, { data, defaultError: errorMessage }).message;\n }\n return {\n ...issueData,\n path: fullPath,\n message: errorMessage,\n };\n};\nexport const EMPTY_PATH = [];\nexport function addIssueToContext(ctx, issueData) {\n const overrideMap = getErrorMap();\n const issue = makeIssue({\n issueData: issueData,\n data: ctx.data,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap, // contextual error map is first priority\n ctx.schemaErrorMap, // then schema-bound map if available\n overrideMap, // then global override map\n overrideMap === defaultErrorMap ? undefined : defaultErrorMap, // then global default map\n ].filter((x) => !!x),\n });\n ctx.common.issues.push(issue);\n}\nexport class ParseStatus {\n constructor() {\n this.value = \"valid\";\n }\n dirty() {\n if (this.value === \"valid\")\n this.value = \"dirty\";\n }\n abort() {\n if (this.value !== \"aborted\")\n this.value = \"aborted\";\n }\n static mergeArray(status, results) {\n const arrayValue = [];\n for (const s of results) {\n if (s.status === \"aborted\")\n return INVALID;\n if (s.status === \"dirty\")\n status.dirty();\n arrayValue.push(s.value);\n }\n return { status: status.value, value: arrayValue };\n }\n static async mergeObjectAsync(status, pairs) {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n });\n }\n return ParseStatus.mergeObjectSync(status, syncPairs);\n }\n static mergeObjectSync(status, pairs) {\n const finalObject = {};\n for (const pair of pairs) {\n const { key, value } = pair;\n if (key.status === \"aborted\")\n return INVALID;\n if (value.status === \"aborted\")\n return INVALID;\n if (key.status === \"dirty\")\n status.dirty();\n if (value.status === \"dirty\")\n status.dirty();\n if (key.value !== \"__proto__\" && (typeof value.value !== \"undefined\" || pair.alwaysSet)) {\n finalObject[key.value] = value.value;\n }\n }\n return { status: status.value, value: finalObject };\n }\n}\nexport const INVALID = Object.freeze({\n status: \"aborted\",\n});\nexport const DIRTY = (value) => ({ status: \"dirty\", value });\nexport const OK = (value) => ({ status: \"valid\", value });\nexport const isAborted = (x) => x.status === \"aborted\";\nexport const isDirty = (x) => x.status === \"dirty\";\nexport const isValid = (x) => x.status === \"valid\";\nexport const isAsync = (x) => typeof Promise !== \"undefined\" && x instanceof Promise;\n",
18
+ "export var errorUtil;\n(function (errorUtil) {\n errorUtil.errToObj = (message) => typeof message === \"string\" ? { message } : message || {};\n // biome-ignore lint:\n errorUtil.toString = (message) => typeof message === \"string\" ? message : message?.message;\n})(errorUtil || (errorUtil = {}));\n",
19
+ "import { ZodError, ZodIssueCode, } from \"./ZodError.js\";\nimport { defaultErrorMap, getErrorMap } from \"./errors.js\";\nimport { errorUtil } from \"./helpers/errorUtil.js\";\nimport { DIRTY, INVALID, OK, ParseStatus, addIssueToContext, isAborted, isAsync, isDirty, isValid, makeIssue, } from \"./helpers/parseUtil.js\";\nimport { util, ZodParsedType, getParsedType } from \"./helpers/util.js\";\nclass ParseInputLazyPath {\n constructor(parent, value, path, key) {\n this._cachedPath = [];\n this.parent = parent;\n this.data = value;\n this._path = path;\n this._key = key;\n }\n get path() {\n if (!this._cachedPath.length) {\n if (Array.isArray(this._key)) {\n this._cachedPath.push(...this._path, ...this._key);\n }\n else {\n this._cachedPath.push(...this._path, this._key);\n }\n }\n return this._cachedPath;\n }\n}\nconst handleResult = (ctx, result) => {\n if (isValid(result)) {\n return { success: true, data: result.value };\n }\n else {\n if (!ctx.common.issues.length) {\n throw new Error(\"Validation failed but no issues detected.\");\n }\n return {\n success: false,\n get error() {\n if (this._error)\n return this._error;\n const error = new ZodError(ctx.common.issues);\n this._error = error;\n return this._error;\n },\n };\n }\n};\nfunction processCreateParams(params) {\n if (!params)\n return {};\n const { errorMap, invalid_type_error, required_error, description } = params;\n if (errorMap && (invalid_type_error || required_error)) {\n throw new Error(`Can't use \"invalid_type_error\" or \"required_error\" in conjunction with custom error map.`);\n }\n if (errorMap)\n return { errorMap: errorMap, description };\n const customMap = (iss, ctx) => {\n const { message } = params;\n if (iss.code === \"invalid_enum_value\") {\n return { message: message ?? ctx.defaultError };\n }\n if (typeof ctx.data === \"undefined\") {\n return { message: message ?? required_error ?? ctx.defaultError };\n }\n if (iss.code !== \"invalid_type\")\n return { message: ctx.defaultError };\n return { message: message ?? invalid_type_error ?? ctx.defaultError };\n };\n return { errorMap: customMap, description };\n}\nexport class ZodType {\n get description() {\n return this._def.description;\n }\n _getType(input) {\n return getParsedType(input.data);\n }\n _getOrReturnCtx(input, ctx) {\n return (ctx || {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n });\n }\n _processInputParams(input) {\n return {\n status: new ParseStatus(),\n ctx: {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n },\n };\n }\n _parseSync(input) {\n const result = this._parse(input);\n if (isAsync(result)) {\n throw new Error(\"Synchronous parse encountered promise.\");\n }\n return result;\n }\n _parseAsync(input) {\n const result = this._parse(input);\n return Promise.resolve(result);\n }\n parse(data, params) {\n const result = this.safeParse(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n safeParse(data, params) {\n const ctx = {\n common: {\n issues: [],\n async: params?.async ?? false,\n contextualErrorMap: params?.errorMap,\n },\n path: params?.path || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const result = this._parseSync({ data, path: ctx.path, parent: ctx });\n return handleResult(ctx, result);\n }\n \"~validate\"(data) {\n const ctx = {\n common: {\n issues: [],\n async: !!this[\"~standard\"].async,\n },\n path: [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n if (!this[\"~standard\"].async) {\n try {\n const result = this._parseSync({ data, path: [], parent: ctx });\n return isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n };\n }\n catch (err) {\n if (err?.message?.toLowerCase()?.includes(\"encountered\")) {\n this[\"~standard\"].async = true;\n }\n ctx.common = {\n issues: [],\n async: true,\n };\n }\n }\n return this._parseAsync({ data, path: [], parent: ctx }).then((result) => isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n });\n }\n async parseAsync(data, params) {\n const result = await this.safeParseAsync(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n async safeParseAsync(data, params) {\n const ctx = {\n common: {\n issues: [],\n contextualErrorMap: params?.errorMap,\n async: true,\n },\n path: params?.path || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const maybeAsyncResult = this._parse({ data, path: ctx.path, parent: ctx });\n const result = await (isAsync(maybeAsyncResult) ? maybeAsyncResult : Promise.resolve(maybeAsyncResult));\n return handleResult(ctx, result);\n }\n refine(check, message) {\n const getIssueProperties = (val) => {\n if (typeof message === \"string\" || typeof message === \"undefined\") {\n return { message };\n }\n else if (typeof message === \"function\") {\n return message(val);\n }\n else {\n return message;\n }\n };\n return this._refinement((val, ctx) => {\n const result = check(val);\n const setError = () => ctx.addIssue({\n code: ZodIssueCode.custom,\n ...getIssueProperties(val),\n });\n if (typeof Promise !== \"undefined\" && result instanceof Promise) {\n return result.then((data) => {\n if (!data) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n if (!result) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n refinement(check, refinementData) {\n return this._refinement((val, ctx) => {\n if (!check(val)) {\n ctx.addIssue(typeof refinementData === \"function\" ? refinementData(val, ctx) : refinementData);\n return false;\n }\n else {\n return true;\n }\n });\n }\n _refinement(refinement) {\n return new ZodEffects({\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"refinement\", refinement },\n });\n }\n superRefine(refinement) {\n return this._refinement(refinement);\n }\n constructor(def) {\n /** Alias of safeParseAsync */\n this.spa = this.safeParseAsync;\n this._def = def;\n this.parse = this.parse.bind(this);\n this.safeParse = this.safeParse.bind(this);\n this.parseAsync = this.parseAsync.bind(this);\n this.safeParseAsync = this.safeParseAsync.bind(this);\n this.spa = this.spa.bind(this);\n this.refine = this.refine.bind(this);\n this.refinement = this.refinement.bind(this);\n this.superRefine = this.superRefine.bind(this);\n this.optional = this.optional.bind(this);\n this.nullable = this.nullable.bind(this);\n this.nullish = this.nullish.bind(this);\n this.array = this.array.bind(this);\n this.promise = this.promise.bind(this);\n this.or = this.or.bind(this);\n this.and = this.and.bind(this);\n this.transform = this.transform.bind(this);\n this.brand = this.brand.bind(this);\n this.default = this.default.bind(this);\n this.catch = this.catch.bind(this);\n this.describe = this.describe.bind(this);\n this.pipe = this.pipe.bind(this);\n this.readonly = this.readonly.bind(this);\n this.isNullable = this.isNullable.bind(this);\n this.isOptional = this.isOptional.bind(this);\n this[\"~standard\"] = {\n version: 1,\n vendor: \"zod\",\n validate: (data) => this[\"~validate\"](data),\n };\n }\n optional() {\n return ZodOptional.create(this, this._def);\n }\n nullable() {\n return ZodNullable.create(this, this._def);\n }\n nullish() {\n return this.nullable().optional();\n }\n array() {\n return ZodArray.create(this);\n }\n promise() {\n return ZodPromise.create(this, this._def);\n }\n or(option) {\n return ZodUnion.create([this, option], this._def);\n }\n and(incoming) {\n return ZodIntersection.create(this, incoming, this._def);\n }\n transform(transform) {\n return new ZodEffects({\n ...processCreateParams(this._def),\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"transform\", transform },\n });\n }\n default(def) {\n const defaultValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodDefault({\n ...processCreateParams(this._def),\n innerType: this,\n defaultValue: defaultValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n });\n }\n brand() {\n return new ZodBranded({\n typeName: ZodFirstPartyTypeKind.ZodBranded,\n type: this,\n ...processCreateParams(this._def),\n });\n }\n catch(def) {\n const catchValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodCatch({\n ...processCreateParams(this._def),\n innerType: this,\n catchValue: catchValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n });\n }\n describe(description) {\n const This = this.constructor;\n return new This({\n ...this._def,\n description,\n });\n }\n pipe(target) {\n return ZodPipeline.create(this, target);\n }\n readonly() {\n return ZodReadonly.create(this);\n }\n isOptional() {\n return this.safeParse(undefined).success;\n }\n isNullable() {\n return this.safeParse(null).success;\n }\n}\nconst cuidRegex = /^c[^\\s-]{8,}$/i;\nconst cuid2Regex = /^[0-9a-z]+$/;\nconst ulidRegex = /^[0-9A-HJKMNP-TV-Z]{26}$/i;\n// const uuidRegex =\n// /^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i;\nconst uuidRegex = /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/i;\nconst nanoidRegex = /^[a-z0-9_-]{21}$/i;\nconst jwtRegex = /^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$/;\nconst durationRegex = /^[-+]?P(?!$)(?:(?:[-+]?\\d+Y)|(?:[-+]?\\d+[.,]\\d+Y$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:(?:[-+]?\\d+W)|(?:[-+]?\\d+[.,]\\d+W$))?(?:(?:[-+]?\\d+D)|(?:[-+]?\\d+[.,]\\d+D$))?(?:T(?=[\\d+-])(?:(?:[-+]?\\d+H)|(?:[-+]?\\d+[.,]\\d+H$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:[-+]?\\d+(?:[.,]\\d+)?S)?)??$/;\n// from https://stackoverflow.com/a/46181/1550155\n// old version: too slow, didn't support unicode\n// const emailRegex = /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i;\n//old email regex\n// const emailRegex = /^(([^<>()[\\].,;:\\s@\"]+(\\.[^<>()[\\].,;:\\s@\"]+)*)|(\".+\"))@((?!-)([^<>()[\\].,;:\\s@\"]+\\.)+[^<>()[\\].,;:\\s@\"]{1,})[^-<>()[\\].,;:\\s@\"]$/i;\n// eslint-disable-next-line\n// const emailRegex =\n// /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\])|(\\[IPv6:(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))\\])|([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])*(\\.[A-Za-z]{2,})+))$/;\n// const emailRegex =\n// /^[a-zA-Z0-9\\.\\!\\#\\$\\%\\&\\'\\*\\+\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~\\-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n// const emailRegex =\n// /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])$/i;\nconst emailRegex = /^(?!\\.)(?!.*\\.\\.)([A-Z0-9_'+\\-\\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\\-]*\\.)+[A-Z]{2,}$/i;\n// const emailRegex =\n// /^[a-z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-z0-9-]+(?:\\.[a-z0-9\\-]+)*$/i;\n// from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression\nconst _emojiRegex = `^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$`;\nlet emojiRegex;\n// faster, simpler, safer\nconst ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;\nconst ipv4CidrRegex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/(3[0-2]|[12]?[0-9])$/;\n// const ipv6Regex =\n// /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/;\nconst ipv6Regex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;\nconst ipv6CidrRegex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/;\n// https://stackoverflow.com/questions/7860392/determine-if-string-is-in-base64-using-javascript\nconst base64Regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/;\n// https://base64.guru/standards/base64url\nconst base64urlRegex = /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/;\n// simple\n// const dateRegexSource = `\\\\d{4}-\\\\d{2}-\\\\d{2}`;\n// no leap year validation\n// const dateRegexSource = `\\\\d{4}-((0[13578]|10|12)-31|(0[13-9]|1[0-2])-30|(0[1-9]|1[0-2])-(0[1-9]|1\\\\d|2\\\\d))`;\n// with leap year validation\nconst dateRegexSource = `((\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\\\d|30)|(02)-(0[1-9]|1\\\\d|2[0-8])))`;\nconst dateRegex = new RegExp(`^${dateRegexSource}$`);\nfunction timeRegexSource(args) {\n let secondsRegexSource = `[0-5]\\\\d`;\n if (args.precision) {\n secondsRegexSource = `${secondsRegexSource}\\\\.\\\\d{${args.precision}}`;\n }\n else if (args.precision == null) {\n secondsRegexSource = `${secondsRegexSource}(\\\\.\\\\d+)?`;\n }\n const secondsQuantifier = args.precision ? \"+\" : \"?\"; // require seconds if precision is nonzero\n return `([01]\\\\d|2[0-3]):[0-5]\\\\d(:${secondsRegexSource})${secondsQuantifier}`;\n}\nfunction timeRegex(args) {\n return new RegExp(`^${timeRegexSource(args)}$`);\n}\n// Adapted from https://stackoverflow.com/a/3143231\nexport function datetimeRegex(args) {\n let regex = `${dateRegexSource}T${timeRegexSource(args)}`;\n const opts = [];\n opts.push(args.local ? `Z?` : `Z`);\n if (args.offset)\n opts.push(`([+-]\\\\d{2}:?\\\\d{2})`);\n regex = `${regex}(${opts.join(\"|\")})`;\n return new RegExp(`^${regex}$`);\n}\nfunction isValidIP(ip, version) {\n if ((version === \"v4\" || !version) && ipv4Regex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6Regex.test(ip)) {\n return true;\n }\n return false;\n}\nfunction isValidJWT(jwt, alg) {\n if (!jwtRegex.test(jwt))\n return false;\n try {\n const [header] = jwt.split(\".\");\n if (!header)\n return false;\n // Convert base64url to base64\n const base64 = header\n .replace(/-/g, \"+\")\n .replace(/_/g, \"/\")\n .padEnd(header.length + ((4 - (header.length % 4)) % 4), \"=\");\n const decoded = JSON.parse(atob(base64));\n if (typeof decoded !== \"object\" || decoded === null)\n return false;\n if (\"typ\" in decoded && decoded?.typ !== \"JWT\")\n return false;\n if (!decoded.alg)\n return false;\n if (alg && decoded.alg !== alg)\n return false;\n return true;\n }\n catch {\n return false;\n }\n}\nfunction isValidCidr(ip, version) {\n if ((version === \"v4\" || !version) && ipv4CidrRegex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6CidrRegex.test(ip)) {\n return true;\n }\n return false;\n}\nexport class ZodString extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = String(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.string) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.string,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.length < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.length > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"length\") {\n const tooBig = input.data.length > check.value;\n const tooSmall = input.data.length < check.value;\n if (tooBig || tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n if (tooBig) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n else if (tooSmall) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n status.dirty();\n }\n }\n else if (check.kind === \"email\") {\n if (!emailRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"email\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"emoji\") {\n if (!emojiRegex) {\n emojiRegex = new RegExp(_emojiRegex, \"u\");\n }\n if (!emojiRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"emoji\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"uuid\") {\n if (!uuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"uuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"nanoid\") {\n if (!nanoidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"nanoid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid\") {\n if (!cuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid2\") {\n if (!cuid2Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid2\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ulid\") {\n if (!ulidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ulid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"url\") {\n try {\n new URL(input.data);\n }\n catch {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"regex\") {\n check.regex.lastIndex = 0;\n const testResult = check.regex.test(input.data);\n if (!testResult) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"regex\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"trim\") {\n input.data = input.data.trim();\n }\n else if (check.kind === \"includes\") {\n if (!input.data.includes(check.value, check.position)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { includes: check.value, position: check.position },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"toLowerCase\") {\n input.data = input.data.toLowerCase();\n }\n else if (check.kind === \"toUpperCase\") {\n input.data = input.data.toUpperCase();\n }\n else if (check.kind === \"startsWith\") {\n if (!input.data.startsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { startsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"endsWith\") {\n if (!input.data.endsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { endsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"datetime\") {\n const regex = datetimeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"datetime\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"date\") {\n const regex = dateRegex;\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"date\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"time\") {\n const regex = timeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"time\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"duration\") {\n if (!durationRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"duration\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ip\") {\n if (!isValidIP(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ip\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"jwt\") {\n if (!isValidJWT(input.data, check.alg)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"jwt\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cidr\") {\n if (!isValidCidr(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cidr\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64\") {\n if (!base64Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64url\") {\n if (!base64urlRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _regex(regex, validation, message) {\n return this.refinement((data) => regex.test(data), {\n validation,\n code: ZodIssueCode.invalid_string,\n ...errorUtil.errToObj(message),\n });\n }\n _addCheck(check) {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n email(message) {\n return this._addCheck({ kind: \"email\", ...errorUtil.errToObj(message) });\n }\n url(message) {\n return this._addCheck({ kind: \"url\", ...errorUtil.errToObj(message) });\n }\n emoji(message) {\n return this._addCheck({ kind: \"emoji\", ...errorUtil.errToObj(message) });\n }\n uuid(message) {\n return this._addCheck({ kind: \"uuid\", ...errorUtil.errToObj(message) });\n }\n nanoid(message) {\n return this._addCheck({ kind: \"nanoid\", ...errorUtil.errToObj(message) });\n }\n cuid(message) {\n return this._addCheck({ kind: \"cuid\", ...errorUtil.errToObj(message) });\n }\n cuid2(message) {\n return this._addCheck({ kind: \"cuid2\", ...errorUtil.errToObj(message) });\n }\n ulid(message) {\n return this._addCheck({ kind: \"ulid\", ...errorUtil.errToObj(message) });\n }\n base64(message) {\n return this._addCheck({ kind: \"base64\", ...errorUtil.errToObj(message) });\n }\n base64url(message) {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return this._addCheck({\n kind: \"base64url\",\n ...errorUtil.errToObj(message),\n });\n }\n jwt(options) {\n return this._addCheck({ kind: \"jwt\", ...errorUtil.errToObj(options) });\n }\n ip(options) {\n return this._addCheck({ kind: \"ip\", ...errorUtil.errToObj(options) });\n }\n cidr(options) {\n return this._addCheck({ kind: \"cidr\", ...errorUtil.errToObj(options) });\n }\n datetime(options) {\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"datetime\",\n precision: null,\n offset: false,\n local: false,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"datetime\",\n precision: typeof options?.precision === \"undefined\" ? null : options?.precision,\n offset: options?.offset ?? false,\n local: options?.local ?? false,\n ...errorUtil.errToObj(options?.message),\n });\n }\n date(message) {\n return this._addCheck({ kind: \"date\", message });\n }\n time(options) {\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"time\",\n precision: null,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"time\",\n precision: typeof options?.precision === \"undefined\" ? null : options?.precision,\n ...errorUtil.errToObj(options?.message),\n });\n }\n duration(message) {\n return this._addCheck({ kind: \"duration\", ...errorUtil.errToObj(message) });\n }\n regex(regex, message) {\n return this._addCheck({\n kind: \"regex\",\n regex: regex,\n ...errorUtil.errToObj(message),\n });\n }\n includes(value, options) {\n return this._addCheck({\n kind: \"includes\",\n value: value,\n position: options?.position,\n ...errorUtil.errToObj(options?.message),\n });\n }\n startsWith(value, message) {\n return this._addCheck({\n kind: \"startsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n endsWith(value, message) {\n return this._addCheck({\n kind: \"endsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n min(minLength, message) {\n return this._addCheck({\n kind: \"min\",\n value: minLength,\n ...errorUtil.errToObj(message),\n });\n }\n max(maxLength, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxLength,\n ...errorUtil.errToObj(message),\n });\n }\n length(len, message) {\n return this._addCheck({\n kind: \"length\",\n value: len,\n ...errorUtil.errToObj(message),\n });\n }\n /**\n * Equivalent to `.min(1)`\n */\n nonempty(message) {\n return this.min(1, errorUtil.errToObj(message));\n }\n trim() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"trim\" }],\n });\n }\n toLowerCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toLowerCase\" }],\n });\n }\n toUpperCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toUpperCase\" }],\n });\n }\n get isDatetime() {\n return !!this._def.checks.find((ch) => ch.kind === \"datetime\");\n }\n get isDate() {\n return !!this._def.checks.find((ch) => ch.kind === \"date\");\n }\n get isTime() {\n return !!this._def.checks.find((ch) => ch.kind === \"time\");\n }\n get isDuration() {\n return !!this._def.checks.find((ch) => ch.kind === \"duration\");\n }\n get isEmail() {\n return !!this._def.checks.find((ch) => ch.kind === \"email\");\n }\n get isURL() {\n return !!this._def.checks.find((ch) => ch.kind === \"url\");\n }\n get isEmoji() {\n return !!this._def.checks.find((ch) => ch.kind === \"emoji\");\n }\n get isUUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"uuid\");\n }\n get isNANOID() {\n return !!this._def.checks.find((ch) => ch.kind === \"nanoid\");\n }\n get isCUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid\");\n }\n get isCUID2() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid2\");\n }\n get isULID() {\n return !!this._def.checks.find((ch) => ch.kind === \"ulid\");\n }\n get isIP() {\n return !!this._def.checks.find((ch) => ch.kind === \"ip\");\n }\n get isCIDR() {\n return !!this._def.checks.find((ch) => ch.kind === \"cidr\");\n }\n get isBase64() {\n return !!this._def.checks.find((ch) => ch.kind === \"base64\");\n }\n get isBase64url() {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return !!this._def.checks.find((ch) => ch.kind === \"base64url\");\n }\n get minLength() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxLength() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodString.create = (params) => {\n return new ZodString({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodString,\n coerce: params?.coerce ?? false,\n ...processCreateParams(params),\n });\n};\n// https://stackoverflow.com/questions/3966484/why-does-modulus-operator-return-fractional-number-in-javascript/31711034#31711034\nfunction floatSafeRemainder(val, step) {\n const valDecCount = (val.toString().split(\".\")[1] || \"\").length;\n const stepDecCount = (step.toString().split(\".\")[1] || \"\").length;\n const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount;\n const valInt = Number.parseInt(val.toFixed(decCount).replace(\".\", \"\"));\n const stepInt = Number.parseInt(step.toFixed(decCount).replace(\".\", \"\"));\n return (valInt % stepInt) / 10 ** decCount;\n}\nexport class ZodNumber extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n this.step = this.multipleOf;\n }\n _parse(input) {\n if (this._def.coerce) {\n input.data = Number(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.number) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.number,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"int\") {\n if (!util.isInteger(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: \"integer\",\n received: \"float\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"min\") {\n const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (floatSafeRemainder(input.data, check.value) !== 0) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"finite\") {\n if (!Number.isFinite(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_finite,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodNumber({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodNumber({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n int(message) {\n return this._addCheck({\n kind: \"int\",\n message: errorUtil.toString(message),\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value: value,\n message: errorUtil.toString(message),\n });\n }\n finite(message) {\n return this._addCheck({\n kind: \"finite\",\n message: errorUtil.toString(message),\n });\n }\n safe(message) {\n return this._addCheck({\n kind: \"min\",\n inclusive: true,\n value: Number.MIN_SAFE_INTEGER,\n message: errorUtil.toString(message),\n })._addCheck({\n kind: \"max\",\n inclusive: true,\n value: Number.MAX_SAFE_INTEGER,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n get isInt() {\n return !!this._def.checks.find((ch) => ch.kind === \"int\" || (ch.kind === \"multipleOf\" && util.isInteger(ch.value)));\n }\n get isFinite() {\n let max = null;\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"finite\" || ch.kind === \"int\" || ch.kind === \"multipleOf\") {\n return true;\n }\n else if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n else if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return Number.isFinite(min) && Number.isFinite(max);\n }\n}\nZodNumber.create = (params) => {\n return new ZodNumber({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodNumber,\n coerce: params?.coerce || false,\n ...processCreateParams(params),\n });\n};\nexport class ZodBigInt extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n }\n _parse(input) {\n if (this._def.coerce) {\n try {\n input.data = BigInt(input.data);\n }\n catch {\n return this._getInvalidInput(input);\n }\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.bigint) {\n return this._getInvalidInput(input);\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n type: \"bigint\",\n minimum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n type: \"bigint\",\n maximum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (input.data % check.value !== BigInt(0)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _getInvalidInput(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.bigint,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodBigInt({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodBigInt({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodBigInt.create = (params) => {\n return new ZodBigInt({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodBigInt,\n coerce: params?.coerce ?? false,\n ...processCreateParams(params),\n });\n};\nexport class ZodBoolean extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = Boolean(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.boolean) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.boolean,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodBoolean.create = (params) => {\n return new ZodBoolean({\n typeName: ZodFirstPartyTypeKind.ZodBoolean,\n coerce: params?.coerce || false,\n ...processCreateParams(params),\n });\n};\nexport class ZodDate extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = new Date(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.date) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.date,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (Number.isNaN(input.data.getTime())) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_date,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.getTime() < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n message: check.message,\n inclusive: true,\n exact: false,\n minimum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.getTime() > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n message: check.message,\n inclusive: true,\n exact: false,\n maximum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return {\n status: status.value,\n value: new Date(input.data.getTime()),\n };\n }\n _addCheck(check) {\n return new ZodDate({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n min(minDate, message) {\n return this._addCheck({\n kind: \"min\",\n value: minDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n max(maxDate, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n get minDate() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min != null ? new Date(min) : null;\n }\n get maxDate() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max != null ? new Date(max) : null;\n }\n}\nZodDate.create = (params) => {\n return new ZodDate({\n checks: [],\n coerce: params?.coerce || false,\n typeName: ZodFirstPartyTypeKind.ZodDate,\n ...processCreateParams(params),\n });\n};\nexport class ZodSymbol extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.symbol) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.symbol,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodSymbol.create = (params) => {\n return new ZodSymbol({\n typeName: ZodFirstPartyTypeKind.ZodSymbol,\n ...processCreateParams(params),\n });\n};\nexport class ZodUndefined extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.undefined,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodUndefined.create = (params) => {\n return new ZodUndefined({\n typeName: ZodFirstPartyTypeKind.ZodUndefined,\n ...processCreateParams(params),\n });\n};\nexport class ZodNull extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.null) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.null,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodNull.create = (params) => {\n return new ZodNull({\n typeName: ZodFirstPartyTypeKind.ZodNull,\n ...processCreateParams(params),\n });\n};\nexport class ZodAny extends ZodType {\n constructor() {\n super(...arguments);\n // to prevent instances of other classes from extending ZodAny. this causes issues with catchall in ZodObject.\n this._any = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodAny.create = (params) => {\n return new ZodAny({\n typeName: ZodFirstPartyTypeKind.ZodAny,\n ...processCreateParams(params),\n });\n};\nexport class ZodUnknown extends ZodType {\n constructor() {\n super(...arguments);\n // required\n this._unknown = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodUnknown.create = (params) => {\n return new ZodUnknown({\n typeName: ZodFirstPartyTypeKind.ZodUnknown,\n ...processCreateParams(params),\n });\n};\nexport class ZodNever extends ZodType {\n _parse(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.never,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n}\nZodNever.create = (params) => {\n return new ZodNever({\n typeName: ZodFirstPartyTypeKind.ZodNever,\n ...processCreateParams(params),\n });\n};\nexport class ZodVoid extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.void,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodVoid.create = (params) => {\n return new ZodVoid({\n typeName: ZodFirstPartyTypeKind.ZodVoid,\n ...processCreateParams(params),\n });\n};\nexport class ZodArray extends ZodType {\n _parse(input) {\n const { ctx, status } = this._processInputParams(input);\n const def = this._def;\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (def.exactLength !== null) {\n const tooBig = ctx.data.length > def.exactLength.value;\n const tooSmall = ctx.data.length < def.exactLength.value;\n if (tooBig || tooSmall) {\n addIssueToContext(ctx, {\n code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small,\n minimum: (tooSmall ? def.exactLength.value : undefined),\n maximum: (tooBig ? def.exactLength.value : undefined),\n type: \"array\",\n inclusive: true,\n exact: true,\n message: def.exactLength.message,\n });\n status.dirty();\n }\n }\n if (def.minLength !== null) {\n if (ctx.data.length < def.minLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.minLength.message,\n });\n status.dirty();\n }\n }\n if (def.maxLength !== null) {\n if (ctx.data.length > def.maxLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.maxLength.message,\n });\n status.dirty();\n }\n }\n if (ctx.common.async) {\n return Promise.all([...ctx.data].map((item, i) => {\n return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n })).then((result) => {\n return ParseStatus.mergeArray(status, result);\n });\n }\n const result = [...ctx.data].map((item, i) => {\n return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n });\n return ParseStatus.mergeArray(status, result);\n }\n get element() {\n return this._def.type;\n }\n min(minLength, message) {\n return new ZodArray({\n ...this._def,\n minLength: { value: minLength, message: errorUtil.toString(message) },\n });\n }\n max(maxLength, message) {\n return new ZodArray({\n ...this._def,\n maxLength: { value: maxLength, message: errorUtil.toString(message) },\n });\n }\n length(len, message) {\n return new ZodArray({\n ...this._def,\n exactLength: { value: len, message: errorUtil.toString(message) },\n });\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodArray.create = (schema, params) => {\n return new ZodArray({\n type: schema,\n minLength: null,\n maxLength: null,\n exactLength: null,\n typeName: ZodFirstPartyTypeKind.ZodArray,\n ...processCreateParams(params),\n });\n};\nfunction deepPartialify(schema) {\n if (schema instanceof ZodObject) {\n const newShape = {};\n for (const key in schema.shape) {\n const fieldSchema = schema.shape[key];\n newShape[key] = ZodOptional.create(deepPartialify(fieldSchema));\n }\n return new ZodObject({\n ...schema._def,\n shape: () => newShape,\n });\n }\n else if (schema instanceof ZodArray) {\n return new ZodArray({\n ...schema._def,\n type: deepPartialify(schema.element),\n });\n }\n else if (schema instanceof ZodOptional) {\n return ZodOptional.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodNullable) {\n return ZodNullable.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodTuple) {\n return ZodTuple.create(schema.items.map((item) => deepPartialify(item)));\n }\n else {\n return schema;\n }\n}\nexport class ZodObject extends ZodType {\n constructor() {\n super(...arguments);\n this._cached = null;\n /**\n * @deprecated In most cases, this is no longer needed - unknown properties are now silently stripped.\n * If you want to pass through unknown properties, use `.passthrough()` instead.\n */\n this.nonstrict = this.passthrough;\n // extend<\n // Augmentation extends ZodRawShape,\n // NewOutput extends util.flatten<{\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // }>,\n // NewInput extends util.flatten<{\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }>\n // >(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape<T, Augmentation>,\n // UnknownKeys,\n // Catchall,\n // NewOutput,\n // NewInput\n // > {\n // return new ZodObject({\n // ...this._def,\n // shape: () => ({\n // ...this._def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // }\n /**\n * @deprecated Use `.extend` instead\n * */\n this.augment = this.extend;\n }\n _getCached() {\n if (this._cached !== null)\n return this._cached;\n const shape = this._def.shape();\n const keys = util.objectKeys(shape);\n this._cached = { shape, keys };\n return this._cached;\n }\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.object) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const { status, ctx } = this._processInputParams(input);\n const { shape, keys: shapeKeys } = this._getCached();\n const extraKeys = [];\n if (!(this._def.catchall instanceof ZodNever && this._def.unknownKeys === \"strip\")) {\n for (const key in ctx.data) {\n if (!shapeKeys.includes(key)) {\n extraKeys.push(key);\n }\n }\n }\n const pairs = [];\n for (const key of shapeKeys) {\n const keyValidator = shape[key];\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (this._def.catchall instanceof ZodNever) {\n const unknownKeys = this._def.unknownKeys;\n if (unknownKeys === \"passthrough\") {\n for (const key of extraKeys) {\n pairs.push({\n key: { status: \"valid\", value: key },\n value: { status: \"valid\", value: ctx.data[key] },\n });\n }\n }\n else if (unknownKeys === \"strict\") {\n if (extraKeys.length > 0) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.unrecognized_keys,\n keys: extraKeys,\n });\n status.dirty();\n }\n }\n else if (unknownKeys === \"strip\") {\n }\n else {\n throw new Error(`Internal ZodObject error: invalid unknownKeys value.`);\n }\n }\n else {\n // run catchall validation\n const catchall = this._def.catchall;\n for (const key of extraKeys) {\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: catchall._parse(new ParseInputLazyPath(ctx, value, ctx.path, key) //, ctx.child(key), value, getParsedType(value)\n ),\n alwaysSet: key in ctx.data,\n });\n }\n }\n if (ctx.common.async) {\n return Promise.resolve()\n .then(async () => {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n alwaysSet: pair.alwaysSet,\n });\n }\n return syncPairs;\n })\n .then((syncPairs) => {\n return ParseStatus.mergeObjectSync(status, syncPairs);\n });\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get shape() {\n return this._def.shape();\n }\n strict(message) {\n errorUtil.errToObj;\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strict\",\n ...(message !== undefined\n ? {\n errorMap: (issue, ctx) => {\n const defaultError = this._def.errorMap?.(issue, ctx).message ?? ctx.defaultError;\n if (issue.code === \"unrecognized_keys\")\n return {\n message: errorUtil.errToObj(message).message ?? defaultError,\n };\n return {\n message: defaultError,\n };\n },\n }\n : {}),\n });\n }\n strip() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strip\",\n });\n }\n passthrough() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"passthrough\",\n });\n }\n // const AugmentFactory =\n // <Def extends ZodObjectDef>(def: Def) =>\n // <Augmentation extends ZodRawShape>(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape<ReturnType<Def[\"shape\"]>, Augmentation>,\n // Def[\"unknownKeys\"],\n // Def[\"catchall\"]\n // > => {\n // return new ZodObject({\n // ...def,\n // shape: () => ({\n // ...def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // };\n extend(augmentation) {\n return new ZodObject({\n ...this._def,\n shape: () => ({\n ...this._def.shape(),\n ...augmentation,\n }),\n });\n }\n /**\n * Prior to zod@1.0.12 there was a bug in the\n * inferred type of merged objects. Please\n * upgrade if you are experiencing issues.\n */\n merge(merging) {\n const merged = new ZodObject({\n unknownKeys: merging._def.unknownKeys,\n catchall: merging._def.catchall,\n shape: () => ({\n ...this._def.shape(),\n ...merging._def.shape(),\n }),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n });\n return merged;\n }\n // merge<\n // Incoming extends AnyZodObject,\n // Augmentation extends Incoming[\"shape\"],\n // NewOutput extends {\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // },\n // NewInput extends {\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }\n // >(\n // merging: Incoming\n // ): ZodObject<\n // extendShape<T, ReturnType<Incoming[\"_def\"][\"shape\"]>>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"],\n // NewOutput,\n // NewInput\n // > {\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n setKey(key, schema) {\n return this.augment({ [key]: schema });\n }\n // merge<Incoming extends AnyZodObject>(\n // merging: Incoming\n // ): //ZodObject<T & Incoming[\"_shape\"], UnknownKeys, Catchall> = (merging) => {\n // ZodObject<\n // extendShape<T, ReturnType<Incoming[\"_def\"][\"shape\"]>>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"]\n // > {\n // // const mergedShape = objectUtil.mergeShapes(\n // // this._def.shape(),\n // // merging._def.shape()\n // // );\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n catchall(index) {\n return new ZodObject({\n ...this._def,\n catchall: index,\n });\n }\n pick(mask) {\n const shape = {};\n for (const key of util.objectKeys(mask)) {\n if (mask[key] && this.shape[key]) {\n shape[key] = this.shape[key];\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n omit(mask) {\n const shape = {};\n for (const key of util.objectKeys(this.shape)) {\n if (!mask[key]) {\n shape[key] = this.shape[key];\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n /**\n * @deprecated\n */\n deepPartial() {\n return deepPartialify(this);\n }\n partial(mask) {\n const newShape = {};\n for (const key of util.objectKeys(this.shape)) {\n const fieldSchema = this.shape[key];\n if (mask && !mask[key]) {\n newShape[key] = fieldSchema;\n }\n else {\n newShape[key] = fieldSchema.optional();\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n required(mask) {\n const newShape = {};\n for (const key of util.objectKeys(this.shape)) {\n if (mask && !mask[key]) {\n newShape[key] = this.shape[key];\n }\n else {\n const fieldSchema = this.shape[key];\n let newField = fieldSchema;\n while (newField instanceof ZodOptional) {\n newField = newField._def.innerType;\n }\n newShape[key] = newField;\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n keyof() {\n return createZodEnum(util.objectKeys(this.shape));\n }\n}\nZodObject.create = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.strictCreate = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strict\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.lazycreate = (shape, params) => {\n return new ZodObject({\n shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nexport class ZodUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const options = this._def.options;\n function handleResults(results) {\n // return first issue-free validation if it exists\n for (const result of results) {\n if (result.result.status === \"valid\") {\n return result.result;\n }\n }\n for (const result of results) {\n if (result.result.status === \"dirty\") {\n // add issues from dirty option\n ctx.common.issues.push(...result.ctx.common.issues);\n return result.result;\n }\n }\n // return invalid\n const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return Promise.all(options.map(async (option) => {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n return {\n result: await option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n }),\n ctx: childCtx,\n };\n })).then(handleResults);\n }\n else {\n let dirty = undefined;\n const issues = [];\n for (const option of options) {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n const result = option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n });\n if (result.status === \"valid\") {\n return result;\n }\n else if (result.status === \"dirty\" && !dirty) {\n dirty = { result, ctx: childCtx };\n }\n if (childCtx.common.issues.length) {\n issues.push(childCtx.common.issues);\n }\n }\n if (dirty) {\n ctx.common.issues.push(...dirty.ctx.common.issues);\n return dirty.result;\n }\n const unionErrors = issues.map((issues) => new ZodError(issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n }\n get options() {\n return this._def.options;\n }\n}\nZodUnion.create = (types, params) => {\n return new ZodUnion({\n options: types,\n typeName: ZodFirstPartyTypeKind.ZodUnion,\n ...processCreateParams(params),\n });\n};\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\n////////// //////////\n////////// ZodDiscriminatedUnion //////////\n////////// //////////\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\nconst getDiscriminator = (type) => {\n if (type instanceof ZodLazy) {\n return getDiscriminator(type.schema);\n }\n else if (type instanceof ZodEffects) {\n return getDiscriminator(type.innerType());\n }\n else if (type instanceof ZodLiteral) {\n return [type.value];\n }\n else if (type instanceof ZodEnum) {\n return type.options;\n }\n else if (type instanceof ZodNativeEnum) {\n // eslint-disable-next-line ban/ban\n return util.objectValues(type.enum);\n }\n else if (type instanceof ZodDefault) {\n return getDiscriminator(type._def.innerType);\n }\n else if (type instanceof ZodUndefined) {\n return [undefined];\n }\n else if (type instanceof ZodNull) {\n return [null];\n }\n else if (type instanceof ZodOptional) {\n return [undefined, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodNullable) {\n return [null, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodBranded) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodReadonly) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodCatch) {\n return getDiscriminator(type._def.innerType);\n }\n else {\n return [];\n }\n};\nexport class ZodDiscriminatedUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const discriminator = this.discriminator;\n const discriminatorValue = ctx.data[discriminator];\n const option = this.optionsMap.get(discriminatorValue);\n if (!option) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union_discriminator,\n options: Array.from(this.optionsMap.keys()),\n path: [discriminator],\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n else {\n return option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n get discriminator() {\n return this._def.discriminator;\n }\n get options() {\n return this._def.options;\n }\n get optionsMap() {\n return this._def.optionsMap;\n }\n /**\n * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor.\n * However, it only allows a union of objects, all of which need to share a discriminator property. This property must\n * have a different value for each object in the union.\n * @param discriminator the name of the discriminator property\n * @param types an array of object schemas\n * @param params\n */\n static create(discriminator, options, params) {\n // Get all the valid discriminator values\n const optionsMap = new Map();\n // try {\n for (const type of options) {\n const discriminatorValues = getDiscriminator(type.shape[discriminator]);\n if (!discriminatorValues.length) {\n throw new Error(`A discriminator value for key \\`${discriminator}\\` could not be extracted from all schema options`);\n }\n for (const value of discriminatorValues) {\n if (optionsMap.has(value)) {\n throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`);\n }\n optionsMap.set(value, type);\n }\n }\n return new ZodDiscriminatedUnion({\n typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion,\n discriminator,\n options,\n optionsMap,\n ...processCreateParams(params),\n });\n }\n}\nfunction mergeValues(a, b) {\n const aType = getParsedType(a);\n const bType = getParsedType(b);\n if (a === b) {\n return { valid: true, data: a };\n }\n else if (aType === ZodParsedType.object && bType === ZodParsedType.object) {\n const bKeys = util.objectKeys(b);\n const sharedKeys = util.objectKeys(a).filter((key) => bKeys.indexOf(key) !== -1);\n const newObj = { ...a, ...b };\n for (const key of sharedKeys) {\n const sharedValue = mergeValues(a[key], b[key]);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newObj[key] = sharedValue.data;\n }\n return { valid: true, data: newObj };\n }\n else if (aType === ZodParsedType.array && bType === ZodParsedType.array) {\n if (a.length !== b.length) {\n return { valid: false };\n }\n const newArray = [];\n for (let index = 0; index < a.length; index++) {\n const itemA = a[index];\n const itemB = b[index];\n const sharedValue = mergeValues(itemA, itemB);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newArray.push(sharedValue.data);\n }\n return { valid: true, data: newArray };\n }\n else if (aType === ZodParsedType.date && bType === ZodParsedType.date && +a === +b) {\n return { valid: true, data: a };\n }\n else {\n return { valid: false };\n }\n}\nexport class ZodIntersection extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const handleParsed = (parsedLeft, parsedRight) => {\n if (isAborted(parsedLeft) || isAborted(parsedRight)) {\n return INVALID;\n }\n const merged = mergeValues(parsedLeft.value, parsedRight.value);\n if (!merged.valid) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_intersection_types,\n });\n return INVALID;\n }\n if (isDirty(parsedLeft) || isDirty(parsedRight)) {\n status.dirty();\n }\n return { status: status.value, value: merged.data };\n };\n if (ctx.common.async) {\n return Promise.all([\n this._def.left._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n this._def.right._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n ]).then(([left, right]) => handleParsed(left, right));\n }\n else {\n return handleParsed(this._def.left._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }), this._def.right._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }));\n }\n }\n}\nZodIntersection.create = (left, right, params) => {\n return new ZodIntersection({\n left: left,\n right: right,\n typeName: ZodFirstPartyTypeKind.ZodIntersection,\n ...processCreateParams(params),\n });\n};\n// type ZodTupleItems = [ZodTypeAny, ...ZodTypeAny[]];\nexport class ZodTuple extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (ctx.data.length < this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n return INVALID;\n }\n const rest = this._def.rest;\n if (!rest && ctx.data.length > this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n status.dirty();\n }\n const items = [...ctx.data]\n .map((item, itemIndex) => {\n const schema = this._def.items[itemIndex] || this._def.rest;\n if (!schema)\n return null;\n return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex));\n })\n .filter((x) => !!x); // filter nulls\n if (ctx.common.async) {\n return Promise.all(items).then((results) => {\n return ParseStatus.mergeArray(status, results);\n });\n }\n else {\n return ParseStatus.mergeArray(status, items);\n }\n }\n get items() {\n return this._def.items;\n }\n rest(rest) {\n return new ZodTuple({\n ...this._def,\n rest,\n });\n }\n}\nZodTuple.create = (schemas, params) => {\n if (!Array.isArray(schemas)) {\n throw new Error(\"You must pass an array of schemas to z.tuple([ ... ])\");\n }\n return new ZodTuple({\n items: schemas,\n typeName: ZodFirstPartyTypeKind.ZodTuple,\n rest: null,\n ...processCreateParams(params),\n });\n};\nexport class ZodRecord extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const pairs = [];\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n for (const key in ctx.data) {\n pairs.push({\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)),\n value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (ctx.common.async) {\n return ParseStatus.mergeObjectAsync(status, pairs);\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get element() {\n return this._def.valueType;\n }\n static create(first, second, third) {\n if (second instanceof ZodType) {\n return new ZodRecord({\n keyType: first,\n valueType: second,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(third),\n });\n }\n return new ZodRecord({\n keyType: ZodString.create(),\n valueType: first,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(second),\n });\n }\n}\nexport class ZodMap extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.map) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.map,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n const pairs = [...ctx.data.entries()].map(([key, value], index) => {\n return {\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, \"key\"])),\n value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, \"value\"])),\n };\n });\n if (ctx.common.async) {\n const finalMap = new Map();\n return Promise.resolve().then(async () => {\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n });\n }\n else {\n const finalMap = new Map();\n for (const pair of pairs) {\n const key = pair.key;\n const value = pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n }\n }\n}\nZodMap.create = (keyType, valueType, params) => {\n return new ZodMap({\n valueType,\n keyType,\n typeName: ZodFirstPartyTypeKind.ZodMap,\n ...processCreateParams(params),\n });\n};\nexport class ZodSet extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.set) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.set,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const def = this._def;\n if (def.minSize !== null) {\n if (ctx.data.size < def.minSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.minSize.message,\n });\n status.dirty();\n }\n }\n if (def.maxSize !== null) {\n if (ctx.data.size > def.maxSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.maxSize.message,\n });\n status.dirty();\n }\n }\n const valueType = this._def.valueType;\n function finalizeSet(elements) {\n const parsedSet = new Set();\n for (const element of elements) {\n if (element.status === \"aborted\")\n return INVALID;\n if (element.status === \"dirty\")\n status.dirty();\n parsedSet.add(element.value);\n }\n return { status: status.value, value: parsedSet };\n }\n const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i)));\n if (ctx.common.async) {\n return Promise.all(elements).then((elements) => finalizeSet(elements));\n }\n else {\n return finalizeSet(elements);\n }\n }\n min(minSize, message) {\n return new ZodSet({\n ...this._def,\n minSize: { value: minSize, message: errorUtil.toString(message) },\n });\n }\n max(maxSize, message) {\n return new ZodSet({\n ...this._def,\n maxSize: { value: maxSize, message: errorUtil.toString(message) },\n });\n }\n size(size, message) {\n return this.min(size, message).max(size, message);\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodSet.create = (valueType, params) => {\n return new ZodSet({\n valueType,\n minSize: null,\n maxSize: null,\n typeName: ZodFirstPartyTypeKind.ZodSet,\n ...processCreateParams(params),\n });\n};\nexport class ZodFunction extends ZodType {\n constructor() {\n super(...arguments);\n this.validate = this.implement;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.function) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.function,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n function makeArgsIssue(args, error) {\n return makeIssue({\n data: args,\n path: ctx.path,\n errorMaps: [ctx.common.contextualErrorMap, ctx.schemaErrorMap, getErrorMap(), defaultErrorMap].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_arguments,\n argumentsError: error,\n },\n });\n }\n function makeReturnsIssue(returns, error) {\n return makeIssue({\n data: returns,\n path: ctx.path,\n errorMaps: [ctx.common.contextualErrorMap, ctx.schemaErrorMap, getErrorMap(), defaultErrorMap].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_return_type,\n returnTypeError: error,\n },\n });\n }\n const params = { errorMap: ctx.common.contextualErrorMap };\n const fn = ctx.data;\n if (this._def.returns instanceof ZodPromise) {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(async function (...args) {\n const error = new ZodError([]);\n const parsedArgs = await me._def.args.parseAsync(args, params).catch((e) => {\n error.addIssue(makeArgsIssue(args, e));\n throw error;\n });\n const result = await Reflect.apply(fn, this, parsedArgs);\n const parsedReturns = await me._def.returns._def.type\n .parseAsync(result, params)\n .catch((e) => {\n error.addIssue(makeReturnsIssue(result, e));\n throw error;\n });\n return parsedReturns;\n });\n }\n else {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(function (...args) {\n const parsedArgs = me._def.args.safeParse(args, params);\n if (!parsedArgs.success) {\n throw new ZodError([makeArgsIssue(args, parsedArgs.error)]);\n }\n const result = Reflect.apply(fn, this, parsedArgs.data);\n const parsedReturns = me._def.returns.safeParse(result, params);\n if (!parsedReturns.success) {\n throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]);\n }\n return parsedReturns.data;\n });\n }\n }\n parameters() {\n return this._def.args;\n }\n returnType() {\n return this._def.returns;\n }\n args(...items) {\n return new ZodFunction({\n ...this._def,\n args: ZodTuple.create(items).rest(ZodUnknown.create()),\n });\n }\n returns(returnType) {\n return new ZodFunction({\n ...this._def,\n returns: returnType,\n });\n }\n implement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n strictImplement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n static create(args, returns, params) {\n return new ZodFunction({\n args: (args ? args : ZodTuple.create([]).rest(ZodUnknown.create())),\n returns: returns || ZodUnknown.create(),\n typeName: ZodFirstPartyTypeKind.ZodFunction,\n ...processCreateParams(params),\n });\n }\n}\nexport class ZodLazy extends ZodType {\n get schema() {\n return this._def.getter();\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const lazySchema = this._def.getter();\n return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx });\n }\n}\nZodLazy.create = (getter, params) => {\n return new ZodLazy({\n getter: getter,\n typeName: ZodFirstPartyTypeKind.ZodLazy,\n ...processCreateParams(params),\n });\n};\nexport class ZodLiteral extends ZodType {\n _parse(input) {\n if (input.data !== this._def.value) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_literal,\n expected: this._def.value,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n get value() {\n return this._def.value;\n }\n}\nZodLiteral.create = (value, params) => {\n return new ZodLiteral({\n value: value,\n typeName: ZodFirstPartyTypeKind.ZodLiteral,\n ...processCreateParams(params),\n });\n};\nfunction createZodEnum(values, params) {\n return new ZodEnum({\n values,\n typeName: ZodFirstPartyTypeKind.ZodEnum,\n ...processCreateParams(params),\n });\n}\nexport class ZodEnum extends ZodType {\n _parse(input) {\n if (typeof input.data !== \"string\") {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!this._cache) {\n this._cache = new Set(this._def.values);\n }\n if (!this._cache.has(input.data)) {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get options() {\n return this._def.values;\n }\n get enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Values() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n extract(values, newDef = this._def) {\n return ZodEnum.create(values, {\n ...this._def,\n ...newDef,\n });\n }\n exclude(values, newDef = this._def) {\n return ZodEnum.create(this.options.filter((opt) => !values.includes(opt)), {\n ...this._def,\n ...newDef,\n });\n }\n}\nZodEnum.create = createZodEnum;\nexport class ZodNativeEnum extends ZodType {\n _parse(input) {\n const nativeEnumValues = util.getValidEnumValues(this._def.values);\n const ctx = this._getOrReturnCtx(input);\n if (ctx.parsedType !== ZodParsedType.string && ctx.parsedType !== ZodParsedType.number) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!this._cache) {\n this._cache = new Set(util.getValidEnumValues(this._def.values));\n }\n if (!this._cache.has(input.data)) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get enum() {\n return this._def.values;\n }\n}\nZodNativeEnum.create = (values, params) => {\n return new ZodNativeEnum({\n values: values,\n typeName: ZodFirstPartyTypeKind.ZodNativeEnum,\n ...processCreateParams(params),\n });\n};\nexport class ZodPromise extends ZodType {\n unwrap() {\n return this._def.type;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.promise && ctx.common.async === false) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.promise,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const promisified = ctx.parsedType === ZodParsedType.promise ? ctx.data : Promise.resolve(ctx.data);\n return OK(promisified.then((data) => {\n return this._def.type.parseAsync(data, {\n path: ctx.path,\n errorMap: ctx.common.contextualErrorMap,\n });\n }));\n }\n}\nZodPromise.create = (schema, params) => {\n return new ZodPromise({\n type: schema,\n typeName: ZodFirstPartyTypeKind.ZodPromise,\n ...processCreateParams(params),\n });\n};\nexport class ZodEffects extends ZodType {\n innerType() {\n return this._def.schema;\n }\n sourceType() {\n return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects\n ? this._def.schema.sourceType()\n : this._def.schema;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const effect = this._def.effect || null;\n const checkCtx = {\n addIssue: (arg) => {\n addIssueToContext(ctx, arg);\n if (arg.fatal) {\n status.abort();\n }\n else {\n status.dirty();\n }\n },\n get path() {\n return ctx.path;\n },\n };\n checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx);\n if (effect.type === \"preprocess\") {\n const processed = effect.transform(ctx.data, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(processed).then(async (processed) => {\n if (status.value === \"aborted\")\n return INVALID;\n const result = await this._def.schema._parseAsync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n });\n }\n else {\n if (status.value === \"aborted\")\n return INVALID;\n const result = this._def.schema._parseSync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n }\n }\n if (effect.type === \"refinement\") {\n const executeRefinement = (acc) => {\n const result = effect.refinement(acc, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(result);\n }\n if (result instanceof Promise) {\n throw new Error(\"Async refinement encountered during synchronous parse operation. Use .parseAsync instead.\");\n }\n return acc;\n };\n if (ctx.common.async === false) {\n const inner = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n // return value is ignored\n executeRefinement(inner.value);\n return { status: status.value, value: inner.value };\n }\n else {\n return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((inner) => {\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n return executeRefinement(inner.value).then(() => {\n return { status: status.value, value: inner.value };\n });\n });\n }\n }\n if (effect.type === \"transform\") {\n if (ctx.common.async === false) {\n const base = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (!isValid(base))\n return INVALID;\n const result = effect.transform(base.value, checkCtx);\n if (result instanceof Promise) {\n throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`);\n }\n return { status: status.value, value: result };\n }\n else {\n return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((base) => {\n if (!isValid(base))\n return INVALID;\n return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({\n status: status.value,\n value: result,\n }));\n });\n }\n }\n util.assertNever(effect);\n }\n}\nZodEffects.create = (schema, effect, params) => {\n return new ZodEffects({\n schema,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect,\n ...processCreateParams(params),\n });\n};\nZodEffects.createWithPreprocess = (preprocess, schema, params) => {\n return new ZodEffects({\n schema,\n effect: { type: \"preprocess\", transform: preprocess },\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n ...processCreateParams(params),\n });\n};\nexport { ZodEffects as ZodTransformer };\nexport class ZodOptional extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.undefined) {\n return OK(undefined);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodOptional.create = (type, params) => {\n return new ZodOptional({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodOptional,\n ...processCreateParams(params),\n });\n};\nexport class ZodNullable extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.null) {\n return OK(null);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodNullable.create = (type, params) => {\n return new ZodNullable({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodNullable,\n ...processCreateParams(params),\n });\n};\nexport class ZodDefault extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n let data = ctx.data;\n if (ctx.parsedType === ZodParsedType.undefined) {\n data = this._def.defaultValue();\n }\n return this._def.innerType._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n removeDefault() {\n return this._def.innerType;\n }\n}\nZodDefault.create = (type, params) => {\n return new ZodDefault({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n defaultValue: typeof params.default === \"function\" ? params.default : () => params.default,\n ...processCreateParams(params),\n });\n};\nexport class ZodCatch extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n // newCtx is used to not collect issues from inner types in ctx\n const newCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n };\n const result = this._def.innerType._parse({\n data: newCtx.data,\n path: newCtx.path,\n parent: {\n ...newCtx,\n },\n });\n if (isAsync(result)) {\n return result.then((result) => {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n });\n }\n else {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n }\n }\n removeCatch() {\n return this._def.innerType;\n }\n}\nZodCatch.create = (type, params) => {\n return new ZodCatch({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n catchValue: typeof params.catch === \"function\" ? params.catch : () => params.catch,\n ...processCreateParams(params),\n });\n};\nexport class ZodNaN extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.nan) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.nan,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n}\nZodNaN.create = (params) => {\n return new ZodNaN({\n typeName: ZodFirstPartyTypeKind.ZodNaN,\n ...processCreateParams(params),\n });\n};\nexport const BRAND = Symbol(\"zod_brand\");\nexport class ZodBranded extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const data = ctx.data;\n return this._def.type._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n unwrap() {\n return this._def.type;\n }\n}\nexport class ZodPipeline extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.common.async) {\n const handleAsync = async () => {\n const inResult = await this._def.in._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return DIRTY(inResult.value);\n }\n else {\n return this._def.out._parseAsync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n };\n return handleAsync();\n }\n else {\n const inResult = this._def.in._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return {\n status: \"dirty\",\n value: inResult.value,\n };\n }\n else {\n return this._def.out._parseSync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n }\n static create(a, b) {\n return new ZodPipeline({\n in: a,\n out: b,\n typeName: ZodFirstPartyTypeKind.ZodPipeline,\n });\n }\n}\nexport class ZodReadonly extends ZodType {\n _parse(input) {\n const result = this._def.innerType._parse(input);\n const freeze = (data) => {\n if (isValid(data)) {\n data.value = Object.freeze(data.value);\n }\n return data;\n };\n return isAsync(result) ? result.then((data) => freeze(data)) : freeze(result);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodReadonly.create = (type, params) => {\n return new ZodReadonly({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodReadonly,\n ...processCreateParams(params),\n });\n};\n////////////////////////////////////////\n////////////////////////////////////////\n////////// //////////\n////////// z.custom //////////\n////////// //////////\n////////////////////////////////////////\n////////////////////////////////////////\nfunction cleanParams(params, data) {\n const p = typeof params === \"function\" ? params(data) : typeof params === \"string\" ? { message: params } : params;\n const p2 = typeof p === \"string\" ? { message: p } : p;\n return p2;\n}\nexport function custom(check, _params = {}, \n/**\n * @deprecated\n *\n * Pass `fatal` into the params object instead:\n *\n * ```ts\n * z.string().custom((val) => val.length > 5, { fatal: false })\n * ```\n *\n */\nfatal) {\n if (check)\n return ZodAny.create().superRefine((data, ctx) => {\n const r = check(data);\n if (r instanceof Promise) {\n return r.then((r) => {\n if (!r) {\n const params = cleanParams(_params, data);\n const _fatal = params.fatal ?? fatal ?? true;\n ctx.addIssue({ code: \"custom\", ...params, fatal: _fatal });\n }\n });\n }\n if (!r) {\n const params = cleanParams(_params, data);\n const _fatal = params.fatal ?? fatal ?? true;\n ctx.addIssue({ code: \"custom\", ...params, fatal: _fatal });\n }\n return;\n });\n return ZodAny.create();\n}\nexport { ZodType as Schema, ZodType as ZodSchema };\nexport const late = {\n object: ZodObject.lazycreate,\n};\nexport var ZodFirstPartyTypeKind;\n(function (ZodFirstPartyTypeKind) {\n ZodFirstPartyTypeKind[\"ZodString\"] = \"ZodString\";\n ZodFirstPartyTypeKind[\"ZodNumber\"] = \"ZodNumber\";\n ZodFirstPartyTypeKind[\"ZodNaN\"] = \"ZodNaN\";\n ZodFirstPartyTypeKind[\"ZodBigInt\"] = \"ZodBigInt\";\n ZodFirstPartyTypeKind[\"ZodBoolean\"] = \"ZodBoolean\";\n ZodFirstPartyTypeKind[\"ZodDate\"] = \"ZodDate\";\n ZodFirstPartyTypeKind[\"ZodSymbol\"] = \"ZodSymbol\";\n ZodFirstPartyTypeKind[\"ZodUndefined\"] = \"ZodUndefined\";\n ZodFirstPartyTypeKind[\"ZodNull\"] = \"ZodNull\";\n ZodFirstPartyTypeKind[\"ZodAny\"] = \"ZodAny\";\n ZodFirstPartyTypeKind[\"ZodUnknown\"] = \"ZodUnknown\";\n ZodFirstPartyTypeKind[\"ZodNever\"] = \"ZodNever\";\n ZodFirstPartyTypeKind[\"ZodVoid\"] = \"ZodVoid\";\n ZodFirstPartyTypeKind[\"ZodArray\"] = \"ZodArray\";\n ZodFirstPartyTypeKind[\"ZodObject\"] = \"ZodObject\";\n ZodFirstPartyTypeKind[\"ZodUnion\"] = \"ZodUnion\";\n ZodFirstPartyTypeKind[\"ZodDiscriminatedUnion\"] = \"ZodDiscriminatedUnion\";\n ZodFirstPartyTypeKind[\"ZodIntersection\"] = \"ZodIntersection\";\n ZodFirstPartyTypeKind[\"ZodTuple\"] = \"ZodTuple\";\n ZodFirstPartyTypeKind[\"ZodRecord\"] = \"ZodRecord\";\n ZodFirstPartyTypeKind[\"ZodMap\"] = \"ZodMap\";\n ZodFirstPartyTypeKind[\"ZodSet\"] = \"ZodSet\";\n ZodFirstPartyTypeKind[\"ZodFunction\"] = \"ZodFunction\";\n ZodFirstPartyTypeKind[\"ZodLazy\"] = \"ZodLazy\";\n ZodFirstPartyTypeKind[\"ZodLiteral\"] = \"ZodLiteral\";\n ZodFirstPartyTypeKind[\"ZodEnum\"] = \"ZodEnum\";\n ZodFirstPartyTypeKind[\"ZodEffects\"] = \"ZodEffects\";\n ZodFirstPartyTypeKind[\"ZodNativeEnum\"] = \"ZodNativeEnum\";\n ZodFirstPartyTypeKind[\"ZodOptional\"] = \"ZodOptional\";\n ZodFirstPartyTypeKind[\"ZodNullable\"] = \"ZodNullable\";\n ZodFirstPartyTypeKind[\"ZodDefault\"] = \"ZodDefault\";\n ZodFirstPartyTypeKind[\"ZodCatch\"] = \"ZodCatch\";\n ZodFirstPartyTypeKind[\"ZodPromise\"] = \"ZodPromise\";\n ZodFirstPartyTypeKind[\"ZodBranded\"] = \"ZodBranded\";\n ZodFirstPartyTypeKind[\"ZodPipeline\"] = \"ZodPipeline\";\n ZodFirstPartyTypeKind[\"ZodReadonly\"] = \"ZodReadonly\";\n})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {}));\n// requires TS 4.4+\nclass Class {\n constructor(..._) { }\n}\nconst instanceOfType = (\n// const instanceOfType = <T extends new (...args: any[]) => any>(\ncls, params = {\n message: `Input not instance of ${cls.name}`,\n}) => custom((data) => data instanceof cls, params);\nconst stringType = ZodString.create;\nconst numberType = ZodNumber.create;\nconst nanType = ZodNaN.create;\nconst bigIntType = ZodBigInt.create;\nconst booleanType = ZodBoolean.create;\nconst dateType = ZodDate.create;\nconst symbolType = ZodSymbol.create;\nconst undefinedType = ZodUndefined.create;\nconst nullType = ZodNull.create;\nconst anyType = ZodAny.create;\nconst unknownType = ZodUnknown.create;\nconst neverType = ZodNever.create;\nconst voidType = ZodVoid.create;\nconst arrayType = ZodArray.create;\nconst objectType = ZodObject.create;\nconst strictObjectType = ZodObject.strictCreate;\nconst unionType = ZodUnion.create;\nconst discriminatedUnionType = ZodDiscriminatedUnion.create;\nconst intersectionType = ZodIntersection.create;\nconst tupleType = ZodTuple.create;\nconst recordType = ZodRecord.create;\nconst mapType = ZodMap.create;\nconst setType = ZodSet.create;\nconst functionType = ZodFunction.create;\nconst lazyType = ZodLazy.create;\nconst literalType = ZodLiteral.create;\nconst enumType = ZodEnum.create;\nconst nativeEnumType = ZodNativeEnum.create;\nconst promiseType = ZodPromise.create;\nconst effectsType = ZodEffects.create;\nconst optionalType = ZodOptional.create;\nconst nullableType = ZodNullable.create;\nconst preprocessType = ZodEffects.createWithPreprocess;\nconst pipelineType = ZodPipeline.create;\nconst ostring = () => stringType().optional();\nconst onumber = () => numberType().optional();\nconst oboolean = () => booleanType().optional();\nexport const coerce = {\n string: ((arg) => ZodString.create({ ...arg, coerce: true })),\n number: ((arg) => ZodNumber.create({ ...arg, coerce: true })),\n boolean: ((arg) => ZodBoolean.create({\n ...arg,\n coerce: true,\n })),\n bigint: ((arg) => ZodBigInt.create({ ...arg, coerce: true })),\n date: ((arg) => ZodDate.create({ ...arg, coerce: true })),\n};\nexport { anyType as any, arrayType as array, bigIntType as bigint, booleanType as boolean, dateType as date, discriminatedUnionType as discriminatedUnion, effectsType as effect, enumType as enum, functionType as function, instanceOfType as instanceof, intersectionType as intersection, lazyType as lazy, literalType as literal, mapType as map, nanType as nan, nativeEnumType as nativeEnum, neverType as never, nullType as null, nullableType as nullable, numberType as number, objectType as object, oboolean, onumber, optionalType as optional, ostring, pipelineType as pipeline, preprocessType as preprocess, promiseType as promise, recordType as record, setType as set, strictObjectType as strictObject, stringType as string, symbolType as symbol, effectsType as transformer, tupleType as tuple, undefinedType as undefined, unionType as union, unknownType as unknown, voidType as void, };\nexport const NEVER = INVALID;\n",
20
+ "export * from \"./errors.js\";\nexport * from \"./helpers/parseUtil.js\";\nexport * from \"./helpers/typeAliases.js\";\nexport * from \"./helpers/util.js\";\nexport * from \"./types.js\";\nexport * from \"./ZodError.js\";\n",
21
+ "import * as z from \"./v3/external.js\";\nexport * from \"./v3/external.js\";\nexport { z };\nexport default z;\n",
22
+ "/**\r\n * AfriCode Framework Configuration\r\n *\r\n * Centralized configuration for the entire framework.\r\n * Provides createFramework() as the entry point for apps.\r\n *\r\n * Design:\r\n * - Single config object controls all framework behavior\r\n * - Defaults are strict and secure\r\n * - Every opt-in behavior is explicit\r\n * - Observability hooks are first-class\r\n *\r\n * @module core/config\r\n */\r\n\r\n/**\r\n * @typedef {Object} AfriCodeConfig\r\n *\r\n * @property {Object} [validation] - Validation configuration\r\n * @property {boolean} [validation.trimStrings=false] - Trim whitespace from string inputs\r\n * @property {boolean} [validation.emptyAsNullDefault=false] - Convert \"\" → null for nullable fields (NOT recommended)\r\n *\r\n * @property {Object} [security] - Security configuration\r\n * @property {Object} [security.csrf] - CSRF configuration\r\n * @property {boolean} [security.csrf.enabled=true] - Enable CSRF protection\r\n * @property {string[]} [security.csrf.excludePaths=[]] - Paths to exclude from CSRF\r\n * @property {string} [security.csrf.sameSite='Strict'] - SameSite cookie policy\r\n * @property {boolean} [security.csrf.secure=false] - Require HTTPS for cookies\r\n * @property {Object} [security.rateLimit] - Rate limit configuration\r\n * @property {boolean} [security.rateLimit.enabled=true] - Enable rate limiting\r\n * @property {number} [security.rateLimit.windowMs=60000] - Window in milliseconds\r\n * @property {number} [security.rateLimit.maxRequests=60] - Max requests per window\r\n * @property {string[]} [security.rateLimit.excludePaths=[]] - Paths to exclude\r\n *\r\n * @property {Object} [hooks] - Observability hooks\r\n * @property {Function} [hooks.onValidationError] - Called on validation failure\r\n * @property {Function} [hooks.onSecurityViolation] - Called on CSRF/security failure\r\n * @property {Function} [hooks.onRateLimit] - Called when rate limit is hit\r\n * @property {Function} [hooks.onDatabaseError] - Called on database error\r\n * @property {Function} [hooks.onRequest] - Called on every incoming request\r\n */\r\n\r\n/**\r\n * Default configuration values.\r\n * Strict by default. Secure by default.\r\n */\r\nconst DEFAULT_CONFIG = {\r\n validation: {\r\n trimStrings: false,\r\n emptyAsNullDefault: false\r\n },\r\n security: {\r\n csrf: {\r\n enabled: true,\r\n excludePaths: [],\r\n sameSite: 'Strict',\r\n secure: false\r\n },\r\n rateLimit: {\r\n enabled: true,\r\n windowMs: 60 * 1000,\r\n maxRequests: 60,\r\n excludePaths: []\r\n }\r\n },\r\n hooks: {\r\n onValidationError: null,\r\n onSecurityViolation: null,\r\n onRateLimit: null,\r\n onDatabaseError: null,\r\n onRequest: null\r\n }\r\n};\r\n\r\n/** @type {AfriCodeConfig} */\r\nlet _config = deepClone(DEFAULT_CONFIG);\r\n\r\n/** @type {boolean} */\r\nlet _initialized = false;\r\n\r\n/**\r\n * Deep clone a plain object.\r\n * @param {Object} obj\r\n * @returns {Object}\r\n */\r\nfunction deepClone(obj) {\r\n if (obj === null || typeof obj !== 'object') {return obj;}\r\n if (Array.isArray(obj)) {return obj.map(deepClone);}\r\n const cloned = {};\r\n for (const key of Object.keys(obj)) {\r\n cloned[key] = deepClone(obj[key]);\r\n }\r\n return cloned;\r\n}\r\n\r\n/**\r\n * Deep merge source into target.\r\n * @param {Object} target\r\n * @param {Object} source\r\n * @returns {Object}\r\n */\r\nfunction deepMerge(target, source) {\r\n const result = { ...target };\r\n for (const key of Object.keys(source)) {\r\n if (\r\n source[key] !== null &&\r\n typeof source[key] === 'object' &&\r\n !Array.isArray(source[key]) &&\r\n typeof target[key] === 'object' &&\r\n !Array.isArray(target[key])\r\n ) {\r\n result[key] = deepMerge(target[key] || {}, source[key]);\r\n } else {\r\n result[key] = source[key];\r\n }\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Initialize the AfriCode framework with configuration.\r\n *\r\n * This is the single entry point for framework configuration.\r\n * Call once at app startup. All systems read from this config.\r\n *\r\n * @param {Partial<AfriCodeConfig>} [userConfig={}] - User overrides\r\n * @returns {AfriCodeConfig} The resolved configuration\r\n *\r\n * @example\r\n * import { createFramework } from 'africode/core/config';\r\n *\r\n * createFramework({\r\n * validation: {\r\n * trimStrings: true\r\n * },\r\n * security: {\r\n * csrf: { enabled: true, secure: true },\r\n * rateLimit: { maxRequests: 100 }\r\n * },\r\n * hooks: {\r\n * onValidationError: (error) => logger.warn('Validation:', error),\r\n * onSecurityViolation: (error) => logger.error('Security:', error),\r\n * onRateLimit: (key) => metrics.increment('rate_limit_hit')\r\n * }\r\n * });\r\n */\r\nexport function createFramework(userConfig = {}) {\r\n _config = deepMerge(DEFAULT_CONFIG, userConfig);\r\n _initialized = true;\r\n return getConfig();\r\n}\r\n\r\n/**\r\n * Get the current framework configuration.\r\n * Returns a frozen copy to prevent accidental mutation.\r\n *\r\n * @returns {AfriCodeConfig}\r\n */\r\nexport function getConfig() {\r\n return Object.freeze(deepClone(_config));\r\n}\r\n\r\n/**\r\n * Check if the framework has been initialized.\r\n * @returns {boolean}\r\n */\r\nexport function isInitialized() {\r\n return _initialized;\r\n}\r\n\r\n/**\r\n * Reset configuration to defaults.\r\n * Primarily for testing.\r\n */\r\nexport function resetConfig() {\r\n _config = deepClone(DEFAULT_CONFIG);\r\n _initialized = false;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// Observability Hooks — fire-and-forget event emitters\r\n//\r\n// These are framework-level hooks for monitoring and logging.\r\n// They never throw — errors in hooks are caught and logged.\r\n// ─────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Emit a validation error event.\r\n * @param {import('./errors.js').ValidationError} error\r\n */\r\nexport function emitValidationError(error) {\r\n const hook = _config.hooks?.onValidationError;\r\n if (typeof hook === 'function') {\r\n try { hook(error); } catch (e) {\r\n console.error('[AfriCode] Hook error in onValidationError:', e);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Emit a security violation event.\r\n * @param {import('./errors.js').SecurityError} error\r\n */\r\nexport function emitSecurityViolation(error) {\r\n const hook = _config.hooks?.onSecurityViolation;\r\n if (typeof hook === 'function') {\r\n try { hook(error); } catch (e) {\r\n console.error('[AfriCode] Hook error in onSecurityViolation:', e);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Emit a rate limit event.\r\n * @param {string} key - The client identifier that was rate limited\r\n * @param {Request} [request] - The request that triggered the limit\r\n */\r\nexport function emitRateLimit(key, request = null) {\r\n const hook = _config.hooks?.onRateLimit;\r\n if (typeof hook === 'function') {\r\n try { hook(key, request); } catch (e) {\r\n console.error('[AfriCode] Hook error in onRateLimit:', e);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Emit a database error event.\r\n * @param {import('./errors.js').DatabaseError} error\r\n */\r\nexport function emitDatabaseError(error) {\r\n const hook = _config.hooks?.onDatabaseError;\r\n if (typeof hook === 'function') {\r\n try { hook(error); } catch (e) {\r\n console.error('[AfriCode] Hook error in onDatabaseError:', e);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Emit a request event.\r\n * @param {Request} request\r\n */\r\nexport function emitRequest(request) {\r\n const hook = _config.hooks?.onRequest;\r\n if (typeof hook === 'function') {\r\n try { hook(request); } catch (e) {\r\n console.error('[AfriCode] Hook error in onRequest:', e);\r\n }\r\n }\r\n}\r\n\r\nexport default {\r\n createFramework,\r\n getConfig,\r\n isInitialized,\r\n resetConfig,\r\n emitValidationError,\r\n emitSecurityViolation,\r\n emitRateLimit,\r\n emitDatabaseError,\r\n emitRequest\r\n};\r\n",
23
+ "/**\r\n * AfriCode Validation System\r\n *\r\n * Philosophy: Strict by default. Convenient by composition. Secure early.\r\n *\r\n * Core validation is strict — URL fields accept only valid URLs.\r\n * Normalization (e.g. empty string → null) is explicit and opt-in.\r\n * Security basics (CSRF, rate limiting) are built into the foundation.\r\n *\r\n * Provides:\r\n * - Zod-based validation schemas for forms, auth, and API validation\r\n * - AfriFieldBuilder: chainable field builder with .nullable(), .emptyAsNull(), .optional()\r\n * - afri namespace: factory for building field schemas (afri.url(), afri.string(), etc.)\r\n * - normalizeInput(): preprocessing utility that runs before validation\r\n *\r\n * @module core/validation\r\n */\r\n\r\nimport { z } from 'zod';\r\nimport { getConfig } from './config.js';\r\n\r\n/**\r\n * Common validation schemas for AfriCode components\r\n */\r\nexport const schemas = {\r\n // User authentication schemas\r\n login: z.object({\r\n email: z.string()\r\n .min(1, 'Email is required')\r\n .email('Please enter a valid email address'),\r\n password: z.string()\r\n .min(8, 'Password must be at least 8 characters')\r\n .regex(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)/,\r\n 'Password must contain at least one uppercase letter, one lowercase letter, and one number')\r\n }),\r\n\r\n register: z.object({\r\n name: z.string()\r\n .min(2, 'Name must be at least 2 characters')\r\n .max(50, 'Name must be less than 50 characters')\r\n .regex(/^[a-zA-Z\\s'-]+$/, 'Name can only contain letters, spaces, hyphens, and apostrophes'),\r\n email: z.string()\r\n .min(1, 'Email is required')\r\n .email('Please enter a valid email address'),\r\n password: z.string()\r\n .min(8, 'Password must be at least 8 characters')\r\n .regex(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])/,\r\n 'Password must contain uppercase, lowercase, number, and special character'),\r\n confirmPassword: z.string()\r\n }).refine(data => data.password === data.confirmPassword, {\r\n message: \"Passwords don't match\",\r\n path: [\"confirmPassword\"]\r\n }),\r\n\r\n auth: {\r\n register: z.object({\r\n action: z.literal('register'),\r\n email: z.string()\r\n .min(1, 'Email is required')\r\n .email('Please enter a valid email address'),\r\n username: z.string()\r\n .min(3, 'Username must be at least 3 characters')\r\n .max(30, 'Username must be less than 30 characters'),\r\n password: z.string()\r\n .min(8, 'Password must be at least 8 characters'),\r\n full_name: z.string()\r\n .min(2, 'Full name is required')\r\n .max(100, 'Full name is too long')\r\n }),\r\n\r\n login: z.object({\r\n action: z.literal('login'),\r\n email: z.string()\r\n .min(1, 'Email is required')\r\n .email('Please enter a valid email address'),\r\n password: z.string()\r\n .min(8, 'Password must be at least 8 characters')\r\n }),\r\n\r\n logout: z.object({\r\n action: z.literal('logout')\r\n }),\r\n\r\n action: z.discriminatedUnion('action', [\r\n z.object({ action: z.literal('register') }).merge(z.object({\r\n email: z.string()\r\n .min(1, 'Email is required')\r\n .email('Please enter a valid email address'),\r\n username: z.string()\r\n .min(3, 'Username must be at least 3 characters')\r\n .max(30, 'Username must be less than 30 characters'),\r\n password: z.string()\r\n .min(8, 'Password must be at least 8 characters'),\r\n full_name: z.string()\r\n .min(2, 'Full name is required')\r\n .max(100, 'Full name is too long')\r\n })),\r\n z.object({ action: z.literal('login') }).merge(z.object({\r\n email: z.string()\r\n .min(1, 'Email is required')\r\n .email('Please enter a valid email address'),\r\n password: z.string()\r\n .min(8, 'Password must be at least 8 characters')\r\n })),\r\n z.object({ action: z.literal('logout') })\r\n ])\r\n },\r\n\r\n // Form input schemas\r\n contact: z.object({\r\n name: z.string()\r\n .min(2, 'Name must be at least 2 characters')\r\n .max(100, 'Name is too long'),\r\n email: z.string()\r\n .email('Please enter a valid email address'),\r\n message: z.string()\r\n .min(10, 'Message must be at least 10 characters')\r\n .max(1000, 'Message is too long')\r\n }),\r\n\r\n // Generic input validation\r\n email: z.string()\r\n .min(1, 'Email is required')\r\n .email('Please enter a valid email address'),\r\n\r\n password: z.string()\r\n .min(8, 'Password must be at least 8 characters')\r\n .regex(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)/,\r\n 'Password must contain uppercase, lowercase, and number'),\r\n\r\n phone: z.string()\r\n .regex(/^[\\+]?[1-9][\\d]{0,15}$/, 'Please enter a valid phone number'),\r\n\r\n // Strict URL: must be a valid URL. Use afri.url().nullable() for nullable URLs.\r\n url: z.string()\r\n .min(1, 'URL is required')\r\n .url('Please enter a valid URL'),\r\n\r\n required: z.string()\r\n .min(1, 'This field is required'),\r\n\r\n // Number validations\r\n positiveNumber: z.number()\r\n .positive('Must be a positive number'),\r\n\r\n integer: z.number()\r\n .int('Must be a whole number'),\r\n\r\n // Date validations\r\n futureDate: z.date()\r\n .min(new Date(), 'Date must be in the future'),\r\n\r\n // File validations\r\n imageFile: z.instanceof(File)\r\n .refine(file => file.size <= 5 * 1024 * 1024, 'File size must be less than 5MB')\r\n .refine(file => ['image/jpeg', 'image/png', 'image/gif', 'image/webp'].includes(file.type),\r\n 'File must be a JPEG, PNG, GIF, or WebP image'),\r\n\r\n // --- DB Model Schemas ---\r\n\r\n /**\r\n * User profile update schema.\r\n * avatar_url: valid URL or null (with opt-in empty-string normalization)\r\n */\r\n userProfile: z.object({\r\n full_name: z.string().min(2, 'Full name must be at least 2 characters').max(100, 'Full name is too long').optional(),\r\n bio: z.string().max(500, 'Bio must be less than 500 characters').nullable().optional(),\r\n avatar_url: z.string().url('Please enter a valid URL').nullable().optional(),\r\n theme: z.enum(['africanity', 'dark', 'light', 'system']).optional(),\r\n language: z.string().min(2).max(10).optional()\r\n }),\r\n\r\n /**\r\n * Project creation/update schema.\r\n * repository_url, demo_url: valid URL or null\r\n */\r\n project: z.object({\r\n name: z.string().min(1, 'Project name is required').max(100, 'Project name is too long'),\r\n description: z.string().max(1000, 'Description is too long').nullable().optional(),\r\n repository_url: z.string().url('Please enter a valid repository URL').nullable().optional(),\r\n demo_url: z.string().url('Please enter a valid demo URL').nullable().optional(),\r\n tags: z.array(z.string()).optional(),\r\n is_public: z.boolean().optional()\r\n })\r\n};\r\n\r\n/**\r\n * Validation utilities\r\n */\r\nexport class Validation {\r\n /**\r\n * Validate data against a schema\r\n * @param {z.ZodSchema} schema - Zod schema to validate against\r\n * @param {any} data - Data to validate\r\n * @returns {Object} { success: boolean, data?: any, errors?: Object }\r\n */\r\n static validate(schema, data) {\r\n try {\r\n const result = schema.parse(data);\r\n return { success: true, data: result };\r\n } catch (error) {\r\n if (error instanceof z.ZodError) {\r\n const errors = {};\r\n error.errors.forEach(err => {\r\n const path = err.path.join('.');\r\n errors[path] = err.message;\r\n });\r\n return { success: false, errors };\r\n }\r\n return { success: false, errors: { general: 'Validation failed' } };\r\n }\r\n }\r\n\r\n /**\r\n * Validate a single field\r\n * @param {z.ZodSchema} schema - Field schema\r\n * @param {any} value - Field value\r\n * @returns {Object} { success: boolean, error?: string }\r\n */\r\n static validateField(schema, value) {\r\n try {\r\n schema.parse(value);\r\n return { success: true };\r\n } catch (error) {\r\n if (error instanceof z.ZodError) {\r\n return { success: false, error: error.errors[0]?.message || 'Invalid value' };\r\n }\r\n return { success: false, error: 'Validation failed' };\r\n }\r\n }\r\n\r\n /**\r\n * Get validation error message for a field\r\n * @param {Object} validationResult - Result from validate()\r\n * @param {string} fieldPath - Dot notation field path\r\n * @returns {string|null} Error message or null\r\n */\r\n static getFieldError(validationResult, fieldPath) {\r\n if (validationResult.success) {return null;}\r\n return validationResult.errors?.[fieldPath] || null;\r\n }\r\n\r\n /**\r\n * Check if a field has validation errors\r\n * @param {Object} validationResult - Result from validate()\r\n * @param {string} fieldPath - Dot notation field path\r\n * @returns {boolean} True if field has errors\r\n */\r\n static hasFieldError(validationResult, fieldPath) {\r\n return !!this.getFieldError(validationResult, fieldPath);\r\n }\r\n}\r\n\r\n/**\r\n * Predefined validation rules for common use cases\r\n */\r\nexport const rules = {\r\n required: (message = 'This field is required') =>\r\n z.string().min(1, message),\r\n\r\n email: (message = 'Please enter a valid email address') =>\r\n z.string().email(message),\r\n\r\n minLength: (min, message) =>\r\n z.string().min(min, message || `Must be at least ${min} characters`),\r\n\r\n maxLength: (max, message) =>\r\n z.string().max(max, message || `Must be less than ${max} characters`),\r\n\r\n pattern: (regex, message) =>\r\n z.string().regex(regex, message),\r\n\r\n numeric: (message = 'Must be a number') =>\r\n z.string().regex(/^\\d+$/, message),\r\n\r\n phone: (message = 'Please enter a valid phone number') =>\r\n z.string().regex(/^[\\+]?[1-9][\\d]{0,15}$/, message),\r\n\r\n url: (message = 'Please enter a valid URL') =>\r\n z.string().min(1, 'URL is required').url(message)\r\n};\r\n\r\n// ─────────────────────────────────────────────────────────────\r\n// AfriFieldBuilder — Chainable field schema builder\r\n//\r\n// Design: Strict by default. Convenient by composition.\r\n//\r\n// Usage:\r\n// afri.url() → valid URL, required\r\n// afri.url().nullable() → valid URL or null\r\n// afri.url().nullable().emptyAsNull() → \"\" → null, then validates\r\n// afri.url().optional() → valid URL or undefined\r\n// afri.string().trim() → trim whitespace in normalizeInput\r\n// ─────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Chainable field builder for AfriCode validation schemas.\r\n * Wraps Zod with framework-level semantics.\r\n *\r\n * IMPORTANT: .emptyAsNull() does NOT alter the Zod schema itself.\r\n * It marks the field for preprocessing via normalizeInput().\r\n * Validation remains strict — the preprocessing layer is separate.\r\n */\r\nexport class AfriFieldBuilder {\r\n /**\r\n * @param {z.ZodSchema} baseSchema - The base Zod schema for this field\r\n * @param {string} fieldType - The field type identifier (e.g. 'url', 'email')\r\n */\r\n constructor(baseSchema, fieldType = 'string') {\r\n this._baseSchema = baseSchema;\r\n this._fieldType = fieldType;\r\n this._isNullable = false;\r\n this._isOptional = false;\r\n this._emptyAsNull = false;\r\n this._trim = false;\r\n this._customMessage = null;\r\n }\r\n\r\n /**\r\n * Allow null as a valid value.\r\n * @returns {AfriFieldBuilder}\r\n */\r\n nullable() {\r\n this._isNullable = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Allow undefined (field can be omitted).\r\n * @returns {AfriFieldBuilder}\r\n */\r\n optional() {\r\n this._isOptional = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Mark this field for empty-string-to-null conversion.\r\n * REQUIRES .nullable() to have been called first.\r\n * The conversion happens in normalizeInput(), not in the Zod schema.\r\n *\r\n * @returns {AfriFieldBuilder}\r\n * @throws {Error} If .nullable() was not called first\r\n */\r\n emptyAsNull() {\r\n if (!this._isNullable) {\r\n throw new Error(\r\n `[AfriCode] .emptyAsNull() requires .nullable() to be called first. ` +\r\n `Use: afri.${this._fieldType}().nullable().emptyAsNull()`\r\n );\r\n }\r\n this._emptyAsNull = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Mark this field for whitespace trimming.\r\n * The trimming happens in normalizeInput(), not in the Zod schema.\r\n * \" hello \" → \"hello\"\r\n *\r\n * @returns {AfriFieldBuilder}\r\n */\r\n trim() {\r\n this._trim = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set a custom error message for the base validation.\r\n * @param {string} message\r\n * @returns {AfriFieldBuilder}\r\n */\r\n message(message) {\r\n this._customMessage = message;\r\n return this;\r\n }\r\n\r\n /**\r\n * Build the final Zod schema.\r\n * @returns {z.ZodSchema}\r\n */\r\n build() {\r\n let schema = this._baseSchema;\r\n\r\n if (this._isNullable) {\r\n schema = schema.nullable();\r\n }\r\n\r\n if (this._isOptional) {\r\n schema = schema.optional();\r\n }\r\n\r\n return schema;\r\n }\r\n\r\n /**\r\n * Get the metadata for this field (used by normalizeInput).\r\n * @returns {Object}\r\n */\r\n getMeta() {\r\n return {\r\n fieldType: this._fieldType,\r\n isNullable: this._isNullable,\r\n isOptional: this._isOptional,\r\n emptyAsNull: this._emptyAsNull,\r\n trim: this._trim\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * AfriCode field factory namespace.\r\n * Creates AfriFieldBuilder instances for common field types.\r\n *\r\n * @example\r\n * // Strict URL — required, only valid URLs accepted\r\n * const urlField = afri.url().build();\r\n *\r\n * @example\r\n * // Nullable URL — valid URL or null\r\n * const avatarField = afri.url().nullable().build();\r\n *\r\n * @example\r\n * // Nullable URL with empty-string normalization\r\n * const avatarField = afri.url().nullable().emptyAsNull().build();\r\n */\r\nexport const afri = {\r\n /**\r\n * Create a strict URL field builder.\r\n * Empty strings are always rejected at the core.\r\n * @param {string} [message='Please enter a valid URL']\r\n * @returns {AfriFieldBuilder}\r\n */\r\n url(message = 'Please enter a valid URL') {\r\n return new AfriFieldBuilder(\r\n z.string().min(1, 'URL cannot be empty').url(message),\r\n 'url'\r\n );\r\n },\r\n\r\n /**\r\n * Create a strict email field builder.\r\n * @param {string} [message='Please enter a valid email address']\r\n * @returns {AfriFieldBuilder}\r\n */\r\n email(message = 'Please enter a valid email address') {\r\n return new AfriFieldBuilder(\r\n z.string().min(1, 'Email cannot be empty').email(message),\r\n 'email'\r\n );\r\n },\r\n\r\n /**\r\n * Create a string field builder.\r\n * @param {Object} [opts]\r\n * @param {number} [opts.min] - Minimum length\r\n * @param {number} [opts.max] - Maximum length\r\n * @param {string} [opts.message] - Custom error message\r\n * @returns {AfriFieldBuilder}\r\n */\r\n string(opts = {}) {\r\n let schema = z.string();\r\n if (opts.min !== undefined) {schema = schema.min(opts.min, opts.message || `Must be at least ${opts.min} characters`);}\r\n if (opts.max !== undefined) {schema = schema.max(opts.max, opts.message || `Must be less than ${opts.max} characters`);}\r\n return new AfriFieldBuilder(schema, 'string');\r\n },\r\n\r\n /**\r\n * Create a number field builder.\r\n * @param {Object} [opts]\r\n * @param {number} [opts.min] - Minimum value\r\n * @param {number} [opts.max] - Maximum value\r\n * @param {boolean} [opts.int] - Must be integer\r\n * @returns {AfriFieldBuilder}\r\n */\r\n number(opts = {}) {\r\n let schema = z.number();\r\n if (opts.min !== undefined) {schema = schema.min(opts.min);}\r\n if (opts.max !== undefined) {schema = schema.max(opts.max);}\r\n if (opts.int) {schema = schema.int('Must be a whole number');}\r\n return new AfriFieldBuilder(schema, 'number');\r\n },\r\n\r\n /**\r\n * Create a phone field builder.\r\n * @param {string} [message='Please enter a valid phone number']\r\n * @returns {AfriFieldBuilder}\r\n */\r\n phone(message = 'Please enter a valid phone number') {\r\n return new AfriFieldBuilder(\r\n z.string().regex(/^[\\+]?[1-9][\\d]{0,15}$/, message),\r\n 'phone'\r\n );\r\n }\r\n};\r\n\r\n/**\r\n * Normalize input data before validation.\r\n *\r\n * This is the preprocessing layer. It examines field metadata from\r\n * AfriFieldBuilder instances and applies transformations:\r\n *\r\n * 1. Trim whitespace (if .trim() or config.validation.trimStrings)\r\n * 2. Convert \"\" → null (if .emptyAsNull())\r\n *\r\n * Order matters: trim runs BEFORE emptyAsNull so that\r\n * \" \" → \"\" → null works correctly.\r\n *\r\n * Separation of concerns:\r\n * - normalizeInput() = input adapter (flexible)\r\n * - Validation.validate() = core validation (strict)\r\n *\r\n * @param {Object} fieldBuilders - Map of field names to AfriFieldBuilder instances\r\n * @param {Object} data - Raw input data (e.g. form submission)\r\n * @returns {Object} Normalized data ready for validation\r\n *\r\n * @example\r\n * const fields = {\r\n * avatar_url: afri.url().nullable().emptyAsNull(),\r\n * name: afri.string({ min: 2 }).trim(),\r\n * bio: afri.string({ max: 500 }).nullable()\r\n * };\r\n *\r\n * const raw = { avatar_url: '', name: ' AfriCode ', bio: 'Hello' };\r\n * const cleaned = normalizeInput(fields, raw);\r\n * // → { avatar_url: null, name: 'AfriCode', bio: 'Hello' }\r\n */\r\nexport function normalizeInput(fieldBuilders, data) {\r\n const result = { ...data };\r\n let globalTrim = false;\r\n\r\n // Check framework config for global trim setting\r\n try {\r\n const config = getConfig();\r\n globalTrim = config.validation?.trimStrings === true;\r\n } catch {\r\n // Config not initialized yet — use defaults (no global trim)\r\n }\r\n\r\n for (const [fieldName, builder] of Object.entries(fieldBuilders)) {\r\n if (!(builder instanceof AfriFieldBuilder)) {continue;}\r\n\r\n const meta = builder.getMeta();\r\n const value = result[fieldName];\r\n\r\n // Step 1: Trim whitespace (per-field .trim() or global config)\r\n if (typeof value === 'string' && (meta.trim || globalTrim)) {\r\n result[fieldName] = value.trim();\r\n }\r\n\r\n // Step 2: Convert empty string to null (per-field .emptyAsNull())\r\n if (meta.emptyAsNull && result[fieldName] === '') {\r\n result[fieldName] = null;\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Build a Zod object schema from a map of AfriFieldBuilder instances.\r\n * Convenience method to go from builders → Zod schema in one step.\r\n *\r\n * @param {Object} fieldBuilders - Map of field names to AfriFieldBuilder instances\r\n * @returns {z.ZodObject}\r\n *\r\n * @example\r\n * const schema = buildSchema({\r\n * avatar_url: afri.url().nullable().emptyAsNull(),\r\n * name: afri.string({ min: 2, max: 50 })\r\n * });\r\n *\r\n * const result = Validation.validate(schema, data);\r\n */\r\nexport function buildSchema(fieldBuilders) {\r\n const shape = {};\r\n\r\n for (const [fieldName, builder] of Object.entries(fieldBuilders)) {\r\n if (builder instanceof AfriFieldBuilder) {\r\n shape[fieldName] = builder.build();\r\n } else {\r\n // Allow raw Zod schemas to be mixed in\r\n shape[fieldName] = builder;\r\n }\r\n }\r\n\r\n return z.object(shape);\r\n}\r\n\r\nexport default { schemas, Validation, rules, afri, AfriFieldBuilder, normalizeInput, buildSchema };",
24
+ "/**\r\n * AfriCode Input Component\r\n * \r\n * Form input with validation, icons, and cultural styling.\r\n * Suitable for: All sectors requiring data collection\r\n * \r\n * @module components/input\r\n */\r\n\r\nimport { AfriCodeComponent, registerComponent } from './base.js';\r\nimport { Validation, rules } from '../core/validation.js';\r\n\r\nexport class AfriInput extends AfriCodeComponent {\r\n static get observedAttributes() {\r\n return ['type', 'name', 'label', 'placeholder', 'error', 'helper', 'theme', 'icon', 'required', 'aria-label', 'aria-describedby', 'validation'];\r\n }\r\n\r\n constructor() {\r\n super();\r\n this._uniqueId = Math.random().toString(36).substr(2, 9);\r\n this.render();\r\n }\r\n\r\n get value() {\r\n return this.shadowRoot.querySelector('input')?.value || '';\r\n }\r\n\r\n set value(val) {\r\n const input = this.shadowRoot.querySelector('input');\r\n if (input) {input.value = val;}\r\n }\r\n\r\n connectedCallback() {\r\n this._attachInputListeners();\r\n this.loadStyles();\r\n }\r\n\r\n attributeChangedCallback() {\r\n this.render();\r\n this._attachInputListeners();\r\n }\r\n\r\n _attachInputListeners() {\r\n const input = this.shadowRoot.querySelector('input');\r\n if (!input) {return;}\r\n\r\n input.addEventListener('input', (e) => {\r\n this.emit('af-input', { value: e.target.value });\r\n if (this.hasAttribute('error')) {\r\n this.removeAttribute('error');\r\n }\r\n });\r\n\r\n input.addEventListener('blur', () => {\r\n this.emit('af-blur', { value: this.value });\r\n this._validateInput();\r\n });\r\n }\r\n\r\n _setupValidation() {\r\n const validationRule = this.getAttribute('validation');\r\n if (!validationRule) {return;}\r\n\r\n const input = this.shadowRoot.querySelector('input');\r\n if (!input) {return;}\r\n\r\n input.addEventListener('input', () => {\r\n if (this.hasAttribute('error')) {\r\n this.removeAttribute('error');\r\n }\r\n });\r\n }\r\n\r\n _validateInput() {\r\n const input = this.shadowRoot.querySelector('input');\r\n if (!input) {return;}\r\n\r\n const validationRule = this.getAttribute('validation');\r\n const value = input.value;\r\n const required = this.hasAttribute('required');\r\n\r\n // Check required first\r\n if (required && !value.trim()) {\r\n this.setAttribute('error', 'This field is required');\r\n return;\r\n }\r\n\r\n // Apply validation rule\r\n if (validationRule && value.trim()) {\r\n const schema = this._getValidationSchema(validationRule);\r\n if (schema) {\r\n const result = Validation.validateField(schema, value);\r\n if (!result.success) {\r\n this.setAttribute('error', result.error);\r\n } else {\r\n this.removeAttribute('error');\r\n }\r\n }\r\n }\r\n }\r\n\r\n _getValidationSchema(ruleName) {\r\n const ruleMap = {\r\n 'email': rules.email(),\r\n 'password': rules.password(),\r\n 'phone': rules.phone(),\r\n 'url': rules.url(),\r\n 'required': rules.required()\r\n };\r\n\r\n // Handle parameterized rules like minLength:5\r\n if (ruleName.includes(':')) {\r\n const [rule, param] = ruleName.split(':');\r\n const numParam = parseInt(param);\r\n\r\n switch (rule) {\r\n case 'minLength':\r\n return rules.minLength(numParam);\r\n case 'maxLength':\r\n return rules.maxLength(numParam);\r\n case 'pattern':\r\n return rules.pattern(new RegExp(param), 'Invalid format');\r\n }\r\n }\r\n\r\n return ruleMap[ruleName] || null;\r\n }\r\n\r\n attributeChangedCallback() {\r\n this.render();\r\n }\r\n\r\n render() {\r\n const type = this.getAttribute('type') || 'text';\r\n const name = this.getAttribute('name') || '';\r\n const label = this.getAttribute('label') || '';\r\n const placeholder = this.getAttribute('placeholder') || '';\r\n const error = this.getAttribute('error') || '';\r\n const helper = this.getAttribute('helper') || '';\r\n const theme = this.getAttribute('theme') || 'tanzania';\r\n const icon = this.getAttribute('icon') || '';\r\n const required = this.hasAttribute('required');\r\n const ariaLabel = this.getAttribute('aria-label');\r\n const ariaDescribedBy = this.getAttribute('aria-describedby');\r\n\r\n const themes = {\r\n tanzania: { focus: '#1EB53A', error: '#DC3545' },\r\n maasai: { focus: '#FF0000', error: '#8B0000' },\r\n ndebele: { focus: '#4169E1', error: '#DC143C' }\r\n };\r\n const t = themes[theme] || themes.tanzania;\r\n\r\n const describedByList = [];\r\n if (error) {describedByList.push(`error-${this._uniqueId}`);}\r\n else if (helper) {describedByList.push(`helper-${this._uniqueId}`);}\r\n if (ariaDescribedBy) {describedByList.push(...ariaDescribedBy.split(' '));}\r\n const combinedDescribedBy = describedByList.length > 0 ? `aria-describedby=\"${describedByList.join(' ')}\"` : '';\r\n\r\n this.shadowRoot.innerHTML = `\r\n <style>\r\n :host {\r\n display: block;\r\n font-family: 'Inter', system-ui, sans-serif;\r\n }\r\n\r\n .input-wrapper {\r\n position: relative;\r\n }\r\n\r\n label {\r\n display: block;\r\n font-weight: 500;\r\n margin-bottom: 5px;\r\n color: #333;\r\n font-size: 14px;\r\n }\r\n\r\n .required-star {\r\n color: ${t.error};\r\n margin-left: 2px;\r\n }\r\n\r\n .input-container {\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n }\r\n\r\n input {\r\n width: 100%;\r\n padding: 10px 13px;\r\n ${icon ? 'padding-left: 40px;' : ''}\r\n font-size: 15px;\r\n border: 2px solid #ddd;\r\n border-radius: 5px;\r\n transition: all 200ms ease;\r\n font-family: inherit;\r\n box-sizing: border-box;\r\n }\r\n\r\n input:focus {\r\n outline: none;\r\n border-color: ${error ? t.error : t.focus};\r\n box-shadow: 0 0 0 3px ${error ? t.error + '20' : t.focus + '20'};\r\n }\r\n\r\n input.has-error {\r\n border-color: ${t.error};\r\n }\r\n\r\n .icon {\r\n position: absolute;\r\n left: 13px;\r\n color: #888;\r\n font-size: 16px;\r\n pointer-events: none;\r\n }\r\n\r\n .helper-text {\r\n font-size: 12px;\r\n margin-top: 4px;\r\n color: #666;\r\n }\r\n\r\n .error-text {\r\n font-size: 12px;\r\n margin-top: 4px;\r\n color: ${t.error};\r\n }\r\n </style>\r\n\r\n <div class=\"input-wrapper\">\r\n ${label ? `<label for=\"input-${this._uniqueId}\">${label}${required ? '<span class=\"required-star\">*</span>' : ''}</label>` : ''}\r\n <div class=\"input-container\">\r\n ${icon ? `<span class=\"icon\">${icon}</span>` : ''}\r\n <input \r\n id=\"input-${this._uniqueId}\"\r\n name=\"${name}\"\r\n type=\"${type}\"\r\n placeholder=\"${placeholder}\"\r\n class=\"${error ? 'has-error' : ''}\"\r\n ${required ? 'required' : ''}\r\n ${ariaLabel ? `aria-label=\"${ariaLabel}\"` : ''}\r\n ${error ? 'aria-invalid=\"true\"' : ''}\r\n ${combinedDescribedBy}\r\n />\r\n </div>\r\n ${error ? `<div id=\"error-${this._uniqueId}\" class=\"error-text\" role=\"alert\">${error}</div>` : ''}\r\n ${helper && !error ? `<div id=\"helper-${this._uniqueId}\" class=\"helper-text\">${helper}</div>` : ''}\r\n </div>\r\n `;\r\n }\r\n}\r\n\r\nregisterComponent('af-input', AfriInput);\r\nexport default AfriInput;\r\n",
25
+ "/**\r\n * AfriCode Alert/Notification Component\r\n * \r\n * Status messages, alerts, and notifications with cultural theming.\r\n * Suitable for: Healthcare alerts, Financial notifications, System messages\r\n * \r\n * @module components/alert\r\n */\r\n\r\nimport { AfriCodeComponent, registerComponent } from './base.js';\r\n\r\nexport class AfriAlert extends AfriCodeComponent {\r\n static get observedAttributes() {\r\n return ['type', 'title', 'dismissible'];\r\n }\r\n\r\n constructor() {\r\n super();\r\n this.render();\r\n }\r\n\r\n connectedCallback() {\r\n this.shadowRoot.querySelector('.close-btn')?.addEventListener('click', () => {\r\n this.remove();\r\n this.emit('af-dismiss');\r\n });\r\n }\r\n\r\n attributeChangedCallback() {\r\n this.render();\r\n }\r\n\r\n render() {\r\n const type = this.getAttribute('type') || 'info';\r\n const title = this.getAttribute('title') || '';\r\n const dismissible = this.hasAttribute('dismissible');\r\n\r\n const types = {\r\n success: { bg: '#d4edda', border: '#1EB53A', text: '#155724', icon: '✓' },\r\n warning: { bg: '#fff3cd', border: '#FCD116', text: '#856404', icon: '⚠' },\r\n error: { bg: '#f8d7da', border: '#DC3545', text: '#721c24', icon: '✕' },\r\n info: { bg: '#d1ecf1', border: '#00A3DD', text: '#0c5460', icon: 'ℹ' }\r\n };\r\n const t = types[type] || types.info;\r\n\r\n this.shadowRoot.innerHTML = `\r\n <style>\r\n :host {\r\n display: block;\r\n font-family: 'Inter', system-ui, sans-serif;\r\n }\r\n\r\n .alert {\r\n padding: 13px 21px;\r\n border-radius: 5px;\r\n border-left: 4px solid ${t.border};\r\n background: ${t.bg};\r\n color: ${t.text};\r\n display: flex;\r\n align-items: flex-start;\r\n gap: 13px;\r\n animation: slideIn 300ms ease-out;\r\n }\r\n\r\n @keyframes slideIn {\r\n from {\r\n opacity: 0;\r\n transform: translateY(-10px);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateY(0);\r\n }\r\n }\r\n\r\n .icon {\r\n font-size: 18px;\r\n flex-shrink: 0;\r\n width: 24px;\r\n height: 24px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n background: ${t.border};\r\n color: white;\r\n border-radius: 50%;\r\n }\r\n\r\n .content {\r\n flex: 1;\r\n }\r\n\r\n .title {\r\n font-weight: 600;\r\n margin-bottom: 3px;\r\n }\r\n\r\n .close-btn {\r\n background: none;\r\n border: none;\r\n font-size: 18px;\r\n cursor: pointer;\r\n color: ${t.text};\r\n opacity: 0.7;\r\n padding: 0;\r\n line-height: 1;\r\n }\r\n\r\n .close-btn:hover {\r\n opacity: 1;\r\n }\r\n\r\n ::slotted(*) {\r\n margin: 0;\r\n }\r\n </style>\r\n\r\n <div class=\"alert\" role=\"alert\">\r\n <span class=\"icon\">${t.icon}</span>\r\n <div class=\"content\">\r\n ${title ? `<div class=\"title\">${title}</div>` : ''}\r\n <slot></slot>\r\n </div>\r\n ${dismissible ? '<button class=\"close-btn\" aria-label=\"Dismiss\">×</button>' : ''}\r\n </div>\r\n `;\r\n }\r\n}\r\n\r\nregisterComponent('af-alert', AfriAlert);\r\nexport default AfriAlert;\r\n",
26
+ "/**\n * AfriCode Grid Layout — <af-grid>\n *\n * A fully-featured, reactive responsive grid system.\n *\n * Attributes:\n * min-width — Minimum column width before wrapping (default: 280px)\n * gap — Grid gap spacing (default: 24px)\n * columns — Fixed column count (overrides auto-fit / min-width)\n * rows — Fixed row count for explicit grid\n * layout — Preset layouts: 'auto' | 'masonry' | 'sidebar' | 'holy-grail' | 'bento'\n * align — Align items: 'start' | 'center' | 'end' | 'stretch' (default: stretch)\n * justify — Justify items: 'start' | 'center' | 'end' | 'stretch' (default: stretch)\n * dense — Enable grid-auto-flow: dense (boolean attribute)\n * sidebar-side — 'left' | 'right' for sidebar layout (default: left)\n * sidebar-width — Width of the sidebar column (default: 280px)\n *\n * Events:\n * af-grid-resize — Fired when grid reflows due to container resize\n *\n * Examples:\n * <af-grid min-width=\"300px\" gap=\"32px\">...</af-grid>\n * <af-grid columns=\"3\" gap=\"16px\">...</af-grid>\n * <af-grid layout=\"sidebar\" sidebar-width=\"240px\">...</af-grid>\n * <af-grid layout=\"bento\" gap=\"16px\">...</af-grid>\n */\nimport { AfriCodeComponent, registerComponent, html } from './base.js';\n\n// Preset layout generators\nfunction getLayoutTemplate(layout, attrs) {\n const {\n sidebarSide = 'left',\n sidebarWidth = '280px',\n minWidth = '280px',\n gap = '24px',\n columns,\n rows,\n align = 'stretch',\n justify = 'stretch',\n dense = false,\n } = attrs;\n\n const denseVal = dense ? 'dense' : '';\n const base = `\n align-items: ${align};\n justify-items: ${justify};\n gap: ${gap};\n `;\n\n switch (layout) {\n case 'sidebar':\n return sidebarSide === 'right'\n ? `display: grid; grid-template-columns: 1fr ${sidebarWidth}; ${base}`\n : `display: grid; grid-template-columns: ${sidebarWidth} 1fr; ${base}`;\n\n case 'holy-grail':\n return `\n display: grid;\n grid-template-columns: ${sidebarWidth} 1fr ${sidebarWidth};\n grid-template-rows: auto 1fr auto;\n ${base}\n `;\n\n case 'bento':\n // Bento grid: 12-column base, children use grid-column/row spans\n return `\n display: grid;\n grid-template-columns: repeat(12, 1fr);\n grid-auto-rows: minmax(120px, auto);\n grid-auto-flow: row ${denseVal};\n ${base}\n `;\n\n case 'masonry':\n // CSS-native masonry (progressive enhancement)\n return `\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(${minWidth}, 1fr));\n grid-template-rows: masonry;\n grid-auto-flow: row ${denseVal};\n ${base}\n `;\n\n case 'auto':\n default: {\n const colValue = columns\n ? `repeat(${columns}, 1fr)`\n : `repeat(auto-fit, minmax(${minWidth}, 1fr))`;\n const rowValue = rows ? `repeat(${rows}, 1fr)` : 'auto';\n return `\n display: grid;\n grid-template-columns: ${colValue};\n ${rows ? `grid-template-rows: ${rowValue};` : ''}\n grid-auto-flow: row ${denseVal};\n ${base}\n `;\n }\n }\n}\n\nexport class AfriGrid extends AfriCodeComponent {\n static get observedAttributes() {\n return [\n 'min-width',\n 'gap',\n 'columns',\n 'rows',\n 'layout',\n 'align',\n 'justify',\n 'dense',\n 'sidebar-side',\n 'sidebar-width',\n ];\n }\n\n attributeChangedCallback() {\n if (this.isConnected) {\n this.render();\n }\n }\n\n _getAttrs() {\n return {\n minWidth: this.getAttribute('min-width') || '280px',\n gap: this.getAttribute('gap') || '24px',\n columns: this.getAttribute('columns') || null,\n rows: this.getAttribute('rows') || null,\n layout: this.getAttribute('layout') || 'auto',\n align: this.getAttribute('align') || 'stretch',\n justify: this.getAttribute('justify') || 'stretch',\n dense: this.hasAttribute('dense'),\n sidebarSide: this.getAttribute('sidebar-side') || 'left',\n sidebarWidth: this.getAttribute('sidebar-width') || '280px',\n };\n }\n\n _buildResponsiveBreakpoints(attrs) {\n // Only apply responsive fallback to auto/masonry layouts\n if (attrs.layout !== 'auto' && attrs.layout !== 'masonry') {\n return '';\n }\n\n return `\n @media (max-width: 768px) {\n .grid {\n grid-template-columns: repeat(auto-fit, minmax(min(${attrs.minWidth}, 100%), 1fr));\n }\n }\n @media (max-width: 480px) {\n .grid {\n grid-template-columns: 1fr;\n }\n }\n `;\n }\n\n _buildSidebarResponsive(attrs) {\n if (attrs.layout !== 'sidebar' && attrs.layout !== 'holy-grail') {\n return '';\n }\n return `\n @media (max-width: 768px) {\n .grid {\n grid-template-columns: 1fr;\n }\n }\n `;\n }\n\n render() {\n const attrs = this._getAttrs();\n const gridStyles = getLayoutTemplate(attrs.layout, attrs);\n const responsiveStyles =\n this._buildResponsiveBreakpoints(attrs) + this._buildSidebarResponsive(attrs);\n\n this.shadowRoot.innerHTML = html`\n <style>\n :host {\n display: block;\n width: 100%;\n box-sizing: border-box;\n }\n\n .grid {\n ${gridStyles}\n width: 100%;\n box-sizing: border-box;\n }\n\n /* Slotted children base styles */\n ::slotted(*) {\n min-width: 0; /* Prevent overflow in grid context */\n }\n\n ${responsiveStyles}\n </style>\n\n <div\n class=\"grid\"\n role=\"list\"\n part=\"grid\"\n aria-label=\"${this.getAttribute('aria-label') || 'Grid layout'}\"\n >\n <slot></slot>\n </div>\n `;\n }\n\n connectedCallback() {\n this.render();\n this._setupResizeObserver();\n }\n\n disconnectedCallback() {\n if (this._resizeObserver) {\n this._resizeObserver.disconnect();\n }\n }\n\n _setupResizeObserver() {\n if (typeof ResizeObserver === 'undefined') {\n return;\n }\n\n let lastWidth = this.offsetWidth;\n this._resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const newWidth = entry.contentRect.width;\n if (Math.abs(newWidth - lastWidth) > 10) {\n lastWidth = newWidth;\n this.emit('af-grid-resize', {\n width: newWidth,\n height: entry.contentRect.height,\n layout: this.getAttribute('layout') || 'auto',\n });\n }\n }\n });\n\n this._resizeObserver.observe(this);\n }\n\n /**\n * Public API: programmatically update grid layout\n * @param {string} layout - New layout preset\n */\n setLayout(layout) {\n this.setAttribute('layout', layout);\n }\n\n /**\n * Public API: programmatically set column count\n * @param {number} count - Number of columns\n */\n setColumns(count) {\n this.setAttribute('columns', String(count));\n }\n\n /**\n * Public API: toggle dense packing\n * @param {boolean} enabled\n */\n setDense(enabled) {\n if (enabled) {\n this.setAttribute('dense', '');\n } else {\n this.removeAttribute('dense');\n }\n }\n}\n\nregisterComponent('af-grid', AfriGrid);\n",
27
+ "/**\r\n * AfriCode Content Section\r\n * Standardized vertical spacing and containerization.\r\n */\r\nimport { AfriCodeComponent, registerComponent, html } from './base.js';\r\n\r\nexport class AfriSection extends AfriCodeComponent {\r\n render() {\r\n const variant = this.getAttribute('variant') || 'default';\r\n const title = this.getAttribute('title');\r\n\r\n this.shadowRoot.innerHTML = html`\r\n <style>\r\n :host { display: block; width: 100%; }\r\n .section {\r\n padding: 100px 5%;\r\n max-width: var(--page-max-width, 1280px);\r\n margin: 0 auto;\r\n }\r\n .section-header {\r\n text-align: center;\r\n margin-bottom: 60px;\r\n }\r\n .section-header h2 {\r\n font-size: 3rem;\r\n font-family: 'Outfit', sans-serif;\r\n margin: 0;\r\n color: var(--text-primary);\r\n }\r\n \r\n :host([variant=\"muted\"]) { background: var(--bg-surface, rgba(30, 41, 59, 0.3)); }\r\n :host([variant=\"brand\"]) { \r\n background: linear-gradient(135deg, var(--bg-base) 0%, var(--bg-surface) 100%);\r\n border-top: 1px solid var(--glass-border);\r\n border-bottom: 1px solid var(--glass-border);\r\n }\r\n </style>\r\n <section class=\"section\">\r\n ${title ? html`\r\n <div class=\"section-header\">\r\n <h2>${title}</h2>\r\n </div>\r\n ` : ''}\r\n <slot></slot>\r\n </section>\r\n `;\r\n }\r\n\r\n connectedCallback() {\r\n this.render();\r\n }\r\n}\r\n\r\nregisterComponent('af-section', AfriSection);\r\n",
28
+ "import { AfriCodeComponent, registerComponent } from './base.js';\r\n\r\nexport class AfriIcon extends AfriCodeComponent {\r\n static get observedAttributes() { return ['name', 'size']; }\r\n\r\n connectedCallback() {\r\n this.render();\r\n }\r\n\r\n render() {\r\n const name = this.getAttribute('name') || 'circle';\r\n const size = this.getAttribute('size') || '24';\r\n\r\n // Simple SVG library (expand as needed)\r\n const icons = {\r\n 'check': '<path d=\"M20 6L9 17l-5-5\" />',\r\n 'x': '<path d=\"M18 6L6 18M6 6l12 12\" />',\r\n 'arrow-right': '<path d=\"M5 12h14M12 5l7 7-7 7\" />',\r\n 'menu': '<path d=\"M3 12h18M3 6h18M3 18h18\" />',\r\n 'search': '<circle cx=\"11\" cy=\"11\" r=\"8\" /><path d=\"M21 21l-4.35-4.35\" />'\r\n };\r\n\r\n const path = icons[name] || '';\r\n\r\n this.shadowRoot.innerHTML = `\r\n <style>\r\n :host { display: inline-flex; vertical-align: middle; }\r\n svg { width: ${size}px; height: ${size}px; stroke: currentColor; fill: none; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }\r\n </style>\r\n <svg viewBox=\"0 0 24 24\">${path}</svg>\r\n `;\r\n }\r\n}\r\n\r\nregisterComponent('af-icon', AfriIcon);\r\nexport default AfriIcon;\r\n",
29
+ "/**\r\n * AfriCode Accordion Component\r\n * \r\n * Collapsible content sections for FAQs and organized information.\r\n * Suitable for: FAQs, Settings, Documentation, Course content\r\n * \r\n * @module components/accordion\r\n */\r\n\r\nimport { AfriCodeComponent, registerComponent } from './base.js';\r\n\r\nexport class AfriAccordion extends AfriCodeComponent {\r\n static get observedAttributes() {\r\n return ['theme', 'multiple'];\r\n }\r\n\r\n constructor() {\r\n super();\r\n this._openItems = new Set();\r\n this._uniqueId = Math.random().toString(36).substr(2, 9);\r\n this.render();\r\n }\r\n\r\n connectedCallback() {\r\n this._setupAccordion();\r\n }\r\n\r\n _setupAccordion() {\r\n const headers = this.shadowRoot.querySelectorAll('.accordion-header');\r\n headers.forEach((header, index) => {\r\n header.addEventListener('click', () => {\r\n this._toggleItem(index);\r\n });\r\n });\r\n }\r\n\r\n _toggleItem(index) {\r\n const multiple = this.hasAttribute('multiple');\r\n\r\n if (this._openItems.has(index)) {\r\n this._openItems.delete(index);\r\n } else {\r\n if (!multiple) {\r\n this._openItems.clear();\r\n }\r\n this._openItems.add(index);\r\n }\r\n\r\n this.render();\r\n this._setupAccordion();\r\n this.emit('af-toggle', { index, open: this._openItems.has(index) });\r\n }\r\n\r\n attributeChangedCallback() {\r\n this.render();\r\n this._setupAccordion();\r\n }\r\n\r\n render() {\r\n const theme = this.getAttribute('theme') || 'tanzania';\r\n const itemsSlot = this.querySelector('[slot=\"items\"]');\r\n const items = itemsSlot ? Array.from(itemsSlot.children) : [];\r\n\r\n const themes = {\r\n tanzania: { accent: '#1EB53A' },\r\n maasai: { accent: '#FF0000' },\r\n ndebele: { accent: '#4169E1' }\r\n };\r\n const t = themes[theme] || themes.tanzania;\r\n\r\n this.shadowRoot.innerHTML = `\r\n <style>\r\n :host {\r\n display: block;\r\n font-family: 'Inter', system-ui, sans-serif;\r\n }\r\n\r\n .accordion {\r\n border-radius: 8px;\r\n overflow: hidden;\r\n box-shadow: 0 2px 8px rgba(0,0,0,0.1);\r\n }\r\n\r\n .accordion-item {\r\n border-bottom: 1px solid #eee;\r\n }\r\n\r\n .accordion-item:last-child {\r\n border-bottom: none;\r\n }\r\n\r\n .accordion-header {\r\n width: 100%;\r\n padding: 16px 21px;\r\n background: white;\r\n border: none;\r\n text-align: left;\r\n font-family: inherit;\r\n font-size: 15px;\r\n font-weight: 600;\r\n color: #333;\r\n cursor: pointer;\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n transition: all 200ms ease;\r\n }\r\n\r\n .accordion-header:hover {\r\n background: #f8f9fa;\r\n }\r\n\r\n .accordion-header.active {\r\n color: ${t.accent};\r\n }\r\n\r\n .accordion-icon {\r\n font-size: 12px;\r\n transition: transform 300ms ease;\r\n }\r\n\r\n .accordion-header.active .accordion-icon {\r\n transform: rotate(180deg);\r\n }\r\n\r\n .accordion-content {\r\n max-height: 0;\r\n overflow: hidden;\r\n background: #fafafa;\r\n transition: max-height 300ms ease-out;\r\n }\r\n\r\n .accordion-content.open {\r\n max-height: 500px;\r\n }\r\n\r\n .accordion-body {\r\n padding: 16px 21px;\r\n color: #555;\r\n line-height: 1.6;\r\n }\r\n\r\n ::slotted([slot=\"items\"]) {\r\n display: none;\r\n }\r\n </style>\r\n\r\n <div class=\"accordion\">\r\n ${items.map((item, i) => {\r\n const expanded = this._openItems.has(i);\r\n const headerId = `accordion-header-${this._uniqueId}-${i}`;\r\n const panelId = `accordion-panel-${this._uniqueId}-${i}`;\r\n return `\r\n <div class=\"accordion-item\">\r\n <button\r\n class=\"accordion-header ${expanded ? 'active' : ''}\"\r\n aria-expanded=\"${expanded}\"\r\n aria-controls=\"${panelId}\"\r\n id=\"${headerId}\"\r\n >\r\n <span>${item.getAttribute('title') || `Item ${i + 1}`}</span>\r\n <span class=\"accordion-icon\">▼</span>\r\n </button>\r\n <div\r\n class=\"accordion-content ${expanded ? 'open' : ''}\"\r\n id=\"${panelId}\"\r\n role=\"region\"\r\n aria-labelledby=\"${headerId}\"\r\n >\r\n <div class=\"accordion-body\">\r\n ${item.innerHTML}\r\n </div>\r\n </div>\r\n </div>\r\n `}).join('')}\r\n </div>\r\n <slot name=\"items\"></slot>\r\n `;\r\n }\r\n}\r\n\r\nregisterComponent('af-accordion', AfriAccordion);\r\nexport default AfriAccordion;\r\n",
30
+ "import { AfriCodeComponent, registerComponent } from './base.js';\r\nimport { html } from '../core/html.js';\r\nimport { store } from '../core/store.js';\r\nimport { subscribe } from '../core/state.js';\r\n\r\n/**\r\n * AfriHero Component\r\n * \r\n * High-impact hero section with support for patterns and rhythmic layout.\r\n * \r\n * @example\r\n * <af-hero \r\n * title=\"AfriCode\" \r\n * subtitle=\"The Rhythmic Web Framework\" \r\n * pattern=\"kente\">\r\n * </af-hero>\r\n */\r\nexport class AfriHero extends AfriCodeComponent {\r\n static get observedAttributes() { return ['title', 'subtitle', 'pattern', 'overlay']; }\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n this.render();\r\n this.loadStyles();\r\n }\r\n\r\n render() {\r\n const title = this.getAttribute('title') || 'AfriCode';\r\n const subtitle = this.getAttribute('subtitle') || '';\r\n const pattern = this.getAttribute('pattern') || '';\r\n const variant = this.getAttribute('variant') || 'default';\r\n\r\n this.shadowRoot.innerHTML = `\r\n <style>\r\n :host {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n text-align: center;\r\n padding: 120px 5%;\r\n min-height: 60vh;\r\n background: var(--bg-base, #020617);\r\n color: var(--text-main, white);\r\n position: relative;\r\n overflow: hidden;\r\n }\r\n\r\n .content {\r\n position: relative;\r\n z-index: 10;\r\n max-width: 900px;\r\n opacity: 0;\r\n transform: translateY(20px);\r\n animation: fadeInUp 0.8s cubic-bezier(0.16, 1, 0.3, 1) forwards;\r\n }\r\n\r\n @keyframes fadeInUp {\r\n to { opacity: 1; transform: translateY(0); }\r\n }\r\n\r\n h1 {\r\n font-family: 'Outfit', 'Space Grotesk', sans-serif;\r\n font-size: clamp(3rem, 8vw, 5rem);\r\n font-weight: 900;\r\n line-height: 1.1;\r\n margin-bottom: 24px;\r\n letter-spacing: -0.04em;\r\n background: linear-gradient(135deg, var(--text-main, #fff) 30%, var(--text-muted, rgba(255,255,255,0.5)) 100%);\r\n -webkit-background-clip: text;\r\n -webkit-text-fill-color: transparent;\r\n }\r\n\r\n p {\r\n font-family: 'Inter', sans-serif;\r\n font-size: clamp(1.1rem, 2vw, 1.5rem);\r\n color: var(--text-secondary, #94a3b8);\r\n line-height: 1.5;\r\n margin-bottom: 40px;\r\n max-width: 700px;\r\n margin-left: auto;\r\n margin-right: auto;\r\n }\r\n\r\n /* Visual Accents */\r\n .aura {\r\n position: absolute;\r\n inset: 0;\r\n background: radial-gradient(circle at 50% -20%, rgba(30,181,58,0.15), transparent 70%);\r\n z-index: 1;\r\n }\r\n\r\n .mesh {\r\n position: absolute;\r\n inset: 0;\r\n background-image: radial-gradient(rgba(255,255,255,0.03) 1px, transparent 1px);\r\n background-size: 40px 40px;\r\n z-index: 2;\r\n }\r\n\r\n ${pattern ? `\r\n .pattern-bg {\r\n position: absolute;\r\n inset: 0;\r\n background-image: url('${pattern}');\r\n background-size: cover;\r\n background-position: center;\r\n opacity: 0.15;\r\n z-index: 1;\r\n }\r\n ` : ''}\r\n\r\n ::slotted([slot=\"actions\"]) {\r\n display: flex;\r\n gap: 16px;\r\n justify-content: center;\r\n flex-wrap: wrap;\r\n }\r\n </style>\r\n \r\n <div class=\"aura\"></div>\r\n <div class=\"mesh\"></div>\r\n ${pattern ? `<div class=\"pattern-bg\"></div>` : ''}\r\n \r\n <div class=\"content\">\r\n <h1>${title}</h1>\r\n ${subtitle ? `<p>${subtitle}</p>` : ''}\r\n <div class=\"actions\">\r\n <slot name=\"actions\"></slot>\r\n </div>\r\n <slot></slot>\r\n </div>\r\n `;\r\n }\r\n}\r\n\r\nregisterComponent('af-hero', AfriHero);\r\nexport default AfriHero;\r\n",
31
+ "/**\r\n * AfriCode Data Table Component\r\n * \r\n * Sortable, paginated data table with cultural theming.\r\n * Suitable for: Finance dashboards, Admin panels, Healthcare records, Inventory\r\n * \r\n * @module components/table\r\n */\r\n\r\nimport { AfriCodeComponent, registerComponent } from './base.js';\r\n\r\nexport class AfriTable extends AfriCodeComponent {\r\n static get observedAttributes() {\r\n return ['theme', 'striped', 'hoverable'];\r\n }\r\n\r\n constructor() {\r\n super();\r\n this._columns = [];\r\n this._data = [];\r\n this._sortColumn = null;\r\n this._sortDirection = 'asc';\r\n this.render();\r\n }\r\n\r\n set columns(cols) {\r\n this._columns = cols;\r\n this.render();\r\n }\r\n\r\n set data(rows) {\r\n this._data = rows;\r\n this.render();\r\n }\r\n\r\n attributeChangedCallback() {\r\n this.render();\r\n }\r\n\r\n _handleSort(column) {\r\n if (this._sortColumn === column) {\r\n this._sortDirection = this._sortDirection === 'asc' ? 'desc' : 'asc';\r\n } else {\r\n this._sortColumn = column;\r\n this._sortDirection = 'asc';\r\n }\r\n this.emit('af-sort', { column, direction: this._sortDirection });\r\n this.render();\r\n }\r\n\r\n _getSortedData() {\r\n if (!this._sortColumn) {return this._data;}\r\n\r\n return [...this._data].sort((a, b) => {\r\n const aVal = a[this._sortColumn];\r\n const bVal = b[this._sortColumn];\r\n const modifier = this._sortDirection === 'asc' ? 1 : -1;\r\n\r\n if (typeof aVal === 'number') {\r\n return (aVal - bVal) * modifier;\r\n }\r\n return String(aVal).localeCompare(String(bVal)) * modifier;\r\n });\r\n }\r\n\r\n render() {\r\n const theme = this.getAttribute('theme') || 'tanzania';\r\n const striped = this.hasAttribute('striped');\r\n const hoverable = this.hasAttribute('hoverable');\r\n\r\n const themes = {\r\n tanzania: { header: '#1EB53A', text: '#FFFFFF', accent: '#FCD116' },\r\n maasai: { header: '#8B0000', text: '#FFFFFF', accent: '#FF0000' },\r\n ndebele: { header: '#4169E1', text: '#FFFFFF', accent: '#FFD700' }\r\n };\r\n const t = themes[theme] || themes.tanzania;\r\n const sortedData = this._getSortedData();\r\n\r\n this.shadowRoot.innerHTML = `\r\n <style>\r\n :host {\r\n display: block;\r\n font-family: 'Inter', system-ui, sans-serif;\r\n }\r\n\r\n .table-container {\r\n overflow-x: auto;\r\n border-radius: 8px;\r\n box-shadow: 0 2px 8px rgba(0,0,0,0.1);\r\n }\r\n\r\n table {\r\n width: 100%;\r\n border-collapse: collapse;\r\n background: white;\r\n }\r\n\r\n th {\r\n background: ${t.header};\r\n color: ${t.text};\r\n padding: 13px;\r\n text-align: left;\r\n font-weight: 600;\r\n cursor: pointer;\r\n user-select: none;\r\n white-space: nowrap;\r\n }\r\n\r\n th:hover {\r\n filter: brightness(1.1);\r\n }\r\n\r\n th .sort-icon {\r\n margin-left: 5px;\r\n opacity: 0.7;\r\n }\r\n\r\n td {\r\n padding: 13px;\r\n border-bottom: 1px solid #eee;\r\n }\r\n\r\n ${striped ? `\r\n tbody tr:nth-child(even) {\r\n background: #f8f9fa;\r\n }\r\n ` : ''}\r\n\r\n ${hoverable ? `\r\n tbody tr:hover {\r\n background: ${t.accent}20;\r\n }\r\n ` : ''}\r\n\r\n .empty-state {\r\n text-align: center;\r\n padding: 34px;\r\n color: #888;\r\n }\r\n </style>\r\n\r\n <div class=\"table-container\">\r\n <table>\r\n <thead>\r\n <tr>\r\n ${this._columns.map(col => `\r\n <th data-column=\"${col.key}\">\r\n ${col.label}\r\n <span class=\"sort-icon\">\r\n ${this._sortColumn === col.key ? (this._sortDirection === 'asc' ? '↑' : '↓') : '↕'}\r\n </span>\r\n </th>\r\n `).join('')}\r\n </tr>\r\n </thead>\r\n <tbody>\r\n ${sortedData.length ? sortedData.map(row => `\r\n <tr>\r\n ${this._columns.map(col => `<td>${row[col.key] ?? ''}</td>`).join('')}\r\n </tr>\r\n `).join('') : `\r\n <tr>\r\n <td colspan=\"${this._columns.length}\" class=\"empty-state\">No data available</td>\r\n </tr>\r\n `}\r\n </tbody>\r\n </table>\r\n </div>\r\n `;\r\n\r\n // Add sort listeners\r\n this.shadowRoot.querySelectorAll('th').forEach(th => {\r\n th.addEventListener('click', () => {\r\n this._handleSort(th.dataset.column);\r\n });\r\n });\r\n }\r\n}\r\n\r\nregisterComponent('af-table', AfriTable);\r\nexport default AfriTable;\r\n",
32
+ "/**\r\n * AfriCode Modal/Dialog Component\r\n * \r\n * Accessible modal dialog with backdrop and animations.\r\n * Suitable for: Confirmations, Forms, Details view, Alerts\r\n * \r\n * @module components/modal\r\n */\r\n\r\nimport { AfriCodeComponent, registerComponent } from './base.js';\r\n\r\nexport class AfriModal extends AfriCodeComponent {\r\n static get observedAttributes() {\r\n return ['open', 'theme', 'size', 'aria-label', 'aria-labelledby'];\r\n }\r\n\r\n constructor() {\r\n super();\r\n this.render();\r\n }\r\n\r\n connectedCallback() {\r\n this._setupListeners();\r\n }\r\n\r\n _setupListeners() {\r\n // Close on backdrop click\r\n this.shadowRoot.querySelector('.backdrop')?.addEventListener('click', (e) => {\r\n if (e.target.classList.contains('backdrop')) {\r\n this.close();\r\n }\r\n });\r\n\r\n // Close button\r\n this.shadowRoot.querySelector('.close-btn')?.addEventListener('click', () => {\r\n this.close();\r\n });\r\n\r\n // ESC key\r\n document.addEventListener('keydown', (e) => {\r\n if (e.key === 'Escape' && this.hasAttribute('open')) {\r\n this.close();\r\n }\r\n });\r\n\r\n // Focus trapping\r\n this.shadowRoot.addEventListener('keydown', (e) => {\r\n if (e.key === 'Tab' && this.hasAttribute('open')) {\r\n this._handleTabKey(e);\r\n }\r\n });\r\n }\r\n\r\n _getFocusableElements() {\r\n const modal = this.shadowRoot.querySelector('.modal');\r\n const focusableSelectors = 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])';\r\n \r\n // Modal internals\r\n const shadowFocusables = Array.from(modal?.querySelectorAll(focusableSelectors) || []);\r\n \r\n // Slotted contents\r\n const lightFocusables = Array.from(this.querySelectorAll(focusableSelectors));\r\n \r\n return [...shadowFocusables, ...lightFocusables];\r\n }\r\n\r\n _focusFirstFocusableElement() {\r\n const focusableElements = this._getFocusableElements();\r\n if (focusableElements.length > 0) {\r\n focusableElements[0].focus();\r\n } else {\r\n this.shadowRoot.querySelector('.close-btn')?.focus();\r\n }\r\n }\r\n\r\n _handleTabKey(e) {\r\n const focusableElements = this._getFocusableElements();\r\n if (focusableElements.length === 0) {\r\n e.preventDefault();\r\n return;\r\n }\r\n\r\n const firstElement = focusableElements[0];\r\n const lastElement = focusableElements[focusableElements.length - 1];\r\n\r\n if (e.shiftKey) {\r\n // Shift + Tab\r\n if (document.activeElement === firstElement) {\r\n e.preventDefault();\r\n lastElement.focus();\r\n }\r\n } else {\r\n // Tab\r\n if (document.activeElement === lastElement) {\r\n e.preventDefault();\r\n firstElement.focus();\r\n }\r\n }\r\n }\r\n\r\n open() {\r\n this.setAttribute('open', '');\r\n document.body.style.overflow = 'hidden';\r\n \r\n // Focus management\r\n this._previousFocus = document.activeElement;\r\n this._focusFirstFocusableElement();\r\n \r\n this.emit('af-open');\r\n }\r\n\r\n close() {\r\n this.removeAttribute('open');\r\n document.body.style.overflow = '';\r\n \r\n // Restore focus\r\n if (this._previousFocus && this._previousFocus.focus) {\r\n this._previousFocus.focus();\r\n }\r\n \r\n this.emit('af-close');\r\n }\r\n\r\n attributeChangedCallback(name, oldVal, newVal) {\r\n this.render();\r\n if (name === 'open') {\r\n this._setupListeners();\r\n }\r\n }\r\n\r\n render() {\r\n const isOpen = this.hasAttribute('open');\r\n const theme = this.getAttribute('theme') || 'tanzania';\r\n const size = this.getAttribute('size') || 'md';\r\n\r\n const themes = {\r\n tanzania: { accent: '#1EB53A' },\r\n maasai: { accent: '#FF0000' },\r\n ndebele: { accent: '#4169E1' }\r\n };\r\n const t = themes[theme] || themes.tanzania;\r\n\r\n const sizes = {\r\n sm: '400px',\r\n md: '560px',\r\n lg: '720px',\r\n full: '95vw'\r\n };\r\n\r\n const ariaLabel = this.getAttribute('aria-label');\r\n const ariaLabelledBy = this.getAttribute('aria-labelledby') || 'modal-title';\r\n\r\n this.shadowRoot.innerHTML = `\r\n <style>\r\n :host {\r\n font-family: 'Inter', system-ui, sans-serif;\r\n }\r\n\r\n .backdrop {\r\n position: fixed;\r\n inset: 0;\r\n background: rgba(0, 0, 0, 0.5);\r\n display: ${isOpen ? 'flex' : 'none'};\r\n align-items: center;\r\n justify-content: center;\r\n z-index: 10000;\r\n animation: fadeIn 200ms ease-out;\r\n padding: 21px;\r\n }\r\n\r\n @keyframes fadeIn {\r\n from { opacity: 0; }\r\n to { opacity: 1; }\r\n }\r\n\r\n .modal {\r\n background: white;\r\n border-radius: 8px;\r\n width: 100%;\r\n max-width: ${sizes[size] || sizes.md};\r\n max-height: 90vh;\r\n overflow: hidden;\r\n display: flex;\r\n flex-direction: column;\r\n animation: slideUp 300ms ease-out;\r\n box-shadow: 0 10px 40px rgba(0,0,0,0.3);\r\n }\r\n\r\n @keyframes slideUp {\r\n from {\r\n opacity: 0;\r\n transform: translateY(20px);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateY(0);\r\n }\r\n }\r\n\r\n .modal-header {\r\n padding: 13px 21px;\r\n border-bottom: 1px solid #eee;\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n }\r\n\r\n .modal-header ::slotted(*) {\r\n margin: 0;\r\n font-size: 18px;\r\n font-weight: 600;\r\n }\r\n\r\n .close-btn {\r\n background: none;\r\n border: none;\r\n font-size: 24px;\r\n cursor: pointer;\r\n color: #666;\r\n padding: 0;\r\n line-height: 1;\r\n }\r\n\r\n .close-btn:hover {\r\n color: ${t.accent};\r\n }\r\n\r\n .modal-body {\r\n padding: 21px;\r\n overflow-y: auto;\r\n flex: 1;\r\n }\r\n\r\n .modal-footer {\r\n padding: 13px 21px;\r\n border-top: 1px solid #eee;\r\n display: flex;\r\n gap: 8px;\r\n justify-content: flex-end;\r\n }\r\n </style>\r\n\r\n <div class=\"backdrop\">\r\n <div class=\"modal\" role=\"dialog\" aria-modal=\"true\" ${ariaLabel ? `aria-label=\"${ariaLabel}\"` : `aria-labelledby=\"${ariaLabelledBy}\"`}>\r\n <div class=\"modal-header\">\r\n <slot name=\"header\" id=\"modal-title\"></slot>\r\n <button class=\"close-btn\" aria-label=\"Close modal\">×</button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <slot></slot>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <slot name=\"footer\"></slot>\r\n </div>\r\n </div>\r\n </div>\r\n `;\r\n }\r\n}\r\n\r\nregisterComponent('af-modal', AfriModal);\r\nexport default AfriModal;\r\n",
33
+ "/**\r\n * AfriCode Tabs Component\r\n * \r\n * Tabbed navigation for organized content sections.\r\n * Suitable for: Dashboards, Settings, Product details, Documentation\r\n * \r\n * @module components/tabs\r\n */\r\n\r\nimport { AfriCodeComponent, registerComponent } from './base.js';\r\n\r\nexport class AfriTabs extends AfriCodeComponent {\r\n static get observedAttributes() {\r\n return ['theme'];\r\n }\r\n\r\n constructor() {\r\n super();\r\n this._activeTab = 0;\r\n this.render();\r\n }\r\n\r\n connectedCallback() {\r\n this._setupTabs();\r\n this.addEventListener('keydown', this._handleKeydown.bind(this));\r\n }\r\n\r\n _handleKeydown(e) {\r\n const tabSlot = this.querySelector('[slot=\"tabs\"]');\r\n const tabItems = tabSlot ? Array.from(tabSlot.children) : [];\r\n \r\n if (tabItems.length === 0) {return;}\r\n\r\n switch (e.key) {\r\n case 'ArrowLeft':\r\n e.preventDefault();\r\n this._activeTab = this._activeTab > 0 ? this._activeTab - 1 : tabItems.length - 1;\r\n this.render();\r\n this._setupTabs();\r\n this._focusActiveTab();\r\n break;\r\n case 'ArrowRight':\r\n e.preventDefault();\r\n this._activeTab = this._activeTab < tabItems.length - 1 ? this._activeTab + 1 : 0;\r\n this.render();\r\n this._setupTabs();\r\n this._focusActiveTab();\r\n break;\r\n case 'Home':\r\n e.preventDefault();\r\n this._activeTab = 0;\r\n this.render();\r\n this._setupTabs();\r\n this._focusActiveTab();\r\n break;\r\n case 'End':\r\n e.preventDefault();\r\n this._activeTab = tabItems.length - 1;\r\n this.render();\r\n this._setupTabs();\r\n this._focusActiveTab();\r\n break;\r\n }\r\n }\r\n\r\n _focusActiveTab() {\r\n const tabs = this.shadowRoot.querySelectorAll('.tab-button');\r\n if (tabs[this._activeTab]) {\r\n tabs[this._activeTab].focus();\r\n }\r\n }\r\n\r\n _setupTabs() {\r\n const tabs = this.shadowRoot.querySelectorAll('.tab-button');\r\n tabs.forEach((tab, index) => {\r\n tab.addEventListener('click', () => {\r\n this._activeTab = index;\r\n this.render();\r\n this._setupTabs();\r\n this.emit('af-tab-change', { index, tab: tab.textContent });\r\n });\r\n });\r\n }\r\n\r\n attributeChangedCallback() {\r\n this.render();\r\n this._setupTabs();\r\n }\r\n\r\n render() {\r\n const theme = this.getAttribute('theme') || 'tanzania';\r\n const tabSlot = this.querySelector('[slot=\"tabs\"]');\r\n const tabItems = tabSlot ? Array.from(tabSlot.children) : [];\r\n\r\n const themes = {\r\n tanzania: { active: '#1EB53A', text: '#FFFFFF' },\r\n maasai: { active: '#FF0000', text: '#FFFFFF' },\r\n ndebele: { active: '#4169E1', text: '#FFFFFF' }\r\n };\r\n const t = themes[theme] || themes.tanzania;\r\n\r\n this.shadowRoot.innerHTML = `\r\n <style>\r\n :host {\r\n display: block;\r\n font-family: 'Inter', system-ui, sans-serif;\r\n }\r\n\r\n .tabs-container {\r\n border-radius: 8px;\r\n overflow: hidden;\r\n box-shadow: 0 2px 8px rgba(0,0,0,0.1);\r\n }\r\n\r\n .tab-list {\r\n display: flex;\r\n background: #f5f5f5;\r\n border-bottom: 2px solid #eee;\r\n overflow-x: auto;\r\n }\r\n\r\n .tab-button {\r\n padding: 13px 21px;\r\n background: none;\r\n border: none;\r\n font-family: inherit;\r\n font-size: 14px;\r\n font-weight: 500;\r\n color: #666;\r\n cursor: pointer;\r\n white-space: nowrap;\r\n transition: all 200ms ease;\r\n border-bottom: 2px solid transparent;\r\n margin-bottom: -2px;\r\n }\r\n\r\n .tab-button:hover {\r\n color: ${t.active};\r\n background: rgba(0,0,0,0.03);\r\n }\r\n\r\n .tab-button.active {\r\n color: ${t.active};\r\n border-bottom-color: ${t.active};\r\n background: white;\r\n }\r\n\r\n .tab-panels {\r\n background: white;\r\n padding: 21px;\r\n }\r\n\r\n .tab-panel {\r\n display: none;\r\n }\r\n\r\n .tab-panel.active {\r\n display: block;\r\n animation: fadeIn 200ms ease-out;\r\n }\r\n\r\n @keyframes fadeIn {\r\n from { opacity: 0; }\r\n to { opacity: 1; }\r\n }\r\n\r\n ::slotted([slot=\"tabs\"]) {\r\n display: none;\r\n }\r\n </style>\r\n\r\n <div class=\"tabs-container\">\r\n <div class=\"tab-list\" role=\"tablist\">\r\n ${tabItems.map((tab, i) => `\r\n <button class=\"tab-button ${i === this._activeTab ? 'active' : ''}\" \r\n role=\"tab\" \r\n aria-selected=\"${i === this._activeTab}\"\r\n aria-controls=\"panel-${i}\"\r\n tabindex=\"${i === this._activeTab ? '0' : '-1'}\"\r\n id=\"tab-${i}\">\r\n ${tab.getAttribute('label') || `Tab ${i + 1}`}\r\n </button>\r\n `).join('')}\r\n </div>\r\n <div class=\"tab-panels\">\r\n ${tabItems.map((tab, i) => `\r\n <div class=\"tab-panel ${i === this._activeTab ? 'active' : ''}\" \r\n role=\"tabpanel\"\r\n id=\"panel-${i}\"\r\n aria-labelledby=\"tab-${i}\">\r\n ${tab.innerHTML}\r\n </div>\r\n `).join('')}\r\n </div>\r\n </div>\r\n <slot name=\"tabs\"></slot>\r\n `;\r\n }\r\n}\r\n\r\nregisterComponent('af-tabs', AfriTabs);\r\nexport default AfriTabs;\r\n",
34
+ "/**\r\n * AfriCode Sidebar Component\r\n * \r\n * Collapsible side navigation with pattern header.\r\n * Reactively binded to the Global Store.\r\n * \r\n * @module components/sidebar\r\n */\r\n\r\nimport { AfriCodeComponent, registerComponent } from './base.js';\r\nimport { store } from '../core/store.js';\r\nimport { subscribe } from '../core/state.js';\r\n\r\nexport class AfriSidebar extends AfriCodeComponent {\r\n static get observedAttributes() {\r\n return ['position'];\r\n }\r\n\r\n constructor() {\r\n super();\r\n this._unsubscribe = null;\r\n }\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n\r\n // Subscribe to store updates\r\n this._unsubscribe = subscribe(() => {\r\n this.updateUI();\r\n });\r\n\r\n // Initial render\r\n this.render();\r\n }\r\n\r\n disconnectedCallback() {\r\n if (this._unsubscribe) {\r\n this._unsubscribe();\r\n }\r\n }\r\n\r\n updateUI() {\r\n // Reactive update: minimal DOM manipulation\r\n const collapsed = store.ui.sidebarCollapsed;\r\n const sidebar = this.shadowRoot.querySelector('.sidebar');\r\n const title = this.shadowRoot.querySelector('.sidebar-title');\r\n const toggleBtn = this.shadowRoot.getElementById('toggle');\r\n const content = this.shadowRoot.querySelector('.sidebar-content');\r\n\r\n // Apply changes if elements exist (shadowDOM might be lazy)\r\n if (sidebar) {sidebar.style.width = collapsed ? '60px' : '260px';}\r\n if (title) {title.style.opacity = collapsed ? '0' : '1';}\r\n if (content) {content.style.padding = collapsed ? '12px' : '20px';}\r\n if (toggleBtn) {toggleBtn.innerHTML = collapsed ? '→' : '← Collapse';}\r\n }\r\n\r\n render() {\r\n const position = this.getAttribute('position') || 'left';\r\n // Read initial state from store\r\n const collapsed = store.ui.sidebarCollapsed;\r\n\r\n this.shadowRoot.innerHTML = `\r\n <style>\r\n :host {\r\n display: block;\r\n position: fixed;\r\n top: 0;\r\n ${position}: 0;\r\n height: 100vh;\r\n z-index: 900;\r\n font-family: 'Inter', system-ui, sans-serif;\r\n }\r\n\r\n .sidebar {\r\n width: ${collapsed ? '60px' : '260px'};\r\n height: 100%;\r\n background: #121212;\r\n border-${position === 'left' ? 'right' : 'left'}: 1px solid #1e1e1e;\r\n display: flex;\r\n flex-direction: column;\r\n transition: width 0.3s var(--ease-drum, ease);\r\n overflow: hidden;\r\n }\r\n\r\n .sidebar-header {\r\n padding: 20px;\r\n border-bottom: 1px solid #1e1e1e;\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n }\r\n\r\n .sidebar-logo {\r\n width: 32px;\r\n height: 32px;\r\n background: linear-gradient(135deg, #1EB53A, #FCD116);\r\n border-radius: 8px;\r\n flex-shrink: 0;\r\n }\r\n\r\n .sidebar-title {\r\n font-weight: 700;\r\n font-size: 1.1rem;\r\n color: #FCD116;\r\n white-space: nowrap;\r\n opacity: ${collapsed ? 0 : 1};\r\n transition: opacity 0.2s;\r\n }\r\n\r\n .sidebar-content {\r\n flex: 1;\r\n padding: ${collapsed ? '12px' : '20px'};\r\n overflow-y: auto;\r\n }\r\n\r\n .sidebar-footer {\r\n padding: 16px;\r\n border-top: 1px solid #1e1e1e;\r\n }\r\n\r\n .toggle-btn {\r\n width: 100%;\r\n padding: 10px;\r\n background: #1e1e1e;\r\n border: none;\r\n border-radius: 8px;\r\n color: #a0a0a0;\r\n cursor: pointer;\r\n font-size: 0.85rem;\r\n transition: all 0.2s;\r\n }\r\n\r\n .toggle-btn:hover {\r\n background: #2a2a2a;\r\n color: #1EB53A;\r\n }\r\n\r\n /* Slotted Content Styles */\r\n ::slotted(a), ::slotted(button) {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n padding: 12px 16px;\r\n color: #a0a0a0;\r\n text-decoration: none;\r\n border-radius: 8px;\r\n margin-bottom: 4px;\r\n transition: all 0.2s;\r\n }\r\n\r\n ::slotted(a:hover), ::slotted(button:hover) {\r\n background: #1e1e1e;\r\n color: #1EB53A;\r\n }\r\n </style>\r\n\r\n <aside class=\"sidebar\">\r\n <div class=\"sidebar-header\">\r\n <div class=\"sidebar-logo\"></div>\r\n <span class=\"sidebar-title\">AfriCode</span>\r\n </div>\r\n <nav class=\"sidebar-content\">\r\n <slot></slot>\r\n </nav>\r\n <div class=\"sidebar-footer\">\r\n <button class=\"toggle-btn\" id=\"toggle\">\r\n ${collapsed ? '→' : '← Collapse'}\r\n </button>\r\n </div>\r\n </aside>\r\n `;\r\n\r\n this.shadowRoot.getElementById('toggle').addEventListener('click', () => {\r\n actions.toggleSidebar(); // Dispatch action to store\r\n });\r\n }\r\n}\r\n\r\nregisterComponent('af-sidebar', AfriSidebar);\r\nexport default AfriSidebar;\r\n",
35
+ "/**\r\n * AfriCode Dropdown Component\r\n * \r\n * Dropdown menu with keyboard navigation.\r\n * \r\n * @module components/dropdown\r\n */\r\n\r\nimport { AfriCodeComponent, registerComponent } from './base.js';\r\n\r\nexport class AfriDropdown extends AfriCodeComponent {\r\n static get observedAttributes() {\r\n return ['label', 'open'];\r\n }\r\n\r\n constructor() {\r\n super();\r\n this._open = false;\r\n this.render();\r\n }\r\n\r\n toggle() {\r\n this._open = !this._open;\r\n if (this._open) {\r\n this.setAttribute('open', '');\r\n } else {\r\n this.removeAttribute('open');\r\n }\r\n this.render();\r\n }\r\n\r\n close() {\r\n this._open = false;\r\n this.removeAttribute('open');\r\n this.render();\r\n }\r\n\r\n connectedCallback() {\r\n // Close on outside click\r\n document.addEventListener('click', (e) => {\r\n if (!this.contains(e.target)) {\r\n this.close();\r\n }\r\n });\r\n\r\n // Keyboard navigation\r\n this.addEventListener('keydown', this._handleKeydown.bind(this));\r\n }\r\n\r\n _handleKeydown(e) {\r\n const trigger = this.shadowRoot.getElementById('trigger');\r\n \r\n switch (e.key) {\r\n case 'Enter':\r\n case ' ':\r\n e.preventDefault();\r\n this.toggle();\r\n break;\r\n case 'Escape':\r\n if (this._open) {\r\n e.preventDefault();\r\n this.close();\r\n trigger.focus();\r\n }\r\n break;\r\n case 'ArrowDown':\r\n if (!this._open) {\r\n e.preventDefault();\r\n this.toggle();\r\n }\r\n break;\r\n }\r\n }\r\n\r\n render() {\r\n const label = this.getAttribute('label') || 'Menu';\r\n const open = this.hasAttribute('open');\r\n\r\n this.shadowRoot.innerHTML = `\r\n <style>\r\n :host {\r\n display: inline-block;\r\n position: relative;\r\n font-family: 'Inter', system-ui, sans-serif;\r\n }\r\n\r\n .dropdown-trigger {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 10px 16px;\r\n background: #1e1e1e;\r\n border: 1px solid #2a2a2a;\r\n border-radius: 8px;\r\n color: #ffffff;\r\n font-size: 0.9rem;\r\n cursor: pointer;\r\n transition: all 0.2s;\r\n }\r\n\r\n .dropdown-trigger:hover {\r\n border-color: #1EB53A;\r\n }\r\n\r\n .dropdown-arrow {\r\n transition: transform 0.2s;\r\n ${open ? 'transform: rotate(180deg);' : ''}\r\n }\r\n\r\n .dropdown-menu {\r\n position: absolute;\r\n top: 100%;\r\n left: 0;\r\n min-width: 180px;\r\n margin-top: 4px;\r\n background: #121212;\r\n border: 1px solid #1e1e1e;\r\n border-radius: 8px;\r\n box-shadow: 0 10px 40px rgba(0,0,0,0.5);\r\n opacity: ${open ? 1 : 0};\r\n visibility: ${open ? 'visible' : 'hidden'};\r\n transform: translateY(${open ? 0 : '-10px'});\r\n transition: all 0.2s ease;\r\n z-index: 1000;\r\n overflow: hidden;\r\n }\r\n\r\n ::slotted(a), ::slotted(button), ::slotted(div) {\r\n display: block;\r\n padding: 12px 16px;\r\n color: #a0a0a0;\r\n text-decoration: none;\r\n border: none;\r\n background: none;\r\n width: 100%;\r\n text-align: left;\r\n font-size: 0.9rem;\r\n cursor: pointer;\r\n transition: all 0.15s;\r\n }\r\n\r\n ::slotted(a:hover), ::slotted(button:hover), ::slotted(div:hover) {\r\n background: #1e1e1e;\r\n color: #1EB53A;\r\n }\r\n\r\n ::slotted(hr) {\r\n border: none;\r\n border-top: 1px solid #1e1e1e;\r\n margin: 4px 0;\r\n }\r\n </style>\r\n\r\n <button class=\"dropdown-trigger\" id=\"trigger\" aria-expanded=\"${open}\" aria-haspopup=\"menu\">\r\n ${label}\r\n <span class=\"dropdown-arrow\" aria-hidden=\"true\">▼</span>\r\n </button>\r\n <div class=\"dropdown-menu\" role=\"menu\" ${open ? '' : 'aria-hidden=\"true\"'}>\r\n <slot></slot>\r\n </div>\r\n `;\r\n\r\n this.shadowRoot.getElementById('trigger').addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n this.toggle();\r\n });\r\n }\r\n}\r\n\r\nregisterComponent('af-dropdown', AfriDropdown);\r\nexport default AfriDropdown;\r\n",
36
+ "/**\r\n * AfriCode Select/Dropdown Component\r\n * \r\n * Custom styled select dropdown for forms.\r\n * Suitable for: Forms, Filters, Settings, Language selection\r\n * \r\n * @module components/select\r\n */\r\n\r\nimport { AfriCodeComponent, registerComponent } from './base.js';\r\n\r\nexport class AfriSelect extends AfriCodeComponent {\r\n static get observedAttributes() {\r\n return ['label', 'placeholder', 'theme', 'error', 'required', 'aria-label', 'aria-describedby'];\r\n }\r\n\r\n constructor() {\r\n super();\r\n this._uniqueId = Math.random().toString(36).substr(2, 9);\r\n this._isOpen = false;\r\n this._selectedIndex = -1;\r\n this._options = [];\r\n this.render();\r\n }\r\n\r\n get value() {\r\n return this._selectedIndex >= 0 ? this._options[this._selectedIndex]?.value : '';\r\n }\r\n\r\n connectedCallback() {\r\n this._options = Array.from(this.querySelectorAll('option')).map(opt => ({\r\n value: opt.value,\r\n label: opt.textContent\r\n }));\r\n this.render();\r\n this._setupListeners();\r\n }\r\n\r\n _setupListeners() {\r\n const trigger = this.shadowRoot.querySelector('.select-trigger');\r\n const dropdown = this.shadowRoot.querySelector('.select-dropdown');\r\n\r\n trigger?.addEventListener('click', () => {\r\n this._toggleDropdown();\r\n });\r\n\r\n trigger?.addEventListener('keydown', (e) => {\r\n this._handleKeydown(e);\r\n });\r\n\r\n this.shadowRoot.querySelectorAll('.select-option').forEach((opt, i) => {\r\n opt.addEventListener('click', () => {\r\n this._selectOption(i);\r\n });\r\n });\r\n\r\n document.addEventListener('click', (e) => {\r\n if (!this.contains(e.target) && this._isOpen) {\r\n this._closeDropdown();\r\n }\r\n });\r\n }\r\n\r\n _toggleDropdown() {\r\n this._isOpen = !this._isOpen;\r\n const trigger = this.shadowRoot.querySelector('.select-trigger');\r\n const dropdown = this.shadowRoot.querySelector('.select-dropdown');\r\n \r\n dropdown?.classList.toggle('open', this._isOpen);\r\n trigger?.classList.toggle('open', this._isOpen);\r\n \r\n if (this._isOpen) {\r\n trigger?.setAttribute('aria-expanded', 'true');\r\n dropdown?.setAttribute('aria-hidden', 'false');\r\n } else {\r\n trigger?.setAttribute('aria-expanded', 'false');\r\n dropdown?.setAttribute('aria-hidden', 'true');\r\n }\r\n }\r\n\r\n _closeDropdown() {\r\n this._isOpen = false;\r\n const trigger = this.shadowRoot.querySelector('.select-trigger');\r\n const dropdown = this.shadowRoot.querySelector('.select-dropdown');\r\n \r\n dropdown?.classList.remove('open');\r\n trigger?.classList.remove('open');\r\n trigger?.setAttribute('aria-expanded', 'false');\r\n dropdown?.setAttribute('aria-hidden', 'true');\r\n }\r\n\r\n _selectOption(index) {\r\n this._selectedIndex = index;\r\n this._closeDropdown();\r\n this.render();\r\n this._setupListeners();\r\n this.emit('af-change', { value: this.value, label: this._options[index].label });\r\n }\r\n\r\n _handleKeydown(e) {\r\n const trigger = this.shadowRoot.querySelector('.select-trigger');\r\n \r\n switch (e.key) {\r\n case 'Enter':\r\n case ' ':\r\n e.preventDefault();\r\n this._toggleDropdown();\r\n break;\r\n case 'Escape':\r\n if (this._isOpen) {\r\n e.preventDefault();\r\n this._closeDropdown();\r\n trigger.focus();\r\n }\r\n break;\r\n case 'ArrowDown':\r\n if (!this._isOpen) {\r\n e.preventDefault();\r\n this._toggleDropdown();\r\n } else {\r\n e.preventDefault();\r\n this._navigateOptions(1);\r\n }\r\n break;\r\n case 'ArrowUp':\r\n if (this._isOpen) {\r\n e.preventDefault();\r\n this._navigateOptions(-1);\r\n }\r\n break;\r\n }\r\n }\r\n\r\n _navigateOptions(direction) {\r\n const options = this.shadowRoot.querySelectorAll('.select-option');\r\n if (options.length === 0) {return;}\r\n\r\n let newIndex = this._selectedIndex + direction;\r\n if (newIndex < 0) {newIndex = options.length - 1;}\r\n if (newIndex >= options.length) {newIndex = 0;}\r\n\r\n this._selectedIndex = newIndex;\r\n this.render();\r\n this._setupListeners();\r\n \r\n // Focus the selected option\r\n const selectedOption = this.shadowRoot.querySelector('.select-option.selected');\r\n selectedOption?.scrollIntoView({ block: 'nearest' });\r\n }\r\n\r\n attributeChangedCallback() {\r\n this.render();\r\n this._setupListeners();\r\n }\r\n\r\n render() {\r\n const label = this.getAttribute('label') || '';\r\n const placeholder = this.getAttribute('placeholder') || 'Select an option';\r\n const theme = this.getAttribute('theme') || 'tanzania';\r\n const error = this.getAttribute('error') || '';\r\n const required = this.hasAttribute('required');\r\n const ariaLabel = this.getAttribute('aria-label');\r\n const ariaDescribedBy = this.getAttribute('aria-describedby');\r\n\r\n const themes = {\r\n tanzania: { focus: '#1EB53A', error: '#DC3545' },\r\n maasai: { focus: '#FF0000', error: '#8B0000' },\r\n ndebele: { focus: '#4169E1', error: '#DC143C' }\r\n };\r\n const t = themes[theme] || themes.tanzania;\r\n\r\n const describedByList = [];\r\n if (error) {describedByList.push(`error-${this._uniqueId}`);}\r\n if (ariaDescribedBy) {describedByList.push(...ariaDescribedBy.split(' '));}\r\n const combinedDescribedBy = describedByList.length > 0 ? `aria-describedby=\"${describedByList.join(' ')}\"` : '';\r\n\r\n const selectedLabel = this._selectedIndex >= 0\r\n ? this._options[this._selectedIndex]?.label\r\n : placeholder;\r\n\r\n this.shadowRoot.innerHTML = `\r\n <style>\r\n :host {\r\n display: block;\r\n font-family: 'Inter', system-ui, sans-serif;\r\n position: relative;\r\n }\r\n\r\n label {\r\n display: block;\r\n font-weight: 500;\r\n margin-bottom: 5px;\r\n color: #333;\r\n font-size: 14px;\r\n }\r\n\r\n .required-star {\r\n color: ${t.error};\r\n margin-left: 2px;\r\n }\r\n\r\n .select-container {\r\n position: relative;\r\n }\r\n\r\n .select-trigger {\r\n width: 100%;\r\n padding: 10px 40px 10px 13px;\r\n font-size: 15px;\r\n border: 2px solid ${error ? t.error : '#ddd'};\r\n border-radius: 5px;\r\n background: white;\r\n cursor: pointer;\r\n text-align: left;\r\n font-family: inherit;\r\n transition: all 200ms ease;\r\n color: ${this._selectedIndex >= 0 ? '#333' : '#888'};\r\n }\r\n\r\n .select-trigger:focus,\r\n .select-trigger.open {\r\n outline: none;\r\n border-color: ${error ? t.error : t.focus};\r\n box-shadow: 0 0 0 3px ${error ? t.error + '20' : t.focus + '20'};\r\n }\r\n\r\n .select-arrow {\r\n position: absolute;\r\n right: 13px;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n pointer-events: none;\r\n transition: transform 200ms ease;\r\n }\r\n\r\n .select-trigger.open + .select-arrow {\r\n transform: translateY(-50%) rotate(180deg);\r\n }\r\n\r\n .select-dropdown {\r\n position: absolute;\r\n top: 100%;\r\n left: 0;\r\n right: 0;\r\n background: white;\r\n border: 2px solid #ddd;\r\n border-radius: 5px;\r\n margin-top: 4px;\r\n max-height: 0;\r\n overflow: hidden;\r\n opacity: 0;\r\n transition: all 200ms ease;\r\n z-index: 1000;\r\n box-shadow: 0 4px 12px rgba(0,0,0,0.15);\r\n }\r\n\r\n .select-dropdown.open {\r\n max-height: 200px;\r\n overflow-y: auto;\r\n opacity: 1;\r\n }\r\n\r\n .select-option {\r\n padding: 10px 13px;\r\n cursor: pointer;\r\n transition: background 150ms ease;\r\n }\r\n\r\n .select-option:hover {\r\n background: ${t.focus}15;\r\n }\r\n\r\n .select-option.selected {\r\n background: ${t.focus};\r\n color: white;\r\n }\r\n\r\n .error-text {\r\n font-size: 12px;\r\n margin-top: 4px;\r\n color: ${t.error};\r\n }\r\n\r\n ::slotted(option) {\r\n display: none;\r\n }\r\n </style>\r\n\r\n ${label ? `<label for=\"select-${this._uniqueId}\">${label}${required ? '<span class=\"required-star\">*</span>' : ''}</label>` : ''}\r\n <div class=\"select-container\">\r\n <button type=\"button\" \r\n id=\"select-${this._uniqueId}\"\r\n class=\"select-trigger ${this._isOpen ? 'open' : ''}\"\r\n aria-expanded=\"${this._isOpen}\"\r\n aria-haspopup=\"listbox\"\r\n ${ariaLabel ? `aria-label=\"${ariaLabel}\"` : ''}\r\n ${error ? 'aria-invalid=\"true\"' : ''}\r\n ${combinedDescribedBy}>\r\n ${selectedLabel}\r\n </button>\r\n <span class=\"select-arrow\" aria-hidden=\"true\">▼</span>\r\n <div class=\"select-dropdown ${this._isOpen ? 'open' : ''}\" \r\n role=\"listbox\"\r\n aria-hidden=\"${!this._isOpen}\">\r\n ${this._options.map((opt, i) => `\r\n <div class=\"select-option ${i === this._selectedIndex ? 'selected' : ''}\" \r\n data-index=\"${i}\"\r\n role=\"option\"\r\n aria-selected=\"${i === this._selectedIndex}\">\r\n ${opt.label}\r\n </div>\r\n `).join('')}\r\n </div>\r\n </div>\r\n ${error ? `<div id=\"error-${this._uniqueId}\" class=\"error-text\" role=\"alert\">${error}</div>` : ''}\r\n <slot></slot>\r\n `;\r\n }\r\n}\r\n\r\nregisterComponent('af-select', AfriSelect);\r\nexport default AfriSelect;\r\n",
37
+ "import { AfriCodeComponent, registerComponent } from './base.js';\r\nimport { Validation, schemas } from '../core/validation.js';\r\n\r\n/**\r\n * Smart Form Component\r\n * Handles submission, loading state, and validation.\r\n * \r\n * Usage:\r\n * <af-form action=\"/api/login\" method=\"POST\">\r\n * <af-input name=\"email\"></af-input>\r\n * </af-form>\r\n */\r\nexport class AfriForm extends AfriCodeComponent {\r\n static get observedAttributes() { return ['action', 'method', 'error', 'success', 'schema']; }\r\n\r\n constructor() {\r\n super();\r\n this.handleSubmit = this.handleSubmit.bind(this);\r\n }\r\n\r\n connectedCallback() {\r\n this.render();\r\n this.shadowRoot.querySelector('form').addEventListener('submit', this.handleSubmit);\r\n this.loadStyles();\r\n }\r\n\r\n async handleSubmit(e) {\r\n e.preventDefault();\r\n const form = e.target;\r\n const submitBtn = this.querySelector('[type=\"submit\"]') || this.shadowRoot.querySelector('button[type=\"submit\"]');\r\n\r\n // Get validation schema\r\n const schemaName = this.getAttribute('schema');\r\n const schema = schemaName ? this._getSchema(schemaName) : null;\r\n\r\n // derived from attributes\r\n const action = this.getAttribute('action');\r\n const method = this.getAttribute('method') || 'GET';\r\n\r\n // Collect form data from native controls\r\n const formData = new FormData(form);\r\n const data = Object.fromEntries(formData.entries());\r\n\r\n // Include custom af-input values that live in shadow DOM\r\n Array.from(this.querySelectorAll('af-input')).forEach((customInput) => {\r\n const name = customInput.getAttribute('name');\r\n if (name) {\r\n data[name] = customInput.value;\r\n }\r\n });\r\n\r\n // Validate if schema provided\r\n if (schema) {\r\n const validationResult = Validation.validate(schema, data);\r\n if (!validationResult.success) {\r\n this._showValidationErrors(validationResult.errors);\r\n this.emit('af-validation-error', { errors: validationResult.errors });\r\n return;\r\n }\r\n }\r\n\r\n if (!action) {return;}\r\n\r\n // Loading State\r\n if (submitBtn) {\r\n var originalText = submitBtn.textContent;\r\n submitBtn.textContent = 'Wait...';\r\n submitBtn.disabled = true;\r\n }\r\n\r\n try {\r\n const response = await fetch(action, {\r\n method: method,\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify(data)\r\n });\r\n\r\n if (response.ok) {\r\n this.emit('success', await response.json());\r\n this.setAttribute('success', 'Form submitted successfully!');\r\n this.removeAttribute('error');\r\n } else {\r\n const errorData = await response.text();\r\n this.emit('error', errorData);\r\n this.setAttribute('error', errorData);\r\n this.removeAttribute('success');\r\n }\r\n } catch (err) {\r\n this.emit('error', err.message);\r\n this.setAttribute('error', err.message);\r\n this.removeAttribute('success');\r\n } finally {\r\n if (submitBtn) {\r\n submitBtn.textContent = originalText;\r\n submitBtn.disabled = false;\r\n }\r\n }\r\n }\r\n\r\n _getSchema(schemaName) {\r\n return schemas[schemaName] || null;\r\n }\r\n\r\n _showValidationErrors(errors) {\r\n // Clear previous errors\r\n this.shadowRoot.querySelectorAll('.field-error').forEach(el => el.remove());\r\n\r\n // Show errors on corresponding inputs\r\n Object.entries(errors).forEach(([fieldName, errorMessage]) => {\r\n const input = this.querySelector(`[name=\"${fieldName}\"]`);\r\n if (input) {\r\n // For custom af-input components\r\n if (input.tagName === 'AF-INPUT') {\r\n input.setAttribute('error', errorMessage);\r\n } else {\r\n // For regular inputs, add error display\r\n const errorDiv = document.createElement('div');\r\n errorDiv.className = 'field-error';\r\n errorDiv.textContent = errorMessage;\r\n errorDiv.style.color = 'red';\r\n errorDiv.style.fontSize = '12px';\r\n errorDiv.style.marginTop = '4px';\r\n input.parentNode.insertBefore(errorDiv, input.nextSibling);\r\n }\r\n }\r\n });\r\n }\r\n}\r\n\r\nregisterComponent('af-form', AfriForm);\r\nexport default AfriForm;\r\n",
38
+ "/**\r\n * AfriCode Tooltip Component\r\n * \r\n * Hover tooltips with positioning options.\r\n * \r\n * @module components/tooltip\r\n */\r\n\r\nimport { AfriCodeComponent, registerComponent } from './base.js';\r\n\r\nexport class AfriTooltip extends AfriCodeComponent {\r\n static get observedAttributes() {\r\n return ['text', 'position'];\r\n }\r\n\r\n constructor() {\r\n super();\r\n this._tooltipId = `af-tooltip-${Math.random().toString(36).substr(2, 9)}`;\r\n this.render();\r\n }\r\n\r\n connectedCallback() {\r\n this._setupTooltipListeners();\r\n }\r\n\r\n attributeChangedCallback() {\r\n this.render();\r\n this._setupTooltipListeners();\r\n }\r\n\r\n _setupTooltipListeners() {\r\n const trigger = this.shadowRoot.querySelector('.tooltip-trigger');\r\n const content = this.shadowRoot.querySelector('.tooltip-content');\r\n\r\n if (!trigger || !content) {return;}\r\n\r\n trigger.addEventListener('focus', () => {\r\n content.style.opacity = '1';\r\n content.style.visibility = 'visible';\r\n content.setAttribute('aria-hidden', 'false');\r\n });\r\n\r\n trigger.addEventListener('blur', () => {\r\n content.style.opacity = '0';\r\n content.style.visibility = 'hidden';\r\n content.setAttribute('aria-hidden', 'true');\r\n });\r\n\r\n trigger.addEventListener('mouseenter', () => {\r\n content.style.opacity = '1';\r\n content.style.visibility = 'visible';\r\n content.setAttribute('aria-hidden', 'false');\r\n });\r\n\r\n trigger.addEventListener('mouseleave', () => {\r\n content.style.opacity = '0';\r\n content.style.visibility = 'hidden';\r\n content.setAttribute('aria-hidden', 'true');\r\n });\r\n }\r\n\r\n render() {\r\n const text = this.getAttribute('text') || 'Tooltip';\r\n const position = this.getAttribute('position') || 'top';\r\n\r\n const positions = {\r\n top: `\r\n bottom: 100%;\r\n left: 50%;\r\n transform: translateX(-50%) translateY(-8px);\r\n `,\r\n bottom: `\r\n top: 100%;\r\n left: 50%;\r\n transform: translateX(-50%) translateY(8px);\r\n `,\r\n left: `\r\n right: 100%;\r\n top: 50%;\r\n transform: translateY(-50%) translateX(-8px);\r\n `,\r\n right: `\r\n left: 100%;\r\n top: 50%;\r\n transform: translateY(-50%) translateX(8px);\r\n `\r\n };\r\n\r\n this.shadowRoot.innerHTML = `\r\n <style>\r\n :host {\r\n display: inline-block;\r\n position: relative;\r\n font-family: 'Inter', system-ui, sans-serif;\r\n }\r\n\r\n .tooltip-trigger {\r\n display: inline-block;\r\n cursor: help;\r\n }\r\n\r\n .tooltip-content {\r\n position: absolute;\r\n ${positions[position]}\r\n padding: 8px 12px;\r\n background: #1e1e1e;\r\n border: 1px solid #2a2a2a;\r\n border-radius: 6px;\r\n color: #ffffff;\r\n font-size: 0.85rem;\r\n white-space: nowrap;\r\n opacity: 0;\r\n visibility: hidden;\r\n transition: all 0.2s ease;\r\n z-index: 1000;\r\n box-shadow: 0 4px 20px rgba(0,0,0,0.4);\r\n }\r\n\r\n .tooltip-trigger:hover + .tooltip-content,\r\n .tooltip-trigger:focus + .tooltip-content,\r\n .tooltip-content:hover {\r\n opacity: 1;\r\n visibility: visible;\r\n }\r\n\r\n /* Arrow */\r\n .tooltip-content::after {\r\n content: '';\r\n position: absolute;\r\n border: 6px solid transparent;\r\n ${position === 'top' ? `\r\n top: 100%;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n border-top-color: #1e1e1e;\r\n ` : ''}\r\n ${position === 'bottom' ? `\r\n bottom: 100%;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n border-bottom-color: #1e1e1e;\r\n ` : ''}\r\n ${position === 'left' ? `\r\n left: 100%;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n border-left-color: #1e1e1e;\r\n ` : ''}\r\n ${position === 'right' ? `\r\n right: 100%;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n border-right-color: #1e1e1e;\r\n ` : ''}\r\n }\r\n </style>\r\n\r\n <span class=\"tooltip-trigger\" tabindex=\"0\" aria-describedby=\"${this._tooltipId}\">\r\n <slot></slot>\r\n </span>\r\n <div class=\"tooltip-content\" id=\"${this._tooltipId}\" role=\"tooltip\" aria-hidden=\"true\">${text}</div>\r\n `;\r\n }\r\n}\r\n\r\nregisterComponent('af-tooltip', AfriTooltip);\r\nexport default AfriTooltip;\r\n",
39
+ "/**\r\n * AfriCode Toast Component\r\n * \r\n * Notification toasts with customizable types and auto-dismiss.\r\n * \r\n * @module components/toast\r\n */\r\n\r\nimport { AfriCodeComponent, registerComponent } from './base.js';\r\n\r\nexport class AfriToast extends AfriCodeComponent {\r\n static get observedAttributes() {\r\n return ['type', 'message', 'duration'];\r\n }\r\n\r\n constructor() {\r\n super();\r\n this.render();\r\n }\r\n\r\n show(message, type = 'info', duration = 4000) {\r\n this.setAttribute('message', message);\r\n this.setAttribute('type', type);\r\n this.render();\r\n\r\n const toast = this.shadowRoot.querySelector('.toast');\r\n toast.classList.add('show');\r\n\r\n if (duration > 0) {\r\n setTimeout(() => this.hide(), duration);\r\n }\r\n }\r\n\r\n hide() {\r\n const toast = this.shadowRoot.querySelector('.toast');\r\n toast.classList.remove('show');\r\n setTimeout(() => this.emit('af-toast-close'), 300);\r\n }\r\n\r\n render() {\r\n const type = this.getAttribute('type') || 'info';\r\n const message = this.getAttribute('message') || '';\r\n\r\n const icons = {\r\n success: '✓',\r\n error: '✗',\r\n warning: '⚠',\r\n info: 'ℹ'\r\n };\r\n\r\n const colors = {\r\n success: '#1EB53A',\r\n error: '#EF3340',\r\n warning: '#FCD116',\r\n info: '#00A3DD'\r\n };\r\n\r\n this.shadowRoot.innerHTML = `\r\n <style>\r\n :host {\r\n position: fixed;\r\n bottom: 20px;\r\n right: 20px;\r\n z-index: 9999;\r\n font-family: 'Inter', system-ui, sans-serif;\r\n }\r\n\r\n .toast {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n padding: 16px 20px;\r\n background: #121212;\r\n border: 1px solid #1e1e1e;\r\n border-left: 4px solid ${colors[type]};\r\n border-radius: 8px;\r\n box-shadow: 0 10px 40px rgba(0,0,0,0.5);\r\n transform: translateX(120%);\r\n opacity: 0;\r\n transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);\r\n }\r\n\r\n .toast.show {\r\n transform: translateX(0);\r\n opacity: 1;\r\n }\r\n\r\n .toast-icon {\r\n width: 28px;\r\n height: 28px;\r\n border-radius: 50%;\r\n background: ${colors[type]}20;\r\n color: ${colors[type]};\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-size: 14px;\r\n font-weight: bold;\r\n }\r\n\r\n .toast-content {\r\n flex: 1;\r\n }\r\n\r\n .toast-message {\r\n color: #ffffff;\r\n font-size: 0.95rem;\r\n }\r\n\r\n .toast-close {\r\n background: none;\r\n border: none;\r\n color: #606060;\r\n cursor: pointer;\r\n padding: 4px;\r\n font-size: 18px;\r\n line-height: 1;\r\n }\r\n\r\n .toast-close:hover {\r\n color: #ffffff;\r\n }\r\n </style>\r\n\r\n <div class=\"toast\">\r\n <span class=\"toast-icon\">${icons[type]}</span>\r\n <div class=\"toast-content\">\r\n <div class=\"toast-message\">${message}</div>\r\n </div>\r\n <button class=\"toast-close\" id=\"close\">×</button>\r\n </div>\r\n `;\r\n\r\n this.shadowRoot.getElementById('close')?.addEventListener('click', () => this.hide());\r\n }\r\n}\r\n\r\nregisterComponent('af-toast', AfriToast);\r\nexport default AfriToast;\r\n",
40
+ "/**\r\n * AfriCode Badge/Tag Component\r\n * \r\n * Status indicators, labels, and tags.\r\n * Suitable for: E-commerce (product tags), Healthcare (status), Finance (categories)\r\n * \r\n * @module components/badge\r\n */\r\n\r\nimport { AfriCodeComponent, registerComponent } from './base.js';\r\n\r\nexport class AfriBadge extends AfriCodeComponent {\r\n static get observedAttributes() {\r\n return ['variant', 'size', 'removable'];\r\n }\r\n\r\n constructor() {\r\n super();\r\n this.render();\r\n }\r\n\r\n connectedCallback() {\r\n this.shadowRoot.querySelector('.remove-btn')?.addEventListener('click', () => {\r\n this.emit('af-remove');\r\n this.remove();\r\n });\r\n }\r\n\r\n attributeChangedCallback() {\r\n this.render();\r\n }\r\n\r\n render() {\r\n const variant = this.getAttribute('variant') || 'default';\r\n const size = this.getAttribute('size') || 'md';\r\n const removable = this.hasAttribute('removable');\r\n\r\n const variants = {\r\n default: { bg: '#e9ecef', text: '#495057' },\r\n success: { bg: '#d4edda', text: '#155724' },\r\n warning: { bg: '#fff3cd', text: '#856404' },\r\n error: { bg: '#f8d7da', text: '#721c24' },\r\n info: { bg: '#d1ecf1', text: '#0c5460' },\r\n tanzania: { bg: '#1EB53A', text: '#FFFFFF' },\r\n maasai: { bg: '#FF0000', text: '#FFFFFF' },\r\n ndebele: { bg: '#4169E1', text: '#FFFFFF' },\r\n gold: { bg: '#FCD116', text: '#000000' }\r\n };\r\n const v = variants[variant] || variants.default;\r\n\r\n const sizes = {\r\n sm: { padding: '2px 6px', fontSize: '11px' },\r\n md: { padding: '4px 10px', fontSize: '13px' },\r\n lg: { padding: '6px 14px', fontSize: '15px' }\r\n };\r\n const s = sizes[size] || sizes.md;\r\n\r\n this.shadowRoot.innerHTML = `\r\n <style>\r\n :host {\r\n display: inline-block;\r\n font-family: 'Inter', system-ui, sans-serif;\r\n }\r\n\r\n .badge {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 5px;\r\n padding: ${s.padding};\r\n font-size: ${s.fontSize};\r\n font-weight: 600;\r\n background: ${v.bg};\r\n color: ${v.text};\r\n border-radius: 100px;\r\n white-space: nowrap;\r\n }\r\n\r\n .remove-btn {\r\n background: none;\r\n border: none;\r\n cursor: pointer;\r\n padding: 0;\r\n font-size: 14px;\r\n line-height: 1;\r\n color: inherit;\r\n opacity: 0.7;\r\n margin-left: 2px;\r\n }\r\n\r\n .remove-btn:hover {\r\n opacity: 1;\r\n }\r\n </style>\r\n\r\n <span class=\"badge\">\r\n <slot></slot>\r\n ${removable ? '<button class=\"remove-btn\" aria-label=\"Remove\">×</button>' : ''}\r\n </span>\r\n `;\r\n }\r\n}\r\n\r\nregisterComponent('af-badge', AfriBadge);\r\nexport default AfriBadge;\r\n",
41
+ "/**\r\n * AfriCode Avatar Component\r\n * \r\n * User profile images and initials with status indicators.\r\n * Suitable for: User profiles, Comments, Team members, Chat\r\n * \r\n * @module components/avatar\r\n */\r\n\r\nimport { AfriCodeComponent, registerComponent } from './base.js';\r\n\r\nexport class AfriAvatar extends AfriCodeComponent {\r\n static get observedAttributes() {\r\n return ['src', 'name', 'size', 'status', 'theme'];\r\n }\r\n\r\n constructor() {\r\n super();\r\n this.render();\r\n }\r\n\r\n attributeChangedCallback() {\r\n this.render();\r\n }\r\n\r\n _getInitials(name) {\r\n if (!name) {return '?';}\r\n const parts = name.trim().split(' ');\r\n if (parts.length >= 2) {\r\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\r\n }\r\n return name.substring(0, 2).toUpperCase();\r\n }\r\n\r\n render() {\r\n const src = this.getAttribute('src');\r\n const name = this.getAttribute('name') || '';\r\n const size = this.getAttribute('size') || 'md';\r\n const status = this.getAttribute('status');\r\n const theme = this.getAttribute('theme') || 'tanzania';\r\n\r\n const themes = {\r\n tanzania: '#1EB53A',\r\n maasai: '#FF0000',\r\n ndebele: '#4169E1',\r\n gold: '#FCD116'\r\n };\r\n const bgColor = themes[theme] || themes.tanzania;\r\n\r\n const sizes = {\r\n sm: { size: '32px', font: '12px', status: '8px' },\r\n md: { size: '44px', font: '16px', status: '10px' },\r\n lg: { size: '64px', font: '22px', status: '14px' },\r\n xl: { size: '96px', font: '32px', status: '18px' }\r\n };\r\n const s = sizes[size] || sizes.md;\r\n\r\n const statusColors = {\r\n online: '#28a745',\r\n offline: '#6c757d',\r\n busy: '#dc3545',\r\n away: '#ffc107'\r\n };\r\n\r\n this.shadowRoot.innerHTML = `\r\n <style>\r\n :host {\r\n display: inline-block;\r\n font-family: 'Inter', system-ui, sans-serif;\r\n }\r\n\r\n .avatar {\r\n position: relative;\r\n width: ${s.size};\r\n height: ${s.size};\r\n border-radius: 50%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n background: ${bgColor};\r\n color: white;\r\n font-weight: 600;\r\n font-size: ${s.font};\r\n overflow: hidden;\r\n }\r\n\r\n .avatar img {\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n }\r\n\r\n .status {\r\n position: absolute;\r\n bottom: 0;\r\n right: 0;\r\n width: ${s.status};\r\n height: ${s.status};\r\n border-radius: 50%;\r\n border: 2px solid white;\r\n background: ${status ? statusColors[status] || statusColors.offline : 'transparent'};\r\n }\r\n </style>\r\n\r\n <div class=\"avatar\" title=\"${name}\">\r\n ${src\r\n ? `<img src=\"${src}\" alt=\"${name}\" />`\r\n : this._getInitials(name)\r\n }\r\n ${status ? '<span class=\"status\"></span>' : ''}\r\n </div>\r\n `;\r\n }\r\n}\r\n\r\nregisterComponent('af-avatar', AfriAvatar);\r\nexport default AfriAvatar;\r\n",
42
+ "/**\r\n * AfriCode Progress Bar Component\r\n * \r\n * Progress indicators for loading, completion, and metrics.\r\n * Suitable for: File uploads, Course progress, Health goals, Downloads\r\n * \r\n * @module components/progress\r\n */\r\n\r\nimport { AfriCodeComponent, registerComponent } from './base.js';\r\n\r\nexport class AfriProgress extends AfriCodeComponent {\r\n static get observedAttributes() {\r\n return ['value', 'max', 'theme', 'size', 'label', 'animated'];\r\n }\r\n\r\n constructor() {\r\n super();\r\n this.render();\r\n }\r\n\r\n attributeChangedCallback() {\r\n this.render();\r\n }\r\n\r\n render() {\r\n const value = parseFloat(this.getAttribute('value')) || 0;\r\n const max = parseFloat(this.getAttribute('max')) || 100;\r\n const theme = this.getAttribute('theme') || 'tanzania';\r\n const size = this.getAttribute('size') || 'md';\r\n const label = this.getAttribute('label');\r\n const animated = this.hasAttribute('animated');\r\n\r\n const percentage = Math.min(100, Math.max(0, (value / max) * 100));\r\n\r\n const themes = {\r\n tanzania: { bar: '#1EB53A', track: '#e9ecef' },\r\n maasai: { bar: '#FF0000', track: '#e9ecef' },\r\n ndebele: { bar: '#4169E1', track: '#e9ecef' },\r\n gold: { bar: '#FCD116', track: '#e9ecef' },\r\n gradient: { bar: 'linear-gradient(90deg, #1EB53A 0%, #FCD116 50%, #00A3DD 100%)', track: '#e9ecef' }\r\n };\r\n const t = themes[theme] || themes.tanzania;\r\n\r\n const sizes = {\r\n sm: '6px',\r\n md: '10px',\r\n lg: '16px'\r\n };\r\n const height = sizes[size] || sizes.md;\r\n\r\n this.shadowRoot.innerHTML = `\r\n <style>\r\n :host {\r\n display: block;\r\n font-family: 'Inter', system-ui, sans-serif;\r\n }\r\n\r\n .progress-container {\r\n width: 100%;\r\n }\r\n\r\n .progress-header {\r\n display: flex;\r\n justify-content: space-between;\r\n margin-bottom: 5px;\r\n font-size: 13px;\r\n }\r\n\r\n .progress-label {\r\n color: #333;\r\n font-weight: 500;\r\n }\r\n\r\n .progress-value {\r\n color: #666;\r\n }\r\n\r\n .progress-track {\r\n width: 100%;\r\n height: ${height};\r\n background: ${t.track};\r\n border-radius: 100px;\r\n overflow: hidden;\r\n }\r\n\r\n .progress-bar {\r\n height: 100%;\r\n width: ${percentage}%;\r\n background: ${t.bar};\r\n border-radius: 100px;\r\n transition: width 500ms ease-out;\r\n ${animated ? `\r\n background-size: 30px 30px;\r\n background-image: linear-gradient(\r\n 135deg,\r\n rgba(255,255,255,0.2) 25%,\r\n transparent 25%,\r\n transparent 50%,\r\n rgba(255,255,255,0.2) 50%,\r\n rgba(255,255,255,0.2) 75%,\r\n transparent 75%,\r\n transparent\r\n );\r\n animation: stripes 1s linear infinite;\r\n ` : ''}\r\n }\r\n\r\n @keyframes stripes {\r\n 0% { background-position: 0 0; }\r\n 100% { background-position: 30px 0; }\r\n }\r\n </style>\r\n\r\n <div class=\"progress-container\">\r\n ${label || true ? `\r\n <div class=\"progress-header\">\r\n <span class=\"progress-label\">${label || ''}</span>\r\n <span class=\"progress-value\">${percentage.toFixed(0)}%</span>\r\n </div>\r\n ` : ''}\r\n <div class=\"progress-track\">\r\n <div class=\"progress-bar\" role=\"progressbar\" \r\n aria-valuenow=\"${value}\" \r\n aria-valuemin=\"0\" \r\n aria-valuemax=\"${max}\"></div>\r\n </div>\r\n </div>\r\n `;\r\n }\r\n}\r\n\r\nregisterComponent('af-progress', AfriProgress);\r\nexport default AfriProgress;\r\n",
43
+ "/**\r\n * AfriCode Loading Spinner Component\r\n * \r\n * Cultural loading indicators using spinning Adinkra symbols or geometric rotation.\r\n * \r\n * @module components/loader\r\n */\r\n\r\nimport { AfriCodeComponent, registerComponent } from './base.js';\r\n\r\nexport class AfriLoader extends AfriCodeComponent {\r\n static get observedAttributes() {\r\n return ['size', 'color', 'type'];\r\n }\r\n\r\n constructor() {\r\n super();\r\n this.render();\r\n }\r\n\r\n attributeChangedCallback() {\r\n this.render();\r\n }\r\n\r\n render() {\r\n const size = this.getAttribute('size') || '40';\r\n const color = this.getAttribute('color') || 'currentColor';\r\n const type = this.getAttribute('type') || 'spiral';\r\n\r\n const paths = {\r\n // African spiral (growth/life)\r\n spiral: `M25,25 m0,-20 a20,20 0 1,1 0,40 a20,20 0 1,1 0,-40 \r\n M25,25 m0,-15 a15,15 0 1,0 0,30 a15,15 0 1,0 0,-30`,\r\n // Geometric sun/star\r\n sun: `M25,5 L25,45 M5,25 L45,25 M11,11 L39,39 M39,11 L11,39`,\r\n // Diamond rotation\r\n diamond: `M25,5 L45,25 L25,45 L5,25 Z`\r\n };\r\n\r\n this.shadowRoot.innerHTML = `\r\n <style>\r\n :host {\r\n display: inline-block;\r\n color: ${color};\r\n }\r\n .loader {\r\n width: ${size}px;\r\n height: ${size}px;\r\n animation: spin 1.5s linear infinite;\r\n }\r\n svg {\r\n width: 100%;\r\n height: 100%;\r\n }\r\n @keyframes spin {\r\n 100% { transform: rotate(360deg); }\r\n }\r\n circle {\r\n opacity: 0.25;\r\n }\r\n path, line, rect {\r\n opacity: 0.75;\r\n }\r\n </style>\r\n <div class=\"loader\">\r\n <svg viewBox=\"0 0 50 50\">\r\n ${type === 'spiral'\r\n ? `<path d=\"${paths.spiral}\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\" stroke-linecap=\"round\" />`\r\n : type === 'sun'\r\n ? `<path d=\"${paths.sun}\" stroke=\"currentColor\" stroke-width=\"4\" stroke-linecap=\"round\" />`\r\n : `<path d=\"${paths.diamond}\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\" />`\r\n }\r\n </svg>\r\n </div>\r\n `;\r\n }\r\n}\r\n\r\nregisterComponent('af-loader', AfriLoader);\r\nexport default AfriLoader;\r\n",
44
+ "/**\r\n * AfriCode Skeleton Component\r\n * \r\n * Loading placeholder with shimmer animation.\r\n * \r\n * @module components/skeleton\r\n */\r\n\r\nimport { AfriCodeComponent, registerComponent } from './base.js';\r\n\r\nexport class AfriSkeleton extends AfriCodeComponent {\r\n static get observedAttributes() {\r\n return ['variant', 'width', 'height', 'lines'];\r\n }\r\n\r\n constructor() {\r\n super();\r\n this.render();\r\n }\r\n\r\n attributeChangedCallback() {\r\n this.render();\r\n }\r\n\r\n render() {\r\n const variant = this.getAttribute('variant') || 'text';\r\n const width = this.getAttribute('width') || '100%';\r\n const height = this.getAttribute('height') || 'auto';\r\n const lines = parseInt(this.getAttribute('lines')) || 1;\r\n\r\n const variants = {\r\n text: { height: '16px', borderRadius: '4px' },\r\n title: { height: '28px', borderRadius: '4px' },\r\n avatar: { width: '48px', height: '48px', borderRadius: '50%' },\r\n card: { height: '200px', borderRadius: '12px' },\r\n button: { height: '40px', borderRadius: '6px', width: '120px' }\r\n };\r\n\r\n const v = variants[variant] || variants.text;\r\n\r\n this.shadowRoot.innerHTML = `\r\n <style>\r\n :host {\r\n display: block;\r\n }\r\n\r\n .skeleton {\r\n background: linear-gradient(\r\n 90deg,\r\n #1e1e1e 0%,\r\n #2a2a2a 50%,\r\n #1e1e1e 100%\r\n );\r\n background-size: 200% 100%;\r\n animation: shimmer 1.5s infinite;\r\n border-radius: ${v.borderRadius};\r\n }\r\n\r\n @keyframes shimmer {\r\n 0% { background-position: 200% 0; }\r\n 100% { background-position: -200% 0; }\r\n }\r\n\r\n .skeleton-line {\r\n width: ${variant === 'text' ? width : v.width || width};\r\n height: ${v.height};\r\n margin-bottom: 8px;\r\n }\r\n\r\n .skeleton-line:last-child {\r\n margin-bottom: 0;\r\n width: ${variant === 'text' ? '70%' : '100%'};\r\n }\r\n </style>\r\n\r\n ${variant === 'text' || variant === 'title'\r\n ? Array(lines).fill(0).map(() => `<div class=\"skeleton skeleton-line\"></div>`).join('')\r\n : `<div class=\"skeleton\" style=\"width: ${v.width || width}; height: ${v.height || height};\"></div>`\r\n }\r\n `;\r\n }\r\n}\r\n\r\nregisterComponent('af-skeleton', AfriSkeleton);\r\nexport default AfriSkeleton;\r\n",
45
+ "/**\r\n * AfriCode Section Divider Component\r\n * \r\n * Patterned SVG dividers for separating content sections using African motifs.\r\n * Supports patterns: zigzag, waves, diamonds, triangles.\r\n * \r\n * @module components/divider\r\n */\r\n\r\nimport { AfriCodeComponent, registerComponent } from './base.js';\r\n\r\nexport class AfriDivider extends AfriCodeComponent {\r\n static get observedAttributes() {\r\n return ['pattern', 'height', 'color', 'flip'];\r\n }\r\n\r\n constructor() {\r\n super();\r\n this.render();\r\n }\r\n\r\n attributeChangedCallback() {\r\n this.render();\r\n }\r\n\r\n _getPatternPath(pattern, width, height) {\r\n const p = pattern || 'zigzag';\r\n\r\n switch (p) {\r\n case 'zigzag':\r\n // Continuous zigzag\r\n return `M0,${height} L${width / 4},0 L${width / 2},${height} L${width * 0.75},0 L${width},${height} V${height + 10} H0 Z`;\r\n case 'waves':\r\n // Smooth sine wave\r\n return `M0,${height / 2} Q${width / 4},0 ${width / 2},${height / 2} T${width},${height / 2} V${height} H0 Z`;\r\n case 'triangles':\r\n // Repeating triangles\r\n return `M0,${height} L${width / 8},0 L${width / 4},${height} L${width * 0.375},0 L${width / 2},${height} \r\n L${width * 0.625},0 L${width * 0.75},${height} L${width * 0.875},0 L${width},${height} V${height + 10} H0 Z`;\r\n case 'diamonds':\r\n // Row of diamonds on bottom\r\n return `M0,0 H${width} V${height / 2} \r\n L${width * 0.9},${height} L${width * 0.8},${height / 2} \r\n L${width * 0.7},${height} L${width * 0.6},${height / 2} \r\n L${width * 0.5},${height} L${width * 0.4},${height / 2} \r\n L${width * 0.3},${height} L${width * 0.2},${height / 2} \r\n L${width * 0.1},${height} L0,${height / 2} Z`;\r\n default:\r\n return `M0,0 H${width} V${height} H0 Z`; // Rectangle fallback\r\n }\r\n }\r\n\r\n render() {\r\n const pattern = this.getAttribute('pattern') || 'zigzag';\r\n const height = this.getAttribute('height') || '50';\r\n const color = this.getAttribute('color') || 'currentColor';\r\n const flip = this.hasAttribute('flip');\r\n\r\n this.shadowRoot.innerHTML = `\r\n <style>\r\n :host {\r\n display: block;\r\n line-height: 0;\r\n width: 100%;\r\n overflow: hidden;\r\n color: ${color};\r\n }\r\n svg {\r\n display: block;\r\n width: 100%;\r\n height: ${height}px;\r\n ${flip ? 'transform: rotate(180deg);' : ''}\r\n }\r\n </style>\r\n <svg viewBox=\"0 0 100 ${height}\" preserveAspectRatio=\"none\">\r\n <path d=\"${this._getPatternPath(pattern, 100, parseInt(height))}\" fill=\"currentColor\" />\r\n </svg>\r\n `;\r\n }\r\n}\r\n\r\nregisterComponent('af-divider', AfriDivider);\r\nexport default AfriDivider;\r\n",
46
+ "/**\r\n * AfriCode Kanga Card Component\r\n * \r\n * A card component inspired by the traditional East African Kanga textile.\r\n * Structure follows the authentic Kanga layout:\r\n * - pindo: decorative border frame\r\n * - mji: central content area\r\n * - jina: Swahili proverb inscription slot\r\n * \r\n * @module components/kanga-card\r\n */\r\n\r\nimport { AfriCodeComponent, registerComponent } from './base.js';\r\nimport patterns from '../core/patterns.js';\r\n\r\nexport class KangaCard extends AfriCodeComponent {\r\n static get observedAttributes() {\r\n return ['theme', 'proverb', 'proverb-translation'];\r\n }\r\n\r\n constructor() {\r\n super();\r\n this.render();\r\n }\r\n\r\n connectedCallback() {\r\n this.loadStyles();\r\n this.applyTheme();\r\n }\r\n\r\n attributeChangedCallback(name, oldValue, newValue) {\r\n if (oldValue !== newValue) {\r\n if (name === 'theme') {\r\n this.applyTheme();\r\n } else {\r\n this.render();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get theme colors based on attribute\r\n */\r\n getThemeColors() {\r\n const theme = this.getAttribute('theme') || 'tanzania';\r\n\r\n const themes = {\r\n tanzania: {\r\n primary: '#1EB53A',\r\n accent: '#FCD116',\r\n border: '#00A3DD',\r\n text: '#000000'\r\n },\r\n maasai: {\r\n primary: '#8B0000',\r\n accent: '#FF0000',\r\n border: '#000000',\r\n text: '#FFFFFF'\r\n },\r\n ndebele: {\r\n primary: '#4169E1',\r\n accent: '#FFD700',\r\n border: '#FF69B4',\r\n text: '#000000'\r\n }\r\n };\r\n\r\n return themes[theme] || themes.tanzania;\r\n }\r\n\r\n /**\r\n * Apply theme-specific patterns and colors\r\n */\r\n applyTheme() {\r\n const colors = this.getThemeColors();\r\n const pindo = this.shadowRoot.querySelector('.pindo');\r\n\r\n if (pindo) {\r\n const pattern = generateKangaBorder({\r\n primaryColor: colors.primary,\r\n accentColor: colors.accent\r\n });\r\n pindo.style.backgroundImage = `url(\"${pattern}\")`;\r\n pindo.style.backgroundRepeat = 'repeat';\r\n }\r\n }\r\n\r\n render() {\r\n const proverb = this.getAttribute('proverb') || '';\r\n const translation = this.getAttribute('proverb-translation') || '';\r\n const colors = this.getThemeColors();\r\n\r\n this.shadowRoot.innerHTML = `\r\n <style>\r\n :host {\r\n display: block;\r\n font-family: 'Inter', system-ui, sans-serif;\r\n }\r\n\r\n .kanga-card {\r\n border-radius: var(--radius-lg, 8px);\r\n overflow: hidden;\r\n box-shadow: var(--shadow-lg, 0 5px 21px rgba(0, 0, 0, 0.2));\r\n transition: transform var(--transition-base, 250ms ease-out),\r\n box-shadow var(--transition-base, 250ms ease-out);\r\n }\r\n\r\n .kanga-card:hover {\r\n transform: translateY(-3px);\r\n box-shadow: 0 8px 34px rgba(0, 0, 0, 0.25);\r\n }\r\n\r\n /* Pindo - Decorative Border */\r\n .pindo {\r\n padding: var(--space-13, 13px);\r\n background-color: ${colors.primary};\r\n }\r\n\r\n /* Mji - Central Content Area */\r\n .mji {\r\n background: linear-gradient(135deg, #FFFFFF 0%, #F5F5F5 100%);\r\n padding: var(--space-21, 21px);\r\n min-height: 120px;\r\n }\r\n\r\n /* Jina - Proverb Inscription */\r\n .jina {\r\n background-color: ${colors.border};\r\n color: ${colors.text};\r\n padding: var(--space-8, 8px) var(--space-13, 13px);\r\n text-align: center;\r\n font-style: italic;\r\n }\r\n\r\n .jina .swahili {\r\n font-weight: 600;\r\n font-size: 1rem;\r\n margin-bottom: var(--space-3, 3px);\r\n }\r\n\r\n .jina .translation {\r\n font-size: 0.85rem;\r\n opacity: 0.9;\r\n }\r\n\r\n .jina:empty {\r\n display: none;\r\n }\r\n\r\n /* Content slot styles */\r\n ::slotted(*) {\r\n margin: 0;\r\n }\r\n\r\n ::slotted(h1), ::slotted(h2), ::slotted(h3) {\r\n color: ${colors.primary};\r\n margin-bottom: var(--space-8, 8px);\r\n }\r\n </style>\r\n\r\n <article class=\"kanga-card\">\r\n <div class=\"pindo\">\r\n <div class=\"mji\">\r\n <slot></slot>\r\n </div>\r\n </div>\r\n \r\n ${proverb ? `\r\n <div class=\"jina\">\r\n <p class=\"swahili\">${proverb}</p>\r\n ${translation ? `<p class=\"translation\">${translation}</p>` : ''}\r\n </div>\r\n ` : '<div class=\"jina\"><slot name=\"proverb\"></slot></div>'}\r\n </article>\r\n `;\r\n\r\n // Re-apply theme after render\r\n this.applyTheme();\r\n }\r\n}\r\n\r\n// Register the component\r\nregisterComponent('af-kanga-card', KangaCard);\r\n\r\nexport default KangaCard;\r\n",
47
+ "/**\r\n * AfriCode Cultural Card Component\r\n * \r\n * Interactive card showcasing African cultural patterns\r\n * with region selection and animated pattern backgrounds.\r\n * \r\n * @module components/cultural-card\r\n */\r\n\r\nimport { AfriCodeComponent, registerComponent } from './base.js';\r\nimport patterns from '../core/patterns.js';\r\n\r\nexport class CulturalCard extends AfriCodeComponent {\r\n static get observedAttributes() {\r\n return ['culture', 'interactive'];\r\n }\r\n\r\n constructor() {\r\n super();\r\n this._cultures = {\r\n // East Africa\r\n maasai: { name: 'Maasai', region: 'Tanzania/Kenya', pattern: 'generateShuka', colors: { primary: '#FF0000', accent: '#000000' } },\r\n hadzabe: { name: 'Hadzabe', region: 'Tanzania', pattern: 'generateHadzabe', colors: { primary: '#8B4513', accent: '#CD853F' } },\r\n swahili: { name: 'Swahili', region: 'East Africa', pattern: 'generateKangaBorder', colors: { primary: '#1EB53A', accent: '#FCD116' } },\r\n kitenge: { name: 'Kitenge', region: 'East Africa', pattern: 'generateKitenge', colors: { primary: '#00A3DD', accent: '#1EB53A' } },\r\n tibeb: { name: 'Tibeb', region: 'Ethiopia', pattern: 'generateTibeb', colors: { primary: '#009E60', accent: '#FCDD09' } },\r\n // West Africa\r\n ashanti: { name: 'Ashanti/Akan', region: 'Ghana', pattern: 'generateKente', colors: { primary: '#FFD700', accent: '#228B22' } },\r\n adinkra: { name: 'Adinkra', region: 'Ghana', pattern: 'generateAdinkra', colors: { primary: '#000000', accent: '#CD853F' } },\r\n bogolan: { name: 'Bogolan', region: 'Mali', pattern: 'generateBogolan', colors: { primary: '#3E2723', accent: '#D7CCC8' } },\r\n yoruba: { name: 'Yoruba', region: 'Nigeria', pattern: 'generateAsoOke', colors: { primary: '#4B0082', accent: '#FFD700' } },\r\n ankara: { name: 'Ankara', region: 'West Africa', pattern: 'generateAnkara', colors: { primary: '#FF6B00', accent: '#00A86B' } },\r\n // Central Africa\r\n kuba: { name: 'Kuba Shoowa', region: 'DRC', pattern: 'generateKuba', colors: { primary: '#D2B48C', accent: '#3E2723' } },\r\n imigongo: { name: 'Imigongo', region: 'Rwanda', pattern: 'generateImigongo', colors: { primary: '#000000', accent: '#B22222' } },\r\n // Southern Africa\r\n ndebele: { name: 'Ndebele', region: 'South Africa', pattern: 'generateNdebele', colors: { primary: '#4169E1', accent: '#FFD700' } },\r\n zulu: { name: 'Zulu', region: 'South Africa', pattern: 'generateZulu', colors: { primary: '#FF0000', accent: '#000000' } },\r\n swazi: { name: 'Swazi', region: 'Eswatini', pattern: 'generateSwazi', colors: { primary: '#3E5EB9', accent: '#FECD00' } },\r\n xhosa: { name: 'Xhosa', region: 'South Africa', pattern: 'generateXhosa', colors: { primary: '#00A86B', accent: '#1a1a2e' } }\r\n };\r\n this.render();\r\n }\r\n\r\n connectedCallback() {\r\n this._setupInteraction();\r\n }\r\n\r\n _setupInteraction() {\r\n if (!this.hasAttribute('interactive')) {return;}\r\n\r\n const selector = this.shadowRoot.querySelector('.culture-selector');\r\n selector?.addEventListener('change', (e) => {\r\n this.setAttribute('culture', e.target.value);\r\n this.emit('af-culture-change', { culture: e.target.value });\r\n });\r\n }\r\n\r\n attributeChangedCallback() {\r\n this.render();\r\n this._setupInteraction();\r\n }\r\n\r\n render() {\r\n const cultureKey = this.getAttribute('culture') || 'maasai';\r\n const interactive = this.hasAttribute('interactive');\r\n const culture = this._cultures[cultureKey] || this._cultures.maasai;\r\n\r\n // Generate pattern\r\n const patternFn = patterns[culture.pattern];\r\n const patternUrl = patternFn ? patternFn() : '';\r\n\r\n this.shadowRoot.innerHTML = `\r\n <style>\r\n :host {\r\n display: block;\r\n font-family: 'Inter', system-ui, sans-serif;\r\n }\r\n\r\n .cultural-card {\r\n border-radius: 12px;\r\n overflow: hidden;\r\n box-shadow: 0 4px 20px rgba(0,0,0,0.15);\r\n transition: transform 300ms ease, box-shadow 300ms ease;\r\n }\r\n\r\n .cultural-card:hover {\r\n transform: translateY(-5px);\r\n box-shadow: 0 8px 30px rgba(0,0,0,0.2);\r\n }\r\n\r\n .pattern-header {\r\n height: 120px;\r\n background-image: url(\"${patternUrl}\");\r\n background-repeat: repeat;\r\n position: relative;\r\n animation: patternShift 20s linear infinite;\r\n }\r\n\r\n @keyframes patternShift {\r\n 0% { background-position: 0 0; }\r\n 100% { background-position: 100px 100px; }\r\n }\r\n\r\n .pattern-overlay {\r\n position: absolute;\r\n inset: 0;\r\n background: linear-gradient(transparent 0%, rgba(0,0,0,0.3) 100%);\r\n }\r\n\r\n .culture-badge {\r\n position: absolute;\r\n bottom: 10px;\r\n left: 10px;\r\n background: ${culture.colors.primary};\r\n color: white;\r\n padding: 4px 12px;\r\n border-radius: 20px;\r\n font-size: 12px;\r\n font-weight: 600;\r\n text-shadow: 0 1px 2px rgba(0,0,0,0.3);\r\n }\r\n\r\n .region-badge {\r\n position: absolute;\r\n bottom: 10px;\r\n right: 10px;\r\n background: rgba(255,255,255,0.9);\r\n color: #333;\r\n padding: 4px 10px;\r\n border-radius: 20px;\r\n font-size: 11px;\r\n }\r\n\r\n .card-body {\r\n background: white;\r\n padding: 20px;\r\n }\r\n\r\n .card-title {\r\n display: flex;\r\n align-items: center;\r\n gap: 10px;\r\n margin-bottom: 12px;\r\n }\r\n\r\n .card-title h3 {\r\n margin: 0;\r\n font-size: 18px;\r\n color: ${culture.colors.primary};\r\n }\r\n\r\n .culture-icon {\r\n width: 40px;\r\n height: 40px;\r\n border-radius: 50%;\r\n background-image: url(\"${patternUrl}\");\r\n background-size: cover;\r\n border: 2px solid ${culture.colors.accent};\r\n }\r\n\r\n .card-content {\r\n color: #555;\r\n line-height: 1.6;\r\n }\r\n\r\n .culture-selector {\r\n width: 100%;\r\n padding: 10px;\r\n margin-top: 15px;\r\n border: 2px solid ${culture.colors.primary};\r\n border-radius: 6px;\r\n font-family: inherit;\r\n font-size: 14px;\r\n cursor: pointer;\r\n background: white;\r\n }\r\n\r\n .culture-selector:focus {\r\n outline: none;\r\n box-shadow: 0 0 0 3px ${culture.colors.primary}30;\r\n }\r\n\r\n select option {\r\n padding: 8px;\r\n }\r\n\r\n optgroup {\r\n font-weight: 600;\r\n color: #333;\r\n }\r\n </style>\r\n\r\n <article class=\"cultural-card\">\r\n <div class=\"pattern-header\">\r\n <div class=\"pattern-overlay\"></div>\r\n <span class=\"culture-badge\">${culture.name}</span>\r\n <span class=\"region-badge\">📍 ${culture.region}</span>\r\n </div>\r\n <div class=\"card-body\">\r\n <div class=\"card-title\">\r\n <div class=\"culture-icon\"></div>\r\n <h3>${culture.name} Pattern</h3>\r\n </div>\r\n <div class=\"card-content\">\r\n <slot></slot>\r\n </div>\r\n ${interactive ? `\r\n <select class=\"culture-selector\">\r\n <optgroup label=\"🌍 East Africa\">\r\n <option value=\"maasai\" ${cultureKey === 'maasai' ? 'selected' : ''}>Maasai (Tanzania/Kenya)</option>\r\n <option value=\"hadzabe\" ${cultureKey === 'hadzabe' ? 'selected' : ''}>Hadzabe (Tanzania)</option>\r\n <option value=\"swahili\" ${cultureKey === 'swahili' ? 'selected' : ''}>Swahili Kanga</option>\r\n <option value=\"kitenge\" ${cultureKey === 'kitenge' ? 'selected' : ''}>Kitenge</option>\r\n <option value=\"tibeb\" ${cultureKey === 'tibeb' ? 'selected' : ''}>Ethiopian Tibeb</option>\r\n </optgroup>\r\n <optgroup label=\"🌍 West Africa\">\r\n <option value=\"ashanti\" ${cultureKey === 'ashanti' ? 'selected' : ''}>Ashanti Kente (Ghana)</option>\r\n <option value=\"adinkra\" ${cultureKey === 'adinkra' ? 'selected' : ''}>Adinkra (Ghana)</option>\r\n <option value=\"bogolan\" ${cultureKey === 'bogolan' ? 'selected' : ''}>Mali Bogolan (Mud Cloth)</option>\r\n <option value=\"yoruba\" ${cultureKey === 'yoruba' ? 'selected' : ''}>Yoruba Aso-Oke (Nigeria)</option>\r\n <option value=\"ankara\" ${cultureKey === 'ankara' ? 'selected' : ''}>Ankara Wax Print</option>\r\n </optgroup>\r\n <optgroup label=\"🌍 Central Africa\">\r\n <option value=\"kuba\" ${cultureKey === 'kuba' ? 'selected' : ''}>Kuba Shoowa (DRC)</option>\r\n <option value=\"imigongo\" ${cultureKey === 'imigongo' ? 'selected' : ''}>Imigongo (Rwanda)</option>\r\n </optgroup>\r\n <optgroup label=\"🌍 Southern Africa\">\r\n <option value=\"ndebele\" ${cultureKey === 'ndebele' ? 'selected' : ''}>Ndebele (South Africa)</option>\r\n <option value=\"zulu\" ${cultureKey === 'zulu' ? 'selected' : ''}>Zulu (South Africa)</option>\r\n <option value=\"swazi\" ${cultureKey === 'swazi' ? 'selected' : ''}>Swazi (Eswatini)</option>\r\n <option value=\"xhosa\" ${cultureKey === 'xhosa' ? 'selected' : ''}>Xhosa (South Africa)</option>\r\n </optgroup>\r\n </select>\r\n ` : ''}\r\n </div>\r\n </article>\r\n `;\r\n }\r\n}\r\n\r\nregisterComponent('af-cultural-card', CulturalCard);\r\nexport default CulturalCard;\r\n",
48
+ "/**\r\n * AfriCode Pattern Showcase Component\r\n * \r\n * Interactive gallery displaying all African cultural patterns\r\n * with hover effects and pattern information.\r\n * \r\n * @module components/pattern-showcase\r\n */\r\n\r\nimport { AfriCodeComponent, registerComponent } from './base.js';\r\nimport * as patterns from '../core/patterns.js';\r\n\r\nexport class PatternShowcase extends AfriCodeComponent {\r\n static get observedAttributes() {\r\n return ['region', 'size'];\r\n }\r\n\r\n constructor() {\r\n super();\r\n this._allPatterns = [\r\n // East Africa\r\n { key: 'shuka', name: 'Maasai Shuka', region: 'east', country: 'Tanzania/Kenya', fn: patterns.generateShuka, meaning: 'Bravery, Unity, Identity' },\r\n { key: 'hadzabe', name: 'Hadzabe', region: 'east', country: 'Tanzania', fn: patterns.generateHadzabe, meaning: 'Ancient traditions, Hunter-gatherer heritage' },\r\n { key: 'kanga', name: 'Kanga', region: 'east', country: 'Tanzania/Kenya', fn: patterns.generateKangaBorder, meaning: 'Communication, Proverbs, Femininity' },\r\n { key: 'kitenge', name: 'Kitenge', region: 'east', country: 'East Africa', fn: patterns.generateKitenge, meaning: 'Celebration, African identity' },\r\n { key: 'tibeb', name: 'Tibeb', region: 'east', country: 'Ethiopia', fn: patterns.generateTibeb, meaning: 'Faith, Tradition, Celebration' },\r\n // West Africa\r\n { key: 'kente', name: 'Kente', region: 'west', country: 'Ghana', fn: patterns.generateKente, meaning: 'Royalty, Wisdom, Celebration' },\r\n { key: 'adinkra', name: 'Adinkra', region: 'west', country: 'Ghana', fn: patterns.generateAdinkra, meaning: 'Philosophy, Proverbs, Wisdom' },\r\n { key: 'bogolan', name: 'Bogolan', region: 'west', country: 'Mali', fn: patterns.generateBogolan, meaning: 'Earth energy, Protection, Healing' },\r\n { key: 'asooke', name: 'Aso-Oke', region: 'west', country: 'Nigeria', fn: patterns.generateAsoOke, meaning: 'Prestige, Celebration, Heritage' },\r\n { key: 'adire', name: 'Adire (Indigo)', region: 'west', country: 'Nigeria', fn: patterns.generateAdire, meaning: 'Creativity, Uniqueness, Depth' },\r\n { key: 'ankara', name: 'Ankara', region: 'west', country: 'West Africa', fn: patterns.generateAnkara, meaning: 'Boldness, Pan-African pride' },\r\n // Central Africa\r\n { key: 'kuba', name: 'Kuba Shoowa', region: 'central', country: 'DRC', fn: patterns.generateKuba, meaning: 'Status, Mathematics, Eternity' },\r\n { key: 'imigongo', name: 'Imigongo', region: 'central', country: 'Rwanda', fn: patterns.generateImigongo, meaning: 'Resilience, Strength, Artistry' },\r\n // North Africa\r\n { key: 'berber', name: 'Berber', region: 'north', country: 'North Africa', fn: patterns.generateBerber, meaning: 'Protection, Nature, Identity' },\r\n // Southern Africa\r\n { key: 'ndebele', name: 'Ndebele', region: 'south', country: 'South Africa', fn: patterns.generateNdebele, meaning: 'Artistry, Marriage, Status' },\r\n { key: 'zulu', name: 'Zulu Beadwork', region: 'south', country: 'South Africa', fn: patterns.generateZulu, meaning: 'Love letters, Community' },\r\n { key: 'swazi', name: 'Swazi', region: 'south', country: 'Eswatini', fn: patterns.generateSwazi, meaning: 'Monarchy, Warriors, Pride' },\r\n { key: 'xhosa', name: 'Xhosa', region: 'south', country: 'South Africa', fn: patterns.generateXhosa, meaning: 'Dignity, Coming of age' }\r\n ];\r\n this.render();\r\n }\r\n\r\n connectedCallback() {\r\n this._setupHovers();\r\n }\r\n\r\n _setupHovers() {\r\n this.shadowRoot.querySelectorAll('.pattern-item').forEach(item => {\r\n item.addEventListener('click', () => {\r\n const key = item.dataset.key;\r\n const pattern = this._allPatterns.find(p => p.key === key);\r\n if (pattern) {\r\n this.emit('af-pattern-select', { pattern });\r\n }\r\n });\r\n });\r\n }\r\n\r\n attributeChangedCallback() {\r\n this.render();\r\n this._setupHovers();\r\n }\r\n\r\n render() {\r\n const regionFilter = this.getAttribute('region') || 'all';\r\n const size = this.getAttribute('size') || 'md';\r\n\r\n const filtered = regionFilter === 'all'\r\n ? this._allPatterns\r\n : this._allPatterns.filter(p => p.region === regionFilter);\r\n\r\n const sizes = { sm: 80, md: 120, lg: 160 };\r\n const itemSize = sizes[size] || sizes.md;\r\n\r\n this.shadowRoot.innerHTML = `\r\n <style>\r\n :host {\r\n display: block;\r\n font-family: 'Inter', system-ui, sans-serif;\r\n }\r\n\r\n .showcase-container {\r\n padding: 10px;\r\n }\r\n\r\n .region-tabs {\r\n display: flex;\r\n gap: 8px;\r\n margin-block-end: 20px;\r\n flex-wrap: wrap;\r\n }\r\n\r\n .region-tab {\r\n padding: 8px 16px;\r\n border: none;\r\n border-radius: 20px;\r\n font-family: inherit;\r\n font-size: 13px;\r\n font-weight: 500;\r\n cursor: pointer;\r\n background: #e9ecef;\r\n color: #495057;\r\n transition: all 200ms ease;\r\n }\r\n\r\n .region-tab:hover {\r\n background: #dee2e6;\r\n }\r\n\r\n .region-tab.active {\r\n background: linear-gradient(135deg, #1EB53A 0%, #00A3DD 100%);\r\n color: white;\r\n }\r\n\r\n .pattern-grid {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fill, minmax(${itemSize + 40}px, 1fr));\r\n gap: 16px;\r\n }\r\n\r\n .pattern-item {\r\n background: white;\r\n border-radius: 12px;\r\n overflow: hidden;\r\n box-shadow: 0 2px 10px rgba(0,0,0,0.1);\r\n cursor: pointer;\r\n transition: all 300ms ease;\r\n }\r\n\r\n .pattern-item:hover {\r\n transform: scale(1.05);\r\n box-shadow: 0 8px 25px rgba(0,0,0,0.2);\r\n }\r\n\r\n .pattern-preview {\r\n inline-size: 100%;\r\n block-size: ${itemSize}px;\r\n background-repeat: repeat;\r\n transition: background-position 10s linear;\r\n }\r\n\r\n .pattern-item:hover .pattern-preview {\r\n background-position: 50px 50px;\r\n }\r\n\r\n .pattern-info {\r\n padding: 12px;\r\n }\r\n\r\n .pattern-name {\r\n font-weight: 600;\r\n font-size: 14px;\r\n margin-block-end: 4px;\r\n color: #333;\r\n }\r\n\r\n .pattern-country {\r\n font-size: 11px;\r\n color: #888;\r\n margin-block-end: 6px;\r\n }\r\n\r\n .pattern-meaning {\r\n font-size: 11px;\r\n color: #666;\r\n font-style: italic;\r\n line-height: 1.4;\r\n margin-block-end: 6px;\r\n }\r\n\r\n .region-label {\r\n font-size: 12px;\r\n padding: 3px 8px;\r\n border-radius: 10px;\r\n display: inline-block;\r\n margin-block-end: 6px;\r\n }\r\n\r\n .region-east { background: #d4edda; color: #155724; }\r\n .region-west { background: #fff3cd; color: #856404; }\r\n .region-central { background: #e2e3ff; color: #3e2723; }\r\n .region-south { background: #d1ecf1; color: #0c5460; }\r\n </style>\r\n\r\n <div class=\"showcase-container\">\r\n <div class=\"region-tabs\">\r\n <button class=\"region-tab ${regionFilter === 'all' ? 'active' : ''}\" data-region=\"all\">All Regions</button>\r\n <button class=\"region-tab ${regionFilter === 'east' ? 'active' : ''}\" data-region=\"east\">East Africa</button>\r\n <button class=\"region-tab ${regionFilter === 'west' ? 'active' : ''}\" data-region=\"west\">West Africa</button>\r\n <button class=\"region-tab ${regionFilter === 'central' ? 'active' : ''}\" data-region=\"central\">Central Africa</button>\r\n <button class=\"region-tab ${regionFilter === 'south' ? 'active' : ''}\" data-region=\"south\">Southern Africa</button>\r\n </div>\r\n\r\n <div class=\"pattern-grid\">\r\n ${filtered.map(p => `\r\n <div class=\"pattern-item\" data-key=\"${p.key}\">\r\n <div class=\"pattern-preview\" style=\"background-image: url('${p.fn()}')\"></div>\r\n <div class=\"pattern-info\">\r\n <span class=\"region-label region-${p.region}\">${p.region.charAt(0).toUpperCase() + p.region.slice(1)}</span>\r\n <div class=\"pattern-name\">${p.name}</div>\r\n <div class=\"pattern-country\">${p.country}</div>\r\n <div class=\"pattern-meaning\">${p.meaning}</div>\r\n </div>\r\n </div>\r\n `).join('')}\r\n </div>\r\n </div>\r\n `;\r\n\r\n // Region filter tabs\r\n this.shadowRoot.querySelectorAll('.region-tab').forEach(tab => {\r\n tab.addEventListener('click', () => {\r\n this.setAttribute('region', tab.dataset.region);\r\n });\r\n });\r\n }\r\n}\r\n\r\nregisterComponent('af-pattern-showcase', PatternShowcase);\r\nexport default PatternShowcase;\r\n",
49
+ "/**\r\n * AfriCode Language Switcher\r\n * A premium dropdown that uses native language names.\r\n */\r\nimport { AfriCodeComponent, registerComponent, html } from './base.js';\r\n\r\nexport class AfriLanguageSwitcher extends AfriCodeComponent {\r\n static get observedAttributes() {\r\n return ['current'];\r\n }\r\n\r\n render() {\r\n const languages = [\r\n { code: 'en', name: 'English' },\r\n { code: 'sw', name: 'Kiswahili' },\r\n { code: 'fr', name: 'Français' },\r\n { code: 'ar', name: 'العربية', dir: 'rtl' },\r\n { code: 'am', name: 'አማርኛ' },\r\n { code: 'yo', name: 'Yorùbá' }\r\n ];\r\n\r\n const current = this.getAttribute('current') || 'en';\r\n const currentLang = languages.find(l => l.code === current) || languages[0];\r\n\r\n this.shadowRoot.innerHTML = html`\r\n <style>\r\n :host { display: inline-block; position: relative; font-family: var(--font-body); }\r\n .switcher-btn {\r\n padding: 8px 16px;\r\n background: var(--glass-bg);\r\n border: 1px solid var(--glass-border);\r\n border-radius: var(--radius-md);\r\n color: var(--text-primary);\r\n cursor: pointer;\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n transition: all 0.3s ease;\r\n }\r\n .switcher-btn:hover { background: rgba(255,255,255,0.1); }\r\n .dropdown {\r\n position: absolute;\r\n top: calc(100% + 8px);\r\n right: 0;\r\n background: var(--afri-void);\r\n border: 1px solid var(--glass-border);\r\n border-radius: var(--radius-md);\r\n padding: 8px;\r\n display: none;\r\n min-width: 150px;\r\n z-index: 1000;\r\n box-shadow: 0 10px 40px rgba(0,0,0,0.5);\r\n }\r\n :host([open]) .dropdown { display: block; }\r\n .lang-option {\r\n padding: 8px 12px;\r\n border-radius: var(--radius-sm);\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n }\r\n .lang-option:hover { background: var(--glass-bg); color: var(--accent-gold); }\r\n </style>\r\n\r\n <button class=\"switcher-btn\">\r\n <span>🌍</span>\r\n <span>${currentLang.name}</span>\r\n </button>\r\n\r\n <div class=\"dropdown\">\r\n ${languages.map(lang => html`\r\n <div class=\"lang-option\" data-code=\"${lang.code}\" dir=\"${lang.dir || 'ltr'}\">\r\n ${lang.name}\r\n </div>\r\n `)}\r\n </div>\r\n `;\r\n\r\n this.shadowRoot.querySelector('.switcher-btn').onclick = () => {\r\n this.toggleAttribute('open');\r\n };\r\n\r\n this.shadowRoot.querySelectorAll('.lang-option').forEach(opt => {\r\n opt.onclick = () => {\r\n const code = opt.dataset.code;\r\n this.setAttribute('current', code);\r\n this.removeAttribute('open');\r\n this.emit('lang-change', { code });\r\n\r\n // Demo logic: change document direction for Arabic\r\n if (code === 'ar') {\r\n document.documentElement.dir = 'rtl';\r\n } else {\r\n document.documentElement.dir = 'ltr';\r\n }\r\n };\r\n });\r\n }\r\n\r\n connectedCallback() {\r\n this.render();\r\n }\r\n\r\n attributeChangedCallback() {\r\n this.render();\r\n }\r\n}\r\n\r\nregisterComponent('af-language-switcher', AfriLanguageSwitcher);\r\n",
50
+ "/**\r\n * AfriCode Auth Component\r\n * A \"Profound Dark\" themed login/register form.\r\n * \r\n * Usage: <af-auth></af-auth>\r\n */\r\n\r\nimport { AfriCodeComponent, registerComponent } from './base.js';\r\n\r\nexport class AfriAuth extends AfriCodeComponent {\r\n constructor() {\r\n super();\r\n this.mode = 'login'; // login | register\r\n }\r\n\r\n connectedCallback() {\r\n this.render();\r\n this.setupEvents();\r\n }\r\n\r\n setupEvents() {\r\n const form = this.shadowRoot.querySelector('form');\r\n const toggle = this.shadowRoot.querySelector('.toggle-mode');\r\n\r\n if (toggle) {\r\n toggle.addEventListener('click', (e) => {\r\n e.preventDefault();\r\n this.mode = this.mode === 'login' ? 'register' : 'login';\r\n this.render();\r\n this.setupEvents();\r\n });\r\n }\r\n\r\n if (form) {\r\n form.addEventListener('submit', async (e) => {\r\n e.preventDefault();\r\n const email = this.shadowRoot.querySelector('#email').value;\r\n const password = this.shadowRoot.querySelector('#password').value;\r\n const feedback = this.shadowRoot.querySelector('.feedback');\r\n\r\n feedback.textContent = 'Processing...';\r\n\r\n try {\r\n const res = await fetch('/api/auth', {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ action: this.mode, email, password })\r\n });\r\n\r\n const data = await res.json();\r\n\r\n if (data.error) {\r\n feedback.textContent = data.error;\r\n feedback.style.color = '#ef4444';\r\n } else {\r\n feedback.textContent = 'Success! Redirecting...';\r\n feedback.style.color = '#22c55e';\r\n setTimeout(() => window.location.href = '/', 1000);\r\n }\r\n } catch (err) {\r\n feedback.textContent = 'Network Error';\r\n }\r\n });\r\n }\r\n }\r\n\r\n render() {\r\n const isLogin = this.mode === 'login';\r\n\r\n this.shadowRoot.innerHTML = `\r\n <style>\r\n :host {\r\n display: block;\r\n font-family: 'Inter', system-ui;\r\n max-width: 400px;\r\n margin: 0 auto;\r\n }\r\n .auth-card {\r\n background: #1e293b;\r\n border: 1px solid #334155;\r\n border-radius: 12px;\r\n padding: 32px;\r\n box-shadow: 0 10px 30px rgba(0,0,0,0.3);\r\n }\r\n h2 {\r\n margin-top: 0;\r\n color: white;\r\n text-align: center;\r\n font-weight: 800;\r\n }\r\n .input-group {\r\n margin-bottom: 20px;\r\n }\r\n label {\r\n display: block;\r\n color: #94a3b8;\r\n font-size: 0.9rem;\r\n margin-bottom: 8px;\r\n }\r\n input {\r\n width: 100%;\r\n padding: 12px;\r\n background: #0f172a;\r\n border: 1px solid #334155;\r\n border-radius: 6px;\r\n color: white;\r\n font-size: 1rem;\r\n box-sizing: border-box; \r\n }\r\n input:focus {\r\n border-color: #1EB53A;\r\n outline: none;\r\n }\r\n button {\r\n width: 100%;\r\n padding: 12px;\r\n background: #1EB53A;\r\n color: white;\r\n border: none;\r\n border-radius: 6px;\r\n font-weight: 700;\r\n cursor: pointer;\r\n font-size: 1rem;\r\n transition: all 0.2s;\r\n }\r\n button:hover {\r\n opacity: 0.9;\r\n transform: translateY(-1px);\r\n }\r\n .footer {\r\n margin-top: 20px;\r\n text-align: center;\r\n font-size: 0.9rem;\r\n color: #94a3b8;\r\n }\r\n .toggle-mode {\r\n color: #FCD116;\r\n cursor: pointer;\r\n text-decoration: underline;\r\n }\r\n .feedback {\r\n text-align: center;\r\n margin-bottom: 16px;\r\n min-height: 20px;\r\n font-size: 0.9rem;\r\n }\r\n </style>\r\n\r\n <div class=\"auth-card\">\r\n <h2>${isLogin ? 'Welcome Back' : 'Create Account'}</h2>\r\n <div class=\"feedback\"></div>\r\n <form>\r\n <div class=\"input-group\">\r\n <label for=\"email\">Email Address</label>\r\n <input type=\"email\" id=\"email\" required placeholder=\"you@example.com\">\r\n </div>\r\n <div class=\"input-group\">\r\n <label for=\"password\">Password</label>\r\n <input type=\"password\" id=\"password\" required placeholder=\"••••••••\">\r\n </div>\r\n <button type=\"submit\">${isLogin ? 'Sign In' : 'Sign Up'}</button>\r\n </form>\r\n <div class=\"footer\">\r\n ${isLogin ? 'New here?' : 'Already have an account?'}\r\n <span class=\"toggle-mode\">${isLogin ? 'Create an account' : 'Sign in'}</span>\r\n </div>\r\n </div>\r\n `;\r\n }\r\n}\r\n\r\nregisterComponent('af-auth', AfriAuth);\r\n",
51
+ "import { AfriCodeComponent, registerComponent, html } from './base.js';\r\n\r\nclass ThemeToggle extends AfriCodeComponent {\r\n constructor() {\r\n super();\r\n this.currentTheme = 'dark';\r\n }\r\n\r\n connectedCallback() {\r\n this.loadStyles();\r\n \r\n // Check initial theme from document element or localStorage\r\n const storedTheme = localStorage.getItem('africode-theme');\r\n if (storedTheme) {\r\n this.currentTheme = storedTheme;\r\n document.documentElement.setAttribute('data-theme', storedTheme);\r\n } else {\r\n const hasLightMode = window.matchMedia('(prefers-color-scheme: light)').matches;\r\n this.currentTheme = hasLightMode ? 'light' : 'dark';\r\n document.documentElement.setAttribute('data-theme', this.currentTheme);\r\n }\r\n\r\n this.render();\r\n }\r\n\r\n toggleTheme() {\r\n this.currentTheme = this.currentTheme === 'dark' ? 'light' : 'dark';\r\n document.documentElement.setAttribute('data-theme', this.currentTheme);\r\n localStorage.setItem('africode-theme', this.currentTheme);\r\n \r\n // Dispatch event for other components that might need JS-level awareness\r\n window.dispatchEvent(new CustomEvent('theme-changed', { \r\n detail: { theme: this.currentTheme } \r\n }));\r\n\r\n this.render();\r\n }\r\n\r\n render() {\r\n const isDark = this.currentTheme === 'dark';\r\n \r\n this.shadowRoot.innerHTML = html`\r\n <style>\r\n .toggle-btn {\r\n background: var(--bg-surface-elevated, var(--afri-obsidian));\r\n border: 1px solid var(--border-color);\r\n color: var(--text-main);\r\n padding: var(--space-8) var(--space-13);\r\n border-radius: var(--radius-lg);\r\n cursor: pointer;\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n font-family: var(--font-body);\r\n font-size: 0.9rem;\r\n transition: all 0.3s var(--ease-snap);\r\n }\r\n .toggle-btn:hover {\r\n border-color: var(--brand-green);\r\n transform: translateY(-2px);\r\n }\r\n .icon {\r\n font-size: 1.1rem;\r\n }\r\n </style>\r\n \r\n <button class=\"toggle-btn\" @click=\"\\${() => this.toggleTheme()}\">\r\n <span class=\"icon\">\\${isDark ? '🌙' : '☀️'}</span>\r\n <span>\\${isDark ? 'Dark Mode' : 'Light Mode'}</span>\r\n </button>\r\n `;\r\n\r\n // Attach event listener natively since simple html tagged template doesn't bind events directly in this framework yet\r\n const btn = this.shadowRoot.querySelector('.toggle-btn');\r\n if (btn) {\r\n btn.addEventListener('click', () => this.toggleTheme());\r\n }\r\n }\r\n}\r\n\r\nregisterComponent('af-theme-toggle', ThemeToggle);\r\nexport default ThemeToggle;\r\n",
52
+ "/**\r\n * AfriCode Client SDK\r\n * Browser-safe entry point for client-side bundling\r\n *\r\n * This excludes server-side code like database, auth, and server utilities\r\n * that can't be bundled for browser use.\r\n */\r\n\r\nimport { createReactiveState, subscribe, createSignal, createEffect } from './state.js';\r\nimport { store, actions } from './store.js';\r\nimport patterns from './patterns.js';\r\nimport * as motion from './motion.js';\r\nimport { hydrate } from './hydration.js';\r\nimport { html, Layout } from './html.js';\r\n\r\nimport { componentMap as coreMap } from '../components/index.js';\r\n\r\n// Utility to initialize the client-side framework\r\nexport function init(projectComponentMap = {}) {\r\n if (typeof window !== 'undefined') {\r\n console.log('🌍 AfriCode Client SDK Initialized (Zero-Config Mode)');\r\n\r\n // Merge project map with core map\r\n const finalMap = { ...coreMap, ...projectComponentMap };\r\n\r\n if (Object.keys(finalMap).length > 0) {\r\n hydrate(finalMap);\r\n }\r\n }\r\n}\r\n\r\n// Grouped exports for cleaner access (client-safe only)\r\nexport {\r\n createReactiveState,\r\n subscribe,\r\n createSignal,\r\n createEffect\r\n} from './state.js';\r\n\r\nexport {\r\n store,\r\n actions,\r\n patterns,\r\n motion,\r\n html,\r\n Layout\r\n};\r\n\r\n// Default Export\r\nexport default {\r\n createReactiveState,\r\n subscribe,\r\n createSignal,\r\n createEffect,\r\n store,\r\n actions,\r\n patterns,\r\n motion,\r\n html,\r\n Layout,\r\n init\r\n};",
53
+ "/**\r\n * AfriCode Rhythmic Motion Engine\r\n * \r\n * Implements polyrhythmic easing and staggered animations\r\n * inspired by traditional African drumming and musical structures.\r\n * \r\n * Core concepts:\r\n * - \"Call and Response\": Interlocking animations\r\n * - \"Strain and Release\": Custom drum-beat easing\r\n * \r\n * @module core/motion\r\n */\r\n\r\n// Custom cubic-bezier mimicking the tension and release of a drum beat\r\n// Rapid attack, slight hold (tension), and natural release\r\nexport const Easing = {\r\n DrumBeat: 'cubic-bezier(0.1, 0.9, 0.2, 1.0)', // Percussive snap\r\n KoraPluck: 'cubic-bezier(0.34, 1.56, 0.64, 1)', // Elastic bounce\r\n RiverFlow: 'cubic-bezier(0.4, 0.0, 0.2, 1)', // Smooth continuous\r\n};\r\n\r\n/**\r\n * Animate elements with a \"Call and Response\" staggered effect\r\n * \r\n * @param {string|NodeList|Array} selector - Elements to animate\r\n * @param {Object} options - Animation configuration\r\n */\r\nexport function animateStaggered(selector, {\r\n delay = 50, // ms between items (polyrhythmic tick)\r\n duration = 600,\r\n easing = Easing.DrumBeat,\r\n y = 20, // Slide up distance\r\n scale = 0.95\r\n} = {}) {\r\n const elements = typeof selector === 'string'\r\n ? document.querySelectorAll(selector)\r\n : selector;\r\n\r\n if (!elements || elements.length === 0) {return;}\r\n\r\n const observer = new IntersectionObserver((entries) => {\r\n entries.forEach((entry, index) => {\r\n if (entry.isIntersecting) {\r\n // Calculate staggered delay based on 12/8 time signature feel\r\n // We use a slight fluctuation to mimic human timing imperfections (groove)\r\n const groove = Math.random() * 10;\r\n const stagger = (index * delay) + groove;\r\n\r\n const el = entry.target;\r\n\r\n // Use Web Animations API for performance\r\n el.animate(\r\n [\r\n { opacity: 0, transform: `translateY(${y}px) scale(${scale})` },\r\n { opacity: 1, transform: 'translateY(0) scale(1)' }\r\n ],\r\n {\r\n duration: duration,\r\n delay: stagger,\r\n easing: easing,\r\n fill: 'forwards'\r\n }\r\n );\r\n\r\n // Stop observing once animated\r\n observer.unobserve(el);\r\n el.style.opacity = '1'; // Ensure final state\r\n }\r\n });\r\n }, { threshold: 0.1 });\r\n\r\n elements.forEach(el => {\r\n el.style.opacity = '0'; // Initial state\r\n observer.observe(el);\r\n });\r\n}\r\n\r\n/**\r\n * Apply \"Vibe\" transition to page navigation\r\n * Mimics a rhythmic \"wipe\" or \"beat\" transition\r\n */\r\nexport function transitionPage(nextPageFn) {\r\n // Simple example of a beat-match transition\r\n document.body.animate(\r\n [\r\n { opacity: 1, transform: 'scale(1)' },\r\n { opacity: 0, transform: 'scale(0.98)' } // \"Strain\" (Inhale)\r\n ],\r\n { duration: 200, easing: 'ease-in' }\r\n ).onfinish = () => {\r\n nextPageFn(); // Change content\r\n document.body.animate(\r\n [\r\n { opacity: 0, transform: 'scale(1.02)' },\r\n { opacity: 1, transform: 'scale(1)' } // \"Release\" (Exhale)\r\n ],\r\n { duration: 400, easing: Easing.DrumBeat }\r\n );\r\n };\r\n}\r\n\r\nexport default {\r\n Easing,\r\n animateStaggered,\r\n transitionPage\r\n};\r\n",
54
+ "/**\r\n * Islands Architecture Hydration Engine\r\n * \r\n * Efficiently loads component JavaScript only when elements are visible.\r\n * This enables the \"0 KB JS\" baseline for initial views.\r\n * \r\n * @module core/hydration\r\n */\r\n\r\n/**\r\n * Hydrate components based on visibility\r\n * @param {Object} componentMap - Map of tag names to dynamic import functions\r\n */\r\nexport function hydrate(componentMap) {\r\n if (typeof window === 'undefined') {return;}\r\n if (!('IntersectionObserver' in window)) {\r\n // Fallback for ancient browsers: load everything immediately\r\n Object.values(componentMap).forEach(load => load());\r\n return;\r\n }\r\n\r\n const observer = new IntersectionObserver((entries) => {\r\n entries.forEach(entry => {\r\n if (entry.isIntersecting) {\r\n const tag = entry.target.tagName.toLowerCase();\r\n const load = componentMap[tag];\r\n\r\n if (load) {\r\n console.log(`🏝️ Hydrating Island: <${tag}>`);\r\n load().then(() => {\r\n // Optimally, we could stop observing *all* of this tag type since definition is global\r\n // But for simplicity, we just unobserve this one.\r\n // The custom element upgrade happens automatically.\r\n\r\n // Remove from map to prevent double-loading attempts (though imports are cached)\r\n delete componentMap[tag];\r\n }).catch(err => console.error(`Failed to hydrate <${tag}>`, err));\r\n }\r\n\r\n // Stop observing this element regardless\r\n observer.unobserve(entry.target);\r\n }\r\n });\r\n }, { rootMargin: '50px 0px' }); // Pre-load 50px before view\r\n\r\n // Observe all registered tags locally\r\n Object.keys(componentMap).forEach(tag => {\r\n document.querySelectorAll(tag).forEach(el => observer.observe(el));\r\n });\r\n\r\n // TODO: Add MutationObserver for dynamically added nodes if needed\r\n}\r\n",
55
+ "/**\r\n * Component Registry (Islands Map)\r\n * \r\n * Instead of statically importing all components (monolithic bundle),\r\n * we export a map for lazy hydration.\r\n */\r\n\r\nexport { AfriCodeComponent } from './base.js';\r\nexport { AfriErrorBoundary } from './error-boundary.js';\r\n\r\n// Map of Tag Name -> Dynamic Import\r\nexport const componentMap = {\r\n // Core UI\r\n 'af-button': () => import('./button.js'),\r\n 'af-card': () => import('./card.js'),\r\n 'af-navbar': () => import('./navbar.js'),\r\n 'af-input': () => import('./input.js'),\r\n 'af-alert': () => import('./alert.js'),\r\n 'af-grid': () => import('./grid.js'),\r\n 'af-section': () => import('./section.js'),\r\n 'af-icon': () => import('./icon.js'),\r\n\r\n // Enterprise\r\n 'af-accordion': () => import('./accordion.js'),\r\n 'af-hero': () => import('./hero.js'),\r\n 'af-table': () => import('./table.js'),\r\n 'af-modal': () => import('./modal.js'),\r\n 'af-tabs': () => import('./tabs.js'),\r\n 'af-sidebar': () => import('./sidebar.js'),\r\n 'af-dropdown': () => import('./dropdown.js'),\r\n 'af-select': () => import('./select.js'),\r\n 'af-form': () => import('./form.js'),\r\n 'af-tooltip': () => import('./tooltip.js'),\r\n 'af-toast': () => import('./toast.js'),\r\n\r\n // Feedback & Display\r\n 'af-badge': () => import('./badge.js'),\r\n 'af-avatar': () => import('./avatar.js'),\r\n 'af-progress': () => import('./progress.js'),\r\n 'af-loader': () => import('./loader.js'),\r\n 'af-skeleton': () => import('./skeleton.js'),\r\n 'af-divider': () => import('./divider.js'),\r\n\r\n // Cultural\r\n 'af-kanga-card': () => import('./kanga-card.js'),\r\n 'af-cultural-card': () => import('./cultural-card.js'),\r\n 'af-pattern-showcase': () => import('./pattern-showcase.js'),\r\n 'af-language-switcher': () => import('./language-switcher.js'),\r\n\r\n // Auth\r\n 'af-auth': () => import('./auth.js'),\r\n\r\n // Theming\r\n 'af-theme-toggle': () => import('./theme-toggle.js'),\r\n};\r\n\r\nexport default componentMap;\r\n",
56
+ "import { AfriCodeComponent, registerComponent } from './base.js';\r\n\r\n/**\r\n * AfriCode Error Boundary Component\r\n * \r\n * Native Web Component implementation of an error boundary.\r\n * Listens for 'af-component-error' events bubbling up from children.\r\n * Gracefully displays a localized fallback UI.\r\n * \r\n * @module components/error-boundary\r\n */\r\nexport class AfriErrorBoundary extends AfriCodeComponent {\r\n static get observedAttributes() {\r\n return ['theme', 'fallback-message'];\r\n }\r\n\r\n constructor() {\r\n super();\r\n this._hasError = false;\r\n this._errorDetail = null;\r\n this.render();\r\n }\r\n\r\n connectedCallback() {\r\n // Listen for internal errors bubbling up from custom AfriCode children\r\n this.addEventListener('af-component-error', this._handleError.bind(this));\r\n }\r\n\r\n disconnectedCallback() {\r\n this.removeEventListener('af-component-error', this._handleError.bind(this));\r\n }\r\n\r\n _handleError(e) {\r\n // Prevent it from bubbling further up and crashing higher boundaries\r\n e.stopPropagation();\r\n \r\n this._hasError = true;\r\n this._errorDetail = e.detail;\r\n \r\n console.warn('[AfriCode Boundary] Caught error:', this._errorDetail);\r\n this.render();\r\n }\r\n\r\n reset() {\r\n this._hasError = false;\r\n this._errorDetail = null;\r\n this.render();\r\n }\r\n\r\n attributeChangedCallback() {\r\n this.render();\r\n }\r\n\r\n render() {\r\n const theme = this.getAttribute('theme') || 'tanzania';\r\n const fallbackMessage = this.getAttribute('fallback-message') || 'A part of this page failed to load.';\r\n\r\n // Use appropriate semantic warning colors depending on culture theme\r\n const themes = {\r\n tanzania: { bg: '#FFF9E6', border: '#FCD116', text: '#5A4A00' },\r\n maasai: { bg: '#FFEEEE', border: '#FF0000', text: '#8B0000' },\r\n ndebele: { bg: '#EBF0FF', border: '#4169E1', text: '#002B5C' },\r\n ocean: { bg: '#E6FAFF', border: '#00A3DD', text: '#004A66' }\r\n };\r\n\r\n const t = themes[theme] || themes.tanzania;\r\n\r\n if (this._hasError) {\r\n this.shadowRoot.innerHTML = `\r\n <style>\r\n :host { display: block; width: 100%; font-family: 'Inter', system-ui, sans-serif; }\r\n .boundary-error {\r\n background: ${t.bg};\r\n border-left: 4px solid ${t.border};\r\n color: ${t.text};\r\n padding: 16px 20px;\r\n border-radius: 4px;\r\n margin: 12px 0;\r\n box-shadow: 0 2px 8px rgba(0,0,0,0.05);\r\n }\r\n .boundary-header {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n font-weight: 600;\r\n margin-bottom: 8px;\r\n font-size: 16px;\r\n }\r\n .boundary-message {\r\n font-size: 14px;\r\n opacity: 0.9;\r\n margin-bottom: 12px;\r\n }\r\n .boundary-dev-detail {\r\n font-family: monospace;\r\n font-size: 12px;\r\n background: rgba(0,0,0,0.05);\r\n padding: 8px;\r\n border-radius: 4px;\r\n overflow-x: auto;\r\n white-space: pre-wrap;\r\n }\r\n .boundary-action {\r\n margin-top: 12px;\r\n }\r\n button {\r\n background: transparent;\r\n border: 1px solid ${t.border};\r\n color: ${t.text};\r\n padding: 6px 12px;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n font-weight: 500;\r\n transition: background 0.2s;\r\n }\r\n button:hover {\r\n background: rgba(0,0,0,0.05);\r\n }\r\n </style>\r\n <div class=\"boundary-error\" role=\"alert\">\r\n <div class=\"boundary-header\">\r\n <span aria-hidden=\"true\">🔄</span>\r\n <span>Component Recovery</span>\r\n </div>\r\n <div class=\"boundary-message\">${fallbackMessage}</div>\r\n \r\n ${this._errorDetail ? `\r\n <div class=\"boundary-dev-detail\">\r\n <code>&lt;${this._errorDetail.component}&gt;: ${this._errorDetail.message}</code>\r\n </div>\r\n ` : ''}\r\n\r\n <div class=\"boundary-action\">\r\n <button id=\"retry-btn\">Try Again</button>\r\n </div>\r\n </div>\r\n `;\r\n \r\n // Re-bind retry logic\r\n this.shadowRoot.getElementById('retry-btn').addEventListener('click', () => {\r\n this.reset();\r\n });\r\n return;\r\n }\r\n\r\n // If no error, just passthrough the light DOM via slots\r\n this.shadowRoot.innerHTML = `\r\n <style>:host { display: block; }</style>\r\n <slot></slot>\r\n `;\r\n }\r\n}\r\n\r\nregisterComponent('af-error-boundary', AfriErrorBoundary);\r\nexport default AfriErrorBoundary;\r\n"
57
+ ],
58
+ "mappings": "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",
59
+ "debugId": "E59F2706CA9FA53664756E2164756E21",
60
+ "names": []
61
+ }