@vite-plugin-opencode-assistant/components 1.0.23 → 1.0.25
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/es/index.d.ts +1 -1
- package/es/index.js +1 -1
- package/es/open-code-widget/composables/use-widget.d.ts +0 -1
- package/es/open-code-widget/composables/use-widget.js +0 -1
- package/es/open-code-widget/src/components/FloatingBubble/FloatingBubble-sfc.css +1 -0
- package/es/open-code-widget/src/components/FloatingBubble/FloatingBubble.vue.d.ts +44 -0
- package/es/open-code-widget/src/components/FloatingBubble/FloatingBubble.vue.js +309 -0
- package/es/open-code-widget/src/components/FloatingBubble/index.d.ts +3 -0
- package/es/open-code-widget/src/components/FloatingBubble/index.js +5 -0
- package/es/open-code-widget/src/components/FloatingBubble/types.d.ts +24 -0
- package/es/open-code-widget/src/components/FloatingBubble/types.js +0 -0
- package/es/open-code-widget/src/components/Trigger-sfc.css +1 -1
- package/es/open-code-widget/src/components/Trigger.vue.d.ts +21 -3
- package/es/open-code-widget/src/components/Trigger.vue.js +127 -48
- package/es/open-code-widget/src/index-sfc.css +1 -1
- package/es/open-code-widget/src/index.vue.d.ts +10 -11
- package/es/open-code-widget/src/index.vue.js +82 -17
- package/es/open-code-widget/src/types.d.ts +1 -2
- package/lib/@vite-plugin-opencode-assistant/components.cjs.js +562 -99
- package/lib/@vite-plugin-opencode-assistant/components.es.js +558 -95
- package/lib/components.css +3 -2
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -1
- package/lib/open-code-widget/composables/use-widget.d.ts +0 -1
- package/lib/open-code-widget/composables/use-widget.js +0 -1
- package/lib/open-code-widget/src/components/FloatingBubble/FloatingBubble-sfc.css +1 -0
- package/lib/open-code-widget/src/components/FloatingBubble/FloatingBubble.vue.d.ts +44 -0
- package/lib/open-code-widget/src/components/FloatingBubble/FloatingBubble.vue.js +326 -0
- package/lib/open-code-widget/src/components/FloatingBubble/index.d.ts +3 -0
- package/lib/open-code-widget/src/components/FloatingBubble/index.js +35 -0
- package/lib/open-code-widget/src/components/FloatingBubble/types.d.ts +24 -0
- package/lib/open-code-widget/src/components/FloatingBubble/types.js +15 -0
- package/lib/open-code-widget/src/components/Trigger-sfc.css +1 -1
- package/lib/open-code-widget/src/components/Trigger.vue.d.ts +21 -3
- package/lib/open-code-widget/src/components/Trigger.vue.js +137 -48
- package/lib/open-code-widget/src/index-sfc.css +1 -1
- package/lib/open-code-widget/src/index.vue.d.ts +10 -11
- package/lib/open-code-widget/src/index.vue.js +80 -15
- package/lib/open-code-widget/src/types.d.ts +1 -2
- package/lib/web-types.json +1 -1
- package/package.json +2 -2
package/lib/components.css
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
.opencode-widget{--oc-bg-main: #ffffff;--oc-bg-secondary: #f8f9fa;--oc-bg-tertiary: #f3f4f6;--oc-overlay-bg: rgba(255, 255, 255, .9);--oc-bg-inverse: #1e1e1e;--oc-text-primary: #282828;--oc-text-secondary: #4b5563;--oc-text-tertiary: #6b7280;--oc-text-placeholder: #9ca3af;--oc-text-inverse: #ffffff;--oc-border-primary: #e5e7eb;--oc-border-secondary: #d1d5db;--oc-primary: #3b82f6;--oc-primary-hover: #2563eb;--oc-primary-bg: rgba(59, 130, 246, .1);--oc-danger: #ef4444;--oc-danger-hover: #dc2626;--oc-danger-active: #b91c1c;--oc-success: #10b981;--oc-overlay: rgba(0, 0, 0, .5);--oc-tooltip-bg: #1e1e1e;--oc-dialog-overlay: rgba(0, 0, 0, .5);--oc-thinking-gradient-1: #10b981;--oc-thinking-gradient-2: #059669;--oc-thinking-glow: rgba(16, 185, 129, .3);--oc-thinking-glow-strong: rgba(16, 185, 129, .6);--oc-skeleton-bg: #e5e7eb;--oc-skeleton-gradient: linear-gradient(90deg, #e5e7eb 25%, #f3f4f6 50%, #e5e7eb 75%);--oc-shadow-sm: 0 2px 4px rgba(0, 0, 0, .1);--oc-shadow-md: 0 4px 12px rgba(0, 0, 0, .15);--oc-shadow-lg: 0 8px 32px rgba(0, 0, 0, .12);--oc-shadow-xl: 0 20px 60px rgba(0, 0, 0, .3);--oc-shadow-primary: 0 2px 4px rgba(59, 130, 246, .2);--oc-shadow-primary-hover: 0 4px 6px rgba(59, 130, 246, .3);--oc-shadow-danger: 0 4px 12px rgba(239, 68, 68, .3);--oc-trigger-bg: #3b82f6;--oc-trigger-bg-hover: #2563eb;--oc-trigger-bg-active: #1d4ed8;--oc-trigger-shadow: 0 2px 8px rgba(59, 130, 246, .3);--oc-trigger-shadow-hover: 0 4px 12px rgba(59, 130, 246, .4);--oc-trigger-shadow-active: 0 4px 12px rgba(59, 130, 246, .5);position:fixed;z-index:999999;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.opencode-widget.opencode-theme-dark{--oc-bg-main: #1a1a1a;--oc-bg-secondary: #1e1e1e;--oc-bg-tertiary: #282828;--oc-overlay-bg: rgba(26, 26, 26, .9);--oc-bg-inverse: #ffffff;--oc-text-primary: #f3f4f6;--oc-text-secondary: #d1d5db;--oc-text-tertiary: #9ca3af;--oc-text-placeholder: #6b7280;--oc-text-inverse: #282828;--oc-border-primary: #282828;--oc-border-secondary: #4b5563;--oc-primary: #3b82f6;--oc-primary-hover: #2563eb;--oc-primary-bg: rgba(59, 130, 246, .15);--oc-danger: #ef4444;--oc-danger-hover: #dc2626;--oc-danger-active: #b91c1c;--oc-success: #10b981;--oc-overlay: rgba(26, 26, 26, .9);--oc-tooltip-bg: #282828;--oc-dialog-overlay: rgba(0, 0, 0, .7);--oc-thinking-gradient-1: #34d399;--oc-thinking-gradient-2: #10b981;--oc-thinking-glow: rgba(52, 211, 153, .3);--oc-thinking-glow-strong: rgba(52, 211, 153, .6);--oc-skeleton-bg: #151515;--oc-skeleton-gradient: linear-gradient(90deg, #282828 25%, #4b5563 50%, #282828 75%);--oc-shadow-sm: 0 2px 4px rgba(0, 0, 0, .3);--oc-shadow-md: 0 4px 12px rgba(0, 0, 0, .4);--oc-shadow-lg: 0 8px 32px rgba(0, 0, 0, .4);--oc-shadow-xl: 0 20px 60px rgba(0, 0, 0, .6);--oc-shadow-primary: 0 2px 4px rgba(59, 130, 246, .3);--oc-shadow-primary-hover: 0 4px 6px rgba(59, 130, 246, .4);--oc-shadow-danger: 0 4px 12px rgba(239, 68, 68, .4);--oc-trigger-bg: #60a5fa;--oc-trigger-bg-hover: #3b82f6;--oc-trigger-bg-active: #2563eb;--oc-trigger-shadow: 0 2px 8px rgba(96, 165, 250, .4);--oc-trigger-shadow-hover: 0 4px 12px rgba(96, 165, 250, .5);--oc-trigger-shadow-active: 0 4px 12px rgba(96, 165, 250, .6)}.opencode-
|
|
1
|
+
.opencode-widget{--oc-bg-main: #ffffff;--oc-bg-secondary: #f8f9fa;--oc-bg-tertiary: #f3f4f6;--oc-overlay-bg: rgba(255, 255, 255, .9);--oc-bg-inverse: #1e1e1e;--oc-text-primary: #282828;--oc-text-secondary: #4b5563;--oc-text-tertiary: #6b7280;--oc-text-placeholder: #9ca3af;--oc-text-inverse: #ffffff;--oc-border-primary: #e5e7eb;--oc-border-secondary: #d1d5db;--oc-primary: #3b82f6;--oc-primary-hover: #2563eb;--oc-primary-bg: rgba(59, 130, 246, .1);--oc-danger: #ef4444;--oc-danger-hover: #dc2626;--oc-danger-active: #b91c1c;--oc-success: #10b981;--oc-overlay: rgba(0, 0, 0, .5);--oc-tooltip-bg: #1e1e1e;--oc-dialog-overlay: rgba(0, 0, 0, .5);--oc-thinking-gradient-1: #10b981;--oc-thinking-gradient-2: #059669;--oc-thinking-glow: rgba(16, 185, 129, .3);--oc-thinking-glow-strong: rgba(16, 185, 129, .6);--oc-skeleton-bg: #e5e7eb;--oc-skeleton-gradient: linear-gradient(90deg, #e5e7eb 25%, #f3f4f6 50%, #e5e7eb 75%);--oc-shadow-sm: 0 2px 4px rgba(0, 0, 0, .1);--oc-shadow-md: 0 4px 12px rgba(0, 0, 0, .15);--oc-shadow-lg: 0 8px 32px rgba(0, 0, 0, .12);--oc-shadow-xl: 0 20px 60px rgba(0, 0, 0, .3);--oc-shadow-primary: 0 2px 4px rgba(59, 130, 246, .2);--oc-shadow-primary-hover: 0 4px 6px rgba(59, 130, 246, .3);--oc-shadow-danger: 0 4px 12px rgba(239, 68, 68, .3);--oc-trigger-bg: #3b82f6;--oc-trigger-bg-hover: #2563eb;--oc-trigger-bg-active: #1d4ed8;--oc-trigger-shadow: 0 2px 8px rgba(59, 130, 246, .3);--oc-trigger-shadow-hover: 0 4px 12px rgba(59, 130, 246, .4);--oc-trigger-shadow-active: 0 4px 12px rgba(59, 130, 246, .5);position:fixed;z-index:999999;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.opencode-widget.opencode-theme-dark{--oc-bg-main: #1a1a1a;--oc-bg-secondary: #1e1e1e;--oc-bg-tertiary: #282828;--oc-overlay-bg: rgba(26, 26, 26, .9);--oc-bg-inverse: #ffffff;--oc-text-primary: #f3f4f6;--oc-text-secondary: #d1d5db;--oc-text-tertiary: #9ca3af;--oc-text-placeholder: #6b7280;--oc-text-inverse: #282828;--oc-border-primary: #282828;--oc-border-secondary: #4b5563;--oc-primary: #3b82f6;--oc-primary-hover: #2563eb;--oc-primary-bg: rgba(59, 130, 246, .15);--oc-danger: #ef4444;--oc-danger-hover: #dc2626;--oc-danger-active: #b91c1c;--oc-success: #10b981;--oc-overlay: rgba(26, 26, 26, .9);--oc-tooltip-bg: #282828;--oc-dialog-overlay: rgba(0, 0, 0, .7);--oc-thinking-gradient-1: #34d399;--oc-thinking-gradient-2: #10b981;--oc-thinking-glow: rgba(52, 211, 153, .3);--oc-thinking-glow-strong: rgba(52, 211, 153, .6);--oc-skeleton-bg: #151515;--oc-skeleton-gradient: linear-gradient(90deg, #282828 25%, #4b5563 50%, #282828 75%);--oc-shadow-sm: 0 2px 4px rgba(0, 0, 0, .3);--oc-shadow-md: 0 4px 12px rgba(0, 0, 0, .4);--oc-shadow-lg: 0 8px 32px rgba(0, 0, 0, .4);--oc-shadow-xl: 0 20px 60px rgba(0, 0, 0, .6);--oc-shadow-primary: 0 2px 4px rgba(59, 130, 246, .3);--oc-shadow-primary-hover: 0 4px 6px rgba(59, 130, 246, .4);--oc-shadow-danger: 0 4px 12px rgba(239, 68, 68, .4);--oc-trigger-bg: #60a5fa;--oc-trigger-bg-hover: #3b82f6;--oc-trigger-bg-active: #2563eb;--oc-trigger-shadow: 0 2px 8px rgba(96, 165, 250, .4);--oc-trigger-shadow-hover: 0 4px 12px rgba(96, 165, 250, .5);--oc-trigger-shadow-active: 0 4px 12px rgba(96, 165, 250, .6)}.opencode-chat{position:fixed;bottom:20px;width:700px;height:86vh;max-height:calc(100vh - 40px);background:var(--oc-bg-main);border-radius:16px;box-shadow:var(--oc-shadow-lg);overflow:hidden;opacity:0;visibility:hidden;transform:translateY(20px) scale(.95);transition:all .3s ease;display:flex;flex-direction:column;z-index:99999}.opencode-chat.minimized{width:300px;height:300px}.opencode-chat.minimized .opencode-iframe-container{margin-top:-146px}.opencode-chat-content{display:flex;flex:1;overflow:hidden}.opencode-chat.open{opacity:1;visibility:visible;transform:translateY(0) scale(1)}.opencode-notification{position:absolute;top:20px;left:50%;transform:translate(-50%);padding:12px 24px;background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff;border-radius:10px;font-size:14px;font-weight:500;box-shadow:0 4px 16px rgba(59,130,246,.4),0 0 0 2px rgba(59,130,246,.2);animation:slideDown .3s ease;z-index:10000000;display:flex;align-items:center;gap:10px}.opencode-notification:before{content:"\1f4a1";font-size:16px}.opencode-dialog-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:var(--oc-dialog-overlay);display:flex;align-items:center;justify-content:center;z-index:9999999;animation:fadeIn .2s ease}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.opencode-dialog{background:var(--oc-bg-main);border-radius:12px;padding:24px;min-width:320px;max-width:400px;box-shadow:var(--oc-shadow-xl);animation:scaleIn .2s ease}@keyframes scaleIn{0%{transform:scale(.9);opacity:0}to{transform:scale(1);opacity:1}}.opencode-dialog-content{margin-bottom:20px}.opencode-dialog-message{font-size:15px;color:var(--oc-text-primary);line-height:1.5}.opencode-dialog-actions{display:flex;gap:12px;justify-content:flex-end}.opencode-dialog-btn{padding:10px 20px;border-radius:8px;border:none;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s}.opencode-dialog-btn.cancel{background:var(--oc-bg-tertiary);color:var(--oc-text-primary)}.opencode-dialog-btn.cancel:hover{background:var(--oc-text-primary);color:var(--oc-bg-main)}.opencode-dialog-btn.confirm{background:var(--oc-danger);color:#fff}.opencode-dialog-btn.confirm:hover{background:var(--oc-danger-hover)}@keyframes slideDown{0%{transform:translate(-50%) translateY(-100%);opacity:0}to{transform:translate(-50%) translateY(0);opacity:1}}.opencode-page-notification{position:fixed;top:20px;left:50%;transform:translate(-50%);padding:12px 24px;background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff;border-radius:10px;font-size:14px;font-weight:500;box-shadow:0 4px 16px rgba(59,130,246,.4),0 0 0 2px rgba(59,130,246,.2);animation:slideDown .3s ease;z-index:2147483647;display:flex;align-items:center;gap:10px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.opencode-page-notification:before{content:"\1f4a1";font-size:16px}.opencode-element-highlight{position:fixed;pointer-events:none;z-index:999998;display:none;transition:all .1s ease;border-radius:4px}#vue-inspector-container{display:none!important}.opencode-element-tooltip{position:fixed;background:var(--oc-tooltip-bg);color:#fff;padding:8px 12px;border-radius:6px;font-size:12px;z-index:9999998;display:none;box-shadow:var(--oc-shadow-md);max-width:300px;pointer-events:none}.opencode-tooltip-tag{font-weight:500;margin-bottom:4px;word-break:break-all}.opencode-tooltip-file{font-size:11px;color:var(--oc-text-placeholder);word-break:break-all}.opencode-element-highlight-temp{position:absolute;pointer-events:none;z-index:999998;border-radius:4px;animation:highlight-pulse 2s ease-out forwards}@keyframes highlight-pulse{0%{opacity:1;transform:scale(1)}50%{opacity:.8;transform:scale(1.02)}to{opacity:0;transform:scale(1)}}@media(max-width:768px){.opencode-chat{width:calc(100vw - 40px);height:calc(100vh - 100px)}}
|
|
2
2
|
.opencode-iframe-container{flex:1;position:relative;overflow:hidden;display:flex;flex-direction:column;margin-top:-42px}.opencode-loading-overlay{position:absolute;top:0;left:0;right:0;bottom:0;background:var(--oc-overlay-bg);display:none;flex-direction:column;align-items:center;justify-content:center;z-index:10;transition:opacity .3s ease}.opencode-loading-overlay.visible{display:flex}.opencode-loading-spinner{width:40px;height:40px;border:3px solid var(--oc-border-primary);border-top-color:var(--oc-primary);border-radius:50%;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.opencode-loading-text{margin-top:12px;font-size:14px;color:var(--oc-text-placeholder)}.opencode-error-overlay{position:absolute;top:0;left:0;right:0;bottom:0;z-index:15;margin-top:42px;display:none}.opencode-error-overlay.visible{display:flex}.opencode-empty-state-overlay{position:absolute;top:0;left:0;right:0;bottom:0;background:var(--oc-bg-secondary);display:none;flex-direction:column;align-items:center;justify-content:center;z-index:5;transition:opacity .3s ease;margin-top:42px}.opencode-empty-state-overlay.visible{display:flex}.opencode-empty-state-icon{color:var(--oc-text-placeholder);margin-bottom:16px}.opencode-empty-state-text{color:var(--oc-text-primary);font-size:16px;font-weight:500;margin-bottom:24px}.opencode-empty-state-btn{padding:10px 24px;border-radius:8px;border:none;background:var(--oc-primary);color:#fff;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s;box-shadow:var(--oc-shadow-primary)}.opencode-empty-state-btn:hover{background:var(--oc-primary-hover);transform:translateY(-1px);box-shadow:var(--oc-shadow-primary-hover)}.opencode-empty-state-btn:active{transform:translateY(0)}.opencode-iframe{width:100%;height:100%;border:none}
|
|
3
3
|
.opencode-chat-header{position:relative;flex-shrink:0;display:flex;align-items:center;justify-content:space-between;padding:0 12px;height:40px;background:var(--oc-bg-secondary);border-bottom:1px solid var(--oc-border-primary);z-index:5}.opencode-chat-header-left{display:flex;align-items:center;gap:4px}.opencode-chat-header-title{font-size:14px;font-weight:600;color:var(--oc-text-primary);position:absolute;left:50%;transform:translate(-50%)}.opencode-chat-header-actions{display:flex;gap:4px}.opencode-header-btn{width:28px;height:28px;border-radius:6px;border:none;background:transparent;color:var(--oc-text-placeholder);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s}.opencode-header-btn:hover{background:var(--oc-bg-tertiary);color:var(--oc-text-primary)}.opencode-header-btn.close:hover{background:var(--oc-danger);color:#fff}.opencode-header-btn.select-btn.active,.opencode-header-btn.session-toggle.active{background:var(--oc-primary);color:#fff}
|
|
4
4
|
.opencode-select-mode-hint{position:fixed;top:20px;left:50%;transform:translate(-50%);padding:10px;background:linear-gradient(135deg,#ef4444,#dc2626);color:#fff;border-radius:12px;font-size:14px;font-weight:500;box-shadow:0 6px 20px rgba(239,68,68,.5),0 0 0 3px rgba(239,68,68,.3);z-index:9999999;display:none;align-items:center;gap:12px;border:1px solid rgba(255,255,255,.3)}.opencode-select-mode-hint.visible{display:flex;animation:slideDown .3s ease,pulseHint 2s ease-in-out infinite}.opencode-hint-shortcut{padding:4px 10px;background:rgba(255,255,255,.25);border-radius:6px;font-size:13px;font-weight:600;border:1px solid rgba(255,255,255,.4)}@keyframes pulseHint{0%,to{box-shadow:0 6px 20px rgba(239,68,68,.5),0 0 0 3px rgba(239,68,68,.3)}50%{box-shadow:0 6px 20px rgba(239,68,68,.6),0 0 0 6px rgba(239,68,68,.4)}}
|
|
5
5
|
.opencode-right-toolbar{width:140px;background:var(--oc-bg-secondary);border-left:1px solid var(--oc-border-primary);display:flex;flex-direction:column;flex-shrink:0;transition:width .2s ease;overflow:hidden}.opencode-right-toolbar.collapsed{width:0;overflow:hidden}.opencode-right-toolbar.collapsed .opencode-selected-nodes-header,.opencode-right-toolbar.collapsed .opencode-selected-nodes,.opencode-right-toolbar.collapsed .opencode-clear-all-btn{display:none}.opencode-selected-nodes-header{padding:12px 8px 8px;border-bottom:1px solid var(--oc-border-primary)}.opencode-selected-nodes-title{font-size:14px;font-weight:600;color:var(--oc-text-primary);margin-bottom:4px}.opencode-selected-nodes-desc{font-size:11px;color:var(--oc-text-placeholder);line-height:1.4}.opencode-selected-nodes{flex:1;display:flex;flex-direction:column;padding:8px;gap:6px;overflow-y:auto;overflow-x:hidden}.opencode-selected-nodes:empty:before{content:"\6682\65e0\9009\4e2d\5143\7d20";color:var(--oc-text-placeholder);font-size:12px;text-align:center;padding:20px 10px}.opencode-selected-node{display:flex;align-items:center;gap:8px;padding:8px 10px;background:var(--oc-bg-main);border:1px solid var(--oc-border-primary);border-radius:6px;font-size:12px;transition:all .2s}.opencode-selected-node:hover{border-color:var(--oc-primary);box-shadow:var(--oc-shadow-primary)}.opencode-node-content{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.opencode-node-text{color:var(--oc-text-primary);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.opencode-node-file{color:var(--oc-text-placeholder);font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.opencode-node-remove{width:18px;height:18px;border-radius:4px;border:none;background:transparent;color:var(--oc-text-placeholder);cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:14px;transition:all .2s;flex-shrink:0}.opencode-node-remove:hover{background:var(--oc-danger);color:#fff}.opencode-clear-all-btn{width:calc(100% - 16px);margin:8px;padding:8px 12px;border-radius:6px;border:none;background:var(--oc-danger);color:#fff;font-size:12px;font-weight:500;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:4px;transition:all .2s}.opencode-clear-all-btn:hover{background:var(--oc-danger-hover);transform:scale(1.02)}
|
|
6
6
|
.opencode-session-list{width:240px;background:var(--oc-bg-secondary);border-right:1px solid var(--oc-border-primary);display:flex;flex-direction:column;flex-shrink:0;transition:width .2s ease}.opencode-session-list.collapsed{width:0;overflow:hidden}.opencode-session-list.collapsed .opencode-session-list-header,.opencode-session-list.collapsed .opencode-session-list-content{display:none}.opencode-session-list-header{padding:16px;border-bottom:1px solid var(--oc-border-primary);display:flex;justify-content:space-between;align-items:center;font-weight:600;font-size:14px;color:var(--oc-text-primary)}.opencode-new-session-btn{width:28px;height:28px;border-radius:6px;border:none;background:var(--oc-primary);color:#fff;font-size:18px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s}.opencode-new-session-btn:hover{background:var(--oc-primary-hover);transform:scale(1.05)}.opencode-session-list-content{flex:1;overflow-y:auto;padding:8px;position:relative}.opencode-session-list-loading-overlay{position:absolute;top:0;left:0;right:0;bottom:0;background:var(--oc-overlay-bg);display:flex;align-items:center;justify-content:center;z-index:10;border-radius:8px}.opencode-loading-spinner.small{width:24px;height:24px;border-width:2px}.opencode-session-item{padding:12px;border-radius:8px;cursor:pointer;transition:transform .2s;margin-bottom:4px;color:var(--oc-text-primary)}.opencode-session-item:hover{background:var(--oc-bg-tertiary)}.opencode-session-item.active{background:var(--oc-primary);color:#fff;transition:none}.opencode-session-title{font-size:14px;font-weight:500;margin-bottom:4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.opencode-session-meta{font-size:12px;opacity:.6}.opencode-session-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:4px}.opencode-session-delete-btn{width:20px;height:20px;border-radius:4px;border:none;background:transparent;color:var(--oc-text-placeholder);font-size:16px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s;opacity:0;flex-shrink:0}.opencode-session-item:hover .opencode-session-delete-btn{opacity:1}.opencode-session-delete-btn:hover{background:var(--oc-danger);color:#fff}.opencode-session-item.active .opencode-session-delete-btn{color:rgba(255,255,255,.7)}.opencode-session-item.active .opencode-session-delete-btn:hover{background:rgba(255,255,255,.2);color:#fff}.opencode-session-header-skeleton{padding:16px;border-bottom:1px solid var(--oc-border-primary);display:none;justify-content:space-between;align-items:center}.opencode-session-header-skeleton.visible{display:flex}.opencode-skeleton-header-title{height:18px;width:80px;background:var(--oc-skeleton-gradient);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:4px}.opencode-skeleton-header-btn{width:28px;height:28px;background:var(--oc-skeleton-gradient);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:6px}.opencode-session-skeleton{flex:1;overflow-y:auto;padding:8px;display:none}.opencode-session-skeleton.visible{display:block}.opencode-skeleton-item{padding:12px;border-radius:8px;margin-bottom:4px;background:var(--oc-skeleton-bg)}.opencode-skeleton-title{height:16px;background:var(--oc-skeleton-gradient);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:4px;margin-bottom:8px;width:70%}.opencode-skeleton-meta{height:12px;background:var(--oc-skeleton-gradient);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:4px;width:50%}.opencode-session-empty{padding:32px 16px;text-align:center;color:var(--oc-text-placeholder);font-size:13px}@keyframes skeleton-loading{0%{background-position:200% 0}to{background-position:-200% 0}}
|
|
7
|
-
.opencode-button{width:
|
|
7
|
+
.opencode-button{width:42px;height:42px;border-radius:50%;background:#fff;border:none;cursor:pointer;box-shadow:0 4px 12px rgba(102,126,234,.4);transition:all .3s ease;display:flex;align-items:center;justify-content:center;padding:0;position:relative}.opencode-button svg{transform:rotate(180deg) scale(1.1);transition:transform .3s ease;width:100%;height:100%;display:block}.opencode-button:hover svg{transform:rotate(180deg) scale(1.1)}.opencode-button:hover{transform:scale(1.1);box-shadow:0 6px 16px rgba(102,126,234,.5)}.opencode-button.thinking{background:linear-gradient(135deg,#667eea,#764ba2);animation:thinking-glow 1.5s ease-in-out infinite,thinking-pulse 1.5s ease-in-out infinite;box-shadow:0 0 20px rgba(102,126,234,.6),0 0 40px rgba(118,75,162,.4),0 0 60px rgba(102,126,234,.2)}.opencode-button.thinking svg path{fill:#fff}.opencode-button.thinking:before{content:"";position:absolute;top:-2px;right:-2px;bottom:-2px;left:-2px;border-radius:50%;background:linear-gradient(135deg,#8b9cf5,#9d6bc7);z-index:-1}.opencode-button.thinking:after{content:"";position:absolute;top:-3px;right:-3px;bottom:-3px;left:-3px;border-radius:50%;background:conic-gradient(from 180deg,transparent,rgba(102,126,234,.3),transparent,rgba(118,75,162,.3),transparent);z-index:-2;animation:thinking-rotate 2s linear infinite reverse;filter:blur(8px)}@keyframes thinking-glow{0%,to{box-shadow:0 0 20px rgba(102,126,234,.6),0 0 40px rgba(118,75,162,.4),0 0 60px rgba(102,126,234,.2)}50%{box-shadow:0 0 30px rgba(102,126,234,.8),0 0 60px rgba(118,75,162,.6),0 0 90px rgba(102,126,234,.3)}}@keyframes thinking-rotate{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes thinking-pulse{0%,to{transform:scale(1)}50%{transform:scale(.95)}}.opencode-button.opencode-theme-dark{background:linear-gradient(135deg,#667eea,#764ba2);box-shadow:0 4px 12px rgba(102,126,234,.3)}.opencode-button.opencode-theme-dark:before{content:"";position:absolute;top:-2px;right:-2px;bottom:-2px;left:-2px;border-radius:50%;background:linear-gradient(135deg,#8b9cf5,#9d6bc7);z-index:-1}.opencode-button.opencode-theme-dark:hover{box-shadow:0 6px 16px rgba(102,126,234,.4)}.opencode-button.opencode-theme-dark svg path{fill:#fff}
|
|
8
|
+
.floating-bubble{position:fixed;top:0;left:0;z-index:999999;cursor:grab;-webkit-user-select:none;-moz-user-select:none;user-select:none;touch-action:none;will-change:transform}.floating-bubble:active{cursor:grabbing}
|
|
8
9
|
/*$vite$:1*/
|
package/lib/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import OpenCodeWidget from './open-code-widget';
|
|
2
2
|
import type { App } from 'vue';
|
|
3
|
-
declare const version = "1.0.
|
|
3
|
+
declare const version = "1.0.25";
|
|
4
4
|
declare function install(app: App<any>, options?: any): void;
|
|
5
5
|
export { install, version, OpenCodeWidget };
|
|
6
6
|
export default install;
|
package/lib/index.js
CHANGED
|
@@ -34,7 +34,7 @@ __export(lib_exports, {
|
|
|
34
34
|
});
|
|
35
35
|
module.exports = __toCommonJS(lib_exports);
|
|
36
36
|
var import_open_code_widget = __toESM(require("./open-code-widget"));
|
|
37
|
-
const version = "1.0.
|
|
37
|
+
const version = "1.0.25";
|
|
38
38
|
function install(app, options) {
|
|
39
39
|
const components = [
|
|
40
40
|
import_open_code_widget.default
|
|
@@ -52,7 +52,6 @@ function useWidget(options) {
|
|
|
52
52
|
});
|
|
53
53
|
const containerClasses = (0, import_vue.computed)(() => [
|
|
54
54
|
"opencode-widget",
|
|
55
|
-
options.position.value,
|
|
56
55
|
`opencode-theme-${resolvedTheme.value}`
|
|
57
56
|
]);
|
|
58
57
|
const buttonActive = (0, import_vue.computed)(() => !!(options.open.value || options.selectMode.value));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.floating-bubble{position:fixed;top:0;left:0;z-index:999999;cursor:grab;-webkit-user-select:none;-moz-user-select:none;user-select:none;touch-action:none;will-change:transform}.floating-bubble:active{cursor:grabbing}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { FloatingBubbleAxis, FloatingBubbleMagnetic, FloatingBubbleOffset, FloatingBubbleGap } from "./types";
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
offset?: FloatingBubbleOffset;
|
|
4
|
+
axis?: FloatingBubbleAxis;
|
|
5
|
+
magnetic?: FloatingBubbleMagnetic;
|
|
6
|
+
gap?: number | FloatingBubbleGap;
|
|
7
|
+
teleport?: string | Element;
|
|
8
|
+
};
|
|
9
|
+
declare var __VLS_5: {};
|
|
10
|
+
type __VLS_Slots = {} & {
|
|
11
|
+
default?: (props: typeof __VLS_5) => any;
|
|
12
|
+
};
|
|
13
|
+
declare const __VLS_component: import("vue").DefineComponent<__VLS_Props, {
|
|
14
|
+
isOnRightSide: import("vue").ComputedRef<boolean>;
|
|
15
|
+
offset: import("vue").ComputedRef<{
|
|
16
|
+
x: number;
|
|
17
|
+
y: number;
|
|
18
|
+
}>;
|
|
19
|
+
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
|
|
20
|
+
click: (event: MouseEvent) => any;
|
|
21
|
+
"update:offset": (value: FloatingBubbleOffset) => any;
|
|
22
|
+
"offset-change": (offset: FloatingBubbleOffset) => any;
|
|
23
|
+
"drag-start": () => any;
|
|
24
|
+
"drag-end": () => any;
|
|
25
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
26
|
+
onClick?: ((event: MouseEvent) => any) | undefined;
|
|
27
|
+
"onUpdate:offset"?: ((value: FloatingBubbleOffset) => any) | undefined;
|
|
28
|
+
"onOffset-change"?: ((offset: FloatingBubbleOffset) => any) | undefined;
|
|
29
|
+
"onDrag-start"?: (() => any) | undefined;
|
|
30
|
+
"onDrag-end"?: (() => any) | undefined;
|
|
31
|
+
}>, {
|
|
32
|
+
offset: FloatingBubbleOffset;
|
|
33
|
+
axis: FloatingBubbleAxis;
|
|
34
|
+
magnetic: FloatingBubbleMagnetic;
|
|
35
|
+
gap: number | FloatingBubbleGap;
|
|
36
|
+
teleport: string | Element;
|
|
37
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
38
|
+
declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
|
|
39
|
+
export default _default;
|
|
40
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
41
|
+
new (): {
|
|
42
|
+
$slots: S;
|
|
43
|
+
};
|
|
44
|
+
};
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
9
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
10
|
+
var __spreadValues = (a, b) => {
|
|
11
|
+
for (var prop in b || (b = {}))
|
|
12
|
+
if (__hasOwnProp.call(b, prop))
|
|
13
|
+
__defNormalProp(a, prop, b[prop]);
|
|
14
|
+
if (__getOwnPropSymbols)
|
|
15
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
16
|
+
if (__propIsEnum.call(b, prop))
|
|
17
|
+
__defNormalProp(a, prop, b[prop]);
|
|
18
|
+
}
|
|
19
|
+
return a;
|
|
20
|
+
};
|
|
21
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
22
|
+
var __export = (target, all) => {
|
|
23
|
+
for (var name in all)
|
|
24
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
25
|
+
};
|
|
26
|
+
var __copyProps = (to, from, except, desc) => {
|
|
27
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
28
|
+
for (let key of __getOwnPropNames(from))
|
|
29
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
30
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
31
|
+
}
|
|
32
|
+
return to;
|
|
33
|
+
};
|
|
34
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
35
|
+
var FloatingBubble_vue_exports = {};
|
|
36
|
+
__export(FloatingBubble_vue_exports, {
|
|
37
|
+
default: () => FloatingBubble_vue_default
|
|
38
|
+
});
|
|
39
|
+
module.exports = __toCommonJS(FloatingBubble_vue_exports);
|
|
40
|
+
var import_FloatingBubble_sfc = require("./FloatingBubble-sfc.css");
|
|
41
|
+
var import_vue = require("vue");
|
|
42
|
+
var import_vue2 = require("vue");
|
|
43
|
+
var import_vue3 = require("vue");
|
|
44
|
+
const __vue_sfc__ = /* @__PURE__ */ (0, import_vue.defineComponent)(__spreadProps(__spreadValues({}, {
|
|
45
|
+
name: "FloatingBubble"
|
|
46
|
+
}), {
|
|
47
|
+
__name: "FloatingBubble",
|
|
48
|
+
props: {
|
|
49
|
+
offset: { type: Object, required: false, default: void 0 },
|
|
50
|
+
axis: { type: String, required: false, default: "xy" },
|
|
51
|
+
magnetic: { type: String, required: false, default: void 0 },
|
|
52
|
+
gap: { type: [Number, Object], required: false, default: 24 },
|
|
53
|
+
teleport: { type: null, required: false, default: "body" }
|
|
54
|
+
},
|
|
55
|
+
emits: ["update:offset", "click", "offset-change", "drag-start", "drag-end"],
|
|
56
|
+
setup(__props, { expose: __expose, emit: __emit }) {
|
|
57
|
+
const props = __props;
|
|
58
|
+
const emit = __emit;
|
|
59
|
+
const rootRef = (0, import_vue2.ref)(null);
|
|
60
|
+
const getInitialState = () => {
|
|
61
|
+
if (props.offset) {
|
|
62
|
+
return {
|
|
63
|
+
x: props.offset.x,
|
|
64
|
+
y: props.offset.y,
|
|
65
|
+
width: 0,
|
|
66
|
+
height: 0
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
if (typeof window !== "undefined") {
|
|
70
|
+
return {
|
|
71
|
+
x: window.innerWidth - 42 - 24,
|
|
72
|
+
y: window.innerHeight - 42 - 24,
|
|
73
|
+
width: 0,
|
|
74
|
+
height: 0
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
return { x: 0, y: 0, width: 0, height: 0 };
|
|
78
|
+
};
|
|
79
|
+
const state = (0, import_vue2.ref)(getInitialState());
|
|
80
|
+
const isObject = (val) => val !== null && typeof val === "object";
|
|
81
|
+
const gapX = (0, import_vue2.computed)(
|
|
82
|
+
() => isObject(props.gap) ? props.gap.x : props.gap
|
|
83
|
+
);
|
|
84
|
+
const gapY = (0, import_vue2.computed)(
|
|
85
|
+
() => isObject(props.gap) ? props.gap.y : props.gap
|
|
86
|
+
);
|
|
87
|
+
const windowWidth = (0, import_vue2.ref)(typeof window !== "undefined" ? window.innerWidth : 0);
|
|
88
|
+
const windowHeight = (0, import_vue2.ref)(typeof window !== "undefined" ? window.innerHeight : 0);
|
|
89
|
+
const boundary = (0, import_vue2.computed)(() => ({
|
|
90
|
+
top: gapY.value,
|
|
91
|
+
right: windowWidth.value - state.value.width - gapX.value,
|
|
92
|
+
bottom: windowHeight.value - state.value.height - gapY.value,
|
|
93
|
+
left: gapX.value
|
|
94
|
+
}));
|
|
95
|
+
const dragging = (0, import_vue2.ref)(false);
|
|
96
|
+
const initialized = (0, import_vue2.ref)(false);
|
|
97
|
+
const rootStyle = (0, import_vue2.computed)(() => {
|
|
98
|
+
const style = {};
|
|
99
|
+
const x = `${state.value.x}px`;
|
|
100
|
+
const y = `${state.value.y}px`;
|
|
101
|
+
style.transform = `translate3d(${x}, ${y}, 0)`;
|
|
102
|
+
if (dragging.value) {
|
|
103
|
+
style.transition = "none";
|
|
104
|
+
} else {
|
|
105
|
+
style.transition = "transform 0.3s ease";
|
|
106
|
+
}
|
|
107
|
+
return style;
|
|
108
|
+
});
|
|
109
|
+
const show = (0, import_vue2.ref)(true);
|
|
110
|
+
const updateState = () => {
|
|
111
|
+
if (!show.value || !rootRef.value || typeof window === "undefined") return;
|
|
112
|
+
const rect = rootRef.value.getBoundingClientRect();
|
|
113
|
+
if (rect.width === 0 || rect.height === 0) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
const { offset } = props;
|
|
117
|
+
let x = offset ? offset.x : windowWidth.value - rect.width - gapX.value;
|
|
118
|
+
let y = offset ? offset.y : windowHeight.value - rect.height - gapY.value;
|
|
119
|
+
const maxX = windowWidth.value - rect.width - gapX.value;
|
|
120
|
+
const maxY = windowHeight.value - rect.height - gapY.value;
|
|
121
|
+
if (x < gapX.value) x = gapX.value;
|
|
122
|
+
if (x > maxX) x = maxX;
|
|
123
|
+
if (y < gapY.value) y = gapY.value;
|
|
124
|
+
if (y > maxY) y = maxY;
|
|
125
|
+
state.value = {
|
|
126
|
+
x,
|
|
127
|
+
y,
|
|
128
|
+
width: rect.width,
|
|
129
|
+
height: rect.height
|
|
130
|
+
};
|
|
131
|
+
};
|
|
132
|
+
const touch = {
|
|
133
|
+
startX: (0, import_vue2.ref)(0),
|
|
134
|
+
startY: (0, import_vue2.ref)(0),
|
|
135
|
+
deltaX: (0, import_vue2.ref)(0),
|
|
136
|
+
deltaY: (0, import_vue2.ref)(0),
|
|
137
|
+
offsetX: (0, import_vue2.ref)(0),
|
|
138
|
+
offsetY: (0, import_vue2.ref)(0),
|
|
139
|
+
isTap: (0, import_vue2.ref)(true),
|
|
140
|
+
start(e) {
|
|
141
|
+
this.startX.value = "touches" in e ? e.touches[0].clientX : e.clientX;
|
|
142
|
+
this.startY.value = "touches" in e ? e.touches[0].clientY : e.clientY;
|
|
143
|
+
this.deltaX.value = 0;
|
|
144
|
+
this.deltaY.value = 0;
|
|
145
|
+
this.offsetX.value = 0;
|
|
146
|
+
this.offsetY.value = 0;
|
|
147
|
+
this.isTap.value = true;
|
|
148
|
+
},
|
|
149
|
+
move(e) {
|
|
150
|
+
const clientX = "touches" in e ? e.touches[0].clientX : e.clientX;
|
|
151
|
+
const clientY = "touches" in e ? e.touches[0].clientY : e.clientY;
|
|
152
|
+
this.deltaX.value = clientX - this.startX.value;
|
|
153
|
+
this.deltaY.value = clientY - this.startY.value;
|
|
154
|
+
this.offsetX.value = Math.abs(this.deltaX.value);
|
|
155
|
+
this.offsetY.value = Math.abs(this.deltaY.value);
|
|
156
|
+
const TAP_OFFSET = 5;
|
|
157
|
+
if (this.isTap.value && (this.offsetX.value > TAP_OFFSET || this.offsetY.value > TAP_OFFSET)) {
|
|
158
|
+
this.isTap.value = false;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
let prevX = 0;
|
|
163
|
+
let prevY = 0;
|
|
164
|
+
const onTouchStart = (e) => {
|
|
165
|
+
touch.start(e);
|
|
166
|
+
dragging.value = true;
|
|
167
|
+
prevX = state.value.x;
|
|
168
|
+
prevY = state.value.y;
|
|
169
|
+
if (!("touches" in e)) {
|
|
170
|
+
window.addEventListener("mousemove", onTouchMove, { passive: false });
|
|
171
|
+
window.addEventListener("mouseup", onTouchEnd);
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
const onTouchMove = (e) => {
|
|
175
|
+
if (e.cancelable) {
|
|
176
|
+
e.preventDefault();
|
|
177
|
+
}
|
|
178
|
+
const wasTap = touch.isTap.value;
|
|
179
|
+
touch.move(e);
|
|
180
|
+
if (wasTap && !touch.isTap.value) {
|
|
181
|
+
emit("drag-start");
|
|
182
|
+
}
|
|
183
|
+
if (props.axis === "lock") return;
|
|
184
|
+
if (!touch.isTap.value) {
|
|
185
|
+
if (props.axis === "x" || props.axis === "xy") {
|
|
186
|
+
let nextX = prevX + touch.deltaX.value;
|
|
187
|
+
if (nextX < boundary.value.left) nextX = boundary.value.left;
|
|
188
|
+
if (nextX > boundary.value.right) nextX = boundary.value.right;
|
|
189
|
+
state.value.x = nextX;
|
|
190
|
+
}
|
|
191
|
+
if (props.axis === "y" || props.axis === "xy") {
|
|
192
|
+
let nextY = prevY + touch.deltaY.value;
|
|
193
|
+
if (nextY < boundary.value.top) nextY = boundary.value.top;
|
|
194
|
+
if (nextY > boundary.value.bottom) nextY = boundary.value.bottom;
|
|
195
|
+
state.value.y = nextY;
|
|
196
|
+
}
|
|
197
|
+
const offset = { x: state.value.x, y: state.value.y };
|
|
198
|
+
emit("update:offset", offset);
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
const closest = (arr, target) => {
|
|
202
|
+
return arr.reduce(
|
|
203
|
+
(pre, cur) => Math.abs(pre - target) < Math.abs(cur - target) ? pre : cur
|
|
204
|
+
);
|
|
205
|
+
};
|
|
206
|
+
const onTouchEnd = (e) => {
|
|
207
|
+
dragging.value = false;
|
|
208
|
+
if (e && !("touches" in e) && e.type === "mouseup") {
|
|
209
|
+
window.removeEventListener("mousemove", onTouchMove);
|
|
210
|
+
window.removeEventListener("mouseup", onTouchEnd);
|
|
211
|
+
}
|
|
212
|
+
requestAnimationFrame(() => {
|
|
213
|
+
if (props.magnetic === "x") {
|
|
214
|
+
const nextX = closest(
|
|
215
|
+
[boundary.value.left, boundary.value.right],
|
|
216
|
+
state.value.x
|
|
217
|
+
);
|
|
218
|
+
state.value.x = nextX;
|
|
219
|
+
}
|
|
220
|
+
if (props.magnetic === "y") {
|
|
221
|
+
const nextY = closest(
|
|
222
|
+
[boundary.value.top, boundary.value.bottom],
|
|
223
|
+
state.value.y
|
|
224
|
+
);
|
|
225
|
+
state.value.y = nextY;
|
|
226
|
+
}
|
|
227
|
+
if (!touch.isTap.value) {
|
|
228
|
+
emit("drag-end");
|
|
229
|
+
const offset = { x: state.value.x, y: state.value.y };
|
|
230
|
+
emit("update:offset", offset);
|
|
231
|
+
if (prevX !== offset.x || prevY !== offset.y) {
|
|
232
|
+
emit("offset-change", offset);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
};
|
|
237
|
+
const onClick = (e) => {
|
|
238
|
+
if (touch.isTap.value) {
|
|
239
|
+
emit("click", e);
|
|
240
|
+
} else {
|
|
241
|
+
e.stopPropagation();
|
|
242
|
+
}
|
|
243
|
+
};
|
|
244
|
+
const handleResize = () => {
|
|
245
|
+
if (typeof window !== "undefined") {
|
|
246
|
+
windowWidth.value = window.innerWidth;
|
|
247
|
+
windowHeight.value = window.innerHeight;
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
(0, import_vue2.onMounted)(() => {
|
|
251
|
+
requestAnimationFrame(() => {
|
|
252
|
+
updateState();
|
|
253
|
+
requestAnimationFrame(() => {
|
|
254
|
+
initialized.value = true;
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
if (typeof window !== "undefined") {
|
|
258
|
+
window.addEventListener("resize", handleResize);
|
|
259
|
+
}
|
|
260
|
+
if (rootRef.value) {
|
|
261
|
+
rootRef.value.addEventListener("touchmove", onTouchMove, {
|
|
262
|
+
passive: false
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
(0, import_vue2.onUnmounted)(() => {
|
|
267
|
+
if (typeof window !== "undefined") {
|
|
268
|
+
window.removeEventListener("resize", handleResize);
|
|
269
|
+
window.removeEventListener("mousemove", onTouchMove);
|
|
270
|
+
window.removeEventListener("mouseup", onTouchEnd);
|
|
271
|
+
}
|
|
272
|
+
if (rootRef.value) {
|
|
273
|
+
rootRef.value.removeEventListener("touchmove", onTouchMove);
|
|
274
|
+
}
|
|
275
|
+
});
|
|
276
|
+
(0, import_vue2.watch)(
|
|
277
|
+
[windowWidth, windowHeight, gapX, gapY, () => props.offset],
|
|
278
|
+
updateState,
|
|
279
|
+
{ deep: true }
|
|
280
|
+
);
|
|
281
|
+
const isOnRightSide = (0, import_vue2.computed)(() => {
|
|
282
|
+
return state.value.x > windowWidth.value / 2;
|
|
283
|
+
});
|
|
284
|
+
__expose({
|
|
285
|
+
isOnRightSide,
|
|
286
|
+
offset: (0, import_vue2.computed)(() => ({ x: state.value.x, y: state.value.y }))
|
|
287
|
+
});
|
|
288
|
+
const __returned__ = { props, emit, rootRef, getInitialState, state, isObject, gapX, gapY, windowWidth, windowHeight, boundary, dragging, initialized, rootStyle, show, updateState, touch, get prevX() {
|
|
289
|
+
return prevX;
|
|
290
|
+
}, set prevX(v) {
|
|
291
|
+
prevX = v;
|
|
292
|
+
}, get prevY() {
|
|
293
|
+
return prevY;
|
|
294
|
+
}, set prevY(v) {
|
|
295
|
+
prevY = v;
|
|
296
|
+
}, onTouchStart, onTouchMove, closest, onTouchEnd, onClick, handleResize, isOnRightSide };
|
|
297
|
+
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
|
|
298
|
+
return __returned__;
|
|
299
|
+
}
|
|
300
|
+
}));
|
|
301
|
+
function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
|
|
302
|
+
return (0, import_vue3.openBlock)(), (0, import_vue3.createBlock)(import_vue3.Teleport, { to: $props.teleport }, [
|
|
303
|
+
(0, import_vue3.withDirectives)((0, import_vue3.createElementVNode)(
|
|
304
|
+
"div",
|
|
305
|
+
{
|
|
306
|
+
ref: "rootRef",
|
|
307
|
+
class: "floating-bubble",
|
|
308
|
+
style: (0, import_vue3.normalizeStyle)($setup.rootStyle),
|
|
309
|
+
onTouchstartPassive: $setup.onTouchStart,
|
|
310
|
+
onTouchend: $setup.onTouchEnd,
|
|
311
|
+
onTouchcancel: $setup.onTouchEnd,
|
|
312
|
+
onMousedown: $setup.onTouchStart,
|
|
313
|
+
onClickCapture: $setup.onClick
|
|
314
|
+
},
|
|
315
|
+
[
|
|
316
|
+
(0, import_vue3.renderSlot)(_ctx.$slots, "default")
|
|
317
|
+
],
|
|
318
|
+
36
|
|
319
|
+
/* STYLE, NEED_HYDRATION */
|
|
320
|
+
), [
|
|
321
|
+
[import_vue3.vShow, $setup.show && $setup.initialized]
|
|
322
|
+
])
|
|
323
|
+
], 8, ["to"]);
|
|
324
|
+
}
|
|
325
|
+
__vue_sfc__.render = __vue_render__;
|
|
326
|
+
var FloatingBubble_vue_default = __vue_sfc__;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var FloatingBubble_exports = {};
|
|
30
|
+
__export(FloatingBubble_exports, {
|
|
31
|
+
FloatingBubble: () => import_FloatingBubble_vue.default
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(FloatingBubble_exports);
|
|
34
|
+
var import_FloatingBubble_vue = __toESM(require("./FloatingBubble.vue.js"));
|
|
35
|
+
__reExport(FloatingBubble_exports, require("./types"), module.exports);
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export type FloatingBubbleAxis = "x" | "y" | "xy" | "lock";
|
|
2
|
+
export type FloatingBubbleMagnetic = "x" | "y";
|
|
3
|
+
export interface FloatingBubbleOffset {
|
|
4
|
+
x: number;
|
|
5
|
+
y: number;
|
|
6
|
+
}
|
|
7
|
+
export interface FloatingBubbleGap {
|
|
8
|
+
x: number;
|
|
9
|
+
y: number;
|
|
10
|
+
}
|
|
11
|
+
export interface FloatingBubbleProps {
|
|
12
|
+
offset?: FloatingBubbleOffset;
|
|
13
|
+
axis?: FloatingBubbleAxis;
|
|
14
|
+
magnetic?: FloatingBubbleMagnetic;
|
|
15
|
+
gap?: number | FloatingBubbleGap;
|
|
16
|
+
teleport?: string | Element;
|
|
17
|
+
}
|
|
18
|
+
export type FloatingBubbleEmits = {
|
|
19
|
+
(e: "update:offset", value: FloatingBubbleOffset): void;
|
|
20
|
+
(e: "click", event: MouseEvent): void;
|
|
21
|
+
(e: "offset-change", offset: FloatingBubbleOffset): void;
|
|
22
|
+
(e: "drag-start"): void;
|
|
23
|
+
(e: "drag-end"): void;
|
|
24
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __copyProps = (to, from, except, desc) => {
|
|
6
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
7
|
+
for (let key of __getOwnPropNames(from))
|
|
8
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
9
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
10
|
+
}
|
|
11
|
+
return to;
|
|
12
|
+
};
|
|
13
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
14
|
+
var types_exports = {};
|
|
15
|
+
module.exports = __toCommonJS(types_exports);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.opencode-button{width:
|
|
1
|
+
.opencode-button{width:42px;height:42px;border-radius:50%;background:#fff;border:none;cursor:pointer;box-shadow:0 4px 12px rgba(102,126,234,.4);transition:all .3s ease;display:flex;align-items:center;justify-content:center;padding:0;position:relative}.opencode-button svg{transform:rotate(180deg) scale(1.1);transition:transform .3s ease;width:100%;height:100%;display:block}.opencode-button:hover svg{transform:rotate(180deg) scale(1.1)}.opencode-button:hover{transform:scale(1.1);box-shadow:0 6px 16px rgba(102,126,234,.5)}.opencode-button.thinking{background:linear-gradient(135deg,#667eea,#764ba2);animation:thinking-glow 1.5s ease-in-out infinite,thinking-pulse 1.5s ease-in-out infinite;box-shadow:0 0 20px rgba(102,126,234,.6),0 0 40px rgba(118,75,162,.4),0 0 60px rgba(102,126,234,.2)}.opencode-button.thinking svg path{fill:#fff}.opencode-button.thinking:before{content:"";position:absolute;top:-2px;right:-2px;bottom:-2px;left:-2px;border-radius:50%;background:linear-gradient(135deg,#8b9cf5,#9d6bc7);z-index:-1}.opencode-button.thinking:after{content:"";position:absolute;top:-3px;right:-3px;bottom:-3px;left:-3px;border-radius:50%;background:conic-gradient(from 180deg,transparent,rgba(102,126,234,.3),transparent,rgba(118,75,162,.3),transparent);z-index:-2;animation:thinking-rotate 2s linear infinite reverse;filter:blur(8px)}@keyframes thinking-glow{0%,to{box-shadow:0 0 20px rgba(102,126,234,.6),0 0 40px rgba(118,75,162,.4),0 0 60px rgba(102,126,234,.2)}50%{box-shadow:0 0 30px rgba(102,126,234,.8),0 0 60px rgba(118,75,162,.6),0 0 90px rgba(102,126,234,.3)}}@keyframes thinking-rotate{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes thinking-pulse{0%,to{transform:scale(1)}50%{transform:scale(.95)}}.opencode-button.opencode-theme-dark{background:linear-gradient(135deg,#667eea,#764ba2);box-shadow:0 4px 12px rgba(102,126,234,.3)}.opencode-button.opencode-theme-dark:before{content:"";position:absolute;top:-2px;right:-2px;bottom:-2px;left:-2px;border-radius:50%;background:linear-gradient(135deg,#8b9cf5,#9d6bc7);z-index:-1}.opencode-button.opencode-theme-dark:hover{box-shadow:0 6px 16px rgba(102,126,234,.4)}.opencode-button.opencode-theme-dark svg path{fill:#fff}
|
|
@@ -1,8 +1,26 @@
|
|
|
1
|
-
|
|
1
|
+
import type { FloatingBubbleOffset } from "./FloatingBubble/types";
|
|
2
|
+
declare var __VLS_13: {};
|
|
2
3
|
type __VLS_Slots = {} & {
|
|
3
|
-
default?: (props: typeof
|
|
4
|
+
default?: (props: typeof __VLS_13) => any;
|
|
4
5
|
};
|
|
5
|
-
declare const __VLS_component: import("vue").DefineComponent<{}, {
|
|
6
|
+
declare const __VLS_component: import("vue").DefineComponent<{}, {
|
|
7
|
+
isOnRightSide: import("vue").ComputedRef<boolean>;
|
|
8
|
+
offset: import("vue").Ref<{
|
|
9
|
+
x: number;
|
|
10
|
+
y: number;
|
|
11
|
+
}, FloatingBubbleOffset | {
|
|
12
|
+
x: number;
|
|
13
|
+
y: number;
|
|
14
|
+
}>;
|
|
15
|
+
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
|
|
16
|
+
"offset-change": (offset: FloatingBubbleOffset) => any;
|
|
17
|
+
"drag-start": () => any;
|
|
18
|
+
"drag-end": () => any;
|
|
19
|
+
}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{
|
|
20
|
+
"onOffset-change"?: ((offset: FloatingBubbleOffset) => any) | undefined;
|
|
21
|
+
"onDrag-start"?: (() => any) | undefined;
|
|
22
|
+
"onDrag-end"?: (() => any) | undefined;
|
|
23
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
6
24
|
declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
|
|
7
25
|
export default _default;
|
|
8
26
|
type __VLS_WithSlots<T, S> = T & {
|