@substrate-system/tool-tip 0.0.0 → 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -16,7 +16,22 @@ Webcomponent for tooltips — text when you hover.
16
16
  [See a live demo](https://substrate-system.github.io/tool-tip/)
17
17
 
18
18
  <details><summary><h2>Contents</h2></summary>
19
+
19
20
  <!-- toc -->
21
+
22
+ - [Install](#install)
23
+ - [API](#api)
24
+ * [ESM](#esm)
25
+ * [Common JS](#common-js)
26
+ - [CSS](#css)
27
+ * [Import CSS](#import-css)
28
+ - [Use](#use)
29
+ * [JS](#js)
30
+ * [HTML](#html)
31
+ * [pre-built](#pre-built)
32
+
33
+ <!-- tocstop -->
34
+
20
35
  </details>
21
36
 
22
37
  ## Install
package/dist/index.cjs CHANGED
@@ -128,7 +128,7 @@ class ToolTip extends HTMLElement {
128
128
  }
129
129
  attributeChangedCallback(name, _oldValue, newValue) {
130
130
  if (name === "content" && this.popup) {
131
- const body = this.popup.querySelector(".tool-tip__body");
131
+ const body = this.popup.querySelector(".body");
132
132
  if (body) {
133
133
  body.textContent = newValue || "";
134
134
  }
@@ -151,14 +151,14 @@ class ToolTip extends HTMLElement {
151
151
  }
152
152
  createPopup() {
153
153
  this.popup = document.createElement("div");
154
- this.popup.className = "tool-tip__popup";
154
+ this.popup.className = "popup";
155
155
  this.popup.setAttribute("role", "tooltip");
156
156
  this.popup.setAttribute("aria-hidden", "true");
157
157
  this.popup.innerHTML = `
158
- <div class="tool-tip__body">${this.content}</div>
159
- <div class="tool-tip__arrow"></div>
158
+ <div class="body">${this.content}</div>
159
+ <div class="arrow"></div>
160
160
  `;
161
- this.arrow = this.popup.querySelector(".tool-tip__arrow");
161
+ this.arrow = this.popup.querySelector(".arrow");
162
162
  if (this.hoist) {
163
163
  document.body.appendChild(this.popup);
164
164
  } else {
@@ -221,7 +221,7 @@ class ToolTip extends HTMLElement {
221
221
  cancelable: true
222
222
  });
223
223
  if (!this.dispatchEvent(showEvent)) return;
224
- this.popup.classList.add("tool-tip__popup--visible");
224
+ this.popup.classList.add("visible");
225
225
  this.popup.setAttribute("aria-hidden", "false");
226
226
  this.positionPopup();
227
227
  this.dispatchEvent(new CustomEvent("tool-tip-after-show", {
@@ -235,7 +235,7 @@ class ToolTip extends HTMLElement {
235
235
  cancelable: true
236
236
  });
237
237
  if (!this.dispatchEvent(hideEvent)) return;
238
- this.popup.classList.remove("tool-tip__popup--visible");
238
+ this.popup.classList.remove("visible");
239
239
  this.popup.setAttribute("aria-hidden", "true");
240
240
  this.dispatchEvent(new CustomEvent("tool-tip-after-hide", {
241
241
  bubbles: true
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
4
- "sourcesContent": ["// for document.querySelector\ndeclare global {\n interface HTMLElementTagNameMap {\n 'tool-tip':ToolTip\n }\n}\n\nexport type Placement =\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'right'\n | 'right-start'\n | 'right-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'left'\n | 'left-start'\n | 'left-end'\n\nexport type Trigger = 'hover'|'focus'|'click'|'manual'\n\nexport class ToolTip extends HTMLElement {\n static observedAttributes = ['content', 'placement', 'disabled',\n 'open', 'distance', 'skidding']\n\n private popup: HTMLDivElement | null = null\n private arrow: HTMLDivElement | null = null\n private target: HTMLElement | null = null\n\n private _open = false\n private _disabled = false\n\n get content (): string {\n return this.getAttribute('content') || ''\n }\n\n set content (value: string) {\n this.setAttribute('content', value)\n }\n\n get placement (): Placement {\n return (this.getAttribute('placement') as Placement) || 'top'\n }\n\n set placement (value: Placement) {\n this.setAttribute('placement', value)\n }\n\n get trigger (): Trigger[] {\n const attr = this.getAttribute('trigger') || 'hover focus'\n return attr.split(' ').filter(Boolean) as Trigger[]\n }\n\n set trigger (value: Trigger[] | string) {\n if (Array.isArray(value)) {\n this.setAttribute('trigger', value.join(' '))\n } else {\n this.setAttribute('trigger', value)\n }\n }\n\n get disabled (): boolean {\n return this._disabled\n }\n\n set disabled (value: boolean) {\n this._disabled = value\n if (value) {\n this.setAttribute('disabled', '')\n } else {\n this.removeAttribute('disabled')\n }\n }\n\n get open (): boolean {\n return this._open\n }\n\n set open (value: boolean) {\n if (this._disabled) return\n const wasOpen = this._open\n this._open = value\n\n if (value && !wasOpen) {\n this.showTooltip()\n } else if (!value && wasOpen) {\n this.hideTooltip()\n }\n }\n\n get distance (): number {\n return parseInt(this.getAttribute('distance') || '8', 10)\n }\n\n set distance (value: number) {\n this.setAttribute('distance', String(value))\n }\n\n get skidding (): number {\n return parseInt(this.getAttribute('skidding') || '0', 10)\n }\n\n set skidding (value: number) {\n this.setAttribute('skidding', String(value))\n }\n\n get hoist (): boolean {\n return this.hasAttribute('hoist')\n }\n\n set hoist (value: boolean) {\n if (value) {\n this.setAttribute('hoist', '')\n } else {\n this.removeAttribute('hoist')\n }\n }\n\n connectedCallback () {\n // Use display: contents so the tooltip doesn't affect layout\n this.style.display = 'contents'\n\n // Find the target element (first child element)\n this.target = this.firstElementChild as HTMLElement\n\n if (!this.target) {\n console.warn('tool-tip: No target element found. ' +\n 'Add a child element.')\n return\n }\n\n // Create the popup element\n this.createPopup()\n\n // Bind event handlers\n this.bindEvents()\n\n // Check if open attribute is set\n if (this.hasAttribute('open')) {\n this._open = true\n this.showTooltip()\n }\n }\n\n disconnectedCallback () {\n this.unbindEvents()\n this.popup?.remove()\n }\n\n attributeChangedCallback (\n name:string,\n _oldValue:string|null,\n newValue:string|null\n ) {\n if (name === 'content' && this.popup) {\n const body = this.popup.querySelector('.tool-tip__body')\n if (body) {\n body.textContent = newValue || ''\n }\n }\n\n if (name === 'placement' && this._open) {\n this.positionPopup()\n }\n\n if (name === 'disabled') {\n this._disabled = newValue !== null\n if (this._disabled && this._open) {\n this.hide()\n }\n }\n\n if (name === 'open') {\n this.open = newValue !== null\n }\n\n if ((name === 'distance' || name === 'skidding') && this._open) {\n this.positionPopup()\n }\n }\n\n private createPopup () {\n this.popup = document.createElement('div')\n this.popup.className = 'tool-tip__popup'\n this.popup.setAttribute('role', 'tooltip')\n this.popup.setAttribute('aria-hidden', 'true')\n this.popup.innerHTML = `\n <div class=\"tool-tip__body\">${this.content}</div>\n <div class=\"tool-tip__arrow\"></div>\n `\n\n this.arrow = this.popup.querySelector('.tool-tip__arrow')\n\n // Append to body if hoisted, otherwise to this element's parent\n if (this.hoist) {\n document.body.appendChild(this.popup)\n } else {\n this.appendChild(this.popup)\n }\n }\n\n private bindEvents () {\n if (!this.target) return\n\n const triggers = this.trigger\n\n if (triggers.includes('hover')) {\n this.target.addEventListener('mouseenter', this.handleMouseEnter)\n this.target.addEventListener('mouseleave', this.handleMouseLeave)\n }\n\n if (triggers.includes('focus')) {\n this.target.addEventListener('focus', this.handleFocus)\n this.target.addEventListener('blur', this.handleBlur)\n }\n\n if (triggers.includes('click')) {\n this.target.addEventListener('click', this.handleClick)\n }\n\n // Add keyboard support\n this.target.addEventListener('keydown', this.handleKeyDown)\n }\n\n private unbindEvents () {\n if (!this.target) return\n\n this.target.removeEventListener('mouseenter', this.handleMouseEnter)\n this.target.removeEventListener('mouseleave', this.handleMouseLeave)\n this.target.removeEventListener('focus', this.handleFocus)\n this.target.removeEventListener('blur', this.handleBlur)\n this.target.removeEventListener('click', this.handleClick)\n this.target.removeEventListener('keydown', this.handleKeyDown)\n }\n\n private handleMouseEnter = () => {\n this.show()\n }\n\n private handleMouseLeave = () => {\n this.hide()\n }\n\n private handleFocus = () => {\n this.show()\n }\n\n private handleBlur = () => {\n this.hide()\n }\n\n private handleClick = () => {\n if (this._open) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n private handleKeyDown = (event: KeyboardEvent) => {\n // Close tooltip on Escape\n if (event.key === 'Escape' && this._open) {\n this.hide()\n }\n }\n\n private showTooltip () {\n if (!this.popup || this._disabled) return\n\n // Emit show event\n const showEvent = new CustomEvent('tool-tip-show', {\n bubbles: true,\n cancelable: true,\n })\n if (!this.dispatchEvent(showEvent)) return\n\n this.popup.classList.add('tool-tip__popup--visible')\n this.popup.setAttribute('aria-hidden', 'false')\n\n // Position the popup\n this.positionPopup()\n\n // Emit after-show event\n this.dispatchEvent(new CustomEvent('tool-tip-after-show', {\n bubbles: true\n }))\n }\n\n private hideTooltip () {\n if (!this.popup) return\n\n // Emit hide event\n const hideEvent = new CustomEvent('tool-tip-hide', {\n bubbles: true,\n cancelable: true,\n })\n if (!this.dispatchEvent(hideEvent)) return\n\n this.popup.classList.remove('tool-tip__popup--visible')\n this.popup.setAttribute('aria-hidden', 'true')\n\n // Emit after-hide event\n this.dispatchEvent(new CustomEvent('tool-tip-after-hide', {\n bubbles: true\n }))\n }\n\n private positionPopup () {\n if (!this.popup || !this.target) return\n\n const targetRect = this.target.getBoundingClientRect()\n const popupRect = this.popup.getBoundingClientRect()\n const arrowSize = 8\n\n let top = 0\n let left = 0\n let arrowTop = ''\n let arrowLeft = ''\n let arrowTransform = ''\n\n const distance = this.distance\n const skidding = this.skidding\n const placement = this.getOptimalPlacement(targetRect, popupRect)\n\n // Set data attribute for CSS styling\n this.popup.dataset.placement = placement\n\n switch (placement) {\n case 'top':\n top = targetRect.top - popupRect.height - distance - arrowSize\n left = targetRect.left + (targetRect.width / 2) -\n (popupRect.width / 2) + skidding\n arrowTop = '100%'\n arrowLeft = '50%'\n arrowTransform = 'translateX(-50%)'\n break\n case 'top-start':\n top = targetRect.top - popupRect.height - distance - arrowSize\n left = targetRect.left + skidding\n arrowTop = '100%'\n arrowLeft = `${Math.min(24, popupRect.width / 2)}px`\n arrowTransform = 'translateX(-50%)'\n break\n case 'top-end':\n top = targetRect.top - popupRect.height - distance - arrowSize\n left = targetRect.right - popupRect.width + skidding\n arrowTop = '100%'\n arrowLeft = `calc(100% - ${Math.min(24, popupRect.width / 2)}px)`\n arrowTransform = 'translateX(-50%)'\n break\n case 'bottom':\n top = targetRect.bottom + distance + arrowSize\n left = targetRect.left + (targetRect.width / 2) -\n (popupRect.width / 2) + skidding\n arrowTop = '0'\n arrowLeft = '50%'\n arrowTransform = 'translateX(-50%) translateY(-100%)'\n break\n case 'bottom-start':\n top = targetRect.bottom + distance + arrowSize\n left = targetRect.left + skidding\n arrowTop = '0'\n arrowLeft = `${Math.min(24, popupRect.width / 2)}px`\n arrowTransform = 'translateX(-50%) translateY(-100%)'\n break\n case 'bottom-end':\n top = targetRect.bottom + distance + arrowSize\n left = targetRect.right - popupRect.width + skidding\n arrowTop = '0'\n arrowLeft = `calc(100% - ${Math.min(24, popupRect.width / 2)}px)`\n arrowTransform = 'translateX(-50%) translateY(-100%)'\n break\n case 'left':\n top = targetRect.top + (targetRect.height / 2) -\n (popupRect.height / 2) + skidding\n left = targetRect.left - popupRect.width - distance - arrowSize\n arrowTop = '50%'\n arrowLeft = '100%'\n arrowTransform = 'translateY(-50%)'\n break\n case 'left-start':\n top = targetRect.top + skidding\n left = targetRect.left - popupRect.width - distance - arrowSize\n arrowTop = `${Math.min(16, popupRect.height / 2)}px`\n arrowLeft = '100%'\n arrowTransform = 'translateY(-50%)'\n break\n case 'left-end':\n top = targetRect.bottom - popupRect.height + skidding\n left = targetRect.left - popupRect.width - distance - arrowSize\n arrowTop = `calc(100% - ${Math.min(16, popupRect.height / 2)}px)`\n arrowLeft = '100%'\n arrowTransform = 'translateY(-50%)'\n break\n case 'right':\n top = targetRect.top + (targetRect.height / 2) -\n (popupRect.height / 2) + skidding\n left = targetRect.right + distance + arrowSize\n arrowTop = '50%'\n arrowLeft = '0'\n arrowTransform = 'translateY(-50%) translateX(-100%)'\n break\n case 'right-start':\n top = targetRect.top + skidding\n left = targetRect.right + distance + arrowSize\n arrowTop = `${Math.min(16, popupRect.height / 2)}px`\n arrowLeft = '0'\n arrowTransform = 'translateY(-50%) translateX(-100%)'\n break\n case 'right-end':\n top = targetRect.bottom - popupRect.height + skidding\n left = targetRect.right + distance + arrowSize\n arrowTop = `calc(100% - ${Math.min(16, popupRect.height / 2)}px)`\n arrowLeft = '0'\n arrowTransform = 'translateY(-50%) translateX(-100%)'\n break\n }\n\n // Adjust for scroll position\n if (this.hoist) {\n top += window.scrollY\n left += window.scrollX\n }\n\n // Apply position\n this.popup.style.top = `${top}px`\n this.popup.style.left = `${left}px`\n\n // Position the arrow\n if (this.arrow) {\n this.arrow.style.top = arrowTop\n this.arrow.style.left = arrowLeft\n this.arrow.style.transform = arrowTransform\n }\n }\n\n private getOptimalPlacement (targetRect:DOMRect, popupRect:DOMRect):Placement {\n const placement = this.placement\n const viewportWidth = window.innerWidth\n const viewportHeight = window.innerHeight\n const distance = this.distance\n const arrowSize = 8\n\n // Check if the preferred placement fits\n const fits = {\n top: targetRect.top - popupRect.height - distance - arrowSize > 0,\n bottom: (targetRect.bottom + popupRect.height + distance +\n arrowSize < viewportHeight),\n left: targetRect.left - popupRect.width - distance - arrowSize > 0,\n right: (targetRect.right + popupRect.width + distance +\n arrowSize < viewportWidth),\n }\n\n // Get the base direction from the placement\n const baseDirection = placement.split('-')[0] as 'top'|\n 'bottom'|\n 'left'|\n 'right'\n\n // If preferred placement fits, use it\n if (fits[baseDirection]) {\n return placement\n }\n\n // Find the best alternative\n const opposites: Record<string, string> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n }\n\n const opposite = opposites[baseDirection] as\n 'top'|'bottom'|'left'|'right'\n if (fits[opposite]) {\n // Return the opposite with the same alignment\n const alignment = (placement.includes('-') ?\n placement.split('-')[1] :\n '')\n return (alignment ?\n `${opposite}-${alignment}` :\n opposite) as Placement\n }\n\n // Fall back to a direction that fits\n for (const dir of ['top', 'bottom', 'left', 'right'] as const) {\n if (fits[dir]) {\n return dir\n }\n }\n\n // If nothing fits, return original placement\n return placement\n }\n\n /**\n * Programmatically show the tooltip\n */\n show () {\n if (this._disabled) return\n this.open = true\n }\n\n /**\n * Programmatically hide the tooltip\n */\n hide () {\n this.open = false\n }\n}\n\nif ('customElements' in window) {\n customElements.define('tool-tip', ToolTip)\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// for document.querySelector\ndeclare global {\n interface HTMLElementTagNameMap {\n 'tool-tip':ToolTip\n }\n}\n\nexport type Placement =\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'right'\n | 'right-start'\n | 'right-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'left'\n | 'left-start'\n | 'left-end'\n\nexport type Trigger = 'hover'|'focus'|'click'|'manual'\n\nexport class ToolTip extends HTMLElement {\n static observedAttributes = ['content', 'placement', 'disabled',\n 'open', 'distance', 'skidding']\n\n private popup:HTMLDivElement|null = null\n private arrow:HTMLDivElement|null = null\n private target:HTMLElement|null = null\n\n private _open = false\n private _disabled = false\n\n get content ():string {\n return this.getAttribute('content') || ''\n }\n\n set content (value:string) {\n this.setAttribute('content', value)\n }\n\n get placement ():Placement {\n return (this.getAttribute('placement') as Placement) || 'top'\n }\n\n set placement (value:Placement) {\n this.setAttribute('placement', value)\n }\n\n get trigger ():Trigger[] {\n const attr = this.getAttribute('trigger') || 'hover focus'\n return attr.split(' ').filter(Boolean) as Trigger[]\n }\n\n set trigger (value:Trigger[]|string) {\n if (Array.isArray(value)) {\n this.setAttribute('trigger', value.join(' '))\n } else {\n this.setAttribute('trigger', value)\n }\n }\n\n get disabled (): boolean {\n return this._disabled\n }\n\n set disabled (value: boolean) {\n this._disabled = value\n if (value) {\n this.setAttribute('disabled', '')\n } else {\n this.removeAttribute('disabled')\n }\n }\n\n get open (): boolean {\n return this._open\n }\n\n set open (value: boolean) {\n if (this._disabled) return\n const wasOpen = this._open\n this._open = value\n\n if (value && !wasOpen) {\n this.showTooltip()\n } else if (!value && wasOpen) {\n this.hideTooltip()\n }\n }\n\n get distance (): number {\n return parseInt(this.getAttribute('distance') || '8', 10)\n }\n\n set distance (value: number) {\n this.setAttribute('distance', String(value))\n }\n\n get skidding (): number {\n return parseInt(this.getAttribute('skidding') || '0', 10)\n }\n\n set skidding (value: number) {\n this.setAttribute('skidding', String(value))\n }\n\n get hoist (): boolean {\n return this.hasAttribute('hoist')\n }\n\n set hoist (value: boolean) {\n if (value) {\n this.setAttribute('hoist', '')\n } else {\n this.removeAttribute('hoist')\n }\n }\n\n connectedCallback () {\n // Use display: contents so the tooltip doesn't affect layout\n this.style.display = 'contents'\n\n // Find the target element (first child element)\n this.target = this.firstElementChild as HTMLElement\n\n if (!this.target) {\n console.warn('tool-tip: No target element found. ' +\n 'Add a child element.')\n return\n }\n\n // Create the popup element\n this.createPopup()\n\n // Bind event handlers\n this.bindEvents()\n\n // Check if open attribute is set\n if (this.hasAttribute('open')) {\n this._open = true\n this.showTooltip()\n }\n }\n\n disconnectedCallback () {\n this.unbindEvents()\n this.popup?.remove()\n }\n\n attributeChangedCallback (\n name:string,\n _oldValue:string|null,\n newValue:string|null\n ) {\n if (name === 'content' && this.popup) {\n const body = this.popup.querySelector('.body')\n if (body) {\n body.textContent = newValue || ''\n }\n }\n\n if (name === 'placement' && this._open) {\n this.positionPopup()\n }\n\n if (name === 'disabled') {\n this._disabled = newValue !== null\n if (this._disabled && this._open) {\n this.hide()\n }\n }\n\n if (name === 'open') {\n this.open = newValue !== null\n }\n\n if ((name === 'distance' || name === 'skidding') && this._open) {\n this.positionPopup()\n }\n }\n\n private createPopup () {\n this.popup = document.createElement('div')\n this.popup.className = 'popup'\n this.popup.setAttribute('role', 'tooltip')\n this.popup.setAttribute('aria-hidden', 'true')\n this.popup.innerHTML = `\n <div class=\"body\">${this.content}</div>\n <div class=\"arrow\"></div>\n `\n\n this.arrow = this.popup.querySelector('.arrow')\n\n // Append to body if hoisted, otherwise to this element's parent\n if (this.hoist) {\n document.body.appendChild(this.popup)\n } else {\n this.appendChild(this.popup)\n }\n }\n\n private bindEvents () {\n if (!this.target) return\n\n const triggers = this.trigger\n\n if (triggers.includes('hover')) {\n this.target.addEventListener('mouseenter', this.handleMouseEnter)\n this.target.addEventListener('mouseleave', this.handleMouseLeave)\n }\n\n if (triggers.includes('focus')) {\n this.target.addEventListener('focus', this.handleFocus)\n this.target.addEventListener('blur', this.handleBlur)\n }\n\n if (triggers.includes('click')) {\n this.target.addEventListener('click', this.handleClick)\n }\n\n // Add keyboard support\n this.target.addEventListener('keydown', this.handleKeyDown)\n }\n\n private unbindEvents () {\n if (!this.target) return\n\n this.target.removeEventListener('mouseenter', this.handleMouseEnter)\n this.target.removeEventListener('mouseleave', this.handleMouseLeave)\n this.target.removeEventListener('focus', this.handleFocus)\n this.target.removeEventListener('blur', this.handleBlur)\n this.target.removeEventListener('click', this.handleClick)\n this.target.removeEventListener('keydown', this.handleKeyDown)\n }\n\n private handleMouseEnter = () => {\n this.show()\n }\n\n private handleMouseLeave = () => {\n this.hide()\n }\n\n private handleFocus = () => {\n this.show()\n }\n\n private handleBlur = () => {\n this.hide()\n }\n\n private handleClick = () => {\n if (this._open) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n private handleKeyDown = (event: KeyboardEvent) => {\n // Close tooltip on Escape\n if (event.key === 'Escape' && this._open) {\n this.hide()\n }\n }\n\n private showTooltip () {\n if (!this.popup || this._disabled) return\n\n // Emit show event\n const showEvent = new CustomEvent('tool-tip-show', {\n bubbles: true,\n cancelable: true,\n })\n if (!this.dispatchEvent(showEvent)) return\n\n this.popup.classList.add('visible')\n this.popup.setAttribute('aria-hidden', 'false')\n\n // Position the popup\n this.positionPopup()\n\n // Emit after-show event\n this.dispatchEvent(new CustomEvent('tool-tip-after-show', {\n bubbles: true\n }))\n }\n\n private hideTooltip () {\n if (!this.popup) return\n\n // Emit hide event\n const hideEvent = new CustomEvent('tool-tip-hide', {\n bubbles: true,\n cancelable: true,\n })\n if (!this.dispatchEvent(hideEvent)) return\n\n this.popup.classList.remove('visible')\n this.popup.setAttribute('aria-hidden', 'true')\n\n // Emit after-hide event\n this.dispatchEvent(new CustomEvent('tool-tip-after-hide', {\n bubbles: true\n }))\n }\n\n private positionPopup () {\n if (!this.popup || !this.target) return\n\n const targetRect = this.target.getBoundingClientRect()\n const popupRect = this.popup.getBoundingClientRect()\n const arrowSize = 8\n\n let top = 0\n let left = 0\n let arrowTop = ''\n let arrowLeft = ''\n let arrowTransform = ''\n\n const distance = this.distance\n const skidding = this.skidding\n const placement = this.getOptimalPlacement(targetRect, popupRect)\n\n // Set data attribute for CSS styling\n this.popup.dataset.placement = placement\n\n switch (placement) {\n case 'top':\n top = targetRect.top - popupRect.height - distance - arrowSize\n left = targetRect.left + (targetRect.width / 2) -\n (popupRect.width / 2) + skidding\n arrowTop = '100%'\n arrowLeft = '50%'\n arrowTransform = 'translateX(-50%)'\n break\n case 'top-start':\n top = targetRect.top - popupRect.height - distance - arrowSize\n left = targetRect.left + skidding\n arrowTop = '100%'\n arrowLeft = `${Math.min(24, popupRect.width / 2)}px`\n arrowTransform = 'translateX(-50%)'\n break\n case 'top-end':\n top = targetRect.top - popupRect.height - distance - arrowSize\n left = targetRect.right - popupRect.width + skidding\n arrowTop = '100%'\n arrowLeft = `calc(100% - ${Math.min(24, popupRect.width / 2)}px)`\n arrowTransform = 'translateX(-50%)'\n break\n case 'bottom':\n top = targetRect.bottom + distance + arrowSize\n left = targetRect.left + (targetRect.width / 2) -\n (popupRect.width / 2) + skidding\n arrowTop = '0'\n arrowLeft = '50%'\n arrowTransform = 'translateX(-50%) translateY(-100%)'\n break\n case 'bottom-start':\n top = targetRect.bottom + distance + arrowSize\n left = targetRect.left + skidding\n arrowTop = '0'\n arrowLeft = `${Math.min(24, popupRect.width / 2)}px`\n arrowTransform = 'translateX(-50%) translateY(-100%)'\n break\n case 'bottom-end':\n top = targetRect.bottom + distance + arrowSize\n left = targetRect.right - popupRect.width + skidding\n arrowTop = '0'\n arrowLeft = `calc(100% - ${Math.min(24, popupRect.width / 2)}px)`\n arrowTransform = 'translateX(-50%) translateY(-100%)'\n break\n case 'left':\n top = targetRect.top + (targetRect.height / 2) -\n (popupRect.height / 2) + skidding\n left = targetRect.left - popupRect.width - distance - arrowSize\n arrowTop = '50%'\n arrowLeft = '100%'\n arrowTransform = 'translateY(-50%)'\n break\n case 'left-start':\n top = targetRect.top + skidding\n left = targetRect.left - popupRect.width - distance - arrowSize\n arrowTop = `${Math.min(16, popupRect.height / 2)}px`\n arrowLeft = '100%'\n arrowTransform = 'translateY(-50%)'\n break\n case 'left-end':\n top = targetRect.bottom - popupRect.height + skidding\n left = targetRect.left - popupRect.width - distance - arrowSize\n arrowTop = `calc(100% - ${Math.min(16, popupRect.height / 2)}px)`\n arrowLeft = '100%'\n arrowTransform = 'translateY(-50%)'\n break\n case 'right':\n top = targetRect.top + (targetRect.height / 2) -\n (popupRect.height / 2) + skidding\n left = targetRect.right + distance + arrowSize\n arrowTop = '50%'\n arrowLeft = '0'\n arrowTransform = 'translateY(-50%) translateX(-100%)'\n break\n case 'right-start':\n top = targetRect.top + skidding\n left = targetRect.right + distance + arrowSize\n arrowTop = `${Math.min(16, popupRect.height / 2)}px`\n arrowLeft = '0'\n arrowTransform = 'translateY(-50%) translateX(-100%)'\n break\n case 'right-end':\n top = targetRect.bottom - popupRect.height + skidding\n left = targetRect.right + distance + arrowSize\n arrowTop = `calc(100% - ${Math.min(16, popupRect.height / 2)}px)`\n arrowLeft = '0'\n arrowTransform = 'translateY(-50%) translateX(-100%)'\n break\n }\n\n // Adjust for scroll position\n if (this.hoist) {\n top += window.scrollY\n left += window.scrollX\n }\n\n // Apply position\n this.popup.style.top = `${top}px`\n this.popup.style.left = `${left}px`\n\n // Position the arrow\n if (this.arrow) {\n this.arrow.style.top = arrowTop\n this.arrow.style.left = arrowLeft\n this.arrow.style.transform = arrowTransform\n }\n }\n\n private getOptimalPlacement (targetRect:DOMRect, popupRect:DOMRect):Placement {\n const placement = this.placement\n const viewportWidth = window.innerWidth\n const viewportHeight = window.innerHeight\n const distance = this.distance\n const arrowSize = 8\n\n // Check if the preferred placement fits\n const fits = {\n top: targetRect.top - popupRect.height - distance - arrowSize > 0,\n bottom: (targetRect.bottom + popupRect.height + distance +\n arrowSize < viewportHeight),\n left: targetRect.left - popupRect.width - distance - arrowSize > 0,\n right: (targetRect.right + popupRect.width + distance +\n arrowSize < viewportWidth),\n }\n\n // Get the base direction from the placement\n const baseDirection = placement.split('-')[0] as 'top'|\n 'bottom'|\n 'left'|\n 'right'\n\n // If preferred placement fits, use it\n if (fits[baseDirection]) {\n return placement\n }\n\n // Find the best alternative\n const opposites: Record<string, string> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n }\n\n const opposite = opposites[baseDirection] as\n 'top'|'bottom'|'left'|'right'\n if (fits[opposite]) {\n // Return the opposite with the same alignment\n const alignment = (placement.includes('-') ?\n placement.split('-')[1] :\n '')\n return (alignment ?\n `${opposite}-${alignment}` :\n opposite) as Placement\n }\n\n // Fall back to a direction that fits\n for (const dir of ['top', 'bottom', 'left', 'right'] as const) {\n if (fits[dir]) {\n return dir\n }\n }\n\n // If nothing fits, return original placement\n return placement\n }\n\n /**\n * Programmatically show the tooltip\n */\n show () {\n if (this._disabled) return\n this.open = true\n }\n\n /**\n * Programmatically hide the tooltip\n */\n hide () {\n this.open = false\n }\n}\n\nif ('customElements' in window) {\n customElements.define('tool-tip', ToolTip)\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/dist/index.css CHANGED
@@ -1,8 +1,8 @@
1
- tool-tip:not(:defined) {
2
- display: none;
3
- }
4
-
5
1
  tool-tip {
2
+ &:not(:defined) {
3
+ display: none;
4
+ }
5
+
6
6
  --tool-tip-max-width: 20rem;
7
7
  --tool-tip-show-delay: .15s;
8
8
  --tool-tip-hide-delay: 0s;
@@ -14,64 +14,64 @@ tool-tip {
14
14
  --tool-tip-line-height: 1.4;
15
15
  --tool-tip-arrow-size: 8px;
16
16
  --tool-tip-z-index: 1000;
17
- }
18
17
 
19
- .tool-tip__popup {
20
- z-index: var(--tool-tip-z-index);
21
- max-width: var(--tool-tip-max-width);
22
- pointer-events: none;
23
- opacity: 0;
24
- visibility: hidden;
25
- transition: opacity var(--tool-tip-hide-delay) ease,
26
- visibility var(--tool-tip-hide-delay) ease;
27
- position: fixed;
28
- }
18
+ & .popup {
19
+ z-index: var(--tool-tip-z-index);
20
+ max-width: var(--tool-tip-max-width);
21
+ pointer-events: none;
22
+ opacity: 0;
23
+ visibility: hidden;
24
+ transition: opacity var(--tool-tip-hide-delay) ease,
25
+ visibility var(--tool-tip-hide-delay) ease;
26
+ position: fixed;
29
27
 
30
- .tool-tip__popup--visible {
31
- opacity: 1;
32
- visibility: visible;
33
- transition: opacity var(--tool-tip-show-delay) ease,
34
- visibility var(--tool-tip-show-delay) ease;
35
- }
28
+ &.visible {
29
+ opacity: 1;
30
+ visibility: visible;
31
+ transition: opacity var(--tool-tip-show-delay) ease,
32
+ visibility var(--tool-tip-show-delay) ease;
33
+ }
34
+ }
36
35
 
37
- .tool-tip__body {
38
- padding: var(--tool-tip-padding);
39
- background: var(--tool-tip-background);
40
- color: var(--tool-tip-color);
41
- border-radius: var(--tool-tip-border-radius);
42
- font-size: var(--tool-tip-font-size);
43
- line-height: var(--tool-tip-line-height);
44
- word-wrap: break-word;
45
- box-shadow: 0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a;
46
- }
36
+ & .body {
37
+ padding: var(--tool-tip-padding);
38
+ background: var(--tool-tip-background);
39
+ color: var(--tool-tip-color);
40
+ border-radius: var(--tool-tip-border-radius);
41
+ font-size: var(--tool-tip-font-size);
42
+ line-height: var(--tool-tip-line-height);
43
+ overflow-wrap: break-word;
44
+ box-shadow: 0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a;
45
+ }
47
46
 
48
- .tool-tip__arrow {
49
- border: var(--tool-tip-arrow-size) solid transparent;
50
- width: 0;
51
- height: 0;
52
- position: absolute;
53
- }
47
+ & .arrow {
48
+ border: var(--tool-tip-arrow-size) solid transparent;
49
+ width: 0;
50
+ height: 0;
51
+ position: absolute;
52
+ }
54
53
 
55
- .tool-tip__popup[data-placement^="top"] .tool-tip__arrow {
56
- border-top-color: var(--tool-tip-background);
57
- border-bottom: 0;
58
- }
54
+ & .popup[data-placement^="top"] .arrow {
55
+ border-top-color: var(--tool-tip-background);
56
+ border-bottom: 0;
57
+ }
59
58
 
60
- .tool-tip__popup[data-placement^="bottom"] .tool-tip__arrow {
61
- border-bottom-color: var(--tool-tip-background);
62
- border-top: 0;
63
- }
59
+ & .popup[data-placement^="bottom"] .arrow {
60
+ border-bottom-color: var(--tool-tip-background);
61
+ border-top: 0;
62
+ }
64
63
 
65
- .tool-tip__popup[data-placement^="left"] .tool-tip__arrow {
66
- border-left-color: var(--tool-tip-background);
67
- border-right: 0;
68
- }
64
+ & .popup[data-placement^="left"] .arrow {
65
+ border-left-color: var(--tool-tip-background);
66
+ border-right: 0;
67
+ }
69
68
 
70
- .tool-tip__popup[data-placement^="right"] .tool-tip__arrow {
71
- border-right-color: var(--tool-tip-background);
72
- border-left: 0;
73
- }
69
+ & .popup[data-placement^="right"] .arrow {
70
+ border-right-color: var(--tool-tip-background);
71
+ border-left: 0;
72
+ }
74
73
 
75
- tool-tip[disabled] .tool-tip__popup {
76
- display: none;
74
+ &[disabled] .popup {
75
+ display: none;
76
+ }
77
77
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,qBAAqB;QAC3B,UAAU,EAAC,OAAO,CAAA;KACrB;CACJ;AAED,MAAM,MAAM,SAAS,GACf,KAAK,GACL,WAAW,GACX,SAAS,GACT,OAAO,GACP,aAAa,GACb,WAAW,GACX,QAAQ,GACR,cAAc,GACd,YAAY,GACZ,MAAM,GACN,YAAY,GACZ,UAAU,CAAA;AAEhB,MAAM,MAAM,OAAO,GAAG,OAAO,GAAC,OAAO,GAAC,OAAO,GAAC,QAAQ,CAAA;AAEtD,qBAAa,OAAQ,SAAQ,WAAW;IACpC,MAAM,CAAC,kBAAkB,WACU;IAEnC,OAAO,CAAC,KAAK,CAA8B;IAC3C,OAAO,CAAC,KAAK,CAA8B;IAC3C,OAAO,CAAC,MAAM,CAA2B;IAEzC,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,SAAS,CAAQ;IAEzB,IAAI,OAAO,IAAK,MAAM,CAErB;IAED,IAAI,OAAO,CAAE,KAAK,EAAE,MAAM,EAEzB;IAED,IAAI,SAAS,IAAK,SAAS,CAE1B;IAED,IAAI,SAAS,CAAE,KAAK,EAAE,SAAS,EAE9B;IAED,IAAI,OAAO,IAAK,OAAO,EAAE,CAGxB;IAED,IAAI,OAAO,CAAE,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,EAMrC;IAED,IAAI,QAAQ,IAAK,OAAO,CAEvB;IAED,IAAI,QAAQ,CAAE,KAAK,EAAE,OAAO,EAO3B;IAED,IAAI,IAAI,IAAK,OAAO,CAEnB;IAED,IAAI,IAAI,CAAE,KAAK,EAAE,OAAO,EAUvB;IAED,IAAI,QAAQ,IAAK,MAAM,CAEtB;IAED,IAAI,QAAQ,CAAE,KAAK,EAAE,MAAM,EAE1B;IAED,IAAI,QAAQ,IAAK,MAAM,CAEtB;IAED,IAAI,QAAQ,CAAE,KAAK,EAAE,MAAM,EAE1B;IAED,IAAI,KAAK,IAAK,OAAO,CAEpB;IAED,IAAI,KAAK,CAAE,KAAK,EAAE,OAAO,EAMxB;IAED,iBAAiB;IA0BjB,oBAAoB;IAKpB,wBAAwB,CACpB,IAAI,EAAC,MAAM,EACX,SAAS,EAAC,MAAM,GAAC,IAAI,EACrB,QAAQ,EAAC,MAAM,GAAC,IAAI;IA6BxB,OAAO,CAAC,WAAW;IAoBnB,OAAO,CAAC,UAAU;IAuBlB,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,gBAAgB,CAEvB;IAED,OAAO,CAAC,gBAAgB,CAEvB;IAED,OAAO,CAAC,WAAW,CAElB;IAED,OAAO,CAAC,UAAU,CAEjB;IAED,OAAO,CAAC,WAAW,CAMlB;IAED,OAAO,CAAC,aAAa,CAKpB;IAED,OAAO,CAAC,WAAW;IAsBnB,OAAO,CAAC,WAAW;IAmBnB,OAAO,CAAC,aAAa;IAiIrB,OAAO,CAAC,mBAAmB;IA2D3B;;OAEG;IACH,IAAI;IAKJ;;OAEG;IACH,IAAI;CAGP"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,qBAAqB;QAC3B,UAAU,EAAC,OAAO,CAAA;KACrB;CACJ;AAED,MAAM,MAAM,SAAS,GACf,KAAK,GACL,WAAW,GACX,SAAS,GACT,OAAO,GACP,aAAa,GACb,WAAW,GACX,QAAQ,GACR,cAAc,GACd,YAAY,GACZ,MAAM,GACN,YAAY,GACZ,UAAU,CAAA;AAEhB,MAAM,MAAM,OAAO,GAAG,OAAO,GAAC,OAAO,GAAC,OAAO,GAAC,QAAQ,CAAA;AAEtD,qBAAa,OAAQ,SAAQ,WAAW;IACpC,MAAM,CAAC,kBAAkB,WACU;IAEnC,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,MAAM,CAAwB;IAEtC,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,SAAS,CAAQ;IAEzB,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,OAAO,CAAE,KAAK,EAAC,MAAM,EAExB;IAED,IAAI,SAAS,IAAI,SAAS,CAEzB;IAED,IAAI,SAAS,CAAE,KAAK,EAAC,SAAS,EAE7B;IAED,IAAI,OAAO,IAAI,OAAO,EAAE,CAGvB;IAED,IAAI,OAAO,CAAE,KAAK,EAAC,OAAO,EAAE,GAAC,MAAM,EAMlC;IAED,IAAI,QAAQ,IAAK,OAAO,CAEvB;IAED,IAAI,QAAQ,CAAE,KAAK,EAAE,OAAO,EAO3B;IAED,IAAI,IAAI,IAAK,OAAO,CAEnB;IAED,IAAI,IAAI,CAAE,KAAK,EAAE,OAAO,EAUvB;IAED,IAAI,QAAQ,IAAK,MAAM,CAEtB;IAED,IAAI,QAAQ,CAAE,KAAK,EAAE,MAAM,EAE1B;IAED,IAAI,QAAQ,IAAK,MAAM,CAEtB;IAED,IAAI,QAAQ,CAAE,KAAK,EAAE,MAAM,EAE1B;IAED,IAAI,KAAK,IAAK,OAAO,CAEpB;IAED,IAAI,KAAK,CAAE,KAAK,EAAE,OAAO,EAMxB;IAED,iBAAiB;IA0BjB,oBAAoB;IAKpB,wBAAwB,CACpB,IAAI,EAAC,MAAM,EACX,SAAS,EAAC,MAAM,GAAC,IAAI,EACrB,QAAQ,EAAC,MAAM,GAAC,IAAI;IA6BxB,OAAO,CAAC,WAAW;IAoBnB,OAAO,CAAC,UAAU;IAuBlB,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,gBAAgB,CAEvB;IAED,OAAO,CAAC,gBAAgB,CAEvB;IAED,OAAO,CAAC,WAAW,CAElB;IAED,OAAO,CAAC,UAAU,CAEjB;IAED,OAAO,CAAC,WAAW,CAMlB;IAED,OAAO,CAAC,aAAa,CAKpB;IAED,OAAO,CAAC,WAAW;IAsBnB,OAAO,CAAC,WAAW;IAmBnB,OAAO,CAAC,aAAa;IAiIrB,OAAO,CAAC,mBAAmB;IA2D3B;;OAEG;IACH,IAAI;IAKJ;;OAEG;IACH,IAAI;CAGP"}
package/dist/index.js CHANGED
@@ -106,7 +106,7 @@ class ToolTip extends HTMLElement {
106
106
  }
107
107
  attributeChangedCallback(name, _oldValue, newValue) {
108
108
  if (name === "content" && this.popup) {
109
- const body = this.popup.querySelector(".tool-tip__body");
109
+ const body = this.popup.querySelector(".body");
110
110
  if (body) {
111
111
  body.textContent = newValue || "";
112
112
  }
@@ -129,14 +129,14 @@ class ToolTip extends HTMLElement {
129
129
  }
130
130
  createPopup() {
131
131
  this.popup = document.createElement("div");
132
- this.popup.className = "tool-tip__popup";
132
+ this.popup.className = "popup";
133
133
  this.popup.setAttribute("role", "tooltip");
134
134
  this.popup.setAttribute("aria-hidden", "true");
135
135
  this.popup.innerHTML = `
136
- <div class="tool-tip__body">${this.content}</div>
137
- <div class="tool-tip__arrow"></div>
136
+ <div class="body">${this.content}</div>
137
+ <div class="arrow"></div>
138
138
  `;
139
- this.arrow = this.popup.querySelector(".tool-tip__arrow");
139
+ this.arrow = this.popup.querySelector(".arrow");
140
140
  if (this.hoist) {
141
141
  document.body.appendChild(this.popup);
142
142
  } else {
@@ -199,7 +199,7 @@ class ToolTip extends HTMLElement {
199
199
  cancelable: true
200
200
  });
201
201
  if (!this.dispatchEvent(showEvent)) return;
202
- this.popup.classList.add("tool-tip__popup--visible");
202
+ this.popup.classList.add("visible");
203
203
  this.popup.setAttribute("aria-hidden", "false");
204
204
  this.positionPopup();
205
205
  this.dispatchEvent(new CustomEvent("tool-tip-after-show", {
@@ -213,7 +213,7 @@ class ToolTip extends HTMLElement {
213
213
  cancelable: true
214
214
  });
215
215
  if (!this.dispatchEvent(hideEvent)) return;
216
- this.popup.classList.remove("tool-tip__popup--visible");
216
+ this.popup.classList.remove("visible");
217
217
  this.popup.setAttribute("aria-hidden", "true");
218
218
  this.dispatchEvent(new CustomEvent("tool-tip-after-hide", {
219
219
  bubbles: true
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
4
- "sourcesContent": ["// for document.querySelector\ndeclare global {\n interface HTMLElementTagNameMap {\n 'tool-tip':ToolTip\n }\n}\n\nexport type Placement =\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'right'\n | 'right-start'\n | 'right-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'left'\n | 'left-start'\n | 'left-end'\n\nexport type Trigger = 'hover'|'focus'|'click'|'manual'\n\nexport class ToolTip extends HTMLElement {\n static observedAttributes = ['content', 'placement', 'disabled',\n 'open', 'distance', 'skidding']\n\n private popup: HTMLDivElement | null = null\n private arrow: HTMLDivElement | null = null\n private target: HTMLElement | null = null\n\n private _open = false\n private _disabled = false\n\n get content (): string {\n return this.getAttribute('content') || ''\n }\n\n set content (value: string) {\n this.setAttribute('content', value)\n }\n\n get placement (): Placement {\n return (this.getAttribute('placement') as Placement) || 'top'\n }\n\n set placement (value: Placement) {\n this.setAttribute('placement', value)\n }\n\n get trigger (): Trigger[] {\n const attr = this.getAttribute('trigger') || 'hover focus'\n return attr.split(' ').filter(Boolean) as Trigger[]\n }\n\n set trigger (value: Trigger[] | string) {\n if (Array.isArray(value)) {\n this.setAttribute('trigger', value.join(' '))\n } else {\n this.setAttribute('trigger', value)\n }\n }\n\n get disabled (): boolean {\n return this._disabled\n }\n\n set disabled (value: boolean) {\n this._disabled = value\n if (value) {\n this.setAttribute('disabled', '')\n } else {\n this.removeAttribute('disabled')\n }\n }\n\n get open (): boolean {\n return this._open\n }\n\n set open (value: boolean) {\n if (this._disabled) return\n const wasOpen = this._open\n this._open = value\n\n if (value && !wasOpen) {\n this.showTooltip()\n } else if (!value && wasOpen) {\n this.hideTooltip()\n }\n }\n\n get distance (): number {\n return parseInt(this.getAttribute('distance') || '8', 10)\n }\n\n set distance (value: number) {\n this.setAttribute('distance', String(value))\n }\n\n get skidding (): number {\n return parseInt(this.getAttribute('skidding') || '0', 10)\n }\n\n set skidding (value: number) {\n this.setAttribute('skidding', String(value))\n }\n\n get hoist (): boolean {\n return this.hasAttribute('hoist')\n }\n\n set hoist (value: boolean) {\n if (value) {\n this.setAttribute('hoist', '')\n } else {\n this.removeAttribute('hoist')\n }\n }\n\n connectedCallback () {\n // Use display: contents so the tooltip doesn't affect layout\n this.style.display = 'contents'\n\n // Find the target element (first child element)\n this.target = this.firstElementChild as HTMLElement\n\n if (!this.target) {\n console.warn('tool-tip: No target element found. ' +\n 'Add a child element.')\n return\n }\n\n // Create the popup element\n this.createPopup()\n\n // Bind event handlers\n this.bindEvents()\n\n // Check if open attribute is set\n if (this.hasAttribute('open')) {\n this._open = true\n this.showTooltip()\n }\n }\n\n disconnectedCallback () {\n this.unbindEvents()\n this.popup?.remove()\n }\n\n attributeChangedCallback (\n name:string,\n _oldValue:string|null,\n newValue:string|null\n ) {\n if (name === 'content' && this.popup) {\n const body = this.popup.querySelector('.tool-tip__body')\n if (body) {\n body.textContent = newValue || ''\n }\n }\n\n if (name === 'placement' && this._open) {\n this.positionPopup()\n }\n\n if (name === 'disabled') {\n this._disabled = newValue !== null\n if (this._disabled && this._open) {\n this.hide()\n }\n }\n\n if (name === 'open') {\n this.open = newValue !== null\n }\n\n if ((name === 'distance' || name === 'skidding') && this._open) {\n this.positionPopup()\n }\n }\n\n private createPopup () {\n this.popup = document.createElement('div')\n this.popup.className = 'tool-tip__popup'\n this.popup.setAttribute('role', 'tooltip')\n this.popup.setAttribute('aria-hidden', 'true')\n this.popup.innerHTML = `\n <div class=\"tool-tip__body\">${this.content}</div>\n <div class=\"tool-tip__arrow\"></div>\n `\n\n this.arrow = this.popup.querySelector('.tool-tip__arrow')\n\n // Append to body if hoisted, otherwise to this element's parent\n if (this.hoist) {\n document.body.appendChild(this.popup)\n } else {\n this.appendChild(this.popup)\n }\n }\n\n private bindEvents () {\n if (!this.target) return\n\n const triggers = this.trigger\n\n if (triggers.includes('hover')) {\n this.target.addEventListener('mouseenter', this.handleMouseEnter)\n this.target.addEventListener('mouseleave', this.handleMouseLeave)\n }\n\n if (triggers.includes('focus')) {\n this.target.addEventListener('focus', this.handleFocus)\n this.target.addEventListener('blur', this.handleBlur)\n }\n\n if (triggers.includes('click')) {\n this.target.addEventListener('click', this.handleClick)\n }\n\n // Add keyboard support\n this.target.addEventListener('keydown', this.handleKeyDown)\n }\n\n private unbindEvents () {\n if (!this.target) return\n\n this.target.removeEventListener('mouseenter', this.handleMouseEnter)\n this.target.removeEventListener('mouseleave', this.handleMouseLeave)\n this.target.removeEventListener('focus', this.handleFocus)\n this.target.removeEventListener('blur', this.handleBlur)\n this.target.removeEventListener('click', this.handleClick)\n this.target.removeEventListener('keydown', this.handleKeyDown)\n }\n\n private handleMouseEnter = () => {\n this.show()\n }\n\n private handleMouseLeave = () => {\n this.hide()\n }\n\n private handleFocus = () => {\n this.show()\n }\n\n private handleBlur = () => {\n this.hide()\n }\n\n private handleClick = () => {\n if (this._open) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n private handleKeyDown = (event: KeyboardEvent) => {\n // Close tooltip on Escape\n if (event.key === 'Escape' && this._open) {\n this.hide()\n }\n }\n\n private showTooltip () {\n if (!this.popup || this._disabled) return\n\n // Emit show event\n const showEvent = new CustomEvent('tool-tip-show', {\n bubbles: true,\n cancelable: true,\n })\n if (!this.dispatchEvent(showEvent)) return\n\n this.popup.classList.add('tool-tip__popup--visible')\n this.popup.setAttribute('aria-hidden', 'false')\n\n // Position the popup\n this.positionPopup()\n\n // Emit after-show event\n this.dispatchEvent(new CustomEvent('tool-tip-after-show', {\n bubbles: true\n }))\n }\n\n private hideTooltip () {\n if (!this.popup) return\n\n // Emit hide event\n const hideEvent = new CustomEvent('tool-tip-hide', {\n bubbles: true,\n cancelable: true,\n })\n if (!this.dispatchEvent(hideEvent)) return\n\n this.popup.classList.remove('tool-tip__popup--visible')\n this.popup.setAttribute('aria-hidden', 'true')\n\n // Emit after-hide event\n this.dispatchEvent(new CustomEvent('tool-tip-after-hide', {\n bubbles: true\n }))\n }\n\n private positionPopup () {\n if (!this.popup || !this.target) return\n\n const targetRect = this.target.getBoundingClientRect()\n const popupRect = this.popup.getBoundingClientRect()\n const arrowSize = 8\n\n let top = 0\n let left = 0\n let arrowTop = ''\n let arrowLeft = ''\n let arrowTransform = ''\n\n const distance = this.distance\n const skidding = this.skidding\n const placement = this.getOptimalPlacement(targetRect, popupRect)\n\n // Set data attribute for CSS styling\n this.popup.dataset.placement = placement\n\n switch (placement) {\n case 'top':\n top = targetRect.top - popupRect.height - distance - arrowSize\n left = targetRect.left + (targetRect.width / 2) -\n (popupRect.width / 2) + skidding\n arrowTop = '100%'\n arrowLeft = '50%'\n arrowTransform = 'translateX(-50%)'\n break\n case 'top-start':\n top = targetRect.top - popupRect.height - distance - arrowSize\n left = targetRect.left + skidding\n arrowTop = '100%'\n arrowLeft = `${Math.min(24, popupRect.width / 2)}px`\n arrowTransform = 'translateX(-50%)'\n break\n case 'top-end':\n top = targetRect.top - popupRect.height - distance - arrowSize\n left = targetRect.right - popupRect.width + skidding\n arrowTop = '100%'\n arrowLeft = `calc(100% - ${Math.min(24, popupRect.width / 2)}px)`\n arrowTransform = 'translateX(-50%)'\n break\n case 'bottom':\n top = targetRect.bottom + distance + arrowSize\n left = targetRect.left + (targetRect.width / 2) -\n (popupRect.width / 2) + skidding\n arrowTop = '0'\n arrowLeft = '50%'\n arrowTransform = 'translateX(-50%) translateY(-100%)'\n break\n case 'bottom-start':\n top = targetRect.bottom + distance + arrowSize\n left = targetRect.left + skidding\n arrowTop = '0'\n arrowLeft = `${Math.min(24, popupRect.width / 2)}px`\n arrowTransform = 'translateX(-50%) translateY(-100%)'\n break\n case 'bottom-end':\n top = targetRect.bottom + distance + arrowSize\n left = targetRect.right - popupRect.width + skidding\n arrowTop = '0'\n arrowLeft = `calc(100% - ${Math.min(24, popupRect.width / 2)}px)`\n arrowTransform = 'translateX(-50%) translateY(-100%)'\n break\n case 'left':\n top = targetRect.top + (targetRect.height / 2) -\n (popupRect.height / 2) + skidding\n left = targetRect.left - popupRect.width - distance - arrowSize\n arrowTop = '50%'\n arrowLeft = '100%'\n arrowTransform = 'translateY(-50%)'\n break\n case 'left-start':\n top = targetRect.top + skidding\n left = targetRect.left - popupRect.width - distance - arrowSize\n arrowTop = `${Math.min(16, popupRect.height / 2)}px`\n arrowLeft = '100%'\n arrowTransform = 'translateY(-50%)'\n break\n case 'left-end':\n top = targetRect.bottom - popupRect.height + skidding\n left = targetRect.left - popupRect.width - distance - arrowSize\n arrowTop = `calc(100% - ${Math.min(16, popupRect.height / 2)}px)`\n arrowLeft = '100%'\n arrowTransform = 'translateY(-50%)'\n break\n case 'right':\n top = targetRect.top + (targetRect.height / 2) -\n (popupRect.height / 2) + skidding\n left = targetRect.right + distance + arrowSize\n arrowTop = '50%'\n arrowLeft = '0'\n arrowTransform = 'translateY(-50%) translateX(-100%)'\n break\n case 'right-start':\n top = targetRect.top + skidding\n left = targetRect.right + distance + arrowSize\n arrowTop = `${Math.min(16, popupRect.height / 2)}px`\n arrowLeft = '0'\n arrowTransform = 'translateY(-50%) translateX(-100%)'\n break\n case 'right-end':\n top = targetRect.bottom - popupRect.height + skidding\n left = targetRect.right + distance + arrowSize\n arrowTop = `calc(100% - ${Math.min(16, popupRect.height / 2)}px)`\n arrowLeft = '0'\n arrowTransform = 'translateY(-50%) translateX(-100%)'\n break\n }\n\n // Adjust for scroll position\n if (this.hoist) {\n top += window.scrollY\n left += window.scrollX\n }\n\n // Apply position\n this.popup.style.top = `${top}px`\n this.popup.style.left = `${left}px`\n\n // Position the arrow\n if (this.arrow) {\n this.arrow.style.top = arrowTop\n this.arrow.style.left = arrowLeft\n this.arrow.style.transform = arrowTransform\n }\n }\n\n private getOptimalPlacement (targetRect:DOMRect, popupRect:DOMRect):Placement {\n const placement = this.placement\n const viewportWidth = window.innerWidth\n const viewportHeight = window.innerHeight\n const distance = this.distance\n const arrowSize = 8\n\n // Check if the preferred placement fits\n const fits = {\n top: targetRect.top - popupRect.height - distance - arrowSize > 0,\n bottom: (targetRect.bottom + popupRect.height + distance +\n arrowSize < viewportHeight),\n left: targetRect.left - popupRect.width - distance - arrowSize > 0,\n right: (targetRect.right + popupRect.width + distance +\n arrowSize < viewportWidth),\n }\n\n // Get the base direction from the placement\n const baseDirection = placement.split('-')[0] as 'top'|\n 'bottom'|\n 'left'|\n 'right'\n\n // If preferred placement fits, use it\n if (fits[baseDirection]) {\n return placement\n }\n\n // Find the best alternative\n const opposites: Record<string, string> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n }\n\n const opposite = opposites[baseDirection] as\n 'top'|'bottom'|'left'|'right'\n if (fits[opposite]) {\n // Return the opposite with the same alignment\n const alignment = (placement.includes('-') ?\n placement.split('-')[1] :\n '')\n return (alignment ?\n `${opposite}-${alignment}` :\n opposite) as Placement\n }\n\n // Fall back to a direction that fits\n for (const dir of ['top', 'bottom', 'left', 'right'] as const) {\n if (fits[dir]) {\n return dir\n }\n }\n\n // If nothing fits, return original placement\n return placement\n }\n\n /**\n * Programmatically show the tooltip\n */\n show () {\n if (this._disabled) return\n this.open = true\n }\n\n /**\n * Programmatically hide the tooltip\n */\n hide () {\n this.open = false\n }\n}\n\nif ('customElements' in window) {\n customElements.define('tool-tip', ToolTip)\n}\n"],
5
- "mappings": ";;AAuBO,MAAM,gBAAgB,YAAY;AAAA,EAvBzC,OAuByC;AAAA;AAAA;AAAA,EACrC,OAAO,qBAAqB;AAAA,IAAC;AAAA,IAAW;AAAA,IAAa;AAAA,IACjD;AAAA,IAAQ;AAAA,IAAY;AAAA,EAAU;AAAA,EAE1B,QAA+B;AAAA,EAC/B,QAA+B;AAAA,EAC/B,SAA6B;AAAA,EAE7B,QAAQ;AAAA,EACR,YAAY;AAAA,EAEpB,IAAI,UAAmB;AACnB,WAAO,KAAK,aAAa,SAAS,KAAK;AAAA,EAC3C;AAAA,EAEA,IAAI,QAAS,OAAe;AACxB,SAAK,aAAa,WAAW,KAAK;AAAA,EACtC;AAAA,EAEA,IAAI,YAAwB;AACxB,WAAQ,KAAK,aAAa,WAAW,KAAmB;AAAA,EAC5D;AAAA,EAEA,IAAI,UAAW,OAAkB;AAC7B,SAAK,aAAa,aAAa,KAAK;AAAA,EACxC;AAAA,EAEA,IAAI,UAAsB;AACtB,UAAM,OAAO,KAAK,aAAa,SAAS,KAAK;AAC7C,WAAO,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAAA,EACzC;AAAA,EAEA,IAAI,QAAS,OAA2B;AACpC,QAAI,MAAM,QAAQ,KAAK,GAAG;AACtB,WAAK,aAAa,WAAW,MAAM,KAAK,GAAG,CAAC;AAAA,IAChD,OAAO;AACH,WAAK,aAAa,WAAW,KAAK;AAAA,IACtC;AAAA,EACJ;AAAA,EAEA,IAAI,WAAqB;AACrB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,SAAU,OAAgB;AAC1B,SAAK,YAAY;AACjB,QAAI,OAAO;AACP,WAAK,aAAa,YAAY,EAAE;AAAA,IACpC,OAAO;AACH,WAAK,gBAAgB,UAAU;AAAA,IACnC;AAAA,EACJ;AAAA,EAEA,IAAI,OAAiB;AACjB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,KAAM,OAAgB;AACtB,QAAI,KAAK,UAAW;AACpB,UAAM,UAAU,KAAK;AACrB,SAAK,QAAQ;AAEb,QAAI,SAAS,CAAC,SAAS;AACnB,WAAK,YAAY;AAAA,IACrB,WAAW,CAAC,SAAS,SAAS;AAC1B,WAAK,YAAY;AAAA,IACrB;AAAA,EACJ;AAAA,EAEA,IAAI,WAAoB;AACpB,WAAO,SAAS,KAAK,aAAa,UAAU,KAAK,KAAK,EAAE;AAAA,EAC5D;AAAA,EAEA,IAAI,SAAU,OAAe;AACzB,SAAK,aAAa,YAAY,OAAO,KAAK,CAAC;AAAA,EAC/C;AAAA,EAEA,IAAI,WAAoB;AACpB,WAAO,SAAS,KAAK,aAAa,UAAU,KAAK,KAAK,EAAE;AAAA,EAC5D;AAAA,EAEA,IAAI,SAAU,OAAe;AACzB,SAAK,aAAa,YAAY,OAAO,KAAK,CAAC;AAAA,EAC/C;AAAA,EAEA,IAAI,QAAkB;AAClB,WAAO,KAAK,aAAa,OAAO;AAAA,EACpC;AAAA,EAEA,IAAI,MAAO,OAAgB;AACvB,QAAI,OAAO;AACP,WAAK,aAAa,SAAS,EAAE;AAAA,IACjC,OAAO;AACH,WAAK,gBAAgB,OAAO;AAAA,IAChC;AAAA,EACJ;AAAA,EAEA,oBAAqB;AAEjB,SAAK,MAAM,UAAU;AAGrB,SAAK,SAAS,KAAK;AAEnB,QAAI,CAAC,KAAK,QAAQ;AACd,cAAQ,KAAK,yDACa;AAC1B;AAAA,IACJ;AAGA,SAAK,YAAY;AAGjB,SAAK,WAAW;AAGhB,QAAI,KAAK,aAAa,MAAM,GAAG;AAC3B,WAAK,QAAQ;AACb,WAAK,YAAY;AAAA,IACrB;AAAA,EACJ;AAAA,EAEA,uBAAwB;AACpB,SAAK,aAAa;AAClB,SAAK,OAAO,OAAO;AAAA,EACvB;AAAA,EAEA,yBACI,MACA,WACA,UACF;AACE,QAAI,SAAS,aAAa,KAAK,OAAO;AAClC,YAAM,OAAO,KAAK,MAAM,cAAc,iBAAiB;AACvD,UAAI,MAAM;AACN,aAAK,cAAc,YAAY;AAAA,MACnC;AAAA,IACJ;AAEA,QAAI,SAAS,eAAe,KAAK,OAAO;AACpC,WAAK,cAAc;AAAA,IACvB;AAEA,QAAI,SAAS,YAAY;AACrB,WAAK,YAAY,aAAa;AAC9B,UAAI,KAAK,aAAa,KAAK,OAAO;AAC9B,aAAK,KAAK;AAAA,MACd;AAAA,IACJ;AAEA,QAAI,SAAS,QAAQ;AACjB,WAAK,OAAO,aAAa;AAAA,IAC7B;AAEA,SAAK,SAAS,cAAc,SAAS,eAAe,KAAK,OAAO;AAC5D,WAAK,cAAc;AAAA,IACvB;AAAA,EACJ;AAAA,EAEQ,cAAe;AACnB,SAAK,QAAQ,SAAS,cAAc,KAAK;AACzC,SAAK,MAAM,YAAY;AACvB,SAAK,MAAM,aAAa,QAAQ,SAAS;AACzC,SAAK,MAAM,aAAa,eAAe,MAAM;AAC7C,SAAK,MAAM,YAAY;AAAA,0CACW,KAAK,OAAO;AAAA;AAAA;AAI9C,SAAK,QAAQ,KAAK,MAAM,cAAc,kBAAkB;AAGxD,QAAI,KAAK,OAAO;AACZ,eAAS,KAAK,YAAY,KAAK,KAAK;AAAA,IACxC,OAAO;AACH,WAAK,YAAY,KAAK,KAAK;AAAA,IAC/B;AAAA,EACJ;AAAA,EAEQ,aAAc;AAClB,QAAI,CAAC,KAAK,OAAQ;AAElB,UAAM,WAAW,KAAK;AAEtB,QAAI,SAAS,SAAS,OAAO,GAAG;AAC5B,WAAK,OAAO,iBAAiB,cAAc,KAAK,gBAAgB;AAChE,WAAK,OAAO,iBAAiB,cAAc,KAAK,gBAAgB;AAAA,IACpE;AAEA,QAAI,SAAS,SAAS,OAAO,GAAG;AAC5B,WAAK,OAAO,iBAAiB,SAAS,KAAK,WAAW;AACtD,WAAK,OAAO,iBAAiB,QAAQ,KAAK,UAAU;AAAA,IACxD;AAEA,QAAI,SAAS,SAAS,OAAO,GAAG;AAC5B,WAAK,OAAO,iBAAiB,SAAS,KAAK,WAAW;AAAA,IAC1D;AAGA,SAAK,OAAO,iBAAiB,WAAW,KAAK,aAAa;AAAA,EAC9D;AAAA,EAEQ,eAAgB;AACpB,QAAI,CAAC,KAAK,OAAQ;AAElB,SAAK,OAAO,oBAAoB,cAAc,KAAK,gBAAgB;AACnE,SAAK,OAAO,oBAAoB,cAAc,KAAK,gBAAgB;AACnE,SAAK,OAAO,oBAAoB,SAAS,KAAK,WAAW;AACzD,SAAK,OAAO,oBAAoB,QAAQ,KAAK,UAAU;AACvD,SAAK,OAAO,oBAAoB,SAAS,KAAK,WAAW;AACzD,SAAK,OAAO,oBAAoB,WAAW,KAAK,aAAa;AAAA,EACjE;AAAA,EAEQ,mBAAmB,6BAAM;AAC7B,SAAK,KAAK;AAAA,EACd,GAF2B;AAAA,EAInB,mBAAmB,6BAAM;AAC7B,SAAK,KAAK;AAAA,EACd,GAF2B;AAAA,EAInB,cAAc,6BAAM;AACxB,SAAK,KAAK;AAAA,EACd,GAFsB;AAAA,EAId,aAAa,6BAAM;AACvB,SAAK,KAAK;AAAA,EACd,GAFqB;AAAA,EAIb,cAAc,6BAAM;AACxB,QAAI,KAAK,OAAO;AACZ,WAAK,KAAK;AAAA,IACd,OAAO;AACH,WAAK,KAAK;AAAA,IACd;AAAA,EACJ,GANsB;AAAA,EAQd,gBAAgB,wBAAC,UAAyB;AAE9C,QAAI,MAAM,QAAQ,YAAY,KAAK,OAAO;AACtC,WAAK,KAAK;AAAA,IACd;AAAA,EACJ,GALwB;AAAA,EAOhB,cAAe;AACnB,QAAI,CAAC,KAAK,SAAS,KAAK,UAAW;AAGnC,UAAM,YAAY,IAAI,YAAY,iBAAiB;AAAA,MAC/C,SAAS;AAAA,MACT,YAAY;AAAA,IAChB,CAAC;AACD,QAAI,CAAC,KAAK,cAAc,SAAS,EAAG;AAEpC,SAAK,MAAM,UAAU,IAAI,0BAA0B;AACnD,SAAK,MAAM,aAAa,eAAe,OAAO;AAG9C,SAAK,cAAc;AAGnB,SAAK,cAAc,IAAI,YAAY,uBAAuB;AAAA,MACtD,SAAS;AAAA,IACb,CAAC,CAAC;AAAA,EACN;AAAA,EAEQ,cAAe;AACnB,QAAI,CAAC,KAAK,MAAO;AAGjB,UAAM,YAAY,IAAI,YAAY,iBAAiB;AAAA,MAC/C,SAAS;AAAA,MACT,YAAY;AAAA,IAChB,CAAC;AACD,QAAI,CAAC,KAAK,cAAc,SAAS,EAAG;AAEpC,SAAK,MAAM,UAAU,OAAO,0BAA0B;AACtD,SAAK,MAAM,aAAa,eAAe,MAAM;AAG7C,SAAK,cAAc,IAAI,YAAY,uBAAuB;AAAA,MACtD,SAAS;AAAA,IACb,CAAC,CAAC;AAAA,EACN;AAAA,EAEQ,gBAAiB;AACrB,QAAI,CAAC,KAAK,SAAS,CAAC,KAAK,OAAQ;AAEjC,UAAM,aAAa,KAAK,OAAO,sBAAsB;AACrD,UAAM,YAAY,KAAK,MAAM,sBAAsB;AACnD,UAAM,YAAY;AAElB,QAAI,MAAM;AACV,QAAI,OAAO;AACX,QAAI,WAAW;AACf,QAAI,YAAY;AAChB,QAAI,iBAAiB;AAErB,UAAM,WAAW,KAAK;AACtB,UAAM,WAAW,KAAK;AACtB,UAAM,YAAY,KAAK,oBAAoB,YAAY,SAAS;AAGhE,SAAK,MAAM,QAAQ,YAAY;AAE/B,YAAQ,WAAW;AAAA,MACf,KAAK;AACD,cAAM,WAAW,MAAM,UAAU,SAAS,WAAW;AACrD,eAAO,WAAW,OAAQ,WAAW,QAAQ,IACxC,UAAU,QAAQ,IAAK;AAC5B,mBAAW;AACX,oBAAY;AACZ,yBAAiB;AACjB;AAAA,MACJ,KAAK;AACD,cAAM,WAAW,MAAM,UAAU,SAAS,WAAW;AACrD,eAAO,WAAW,OAAO;AACzB,mBAAW;AACX,oBAAY,GAAG,KAAK,IAAI,IAAI,UAAU,QAAQ,CAAC,CAAC;AAChD,yBAAiB;AACjB;AAAA,MACJ,KAAK;AACD,cAAM,WAAW,MAAM,UAAU,SAAS,WAAW;AACrD,eAAO,WAAW,QAAQ,UAAU,QAAQ;AAC5C,mBAAW;AACX,oBAAY,eAAe,KAAK,IAAI,IAAI,UAAU,QAAQ,CAAC,CAAC;AAC5D,yBAAiB;AACjB;AAAA,MACJ,KAAK;AACD,cAAM,WAAW,SAAS,WAAW;AACrC,eAAO,WAAW,OAAQ,WAAW,QAAQ,IACxC,UAAU,QAAQ,IAAK;AAC5B,mBAAW;AACX,oBAAY;AACZ,yBAAiB;AACjB;AAAA,MACJ,KAAK;AACD,cAAM,WAAW,SAAS,WAAW;AACrC,eAAO,WAAW,OAAO;AACzB,mBAAW;AACX,oBAAY,GAAG,KAAK,IAAI,IAAI,UAAU,QAAQ,CAAC,CAAC;AAChD,yBAAiB;AACjB;AAAA,MACJ,KAAK;AACD,cAAM,WAAW,SAAS,WAAW;AACrC,eAAO,WAAW,QAAQ,UAAU,QAAQ;AAC5C,mBAAW;AACX,oBAAY,eAAe,KAAK,IAAI,IAAI,UAAU,QAAQ,CAAC,CAAC;AAC5D,yBAAiB;AACjB;AAAA,MACJ,KAAK;AACD,cAAM,WAAW,MAAO,WAAW,SAAS,IACvC,UAAU,SAAS,IAAK;AAC7B,eAAO,WAAW,OAAO,UAAU,QAAQ,WAAW;AACtD,mBAAW;AACX,oBAAY;AACZ,yBAAiB;AACjB;AAAA,MACJ,KAAK;AACD,cAAM,WAAW,MAAM;AACvB,eAAO,WAAW,OAAO,UAAU,QAAQ,WAAW;AACtD,mBAAW,GAAG,KAAK,IAAI,IAAI,UAAU,SAAS,CAAC,CAAC;AAChD,oBAAY;AACZ,yBAAiB;AACjB;AAAA,MACJ,KAAK;AACD,cAAM,WAAW,SAAS,UAAU,SAAS;AAC7C,eAAO,WAAW,OAAO,UAAU,QAAQ,WAAW;AACtD,mBAAW,eAAe,KAAK,IAAI,IAAI,UAAU,SAAS,CAAC,CAAC;AAC5D,oBAAY;AACZ,yBAAiB;AACjB;AAAA,MACJ,KAAK;AACD,cAAM,WAAW,MAAO,WAAW,SAAS,IACvC,UAAU,SAAS,IAAK;AAC7B,eAAO,WAAW,QAAQ,WAAW;AACrC,mBAAW;AACX,oBAAY;AACZ,yBAAiB;AACjB;AAAA,MACJ,KAAK;AACD,cAAM,WAAW,MAAM;AACvB,eAAO,WAAW,QAAQ,WAAW;AACrC,mBAAW,GAAG,KAAK,IAAI,IAAI,UAAU,SAAS,CAAC,CAAC;AAChD,oBAAY;AACZ,yBAAiB;AACjB;AAAA,MACJ,KAAK;AACD,cAAM,WAAW,SAAS,UAAU,SAAS;AAC7C,eAAO,WAAW,QAAQ,WAAW;AACrC,mBAAW,eAAe,KAAK,IAAI,IAAI,UAAU,SAAS,CAAC,CAAC;AAC5D,oBAAY;AACZ,yBAAiB;AACjB;AAAA,IACR;AAGA,QAAI,KAAK,OAAO;AACZ,aAAO,OAAO;AACd,cAAQ,OAAO;AAAA,IACnB;AAGA,SAAK,MAAM,MAAM,MAAM,GAAG,GAAG;AAC7B,SAAK,MAAM,MAAM,OAAO,GAAG,IAAI;AAG/B,QAAI,KAAK,OAAO;AACZ,WAAK,MAAM,MAAM,MAAM;AACvB,WAAK,MAAM,MAAM,OAAO;AACxB,WAAK,MAAM,MAAM,YAAY;AAAA,IACjC;AAAA,EACJ;AAAA,EAEQ,oBAAqB,YAAoB,WAA6B;AAC1E,UAAM,YAAY,KAAK;AACvB,UAAM,gBAAgB,OAAO;AAC7B,UAAM,iBAAiB,OAAO;AAC9B,UAAM,WAAW,KAAK;AACtB,UAAM,YAAY;AAGlB,UAAM,OAAO;AAAA,MACT,KAAK,WAAW,MAAM,UAAU,SAAS,WAAW,YAAY;AAAA,MAChE,QAAS,WAAW,SAAS,UAAU,SAAS,WAC5C,YAAY;AAAA,MAChB,MAAM,WAAW,OAAO,UAAU,QAAQ,WAAW,YAAY;AAAA,MACjE,OAAQ,WAAW,QAAQ,UAAU,QAAQ,WACzC,YAAY;AAAA,IACpB;AAGA,UAAM,gBAAgB,UAAU,MAAM,GAAG,EAAE,CAAC;AAM5C,QAAI,KAAK,aAAa,GAAG;AACrB,aAAO;AAAA,IACX;AAGA,UAAM,YAAoC;AAAA,MACtC,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO;AAAA,IACX;AAEA,UAAM,WAAW,UAAU,aAAa;AAExC,QAAI,KAAK,QAAQ,GAAG;AAEhB,YAAM,YAAa,UAAU,SAAS,GAAG,IACrC,UAAU,MAAM,GAAG,EAAE,CAAC,IACtB;AACJ,aAAQ,YACJ,GAAG,QAAQ,IAAI,SAAS,KACxB;AAAA,IACR;AAGA,eAAW,OAAO,CAAC,OAAO,UAAU,QAAQ,OAAO,GAAY;AAC3D,UAAI,KAAK,GAAG,GAAG;AACX,eAAO;AAAA,MACX;AAAA,IACJ;AAGA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,OAAQ;AACJ,QAAI,KAAK,UAAW;AACpB,SAAK,OAAO;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAQ;AACJ,SAAK,OAAO;AAAA,EAChB;AACJ;AAEA,IAAI,oBAAoB,QAAQ;AAC5B,iBAAe,OAAO,YAAY,OAAO;AAC7C;",
4
+ "sourcesContent": ["// for document.querySelector\ndeclare global {\n interface HTMLElementTagNameMap {\n 'tool-tip':ToolTip\n }\n}\n\nexport type Placement =\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'right'\n | 'right-start'\n | 'right-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'left'\n | 'left-start'\n | 'left-end'\n\nexport type Trigger = 'hover'|'focus'|'click'|'manual'\n\nexport class ToolTip extends HTMLElement {\n static observedAttributes = ['content', 'placement', 'disabled',\n 'open', 'distance', 'skidding']\n\n private popup:HTMLDivElement|null = null\n private arrow:HTMLDivElement|null = null\n private target:HTMLElement|null = null\n\n private _open = false\n private _disabled = false\n\n get content ():string {\n return this.getAttribute('content') || ''\n }\n\n set content (value:string) {\n this.setAttribute('content', value)\n }\n\n get placement ():Placement {\n return (this.getAttribute('placement') as Placement) || 'top'\n }\n\n set placement (value:Placement) {\n this.setAttribute('placement', value)\n }\n\n get trigger ():Trigger[] {\n const attr = this.getAttribute('trigger') || 'hover focus'\n return attr.split(' ').filter(Boolean) as Trigger[]\n }\n\n set trigger (value:Trigger[]|string) {\n if (Array.isArray(value)) {\n this.setAttribute('trigger', value.join(' '))\n } else {\n this.setAttribute('trigger', value)\n }\n }\n\n get disabled (): boolean {\n return this._disabled\n }\n\n set disabled (value: boolean) {\n this._disabled = value\n if (value) {\n this.setAttribute('disabled', '')\n } else {\n this.removeAttribute('disabled')\n }\n }\n\n get open (): boolean {\n return this._open\n }\n\n set open (value: boolean) {\n if (this._disabled) return\n const wasOpen = this._open\n this._open = value\n\n if (value && !wasOpen) {\n this.showTooltip()\n } else if (!value && wasOpen) {\n this.hideTooltip()\n }\n }\n\n get distance (): number {\n return parseInt(this.getAttribute('distance') || '8', 10)\n }\n\n set distance (value: number) {\n this.setAttribute('distance', String(value))\n }\n\n get skidding (): number {\n return parseInt(this.getAttribute('skidding') || '0', 10)\n }\n\n set skidding (value: number) {\n this.setAttribute('skidding', String(value))\n }\n\n get hoist (): boolean {\n return this.hasAttribute('hoist')\n }\n\n set hoist (value: boolean) {\n if (value) {\n this.setAttribute('hoist', '')\n } else {\n this.removeAttribute('hoist')\n }\n }\n\n connectedCallback () {\n // Use display: contents so the tooltip doesn't affect layout\n this.style.display = 'contents'\n\n // Find the target element (first child element)\n this.target = this.firstElementChild as HTMLElement\n\n if (!this.target) {\n console.warn('tool-tip: No target element found. ' +\n 'Add a child element.')\n return\n }\n\n // Create the popup element\n this.createPopup()\n\n // Bind event handlers\n this.bindEvents()\n\n // Check if open attribute is set\n if (this.hasAttribute('open')) {\n this._open = true\n this.showTooltip()\n }\n }\n\n disconnectedCallback () {\n this.unbindEvents()\n this.popup?.remove()\n }\n\n attributeChangedCallback (\n name:string,\n _oldValue:string|null,\n newValue:string|null\n ) {\n if (name === 'content' && this.popup) {\n const body = this.popup.querySelector('.body')\n if (body) {\n body.textContent = newValue || ''\n }\n }\n\n if (name === 'placement' && this._open) {\n this.positionPopup()\n }\n\n if (name === 'disabled') {\n this._disabled = newValue !== null\n if (this._disabled && this._open) {\n this.hide()\n }\n }\n\n if (name === 'open') {\n this.open = newValue !== null\n }\n\n if ((name === 'distance' || name === 'skidding') && this._open) {\n this.positionPopup()\n }\n }\n\n private createPopup () {\n this.popup = document.createElement('div')\n this.popup.className = 'popup'\n this.popup.setAttribute('role', 'tooltip')\n this.popup.setAttribute('aria-hidden', 'true')\n this.popup.innerHTML = `\n <div class=\"body\">${this.content}</div>\n <div class=\"arrow\"></div>\n `\n\n this.arrow = this.popup.querySelector('.arrow')\n\n // Append to body if hoisted, otherwise to this element's parent\n if (this.hoist) {\n document.body.appendChild(this.popup)\n } else {\n this.appendChild(this.popup)\n }\n }\n\n private bindEvents () {\n if (!this.target) return\n\n const triggers = this.trigger\n\n if (triggers.includes('hover')) {\n this.target.addEventListener('mouseenter', this.handleMouseEnter)\n this.target.addEventListener('mouseleave', this.handleMouseLeave)\n }\n\n if (triggers.includes('focus')) {\n this.target.addEventListener('focus', this.handleFocus)\n this.target.addEventListener('blur', this.handleBlur)\n }\n\n if (triggers.includes('click')) {\n this.target.addEventListener('click', this.handleClick)\n }\n\n // Add keyboard support\n this.target.addEventListener('keydown', this.handleKeyDown)\n }\n\n private unbindEvents () {\n if (!this.target) return\n\n this.target.removeEventListener('mouseenter', this.handleMouseEnter)\n this.target.removeEventListener('mouseleave', this.handleMouseLeave)\n this.target.removeEventListener('focus', this.handleFocus)\n this.target.removeEventListener('blur', this.handleBlur)\n this.target.removeEventListener('click', this.handleClick)\n this.target.removeEventListener('keydown', this.handleKeyDown)\n }\n\n private handleMouseEnter = () => {\n this.show()\n }\n\n private handleMouseLeave = () => {\n this.hide()\n }\n\n private handleFocus = () => {\n this.show()\n }\n\n private handleBlur = () => {\n this.hide()\n }\n\n private handleClick = () => {\n if (this._open) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n private handleKeyDown = (event: KeyboardEvent) => {\n // Close tooltip on Escape\n if (event.key === 'Escape' && this._open) {\n this.hide()\n }\n }\n\n private showTooltip () {\n if (!this.popup || this._disabled) return\n\n // Emit show event\n const showEvent = new CustomEvent('tool-tip-show', {\n bubbles: true,\n cancelable: true,\n })\n if (!this.dispatchEvent(showEvent)) return\n\n this.popup.classList.add('visible')\n this.popup.setAttribute('aria-hidden', 'false')\n\n // Position the popup\n this.positionPopup()\n\n // Emit after-show event\n this.dispatchEvent(new CustomEvent('tool-tip-after-show', {\n bubbles: true\n }))\n }\n\n private hideTooltip () {\n if (!this.popup) return\n\n // Emit hide event\n const hideEvent = new CustomEvent('tool-tip-hide', {\n bubbles: true,\n cancelable: true,\n })\n if (!this.dispatchEvent(hideEvent)) return\n\n this.popup.classList.remove('visible')\n this.popup.setAttribute('aria-hidden', 'true')\n\n // Emit after-hide event\n this.dispatchEvent(new CustomEvent('tool-tip-after-hide', {\n bubbles: true\n }))\n }\n\n private positionPopup () {\n if (!this.popup || !this.target) return\n\n const targetRect = this.target.getBoundingClientRect()\n const popupRect = this.popup.getBoundingClientRect()\n const arrowSize = 8\n\n let top = 0\n let left = 0\n let arrowTop = ''\n let arrowLeft = ''\n let arrowTransform = ''\n\n const distance = this.distance\n const skidding = this.skidding\n const placement = this.getOptimalPlacement(targetRect, popupRect)\n\n // Set data attribute for CSS styling\n this.popup.dataset.placement = placement\n\n switch (placement) {\n case 'top':\n top = targetRect.top - popupRect.height - distance - arrowSize\n left = targetRect.left + (targetRect.width / 2) -\n (popupRect.width / 2) + skidding\n arrowTop = '100%'\n arrowLeft = '50%'\n arrowTransform = 'translateX(-50%)'\n break\n case 'top-start':\n top = targetRect.top - popupRect.height - distance - arrowSize\n left = targetRect.left + skidding\n arrowTop = '100%'\n arrowLeft = `${Math.min(24, popupRect.width / 2)}px`\n arrowTransform = 'translateX(-50%)'\n break\n case 'top-end':\n top = targetRect.top - popupRect.height - distance - arrowSize\n left = targetRect.right - popupRect.width + skidding\n arrowTop = '100%'\n arrowLeft = `calc(100% - ${Math.min(24, popupRect.width / 2)}px)`\n arrowTransform = 'translateX(-50%)'\n break\n case 'bottom':\n top = targetRect.bottom + distance + arrowSize\n left = targetRect.left + (targetRect.width / 2) -\n (popupRect.width / 2) + skidding\n arrowTop = '0'\n arrowLeft = '50%'\n arrowTransform = 'translateX(-50%) translateY(-100%)'\n break\n case 'bottom-start':\n top = targetRect.bottom + distance + arrowSize\n left = targetRect.left + skidding\n arrowTop = '0'\n arrowLeft = `${Math.min(24, popupRect.width / 2)}px`\n arrowTransform = 'translateX(-50%) translateY(-100%)'\n break\n case 'bottom-end':\n top = targetRect.bottom + distance + arrowSize\n left = targetRect.right - popupRect.width + skidding\n arrowTop = '0'\n arrowLeft = `calc(100% - ${Math.min(24, popupRect.width / 2)}px)`\n arrowTransform = 'translateX(-50%) translateY(-100%)'\n break\n case 'left':\n top = targetRect.top + (targetRect.height / 2) -\n (popupRect.height / 2) + skidding\n left = targetRect.left - popupRect.width - distance - arrowSize\n arrowTop = '50%'\n arrowLeft = '100%'\n arrowTransform = 'translateY(-50%)'\n break\n case 'left-start':\n top = targetRect.top + skidding\n left = targetRect.left - popupRect.width - distance - arrowSize\n arrowTop = `${Math.min(16, popupRect.height / 2)}px`\n arrowLeft = '100%'\n arrowTransform = 'translateY(-50%)'\n break\n case 'left-end':\n top = targetRect.bottom - popupRect.height + skidding\n left = targetRect.left - popupRect.width - distance - arrowSize\n arrowTop = `calc(100% - ${Math.min(16, popupRect.height / 2)}px)`\n arrowLeft = '100%'\n arrowTransform = 'translateY(-50%)'\n break\n case 'right':\n top = targetRect.top + (targetRect.height / 2) -\n (popupRect.height / 2) + skidding\n left = targetRect.right + distance + arrowSize\n arrowTop = '50%'\n arrowLeft = '0'\n arrowTransform = 'translateY(-50%) translateX(-100%)'\n break\n case 'right-start':\n top = targetRect.top + skidding\n left = targetRect.right + distance + arrowSize\n arrowTop = `${Math.min(16, popupRect.height / 2)}px`\n arrowLeft = '0'\n arrowTransform = 'translateY(-50%) translateX(-100%)'\n break\n case 'right-end':\n top = targetRect.bottom - popupRect.height + skidding\n left = targetRect.right + distance + arrowSize\n arrowTop = `calc(100% - ${Math.min(16, popupRect.height / 2)}px)`\n arrowLeft = '0'\n arrowTransform = 'translateY(-50%) translateX(-100%)'\n break\n }\n\n // Adjust for scroll position\n if (this.hoist) {\n top += window.scrollY\n left += window.scrollX\n }\n\n // Apply position\n this.popup.style.top = `${top}px`\n this.popup.style.left = `${left}px`\n\n // Position the arrow\n if (this.arrow) {\n this.arrow.style.top = arrowTop\n this.arrow.style.left = arrowLeft\n this.arrow.style.transform = arrowTransform\n }\n }\n\n private getOptimalPlacement (targetRect:DOMRect, popupRect:DOMRect):Placement {\n const placement = this.placement\n const viewportWidth = window.innerWidth\n const viewportHeight = window.innerHeight\n const distance = this.distance\n const arrowSize = 8\n\n // Check if the preferred placement fits\n const fits = {\n top: targetRect.top - popupRect.height - distance - arrowSize > 0,\n bottom: (targetRect.bottom + popupRect.height + distance +\n arrowSize < viewportHeight),\n left: targetRect.left - popupRect.width - distance - arrowSize > 0,\n right: (targetRect.right + popupRect.width + distance +\n arrowSize < viewportWidth),\n }\n\n // Get the base direction from the placement\n const baseDirection = placement.split('-')[0] as 'top'|\n 'bottom'|\n 'left'|\n 'right'\n\n // If preferred placement fits, use it\n if (fits[baseDirection]) {\n return placement\n }\n\n // Find the best alternative\n const opposites: Record<string, string> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n }\n\n const opposite = opposites[baseDirection] as\n 'top'|'bottom'|'left'|'right'\n if (fits[opposite]) {\n // Return the opposite with the same alignment\n const alignment = (placement.includes('-') ?\n placement.split('-')[1] :\n '')\n return (alignment ?\n `${opposite}-${alignment}` :\n opposite) as Placement\n }\n\n // Fall back to a direction that fits\n for (const dir of ['top', 'bottom', 'left', 'right'] as const) {\n if (fits[dir]) {\n return dir\n }\n }\n\n // If nothing fits, return original placement\n return placement\n }\n\n /**\n * Programmatically show the tooltip\n */\n show () {\n if (this._disabled) return\n this.open = true\n }\n\n /**\n * Programmatically hide the tooltip\n */\n hide () {\n this.open = false\n }\n}\n\nif ('customElements' in window) {\n customElements.define('tool-tip', ToolTip)\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1 +1 @@
1
- tool-tip:not(:defined){display:none}tool-tip{--tool-tip-max-width:20rem;--tool-tip-show-delay:.15s;--tool-tip-hide-delay:0s;--tool-tip-background:#1e293b;--tool-tip-color:#fff;--tool-tip-border-radius:4px;--tool-tip-padding:.5rem .75rem;--tool-tip-font-size:.875rem;--tool-tip-line-height:1.4;--tool-tip-arrow-size:8px;--tool-tip-z-index:1000}.tool-tip__popup{z-index:var(--tool-tip-z-index);max-width:var(--tool-tip-max-width);pointer-events:none;opacity:0;visibility:hidden;transition:opacity var(--tool-tip-hide-delay) ease, visibility var(--tool-tip-hide-delay) ease;position:fixed}.tool-tip__popup--visible{opacity:1;visibility:visible;transition:opacity var(--tool-tip-show-delay) ease, visibility var(--tool-tip-show-delay) ease}.tool-tip__body{padding:var(--tool-tip-padding);background:var(--tool-tip-background);color:var(--tool-tip-color);border-radius:var(--tool-tip-border-radius);font-size:var(--tool-tip-font-size);line-height:var(--tool-tip-line-height);word-wrap:break-word;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a}.tool-tip__arrow{border:var(--tool-tip-arrow-size) solid transparent;width:0;height:0;position:absolute}.tool-tip__popup[data-placement^=top] .tool-tip__arrow{border-top-color:var(--tool-tip-background);border-bottom:0}.tool-tip__popup[data-placement^=bottom] .tool-tip__arrow{border-bottom-color:var(--tool-tip-background);border-top:0}.tool-tip__popup[data-placement^=left] .tool-tip__arrow{border-left-color:var(--tool-tip-background);border-right:0}.tool-tip__popup[data-placement^=right] .tool-tip__arrow{border-right-color:var(--tool-tip-background);border-left:0}tool-tip[disabled] .tool-tip__popup{display:none}
1
+ tool-tip{&:not(:defined){display:none}--tool-tip-max-width:20rem;--tool-tip-show-delay:.15s;--tool-tip-hide-delay:0s;--tool-tip-background:#1e293b;--tool-tip-color:#fff;--tool-tip-border-radius:4px;--tool-tip-padding:.5rem .75rem;--tool-tip-font-size:.875rem;--tool-tip-line-height:1.4;--tool-tip-arrow-size:8px;--tool-tip-z-index:1000;& .popup{z-index:var(--tool-tip-z-index);max-width:var(--tool-tip-max-width);pointer-events:none;opacity:0;visibility:hidden;transition:opacity var(--tool-tip-hide-delay) ease, visibility var(--tool-tip-hide-delay) ease;position:fixed;&.visible{opacity:1;visibility:visible;transition:opacity var(--tool-tip-show-delay) ease, visibility var(--tool-tip-show-delay) ease}}& .body{padding:var(--tool-tip-padding);background:var(--tool-tip-background);color:var(--tool-tip-color);border-radius:var(--tool-tip-border-radius);font-size:var(--tool-tip-font-size);line-height:var(--tool-tip-line-height);overflow-wrap:break-word;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a}& .arrow{border:var(--tool-tip-arrow-size) solid transparent;width:0;height:0;position:absolute}& .popup[data-placement^=top] .arrow{border-top-color:var(--tool-tip-background);border-bottom:0}& .popup[data-placement^=bottom] .arrow{border-bottom-color:var(--tool-tip-background);border-top:0}& .popup[data-placement^=left] .arrow{border-left-color:var(--tool-tip-background);border-right:0}& .popup[data-placement^=right] .arrow{border-right-color:var(--tool-tip-background);border-left:0}&[disabled] .popup{display:none}}
package/dist/index.min.js CHANGED
@@ -1,5 +1,5 @@
1
- var b=Object.defineProperty;var p=(g,t)=>b(g,"name",{value:t,configurable:!0});var u=class extends HTMLElement{static{p(this,"ToolTip")}static observedAttributes=["content","placement","disabled","open","distance","skidding"];popup=null;arrow=null;target=null;_open=!1;_disabled=!1;get content(){return this.getAttribute("content")||""}set content(t){this.setAttribute("content",t)}get placement(){return this.getAttribute("placement")||"top"}set placement(t){this.setAttribute("placement",t)}get trigger(){return(this.getAttribute("trigger")||"hover focus").split(" ").filter(Boolean)}set trigger(t){Array.isArray(t)?this.setAttribute("trigger",t.join(" ")):this.setAttribute("trigger",t)}get disabled(){return this._disabled}set disabled(t){this._disabled=t,t?this.setAttribute("disabled",""):this.removeAttribute("disabled")}get open(){return this._open}set open(t){if(this._disabled)return;let e=this._open;this._open=t,t&&!e?this.showTooltip():!t&&e&&this.hideTooltip()}get distance(){return parseInt(this.getAttribute("distance")||"8",10)}set distance(t){this.setAttribute("distance",String(t))}get skidding(){return parseInt(this.getAttribute("skidding")||"0",10)}set skidding(t){this.setAttribute("skidding",String(t))}get hoist(){return this.hasAttribute("hoist")}set hoist(t){t?this.setAttribute("hoist",""):this.removeAttribute("hoist")}connectedCallback(){if(this.style.display="contents",this.target=this.firstElementChild,!this.target){console.warn("tool-tip: No target element found. Add a child element.");return}this.createPopup(),this.bindEvents(),this.hasAttribute("open")&&(this._open=!0,this.showTooltip())}disconnectedCallback(){this.unbindEvents(),this.popup?.remove()}attributeChangedCallback(t,e,i){if(t==="content"&&this.popup){let s=this.popup.querySelector(".tool-tip__body");s&&(s.textContent=i||"")}t==="placement"&&this._open&&this.positionPopup(),t==="disabled"&&(this._disabled=i!==null,this._disabled&&this._open&&this.hide()),t==="open"&&(this.open=i!==null),(t==="distance"||t==="skidding")&&this._open&&this.positionPopup()}createPopup(){this.popup=document.createElement("div"),this.popup.className="tool-tip__popup",this.popup.setAttribute("role","tooltip"),this.popup.setAttribute("aria-hidden","true"),this.popup.innerHTML=`
2
- <div class="tool-tip__body">${this.content}</div>
3
- <div class="tool-tip__arrow"></div>
4
- `,this.arrow=this.popup.querySelector(".tool-tip__arrow"),this.hoist?document.body.appendChild(this.popup):this.appendChild(this.popup)}bindEvents(){if(!this.target)return;let t=this.trigger;t.includes("hover")&&(this.target.addEventListener("mouseenter",this.handleMouseEnter),this.target.addEventListener("mouseleave",this.handleMouseLeave)),t.includes("focus")&&(this.target.addEventListener("focus",this.handleFocus),this.target.addEventListener("blur",this.handleBlur)),t.includes("click")&&this.target.addEventListener("click",this.handleClick),this.target.addEventListener("keydown",this.handleKeyDown)}unbindEvents(){this.target&&(this.target.removeEventListener("mouseenter",this.handleMouseEnter),this.target.removeEventListener("mouseleave",this.handleMouseLeave),this.target.removeEventListener("focus",this.handleFocus),this.target.removeEventListener("blur",this.handleBlur),this.target.removeEventListener("click",this.handleClick),this.target.removeEventListener("keydown",this.handleKeyDown))}handleMouseEnter=p(()=>{this.show()},"handleMouseEnter");handleMouseLeave=p(()=>{this.hide()},"handleMouseLeave");handleFocus=p(()=>{this.show()},"handleFocus");handleBlur=p(()=>{this.hide()},"handleBlur");handleClick=p(()=>{this._open?this.hide():this.show()},"handleClick");handleKeyDown=p(t=>{t.key==="Escape"&&this._open&&this.hide()},"handleKeyDown");showTooltip(){if(!this.popup||this._disabled)return;let t=new CustomEvent("tool-tip-show",{bubbles:!0,cancelable:!0});this.dispatchEvent(t)&&(this.popup.classList.add("tool-tip__popup--visible"),this.popup.setAttribute("aria-hidden","false"),this.positionPopup(),this.dispatchEvent(new CustomEvent("tool-tip-after-show",{bubbles:!0})))}hideTooltip(){if(!this.popup)return;let t=new CustomEvent("tool-tip-hide",{bubbles:!0,cancelable:!0});this.dispatchEvent(t)&&(this.popup.classList.remove("tool-tip__popup--visible"),this.popup.setAttribute("aria-hidden","true"),this.dispatchEvent(new CustomEvent("tool-tip-after-hide",{bubbles:!0})))}positionPopup(){if(!this.popup||!this.target)return;let t=this.target.getBoundingClientRect(),e=this.popup.getBoundingClientRect(),i=8,s=0,a=0,o="",n="",r="",h=this.distance,l=this.skidding,d=this.getOptimalPlacement(t,e);switch(this.popup.dataset.placement=d,d){case"top":s=t.top-e.height-h-i,a=t.left+t.width/2-e.width/2+l,o="100%",n="50%",r="translateX(-50%)";break;case"top-start":s=t.top-e.height-h-i,a=t.left+l,o="100%",n=`${Math.min(24,e.width/2)}px`,r="translateX(-50%)";break;case"top-end":s=t.top-e.height-h-i,a=t.right-e.width+l,o="100%",n=`calc(100% - ${Math.min(24,e.width/2)}px)`,r="translateX(-50%)";break;case"bottom":s=t.bottom+h+i,a=t.left+t.width/2-e.width/2+l,o="0",n="50%",r="translateX(-50%) translateY(-100%)";break;case"bottom-start":s=t.bottom+h+i,a=t.left+l,o="0",n=`${Math.min(24,e.width/2)}px`,r="translateX(-50%) translateY(-100%)";break;case"bottom-end":s=t.bottom+h+i,a=t.right-e.width+l,o="0",n=`calc(100% - ${Math.min(24,e.width/2)}px)`,r="translateX(-50%) translateY(-100%)";break;case"left":s=t.top+t.height/2-e.height/2+l,a=t.left-e.width-h-i,o="50%",n="100%",r="translateY(-50%)";break;case"left-start":s=t.top+l,a=t.left-e.width-h-i,o=`${Math.min(16,e.height/2)}px`,n="100%",r="translateY(-50%)";break;case"left-end":s=t.bottom-e.height+l,a=t.left-e.width-h-i,o=`calc(100% - ${Math.min(16,e.height/2)}px)`,n="100%",r="translateY(-50%)";break;case"right":s=t.top+t.height/2-e.height/2+l,a=t.right+h+i,o="50%",n="0",r="translateY(-50%) translateX(-100%)";break;case"right-start":s=t.top+l,a=t.right+h+i,o=`${Math.min(16,e.height/2)}px`,n="0",r="translateY(-50%) translateX(-100%)";break;case"right-end":s=t.bottom-e.height+l,a=t.right+h+i,o=`calc(100% - ${Math.min(16,e.height/2)}px)`,n="0",r="translateY(-50%) translateX(-100%)";break}this.hoist&&(s+=window.scrollY,a+=window.scrollX),this.popup.style.top=`${s}px`,this.popup.style.left=`${a}px`,this.arrow&&(this.arrow.style.top=o,this.arrow.style.left=n,this.arrow.style.transform=r)}getOptimalPlacement(t,e){let i=this.placement,s=window.innerWidth,a=window.innerHeight,o=this.distance,n=8,r={top:t.top-e.height-o-n>0,bottom:t.bottom+e.height+o+n<a,left:t.left-e.width-o-n>0,right:t.right+e.width+o+n<s},h=i.split("-")[0];if(r[h])return i;let d={top:"bottom",bottom:"top",left:"right",right:"left"}[h];if(r[d]){let c=i.includes("-")?i.split("-")[1]:"";return c?`${d}-${c}`:d}for(let c of["top","bottom","left","right"])if(r[c])return c;return i}show(){this._disabled||(this.open=!0)}hide(){this.open=!1}};"customElements"in window&&customElements.define("tool-tip",u);export{u as ToolTip};
1
+ var b=Object.defineProperty;var p=(g,t)=>b(g,"name",{value:t,configurable:!0});var u=class extends HTMLElement{static{p(this,"ToolTip")}static observedAttributes=["content","placement","disabled","open","distance","skidding"];popup=null;arrow=null;target=null;_open=!1;_disabled=!1;get content(){return this.getAttribute("content")||""}set content(t){this.setAttribute("content",t)}get placement(){return this.getAttribute("placement")||"top"}set placement(t){this.setAttribute("placement",t)}get trigger(){return(this.getAttribute("trigger")||"hover focus").split(" ").filter(Boolean)}set trigger(t){Array.isArray(t)?this.setAttribute("trigger",t.join(" ")):this.setAttribute("trigger",t)}get disabled(){return this._disabled}set disabled(t){this._disabled=t,t?this.setAttribute("disabled",""):this.removeAttribute("disabled")}get open(){return this._open}set open(t){if(this._disabled)return;let e=this._open;this._open=t,t&&!e?this.showTooltip():!t&&e&&this.hideTooltip()}get distance(){return parseInt(this.getAttribute("distance")||"8",10)}set distance(t){this.setAttribute("distance",String(t))}get skidding(){return parseInt(this.getAttribute("skidding")||"0",10)}set skidding(t){this.setAttribute("skidding",String(t))}get hoist(){return this.hasAttribute("hoist")}set hoist(t){t?this.setAttribute("hoist",""):this.removeAttribute("hoist")}connectedCallback(){if(this.style.display="contents",this.target=this.firstElementChild,!this.target){console.warn("tool-tip: No target element found. Add a child element.");return}this.createPopup(),this.bindEvents(),this.hasAttribute("open")&&(this._open=!0,this.showTooltip())}disconnectedCallback(){this.unbindEvents(),this.popup?.remove()}attributeChangedCallback(t,e,i){if(t==="content"&&this.popup){let s=this.popup.querySelector(".body");s&&(s.textContent=i||"")}t==="placement"&&this._open&&this.positionPopup(),t==="disabled"&&(this._disabled=i!==null,this._disabled&&this._open&&this.hide()),t==="open"&&(this.open=i!==null),(t==="distance"||t==="skidding")&&this._open&&this.positionPopup()}createPopup(){this.popup=document.createElement("div"),this.popup.className="popup",this.popup.setAttribute("role","tooltip"),this.popup.setAttribute("aria-hidden","true"),this.popup.innerHTML=`
2
+ <div class="body">${this.content}</div>
3
+ <div class="arrow"></div>
4
+ `,this.arrow=this.popup.querySelector(".arrow"),this.hoist?document.body.appendChild(this.popup):this.appendChild(this.popup)}bindEvents(){if(!this.target)return;let t=this.trigger;t.includes("hover")&&(this.target.addEventListener("mouseenter",this.handleMouseEnter),this.target.addEventListener("mouseleave",this.handleMouseLeave)),t.includes("focus")&&(this.target.addEventListener("focus",this.handleFocus),this.target.addEventListener("blur",this.handleBlur)),t.includes("click")&&this.target.addEventListener("click",this.handleClick),this.target.addEventListener("keydown",this.handleKeyDown)}unbindEvents(){this.target&&(this.target.removeEventListener("mouseenter",this.handleMouseEnter),this.target.removeEventListener("mouseleave",this.handleMouseLeave),this.target.removeEventListener("focus",this.handleFocus),this.target.removeEventListener("blur",this.handleBlur),this.target.removeEventListener("click",this.handleClick),this.target.removeEventListener("keydown",this.handleKeyDown))}handleMouseEnter=p(()=>{this.show()},"handleMouseEnter");handleMouseLeave=p(()=>{this.hide()},"handleMouseLeave");handleFocus=p(()=>{this.show()},"handleFocus");handleBlur=p(()=>{this.hide()},"handleBlur");handleClick=p(()=>{this._open?this.hide():this.show()},"handleClick");handleKeyDown=p(t=>{t.key==="Escape"&&this._open&&this.hide()},"handleKeyDown");showTooltip(){if(!this.popup||this._disabled)return;let t=new CustomEvent("tool-tip-show",{bubbles:!0,cancelable:!0});this.dispatchEvent(t)&&(this.popup.classList.add("visible"),this.popup.setAttribute("aria-hidden","false"),this.positionPopup(),this.dispatchEvent(new CustomEvent("tool-tip-after-show",{bubbles:!0})))}hideTooltip(){if(!this.popup)return;let t=new CustomEvent("tool-tip-hide",{bubbles:!0,cancelable:!0});this.dispatchEvent(t)&&(this.popup.classList.remove("visible"),this.popup.setAttribute("aria-hidden","true"),this.dispatchEvent(new CustomEvent("tool-tip-after-hide",{bubbles:!0})))}positionPopup(){if(!this.popup||!this.target)return;let t=this.target.getBoundingClientRect(),e=this.popup.getBoundingClientRect(),i=8,s=0,a=0,n="",r="",o="",h=this.distance,l=this.skidding,d=this.getOptimalPlacement(t,e);switch(this.popup.dataset.placement=d,d){case"top":s=t.top-e.height-h-i,a=t.left+t.width/2-e.width/2+l,n="100%",r="50%",o="translateX(-50%)";break;case"top-start":s=t.top-e.height-h-i,a=t.left+l,n="100%",r=`${Math.min(24,e.width/2)}px`,o="translateX(-50%)";break;case"top-end":s=t.top-e.height-h-i,a=t.right-e.width+l,n="100%",r=`calc(100% - ${Math.min(24,e.width/2)}px)`,o="translateX(-50%)";break;case"bottom":s=t.bottom+h+i,a=t.left+t.width/2-e.width/2+l,n="0",r="50%",o="translateX(-50%) translateY(-100%)";break;case"bottom-start":s=t.bottom+h+i,a=t.left+l,n="0",r=`${Math.min(24,e.width/2)}px`,o="translateX(-50%) translateY(-100%)";break;case"bottom-end":s=t.bottom+h+i,a=t.right-e.width+l,n="0",r=`calc(100% - ${Math.min(24,e.width/2)}px)`,o="translateX(-50%) translateY(-100%)";break;case"left":s=t.top+t.height/2-e.height/2+l,a=t.left-e.width-h-i,n="50%",r="100%",o="translateY(-50%)";break;case"left-start":s=t.top+l,a=t.left-e.width-h-i,n=`${Math.min(16,e.height/2)}px`,r="100%",o="translateY(-50%)";break;case"left-end":s=t.bottom-e.height+l,a=t.left-e.width-h-i,n=`calc(100% - ${Math.min(16,e.height/2)}px)`,r="100%",o="translateY(-50%)";break;case"right":s=t.top+t.height/2-e.height/2+l,a=t.right+h+i,n="50%",r="0",o="translateY(-50%) translateX(-100%)";break;case"right-start":s=t.top+l,a=t.right+h+i,n=`${Math.min(16,e.height/2)}px`,r="0",o="translateY(-50%) translateX(-100%)";break;case"right-end":s=t.bottom-e.height+l,a=t.right+h+i,n=`calc(100% - ${Math.min(16,e.height/2)}px)`,r="0",o="translateY(-50%) translateX(-100%)";break}this.hoist&&(s+=window.scrollY,a+=window.scrollX),this.popup.style.top=`${s}px`,this.popup.style.left=`${a}px`,this.arrow&&(this.arrow.style.top=n,this.arrow.style.left=r,this.arrow.style.transform=o)}getOptimalPlacement(t,e){let i=this.placement,s=window.innerWidth,a=window.innerHeight,n=this.distance,r=8,o={top:t.top-e.height-n-r>0,bottom:t.bottom+e.height+n+r<a,left:t.left-e.width-n-r>0,right:t.right+e.width+n+r<s},h=i.split("-")[0];if(o[h])return i;let d={top:"bottom",bottom:"top",left:"right",right:"left"}[h];if(o[d]){let c=i.includes("-")?i.split("-")[1]:"";return c?`${d}-${c}`:d}for(let c of["top","bottom","left","right"])if(o[c])return c;return i}show(){this._disabled||(this.open=!0)}hide(){this.open=!1}};"customElements"in window&&customElements.define("tool-tip",u);export{u as ToolTip};
5
5
  //# sourceMappingURL=index.min.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
4
- "sourcesContent": ["// for document.querySelector\ndeclare global {\n interface HTMLElementTagNameMap {\n 'tool-tip':ToolTip\n }\n}\n\nexport type Placement =\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'right'\n | 'right-start'\n | 'right-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'left'\n | 'left-start'\n | 'left-end'\n\nexport type Trigger = 'hover'|'focus'|'click'|'manual'\n\nexport class ToolTip extends HTMLElement {\n static observedAttributes = ['content', 'placement', 'disabled',\n 'open', 'distance', 'skidding']\n\n private popup: HTMLDivElement | null = null\n private arrow: HTMLDivElement | null = null\n private target: HTMLElement | null = null\n\n private _open = false\n private _disabled = false\n\n get content (): string {\n return this.getAttribute('content') || ''\n }\n\n set content (value: string) {\n this.setAttribute('content', value)\n }\n\n get placement (): Placement {\n return (this.getAttribute('placement') as Placement) || 'top'\n }\n\n set placement (value: Placement) {\n this.setAttribute('placement', value)\n }\n\n get trigger (): Trigger[] {\n const attr = this.getAttribute('trigger') || 'hover focus'\n return attr.split(' ').filter(Boolean) as Trigger[]\n }\n\n set trigger (value: Trigger[] | string) {\n if (Array.isArray(value)) {\n this.setAttribute('trigger', value.join(' '))\n } else {\n this.setAttribute('trigger', value)\n }\n }\n\n get disabled (): boolean {\n return this._disabled\n }\n\n set disabled (value: boolean) {\n this._disabled = value\n if (value) {\n this.setAttribute('disabled', '')\n } else {\n this.removeAttribute('disabled')\n }\n }\n\n get open (): boolean {\n return this._open\n }\n\n set open (value: boolean) {\n if (this._disabled) return\n const wasOpen = this._open\n this._open = value\n\n if (value && !wasOpen) {\n this.showTooltip()\n } else if (!value && wasOpen) {\n this.hideTooltip()\n }\n }\n\n get distance (): number {\n return parseInt(this.getAttribute('distance') || '8', 10)\n }\n\n set distance (value: number) {\n this.setAttribute('distance', String(value))\n }\n\n get skidding (): number {\n return parseInt(this.getAttribute('skidding') || '0', 10)\n }\n\n set skidding (value: number) {\n this.setAttribute('skidding', String(value))\n }\n\n get hoist (): boolean {\n return this.hasAttribute('hoist')\n }\n\n set hoist (value: boolean) {\n if (value) {\n this.setAttribute('hoist', '')\n } else {\n this.removeAttribute('hoist')\n }\n }\n\n connectedCallback () {\n // Use display: contents so the tooltip doesn't affect layout\n this.style.display = 'contents'\n\n // Find the target element (first child element)\n this.target = this.firstElementChild as HTMLElement\n\n if (!this.target) {\n console.warn('tool-tip: No target element found. ' +\n 'Add a child element.')\n return\n }\n\n // Create the popup element\n this.createPopup()\n\n // Bind event handlers\n this.bindEvents()\n\n // Check if open attribute is set\n if (this.hasAttribute('open')) {\n this._open = true\n this.showTooltip()\n }\n }\n\n disconnectedCallback () {\n this.unbindEvents()\n this.popup?.remove()\n }\n\n attributeChangedCallback (\n name:string,\n _oldValue:string|null,\n newValue:string|null\n ) {\n if (name === 'content' && this.popup) {\n const body = this.popup.querySelector('.tool-tip__body')\n if (body) {\n body.textContent = newValue || ''\n }\n }\n\n if (name === 'placement' && this._open) {\n this.positionPopup()\n }\n\n if (name === 'disabled') {\n this._disabled = newValue !== null\n if (this._disabled && this._open) {\n this.hide()\n }\n }\n\n if (name === 'open') {\n this.open = newValue !== null\n }\n\n if ((name === 'distance' || name === 'skidding') && this._open) {\n this.positionPopup()\n }\n }\n\n private createPopup () {\n this.popup = document.createElement('div')\n this.popup.className = 'tool-tip__popup'\n this.popup.setAttribute('role', 'tooltip')\n this.popup.setAttribute('aria-hidden', 'true')\n this.popup.innerHTML = `\n <div class=\"tool-tip__body\">${this.content}</div>\n <div class=\"tool-tip__arrow\"></div>\n `\n\n this.arrow = this.popup.querySelector('.tool-tip__arrow')\n\n // Append to body if hoisted, otherwise to this element's parent\n if (this.hoist) {\n document.body.appendChild(this.popup)\n } else {\n this.appendChild(this.popup)\n }\n }\n\n private bindEvents () {\n if (!this.target) return\n\n const triggers = this.trigger\n\n if (triggers.includes('hover')) {\n this.target.addEventListener('mouseenter', this.handleMouseEnter)\n this.target.addEventListener('mouseleave', this.handleMouseLeave)\n }\n\n if (triggers.includes('focus')) {\n this.target.addEventListener('focus', this.handleFocus)\n this.target.addEventListener('blur', this.handleBlur)\n }\n\n if (triggers.includes('click')) {\n this.target.addEventListener('click', this.handleClick)\n }\n\n // Add keyboard support\n this.target.addEventListener('keydown', this.handleKeyDown)\n }\n\n private unbindEvents () {\n if (!this.target) return\n\n this.target.removeEventListener('mouseenter', this.handleMouseEnter)\n this.target.removeEventListener('mouseleave', this.handleMouseLeave)\n this.target.removeEventListener('focus', this.handleFocus)\n this.target.removeEventListener('blur', this.handleBlur)\n this.target.removeEventListener('click', this.handleClick)\n this.target.removeEventListener('keydown', this.handleKeyDown)\n }\n\n private handleMouseEnter = () => {\n this.show()\n }\n\n private handleMouseLeave = () => {\n this.hide()\n }\n\n private handleFocus = () => {\n this.show()\n }\n\n private handleBlur = () => {\n this.hide()\n }\n\n private handleClick = () => {\n if (this._open) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n private handleKeyDown = (event: KeyboardEvent) => {\n // Close tooltip on Escape\n if (event.key === 'Escape' && this._open) {\n this.hide()\n }\n }\n\n private showTooltip () {\n if (!this.popup || this._disabled) return\n\n // Emit show event\n const showEvent = new CustomEvent('tool-tip-show', {\n bubbles: true,\n cancelable: true,\n })\n if (!this.dispatchEvent(showEvent)) return\n\n this.popup.classList.add('tool-tip__popup--visible')\n this.popup.setAttribute('aria-hidden', 'false')\n\n // Position the popup\n this.positionPopup()\n\n // Emit after-show event\n this.dispatchEvent(new CustomEvent('tool-tip-after-show', {\n bubbles: true\n }))\n }\n\n private hideTooltip () {\n if (!this.popup) return\n\n // Emit hide event\n const hideEvent = new CustomEvent('tool-tip-hide', {\n bubbles: true,\n cancelable: true,\n })\n if (!this.dispatchEvent(hideEvent)) return\n\n this.popup.classList.remove('tool-tip__popup--visible')\n this.popup.setAttribute('aria-hidden', 'true')\n\n // Emit after-hide event\n this.dispatchEvent(new CustomEvent('tool-tip-after-hide', {\n bubbles: true\n }))\n }\n\n private positionPopup () {\n if (!this.popup || !this.target) return\n\n const targetRect = this.target.getBoundingClientRect()\n const popupRect = this.popup.getBoundingClientRect()\n const arrowSize = 8\n\n let top = 0\n let left = 0\n let arrowTop = ''\n let arrowLeft = ''\n let arrowTransform = ''\n\n const distance = this.distance\n const skidding = this.skidding\n const placement = this.getOptimalPlacement(targetRect, popupRect)\n\n // Set data attribute for CSS styling\n this.popup.dataset.placement = placement\n\n switch (placement) {\n case 'top':\n top = targetRect.top - popupRect.height - distance - arrowSize\n left = targetRect.left + (targetRect.width / 2) -\n (popupRect.width / 2) + skidding\n arrowTop = '100%'\n arrowLeft = '50%'\n arrowTransform = 'translateX(-50%)'\n break\n case 'top-start':\n top = targetRect.top - popupRect.height - distance - arrowSize\n left = targetRect.left + skidding\n arrowTop = '100%'\n arrowLeft = `${Math.min(24, popupRect.width / 2)}px`\n arrowTransform = 'translateX(-50%)'\n break\n case 'top-end':\n top = targetRect.top - popupRect.height - distance - arrowSize\n left = targetRect.right - popupRect.width + skidding\n arrowTop = '100%'\n arrowLeft = `calc(100% - ${Math.min(24, popupRect.width / 2)}px)`\n arrowTransform = 'translateX(-50%)'\n break\n case 'bottom':\n top = targetRect.bottom + distance + arrowSize\n left = targetRect.left + (targetRect.width / 2) -\n (popupRect.width / 2) + skidding\n arrowTop = '0'\n arrowLeft = '50%'\n arrowTransform = 'translateX(-50%) translateY(-100%)'\n break\n case 'bottom-start':\n top = targetRect.bottom + distance + arrowSize\n left = targetRect.left + skidding\n arrowTop = '0'\n arrowLeft = `${Math.min(24, popupRect.width / 2)}px`\n arrowTransform = 'translateX(-50%) translateY(-100%)'\n break\n case 'bottom-end':\n top = targetRect.bottom + distance + arrowSize\n left = targetRect.right - popupRect.width + skidding\n arrowTop = '0'\n arrowLeft = `calc(100% - ${Math.min(24, popupRect.width / 2)}px)`\n arrowTransform = 'translateX(-50%) translateY(-100%)'\n break\n case 'left':\n top = targetRect.top + (targetRect.height / 2) -\n (popupRect.height / 2) + skidding\n left = targetRect.left - popupRect.width - distance - arrowSize\n arrowTop = '50%'\n arrowLeft = '100%'\n arrowTransform = 'translateY(-50%)'\n break\n case 'left-start':\n top = targetRect.top + skidding\n left = targetRect.left - popupRect.width - distance - arrowSize\n arrowTop = `${Math.min(16, popupRect.height / 2)}px`\n arrowLeft = '100%'\n arrowTransform = 'translateY(-50%)'\n break\n case 'left-end':\n top = targetRect.bottom - popupRect.height + skidding\n left = targetRect.left - popupRect.width - distance - arrowSize\n arrowTop = `calc(100% - ${Math.min(16, popupRect.height / 2)}px)`\n arrowLeft = '100%'\n arrowTransform = 'translateY(-50%)'\n break\n case 'right':\n top = targetRect.top + (targetRect.height / 2) -\n (popupRect.height / 2) + skidding\n left = targetRect.right + distance + arrowSize\n arrowTop = '50%'\n arrowLeft = '0'\n arrowTransform = 'translateY(-50%) translateX(-100%)'\n break\n case 'right-start':\n top = targetRect.top + skidding\n left = targetRect.right + distance + arrowSize\n arrowTop = `${Math.min(16, popupRect.height / 2)}px`\n arrowLeft = '0'\n arrowTransform = 'translateY(-50%) translateX(-100%)'\n break\n case 'right-end':\n top = targetRect.bottom - popupRect.height + skidding\n left = targetRect.right + distance + arrowSize\n arrowTop = `calc(100% - ${Math.min(16, popupRect.height / 2)}px)`\n arrowLeft = '0'\n arrowTransform = 'translateY(-50%) translateX(-100%)'\n break\n }\n\n // Adjust for scroll position\n if (this.hoist) {\n top += window.scrollY\n left += window.scrollX\n }\n\n // Apply position\n this.popup.style.top = `${top}px`\n this.popup.style.left = `${left}px`\n\n // Position the arrow\n if (this.arrow) {\n this.arrow.style.top = arrowTop\n this.arrow.style.left = arrowLeft\n this.arrow.style.transform = arrowTransform\n }\n }\n\n private getOptimalPlacement (targetRect:DOMRect, popupRect:DOMRect):Placement {\n const placement = this.placement\n const viewportWidth = window.innerWidth\n const viewportHeight = window.innerHeight\n const distance = this.distance\n const arrowSize = 8\n\n // Check if the preferred placement fits\n const fits = {\n top: targetRect.top - popupRect.height - distance - arrowSize > 0,\n bottom: (targetRect.bottom + popupRect.height + distance +\n arrowSize < viewportHeight),\n left: targetRect.left - popupRect.width - distance - arrowSize > 0,\n right: (targetRect.right + popupRect.width + distance +\n arrowSize < viewportWidth),\n }\n\n // Get the base direction from the placement\n const baseDirection = placement.split('-')[0] as 'top'|\n 'bottom'|\n 'left'|\n 'right'\n\n // If preferred placement fits, use it\n if (fits[baseDirection]) {\n return placement\n }\n\n // Find the best alternative\n const opposites: Record<string, string> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n }\n\n const opposite = opposites[baseDirection] as\n 'top'|'bottom'|'left'|'right'\n if (fits[opposite]) {\n // Return the opposite with the same alignment\n const alignment = (placement.includes('-') ?\n placement.split('-')[1] :\n '')\n return (alignment ?\n `${opposite}-${alignment}` :\n opposite) as Placement\n }\n\n // Fall back to a direction that fits\n for (const dir of ['top', 'bottom', 'left', 'right'] as const) {\n if (fits[dir]) {\n return dir\n }\n }\n\n // If nothing fits, return original placement\n return placement\n }\n\n /**\n * Programmatically show the tooltip\n */\n show () {\n if (this._disabled) return\n this.open = true\n }\n\n /**\n * Programmatically hide the tooltip\n */\n hide () {\n this.open = false\n }\n}\n\nif ('customElements' in window) {\n customElements.define('tool-tip', ToolTip)\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// for document.querySelector\ndeclare global {\n interface HTMLElementTagNameMap {\n 'tool-tip':ToolTip\n }\n}\n\nexport type Placement =\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'right'\n | 'right-start'\n | 'right-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'left'\n | 'left-start'\n | 'left-end'\n\nexport type Trigger = 'hover'|'focus'|'click'|'manual'\n\nexport class ToolTip extends HTMLElement {\n static observedAttributes = ['content', 'placement', 'disabled',\n 'open', 'distance', 'skidding']\n\n private popup:HTMLDivElement|null = null\n private arrow:HTMLDivElement|null = null\n private target:HTMLElement|null = null\n\n private _open = false\n private _disabled = false\n\n get content ():string {\n return this.getAttribute('content') || ''\n }\n\n set content (value:string) {\n this.setAttribute('content', value)\n }\n\n get placement ():Placement {\n return (this.getAttribute('placement') as Placement) || 'top'\n }\n\n set placement (value:Placement) {\n this.setAttribute('placement', value)\n }\n\n get trigger ():Trigger[] {\n const attr = this.getAttribute('trigger') || 'hover focus'\n return attr.split(' ').filter(Boolean) as Trigger[]\n }\n\n set trigger (value:Trigger[]|string) {\n if (Array.isArray(value)) {\n this.setAttribute('trigger', value.join(' '))\n } else {\n this.setAttribute('trigger', value)\n }\n }\n\n get disabled (): boolean {\n return this._disabled\n }\n\n set disabled (value: boolean) {\n this._disabled = value\n if (value) {\n this.setAttribute('disabled', '')\n } else {\n this.removeAttribute('disabled')\n }\n }\n\n get open (): boolean {\n return this._open\n }\n\n set open (value: boolean) {\n if (this._disabled) return\n const wasOpen = this._open\n this._open = value\n\n if (value && !wasOpen) {\n this.showTooltip()\n } else if (!value && wasOpen) {\n this.hideTooltip()\n }\n }\n\n get distance (): number {\n return parseInt(this.getAttribute('distance') || '8', 10)\n }\n\n set distance (value: number) {\n this.setAttribute('distance', String(value))\n }\n\n get skidding (): number {\n return parseInt(this.getAttribute('skidding') || '0', 10)\n }\n\n set skidding (value: number) {\n this.setAttribute('skidding', String(value))\n }\n\n get hoist (): boolean {\n return this.hasAttribute('hoist')\n }\n\n set hoist (value: boolean) {\n if (value) {\n this.setAttribute('hoist', '')\n } else {\n this.removeAttribute('hoist')\n }\n }\n\n connectedCallback () {\n // Use display: contents so the tooltip doesn't affect layout\n this.style.display = 'contents'\n\n // Find the target element (first child element)\n this.target = this.firstElementChild as HTMLElement\n\n if (!this.target) {\n console.warn('tool-tip: No target element found. ' +\n 'Add a child element.')\n return\n }\n\n // Create the popup element\n this.createPopup()\n\n // Bind event handlers\n this.bindEvents()\n\n // Check if open attribute is set\n if (this.hasAttribute('open')) {\n this._open = true\n this.showTooltip()\n }\n }\n\n disconnectedCallback () {\n this.unbindEvents()\n this.popup?.remove()\n }\n\n attributeChangedCallback (\n name:string,\n _oldValue:string|null,\n newValue:string|null\n ) {\n if (name === 'content' && this.popup) {\n const body = this.popup.querySelector('.body')\n if (body) {\n body.textContent = newValue || ''\n }\n }\n\n if (name === 'placement' && this._open) {\n this.positionPopup()\n }\n\n if (name === 'disabled') {\n this._disabled = newValue !== null\n if (this._disabled && this._open) {\n this.hide()\n }\n }\n\n if (name === 'open') {\n this.open = newValue !== null\n }\n\n if ((name === 'distance' || name === 'skidding') && this._open) {\n this.positionPopup()\n }\n }\n\n private createPopup () {\n this.popup = document.createElement('div')\n this.popup.className = 'popup'\n this.popup.setAttribute('role', 'tooltip')\n this.popup.setAttribute('aria-hidden', 'true')\n this.popup.innerHTML = `\n <div class=\"body\">${this.content}</div>\n <div class=\"arrow\"></div>\n `\n\n this.arrow = this.popup.querySelector('.arrow')\n\n // Append to body if hoisted, otherwise to this element's parent\n if (this.hoist) {\n document.body.appendChild(this.popup)\n } else {\n this.appendChild(this.popup)\n }\n }\n\n private bindEvents () {\n if (!this.target) return\n\n const triggers = this.trigger\n\n if (triggers.includes('hover')) {\n this.target.addEventListener('mouseenter', this.handleMouseEnter)\n this.target.addEventListener('mouseleave', this.handleMouseLeave)\n }\n\n if (triggers.includes('focus')) {\n this.target.addEventListener('focus', this.handleFocus)\n this.target.addEventListener('blur', this.handleBlur)\n }\n\n if (triggers.includes('click')) {\n this.target.addEventListener('click', this.handleClick)\n }\n\n // Add keyboard support\n this.target.addEventListener('keydown', this.handleKeyDown)\n }\n\n private unbindEvents () {\n if (!this.target) return\n\n this.target.removeEventListener('mouseenter', this.handleMouseEnter)\n this.target.removeEventListener('mouseleave', this.handleMouseLeave)\n this.target.removeEventListener('focus', this.handleFocus)\n this.target.removeEventListener('blur', this.handleBlur)\n this.target.removeEventListener('click', this.handleClick)\n this.target.removeEventListener('keydown', this.handleKeyDown)\n }\n\n private handleMouseEnter = () => {\n this.show()\n }\n\n private handleMouseLeave = () => {\n this.hide()\n }\n\n private handleFocus = () => {\n this.show()\n }\n\n private handleBlur = () => {\n this.hide()\n }\n\n private handleClick = () => {\n if (this._open) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n private handleKeyDown = (event: KeyboardEvent) => {\n // Close tooltip on Escape\n if (event.key === 'Escape' && this._open) {\n this.hide()\n }\n }\n\n private showTooltip () {\n if (!this.popup || this._disabled) return\n\n // Emit show event\n const showEvent = new CustomEvent('tool-tip-show', {\n bubbles: true,\n cancelable: true,\n })\n if (!this.dispatchEvent(showEvent)) return\n\n this.popup.classList.add('visible')\n this.popup.setAttribute('aria-hidden', 'false')\n\n // Position the popup\n this.positionPopup()\n\n // Emit after-show event\n this.dispatchEvent(new CustomEvent('tool-tip-after-show', {\n bubbles: true\n }))\n }\n\n private hideTooltip () {\n if (!this.popup) return\n\n // Emit hide event\n const hideEvent = new CustomEvent('tool-tip-hide', {\n bubbles: true,\n cancelable: true,\n })\n if (!this.dispatchEvent(hideEvent)) return\n\n this.popup.classList.remove('visible')\n this.popup.setAttribute('aria-hidden', 'true')\n\n // Emit after-hide event\n this.dispatchEvent(new CustomEvent('tool-tip-after-hide', {\n bubbles: true\n }))\n }\n\n private positionPopup () {\n if (!this.popup || !this.target) return\n\n const targetRect = this.target.getBoundingClientRect()\n const popupRect = this.popup.getBoundingClientRect()\n const arrowSize = 8\n\n let top = 0\n let left = 0\n let arrowTop = ''\n let arrowLeft = ''\n let arrowTransform = ''\n\n const distance = this.distance\n const skidding = this.skidding\n const placement = this.getOptimalPlacement(targetRect, popupRect)\n\n // Set data attribute for CSS styling\n this.popup.dataset.placement = placement\n\n switch (placement) {\n case 'top':\n top = targetRect.top - popupRect.height - distance - arrowSize\n left = targetRect.left + (targetRect.width / 2) -\n (popupRect.width / 2) + skidding\n arrowTop = '100%'\n arrowLeft = '50%'\n arrowTransform = 'translateX(-50%)'\n break\n case 'top-start':\n top = targetRect.top - popupRect.height - distance - arrowSize\n left = targetRect.left + skidding\n arrowTop = '100%'\n arrowLeft = `${Math.min(24, popupRect.width / 2)}px`\n arrowTransform = 'translateX(-50%)'\n break\n case 'top-end':\n top = targetRect.top - popupRect.height - distance - arrowSize\n left = targetRect.right - popupRect.width + skidding\n arrowTop = '100%'\n arrowLeft = `calc(100% - ${Math.min(24, popupRect.width / 2)}px)`\n arrowTransform = 'translateX(-50%)'\n break\n case 'bottom':\n top = targetRect.bottom + distance + arrowSize\n left = targetRect.left + (targetRect.width / 2) -\n (popupRect.width / 2) + skidding\n arrowTop = '0'\n arrowLeft = '50%'\n arrowTransform = 'translateX(-50%) translateY(-100%)'\n break\n case 'bottom-start':\n top = targetRect.bottom + distance + arrowSize\n left = targetRect.left + skidding\n arrowTop = '0'\n arrowLeft = `${Math.min(24, popupRect.width / 2)}px`\n arrowTransform = 'translateX(-50%) translateY(-100%)'\n break\n case 'bottom-end':\n top = targetRect.bottom + distance + arrowSize\n left = targetRect.right - popupRect.width + skidding\n arrowTop = '0'\n arrowLeft = `calc(100% - ${Math.min(24, popupRect.width / 2)}px)`\n arrowTransform = 'translateX(-50%) translateY(-100%)'\n break\n case 'left':\n top = targetRect.top + (targetRect.height / 2) -\n (popupRect.height / 2) + skidding\n left = targetRect.left - popupRect.width - distance - arrowSize\n arrowTop = '50%'\n arrowLeft = '100%'\n arrowTransform = 'translateY(-50%)'\n break\n case 'left-start':\n top = targetRect.top + skidding\n left = targetRect.left - popupRect.width - distance - arrowSize\n arrowTop = `${Math.min(16, popupRect.height / 2)}px`\n arrowLeft = '100%'\n arrowTransform = 'translateY(-50%)'\n break\n case 'left-end':\n top = targetRect.bottom - popupRect.height + skidding\n left = targetRect.left - popupRect.width - distance - arrowSize\n arrowTop = `calc(100% - ${Math.min(16, popupRect.height / 2)}px)`\n arrowLeft = '100%'\n arrowTransform = 'translateY(-50%)'\n break\n case 'right':\n top = targetRect.top + (targetRect.height / 2) -\n (popupRect.height / 2) + skidding\n left = targetRect.right + distance + arrowSize\n arrowTop = '50%'\n arrowLeft = '0'\n arrowTransform = 'translateY(-50%) translateX(-100%)'\n break\n case 'right-start':\n top = targetRect.top + skidding\n left = targetRect.right + distance + arrowSize\n arrowTop = `${Math.min(16, popupRect.height / 2)}px`\n arrowLeft = '0'\n arrowTransform = 'translateY(-50%) translateX(-100%)'\n break\n case 'right-end':\n top = targetRect.bottom - popupRect.height + skidding\n left = targetRect.right + distance + arrowSize\n arrowTop = `calc(100% - ${Math.min(16, popupRect.height / 2)}px)`\n arrowLeft = '0'\n arrowTransform = 'translateY(-50%) translateX(-100%)'\n break\n }\n\n // Adjust for scroll position\n if (this.hoist) {\n top += window.scrollY\n left += window.scrollX\n }\n\n // Apply position\n this.popup.style.top = `${top}px`\n this.popup.style.left = `${left}px`\n\n // Position the arrow\n if (this.arrow) {\n this.arrow.style.top = arrowTop\n this.arrow.style.left = arrowLeft\n this.arrow.style.transform = arrowTransform\n }\n }\n\n private getOptimalPlacement (targetRect:DOMRect, popupRect:DOMRect):Placement {\n const placement = this.placement\n const viewportWidth = window.innerWidth\n const viewportHeight = window.innerHeight\n const distance = this.distance\n const arrowSize = 8\n\n // Check if the preferred placement fits\n const fits = {\n top: targetRect.top - popupRect.height - distance - arrowSize > 0,\n bottom: (targetRect.bottom + popupRect.height + distance +\n arrowSize < viewportHeight),\n left: targetRect.left - popupRect.width - distance - arrowSize > 0,\n right: (targetRect.right + popupRect.width + distance +\n arrowSize < viewportWidth),\n }\n\n // Get the base direction from the placement\n const baseDirection = placement.split('-')[0] as 'top'|\n 'bottom'|\n 'left'|\n 'right'\n\n // If preferred placement fits, use it\n if (fits[baseDirection]) {\n return placement\n }\n\n // Find the best alternative\n const opposites: Record<string, string> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n }\n\n const opposite = opposites[baseDirection] as\n 'top'|'bottom'|'left'|'right'\n if (fits[opposite]) {\n // Return the opposite with the same alignment\n const alignment = (placement.includes('-') ?\n placement.split('-')[1] :\n '')\n return (alignment ?\n `${opposite}-${alignment}` :\n opposite) as Placement\n }\n\n // Fall back to a direction that fits\n for (const dir of ['top', 'bottom', 'left', 'right'] as const) {\n if (fits[dir]) {\n return dir\n }\n }\n\n // If nothing fits, return original placement\n return placement\n }\n\n /**\n * Programmatically show the tooltip\n */\n show () {\n if (this._disabled) return\n this.open = true\n }\n\n /**\n * Programmatically hide the tooltip\n */\n hide () {\n this.open = false\n }\n}\n\nif ('customElements' in window) {\n customElements.define('tool-tip', ToolTip)\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["ToolTip", "__name", "value", "wasOpen", "name", "_oldValue", "newValue", "body", "triggers", "event", "showEvent", "hideEvent", "targetRect", "popupRect", "arrowSize", "top", "left", "arrowTop", "arrowLeft", "arrowTransform", "distance", "skidding", "placement", "viewportWidth", "viewportHeight", "fits", "baseDirection", "opposite", "alignment", "dir"]
7
7
  }
package/dist/meta.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "inputs": {
3
3
  "src/index.ts": {
4
- "bytes": 15752,
4
+ "bytes": 15651,
5
5
  "imports": [],
6
6
  "format": "esm"
7
7
  }
@@ -11,7 +11,7 @@
11
11
  "imports": [],
12
12
  "exports": [],
13
13
  "inputs": {},
14
- "bytes": 24293
14
+ "bytes": 24184
15
15
  },
16
16
  "dist/index.js": {
17
17
  "imports": [],
@@ -21,10 +21,10 @@
21
21
  "entryPoint": "src/index.ts",
22
22
  "inputs": {
23
23
  "src/index.ts": {
24
- "bytesInOutput": 12111
24
+ "bytesInOutput": 12027
25
25
  }
26
26
  },
27
- "bytes": 12296
27
+ "bytes": 12212
28
28
  }
29
29
  }
30
30
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@substrate-system/tool-tip",
3
- "version": "0.0.0",
3
+ "version": "0.0.1",
4
4
  "description": "Tooltips for when you hover",
5
5
  "type": "module",
6
6
  "exports": {
@@ -29,6 +29,7 @@
29
29
  ],
30
30
  "scripts": {
31
31
  "lint": "eslint \"./**/*.{ts,js}\"",
32
+ "csslint": "stylelint 'src/**/*.css'",
32
33
  "test": "esbuild ./test/index.ts --bundle --format=esm | tapout",
33
34
  "build-css": "lightningcss --nesting src/index.css -o dist/index.css",
34
35
  "build-css:min": "lightningcss --nesting --minify src/index.css -o dist/index.min.css",
@@ -45,469 +46,7 @@
45
46
  "postversion": "git push --follow-tags && npm publish",
46
47
  "prepublishOnly": "npm run build"
47
48
  },
48
- "dependencies": {
49
- "acorn": "^8.15.0",
50
- "acorn-jsx": "^5.3.2",
51
- "ajv": "^6.12.6",
52
- "ansi-red": "^0.1.1",
53
- "ansi-regex": "^5.0.1",
54
- "ansi-styles": "^4.3.0",
55
- "ansi-wrap": "^0.1.0",
56
- "argparse": "^2.0.1",
57
- "array-buffer-byte-length": "^1.0.2",
58
- "array-includes": "^3.1.9",
59
- "array.prototype.findlastindex": "^1.2.6",
60
- "array.prototype.flat": "^1.3.3",
61
- "array.prototype.flatmap": "^1.3.3",
62
- "arraybuffer.prototype.slice": "^1.0.4",
63
- "asap": "^2.0.6",
64
- "astral-regex": "^2.0.0",
65
- "async-function": "^1.0.0",
66
- "autolinker": "^0.28.1",
67
- "available-typed-arrays": "^1.0.7",
68
- "axe-core": "^4.11.1",
69
- "balanced-match": "^1.0.2",
70
- "base64-js": "^1.5.1",
71
- "baseline-browser-mapping": "^2.9.18",
72
- "boolean": "^3.2.0",
73
- "brace-expansion": "^2.0.2",
74
- "braces": "^3.0.3",
75
- "browser-launcher": "^3.0.1",
76
- "browser-run": "^12.0.0",
77
- "buffer-crc32": "^0.2.13",
78
- "buffer-from": "^1.1.2",
79
- "buffer-shims": "^1.0.0",
80
- "builtin-modules": "^3.3.0",
81
- "builtins": "^5.1.0",
82
- "bytes": "^3.0.0",
83
- "cacheable": "^2.3.2",
84
- "cacheable-lookup": "^5.0.4",
85
- "cacheable-request": "^7.0.4",
86
- "call-bind": "^1.0.8",
87
- "call-bind-apply-helpers": "^1.0.2",
88
- "call-bound": "^1.0.4",
89
- "callsites": "^3.1.0",
90
- "caniuse-lite": "^1.0.30001766",
91
- "chalk": "^4.1.2",
92
- "charset": "^1.0.1",
93
- "cliui": "^9.0.1",
94
- "clone-response": "^1.0.3",
95
- "color-convert": "^2.0.1",
96
- "color-name": "^1.1.4",
97
- "colord": "^2.9.3",
98
- "commander": "^7.2.0",
99
- "concat-map": "^0.0.1",
100
- "concat-stream": "^1.6.2",
101
- "concat-with-sourcemaps": "^1.1.0",
102
- "content-disposition": "^0.5.2",
103
- "core-util-is": "^1.0.3",
104
- "cosmiconfig": "^9.0.0",
105
- "cross-spawn": "^7.0.6",
106
- "crypto-random-string": "^1.0.0",
107
- "css-functions-list": "^3.2.3",
108
- "css-tree": "^3.1.0",
109
- "cssauron": "^1.4.0",
110
- "cssesc": "^3.0.0",
111
- "data-view-buffer": "^1.0.2",
112
- "data-view-byte-length": "^1.0.2",
113
- "data-view-byte-offset": "^1.0.1",
114
- "debug": "^4.4.3",
115
- "decompress-response": "^6.0.0",
116
- "deep-is": "^0.1.4",
117
- "defer-to-connect": "^2.0.1",
118
- "define-data-property": "^1.1.4",
119
- "define-properties": "^1.2.1",
120
- "detect-libc": "^2.1.2",
121
- "detect-node": "^2.1.0",
122
- "dezalgo": "^1.0.4",
123
- "diacritics-map": "^0.1.0",
124
- "doctrine": "^3.0.0",
125
- "dunder-proto": "^1.0.1",
126
- "duplexer": "^0.1.2",
127
- "duplexer2": "^0.0.2",
128
- "ecstatic": "^4.1.4",
129
- "ee-first": "^1.1.1",
130
- "electron": "^26.6.10",
131
- "electron-stream": "^11.0.2",
132
- "electron-to-chromium": "^1.5.279",
133
- "emoji-regex": "^8.0.0",
134
- "end-of-stream": "^1.4.5",
135
- "enstore": "^1.0.1",
136
- "ent": "^2.2.2",
137
- "entities": "^4.5.0",
138
- "env-paths": "^2.2.1",
139
- "error-ex": "^1.3.4",
140
- "es-abstract": "^1.24.1",
141
- "es-define-property": "^1.0.1",
142
- "es-errors": "^1.3.0",
143
- "es-object-atoms": "^1.1.1",
144
- "es-set-tostringtag": "^2.1.0",
145
- "es-shim-unscopables": "^1.1.0",
146
- "es-to-primitive": "^1.3.0",
147
- "es6-error": "^4.1.1",
148
- "escalade": "^3.2.0",
149
- "escape-string-regexp": "^4.0.0",
150
- "eslint-compat-utils": "^0.5.1",
151
- "eslint-import-resolver-node": "^0.3.9",
152
- "eslint-module-utils": "^2.12.1",
153
- "eslint-plugin-es-x": "^7.8.0",
154
- "eslint-plugin-import": "^2.32.0",
155
- "eslint-plugin-n": "^16.6.2",
156
- "eslint-plugin-promise": "^6.6.0",
157
- "eslint-scope": "^7.2.2",
158
- "eslint-visitor-keys": "^3.4.3",
159
- "espree": "^9.6.1",
160
- "esprima": "^4.0.1",
161
- "esquery": "^1.7.0",
162
- "esrecurse": "^4.3.0",
163
- "estraverse": "^5.3.0",
164
- "esutils": "^2.0.3",
165
- "expand-range": "^1.8.2",
166
- "extend-shallow": "^2.0.1",
167
- "extract-zip": "^2.0.1",
168
- "fast-deep-equal": "^3.1.3",
169
- "fast-glob": "^3.3.3",
170
- "fast-json-stable-stringify": "^2.1.0",
171
- "fast-levenshtein": "^2.0.6",
172
- "fast-uri": "^3.1.0",
173
- "fastest-levenshtein": "^1.0.16",
174
- "fastq": "^1.20.1",
175
- "fd-slicer": "^1.1.0",
176
- "figures": "^1.7.0",
177
- "file-entry-cache": "^6.0.1",
178
- "fill-range": "^2.2.4",
179
- "find-up": "^5.0.0",
180
- "flat-cache": "^3.2.0",
181
- "flatted": "^3.3.3",
182
- "for-each": "^0.3.5",
183
- "for-in": "^1.0.2",
184
- "fs-extra": "^8.1.0",
185
- "fs.realpath": "^1.0.0",
186
- "function-bind": "^1.1.2",
187
- "function.prototype.name": "^1.1.8",
188
- "functions-have-names": "^1.2.3",
189
- "generator-function": "^2.0.1",
190
- "get-caller-file": "^2.0.5",
191
- "get-east-asian-width": "^1.4.0",
192
- "get-intrinsic": "^1.3.0",
193
- "get-proto": "^1.0.1",
194
- "get-stream": "^5.2.0",
195
- "get-symbol-description": "^1.1.0",
196
- "get-tsconfig": "^4.13.0",
197
- "glob": "^7.2.3",
198
- "glob-parent": "^6.0.2",
199
- "global-agent": "^3.0.0",
200
- "global-modules": "^2.0.0",
201
- "global-prefix": "^3.0.0",
202
- "globals": "^13.24.0",
203
- "globalthis": "^1.0.4",
204
- "globby": "^16.1.0",
205
- "globjoin": "^0.1.4",
206
- "gopd": "^1.2.0",
207
- "got": "^11.8.6",
208
- "graceful-fs": "^4.2.11",
209
- "graphemer": "^1.4.0",
210
- "gray-matter": "^2.1.1",
211
- "gulp-header": "^1.8.12",
212
- "handlebars": "^4.7.8",
213
- "has-ansi": "^2.0.0",
214
- "has-bigints": "^1.1.0",
215
- "has-flag": "^5.0.1",
216
- "has-property-descriptors": "^1.0.2",
217
- "has-proto": "^1.2.0",
218
- "has-symbols": "^1.1.0",
219
- "has-tostringtag": "^1.0.2",
220
- "hashery": "^1.4.0",
221
- "hasown": "^2.0.2",
222
- "he": "^1.2.0",
223
- "headless": "^1.2.0",
224
- "hookified": "^1.15.0",
225
- "html-inject-script": "^2.0.0",
226
- "html-select": "^2.3.24",
227
- "html-tags": "^5.1.0",
228
- "html-tokenize": "^1.2.5",
229
- "http-cache-semantics": "^4.2.0",
230
- "http2-wrapper": "^1.0.3",
231
- "hyperstream": "^1.2.2",
232
- "ignore": "^7.0.5",
233
- "import-cwd": "^3.0.0",
234
- "import-fresh": "^3.3.1",
235
- "import-from": "^3.0.0",
236
- "import-meta-resolve": "^4.2.0",
237
- "imurmurhash": "^0.1.4",
238
- "indexof": "^0.0.1",
239
- "inflight": "^1.0.6",
240
- "inherits": "^2.0.4",
241
- "ini": "^1.3.8",
242
- "internal-slot": "^1.1.0",
243
- "is-array-buffer": "^3.0.5",
244
- "is-arrayish": "^0.2.1",
245
- "is-async-function": "^2.1.1",
246
- "is-bigint": "^1.1.0",
247
- "is-boolean-object": "^1.2.2",
248
- "is-buffer": "^1.1.6",
249
- "is-builtin-module": "^3.2.1",
250
- "is-callable": "^1.2.7",
251
- "is-core-module": "^2.16.1",
252
- "is-data-view": "^1.0.2",
253
- "is-date-object": "^1.1.0",
254
- "is-extendable": "^0.1.1",
255
- "is-extglob": "^2.1.1",
256
- "is-finalizationregistry": "^1.1.1",
257
- "is-finite": "^1.1.0",
258
- "is-fullwidth-code-point": "^3.0.0",
259
- "is-generator-function": "^1.1.2",
260
- "is-glob": "^4.0.3",
261
- "is-map": "^2.0.3",
262
- "is-negative-zero": "^2.0.3",
263
- "is-number": "^2.1.0",
264
- "is-number-object": "^1.1.1",
265
- "is-path-inside": "^3.0.3",
266
- "is-plain-object": "^5.0.0",
267
- "is-regex": "^1.2.1",
268
- "is-set": "^2.0.3",
269
- "is-shared-array-buffer": "^1.0.4",
270
- "is-string": "^1.1.1",
271
- "is-symbol": "^1.1.1",
272
- "is-typed-array": "^1.1.15",
273
- "is-weakmap": "^2.0.2",
274
- "is-weakref": "^1.1.1",
275
- "is-weakset": "^2.0.4",
276
- "isarray": "^1.0.0",
277
- "isexe": "^2.0.0",
278
- "isobject": "^2.1.0",
279
- "js-tokens": "^4.0.0",
280
- "js-yaml": "^4.1.1",
281
- "json-buffer": "^3.0.1",
282
- "json-parse-even-better-errors": "^2.3.1",
283
- "json-schema-traverse": "^0.4.1",
284
- "json-stable-stringify-without-jsonify": "^1.0.1",
285
- "json-stringify-safe": "^5.0.1",
286
- "json5": "^1.0.2",
287
- "jsonfile": "^4.0.0",
288
- "keyv": "^4.5.4",
289
- "kind-of": "^3.2.2",
290
- "known-css-properties": "^0.37.0",
291
- "lazy-cache": "^2.0.2",
292
- "levn": "^0.4.1",
293
- "lightningcss-cli-darwin-arm64": "^1.31.1",
294
- "lightningcss-darwin-arm64": "^1.31.1",
295
- "lines-and-columns": "^1.2.4",
296
- "linkify-it": "^5.0.0",
297
- "list-item": "^1.1.1",
298
- "locate-path": "^6.0.0",
299
- "lodash": "^4.17.23",
300
- "lodash._reinterpolate": "^3.0.0",
301
- "lodash.merge": "^4.6.2",
302
- "lodash.template": "^4.5.0",
303
- "lodash.templatesettings": "^4.2.0",
304
- "lodash.truncate": "^4.4.2",
305
- "lowercase-keys": "^2.0.0",
306
- "lunr": "^2.3.9",
307
- "markdown-it": "^14.1.0",
308
- "markdown-link": "^0.1.1",
309
- "matcher": "^3.0.0",
310
- "math-intrinsics": "^1.1.0",
311
- "math-random": "^1.0.4",
312
- "mathml-tag-names": "^4.0.0",
313
- "mdn-data": "^2.12.2",
314
- "mdurl": "^2.0.0",
315
- "meow": "^14.0.0",
316
- "merge2": "^1.4.1",
317
- "micromatch": "^4.0.8",
318
- "mime": "^2.6.0",
319
- "mime-db": "^1.33.0",
320
- "mime-types": "^2.1.18",
321
- "mimic-response": "^1.0.1",
322
- "minimatch": "^9.0.5",
323
- "minimist": "^1.2.8",
324
- "mixin-deep": "^1.3.2",
325
- "mkdirp": "^1.0.4",
326
- "monotonic-timestamp": "^0.0.8",
327
- "ms": "^2.1.3",
328
- "nanoid": "^3.3.11",
329
- "natural-compare": "^1.4.0",
330
- "neo-async": "^2.6.2",
331
- "node-fetch": "^2.7.0",
332
- "node-releases": "^2.0.27",
333
- "normalize-path": "^3.0.0",
334
- "normalize-url": "^6.1.0",
335
- "object-assign": "^4.1.1",
336
- "object-inspect": "^1.13.4",
337
- "object-keys": "^1.1.1",
338
- "object.assign": "^4.1.7",
339
- "object.fromentries": "^2.0.8",
340
- "object.groupby": "^1.0.3",
341
- "object.pick": "^1.3.0",
342
- "object.values": "^1.2.1",
343
- "on-finished": "^2.4.1",
344
- "once": "^1.4.0",
345
- "optionator": "^0.9.4",
346
- "ordered-emitter": "^0.1.1",
347
- "own-keys": "^1.0.1",
348
- "p-cancelable": "^2.1.1",
349
- "p-limit": "^3.1.0",
350
- "p-locate": "^5.0.0",
351
- "parent-module": "^1.0.1",
352
- "parse-github-url": "^1.0.3",
353
- "parse-json": "^5.2.0",
354
- "parse-ms": "^1.0.1",
355
- "path-exists": "^4.0.0",
356
- "path-is-absolute": "^1.0.1",
357
- "path-is-inside": "^1.0.2",
358
- "path-key": "^3.1.1",
359
- "path-parse": "^1.0.7",
360
- "path-to-regexp": "^3.3.0",
361
- "pend": "^1.2.0",
362
- "picocolors": "^1.1.1",
363
- "picomatch": "^2.3.1",
364
- "pify": "^2.3.0",
365
- "playwright": "^1.58.0",
366
- "playwright-core": "^1.58.0",
367
- "plist": "^3.1.0",
368
- "plur": "^1.0.0",
369
- "possible-typed-array-names": "^1.1.0",
370
- "postcss": "^8.5.6",
371
- "postcss-safe-parser": "^7.0.1",
372
- "postcss-selector-parser": "^7.1.1",
373
- "postcss-value-parser": "^4.2.0",
374
- "prelude-ls": "^1.2.1",
375
- "pretty-ms": "^2.1.0",
376
- "process-nextick-args": "^2.0.1",
377
- "progress": "^2.0.3",
378
- "pump": "^3.0.3",
379
- "punycode": "^1.4.1",
380
- "punycode.js": "^2.3.1",
381
- "qified": "^0.6.0",
382
- "queue-microtask": "^1.2.3",
383
- "quick-lru": "^5.1.1",
384
- "randomatic": "^3.1.1",
385
- "range-parser": "^1.2.0",
386
- "re-emitter": "^1.1.3",
387
- "readable-stream": "^2.3.8",
388
- "readable-wrap": "^1.0.0",
389
- "reflect.getprototypeof": "^1.0.10",
390
- "regexp.prototype.flags": "^1.5.4",
391
- "remarkable": "^1.7.4",
392
- "repeat-element": "^1.1.4",
393
- "repeat-string": "^1.6.1",
394
- "require-directory": "^2.1.1",
395
- "require-from-string": "^2.0.2",
396
- "resolve": "^1.22.11",
397
- "resolve-alpn": "^1.2.1",
398
- "resolve-from": "^4.0.0",
399
- "resolve-pkg-maps": "^1.0.0",
400
- "responselike": "^2.0.1",
401
- "reusify": "^1.1.0",
402
- "rimraf": "^3.0.2",
403
- "roarr": "^2.15.4",
404
- "rollup": "^4.56.0",
405
- "run-parallel": "^1.2.0",
406
- "safe-array-concat": "^1.1.3",
407
- "safe-buffer": "^5.1.2",
408
- "safe-push-apply": "^1.0.0",
409
- "safe-regex-test": "^1.1.0",
410
- "semver": "^7.7.3",
411
- "semver-compare": "^1.0.0",
412
- "serialize-error": "^7.0.1",
413
- "serve-handler": "^6.1.6",
414
- "server-destroy": "^1.0.1",
415
- "set-function-length": "^1.2.2",
416
- "set-function-name": "^2.0.2",
417
- "set-getter": "^0.1.1",
418
- "set-proto": "^1.0.0",
419
- "shebang-command": "^2.0.0",
420
- "shebang-regex": "^3.0.0",
421
- "side-channel": "^1.1.0",
422
- "side-channel-list": "^1.0.0",
423
- "side-channel-map": "^1.0.1",
424
- "side-channel-weakmap": "^1.0.2",
425
- "signal-exit": "^4.1.0",
426
- "slash": "^5.1.0",
427
- "slice-ansi": "^4.0.0",
428
- "source-map": "^0.6.1",
429
- "source-map-js": "^1.2.1",
430
- "source-map-support": "^0.4.18",
431
- "split": "^1.0.0",
432
- "sprintf-js": "^1.1.3",
433
- "stop-iteration-iterator": "^1.1.0",
434
- "stream-combiner2": "^1.0.2",
435
- "stream-read": "^1.1.2",
436
- "stream-splicer": "^1.3.2",
437
- "string-width": "^8.1.0",
438
- "string.prototype.trim": "^1.2.10",
439
- "string.prototype.trimend": "^1.0.9",
440
- "string.prototype.trimstart": "^1.0.8",
441
- "string_decoder": "^1.1.1",
442
- "strip-ansi": "^6.0.1",
443
- "strip-bom": "^3.0.0",
444
- "strip-color": "^0.1.0",
445
- "strip-json-comments": "^3.1.1",
446
- "stylelint-config-recommended": "^18.0.0",
447
- "sumchecker": "^3.0.1",
448
- "supports-color": "^10.2.2",
449
- "supports-hyperlinks": "^4.4.0",
450
- "supports-preserve-symlinks-flag": "^1.0.0",
451
- "svg-tags": "^1.0.0",
452
- "table": "^6.9.0",
453
- "tap-out": "^2.1.0",
454
- "tap-parser": "^0.2.1",
455
- "temp-dir": "^1.0.0",
456
- "tempy": "^0.1.0",
457
- "text-table": "^0.2.0",
458
- "through": "^2.3.8",
459
- "through2": "^2.0.5",
460
- "throughout": "^0.0.0",
461
- "tinyglobby": "^0.2.15",
462
- "to-object-path": "^0.3.0",
463
- "to-regex-range": "^5.0.1",
464
- "toml": "^2.3.6",
465
- "tr46": "^0.0.3",
466
- "trim": "^0.0.1",
467
- "trumpet": "^1.7.2",
468
- "ts-api-utils": "^2.4.0",
469
- "tsconfig-paths": "^3.15.0",
470
- "type-check": "^0.4.0",
471
- "type-fest": "^0.20.2",
472
- "typed-array-buffer": "^1.0.3",
473
- "typed-array-byte-length": "^1.0.3",
474
- "typed-array-byte-offset": "^1.0.4",
475
- "typed-array-length": "^1.0.7",
476
- "typedarray": "^0.0.6",
477
- "uc.micro": "^2.1.0",
478
- "uglify-js": "^3.19.3",
479
- "unbox-primitive": "^1.1.0",
480
- "undici-types": "^7.16.0",
481
- "unicorn-magic": "^0.4.0",
482
- "unique-string": "^1.0.0",
483
- "universalify": "^0.1.2",
484
- "update-browserslist-db": "^1.2.3",
485
- "uri-js": "^4.4.1",
486
- "url-join": "^4.0.1",
487
- "utf8-stream": "^0.0.0",
488
- "util-deprecate": "^1.0.2",
489
- "webidl-conversions": "^3.0.1",
490
- "whatwg-url": "^5.0.0",
491
- "which": "^2.0.2",
492
- "which-boxed-primitive": "^1.1.1",
493
- "which-builtin-type": "^1.2.1",
494
- "which-collection": "^1.0.2",
495
- "which-typed-array": "^1.1.20",
496
- "word-wrap": "^1.2.5",
497
- "wordwrap": "^1.0.0",
498
- "wrap-ansi": "^9.0.2",
499
- "wrappy": "^1.0.2",
500
- "write-file-atomic": "^7.0.0",
501
- "xhr-write-stream": "^0.1.2",
502
- "xmlbuilder": "^15.1.1",
503
- "xtend": "^4.0.2",
504
- "y18n": "^5.0.8",
505
- "yaml": "^2.8.2",
506
- "yargs": "^18.0.0",
507
- "yargs-parser": "^22.0.0",
508
- "yauzl": "^2.10.0",
509
- "yocto-queue": "^0.1.0"
510
- },
49
+ "dependencies": {},
511
50
  "devDependencies": {
512
51
  "@substrate-system/debug": "^0.9.32",
513
52
  "@substrate-system/dom": "^0.1.13",