@primitiv-ui/web 0.1.55 → 0.1.56

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
@@ -6,7 +6,7 @@ framework and no runtime dependencies beyond
6
6
  server-rendered stack (HTMX, Rails, Django, Laravel, Spring …), and inside
7
7
  React, Vue, Angular or any other framework.
8
8
 
9
- > **Status: published.** Tabs, Accordion, Collapsible, Modal and Popover so far. See
9
+ > **Status: published.** Tabs, Accordion, Collapsible, Modal, Popover and Tooltip so far. See
10
10
  > [RFC 0033](../../docs/rfcs/0033-web-components.md) for the design.
11
11
 
12
12
  ## Components
@@ -18,6 +18,7 @@ React, Vue, Angular or any other framework.
18
18
  | Collapsible | `primitiv-collapsible`, `-trigger`, `-content`, `-trigger-icon` | `primitiv-collapsible-change` | 0.1.47 |
19
19
  | Modal | `primitiv-modal`, `-trigger`, `-content`, `-title`, `-description`, `-close` | `primitiv-modal-change` | 0.1.54 |
20
20
  | Popover | `primitiv-popover`, `-trigger`, `-anchor`, `-content`, `-title`, `-description`, `-close` | `primitiv-popover-change` | 0.1.55 |
21
+ | Tooltip | `primitiv-tooltip`, `-provider`, `-trigger`, `-content`, `-arrow` | `primitiv-tooltip-change` | 0.1.56 |
21
22
 
22
23
  ## Use it
23
24
 
@@ -50,9 +51,10 @@ downloads it once. `dist/primitiv-web.js` is the alternative: every element in
50
51
  one file. Per-component files ship from 0.1.43.
51
52
 
52
53
  The main entry (`@primitiv-ui/web`, `/tabs`, `/accordion`, `/collapsible`,
53
- `/modal`, `/popover`) exports the classes and `defineTabs(registry?)` /
54
+ `/modal`, `/popover`, `/tooltip`) exports the classes and `defineTabs(registry?)` /
54
55
  `defineAccordion(registry?)` / `defineCollapsible(registry?)` /
55
- `defineModal(registry?)` / `definePopover(registry?)` with **no side effects**.
56
+ `defineModal(registry?)` / `definePopover(registry?)` / `defineTooltip(registry?)`
57
+ with **no side effects**.
56
58
 
57
59
  **Render `hidden` on inactive panels yourself.** Until the module loads, CSS
58
60
  cannot tell which panel is active, so markup that omits it shows every panel.
@@ -183,6 +185,37 @@ on a panel as it becomes active, for lazy loading.
183
185
  **Listen with `primitiv-popover-change`** (bubbles, cancelable, `detail: {
184
186
  open }`), fired before every user-driven change, a light dismiss included.
185
187
 
188
+ ### Tooltip
189
+
190
+ ```html
191
+ <script type="module" src="https://cdn.jsdelivr.net/npm/@primitiv-ui/web@<version>/dist/cdn/tooltip.js"></script>
192
+
193
+ <primitiv-tooltip>
194
+ <primitiv-tooltip-trigger><button type="button">Save</button></primitiv-tooltip-trigger>
195
+ <primitiv-tooltip-content popover="manual">
196
+ Saves your work
197
+ <primitiv-tooltip-arrow></primitiv-tooltip-arrow>
198
+ </primitiv-tooltip-content>
199
+ </primitiv-tooltip>
200
+ ```
201
+
202
+ - **It opens on hover after `delay-duration` (700 ms) and on focus at once**,
203
+ and closes when the pointer leaves (after a short grace period, so the pointer
204
+ can reach the bubble — `disable-hoverable-content` turns that off), on blur,
205
+ on Escape and on a press outside. The element gives the bubble
206
+ `role="tooltip"` and the trigger's button `aria-describedby`.
207
+ - **It is a native `popover="manual"`** in the top layer, shown with the
208
+ trigger as its source, so CSS anchor positioning places it with no
209
+ `anchor-name` / `position-anchor` pair. Write `popover="manual"` yourself so
210
+ the bubble is hidden before the script loads.
211
+ - **Moving from one trigger to the next opens each next tooltip at once** (the
212
+ skip delay, 300 ms). Tooltips inside a `<primitiv-tooltip-provider>` share its
213
+ `delay-duration` and `skip-delay-duration`; the rest share a document-wide
214
+ window.
215
+ - **`open` on the root is the state**; the `open` property reads and sets it.
216
+ **Listen with `primitiv-tooltip-change`** (bubbles, cancelable, `detail: {
217
+ open }`), fired before every user-driven change.
218
+
186
219
  **TypeScript** — opt into the tag map so DOM queries return the element classes:
187
220
  `import type {} from "@primitiv-ui/web/tags"` (npm only).
188
221
 
@@ -0,0 +1 @@
1
+ import{a as l,b as s,c as f,d as E,f as T}from"./chunks/chunk-QVNDDONZ.js";function b({groupOpen:n,delay:t}){return n?0:t}var d=class{#t;#o=null;#e=null;#n=t=>this.#r(t);#i=t=>this.#p(t);constructor(t){this.#t=t}openNow(){this.#l(),this.#t.change(!0),this.#t.tooltipGroup().opened()}hoverStart(){let t=b({groupOpen:this.#t.tooltipGroup().isOpen(),delay:this.#t.delay()});if(t===0){this.openNow();return}this.#o=setTimeout(()=>{this.openNow(),this.#o=null},t)}closeNow(){this.holdOpen(),this.#t.change(!1),this.#t.tooltipGroup().closed()}hoverEnd(){this.#l(),this.#e=setTimeout(()=>{this.#t.change(!1),this.#t.tooltipGroup().closed(),this.#e=null},100)}holdOpen(){this.#e!==null&&(clearTimeout(this.#e),this.#e=null)}sync(){let{open:t}=this.#t.state();t?(document.addEventListener("keydown",this.#n),document.addEventListener("pointerdown",this.#i)):this.#s()}#s(){document.removeEventListener("keydown",this.#n),document.removeEventListener("pointerdown",this.#i)}disconnect(){this.#l(),this.holdOpen(),this.#s()}#l(){this.#o!==null&&(clearTimeout(this.#o),this.#o=null)}#r(t){t.key==="Escape"&&(this.#t.escapeKeyDown?.(t),t.defaultPrevented||this.closeNow())}#p(t){this.#t.content()?.contains(t.target)||(this.#t.pointerDownOutside?.(t),t.defaultPrevented||this.closeNow())}};var r=class{#t;#o=!1;#e=null;constructor(t){this.#t=t}isOpen(){return this.#o}opened(){this.#e!==null&&(clearTimeout(this.#e),this.#e=null),this.#o=!0}closed(){clearTimeout(this.#e??void 0),this.#e=setTimeout(()=>{this.#o=!1,this.#e=null},this.#t())}dispose(){clearTimeout(this.#e??void 0)}};var G="primitiv-tooltip",L="primitiv-tooltip-provider",y="primitiv-tooltip-trigger",O="primitiv-tooltip-content",H="primitiv-tooltip-arrow",w=700,g=300;function u(n,t,e){let i=Number(n.getAttribute(t)??Number.NaN);return Number.isNaN(i)?e:i}var R=new r(()=>g),h=class extends l{#t;get group(){return this.#t??=new r(()=>u(this,"skip-delay-duration",g))}},a=class extends T{#t=null;#o=null;#e=null;#n=null;#i=new d(this.#s());controller={connect:()=>{},disconnect:()=>this.#l()};reconcileOn=["open"];get open(){return this.hasAttribute("open")}set open(t){this.toggleAttribute("open",t)}#s(){let t=()=>this.closest(L);return{state:()=>({open:this.open}),change:e=>{e!==this.open&&this.announce("primitiv-tooltip-change",{open:e})&&(this.open=e)},delay:()=>{let e=t();return u(this,"delay-duration",e?u(e,"delay-duration",w):w)},tooltipGroup:()=>t()?.group??R,content:()=>this.#o}}#l(){this.open&&this.#s().tooltipGroup().closed(),this.#n?.abort(),this.#n=null,this.#t=null,this.#o=null,this.#e=null,this.#i.disconnect()}#r(t,e){if(t===this.#t&&e===this.#o)return;this.#n?.abort(),this.#n=new AbortController,this.#t=t,this.#o=e;let i={signal:this.#n.signal},o=this.#i;t?.addEventListener("pointerenter",()=>o.hoverStart(),i),t?.addEventListener("pointerleave",()=>this.hasAttribute("disable-hoverable-content")?o.closeNow():o.hoverEnd(),i),t?.addEventListener("focus",()=>o.openNow(),i),t?.addEventListener("blur",()=>o.closeNow(),i),e?.addEventListener("pointerenter",()=>o.holdOpen(),i),e?.addEventListener("pointerleave",()=>o.closeNow(),i)}reconcile(){let t=this.open,e=t?"open":"closed";s(this,"data-state",e);let[i]=this.parts(y),[o=null]=this.parts(O),p=i?A(i):null;o&&(o.id||(o.id=`${this.rootId()}-content`),s(o,"role","tooltip"),o.hasAttribute("popover")||o.setAttribute("popover","manual"),s(o,"data-state",e)),p&&(s(p,"aria-describedby",o?o.id:null),s(p,"data-state",e)),this.#r(p,o),this.#p(t?o:null),this.#i.sync()}#p(t){if(t===this.#e)return;if(this.#e)try{this.#e.hidePopover()}catch{}if(this.#e=t,!t)return;let e=t;this.#t?e.showPopover({source:this.#t}):e.showPopover()}};function A(n){return n.childElementCount===1?n.firstElementChild:(f(n,`<${y}> needs exactly one element child (a <button>) to decorate.`),null)}var c=class extends l{},m=class extends l{},v=class extends l{};function N(n=globalThis.customElements){E(n,[[G,a],[L,h],[y,c],[O,m],[H,v]])}N();
@@ -1548,6 +1548,363 @@
1548
1548
  }
1549
1549
  }
1550
1550
  ]
1551
+ },
1552
+ {
1553
+ "kind": "javascript-module",
1554
+ "path": "src/tooltip/elements.ts",
1555
+ "declarations": [
1556
+ {
1557
+ "kind": "class",
1558
+ "description": "`<primitiv-tooltip-provider>` — optional. The tooltips inside it share one\nskip-delay window and its default delay, as inside React's\n`Tooltip.Provider`; tooltips outside any provider share a document-wide one.",
1559
+ "name": "PrimitivTooltipProviderElement",
1560
+ "members": [
1561
+ {
1562
+ "kind": "field",
1563
+ "name": "#group",
1564
+ "privacy": "private",
1565
+ "type": {
1566
+ "text": "TooltipGroup | undefined"
1567
+ }
1568
+ },
1569
+ {
1570
+ "kind": "field",
1571
+ "name": "group",
1572
+ "type": {
1573
+ "text": "TooltipGroup"
1574
+ },
1575
+ "description": "The skip-delay window this provider's tooltips share, created on first use.",
1576
+ "readonly": true
1577
+ }
1578
+ ],
1579
+ "attributes": [
1580
+ {
1581
+ "type": {
1582
+ "text": "number"
1583
+ },
1584
+ "description": "How long, in milliseconds, a pointer rests on a trigger before its tooltip opens. Default 700. A tooltip's own `delay-duration` overrides it.",
1585
+ "name": "delay-duration"
1586
+ },
1587
+ {
1588
+ "type": {
1589
+ "text": "number"
1590
+ },
1591
+ "description": "How long, in milliseconds, after one tooltip closes that hovering another opens it at once. Default 300.",
1592
+ "name": "skip-delay-duration"
1593
+ }
1594
+ ],
1595
+ "superclass": {
1596
+ "name": "ElementBase",
1597
+ "module": "/src/internal/element.ts"
1598
+ },
1599
+ "tagName": "primitiv-tooltip-provider",
1600
+ "customElement": true
1601
+ },
1602
+ {
1603
+ "kind": "class",
1604
+ "description": "`<primitiv-tooltip>` — the state owner of a tooltip: a short description of\nits trigger that appears on hover after a delay, and at once on focus. It\ncloses when the pointer leaves (after a moment, so it can be reached),\non blur, on Escape and on a press outside. Moving from one trigger to the\nnext opens each next tooltip at once (the skip delay). The tooltip is shown\nas a `popover=\"manual\"` in the top layer, with the trigger as its source,\nwhich makes the trigger its implicit anchor for CSS anchor positioning.\n\nThe root finds its own parts and reconciles their ARIA from its reflected\nstate whenever a part arrives, leaves, or changes an attribute the root\nreads (the lifecycle is `PrimitivRootElement`'s).",
1605
+ "name": "PrimitivTooltipElement",
1606
+ "members": [
1607
+ {
1608
+ "kind": "field",
1609
+ "name": "#trigger",
1610
+ "privacy": "private",
1611
+ "type": {
1612
+ "text": "HTMLElement | null"
1613
+ },
1614
+ "default": "null",
1615
+ "description": "The decorated trigger button and the tooltip, as of the last reconcile."
1616
+ },
1617
+ {
1618
+ "kind": "field",
1619
+ "name": "#content",
1620
+ "privacy": "private",
1621
+ "type": {
1622
+ "text": "HTMLElement | null"
1623
+ },
1624
+ "default": "null"
1625
+ },
1626
+ {
1627
+ "kind": "field",
1628
+ "name": "#shown",
1629
+ "privacy": "private",
1630
+ "type": {
1631
+ "text": "HTMLElement | null"
1632
+ },
1633
+ "default": "null",
1634
+ "description": "The tooltip this root has shown, while it shows."
1635
+ },
1636
+ {
1637
+ "kind": "field",
1638
+ "name": "#bindings",
1639
+ "privacy": "private",
1640
+ "type": {
1641
+ "text": "AbortController | null"
1642
+ },
1643
+ "default": "null",
1644
+ "description": "The listeners on the trigger and the tooltip, rebuilt when either changes."
1645
+ },
1646
+ {
1647
+ "kind": "field",
1648
+ "name": "#tooltip",
1649
+ "privacy": "private",
1650
+ "readonly": true,
1651
+ "default": "new TooltipController(this.#host())"
1652
+ },
1653
+ {
1654
+ "kind": "field",
1655
+ "name": "controller",
1656
+ "type": {
1657
+ "text": "{ connect(): void; disconnect(): void }"
1658
+ },
1659
+ "privacy": "protected",
1660
+ "readonly": true,
1661
+ "default": "{ connect: (): void => {}, disconnect: (): void => this.#disconnect(), }"
1662
+ },
1663
+ {
1664
+ "kind": "field",
1665
+ "name": "reconcileOn",
1666
+ "type": {
1667
+ "text": "readonly string[]"
1668
+ },
1669
+ "privacy": "protected",
1670
+ "readonly": true,
1671
+ "default": "[\"open\"]"
1672
+ },
1673
+ {
1674
+ "kind": "field",
1675
+ "name": "open",
1676
+ "type": {
1677
+ "text": "boolean"
1678
+ },
1679
+ "description": "Whether the tooltip is showing, reflected as the boolean `open` attribute."
1680
+ },
1681
+ {
1682
+ "kind": "method",
1683
+ "name": "#host",
1684
+ "privacy": "private",
1685
+ "return": {
1686
+ "type": {
1687
+ "text": "TooltipControllerHost"
1688
+ }
1689
+ },
1690
+ "description": "The controller's view of this element: state lives in the reflected attribute."
1691
+ },
1692
+ {
1693
+ "kind": "method",
1694
+ "name": "#disconnect",
1695
+ "privacy": "private",
1696
+ "return": {
1697
+ "type": {
1698
+ "text": "void"
1699
+ }
1700
+ }
1701
+ },
1702
+ {
1703
+ "kind": "method",
1704
+ "name": "#bind",
1705
+ "privacy": "private",
1706
+ "return": {
1707
+ "type": {
1708
+ "text": "void"
1709
+ }
1710
+ },
1711
+ "parameters": [
1712
+ {
1713
+ "name": "trigger",
1714
+ "type": {
1715
+ "text": "HTMLElement | null"
1716
+ }
1717
+ },
1718
+ {
1719
+ "name": "content",
1720
+ "type": {
1721
+ "text": "HTMLElement | null"
1722
+ }
1723
+ }
1724
+ ],
1725
+ "description": "Listen on `trigger` and `content`, rebinding only when either changed."
1726
+ },
1727
+ {
1728
+ "kind": "method",
1729
+ "name": "reconcile",
1730
+ "privacy": "protected",
1731
+ "return": {
1732
+ "type": {
1733
+ "text": "void"
1734
+ }
1735
+ }
1736
+ },
1737
+ {
1738
+ "kind": "method",
1739
+ "name": "#show",
1740
+ "privacy": "private",
1741
+ "return": {
1742
+ "type": {
1743
+ "text": "void"
1744
+ }
1745
+ },
1746
+ "parameters": [
1747
+ {
1748
+ "name": "content",
1749
+ "type": {
1750
+ "text": "HTMLElement | null"
1751
+ }
1752
+ }
1753
+ ],
1754
+ "description": "Show `content` (anchored to the trigger), or hide what is showing when it is `null`."
1755
+ }
1756
+ ],
1757
+ "events": [
1758
+ {
1759
+ "type": {
1760
+ "text": "CustomEvent<{ open: boolean }>"
1761
+ },
1762
+ "description": "Bubbles, cancelable, fired before a user-driven change is applied — hover, focus, blur, Escape or a press outside — with the open state afterwards. Call `preventDefault()` to veto it.",
1763
+ "name": "primitiv-tooltip-change"
1764
+ }
1765
+ ],
1766
+ "attributes": [
1767
+ {
1768
+ "type": {
1769
+ "text": "boolean"
1770
+ },
1771
+ "description": "Whether the tooltip is showing. Reflected: it changes as the user hovers, focuses and dismisses it. Set it (or the `open` property) to show or hide it from script.",
1772
+ "name": "open"
1773
+ },
1774
+ {
1775
+ "type": {
1776
+ "text": "number"
1777
+ },
1778
+ "description": "How long, in milliseconds, a pointer rests on the trigger before the tooltip opens. Defaults to the provider's, or 700. Focus always opens it at once.",
1779
+ "name": "delay-duration"
1780
+ },
1781
+ {
1782
+ "type": {
1783
+ "text": "boolean"
1784
+ },
1785
+ "description": "Close as soon as the pointer leaves the trigger, rather than giving it a moment to reach the tooltip.",
1786
+ "name": "disable-hoverable-content"
1787
+ }
1788
+ ],
1789
+ "superclass": {
1790
+ "name": "PrimitivRootElement",
1791
+ "module": "/src/internal/RootElement.ts"
1792
+ },
1793
+ "tagName": "primitiv-tooltip",
1794
+ "customElement": true,
1795
+ "summary": "The state owner of a tooltip, shown on hover and focus."
1796
+ },
1797
+ {
1798
+ "kind": "class",
1799
+ "description": "`<primitiv-tooltip-trigger>` — an interactive part. It decorates exactly one\nchild the consumer writes, a `<button>`, which opens the tooltip on hover and\nfocus and is described by it (`aria-describedby`), so the rendered DOM\nmatches React's (RFC 0033 D24).",
1800
+ "name": "PrimitivTooltipTriggerElement",
1801
+ "superclass": {
1802
+ "name": "ElementBase",
1803
+ "module": "/src/internal/element.ts"
1804
+ },
1805
+ "tagName": "primitiv-tooltip-trigger",
1806
+ "customElement": true
1807
+ },
1808
+ {
1809
+ "kind": "class",
1810
+ "description": "`<primitiv-tooltip-content>` — the tooltip itself. Structural: the root\ngives it an id, `role=\"tooltip\"`, `popover=\"manual\"` (write it in your markup\ntoo, so it is hidden before the script loads) and `data-state`.",
1811
+ "name": "PrimitivTooltipContentElement",
1812
+ "superclass": {
1813
+ "name": "ElementBase",
1814
+ "module": "/src/internal/element.ts"
1815
+ },
1816
+ "tagName": "primitiv-tooltip-content",
1817
+ "customElement": true
1818
+ },
1819
+ {
1820
+ "kind": "class",
1821
+ "description": "`<primitiv-tooltip-arrow>` — an optional, decorative pointer, inside the\ncontent. The element writes nothing on it; style it as you like.",
1822
+ "name": "PrimitivTooltipArrowElement",
1823
+ "superclass": {
1824
+ "name": "ElementBase",
1825
+ "module": "/src/internal/element.ts"
1826
+ },
1827
+ "tagName": "primitiv-tooltip-arrow",
1828
+ "customElement": true
1829
+ },
1830
+ {
1831
+ "kind": "function",
1832
+ "name": "defineTooltip",
1833
+ "return": {
1834
+ "type": {
1835
+ "text": "void"
1836
+ }
1837
+ },
1838
+ "parameters": [
1839
+ {
1840
+ "name": "registry",
1841
+ "default": "globalThis.customElements",
1842
+ "type": {
1843
+ "text": "ElementRegistry | undefined"
1844
+ }
1845
+ }
1846
+ ],
1847
+ "description": "Define the five Tooltip elements on `registry` (the global `customElements`\nby default). Safe to call more than once, and a no-op where there is no\nregistry (a server render)."
1848
+ }
1849
+ ],
1850
+ "exports": [
1851
+ {
1852
+ "kind": "js",
1853
+ "name": "ElementRegistry",
1854
+ "declaration": {
1855
+ "name": "ElementRegistry",
1856
+ "module": "src/tooltip/elements.ts"
1857
+ }
1858
+ },
1859
+ {
1860
+ "kind": "js",
1861
+ "name": "PrimitivTooltipProviderElement",
1862
+ "declaration": {
1863
+ "name": "PrimitivTooltipProviderElement",
1864
+ "module": "src/tooltip/elements.ts"
1865
+ }
1866
+ },
1867
+ {
1868
+ "kind": "js",
1869
+ "name": "PrimitivTooltipElement",
1870
+ "declaration": {
1871
+ "name": "PrimitivTooltipElement",
1872
+ "module": "src/tooltip/elements.ts"
1873
+ }
1874
+ },
1875
+ {
1876
+ "kind": "js",
1877
+ "name": "PrimitivTooltipTriggerElement",
1878
+ "declaration": {
1879
+ "name": "PrimitivTooltipTriggerElement",
1880
+ "module": "src/tooltip/elements.ts"
1881
+ }
1882
+ },
1883
+ {
1884
+ "kind": "js",
1885
+ "name": "PrimitivTooltipContentElement",
1886
+ "declaration": {
1887
+ "name": "PrimitivTooltipContentElement",
1888
+ "module": "src/tooltip/elements.ts"
1889
+ }
1890
+ },
1891
+ {
1892
+ "kind": "js",
1893
+ "name": "PrimitivTooltipArrowElement",
1894
+ "declaration": {
1895
+ "name": "PrimitivTooltipArrowElement",
1896
+ "module": "src/tooltip/elements.ts"
1897
+ }
1898
+ },
1899
+ {
1900
+ "kind": "js",
1901
+ "name": "defineTooltip",
1902
+ "declaration": {
1903
+ "name": "defineTooltip",
1904
+ "module": "src/tooltip/elements.ts"
1905
+ }
1906
+ }
1907
+ ]
1551
1908
  }
1552
1909
  ]
1553
1910
  }
@@ -7,3 +7,4 @@ import "./collapsible.js";
7
7
  import "./modal.js";
8
8
  import "./popover.js";
9
9
  import "./tabs.js";
10
+ import "./tooltip.js";
@@ -7,3 +7,4 @@ import "./collapsible.js";
7
7
  import "./modal.js";
8
8
  import "./popover.js";
9
9
  import "./tabs.js";
10
+ import "./tooltip.js";
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Side-effect entry: importing this module defines the five Tooltip elements
3
+ * (`<primitiv-tooltip>`, `-provider`, `-trigger`, `-content`, `-arrow`) on the
4
+ * global `customElements` registry.
5
+ *
6
+ * ```html
7
+ * <script type="module">import "@primitiv-ui/web/define/tooltip";</script>
8
+ * ```
9
+ */
10
+ import { defineTooltip } from "../tooltip/elements.js";
11
+ defineTooltip();
@@ -23,3 +23,7 @@ export type PrimitivModalChangeEvent = CustomEvent<{
23
23
  export type PrimitivPopoverChangeEvent = CustomEvent<{
24
24
  open: boolean;
25
25
  }>;
26
+ /** The `primitiv-tooltip-change` event: bubbles, cancelable, fired before the change applies, with the open state afterwards. */
27
+ export type PrimitivTooltipChangeEvent = CustomEvent<{
28
+ open: boolean;
29
+ }>;
@@ -23,12 +23,13 @@ import type { PrimitivCollapsibleContentElement, PrimitivCollapsibleElement, Pri
23
23
  import type { PrimitivModalCloseElement, PrimitivModalContentElement, PrimitivModalDescriptionElement, PrimitivModalElement, PrimitivModalTitleElement, PrimitivModalTriggerElement } from "../modal/elements.js";
24
24
  import type { PrimitivPopoverAnchorElement, PrimitivPopoverCloseElement, PrimitivPopoverContentElement, PrimitivPopoverDescriptionElement, PrimitivPopoverElement, PrimitivPopoverTitleElement, PrimitivPopoverTriggerElement } from "../popover/elements.js";
25
25
  import type { PrimitivTabsContentElement, PrimitivTabsElement, PrimitivTabsListElement, PrimitivTabsTriggerElement } from "../tabs/elements.js";
26
- import type { PrimitivAccordionChangeEvent, PrimitivCollapsibleChangeEvent, PrimitivModalChangeEvent, PrimitivPopoverChangeEvent, PrimitivTabsChangeEvent } from "./events.js";
26
+ import type { PrimitivTooltipArrowElement, PrimitivTooltipContentElement, PrimitivTooltipElement, PrimitivTooltipProviderElement, PrimitivTooltipTriggerElement } from "../tooltip/elements.js";
27
+ import type { PrimitivAccordionChangeEvent, PrimitivCollapsibleChangeEvent, PrimitivModalChangeEvent, PrimitivPopoverChangeEvent, PrimitivTabsChangeEvent, PrimitivTooltipChangeEvent } from "./events.js";
27
28
  /** React's own props for an element, plus `class`, which React 19 passes to custom elements. */
28
29
  type ElementProps<E extends HTMLElement> = DetailedHTMLProps<HTMLAttributes<E>, E> & {
29
30
  class?: string;
30
31
  };
31
- export type { PrimitivAccordionChangeEvent, PrimitivCollapsibleChangeEvent, PrimitivModalChangeEvent, PrimitivPopoverChangeEvent, PrimitivTabsChangeEvent, };
32
+ export type { PrimitivAccordionChangeEvent, PrimitivCollapsibleChangeEvent, PrimitivModalChangeEvent, PrimitivPopoverChangeEvent, PrimitivTabsChangeEvent, PrimitivTooltipChangeEvent, };
32
33
  declare module "react" {
33
34
  namespace JSX {
34
35
  interface IntrinsicElements {
@@ -99,6 +100,21 @@ declare module "react" {
99
100
  value: string;
100
101
  "onprimitiv-tabs-show"?: (event: CustomEvent) => void;
101
102
  };
103
+ "primitiv-tooltip": ElementProps<PrimitivTooltipElement> & {
104
+ open?: boolean;
105
+ "delay-duration"?: number | string;
106
+ "disable-hoverable-content"?: boolean;
107
+ "onprimitiv-tooltip-change"?: (event: PrimitivTooltipChangeEvent) => void;
108
+ };
109
+ "primitiv-tooltip-provider": ElementProps<PrimitivTooltipProviderElement> & {
110
+ "delay-duration"?: number | string;
111
+ "skip-delay-duration"?: number | string;
112
+ };
113
+ "primitiv-tooltip-trigger": ElementProps<PrimitivTooltipTriggerElement>;
114
+ "primitiv-tooltip-content": ElementProps<PrimitivTooltipContentElement> & {
115
+ popover?: "auto" | "manual" | "";
116
+ };
117
+ "primitiv-tooltip-arrow": ElementProps<PrimitivTooltipArrowElement>;
102
118
  }
103
119
  }
104
120
  }
@@ -22,7 +22,8 @@ import type { PrimitivCollapsibleContentElement, PrimitivCollapsibleElement, Pri
22
22
  import type { PrimitivModalCloseElement, PrimitivModalContentElement, PrimitivModalDescriptionElement, PrimitivModalElement, PrimitivModalTitleElement, PrimitivModalTriggerElement } from "../modal/elements.js";
23
23
  import type { PrimitivPopoverAnchorElement, PrimitivPopoverCloseElement, PrimitivPopoverContentElement, PrimitivPopoverDescriptionElement, PrimitivPopoverElement, PrimitivPopoverTitleElement, PrimitivPopoverTriggerElement } from "../popover/elements.js";
24
24
  import type { PrimitivTabsContentElement, PrimitivTabsElement, PrimitivTabsListElement, PrimitivTabsTriggerElement } from "../tabs/elements.js";
25
- import type { PrimitivAccordionChangeEvent, PrimitivCollapsibleChangeEvent, PrimitivModalChangeEvent, PrimitivPopoverChangeEvent, PrimitivTabsChangeEvent } from "./events.js";
25
+ import type { PrimitivTooltipArrowElement, PrimitivTooltipContentElement, PrimitivTooltipElement, PrimitivTooltipProviderElement, PrimitivTooltipTriggerElement } from "../tooltip/elements.js";
26
+ import type { PrimitivAccordionChangeEvent, PrimitivCollapsibleChangeEvent, PrimitivModalChangeEvent, PrimitivPopoverChangeEvent, PrimitivTabsChangeEvent, PrimitivTooltipChangeEvent } from "./events.js";
26
27
  /** Svelte's own attributes and events for an element. */
27
28
  type Attributes<E extends HTMLElement> = HTMLAttributes<E>;
28
29
  declare module "svelte/elements" {
@@ -92,6 +93,19 @@ declare module "svelte/elements" {
92
93
  value: string;
93
94
  "onprimitiv-tabs-show"?: (event: CustomEvent) => void;
94
95
  };
96
+ "primitiv-tooltip": Attributes<PrimitivTooltipElement> & {
97
+ open?: boolean;
98
+ "delay-duration"?: number | string;
99
+ "disable-hoverable-content"?: boolean;
100
+ "onprimitiv-tooltip-change"?: (event: PrimitivTooltipChangeEvent) => void;
101
+ };
102
+ "primitiv-tooltip-provider": Attributes<PrimitivTooltipProviderElement> & {
103
+ "delay-duration"?: number | string;
104
+ "skip-delay-duration"?: number | string;
105
+ };
106
+ "primitiv-tooltip-trigger": Attributes<PrimitivTooltipTriggerElement>;
107
+ "primitiv-tooltip-content": Attributes<PrimitivTooltipContentElement>;
108
+ "primitiv-tooltip-arrow": Attributes<PrimitivTooltipArrowElement>;
95
109
  }
96
110
  }
97
111
  export {};
@@ -19,7 +19,7 @@
19
19
  * JSR does not allow a published module to do.
20
20
  */
21
21
  import type { DefineComponent, EmitsOptions } from "vue";
22
- import type { PrimitivAccordionChangeEvent, PrimitivCollapsibleChangeEvent, PrimitivModalChangeEvent, PrimitivPopoverChangeEvent, PrimitivTabsChangeEvent } from "./events.js";
22
+ import type { PrimitivAccordionChangeEvent, PrimitivCollapsibleChangeEvent, PrimitivModalChangeEvent, PrimitivPopoverChangeEvent, PrimitivTabsChangeEvent, PrimitivTooltipChangeEvent } from "./events.js";
23
23
  /** A tag as Vue's template checker sees it: its props, and the events it emits. */
24
24
  type Tag<Props, Events extends EmitsOptions = Record<never, never>> = DefineComponent<Props, Record<never, never>, Record<never, never>, Record<never, never>, Record<never, never>, Record<never, never>, Record<never, never>, Events>;
25
25
  declare module "vue" {
@@ -97,6 +97,20 @@ declare module "vue" {
97
97
  }, {
98
98
  "primitiv-tabs-show": (event: CustomEvent) => void;
99
99
  }>;
100
+ "primitiv-tooltip": Tag<{
101
+ open?: boolean | "";
102
+ delayDuration?: number | string;
103
+ disableHoverableContent?: boolean | "";
104
+ }, {
105
+ "primitiv-tooltip-change": (event: PrimitivTooltipChangeEvent) => void;
106
+ }>;
107
+ "primitiv-tooltip-provider": Tag<{
108
+ delayDuration?: number | string;
109
+ skipDelayDuration?: number | string;
110
+ }>;
111
+ "primitiv-tooltip-trigger": Tag<Record<never, never>>;
112
+ "primitiv-tooltip-content": Tag<Record<never, never>>;
113
+ "primitiv-tooltip-arrow": Tag<Record<never, never>>;
100
114
  }
101
115
  }
102
116
  export {};
package/dist/index.d.ts CHANGED
@@ -8,3 +8,4 @@ export * from "./collapsible/index.js";
8
8
  export * from "./modal/index.js";
9
9
  export * from "./popover/index.js";
10
10
  export * from "./tabs/index.js";
11
+ export * from "./tooltip/index.js";
package/dist/index.js CHANGED
@@ -8,3 +8,4 @@ export * from "./collapsible/index.js";
8
8
  export * from "./modal/index.js";
9
9
  export * from "./popover/index.js";
10
10
  export * from "./tabs/index.js";
11
+ export * from "./tooltip/index.js";