@signalwire/web-components 4.0.0-beta.8 → 4.0.0-dev-20260515133934
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/README.md +48 -55
- package/dist/_virtual/_commonjsHelpers.js +9 -0
- package/dist/_virtual/_commonjsHelpers.js.map +1 -0
- package/dist/_virtual/prism-python.js +28 -0
- package/dist/_virtual/prism-python.js.map +1 -0
- package/dist/_virtual/prism-python2.js +5 -0
- package/dist/_virtual/prism-python2.js.map +1 -0
- package/dist/_virtual/prism-typescript.js +28 -0
- package/dist/_virtual/prism-typescript.js.map +1 -0
- package/dist/_virtual/prism-typescript2.js +5 -0
- package/dist/_virtual/prism-typescript2.js.map +1 -0
- package/dist/_virtual/prism.js +28 -0
- package/dist/_virtual/prism.js.map +1 -0
- package/dist/_virtual/prism2.js +5 -0
- package/dist/_virtual/prism2.js.map +1 -0
- package/dist/assets/sw_background.webp.js +5 -0
- package/dist/assets/sw_background.webp.js.map +1 -0
- package/dist/components/UI/DEFAULT_BACKGROUND.d.ts +4 -0
- package/dist/components/UI/DEFAULT_BACKGROUND.d.ts.map +1 -0
- package/dist/components/UI/DEFAULT_BACKGROUND.js +5 -0
- package/dist/components/UI/DEFAULT_BACKGROUND.js.map +1 -0
- package/dist/components/UI/controls/sw-ui-control-bar.d.ts +114 -0
- package/dist/components/UI/controls/sw-ui-control-bar.d.ts.map +1 -0
- package/dist/components/UI/controls/sw-ui-control-bar.js +324 -0
- package/dist/components/UI/controls/sw-ui-control-bar.js.map +1 -0
- package/dist/components/UI/controls/sw-ui-dialpad.d.ts +67 -0
- package/dist/components/UI/controls/sw-ui-dialpad.d.ts.map +1 -0
- package/dist/components/UI/controls/sw-ui-dialpad.js +360 -0
- package/dist/components/UI/controls/sw-ui-dialpad.js.map +1 -0
- package/dist/components/UI/controls/sw-ui-dropup.d.ts +42 -0
- package/dist/components/UI/controls/sw-ui-dropup.d.ts.map +1 -0
- package/dist/components/UI/controls/sw-ui-dropup.js +138 -0
- package/dist/components/UI/controls/sw-ui-dropup.js.map +1 -0
- package/dist/components/UI/controls/sw-ui-split-button.d.ts +44 -0
- package/dist/components/UI/controls/sw-ui-split-button.d.ts.map +1 -0
- package/dist/components/UI/controls/sw-ui-split-button.js +178 -0
- package/dist/components/UI/controls/sw-ui-split-button.js.map +1 -0
- package/dist/components/UI/host-reset.d.ts +16 -0
- package/dist/components/UI/host-reset.d.ts.map +1 -0
- package/dist/components/UI/host-reset.js +20 -0
- package/dist/components/UI/host-reset.js.map +1 -0
- package/dist/components/UI/icons/backspace.svg.js +10 -0
- package/dist/components/UI/icons/backspace.svg.js.map +1 -0
- package/dist/components/UI/icons/camera-off.svg.js +8 -0
- package/dist/components/UI/icons/camera-off.svg.js.map +1 -0
- package/dist/components/UI/icons/camera-on.svg.js +8 -0
- package/dist/components/UI/icons/camera-on.svg.js.map +1 -0
- package/dist/components/UI/icons/check-circle.svg.js +6 -0
- package/dist/components/UI/icons/check-circle.svg.js.map +1 -0
- package/dist/components/UI/icons/chevron-up.svg.js +8 -0
- package/dist/components/UI/icons/chevron-up.svg.js.map +1 -0
- package/dist/components/UI/icons/close.svg.js +6 -0
- package/dist/components/UI/icons/close.svg.js.map +1 -0
- package/dist/components/UI/icons/copy.svg.js +6 -0
- package/dist/components/UI/icons/copy.svg.js.map +1 -0
- package/dist/components/UI/icons/download.svg.js +6 -0
- package/dist/components/UI/icons/download.svg.js.map +1 -0
- package/dist/components/UI/icons/fullscreen-exit.svg.js +8 -0
- package/dist/components/UI/icons/fullscreen-exit.svg.js.map +1 -0
- package/dist/components/UI/icons/fullscreen.svg.js +8 -0
- package/dist/components/UI/icons/fullscreen.svg.js.map +1 -0
- package/dist/components/UI/icons/hand-raise.svg.js +6 -0
- package/dist/components/UI/icons/hand-raise.svg.js.map +1 -0
- package/dist/components/UI/icons/icons.d.ts +31 -0
- package/dist/components/UI/icons/icons.d.ts.map +1 -0
- package/dist/components/UI/icons/icons.js +60 -0
- package/dist/components/UI/icons/icons.js.map +1 -0
- package/dist/components/UI/icons/index.d.ts +4 -0
- package/dist/components/UI/icons/index.d.ts.map +1 -0
- package/dist/components/UI/icons/info-circle.svg.js +6 -0
- package/dist/components/UI/icons/info-circle.svg.js.map +1 -0
- package/dist/components/UI/icons/mic-off.svg.js +8 -0
- package/dist/components/UI/icons/mic-off.svg.js.map +1 -0
- package/dist/components/UI/icons/mic-on.svg.js +8 -0
- package/dist/components/UI/icons/mic-on.svg.js.map +1 -0
- package/dist/components/UI/icons/person.svg.js +8 -0
- package/dist/components/UI/icons/person.svg.js.map +1 -0
- package/dist/components/UI/icons/phone-call.svg.js +8 -0
- package/dist/components/UI/icons/phone-call.svg.js.map +1 -0
- package/dist/components/UI/icons/phone-end.svg.js +8 -0
- package/dist/components/UI/icons/phone-end.svg.js.map +1 -0
- package/dist/components/UI/icons/room.svg.js +8 -0
- package/dist/components/UI/icons/room.svg.js.map +1 -0
- package/dist/components/UI/icons/screen-share-off.svg.js +9 -0
- package/dist/components/UI/icons/screen-share-off.svg.js.map +1 -0
- package/dist/components/UI/icons/screen-share.svg.js +9 -0
- package/dist/components/UI/icons/screen-share.svg.js.map +1 -0
- package/dist/components/UI/icons/sendIcon.svg.js +9 -0
- package/dist/components/UI/icons/sendIcon.svg.js.map +1 -0
- package/dist/components/UI/icons/settings.svg.js +8 -0
- package/dist/components/UI/icons/settings.svg.js.map +1 -0
- package/dist/components/UI/icons/speaker-off.svg.js +8 -0
- package/dist/components/UI/icons/speaker-off.svg.js.map +1 -0
- package/dist/components/UI/icons/speaker-on.svg.js +8 -0
- package/dist/components/UI/icons/speaker-on.svg.js.map +1 -0
- package/dist/components/UI/icons/spinner.svg.js +9 -0
- package/dist/components/UI/icons/spinner.svg.js.map +1 -0
- package/dist/components/UI/icons/sw-logo.svg.js +11 -0
- package/dist/components/UI/icons/sw-logo.svg.js.map +1 -0
- package/dist/components/UI/icons/sw-ui-icon.d.ts +28 -0
- package/dist/components/UI/icons/sw-ui-icon.d.ts.map +1 -0
- package/dist/components/UI/icons/sw-ui-icon.js +47 -0
- package/dist/components/UI/icons/sw-ui-icon.js.map +1 -0
- package/dist/components/UI/icons/transcript.svg.js +10 -0
- package/dist/components/UI/icons/transcript.svg.js.map +1 -0
- package/dist/components/UI/index.d.ts +18 -0
- package/dist/components/UI/index.d.ts.map +1 -0
- package/dist/components/UI/layout/sw-ui-background.d.ts +33 -0
- package/dist/components/UI/layout/sw-ui-background.d.ts.map +1 -0
- package/dist/components/UI/layout/sw-ui-background.js +106 -0
- package/dist/components/UI/layout/sw-ui-background.js.map +1 -0
- package/dist/components/UI/layout/sw-ui-call-layout.d.ts +69 -0
- package/dist/components/UI/layout/sw-ui-call-layout.d.ts.map +1 -0
- package/dist/components/UI/layout/sw-ui-call-layout.js +278 -0
- package/dist/components/UI/layout/sw-ui-call-layout.js.map +1 -0
- package/dist/components/UI/layout/sw-ui-content-drawer.d.ts +50 -0
- package/dist/components/UI/layout/sw-ui-content-drawer.d.ts.map +1 -0
- package/dist/components/UI/layout/sw-ui-content-drawer.js +413 -0
- package/dist/components/UI/layout/sw-ui-content-drawer.js.map +1 -0
- package/dist/components/UI/layout/sw-ui-modal.d.ts +31 -0
- package/dist/components/UI/layout/sw-ui-modal.d.ts.map +1 -0
- package/dist/components/UI/layout/sw-ui-modal.js +150 -0
- package/dist/components/UI/layout/sw-ui-modal.js.map +1 -0
- package/dist/components/UI/layout/sw-ui-responsive-container.d.ts +15 -0
- package/dist/components/UI/layout/sw-ui-responsive-container.d.ts.map +1 -0
- package/dist/components/UI/layout/sw-ui-responsive-container.js +78 -0
- package/dist/components/UI/layout/sw-ui-responsive-container.js.map +1 -0
- package/dist/components/UI/sw-ui-alert.d.ts +37 -0
- package/dist/components/UI/sw-ui-alert.d.ts.map +1 -0
- package/dist/components/UI/sw-ui-alert.js +127 -0
- package/dist/components/UI/sw-ui-alert.js.map +1 -0
- package/dist/components/UI/sw-ui-transcript-view.d.ts +56 -0
- package/dist/components/UI/sw-ui-transcript-view.d.ts.map +1 -0
- package/dist/components/UI/sw-ui-transcript-view.js +342 -0
- package/dist/components/UI/sw-ui-transcript-view.js.map +1 -0
- package/dist/components/{audio-level.d.ts → sw-audio-level.d.ts} +44 -4
- package/dist/components/sw-audio-level.d.ts.map +1 -0
- package/dist/components/sw-audio-level.js +252 -0
- package/dist/components/sw-audio-level.js.map +1 -0
- package/dist/components/sw-call-controls.d.ts +58 -0
- package/dist/components/sw-call-controls.d.ts.map +1 -0
- package/dist/components/sw-call-controls.js +186 -0
- package/dist/components/sw-call-controls.js.map +1 -0
- package/dist/components/sw-call-dialpad.d.ts +52 -0
- package/dist/components/sw-call-dialpad.d.ts.map +1 -0
- package/dist/components/sw-call-dialpad.js +70 -0
- package/dist/components/sw-call-dialpad.js.map +1 -0
- package/dist/components/sw-call-media.d.ts +59 -0
- package/dist/components/sw-call-media.d.ts.map +1 -0
- package/dist/components/sw-call-media.js +178 -0
- package/dist/components/sw-call-media.js.map +1 -0
- package/dist/components/sw-call-provider.d.ts +41 -0
- package/dist/components/sw-call-provider.d.ts.map +1 -0
- package/dist/components/sw-call-provider.js +37 -0
- package/dist/components/sw-call-provider.js.map +1 -0
- package/dist/components/sw-call-status.d.ts +50 -0
- package/dist/components/sw-call-status.d.ts.map +1 -0
- package/dist/components/sw-call-status.js +204 -0
- package/dist/components/sw-call-status.js.map +1 -0
- package/dist/components/sw-call-widget/client-factory.d.ts +6 -0
- package/dist/components/sw-call-widget/client-factory.d.ts.map +1 -0
- package/dist/components/sw-call-widget/client-factory.js +25 -0
- package/dist/components/sw-call-widget/client-factory.js.map +1 -0
- package/dist/components/sw-call-widget/sw-call-widget.d.ts +110 -0
- package/dist/components/sw-call-widget/sw-call-widget.d.ts.map +1 -0
- package/dist/components/sw-call-widget/sw-call-widget.js +251 -0
- package/dist/components/sw-call-widget/sw-call-widget.js.map +1 -0
- package/dist/components/sw-call-widget/sw-call-widget.templates.d.ts +17 -0
- package/dist/components/sw-call-widget/sw-call-widget.templates.d.ts.map +1 -0
- package/dist/components/sw-call-widget/sw-call-widget.templates.js +80 -0
- package/dist/components/sw-call-widget/sw-call-widget.templates.js.map +1 -0
- package/dist/components/sw-click-to-call.d.ts +39 -0
- package/dist/components/sw-click-to-call.d.ts.map +1 -0
- package/dist/components/sw-click-to-call.js +88 -0
- package/dist/components/sw-click-to-call.js.map +1 -0
- package/dist/components/sw-device-selector/index.d.ts +2 -0
- package/dist/components/sw-device-selector/index.d.ts.map +1 -0
- package/dist/components/sw-device-selector/sw-device-selector.d.ts +69 -0
- package/dist/components/sw-device-selector/sw-device-selector.d.ts.map +1 -0
- package/dist/components/sw-device-selector/sw-device-selector.js +278 -0
- package/dist/components/sw-device-selector/sw-device-selector.js.map +1 -0
- package/dist/components/sw-device-selector/sw-device-selector.styles.d.ts +2 -0
- package/dist/components/sw-device-selector/sw-device-selector.styles.d.ts.map +1 -0
- package/dist/components/sw-device-selector/sw-device-selector.styles.js +238 -0
- package/dist/components/sw-device-selector/sw-device-selector.styles.js.map +1 -0
- package/dist/components/{directory.d.ts → sw-directory.d.ts} +18 -4
- package/dist/components/sw-directory.d.ts.map +1 -0
- package/dist/components/sw-directory.js +435 -0
- package/dist/components/sw-directory.js.map +1 -0
- package/dist/components/sw-local-camera.d.ts +53 -0
- package/dist/components/sw-local-camera.d.ts.map +1 -0
- package/dist/components/sw-local-camera.js +147 -0
- package/dist/components/sw-local-camera.js.map +1 -0
- package/dist/components/sw-participant-controls.d.ts +58 -0
- package/dist/components/sw-participant-controls.d.ts.map +1 -0
- package/dist/components/sw-participant-controls.js +306 -0
- package/dist/components/sw-participant-controls.js.map +1 -0
- package/dist/components/sw-participants.d.ts +55 -0
- package/dist/components/sw-participants.d.ts.map +1 -0
- package/dist/components/sw-participants.js +320 -0
- package/dist/components/sw-participants.js.map +1 -0
- package/dist/components/sw-self-media.d.ts +46 -0
- package/dist/components/sw-self-media.d.ts.map +1 -0
- package/dist/components/sw-self-media.js +106 -0
- package/dist/components/sw-self-media.js.map +1 -0
- package/dist/context/CallStateContextController.d.ts +31 -0
- package/dist/context/CallStateContextController.d.ts.map +1 -0
- package/dist/context/CallStateContextController.js +125 -0
- package/dist/context/CallStateContextController.js.map +1 -0
- package/dist/context/DevicesContextController.d.ts +38 -0
- package/dist/context/DevicesContextController.d.ts.map +1 -0
- package/dist/context/DevicesContextController.js +124 -0
- package/dist/context/DevicesContextController.js.map +1 -0
- package/dist/context/TranscriptController.d.ts +32 -0
- package/dist/context/TranscriptController.d.ts.map +1 -0
- package/dist/context/TranscriptController.js +113 -0
- package/dist/context/TranscriptController.js.map +1 -0
- package/dist/context/UserEventController.d.ts +26 -0
- package/dist/context/UserEventController.d.ts.map +1 -0
- package/dist/context/UserEventController.js +55 -0
- package/dist/context/UserEventController.js.map +1 -0
- package/dist/context/call-state-context.d.ts +75 -0
- package/dist/context/call-state-context.d.ts.map +1 -0
- package/dist/context/call-state-context.js +39 -0
- package/dist/context/call-state-context.js.map +1 -0
- package/dist/context/chat-state.d.ts +41 -0
- package/dist/context/chat-state.d.ts.map +1 -0
- package/dist/context/chat-state.js +61 -0
- package/dist/context/chat-state.js.map +1 -0
- package/dist/context/devices-context.d.ts +28 -0
- package/dist/context/devices-context.d.ts.map +1 -0
- package/dist/context/devices-context.js +6 -0
- package/dist/context/devices-context.js.map +1 -0
- package/dist/context/index.d.ts +9 -1
- package/dist/context/index.d.ts.map +1 -1
- package/dist/context/transcript-context.d.ts +9 -0
- package/dist/context/transcript-context.d.ts.map +1 -0
- package/dist/context/transcript-context.js +6 -0
- package/dist/context/transcript-context.js.map +1 -0
- package/dist/context/types.d.ts +9 -0
- package/dist/context/types.d.ts.map +1 -0
- package/dist/embed/signalwire-web-components-embed.iife.js +3237 -0
- package/dist/embed/signalwire-web-components-embed.iife.js.map +1 -0
- package/dist/embed/signalwire-web-components-embed.umd.cjs +3237 -0
- package/dist/embed/signalwire-web-components-embed.umd.cjs.map +1 -0
- package/dist/embed.d.ts +20 -0
- package/dist/embed.d.ts.map +1 -0
- package/dist/index.d.ts +19 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +84 -35
- package/dist/index.js.map +1 -1
- package/dist/node_modules/dompurify/dist/purify.es.js +597 -0
- package/dist/node_modules/dompurify/dist/purify.es.js.map +1 -0
- package/dist/node_modules/marked/lib/marked.esm.js +1475 -0
- package/dist/node_modules/marked/lib/marked.esm.js.map +1 -0
- package/dist/node_modules/prismjs/components/prism-bash.js +220 -0
- package/dist/node_modules/prismjs/components/prism-bash.js.map +1 -0
- package/dist/node_modules/prismjs/components/prism-css.js +56 -0
- package/dist/node_modules/prismjs/components/prism-css.js.map +1 -0
- package/dist/node_modules/prismjs/components/prism-javascript.js +138 -0
- package/dist/node_modules/prismjs/components/prism-javascript.js.map +1 -0
- package/dist/node_modules/prismjs/components/prism-json.js +26 -0
- package/dist/node_modules/prismjs/components/prism-json.js.map +1 -0
- package/dist/node_modules/prismjs/components/prism-markdown.js +301 -0
- package/dist/node_modules/prismjs/components/prism-markdown.js.map +1 -0
- package/dist/node_modules/prismjs/components/prism-python.js +69 -0
- package/dist/node_modules/prismjs/components/prism-python.js.map +1 -0
- package/dist/node_modules/prismjs/components/prism-sql.js +34 -0
- package/dist/node_modules/prismjs/components/prism-sql.js.map +1 -0
- package/dist/node_modules/prismjs/components/prism-typescript.js +53 -0
- package/dist/node_modules/prismjs/components/prism-typescript.js.map +1 -0
- package/dist/node_modules/prismjs/components/prism-yaml.js +67 -0
- package/dist/node_modules/prismjs/components/prism-yaml.js.map +1 -0
- package/dist/node_modules/prismjs/prism.js +1165 -0
- package/dist/node_modules/prismjs/prism.js.map +1 -0
- package/dist/react.d.ts +96 -46
- package/dist/theme.css +451 -0
- package/dist/theme.css.js +5 -0
- package/dist/theme.css.js.map +1 -0
- package/dist/types/index.d.ts +9 -33
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/prism.d.ts +4 -0
- package/dist/utils/prism.d.ts.map +1 -0
- package/dist/utils/prism.js +34 -0
- package/dist/utils/prism.js.map +1 -0
- package/dist/utils/theme-loader.d.ts +11 -0
- package/dist/utils/theme-loader.d.ts.map +1 -0
- package/dist/utils/theme-loader.js +17 -0
- package/dist/utils/theme-loader.js.map +1 -0
- package/dist/utils/transcriptToMarkdown.d.ts +14 -0
- package/dist/utils/transcriptToMarkdown.d.ts.map +1 -0
- package/dist/utils/transcriptToMarkdown.js +59 -0
- package/dist/utils/transcriptToMarkdown.js.map +1 -0
- package/dist/utils/use-google-font.d.ts +18 -0
- package/dist/utils/use-google-font.d.ts.map +1 -0
- package/dist/utils/use-google-font.js +12 -0
- package/dist/utils/use-google-font.js.map +1 -0
- package/dist/utils/user-variables.d.ts +20 -0
- package/dist/utils/user-variables.d.ts.map +1 -0
- package/dist/utils/user-variables.js +37 -0
- package/dist/utils/user-variables.js.map +1 -0
- package/dist/utils/video.js +6 -21
- package/dist/utils/video.js.map +1 -1
- package/package.json +105 -42
- package/dist/components/audio-level.d.ts.map +0 -1
- package/dist/components/audio-level.js +0 -203
- package/dist/components/audio-level.js.map +0 -1
- package/dist/components/call-controls.d.ts +0 -163
- package/dist/components/call-controls.d.ts.map +0 -1
- package/dist/components/call-controls.js +0 -606
- package/dist/components/call-controls.js.map +0 -1
- package/dist/components/call-media.d.ts +0 -114
- package/dist/components/call-media.d.ts.map +0 -1
- package/dist/components/call-media.js +0 -219
- package/dist/components/call-media.js.map +0 -1
- package/dist/components/call-status.d.ts +0 -68
- package/dist/components/call-status.d.ts.map +0 -1
- package/dist/components/call-status.js +0 -254
- package/dist/components/call-status.js.map +0 -1
- package/dist/components/click-to-call.d.ts +0 -123
- package/dist/components/click-to-call.d.ts.map +0 -1
- package/dist/components/click-to-call.js +0 -428
- package/dist/components/click-to-call.js.map +0 -1
- package/dist/components/device-selector.d.ts +0 -224
- package/dist/components/device-selector.d.ts.map +0 -1
- package/dist/components/device-selector.js +0 -685
- package/dist/components/device-selector.js.map +0 -1
- package/dist/components/dialpad.d.ts +0 -60
- package/dist/components/dialpad.d.ts.map +0 -1
- package/dist/components/dialpad.js +0 -372
- package/dist/components/dialpad.js.map +0 -1
- package/dist/components/directory.d.ts.map +0 -1
- package/dist/components/directory.js +0 -503
- package/dist/components/directory.js.map +0 -1
- package/dist/components/example-button.d.ts +0 -20
- package/dist/components/example-button.d.ts.map +0 -1
- package/dist/components/example-button.js +0 -74
- package/dist/components/example-button.js.map +0 -1
- package/dist/components/participant-controls.d.ts +0 -94
- package/dist/components/participant-controls.d.ts.map +0 -1
- package/dist/components/participant-controls.js +0 -468
- package/dist/components/participant-controls.js.map +0 -1
- package/dist/components/participants.d.ts +0 -116
- package/dist/components/participants.d.ts.map +0 -1
- package/dist/components/participants.js +0 -394
- package/dist/components/participants.js.map +0 -1
- package/dist/components/self-media.d.ts +0 -78
- package/dist/components/self-media.d.ts.map +0 -1
- package/dist/components/self-media.js +0 -129
- package/dist/components/self-media.js.map +0 -1
- package/dist/constants.js +0 -5
- package/dist/constants.js.map +0 -1
- package/dist/context/call-context.d.ts +0 -13
- package/dist/context/call-context.d.ts.map +0 -1
- package/dist/context/call-context.js +0 -6
- package/dist/context/call-context.js.map +0 -1
- package/dist/types/index.js +0 -12
- package/dist/types/index.js.map +0 -1
- package/dist/utils/debounce.js +0 -13
- package/dist/utils/debounce.js.map +0 -1
|
@@ -0,0 +1,413 @@
|
|
|
1
|
+
import { LitElement as v, html as c, nothing as h, css as w } from "lit";
|
|
2
|
+
import { property as d, state as p, customElement as k } from "lit/decorators.js";
|
|
3
|
+
import { unsafeHTML as f } from "lit/directives/unsafe-html.js";
|
|
4
|
+
import { getLogger as y } from "@signalwire/js";
|
|
5
|
+
import { highlight as _ } from "../../../utils/prism.js";
|
|
6
|
+
var C = Object.defineProperty, z = Object.getOwnPropertyDescriptor, a = (t, e, o, s) => {
|
|
7
|
+
for (var r = s > 1 ? void 0 : s ? z(e, o) : e, i = t.length - 1, l; i >= 0; i--)
|
|
8
|
+
(l = t[i]) && (r = (s ? l(e, o, r) : l(r)) || r);
|
|
9
|
+
return s && r && C(e, o, r), r;
|
|
10
|
+
};
|
|
11
|
+
const u = y(), m = {
|
|
12
|
+
ALLOWED_TAGS: [
|
|
13
|
+
"p",
|
|
14
|
+
"br",
|
|
15
|
+
"b",
|
|
16
|
+
"i",
|
|
17
|
+
"em",
|
|
18
|
+
"strong",
|
|
19
|
+
"a",
|
|
20
|
+
"ul",
|
|
21
|
+
"ol",
|
|
22
|
+
"li",
|
|
23
|
+
"h1",
|
|
24
|
+
"h2",
|
|
25
|
+
"h3",
|
|
26
|
+
"h4",
|
|
27
|
+
"h5",
|
|
28
|
+
"h6",
|
|
29
|
+
"pre",
|
|
30
|
+
"code",
|
|
31
|
+
"blockquote",
|
|
32
|
+
"hr",
|
|
33
|
+
"table",
|
|
34
|
+
"thead",
|
|
35
|
+
"tbody",
|
|
36
|
+
"tr",
|
|
37
|
+
"th",
|
|
38
|
+
"td",
|
|
39
|
+
"img",
|
|
40
|
+
"span",
|
|
41
|
+
"div"
|
|
42
|
+
],
|
|
43
|
+
ALLOWED_ATTR: ["href", "target", "rel", "src", "alt", "class", "title"],
|
|
44
|
+
ALLOW_DATA_ATTR: !1,
|
|
45
|
+
FORBID_TAGS: ["script", "iframe", "object", "embed", "form", "input"],
|
|
46
|
+
FORBID_ATTR: ["style"]
|
|
47
|
+
};
|
|
48
|
+
let b = !1;
|
|
49
|
+
function g(t) {
|
|
50
|
+
return b || (t.addHook("afterSanitizeAttributes", (e) => {
|
|
51
|
+
e.tagName === "A" && e.hasAttribute("target") && e.setAttribute("rel", "noopener noreferrer");
|
|
52
|
+
}), b = !0), t;
|
|
53
|
+
}
|
|
54
|
+
let n = class extends v {
|
|
55
|
+
constructor() {
|
|
56
|
+
super(...arguments), this.open = !1, this.narrow = !1, this.title = "", this.content = "", this.format = "text", this.language = "", this._renderedHtml = "", this._renderFormat = "text", this._copied = !1, this._renderId = 0;
|
|
57
|
+
}
|
|
58
|
+
connectedCallback() {
|
|
59
|
+
super.connectedCallback(), this._ro = new ResizeObserver((e) => {
|
|
60
|
+
const o = e[0];
|
|
61
|
+
o && (this.narrow = o.contentRect.width <= 480);
|
|
62
|
+
});
|
|
63
|
+
const t = this.parentElement;
|
|
64
|
+
t && this._ro.observe(t);
|
|
65
|
+
}
|
|
66
|
+
disconnectedCallback() {
|
|
67
|
+
var t;
|
|
68
|
+
super.disconnectedCallback(), (t = this._ro) == null || t.disconnect(), this._ro = void 0;
|
|
69
|
+
}
|
|
70
|
+
updated(t) {
|
|
71
|
+
super.updated(t), (t.has("content") || t.has("format") || t.has("language")) && this._renderContent();
|
|
72
|
+
}
|
|
73
|
+
async _renderContent() {
|
|
74
|
+
const t = ++this._renderId, { content: e, format: o, language: s } = this;
|
|
75
|
+
if (o === "text") {
|
|
76
|
+
if (t !== this._renderId) return;
|
|
77
|
+
this._renderedHtml = "", this._renderFormat = "text";
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
try {
|
|
81
|
+
let r = "";
|
|
82
|
+
if (o === "markdown") {
|
|
83
|
+
const [{ marked: i }, { default: l }] = await Promise.all([
|
|
84
|
+
import("../../../node_modules/marked/lib/marked.esm.js"),
|
|
85
|
+
import("../../../node_modules/dompurify/dist/purify.es.js")
|
|
86
|
+
]), x = await i.parse(e, { async: !0 });
|
|
87
|
+
r = g(l).sanitize(x, m);
|
|
88
|
+
} else if (o === "html") {
|
|
89
|
+
const { default: i } = await import("../../../node_modules/dompurify/dist/purify.es.js");
|
|
90
|
+
r = g(i).sanitize(e, m);
|
|
91
|
+
} else o === "code" && (r = await _(e, s || "plaintext"));
|
|
92
|
+
if (t !== this._renderId) return;
|
|
93
|
+
this._renderedHtml = r, this._renderFormat = o;
|
|
94
|
+
} catch (r) {
|
|
95
|
+
if (u.error("[ContentDrawer] Failed to render content:", r), t !== this._renderId) return;
|
|
96
|
+
this._renderedHtml = "", this._renderFormat = "text";
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
_close() {
|
|
100
|
+
this.dispatchEvent(new CustomEvent("sw-content-drawer-close", { bubbles: !0, composed: !0 }));
|
|
101
|
+
}
|
|
102
|
+
async _copy() {
|
|
103
|
+
try {
|
|
104
|
+
await navigator.clipboard.writeText(this.content), this._copied = !0, setTimeout(() => {
|
|
105
|
+
this._copied = !1;
|
|
106
|
+
}, 2e3);
|
|
107
|
+
} catch {
|
|
108
|
+
u.error("[ContentDrawer] Clipboard write failed");
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
_renderBody() {
|
|
112
|
+
return this.format === "text" || this._renderFormat !== this.format ? c`<div class="content-text">${this.content}</div>` : this._renderFormat === "code" ? c`
|
|
113
|
+
<div class="content-code">
|
|
114
|
+
<pre><code>${f(this._renderedHtml)}</code></pre>
|
|
115
|
+
</div>
|
|
116
|
+
` : c`<div class="content-rich">${f(this._renderedHtml)}</div>`;
|
|
117
|
+
}
|
|
118
|
+
render() {
|
|
119
|
+
const t = this.format === "code" && this.language;
|
|
120
|
+
return c`
|
|
121
|
+
<div class="panel" part="panel">
|
|
122
|
+
<div class="header" part="header">
|
|
123
|
+
${this.title ? c`<span class="title" part="title">${this.title}</span>` : h}
|
|
124
|
+
${t ? c`<span class="lang-badge">${this.language}</span>` : h}
|
|
125
|
+
<button
|
|
126
|
+
class="action-btn ${this._copied ? "copy-done" : ""}"
|
|
127
|
+
title="Copy to clipboard"
|
|
128
|
+
@click=${this._copy}
|
|
129
|
+
>
|
|
130
|
+
<sw-ui-icon name=${this._copied ? "check-circle" : "copy"} size="16"></sw-ui-icon>
|
|
131
|
+
</button>
|
|
132
|
+
<button class="action-btn" title="Close" @click=${this._close}>
|
|
133
|
+
<sw-ui-icon name="close" size="16"></sw-ui-icon>
|
|
134
|
+
</button>
|
|
135
|
+
</div>
|
|
136
|
+
<div class="body" part="body">
|
|
137
|
+
${this._renderBody()}
|
|
138
|
+
</div>
|
|
139
|
+
</div>
|
|
140
|
+
`;
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
n.styles = w`
|
|
144
|
+
/* ── Host — default: slide in from the right ── */
|
|
145
|
+
:host {
|
|
146
|
+
display: block;
|
|
147
|
+
position: absolute;
|
|
148
|
+
top: 0;
|
|
149
|
+
right: 0;
|
|
150
|
+
width: min(360px, 100%);
|
|
151
|
+
height: 100%;
|
|
152
|
+
z-index: 20;
|
|
153
|
+
transform: translateX(100%);
|
|
154
|
+
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
155
|
+
pointer-events: none;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
:host([open]) {
|
|
159
|
+
transform: translateX(0);
|
|
160
|
+
pointer-events: auto;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/* ── Narrow mode: slide up from the bottom ── */
|
|
164
|
+
:host([narrow]) {
|
|
165
|
+
width: 100%;
|
|
166
|
+
height: auto;
|
|
167
|
+
max-height: 65%;
|
|
168
|
+
top: auto;
|
|
169
|
+
bottom: 0;
|
|
170
|
+
transform: translateY(100%);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
:host([narrow][open]) {
|
|
174
|
+
transform: translateY(0);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/* ── Panel ── */
|
|
178
|
+
.panel {
|
|
179
|
+
display: flex;
|
|
180
|
+
flex-direction: column;
|
|
181
|
+
height: 100%;
|
|
182
|
+
background: var(--bg-page);
|
|
183
|
+
border-left: 1px solid var(--border-default);
|
|
184
|
+
overflow: hidden;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
:host([narrow]) .panel {
|
|
188
|
+
border-left: none;
|
|
189
|
+
border-top: 1px solid var(--border-default);
|
|
190
|
+
border-radius: var(--sw-call-layout-radius, 0) var(--sw-call-layout-radius, 0) 0 0;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/* ── Header ── */
|
|
194
|
+
.header {
|
|
195
|
+
flex: 0 0 auto;
|
|
196
|
+
display: flex;
|
|
197
|
+
align-items: center;
|
|
198
|
+
gap: 8px;
|
|
199
|
+
padding: 10px 12px;
|
|
200
|
+
border-bottom: 1px solid var(--border-default);
|
|
201
|
+
min-height: 42px;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
.title {
|
|
205
|
+
flex: 1;
|
|
206
|
+
font-size: 11px;
|
|
207
|
+
font-weight: 600;
|
|
208
|
+
letter-spacing: 0.08em;
|
|
209
|
+
text-transform: uppercase;
|
|
210
|
+
color: color-mix(in srgb, var(--fg-default) 50%, transparent);
|
|
211
|
+
overflow: hidden;
|
|
212
|
+
text-overflow: ellipsis;
|
|
213
|
+
white-space: nowrap;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
.lang-badge {
|
|
217
|
+
font-size: 10px;
|
|
218
|
+
font-weight: 500;
|
|
219
|
+
color: var(--fg-muted);
|
|
220
|
+
background: var(--bg-surface);
|
|
221
|
+
padding: 1px 6px;
|
|
222
|
+
border-radius: 4px;
|
|
223
|
+
border: 1px solid var(--border-default);
|
|
224
|
+
flex-shrink: 0;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
.action-btn {
|
|
228
|
+
display: inline-flex;
|
|
229
|
+
align-items: center;
|
|
230
|
+
justify-content: center;
|
|
231
|
+
width: 28px;
|
|
232
|
+
height: 28px;
|
|
233
|
+
border: none;
|
|
234
|
+
border-radius: 6px;
|
|
235
|
+
background: transparent;
|
|
236
|
+
color: color-mix(in srgb, var(--fg-default) 55%, transparent);
|
|
237
|
+
cursor: pointer;
|
|
238
|
+
transition: background var(--transition-fast), color var(--transition-fast);
|
|
239
|
+
flex-shrink: 0;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
.action-btn:hover {
|
|
243
|
+
background: var(--bg-surface-raised);
|
|
244
|
+
color: var(--fg-default);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
.copy-done {
|
|
248
|
+
color: var(--interactive-status-success) !important;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/* ── Body ── */
|
|
252
|
+
.body {
|
|
253
|
+
flex: 1;
|
|
254
|
+
overflow-y: auto;
|
|
255
|
+
overflow-x: hidden;
|
|
256
|
+
padding: 14px 14px 20px;
|
|
257
|
+
font-size: 13px;
|
|
258
|
+
line-height: 1.6;
|
|
259
|
+
color: var(--fg-default);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
.body::-webkit-scrollbar { width: 4px; }
|
|
263
|
+
.body::-webkit-scrollbar-track { background: transparent; }
|
|
264
|
+
.body::-webkit-scrollbar-thumb {
|
|
265
|
+
background: var(--bg-surface-raised);
|
|
266
|
+
border-radius: 2px;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/* ── text format ── */
|
|
270
|
+
.content-text {
|
|
271
|
+
white-space: pre-wrap;
|
|
272
|
+
font-family: ui-monospace, monospace;
|
|
273
|
+
font-size: 12px;
|
|
274
|
+
line-height: 1.6;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/* ── code format ── */
|
|
278
|
+
.content-code pre {
|
|
279
|
+
margin: 0;
|
|
280
|
+
padding: 14px 16px;
|
|
281
|
+
background: #1a1b26;
|
|
282
|
+
border-radius: 6px;
|
|
283
|
+
overflow-x: auto;
|
|
284
|
+
font-size: 12.5px;
|
|
285
|
+
line-height: 1.6;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
.content-code code {
|
|
289
|
+
font-family: ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, monospace;
|
|
290
|
+
color: #f8f8f2;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/* ── markdown / html format ── */
|
|
294
|
+
.content-rich { overflow-wrap: break-word; }
|
|
295
|
+
|
|
296
|
+
.content-rich h1, .content-rich h2, .content-rich h3 {
|
|
297
|
+
margin: 0 0 8px; font-weight: 600; color: var(--fg-default);
|
|
298
|
+
}
|
|
299
|
+
.content-rich h1 { font-size: 1.2em; }
|
|
300
|
+
.content-rich h2 { font-size: 1.1em; }
|
|
301
|
+
.content-rich h3 { font-size: 1em; }
|
|
302
|
+
|
|
303
|
+
.content-rich p { margin: 0 0 10px; }
|
|
304
|
+
.content-rich p:last-child { margin-bottom: 0; }
|
|
305
|
+
|
|
306
|
+
.content-rich ul, .content-rich ol { margin: 0 0 10px; padding-left: 18px; }
|
|
307
|
+
.content-rich li { margin-bottom: 4px; }
|
|
308
|
+
|
|
309
|
+
.content-rich code {
|
|
310
|
+
font-family: ui-monospace, monospace;
|
|
311
|
+
font-size: 0.85em;
|
|
312
|
+
background: rgba(255,255,255,0.1);
|
|
313
|
+
padding: 1px 5px;
|
|
314
|
+
border-radius: 3px;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
.content-rich pre {
|
|
318
|
+
background: #1a1b26;
|
|
319
|
+
border-radius: 6px;
|
|
320
|
+
padding: 10px 12px;
|
|
321
|
+
overflow-x: auto;
|
|
322
|
+
margin: 0 0 10px;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
.content-rich pre code { background: transparent; padding: 0; color: #f8f8f2; }
|
|
326
|
+
|
|
327
|
+
.content-rich a { color: var(--interactive-button-primary-bg); text-decoration: underline; }
|
|
328
|
+
.content-rich a:hover { opacity: 0.85; }
|
|
329
|
+
|
|
330
|
+
.content-rich blockquote {
|
|
331
|
+
border-left: 3px solid var(--border-default);
|
|
332
|
+
margin: 0 0 10px;
|
|
333
|
+
padding-left: 10px;
|
|
334
|
+
color: var(--fg-muted);
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
.content-rich table {
|
|
338
|
+
border-collapse: collapse; width: 100%; margin: 0 0 10px; font-size: 0.85em;
|
|
339
|
+
}
|
|
340
|
+
.content-rich th, .content-rich td {
|
|
341
|
+
border: 1px solid var(--border-default); padding: 4px 8px; text-align: left;
|
|
342
|
+
}
|
|
343
|
+
.content-rich th { background: var(--bg-surface); font-weight: 600; }
|
|
344
|
+
|
|
345
|
+
/* ── Prism Okaidia theme (must live in shadow DOM) ── */
|
|
346
|
+
.token.comment,
|
|
347
|
+
.token.prolog,
|
|
348
|
+
.token.doctype,
|
|
349
|
+
.token.cdata { color: #8292a2; }
|
|
350
|
+
.token.punctuation { color: #f8f8f2; }
|
|
351
|
+
.token.namespace { opacity: 0.7; }
|
|
352
|
+
.token.property,
|
|
353
|
+
.token.tag,
|
|
354
|
+
.token.constant,
|
|
355
|
+
.token.symbol,
|
|
356
|
+
.token.deleted { color: #f92672; }
|
|
357
|
+
.token.boolean,
|
|
358
|
+
.token.number { color: #ae81ff; }
|
|
359
|
+
.token.selector,
|
|
360
|
+
.token.attr-name,
|
|
361
|
+
.token.string,
|
|
362
|
+
.token.char,
|
|
363
|
+
.token.builtin,
|
|
364
|
+
.token.inserted { color: #a6e22e; }
|
|
365
|
+
.token.operator,
|
|
366
|
+
.token.entity,
|
|
367
|
+
.token.url,
|
|
368
|
+
.token.variable { color: #f8f8f2; }
|
|
369
|
+
.token.atrule,
|
|
370
|
+
.token.attr-value,
|
|
371
|
+
.token.function,
|
|
372
|
+
.token.class-name { color: #e6db74; }
|
|
373
|
+
.token.keyword { color: #66d9ef; }
|
|
374
|
+
.token.regex,
|
|
375
|
+
.token.important { color: #fd971f; }
|
|
376
|
+
.token.important,
|
|
377
|
+
.token.bold { font-weight: bold; }
|
|
378
|
+
.token.italic { font-style: italic; }
|
|
379
|
+
`;
|
|
380
|
+
a([
|
|
381
|
+
d({ type: Boolean, reflect: !0 })
|
|
382
|
+
], n.prototype, "open", 2);
|
|
383
|
+
a([
|
|
384
|
+
d({ type: Boolean, reflect: !0 })
|
|
385
|
+
], n.prototype, "narrow", 2);
|
|
386
|
+
a([
|
|
387
|
+
d({ type: String })
|
|
388
|
+
], n.prototype, "title", 2);
|
|
389
|
+
a([
|
|
390
|
+
d({ type: String })
|
|
391
|
+
], n.prototype, "content", 2);
|
|
392
|
+
a([
|
|
393
|
+
d({ type: String })
|
|
394
|
+
], n.prototype, "format", 2);
|
|
395
|
+
a([
|
|
396
|
+
d({ type: String })
|
|
397
|
+
], n.prototype, "language", 2);
|
|
398
|
+
a([
|
|
399
|
+
p()
|
|
400
|
+
], n.prototype, "_renderedHtml", 2);
|
|
401
|
+
a([
|
|
402
|
+
p()
|
|
403
|
+
], n.prototype, "_renderFormat", 2);
|
|
404
|
+
a([
|
|
405
|
+
p()
|
|
406
|
+
], n.prototype, "_copied", 2);
|
|
407
|
+
n = a([
|
|
408
|
+
k("sw-ui-content-drawer")
|
|
409
|
+
], n);
|
|
410
|
+
export {
|
|
411
|
+
n as SwUiContentDrawer
|
|
412
|
+
};
|
|
413
|
+
//# sourceMappingURL=sw-ui-content-drawer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sw-ui-content-drawer.js","sources":["../../../../src/components/UI/layout/sw-ui-content-drawer.ts"],"sourcesContent":["import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport '../icons/sw-ui-icon.js';\nimport { getLogger } from '@signalwire/js';\nimport { highlight } from '../../../utils/prism.js';\n\nconst logger = getLogger();\n\n/** Formats supported by the content drawer. */\nexport type ContentFormat = 'text' | 'markdown' | 'code' | 'html';\n\n/** Payload that drives the content drawer. */\nexport interface DisplayContentPayload {\n title?: string;\n content: string;\n format: ContentFormat;\n /** Prism language name (required when format === 'code'). */\n language?: string;\n}\n\n// ── DOMPurify allowlist ──────────────────────────────────────────────────────\n\n// DOMPurify already blocks all `on*` event handlers by default — we only need\n// to extend the defaults for things it would otherwise allow (inline `style`).\nconst PURIFY_CONFIG = {\n ALLOWED_TAGS: [\n 'p', 'br', 'b', 'i', 'em', 'strong', 'a', 'ul', 'ol', 'li',\n 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',\n 'pre', 'code', 'blockquote', 'hr', 'table', 'thead', 'tbody',\n 'tr', 'th', 'td', 'img', 'span', 'div',\n ],\n ALLOWED_ATTR: ['href', 'target', 'rel', 'src', 'alt', 'class', 'title'],\n ALLOW_DATA_ATTR: false,\n FORBID_TAGS: ['script', 'iframe', 'object', 'embed', 'form', 'input'],\n FORBID_ATTR: ['style'],\n};\n\n// Force `rel=\"noopener noreferrer\"` on any anchor that opens in a new context.\n// Without this, sanitized markdown/html with `<a target=\"_blank\">` could let\n// the opened page reach back into ours via `window.opener`.\ntype DOMPurifyNS = typeof import('dompurify')['default'];\nlet purifyHookInstalled = false;\nfunction ensurePurifyHook(DOMPurify: DOMPurifyNS): DOMPurifyNS {\n if (purifyHookInstalled) return DOMPurify;\n DOMPurify.addHook('afterSanitizeAttributes', (node) => {\n if (node.tagName === 'A' && node.hasAttribute('target')) {\n node.setAttribute('rel', 'noopener noreferrer');\n }\n });\n purifyHookInstalled = true;\n return DOMPurify;\n}\n\n// ── Component ────────────────────────────────────────────────────────────────\n\n/**\n * Content drawer overlay for the call widget.\n *\n * Slides in from the right on wide containers; on narrow containers (parent\n * width ≤ 480 px) it slides up from the bottom instead.\n *\n * Formats: `text` · `markdown` (marked + DOMPurify) · `code` (Prism) · `html` (DOMPurify)\n *\n * @fires sw-content-drawer-close - User clicked the close button. No detail.\n */\n@customElement('sw-ui-content-drawer')\nexport class SwUiContentDrawer extends LitElement {\n static styles = css`\n /* ── Host — default: slide in from the right ── */\n :host {\n display: block;\n position: absolute;\n top: 0;\n right: 0;\n width: min(360px, 100%);\n height: 100%;\n z-index: 20;\n transform: translateX(100%);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n pointer-events: none;\n }\n\n :host([open]) {\n transform: translateX(0);\n pointer-events: auto;\n }\n\n /* ── Narrow mode: slide up from the bottom ── */\n :host([narrow]) {\n width: 100%;\n height: auto;\n max-height: 65%;\n top: auto;\n bottom: 0;\n transform: translateY(100%);\n }\n\n :host([narrow][open]) {\n transform: translateY(0);\n }\n\n /* ── Panel ── */\n .panel {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--bg-page);\n border-left: 1px solid var(--border-default);\n overflow: hidden;\n }\n\n :host([narrow]) .panel {\n border-left: none;\n border-top: 1px solid var(--border-default);\n border-radius: var(--sw-call-layout-radius, 0) var(--sw-call-layout-radius, 0) 0 0;\n }\n\n /* ── Header ── */\n .header {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 12px;\n border-bottom: 1px solid var(--border-default);\n min-height: 42px;\n }\n\n .title {\n flex: 1;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: color-mix(in srgb, var(--fg-default) 50%, transparent);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .lang-badge {\n font-size: 10px;\n font-weight: 500;\n color: var(--fg-muted);\n background: var(--bg-surface);\n padding: 1px 6px;\n border-radius: 4px;\n border: 1px solid var(--border-default);\n flex-shrink: 0;\n }\n\n .action-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: color-mix(in srgb, var(--fg-default) 55%, transparent);\n cursor: pointer;\n transition: background var(--transition-fast), color var(--transition-fast);\n flex-shrink: 0;\n }\n\n .action-btn:hover {\n background: var(--bg-surface-raised);\n color: var(--fg-default);\n }\n\n .copy-done {\n color: var(--interactive-status-success) !important;\n }\n\n /* ── Body ── */\n .body {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 14px 14px 20px;\n font-size: 13px;\n line-height: 1.6;\n color: var(--fg-default);\n }\n\n .body::-webkit-scrollbar { width: 4px; }\n .body::-webkit-scrollbar-track { background: transparent; }\n .body::-webkit-scrollbar-thumb {\n background: var(--bg-surface-raised);\n border-radius: 2px;\n }\n\n /* ── text format ── */\n .content-text {\n white-space: pre-wrap;\n font-family: ui-monospace, monospace;\n font-size: 12px;\n line-height: 1.6;\n }\n\n /* ── code format ── */\n .content-code pre {\n margin: 0;\n padding: 14px 16px;\n background: #1a1b26;\n border-radius: 6px;\n overflow-x: auto;\n font-size: 12.5px;\n line-height: 1.6;\n }\n\n .content-code code {\n font-family: ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, monospace;\n color: #f8f8f2;\n }\n\n /* ── markdown / html format ── */\n .content-rich { overflow-wrap: break-word; }\n\n .content-rich h1, .content-rich h2, .content-rich h3 {\n margin: 0 0 8px; font-weight: 600; color: var(--fg-default);\n }\n .content-rich h1 { font-size: 1.2em; }\n .content-rich h2 { font-size: 1.1em; }\n .content-rich h3 { font-size: 1em; }\n\n .content-rich p { margin: 0 0 10px; }\n .content-rich p:last-child { margin-bottom: 0; }\n\n .content-rich ul, .content-rich ol { margin: 0 0 10px; padding-left: 18px; }\n .content-rich li { margin-bottom: 4px; }\n\n .content-rich code {\n font-family: ui-monospace, monospace;\n font-size: 0.85em;\n background: rgba(255,255,255,0.1);\n padding: 1px 5px;\n border-radius: 3px;\n }\n\n .content-rich pre {\n background: #1a1b26;\n border-radius: 6px;\n padding: 10px 12px;\n overflow-x: auto;\n margin: 0 0 10px;\n }\n\n .content-rich pre code { background: transparent; padding: 0; color: #f8f8f2; }\n\n .content-rich a { color: var(--interactive-button-primary-bg); text-decoration: underline; }\n .content-rich a:hover { opacity: 0.85; }\n\n .content-rich blockquote {\n border-left: 3px solid var(--border-default);\n margin: 0 0 10px;\n padding-left: 10px;\n color: var(--fg-muted);\n }\n\n .content-rich table {\n border-collapse: collapse; width: 100%; margin: 0 0 10px; font-size: 0.85em;\n }\n .content-rich th, .content-rich td {\n border: 1px solid var(--border-default); padding: 4px 8px; text-align: left;\n }\n .content-rich th { background: var(--bg-surface); font-weight: 600; }\n\n /* ── Prism Okaidia theme (must live in shadow DOM) ── */\n .token.comment,\n .token.prolog,\n .token.doctype,\n .token.cdata { color: #8292a2; }\n .token.punctuation { color: #f8f8f2; }\n .token.namespace { opacity: 0.7; }\n .token.property,\n .token.tag,\n .token.constant,\n .token.symbol,\n .token.deleted { color: #f92672; }\n .token.boolean,\n .token.number { color: #ae81ff; }\n .token.selector,\n .token.attr-name,\n .token.string,\n .token.char,\n .token.builtin,\n .token.inserted { color: #a6e22e; }\n .token.operator,\n .token.entity,\n .token.url,\n .token.variable { color: #f8f8f2; }\n .token.atrule,\n .token.attr-value,\n .token.function,\n .token.class-name { color: #e6db74; }\n .token.keyword { color: #66d9ef; }\n .token.regex,\n .token.important { color: #fd971f; }\n .token.important,\n .token.bold { font-weight: bold; }\n .token.italic { font-style: italic; }\n `;\n\n @property({ type: Boolean, reflect: true }) open = false;\n @property({ type: Boolean, reflect: true }) narrow = false;\n @property({ type: String }) title = '';\n @property({ type: String }) content = '';\n @property({ type: String }) format: ContentFormat = 'text';\n @property({ type: String }) language = '';\n\n @state() private _renderedHtml = '';\n @state() private _renderFormat: ContentFormat = 'text';\n @state() private _copied = false;\n\n // Incremented each time a new render is requested; stale renders check this.\n private _renderId = 0;\n\n private _ro?: ResizeObserver;\n\n connectedCallback(): void {\n super.connectedCallback();\n this._ro = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (entry) this.narrow = entry.contentRect.width <= 480;\n });\n // Observe the parent element (the positioning container) so narrow mode\n // triggers on the container's width, not the drawer's own width.\n const parent = this.parentElement;\n if (parent) this._ro.observe(parent);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this._ro?.disconnect();\n this._ro = undefined;\n }\n\n protected updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has('content') || changed.has('format') || changed.has('language')) {\n void this._renderContent();\n }\n }\n\n private async _renderContent(): Promise<void> {\n const id = ++this._renderId;\n const { content, format, language } = this;\n\n if (format === 'text') {\n if (id !== this._renderId) return;\n this._renderedHtml = '';\n this._renderFormat = 'text';\n return;\n }\n\n try {\n let html = '';\n\n if (format === 'markdown') {\n const [{ marked }, { default: DOMPurify }] = await Promise.all([\n import('marked'),\n import('dompurify'),\n ]);\n const raw = await marked.parse(content, { async: true });\n html = ensurePurifyHook(DOMPurify).sanitize(raw, PURIFY_CONFIG);\n } else if (format === 'html') {\n const { default: DOMPurify } = await import('dompurify');\n html = ensurePurifyHook(DOMPurify).sanitize(content, PURIFY_CONFIG);\n } else if (format === 'code') {\n html = await highlight(content, language || 'plaintext');\n }\n\n if (id !== this._renderId) return;\n this._renderedHtml = html;\n this._renderFormat = format;\n } catch (err) {\n logger.error('[ContentDrawer] Failed to render content:', err);\n if (id !== this._renderId) return;\n this._renderedHtml = '';\n this._renderFormat = 'text';\n }\n }\n\n private _close(): void {\n this.dispatchEvent(new CustomEvent('sw-content-drawer-close', { bubbles: true, composed: true }));\n }\n\n private async _copy(): Promise<void> {\n try {\n await navigator.clipboard.writeText(this.content);\n this._copied = true;\n setTimeout(() => { this._copied = false; }, 2000);\n } catch {\n logger.error('[ContentDrawer] Clipboard write failed');\n }\n }\n\n private _renderBody() {\n if (this.format === 'text' || (this._renderFormat !== this.format)) {\n // Show plain text immediately; highlighted version replaces it once ready.\n return html`<div class=\"content-text\">${this.content}</div>`;\n }\n if (this._renderFormat === 'code') {\n return html`\n <div class=\"content-code\">\n <pre><code>${unsafeHTML(this._renderedHtml)}</code></pre>\n </div>\n `;\n }\n return html`<div class=\"content-rich\">${unsafeHTML(this._renderedHtml)}</div>`;\n }\n\n render() {\n const showLangBadge = this.format === 'code' && this.language;\n\n return html`\n <div class=\"panel\" part=\"panel\">\n <div class=\"header\" part=\"header\">\n ${this.title\n ? html`<span class=\"title\" part=\"title\">${this.title}</span>`\n : nothing}\n ${showLangBadge\n ? html`<span class=\"lang-badge\">${this.language}</span>`\n : nothing}\n <button\n class=\"action-btn ${this._copied ? 'copy-done' : ''}\"\n title=\"Copy to clipboard\"\n @click=${this._copy}\n >\n <sw-ui-icon name=${this._copied ? 'check-circle' : 'copy'} size=\"16\"></sw-ui-icon>\n </button>\n <button class=\"action-btn\" title=\"Close\" @click=${this._close}>\n <sw-ui-icon name=\"close\" size=\"16\"></sw-ui-icon>\n </button>\n </div>\n <div class=\"body\" part=\"body\">\n ${this._renderBody()}\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'sw-ui-content-drawer': SwUiContentDrawer;\n }\n}\n"],"names":["logger","getLogger","PURIFY_CONFIG","purifyHookInstalled","ensurePurifyHook","DOMPurify","node","SwUiContentDrawer","LitElement","entries","entry","parent","_a","changed","id","content","format","language","html","marked","raw","highlight","err","unsafeHTML","showLangBadge","nothing","css","__decorateClass","property","state","customElement"],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { LitElement } from 'lit';
|
|
2
|
+
/**
|
|
3
|
+
* Wrap elements with this to make them modal.
|
|
4
|
+
*
|
|
5
|
+
* @slot - Dialog content.
|
|
6
|
+
* @fires sw-modal-close - Cancelable. Fired on ESC or backdrop click; call
|
|
7
|
+
* `preventDefault()` to keep the modal open.
|
|
8
|
+
*/
|
|
9
|
+
export declare class SwUiModal extends LitElement {
|
|
10
|
+
static styles: import("lit").CSSResult;
|
|
11
|
+
open: boolean;
|
|
12
|
+
private dialog;
|
|
13
|
+
private _savedOverflow;
|
|
14
|
+
updated(changed: Map<string, unknown>): void;
|
|
15
|
+
private _animateClose;
|
|
16
|
+
/** ESC key — intercept native close and route through `_requestClose`. */
|
|
17
|
+
private _handleCancel;
|
|
18
|
+
/** Backdrop click — the `<dialog>` itself is the backdrop target. */
|
|
19
|
+
private _handleBackdropClick;
|
|
20
|
+
/** Dispatch a cancelable `sw-modal-close`; only close if not prevented. */
|
|
21
|
+
private _requestClose;
|
|
22
|
+
connectedCallback(): void;
|
|
23
|
+
disconnectedCallback(): void;
|
|
24
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
25
|
+
}
|
|
26
|
+
declare global {
|
|
27
|
+
interface HTMLElementTagNameMap {
|
|
28
|
+
'sw-ui-modal': SwUiModal;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=sw-ui-modal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sw-ui-modal.d.ts","sourceRoot":"","sources":["../../../../src/components/UI/layout/sw-ui-modal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAG5C;;;;;;GAMG;AAEH,qBACa,SAAU,SAAQ,UAAU;IACvC,MAAM,CAAC,MAAM,0BAwFX;IAGF,IAAI,UAAS;IAGb,OAAO,CAAC,MAAM,CAAqB;IAEnC,OAAO,CAAC,cAAc,CAAuB;IAE7C,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAYrC,OAAO,CAAC,aAAa;IAerB,0EAA0E;IAC1E,OAAO,CAAC,aAAa,CAGnB;IAEF,qEAAqE;IACrE,OAAO,CAAC,oBAAoB,CAI1B;IAEF,2EAA2E;IAC3E,OAAO,CAAC,aAAa;IAWrB,iBAAiB,IAAI,IAAI;IAQzB,oBAAoB,IAAI,IAAI;IAM5B,MAAM;CAKP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,aAAa,EAAE,SAAS,CAAC;KAC1B;CACF"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { LitElement as d, html as c, css as m } from "lit";
|
|
2
|
+
import { property as p, query as u, customElement as h } from "lit/decorators.js";
|
|
3
|
+
var f = Object.defineProperty, v = Object.getOwnPropertyDescriptor, r = (a, o, i, s) => {
|
|
4
|
+
for (var e = s > 1 ? void 0 : s ? v(o, i) : o, n = a.length - 1, l; n >= 0; n--)
|
|
5
|
+
(l = a[n]) && (e = (s ? l(o, i, e) : l(e)) || e);
|
|
6
|
+
return s && e && f(o, i, e), e;
|
|
7
|
+
};
|
|
8
|
+
let t = class extends d {
|
|
9
|
+
constructor() {
|
|
10
|
+
super(...arguments), this.open = !1, this._savedOverflow = null, this._handleCancel = (a) => {
|
|
11
|
+
a.preventDefault(), this._requestClose();
|
|
12
|
+
}, this._handleBackdropClick = (a) => {
|
|
13
|
+
a.target === this.dialog && this._requestClose();
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
updated(a) {
|
|
17
|
+
a.has("open") && (this.open ? (this._savedOverflow = document.body.style.overflow, this.dialog.showModal(), document.body.style.overflow = "hidden") : this.dialog.open && this._animateClose());
|
|
18
|
+
}
|
|
19
|
+
_animateClose() {
|
|
20
|
+
this.dialog.classList.add("closing");
|
|
21
|
+
const a = (o) => {
|
|
22
|
+
o.target === this.dialog && (this.dialog.removeEventListener("animationend", a), this.dialog.classList.remove("closing"), this.dialog.close(), this._savedOverflow !== null && (document.body.style.overflow = this._savedOverflow, this._savedOverflow = null));
|
|
23
|
+
};
|
|
24
|
+
this.dialog.addEventListener("animationend", a);
|
|
25
|
+
}
|
|
26
|
+
/** Dispatch a cancelable `sw-modal-close`; only close if not prevented. */
|
|
27
|
+
_requestClose() {
|
|
28
|
+
const a = new CustomEvent("sw-modal-close", {
|
|
29
|
+
bubbles: !0,
|
|
30
|
+
composed: !0,
|
|
31
|
+
cancelable: !0
|
|
32
|
+
});
|
|
33
|
+
this.dispatchEvent(a) && (this.open = !1);
|
|
34
|
+
}
|
|
35
|
+
connectedCallback() {
|
|
36
|
+
super.connectedCallback(), this.updateComplete.then(() => {
|
|
37
|
+
this.dialog.addEventListener("cancel", this._handleCancel), this.dialog.addEventListener("click", this._handleBackdropClick);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
disconnectedCallback() {
|
|
41
|
+
super.disconnectedCallback(), this.dialog.removeEventListener("cancel", this._handleCancel), this.dialog.removeEventListener("click", this._handleBackdropClick);
|
|
42
|
+
}
|
|
43
|
+
render() {
|
|
44
|
+
return c`<dialog part="dialog backdrop">
|
|
45
|
+
<div part="panel"><slot></slot></div>
|
|
46
|
+
</dialog>`;
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
t.styles = m`
|
|
50
|
+
:host {
|
|
51
|
+
--sw-modal-duration: 0.2s;
|
|
52
|
+
--sw-modal-animation: bounce-in var(--sw-modal-duration) ease-out;
|
|
53
|
+
--sw-modal-close-animation: bounce-out var(--sw-modal-duration) ease-out;
|
|
54
|
+
--sw-modal-backdrop-animation: backdrop-in var(--sw-modal-duration) ease-out;
|
|
55
|
+
--sw-modal-backdrop-close-animation: backdrop-out var(--sw-modal-duration) ease-out;
|
|
56
|
+
}
|
|
57
|
+
dialog {
|
|
58
|
+
border: none;
|
|
59
|
+
padding: 0;
|
|
60
|
+
background: transparent;
|
|
61
|
+
animation: var(--sw-modal-animation);
|
|
62
|
+
animation-fill-mode: backwards;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
dialog::backdrop {
|
|
66
|
+
background: rgba(0, 0, 0, 0.5);
|
|
67
|
+
animation: var(--sw-modal-backdrop-animation);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
@keyframes bounce-in {
|
|
71
|
+
from {
|
|
72
|
+
opacity: 0;
|
|
73
|
+
transform: scale(0.8) translateY(20px);
|
|
74
|
+
}
|
|
75
|
+
30% {
|
|
76
|
+
opacity: 1;
|
|
77
|
+
}
|
|
78
|
+
70% {
|
|
79
|
+
transform: scale(1.1) translateY(-5px);
|
|
80
|
+
}
|
|
81
|
+
to {
|
|
82
|
+
transform: scale(1) translateY(0);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
@keyframes slide-up {
|
|
86
|
+
from {
|
|
87
|
+
transform: translateY(1000px);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
to {
|
|
91
|
+
transform: translateY(0);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
@keyframes backdrop-in {
|
|
96
|
+
from {
|
|
97
|
+
opacity: 0;
|
|
98
|
+
}
|
|
99
|
+
to {
|
|
100
|
+
opacity: 1;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
@keyframes bounce-out {
|
|
105
|
+
from {
|
|
106
|
+
opacity: 1;
|
|
107
|
+
transform: scale(1) translateY(0);
|
|
108
|
+
}
|
|
109
|
+
30% {
|
|
110
|
+
transform: scale(1.1) translateY(-5px);
|
|
111
|
+
}
|
|
112
|
+
70% {
|
|
113
|
+
opacity: 1;
|
|
114
|
+
}
|
|
115
|
+
to {
|
|
116
|
+
opacity: 0;
|
|
117
|
+
transform: scale(0.8) translateY(20px);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
@keyframes backdrop-out {
|
|
122
|
+
from {
|
|
123
|
+
opacity: 1;
|
|
124
|
+
}
|
|
125
|
+
to {
|
|
126
|
+
opacity: 0;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
dialog.closing {
|
|
131
|
+
animation: var(--sw-modal-close-animation);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
dialog.closing::backdrop {
|
|
135
|
+
animation: var(--sw-modal-backdrop-close-animation);
|
|
136
|
+
}
|
|
137
|
+
`;
|
|
138
|
+
r([
|
|
139
|
+
p({ type: Boolean, reflect: !0 })
|
|
140
|
+
], t.prototype, "open", 2);
|
|
141
|
+
r([
|
|
142
|
+
u("dialog")
|
|
143
|
+
], t.prototype, "dialog", 2);
|
|
144
|
+
t = r([
|
|
145
|
+
h("sw-ui-modal")
|
|
146
|
+
], t);
|
|
147
|
+
export {
|
|
148
|
+
t as SwUiModal
|
|
149
|
+
};
|
|
150
|
+
//# sourceMappingURL=sw-ui-modal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sw-ui-modal.js","sources":["../../../../src/components/UI/layout/sw-ui-modal.ts"],"sourcesContent":["import { LitElement, css, html } from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\n\n/**\n * Wrap elements with this to make them modal.\n *\n * @slot - Dialog content.\n * @fires sw-modal-close - Cancelable. Fired on ESC or backdrop click; call\n * `preventDefault()` to keep the modal open.\n */\n\n@customElement('sw-ui-modal')\nexport class SwUiModal extends LitElement {\n static styles = css`\n :host {\n --sw-modal-duration: 0.2s;\n --sw-modal-animation: bounce-in var(--sw-modal-duration) ease-out;\n --sw-modal-close-animation: bounce-out var(--sw-modal-duration) ease-out;\n --sw-modal-backdrop-animation: backdrop-in var(--sw-modal-duration) ease-out;\n --sw-modal-backdrop-close-animation: backdrop-out var(--sw-modal-duration) ease-out;\n }\n dialog {\n border: none;\n padding: 0;\n background: transparent;\n animation: var(--sw-modal-animation);\n animation-fill-mode: backwards;\n }\n\n dialog::backdrop {\n background: rgba(0, 0, 0, 0.5);\n animation: var(--sw-modal-backdrop-animation);\n }\n\n @keyframes bounce-in {\n from {\n opacity: 0;\n transform: scale(0.8) translateY(20px);\n }\n 30% {\n opacity: 1;\n }\n 70% {\n transform: scale(1.1) translateY(-5px);\n }\n to {\n transform: scale(1) translateY(0);\n }\n }\n @keyframes slide-up {\n from {\n transform: translateY(1000px);\n }\n\n to {\n transform: translateY(0);\n }\n }\n\n @keyframes backdrop-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n }\n\n @keyframes bounce-out {\n from {\n opacity: 1;\n transform: scale(1) translateY(0);\n }\n 30% {\n transform: scale(1.1) translateY(-5px);\n }\n 70% {\n opacity: 1;\n }\n to {\n opacity: 0;\n transform: scale(0.8) translateY(20px);\n }\n }\n\n @keyframes backdrop-out {\n from {\n opacity: 1;\n }\n to {\n opacity: 0;\n }\n }\n\n dialog.closing {\n animation: var(--sw-modal-close-animation);\n }\n\n dialog.closing::backdrop {\n animation: var(--sw-modal-backdrop-close-animation);\n }\n `;\n\n @property({ type: Boolean, reflect: true })\n open = false;\n\n @query('dialog')\n private dialog!: HTMLDialogElement;\n\n private _savedOverflow: string | null = null;\n\n updated(changed: Map<string, unknown>) {\n if (changed.has('open')) {\n if (this.open) {\n this._savedOverflow = document.body.style.overflow;\n this.dialog.showModal();\n document.body.style.overflow = 'hidden';\n } else if (this.dialog.open) {\n this._animateClose();\n }\n }\n }\n\n private _animateClose(): void {\n this.dialog.classList.add('closing');\n const onClose = (e: AnimationEvent) => {\n if (e.target !== this.dialog) return;\n this.dialog.removeEventListener('animationend', onClose);\n this.dialog.classList.remove('closing');\n this.dialog.close();\n if (this._savedOverflow !== null) {\n document.body.style.overflow = this._savedOverflow;\n this._savedOverflow = null;\n }\n };\n this.dialog.addEventListener('animationend', onClose);\n }\n\n /** ESC key — intercept native close and route through `_requestClose`. */\n private _handleCancel = (e: Event): void => {\n e.preventDefault();\n this._requestClose();\n };\n\n /** Backdrop click — the `<dialog>` itself is the backdrop target. */\n private _handleBackdropClick = (e: MouseEvent): void => {\n if (e.target === this.dialog) {\n this._requestClose();\n }\n };\n\n /** Dispatch a cancelable `sw-modal-close`; only close if not prevented. */\n private _requestClose(): void {\n const ev = new CustomEvent('sw-modal-close', {\n bubbles: true,\n composed: true,\n cancelable: true,\n });\n if (this.dispatchEvent(ev)) {\n this.open = false;\n }\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n this.updateComplete.then(() => {\n this.dialog.addEventListener('cancel', this._handleCancel);\n this.dialog.addEventListener('click', this._handleBackdropClick);\n });\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.dialog.removeEventListener('cancel', this._handleCancel);\n this.dialog.removeEventListener('click', this._handleBackdropClick);\n }\n\n render() {\n return html`<dialog part=\"dialog backdrop\">\n <div part=\"panel\"><slot></slot></div>\n </dialog>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'sw-ui-modal': SwUiModal;\n }\n}\n"],"names":["SwUiModal","LitElement","e","changed","onClose","ev","html","css","__decorateClass","property","query","customElement"],"mappings":";;;;;;;AAYO,IAAMA,IAAN,cAAwBC,EAAW;AAAA,EAAnC,cAAA;AAAA,UAAA,GAAA,SAAA,GA4FL,KAAA,OAAO,IAKP,KAAQ,iBAAgC,MA8BxC,KAAQ,gBAAgB,CAACC,MAAmB;AAC1C,MAAAA,EAAE,eAAA,GACF,KAAK,cAAA;AAAA,IACP,GAGA,KAAQ,uBAAuB,CAACA,MAAwB;AACtD,MAAIA,EAAE,WAAW,KAAK,UACpB,KAAK,cAAA;AAAA,IAET;AAAA,EAAA;AAAA,EAtCA,QAAQC,GAA+B;AACrC,IAAIA,EAAQ,IAAI,MAAM,MAChB,KAAK,QACP,KAAK,iBAAiB,SAAS,KAAK,MAAM,UAC1C,KAAK,OAAO,UAAA,GACZ,SAAS,KAAK,MAAM,WAAW,YACtB,KAAK,OAAO,QACrB,KAAK,cAAA;AAAA,EAGX;AAAA,EAEQ,gBAAsB;AAC5B,SAAK,OAAO,UAAU,IAAI,SAAS;AACnC,UAAMC,IAAU,CAACF,MAAsB;AACrC,MAAIA,EAAE,WAAW,KAAK,WACtB,KAAK,OAAO,oBAAoB,gBAAgBE,CAAO,GACvD,KAAK,OAAO,UAAU,OAAO,SAAS,GACtC,KAAK,OAAO,MAAA,GACR,KAAK,mBAAmB,SAC1B,SAAS,KAAK,MAAM,WAAW,KAAK,gBACpC,KAAK,iBAAiB;AAAA,IAE1B;AACA,SAAK,OAAO,iBAAiB,gBAAgBA,CAAO;AAAA,EACtD;AAAA;AAAA,EAgBQ,gBAAsB;AAC5B,UAAMC,IAAK,IAAI,YAAY,kBAAkB;AAAA,MAC3C,SAAS;AAAA,MACT,UAAU;AAAA,MACV,YAAY;AAAA,IAAA,CACb;AACD,IAAI,KAAK,cAAcA,CAAE,MACvB,KAAK,OAAO;AAAA,EAEhB;AAAA,EAEA,oBAA0B;AACxB,UAAM,kBAAA,GACN,KAAK,eAAe,KAAK,MAAM;AAC7B,WAAK,OAAO,iBAAiB,UAAU,KAAK,aAAa,GACzD,KAAK,OAAO,iBAAiB,SAAS,KAAK,oBAAoB;AAAA,IACjE,CAAC;AAAA,EACH;AAAA,EAEA,uBAA6B;AAC3B,UAAM,qBAAA,GACN,KAAK,OAAO,oBAAoB,UAAU,KAAK,aAAa,GAC5D,KAAK,OAAO,oBAAoB,SAAS,KAAK,oBAAoB;AAAA,EACpE;AAAA,EAEA,SAAS;AACP,WAAOC;AAAA;AAAA;AAAA,EAGT;AACF;AA1KaN,EACJ,SAASO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2FhBC,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GA3F/BT,EA4FX,WAAA,QAAA,CAAA;AAGQQ,EAAA;AAAA,EADPE,EAAM,QAAQ;AAAA,GA9FJV,EA+FH,WAAA,UAAA,CAAA;AA/FGA,IAANQ,EAAA;AAAA,EADNG,EAAc,aAAa;AAAA,GACfX,CAAA;"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { LitElement } from 'lit';
|
|
2
|
+
/**
|
|
3
|
+
* Resizes itself to an appropriate modal size based on viewport size
|
|
4
|
+
* @slot items to hold inside responsive modal
|
|
5
|
+
*/
|
|
6
|
+
export declare class SwUiResponsiveContainer extends LitElement {
|
|
7
|
+
static styles: import("lit").CSSResult;
|
|
8
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
9
|
+
}
|
|
10
|
+
declare global {
|
|
11
|
+
interface HTMLElementTagNameMap {
|
|
12
|
+
'sw-ui-responsive-container': SwUiResponsiveContainer;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=sw-ui-responsive-container.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sw-ui-responsive-container.d.ts","sourceRoot":"","sources":["../../../../src/components/UI/layout/sw-ui-responsive-container.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAG5C;;;GAGG;AACH,qBACa,uBAAwB,SAAQ,UAAU;IACrD,MAAM,CAAC,MAAM,0BA0DX;IAEF,MAAM;CAGP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,4BAA4B,EAAE,uBAAuB,CAAC;KACvD;CACF"}
|