@wallavi/widget 1.10.0 → 1.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +583 -232
- package/dist/index.mjs +583 -232
- package/dist/styles.css +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -58,7 +58,7 @@ function styleInject(css, { insertAt } = {}) {
|
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
// src/styles.css
|
|
61
|
-
styleInject(".ww-pointer-events-none {\n pointer-events: none;\n}\n.ww-absolute {\n position: absolute;\n}\n.ww-relative {\n position: relative;\n}\n.ww-inset-0 {\n inset: 0px;\n}\n.ww-inset-4 {\n inset: 1rem;\n}\n.ww-inset-8 {\n inset: 2rem;\n}\n.ww-left-2\\.5 {\n left: 0.625rem;\n}\n.ww-top-1\\/2 {\n top: 50%;\n}\n.ww-z-50 {\n z-index: 50;\n}\n.ww-z-\\[100\\] {\n z-index: 100;\n}\n.ww-mb-1 {\n margin-bottom: 0.25rem;\n}\n.ww-mb-12 {\n margin-bottom: 3rem;\n}\n.ww-mb-2 {\n margin-bottom: 0.5rem;\n}\n.ww-ml-0\\.5 {\n margin-left: 0.125rem;\n}\n.ww-ml-1 {\n margin-left: 0.25rem;\n}\n.ww-mt-0\\.5 {\n margin-top: 0.125rem;\n}\n.ww-mt-1 {\n margin-top: 0.25rem;\n}\n.ww-block {\n display: block;\n}\n.ww-inline-block {\n display: inline-block;\n}\n.ww-flex {\n display: flex;\n}\n.ww-inline-flex {\n display: inline-flex;\n}\n.ww-grid {\n display: grid;\n}\n.ww-hidden {\n display: none;\n}\n.ww-h-1\\.5 {\n height: 0.375rem;\n}\n.ww-h-10 {\n height: 2.5rem;\n}\n.ww-h-16 {\n height: 4rem;\n}\n.ww-h-2 {\n height: 0.5rem;\n}\n.ww-h-2\\.5 {\n height: 0.625rem;\n}\n.ww-h-20 {\n height: 5rem;\n}\n.ww-h-3 {\n height: 0.75rem;\n}\n.ww-h-3\\.5 {\n height: 0.875rem;\n}\n.ww-h-4 {\n height: 1rem;\n}\n.ww-h-40 {\n height: 10rem;\n}\n.ww-h-48 {\n height: 12rem;\n}\n.ww-h-6 {\n height: 1.5rem;\n}\n.ww-h-7 {\n height: 1.75rem;\n}\n.ww-h-8 {\n height: 2rem;\n}\n.ww-h-full {\n height: 100%;\n}\n.ww-max-h-32 {\n max-height: 8rem;\n}\n.ww-max-h-48 {\n max-height: 12rem;\n}\n.ww-max-h-\\[168px\\] {\n max-height: 168px;\n}\n.ww-max-h-\\[180px\\] {\n max-height: 180px;\n}\n.ww-w-0\\.5 {\n width: 0.125rem;\n}\n.ww-w-1\\.5 {\n width: 0.375rem;\n}\n.ww-w-10 {\n width: 2.5rem;\n}\n.ww-w-16 {\n width: 4rem;\n}\n.ww-w-2 {\n width: 0.5rem;\n}\n.ww-w-2\\.5 {\n width: 0.625rem;\n}\n.ww-w-20 {\n width: 5rem;\n}\n.ww-w-3 {\n width: 0.75rem;\n}\n.ww-w-3\\.5 {\n width: 0.875rem;\n}\n.ww-w-4 {\n width: 1rem;\n}\n.ww-w-48 {\n width: 12rem;\n}\n.ww-w-6 {\n width: 1.5rem;\n}\n.ww-w-7 {\n width: 1.75rem;\n}\n.ww-w-8 {\n width: 2rem;\n}\n.ww-w-fit {\n width: -moz-fit-content;\n width: fit-content;\n}\n.ww-w-full {\n width: 100%;\n}\n.ww-min-w-0 {\n min-width: 0px;\n}\n.ww-max-w-\\[120px\\] {\n max-width: 120px;\n}\n.ww-max-w-\\[200px\\] {\n max-width: 200px;\n}\n.ww-max-w-\\[78\\%\\] {\n max-width: 78%;\n}\n.ww-max-w-\\[82\\%\\] {\n max-width: 82%;\n}\n.ww-max-w-none {\n max-width: none;\n}\n.ww-flex-1 {\n flex: 1 1 0%;\n}\n.ww-shrink-0 {\n flex-shrink: 0;\n}\n.ww-rotate-180 {\n --tw-rotate: 180deg;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.ww-scale-100 {\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.ww-scale-105 {\n --tw-scale-x: 1.05;\n --tw-scale-y: 1.05;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.ww-scale-110 {\n --tw-scale-x: 1.1;\n --tw-scale-y: 1.1;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.ww-scale-90 {\n --tw-scale-x: .9;\n --tw-scale-y: .9;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n@keyframes ww-ping {\n 75%, 100% {\n transform: scale(2);\n opacity: 0;\n }\n}\n.ww-animate-ping {\n animation: ww-ping 1s cubic-bezier(0, 0, 0.2, 1) infinite;\n}\n@keyframes ww-pulse {\n 50% {\n opacity: .5;\n }\n}\n.ww-animate-pulse {\n animation: ww-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n}\n@keyframes ww-spin {\n to {\n transform: rotate(360deg);\n }\n}\n.ww-animate-spin {\n animation: ww-spin 1s linear infinite;\n}\n.ww-cursor-default {\n cursor: default;\n}\n.ww-cursor-pointer {\n cursor: pointer;\n}\n.ww-touch-none {\n touch-action: none;\n}\n.ww-select-none {\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n}\n.ww-resize-none {\n resize: none;\n}\n.ww-grid-cols-2 {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n.ww-flex-col {\n flex-direction: column;\n}\n.ww-flex-wrap {\n flex-wrap: wrap;\n}\n.ww-items-start {\n align-items: flex-start;\n}\n.ww-items-end {\n align-items: flex-end;\n}\n.ww-items-center {\n align-items: center;\n}\n.ww-justify-end {\n justify-content: flex-end;\n}\n.ww-justify-center {\n justify-content: center;\n}\n.ww-justify-between {\n justify-content: space-between;\n}\n.ww-gap-0\\.5 {\n gap: 0.125rem;\n}\n.ww-gap-1 {\n gap: 0.25rem;\n}\n.ww-gap-1\\.5 {\n gap: 0.375rem;\n}\n.ww-gap-2 {\n gap: 0.5rem;\n}\n.ww-gap-2\\.5 {\n gap: 0.625rem;\n}\n.ww-gap-4 {\n gap: 1rem;\n}\n.ww-gap-6 {\n gap: 1.5rem;\n}\n.ww-gap-8 {\n gap: 2rem;\n}\n.ww-divide-y > :not([hidden]) ~ :not([hidden]) {\n --tw-divide-y-reverse: 0;\n border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse)));\n border-bottom-width: calc(1px * var(--tw-divide-y-reverse));\n}\n.ww-divide-border\\/40 > :not([hidden]) ~ :not([hidden]) {\n border-color: hsl(var(--border) / 0.4);\n}\n.ww-overflow-hidden {\n overflow: hidden;\n}\n.ww-overflow-y-auto {\n overflow-y: auto;\n}\n.ww-overscroll-contain {\n overscroll-behavior: contain;\n}\n.ww-overscroll-none {\n overscroll-behavior: none;\n}\n.ww-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.ww-whitespace-pre-wrap {\n white-space: pre-wrap;\n}\n.ww-rounded {\n border-radius: 0.25rem;\n}\n.ww-rounded-2xl {\n border-radius: 1rem;\n}\n.ww-rounded-full {\n border-radius: 9999px;\n}\n.ww-rounded-lg {\n border-radius: var(--radius);\n}\n.ww-rounded-xl {\n border-radius: 0.75rem;\n}\n.ww-rounded-tl-none {\n border-top-left-radius: 0px;\n}\n.ww-rounded-tl-sm {\n border-top-left-radius: calc(var(--radius) - 4px);\n}\n.ww-rounded-tr-sm {\n border-top-right-radius: calc(var(--radius) - 4px);\n}\n.ww-border {\n border-width: 1px;\n}\n.ww-border-2 {\n border-width: 2px;\n}\n.ww-border-b {\n border-bottom-width: 1px;\n}\n.ww-border-l-2 {\n border-left-width: 2px;\n}\n.ww-border-t {\n border-top-width: 1px;\n}\n.ww-border-background {\n border-color: hsl(var(--background));\n}\n.ww-border-black\\/10 {\n border-color: rgb(0 0 0 / 0.1);\n}\n.ww-border-border {\n border-color: hsl(var(--border));\n}\n.ww-border-border\\/30 {\n border-color: hsl(var(--border) / 0.3);\n}\n.ww-border-border\\/40 {\n border-color: hsl(var(--border) / 0.4);\n}\n.ww-border-border\\/50 {\n border-color: hsl(var(--border) / 0.5);\n}\n.ww-border-border\\/60 {\n border-color: hsl(var(--border) / 0.6);\n}\n.ww-border-border\\/80 {\n border-color: hsl(var(--border) / 0.8);\n}\n.ww-border-muted {\n border-color: hsl(var(--muted));\n}\n.ww-border-muted-foreground\\/30 {\n border-color: hsl(var(--muted-foreground) / 0.3);\n}\n.ww-border-primary\\/10 {\n border-color: hsl(var(--primary) / 0.1);\n}\n.ww-border-red-200 {\n --tw-border-opacity: 1;\n border-color: rgb(254 202 202 / var(--tw-border-opacity, 1));\n}\n.ww-border-transparent {\n border-color: transparent;\n}\n.ww-border-white\\/20 {\n border-color: rgb(255 255 255 / 0.2);\n}\n.ww-bg-background {\n background-color: hsl(var(--background));\n}\n.ww-bg-background\\/20 {\n background-color: hsl(var(--background) / 0.2);\n}\n.ww-bg-background\\/90 {\n background-color: hsl(var(--background) / 0.9);\n}\n.ww-bg-background\\/95 {\n background-color: hsl(var(--background) / 0.95);\n}\n.ww-bg-black\\/10 {\n background-color: rgb(0 0 0 / 0.1);\n}\n.ww-bg-emerald-400 {\n --tw-bg-opacity: 1;\n background-color: rgb(52 211 153 / var(--tw-bg-opacity, 1));\n}\n.ww-bg-emerald-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(16 185 129 / var(--tw-bg-opacity, 1));\n}\n.ww-bg-emerald-500\\/10 {\n background-color: rgb(16 185 129 / 0.1);\n}\n.ww-bg-emerald-500\\/20 {\n background-color: rgb(16 185 129 / 0.2);\n}\n.ww-bg-foreground\\/20 {\n background-color: hsl(var(--foreground) / 0.2);\n}\n.ww-bg-foreground\\/5 {\n background-color: hsl(var(--foreground) / 0.05);\n}\n.ww-bg-foreground\\/60 {\n background-color: hsl(var(--foreground) / 0.6);\n}\n.ww-bg-muted {\n background-color: hsl(var(--muted));\n}\n.ww-bg-muted-foreground\\/10 {\n background-color: hsl(var(--muted-foreground) / 0.1);\n}\n.ww-bg-muted\\/30 {\n background-color: hsl(var(--muted) / 0.3);\n}\n.ww-bg-muted\\/40 {\n background-color: hsl(var(--muted) / 0.4);\n}\n.ww-bg-muted\\/50 {\n background-color: hsl(var(--muted) / 0.5);\n}\n.ww-bg-muted\\/60 {\n background-color: hsl(var(--muted) / 0.6);\n}\n.ww-bg-primary {\n background-color: hsl(var(--primary));\n}\n.ww-bg-primary\\/5 {\n background-color: hsl(var(--primary) / 0.05);\n}\n.ww-bg-purple-500\\/20 {\n background-color: rgb(168 85 247 / 0.2);\n}\n.ww-bg-purple-500\\/30 {\n background-color: rgb(168 85 247 / 0.3);\n}\n.ww-bg-red-50 {\n --tw-bg-opacity: 1;\n background-color: rgb(254 242 242 / var(--tw-bg-opacity, 1));\n}\n.ww-bg-transparent {\n background-color: transparent;\n}\n.ww-bg-white\\/10 {\n background-color: rgb(255 255 255 / 0.1);\n}\n.ww-bg-white\\/15 {\n background-color: rgb(255 255 255 / 0.15);\n}\n.ww-fill-current {\n fill: currentColor;\n}\n.ww-object-cover {\n -o-object-fit: cover;\n object-fit: cover;\n}\n.ww-p-0\\.5 {\n padding: 0.125rem;\n}\n.ww-p-1\\.5 {\n padding: 0.375rem;\n}\n.ww-p-3 {\n padding: 0.75rem;\n}\n.ww-px-1 {\n padding-left: 0.25rem;\n padding-right: 0.25rem;\n}\n.ww-px-2 {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n}\n.ww-px-2\\.5 {\n padding-left: 0.625rem;\n padding-right: 0.625rem;\n}\n.ww-px-3 {\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n}\n.ww-px-3\\.5 {\n padding-left: 0.875rem;\n padding-right: 0.875rem;\n}\n.ww-px-4 {\n padding-left: 1rem;\n padding-right: 1rem;\n}\n.ww-py-0\\.5 {\n padding-top: 0.125rem;\n padding-bottom: 0.125rem;\n}\n.ww-py-1 {\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n}\n.ww-py-1\\.5 {\n padding-top: 0.375rem;\n padding-bottom: 0.375rem;\n}\n.ww-py-2 {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n.ww-py-2\\.5 {\n padding-top: 0.625rem;\n padding-bottom: 0.625rem;\n}\n.ww-py-3 {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n}\n.ww-py-4 {\n padding-top: 1rem;\n padding-bottom: 1rem;\n}\n.ww-pb-1\\.5 {\n padding-bottom: 0.375rem;\n}\n.ww-pb-2 {\n padding-bottom: 0.5rem;\n}\n.ww-pb-4 {\n padding-bottom: 1rem;\n}\n.ww-pl-2 {\n padding-left: 0.5rem;\n}\n.ww-pl-7 {\n padding-left: 1.75rem;\n}\n.ww-pr-0\\.5 {\n padding-right: 0.125rem;\n}\n.ww-pr-3 {\n padding-right: 0.75rem;\n}\n.ww-pt-2 {\n padding-top: 0.5rem;\n}\n.ww-pt-2\\.5 {\n padding-top: 0.625rem;\n}\n.ww-pt-5 {\n padding-top: 1.25rem;\n}\n.ww-text-left {\n text-align: left;\n}\n.ww-text-center {\n text-align: center;\n}\n.ww-align-middle {\n vertical-align: middle;\n}\n.ww-text-\\[10\\.5px\\] {\n font-size: 10.5px;\n}\n.ww-text-\\[10px\\] {\n font-size: 10px;\n}\n.ww-text-\\[11px\\] {\n font-size: 11px;\n}\n.ww-text-\\[12\\.5px\\] {\n font-size: 12.5px;\n}\n.ww-text-\\[13px\\] {\n font-size: 13px;\n}\n.ww-text-\\[8px\\] {\n font-size: 8px;\n}\n.ww-text-\\[9px\\] {\n font-size: 9px;\n}\n.ww-text-sm {\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n.ww-text-xs {\n font-size: 0.75rem;\n line-height: 1rem;\n}\n.ww-font-medium {\n font-weight: 500;\n}\n.ww-font-semibold {\n font-weight: 600;\n}\n.ww-uppercase {\n text-transform: uppercase;\n}\n.ww-leading-none {\n line-height: 1;\n}\n.ww-leading-relaxed {\n line-height: 1.625;\n}\n.ww-leading-snug {\n line-height: 1.375;\n}\n.ww-leading-tight {\n line-height: 1.25;\n}\n.ww-tracking-wide {\n letter-spacing: 0.025em;\n}\n.ww-tracking-wider {\n letter-spacing: 0.05em;\n}\n.ww-tracking-widest {\n letter-spacing: 0.1em;\n}\n.ww-text-black\\/40 {\n color: rgb(0 0 0 / 0.4);\n}\n.ww-text-black\\/60 {\n color: rgb(0 0 0 / 0.6);\n}\n.ww-text-destructive {\n color: hsl(var(--destructive));\n}\n.ww-text-destructive\\/70 {\n color: hsl(var(--destructive) / 0.7);\n}\n.ww-text-emerald-500 {\n --tw-text-opacity: 1;\n color: rgb(16 185 129 / var(--tw-text-opacity, 1));\n}\n.ww-text-foreground {\n color: hsl(var(--foreground));\n}\n.ww-text-foreground\\/60 {\n color: hsl(var(--foreground) / 0.6);\n}\n.ww-text-foreground\\/70 {\n color: hsl(var(--foreground) / 0.7);\n}\n.ww-text-foreground\\/80 {\n color: hsl(var(--foreground) / 0.8);\n}\n.ww-text-muted-foreground {\n color: hsl(var(--muted-foreground));\n}\n.ww-text-muted-foreground\\/40 {\n color: hsl(var(--muted-foreground) / 0.4);\n}\n.ww-text-muted-foreground\\/50 {\n color: hsl(var(--muted-foreground) / 0.5);\n}\n.ww-text-muted-foreground\\/70 {\n color: hsl(var(--muted-foreground) / 0.7);\n}\n.ww-text-muted-foreground\\/80 {\n color: hsl(var(--muted-foreground) / 0.8);\n}\n.ww-text-primary {\n color: hsl(var(--primary));\n}\n.ww-text-primary-foreground {\n color: hsl(var(--primary-foreground));\n}\n.ww-text-primary\\/70 {\n color: hsl(var(--primary) / 0.7);\n}\n.ww-text-primary\\/80 {\n color: hsl(var(--primary) / 0.8);\n}\n.ww-text-red-400 {\n --tw-text-opacity: 1;\n color: rgb(248 113 113 / var(--tw-text-opacity, 1));\n}\n.ww-text-red-500 {\n --tw-text-opacity: 1;\n color: rgb(239 68 68 / var(--tw-text-opacity, 1));\n}\n.ww-text-red-600 {\n --tw-text-opacity: 1;\n color: rgb(220 38 38 / var(--tw-text-opacity, 1));\n}\n.ww-text-white {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity, 1));\n}\n.ww-text-white\\/60 {\n color: rgb(255 255 255 / 0.6);\n}\n.ww-text-white\\/80 {\n color: rgb(255 255 255 / 0.8);\n}\n.ww-line-through {\n text-decoration-line: line-through;\n}\n.ww-no-underline {\n text-decoration-line: none;\n}\n.ww-decoration-foreground\\/20 {\n text-decoration-color: hsl(var(--foreground) / 0.2);\n}\n.ww-opacity-100 {\n opacity: 1;\n}\n.ww-opacity-25 {\n opacity: 0.25;\n}\n.ww-opacity-30 {\n opacity: 0.3;\n}\n.ww-opacity-40 {\n opacity: 0.4;\n}\n.ww-opacity-60 {\n opacity: 0.6;\n}\n.ww-opacity-70 {\n opacity: 0.7;\n}\n.ww-opacity-75 {\n opacity: 0.75;\n}\n.ww-opacity-80 {\n opacity: 0.8;\n}\n.ww-opacity-90 {\n opacity: 0.9;\n}\n.ww-shadow-2xl {\n --tw-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25);\n --tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.ww-shadow-lg {\n --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.ww-shadow-md {\n --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.ww-shadow-sm {\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.ww-shadow-xl {\n --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.ww-outline-none {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.ww-ring-2 {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow:\n var(--tw-ring-offset-shadow),\n var(--tw-ring-shadow),\n var(--tw-shadow, 0 0 #0000);\n}\n.ww-ring-inset {\n --tw-ring-inset: inset;\n}\n.ww-ring-primary\\/20 {\n --tw-ring-color: hsl(var(--primary) / 0.2);\n}\n.ww-ring-primary\\/60 {\n --tw-ring-color: hsl(var(--primary) / 0.6);\n}\n.ww-backdrop-blur-sm {\n --tw-backdrop-blur: blur(4px);\n backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n}\n.ww-backdrop-blur-xl {\n --tw-backdrop-blur: blur(24px);\n backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n}\n.ww-transition-all {\n transition-property: all;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.ww-transition-colors {\n transition-property:\n color,\n background-color,\n border-color,\n text-decoration-color,\n fill,\n stroke;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.ww-transition-opacity {\n transition-property: opacity;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.ww-transition-shadow {\n transition-property: box-shadow;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.ww-transition-transform {\n transition-property: transform;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.ww-duration-1000 {\n transition-duration: 1000ms;\n}\n.ww-duration-150 {\n transition-duration: 150ms;\n}\n.ww-duration-200 {\n transition-duration: 200ms;\n}\n.ww-duration-300 {\n transition-duration: 300ms;\n}\n.ww-duration-500 {\n transition-duration: 500ms;\n}\n.ww-duration-700 {\n transition-duration: 700ms;\n}\n@keyframes enter {\n from {\n opacity: var(--tw-enter-opacity, 1);\n transform: translate3d(var(--tw-enter-translate-x, 0), var(--tw-enter-translate-y, 0), 0) scale3d(var(--tw-enter-scale, 1), var(--tw-enter-scale, 1), var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0));\n }\n}\n@keyframes exit {\n to {\n opacity: var(--tw-exit-opacity, 1);\n transform: translate3d(var(--tw-exit-translate-x, 0), var(--tw-exit-translate-y, 0), 0) scale3d(var(--tw-exit-scale, 1), var(--tw-exit-scale, 1), var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0));\n }\n}\n.ww-animate-in {\n animation-name: enter;\n animation-duration: 150ms;\n --tw-enter-opacity: initial;\n --tw-enter-scale: initial;\n --tw-enter-rotate: initial;\n --tw-enter-translate-x: initial;\n --tw-enter-translate-y: initial;\n}\n.ww-fade-in {\n --tw-enter-opacity: 0;\n}\n.ww-slide-in-from-top-1 {\n --tw-enter-translate-y: -0.25rem;\n}\n.ww-duration-1000 {\n animation-duration: 1000ms;\n}\n.ww-duration-150 {\n animation-duration: 150ms;\n}\n.ww-duration-200 {\n animation-duration: 200ms;\n}\n.ww-duration-300 {\n animation-duration: 300ms;\n}\n.ww-duration-500 {\n animation-duration: 500ms;\n}\n.ww-duration-700 {\n animation-duration: 700ms;\n}\n.wallavi-widget *,\n.wallavi-widget *::before,\n.wallavi-widget *::after {\n box-sizing: border-box;\n border-width: 0;\n border-style: solid;\n}\n.wallavi-widget button {\n -moz-appearance: none;\n appearance: none;\n -webkit-appearance: none;\n background: transparent;\n border: none;\n cursor: pointer;\n}\n.wallavi-widget textarea,\n.wallavi-widget input,\n.wallavi-widget select {\n font-family: inherit;\n font-size: inherit;\n}\n.wallavi-widget img,\n.wallavi-widget video {\n max-width: 100%;\n height: auto;\n}\n.wallavi-widget .lk-control-bar {\n background: transparent !important;\n border: none !important;\n box-shadow: none !important;\n padding: 0 !important;\n gap: 1.5rem !important;\n justify-content: center !important;\n}\n.wallavi-widget .lk-button {\n background: rgba(25, 25, 28, 0.05) !important;\n border-radius: 9999px !important;\n padding: 1.25rem !important;\n color: var(--ww-fg, #19191c) !important;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1) !important;\n border: 1px solid rgba(25, 25, 28, 0.1) !important;\n}\n.wallavi-widget .lk-button:hover {\n background: rgba(25, 25, 28, 0.1) !important;\n transform: scale(1.05) !important;\n}\n.wallavi-widget .lk-disconnect-button {\n background: #ef4444 !important;\n color: white !important;\n border: none !important;\n}\n.wallavi-widget .lk-disconnect-button:hover {\n background: #dc2626 !important;\n}\n.wallavi-widget .lk-device-menu {\n bottom: 100% !important;\n top: auto !important;\n margin-bottom: 1rem !important;\n max-width: 250px !important;\n width: -moz-max-content !important;\n width: max-content !important;\n left: 50% !important;\n transform: translateX(-50%) !important;\n background: #ffffff !important;\n border-radius: 16px !important;\n box-shadow: 0 20px 40px -10px rgba(0, 0, 0, 0.15), 0 10px 20px -10px rgba(0, 0, 0, 0.1) !important;\n z-index: 1000 !important;\n overflow: hidden !important;\n border: 1px solid rgba(0, 0, 0, 0.05) !important;\n padding: 0.5rem !important;\n}\n.wallavi-widget .lk-device-menu > li {\n padding: 0.75rem 1rem !important;\n font-size: 0.875rem !important;\n color: #19191c !important;\n white-space: nowrap !important;\n overflow: hidden !important;\n text-overflow: ellipsis !important;\n border-radius: 8px !important;\n transition: background 0.15s !important;\n}\n.wallavi-widget .lk-device-menu > li:hover {\n background: rgba(0, 0, 0, 0.05) !important;\n}\n.wallavi-widget .lk-device-menu > li.lk-active {\n background: rgba(0, 0, 0, 0.08) !important;\n font-weight: 600 !important;\n}\n.placeholder\\:ww-text-muted-foreground\\/40::-moz-placeholder {\n color: hsl(var(--muted-foreground) / 0.4);\n}\n.placeholder\\:ww-text-muted-foreground\\/40::placeholder {\n color: hsl(var(--muted-foreground) / 0.4);\n}\n.placeholder\\:ww-text-muted-foreground\\/50::-moz-placeholder {\n color: hsl(var(--muted-foreground) / 0.5);\n}\n.placeholder\\:ww-text-muted-foreground\\/50::placeholder {\n color: hsl(var(--muted-foreground) / 0.5);\n}\n.focus-within\\:ww-ring-1:focus-within {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow:\n var(--tw-ring-offset-shadow),\n var(--tw-ring-shadow),\n var(--tw-shadow, 0 0 #0000);\n}\n.focus-within\\:ww-ring-ring\\/40:focus-within {\n --tw-ring-color: hsl(var(--ring) / 0.4);\n}\n.hover\\:-ww-translate-y-1:hover {\n --tw-translate-y: -0.25rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.hover\\:ww-border-primary\\/40:hover {\n border-color: hsl(var(--primary) / 0.4);\n}\n.hover\\:ww-bg-accent:hover {\n background-color: hsl(var(--accent));\n}\n.hover\\:ww-bg-foreground\\/10:hover {\n background-color: hsl(var(--foreground) / 0.1);\n}\n.hover\\:ww-bg-foreground\\/30:hover {\n background-color: hsl(var(--foreground) / 0.3);\n}\n.hover\\:ww-bg-muted:hover {\n background-color: hsl(var(--muted));\n}\n.hover\\:ww-bg-white\\/10:hover {\n background-color: rgb(255 255 255 / 0.1);\n}\n.hover\\:ww-text-accent-foreground:hover {\n color: hsl(var(--accent-foreground));\n}\n.hover\\:ww-text-foreground:hover {\n color: hsl(var(--foreground));\n}\n.hover\\:ww-text-primary:hover {\n color: hsl(var(--primary));\n}\n.hover\\:ww-opacity-80:hover {\n opacity: 0.8;\n}\n.hover\\:ww-opacity-85:hover {\n opacity: 0.85;\n}\n.hover\\:ww-shadow-sm:hover {\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.hover\\:ww-shadow-xl:hover {\n --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.focus\\:ww-ring-1:focus {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow:\n var(--tw-ring-offset-shadow),\n var(--tw-ring-shadow),\n var(--tw-shadow, 0 0 #0000);\n}\n.focus\\:ww-ring-ring\\/40:focus {\n --tw-ring-color: hsl(var(--ring) / 0.4);\n}\n.active\\:ww-scale-\\[0\\.98\\]:active {\n --tw-scale-x: 0.98;\n --tw-scale-y: 0.98;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.disabled\\:ww-pointer-events-none:disabled {\n pointer-events: none;\n}\n.disabled\\:ww-opacity-40:disabled {\n opacity: 0.4;\n}\n.disabled\\:ww-opacity-50:disabled {\n opacity: 0.5;\n}\n.dark\\:ww-border-red-800:is(.ww-dark *) {\n --tw-border-opacity: 1;\n border-color: rgb(153 27 27 / var(--tw-border-opacity, 1));\n}\n.dark\\:ww-bg-red-950:is(.ww-dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(69 10 10 / var(--tw-bg-opacity, 1));\n}\n.dark\\:ww-text-red-400:is(.ww-dark *) {\n --tw-text-opacity: 1;\n color: rgb(248 113 113 / var(--tw-text-opacity, 1));\n}\n");
|
|
61
|
+
styleInject(".ww-pointer-events-none {\n pointer-events: none;\n}\n.ww-absolute {\n position: absolute;\n}\n.ww-relative {\n position: relative;\n}\n.ww-inset-0 {\n inset: 0px;\n}\n.ww-inset-4 {\n inset: 1rem;\n}\n.ww-inset-8 {\n inset: 2rem;\n}\n.ww-left-2\\.5 {\n left: 0.625rem;\n}\n.ww-top-1\\/2 {\n top: 50%;\n}\n.ww-z-50 {\n z-index: 50;\n}\n.ww-z-\\[100\\] {\n z-index: 100;\n}\n.ww-mx-0\\.5 {\n margin-left: 0.125rem;\n margin-right: 0.125rem;\n}\n.ww-mb-1 {\n margin-bottom: 0.25rem;\n}\n.ww-mb-12 {\n margin-bottom: 3rem;\n}\n.ww-mb-2 {\n margin-bottom: 0.5rem;\n}\n.ww-ml-0\\.5 {\n margin-left: 0.125rem;\n}\n.ww-ml-1 {\n margin-left: 0.25rem;\n}\n.ww-mt-0\\.5 {\n margin-top: 0.125rem;\n}\n.ww-mt-1 {\n margin-top: 0.25rem;\n}\n.ww-mt-2 {\n margin-top: 0.5rem;\n}\n.ww-line-clamp-2 {\n overflow: hidden;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n}\n.ww-block {\n display: block;\n}\n.ww-inline-block {\n display: inline-block;\n}\n.ww-flex {\n display: flex;\n}\n.ww-inline-flex {\n display: inline-flex;\n}\n.ww-grid {\n display: grid;\n}\n.ww-hidden {\n display: none;\n}\n.ww-h-1\\.5 {\n height: 0.375rem;\n}\n.ww-h-10 {\n height: 2.5rem;\n}\n.ww-h-16 {\n height: 4rem;\n}\n.ww-h-2 {\n height: 0.5rem;\n}\n.ww-h-2\\.5 {\n height: 0.625rem;\n}\n.ww-h-20 {\n height: 5rem;\n}\n.ww-h-3 {\n height: 0.75rem;\n}\n.ww-h-3\\.5 {\n height: 0.875rem;\n}\n.ww-h-4 {\n height: 1rem;\n}\n.ww-h-40 {\n height: 10rem;\n}\n.ww-h-48 {\n height: 12rem;\n}\n.ww-h-6 {\n height: 1.5rem;\n}\n.ww-h-7 {\n height: 1.75rem;\n}\n.ww-h-8 {\n height: 2rem;\n}\n.ww-h-full {\n height: 100%;\n}\n.ww-max-h-32 {\n max-height: 8rem;\n}\n.ww-max-h-48 {\n max-height: 12rem;\n}\n.ww-max-h-\\[168px\\] {\n max-height: 168px;\n}\n.ww-max-h-\\[180px\\] {\n max-height: 180px;\n}\n.ww-min-h-\\[22px\\] {\n min-height: 22px;\n}\n.ww-w-0\\.5 {\n width: 0.125rem;\n}\n.ww-w-1\\.5 {\n width: 0.375rem;\n}\n.ww-w-10 {\n width: 2.5rem;\n}\n.ww-w-16 {\n width: 4rem;\n}\n.ww-w-2 {\n width: 0.5rem;\n}\n.ww-w-2\\.5 {\n width: 0.625rem;\n}\n.ww-w-20 {\n width: 5rem;\n}\n.ww-w-3 {\n width: 0.75rem;\n}\n.ww-w-3\\.5 {\n width: 0.875rem;\n}\n.ww-w-4 {\n width: 1rem;\n}\n.ww-w-48 {\n width: 12rem;\n}\n.ww-w-6 {\n width: 1.5rem;\n}\n.ww-w-7 {\n width: 1.75rem;\n}\n.ww-w-8 {\n width: 2rem;\n}\n.ww-w-\\[280px\\] {\n width: 280px;\n}\n.ww-w-fit {\n width: -moz-fit-content;\n width: fit-content;\n}\n.ww-w-full {\n width: 100%;\n}\n.ww-min-w-0 {\n min-width: 0px;\n}\n.ww-max-w-\\[120px\\] {\n max-width: 120px;\n}\n.ww-max-w-\\[200px\\] {\n max-width: 200px;\n}\n.ww-max-w-\\[78\\%\\] {\n max-width: 78%;\n}\n.ww-max-w-\\[82\\%\\] {\n max-width: 82%;\n}\n.ww-max-w-full {\n max-width: 100%;\n}\n.ww-max-w-none {\n max-width: none;\n}\n.ww-flex-1 {\n flex: 1 1 0%;\n}\n.ww-shrink-0 {\n flex-shrink: 0;\n}\n.ww-rotate-180 {\n --tw-rotate: 180deg;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.ww-scale-100 {\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.ww-scale-105 {\n --tw-scale-x: 1.05;\n --tw-scale-y: 1.05;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.ww-scale-110 {\n --tw-scale-x: 1.1;\n --tw-scale-y: 1.1;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.ww-scale-90 {\n --tw-scale-x: .9;\n --tw-scale-y: .9;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n@keyframes ww-ping {\n 75%, 100% {\n transform: scale(2);\n opacity: 0;\n }\n}\n.ww-animate-ping {\n animation: ww-ping 1s cubic-bezier(0, 0, 0.2, 1) infinite;\n}\n@keyframes ww-pulse {\n 50% {\n opacity: .5;\n }\n}\n.ww-animate-pulse {\n animation: ww-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n}\n@keyframes ww-spin {\n to {\n transform: rotate(360deg);\n }\n}\n.ww-animate-spin {\n animation: ww-spin 1s linear infinite;\n}\n.ww-cursor-default {\n cursor: default;\n}\n.ww-cursor-pointer {\n cursor: pointer;\n}\n.ww-touch-none {\n touch-action: none;\n}\n.ww-select-none {\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n}\n.ww-select-all {\n -webkit-user-select: all;\n -moz-user-select: all;\n user-select: all;\n}\n.ww-grid-cols-2 {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n.ww-flex-row {\n flex-direction: row;\n}\n.ww-flex-col {\n flex-direction: column;\n}\n.ww-flex-wrap {\n flex-wrap: wrap;\n}\n.ww-items-start {\n align-items: flex-start;\n}\n.ww-items-end {\n align-items: flex-end;\n}\n.ww-items-center {\n align-items: center;\n}\n.ww-justify-end {\n justify-content: flex-end;\n}\n.ww-justify-center {\n justify-content: center;\n}\n.ww-justify-between {\n justify-content: space-between;\n}\n.ww-gap-0\\.5 {\n gap: 0.125rem;\n}\n.ww-gap-1 {\n gap: 0.25rem;\n}\n.ww-gap-1\\.5 {\n gap: 0.375rem;\n}\n.ww-gap-2 {\n gap: 0.5rem;\n}\n.ww-gap-2\\.5 {\n gap: 0.625rem;\n}\n.ww-gap-4 {\n gap: 1rem;\n}\n.ww-gap-5 {\n gap: 1.25rem;\n}\n.ww-gap-6 {\n gap: 1.5rem;\n}\n.ww-gap-8 {\n gap: 2rem;\n}\n.ww-divide-y > :not([hidden]) ~ :not([hidden]) {\n --tw-divide-y-reverse: 0;\n border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse)));\n border-bottom-width: calc(1px * var(--tw-divide-y-reverse));\n}\n.ww-divide-border\\/40 > :not([hidden]) ~ :not([hidden]) {\n border-color: hsl(var(--border) / 0.4);\n}\n.ww-overflow-hidden {\n overflow: hidden;\n}\n.ww-overflow-y-auto {\n overflow-y: auto;\n}\n.ww-overscroll-contain {\n overscroll-behavior: contain;\n}\n.ww-overscroll-none {\n overscroll-behavior: none;\n}\n.ww-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.ww-whitespace-pre-wrap {\n white-space: pre-wrap;\n}\n.ww-rounded {\n border-radius: 0.25rem;\n}\n.ww-rounded-2xl {\n border-radius: 1rem;\n}\n.ww-rounded-full {\n border-radius: 9999px;\n}\n.ww-rounded-lg {\n border-radius: var(--radius);\n}\n.ww-rounded-md {\n border-radius: calc(var(--radius) - 2px);\n}\n.ww-rounded-xl {\n border-radius: 0.75rem;\n}\n.ww-rounded-tl-none {\n border-top-left-radius: 0px;\n}\n.ww-rounded-tl-sm {\n border-top-left-radius: calc(var(--radius) - 4px);\n}\n.ww-rounded-tr-sm {\n border-top-right-radius: calc(var(--radius) - 4px);\n}\n.ww-border {\n border-width: 1px;\n}\n.ww-border-2 {\n border-width: 2px;\n}\n.ww-border-b {\n border-bottom-width: 1px;\n}\n.ww-border-l {\n border-left-width: 1px;\n}\n.ww-border-l-2 {\n border-left-width: 2px;\n}\n.ww-border-t {\n border-top-width: 1px;\n}\n.ww-border-background {\n border-color: hsl(var(--background));\n}\n.ww-border-black\\/10 {\n border-color: rgb(0 0 0 / 0.1);\n}\n.ww-border-border {\n border-color: hsl(var(--border));\n}\n.ww-border-border\\/30 {\n border-color: hsl(var(--border) / 0.3);\n}\n.ww-border-border\\/40 {\n border-color: hsl(var(--border) / 0.4);\n}\n.ww-border-border\\/50 {\n border-color: hsl(var(--border) / 0.5);\n}\n.ww-border-border\\/60 {\n border-color: hsl(var(--border) / 0.6);\n}\n.ww-border-border\\/80 {\n border-color: hsl(var(--border) / 0.8);\n}\n.ww-border-muted {\n border-color: hsl(var(--muted));\n}\n.ww-border-muted-foreground\\/30 {\n border-color: hsl(var(--muted-foreground) / 0.3);\n}\n.ww-border-primary\\/10 {\n border-color: hsl(var(--primary) / 0.1);\n}\n.ww-border-primary\\/20 {\n border-color: hsl(var(--primary) / 0.2);\n}\n.ww-border-red-200 {\n --tw-border-opacity: 1;\n border-color: rgb(254 202 202 / var(--tw-border-opacity, 1));\n}\n.ww-border-transparent {\n border-color: transparent;\n}\n.ww-border-white\\/20 {\n border-color: rgb(255 255 255 / 0.2);\n}\n.ww-border-white\\/30 {\n border-color: rgb(255 255 255 / 0.3);\n}\n.ww-bg-background {\n background-color: hsl(var(--background));\n}\n.ww-bg-background\\/20 {\n background-color: hsl(var(--background) / 0.2);\n}\n.ww-bg-background\\/90 {\n background-color: hsl(var(--background) / 0.9);\n}\n.ww-bg-background\\/95 {\n background-color: hsl(var(--background) / 0.95);\n}\n.ww-bg-black\\/10 {\n background-color: rgb(0 0 0 / 0.1);\n}\n.ww-bg-emerald-400 {\n --tw-bg-opacity: 1;\n background-color: rgb(52 211 153 / var(--tw-bg-opacity, 1));\n}\n.ww-bg-emerald-500 {\n --tw-bg-opacity: 1;\n background-color: rgb(16 185 129 / var(--tw-bg-opacity, 1));\n}\n.ww-bg-emerald-500\\/10 {\n background-color: rgb(16 185 129 / 0.1);\n}\n.ww-bg-emerald-500\\/20 {\n background-color: rgb(16 185 129 / 0.2);\n}\n.ww-bg-foreground\\/20 {\n background-color: hsl(var(--foreground) / 0.2);\n}\n.ww-bg-foreground\\/5 {\n background-color: hsl(var(--foreground) / 0.05);\n}\n.ww-bg-foreground\\/60 {\n background-color: hsl(var(--foreground) / 0.6);\n}\n.ww-bg-muted {\n background-color: hsl(var(--muted));\n}\n.ww-bg-muted-foreground\\/10 {\n background-color: hsl(var(--muted-foreground) / 0.1);\n}\n.ww-bg-muted\\/10 {\n background-color: hsl(var(--muted) / 0.1);\n}\n.ww-bg-muted\\/30 {\n background-color: hsl(var(--muted) / 0.3);\n}\n.ww-bg-muted\\/40 {\n background-color: hsl(var(--muted) / 0.4);\n}\n.ww-bg-muted\\/50 {\n background-color: hsl(var(--muted) / 0.5);\n}\n.ww-bg-muted\\/60 {\n background-color: hsl(var(--muted) / 0.6);\n}\n.ww-bg-primary {\n background-color: hsl(var(--primary));\n}\n.ww-bg-primary\\/10 {\n background-color: hsl(var(--primary) / 0.1);\n}\n.ww-bg-primary\\/5 {\n background-color: hsl(var(--primary) / 0.05);\n}\n.ww-bg-purple-500\\/20 {\n background-color: rgb(168 85 247 / 0.2);\n}\n.ww-bg-purple-500\\/30 {\n background-color: rgb(168 85 247 / 0.3);\n}\n.ww-bg-red-50 {\n --tw-bg-opacity: 1;\n background-color: rgb(254 242 242 / var(--tw-bg-opacity, 1));\n}\n.ww-bg-transparent {\n background-color: transparent;\n}\n.ww-bg-white {\n --tw-bg-opacity: 1;\n background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));\n}\n.ww-bg-white\\/10 {\n background-color: rgb(255 255 255 / 0.1);\n}\n.ww-bg-white\\/15 {\n background-color: rgb(255 255 255 / 0.15);\n}\n.ww-bg-white\\/20 {\n background-color: rgb(255 255 255 / 0.2);\n}\n.ww-fill-current {\n fill: currentColor;\n}\n.ww-object-cover {\n -o-object-fit: cover;\n object-fit: cover;\n}\n.ww-p-0\\.5 {\n padding: 0.125rem;\n}\n.ww-p-1\\.5 {\n padding: 0.375rem;\n}\n.ww-p-2\\.5 {\n padding: 0.625rem;\n}\n.ww-p-3 {\n padding: 0.75rem;\n}\n.ww-p-4 {\n padding: 1rem;\n}\n.ww-px-1 {\n padding-left: 0.25rem;\n padding-right: 0.25rem;\n}\n.ww-px-2 {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n}\n.ww-px-2\\.5 {\n padding-left: 0.625rem;\n padding-right: 0.625rem;\n}\n.ww-px-3 {\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n}\n.ww-px-3\\.5 {\n padding-left: 0.875rem;\n padding-right: 0.875rem;\n}\n.ww-px-4 {\n padding-left: 1rem;\n padding-right: 1rem;\n}\n.ww-py-0\\.5 {\n padding-top: 0.125rem;\n padding-bottom: 0.125rem;\n}\n.ww-py-1 {\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n}\n.ww-py-1\\.5 {\n padding-top: 0.375rem;\n padding-bottom: 0.375rem;\n}\n.ww-py-2 {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n.ww-py-2\\.5 {\n padding-top: 0.625rem;\n padding-bottom: 0.625rem;\n}\n.ww-py-3 {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n}\n.ww-py-4 {\n padding-top: 1rem;\n padding-bottom: 1rem;\n}\n.ww-pb-1\\.5 {\n padding-bottom: 0.375rem;\n}\n.ww-pb-2 {\n padding-bottom: 0.5rem;\n}\n.ww-pb-4 {\n padding-bottom: 1rem;\n}\n.ww-pl-2 {\n padding-left: 0.5rem;\n}\n.ww-pl-7 {\n padding-left: 1.75rem;\n}\n.ww-pr-0\\.5 {\n padding-right: 0.125rem;\n}\n.ww-pr-3 {\n padding-right: 0.75rem;\n}\n.ww-pt-2 {\n padding-top: 0.5rem;\n}\n.ww-pt-2\\.5 {\n padding-top: 0.625rem;\n}\n.ww-pt-5 {\n padding-top: 1.25rem;\n}\n.ww-text-left {\n text-align: left;\n}\n.ww-text-center {\n text-align: center;\n}\n.ww-align-middle {\n vertical-align: middle;\n}\n.ww-text-\\[10\\.5px\\] {\n font-size: 10.5px;\n}\n.ww-text-\\[10px\\] {\n font-size: 10px;\n}\n.ww-text-\\[11px\\] {\n font-size: 11px;\n}\n.ww-text-\\[12\\.5px\\] {\n font-size: 12.5px;\n}\n.ww-text-\\[13px\\] {\n font-size: 13px;\n}\n.ww-text-\\[8px\\] {\n font-size: 8px;\n}\n.ww-text-\\[9px\\] {\n font-size: 9px;\n}\n.ww-text-sm {\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n.ww-text-xs {\n font-size: 0.75rem;\n line-height: 1rem;\n}\n.ww-font-bold {\n font-weight: 700;\n}\n.ww-font-medium {\n font-weight: 500;\n}\n.ww-font-semibold {\n font-weight: 600;\n}\n.ww-uppercase {\n text-transform: uppercase;\n}\n.ww-italic {\n font-style: italic;\n}\n.ww-leading-none {\n line-height: 1;\n}\n.ww-leading-relaxed {\n line-height: 1.625;\n}\n.ww-leading-snug {\n line-height: 1.375;\n}\n.ww-leading-tight {\n line-height: 1.25;\n}\n.ww-tracking-wide {\n letter-spacing: 0.025em;\n}\n.ww-tracking-wider {\n letter-spacing: 0.05em;\n}\n.ww-tracking-widest {\n letter-spacing: 0.1em;\n}\n.ww-text-black\\/40 {\n color: rgb(0 0 0 / 0.4);\n}\n.ww-text-black\\/60 {\n color: rgb(0 0 0 / 0.6);\n}\n.ww-text-destructive {\n color: hsl(var(--destructive));\n}\n.ww-text-destructive\\/70 {\n color: hsl(var(--destructive) / 0.7);\n}\n.ww-text-emerald-500 {\n --tw-text-opacity: 1;\n color: rgb(16 185 129 / var(--tw-text-opacity, 1));\n}\n.ww-text-foreground {\n color: hsl(var(--foreground));\n}\n.ww-text-foreground\\/60 {\n color: hsl(var(--foreground) / 0.6);\n}\n.ww-text-foreground\\/70 {\n color: hsl(var(--foreground) / 0.7);\n}\n.ww-text-foreground\\/80 {\n color: hsl(var(--foreground) / 0.8);\n}\n.ww-text-foreground\\/90 {\n color: hsl(var(--foreground) / 0.9);\n}\n.ww-text-inherit {\n color: inherit;\n}\n.ww-text-muted-foreground {\n color: hsl(var(--muted-foreground));\n}\n.ww-text-muted-foreground\\/40 {\n color: hsl(var(--muted-foreground) / 0.4);\n}\n.ww-text-muted-foreground\\/50 {\n color: hsl(var(--muted-foreground) / 0.5);\n}\n.ww-text-muted-foreground\\/70 {\n color: hsl(var(--muted-foreground) / 0.7);\n}\n.ww-text-muted-foreground\\/80 {\n color: hsl(var(--muted-foreground) / 0.8);\n}\n.ww-text-primary {\n color: hsl(var(--primary));\n}\n.ww-text-primary-foreground {\n color: hsl(var(--primary-foreground));\n}\n.ww-text-primary\\/70 {\n color: hsl(var(--primary) / 0.7);\n}\n.ww-text-primary\\/80 {\n color: hsl(var(--primary) / 0.8);\n}\n.ww-text-red-400 {\n --tw-text-opacity: 1;\n color: rgb(248 113 113 / var(--tw-text-opacity, 1));\n}\n.ww-text-red-500 {\n --tw-text-opacity: 1;\n color: rgb(239 68 68 / var(--tw-text-opacity, 1));\n}\n.ww-text-red-600 {\n --tw-text-opacity: 1;\n color: rgb(220 38 38 / var(--tw-text-opacity, 1));\n}\n.ww-text-white {\n --tw-text-opacity: 1;\n color: rgb(255 255 255 / var(--tw-text-opacity, 1));\n}\n.ww-text-white\\/60 {\n color: rgb(255 255 255 / 0.6);\n}\n.ww-text-white\\/80 {\n color: rgb(255 255 255 / 0.8);\n}\n.ww-text-zinc-400 {\n --tw-text-opacity: 1;\n color: rgb(161 161 170 / var(--tw-text-opacity, 1));\n}\n.ww-underline {\n text-decoration-line: underline;\n}\n.ww-line-through {\n text-decoration-line: line-through;\n}\n.ww-no-underline {\n text-decoration-line: none;\n}\n.ww-decoration-foreground\\/20 {\n text-decoration-color: hsl(var(--foreground) / 0.2);\n}\n.ww-opacity-100 {\n opacity: 1;\n}\n.ww-opacity-25 {\n opacity: 0.25;\n}\n.ww-opacity-30 {\n opacity: 0.3;\n}\n.ww-opacity-40 {\n opacity: 0.4;\n}\n.ww-opacity-60 {\n opacity: 0.6;\n}\n.ww-opacity-70 {\n opacity: 0.7;\n}\n.ww-opacity-75 {\n opacity: 0.75;\n}\n.ww-opacity-80 {\n opacity: 0.8;\n}\n.ww-opacity-90 {\n opacity: 0.9;\n}\n.ww-shadow-2xl {\n --tw-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25);\n --tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.ww-shadow-lg {\n --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.ww-shadow-md {\n --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.ww-shadow-sm {\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.ww-shadow-xl {\n --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.ww-outline-none {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n.ww-ring-2 {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow:\n var(--tw-ring-offset-shadow),\n var(--tw-ring-shadow),\n var(--tw-shadow, 0 0 #0000);\n}\n.ww-ring-inset {\n --tw-ring-inset: inset;\n}\n.ww-ring-primary\\/20 {\n --tw-ring-color: hsl(var(--primary) / 0.2);\n}\n.ww-ring-primary\\/60 {\n --tw-ring-color: hsl(var(--primary) / 0.6);\n}\n.ww-backdrop-blur-sm {\n --tw-backdrop-blur: blur(4px);\n backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n}\n.ww-backdrop-blur-xl {\n --tw-backdrop-blur: blur(24px);\n backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);\n}\n.ww-transition-all {\n transition-property: all;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.ww-transition-colors {\n transition-property:\n color,\n background-color,\n border-color,\n text-decoration-color,\n fill,\n stroke;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.ww-transition-opacity {\n transition-property: opacity;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.ww-transition-shadow {\n transition-property: box-shadow;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.ww-transition-transform {\n transition-property: transform;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.ww-duration-1000 {\n transition-duration: 1000ms;\n}\n.ww-duration-150 {\n transition-duration: 150ms;\n}\n.ww-duration-200 {\n transition-duration: 200ms;\n}\n.ww-duration-300 {\n transition-duration: 300ms;\n}\n.ww-duration-500 {\n transition-duration: 500ms;\n}\n.ww-duration-700 {\n transition-duration: 700ms;\n}\n@keyframes enter {\n from {\n opacity: var(--tw-enter-opacity, 1);\n transform: translate3d(var(--tw-enter-translate-x, 0), var(--tw-enter-translate-y, 0), 0) scale3d(var(--tw-enter-scale, 1), var(--tw-enter-scale, 1), var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0));\n }\n}\n@keyframes exit {\n to {\n opacity: var(--tw-exit-opacity, 1);\n transform: translate3d(var(--tw-exit-translate-x, 0), var(--tw-exit-translate-y, 0), 0) scale3d(var(--tw-exit-scale, 1), var(--tw-exit-scale, 1), var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0));\n }\n}\n.ww-animate-in {\n animation-name: enter;\n animation-duration: 150ms;\n --tw-enter-opacity: initial;\n --tw-enter-scale: initial;\n --tw-enter-rotate: initial;\n --tw-enter-translate-x: initial;\n --tw-enter-translate-y: initial;\n}\n.ww-fade-in {\n --tw-enter-opacity: 0;\n}\n.ww-slide-in-from-top-1 {\n --tw-enter-translate-y: -0.25rem;\n}\n.ww-duration-1000 {\n animation-duration: 1000ms;\n}\n.ww-duration-150 {\n animation-duration: 150ms;\n}\n.ww-duration-200 {\n animation-duration: 200ms;\n}\n.ww-duration-300 {\n animation-duration: 300ms;\n}\n.ww-duration-500 {\n animation-duration: 500ms;\n}\n.ww-duration-700 {\n animation-duration: 700ms;\n}\n.wallavi-widget *,\n.wallavi-widget *::before,\n.wallavi-widget *::after {\n box-sizing: border-box;\n border-width: 0;\n border-style: solid;\n}\n.wallavi-widget button {\n -moz-appearance: none;\n appearance: none;\n -webkit-appearance: none;\n background: transparent;\n border: none;\n cursor: pointer;\n}\n.wallavi-widget textarea,\n.wallavi-widget input,\n.wallavi-widget select {\n font-family: inherit;\n font-size: inherit;\n}\n.wallavi-widget img,\n.wallavi-widget video {\n max-width: 100%;\n height: auto;\n}\n.wallavi-widget .lk-control-bar {\n background: transparent !important;\n border: none !important;\n box-shadow: none !important;\n padding: 0 !important;\n gap: 1.5rem !important;\n justify-content: center !important;\n}\n.wallavi-widget .lk-button {\n background: rgba(25, 25, 28, 0.05) !important;\n border-radius: 9999px !important;\n padding: 1.25rem !important;\n color: var(--ww-fg, #19191c) !important;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1) !important;\n border: 1px solid rgba(25, 25, 28, 0.1) !important;\n}\n.wallavi-widget .lk-button:hover {\n background: rgba(25, 25, 28, 0.1) !important;\n transform: scale(1.05) !important;\n}\n.wallavi-widget .lk-disconnect-button {\n background: #ef4444 !important;\n color: white !important;\n border: none !important;\n}\n.wallavi-widget .lk-disconnect-button:hover {\n background: #dc2626 !important;\n}\n.wallavi-widget .lk-device-menu {\n bottom: 100% !important;\n top: auto !important;\n margin-bottom: 1rem !important;\n max-width: 250px !important;\n width: -moz-max-content !important;\n width: max-content !important;\n left: 50% !important;\n transform: translateX(-50%) !important;\n background: #ffffff !important;\n border-radius: 16px !important;\n box-shadow: 0 20px 40px -10px rgba(0, 0, 0, 0.15), 0 10px 20px -10px rgba(0, 0, 0, 0.1) !important;\n z-index: 1000 !important;\n overflow: hidden !important;\n border: 1px solid rgba(0, 0, 0, 0.05) !important;\n padding: 0.5rem !important;\n}\n.wallavi-widget .lk-device-menu > li {\n padding: 0.75rem 1rem !important;\n font-size: 0.875rem !important;\n color: #19191c !important;\n white-space: nowrap !important;\n overflow: hidden !important;\n text-overflow: ellipsis !important;\n border-radius: 8px !important;\n transition: background 0.15s !important;\n}\n.wallavi-widget .lk-device-menu > li:hover {\n background: rgba(0, 0, 0, 0.05) !important;\n}\n.wallavi-widget .lk-device-menu > li.lk-active {\n background: rgba(0, 0, 0, 0.08) !important;\n font-weight: 600 !important;\n}\n.placeholder\\:ww-text-muted-foreground\\/40::-moz-placeholder {\n color: hsl(var(--muted-foreground) / 0.4);\n}\n.placeholder\\:ww-text-muted-foreground\\/40::placeholder {\n color: hsl(var(--muted-foreground) / 0.4);\n}\n.focus-within\\:ww-ring-1:focus-within {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow:\n var(--tw-ring-offset-shadow),\n var(--tw-ring-shadow),\n var(--tw-shadow, 0 0 #0000);\n}\n.focus-within\\:ww-ring-ring\\/40:focus-within {\n --tw-ring-color: hsl(var(--ring) / 0.4);\n}\n.hover\\:-ww-translate-y-1:hover {\n --tw-translate-y: -0.25rem;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.hover\\:ww-scale-110:hover {\n --tw-scale-x: 1.1;\n --tw-scale-y: 1.1;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.hover\\:ww-border-accent-foreground\\/20:hover {\n border-color: hsl(var(--accent-foreground) / 0.2);\n}\n.hover\\:ww-border-accent-foreground\\/25:hover {\n border-color: hsl(var(--accent-foreground) / 0.25);\n}\n.hover\\:ww-border-primary\\/40:hover {\n border-color: hsl(var(--primary) / 0.4);\n}\n.hover\\:ww-bg-accent:hover {\n background-color: hsl(var(--accent));\n}\n.hover\\:ww-bg-accent\\/30:hover {\n background-color: hsl(var(--accent) / 0.3);\n}\n.hover\\:ww-bg-accent\\/40:hover {\n background-color: hsl(var(--accent) / 0.4);\n}\n.hover\\:ww-bg-foreground\\/10:hover {\n background-color: hsl(var(--foreground) / 0.1);\n}\n.hover\\:ww-bg-foreground\\/30:hover {\n background-color: hsl(var(--foreground) / 0.3);\n}\n.hover\\:ww-bg-muted:hover {\n background-color: hsl(var(--muted));\n}\n.hover\\:ww-bg-white\\/10:hover {\n background-color: rgb(255 255 255 / 0.1);\n}\n.hover\\:ww-text-accent-foreground:hover {\n color: hsl(var(--accent-foreground));\n}\n.hover\\:ww-text-foreground:hover {\n color: hsl(var(--foreground));\n}\n.hover\\:ww-text-primary:hover {\n color: hsl(var(--primary));\n}\n.hover\\:ww-opacity-80:hover {\n opacity: 0.8;\n}\n.hover\\:ww-opacity-85:hover {\n opacity: 0.85;\n}\n.hover\\:ww-shadow-sm:hover {\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.hover\\:ww-shadow-xl:hover {\n --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);\n --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.focus\\:ww-ring-1:focus {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow:\n var(--tw-ring-offset-shadow),\n var(--tw-ring-shadow),\n var(--tw-shadow, 0 0 #0000);\n}\n.focus\\:ww-ring-ring\\/40:focus {\n --tw-ring-color: hsl(var(--ring) / 0.4);\n}\n.active\\:ww-scale-\\[0\\.98\\]:active {\n --tw-scale-x: 0.98;\n --tw-scale-y: 0.98;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.disabled\\:ww-pointer-events-none:disabled {\n pointer-events: none;\n}\n.disabled\\:ww-opacity-40:disabled {\n opacity: 0.4;\n}\n.disabled\\:ww-opacity-50:disabled {\n opacity: 0.5;\n}\n.ww-group:hover .group-hover\\:ww-rotate-12 {\n --tw-rotate: 12deg;\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n.ww-group:hover .group-hover\\:ww-text-primary {\n color: hsl(var(--primary));\n}\n.dark\\:ww-border-red-800:is(.ww-dark *) {\n --tw-border-opacity: 1;\n border-color: rgb(153 27 27 / var(--tw-border-opacity, 1));\n}\n.dark\\:ww-bg-red-950:is(.ww-dark *) {\n --tw-bg-opacity: 1;\n background-color: rgb(69 10 10 / var(--tw-bg-opacity, 1));\n}\n.dark\\:ww-text-red-400:is(.ww-dark *) {\n --tw-text-opacity: 1;\n color: rgb(248 113 113 / var(--tw-text-opacity, 1));\n}\n");
|
|
62
62
|
var twMerge = tailwindMerge.extendTailwindMerge({ prefix: "ww-" });
|
|
63
63
|
var cn = (...inputs) => twMerge(clsx.clsx(inputs));
|
|
64
64
|
async function getFreshClerkToken() {
|
|
@@ -366,9 +366,12 @@ function useChat({
|
|
|
366
366
|
});
|
|
367
367
|
const streamingMsgIdRef = react.useRef(null);
|
|
368
368
|
const [debugTraces, setDebugTraces] = react.useState([]);
|
|
369
|
-
const [selectedContext, setSelectedContext] = react.useState(
|
|
369
|
+
const [selectedContext, setSelectedContext] = react.useState(
|
|
370
|
+
null
|
|
371
|
+
);
|
|
370
372
|
react.useEffect(() => {
|
|
371
|
-
if (typeof window === "undefined" || typeof document === "undefined")
|
|
373
|
+
if (typeof window === "undefined" || typeof document === "undefined")
|
|
374
|
+
return;
|
|
372
375
|
const handleContextSelected = (event) => {
|
|
373
376
|
const customEvent = event;
|
|
374
377
|
if (customEvent.detail && customEvent.detail.id) {
|
|
@@ -377,7 +380,9 @@ function useChat({
|
|
|
377
380
|
};
|
|
378
381
|
const handleGlobalClick = (e) => {
|
|
379
382
|
if (e.metaKey || e.ctrlKey) {
|
|
380
|
-
const target = e.target.closest(
|
|
383
|
+
const target = e.target.closest(
|
|
384
|
+
"[data-wallavi-id]"
|
|
385
|
+
);
|
|
381
386
|
if (target) {
|
|
382
387
|
e.preventDefault();
|
|
383
388
|
e.stopPropagation();
|
|
@@ -414,7 +419,10 @@ function useChat({
|
|
|
414
419
|
window.addEventListener("wallavi:context-selected", handleContextSelected);
|
|
415
420
|
document.addEventListener("click", handleGlobalClick, true);
|
|
416
421
|
return () => {
|
|
417
|
-
window.removeEventListener(
|
|
422
|
+
window.removeEventListener(
|
|
423
|
+
"wallavi:context-selected",
|
|
424
|
+
handleContextSelected
|
|
425
|
+
);
|
|
418
426
|
document.removeEventListener("click", handleGlobalClick, true);
|
|
419
427
|
};
|
|
420
428
|
}, []);
|
|
@@ -1729,11 +1737,19 @@ function PickerSelector({
|
|
|
1729
1737
|
);
|
|
1730
1738
|
}
|
|
1731
1739
|
var ReactMarkdown = ReactMarkdownLib__default.default;
|
|
1732
|
-
function MarkdownContent({
|
|
1740
|
+
function MarkdownContent({
|
|
1741
|
+
text,
|
|
1742
|
+
isUser
|
|
1743
|
+
}) {
|
|
1733
1744
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
1734
1745
|
ReactMarkdown,
|
|
1735
1746
|
{
|
|
1736
1747
|
remarkPlugins: [remarkGfm__default.default],
|
|
1748
|
+
urlTransform: (url) => {
|
|
1749
|
+
if (url.startsWith("wallavi://")) return url;
|
|
1750
|
+
const safe = /^(https?|mailto|tel):/i;
|
|
1751
|
+
return safe.test(url) ? url : "";
|
|
1752
|
+
},
|
|
1737
1753
|
components: {
|
|
1738
1754
|
p: ({ children }) => /* @__PURE__ */ jsxRuntime.jsx("p", { style: { margin: "4px 0" }, children }),
|
|
1739
1755
|
h1: ({ children }) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -1804,16 +1820,43 @@ function MarkdownContent({ text }) {
|
|
|
1804
1820
|
a: ({
|
|
1805
1821
|
href,
|
|
1806
1822
|
children
|
|
1807
|
-
}) =>
|
|
1808
|
-
"
|
|
1809
|
-
|
|
1810
|
-
|
|
1811
|
-
|
|
1812
|
-
|
|
1813
|
-
|
|
1814
|
-
|
|
1823
|
+
}) => {
|
|
1824
|
+
if (href?.startsWith("wallavi://")) {
|
|
1825
|
+
const parts = href.replace("wallavi://", "").split("/");
|
|
1826
|
+
const type = parts[0] || "element";
|
|
1827
|
+
const id = parts[1] || "";
|
|
1828
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1829
|
+
"span",
|
|
1830
|
+
{
|
|
1831
|
+
className: `ww-inline-flex ww-items-center ww-gap-1.5 ww-text-[11px] ww-font-semibold ww-px-2 ww-py-0.5 ww-rounded-md ww-mx-0.5 ww-shadow-3xs ${isUser ? "ww-bg-white/20 ww-border ww-border-white/30 ww-text-white" : "ww-bg-primary/10 ww-border ww-border-primary/20 ww-text-primary"}`,
|
|
1832
|
+
title: `${type}: ${id}`,
|
|
1833
|
+
children: [
|
|
1834
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1835
|
+
"span",
|
|
1836
|
+
{
|
|
1837
|
+
className: `ww-h-1.5 ww-w-1.5 ww-rounded-full ${isUser ? "ww-bg-white" : "ww-bg-primary"}`
|
|
1838
|
+
}
|
|
1839
|
+
),
|
|
1840
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ww-opacity-70 ww-uppercase ww-text-[8px] ww-tracking-wider", children: [
|
|
1841
|
+
type,
|
|
1842
|
+
":"
|
|
1843
|
+
] }),
|
|
1844
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children })
|
|
1845
|
+
]
|
|
1846
|
+
}
|
|
1847
|
+
);
|
|
1815
1848
|
}
|
|
1816
|
-
|
|
1849
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
1850
|
+
"a",
|
|
1851
|
+
{
|
|
1852
|
+
href,
|
|
1853
|
+
target: "_blank",
|
|
1854
|
+
rel: "noopener noreferrer",
|
|
1855
|
+
className: isUser ? "ww-text-inherit ww-underline ww-opacity-90" : "ww-underline ww-opacity-75",
|
|
1856
|
+
children
|
|
1857
|
+
}
|
|
1858
|
+
);
|
|
1859
|
+
},
|
|
1817
1860
|
table: ({ children }) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
1818
1861
|
"div",
|
|
1819
1862
|
{
|
|
@@ -1946,7 +1989,7 @@ function MessageBubble({
|
|
|
1946
1989
|
contrastColor
|
|
1947
1990
|
}
|
|
1948
1991
|
),
|
|
1949
|
-
textPart?.text && /* @__PURE__ */ jsxRuntime.jsx("
|
|
1992
|
+
textPart?.text && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ww-prose ww-prose-sm ww-max-w-none ww-text-inherit prose-p:ww-my-0.5", children: /* @__PURE__ */ jsxRuntime.jsx(MarkdownContent, { text: textPart.text, isUser: true }) })
|
|
1950
1993
|
]
|
|
1951
1994
|
}
|
|
1952
1995
|
) });
|
|
@@ -2121,6 +2164,67 @@ function ChatMessages({
|
|
|
2121
2164
|
] });
|
|
2122
2165
|
}
|
|
2123
2166
|
var cn3 = (...inputs) => tailwindMerge.twMerge(clsx.clsx(inputs));
|
|
2167
|
+
var serializeNode = (node) => {
|
|
2168
|
+
if (node.nodeType === Node.TEXT_NODE) {
|
|
2169
|
+
return node.nodeValue || "";
|
|
2170
|
+
}
|
|
2171
|
+
if (node.nodeType === Node.ELEMENT_NODE) {
|
|
2172
|
+
const el = node;
|
|
2173
|
+
if (el.tagName === "SPAN" && el.getAttribute("data-wlv-context-id")) {
|
|
2174
|
+
const id = el.getAttribute("data-wlv-context-id");
|
|
2175
|
+
const type = el.getAttribute("data-wlv-context-type");
|
|
2176
|
+
const name = el.getAttribute("data-wlv-context-name");
|
|
2177
|
+
return `[${name}](wallavi://${type}/${id})`;
|
|
2178
|
+
}
|
|
2179
|
+
if (el.tagName === "BR") {
|
|
2180
|
+
return "\n";
|
|
2181
|
+
}
|
|
2182
|
+
let childText = "";
|
|
2183
|
+
for (const child of Array.from(el.childNodes)) {
|
|
2184
|
+
childText += serializeNode(child);
|
|
2185
|
+
}
|
|
2186
|
+
const isBlock = ["DIV", "P", "TR", "LI"].includes(el.tagName);
|
|
2187
|
+
return isBlock ? `
|
|
2188
|
+
${childText}` : childText;
|
|
2189
|
+
}
|
|
2190
|
+
return "";
|
|
2191
|
+
};
|
|
2192
|
+
var serializeEditor = (editor) => {
|
|
2193
|
+
let text = "";
|
|
2194
|
+
for (const child of Array.from(editor.childNodes)) {
|
|
2195
|
+
text += serializeNode(child);
|
|
2196
|
+
}
|
|
2197
|
+
return text.replace(/^\n+/, "").replace(/\n+$/, "");
|
|
2198
|
+
};
|
|
2199
|
+
var createChipElement = (name, type, id, accentColor) => {
|
|
2200
|
+
const span = document.createElement("span");
|
|
2201
|
+
span.setAttribute("contenteditable", "false");
|
|
2202
|
+
span.className = "ww-inline-flex ww-items-center ww-gap-1.5 ww-bg-primary/10 ww-border ww-border-primary/20 ww-text-primary ww-text-xs ww-font-semibold ww-px-2 ww-py-0.5 ww-rounded-md ww-mx-0.5 ww-align-middle ww-shadow-3xs ww-select-all";
|
|
2203
|
+
span.style.setProperty("--primary", accentColor);
|
|
2204
|
+
span.setAttribute("data-wlv-context-id", id);
|
|
2205
|
+
span.setAttribute("data-wlv-context-type", type);
|
|
2206
|
+
span.setAttribute("data-wlv-context-name", name);
|
|
2207
|
+
const dot = document.createElement("span");
|
|
2208
|
+
dot.className = "ww-h-1.5 ww-w-1.5 ww-rounded-full ww-bg-primary";
|
|
2209
|
+
span.appendChild(dot);
|
|
2210
|
+
const typeSpan = document.createElement("span");
|
|
2211
|
+
typeSpan.className = "ww-opacity-70 ww-uppercase ww-text-[8px] ww-tracking-wider";
|
|
2212
|
+
typeSpan.textContent = `${type}:`;
|
|
2213
|
+
span.appendChild(typeSpan);
|
|
2214
|
+
const nameSpan = document.createElement("span");
|
|
2215
|
+
nameSpan.textContent = name;
|
|
2216
|
+
span.appendChild(nameSpan);
|
|
2217
|
+
const button = document.createElement("button");
|
|
2218
|
+
button.type = "button";
|
|
2219
|
+
button.className = "ww-ml-1 ww-text-primary/70 hover:ww-text-primary hover:ww-scale-110 ww-transition-transform ww-font-bold";
|
|
2220
|
+
button.textContent = "\xD7";
|
|
2221
|
+
button.onclick = () => {
|
|
2222
|
+
span.remove();
|
|
2223
|
+
window.dispatchEvent(new CustomEvent("wallavi:editor-change"));
|
|
2224
|
+
};
|
|
2225
|
+
span.appendChild(button);
|
|
2226
|
+
return span;
|
|
2227
|
+
};
|
|
2124
2228
|
function ChatInput({
|
|
2125
2229
|
input,
|
|
2126
2230
|
setInput,
|
|
@@ -2144,11 +2248,66 @@ function ChatInput({
|
|
|
2144
2248
|
const hasAttachments = onAttach !== void 0;
|
|
2145
2249
|
const fileInputRef = react.useRef(null);
|
|
2146
2250
|
const textareaRef = react.useRef(null);
|
|
2251
|
+
const insertNodeAtCursor = (node) => {
|
|
2252
|
+
const sel = window.getSelection();
|
|
2253
|
+
if (sel && sel.rangeCount > 0) {
|
|
2254
|
+
const range = sel.getRangeAt(0);
|
|
2255
|
+
const editor = textareaRef.current;
|
|
2256
|
+
if (editor && editor.contains(range.commonAncestorContainer)) {
|
|
2257
|
+
range.deleteContents();
|
|
2258
|
+
const frag = document.createDocumentFragment();
|
|
2259
|
+
frag.appendChild(node);
|
|
2260
|
+
const spaceNode = document.createTextNode(" ");
|
|
2261
|
+
frag.appendChild(spaceNode);
|
|
2262
|
+
range.insertNode(frag);
|
|
2263
|
+
const newRange = range.cloneRange();
|
|
2264
|
+
newRange.setStartAfter(spaceNode);
|
|
2265
|
+
newRange.collapse(true);
|
|
2266
|
+
sel.removeAllRanges();
|
|
2267
|
+
sel.addRange(newRange);
|
|
2268
|
+
return;
|
|
2269
|
+
}
|
|
2270
|
+
}
|
|
2271
|
+
if (textareaRef.current) {
|
|
2272
|
+
textareaRef.current.appendChild(node);
|
|
2273
|
+
textareaRef.current.appendChild(document.createTextNode(" "));
|
|
2274
|
+
}
|
|
2275
|
+
};
|
|
2147
2276
|
react.useEffect(() => {
|
|
2148
|
-
if (!input && textareaRef.current) {
|
|
2149
|
-
textareaRef.current.
|
|
2277
|
+
if (!input && textareaRef.current && textareaRef.current.innerHTML !== "") {
|
|
2278
|
+
textareaRef.current.innerHTML = "";
|
|
2150
2279
|
}
|
|
2151
2280
|
}, [input]);
|
|
2281
|
+
const handleInput = () => {
|
|
2282
|
+
if (textareaRef.current) {
|
|
2283
|
+
setInput(serializeEditor(textareaRef.current));
|
|
2284
|
+
}
|
|
2285
|
+
};
|
|
2286
|
+
react.useEffect(() => {
|
|
2287
|
+
if (selectedContext && textareaRef.current) {
|
|
2288
|
+
const chipEl = createChipElement(
|
|
2289
|
+
selectedContext.name,
|
|
2290
|
+
selectedContext.type,
|
|
2291
|
+
selectedContext.id,
|
|
2292
|
+
accentColor
|
|
2293
|
+
);
|
|
2294
|
+
textareaRef.current.focus();
|
|
2295
|
+
insertNodeAtCursor(chipEl);
|
|
2296
|
+
setInput(serializeEditor(textareaRef.current));
|
|
2297
|
+
if (onClearContext) {
|
|
2298
|
+
onClearContext();
|
|
2299
|
+
}
|
|
2300
|
+
}
|
|
2301
|
+
}, [selectedContext, onClearContext, setInput, accentColor]);
|
|
2302
|
+
react.useEffect(() => {
|
|
2303
|
+
const handleEditorChange = () => {
|
|
2304
|
+
if (textareaRef.current) {
|
|
2305
|
+
setInput(serializeEditor(textareaRef.current));
|
|
2306
|
+
}
|
|
2307
|
+
};
|
|
2308
|
+
window.addEventListener("wallavi:editor-change", handleEditorChange);
|
|
2309
|
+
return () => window.removeEventListener("wallavi:editor-change", handleEditorChange);
|
|
2310
|
+
}, [setInput]);
|
|
2152
2311
|
react.useEffect(() => {
|
|
2153
2312
|
if (!streaming) {
|
|
2154
2313
|
textareaRef.current?.focus();
|
|
@@ -2160,8 +2319,40 @@ function ChatInput({
|
|
|
2160
2319
|
onSend();
|
|
2161
2320
|
}
|
|
2162
2321
|
};
|
|
2322
|
+
const handlePaste = (e) => {
|
|
2323
|
+
if (hasAttachments && onAttach) {
|
|
2324
|
+
const files = Array.from(e.clipboardData?.files ?? []).filter(
|
|
2325
|
+
(f) => f.type.startsWith("image/")
|
|
2326
|
+
);
|
|
2327
|
+
if (files.length > 0) {
|
|
2328
|
+
e.preventDefault();
|
|
2329
|
+
const dt = new DataTransfer();
|
|
2330
|
+
files.forEach((f) => dt.items.add(f));
|
|
2331
|
+
onAttach(dt.files);
|
|
2332
|
+
return;
|
|
2333
|
+
}
|
|
2334
|
+
}
|
|
2335
|
+
e.preventDefault();
|
|
2336
|
+
const text = e.clipboardData?.getData("text/plain") || "";
|
|
2337
|
+
const selection = window.getSelection();
|
|
2338
|
+
if (!selection || selection.rangeCount === 0) return;
|
|
2339
|
+
const range = selection.getRangeAt(0);
|
|
2340
|
+
range.deleteContents();
|
|
2341
|
+
range.insertNode(document.createTextNode(text));
|
|
2342
|
+
range.collapse(false);
|
|
2343
|
+
if (textareaRef.current) {
|
|
2344
|
+
setInput(serializeEditor(textareaRef.current));
|
|
2345
|
+
}
|
|
2346
|
+
};
|
|
2163
2347
|
const hasText = input.trim().length > 0;
|
|
2164
2348
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ww-shrink-0 ww-border-t ww-bg-background ww-px-3 ww-py-2.5", children: [
|
|
2349
|
+
/* @__PURE__ */ jsxRuntime.jsx("style", { children: `
|
|
2350
|
+
#wallavi-chat-input:empty::before {
|
|
2351
|
+
content: attr(placeholder);
|
|
2352
|
+
color: rgba(120, 120, 120, 0.45);
|
|
2353
|
+
pointer-events: none;
|
|
2354
|
+
}
|
|
2355
|
+
` }),
|
|
2165
2356
|
canRegenerate && onRegenerate && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2166
2357
|
"button",
|
|
2167
2358
|
{
|
|
@@ -2233,34 +2424,17 @@ function ChatInput({
|
|
|
2233
2424
|
),
|
|
2234
2425
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ww-flex ww-items-end ww-gap-2 ww-px-3 ww-py-2", children: [
|
|
2235
2426
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2236
|
-
"
|
|
2427
|
+
"div",
|
|
2237
2428
|
{
|
|
2238
2429
|
id: "wallavi-chat-input",
|
|
2239
2430
|
ref: textareaRef,
|
|
2240
|
-
|
|
2241
|
-
className: "ww-flex-1 ww-
|
|
2242
|
-
placeholder: placeholder ?? "Send a message\u2026",
|
|
2243
|
-
value: input,
|
|
2244
|
-
onChange: (e) => {
|
|
2245
|
-
setInput(e.target.value);
|
|
2246
|
-
e.target.style.height = "auto";
|
|
2247
|
-
e.target.style.height = `${Math.min(e.target.scrollHeight, 128)}px`;
|
|
2248
|
-
},
|
|
2431
|
+
contentEditable: !streaming && voiceState !== "recording" && voiceState !== "transcribing",
|
|
2432
|
+
className: "ww-flex-1 ww-min-h-[22px] ww-max-h-32 ww-overflow-y-auto ww-py-1 ww-outline-none ww-text-sm ww-leading-relaxed ww-bg-transparent",
|
|
2433
|
+
...{ placeholder: placeholder ?? "Send a message\u2026" },
|
|
2249
2434
|
onKeyDown: handleKeyDown,
|
|
2250
|
-
|
|
2251
|
-
|
|
2252
|
-
|
|
2253
|
-
(f) => f.type.startsWith("image/")
|
|
2254
|
-
);
|
|
2255
|
-
if (files.length > 0) {
|
|
2256
|
-
e.preventDefault();
|
|
2257
|
-
const dt = new DataTransfer();
|
|
2258
|
-
files.forEach((f) => dt.items.add(f));
|
|
2259
|
-
onAttach(dt.files);
|
|
2260
|
-
}
|
|
2261
|
-
},
|
|
2262
|
-
disabled: streaming || voiceState === "recording" || voiceState === "transcribing",
|
|
2263
|
-
autoFocus: true
|
|
2435
|
+
onInput: handleInput,
|
|
2436
|
+
onPaste: handlePaste,
|
|
2437
|
+
style: { wordBreak: "break-word" }
|
|
2264
2438
|
}
|
|
2265
2439
|
),
|
|
2266
2440
|
hasVoice && /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -2435,6 +2609,74 @@ function VoiceOverlay({ token, serverUrl, onClose }) {
|
|
|
2435
2609
|
}
|
|
2436
2610
|
) });
|
|
2437
2611
|
}
|
|
2612
|
+
function getContextQueries(url = "") {
|
|
2613
|
+
const lowercaseUrl = url.toLowerCase();
|
|
2614
|
+
if (/pricing|precio|planes|tarifas|costos|comprar|suscrip|subscribe/i.test(
|
|
2615
|
+
lowercaseUrl
|
|
2616
|
+
)) {
|
|
2617
|
+
return [
|
|
2618
|
+
{
|
|
2619
|
+
text: "\xBFCu\xE1les son los planes de precios disponibles?",
|
|
2620
|
+
category: "pricing"
|
|
2621
|
+
},
|
|
2622
|
+
{
|
|
2623
|
+
text: "\xBFTienen alguna prueba gratuita o plan demo?",
|
|
2624
|
+
category: "pricing"
|
|
2625
|
+
},
|
|
2626
|
+
{
|
|
2627
|
+
text: "\xBFCu\xE1les son los m\xE9todos de pago aceptados?",
|
|
2628
|
+
category: "pricing"
|
|
2629
|
+
}
|
|
2630
|
+
];
|
|
2631
|
+
}
|
|
2632
|
+
if (/settings|config|cuenta|perfil|seguridad|account|profile|security/i.test(
|
|
2633
|
+
lowercaseUrl
|
|
2634
|
+
)) {
|
|
2635
|
+
return [
|
|
2636
|
+
{ text: "\xBFC\xF3mo puedo cambiar mi contrase\xF1a?", category: "settings" },
|
|
2637
|
+
{
|
|
2638
|
+
text: "\xBFD\xF3nde encuentro mis credenciales de API?",
|
|
2639
|
+
category: "settings"
|
|
2640
|
+
},
|
|
2641
|
+
{ text: "\xBFC\xF3mo configuro las notificaciones?", category: "settings" }
|
|
2642
|
+
];
|
|
2643
|
+
}
|
|
2644
|
+
if (/dashboard|inicio|panel|resumen|metri|home|stats|analytics/i.test(
|
|
2645
|
+
lowercaseUrl
|
|
2646
|
+
)) {
|
|
2647
|
+
return [
|
|
2648
|
+
{
|
|
2649
|
+
text: "\xBFC\xF3mo puedo ver las estad\xEDsticas de mi agente?",
|
|
2650
|
+
category: "dashboard"
|
|
2651
|
+
},
|
|
2652
|
+
{ text: "\xBFC\xF3mo interpreto las m\xE9tricas de uso?", category: "dashboard" },
|
|
2653
|
+
{
|
|
2654
|
+
text: "\xBFD\xF3nde descargo los reportes de actividad?",
|
|
2655
|
+
category: "dashboard"
|
|
2656
|
+
}
|
|
2657
|
+
];
|
|
2658
|
+
}
|
|
2659
|
+
if (/integration|conexi|conectar|plugins|api|webhooks|connect/i.test(
|
|
2660
|
+
lowercaseUrl
|
|
2661
|
+
)) {
|
|
2662
|
+
return [
|
|
2663
|
+
{
|
|
2664
|
+
text: "\xBFC\xF3mo puedo conectar Wallavi con mi CRM?",
|
|
2665
|
+
category: "integrations"
|
|
2666
|
+
},
|
|
2667
|
+
{ text: "\xBFTienen soporte para webhooks?", category: "integrations" },
|
|
2668
|
+
{
|
|
2669
|
+
text: "\xBFD\xF3nde est\xE1 la documentaci\xF3n de la API?",
|
|
2670
|
+
category: "integrations"
|
|
2671
|
+
}
|
|
2672
|
+
];
|
|
2673
|
+
}
|
|
2674
|
+
return [
|
|
2675
|
+
{ text: "\xBFQu\xE9 puede hacer este asistente?", category: "general" },
|
|
2676
|
+
{ text: "\xBFC\xF3mo puedo empezar?", category: "general" },
|
|
2677
|
+
{ text: "\xBFC\xF3mo entreno a mi agente?", category: "general" }
|
|
2678
|
+
];
|
|
2679
|
+
}
|
|
2438
2680
|
function ChatWidget({
|
|
2439
2681
|
agentId,
|
|
2440
2682
|
workspaceId,
|
|
@@ -2468,8 +2710,18 @@ function ChatWidget({
|
|
|
2468
2710
|
expanded,
|
|
2469
2711
|
embedded = false,
|
|
2470
2712
|
envId,
|
|
2471
|
-
onDebugTrace
|
|
2713
|
+
onDebugTrace,
|
|
2714
|
+
widgetLayout,
|
|
2715
|
+
clientActions = []
|
|
2472
2716
|
}) {
|
|
2717
|
+
const [isDesktop, setIsDesktop] = react.useState(false);
|
|
2718
|
+
react.useEffect(() => {
|
|
2719
|
+
if (typeof window === "undefined") return;
|
|
2720
|
+
const checkSize = () => setIsDesktop(window.innerWidth >= 768);
|
|
2721
|
+
checkSize();
|
|
2722
|
+
window.addEventListener("resize", checkSize);
|
|
2723
|
+
return () => window.removeEventListener("resize", checkSize);
|
|
2724
|
+
}, []);
|
|
2473
2725
|
const chat = useChat({
|
|
2474
2726
|
agentId,
|
|
2475
2727
|
workspaceId,
|
|
@@ -2570,11 +2822,13 @@ function ChatWidget({
|
|
|
2570
2822
|
["--ring"]: isDark ? "240 4.9% 83.9%" : "240 10% 3.9%",
|
|
2571
2823
|
["--radius"]: "0.5rem"
|
|
2572
2824
|
};
|
|
2825
|
+
const showSplitLayout = widgetLayout === "center" && isDesktop;
|
|
2573
2826
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2574
2827
|
"div",
|
|
2575
2828
|
{
|
|
2576
2829
|
className: cn(
|
|
2577
|
-
"wallavi-widget ww-flex ww-
|
|
2830
|
+
"wallavi-widget ww-flex ww-overflow-hidden ww-bg-background ww-h-full ww-relative ww-overscroll-none",
|
|
2831
|
+
showSplitLayout ? "ww-flex-row" : "ww-flex-col",
|
|
2578
2832
|
!embedded && "ww-rounded-2xl ww-border ww-shadow-xl",
|
|
2579
2833
|
isDragOver && "ww-ring-2 ww-ring-inset ww-ring-primary/60",
|
|
2580
2834
|
className
|
|
@@ -2585,200 +2839,293 @@ function ChatWidget({
|
|
|
2585
2839
|
onDragLeave: handleDragLeave,
|
|
2586
2840
|
onDrop: handleDrop,
|
|
2587
2841
|
children: [
|
|
2588
|
-
|
|
2589
|
-
/* @__PURE__ */ jsxRuntime.
|
|
2590
|
-
|
|
2591
|
-
|
|
2842
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ww-flex ww-flex-col ww-flex-1 ww-h-full ww-overflow-hidden ww-relative", children: [
|
|
2843
|
+
isDragOver && enableAttachments && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ww-absolute ww-inset-0 ww-z-50 ww-flex ww-flex-col ww-items-center ww-justify-center ww-gap-2 ww-rounded-2xl ww-bg-background/90 ww-backdrop-blur-sm ww-pointer-events-none", children: [
|
|
2844
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.UploadCloud, { className: "ww-h-8 ww-w-8 ww-text-primary/70" }),
|
|
2845
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "ww-text-sm ww-font-medium ww-text-foreground/70", children: "Drop files to attach" }),
|
|
2846
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "ww-text-xs ww-text-muted-foreground", children: "CSV, TXT, PDF, JPG, PNG, WebP" })
|
|
2847
|
+
] }),
|
|
2848
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2849
|
+
ChatHeader,
|
|
2850
|
+
{
|
|
2851
|
+
title,
|
|
2852
|
+
profilePicture,
|
|
2853
|
+
headerBg,
|
|
2854
|
+
headerText,
|
|
2855
|
+
onReset: handleReset,
|
|
2856
|
+
onClose: hideCloseButton ? void 0 : onClose,
|
|
2857
|
+
onExpand,
|
|
2858
|
+
expanded,
|
|
2859
|
+
onCall: enableVoice && chat.voiceCall ? () => chat.voiceCall?.start() : void 0,
|
|
2860
|
+
isCallLoading: chat.voiceCall?.loading
|
|
2861
|
+
}
|
|
2862
|
+
),
|
|
2863
|
+
chat.voiceCall?.active && chat.voiceCall.token && chat.voiceCall.serverUrl && /* @__PURE__ */ jsxRuntime.jsx(
|
|
2864
|
+
VoiceOverlay,
|
|
2865
|
+
{
|
|
2866
|
+
token: chat.voiceCall.token,
|
|
2867
|
+
serverUrl: chat.voiceCall.serverUrl,
|
|
2868
|
+
onClose: chat.voiceCall.stop,
|
|
2869
|
+
accentColor: userMessageColor
|
|
2870
|
+
}
|
|
2871
|
+
),
|
|
2872
|
+
customBackend?.mode === "human" && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2873
|
+
"div",
|
|
2874
|
+
{
|
|
2875
|
+
className: "ww-shrink-0 ww-flex ww-items-center ww-gap-2 ww-px-4 ww-py-1.5 ww-border-b",
|
|
2876
|
+
style: { backgroundColor: `${userMessageColor}0d` },
|
|
2877
|
+
children: [
|
|
2878
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ww-relative ww-flex ww-h-2 ww-w-2 ww-shrink-0", children: [
|
|
2879
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "ww-animate-ping ww-absolute ww-inline-flex ww-h-full ww-w-full ww-rounded-full ww-bg-emerald-400 ww-opacity-75" }),
|
|
2880
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "ww-relative ww-inline-flex ww-rounded-full ww-h-2 ww-w-2 ww-bg-emerald-500" })
|
|
2881
|
+
] }),
|
|
2882
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "ww-text-xs ww-font-medium ww-text-foreground/60", children: "Hablando con un agente" })
|
|
2883
|
+
]
|
|
2884
|
+
}
|
|
2885
|
+
),
|
|
2886
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2887
|
+
ChatMessages,
|
|
2888
|
+
{
|
|
2889
|
+
messages: chat.messages,
|
|
2890
|
+
streaming: chat.streaming,
|
|
2891
|
+
agentName,
|
|
2892
|
+
profilePicture,
|
|
2893
|
+
userColor: userMessageColor,
|
|
2894
|
+
initialMessages,
|
|
2895
|
+
suggestedMessages,
|
|
2896
|
+
showThinking,
|
|
2897
|
+
onSuggest: (msg) => chat.send(msg),
|
|
2898
|
+
onPickerSelect: chat.selectPickerOption
|
|
2899
|
+
}
|
|
2900
|
+
),
|
|
2901
|
+
customBackend?.footerAction && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ww-shrink-0 ww-px-3 ww-py-1.5 ww-border-t ww-bg-background", children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2902
|
+
"button",
|
|
2903
|
+
{
|
|
2904
|
+
onClick: () => void customBackend.footerAction.onClick(),
|
|
2905
|
+
disabled: customBackend.footerAction.loading,
|
|
2906
|
+
style: customBackend.footerAction.icon === "human" ? {
|
|
2907
|
+
backgroundColor: userMessageColor,
|
|
2908
|
+
color: "#ffffff",
|
|
2909
|
+
boxShadow: `0 2px 12px ${userMessageColor}55`
|
|
2910
|
+
} : {
|
|
2911
|
+
borderColor: `${userMessageColor}35`,
|
|
2912
|
+
backgroundColor: `${userMessageColor}0d`,
|
|
2913
|
+
color: userMessageColor
|
|
2914
|
+
},
|
|
2915
|
+
className: [
|
|
2916
|
+
"ww-w-full ww-flex ww-items-center ww-gap-2 ww-rounded-full ww-px-3.5 ww-py-1.5 ww-text-xs ww-font-semibold ww-transition-all",
|
|
2917
|
+
"hover:ww-opacity-85 active:ww-scale-[0.98] disabled:ww-opacity-50 disabled:ww-pointer-events-none",
|
|
2918
|
+
customBackend.footerAction.icon === "human" ? "" : "ww-border"
|
|
2919
|
+
].join(" "),
|
|
2920
|
+
children: [
|
|
2921
|
+
customBackend.footerAction.loading ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2922
|
+
"svg",
|
|
2923
|
+
{
|
|
2924
|
+
className: "ww-animate-spin ww-w-3.5 ww-h-3.5 ww-shrink-0",
|
|
2925
|
+
viewBox: "0 0 24 24",
|
|
2926
|
+
fill: "none",
|
|
2927
|
+
children: [
|
|
2928
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2929
|
+
"circle",
|
|
2930
|
+
{
|
|
2931
|
+
className: "ww-opacity-25",
|
|
2932
|
+
cx: "12",
|
|
2933
|
+
cy: "12",
|
|
2934
|
+
r: "10",
|
|
2935
|
+
stroke: "currentColor",
|
|
2936
|
+
strokeWidth: "3"
|
|
2937
|
+
}
|
|
2938
|
+
),
|
|
2939
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2940
|
+
"path",
|
|
2941
|
+
{
|
|
2942
|
+
className: "ww-opacity-75",
|
|
2943
|
+
fill: "currentColor",
|
|
2944
|
+
d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"
|
|
2945
|
+
}
|
|
2946
|
+
)
|
|
2947
|
+
]
|
|
2948
|
+
}
|
|
2949
|
+
) : customBackend.footerAction.icon === "ai" ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
2950
|
+
"svg",
|
|
2951
|
+
{
|
|
2952
|
+
className: "ww-w-3.5 ww-h-3.5 ww-shrink-0",
|
|
2953
|
+
viewBox: "0 0 24 24",
|
|
2954
|
+
fill: "none",
|
|
2955
|
+
stroke: "currentColor",
|
|
2956
|
+
strokeWidth: "2",
|
|
2957
|
+
strokeLinecap: "round",
|
|
2958
|
+
strokeLinejoin: "round",
|
|
2959
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m12 3-1.912 5.813a2 2 0 0 1-1.275 1.275L3 12l5.813 1.912a2 2 0 0 1 1.275 1.275L12 21l1.912-5.813a2 2 0 0 1 1.275-1.275L21 12l-5.813-1.912a2 2 0 0 1-1.275-1.275L12 3Z" })
|
|
2960
|
+
}
|
|
2961
|
+
) : /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2962
|
+
"svg",
|
|
2963
|
+
{
|
|
2964
|
+
className: "ww-w-3.5 ww-h-3.5 ww-shrink-0",
|
|
2965
|
+
viewBox: "0 0 24 24",
|
|
2966
|
+
fill: "none",
|
|
2967
|
+
stroke: "currentColor",
|
|
2968
|
+
strokeWidth: "2",
|
|
2969
|
+
strokeLinecap: "round",
|
|
2970
|
+
strokeLinejoin: "round",
|
|
2971
|
+
children: [
|
|
2972
|
+
/* @__PURE__ */ jsxRuntime.jsx("path", { d: "M3 18v-6a9 9 0 0 1 18 0v6" }),
|
|
2973
|
+
/* @__PURE__ */ jsxRuntime.jsx("path", { d: "M21 19a2 2 0 0 1-2 2h-1a2 2 0 0 1-2-2v-3a2 2 0 0 1 2-2h3zM3 19a2 2 0 0 0 2 2h1a2 2 0 0 0 2-2v-3a2 2 0 0 0-2-2H3z" })
|
|
2974
|
+
]
|
|
2975
|
+
}
|
|
2976
|
+
),
|
|
2977
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "ww-flex-1 ww-text-left ww-truncate", children: customBackend.footerAction.label }),
|
|
2978
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2979
|
+
"svg",
|
|
2980
|
+
{
|
|
2981
|
+
className: "ww-shrink-0 ww-w-3 ww-h-3 ww-opacity-60",
|
|
2982
|
+
viewBox: "0 0 24 24",
|
|
2983
|
+
fill: "none",
|
|
2984
|
+
stroke: "currentColor",
|
|
2985
|
+
strokeWidth: "2.5",
|
|
2986
|
+
strokeLinecap: "round",
|
|
2987
|
+
strokeLinejoin: "round",
|
|
2988
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M9 18l6-6-6-6" })
|
|
2989
|
+
}
|
|
2990
|
+
)
|
|
2991
|
+
]
|
|
2992
|
+
}
|
|
2993
|
+
) }),
|
|
2994
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2995
|
+
ChatInput,
|
|
2996
|
+
{
|
|
2997
|
+
input: chat.input,
|
|
2998
|
+
setInput: chat.setInput,
|
|
2999
|
+
onSend: handleSend,
|
|
3000
|
+
streaming: chat.streaming,
|
|
3001
|
+
placeholder: messagePlaceholder,
|
|
3002
|
+
accentColor: userMessageColor,
|
|
3003
|
+
canRegenerate: !!canRegenerate,
|
|
3004
|
+
onRegenerate: () => void chat.regenerate(),
|
|
3005
|
+
selectedContext: chat.selectedContext,
|
|
3006
|
+
onClearContext: () => chat.setSelectedContext(null),
|
|
3007
|
+
...enableVoice && voice.isSupported ? {
|
|
3008
|
+
voiceState: voice.voiceState,
|
|
3009
|
+
onVoiceStart: () => void voice.start(),
|
|
3010
|
+
onVoiceStop: voice.stop
|
|
3011
|
+
} : {},
|
|
3012
|
+
...enableAttachments ? {
|
|
3013
|
+
attachments: attachmentHook.attachments,
|
|
3014
|
+
onAttach: attachmentHook.attach,
|
|
3015
|
+
onRemoveAttachment: attachmentHook.remove,
|
|
3016
|
+
isUploading: attachmentHook.isUploading
|
|
3017
|
+
} : {}
|
|
3018
|
+
}
|
|
3019
|
+
),
|
|
3020
|
+
watermark && /* @__PURE__ */ jsxRuntime.jsxs("footer", { className: "ww-shrink-0 ww-flex ww-items-center ww-justify-center ww-gap-1.5 ww-bg-muted/50 ww-py-1.5 ww-border-t ww-touch-none", children: [
|
|
3021
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
3022
|
+
"a",
|
|
3023
|
+
{
|
|
3024
|
+
href: "https://wallavi.com",
|
|
3025
|
+
target: "_blank",
|
|
3026
|
+
rel: "noopener noreferrer",
|
|
3027
|
+
className: "ww-flex ww-items-center ww-gap-1 ww-text-[10px] ww-text-muted-foreground hover:ww-text-foreground ww-transition-colors",
|
|
3028
|
+
children: [
|
|
3029
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3030
|
+
"img",
|
|
3031
|
+
{
|
|
3032
|
+
src: watermarkLogoUrl,
|
|
3033
|
+
alt: "Wallavi",
|
|
3034
|
+
width: 12,
|
|
3035
|
+
height: 12
|
|
3036
|
+
}
|
|
3037
|
+
),
|
|
3038
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "Powered by Wallavi" })
|
|
3039
|
+
]
|
|
3040
|
+
}
|
|
3041
|
+
),
|
|
3042
|
+
footer && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
3043
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "ww-text-muted-foreground/40 ww-text-[10px]", children: "\xB7" }),
|
|
3044
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "ww-text-[10px] ww-text-muted-foreground", children: footer })
|
|
3045
|
+
] })
|
|
3046
|
+
] })
|
|
2592
3047
|
] }),
|
|
2593
|
-
/* @__PURE__ */ jsxRuntime.
|
|
2594
|
-
|
|
2595
|
-
|
|
2596
|
-
|
|
2597
|
-
|
|
2598
|
-
headerBg,
|
|
2599
|
-
headerText,
|
|
2600
|
-
onReset: handleReset,
|
|
2601
|
-
onClose: hideCloseButton ? void 0 : onClose,
|
|
2602
|
-
onExpand,
|
|
2603
|
-
expanded,
|
|
2604
|
-
onCall: enableVoice && chat.voiceCall ? () => chat.voiceCall?.start() : void 0,
|
|
2605
|
-
isCallLoading: chat.voiceCall?.loading
|
|
2606
|
-
}
|
|
2607
|
-
),
|
|
2608
|
-
chat.voiceCall?.active && chat.voiceCall.token && chat.voiceCall.serverUrl && /* @__PURE__ */ jsxRuntime.jsx(
|
|
2609
|
-
VoiceOverlay,
|
|
2610
|
-
{
|
|
2611
|
-
token: chat.voiceCall.token,
|
|
2612
|
-
serverUrl: chat.voiceCall.serverUrl,
|
|
2613
|
-
onClose: chat.voiceCall.stop,
|
|
2614
|
-
accentColor: userMessageColor
|
|
2615
|
-
}
|
|
2616
|
-
),
|
|
2617
|
-
customBackend?.mode === "human" && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2618
|
-
"div",
|
|
2619
|
-
{
|
|
2620
|
-
className: "ww-shrink-0 ww-flex ww-items-center ww-gap-2 ww-px-4 ww-py-1.5 ww-border-b",
|
|
2621
|
-
style: { backgroundColor: `${userMessageColor}0d` },
|
|
2622
|
-
children: [
|
|
2623
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ww-relative ww-flex ww-h-2 ww-w-2 ww-shrink-0", children: [
|
|
3048
|
+
showSplitLayout && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ww-w-[280px] ww-shrink-0 ww-border-l ww-border-border ww-bg-muted/10 ww-flex ww-flex-col ww-h-full ww-overflow-hidden", children: [
|
|
3049
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ww-p-4 ww-border-b ww-border-border ww-shrink-0", children: [
|
|
3050
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "ww-text-xs ww-font-bold ww-text-foreground ww-uppercase ww-tracking-wider", children: "Centro de Comando" }),
|
|
3051
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ww-flex ww-items-center ww-gap-1.5 ww-px-2.5 ww-py-1 ww-rounded-full ww-text-[10px] ww-font-medium ww-bg-emerald-500/10 ww-text-emerald-500 ww-w-fit ww-mt-2 ww-max-w-full", children: [
|
|
3052
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ww-relative ww-flex ww-h-1.5 ww-w-1.5", children: [
|
|
2624
3053
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "ww-animate-ping ww-absolute ww-inline-flex ww-h-full ww-w-full ww-rounded-full ww-bg-emerald-400 ww-opacity-75" }),
|
|
2625
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "ww-relative ww-inline-flex ww-rounded-full ww-h-
|
|
3054
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "ww-relative ww-inline-flex ww-rounded-full ww-h-1.5 ww-w-1.5 ww-bg-emerald-500" })
|
|
2626
3055
|
] }),
|
|
2627
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "ww-
|
|
2628
|
-
]
|
|
2629
|
-
}
|
|
2630
|
-
|
|
2631
|
-
|
|
2632
|
-
|
|
2633
|
-
|
|
2634
|
-
|
|
2635
|
-
streaming: chat.streaming,
|
|
2636
|
-
agentName,
|
|
2637
|
-
profilePicture,
|
|
2638
|
-
userColor: userMessageColor,
|
|
2639
|
-
initialMessages,
|
|
2640
|
-
suggestedMessages,
|
|
2641
|
-
showThinking,
|
|
2642
|
-
onSuggest: (msg) => chat.send(msg),
|
|
2643
|
-
onPickerSelect: chat.selectPickerOption
|
|
2644
|
-
}
|
|
2645
|
-
),
|
|
2646
|
-
customBackend?.footerAction && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ww-shrink-0 ww-px-3 ww-py-1.5 ww-border-t ww-bg-background", children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2647
|
-
"button",
|
|
2648
|
-
{
|
|
2649
|
-
onClick: () => void customBackend.footerAction.onClick(),
|
|
2650
|
-
disabled: customBackend.footerAction.loading,
|
|
2651
|
-
style: customBackend.footerAction.icon === "human" ? {
|
|
2652
|
-
backgroundColor: userMessageColor,
|
|
2653
|
-
color: "#ffffff",
|
|
2654
|
-
boxShadow: `0 2px 12px ${userMessageColor}55`
|
|
2655
|
-
} : {
|
|
2656
|
-
borderColor: `${userMessageColor}35`,
|
|
2657
|
-
backgroundColor: `${userMessageColor}0d`,
|
|
2658
|
-
color: userMessageColor
|
|
2659
|
-
},
|
|
2660
|
-
className: [
|
|
2661
|
-
"ww-w-full ww-flex ww-items-center ww-gap-2 ww-rounded-full ww-px-3.5 ww-py-1.5 ww-text-xs ww-font-semibold ww-transition-all",
|
|
2662
|
-
"hover:ww-opacity-85 active:ww-scale-[0.98] disabled:ww-opacity-50 disabled:ww-pointer-events-none",
|
|
2663
|
-
customBackend.footerAction.icon === "human" ? "" : "ww-border"
|
|
2664
|
-
].join(" "),
|
|
2665
|
-
children: [
|
|
2666
|
-
customBackend.footerAction.loading ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2667
|
-
"svg",
|
|
2668
|
-
{
|
|
2669
|
-
className: "ww-animate-spin ww-w-3.5 ww-h-3.5 ww-shrink-0",
|
|
2670
|
-
viewBox: "0 0 24 24",
|
|
2671
|
-
fill: "none",
|
|
2672
|
-
children: [
|
|
2673
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2674
|
-
"circle",
|
|
2675
|
-
{
|
|
2676
|
-
className: "ww-opacity-25",
|
|
2677
|
-
cx: "12",
|
|
2678
|
-
cy: "12",
|
|
2679
|
-
r: "10",
|
|
2680
|
-
stroke: "currentColor",
|
|
2681
|
-
strokeWidth: "3"
|
|
2682
|
-
}
|
|
2683
|
-
),
|
|
2684
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2685
|
-
"path",
|
|
2686
|
-
{
|
|
2687
|
-
className: "ww-opacity-75",
|
|
2688
|
-
fill: "currentColor",
|
|
2689
|
-
d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"
|
|
2690
|
-
}
|
|
2691
|
-
)
|
|
2692
|
-
]
|
|
2693
|
-
}
|
|
2694
|
-
) : customBackend.footerAction.icon === "ai" ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
2695
|
-
"svg",
|
|
3056
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "ww-truncate", children: userContext?.pageContext?.title || userContext?.pageContext?.url || "P\xE1gina General" })
|
|
3057
|
+
] })
|
|
3058
|
+
] }),
|
|
3059
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ww-flex-1 ww-overflow-y-auto ww-p-4 ww-flex ww-flex-col ww-gap-5", children: [
|
|
3060
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ww-flex ww-flex-col ww-gap-2.5", children: [
|
|
3061
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "ww-text-[10px] ww-font-bold ww-text-muted-foreground ww-uppercase ww-tracking-wider", children: "Acciones R\xE1pidas" }),
|
|
3062
|
+
clientActions && clientActions.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ww-flex ww-flex-col ww-gap-2", children: clientActions.map((action) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
3063
|
+
"button",
|
|
2696
3064
|
{
|
|
2697
|
-
|
|
2698
|
-
|
|
2699
|
-
fill: "none",
|
|
2700
|
-
stroke: "currentColor",
|
|
2701
|
-
strokeWidth: "2",
|
|
2702
|
-
strokeLinecap: "round",
|
|
2703
|
-
strokeLinejoin: "round",
|
|
2704
|
-
children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m12 3-1.912 5.813a2 2 0 0 1-1.275 1.275L3 12l5.813 1.912a2 2 0 0 1 1.275 1.275L12 21l1.912-5.813a2 2 0 0 1 1.275-1.275L21 12l-5.813-1.912a2 2 0 0 1-1.275-1.275L12 3Z" })
|
|
2705
|
-
}
|
|
2706
|
-
) : /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2707
|
-
"svg",
|
|
2708
|
-
{
|
|
2709
|
-
className: "ww-w-3.5 ww-h-3.5 ww-shrink-0",
|
|
2710
|
-
viewBox: "0 0 24 24",
|
|
2711
|
-
fill: "none",
|
|
2712
|
-
stroke: "currentColor",
|
|
2713
|
-
strokeWidth: "2",
|
|
2714
|
-
strokeLinecap: "round",
|
|
2715
|
-
strokeLinejoin: "round",
|
|
3065
|
+
onClick: () => executeDeclarativeSteps(action.steps, onNavigate),
|
|
3066
|
+
className: "ww-w-full ww-flex ww-flex-col ww-items-start ww-gap-1 ww-rounded-xl ww-border ww-border-border ww-p-3 ww-text-left ww-bg-background hover:ww-bg-accent/40 hover:ww-border-accent-foreground/25 active:ww-scale-[0.98] ww-transition-all ww-duration-200 ww-group",
|
|
2716
3067
|
children: [
|
|
2717
|
-
/* @__PURE__ */ jsxRuntime.
|
|
2718
|
-
|
|
3068
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ww-flex ww-items-center ww-gap-1.5 ww-w-full", children: [
|
|
3069
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3070
|
+
"svg",
|
|
3071
|
+
{
|
|
3072
|
+
className: "ww-w-3.5 ww-h-3.5 ww-text-zinc-400 group-hover:ww-text-primary group-hover:ww-rotate-12 ww-transition-transform",
|
|
3073
|
+
viewBox: "0 0 24 24",
|
|
3074
|
+
fill: "none",
|
|
3075
|
+
stroke: "currentColor",
|
|
3076
|
+
strokeWidth: "2",
|
|
3077
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
3078
|
+
"path",
|
|
3079
|
+
{
|
|
3080
|
+
strokeLinecap: "round",
|
|
3081
|
+
strokeLinejoin: "round",
|
|
3082
|
+
d: "M3.75 13.5l10.5-11.25L12 10.5h8.25L9.75 21.75 12 13.5H3.75z"
|
|
3083
|
+
}
|
|
3084
|
+
)
|
|
3085
|
+
}
|
|
3086
|
+
),
|
|
3087
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "ww-text-xs ww-font-semibold ww-text-foreground ww-truncate", children: action.name })
|
|
3088
|
+
] }),
|
|
3089
|
+
action.description && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ww-text-[10px] ww-text-muted-foreground ww-line-clamp-2", children: action.description })
|
|
2719
3090
|
]
|
|
2720
|
-
}
|
|
2721
|
-
|
|
2722
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "ww-
|
|
2723
|
-
|
|
2724
|
-
|
|
2725
|
-
|
|
2726
|
-
|
|
2727
|
-
|
|
2728
|
-
|
|
2729
|
-
|
|
2730
|
-
|
|
2731
|
-
|
|
2732
|
-
|
|
2733
|
-
|
|
2734
|
-
|
|
2735
|
-
|
|
2736
|
-
|
|
2737
|
-
|
|
2738
|
-
|
|
2739
|
-
|
|
2740
|
-
|
|
2741
|
-
|
|
2742
|
-
|
|
2743
|
-
|
|
2744
|
-
|
|
2745
|
-
|
|
2746
|
-
|
|
2747
|
-
|
|
2748
|
-
|
|
2749
|
-
|
|
2750
|
-
|
|
2751
|
-
|
|
2752
|
-
|
|
2753
|
-
|
|
2754
|
-
|
|
2755
|
-
|
|
2756
|
-
|
|
2757
|
-
|
|
2758
|
-
attachments: attachmentHook.attachments,
|
|
2759
|
-
onAttach: attachmentHook.attach,
|
|
2760
|
-
onRemoveAttachment: attachmentHook.remove,
|
|
2761
|
-
isUploading: attachmentHook.isUploading
|
|
2762
|
-
} : {}
|
|
2763
|
-
}
|
|
2764
|
-
),
|
|
2765
|
-
watermark && /* @__PURE__ */ jsxRuntime.jsxs("footer", { className: "ww-shrink-0 ww-flex ww-items-center ww-justify-center ww-gap-1.5 ww-bg-muted/50 ww-py-1.5 ww-border-t ww-touch-none", children: [
|
|
2766
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
2767
|
-
"a",
|
|
2768
|
-
{
|
|
2769
|
-
href: "https://wallavi.com",
|
|
2770
|
-
target: "_blank",
|
|
2771
|
-
rel: "noopener noreferrer",
|
|
2772
|
-
className: "ww-flex ww-items-center ww-gap-1 ww-text-[10px] ww-text-muted-foreground hover:ww-text-foreground ww-transition-colors",
|
|
2773
|
-
children: [
|
|
2774
|
-
/* @__PURE__ */ jsxRuntime.jsx("img", { src: watermarkLogoUrl, alt: "Wallavi", width: 12, height: 12 }),
|
|
2775
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "Powered by Wallavi" })
|
|
2776
|
-
]
|
|
2777
|
-
}
|
|
2778
|
-
),
|
|
2779
|
-
footer && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
2780
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "ww-text-muted-foreground/40 ww-text-[10px]", children: "\xB7" }),
|
|
2781
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "ww-text-[10px] ww-text-muted-foreground", children: footer })
|
|
3091
|
+
},
|
|
3092
|
+
action.name
|
|
3093
|
+
)) }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ww-text-[10px] ww-text-muted-foreground ww-italic ww-px-1", children: "No hay acciones disponibles para esta p\xE1gina" })
|
|
3094
|
+
] }),
|
|
3095
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ww-flex ww-flex-col ww-gap-2.5", children: [
|
|
3096
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "ww-text-[10px] ww-font-bold ww-text-muted-foreground ww-uppercase ww-tracking-wider", children: "Sugerencias" }),
|
|
3097
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "ww-flex ww-flex-col ww-gap-2", children: getContextQueries(userContext?.pageContext?.url || "").map(
|
|
3098
|
+
(query) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
3099
|
+
"button",
|
|
3100
|
+
{
|
|
3101
|
+
onClick: () => chat.send(query.text),
|
|
3102
|
+
className: "ww-w-full ww-flex ww-items-start ww-gap-2 ww-rounded-xl ww-border ww-border-border/60 ww-p-2.5 ww-text-left ww-bg-muted/30 hover:ww-bg-accent/30 hover:ww-border-accent-foreground/20 active:ww-scale-[0.98] ww-transition-all ww-duration-200",
|
|
3103
|
+
children: [
|
|
3104
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3105
|
+
"svg",
|
|
3106
|
+
{
|
|
3107
|
+
className: "ww-w-3.5 ww-h-3.5 ww-text-zinc-400 ww-shrink-0 ww-mt-0.5",
|
|
3108
|
+
viewBox: "0 0 24 24",
|
|
3109
|
+
fill: "none",
|
|
3110
|
+
stroke: "currentColor",
|
|
3111
|
+
strokeWidth: "2",
|
|
3112
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
3113
|
+
"path",
|
|
3114
|
+
{
|
|
3115
|
+
strokeLinecap: "round",
|
|
3116
|
+
strokeLinejoin: "round",
|
|
3117
|
+
d: "M7.5 8.25h9m-9 3H12m-9.75 1.51c0 1.6 1.12 2.9 2.78 2.9h6.22l3.75 3.75V18.1H18c1.66 0 2.78-1.3 2.78-2.9v-7c0-1.6-1.12-2.9-2.78-2.9H5.25c-1.66 0-2.78 1.3-2.78 2.9v7z"
|
|
3118
|
+
}
|
|
3119
|
+
)
|
|
3120
|
+
}
|
|
3121
|
+
),
|
|
3122
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "ww-text-xs ww-font-medium ww-text-foreground/90", children: query.text })
|
|
3123
|
+
]
|
|
3124
|
+
},
|
|
3125
|
+
query.text
|
|
3126
|
+
)
|
|
3127
|
+
) })
|
|
3128
|
+
] })
|
|
2782
3129
|
] })
|
|
2783
3130
|
] })
|
|
2784
3131
|
]
|
|
@@ -2793,6 +3140,7 @@ var EMPTY = {
|
|
|
2793
3140
|
keyboardShortcut: false,
|
|
2794
3141
|
position: "bottom-right",
|
|
2795
3142
|
widgetLayout: "bubble",
|
|
3143
|
+
clientActions: [],
|
|
2796
3144
|
bubbleSize: 52,
|
|
2797
3145
|
panelWidth: 360,
|
|
2798
3146
|
panelHeight: 580,
|
|
@@ -2836,6 +3184,8 @@ function useAutoConfig(agentId, enabled) {
|
|
|
2836
3184
|
remote.widgetLayout = cfg.widgetLayout;
|
|
2837
3185
|
if (cfg.enableVoice != null)
|
|
2838
3186
|
remote.enableVoice = cfg.enableVoice;
|
|
3187
|
+
if (cfg.clientActions)
|
|
3188
|
+
remote.clientActions = cfg.clientActions;
|
|
2839
3189
|
setResult({
|
|
2840
3190
|
remoteConfig: remote,
|
|
2841
3191
|
bubbleIconUrl: cfg.chatIcon || cfg.profilePicture || void 0,
|
|
@@ -2843,6 +3193,7 @@ function useAutoConfig(agentId, enabled) {
|
|
|
2843
3193
|
keyboardShortcut: Boolean(cfg.keyboardShortcut),
|
|
2844
3194
|
position: cfg.alignChatBubbleButton === "left" ? "bottom-left" : "bottom-right",
|
|
2845
3195
|
widgetLayout: cfg.widgetLayout === "center" ? "center" : "bubble",
|
|
3196
|
+
clientActions: Array.isArray(cfg.clientActions) ? cfg.clientActions : [],
|
|
2846
3197
|
bubbleSize: typeof cfg.bubbleSize === "number" ? cfg.bubbleSize : 52,
|
|
2847
3198
|
panelWidth: typeof cfg.panelWidth === "number" ? cfg.panelWidth : 360,
|
|
2848
3199
|
panelHeight: typeof cfg.panelHeight === "number" ? cfg.panelHeight : 580,
|