UNPKG

@cbpds/web-components

Version:
193 lines (192 loc) 7.86 kB
/*! * CPB Design System web components - built with Stencil */ import { Host, h } from "@stencil/core"; import { setCSSProps } from "../../utils/utils"; export class CbpCodeSnippet { constructor() { this.toggleButtonText = 'Show More'; this.toggleButtonRotate = 90; this.variant = 'inline'; this.height = undefined; this.context = undefined; this.sx = {}; this.expanded = false; this.codeContainerHeight = undefined; this.codeBlockHeight = undefined; } copyText() { navigator.clipboard.writeText(this.codeBlock); this.copyTextClick.emit({ host: this.host, }); } toggleShowAll() { this.expanded = !this.expanded; this.toggleShowAllClick.emit({ host: this.host, expanded: this.expanded, }); } componentWillLoad() { if (typeof this.sx == 'string') { this.sx = JSON.parse(this.sx) || {}; } setCSSProps(this.host, Object.assign({}, this.sx)); } componentDidLoad() { if (this.height != null && !this.expanded) { this.host.style.setProperty('--cbp-code-snippet-max-height', this.height); } this.codeBlock = this.host.querySelector('div').innerHTML.trim(); this.host.querySelector('code').innerHTML = this.codeBlock.replace(/</g, '&lt;').replace(/>/g, '&gt;'); setTimeout(() => { this.codeContainerHeight = this.host.offsetHeight; this.codeBlockHeight = this.host.querySelector('pre').scrollHeight; }, 100); } render() { if (this.variant == "block" && !!this.height) { if (this.expanded) { this.host.style.setProperty('--cbp-code-snippet-max-height', 'auto'); this.toggleButtonRotate = 270; this.toggleButtonText = 'Show Less'; } else { this.host.style.setProperty('--cbp-code-snippet-max-height', this.height); this.toggleButtonRotate = 90; this.toggleButtonText = 'Show More'; } } return (h(Host, { key: 'e0d90a998aab2be673a32bc9059c3c35bb2fc1cb' }, h("div", { key: 'f91a4fa6b295eb77eedd4c577fb0bf5bce37a221', hidden: true }, h("slot", { key: 'efc136b91dbc712714f19a42cdc2326c2f2b268b' })), h("pre", { key: '2c0643779000eb13742292ef873898555ba143cc' }, h("code", { key: '1ee0b39453cd8346bd72654cc9c087a1f5e601e9' }), this.variant == 'block' && h("cbp-button", { key: '932b3e2a44da8c8d5c64ef70de561bbdc9ab581e', type: "button", fill: "ghost", color: "secondary", variant: 'square', accessibilityText: 'Copy', onClick: () => this.copyText(), context: this.context }, h("cbp-icon", { key: '398505c4dde003e85c6f45352f8a1b9e826e2afa', name: "clone" }))), (this.expanded || this.height && this.codeContainerHeight < this.codeBlockHeight) && h("cbp-button", { key: '1f236234d6c7d1d06bfa9e8801a23480db884b63', fill: "ghost", color: "secondary", expanded: `${this.expanded}`, context: this.context, onClick: () => this.toggleShowAll() }, h("cbp-icon", { key: 'ed310d51bc4d04e7f6ec35e8eba27b75b289569b', name: "chevron-right", rotate: this.toggleButtonRotate }), this.toggleButtonText))); } static get is() { return "cbp-code-snippet"; } static get originalStyleUrls() { return { "$": ["cbp-code-snippet.scss"] }; } static get styleUrls() { return { "$": ["cbp-code-snippet.css"] }; } static get properties() { return { "variant": { "type": "string", "mutable": false, "complexType": { "original": "'inline' | 'block'", "resolved": "\"block\" | \"inline\"", "references": {} }, "required": false, "optional": false, "docs": { "tags": [], "text": "Specifies inline or block layouts of the code snippet. Defaults to inline." }, "attribute": "variant", "reflect": true, "defaultValue": "'inline'" }, "height": { "type": "string", "mutable": false, "complexType": { "original": "string", "resolved": "string", "references": {} }, "required": false, "optional": false, "docs": { "tags": [], "text": "Specifies the height (in CSS units) for a multiple line block variant while not expanded." }, "attribute": "height", "reflect": false }, "context": { "type": "string", "mutable": false, "complexType": { "original": "'light-inverts' | 'light-always' | 'dark-inverts' | 'dark-always'", "resolved": "\"dark-always\" | \"dark-inverts\" | \"light-always\" | \"light-inverts\"", "references": {} }, "required": false, "optional": false, "docs": { "tags": [], "text": "Specifies the context of the component as it applies to the visual design and whether it inverts when light/dark mode is toggled. Default behavior is \"light-inverts\" and does not have to be specified." }, "attribute": "context", "reflect": true }, "sx": { "type": "any", "mutable": false, "complexType": { "original": "any", "resolved": "any", "references": {} }, "required": false, "optional": false, "docs": { "tags": [], "text": "Supports adding inline styles as an object" }, "attribute": "sx", "reflect": false, "defaultValue": "{}" } }; } static get states() { return { "expanded": {}, "codeContainerHeight": {}, "codeBlockHeight": {} }; } static get events() { return [{ "method": "copyTextClick", "name": "copyTextClick", "bubbles": true, "cancelable": true, "composed": true, "docs": { "tags": [], "text": "Emits a custom event when the \"Copy\" button is activated, copying the code to the clipboard." }, "complexType": { "original": "any", "resolved": "any", "references": {} } }, { "method": "toggleShowAllClick", "name": "toggleShowAllClick", "bubbles": true, "cancelable": true, "composed": true, "docs": { "tags": [], "text": "Emits a custom event when the the \"Show More/Less\" control is activated (for code blocks overflowing the specified height)." }, "complexType": { "original": "any", "resolved": "any", "references": {} } }]; } static get elementRef() { return "host"; } } //# sourceMappingURL=cbp-code-snippet.js.map