@limetech/lime-elements 37.64.2 → 37.64.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +26 -0
- package/dist/cjs/limel-action-bar_4.cjs.entry.js +1 -1
- package/dist/cjs/limel-action-bar_4.cjs.entry.js.map +1 -1
- package/dist/cjs/limel-breadcrumbs_5.cjs.entry.js +3 -3
- package/dist/cjs/limel-breadcrumbs_5.cjs.entry.js.map +1 -1
- package/dist/cjs/limel-button-group.cjs.entry.js +1 -1
- package/dist/cjs/limel-button-group.cjs.entry.js.map +1 -1
- package/dist/cjs/limel-button.cjs.entry.js +1 -1
- package/dist/cjs/limel-button.cjs.entry.js.map +1 -1
- package/dist/cjs/limel-checkbox.cjs.entry.js +1 -1
- package/dist/cjs/limel-checkbox.cjs.entry.js.map +1 -1
- package/dist/cjs/limel-chip_2.cjs.entry.js +2 -2
- package/dist/cjs/limel-chip_2.cjs.entry.js.map +1 -1
- package/dist/cjs/limel-code-editor.cjs.entry.js +1 -1
- package/dist/cjs/limel-code-editor.cjs.entry.js.map +1 -1
- package/dist/cjs/limel-color-picker-palette.cjs.entry.js +1 -1
- package/dist/cjs/limel-color-picker-palette.cjs.entry.js.map +1 -1
- package/dist/cjs/limel-color-picker.cjs.entry.js +1 -1
- package/dist/cjs/limel-color-picker.cjs.entry.js.map +1 -1
- package/dist/cjs/limel-dock-button.cjs.entry.js +1 -1
- package/dist/cjs/limel-dock-button.cjs.entry.js.map +1 -1
- package/dist/cjs/limel-dock.cjs.entry.js +1 -1
- package/dist/cjs/limel-dock.cjs.entry.js.map +1 -1
- package/dist/cjs/limel-dynamic-label_4.cjs.entry.js +3 -3
- package/dist/cjs/limel-dynamic-label_4.cjs.entry.js.map +1 -1
- package/dist/cjs/limel-file-viewer.cjs.entry.js +1 -1
- package/dist/cjs/limel-file-viewer.cjs.entry.js.map +1 -1
- package/dist/cjs/limel-flatpickr-adapter.cjs.entry.js +1 -1
- package/dist/cjs/limel-flatpickr-adapter.cjs.entry.js.map +1 -1
- package/dist/cjs/limel-help.cjs.entry.js +1 -1
- package/dist/cjs/limel-help.cjs.entry.js.map +1 -1
- package/dist/cjs/limel-icon-button.cjs.entry.js +1 -1
- package/dist/cjs/limel-icon-button.cjs.entry.js.map +1 -1
- package/dist/cjs/limel-info-tile.cjs.entry.js +1 -1
- package/dist/cjs/limel-info-tile.cjs.entry.js.map +1 -1
- package/dist/cjs/limel-select.cjs.entry.js +1 -1
- package/dist/cjs/limel-select.cjs.entry.js.map +1 -1
- package/dist/cjs/limel-shortcut.cjs.entry.js +1 -1
- package/dist/cjs/limel-shortcut.cjs.entry.js.map +1 -1
- package/dist/cjs/limel-split-button.cjs.entry.js +1 -1
- package/dist/cjs/limel-split-button.cjs.entry.js.map +1 -1
- package/dist/cjs/limel-switch.cjs.entry.js +1 -1
- package/dist/cjs/limel-switch.cjs.entry.js.map +1 -1
- package/dist/cjs/limel-table.cjs.entry.js +1 -1
- package/dist/cjs/limel-table.cjs.entry.js.map +1 -1
- package/dist/collection/components/action-bar/action-bar-item/action-bar-item.css +16 -2
- package/dist/collection/components/breadcrumbs/breadcrumbs.css +16 -2
- package/dist/collection/components/button/button.css +16 -2
- package/dist/collection/components/button-group/button-group.css +16 -2
- package/dist/collection/components/checkbox/checkbox.css +9 -0
- package/dist/collection/components/chip/chip.css +32 -4
- package/dist/collection/components/chip-set/chip-set.css +16 -2
- package/dist/collection/components/code-editor/code-editor.css +16 -2
- package/dist/collection/components/color-picker/color-picker-palette.css +16 -2
- package/dist/collection/components/color-picker/color-picker.css +16 -2
- package/dist/collection/components/date-picker/flatpickr-adapter/flatpickr-adapter.css +78 -6
- package/dist/collection/components/dock/dock-button/dock-button.css +16 -2
- package/dist/collection/components/dock/dock.css +16 -2
- package/dist/collection/components/dynamic-label/dynamic-label.css +4 -64
- package/dist/collection/components/dynamic-label/dynamic-label.js +1 -1
- package/dist/collection/components/dynamic-label/dynamic-label.js.map +1 -1
- package/dist/collection/components/file-viewer/file-viewer.css +16 -2
- package/dist/collection/components/help/help.css +16 -2
- package/dist/collection/components/icon-button/icon-button.css +16 -2
- package/dist/collection/components/info-tile/info-tile.css +16 -2
- package/dist/collection/components/input-field/input-field.css +16 -2
- package/dist/collection/components/list/list.css +34 -2
- package/dist/collection/components/menu-list/menu-list.css +34 -2
- package/dist/collection/components/select/select.css +16 -2
- package/dist/collection/components/shortcut/shortcut.css +16 -2
- package/dist/collection/components/split-button/split-button.css +16 -2
- package/dist/collection/components/switch/switch.css +7 -3
- package/dist/collection/components/table/table.css +16 -2
- package/dist/collection/style/color-palette-extended.css +25 -25
- package/dist/collection/style/mixins.scss +90 -24
- package/dist/collection/style/shadows.scss +59 -175
- package/dist/esm/limel-action-bar_4.entry.js +1 -1
- package/dist/esm/limel-action-bar_4.entry.js.map +1 -1
- package/dist/esm/limel-breadcrumbs_5.entry.js +3 -3
- package/dist/esm/limel-breadcrumbs_5.entry.js.map +1 -1
- package/dist/esm/limel-button-group.entry.js +1 -1
- package/dist/esm/limel-button-group.entry.js.map +1 -1
- package/dist/esm/limel-button.entry.js +1 -1
- package/dist/esm/limel-button.entry.js.map +1 -1
- package/dist/esm/limel-checkbox.entry.js +1 -1
- package/dist/esm/limel-checkbox.entry.js.map +1 -1
- package/dist/esm/limel-chip_2.entry.js +2 -2
- package/dist/esm/limel-chip_2.entry.js.map +1 -1
- package/dist/esm/limel-code-editor.entry.js +1 -1
- package/dist/esm/limel-code-editor.entry.js.map +1 -1
- package/dist/esm/limel-color-picker-palette.entry.js +1 -1
- package/dist/esm/limel-color-picker-palette.entry.js.map +1 -1
- package/dist/esm/limel-color-picker.entry.js +1 -1
- package/dist/esm/limel-color-picker.entry.js.map +1 -1
- package/dist/esm/limel-dock-button.entry.js +1 -1
- package/dist/esm/limel-dock-button.entry.js.map +1 -1
- package/dist/esm/limel-dock.entry.js +1 -1
- package/dist/esm/limel-dock.entry.js.map +1 -1
- package/dist/esm/limel-dynamic-label_4.entry.js +3 -3
- package/dist/esm/limel-dynamic-label_4.entry.js.map +1 -1
- package/dist/esm/limel-file-viewer.entry.js +1 -1
- package/dist/esm/limel-file-viewer.entry.js.map +1 -1
- package/dist/esm/limel-flatpickr-adapter.entry.js +1 -1
- package/dist/esm/limel-flatpickr-adapter.entry.js.map +1 -1
- package/dist/esm/limel-help.entry.js +1 -1
- package/dist/esm/limel-help.entry.js.map +1 -1
- package/dist/esm/limel-icon-button.entry.js +1 -1
- package/dist/esm/limel-icon-button.entry.js.map +1 -1
- package/dist/esm/limel-info-tile.entry.js +1 -1
- package/dist/esm/limel-info-tile.entry.js.map +1 -1
- package/dist/esm/limel-select.entry.js +1 -1
- package/dist/esm/limel-select.entry.js.map +1 -1
- package/dist/esm/limel-shortcut.entry.js +1 -1
- package/dist/esm/limel-shortcut.entry.js.map +1 -1
- package/dist/esm/limel-split-button.entry.js +1 -1
- package/dist/esm/limel-split-button.entry.js.map +1 -1
- package/dist/esm/limel-switch.entry.js +1 -1
- package/dist/esm/limel-switch.entry.js.map +1 -1
- package/dist/esm/limel-table.entry.js +1 -1
- package/dist/esm/limel-table.entry.js.map +1 -1
- package/dist/lime-elements/lime-elements.css +42 -49
- package/dist/lime-elements/lime-elements.esm.js +1 -1
- package/dist/lime-elements/p-09434f79.entry.js +2 -0
- package/dist/lime-elements/{p-1367c295.entry.js.map → p-09434f79.entry.js.map} +1 -1
- package/dist/lime-elements/p-0af1417f.entry.js +2 -0
- package/dist/lime-elements/{p-d9b7a208.entry.js.map → p-0af1417f.entry.js.map} +1 -1
- package/dist/lime-elements/p-0ec43bbc.entry.js +134 -0
- package/dist/lime-elements/{p-56f23a19.entry.js.map → p-0ec43bbc.entry.js.map} +1 -1
- package/dist/lime-elements/p-1a0aaf41.entry.js +2 -0
- package/dist/lime-elements/{p-31a0bdac.entry.js.map → p-1a0aaf41.entry.js.map} +1 -1
- package/dist/lime-elements/p-211456f2.entry.js +2 -0
- package/dist/lime-elements/{p-f60702fd.entry.js.map → p-211456f2.entry.js.map} +1 -1
- package/dist/lime-elements/{p-dab818a1.entry.js → p-259c1bef.entry.js} +2 -2
- package/dist/lime-elements/{p-dab818a1.entry.js.map → p-259c1bef.entry.js.map} +1 -1
- package/dist/lime-elements/{p-20440a35.entry.js → p-27cc1f9e.entry.js} +3 -3
- package/dist/lime-elements/{p-20440a35.entry.js.map → p-27cc1f9e.entry.js.map} +1 -1
- package/dist/lime-elements/{p-11d775ca.entry.js → p-28c76ae8.entry.js} +2 -2
- package/dist/lime-elements/{p-11d775ca.entry.js.map → p-28c76ae8.entry.js.map} +1 -1
- package/dist/lime-elements/p-32844d2b.entry.js +2 -0
- package/dist/lime-elements/{p-7d215789.entry.js.map → p-32844d2b.entry.js.map} +1 -1
- package/dist/lime-elements/p-493e2b10.entry.js +2 -0
- package/dist/lime-elements/{p-c1cbba2c.entry.js.map → p-493e2b10.entry.js.map} +1 -1
- package/dist/lime-elements/p-609b34fd.entry.js +2 -0
- package/dist/lime-elements/{p-968c49d9.entry.js.map → p-609b34fd.entry.js.map} +1 -1
- package/dist/lime-elements/p-6500050d.entry.js +2 -0
- package/dist/lime-elements/{p-eb5ff7ca.entry.js.map → p-6500050d.entry.js.map} +1 -1
- package/dist/lime-elements/p-732daad9.entry.js +68 -0
- package/dist/lime-elements/{p-d86f8aea.entry.js.map → p-732daad9.entry.js.map} +1 -1
- package/dist/lime-elements/{p-e973fd15.entry.js → p-782aa617.entry.js} +2 -2
- package/dist/lime-elements/{p-e973fd15.entry.js.map → p-782aa617.entry.js.map} +1 -1
- package/dist/lime-elements/{p-3cd95c9f.entry.js → p-84e87a39.entry.js} +2 -2
- package/dist/lime-elements/{p-3cd95c9f.entry.js.map → p-84e87a39.entry.js.map} +1 -1
- package/dist/lime-elements/p-8f1b76df.entry.js +2 -0
- package/dist/lime-elements/{p-48652dbe.entry.js.map → p-8f1b76df.entry.js.map} +1 -1
- package/dist/lime-elements/{p-7a202104.entry.js → p-9c5f2c45.entry.js} +2 -2
- package/dist/lime-elements/{p-7a202104.entry.js.map → p-9c5f2c45.entry.js.map} +1 -1
- package/dist/lime-elements/{p-497b65ba.entry.js → p-9c92c1db.entry.js} +3 -3
- package/dist/lime-elements/{p-497b65ba.entry.js.map → p-9c92c1db.entry.js.map} +1 -1
- package/dist/lime-elements/p-d49faced.entry.js +2 -0
- package/dist/lime-elements/p-d49faced.entry.js.map +1 -0
- package/dist/lime-elements/p-dbac0053.entry.js +2 -0
- package/dist/lime-elements/{p-484ecb49.entry.js.map → p-dbac0053.entry.js.map} +1 -1
- package/dist/lime-elements/p-f3a613a3.entry.js +2 -0
- package/dist/lime-elements/{p-6b2bc81b.entry.js.map → p-f3a613a3.entry.js.map} +1 -1
- package/dist/lime-elements/p-fda881a3.entry.js +2 -0
- package/dist/lime-elements/{p-5d01dc2a.entry.js.map → p-fda881a3.entry.js.map} +1 -1
- package/dist/lime-elements/style/color-palette-extended.css +25 -25
- package/dist/lime-elements/style/mixins.scss +90 -24
- package/dist/lime-elements/style/shadows.scss +59 -175
- package/dist/scss/mixins.scss +90 -24
- package/package.json +9 -9
- package/dist/lime-elements/p-126ed7d5.entry.js +0 -2
- package/dist/lime-elements/p-126ed7d5.entry.js.map +0 -1
- package/dist/lime-elements/p-1367c295.entry.js +0 -2
- package/dist/lime-elements/p-31a0bdac.entry.js +0 -2
- package/dist/lime-elements/p-484ecb49.entry.js +0 -2
- package/dist/lime-elements/p-48652dbe.entry.js +0 -2
- package/dist/lime-elements/p-56f23a19.entry.js +0 -134
- package/dist/lime-elements/p-5d01dc2a.entry.js +0 -2
- package/dist/lime-elements/p-6b2bc81b.entry.js +0 -2
- package/dist/lime-elements/p-7d215789.entry.js +0 -2
- package/dist/lime-elements/p-968c49d9.entry.js +0 -2
- package/dist/lime-elements/p-c1cbba2c.entry.js +0 -2
- package/dist/lime-elements/p-d86f8aea.entry.js +0 -68
- package/dist/lime-elements/p-d9b7a208.entry.js +0 -2
- package/dist/lime-elements/p-eb5ff7ca.entry.js +0 -2
- package/dist/lime-elements/p-f60702fd.entry.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["detectExtension","fileName","url","pathLike","extension","split","pop","toLowerCase","extensionsToTypes","pdf","jpg","jpeg","heic","bmp","png","gif","svg","svgz","ep","eps","avi","flv","h264","mov","mp4","mwv","mkv","mp3","wav","wma","ogg","txt","json","html","xml","doc","docx","odt","dot","dotx","docm","dotm","pot","ppt","pptx","odp","potx","potm","pps","ppsx","ppsm","pptm","ppam","pages","xls","xlsx","xlsm","xlsb","ods","csv","numbers","Fullscreen","constructor","element","this","requestFullscreen","enter","exitFullscreen","exit","bind","window","document","toggle","isFullscreen","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","msFullscreenElement","msRequestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","msExitFullscreen","mozCancelFullScreen","webkitExitFullscreen","isSupported","fileViewerCss","FileViewer","hostRef","renderPdf","h","class","renderActionMenu","src","fileUrl","loading","renderImage","renderButtons","alt","renderVideo","controls","renderAudio","renderText","data","type","renderOffice","getOfficeViewerUrl","isOfficeFileAccessibleViaURL","fileType","startsWith","officeViewers","officeViewer","renderNoFileSupportMessage","name","size","role","getTranslation","renderDownloadButton","renderToggleFullscreenButton","renderOpenInNewTabButton","allowFullscreen","fullscreen","icon","label","id","onClick","handleToggleFullscreen","elementId","openDirection","allowDownload","download","filename","href","target","allowOpenInNewTab","rel","actions","items","onSelect","emitOnAction","slot","createURL","async","includes","response","fetch","blob","URL","createObjectURL","event","stopPropagation","action","emit","detail","HostElement","render","limeBranded","renderFileViewer","newUrl","oldUrl","fileViewerFunctions","image","video","audio","text","office","fileViewerFunction","key","translate","get","language"],"sources":["./src/components/file-viewer/extension-mapping.tsx","./src/components/file-viewer/fullscreen.ts","./src/components/file-viewer/file-viewer.scss?tag=limel-file-viewer&encapsulation=shadow","./src/components/file-viewer/file-viewer.tsx"],"sourcesContent":["export function detectExtension(fileName, url): any {\n const pathLike = fileName || url;\n if (!pathLike) {\n return 'unknown';\n }\n\n const extension = pathLike.split('.').pop().toLowerCase();\n const extensionsToTypes = {\n pdf: 'pdf',\n jpg: 'image',\n jpeg: 'image',\n heic: 'image',\n bmp: 'image',\n png: 'image',\n gif: 'image',\n svg: 'image',\n svgz: 'image',\n ep: 'image',\n eps: 'image',\n avi: 'video',\n flv: 'video',\n h264: 'video',\n mov: 'video',\n mp4: 'video',\n mwv: 'video',\n mkv: 'video',\n mp3: 'audio',\n wav: 'audio',\n wma: 'audio',\n ogg: 'audio',\n txt: 'text',\n json: 'text',\n html: 'text',\n xml: 'text',\n // Word\n doc: 'office',\n docx: 'office',\n odt: 'office',\n dot: 'office',\n dotx: 'office',\n docm: 'office', // not supported\n dotm: 'office', // not yet tested\n // Presentation\n pot: 'office', // not tested\n ppt: 'office',\n pptx: 'office',\n odp: 'office',\n potx: 'office', // not supported\n potm: 'office', // not supported\n pps: 'office',\n ppsx: 'office',\n ppsm: 'office', // not supported\n pptm: 'office', // not supported\n ppam: 'office', // not tested\n pages: 'office', // not supported (Apple)\n // Spreadsheet\n xls: 'office',\n xlsx: 'office',\n xlsm: 'office',\n xlsb: 'office',\n ods: 'office',\n csv: 'office', // not supported\n numbers: 'office', // not supported (Apple)\n };\n\n return extensionsToTypes[extension] || 'unknown';\n}\n","export class Fullscreen {\n private enter: () => void;\n private exit: () => void;\n\n constructor(element: any) {\n this.enter =\n element.requestFullscreen ||\n element.msRequestFullscreen ||\n element.mozRequestFullScreen ||\n element.webkitRequestFullscreen;\n this.enter = this.enter.bind(element);\n const doc: any = window.document;\n this.exit =\n doc.exitFullscreen ||\n doc.msExitFullscreen ||\n doc.mozCancelFullScreen ||\n doc.webkitExitFullscreen;\n }\n\n public requestFullscreen = () => {\n if (this.enter) {\n this.enter();\n }\n };\n\n public exitFullscreen = () => {\n if (this.exit) {\n this.exit.bind(window.document)();\n }\n };\n\n public toggle = () => {\n const doc: any = window.document;\n const isFullscreen =\n doc.fullscreenElement ||\n doc.mozFullScreenElement ||\n doc.webkitFullscreenElement ||\n doc.msFullscreenElement;\n\n if (isFullscreen) {\n this.exitFullscreen();\n } else {\n this.requestFullscreen();\n }\n };\n\n public isSupported(): boolean {\n return !!this.requestFullscreen;\n }\n}\n","@use '../../style/internal/variables';\n@use '../../style/internal/shared_input-select-picker';\n@use '../../style/mixins';\n\n$size-of-buttons: 2rem;\n\n:host {\n isolation: isolate;\n position: relative;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n}\n\n* {\n box-sizing: border-box;\n}\n\nimg,\nvideo,\naudio,\nobject,\niframe {\n max-height: 100%;\n max-width: 100%;\n box-sizing: border-box;\n}\n\niframe {\n border: none;\n width: 100%;\n height: 100%;\n min-height: 20rem; // makes sure to get minimum comfortable space for viewing office files, and Microsoft Office viewers toolbars\n}\n\nimg {\n min-width: 7rem;\n object-fit: contain; // increases or decreases the size of the image to fill the box whilst preserving its aspect-ratio.\n}\n\nvideo {\n width: 100%;\n height: auto;\n}\n\naudio {\n width: 100%;\n}\n\nobject {\n width: 100%;\n height: 100%;\n}\n\nobject[type='application/pdf'] {\n min-height: 20rem;\n // makes sure to get browsers' native controls for the PDF\n}\n\nobject[type='text/plain'] {\n border-radius: 0.25rem;\n padding-right: $size-of-buttons;\n\n overflow-y: auto;\n}\n\n@mixin plain-text-in-fullscreen {\n background-color: rgb(var(--color-gray-darker));\n\n object[type='text/plain'] {\n max-width: 50rem;\n max-height: calc(100% - 2rem);\n }\n}\n\n:host(:fullscreen) {\n @include plain-text-in-fullscreen;\n}\n:host(:-webkit-full-screen) {\n // this is repetition of the previous block,\n // but needed for Safari to work.\n // Cannot write SCSS rules for `:host` using commas for some reason.\n // e.g.: `:host(:fullscreen), :host(:-webkit-full-screen)`.\n // So you have to repeat it sadly.\n @include plain-text-in-fullscreen;\n}\n\n@import './partial-styles/ui-controls.scss';\n","import {\n Component,\n Element,\n h,\n Prop,\n State,\n Event,\n EventEmitter,\n Watch,\n} from '@stencil/core';\nimport { Languages } from '../date-picker/date.types';\nimport { ListItem } from '../list/list-item.types';\nimport translate from '../../global/translations';\nimport { detectExtension } from './extension-mapping';\nimport { Fullscreen } from './fullscreen';\nimport { FileType, OfficeViewer } from './file-viewer.types';\nimport { LimelMenuCustomEvent } from '../../components';\n\n/**\n * This is a smart component that automatically detects\n * the most common file types such as image, audio, video, and text,\n * and properly displays them in the browser.\n * The component is also capable to render the most common office files.\n *\n * :::note\n * Image files will always be contained in their containers, which means\n * they automatically increase or decrease in size to fill their containing box\n * whilst preserving their aspect-ratio.\n *\n * Text and PDF files will also always respect the width and height of the\n * container in which the `limel-file-viewer` is loaded.\n * :::\n *\n * For some file types such as text and images, the component will display a\n * download button and a button to open the file in a new browser tab.\n * This will allow users to preview the file in a fullscreen mode with the\n * browser and take advantage of for example native zooming and panning\n * functionalities.\n *\n * @exampleComponent limel-example-file-viewer\n * @exampleComponent limel-example-file-viewer-office\n * @exampleComponent limel-example-file-viewer-filename\n * @exampleComponent limel-example-file-viewer-inbuilt-actions\n * @exampleComponent limel-example-file-viewer-custom-actions\n * @exampleComponent limel-example-file-viewer-with-picker\n * @private\n */\n\n@Component({\n tag: 'limel-file-viewer',\n shadow: true,\n styleUrl: 'file-viewer.scss',\n})\nexport class FileViewer {\n /**\n * Link to the file\n */\n @Prop({ reflect: true })\n public url: string;\n\n /**\n * The name of the file that must also contains its extension.\n * This overrides the filename that the `url` ends with.\n * Useful when the `url` does not contain the filename.\n * When specified, the `filename` will be used as filename of\n * the downloaded file.\n */\n @Prop({ reflect: true })\n public filename?: string;\n\n /**\n * An optional alternative text, mainly for assistive technologies and screen readers.\n * It is used for only image files, as an `alt` attribute.\n * Should optimally hold a description of the image,\n * which is also displayed on the page if the image can't be loaded for some reason.\n */\n @Prop({ reflect: true })\n public alt?: string;\n\n /**\n * Displays a button that allows the user to view the file\n * in fullscreen mode.\n * Not displayed for office files!\n */\n @Prop({ reflect: true })\n public allowFullscreen?: boolean = false;\n\n /**\n * Displays a button that allows the user to open the file\n * in a new browser tab.\n * Not displayed for office files!\n */\n @Prop({ reflect: true })\n public allowOpenInNewTab?: boolean = false;\n\n /**\n * Displays a button that allows the user to download the file.\n * Note that due to the browser's security policies,\n * the file should be hosted on the same domain\n * for the download button to work properly.\n * Not displayed for office files!\n */\n @Prop({ reflect: true })\n public allowDownload?: boolean = false;\n\n /**\n * Defines the localization for translations.\n */\n @Prop()\n public language: Languages = 'en';\n\n /**\n * Defines the third-party viewer that should be used to render\n * the content of office files, such as word processing documents,\n * presentations, or spreadsheets.\n */\n @Prop({ reflect: true })\n public officeViewer: OfficeViewer = 'microsoft-office';\n\n /**\n * An array of custom actions that can be displayed\n * as an action menu on the file which is being displayed.\n */\n @Prop()\n public actions: ListItem[];\n\n /**\n * Emitted when a custom action is selected from the action menu.\n */\n @Event()\n public action: EventEmitter<ListItem>;\n\n @Element()\n public HostElement: HTMLLimelFileViewerElement;\n\n private fullscreen: Fullscreen;\n\n @State()\n private isFullscreen: boolean = false;\n\n @State()\n private fileType: FileType;\n\n /**\n * True while the file is being loaded.\n */\n @State()\n private loading: boolean = true;\n\n @State()\n private fileUrl: string = '';\n\n constructor() {\n this.fullscreen = new Fullscreen(this.HostElement);\n }\n\n public async componentWillLoad() {\n this.fileType = detectExtension(this.filename, this.url);\n await this.createURL(this.fileType);\n }\n\n public render() {\n if (!this.isOfficeFileAccessibleViaURL) {\n return this.renderNoFileSupportMessage();\n }\n\n if (this.loading) {\n return <limel-spinner size=\"x-small\" limeBranded={false} />;\n }\n\n return this.renderFileViewer();\n }\n\n @Watch('url')\n protected async watchUrl(newUrl: string, oldUrl: string) {\n if (newUrl === oldUrl) {\n return;\n }\n\n this.loading = true;\n this.fileType = detectExtension(this.filename, this.fileUrl);\n await this.createURL(this.fileType);\n }\n\n private renderFileViewer() {\n const fileViewerFunctions = {\n pdf: this.renderPdf,\n image: this.renderImage,\n video: this.renderVideo,\n audio: this.renderAudio,\n text: this.renderText,\n office: this.renderOffice,\n };\n const fileViewerFunction =\n fileViewerFunctions[this.fileType] ||\n this.renderNoFileSupportMessage;\n\n return fileViewerFunction();\n }\n\n private renderPdf = () => {\n return [\n <div class=\"action-menu-for-pdf-files\">\n {this.renderActionMenu()}\n </div>,\n <iframe src={this.fileUrl} loading=\"lazy\" />,\n ];\n };\n\n private renderImage = () => {\n return [\n this.renderButtons(),\n <img src={this.fileUrl} alt={this.alt} loading=\"lazy\" />,\n ];\n };\n\n private renderVideo = () => {\n return (\n <video controls>\n <source src={this.fileUrl} />\n </video>\n );\n };\n\n private renderAudio = () => {\n return (\n <audio controls>\n <source src={this.fileUrl} />\n </audio>\n );\n };\n\n private renderText = () => {\n return [\n this.renderButtons(),\n <object data={this.fileUrl} type=\"text/plain\" />,\n ];\n };\n\n private renderOffice = () => {\n return [\n <div class=\"action-menu-for-office-files\">\n {this.renderActionMenu()}\n </div>,\n <iframe\n src={\n this.getOfficeViewerUrl() + this.fileUrl + '&embedded=true'\n }\n loading=\"lazy\"\n />,\n ];\n };\n\n private isOfficeFileAccessibleViaURL = () => {\n return (\n this.fileType === 'office' &&\n !(\n this.fileUrl.startsWith('http://') ||\n this.fileUrl.startsWith('https://')\n )\n );\n };\n\n private getOfficeViewerUrl = () => {\n const officeViewers = {\n 'microsoft-office':\n 'https://view.officeapps.live.com/op/embed.aspx?src=',\n 'google-drive': 'https://docs.google.com/gview?url=',\n };\n\n return officeViewers[this.officeViewer];\n };\n\n private renderNoFileSupportMessage = () => {\n return (\n <div class=\"no-support\">\n <limel-icon\n class=\"icon--warning\"\n name=\"brake_warning\"\n size=\"large\"\n role=\"presentation\"\n />\n <p>{this.getTranslation('message.unsupported-filetype')}</p>\n {this.renderDownloadButton()}\n </div>\n );\n };\n\n private renderButtons = () => {\n return (\n <div class=\"buttons\">\n {this.renderActionMenu()}\n {this.renderToggleFullscreenButton()}\n {this.renderDownloadButton()}\n {this.renderOpenInNewTabButton()}\n </div>\n );\n };\n\n private renderToggleFullscreenButton = () => {\n if (!this.allowFullscreen || !this.fullscreen.isSupported()) {\n return;\n }\n\n const icon = this.isFullscreen ? 'multiply' : 'fit_to_width';\n // eslint-disable-next-line multiline-ternary\n const label = this.isFullscreen\n ? // eslint-disable-next-line multiline-ternary\n this.getTranslation('exit-fullscreen')\n : this.getTranslation('open-in-fullscreen');\n\n return [\n <button\n class=\"button--toggle-fullscreen\"\n id=\"tooltip-toggle-fullscreen\"\n role=\"button\"\n onClick={this.handleToggleFullscreen}\n >\n <limel-icon name={icon} />\n <limel-tooltip\n label={label}\n elementId=\"tooltip-toggle-fullscreen\"\n openDirection=\"left\"\n />\n </button>,\n ];\n };\n\n private renderDownloadButton = () => {\n if (!this.allowDownload || this.isFullscreen) {\n return;\n }\n\n return (\n <a\n class=\"button--download\"\n id=\"tooltip-download\"\n role=\"button\"\n download={this.filename ? this.filename : ''}\n href={this.fileUrl}\n target=\"_blank\"\n >\n <limel-icon name=\"download_2\" />\n <limel-tooltip\n label={this.getTranslation('download')}\n elementId=\"tooltip-download\"\n openDirection=\"left\"\n />\n </a>\n );\n };\n\n private renderOpenInNewTabButton = () => {\n if (!this.allowOpenInNewTab || this.isFullscreen) {\n return;\n }\n\n return (\n <a\n class=\"button--new-tab\"\n id=\"tooltip-new-tab\"\n role=\"button\"\n href={this.fileUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <limel-icon name=\"external_link\" />\n <limel-tooltip\n label={this.getTranslation('open-in-new-tab')}\n elementId=\"tooltip-new-tab\"\n openDirection=\"left\"\n />\n </a>\n );\n };\n\n private renderActionMenu = () => {\n if (!this.actions || this.isFullscreen) {\n return;\n }\n\n return (\n <limel-menu\n class=\"action-menu\"\n items={this.actions}\n onSelect={this.emitOnAction}\n open-direction=\"left\"\n >\n <button\n class=\"button--action\"\n id=\"tooltip-more\"\n role=\"button\"\n slot=\"trigger\"\n >\n <limel-icon name=\"menu_2\" />\n <limel-tooltip\n label={this.getTranslation('more-actions')}\n elementId=\"tooltip-more\"\n openDirection=\"left\"\n />\n </button>\n </limel-menu>\n );\n };\n\n private createURL = async (fileType: string) => {\n if (['pdf'].includes(fileType)) {\n const response = await fetch(this.url);\n const blob = await response.blob();\n\n this.fileUrl = URL.createObjectURL(blob);\n } else {\n this.fileUrl = this.url;\n }\n\n this.loading = false;\n };\n\n private handleToggleFullscreen = () => {\n if (this.fullscreen.isSupported()) {\n this.fullscreen.toggle();\n this.isFullscreen = !this.isFullscreen;\n }\n };\n\n private emitOnAction = (event: LimelMenuCustomEvent<ListItem>) => {\n event.stopPropagation();\n this.action.emit(event.detail);\n };\n\n private getTranslation(key: string) {\n return translate.get(`file-viewer.${key}`, this.language);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["detectExtension","fileName","url","pathLike","extension","split","pop","toLowerCase","extensionsToTypes","pdf","jpg","jpeg","heic","bmp","png","gif","svg","svgz","ep","eps","avi","flv","h264","mov","mp4","mwv","mkv","mp3","wav","wma","ogg","txt","json","html","xml","doc","docx","odt","dot","dotx","docm","dotm","pot","ppt","pptx","odp","potx","potm","pps","ppsx","ppsm","pptm","ppam","pages","xls","xlsx","xlsm","xlsb","ods","csv","numbers","Fullscreen","constructor","element","this","requestFullscreen","enter","exitFullscreen","exit","bind","window","document","toggle","isFullscreen","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","msFullscreenElement","msRequestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","msExitFullscreen","mozCancelFullScreen","webkitExitFullscreen","isSupported","fileViewerCss","FileViewer","hostRef","renderPdf","h","class","renderActionMenu","src","fileUrl","loading","renderImage","renderButtons","alt","renderVideo","controls","renderAudio","renderText","data","type","renderOffice","getOfficeViewerUrl","isOfficeFileAccessibleViaURL","fileType","startsWith","officeViewers","officeViewer","renderNoFileSupportMessage","name","size","role","getTranslation","renderDownloadButton","renderToggleFullscreenButton","renderOpenInNewTabButton","allowFullscreen","fullscreen","icon","label","id","onClick","handleToggleFullscreen","elementId","openDirection","allowDownload","download","filename","href","target","allowOpenInNewTab","rel","actions","items","onSelect","emitOnAction","slot","createURL","async","includes","response","fetch","blob","URL","createObjectURL","event","stopPropagation","action","emit","detail","HostElement","render","limeBranded","renderFileViewer","newUrl","oldUrl","fileViewerFunctions","image","video","audio","text","office","fileViewerFunction","key","translate","get","language"],"sources":["./src/components/file-viewer/extension-mapping.tsx","./src/components/file-viewer/fullscreen.ts","./src/components/file-viewer/file-viewer.scss?tag=limel-file-viewer&encapsulation=shadow","./src/components/file-viewer/file-viewer.tsx"],"sourcesContent":["export function detectExtension(fileName, url): any {\n const pathLike = fileName || url;\n if (!pathLike) {\n return 'unknown';\n }\n\n const extension = pathLike.split('.').pop().toLowerCase();\n const extensionsToTypes = {\n pdf: 'pdf',\n jpg: 'image',\n jpeg: 'image',\n heic: 'image',\n bmp: 'image',\n png: 'image',\n gif: 'image',\n svg: 'image',\n svgz: 'image',\n ep: 'image',\n eps: 'image',\n avi: 'video',\n flv: 'video',\n h264: 'video',\n mov: 'video',\n mp4: 'video',\n mwv: 'video',\n mkv: 'video',\n mp3: 'audio',\n wav: 'audio',\n wma: 'audio',\n ogg: 'audio',\n txt: 'text',\n json: 'text',\n html: 'text',\n xml: 'text',\n // Word\n doc: 'office',\n docx: 'office',\n odt: 'office',\n dot: 'office',\n dotx: 'office',\n docm: 'office', // not supported\n dotm: 'office', // not yet tested\n // Presentation\n pot: 'office', // not tested\n ppt: 'office',\n pptx: 'office',\n odp: 'office',\n potx: 'office', // not supported\n potm: 'office', // not supported\n pps: 'office',\n ppsx: 'office',\n ppsm: 'office', // not supported\n pptm: 'office', // not supported\n ppam: 'office', // not tested\n pages: 'office', // not supported (Apple)\n // Spreadsheet\n xls: 'office',\n xlsx: 'office',\n xlsm: 'office',\n xlsb: 'office',\n ods: 'office',\n csv: 'office', // not supported\n numbers: 'office', // not supported (Apple)\n };\n\n return extensionsToTypes[extension] || 'unknown';\n}\n","export class Fullscreen {\n private enter: () => void;\n private exit: () => void;\n\n constructor(element: any) {\n this.enter =\n element.requestFullscreen ||\n element.msRequestFullscreen ||\n element.mozRequestFullScreen ||\n element.webkitRequestFullscreen;\n this.enter = this.enter.bind(element);\n const doc: any = window.document;\n this.exit =\n doc.exitFullscreen ||\n doc.msExitFullscreen ||\n doc.mozCancelFullScreen ||\n doc.webkitExitFullscreen;\n }\n\n public requestFullscreen = () => {\n if (this.enter) {\n this.enter();\n }\n };\n\n public exitFullscreen = () => {\n if (this.exit) {\n this.exit.bind(window.document)();\n }\n };\n\n public toggle = () => {\n const doc: any = window.document;\n const isFullscreen =\n doc.fullscreenElement ||\n doc.mozFullScreenElement ||\n doc.webkitFullscreenElement ||\n doc.msFullscreenElement;\n\n if (isFullscreen) {\n this.exitFullscreen();\n } else {\n this.requestFullscreen();\n }\n };\n\n public isSupported(): boolean {\n return !!this.requestFullscreen;\n }\n}\n","@use '../../style/internal/variables';\n@use '../../style/internal/shared_input-select-picker';\n@use '../../style/mixins';\n\n$size-of-buttons: 2rem;\n\n:host {\n isolation: isolate;\n position: relative;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n}\n\n* {\n box-sizing: border-box;\n}\n\nimg,\nvideo,\naudio,\nobject,\niframe {\n max-height: 100%;\n max-width: 100%;\n box-sizing: border-box;\n}\n\niframe {\n border: none;\n width: 100%;\n height: 100%;\n min-height: 20rem; // makes sure to get minimum comfortable space for viewing office files, and Microsoft Office viewers toolbars\n}\n\nimg {\n min-width: 7rem;\n object-fit: contain; // increases or decreases the size of the image to fill the box whilst preserving its aspect-ratio.\n}\n\nvideo {\n width: 100%;\n height: auto;\n}\n\naudio {\n width: 100%;\n}\n\nobject {\n width: 100%;\n height: 100%;\n}\n\nobject[type='application/pdf'] {\n min-height: 20rem;\n // makes sure to get browsers' native controls for the PDF\n}\n\nobject[type='text/plain'] {\n border-radius: 0.25rem;\n padding-right: $size-of-buttons;\n\n overflow-y: auto;\n}\n\n@mixin plain-text-in-fullscreen {\n background-color: rgb(var(--color-gray-darker));\n\n object[type='text/plain'] {\n max-width: 50rem;\n max-height: calc(100% - 2rem);\n }\n}\n\n:host(:fullscreen) {\n @include plain-text-in-fullscreen;\n}\n:host(:-webkit-full-screen) {\n // this is repetition of the previous block,\n // but needed for Safari to work.\n // Cannot write SCSS rules for `:host` using commas for some reason.\n // e.g.: `:host(:fullscreen), :host(:-webkit-full-screen)`.\n // So you have to repeat it sadly.\n @include plain-text-in-fullscreen;\n}\n\n@import './partial-styles/ui-controls.scss';\n","import {\n Component,\n Element,\n h,\n Prop,\n State,\n Event,\n EventEmitter,\n Watch,\n} from '@stencil/core';\nimport { Languages } from '../date-picker/date.types';\nimport { ListItem } from '../list/list-item.types';\nimport translate from '../../global/translations';\nimport { detectExtension } from './extension-mapping';\nimport { Fullscreen } from './fullscreen';\nimport { FileType, OfficeViewer } from './file-viewer.types';\nimport { LimelMenuCustomEvent } from '../../components';\n\n/**\n * This is a smart component that automatically detects\n * the most common file types such as image, audio, video, and text,\n * and properly displays them in the browser.\n * The component is also capable to render the most common office files.\n *\n * :::note\n * Image files will always be contained in their containers, which means\n * they automatically increase or decrease in size to fill their containing box\n * whilst preserving their aspect-ratio.\n *\n * Text and PDF files will also always respect the width and height of the\n * container in which the `limel-file-viewer` is loaded.\n * :::\n *\n * For some file types such as text and images, the component will display a\n * download button and a button to open the file in a new browser tab.\n * This will allow users to preview the file in a fullscreen mode with the\n * browser and take advantage of for example native zooming and panning\n * functionalities.\n *\n * @exampleComponent limel-example-file-viewer\n * @exampleComponent limel-example-file-viewer-office\n * @exampleComponent limel-example-file-viewer-filename\n * @exampleComponent limel-example-file-viewer-inbuilt-actions\n * @exampleComponent limel-example-file-viewer-custom-actions\n * @exampleComponent limel-example-file-viewer-with-picker\n * @private\n */\n\n@Component({\n tag: 'limel-file-viewer',\n shadow: true,\n styleUrl: 'file-viewer.scss',\n})\nexport class FileViewer {\n /**\n * Link to the file\n */\n @Prop({ reflect: true })\n public url: string;\n\n /**\n * The name of the file that must also contains its extension.\n * This overrides the filename that the `url` ends with.\n * Useful when the `url` does not contain the filename.\n * When specified, the `filename` will be used as filename of\n * the downloaded file.\n */\n @Prop({ reflect: true })\n public filename?: string;\n\n /**\n * An optional alternative text, mainly for assistive technologies and screen readers.\n * It is used for only image files, as an `alt` attribute.\n * Should optimally hold a description of the image,\n * which is also displayed on the page if the image can't be loaded for some reason.\n */\n @Prop({ reflect: true })\n public alt?: string;\n\n /**\n * Displays a button that allows the user to view the file\n * in fullscreen mode.\n * Not displayed for office files!\n */\n @Prop({ reflect: true })\n public allowFullscreen?: boolean = false;\n\n /**\n * Displays a button that allows the user to open the file\n * in a new browser tab.\n * Not displayed for office files!\n */\n @Prop({ reflect: true })\n public allowOpenInNewTab?: boolean = false;\n\n /**\n * Displays a button that allows the user to download the file.\n * Note that due to the browser's security policies,\n * the file should be hosted on the same domain\n * for the download button to work properly.\n * Not displayed for office files!\n */\n @Prop({ reflect: true })\n public allowDownload?: boolean = false;\n\n /**\n * Defines the localization for translations.\n */\n @Prop()\n public language: Languages = 'en';\n\n /**\n * Defines the third-party viewer that should be used to render\n * the content of office files, such as word processing documents,\n * presentations, or spreadsheets.\n */\n @Prop({ reflect: true })\n public officeViewer: OfficeViewer = 'microsoft-office';\n\n /**\n * An array of custom actions that can be displayed\n * as an action menu on the file which is being displayed.\n */\n @Prop()\n public actions: ListItem[];\n\n /**\n * Emitted when a custom action is selected from the action menu.\n */\n @Event()\n public action: EventEmitter<ListItem>;\n\n @Element()\n public HostElement: HTMLLimelFileViewerElement;\n\n private fullscreen: Fullscreen;\n\n @State()\n private isFullscreen: boolean = false;\n\n @State()\n private fileType: FileType;\n\n /**\n * True while the file is being loaded.\n */\n @State()\n private loading: boolean = true;\n\n @State()\n private fileUrl: string = '';\n\n constructor() {\n this.fullscreen = new Fullscreen(this.HostElement);\n }\n\n public async componentWillLoad() {\n this.fileType = detectExtension(this.filename, this.url);\n await this.createURL(this.fileType);\n }\n\n public render() {\n if (!this.isOfficeFileAccessibleViaURL) {\n return this.renderNoFileSupportMessage();\n }\n\n if (this.loading) {\n return <limel-spinner size=\"x-small\" limeBranded={false} />;\n }\n\n return this.renderFileViewer();\n }\n\n @Watch('url')\n protected async watchUrl(newUrl: string, oldUrl: string) {\n if (newUrl === oldUrl) {\n return;\n }\n\n this.loading = true;\n this.fileType = detectExtension(this.filename, this.fileUrl);\n await this.createURL(this.fileType);\n }\n\n private renderFileViewer() {\n const fileViewerFunctions = {\n pdf: this.renderPdf,\n image: this.renderImage,\n video: this.renderVideo,\n audio: this.renderAudio,\n text: this.renderText,\n office: this.renderOffice,\n };\n const fileViewerFunction =\n fileViewerFunctions[this.fileType] ||\n this.renderNoFileSupportMessage;\n\n return fileViewerFunction();\n }\n\n private renderPdf = () => {\n return [\n <div class=\"action-menu-for-pdf-files\">\n {this.renderActionMenu()}\n </div>,\n <iframe src={this.fileUrl} loading=\"lazy\" />,\n ];\n };\n\n private renderImage = () => {\n return [\n this.renderButtons(),\n <img src={this.fileUrl} alt={this.alt} loading=\"lazy\" />,\n ];\n };\n\n private renderVideo = () => {\n return (\n <video controls>\n <source src={this.fileUrl} />\n </video>\n );\n };\n\n private renderAudio = () => {\n return (\n <audio controls>\n <source src={this.fileUrl} />\n </audio>\n );\n };\n\n private renderText = () => {\n return [\n this.renderButtons(),\n <object data={this.fileUrl} type=\"text/plain\" />,\n ];\n };\n\n private renderOffice = () => {\n return [\n <div class=\"action-menu-for-office-files\">\n {this.renderActionMenu()}\n </div>,\n <iframe\n src={\n this.getOfficeViewerUrl() + this.fileUrl + '&embedded=true'\n }\n loading=\"lazy\"\n />,\n ];\n };\n\n private isOfficeFileAccessibleViaURL = () => {\n return (\n this.fileType === 'office' &&\n !(\n this.fileUrl.startsWith('http://') ||\n this.fileUrl.startsWith('https://')\n )\n );\n };\n\n private getOfficeViewerUrl = () => {\n const officeViewers = {\n 'microsoft-office':\n 'https://view.officeapps.live.com/op/embed.aspx?src=',\n 'google-drive': 'https://docs.google.com/gview?url=',\n };\n\n return officeViewers[this.officeViewer];\n };\n\n private renderNoFileSupportMessage = () => {\n return (\n <div class=\"no-support\">\n <limel-icon\n class=\"icon--warning\"\n name=\"brake_warning\"\n size=\"large\"\n role=\"presentation\"\n />\n <p>{this.getTranslation('message.unsupported-filetype')}</p>\n {this.renderDownloadButton()}\n </div>\n );\n };\n\n private renderButtons = () => {\n return (\n <div class=\"buttons\">\n {this.renderActionMenu()}\n {this.renderToggleFullscreenButton()}\n {this.renderDownloadButton()}\n {this.renderOpenInNewTabButton()}\n </div>\n );\n };\n\n private renderToggleFullscreenButton = () => {\n if (!this.allowFullscreen || !this.fullscreen.isSupported()) {\n return;\n }\n\n const icon = this.isFullscreen ? 'multiply' : 'fit_to_width';\n // eslint-disable-next-line multiline-ternary\n const label = this.isFullscreen\n ? // eslint-disable-next-line multiline-ternary\n this.getTranslation('exit-fullscreen')\n : this.getTranslation('open-in-fullscreen');\n\n return [\n <button\n class=\"button--toggle-fullscreen\"\n id=\"tooltip-toggle-fullscreen\"\n role=\"button\"\n onClick={this.handleToggleFullscreen}\n >\n <limel-icon name={icon} />\n <limel-tooltip\n label={label}\n elementId=\"tooltip-toggle-fullscreen\"\n openDirection=\"left\"\n />\n </button>,\n ];\n };\n\n private renderDownloadButton = () => {\n if (!this.allowDownload || this.isFullscreen) {\n return;\n }\n\n return (\n <a\n class=\"button--download\"\n id=\"tooltip-download\"\n role=\"button\"\n download={this.filename ? this.filename : ''}\n href={this.fileUrl}\n target=\"_blank\"\n >\n <limel-icon name=\"download_2\" />\n <limel-tooltip\n label={this.getTranslation('download')}\n elementId=\"tooltip-download\"\n openDirection=\"left\"\n />\n </a>\n );\n };\n\n private renderOpenInNewTabButton = () => {\n if (!this.allowOpenInNewTab || this.isFullscreen) {\n return;\n }\n\n return (\n <a\n class=\"button--new-tab\"\n id=\"tooltip-new-tab\"\n role=\"button\"\n href={this.fileUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <limel-icon name=\"external_link\" />\n <limel-tooltip\n label={this.getTranslation('open-in-new-tab')}\n elementId=\"tooltip-new-tab\"\n openDirection=\"left\"\n />\n </a>\n );\n };\n\n private renderActionMenu = () => {\n if (!this.actions || this.isFullscreen) {\n return;\n }\n\n return (\n <limel-menu\n class=\"action-menu\"\n items={this.actions}\n onSelect={this.emitOnAction}\n open-direction=\"left\"\n >\n <button\n class=\"button--action\"\n id=\"tooltip-more\"\n role=\"button\"\n slot=\"trigger\"\n >\n <limel-icon name=\"menu_2\" />\n <limel-tooltip\n label={this.getTranslation('more-actions')}\n elementId=\"tooltip-more\"\n openDirection=\"left\"\n />\n </button>\n </limel-menu>\n );\n };\n\n private createURL = async (fileType: string) => {\n if (['pdf'].includes(fileType)) {\n const response = await fetch(this.url);\n const blob = await response.blob();\n\n this.fileUrl = URL.createObjectURL(blob);\n } else {\n this.fileUrl = this.url;\n }\n\n this.loading = false;\n };\n\n private handleToggleFullscreen = () => {\n if (this.fullscreen.isSupported()) {\n this.fullscreen.toggle();\n this.isFullscreen = !this.isFullscreen;\n }\n };\n\n private emitOnAction = (event: LimelMenuCustomEvent<ListItem>) => {\n event.stopPropagation();\n this.action.emit(event.detail);\n };\n\n private getTranslation(key: string) {\n return translate.get(`file-viewer.${key}`, this.language);\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e,c as t,h as i,H as r}from"./p-443111b3.js";const o='@charset "UTF-8";:host(limel-split-button.has-menu){--button-padding-right:2rem}:host(limel-split-button){display:inline-flex;isolation:isolate}:host(limel-split-button) *{box-sizing:border-box}limel-button{width:100%}limel-menu{display:flex;justify-content:flex-end;position:relative;z-index:1;padding:0.125rem;margin-left:calc(var(--button-padding-right) * -1);width:var(--button-padding-right)}limel-menu:before{transition:background-color 0.5s ease;content:"";position:absolute;inset:0.375rem auto 0.375rem 0.6875rem;width:1px;background-color:currentColor;opacity:0.2}limel-menu:not([disabled]){color:var(--mdc-theme-primary, rgb(var(--color-teal-default)))}limel-menu:not([disabled]).primary{color:var(--mdc-theme-on-primary, rgb(var(--color-white)))}limel-menu[disabled]{color:rgba(var(--contrast-1600), 0.37)}limel-menu:hover:before,limel-menu:focus-within:before{background-color:transparent}.menu-trigger{all:unset;text-align:center;font-weight:bold;border-radius:0.125rem;height:100%;width:1rem}.menu-trigger:not(:disabled){transition:color var(--limel-clickable-transition-speed, 0.4s) ease, background-color var(--limel-clickable-transition-speed, 0.4s) ease, box-shadow var(--limel-clickable-transform-speed, 0.4s) ease, transform var(--limel-clickable-transform-speed, 0.4s) var(--limel-clickable-transform-timing-function, ease);cursor:pointer;color:"inherit";background-color:transparent;cursor:pointer}.menu-trigger:not(:disabled):hover,.menu-trigger:not(:disabled):focus,.menu-trigger:not(:disabled):focus-visible{will-change:color, background-color, box-shadow, transform}.menu-trigger:not(:disabled):hover{transform:translate3d(0, 0.01rem, 0);color:"inherit";background-color:var(--lime-elevated-surface-background-color);box-shadow:var(--button-shadow-hovered)}.menu-trigger:not(:disabled):active{--limel-clickable-transform-timing-function:cubic-bezier(\n 0.83,\n -0.15,\n 0.49,\n 1.16\n );transform:translate3d(0, 0.05rem, 0);box-shadow:var(--button-shadow-pressed)}.menu-trigger:not(:disabled):hover,.menu-trigger:not(:disabled):active{--limel-clickable-transition-speed:0.2s;--limel-clickable-transform-speed:0.16s}.menu-trigger:not(:disabled):focus{outline:none}.menu-trigger:not(:disabled):focus-visible{outline:none;box-shadow:var(--shadow-depth-8-focused)}.menu-trigger:not(:disabled):focus-visible,.menu-trigger:not(:disabled):hover{background-color:rgb(var(--color-white), 0.1)}.menu-trigger[aria-expanded]:not([aria-expanded=false]){box-shadow:var(--button-shadow-inset-pressed)}.menu-trigger:before{content:"";position:absolute;inset:-0.25rem;z-index:-1}';const s=class{constructor(r){e(this,r);this.select=t(this,"select",7);this.renderMenu=()=>{if(!this.items.length){return}return i("limel-menu",{class:{primary:this.primary},disabled:this.disabled||this.loading,items:this.items,openDirection:"bottom"},i("button",{class:"menu-trigger",slot:"trigger",disabled:this.disabled},"⋮"))};this.filterClickWhenDisabled=e=>{if(this.disabled){e.preventDefault()}};this.label=undefined;this.primary=false;this.icon=undefined;this.disabled=false;this.loading=false;this.loadingFailed=false;this.items=[]}render(){return i(r,{class:{"has-menu":!!this.items.length},onClick:this.filterClickWhenDisabled},i("limel-button",{label:this.label,primary:this.primary,icon:this.icon,disabled:this.disabled,loading:this.loading,loadingFailed:this.loadingFailed}),this.renderMenu())}static get delegatesFocus(){return true}};s.style=o;export{s as limel_split_button};
|
|
2
|
+
//# sourceMappingURL=p-211456f2.entry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["splitButtonCss","SplitButton","this","renderMenu","items","length","h","class","primary","disabled","loading","openDirection","slot","filterClickWhenDisabled","e","preventDefault","render","Host","onClick","label","icon","loadingFailed"],"sources":["./src/components/split-button/split-button.scss?tag=limel-split-button&encapsulation=shadow","./src/components/split-button/split-button.tsx"],"sourcesContent":["@use '../../style/mixins';\n\n:host(limel-split-button.has-menu) {\n --button-padding-right: 2rem;\n}\n\n:host(limel-split-button) {\n display: inline-flex;\n isolation: isolate;\n\n * {\n box-sizing: border-box;\n }\n}\n\nlimel-button {\n width: 100%;\n}\n\n$distance-around-trigger: 0.125rem;\n\nlimel-menu {\n display: flex;\n justify-content: flex-end;\n position: relative;\n z-index: 1;\n\n padding: $distance-around-trigger;\n margin-left: calc(var(--button-padding-right) * -1);\n width: var(--button-padding-right);\n\n &:before {\n transition: background-color 0.5s ease;\n content: '';\n position: absolute;\n inset: 0.375rem auto 0.375rem 0.6875rem;\n width: 1px;\n background-color: currentColor;\n\n opacity: 0.2;\n }\n\n &:not([disabled]) {\n color: var(\n --mdc-theme-primary,\n rgb(var(--color-teal-default))\n ); // similar to limel-button text\n\n &.primary {\n color: var(\n --mdc-theme-on-primary,\n rgb(var(--color-white))\n ); // similar to limel-button text\n }\n }\n\n &[disabled] {\n color: rgba(var(--contrast-1600), 0.37); // similar to limel-button text\n }\n\n &:hover,\n &:focus-within {\n &:before {\n background-color: transparent;\n }\n }\n}\n\n.menu-trigger {\n all: unset;\n\n text-align: center;\n font-weight: bold;\n\n border-radius: 0.125rem;\n height: 100%;\n width: 1rem;\n\n &:not(:disabled) {\n @include mixins.is-flat-clickable(\n $color: 'inherit',\n $color--hovered: 'inherit'\n );\n @include mixins.visualize-keyboard-focus();\n cursor: pointer;\n\n &:focus-visible,\n &:hover {\n background-color: rgb(var(--color-white), 0.1);\n }\n }\n\n &[aria-expanded]:not([aria-expanded='false']) {\n box-shadow: var(--button-shadow-inset-pressed);\n }\n\n &:before {\n // prevents unintentionally activating the default action,\n // by clicking on the edge of menu trigger,\n // which would be activating the default onClick action\n // on `limel-button`.\n content: '';\n position: absolute;\n inset: -$distance-around-trigger * 2;\n z-index: -1;\n }\n}\n","import { Component, Event, EventEmitter, Host, h, Prop } from '@stencil/core';\nimport { ListSeparator } from '../list/list-item.types';\nimport { MenuItem } from '../menu/menu.types';\n\n/**\n * A split button is a button with two components:\n * a button and a side-menu attached to it.\n *\n * Clicking on the button runs a default action,\n * and clicking on the arrow opens up a list of other possible actions.\n *\n * :::warning\n * - Never use a split button for navigation purposes, such as going to next page.\n * The button should only be used for performing commands!\n * - Never use this component instead of a Select or Menu component!\n * :::\n *\n * @exampleComponent limel-example-split-button-basic\n * @exampleComponent limel-example-split-button-loading\n * @exampleComponent limel-example-split-button-repeat-default-command\n */\n@Component({\n tag: 'limel-split-button',\n shadow: { delegatesFocus: true },\n styleUrl: 'split-button.scss',\n})\nexport class SplitButton {\n /**\n * The text to show on the default action part of the button.\n */\n @Prop({ reflect: true })\n public label: string;\n\n /**\n * Set to `true` to make the button primary.\n */\n @Prop({ reflect: true })\n public primary = false;\n\n /**\n * Set icon for the button\n */\n @Prop({ reflect: true })\n public icon: string;\n\n /**\n * Set to `true` to disable the button.\n */\n @Prop({ reflect: true })\n public disabled = false;\n\n /**\n * Set to `true` to put the button in the `loading` state.\n * This also disables the button.\n */\n @Prop({ reflect: true })\n public loading = false;\n\n /**\n * Set to `true` to indicate failure instead of success when the button is\n * no longer in the `loading` state.\n */\n @Prop({ reflect: true })\n public loadingFailed = false;\n\n /**\n * A list of items and separators to show in the menu.\n */\n @Prop()\n public items: Array<MenuItem | ListSeparator> = [];\n\n /**\n * Is emitted when a menu item is selected.\n */\n @Event()\n public select: EventEmitter<MenuItem>;\n\n render() {\n return (\n <Host\n class={{\n 'has-menu': !!this.items.length,\n }}\n onClick={this.filterClickWhenDisabled}\n >\n <limel-button\n label={this.label}\n primary={this.primary}\n icon={this.icon}\n disabled={this.disabled}\n loading={this.loading}\n loadingFailed={this.loadingFailed}\n />\n {this.renderMenu()}\n </Host>\n );\n }\n\n private renderMenu = () => {\n if (!this.items.length) {\n return;\n }\n\n return (\n <limel-menu\n class={{\n primary: this.primary,\n }}\n disabled={this.disabled || this.loading}\n items={this.items}\n openDirection=\"bottom\"\n >\n <button\n class=\"menu-trigger\"\n slot=\"trigger\"\n disabled={this.disabled}\n >\n ⋮\n </button>\n </limel-menu>\n );\n };\n\n private filterClickWhenDisabled = (e) => {\n if (this.disabled) {\n e.preventDefault();\n }\n };\n}\n"],"mappings":"yDAAA,MAAMA,EAAiB,
|
|
1
|
+
{"version":3,"names":["splitButtonCss","SplitButton","this","renderMenu","items","length","h","class","primary","disabled","loading","openDirection","slot","filterClickWhenDisabled","e","preventDefault","render","Host","onClick","label","icon","loadingFailed"],"sources":["./src/components/split-button/split-button.scss?tag=limel-split-button&encapsulation=shadow","./src/components/split-button/split-button.tsx"],"sourcesContent":["@use '../../style/mixins';\n\n:host(limel-split-button.has-menu) {\n --button-padding-right: 2rem;\n}\n\n:host(limel-split-button) {\n display: inline-flex;\n isolation: isolate;\n\n * {\n box-sizing: border-box;\n }\n}\n\nlimel-button {\n width: 100%;\n}\n\n$distance-around-trigger: 0.125rem;\n\nlimel-menu {\n display: flex;\n justify-content: flex-end;\n position: relative;\n z-index: 1;\n\n padding: $distance-around-trigger;\n margin-left: calc(var(--button-padding-right) * -1);\n width: var(--button-padding-right);\n\n &:before {\n transition: background-color 0.5s ease;\n content: '';\n position: absolute;\n inset: 0.375rem auto 0.375rem 0.6875rem;\n width: 1px;\n background-color: currentColor;\n\n opacity: 0.2;\n }\n\n &:not([disabled]) {\n color: var(\n --mdc-theme-primary,\n rgb(var(--color-teal-default))\n ); // similar to limel-button text\n\n &.primary {\n color: var(\n --mdc-theme-on-primary,\n rgb(var(--color-white))\n ); // similar to limel-button text\n }\n }\n\n &[disabled] {\n color: rgba(var(--contrast-1600), 0.37); // similar to limel-button text\n }\n\n &:hover,\n &:focus-within {\n &:before {\n background-color: transparent;\n }\n }\n}\n\n.menu-trigger {\n all: unset;\n\n text-align: center;\n font-weight: bold;\n\n border-radius: 0.125rem;\n height: 100%;\n width: 1rem;\n\n &:not(:disabled) {\n @include mixins.is-flat-clickable(\n $color: 'inherit',\n $color--hovered: 'inherit'\n );\n @include mixins.visualize-keyboard-focus();\n cursor: pointer;\n\n &:focus-visible,\n &:hover {\n background-color: rgb(var(--color-white), 0.1);\n }\n }\n\n &[aria-expanded]:not([aria-expanded='false']) {\n box-shadow: var(--button-shadow-inset-pressed);\n }\n\n &:before {\n // prevents unintentionally activating the default action,\n // by clicking on the edge of menu trigger,\n // which would be activating the default onClick action\n // on `limel-button`.\n content: '';\n position: absolute;\n inset: -$distance-around-trigger * 2;\n z-index: -1;\n }\n}\n","import { Component, Event, EventEmitter, Host, h, Prop } from '@stencil/core';\nimport { ListSeparator } from '../list/list-item.types';\nimport { MenuItem } from '../menu/menu.types';\n\n/**\n * A split button is a button with two components:\n * a button and a side-menu attached to it.\n *\n * Clicking on the button runs a default action,\n * and clicking on the arrow opens up a list of other possible actions.\n *\n * :::warning\n * - Never use a split button for navigation purposes, such as going to next page.\n * The button should only be used for performing commands!\n * - Never use this component instead of a Select or Menu component!\n * :::\n *\n * @exampleComponent limel-example-split-button-basic\n * @exampleComponent limel-example-split-button-loading\n * @exampleComponent limel-example-split-button-repeat-default-command\n */\n@Component({\n tag: 'limel-split-button',\n shadow: { delegatesFocus: true },\n styleUrl: 'split-button.scss',\n})\nexport class SplitButton {\n /**\n * The text to show on the default action part of the button.\n */\n @Prop({ reflect: true })\n public label: string;\n\n /**\n * Set to `true` to make the button primary.\n */\n @Prop({ reflect: true })\n public primary = false;\n\n /**\n * Set icon for the button\n */\n @Prop({ reflect: true })\n public icon: string;\n\n /**\n * Set to `true` to disable the button.\n */\n @Prop({ reflect: true })\n public disabled = false;\n\n /**\n * Set to `true` to put the button in the `loading` state.\n * This also disables the button.\n */\n @Prop({ reflect: true })\n public loading = false;\n\n /**\n * Set to `true` to indicate failure instead of success when the button is\n * no longer in the `loading` state.\n */\n @Prop({ reflect: true })\n public loadingFailed = false;\n\n /**\n * A list of items and separators to show in the menu.\n */\n @Prop()\n public items: Array<MenuItem | ListSeparator> = [];\n\n /**\n * Is emitted when a menu item is selected.\n */\n @Event()\n public select: EventEmitter<MenuItem>;\n\n render() {\n return (\n <Host\n class={{\n 'has-menu': !!this.items.length,\n }}\n onClick={this.filterClickWhenDisabled}\n >\n <limel-button\n label={this.label}\n primary={this.primary}\n icon={this.icon}\n disabled={this.disabled}\n loading={this.loading}\n loadingFailed={this.loadingFailed}\n />\n {this.renderMenu()}\n </Host>\n );\n }\n\n private renderMenu = () => {\n if (!this.items.length) {\n return;\n }\n\n return (\n <limel-menu\n class={{\n primary: this.primary,\n }}\n disabled={this.disabled || this.loading}\n items={this.items}\n openDirection=\"bottom\"\n >\n <button\n class=\"menu-trigger\"\n slot=\"trigger\"\n disabled={this.disabled}\n >\n ⋮\n </button>\n </limel-menu>\n );\n };\n\n private filterClickWhenDisabled = (e) => {\n if (this.disabled) {\n e.preventDefault();\n }\n };\n}\n"],"mappings":"yDAAA,MAAMA,EAAiB,ojF,MC0BVC,EAAW,M,wDAwEZC,KAAAC,WAAa,KACjB,IAAKD,KAAKE,MAAMC,OAAQ,CACpB,M,CAGJ,OACIC,EAAA,cACIC,MAAO,CACHC,QAASN,KAAKM,SAElBC,SAAUP,KAAKO,UAAYP,KAAKQ,QAChCN,MAAOF,KAAKE,MACZO,cAAc,UAEdL,EAAA,UACIC,MAAM,eACNK,KAAK,UACLH,SAAUP,KAAKO,UAAQ,KAIlB,EAIbP,KAAAW,wBAA2BC,IAC/B,GAAIZ,KAAKO,SAAU,CACfK,EAAEC,gB,qCAxFO,M,kCAYC,M,aAOD,M,mBAOM,M,WAMyB,E,CAQhDC,SACI,OACIV,EAACW,EAAI,CACDV,MAAO,CACH,aAAcL,KAAKE,MAAMC,QAE7Ba,QAAShB,KAAKW,yBAEdP,EAAA,gBACIa,MAAOjB,KAAKiB,MACZX,QAASN,KAAKM,QACdY,KAAMlB,KAAKkB,KACXX,SAAUP,KAAKO,SACfC,QAASR,KAAKQ,QACdW,cAAenB,KAAKmB,gBAEvBnB,KAAKC,a"}
|