@keak/sdk 1.0.9 → 2.0.1

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.
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
3
- import React, { useState, useRef, useEffect, forwardRef, createElement, useCallback, createContext, useMemo, useContext } from 'react';
3
+ import React, { useState, useRef, useEffect, forwardRef, createElement, useCallback } from 'react';
4
4
 
5
5
  function styleInject(css, ref) {
6
6
  if ( ref === void 0 ) ref = {};
@@ -1674,6 +1674,34 @@ const KeakIcon = ({ size = 16 }) => (jsxs("svg", { width: size, height: size, vi
1674
1674
  var css_248z = ":root{--keak-background:17 23 34;--keak-foreground:243 246 252;--keak-card:17 23 34;--keak-card-foreground:243 246 252;--keak-popover:17 23 34;--keak-popover-foreground:243 246 252;--keak-primary:88 152 237;--keak-primary-foreground:17 23 34;--keak-secondary:47 61 90;--keak-secondary-foreground:243 246 252;--keak-muted:47 61 90;--keak-muted-foreground:168 179 202;--keak-accent:88 152 237;--keak-accent-foreground:17 23 34;--keak-destructive:239 68 68;--keak-destructive-foreground:255 255 255;--keak-border:47 61 90;--keak-input:17 23 34;--keak-ring:88 152 237;--keak-radius:12px;--glass-bg:rgba(17,23,34,.95);--glass-border:rgba(88,152,237,.15);--glass-shadow:0 8px 32px rgba(0,0,0,.3);--glass-backdrop:blur(20px);--keak-chart-1:88 152 237;--keak-chart-2:16 185 129;--keak-chart-3:245 158 11;--keak-chart-4:239 68 68;--keak-chart-5:139 92 246}*{scrollbar-color:#2f3d5a #111722;scrollbar-width:thin}::-webkit-scrollbar{height:6px;width:6px}::-webkit-scrollbar-track{background:#111722;border-radius:3px}::-webkit-scrollbar-thumb{background:#2f3d5a;border-radius:3px;-webkit-transition:background .2s;transition:background .2s}::-webkit-scrollbar-thumb:hover{background:#374151}::-webkit-scrollbar-corner{background:#111722}.keak-toolbar-panel-content::-webkit-scrollbar{width:6px}.keak-toolbar-panel-content::-webkit-scrollbar-track{background:transparent}.keak-toolbar-panel-content::-webkit-scrollbar-thumb{background:#2f3d5a;border-radius:3px}.keak-toolbar-panel-content::-webkit-scrollbar-thumb:hover{background:#374151}.keak-toolbar{backdrop-filter:var(--glass-backdrop);-webkit-backdrop-filter:var(--glass-backdrop);background:var(--glass-bg);border:1px solid var(--glass-border);border-radius:var(--keak-radius);box-shadow:var(--glass-shadow);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,sans-serif;font-size:14px;line-height:1.5;overflow:hidden;position:relative;transition:all .3s cubic-bezier(.4,0,.2,1);-webkit-user-select:none;-moz-user-select:none;user-select:none}.keak-toolbar:before{background:linear-gradient(135deg,rgba(59,130,246,.1),rgba(147,197,253,.05) 50%,rgba(59,130,246,.1));bottom:0;content:\"\";left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:-1}.keak-toolbar *{box-sizing:border-box}.keak-toolbar.dragging{backdrop-filter:blur(25px);box-shadow:0 12px 40px rgba(59,130,246,.25),0 0 0 1px rgba(59,130,246,.3);transform:scale(1.02);transition:none}.keak-toolbar.dragging .keak-toolbar-header{cursor:grabbing!important}.keak-toolbar.minimized{border-radius:26px;box-shadow:0 4px 20px rgba(59,130,246,.2);height:52px;width:52px}.keak-toolbar-toggle{align-items:center;background:transparent;border:none;border-radius:26px;cursor:pointer;display:flex;height:52px;justify-content:center;overflow:hidden;position:relative;transition:all .3s cubic-bezier(.4,0,.2,1);width:52px}.keak-toolbar-toggle:before{background:linear-gradient(135deg,rgba(59,130,246,.2),rgba(147,197,253,.1));border-radius:inherit;content:\"\";inset:0;opacity:0;position:absolute;transition:opacity .3s ease}.keak-toolbar-toggle:hover:before{opacity:1}.keak-toolbar-toggle:hover{box-shadow:0 6px 24px rgba(59,130,246,.3);transform:scale(1.08)}.keak-toolbar-collapsed{align-items:center;background:var(--glass-bg);border-radius:26px;box-shadow:var(--glass-shadow);display:flex;gap:12px;min-width:140px;padding:8px 16px}.keak-toolbar-collapsed .keak-toolbar-toggle{align-items:center;display:flex;flex:1;gap:8px;justify-content:flex-start;padding:0 12px}.keak-toolbar-label{color:hsl(var(--keak-foreground));font-size:14px;font-weight:600}.keak-toolbar-minimize{align-items:center;background:transparent;border:none;border-radius:10px;color:hsl(var(--keak-muted-foreground));cursor:pointer;display:flex;height:36px;justify-content:center;transition:all .2s ease;width:36px}.keak-toolbar-minimize:hover{background:hsl(var(--keak-accent));color:hsl(var(--keak-accent-foreground));transform:scale(1.05)}.keak-toolbar.expanded{display:flex;flex-direction:column;max-height:650px;width:400px}.keak-toolbar-expanded{background:var(--glass-bg);border-radius:var(--keak-radius);display:flex;flex-direction:column;height:100%;overflow:hidden;position:relative}.keak-toolbar-header{align-items:center;backdrop-filter:blur(10px);background:hsla(0,0%,100%,.95);border-bottom:1px solid hsl(var(--keak-border));cursor:grab;display:flex;padding:16px 20px;position:relative;transition:all .2s ease;z-index:2}.keak-toolbar-header:before{background:linear-gradient(90deg,rgba(59,130,246,.05),transparent 50%,rgba(59,130,246,.05));bottom:0;content:\"\";left:0;pointer-events:none;position:absolute;right:0;top:0}.keak-toolbar-header:hover{background:hsla(0,0%,100%,.98)}.keak-toolbar-header:active{cursor:grabbing}.keak-toolbar-brand{align-items:center;display:flex;flex:1;gap:10px;pointer-events:none}.keak-toolbar-title{-webkit-text-fill-color:transparent;background:linear-gradient(135deg,hsl(var(--keak-primary)),#0ea5e9);-webkit-background-clip:text;background-clip:text;color:hsl(var(--keak-foreground));font-size:18px;font-weight:700}.keak-model-selector{margin:0 16px;pointer-events:auto;position:relative}.keak-simple-dropdown{display:inline-block;position:relative}.keak-dropdown-trigger{align-items:center;background:hsla(0,0%,100%,.9);border:1px solid hsl(var(--keak-border));border-radius:10px;box-shadow:0 1px 3px rgba(0,0,0,.05);color:hsl(var(--keak-foreground));cursor:pointer;display:flex;font-size:13px;font-weight:500;gap:8px;min-width:120px;padding:8px 14px;position:relative;transition:all .2s ease}.keak-dropdown-trigger:hover{background:rgba(59,130,246,.05);border-color:hsl(var(--keak-primary));box-shadow:0 4px 12px rgba(59,130,246,.15);transform:translateY(-1px)}.keak-dropdown-arrow{height:12px;margin-left:auto;transition:transform .2s ease;width:12px}.keak-dropdown-trigger[data-open=true] .keak-dropdown-arrow{transform:rotate(180deg)}.keak-dropdown-content{backdrop-filter:blur(10px);background:hsla(0,0%,100%,.98);border:1px solid hsl(var(--keak-border));border-radius:8px;box-shadow:0 8px 32px rgba(0,0,0,.1);left:0;margin-top:4px;min-width:140px;overflow:hidden;position:absolute;right:0;top:100%;z-index:999999999}.keak-dropdown-item{align-items:center;color:hsl(var(--keak-foreground));cursor:pointer;display:flex;font-size:13px;font-weight:500;gap:8px;padding:10px 14px;transition:all .2s ease}.keak-dropdown-item:hover{background:rgba(59,130,246,.08)}.keak-dropdown-item[data-selected=true]{background:rgba(59,130,246,.1);color:hsl(var(--keak-primary))}.keak-model-dropdown{-webkit-appearance:none;-moz-appearance:none;appearance:none;backdrop-filter:blur(8px);background:rgba(51,65,85,.9);background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%23cbd5e1' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E\");background-position:right 8px center;background-repeat:no-repeat;background-size:16px;border:1px solid var(--glass-border);border-radius:10px;color:hsl(var(--keak-foreground));cursor:pointer;font-size:13px;font-weight:500;min-width:120px;padding:8px 32px 8px 14px;transition:all .2s ease}.keak-model-dropdown:hover{background:rgba(59,130,246,.15);border-color:hsl(var(--keak-primary));box-shadow:0 4px 12px rgba(59,130,246,.25);transform:translateY(-1px)}.keak-model-dropdown:focus{border-color:hsl(var(--keak-primary));box-shadow:0 0 0 3px rgba(59,130,246,.2);outline:none}.keak-toolbar-controls{display:flex;gap:6px;pointer-events:auto}.keak-toolbar-close{align-items:center;background:transparent;border:none;border-radius:8px;color:hsl(var(--keak-muted-foreground));cursor:pointer;display:flex;height:32px;justify-content:center;transition:all .2s ease;width:32px}.keak-toolbar-close:hover{background:rgba(239,68,68,.1);color:hsl(var(--keak-destructive));transform:scale(1.05)}.keak-toolbar-actions{backdrop-filter:blur(8px);background:rgba(248,250,252,.8);border-bottom:1px solid hsl(var(--keak-border));display:flex;gap:10px;padding:16px 20px}.keak-toolbar,.keak-toolbar *{color:#000!important;font-weight:600}.keak-action-btn span,.keak-action-btn.active,.keak-action-btn.active *,.keak-dropdown-item,.keak-dropdown-trigger,.keak-optimize-btn,.keak-optimize-btn *,.keak-status-selected,.keak-toolbar-title{color:#fff!important}.keak-toolbar .keak-element-text,.keak-toolbar .keak-form-label,.keak-toolbar .keak-metrics-title,.keak-toolbar .keak-scan-summary-title,.keak-toolbar .keak-scan-title,.keak-toolbar .keak-suggestion-text,.keak-toolbar .keak-suggestions-header,.keak-toolbar .keak-variation-title,.keak-toolbar h1,.keak-toolbar h2,.keak-toolbar h3{color:#f3f6fc;font-weight:700}.keak-action-btn{align-items:center;backdrop-filter:blur(8px);background:hsla(0,0%,100%,.9);border:1px solid hsl(var(--keak-border));border-radius:12px;box-shadow:0 1px 3px rgba(0,0,0,.05);color:hsl(var(--keak-foreground));cursor:pointer;display:flex;flex:1;flex-direction:column;font-size:12px;gap:6px;overflow:hidden;padding:12px 16px;position:relative;transition:all .3s cubic-bezier(.4,0,.2,1)}.keak-action-btn:before{background:linear-gradient(90deg,transparent,rgba(59,130,246,.1),transparent);content:\"\";height:100%;left:-100%;position:absolute;top:0;transition:left .5s ease;width:100%}.keak-action-btn:hover:before{left:100%}.keak-action-btn:hover{background:rgba(59,130,246,.05);border-color:hsl(var(--keak-primary));box-shadow:0 4px 20px rgba(59,130,246,.15);transform:translateY(-2px)}.keak-action-btn.active{background:linear-gradient(135deg,hsl(var(--keak-primary)),#0ea5e9);border-color:hsl(var(--keak-primary));box-shadow:0 6px 20px rgba(59,130,246,.4);color:#fff}.keak-action-btn.active:before{background:linear-gradient(90deg,transparent,hsla(0,0%,100%,.3),transparent)}.keak-action-btn span{color:hsl(var(--keak-foreground));font-weight:700;letter-spacing:.025em}.keak-toolbar-content{backdrop-filter:blur(8px);background:rgba(248,250,252,.3);flex:1;overflow-y:auto;position:relative}.keak-toolbar-content::-webkit-scrollbar-thumb{background:#2f3d5a}.keak-toolbar-content::-webkit-scrollbar-thumb:hover{background:#374151}.keak-toolbar-content:before{background:linear-gradient(180deg,rgba(59,130,246,.02),transparent 50%);bottom:0;content:\"\";left:0;pointer-events:none;position:absolute;right:0;top:0}.keak-toolbar-status{align-items:center;backdrop-filter:blur(10px);background:hsla(0,0%,100%,.95);border-top:1px solid hsl(var(--keak-border));color:hsl(var(--keak-foreground));display:flex;font-size:12px;font-weight:600;justify-content:space-between;padding:12px 20px}.keak-status-selected code{background:rgba(59,130,246,.1);border-radius:6px;color:hsl(var(--keak-foreground));font-family:JetBrains Mono,SF Mono,monospace;font-weight:700;padding:3px 8px}.keak-toolbar-status kbd{background:rgba(0,0,0,.05);border:1px solid rgba(0,0,0,.1);border-radius:6px;color:hsl(var(--keak-foreground));font-family:inherit;font-size:11px;font-weight:600;padding:3px 8px}.keak-toolbar-content::-webkit-scrollbar{width:6px}.keak-toolbar-content::-webkit-scrollbar-track{background:transparent}.keak-toolbar-content::-webkit-scrollbar-thumb{background:rgba(59,130,246,.3);border-radius:3px;-webkit-transition:background .2s ease;transition:background .2s ease}.keak-toolbar-content::-webkit-scrollbar-thumb:hover{background:rgba(59,130,246,.5)}@keyframes keak-slide-up{0%{opacity:0;transform:translateY(20px) scale(.95)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes keak-fade-in{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes keak-scale-in{0%{opacity:0;transform:scale(.9)}to{opacity:1;transform:scale(1)}}.keak-toolbar.expanded{animation:keak-slide-up .4s cubic-bezier(.34,1.56,.64,1)}@media (max-width:480px){.keak-toolbar.expanded{max-width:400px;width:calc(100vw - 32px)}}.keak-selected-highlight{background:rgba(37,99,235,.08);border:2px solid #2563eb;border-radius:8px;box-shadow:0 0 0 1px rgba(37,99,235,.1),0 4px 12px rgba(37,99,235,.15),0 2px 4px rgba(37,99,235,.1);pointer-events:none;position:absolute;transition:all .2s cubic-bezier(.4,0,.2,1);z-index:999998}.keak-selected-highlight.generating{animation:keak-shimmer 2s ease-in-out infinite;background:linear-gradient(90deg,rgba(37,99,235,.08),rgba(37,99,235,.2) 50%,rgba(37,99,235,.08));background-size:200% 100%;border-color:#2563eb;box-shadow:0 0 0 1px rgba(37,99,235,.2),0 4px 16px rgba(37,99,235,.25),0 2px 6px rgba(37,99,235,.15)}@keyframes keak-shimmer{0%{background-position:-200% 0}to{background-position:200% 0}}.keak-loading-spinner{animation:keak-spin 1s linear infinite;border:2px solid rgba(59,130,246,.2);border-radius:50%;border-top:2px solid hsl(var(--keak-primary));height:20px;width:20px}@keyframes keak-spin{to{transform:rotate(1turn)}}.keak-success-toast{background:linear-gradient(135deg,#10b981,#059669);box-shadow:0 8px 25px rgba(16,185,129,.3)}.keak-error-toast,.keak-success-toast{backdrop-filter:blur(10px);border:1px solid hsla(0,0%,100%,.2);border-radius:12px;color:#fff;font-weight:500;padding:12px 20px}.keak-error-toast{background:linear-gradient(135deg,#ef4444,#dc2626);box-shadow:0 8px 25px rgba(239,68,68,.3)}.keak-selector-highlight{background:rgba(88,152,237,.15);border:2px solid #6b7280;border-radius:4px;box-shadow:0 0 0 2px rgba(88,152,237,.25);display:none;pointer-events:none;position:absolute;transition:all .1s ease-out;z-index:999999}.keak-selector-tooltip{backdrop-filter:blur(12px);background:rgba(15,23,42,.9);border:1px solid hsla(0,0%,100%,.1);border-radius:8px;box-shadow:0 8px 25px rgba(0,0,0,.3);color:#fff;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;font-size:12px;padding:8px 14px;pointer-events:none;position:fixed;white-space:nowrap;z-index:999999}.keak-selector-tooltip code{background:rgba(59,130,246,.2);border-radius:4px;color:#60a5fa;font-family:JetBrains Mono,SF Mono,monospace;font-weight:500;padding:2px 6px}.keak-selector-instructions{align-items:center;animation:keak-fade-in .3s ease-out;background:rgba(15,23,42,.9);border:1px solid hsla(0,0%,100%,.1);border-radius:16px;box-shadow:0 12px 40px rgba(0,0,0,.4);color:#fff;display:flex;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;font-size:14px;gap:16px;left:50%;padding:16px 24px;pointer-events:none;position:fixed;top:24px;transform:translateX(-50%);z-index:999999}.keak-selector-instructions-icon{align-items:center;background:hsl(var(--keak-primary));border-radius:50%;box-shadow:0 4px 12px rgba(59,130,246,.4);display:flex;height:28px;justify-content:center;width:28px}.keak-selector-instructions kbd{background:hsla(0,0%,100%,.1);border:1px solid hsla(0,0%,100%,.2);border-radius:6px;font-size:12px;font-weight:500;margin:0 4px;padding:4px 8px}body.keak-selecting,body.keak-selecting *{cursor:crosshair!important}body.keak-selecting .keak-selector-highlight,body.keak-selecting .keak-selector-instructions,body.keak-selecting .keak-selector-tooltip,body.keak-selecting .keak-toolbar{cursor:default!important}.keak-prompt-panel{display:flex;flex-direction:column;height:100%;padding:16px}.keak-prompt-header{margin-bottom:12px}.keak-prompt-title{color:hsl(var(--keak-foreground));font-size:14px;font-weight:600;margin-bottom:8px}.keak-element-preview{background:hsla(0,0%,100%,.05);border:1px solid #2f3d5a;border-radius:4px;color:#a8b3ca;font-family:Geist,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:12px;overflow:hidden;padding:8px 12px;text-overflow:ellipsis;white-space:nowrap}.keak-main-input{display:flex;flex-direction:column;gap:12px;margin-bottom:20px}.keak-input-label{color:hsl(var(--keak-foreground));font-size:14px;font-weight:600;margin-bottom:8px}.keak-main-textarea{background:hsla(0,0%,100%,.05);border:1px solid #2f3d5a;border-radius:4px;color:#f3f6fc;font-family:Geist,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:14px;font-weight:400;line-height:1.5;min-height:100px;padding:16px;resize:vertical;transition:all .2s;width:100%}.keak-main-textarea:focus{background:hsla(0,0%,100%,.08);border-color:#374151;box-shadow:0 4px 10px 0 rgba(43,59,91,.12);outline:none}.keak-main-textarea::-moz-placeholder{color:#6b7280;opacity:1}.keak-main-textarea::placeholder{color:#6b7280;opacity:1}.keak-main-textarea:-webkit-autofill,.keak-main-textarea:-webkit-autofill:focus,.keak-main-textarea:-webkit-autofill:hover{-webkit-text-fill-color:#f3f6fc;-webkit-box-shadow:inset 0 0 0 1000px hsla(0,0%,100%,.05);-webkit-transition:background-color 5000s ease-in-out 0s;transition:background-color 5000s ease-in-out 0s}.keak-context-section{display:flex;flex-direction:column;gap:6px}.keak-context-input{background:hsla(0,0%,100%,.05);border:1px solid #2f3d5a;border-radius:4px;color:#f3f6fc;font-family:Geist,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:13px;padding:12px 16px;transition:all .2s;width:100%}.keak-context-input:focus{background:hsla(0,0%,100%,.08);border-color:#374151;box-shadow:0 4px 10px 0 rgba(43,59,91,.12);outline:none}.keak-context-input::-moz-placeholder{color:#6b7280;opacity:1}.keak-context-input::placeholder{color:#6b7280;opacity:1}.keak-context-input:-webkit-autofill,.keak-context-input:-webkit-autofill:focus,.keak-context-input:-webkit-autofill:hover{-webkit-text-fill-color:#f3f6fc;-webkit-box-shadow:inset 0 0 0 1000px hsla(0,0%,100%,.05);-webkit-transition:background-color 5000s ease-in-out 0s;transition:background-color 5000s ease-in-out 0s}.keak-optimize-section{align-items:center;display:flex;flex-direction:column;gap:8px;margin-top:20px}.keak-optimize-btn{align-items:center;background:linear-gradient(135deg,#3b82f6,#6366f1);border:none;border-radius:12px;box-shadow:0 4px 20px rgba(59,130,246,.3);color:#fff;cursor:pointer;display:flex;font-size:16px;font-weight:800;gap:10px;justify-content:center;overflow:hidden;padding:16px 24px;position:relative;text-shadow:0 1px 2px rgba(0,0,0,.1);transition:all .3s cubic-bezier(.4,0,.2,1);width:100%}.keak-optimize-btn span{color:#fff}.keak-optimize-btn:before{background:linear-gradient(90deg,transparent,hsla(0,0%,100%,.2),transparent);content:\"\";height:100%;left:-100%;position:absolute;top:0;transition:left .6s ease;width:100%}.keak-optimize-btn:hover:before{left:100%}.keak-optimize-btn:hover:not(:disabled){background:linear-gradient(135deg,#2563eb,#4f46e5);box-shadow:0 8px 30px rgba(59,130,246,.4);transform:translateY(-2px)}.keak-optimize-btn:disabled{box-shadow:none;cursor:not-allowed;opacity:.5;transform:none}.keak-optimize-btn:disabled:before{display:none}.keak-optimize-hint{color:#f3f6fc!important;font-size:11px;opacity:.7;text-align:center}.keak-optimize-hint kbd{background:hsla(0,0%,100%,.1);border:1px solid hsla(0,0%,100%,.2);border-radius:4px;font-size:10px;font-weight:500;margin:0 2px;padding:2px 6px}.keak-suggestions{flex:1;overflow-y:auto;padding-top:16px}.keak-suggestions::-webkit-scrollbar{width:6px}.keak-suggestions::-webkit-scrollbar-track{background:transparent}.keak-suggestions::-webkit-scrollbar-thumb{background:#2f3d5a;border-radius:3px}.keak-suggestions::-webkit-scrollbar-thumb:hover{background:#374151}.keak-loading{align-items:center;color:hsl(var(--keak-muted-foreground));display:flex;flex-direction:column;gap:12px;justify-content:center;padding:40px}.keak-suggestion-card{background:hsla(0,0%,100%,.05);border:1px solid #2f3d5a;border-radius:8px;box-shadow:0 4px 10px 0 rgba(43,59,91,.12);cursor:pointer;margin-bottom:12px;overflow:hidden;padding:16px;position:relative;transition:all .2s cubic-bezier(.4,0,.2,1)}.keak-suggestion-card:before{background:linear-gradient(135deg,rgba(88,152,237,.05),rgba(88,152,237,.08));bottom:0;content:\"\";left:0;opacity:0;position:absolute;right:0;top:0;transition:opacity .2s ease}.keak-suggestion-card:hover{background:hsla(0,0%,100%,.08);border-color:#374151;box-shadow:0 4px 10px 0 rgba(43,59,91,.18);transform:translateY(-2px)}.keak-suggestion-card:hover:before{opacity:1}.keak-suggestion-text{color:#f3f6fc;font-size:14px;font-weight:600;line-height:1.4;margin-bottom:8px;position:relative;text-shadow:0 1px 2px rgba(0,0,0,.05);z-index:1}.keak-suggestion-meta{align-items:center;color:#a8b3ca;display:flex;font-size:12px;font-weight:600;gap:8px;position:relative;z-index:1}.keak-suggestion-card:hover .keak-suggestion-action{opacity:1}.keak-suggestion-content-wrapper{align-items:flex-start;display:flex;gap:12px;width:100%}.keak-suggestion-badge-wrapper{flex-shrink:0}.keak-suggestion-variant-badge{align-items:center;background:rgba(88,152,237,.2);border:1px solid rgba(88,152,237,.3);border-radius:8px;box-shadow:none;color:#5898ed;display:flex;font-size:12px;font-weight:700;height:32px;justify-content:center;width:32px}.keak-suggestion-text-wrapper{flex:1;min-width:0}.keak-suggestion-action{color:#5898ed;flex-shrink:0;opacity:.6;transition:opacity .2s}.keak-variation-history{margin-bottom:12px;max-height:200px;overflow-y:auto}.keak-variation-history::-webkit-scrollbar{width:6px}.keak-variation-history::-webkit-scrollbar-track{background:transparent}.keak-variation-history::-webkit-scrollbar-thumb{background:#2f3d5a;border-radius:3px}.keak-variation-history::-webkit-scrollbar-thumb:hover{background:#374151}.keak-variation-header{align-items:center;display:flex;gap:12px;justify-content:space-between;margin-bottom:8px}.keak-variation-title{color:#f3f6fc;flex-shrink:0;font-size:13px;font-weight:700;text-shadow:0 1px 2px rgba(0,0,0,.05);white-space:nowrap}.keak-variation-actions{display:flex;flex-shrink:0;gap:8px}.keak-variation-item{background:hsla(0,0%,100%,.05);border:1px solid #2f3d5a;border-radius:8px;cursor:pointer;font-size:11px;margin-bottom:6px;padding:10px;transition:all .2s}.keak-variation-item:hover{background:hsla(0,0%,100%,.08);border-color:#374151}.keak-variation-item.selected{background:rgba(88,152,237,.15);border-color:#5898ed}.keak-variation-meta{align-items:center;display:flex;justify-content:space-between;margin-bottom:4px}.keak-variation-model{background:rgba(88,152,237,.2);border-radius:4px;color:#5898ed;font-size:9px;font-weight:600;padding:2px 6px;text-transform:uppercase}.keak-variation-time{color:#a8b3ca;font-size:9px}.keak-variation-prompt{-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;color:#f3f6fc;display:-webkit-box;font-size:10px;line-height:1.3;margin-bottom:4px;overflow:hidden}.keak-variation-count{color:#a8b3ca;font-size:9px}.keak-save-changes-section{background:rgba(88,152,237,.1);border:1px solid rgba(88,152,237,.3);border-radius:8px;margin-top:16px;padding:16px;text-align:center}.keak-save-message{color:#f3f6fc;font-size:13px;font-weight:500;margin-bottom:12px}.keak-save-changes-btn{align-items:center;background:linear-gradient(-46.0266deg,rgba(20,10,86,0) 20.511%,rgba(20,10,86,.2) 87.062%),linear-gradient(181.531deg,rgba(255,254,254,.12) 8.1705%,rgba(2,4,13,.2) 91.829%),#5898ed;border:1px solid rgba(55,65,81,.5);border-radius:4px;box-shadow:0 8px 10px 0 rgba(1,1,42,.25),inset 2px 2px 4px 0 rgba(5,5,80,.4),inset -4px -4px 10px 0 hsla(0,0%,100%,.25),inset 4px 4px 10px 0 rgba(25,18,67,.4);color:#000!important;cursor:pointer;display:flex;font-family:Geist,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:14px;font-weight:600;gap:8px;justify-content:center;padding:12px 16px;transition:all .2s;width:100%}.keak-save-changes-btn *{color:#000!important}.keak-save-changes-btn:hover{box-shadow:0 8px 10px 0 rgba(1,1,42,.25),0 0 15px rgba(88,152,237,.4),inset 2px 2px 4px 0 rgba(5,5,80,.4),inset -4px -4px 10px 0 hsla(0,0%,100%,.25),inset 4px 4px 10px 0 rgba(25,18,67,.4);transform:scale(1.01)}.keak-page-scan-panel{display:flex;flex-direction:column;height:100%;padding:16px}.keak-scan-header{margin-bottom:16px}.keak-scan-title{align-items:center;color:#f3f6fc;display:flex;font-size:14px;font-weight:600;justify-content:space-between;margin-bottom:8px}.keak-scan-stats{color:#a8b3ca;display:flex;font-size:12px;gap:16px;margin-bottom:8px}.keak-scan-actions{display:flex;gap:8px;margin-bottom:8px}.keak-scan-summary{background:rgba(59,130,246,.1);border:1px solid rgba(59,130,246,.3);border-radius:12px;font-size:12px;margin-bottom:16px;padding:16px}.keak-scan-summary-title{color:hsl(var(--keak-foreground));font-size:13px;font-weight:600;margin-bottom:6px}.keak-scan-summary-text{color:hsl(var(--keak-muted-foreground));line-height:1.4}.keak-scan-results{flex:1;overflow-y:auto}.keak-scan-results::-webkit-scrollbar{width:6px}.keak-scan-results::-webkit-scrollbar-track{background:transparent}.keak-scan-results::-webkit-scrollbar-thumb{background:#2f3d5a;border-radius:3px}.keak-scan-results::-webkit-scrollbar-thumb:hover{background:#374151}.keak-scan-loading{align-items:center;color:hsl(var(--keak-muted-foreground));display:flex;flex-direction:column;justify-content:center;padding:40px}.keak-scan-spinner{animation:keak-spin 1s linear infinite;border:3px solid hsl(var(--keak-border));border-radius:50%;border-top:3px solid #10b981;height:32px;margin-bottom:16px;width:32px}.keak-scan-progress-container{align-items:center;display:flex;flex-direction:column;gap:16px;max-width:300px;width:100%}.keak-scan-progress-bar{height:8px;width:100%}.keak-scan-progress-text{font-size:11px}.keak-no-results,.keak-scan-progress-text{color:hsl(var(--keak-muted-foreground));text-align:center}.keak-no-results{padding:40px}.keak-element-card{background:hsl(var(--keak-card));border:1px solid hsl(var(--keak-border));border-radius:12px;margin-bottom:12px;overflow:hidden;transition:all .2s}.keak-element-card:hover{border-color:#10b981;box-shadow:0 4px 12px rgba(16,185,129,.1);transform:translateY(-1px)}.keak-element-header{align-items:center;background:hsl(var(--keak-muted));border-bottom:1px solid hsl(var(--keak-border));cursor:pointer;display:flex;justify-content:space-between;padding:12px 16px;transition:all .2s}.keak-element-header:hover{background:rgba(59,130,246,.05)}.keak-element-info{align-items:center;display:flex;flex:1;gap:10px}.keak-element-tag{background:rgba(88,152,237,.2);border-radius:4px;color:#5898ed;font-size:10px;font-weight:600;padding:3px 8px;text-transform:uppercase}.keak-element-text{color:#f3f6fc;font-family:Geist,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:12px;max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.keak-navigate-icon{color:hsl(var(--keak-muted-foreground));font-size:12px;margin-left:8px}.keak-priority-badge{border-radius:6px;color:#fff;font-size:10px;font-weight:600;padding:3px 8px}.keak-suggestions-list{padding:16px}.keak-suggestions-header{align-items:center;color:hsl(var(--keak-muted-foreground));display:flex;font-size:11px;font-weight:500;gap:6px;margin-bottom:12px}.keak-suggestion-item{background:hsl(var(--keak-input));border:1px solid hsl(var(--keak-border));border-radius:8px;cursor:pointer;font-size:12px;line-height:1.4;margin-bottom:8px;padding:12px;transition:all .2s}.keak-suggestion-item:hover{background:rgba(59,130,246,.05);border-color:#10b981;transform:translateX(2px)}.keak-suggestion-item:last-child{margin-bottom:0}.keak-suggestion-item.recommended{background:linear-gradient(135deg,rgba(59,130,246,.1),rgba(99,102,241,.1));border-color:rgba(59,130,246,.3)}.keak-suggestion-content{align-items:flex-start;display:flex;gap:10px}.keak-suggestion-badge{border-radius:6px;color:#fff;flex-shrink:0;font-size:10px;font-weight:700;padding:3px 8px}.keak-suggestion-badge.recommended{background:#3b82f6}.keak-suggestion-badge.default{background:#6b7280}.keak-suggestion-text-content{flex:1;line-height:1.4}.keak-suggestion-recommended-label{color:#3b82f6;font-size:10px;font-weight:500;margin-top:4px}.keak-model-badge{align-items:center;background:rgba(59,130,246,.1);border-radius:6px;color:hsl(var(--keak-primary));display:inline-flex;font-size:10px;font-weight:600;padding:2px 8px;text-transform:uppercase}.line-clamp-2{-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.space-y-2>*+*{margin-top:.5rem}.max-h-48{max-height:12rem}.keak-experiment-panel{display:flex;flex-direction:column;height:100%;padding:16px}.keak-experiment-form{display:flex;flex-direction:column;gap:12px}.keak-form-group{display:flex;flex-direction:column;gap:6px}.keak-form-label{color:hsl(var(--keak-muted-foreground));font-size:12px;font-weight:500}.keak-form-input{background:hsl(var(--keak-input));border:1px solid hsl(var(--keak-border));border-radius:8px;color:hsl(var(--keak-foreground));font-size:13px;padding:12px 16px;transition:all .2s}.keak-form-input:focus{border-color:hsl(var(--keak-primary));box-shadow:0 0 0 3px rgba(59,130,246,.1);outline:none}.keak-variants-section{flex:1;overflow-y:auto}.keak-variants-section::-webkit-scrollbar{width:6px}.keak-variants-section::-webkit-scrollbar-track{background:transparent}.keak-variants-section::-webkit-scrollbar-thumb{background:#2f3d5a;border-radius:3px}.keak-variants-section::-webkit-scrollbar-thumb:hover{background:#374151}.keak-variant-card{background:hsl(var(--keak-card));border:1px solid hsl(var(--keak-border));border-radius:8px;margin-bottom:8px;padding:12px}.keak-variant-header{align-items:center;display:flex;justify-content:space-between;margin-bottom:8px}.keak-variant-name{color:hsl(var(--keak-foreground));font-size:13px;font-weight:500}.keak-variant-content{background:hsl(var(--keak-input));border:1px solid hsl(var(--keak-border));border-radius:8px;color:hsl(var(--keak-foreground));font-family:JetBrains Mono,SF Mono,monospace;font-size:12px;min-height:60px;padding:12px;resize:vertical;width:100%}.keak-experiment-actions{display:flex;gap:8px;margin-top:16px}.keak-experiment-list{flex:1;overflow-y:auto}.keak-experiment-list::-webkit-scrollbar{width:6px}.keak-experiment-list::-webkit-scrollbar-track{background:transparent}.keak-experiment-list::-webkit-scrollbar-thumb{background:#2f3d5a;border-radius:3px}.keak-experiment-list::-webkit-scrollbar-thumb:hover{background:#374151}.keak-experiment-item{background:hsl(var(--keak-card));border:1px solid hsl(var(--keak-border));border-radius:8px;cursor:pointer;margin-bottom:8px;padding:12px;transition:all .2s}.keak-experiment-item:hover{background:rgba(59,130,246,.02);border-color:hsl(var(--keak-primary))}.keak-experiment-name{color:hsl(var(--keak-foreground));font-weight:500}.keak-experiment-url{align-items:center;display:flex;font-size:10px;gap:4px;margin-top:4px;opacity:.7}.keak-experiment-url,.keak-no-element{color:hsl(var(--keak-muted-foreground))}.keak-no-element{padding:20px;text-align:center}.keak-metrics-panel{display:flex;flex-direction:column;height:100%;padding:16px}.keak-metrics-header{align-items:center;display:flex;justify-content:space-between;margin-bottom:16px}.keak-metrics-title{color:hsl(var(--keak-foreground));font-size:14px;font-weight:600}.keak-time-selector{background:hsl(var(--keak-muted));border-radius:6px;display:flex;gap:4px;padding:2px}.keak-time-option{background:transparent;border:none;border-radius:4px;color:hsl(var(--keak-muted-foreground));cursor:pointer;font-size:11px;font-weight:500;padding:4px 8px;transition:all .2s}.keak-time-option.active{background:hsl(var(--keak-primary));color:#fff}.keak-metrics-list{flex:1;overflow-y:auto}.keak-metrics-list::-webkit-scrollbar{width:6px}.keak-metrics-list::-webkit-scrollbar-track{background:transparent}.keak-metrics-list::-webkit-scrollbar-thumb{background:#2f3d5a;border-radius:3px}.keak-metrics-list::-webkit-scrollbar-thumb:hover{background:#374151}.keak-metric-card{background:hsl(var(--keak-card));border:1px solid hsl(var(--keak-border));border-radius:8px;cursor:pointer;margin-bottom:8px;padding:12px;transition:all .2s}.keak-metric-card:hover{background:rgba(59,130,246,.02);border-color:hsl(var(--keak-primary))}.keak-metric-card.selected{background:rgba(59,130,246,.05);border-color:hsl(var(--keak-primary))}.keak-empty-state{color:hsl(var(--keak-muted-foreground));padding:40px 20px;text-align:center}.keak-multi-element-toggle{background:hsla(0,0%,100%,.95);border:1px solid hsl(var(--keak-border));border-radius:12px;margin-bottom:16px;padding:20px}.keak-toggle-header{margin-bottom:16px;text-align:center}.keak-toggle-title{color:hsl(var(--keak-foreground));font-size:16px;font-weight:700;margin-bottom:6px}.keak-toggle-info{color:hsl(var(--keak-muted-foreground));font-size:12px;font-weight:500}.keak-version-toggle{background:hsl(var(--keak-muted));border-radius:10px;display:flex;gap:12px;margin-bottom:20px;padding:4px}.keak-version-btn{background:transparent;border:none;border-radius:8px;color:hsl(var(--keak-muted-foreground));cursor:pointer;flex:1;font-size:14px;font-weight:600;overflow:hidden;padding:12px 16px;position:relative;transition:all .2s ease}.keak-version-btn:hover:not(:disabled){background:rgba(59,130,246,.1);color:hsl(var(--keak-primary))}.keak-version-btn.active{background:linear-gradient(135deg,hsl(var(--keak-primary)),#0ea5e9);box-shadow:0 4px 12px rgba(59,130,246,.3);color:#fff}.keak-version-btn:disabled{cursor:not-allowed;opacity:.6}.keak-version-btn:before{background:linear-gradient(90deg,transparent,hsla(0,0%,100%,.2),transparent);content:\"\";height:100%;left:-100%;position:absolute;top:0;transition:left .5s ease;width:100%}.keak-version-btn.active:hover:before{left:100%}@keyframes slideDown{0%{opacity:0;transform:translateX(-50%) translateY(-20px)}to{opacity:1;transform:translateX(-50%) translateY(0)}}.keak-map-warning{animation:slideDown .3s ease-out}@media (max-width:480px){.keak-quick-actions{flex-direction:column}.keak-element-info{align-items:flex-start}.keak-element-info,.keak-suggestions-content{flex-direction:column;gap:6px}.keak-version-toggle{flex-direction:column;gap:8px}}";
1675
1675
  styleInject(css_248z);
1676
1676
 
1677
+ // Source mapping telemetry tracking
1678
+ const sourceMappingTelemetry = {
1679
+ fiberSuccess: 0,
1680
+ fiberFailed: 0,
1681
+ babelUsed: 0,
1682
+ noMapping: 0,
1683
+ getTotalAttempts: function () {
1684
+ return this.fiberSuccess + this.fiberFailed + this.babelUsed + this.noMapping;
1685
+ },
1686
+ getFiberSuccessRate: function () {
1687
+ const total = this.getTotalAttempts();
1688
+ return total > 0 ? ((this.fiberSuccess / total) * 100).toFixed(1) : '0';
1689
+ },
1690
+ logStats: function () {
1691
+ const total = this.getTotalAttempts();
1692
+ if (total > 0) {
1693
+ console.log('[Keak Telemetry] Source Mapping Statistics:', {
1694
+ totalAttempts: total,
1695
+ fiberSuccess: `${this.fiberSuccess} (${((this.fiberSuccess / total) * 100).toFixed(1)}%)`,
1696
+ fiberFailed: `${this.fiberFailed} (${((this.fiberFailed / total) * 100).toFixed(1)}%)`,
1697
+ babelUsed: `${this.babelUsed} (${((this.babelUsed / total) * 100).toFixed(1)}%)`,
1698
+ noMapping: `${this.noMapping} (${((this.noMapping / total) * 100).toFixed(1)}%)`
1699
+ });
1700
+ }
1701
+ }
1702
+ };
1703
+ // Log stats every 10 selections
1704
+ let selectionCount = 0;
1677
1705
  const KeakToolbar = ({ position = 'bottom-right', theme = 'auto' }) => {
1678
1706
  const [selectedElement, setSelectedElement] = useState(null);
1679
1707
  const [isSelecting, setIsSelecting] = useState(false);
@@ -1796,6 +1824,8 @@ const KeakToolbar = ({ position = 'bottom-right', theme = 'auto' }) => {
1796
1824
  componentName: fiberSource.componentName,
1797
1825
  confidence: getSourceConfidence(fiberSource)
1798
1826
  };
1827
+ // Track Fiber success
1828
+ sourceMappingTelemetry.fiberSuccess++;
1799
1829
  }
1800
1830
  else {
1801
1831
  // Fallback to data-keak-src attribute from Babel plugin
@@ -1823,11 +1853,22 @@ const KeakToolbar = ({ position = 'bottom-right', theme = 'auto' }) => {
1823
1853
  confidence: 'high'
1824
1854
  };
1825
1855
  console.log('[Keak Toolbar] elementData.sourceMapping:', elementData.sourceMapping);
1856
+ // Track Babel fallback usage
1857
+ sourceMappingTelemetry.fiberFailed++;
1858
+ sourceMappingTelemetry.babelUsed++;
1826
1859
  }
1827
1860
  else {
1828
1861
  console.log('[Keak Toolbar] ❌ No source mapping found - no data-keak-src attribute in DOM');
1862
+ // Track complete failure (Fiber failed, no Babel either)
1863
+ sourceMappingTelemetry.fiberFailed++;
1864
+ sourceMappingTelemetry.noMapping++;
1829
1865
  }
1830
1866
  }
1867
+ // Log telemetry stats every 10 selections
1868
+ selectionCount++;
1869
+ if (selectionCount % 10 === 0) {
1870
+ sourceMappingTelemetry.logStats();
1871
+ }
1831
1872
  console.log('[Keak Toolbar] ========== END DEBUG ==========');
1832
1873
  // Send to IDE
1833
1874
  if (keakCodeClientRef.current && keakCodeClientRef.current.isConnected()) {
@@ -2025,28 +2066,30 @@ var KeakToolbar$1 = /*#__PURE__*/Object.freeze({
2025
2066
  });
2026
2067
 
2027
2068
  const Conversion = ({ children, type = 'custom', category, label, value, metadata = {}, disabled = false }) => {
2028
- const { trackEvent } = useKeak();
2069
+ // In production, render children without tracking
2070
+ const isProduction = typeof process !== 'undefined' && process.env.NODE_ENV === 'production';
2029
2071
  const elementRef = useRef(null);
2030
2072
  const conversionId = useRef(`conv_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`);
2031
2073
  useEffect(() => {
2032
- // Track conversion element exposure
2033
- if (!disabled) {
2034
- trackEvent('conversion_exposure', {
2035
- conversionId: conversionId.current,
2036
- type,
2037
- category,
2038
- label,
2039
- metadata: {
2040
- ...metadata,
2041
- timestamp: new Date().toISOString(),
2042
- url: window.location.href,
2043
- referrer: document.referrer
2044
- }
2045
- });
2046
- }
2047
- }, [trackEvent, type, category, label, metadata, disabled]);
2074
+ // Skip tracking in production
2075
+ if (isProduction || disabled)
2076
+ return;
2077
+ // Track conversion element exposure (event tracking is disabled in SDK, this is a no-op)
2078
+ keak.track('conversion_exposure', {
2079
+ conversionId: conversionId.current,
2080
+ type,
2081
+ category,
2082
+ label,
2083
+ metadata: {
2084
+ ...metadata,
2085
+ timestamp: new Date().toISOString(),
2086
+ url: window.location.href,
2087
+ referrer: document.referrer
2088
+ }
2089
+ });
2090
+ }, [isProduction, type, category, label, metadata, disabled]);
2048
2091
  const handleClick = (event) => {
2049
- if (disabled)
2092
+ if (disabled || isProduction)
2050
2093
  return;
2051
2094
  // Extract additional context from the clicked element
2052
2095
  event.currentTarget;
@@ -2598,10 +2641,9 @@ function buildSourcePathInjection(mapping) {
2598
2641
  return `(${sourcePathInjectionRuntime.toString()})(${mappingJson});`;
2599
2642
  }
2600
2643
 
2601
- // Context for Keak configuration
2602
- const KeakContext = createContext(null);
2603
2644
  // Global Keak instance
2604
2645
  let keakInstance = null;
2646
+ let toolbarInitialized = false;
2605
2647
  class KeakSDK {
2606
2648
  constructor(config) {
2607
2649
  this.assignments = {};
@@ -2625,7 +2667,6 @@ class KeakSDK {
2625
2667
  if (this.config.debug) {
2626
2668
  console.log('Keak SDK initialized successfully', {
2627
2669
  assignments: this.assignments,
2628
- apiKey: this.config.apiKey,
2629
2670
  userId: this.userId
2630
2671
  });
2631
2672
  }
@@ -2963,167 +3004,149 @@ class KeakSDK {
2963
3004
  }));
2964
3005
  }
2965
3006
  }
2966
- // Keak Provider Component
2967
- function KeakProvider({ config = {}, children, showToolbar = false, // Changed to false - users should add <KeakToolbar /> manually
2968
- toolbarConfig }) {
2969
- const [assignments, setAssignments] = useState({});
3007
+ /**
3008
+ * Main Keak hook - initializes the SDK with minimal configuration
3009
+ * Similar to react-source-lens's useReactSourceLens() hook
3010
+ *
3011
+ * @example
3012
+ * // Minimal usage (no config needed)
3013
+ * useKeak();
3014
+ *
3015
+ * @example
3016
+ * // With IDE integration
3017
+ * useKeak({
3018
+ * projectRoot: '/absolute/path/to/project',
3019
+ * editor: 'vscode'
3020
+ * });
3021
+ */
3022
+ function useKeak(config = {}) {
2970
3023
  useEffect(() => {
2971
- if (!keakInstance) {
2972
- // Detect development mode
2973
- const isDevelopment = process.env.NODE_ENV === 'development' ||
2974
- window.location.hostname === 'localhost' ||
2975
- window.location.hostname === '127.0.0.1';
2976
- const finalConfig = {
2977
- apiKey: config.apiKey || 'keak_dev_key_12345',
2978
- debug: config.debug !== undefined ? config.debug : isDevelopment,
2979
- ...config
2980
- };
2981
- keakInstance = new KeakSDK(finalConfig);
2982
- keakInstance.init().then(() => {
2983
- setAssignments(keakInstance?.assignments || {});
2984
- // Expose SDK on window.keak for external access (e.g., from iframe parent)
2985
- if (typeof window !== 'undefined') {
2986
- window.keak = keak;
2987
- }
2988
- // Set up message handler for HTML extraction requests (from Keak Code)
2989
- // This allows Keak Code to extract rendered HTML from the iframe
2990
- if (typeof window !== 'undefined' && !window.__KEAK_HTML_EXTRACTOR_SETUP__) {
2991
- window.__KEAK_HTML_EXTRACTOR_SETUP__ = true;
2992
- const handleExtractHTMLRequest = async (event) => {
2993
- // Only handle messages from parent window (Keak Code)
2994
- if (event.data?.type === 'KEAK_EXTRACT_HTML_REQUEST' && event.source === window.parent) {
2995
- const { requestId, experimentName, dataKeakId, variantName } = event.data;
2996
- try {
2997
- // Set the variant
2998
- if (keakInstance) {
2999
- keakInstance.setExperimentVariant(experimentName, variantName);
3000
- }
3001
- // Wait for React to re-render
3002
- await new Promise(resolve => {
3003
- setTimeout(() => {
3024
+ // Check if in production - if so, skip initialization
3025
+ if (typeof process !== 'undefined' && process.env.NODE_ENV === 'production') {
3026
+ return;
3027
+ }
3028
+ // Only initialize once
3029
+ if (keakInstance) {
3030
+ return;
3031
+ }
3032
+ // Detect development mode
3033
+ const isDevelopment = process.env.NODE_ENV === 'development' ||
3034
+ (typeof window !== 'undefined' && window.location.hostname === 'localhost') ||
3035
+ (typeof window !== 'undefined' && window.location.hostname === '127.0.0.1');
3036
+ const finalConfig = {
3037
+ debug: config.debug !== undefined ? config.debug : isDevelopment,
3038
+ showToolbar: config.showToolbar !== undefined ? config.showToolbar : isDevelopment,
3039
+ ...config
3040
+ };
3041
+ keakInstance = new KeakSDK(finalConfig);
3042
+ keakInstance.init().then(() => {
3043
+ // Expose SDK on window.keak for external access (e.g., from iframe parent)
3044
+ if (typeof window !== 'undefined') {
3045
+ window.keak = keak;
3046
+ }
3047
+ // Set up message handler for HTML extraction requests (from Keak Code)
3048
+ // This allows Keak Code to extract rendered HTML from the iframe
3049
+ if (typeof window !== 'undefined' && !window.__KEAK_HTML_EXTRACTOR_SETUP__) {
3050
+ window.__KEAK_HTML_EXTRACTOR_SETUP__ = true;
3051
+ const handleExtractHTMLRequest = async (event) => {
3052
+ // Only handle messages from parent window (Keak Code)
3053
+ if (event.data?.type === 'KEAK_EXTRACT_HTML_REQUEST' && event.source === window.parent) {
3054
+ const { requestId, experimentName, dataKeakId, variantName } = event.data;
3055
+ try {
3056
+ // Set the variant
3057
+ if (keakInstance) {
3058
+ keakInstance.setExperimentVariant(experimentName, variantName);
3059
+ }
3060
+ // Wait for React to re-render
3061
+ await new Promise(resolve => {
3062
+ setTimeout(() => {
3063
+ requestAnimationFrame(() => {
3004
3064
  requestAnimationFrame(() => {
3005
- requestAnimationFrame(() => {
3006
- resolve(undefined);
3007
- });
3065
+ resolve(undefined);
3008
3066
  });
3009
- }, 300); // Increased wait time
3010
- });
3011
- // Find the element with retries (in case it's still rendering)
3012
- let element = null;
3013
- let attempts = 0;
3014
- const maxAttempts = 10;
3015
- while (!element && attempts < maxAttempts) {
3016
- element = document.querySelector(`[data-keak-id="${dataKeakId}"]`);
3017
- if (!element) {
3018
- attempts++;
3019
- if (attempts < maxAttempts) {
3020
- // Wait a bit before retrying
3021
- await new Promise(resolve => setTimeout(resolve, 200));
3022
- }
3023
- }
3024
- }
3067
+ });
3068
+ }, 300);
3069
+ });
3070
+ // Find the element with retries
3071
+ let element = null;
3072
+ let attempts = 0;
3073
+ const maxAttempts = 10;
3074
+ while (!element && attempts < maxAttempts) {
3075
+ element = document.querySelector(`[data-keak-id="${dataKeakId}"]`);
3025
3076
  if (!element) {
3026
- // Log available data-keak-id elements for debugging
3027
- const allKeakIds = Array.from(document.querySelectorAll('[data-keak-id]')).map(el => el.getAttribute('data-keak-id'));
3028
- window.parent.postMessage({
3029
- type: 'KEAK_EXTRACT_HTML_RESPONSE',
3030
- requestId,
3031
- success: false,
3032
- error: `Element with data-keak-id="${dataKeakId}" not found on ${window.location.pathname}. Available elements: ${allKeakIds.length > 0 ? allKeakIds.join(', ') : 'none'}`
3033
- }, '*');
3034
- return;
3035
- }
3036
- const html = element.innerHTML;
3037
- if (!html || html.trim().length === 0) {
3038
- window.parent.postMessage({
3039
- type: 'KEAK_EXTRACT_HTML_RESPONSE',
3040
- requestId,
3041
- success: false,
3042
- error: 'Element has no content (empty innerHTML)'
3043
- }, '*');
3044
- return;
3077
+ attempts++;
3078
+ if (attempts < maxAttempts) {
3079
+ await new Promise(resolve => setTimeout(resolve, 200));
3080
+ }
3045
3081
  }
3046
- // Clean up runtime attributes
3047
- const tempDiv = document.createElement('div');
3048
- tempDiv.innerHTML = html;
3049
- const allElements = tempDiv.querySelectorAll('*');
3050
- allElements.forEach(el => {
3051
- Array.from(el.attributes).forEach(attr => {
3052
- if (attr.name.startsWith('data-headlessui-') ||
3053
- attr.name === 'data-selected' ||
3054
- attr.name.startsWith('data-m=')) {
3055
- el.removeAttribute(attr.name);
3056
- }
3057
- });
3058
- });
3059
- const cleanedHTML = tempDiv.innerHTML;
3060
- // Send response back to parent
3082
+ }
3083
+ if (!element) {
3084
+ const allKeakIds = Array.from(document.querySelectorAll('[data-keak-id]')).map(el => el.getAttribute('data-keak-id'));
3061
3085
  window.parent.postMessage({
3062
3086
  type: 'KEAK_EXTRACT_HTML_RESPONSE',
3063
3087
  requestId,
3064
- success: true,
3065
- html: cleanedHTML
3088
+ success: false,
3089
+ error: `Element with data-keak-id="${dataKeakId}" not found on ${window.location.pathname}. Available elements: ${allKeakIds.length > 0 ? allKeakIds.join(', ') : 'none'}`
3066
3090
  }, '*');
3091
+ return;
3067
3092
  }
3068
- catch (error) {
3093
+ const html = element.innerHTML;
3094
+ if (!html || html.trim().length === 0) {
3069
3095
  window.parent.postMessage({
3070
3096
  type: 'KEAK_EXTRACT_HTML_RESPONSE',
3071
3097
  requestId,
3072
3098
  success: false,
3073
- error: error instanceof Error ? error.message : String(error)
3099
+ error: 'Element has no content (empty innerHTML)'
3074
3100
  }, '*');
3101
+ return;
3075
3102
  }
3103
+ // Clean up runtime attributes
3104
+ const tempDiv = document.createElement('div');
3105
+ tempDiv.innerHTML = html;
3106
+ const allElements = tempDiv.querySelectorAll('*');
3107
+ allElements.forEach(el => {
3108
+ Array.from(el.attributes).forEach(attr => {
3109
+ if (attr.name.startsWith('data-headlessui-') ||
3110
+ attr.name === 'data-selected' ||
3111
+ attr.name.startsWith('data-m=')) {
3112
+ el.removeAttribute(attr.name);
3113
+ }
3114
+ });
3115
+ });
3116
+ const cleanedHTML = tempDiv.innerHTML;
3117
+ window.parent.postMessage({
3118
+ type: 'KEAK_EXTRACT_HTML_RESPONSE',
3119
+ requestId,
3120
+ success: true,
3121
+ html: cleanedHTML
3122
+ }, '*');
3123
+ }
3124
+ catch (error) {
3125
+ window.parent.postMessage({
3126
+ type: 'KEAK_EXTRACT_HTML_RESPONSE',
3127
+ requestId,
3128
+ success: false,
3129
+ error: error instanceof Error ? error.message : String(error)
3130
+ }, '*');
3076
3131
  }
3077
- };
3078
- window.addEventListener('message', handleExtractHTMLRequest);
3079
- }
3080
- // DON'T auto-initialize toolbar - user should add <KeakToolbar /> manually
3081
- // This prevents duplicate toolbars
3082
- // If you want auto-init, set showToolbar={true} and don't add manual <KeakToolbar />
3083
- if (showToolbar && !document.getElementById('keak-toolbar-root')) {
3084
- // Only auto-init if no manual toolbar exists
3085
- const hasManualToolbar = document.querySelector('.keak-toolbar');
3086
- if (!hasManualToolbar) {
3087
- initializeToolbar(toolbarConfig);
3088
3132
  }
3089
- }
3090
- });
3091
- }
3092
- }, [config, showToolbar, toolbarConfig]);
3093
- const trackEvent = useCallback((eventName, properties) => {
3094
- keakInstance?.trackEvent(eventName, properties);
3095
- }, []);
3096
- const contextValue = useMemo(() => ({
3097
- config: keakInstance?.config,
3098
- assignments,
3099
- trackEvent,
3100
- }), [assignments, trackEvent]);
3101
- return (jsx(KeakContext.Provider, { value: contextValue, children: children }));
3102
- }
3103
- // Hook to use Keak context
3104
- function useKeak() {
3105
- const context = useContext(KeakContext);
3106
- if (!context) {
3107
- throw new Error('useKeak must be used within a KeakProvider');
3108
- }
3109
- return context;
3110
- }
3111
- // Hook for experiment usage
3112
- function useExperiment(experimentKey) {
3113
- const { assignments, trackEvent } = useKeak();
3114
- const variant = assignments[experimentKey] || 'control';
3115
- const track = useCallback((eventName, properties) => {
3116
- trackEvent(eventName, {
3117
- ...properties,
3118
- experiment_key: experimentKey,
3119
- variant_key: variant,
3133
+ };
3134
+ window.addEventListener('message', handleExtractHTMLRequest);
3135
+ }
3136
+ // Initialize toolbar if showToolbar is enabled
3137
+ if (finalConfig.showToolbar && !toolbarInitialized) {
3138
+ initializeToolbar({
3139
+ position: 'bottom-right',
3140
+ theme: 'auto'
3141
+ });
3142
+ }
3120
3143
  });
3121
- }, [trackEvent, experimentKey, variant]);
3122
- return {
3123
- variant,
3124
- track,
3125
- isInExperiment: variant !== 'control',
3126
- };
3144
+ // Cleanup on unmount
3145
+ return () => {
3146
+ // Keep instance alive for session, don't destroy
3147
+ };
3148
+ }, []); // Empty deps - only run once
3149
+ return keakInstance;
3127
3150
  }
3128
3151
  // Variant Component
3129
3152
  const Variant = ({ children }) => {
@@ -3174,9 +3197,14 @@ function detectVariantElements(children) {
3174
3197
  return false;
3175
3198
  });
3176
3199
  }
3177
- // Experiment Component
3200
+ // Experiment Component
3178
3201
  const Experiment = ({ name, children, active = true }) => {
3179
- const { assignments } = useKeak();
3202
+ // In production, render children as-is (no experiment logic)
3203
+ if (typeof process !== 'undefined' && process.env.NODE_ENV === 'production') {
3204
+ return jsx(Fragment, { children: children });
3205
+ }
3206
+ // Access global SDK instance directly (no context needed)
3207
+ const assignments = keakInstance?.assignments || {};
3180
3208
  // Use enhanced variant detection
3181
3209
  const variantElements = detectVariantElements(children);
3182
3210
  // Extract comprehensive variant metadata
@@ -3331,14 +3359,9 @@ const Experiment = ({ name, children, active = true }) => {
3331
3359
  };
3332
3360
  // Global SDK functions (for non-React usage)
3333
3361
  const keak = {
3334
- init: (config) => {
3362
+ init: (config = {}) => {
3335
3363
  if (!keakInstance) {
3336
- // Use default development API key if none provided
3337
- const finalConfig = {
3338
- ...config,
3339
- apiKey: config.apiKey || 'keak_dev_key_12345'
3340
- };
3341
- keakInstance = new KeakSDK(finalConfig);
3364
+ keakInstance = new KeakSDK(config);
3342
3365
  return keakInstance.init().then(() => {
3343
3366
  // Expose SDK on window.keak for external access (e.g., from iframe parent)
3344
3367
  if (typeof window !== 'undefined') {
@@ -3404,12 +3427,10 @@ const keak = {
3404
3427
  return keakInstance.getAllImpressions();
3405
3428
  },
3406
3429
  };
3407
- // Initialize toolbar automatically when SDK is initialized
3408
- let toolbarInitialized = false;
3430
+ // Initialize toolbar (called by useKeak hook)
3409
3431
  function initializeToolbar(config) {
3410
3432
  if (toolbarInitialized || typeof window === 'undefined')
3411
3433
  return;
3412
- // Show toolbar by default when called explicitly
3413
3434
  // Check for development mode or explicit enabling
3414
3435
  const isDevelopment = (typeof process !== 'undefined' && process.env.NODE_ENV === 'development') ||
3415
3436
  (typeof window !== 'undefined' && window.location.hostname === 'localhost') ||
@@ -3431,18 +3452,11 @@ function initializeToolbar(config) {
3431
3452
  document.body.appendChild(toolbarRoot);
3432
3453
  // Use React 18's createRoot API
3433
3454
  const root = ReactDOMClient.createRoot(toolbarRoot);
3434
- root.render(React.createElement(KeakContext.Provider, {
3435
- value: {
3436
- config: keakInstance?.config,
3437
- assignments: keakInstance?.assignments || {},
3438
- trackEvent: (eventName, properties) => {
3439
- keakInstance?.trackEvent(eventName, properties);
3440
- }
3441
- }
3442
- }, React.createElement(KeakToolbar, {
3455
+ // Toolbar no longer needs context - it accesses keakInstance directly
3456
+ root.render(React.createElement(KeakToolbar, {
3443
3457
  position: config?.position || 'bottom-right',
3444
3458
  theme: config?.theme || 'auto'
3445
- })));
3459
+ }));
3446
3460
  toolbarInitialized = true;
3447
3461
  }).catch(error => {
3448
3462
  console.error('[Keak] Failed to load React/ReactDOM:', error);
@@ -3452,5 +3466,5 @@ function initializeToolbar(config) {
3452
3466
  });
3453
3467
  }
3454
3468
 
3455
- export { Conversion, Experiment, KeakProvider, KeakToolbar, Variant, buildSourcePathInjection, initializeToolbar, keak, useExperiment, useKeak };
3469
+ export { Conversion, Experiment, KeakToolbar, Variant, buildSourcePathInjection, initializeToolbar, keak, useKeak };
3456
3470
  //# sourceMappingURL=index.js.map