diff --git a/doc/etemplate2/_utilities/cem.cjs b/doc/etemplate2/_utilities/cem.cjs index 52846b1f3b..6e05c2ab30 100644 --- a/doc/etemplate2/_utilities/cem.cjs +++ b/doc/etemplate2/_utilities/cem.cjs @@ -1,6 +1,7 @@ const customElementsManifest = require('../../dist/custom-elements.json'); const fs = require('fs'); const path = require('path'); +const customElementsManifestShoelace = require('../custom-elements-shoelace.json'); // // Export it here so we can import it elsewhere and use the same version @@ -12,6 +13,40 @@ module.exports.customElementsManifest = customElementsManifest; // module.exports.getAllComponents = function () { + // + // Find a Shoelace class declaration from their custom-elements.json + // + // for Et2* classes, we also look recursive, if they inherit from a Shoelace class + // + const getSlClass = function(superclass) + { + let sl_class; + if (superclass && superclass.package === "@shoelace-style/shoelace") + { + customElementsManifestShoelace.modules.find(module => + sl_class = module.declarations.find(declaration => declaration.kind === "class" && declaration.name === superclass.name)); + } + else if (superclass && superclass.name.substring(0, 3) === "Et2") + { + customElementsManifest.modules.find(module => + sl_class = module.declarations.find(declaration => declaration.name === superclass.name)); + if (sl_class) sl_class = getSlClass(sl_class.superclass); + } + //console.log("getSlClass("+superclass.name+") returning ", sl_class ? sl_class.name+" with attributes: "+sl_class.attributes?.map(attribute => attribute.name).join(", ") : "undefined"); + return sl_class; + } + // + // Sort by not deprecated and name + // + const compareNotDeprecatedAndName = function(a, b) + { + if (a.deprecated && !b.deprecated) return 1; + if (!a.deprecated && b.deprecated) return -1; + if (a.name[0] === '_' && b.name[0] !== '_') return 1; + if (a.name[0] !== '_' && b.name[0] === '_') return -1; + return a.name.localeCompare(b.name); + } + const debug='declaration.name'; // set to declaration.name to get more logging for that component const allComponents = []; customElementsManifest.modules?.forEach(module => @@ -20,32 +55,68 @@ module.exports.getAllComponents = function () { if (declaration.customElement) { + // check if we have a Shoelace superclass + const sl_class = declaration.superclass ? getSlClass(declaration.superclass) : undefined; + if (debug === declaration.name) console.log(declaration.name+": superclass=", declaration.superclass, sl_class ? "found: "+sl_class.name : "not found"); + // Generate the dist path based on the src path and attach it to the component declaration.path = module.path.replace(/^src\//, 'dist/').replace(/\.ts$/, '.js'); // Remove members that are private or don't have a description - const members = declaration.members?.filter(member => member.description && member.privacy !== 'private') || []; - const methods = members?.filter(prop => prop.kind === 'method' && prop.privacy !== 'private') || []; + // + let members = declaration.members?.filter(member => member.description && member.privacy !== 'private') || []; + // add non-private and not overwritten Shoelace superclass members + if (debug === declaration.name) console.log("found members: "+members.map(member => member.name).join(", ")); + if (sl_class) + { + const sl_members = sl_class.members?.filter(member => + member.description && member.privacy !== 'private' && !members.find(egw => member.name === egw.name))/*.map(member => { + return {...member, inheritedFrom: {name: sl_class.name, module: "@shoelace-style/shoelace"}}; + })*/; + if (debug === declaration.name) console.log("adding members from "+sl_class.name+": "+sl_members.map(member => member.name).join(", ")); + members = members.concat(sl_members); + } + let methods = members?.filter(prop => prop.kind === 'method' && prop.privacy !== 'private') || []; + if (declaration.name === "Et2ButtonScroll") console.log("found methods: "+methods.map(method => method.name).join(", ")); + // add non-private and not overwritten Shoelace superclass methods + /* ToDo disabled, as it gives an error later (only copies 8 files and generates none) + if (sl_class) + { + const sl_methods = sl_class.members?.filter(prop => + prop.kind === 'method' && prop.privacy !== 'private' && !methods.find(egw => prop.name === egw.name))/*.map(method => { + return {...method, inheritedFrom: {name: sl_class.name, module: "@shoelace-style/shoelace"}}; + }); + if (debug === declaration.name) console.log("adding methods from "+sl_class.name+": "+sl_methods.map(method => method.name).join(", ")); + methods = methods.concat(sl_methods); + }*/ + methods = methods.sort(compareNotDeprecatedAndName); const properties = members?.filter(prop => { + if (debug === declaration.name) console.log("Asserting "+declaration.name+" property", prop); // Look for a corresponding attribute - const attribute = declaration.attributes?.find(attr => attr.fieldName === prop.name); + const attribute = (declaration.attributes||[]).concat(sl_class?.attributes || []).find(attr => attr.fieldName === prop.name); if (attribute) { prop.attribute = attribute.name || attribute.fieldName; } return prop.kind === 'field' && prop.privacy !== 'private'; - }); + }).sort(compareNotDeprecatedAndName); + if (debug === declaration.name) console.log("found properties: "+properties.map(property => property.name).join(", ")); allComponents.push({ ...declaration, methods, - properties + properties, + attributes: declaration.attributes?.concat(sl_class?.attributes?.filter(attribute => !declaration.attributes.find(attr => attr.name === attribute.name)) + /*.map(attribute => { + return {...attribute, inheritedFrom: {name: sl_class.name, module: "@shoelace-style/shoelace"}}; + })*/) }); + if (debug === declaration.name) console.log("added attributes", allComponents[allComponents.length - 1].attributes); } }); }); - + console.log('Build dependency graphs'); // Build dependency graphs allComponents.forEach(component => { @@ -74,7 +145,7 @@ module.exports.getAllComponents = function () component.dependencies = dependencies.sort(); }); - + console.log('Add custom docs'); // Add custom docs - not monitored for file changes allComponents.forEach(component => { @@ -87,7 +158,7 @@ module.exports.getAllComponents = function () fs.readFile(docPath, (err, data) => component.content = data.toString()); } }) - + console.log("return allComponentes sorted by name") // Sort by name return allComponents.sort((a, b) => { diff --git a/doc/etemplate2/custom-elements-shoelace.json b/doc/etemplate2/custom-elements-shoelace.json new file mode 100644 index 0000000000..9f6ededdef --- /dev/null +++ b/doc/etemplate2/custom-elements-shoelace.json @@ -0,0 +1,17339 @@ +{ + "schemaVersion": "1.0.0", + "readme": "", + "modules": [ + { + "kind": "javascript-module", + "path": "components/animation/animation.js", + "declarations": [ + { + "kind": "class", + "description": "", + "name": "SlAnimation", + "slots": [ + { + "description": "The element to animate. Avoid slotting in more than one element, as subsequent ones will be ignored. To animate multiple elements, either wrap them in a single container or use multiple `` elements.", + "name": "" + } + ], + "members": [ + { + "kind": "field", + "name": "animation", + "type": { + "text": "Animation | undefined" + }, + "privacy": "private" + }, + { + "kind": "field", + "name": "hasStarted", + "type": { + "text": "boolean" + }, + "privacy": "private", + "default": "false" + }, + { + "kind": "field", + "name": "defaultSlot", + "type": { + "text": "Promise" + } + }, + { + "kind": "field", + "name": "name", + "type": { + "text": "string" + }, + "default": "'none'", + "description": "The name of the built-in animation to use. For custom animations, use the `keyframes` prop.", + "attribute": "name" + }, + { + "kind": "field", + "name": "play", + "type": { + "text": "boolean" + }, + "default": "false", + "description": "Plays the animation. When omitted, the animation will be paused. This attribute will be automatically removed when\nthe animation finishes or gets canceled.", + "attribute": "play", + "reflects": true + }, + { + "kind": "field", + "name": "delay", + "type": { + "text": "number" + }, + "default": "0", + "description": "The number of milliseconds to delay the start of the animation.", + "attribute": "delay" + }, + { + "kind": "field", + "name": "direction", + "type": { + "text": "PlaybackDirection" + }, + "default": "'normal'", + "description": "Determines the direction of playback as well as the behavior when reaching the end of an iteration.\n[Learn more](https://developer.mozilla.org/en-US/docs/Web/CSS/animation-direction)", + "attribute": "direction" + }, + { + "kind": "field", + "name": "duration", + "type": { + "text": "number" + }, + "default": "1000", + "description": "The number of milliseconds each iteration of the animation takes to complete.", + "attribute": "duration" + }, + { + "kind": "field", + "name": "easing", + "type": { + "text": "string" + }, + "default": "'linear'", + "description": "The easing function to use for the animation. This can be a Shoelace easing function or a custom easing function\nsuch as `cubic-bezier(0, 1, .76, 1.14)`.", + "attribute": "easing" + }, + { + "kind": "field", + "name": "endDelay", + "type": { + "text": "number" + }, + "default": "0", + "description": "The number of milliseconds to delay after the active period of an animation sequence.", + "attribute": "end-delay" + }, + { + "kind": "field", + "name": "fill", + "type": { + "text": "FillMode" + }, + "default": "'auto'", + "description": "Sets how the animation applies styles to its target before and after its execution.", + "attribute": "fill" + }, + { + "kind": "field", + "name": "iterations", + "default": "Infinity", + "description": "The number of iterations to run before the animation completes. Defaults to `Infinity`, which loops.", + "attribute": "iterations" + }, + { + "kind": "field", + "name": "iterationStart", + "type": { + "text": "number" + }, + "default": "0", + "description": "The offset at which to start the animation, usually between 0 (start) and 1 (end).", + "attribute": "iteration-start" + }, + { + "kind": "field", + "name": "keyframes", + "type": { + "text": "Keyframe[] | undefined" + }, + "description": "The keyframes to use for the animation. If this is set, `name` will be ignored." + }, + { + "kind": "field", + "name": "playbackRate", + "type": { + "text": "number" + }, + "default": "1", + "description": "Sets the animation's playback rate. The default is `1`, which plays the animation at a normal speed. Setting this\nto `2`, for example, will double the animation's speed. A negative value can be used to reverse the animation. This\nvalue can be changed without causing the animation to restart.", + "attribute": "playback-rate" + }, + { + "kind": "field", + "name": "currentTime", + "type": { + "text": "CSSNumberish" + }, + "description": "Gets and sets the current animation time." + }, + { + "kind": "field", + "name": "handleAnimationFinish", + "privacy": "private" + }, + { + "kind": "field", + "name": "handleAnimationCancel", + "privacy": "private" + }, + { + "kind": "method", + "name": "handleSlotChange", + "privacy": "private" + }, + { + "kind": "method", + "name": "createAnimation", + "privacy": "private" + }, + { + "kind": "method", + "name": "destroyAnimation", + "privacy": "private" + }, + { + "kind": "method", + "name": "handleAnimationChange" + }, + { + "kind": "method", + "name": "handlePlayChange" + }, + { + "kind": "method", + "name": "handlePlaybackRateChange" + }, + { + "kind": "method", + "name": "cancel", + "description": "Clears all keyframe effects caused by this animation and aborts its playback." + }, + { + "kind": "method", + "name": "finish", + "description": "Sets the playback time to the end of the animation corresponding to the current playback direction." + } + ], + "events": [ + { + "description": "Emitted when the animation is canceled.", + "name": "sl-cancel", + "reactName": "onSlCancel", + "eventName": "SlCancelEvent" + }, + { + "description": "Emitted when the animation finishes.", + "name": "sl-finish", + "reactName": "onSlFinish", + "eventName": "SlFinishEvent" + }, + { + "description": "Emitted when the animation starts or restarts.", + "name": "sl-start", + "reactName": "onSlStart", + "eventName": "SlStartEvent" + } + ], + "attributes": [ + { + "name": "name", + "type": { + "text": "string" + }, + "default": "'none'", + "description": "The name of the built-in animation to use. For custom animations, use the `keyframes` prop.", + "fieldName": "name" + }, + { + "name": "play", + "type": { + "text": "boolean" + }, + "default": "false", + "description": "Plays the animation. When omitted, the animation will be paused. This attribute will be automatically removed when\nthe animation finishes or gets canceled.", + "fieldName": "play" + }, + { + "name": "delay", + "type": { + "text": "number" + }, + "default": "0", + "description": "The number of milliseconds to delay the start of the animation.", + "fieldName": "delay" + }, + { + "name": "direction", + "type": { + "text": "PlaybackDirection" + }, + "default": "'normal'", + "description": "Determines the direction of playback as well as the behavior when reaching the end of an iteration.\n[Learn more](https://developer.mozilla.org/en-US/docs/Web/CSS/animation-direction)", + "fieldName": "direction" + }, + { + "name": "duration", + "type": { + "text": "number" + }, + "default": "1000", + "description": "The number of milliseconds each iteration of the animation takes to complete.", + "fieldName": "duration" + }, + { + "name": "easing", + "type": { + "text": "string" + }, + "default": "'linear'", + "description": "The easing function to use for the animation. This can be a Shoelace easing function or a custom easing function\nsuch as `cubic-bezier(0, 1, .76, 1.14)`.", + "fieldName": "easing" + }, + { + "name": "end-delay", + "type": { + "text": "number" + }, + "default": "0", + "description": "The number of milliseconds to delay after the active period of an animation sequence.", + "fieldName": "endDelay" + }, + { + "name": "fill", + "type": { + "text": "FillMode" + }, + "default": "'auto'", + "description": "Sets how the animation applies styles to its target before and after its execution.", + "fieldName": "fill" + }, + { + "name": "iterations", + "default": "Infinity", + "description": "The number of iterations to run before the animation completes. Defaults to `Infinity`, which loops.", + "resolveInitializer": { + "module": "src/components/animation/animation.component.ts" + }, + "fieldName": "iterations" + }, + { + "name": "iteration-start", + "type": { + "text": "number" + }, + "default": "0", + "description": "The offset at which to start the animation, usually between 0 (start) and 1 (end).", + "fieldName": "iterationStart" + }, + { + "name": "playback-rate", + "type": { + "text": "number" + }, + "default": "1", + "description": "Sets the animation's playback rate. The default is `1`, which plays the animation at a normal speed. Setting this\nto `2`, for example, will double the animation's speed. A negative value can be used to reverse the animation. This\nvalue can be changed without causing the animation to restart.", + "fieldName": "playbackRate" + } + ], + "superclass": { + "name": "ShoelaceElement", + "module": "/src/internal/shoelace-element.js" + }, + "summary": "Animate elements declaratively with nearly 100 baked-in presets, or roll your own with custom keyframes. Powered by the [Web Animations API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Animations_API).", + "tagNameWithoutPrefix": "animation", + "tagName": "sl-animation", + "customElement": true, + "jsDoc": "/**\n * @summary Animate elements declaratively with nearly 100 baked-in presets, or roll your own with custom keyframes. Powered by the [Web Animations API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Animations_API).\n * @documentation https://shoelace.style/components/animation\n * @status stable\n * @since 2.0\n *\n * @event sl-cancel - Emitted when the animation is canceled.\n * @event sl-finish - Emitted when the animation finishes.\n * @event sl-start - Emitted when the animation starts or restarts.\n *\n * @slot - The element to animate. Avoid slotting in more than one element, as subsequent ones will be ignored. To\n * animate multiple elements, either wrap them in a single container or use multiple `` elements.\n */", + "documentation": "https://shoelace.style/components/animation", + "status": "stable", + "since": "2.0" + } + ], + "exports": [ + { + "kind": "js", + "name": "default", + "declaration": { + "name": "SlAnimation", + "module": "components/animation/animation.js" + } + } + ] + }, + { + "kind": "javascript-module", + "path": "components/alert/alert.js", + "declarations": [ + { + "kind": "class", + "description": "", + "name": "SlAlert", + "cssParts": [ + { + "description": "The component's base wrapper.", + "name": "base" + }, + { + "description": "The container that wraps the optional icon.", + "name": "icon" + }, + { + "description": "The container that wraps the alert's main content.", + "name": "message" + }, + { + "description": "The close button, an ``.", + "name": "close-button" + }, + { + "description": "The close button's exported `base` part.", + "name": "close-button__base" + } + ], + "slots": [ + { + "description": "The alert's main content.", + "name": "" + }, + { + "description": "An icon to show in the alert. Works best with ``.", + "name": "icon" + } + ], + "members": [ + { + "kind": "field", + "name": "dependencies", + "type": { + "text": "object" + }, + "static": true, + "default": "{ 'sl-icon-button': SlIconButton }" + }, + { + "kind": "field", + "name": "autoHideTimeout", + "type": { + "text": "number" + }, + "privacy": "private" + }, + { + "kind": "field", + "name": "hasSlotController", + "privacy": "private", + "readonly": true, + "default": "new HasSlotController(this, 'icon', 'suffix')" + }, + { + "kind": "field", + "name": "localize", + "privacy": "private", + "readonly": true, + "default": "new LocalizeController(this)" + }, + { + "kind": "field", + "name": "base", + "type": { + "text": "HTMLElement" + } + }, + { + "kind": "field", + "name": "open", + "type": { + "text": "boolean" + }, + "default": "false", + "description": "Indicates whether or not the alert is open. You can toggle this attribute to show and hide the alert, or you can\nuse the `show()` and `hide()` methods and this attribute will reflect the alert's open state.", + "attribute": "open", + "reflects": true + }, + { + "kind": "field", + "name": "closable", + "type": { + "text": "boolean" + }, + "default": "false", + "description": "Enables a close button that allows the user to dismiss the alert.", + "attribute": "closable", + "reflects": true + }, + { + "kind": "field", + "name": "variant", + "type": { + "text": "'primary' | 'success' | 'neutral' | 'warning' | 'danger'" + }, + "default": "'primary'", + "description": "The alert's theme variant.", + "attribute": "variant", + "reflects": true + }, + { + "kind": "field", + "name": "duration", + "default": "Infinity", + "description": "The length of time, in milliseconds, the alert will show before closing itself. If the user interacts with\nthe alert before it closes (e.g. moves the mouse over it), the timer will restart. Defaults to `Infinity`, meaning\nthe alert will not close on its own.", + "attribute": "duration" + }, + { + "kind": "method", + "name": "restartAutoHide", + "privacy": "private" + }, + { + "kind": "method", + "name": "handleCloseClick", + "privacy": "private" + }, + { + "kind": "method", + "name": "handleMouseMove", + "privacy": "private" + }, + { + "kind": "method", + "name": "handleOpenChange" + }, + { + "kind": "method", + "name": "handleDurationChange" + }, + { + "kind": "method", + "name": "show", + "description": "Shows the alert." + }, + { + "kind": "method", + "name": "hide", + "description": "Hides the alert" + }, + { + "kind": "method", + "name": "toast", + "description": "Displays the alert as a toast notification. This will move the alert out of its position in the DOM and, when\ndismissed, it will be removed from the DOM completely. By storing a reference to the alert, you can reuse it by\ncalling this method again. The returned promise will resolve after the alert is hidden." + } + ], + "events": [ + { + "description": "Emitted when the alert opens.", + "name": "sl-show", + "reactName": "onSlShow", + "eventName": "SlShowEvent" + }, + { + "description": "Emitted after the alert opens and all animations are complete.", + "name": "sl-after-show", + "reactName": "onSlAfterShow", + "eventName": "SlAfterShowEvent" + }, + { + "description": "Emitted when the alert closes.", + "name": "sl-hide", + "reactName": "onSlHide", + "eventName": "SlHideEvent" + }, + { + "description": "Emitted after the alert closes and all animations are complete.", + "name": "sl-after-hide", + "reactName": "onSlAfterHide", + "eventName": "SlAfterHideEvent" + } + ], + "attributes": [ + { + "name": "open", + "type": { + "text": "boolean" + }, + "default": "false", + "description": "Indicates whether or not the alert is open. You can toggle this attribute to show and hide the alert, or you can\nuse the `show()` and `hide()` methods and this attribute will reflect the alert's open state.", + "fieldName": "open" + }, + { + "name": "closable", + "type": { + "text": "boolean" + }, + "default": "false", + "description": "Enables a close button that allows the user to dismiss the alert.", + "fieldName": "closable" + }, + { + "name": "variant", + "type": { + "text": "'primary' | 'success' | 'neutral' | 'warning' | 'danger'" + }, + "default": "'primary'", + "description": "The alert's theme variant.", + "fieldName": "variant" + }, + { + "name": "duration", + "default": "Infinity", + "description": "The length of time, in milliseconds, the alert will show before closing itself. If the user interacts with\nthe alert before it closes (e.g. moves the mouse over it), the timer will restart. Defaults to `Infinity`, meaning\nthe alert will not close on its own.", + "resolveInitializer": { + "module": "src/components/alert/alert.component.ts" + }, + "fieldName": "duration" + } + ], + "superclass": { + "name": "ShoelaceElement", + "module": "/src/internal/shoelace-element.js" + }, + "summary": "Alerts are used to display important messages inline or as toast notifications.", + "tagNameWithoutPrefix": "alert", + "tagName": "sl-alert", + "customElement": true, + "jsDoc": "/**\n * @summary Alerts are used to display important messages inline or as toast notifications.\n * @documentation https://shoelace.style/components/alert\n * @status stable\n * @since 2.0\n *\n * @dependency sl-icon-button\n *\n * @slot - The alert's main content.\n * @slot icon - An icon to show in the alert. Works best with ``.\n *\n * @event sl-show - Emitted when the alert opens.\n * @event sl-after-show - Emitted after the alert opens and all animations are complete.\n * @event sl-hide - Emitted when the alert closes.\n * @event sl-after-hide - Emitted after the alert closes and all animations are complete.\n *\n * @csspart base - The component's base wrapper.\n * @csspart icon - The container that wraps the optional icon.\n * @csspart message - The container that wraps the alert's main content.\n * @csspart close-button - The close button, an ``.\n * @csspart close-button__base - The close button's exported `base` part.\n *\n * @animation alert.show - The animation to use when showing the alert.\n * @animation alert.hide - The animation to use when hiding the alert.\n */", + "documentation": "https://shoelace.style/components/alert", + "status": "stable", + "since": "2.0", + "dependencies": [ + "sl-icon-button" + ], + "animations": [ + { + "name": "alert.show", + "description": "The animation to use when showing the alert." + }, + { + "name": "alert.hide", + "description": "The animation to use when hiding the alert." + } + ] + } + ], + "exports": [ + { + "kind": "js", + "name": "default", + "declaration": { + "name": "SlAlert", + "module": "components/alert/alert.js" + } + } + ] + }, + { + "kind": "javascript-module", + "path": "components/animated-image/animated-image.js", + "declarations": [ + { + "kind": "class", + "description": "", + "name": "SlAnimatedImage", + "cssProperties": [ + { + "description": "The size of the icon box.", + "name": "--control-box-size" + }, + { + "description": "The size of the play/pause icons.", + "name": "--icon-size" + } + ], + "cssParts": [ + { + "description": "The container that surrounds the pause/play icons and provides their background.", + "name": "control-box" + } + ], + "slots": [ + { + "description": "Optional play icon to use instead of the default. Works best with ``.", + "name": "play-icon" + }, + { + "description": "Optional pause icon to use instead of the default. Works best with ``.", + "name": "pause-icon" + } + ], + "members": [ + { + "kind": "field", + "name": "dependencies", + "type": { + "text": "object" + }, + "static": true, + "default": "{ 'sl-icon': SlIcon }" + }, + { + "kind": "field", + "name": "animatedImage", + "type": { + "text": "HTMLImageElement" + } + }, + { + "kind": "field", + "name": "frozenFrame", + "type": { + "text": "string" + } + }, + { + "kind": "field", + "name": "isLoaded", + "type": { + "text": "boolean" + }, + "default": "false" + }, + { + "kind": "field", + "name": "src", + "type": { + "text": "string" + }, + "description": "The path to the image to load.", + "attribute": "src" + }, + { + "kind": "field", + "name": "alt", + "type": { + "text": "string" + }, + "description": "A description of the image used by assistive devices.", + "attribute": "alt" + }, + { + "kind": "field", + "name": "play", + "type": { + "text": "boolean" + }, + "description": "Plays the animation. When this attribute is remove, the animation will pause.", + "attribute": "play", + "reflects": true + }, + { + "kind": "method", + "name": "handleClick", + "privacy": "private" + }, + { + "kind": "method", + "name": "handleLoad", + "privacy": "private" + }, + { + "kind": "method", + "name": "handleError", + "privacy": "private" + }, + { + "kind": "method", + "name": "handlePlayChange" + }, + { + "kind": "method", + "name": "handleSrcChange" + } + ], + "events": [ + { + "description": "Emitted when the image loads successfully.", + "name": "sl-load", + "reactName": "onSlLoad", + "eventName": "SlLoadEvent" + }, + { + "description": "Emitted when the image fails to load.", + "name": "sl-error", + "reactName": "onSlError", + "eventName": "SlErrorEvent" + } + ], + "attributes": [ + { + "name": "src", + "type": { + "text": "string" + }, + "description": "The path to the image to load.", + "fieldName": "src" + }, + { + "name": "alt", + "type": { + "text": "string" + }, + "description": "A description of the image used by assistive devices.", + "fieldName": "alt" + }, + { + "name": "play", + "type": { + "text": "boolean" + }, + "description": "Plays the animation. When this attribute is remove, the animation will pause.", + "fieldName": "play" + } + ], + "superclass": { + "name": "ShoelaceElement", + "module": "/src/internal/shoelace-element.js" + }, + "summary": "A component for displaying animated GIFs and WEBPs that play and pause on interaction.", + "tagNameWithoutPrefix": "animated-image", + "tagName": "sl-animated-image", + "customElement": true, + "jsDoc": "/**\n * @summary A component for displaying animated GIFs and WEBPs that play and pause on interaction.\n * @documentation https://shoelace.style/components/animated-image\n * @status stable\n * @since 2.0\n *\n * @dependency sl-icon\n *\n * @event sl-load - Emitted when the image loads successfully.\n * @event sl-error - Emitted when the image fails to load.\n *\n * @slot play-icon - Optional play icon to use instead of the default. Works best with ``.\n * @slot pause-icon - Optional pause icon to use instead of the default. Works best with ``.\n *\n * @part control-box - The container that surrounds the pause/play icons and provides their background.\n *\n * @cssproperty --control-box-size - The size of the icon box.\n * @cssproperty --icon-size - The size of the play/pause icons.\n */", + "documentation": "https://shoelace.style/components/animated-image", + "status": "stable", + "since": "2.0", + "dependencies": [ + "sl-icon" + ] + } + ], + "exports": [ + { + "kind": "js", + "name": "default", + "declaration": { + "name": "SlAnimatedImage", + "module": "components/animated-image/animated-image.js" + } + } + ] + }, + { + "kind": "javascript-module", + "path": "components/badge/badge.js", + "declarations": [ + { + "kind": "class", + "description": "", + "name": "SlBadge", + "cssParts": [ + { + "description": "The component's base wrapper.", + "name": "base" + } + ], + "slots": [ + { + "description": "The badge's content.", + "name": "" + } + ], + "members": [ + { + "kind": "field", + "name": "variant", + "type": { + "text": "'primary' | 'success' | 'neutral' | 'warning' | 'danger'" + }, + "default": "'primary'", + "description": "The badge's theme variant.", + "attribute": "variant", + "reflects": true + }, + { + "kind": "field", + "name": "pill", + "type": { + "text": "boolean" + }, + "default": "false", + "description": "Draws a pill-style badge with rounded edges.", + "attribute": "pill", + "reflects": true + }, + { + "kind": "field", + "name": "pulse", + "type": { + "text": "boolean" + }, + "default": "false", + "description": "Makes the badge pulsate to draw attention.", + "attribute": "pulse", + "reflects": true + } + ], + "attributes": [ + { + "name": "variant", + "type": { + "text": "'primary' | 'success' | 'neutral' | 'warning' | 'danger'" + }, + "default": "'primary'", + "description": "The badge's theme variant.", + "fieldName": "variant" + }, + { + "name": "pill", + "type": { + "text": "boolean" + }, + "default": "false", + "description": "Draws a pill-style badge with rounded edges.", + "fieldName": "pill" + }, + { + "name": "pulse", + "type": { + "text": "boolean" + }, + "default": "false", + "description": "Makes the badge pulsate to draw attention.", + "fieldName": "pulse" + } + ], + "superclass": { + "name": "ShoelaceElement", + "module": "/src/internal/shoelace-element.js" + }, + "summary": "Badges are used to draw attention and display statuses or counts.", + "tagNameWithoutPrefix": "badge", + "tagName": "sl-badge", + "customElement": true, + "jsDoc": "/**\n * @summary Badges are used to draw attention and display statuses or counts.\n * @documentation https://shoelace.style/components/badge\n * @status stable\n * @since 2.0\n *\n * @slot - The badge's content.\n *\n * @csspart base - The component's base wrapper.\n */", + "documentation": "https://shoelace.style/components/badge", + "status": "stable", + "since": "2.0" + } + ], + "exports": [ + { + "kind": "js", + "name": "default", + "declaration": { + "name": "SlBadge", + "module": "components/badge/badge.js" + } + } + ] + }, + { + "kind": "javascript-module", + "path": "components/breadcrumb/breadcrumb.js", + "declarations": [ + { + "kind": "class", + "description": "", + "name": "SlBreadcrumb", + "cssParts": [ + { + "description": "The component's base wrapper.", + "name": "base" + } + ], + "slots": [ + { + "description": "One or more breadcrumb items to display.", + "name": "" + }, + { + "description": "The separator to use between breadcrumb items. Works best with ``.", + "name": "separator" + } + ], + "members": [ + { + "kind": "field", + "name": "dependencies", + "type": { + "text": "object" + }, + "static": true, + "default": "{ 'sl-icon': SlIcon }" + }, + { + "kind": "field", + "name": "localize", + "privacy": "private", + "readonly": true, + "default": "new LocalizeController(this)" + }, + { + "kind": "field", + "name": "separatorDir", + "privacy": "private" + }, + { + "kind": "field", + "name": "defaultSlot", + "type": { + "text": "HTMLSlotElement" + } + }, + { + "kind": "field", + "name": "separatorSlot", + "type": { + "text": "HTMLSlotElement" + } + }, + { + "kind": "field", + "name": "label", + "type": { + "text": "string" + }, + "default": "''", + "description": "The label to use for the breadcrumb control. This will not be shown on the screen, but it will be announced by\nscreen readers and other assistive devices to provide more context for users.", + "attribute": "label" + }, + { + "kind": "method", + "name": "getSeparator", + "privacy": "private" + }, + { + "kind": "method", + "name": "handleSlotChange", + "privacy": "private" + } + ], + "attributes": [ + { + "name": "label", + "type": { + "text": "string" + }, + "default": "''", + "description": "The label to use for the breadcrumb control. This will not be shown on the screen, but it will be announced by\nscreen readers and other assistive devices to provide more context for users.", + "fieldName": "label" + } + ], + "superclass": { + "name": "ShoelaceElement", + "module": "/src/internal/shoelace-element.js" + }, + "summary": "Breadcrumbs provide a group of links so users can easily navigate a website's hierarchy.", + "tagNameWithoutPrefix": "breadcrumb", + "tagName": "sl-breadcrumb", + "customElement": true, + "jsDoc": "/**\n * @summary Breadcrumbs provide a group of links so users can easily navigate a website's hierarchy.\n * @documentation https://shoelace.style/components/breadcrumb\n * @status stable\n * @since 2.0\n *\n * @slot - One or more breadcrumb items to display.\n * @slot separator - The separator to use between breadcrumb items. Works best with ``.\n *\n * @dependency sl-icon\n *\n * @csspart base - The component's base wrapper.\n */", + "documentation": "https://shoelace.style/components/breadcrumb", + "status": "stable", + "since": "2.0", + "dependencies": [ + "sl-icon" + ] + } + ], + "exports": [ + { + "kind": "js", + "name": "default", + "declaration": { + "name": "SlBreadcrumb", + "module": "components/breadcrumb/breadcrumb.js" + } + } + ] + }, + { + "kind": "javascript-module", + "path": "components/avatar/avatar.js", + "declarations": [ + { + "kind": "class", + "description": "", + "name": "SlAvatar", + "cssProperties": [ + { + "description": "The size of the avatar.", + "name": "--size" + } + ], + "cssParts": [ + { + "description": "The component's base wrapper.", + "name": "base" + }, + { + "description": "The container that wraps the avatar's icon.", + "name": "icon" + }, + { + "description": "The container that wraps the avatar's initials.", + "name": "initials" + }, + { + "description": "The avatar image. Only shown when the `image` attribute is set.", + "name": "image" + } + ], + "slots": [ + { + "description": "The default icon to use when no image or initials are present. Works best with ``.", + "name": "icon" + } + ], + "members": [ + { + "kind": "field", + "name": "dependencies", + "type": { + "text": "object" + }, + "static": true, + "default": "{\n 'sl-icon': SlIcon\n }" + }, + { + "kind": "field", + "name": "hasError", + "type": { + "text": "boolean" + }, + "privacy": "private", + "default": "false" + }, + { + "kind": "field", + "name": "image", + "type": { + "text": "string" + }, + "default": "''", + "description": "The image source to use for the avatar.", + "attribute": "image" + }, + { + "kind": "field", + "name": "label", + "type": { + "text": "string" + }, + "default": "''", + "description": "A label to use to describe the avatar to assistive devices.", + "attribute": "label" + }, + { + "kind": "field", + "name": "initials", + "type": { + "text": "string" + }, + "default": "''", + "description": "Initials to use as a fallback when no image is available (1-2 characters max recommended).", + "attribute": "initials" + }, + { + "kind": "field", + "name": "loading", + "type": { + "text": "'eager' | 'lazy'" + }, + "default": "'eager'", + "description": "Indicates how the browser should load the image.", + "attribute": "loading" + }, + { + "kind": "field", + "name": "shape", + "type": { + "text": "'circle' | 'square' | 'rounded'" + }, + "default": "'circle'", + "description": "The shape of the avatar.", + "attribute": "shape", + "reflects": true + }, + { + "kind": "method", + "name": "handleImageChange" + } + ], + "attributes": [ + { + "name": "image", + "type": { + "text": "string" + }, + "default": "''", + "description": "The image source to use for the avatar.", + "fieldName": "image" + }, + { + "name": "label", + "type": { + "text": "string" + }, + "default": "''", + "description": "A label to use to describe the avatar to assistive devices.", + "fieldName": "label" + }, + { + "name": "initials", + "type": { + "text": "string" + }, + "default": "''", + "description": "Initials to use as a fallback when no image is available (1-2 characters max recommended).", + "fieldName": "initials" + }, + { + "name": "loading", + "type": { + "text": "'eager' | 'lazy'" + }, + "default": "'eager'", + "description": "Indicates how the browser should load the image.", + "fieldName": "loading" + }, + { + "name": "shape", + "type": { + "text": "'circle' | 'square' | 'rounded'" + }, + "default": "'circle'", + "description": "The shape of the avatar.", + "fieldName": "shape" + } + ], + "superclass": { + "name": "ShoelaceElement", + "module": "/src/internal/shoelace-element.js" + }, + "summary": "Avatars are used to represent a person or object.", + "tagNameWithoutPrefix": "avatar", + "tagName": "sl-avatar", + "customElement": true, + "jsDoc": "/**\n * @summary Avatars are used to represent a person or object.\n * @documentation https://shoelace.style/components/avatar\n * @status stable\n * @since 2.0\n *\n * @dependency sl-icon\n *\n * @slot icon - The default icon to use when no image or initials are present. Works best with ``.\n *\n * @csspart base - The component's base wrapper.\n * @csspart icon - The container that wraps the avatar's icon.\n * @csspart initials - The container that wraps the avatar's initials.\n * @csspart image - The avatar image. Only shown when the `image` attribute is set.\n *\n * @cssproperty --size - The size of the avatar.\n */", + "documentation": "https://shoelace.style/components/avatar", + "status": "stable", + "since": "2.0", + "dependencies": [ + "sl-icon" + ] + } + ], + "exports": [ + { + "kind": "js", + "name": "default", + "declaration": { + "name": "SlAvatar", + "module": "components/avatar/avatar.js" + } + } + ] + }, + { + "kind": "javascript-module", + "path": "components/button/button.js", + "declarations": [ + { + "kind": "class", + "description": "", + "name": "SlButton", + "cssParts": [ + { + "description": "The component's base wrapper.", + "name": "base" + }, + { + "description": "The container that wraps the prefix.", + "name": "prefix" + }, + { + "description": "The button's label.", + "name": "label" + }, + { + "description": "The container that wraps the suffix.", + "name": "suffix" + }, + { + "description": "The button's caret icon, an `` element.", + "name": "caret" + }, + { + "description": "The spinner that shows when the button is in the loading state.", + "name": "spinner" + } + ], + "slots": [ + { + "description": "The button's label.", + "name": "" + }, + { + "description": "A presentational prefix icon or similar element.", + "name": "prefix" + }, + { + "description": "A presentational suffix icon or similar element.", + "name": "suffix" + } + ], + "members": [ + { + "kind": "field", + "name": "dependencies", + "type": { + "text": "object" + }, + "static": true, + "default": "{\n 'sl-icon': SlIcon,\n 'sl-spinner': SlSpinner\n }" + }, + { + "kind": "field", + "name": "formControlController", + "privacy": "private", + "readonly": true, + "default": "new FormControlController(this, {\n assumeInteractionOn: ['click']\n })" + }, + { + "kind": "field", + "name": "hasSlotController", + "privacy": "private", + "readonly": true, + "default": "new HasSlotController(this, '[default]', 'prefix', 'suffix')" + }, + { + "kind": "field", + "name": "localize", + "privacy": "private", + "readonly": true, + "default": "new LocalizeController(this)" + }, + { + "kind": "field", + "name": "button", + "type": { + "text": "HTMLButtonElement | HTMLLinkElement" + } + }, + { + "kind": "field", + "name": "hasFocus", + "type": { + "text": "boolean" + }, + "privacy": "private", + "default": "false" + }, + { + "kind": "field", + "name": "invalid", + "type": { + "text": "boolean" + }, + "default": "false" + }, + { + "kind": "field", + "name": "title", + "type": { + "text": "string" + }, + "default": "''", + "attribute": "title" + }, + { + "kind": "field", + "name": "variant", + "type": { + "text": "'default' | 'primary' | 'success' | 'neutral' | 'warning' | 'danger' | 'text'" + }, + "default": "'default'", + "description": "The button's theme variant.", + "attribute": "variant", + "reflects": true + }, + { + "kind": "field", + "name": "size", + "type": { + "text": "'small' | 'medium' | 'large'" + }, + "default": "'medium'", + "description": "The button's size.", + "attribute": "size", + "reflects": true + }, + { + "kind": "field", + "name": "caret", + "type": { + "text": "boolean" + }, + "default": "false", + "description": "Draws the button with a caret. Used to indicate that the button triggers a dropdown menu or similar behavior.", + "attribute": "caret", + "reflects": true + }, + { + "kind": "field", + "name": "disabled", + "type": { + "text": "boolean" + }, + "default": "false", + "description": "Disables the button.", + "attribute": "disabled", + "reflects": true + }, + { + "kind": "field", + "name": "loading", + "type": { + "text": "boolean" + }, + "default": "false", + "description": "Draws the button in a loading state.", + "attribute": "loading", + "reflects": true + }, + { + "kind": "field", + "name": "outline", + "type": { + "text": "boolean" + }, + "default": "false", + "description": "Draws an outlined button.", + "attribute": "outline", + "reflects": true + }, + { + "kind": "field", + "name": "pill", + "type": { + "text": "boolean" + }, + "default": "false", + "description": "Draws a pill-style button with rounded edges.", + "attribute": "pill", + "reflects": true + }, + { + "kind": "field", + "name": "circle", + "type": { + "text": "boolean" + }, + "default": "false", + "description": "Draws a circular icon button. When this attribute is present, the button expects a single `` in the\ndefault slot.", + "attribute": "circle", + "reflects": true + }, + { + "kind": "field", + "name": "type", + "type": { + "text": "'button' | 'submit' | 'reset'" + }, + "default": "'button'", + "description": "The type of button. Note that the default value is `button` instead of `submit`, which is opposite of how native\n`