@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/README.md +102 -7
- package/dist/Conversion.d.ts.map +1 -1
- package/dist/index.cjs.js +199 -187
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +55 -22
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +201 -187
- package/dist/index.js.map +1 -1
- package/dist/toolbar/KeakToolbar.d.ts.map +1 -1
- package/dist/toolbar.js +41 -0
- package/dist/toolbar.js.map +1 -1
- package/package.json +2 -1
- package/src/cli/ai-helper.js +117 -39
- package/src/cli/install.js +251 -152
- package/src/plugins/babel-source-inject.cjs +55 -131
- package/src/plugins/next.cjs +48 -221
- package/src/plugins/webpack-loader-babel/index.js +43 -117
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
|
|
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
|
-
|
|
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
|
-
//
|
|
2033
|
-
if (
|
|
2034
|
-
|
|
2035
|
-
|
|
2036
|
-
|
|
2037
|
-
|
|
2038
|
-
|
|
2039
|
-
|
|
2040
|
-
|
|
2041
|
-
|
|
2042
|
-
|
|
2043
|
-
|
|
2044
|
-
|
|
2045
|
-
|
|
2046
|
-
|
|
2047
|
-
|
|
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
|
-
|
|
2967
|
-
|
|
2968
|
-
|
|
2969
|
-
|
|
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
|
|
2972
|
-
|
|
2973
|
-
|
|
2974
|
-
|
|
2975
|
-
|
|
2976
|
-
|
|
2977
|
-
|
|
2978
|
-
|
|
2979
|
-
|
|
2980
|
-
|
|
2981
|
-
|
|
2982
|
-
|
|
2983
|
-
|
|
2984
|
-
|
|
2985
|
-
|
|
2986
|
-
|
|
2987
|
-
|
|
2988
|
-
|
|
2989
|
-
|
|
2990
|
-
|
|
2991
|
-
|
|
2992
|
-
|
|
2993
|
-
|
|
2994
|
-
|
|
2995
|
-
|
|
2996
|
-
|
|
2997
|
-
|
|
2998
|
-
|
|
2999
|
-
|
|
3000
|
-
|
|
3001
|
-
|
|
3002
|
-
|
|
3003
|
-
|
|
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
|
-
|
|
3006
|
-
resolve(undefined);
|
|
3007
|
-
});
|
|
3065
|
+
resolve(undefined);
|
|
3008
3066
|
});
|
|
3009
|
-
}
|
|
3010
|
-
});
|
|
3011
|
-
|
|
3012
|
-
|
|
3013
|
-
|
|
3014
|
-
|
|
3015
|
-
|
|
3016
|
-
|
|
3017
|
-
|
|
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
|
-
|
|
3027
|
-
|
|
3028
|
-
|
|
3029
|
-
|
|
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
|
-
|
|
3047
|
-
|
|
3048
|
-
|
|
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:
|
|
3065
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
3093
|
-
|
|
3094
|
-
|
|
3095
|
-
|
|
3096
|
-
|
|
3097
|
-
|
|
3098
|
-
|
|
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
|
-
|
|
3122
|
-
|
|
3123
|
-
|
|
3124
|
-
|
|
3125
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
3435
|
-
|
|
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,
|
|
3469
|
+
export { Conversion, Experiment, KeakToolbar, Variant, buildSourcePathInjection, initializeToolbar, keak, useKeak };
|
|
3456
3470
|
//# sourceMappingURL=index.js.map
|