@revvue/embed-react 0.0.0-beta.2 → 0.0.0-beta.4
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/css/dialog.css +1 -1
- package/dist/css/drawer.css +1 -1
- package/dist/css/popover.css +1 -1
- package/dist/package.cjs +269 -106
- package/dist/package.mjs +267 -108
- package/dist/types/bindings/dialog/build-stable-deps.d.ts +5 -0
- package/dist/types/bindings/dialog/build-stable-deps.d.ts.map +1 -0
- package/dist/types/bindings/dialog/dialog.d.ts +5 -0
- package/dist/types/bindings/dialog/dialog.d.ts.map +1 -0
- package/dist/types/bindings/dialog/index.d.ts.map +1 -0
- package/dist/types/bindings/drawer/build-stable-deps.d.ts +11 -0
- package/dist/types/bindings/drawer/build-stable-deps.d.ts.map +1 -0
- package/dist/types/bindings/drawer/drawer.d.ts +24 -0
- package/dist/types/bindings/drawer/drawer.d.ts.map +1 -0
- package/dist/types/bindings/drawer/index.d.ts.map +1 -0
- package/dist/types/bindings/index.d.ts.map +1 -0
- package/dist/types/bindings/popover/build-stable-deps.d.ts +10 -0
- package/dist/types/bindings/popover/build-stable-deps.d.ts.map +1 -0
- package/dist/types/bindings/popover/index.d.ts.map +1 -0
- package/dist/types/bindings/popover/popover.d.ts +42 -0
- package/dist/types/bindings/popover/popover.d.ts.map +1 -0
- package/dist/types/bindings/widget/build-stable-deps.d.ts.map +1 -0
- package/dist/types/bindings/widget/index.d.ts.map +1 -0
- package/dist/types/bindings/widget/widget.d.ts +24 -0
- package/dist/types/bindings/widget/widget.d.ts.map +1 -0
- package/dist/types/index.d.ts +2 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/internal/create-floating-bindings.d.ts +60 -0
- package/dist/types/internal/create-floating-bindings.d.ts.map +1 -0
- package/dist/types/internal/create-widget-bindings.d.ts +32 -0
- package/dist/types/internal/create-widget-bindings.d.ts.map +1 -0
- package/dist/types/internal/index.d.ts +4 -0
- package/dist/types/internal/index.d.ts.map +1 -0
- package/dist/types/internal/slot.d.ts +31 -0
- package/dist/types/internal/slot.d.ts.map +1 -0
- package/package.json +2 -2
- package/dist/types/components/dialog/build-stable-deps.d.ts +0 -3
- package/dist/types/components/dialog/build-stable-deps.d.ts.map +0 -1
- package/dist/types/components/dialog/dialog.d.ts +0 -6
- package/dist/types/components/dialog/dialog.d.ts.map +0 -1
- package/dist/types/components/dialog/index.d.ts.map +0 -1
- package/dist/types/components/drawer/build-stable-deps.d.ts +0 -3
- package/dist/types/components/drawer/build-stable-deps.d.ts.map +0 -1
- package/dist/types/components/drawer/drawer.d.ts +0 -6
- package/dist/types/components/drawer/drawer.d.ts.map +0 -1
- package/dist/types/components/drawer/index.d.ts.map +0 -1
- package/dist/types/components/index.d.ts.map +0 -1
- package/dist/types/components/popover/build-stable-deps.d.ts +0 -3
- package/dist/types/components/popover/build-stable-deps.d.ts.map +0 -1
- package/dist/types/components/popover/index.d.ts.map +0 -1
- package/dist/types/components/popover/popover.d.ts +0 -29
- package/dist/types/components/popover/popover.d.ts.map +0 -1
- package/dist/types/components/widget/build-stable-deps.d.ts.map +0 -1
- package/dist/types/components/widget/index.d.ts.map +0 -1
- package/dist/types/components/widget/widget.d.ts +0 -11
- package/dist/types/components/widget/widget.d.ts.map +0 -1
- /package/dist/types/{components → bindings}/dialog/index.d.ts +0 -0
- /package/dist/types/{components → bindings}/drawer/index.d.ts +0 -0
- /package/dist/types/{components → bindings}/index.d.ts +0 -0
- /package/dist/types/{components → bindings}/popover/index.d.ts +0 -0
- /package/dist/types/{components → bindings}/widget/build-stable-deps.d.ts +0 -0
- /package/dist/types/{components → bindings}/widget/index.d.ts +0 -0
package/dist/css/dialog.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
@layer tokens{:root{--rvv-z-index:10001;--rvv-color-background:#fff;--rvv-color-foreground:#151426;--rvv-shadow-base:0 2px 12px 0 #0000001a;--rvv-shadow-base-hover:0 2px 12px 0 #0003;--radius-base:10px;--rvv-button-color:var(--rvv-color-foreground);--rvv-button-text-color:#fff}}.rvv-button{all:unset;box-sizing:border-box;cursor:pointer;-webkit-user-select:none;user-select:none
|
|
1
|
+
@layer tokens{:root{--rvv-z-index:10001;--rvv-color-background:#fff;--rvv-color-foreground:#151426;--rvv-shadow-base:0 2px 12px 0 #0000001a;--rvv-shadow-base-hover:0 2px 12px 0 #0003;--radius-base:10px;--rvv-button-color:var(--rvv-color-foreground);--rvv-button-text-color:#fff}}.rvv-button{all:unset;box-sizing:border-box;cursor:pointer;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;justify-content:center;align-items:center;gap:8px;font-family:inherit;line-height:1;display:inline-flex}.rvv-button--trigger{background-color:var(--rvv-button-color);box-shadow:var(--rvv-shadow-base);color:var(--rvv-button-text-color);white-space:nowrap;border-radius:100px;padding:12px 20px;font-size:15px;font-weight:500;transition:transform .15s,box-shadow .15s}.rvv-button--trigger:hover{color:var(--rvv-button-text-color);transform:scale(1.05)}.rvv-button--trigger:active,.rvv-button--trigger:hover{box-shadow:var(--rvv-shadow-base-hover)}.rvv-button--trigger:active{transform:scale(.95)}.rvv-button--trigger-popover{z-index:var(--rvv-z-index);position:fixed;bottom:24px}.rvv-button--trigger-popover[data-position=right]{right:24px}.rvv-button--trigger-popover[data-position=left]{left:24px}.rvv-button:has(.rvv-button-icon):not(:has(.rvv-button-label)){aspect-ratio:1;border-radius:50%;padding:14px}.rvv-button-icon{flex-shrink:0;justify-content:center;align-items:center;font-size:1.15em;display:inline-flex;position:relative}.rvv-button-icon svg{fill:currentColor;width:1em;height:1em}.rvv-button-icon--close,.rvv-button-icon--open{justify-content:center;align-items:center;transition:opacity .2s,transform .2s;display:inline-flex}.rvv-button-icon--close{opacity:0;position:absolute;inset:0;transform:rotate(45deg)scale(.5)}.rvv-button[data-open=true] .rvv-button-icon--open{opacity:0;transform:rotate(-45deg)scale(.5)}.rvv-button[data-open=true] .rvv-button-icon--close{opacity:1;transform:rotate(0)scale(1)}.rvv-button-label{flex:1 0 auto}@media (width<=480px){.rvv-button--trigger-popover{bottom:16px}.rvv-button--trigger-popover[data-position=right]{right:16px}.rvv-button--trigger-popover[data-position=left]{left:16px}}dialog.rvv-dialog{border-radius:var(--radius-base);opacity:0;max-width:calc(100vw - 32px);max-height:calc(100dvh - 32px);transition:opacity .2s ease,transform .2s ease,display allow-discrete .2s,overlay allow-discrete .2s;background:0 0;border:none;margin:auto;padding:0;overflow:visible;transform:scale(.96)translateY(10px)}dialog.rvv-dialog[open]{opacity:1;transform:scale(1)translateY(0)}@starting-style{dialog.rvv-dialog[open]{opacity:0;transform:scale(.96)translateY(10px)}}dialog.rvv-dialog::backdrop{-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);opacity:0;transition:opacity .2s ease,display allow-discrete .2s,overlay allow-discrete .2s;background:#00000080}dialog.rvv-dialog[open]::backdrop{opacity:1}@starting-style{dialog.rvv-dialog[open]::backdrop{opacity:0}}.rvv-dialog-wrapper{background-color:var(--rvv-color-background);border-radius:var(--radius-base);box-shadow:var(--rvv-shadow-base);overflow:hidden}.rvv-dialog-wrapper iframe{border:none;width:100%;height:100%;display:block}@media (width<=480px){dialog.rvv-dialog{border-radius:0;max-width:100vw;max-height:100dvh;margin:0}.rvv-dialog-wrapper{border-radius:0;width:100vw;height:100dvh}}
|
package/dist/css/drawer.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
@layer tokens{:root{--rvv-z-index:10001;--rvv-color-background:#fff;--rvv-color-foreground:#151426;--rvv-shadow-base:0 2px 12px 0 #0000001a;--rvv-shadow-base-hover:0 2px 12px 0 #0003;--radius-base:10px;--rvv-button-color:var(--rvv-color-foreground);--rvv-button-text-color:#fff}}.rvv-button{all:unset;box-sizing:border-box;cursor:pointer;-webkit-user-select:none;user-select:none
|
|
1
|
+
@layer tokens{:root{--rvv-z-index:10001;--rvv-color-background:#fff;--rvv-color-foreground:#151426;--rvv-shadow-base:0 2px 12px 0 #0000001a;--rvv-shadow-base-hover:0 2px 12px 0 #0003;--radius-base:10px;--rvv-button-color:var(--rvv-color-foreground);--rvv-button-text-color:#fff}}.rvv-button{all:unset;box-sizing:border-box;cursor:pointer;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;justify-content:center;align-items:center;gap:8px;font-family:inherit;line-height:1;display:inline-flex}.rvv-button--trigger{background-color:var(--rvv-button-color);box-shadow:var(--rvv-shadow-base);color:var(--rvv-button-text-color);white-space:nowrap;border-radius:100px;padding:12px 20px;font-size:15px;font-weight:500;transition:transform .15s,box-shadow .15s}.rvv-button--trigger:hover{color:var(--rvv-button-text-color);transform:scale(1.05)}.rvv-button--trigger:active,.rvv-button--trigger:hover{box-shadow:var(--rvv-shadow-base-hover)}.rvv-button--trigger:active{transform:scale(.95)}.rvv-button--trigger-popover{z-index:var(--rvv-z-index);position:fixed;bottom:24px}.rvv-button--trigger-popover[data-position=right]{right:24px}.rvv-button--trigger-popover[data-position=left]{left:24px}.rvv-button:has(.rvv-button-icon):not(:has(.rvv-button-label)){aspect-ratio:1;border-radius:50%;padding:14px}.rvv-button-icon{flex-shrink:0;justify-content:center;align-items:center;font-size:1.15em;display:inline-flex;position:relative}.rvv-button-icon svg{fill:currentColor;width:1em;height:1em}.rvv-button-icon--close,.rvv-button-icon--open{justify-content:center;align-items:center;transition:opacity .2s,transform .2s;display:inline-flex}.rvv-button-icon--close{opacity:0;position:absolute;inset:0;transform:rotate(45deg)scale(.5)}.rvv-button[data-open=true] .rvv-button-icon--open{opacity:0;transform:rotate(-45deg)scale(.5)}.rvv-button[data-open=true] .rvv-button-icon--close{opacity:1;transform:rotate(0)scale(1)}.rvv-button-label{flex:1 0 auto}@media (width<=480px){.rvv-button--trigger-popover{bottom:16px}.rvv-button--trigger-popover[data-position=right]{right:16px}.rvv-button--trigger-popover[data-position=left]{left:16px}}.rvv-drawer{pointer-events:none;z-index:var(--rvv-z-index);background-color:#0000;transition:background-color .35s;position:fixed;inset:0}.rvv-drawer.open{pointer-events:auto;background-color:#0006}.rvv-drawer.open .rvv-drawer-wrapper{transform:translate(0)}.rvv-drawer-wrapper{background-color:var(--rvv-color-background);transition:transform .35s cubic-bezier(.4,0,.2,1);position:absolute;top:0;bottom:0;right:0;overflow:hidden;transform:translate(100%);box-shadow:-4px 0 24px #0000001f}.rvv-drawer-wrapper iframe{border:none;width:100%;height:100%;display:block}@media (width<=480px){.rvv-drawer-wrapper{width:100vw}}
|
package/dist/css/popover.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
@layer tokens{:root{--rvv-z-index:10001;--rvv-color-background:#fff;--rvv-color-foreground:#151426;--rvv-shadow-base:0 2px 12px 0 #0000001a;--rvv-shadow-base-hover:0 2px 12px 0 #0003;--radius-base:10px;--rvv-button-color:var(--rvv-color-foreground);--rvv-button-text-color:#fff}}.rvv-button{all:unset;box-sizing:border-box;cursor:pointer;-webkit-user-select:none;user-select:none
|
|
1
|
+
@layer tokens{:root{--rvv-z-index:10001;--rvv-color-background:#fff;--rvv-color-foreground:#151426;--rvv-shadow-base:0 2px 12px 0 #0000001a;--rvv-shadow-base-hover:0 2px 12px 0 #0003;--radius-base:10px;--rvv-button-color:var(--rvv-color-foreground);--rvv-button-text-color:#fff}}.rvv-button{all:unset;box-sizing:border-box;cursor:pointer;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;justify-content:center;align-items:center;gap:8px;font-family:inherit;line-height:1;display:inline-flex}.rvv-button--trigger{background-color:var(--rvv-button-color);box-shadow:var(--rvv-shadow-base);color:var(--rvv-button-text-color);white-space:nowrap;border-radius:100px;padding:12px 20px;font-size:15px;font-weight:500;transition:transform .15s,box-shadow .15s}.rvv-button--trigger:hover{color:var(--rvv-button-text-color);transform:scale(1.05)}.rvv-button--trigger:active,.rvv-button--trigger:hover{box-shadow:var(--rvv-shadow-base-hover)}.rvv-button--trigger:active{transform:scale(.95)}.rvv-button--trigger-popover{z-index:var(--rvv-z-index);position:fixed;bottom:24px}.rvv-button--trigger-popover[data-position=right]{right:24px}.rvv-button--trigger-popover[data-position=left]{left:24px}.rvv-button:has(.rvv-button-icon):not(:has(.rvv-button-label)){aspect-ratio:1;border-radius:50%;padding:14px}.rvv-button-icon{flex-shrink:0;justify-content:center;align-items:center;font-size:1.15em;display:inline-flex;position:relative}.rvv-button-icon svg{fill:currentColor;width:1em;height:1em}.rvv-button-icon--close,.rvv-button-icon--open{justify-content:center;align-items:center;transition:opacity .2s,transform .2s;display:inline-flex}.rvv-button-icon--close{opacity:0;position:absolute;inset:0;transform:rotate(45deg)scale(.5)}.rvv-button[data-open=true] .rvv-button-icon--open{opacity:0;transform:rotate(-45deg)scale(.5)}.rvv-button[data-open=true] .rvv-button-icon--close{opacity:1;transform:rotate(0)scale(1)}.rvv-button-label{flex:1 0 auto}@media (width<=480px){.rvv-button--trigger-popover{bottom:16px}.rvv-button--trigger-popover[data-position=right]{right:16px}.rvv-button--trigger-popover[data-position=left]{left:16px}}.rvv-popover{background-color:var(--rvv-color-background);border-radius:var(--radius-base);box-shadow:var(--rvv-shadow-base);opacity:0;transform-origin:100% 100%;max-width:100%;transition:opacity .15s ease,transform .15s ease,display allow-discrete .15s,overlay allow-discrete .15s;z-index:var(--rvv-z-index);display:none;position:fixed;bottom:96px;right:16px;overflow:hidden;transform:translateY(6px)scale(.99)}.rvv-popover.open{opacity:1;display:flex;transform:translateY(0)scale(1)}@starting-style{.rvv-popover.open{opacity:0;transform:translateY(6px)scale(.99)}}.rvv-popover iframe{border:none;width:100%;min-height:100%}.rvv-popover-wrapper{width:100%;min-width:360px;min-height:400px}@media (width<=480px){.rvv-popover{border-radius:var(--radius-base) var(--radius-base) 0 0;transform-origin:bottom;min-width:0;bottom:0;left:0;right:0;width:100%!important}}
|
package/dist/package.cjs
CHANGED
|
@@ -1,8 +1,179 @@
|
|
|
1
|
+
"use client";
|
|
1
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
3
|
let _revvue_embed = require("@revvue/embed");
|
|
3
4
|
let react = require("react");
|
|
4
5
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
5
|
-
//#region src/
|
|
6
|
+
//#region src/internal/slot.tsx
|
|
7
|
+
/**
|
|
8
|
+
* Radix-style `asChild` slot. Clones the single React element child and merges
|
|
9
|
+
* trigger-related props onto it. The child's own props win for non-handler
|
|
10
|
+
* fields (so a consumer's `className` is preserved alongside ours), and event
|
|
11
|
+
* handlers are composed (the child handler runs first, then the slot handler —
|
|
12
|
+
* so consumers can call `event.preventDefault()` to skip our `toggle` call).
|
|
13
|
+
*
|
|
14
|
+
* Throws synchronously if `children` is not a single React element so the
|
|
15
|
+
* misuse is obvious in development.
|
|
16
|
+
*/
|
|
17
|
+
function Slot({ children, ...slotProps }) {
|
|
18
|
+
if (!(0, react.isValidElement)(children)) throw new Error("`asChild` requires exactly one React element as a child.");
|
|
19
|
+
const child = children;
|
|
20
|
+
const childProps = child.props;
|
|
21
|
+
const merged = {
|
|
22
|
+
...slotProps,
|
|
23
|
+
...childProps
|
|
24
|
+
};
|
|
25
|
+
if (slotProps.onClick || childProps.onClick) merged.onClick = (event) => {
|
|
26
|
+
childProps.onClick?.(event);
|
|
27
|
+
if (!event.defaultPrevented) slotProps.onClick?.(event);
|
|
28
|
+
};
|
|
29
|
+
if (slotProps.className || childProps.className) merged.className = [childProps.className, slotProps.className].filter(Boolean).join(" ");
|
|
30
|
+
if (slotProps.style || childProps.style) merged.style = {
|
|
31
|
+
...slotProps.style,
|
|
32
|
+
...childProps.style
|
|
33
|
+
};
|
|
34
|
+
return (0, react.cloneElement)(child, merged);
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
//#region src/internal/create-floating-bindings.tsx
|
|
38
|
+
/**
|
|
39
|
+
* Builds a `{ useEmbed, Embed }` pair for a floating embed (drawer, dialog,
|
|
40
|
+
* popover). The hook owns mount/unmount + open-state subscription; the
|
|
41
|
+
* component is a thin wrapper that renders a default `<button>` trigger and
|
|
42
|
+
* spreads `getTriggerProps()` onto it.
|
|
43
|
+
*/
|
|
44
|
+
function createFloatingBindings({ factory, buildStableDeps }) {
|
|
45
|
+
function useEmbed(props) {
|
|
46
|
+
const instanceRef = (0, react.useRef)(null);
|
|
47
|
+
const [isOpen, setIsOpen] = (0, react.useState)(false);
|
|
48
|
+
(0, react.useEffect)(() => {
|
|
49
|
+
const instance = factory(props);
|
|
50
|
+
instanceRef.current = instance;
|
|
51
|
+
setIsOpen(instance.isOpen());
|
|
52
|
+
const unsubscribe = instance.subscribe(() => {
|
|
53
|
+
setIsOpen(instance.isOpen());
|
|
54
|
+
});
|
|
55
|
+
return () => {
|
|
56
|
+
unsubscribe();
|
|
57
|
+
instance.unmount();
|
|
58
|
+
instanceRef.current = null;
|
|
59
|
+
};
|
|
60
|
+
}, [...buildStableDeps(props)]);
|
|
61
|
+
const handlers = (0, react.useMemo)(() => ({
|
|
62
|
+
open: () => void instanceRef.current?.open(),
|
|
63
|
+
close: () => void instanceRef.current?.close(),
|
|
64
|
+
toggle: () => void instanceRef.current?.toggle(),
|
|
65
|
+
refresh: () => void instanceRef.current?.refresh(),
|
|
66
|
+
focus: () => void instanceRef.current?.focus()
|
|
67
|
+
}), []);
|
|
68
|
+
const getTriggerProps = (0, react.useCallback)(() => ({
|
|
69
|
+
type: "button",
|
|
70
|
+
onClick: () => handlers.toggle(),
|
|
71
|
+
"aria-expanded": isOpen,
|
|
72
|
+
"aria-haspopup": "dialog"
|
|
73
|
+
}), [handlers, isOpen]);
|
|
74
|
+
return (0, react.useMemo)(() => ({
|
|
75
|
+
...handlers,
|
|
76
|
+
isOpen,
|
|
77
|
+
getTriggerProps
|
|
78
|
+
}), [
|
|
79
|
+
handlers,
|
|
80
|
+
isOpen,
|
|
81
|
+
getTriggerProps
|
|
82
|
+
]);
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
useEmbed,
|
|
86
|
+
Embed: (0, react.memo)(function FloatingEmbed(props) {
|
|
87
|
+
const { asChild, children, className, style, onClick, ref, ...embedProps } = props;
|
|
88
|
+
const { getTriggerProps, focus, close, open, toggle, refresh } = useEmbed(embedProps);
|
|
89
|
+
const trigger = getTriggerProps();
|
|
90
|
+
const composedOnClick = (event) => {
|
|
91
|
+
onClick?.(event);
|
|
92
|
+
if (!event.defaultPrevented) trigger.onClick?.(event);
|
|
93
|
+
};
|
|
94
|
+
(0, react.useImperativeHandle)(ref, () => ({
|
|
95
|
+
close,
|
|
96
|
+
focus,
|
|
97
|
+
open,
|
|
98
|
+
refresh,
|
|
99
|
+
toggle
|
|
100
|
+
}), [
|
|
101
|
+
focus,
|
|
102
|
+
close,
|
|
103
|
+
open,
|
|
104
|
+
toggle,
|
|
105
|
+
refresh
|
|
106
|
+
]);
|
|
107
|
+
if (asChild) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Slot, {
|
|
108
|
+
type: trigger.type,
|
|
109
|
+
onClick: composedOnClick,
|
|
110
|
+
className,
|
|
111
|
+
style,
|
|
112
|
+
"aria-expanded": trigger["aria-expanded"],
|
|
113
|
+
"aria-haspopup": trigger["aria-haspopup"],
|
|
114
|
+
children
|
|
115
|
+
});
|
|
116
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
117
|
+
type: trigger.type,
|
|
118
|
+
onClick: composedOnClick,
|
|
119
|
+
className,
|
|
120
|
+
style,
|
|
121
|
+
"aria-expanded": trigger["aria-expanded"],
|
|
122
|
+
"aria-haspopup": trigger["aria-haspopup"],
|
|
123
|
+
children
|
|
124
|
+
});
|
|
125
|
+
})
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
//#endregion
|
|
129
|
+
//#region src/internal/create-widget-bindings.tsx
|
|
130
|
+
/**
|
|
131
|
+
* Builds a `{ useEmbed, Embed }` pair for an inline widget. Unlike floating
|
|
132
|
+
* embeds, widgets need a host element — the hook returns a `containerRef` the
|
|
133
|
+
* consumer must attach to a DOM node, and the component does that for you by
|
|
134
|
+
* rendering a `<div>`.
|
|
135
|
+
*/
|
|
136
|
+
function createWidgetBindings({ factory, buildStableDeps }) {
|
|
137
|
+
function useEmbed(props) {
|
|
138
|
+
const containerRef = (0, react.useRef)(null);
|
|
139
|
+
const instanceRef = (0, react.useRef)(null);
|
|
140
|
+
(0, react.useEffect)(() => {
|
|
141
|
+
if (!containerRef.current) return;
|
|
142
|
+
const instance = factory(props, containerRef.current);
|
|
143
|
+
instanceRef.current = instance;
|
|
144
|
+
return () => {
|
|
145
|
+
instance.unmount();
|
|
146
|
+
instanceRef.current = null;
|
|
147
|
+
};
|
|
148
|
+
}, [...buildStableDeps(props)]);
|
|
149
|
+
const handlers = (0, react.useMemo)(() => ({
|
|
150
|
+
refresh: () => void instanceRef.current?.refresh(),
|
|
151
|
+
focus: () => void instanceRef.current?.focus()
|
|
152
|
+
}), []);
|
|
153
|
+
return (0, react.useMemo)(() => ({
|
|
154
|
+
...handlers,
|
|
155
|
+
containerRef
|
|
156
|
+
}), [handlers]);
|
|
157
|
+
}
|
|
158
|
+
return {
|
|
159
|
+
useEmbed,
|
|
160
|
+
Embed: (0, react.memo)(function WidgetEmbed(props) {
|
|
161
|
+
const { className, style, ref, ...embedProps } = props;
|
|
162
|
+
const { containerRef, focus, refresh } = useEmbed(embedProps);
|
|
163
|
+
(0, react.useImperativeHandle)(ref, () => ({
|
|
164
|
+
focus,
|
|
165
|
+
refresh
|
|
166
|
+
}), [focus, refresh]);
|
|
167
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
168
|
+
ref: containerRef,
|
|
169
|
+
className,
|
|
170
|
+
style
|
|
171
|
+
});
|
|
172
|
+
})
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
//#endregion
|
|
176
|
+
//#region src/bindings/dialog/build-stable-deps.ts
|
|
6
177
|
function buildStableDeps$3(props) {
|
|
7
178
|
return [
|
|
8
179
|
props.tenant,
|
|
@@ -14,28 +185,21 @@ function buildStableDeps$3(props) {
|
|
|
14
185
|
];
|
|
15
186
|
}
|
|
16
187
|
//#endregion
|
|
17
|
-
//#region src/
|
|
18
|
-
var
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
open: () => void instanceRef.current?.open(),
|
|
22
|
-
close: () => void instanceRef.current?.close(),
|
|
23
|
-
toggle: () => void instanceRef.current?.toggle(),
|
|
24
|
-
refresh: () => void instanceRef.current?.refresh(),
|
|
25
|
-
focus: () => void instanceRef.current?.focus()
|
|
26
|
-
}), []);
|
|
27
|
-
(0, react.useEffect)(() => {
|
|
28
|
-
const instance = (0, _revvue_embed.createDialog)(props);
|
|
29
|
-
instanceRef.current = instance;
|
|
30
|
-
return () => {
|
|
31
|
-
instance.unmount();
|
|
32
|
-
instanceRef.current = null;
|
|
33
|
-
};
|
|
34
|
-
}, [...buildStableDeps$3(props)]);
|
|
35
|
-
return null;
|
|
188
|
+
//#region src/bindings/dialog/dialog.ts
|
|
189
|
+
var bindings$3 = createFloatingBindings({
|
|
190
|
+
factory: (props) => (0, _revvue_embed.createDialog)(props),
|
|
191
|
+
buildStableDeps: buildStableDeps$3
|
|
36
192
|
});
|
|
193
|
+
var useDialog = bindings$3.useEmbed;
|
|
194
|
+
var Dialog = bindings$3.Embed;
|
|
37
195
|
//#endregion
|
|
38
|
-
//#region src/
|
|
196
|
+
//#region src/bindings/drawer/build-stable-deps.ts
|
|
197
|
+
/**
|
|
198
|
+
* Identity props — when any of these change between renders the embed instance
|
|
199
|
+
* is torn down and re-created. Keep this in lockstep with the props the
|
|
200
|
+
* underlying `createDrawer` actually consumes; cosmetic React-only props
|
|
201
|
+
* (className/style) must not appear here.
|
|
202
|
+
*/
|
|
39
203
|
function buildStableDeps$2(props) {
|
|
40
204
|
return [
|
|
41
205
|
props.tenant,
|
|
@@ -43,39 +207,44 @@ function buildStableDeps$2(props) {
|
|
|
43
207
|
props.app,
|
|
44
208
|
props.formId,
|
|
45
209
|
props.width,
|
|
46
|
-
props.height
|
|
47
|
-
props.label,
|
|
48
|
-
props.icon,
|
|
49
|
-
props.position,
|
|
50
|
-
props.color,
|
|
51
|
-
props.textColor,
|
|
52
|
-
props.autoOpen,
|
|
53
|
-
props.autoOpenDelay
|
|
210
|
+
props.height
|
|
54
211
|
];
|
|
55
212
|
}
|
|
56
213
|
//#endregion
|
|
57
|
-
//#region src/
|
|
58
|
-
var
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
open: () => void instanceRef.current?.open(),
|
|
62
|
-
close: () => void instanceRef.current?.close(),
|
|
63
|
-
toggle: () => void instanceRef.current?.toggle(),
|
|
64
|
-
refresh: () => void instanceRef.current?.refresh(),
|
|
65
|
-
focus: () => void instanceRef.current?.focus()
|
|
66
|
-
}), []);
|
|
67
|
-
(0, react.useEffect)(() => {
|
|
68
|
-
const instance = (0, _revvue_embed.createDrawer)(props);
|
|
69
|
-
instanceRef.current = instance;
|
|
70
|
-
return () => {
|
|
71
|
-
instance.unmount();
|
|
72
|
-
instanceRef.current = null;
|
|
73
|
-
};
|
|
74
|
-
}, [...buildStableDeps$2(props)]);
|
|
75
|
-
return null;
|
|
214
|
+
//#region src/bindings/drawer/drawer.ts
|
|
215
|
+
var bindings$2 = createFloatingBindings({
|
|
216
|
+
factory: (props) => (0, _revvue_embed.createDrawer)(props),
|
|
217
|
+
buildStableDeps: buildStableDeps$2
|
|
76
218
|
});
|
|
219
|
+
/**
|
|
220
|
+
* Hook form. Use when you want full control over the trigger element.
|
|
221
|
+
*
|
|
222
|
+
* @example
|
|
223
|
+
* ```tsx
|
|
224
|
+
* const drawer = useDrawer({ tenant, app: "chat", type: "drawer" });
|
|
225
|
+
* return <button {...drawer.getTriggerProps()}>Chat</button>;
|
|
226
|
+
* ```
|
|
227
|
+
*/
|
|
228
|
+
var useDrawer = bindings$2.useEmbed;
|
|
229
|
+
/**
|
|
230
|
+
* Component form. Renders a `<button>` trigger that opens the drawer.
|
|
231
|
+
* Use `asChild` to delegate to your own button component (Radix-style).
|
|
232
|
+
*
|
|
233
|
+
* @example
|
|
234
|
+
* ```tsx
|
|
235
|
+
* <Drawer tenant={tenant} app="chat" type="drawer">Chat</Drawer>
|
|
236
|
+
* ```
|
|
237
|
+
*/
|
|
238
|
+
var Drawer = bindings$2.Embed;
|
|
77
239
|
//#endregion
|
|
78
|
-
//#region src/
|
|
240
|
+
//#region src/bindings/popover/build-stable-deps.ts
|
|
241
|
+
/**
|
|
242
|
+
* Popover stable deps intentionally exclude button-styling props
|
|
243
|
+
* (label/icon/color/textColor/position) — those are not consumed by the
|
|
244
|
+
* embed factory in headless mode (`trigger: 'none'`); the React component
|
|
245
|
+
* renders its own trigger element. autoOpen/autoOpenDelay still affect the
|
|
246
|
+
* panel and are tracked.
|
|
247
|
+
*/
|
|
79
248
|
function buildStableDeps$1(props) {
|
|
80
249
|
return [
|
|
81
250
|
props.tenant,
|
|
@@ -84,54 +253,41 @@ function buildStableDeps$1(props) {
|
|
|
84
253
|
props.formId,
|
|
85
254
|
props.width,
|
|
86
255
|
props.height,
|
|
87
|
-
props.label,
|
|
88
|
-
props.icon,
|
|
89
|
-
props.position,
|
|
90
|
-
props.color,
|
|
91
|
-
props.textColor,
|
|
92
256
|
props.autoOpen,
|
|
93
257
|
props.autoOpenDelay
|
|
94
258
|
];
|
|
95
259
|
}
|
|
96
260
|
//#endregion
|
|
97
|
-
//#region src/
|
|
261
|
+
//#region src/bindings/popover/popover.ts
|
|
262
|
+
var bindings$1 = createFloatingBindings({
|
|
263
|
+
factory: (props) => (0, _revvue_embed.createPopover)({
|
|
264
|
+
...props,
|
|
265
|
+
trigger: "none"
|
|
266
|
+
}),
|
|
267
|
+
buildStableDeps: buildStableDeps$1
|
|
268
|
+
});
|
|
98
269
|
/**
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
* The component manages no DOM of its own — it delegates entirely to the
|
|
102
|
-
* `createPopover` factory, which appends the button and panel to `document.body`.
|
|
103
|
-
* Use the forwarded ref to imperatively open, close, or toggle the popover.
|
|
270
|
+
* Hook form. Use when you want to render your own trigger element.
|
|
104
271
|
*
|
|
105
272
|
* @example
|
|
106
273
|
* ```tsx
|
|
107
|
-
* const
|
|
108
|
-
*
|
|
109
|
-
*
|
|
274
|
+
* const popover = usePopover({ tenant, app: "chat", type: "popover" });
|
|
275
|
+
* return <button {...popover.getTriggerProps()}>Chat</button>;
|
|
276
|
+
* ```
|
|
277
|
+
*/
|
|
278
|
+
var usePopover = bindings$1.useEmbed;
|
|
279
|
+
/**
|
|
280
|
+
* Component form. Renders a `<button>` trigger that toggles the popover.
|
|
281
|
+
* Use `asChild` to delegate to your own button (Radix-style).
|
|
110
282
|
*
|
|
111
|
-
*
|
|
283
|
+
* @example
|
|
284
|
+
* ```tsx
|
|
285
|
+
* <Popover tenant={tenant} app="chat" type="popover">Chat</Popover>
|
|
112
286
|
* ```
|
|
113
287
|
*/
|
|
114
|
-
var Popover =
|
|
115
|
-
const instanceRef = (0, react.useRef)(null);
|
|
116
|
-
(0, react.useImperativeHandle)(ref, () => ({
|
|
117
|
-
open: () => void instanceRef.current?.open(),
|
|
118
|
-
close: () => void instanceRef.current?.close(),
|
|
119
|
-
toggle: () => void instanceRef.current?.toggle(),
|
|
120
|
-
refresh: () => void instanceRef.current?.refresh(),
|
|
121
|
-
focus: () => void instanceRef.current?.focus()
|
|
122
|
-
}), []);
|
|
123
|
-
(0, react.useEffect)(() => {
|
|
124
|
-
const instance = (0, _revvue_embed.createPopover)(props);
|
|
125
|
-
instanceRef.current = instance;
|
|
126
|
-
return () => {
|
|
127
|
-
instance.unmount();
|
|
128
|
-
instanceRef.current = null;
|
|
129
|
-
};
|
|
130
|
-
}, [...buildStableDeps$1(props)]);
|
|
131
|
-
return null;
|
|
132
|
-
});
|
|
288
|
+
var Popover = bindings$1.Embed;
|
|
133
289
|
//#endregion
|
|
134
|
-
//#region src/
|
|
290
|
+
//#region src/bindings/widget/build-stable-deps.ts
|
|
135
291
|
function buildStableDeps(props) {
|
|
136
292
|
return [
|
|
137
293
|
props.tenant,
|
|
@@ -143,31 +299,38 @@ function buildStableDeps(props) {
|
|
|
143
299
|
];
|
|
144
300
|
}
|
|
145
301
|
//#endregion
|
|
146
|
-
//#region src/
|
|
147
|
-
var
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
(0, react.useImperativeHandle)(ref, () => ({
|
|
151
|
-
refresh: () => void instanceRef.current?.refresh(),
|
|
152
|
-
focus: () => void instanceRef.current?.focus()
|
|
153
|
-
}), []);
|
|
154
|
-
(0, react.useEffect)(() => {
|
|
155
|
-
if (!containerRef.current) return;
|
|
156
|
-
const instance = (0, _revvue_embed.createWidget)(props, containerRef.current);
|
|
157
|
-
instanceRef.current = instance;
|
|
158
|
-
return () => {
|
|
159
|
-
instance.unmount();
|
|
160
|
-
instanceRef.current = null;
|
|
161
|
-
};
|
|
162
|
-
}, [...buildStableDeps(props)]);
|
|
163
|
-
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
164
|
-
ref: containerRef,
|
|
165
|
-
className,
|
|
166
|
-
style
|
|
167
|
-
});
|
|
302
|
+
//#region src/bindings/widget/widget.ts
|
|
303
|
+
var bindings = createWidgetBindings({
|
|
304
|
+
factory: (props, element) => (0, _revvue_embed.createWidget)(props, element),
|
|
305
|
+
buildStableDeps
|
|
168
306
|
});
|
|
307
|
+
/**
|
|
308
|
+
* Hook form. Returns a `containerRef` you must attach to a host element
|
|
309
|
+
* (typically a `<div>`) plus the imperative API.
|
|
310
|
+
*
|
|
311
|
+
* @example
|
|
312
|
+
* ```tsx
|
|
313
|
+
* const widget = useWidget({ tenant, app: "chat", type: "widget" });
|
|
314
|
+
* return <div ref={widget.containerRef} className="my-host" />;
|
|
315
|
+
* ```
|
|
316
|
+
*/
|
|
317
|
+
var useWidget = bindings.useEmbed;
|
|
318
|
+
/**
|
|
319
|
+
* Component form. Renders the host `<div>` for you and accepts `className`
|
|
320
|
+
* and `style` for layout.
|
|
321
|
+
*
|
|
322
|
+
* @example
|
|
323
|
+
* ```tsx
|
|
324
|
+
* <Widget tenant={tenant} app="chat" type="widget" className="h-full w-full" />
|
|
325
|
+
* ```
|
|
326
|
+
*/
|
|
327
|
+
var Widget = bindings.Embed;
|
|
169
328
|
//#endregion
|
|
170
329
|
exports.Dialog = Dialog;
|
|
171
330
|
exports.Drawer = Drawer;
|
|
172
331
|
exports.Popover = Popover;
|
|
173
332
|
exports.Widget = Widget;
|
|
333
|
+
exports.useDialog = useDialog;
|
|
334
|
+
exports.useDrawer = useDrawer;
|
|
335
|
+
exports.usePopover = usePopover;
|
|
336
|
+
exports.useWidget = useWidget;
|