@revvue/embed-react 0.0.0-beta.3 → 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.
Files changed (62) hide show
  1. package/dist/css/dialog.css +1 -1
  2. package/dist/css/drawer.css +1 -1
  3. package/dist/css/popover.css +1 -1
  4. package/dist/package.cjs +268 -106
  5. package/dist/package.mjs +266 -108
  6. package/dist/types/bindings/dialog/build-stable-deps.d.ts +5 -0
  7. package/dist/types/bindings/dialog/build-stable-deps.d.ts.map +1 -0
  8. package/dist/types/bindings/dialog/dialog.d.ts +5 -0
  9. package/dist/types/bindings/dialog/dialog.d.ts.map +1 -0
  10. package/dist/types/bindings/dialog/index.d.ts.map +1 -0
  11. package/dist/types/bindings/drawer/build-stable-deps.d.ts +11 -0
  12. package/dist/types/bindings/drawer/build-stable-deps.d.ts.map +1 -0
  13. package/dist/types/bindings/drawer/drawer.d.ts +24 -0
  14. package/dist/types/bindings/drawer/drawer.d.ts.map +1 -0
  15. package/dist/types/bindings/drawer/index.d.ts.map +1 -0
  16. package/dist/types/bindings/index.d.ts.map +1 -0
  17. package/dist/types/bindings/popover/build-stable-deps.d.ts +10 -0
  18. package/dist/types/bindings/popover/build-stable-deps.d.ts.map +1 -0
  19. package/dist/types/bindings/popover/index.d.ts.map +1 -0
  20. package/dist/types/bindings/popover/popover.d.ts +42 -0
  21. package/dist/types/bindings/popover/popover.d.ts.map +1 -0
  22. package/dist/types/bindings/widget/build-stable-deps.d.ts.map +1 -0
  23. package/dist/types/bindings/widget/index.d.ts.map +1 -0
  24. package/dist/types/bindings/widget/widget.d.ts +24 -0
  25. package/dist/types/bindings/widget/widget.d.ts.map +1 -0
  26. package/dist/types/index.d.ts +2 -1
  27. package/dist/types/index.d.ts.map +1 -1
  28. package/dist/types/internal/create-floating-bindings.d.ts +60 -0
  29. package/dist/types/internal/create-floating-bindings.d.ts.map +1 -0
  30. package/dist/types/internal/create-widget-bindings.d.ts +32 -0
  31. package/dist/types/internal/create-widget-bindings.d.ts.map +1 -0
  32. package/dist/types/internal/index.d.ts +4 -0
  33. package/dist/types/internal/index.d.ts.map +1 -0
  34. package/dist/types/internal/slot.d.ts +31 -0
  35. package/dist/types/internal/slot.d.ts.map +1 -0
  36. package/package.json +2 -2
  37. package/dist/types/components/dialog/build-stable-deps.d.ts +0 -3
  38. package/dist/types/components/dialog/build-stable-deps.d.ts.map +0 -1
  39. package/dist/types/components/dialog/dialog.d.ts +0 -6
  40. package/dist/types/components/dialog/dialog.d.ts.map +0 -1
  41. package/dist/types/components/dialog/index.d.ts.map +0 -1
  42. package/dist/types/components/drawer/build-stable-deps.d.ts +0 -3
  43. package/dist/types/components/drawer/build-stable-deps.d.ts.map +0 -1
  44. package/dist/types/components/drawer/drawer.d.ts +0 -6
  45. package/dist/types/components/drawer/drawer.d.ts.map +0 -1
  46. package/dist/types/components/drawer/index.d.ts.map +0 -1
  47. package/dist/types/components/index.d.ts.map +0 -1
  48. package/dist/types/components/popover/build-stable-deps.d.ts +0 -3
  49. package/dist/types/components/popover/build-stable-deps.d.ts.map +0 -1
  50. package/dist/types/components/popover/index.d.ts.map +0 -1
  51. package/dist/types/components/popover/popover.d.ts +0 -29
  52. package/dist/types/components/popover/popover.d.ts.map +0 -1
  53. package/dist/types/components/widget/build-stable-deps.d.ts.map +0 -1
  54. package/dist/types/components/widget/index.d.ts.map +0 -1
  55. package/dist/types/components/widget/widget.d.ts +0 -11
  56. package/dist/types/components/widget/widget.d.ts.map +0 -1
  57. /package/dist/types/{components → bindings}/dialog/index.d.ts +0 -0
  58. /package/dist/types/{components → bindings}/drawer/index.d.ts +0 -0
  59. /package/dist/types/{components → bindings}/index.d.ts +0 -0
  60. /package/dist/types/{components → bindings}/popover/index.d.ts +0 -0
  61. /package/dist/types/{components → bindings}/widget/build-stable-deps.d.ts +0 -0
  62. /package/dist/types/{components → bindings}/widget/index.d.ts +0 -0
@@ -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;z-index:var(--rvv-z-index);-webkit-tap-highlight-color:transparent;justify-content:center;align-items:center;gap:8px;font-family:inherit;line-height:1;display:inline-flex;position:fixed}.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;bottom:24px}.rvv-button--trigger[data-position=right]{right:24px}.rvv-button--trigger[data-position=left]{left:24px}.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: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{bottom:16px}.rvv-button[data-position=right]{right:16px}.rvv-button[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}}
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}}
@@ -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;z-index:var(--rvv-z-index);-webkit-tap-highlight-color:transparent;justify-content:center;align-items:center;gap:8px;font-family:inherit;line-height:1;display:inline-flex;position:fixed}.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;bottom:24px}.rvv-button--trigger[data-position=right]{right:24px}.rvv-button--trigger[data-position=left]{left:24px}.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: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{bottom:16px}.rvv-button[data-position=right]{right:16px}.rvv-button[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}}
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}}
@@ -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;z-index:var(--rvv-z-index);-webkit-tap-highlight-color:transparent;justify-content:center;align-items:center;gap:8px;font-family:inherit;line-height:1;display:inline-flex;position:fixed}.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;bottom:24px}.rvv-button--trigger[data-position=right]{right:24px}.rvv-button--trigger[data-position=left]{left:24px}.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: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{bottom:16px}.rvv-button[data-position=right]{right:16px}.rvv-button[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}}
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
@@ -3,7 +3,177 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  let _revvue_embed = require("@revvue/embed");
4
4
  let react = require("react");
5
5
  let react_jsx_runtime = require("react/jsx-runtime");
6
- //#region src/components/dialog/build-stable-deps.ts
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
7
177
  function buildStableDeps$3(props) {
8
178
  return [
9
179
  props.tenant,
@@ -15,28 +185,21 @@ function buildStableDeps$3(props) {
15
185
  ];
16
186
  }
17
187
  //#endregion
18
- //#region src/components/dialog/dialog.tsx
19
- var Dialog = (0, react.forwardRef)(function Dialog(props, ref) {
20
- const instanceRef = (0, react.useRef)(null);
21
- (0, react.useImperativeHandle)(ref, () => ({
22
- open: () => void instanceRef.current?.open(),
23
- close: () => void instanceRef.current?.close(),
24
- toggle: () => void instanceRef.current?.toggle(),
25
- refresh: () => void instanceRef.current?.refresh(),
26
- focus: () => void instanceRef.current?.focus()
27
- }), []);
28
- (0, react.useEffect)(() => {
29
- const instance = (0, _revvue_embed.createDialog)(props);
30
- instanceRef.current = instance;
31
- return () => {
32
- instance.unmount();
33
- instanceRef.current = null;
34
- };
35
- }, [...buildStableDeps$3(props)]);
36
- 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
37
192
  });
193
+ var useDialog = bindings$3.useEmbed;
194
+ var Dialog = bindings$3.Embed;
38
195
  //#endregion
39
- //#region src/components/drawer/build-stable-deps.ts
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
+ */
40
203
  function buildStableDeps$2(props) {
41
204
  return [
42
205
  props.tenant,
@@ -44,39 +207,44 @@ function buildStableDeps$2(props) {
44
207
  props.app,
45
208
  props.formId,
46
209
  props.width,
47
- props.height,
48
- props.label,
49
- props.icon,
50
- props.position,
51
- props.color,
52
- props.textColor,
53
- props.autoOpen,
54
- props.autoOpenDelay
210
+ props.height
55
211
  ];
56
212
  }
57
213
  //#endregion
58
- //#region src/components/drawer/drawer.tsx
59
- var Drawer = (0, react.forwardRef)(function Drawer(props, ref) {
60
- const instanceRef = (0, react.useRef)(null);
61
- (0, react.useImperativeHandle)(ref, () => ({
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
- (0, react.useEffect)(() => {
69
- const instance = (0, _revvue_embed.createDrawer)(props);
70
- instanceRef.current = instance;
71
- return () => {
72
- instance.unmount();
73
- instanceRef.current = null;
74
- };
75
- }, [...buildStableDeps$2(props)]);
76
- 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
77
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;
78
239
  //#endregion
79
- //#region src/components/popover/build-stable-deps.ts
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
+ */
80
248
  function buildStableDeps$1(props) {
81
249
  return [
82
250
  props.tenant,
@@ -85,54 +253,41 @@ function buildStableDeps$1(props) {
85
253
  props.formId,
86
254
  props.width,
87
255
  props.height,
88
- props.label,
89
- props.icon,
90
- props.position,
91
- props.color,
92
- props.textColor,
93
256
  props.autoOpen,
94
257
  props.autoOpenDelay
95
258
  ];
96
259
  }
97
260
  //#endregion
98
- //#region src/components/popover/popover.tsx
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
+ });
99
269
  /**
100
- * Renders an embedded Revvue form/chat as a floating popover button.
101
- *
102
- * The component manages no DOM of its own — it delegates entirely to the
103
- * `createPopover` factory, which appends the button and panel to `document.body`.
104
- * 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.
105
271
  *
106
272
  * @example
107
273
  * ```tsx
108
- * const ref = useRef<PopoverRef>(null)
109
- *
110
- * <Popover ref={ref} tenant="acme" app="chat" type="popover" label="Chat with us" />
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).
111
282
  *
112
- * <button onClick={() => ref.current?.open()}>Open popover</button>
283
+ * @example
284
+ * ```tsx
285
+ * <Popover tenant={tenant} app="chat" type="popover">Chat</Popover>
113
286
  * ```
114
287
  */
115
- var Popover = (0, react.forwardRef)(function Popover(props, ref) {
116
- const instanceRef = (0, react.useRef)(null);
117
- (0, react.useImperativeHandle)(ref, () => ({
118
- open: () => void instanceRef.current?.open(),
119
- close: () => void instanceRef.current?.close(),
120
- toggle: () => void instanceRef.current?.toggle(),
121
- refresh: () => void instanceRef.current?.refresh(),
122
- focus: () => void instanceRef.current?.focus()
123
- }), []);
124
- (0, react.useEffect)(() => {
125
- const instance = (0, _revvue_embed.createPopover)(props);
126
- instanceRef.current = instance;
127
- return () => {
128
- instance.unmount();
129
- instanceRef.current = null;
130
- };
131
- }, [...buildStableDeps$1(props)]);
132
- return null;
133
- });
288
+ var Popover = bindings$1.Embed;
134
289
  //#endregion
135
- //#region src/components/widget/build-stable-deps.ts
290
+ //#region src/bindings/widget/build-stable-deps.ts
136
291
  function buildStableDeps(props) {
137
292
  return [
138
293
  props.tenant,
@@ -144,31 +299,38 @@ function buildStableDeps(props) {
144
299
  ];
145
300
  }
146
301
  //#endregion
147
- //#region src/components/widget/widget.tsx
148
- var Widget = (0, react.forwardRef)(function Widget({ className, style, ...props }, ref) {
149
- const containerRef = (0, react.useRef)(null);
150
- const instanceRef = (0, react.useRef)(null);
151
- (0, react.useImperativeHandle)(ref, () => ({
152
- refresh: () => void instanceRef.current?.refresh(),
153
- focus: () => void instanceRef.current?.focus()
154
- }), []);
155
- (0, react.useEffect)(() => {
156
- if (!containerRef.current) return;
157
- const instance = (0, _revvue_embed.createWidget)(props, containerRef.current);
158
- instanceRef.current = instance;
159
- return () => {
160
- instance.unmount();
161
- instanceRef.current = null;
162
- };
163
- }, [...buildStableDeps(props)]);
164
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
165
- ref: containerRef,
166
- className,
167
- style
168
- });
302
+ //#region src/bindings/widget/widget.ts
303
+ var bindings = createWidgetBindings({
304
+ factory: (props, element) => (0, _revvue_embed.createWidget)(props, element),
305
+ buildStableDeps
169
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;
170
328
  //#endregion
171
329
  exports.Dialog = Dialog;
172
330
  exports.Drawer = Drawer;
173
331
  exports.Popover = Popover;
174
332
  exports.Widget = Widget;
333
+ exports.useDialog = useDialog;
334
+ exports.useDrawer = useDrawer;
335
+ exports.usePopover = usePopover;
336
+ exports.useWidget = useWidget;