@gymmymac/bob-widget 3.2.17 → 3.2.18
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/CHANGELOG.md +11 -1
- package/dist/index.js +33 -32
- package/dist/index.mjs +5869 -4550
- package/dist/style.css +1 -1
- package/dist/utils/iosAudioUnlock.d.ts +47 -0
- package/package.json +1 -1
package/dist/style.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.bob-widget-root{position:relative;display:flex;flex-direction:column;width:100%;height:100%;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;font-size:16px;line-height:1.5;color:#1a1a1a;background:transparent;isolation:isolate;contain:layout style;box-sizing:border-box;--border: transparent !important;--border-border: transparent !important;--bob-blur-intensity: 8px;--bob-overlay-opacity: .15;--bob-z-base: 50;--bob-primary-color: #0066cc;--bob-accent-color: #ff8c00}.bob-widget-root *,.bob-widget-root *:before,.bob-widget-root *:after{box-sizing:border-box}.bob-widget-root button,.bob-widget-root [role=button]{min-height:unset!important;min-width:unset!important}.bob-widget-root input,.bob-widget-root textarea{font-size:16px!important}.bob-widget-root *:focus-visible{outline:2px solid #2563eb!important;outline-offset:2px!important}.bob-widget-root a{color:inherit;text-decoration:none}.bob-widget-root svg{display:inline-block;vertical-align:middle}.bob-widget-root img{max-width:100%;height:auto;display:block}.bob-widget-root ul,.bob-widget-root ol{list-style:none;margin:0;padding:0}.bob-widget-root h1,.bob-widget-root h2,.bob-widget-root h3,.bob-widget-root h4,.bob-widget-root h5,.bob-widget-root h6{font-size:inherit;font-weight:inherit;margin:0}.bob-widget-root p{margin:0}.bob-widget-root .bob-flex{display:flex}.bob-widget-root .bob-flex-col{flex-direction:column}.bob-widget-root .bob-items-center{align-items:center}.bob-widget-root .bob-justify-center{justify-content:center}.bob-widget-root .bob-gap-2{gap:.5rem}.bob-widget-root .bob-gap-3{gap:.75rem}@keyframes ptt-pulse{0%,to{box-shadow:0 0 #22c55e80}50%{box-shadow:0 0 0 16px #22c55e00}}@keyframes ptt-wave{0%{transform:translate(-50%,-50%) scale(1);opacity:.6}to{transform:translate(-50%,-50%) scale(2);opacity:0}}@keyframes ptt-dot{0%{opacity:.4;transform:scale(.8)}to{opacity:1;transform:scale(1)}}@keyframes ring-breathe{0%,to{transform:translate(-50%,-50%) scale(1);box-shadow:0 0 #22c55e66}50%{transform:translate(-50%,-50%) scale(1.15);box-shadow:0 0 20px 4px #22c55e33}}@keyframes ring-processing{0%,to{transform:translate(-50%,-50%) scale(1.1);opacity:.6}50%{transform:translate(-50%,-50%) scale(.95);opacity:.3}}@keyframes ring-speaking{0%,to{transform:translate(-50%,-50%) scale(1);box-shadow:0 0 12px 2px #22c55e4d}50%{transform:translate(-50%,-50%) scale(1.12);box-shadow:0 0 24px 6px #22c55e26}}@keyframes dot-pulse{0%,to{opacity:.3;transform:scale(.85)}50%{opacity:1;transform:scale(1.1)}}@keyframes processing-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes waveform-bar{0%,to{height:4px}50%{height:18px}}.bob-widget-root .glass-card{transition:transform .3s cubic-bezier(.34,1.56,.64,1),box-shadow .3s ease-out,border-color .3s ease}.bob-widget-root .glass-card:active{transform:scale(.98) translateY(0)!important}.bob-widget-root .glass-button{transition:transform .2s cubic-bezier(.34,1.56,.64,1),box-shadow .2s ease-out,background .2s ease}.bob-widget-root .glass-button:active{transform:scale(.95) translateY(0)!important}.bob-widget-root .product-scroll::-webkit-scrollbar{display:none}.bob-widget-root .product-scroll{scrollbar-width:none;-ms-overflow-style:none}.bob-widget-root .glass-scroll::-webkit-scrollbar{display:none}.bob-widget-root .glass-scroll{scrollbar-width:none;-ms-overflow-style:none}.bob-widget-root .high-contrast-input::placeholder{color:#0f172a80}.bob-widget-root .high-contrast-input:focus::placeholder{color:#0f172a66}.bob-widget-root input[type=text],.bob-widget-root input[type=search],.bob-widget-root textarea{background:#fff!important;color:#0f172a!important;border:2px solid rgba(15,23,42,.15)!important;border-radius:12px!important;padding:12px 16px!important;font-size:16px!important;line-height:1.5!important;outline:none!important;-webkit-appearance:none!important;-moz-appearance:none!important;appearance:none!important}.bob-widget-root input[type=text]:focus,.bob-widget-root input[type=search]:focus,.bob-widget-root textarea:focus{border-color:#fff9!important;box-shadow:0 0 0 3px #0066cc4d!important}.bob-widget-root button{-webkit-appearance:none!important;-moz-appearance:none!important;appearance:none!important;background:transparent;border:none;cursor:pointer;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif!important;font-size:inherit;line-height:inherit;padding:0;margin:0}.bob-widget-root .bob-chat-drawer,.bob-widget-root .bob-product-column{display:flex!important;flex-direction:column!important}.bob-widget-root{position:relative!important;z-index:var(--bob-z-base, 50)!important}.bob-widget-root *{transform-style:flat}.bob-widget-root,.bob-widget-root *{max-width:none}.bob-widget-root .bob-ptt-btn{background:var(--bob-ptt-bg)!important;box-shadow:var(--bob-ptt-shadow)!important;border:var(--bob-ptt-border)!important;border-radius:var(--bob-ptt-radius)!important}.bob-widget-root .bob-chat-input{background:#fff!important;color:#0f172a!important;border:2px solid rgba(15,23,42,.15)!important;border-radius:20px!important}.bob-widget-root .bob-state-overlay{background:#fff!important;border:2px solid rgba(15,23,42,.15)!important;border-radius:20px!important}
|
|
1
|
+
.bob-widget-root{position:relative;display:flex;flex-direction:column;width:100%;height:100%;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;font-size:16px;line-height:1.5;color:#1a1a1a;background:transparent;isolation:isolate;contain:layout style;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;box-sizing:border-box;--border: transparent !important;--border-border: transparent !important;--bob-blur-intensity: 8px;--bob-overlay-opacity: .15;--bob-z-base: 50;--bob-primary-color: #0066cc;--bob-accent-color: #ff8c00}.bob-widget-root *,.bob-widget-root *:before,.bob-widget-root *:after{box-sizing:border-box}.bob-widget-root button,.bob-widget-root [role=button]{min-height:unset!important;min-width:unset!important}.bob-widget-root input,.bob-widget-root textarea{font-size:16px!important;-webkit-user-select:text!important;user-select:text!important;-webkit-touch-callout:default!important}.bob-widget-root *:focus-visible{outline:2px solid #2563eb!important;outline-offset:2px!important}.bob-widget-root a{color:inherit;text-decoration:none}.bob-widget-root svg{display:inline-block;vertical-align:middle}.bob-widget-root img{max-width:100%;height:auto;display:block}.bob-widget-root ul,.bob-widget-root ol{list-style:none;margin:0;padding:0}.bob-widget-root h1,.bob-widget-root h2,.bob-widget-root h3,.bob-widget-root h4,.bob-widget-root h5,.bob-widget-root h6{font-size:inherit;font-weight:inherit;margin:0}.bob-widget-root p{margin:0}.bob-widget-root .bob-flex{display:flex}.bob-widget-root .bob-flex-col{flex-direction:column}.bob-widget-root .bob-items-center{align-items:center}.bob-widget-root .bob-justify-center{justify-content:center}.bob-widget-root .bob-gap-2{gap:.5rem}.bob-widget-root .bob-gap-3{gap:.75rem}@keyframes ptt-pulse{0%,to{box-shadow:0 0 #22c55e80}50%{box-shadow:0 0 0 16px #22c55e00}}@keyframes ptt-wave{0%{transform:translate(-50%,-50%) scale(1);opacity:.6}to{transform:translate(-50%,-50%) scale(2);opacity:0}}@keyframes ptt-dot{0%{opacity:.4;transform:scale(.8)}to{opacity:1;transform:scale(1)}}@keyframes ring-breathe{0%,to{transform:translate(-50%,-50%) scale(1);box-shadow:0 0 #22c55e66}50%{transform:translate(-50%,-50%) scale(1.15);box-shadow:0 0 20px 4px #22c55e33}}@keyframes ring-processing{0%,to{transform:translate(-50%,-50%) scale(1.1);opacity:.6}50%{transform:translate(-50%,-50%) scale(.95);opacity:.3}}@keyframes ring-speaking{0%,to{transform:translate(-50%,-50%) scale(1);box-shadow:0 0 12px 2px #22c55e4d}50%{transform:translate(-50%,-50%) scale(1.12);box-shadow:0 0 24px 6px #22c55e26}}@keyframes dot-pulse{0%,to{opacity:.3;transform:scale(.85)}50%{opacity:1;transform:scale(1.1)}}@keyframes processing-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes waveform-bar{0%,to{height:4px}50%{height:18px}}.bob-widget-root .glass-card{transition:transform .3s cubic-bezier(.34,1.56,.64,1),box-shadow .3s ease-out,border-color .3s ease}.bob-widget-root .glass-card:active{transform:scale(.98) translateY(0)!important}.bob-widget-root .glass-button{transition:transform .2s cubic-bezier(.34,1.56,.64,1),box-shadow .2s ease-out,background .2s ease}.bob-widget-root .glass-button:active{transform:scale(.95) translateY(0)!important}.bob-widget-root .product-scroll::-webkit-scrollbar{display:none}.bob-widget-root .product-scroll{scrollbar-width:none;-ms-overflow-style:none}.bob-widget-root .glass-scroll::-webkit-scrollbar{display:none}.bob-widget-root .glass-scroll{scrollbar-width:none;-ms-overflow-style:none}.bob-widget-root .high-contrast-input::placeholder{color:#0f172a80}.bob-widget-root .high-contrast-input:focus::placeholder{color:#0f172a66}.bob-widget-root input[type=text],.bob-widget-root input[type=search],.bob-widget-root textarea{background:#fff!important;color:#0f172a!important;border:2px solid rgba(15,23,42,.15)!important;border-radius:12px!important;padding:12px 16px!important;font-size:16px!important;line-height:1.5!important;outline:none!important;-webkit-appearance:none!important;-moz-appearance:none!important;appearance:none!important}.bob-widget-root input[type=text]:focus,.bob-widget-root input[type=search]:focus,.bob-widget-root textarea:focus{border-color:#fff9!important;box-shadow:0 0 0 3px #0066cc4d!important}.bob-widget-root button{-webkit-appearance:none!important;-moz-appearance:none!important;appearance:none!important;background:transparent;border:none;cursor:pointer;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif!important;font-size:inherit;line-height:inherit;padding:0;margin:0}.bob-widget-root .bob-chat-drawer,.bob-widget-root .bob-product-column{display:flex!important;flex-direction:column!important}.bob-widget-root{position:relative!important;z-index:var(--bob-z-base, 50)!important}.bob-widget-root *{transform-style:flat}.bob-widget-root,.bob-widget-root *{max-width:none}.bob-widget-root .bob-ptt-btn{background:var(--bob-ptt-bg)!important;box-shadow:var(--bob-ptt-shadow)!important;border:var(--bob-ptt-border)!important;border-radius:var(--bob-ptt-radius)!important}.bob-widget-root .bob-chat-input{background:#fff!important;color:#0f172a!important;border:2px solid rgba(15,23,42,.15)!important;border-radius:20px!important}.bob-widget-root .bob-state-overlay{background:#fff!important;border:2px solid rgba(15,23,42,.15)!important;border-radius:20px!important}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* iOS Audio Unlock Utility — Web Audio API Approach
|
|
3
|
+
*
|
|
4
|
+
* All iOS browsers (Safari, Chrome, Firefox) use WebKit under the hood.
|
|
5
|
+
* WebKit blocks programmatic audio playback unless an AudioContext has been
|
|
6
|
+
* `.resume()`'d during a direct user gesture (touch/click).
|
|
7
|
+
*
|
|
8
|
+
* This module creates a **singleton AudioContext** that is resumed on the
|
|
9
|
+
* first interaction. Once resumed it stays in the "running" state for the
|
|
10
|
+
* lifetime of the page, so all subsequent `decodeAudioData` / `start()`
|
|
11
|
+
* calls succeed — even after async network requests.
|
|
12
|
+
*
|
|
13
|
+
* Call `setupIOSAudioUnlock(root)` once when the widget mounts.
|
|
14
|
+
* Use `playAudioBuffer()` to route all TTS playback through the shared context.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Get (or lazily create) the shared AudioContext singleton.
|
|
18
|
+
*/
|
|
19
|
+
export declare const getAudioContext: () => AudioContext;
|
|
20
|
+
/**
|
|
21
|
+
* Resume the AudioContext — must be called inside a user-gesture handler.
|
|
22
|
+
* Returns `true` if the context is now in the "running" state.
|
|
23
|
+
*/
|
|
24
|
+
export declare const resumeAudioContext: () => Promise<boolean>;
|
|
25
|
+
/** Check whether the AudioContext is in the "running" state */
|
|
26
|
+
export declare const isAudioContextReady: () => boolean;
|
|
27
|
+
/** Legacy compat — kept so existing callers still work */
|
|
28
|
+
export declare const isAudioUnlocked: () => boolean;
|
|
29
|
+
export interface PlaybackHandle {
|
|
30
|
+
source: AudioBufferSourceNode;
|
|
31
|
+
stop: () => void;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Decode raw audio bytes (MP3, WAV, etc.) and play them through the shared
|
|
35
|
+
* AudioContext. Returns a handle with a `.stop()` method for interrupts.
|
|
36
|
+
*
|
|
37
|
+
* @param arrayBuffer Raw audio data (e.g. from `fetch().arrayBuffer()`)
|
|
38
|
+
* @param onStart Called when playback actually begins
|
|
39
|
+
* @param onEnded Called when the buffer finishes playing (or is stopped)
|
|
40
|
+
*/
|
|
41
|
+
export declare const playAudioBuffer: (arrayBuffer: ArrayBuffer, onStart?: () => void, onEnded?: () => void) => Promise<PlaybackHandle>;
|
|
42
|
+
/**
|
|
43
|
+
* Attach a one-shot touchstart / pointerdown / click listener to the given
|
|
44
|
+
* element that resumes the AudioContext on the first user gesture.
|
|
45
|
+
* Returns a cleanup function to remove the listeners.
|
|
46
|
+
*/
|
|
47
|
+
export declare const setupIOSAudioUnlock: (root: HTMLElement | null) => (() => void);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gymmymac/bob-widget",
|
|
3
|
-
"version": "3.2.
|
|
3
|
+
"version": "3.2.18",
|
|
4
4
|
"description": "Bob - AI-powered automotive parts assistant widget with multi-tenant support, RAF animations, swipeable interactions, and GA4 analytics",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|