monochrome 0.5.0 → 0.6.0

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
@@ -3,7 +3,7 @@
3
3
  Accessible UI component library. Best-in-class performance. HTML-first, React and Vue supported.
4
4
 
5
5
  <!-- badges -->
6
- ![gzip](https://img.shields.io/badge/gzip-2.3kB-brightgreen) ![tests](https://img.shields.io/badge/tests-389_passing-brightgreen) ![WCAG](https://img.shields.io/badge/WCAG_2.2-AA-blue) ![license](https://img.shields.io/badge/license-MIT-blue)
6
+ ![gzip](https://img.shields.io/badge/gzip-2.4kB-brightgreen) ![tests](https://img.shields.io/badge/tests-414_passing-brightgreen) ![WCAG](https://img.shields.io/badge/WCAG_2.2-AA-blue) ![license](https://img.shields.io/badge/license-MIT-blue)
7
7
  <!-- /badges -->
8
8
 
9
9
  ## Install
@@ -50,13 +50,13 @@ The Vue API is identical: `import { Accordion } from "monochrome/vue"`. Monochro
50
50
 
51
51
  ## Components
52
52
 
53
- Four interactive UI patterns in <!-- size -->2.3kB<!-- /size -->:
53
+ Four interactive UI patterns in <!-- size -->2.4kB<!-- /size -->:
54
54
 
55
55
  | Component | Description | Tests |
56
56
  | --- | --- | ---: |
57
57
  | **Accordion** | Grouped collapsible content sections | <!-- tests:accordion -->66<!-- /tests:accordion --> |
58
58
  | **Collapsible** | Show and hide content with a button | <!-- tests:collapsible -->42<!-- /tests:collapsible --> |
59
- | **Menu** | Dropdown menus, menubars, and submenus | <!-- tests:menu -->183<!-- /tests:menu --> |
59
+ | **Menu** | Dropdown menus, menubars, and submenus | <!-- tests:menu -->179<!-- /tests:menu --> |
60
60
  | **Tabs** | Switch between multiple content panels | <!-- tests:tabs -->70<!-- /tests:tabs --> |
61
61
 
62
62
  ## How it works
package/dist/index.d.ts CHANGED
@@ -9,8 +9,10 @@ declare enum Prefix {
9
9
  TriggerAccordion = "mct:a",
10
10
  TriggerCollapsible = "mct:c",
11
11
  TriggerMenu = "mct:m",
12
+ TriggerPopover = "mct:p",
12
13
  TriggerTabs = "mct:t",
13
14
  Content = "mcc:",
14
15
  ContentMenu = "mcc:m",
16
+ ContentPopover = "mcc:p",
15
17
  RootAccordion = "mcr:a"
16
18
  }
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- if(typeof document<"u"){let E=null,M=null,k=null,H=null,L=[],r=[],c=null,a=null,g=null,y=null,p=null,d=(e)=>e instanceof HTMLElement,u=(e,n)=>e instanceof HTMLButtonElement&&(!n||e.id.startsWith(n)),w=(e)=>d(e)&&e.role?.startsWith("menuitem")===!0&&e.ariaDisabled!=="true",T=(e)=>document.getElementById(e.getAttribute("aria-controls")||""),P=(e,n)=>{while(e){if(e.id.startsWith(n))return e;e=e.parentElement}return null},A=(e)=>{let n=(i)=>i?e(i.nextElementSibling||i.parentElement?.firstElementChild,n):null,t=(i)=>i?e(i.previousElementSibling||i.parentElement?.lastElementChild,t):null;return[n,t]},h=(e,n)=>{if(d(e)){let t=e.firstElementChild;if(k){if(d(t)){if(t===k){for(let i of L)i.ariaChecked="false";return t}if(t.role==="menuitemradio"){if(!H)t.ariaChecked="false";else L.push(t);return n(e)}}return H=!0,L=[],n(e)}if(w(t)&&(!M||t.textContent?.toLowerCase().startsWith(M)))return t.focus(),E=!0,t;else if(c!==e){if(!c)c=e;return n(e)}else c=null}return null},v=(e,n)=>{if(d(e)){if(c===e)return null;if(!c)c=e;let t=e.firstElementChild?.firstElementChild;if(u(t,"mct:a")){if(t.ariaDisabled==="true")return n(e);return E=!0,t.focus(),t}}return n(e)},R=(e,n)=>{if(u(e,"mct:t")){if(c===e)return null;if(!c)c=e;if(e.ariaDisabled==="true")return n(e);return E=!0,e.focus(),e}else return n(e)},[b,x]=A(h),[W,D]=A(v),[F,N]=A(R),C=(e)=>{let n=T(e);if(n){let t=e.ariaExpanded!=="true";e.ariaExpanded=t?"true":"false",n.ariaHidden=t?"false":"true",t?n.removeAttribute("hidden"):n.setAttribute("hidden","until-found")}},$=(e)=>{if(e.ariaDisabled==="true")return;if(e.ariaExpanded==="true")C(e);else{let n=P(e,"mcr:a");if(!n||n.getAttribute("data-mode")!=="single")C(e);else{let t=n.firstElementChild;while(t){let i=t.firstElementChild?.firstElementChild;if(d(i)&&(i===e||i.ariaExpanded==="true"))C(i);t=t.nextElementSibling}}}},S=(e)=>{if(e.ariaDisabled!=="true"&&e.ariaSelected!=="true"){let n=e.parentElement?.firstElementChild;while(d(n)){if(n===e||n.ariaSelected==="true"){let t=T(n);if(t){let i=n.ariaSelected!=="true";if(n.ariaSelected=i?"true":"false",n.tabIndex=i?0:-1,t.ariaHidden=i?"false":"true",t.hasAttribute("tabindex"))t.tabIndex=i?0:-1;i?t.removeAttribute("hidden"):t.setAttribute("hidden","until-found")}}n=n.nextElementSibling}}},f=(e,n=0)=>{if(e?.id.startsWith("mct:m")){let t=T(e);if(t)if(e.ariaExpanded==="true"){if(a)a.removeAttribute("data-safe");if(a=null,y=null,p=null,n!==3)e.focus();t.hidePopover(),e.ariaExpanded="false",t.ariaHidden="true"}else{r.push(e),t.showPopover(),e.ariaExpanded="true",t.ariaHidden="false";let i=e.getBoundingClientRect();if(t.style.setProperty("--top",`${i.top}px`),t.style.setProperty("--right",`${i.right}px`),t.style.setProperty("--bottom",`${i.bottom}px`),t.style.setProperty("--left",`${i.left}px`),r.length>1)t.dataset.placement=i.right+t.offsetWidth<=innerWidth?"right":"left";else t.dataset.placement=i.bottom+t.offsetHeight<=innerHeight?"bottom":"top";let s=e.parentElement;if(s)a=s,g=i,y=t,p=null;if(n===0)e.focus();else if(n===1)h(t.firstElementChild,b);else if(n===2)h(t.lastElementChild,x)}}},m=(e=0)=>{while(r[e])f(r.pop(),3)},B=(e)=>{if(e.role==="menuitemcheckbox")e.ariaChecked=e.ariaChecked==="true"?"false":"true";else if(e.role==="menuitemradio")k=e,H=null,L=[],b(e.parentElement),k=null,e.ariaChecked="true";else m()};addEventListener("click",(e)=>{E=null;let n=e.detail===0,t=d(e.target)?e.target:e.target instanceof Element?e.target.parentElement:null;if(t){let i=t;while(i){let s=i.id;if(s.startsWith("mct:")){if(s.startsWith("mct:m")){let l=n?1:3;if(P(i.parentElement,"mcc:m")){if(!r.includes(i))f(i,l)}else if(r[0]){let I=i!==r[0];if(m(),I)f(i,l)}else f(i,l)}else{if(r[0])m();if(s.startsWith("mct:a"))$(i);else if(s.startsWith("mct:c"))C(i);else if(s.startsWith("mct:t"))S(i)}break}else if(s.startsWith("mcc:m")&&r[0]){let l=t;while(l&&l!==i){if(w(l)&&!u(l,"mct:m")){B(l);break}l=l.parentElement}break}i=i.parentElement}if(!i&&r[0])m()}if(E)e.preventDefault()}),addEventListener("pointermove",(e)=>{if(e.pointerType==="touch")return;if(r[0]){if(r[1]&&a&&g&&y){if(e.clientX>=g.left&&e.clientX<=g.right&&e.clientY>=g.top&&e.clientY<=g.bottom){if(p=y.getBoundingClientRect(),a.style.setProperty("--left",`${p.left}px`),a.style.setProperty("--right",`${p.right}px`),a.style.setProperty("--top",`${p.top}px`),a.style.setProperty("--bottom",`${p.bottom}px`),a.style.setProperty("--x",`${e.clientX}px`),a.style.setProperty("--y",`${e.clientY}px`),!a.hasAttribute("data-safe"))a.setAttribute("data-safe","")}else if(a.hasAttribute("data-safe")&&p&&(e.target!==a||(p.left-g.right)*e.movementX<0))a.removeAttribute("data-safe")}let n=e.target;if(d(n)){let t=[],i=n,s=!1,l=!1;while(i){if(w(i))l=!0;if(!l&&i.id.startsWith("mcc:")){s=!0;break}let o=i.firstElementChild;if(u(o,"mct:m"))t.unshift(o);i=i.parentElement}if(!s&&t[0]){let o=0;while(r[o]&&r[o]===t[o])o++;if(o===0&&(t[0].role!=="menuitem"||t[0].parentElement?.parentElement!==r[0].parentElement?.parentElement))return;m(o),f(t[o],3)}}}}),addEventListener("keydown",(e)=>{E=null,M=null,c=null;let n=e.target;if(u(n,"mct:a")){let t=n.parentElement?.parentElement;if(t)switch(e.key){case"ArrowDown":W(t);break;case"ArrowUp":D(t);break;case"Home":{let i=t.parentElement;if(i)v(i.firstElementChild,W);break}case"End":{let i=t.parentElement;if(i)v(i.lastElementChild,D);break}}}else if(u(n,"mct:t")){let t=n.parentElement?.ariaOrientation==="vertical";switch(e.key){case"ArrowDown":if(t)F(n);break;case"ArrowUp":if(t)N(n);break;case"ArrowRight":if(!t)F(n);break;case"ArrowLeft":if(!t)N(n);break;case"Home":R(n.parentElement?.firstElementChild,F);break;case"End":R(n.parentElement?.lastElementChild,N);break}}else{if(u(n,"mct:m")){let t=P(n,"mcc:m")===null;switch(e.key){case"ArrowDown":if(t)if(n.ariaExpanded!=="true")f(n,1);else{let i=T(n);if(i)h(i.firstElementChild,b)}break;case"ArrowUp":if(t)if(n.ariaExpanded!=="true")f(n,2);else{let i=T(n);if(i)h(i.lastElementChild,x)}break;case"ArrowRight":if(!t)f(n,1);break}}if(!E&&d(n)&&n.role?.startsWith("menuitem")&&n.parentElement){let t=n.parentElement,i=r[0]?.parentElement||t,s=P(n.parentElement,"mcc:m");switch(e.key){case"Tab":if(r[0])r[0].focus();m();break;case"ArrowDown":if(s)b(t);break;case"ArrowUp":if(s)x(t);break;case"ArrowRight":{let l=b(i);if(l){let o=r[0];if(m(),o&&u(l,"mct:m"))f(l,3)}break}case"ArrowLeft":if(r[1])f(r.pop(),0);else{let l=x(i);if(l){let o=r[0];if(m(),o&&u(l,"mct:m"))f(l,3)}}break;case"Home":h(t.parentElement?.firstElementChild,b);break;case"End":h(t.parentElement?.lastElementChild,x);break;default:if(/^[a-zA-Z]$/.test(e.key))M=e.key.toLowerCase(),b(t);break}}}if(e.key==="Escape"&&r[0])f(r.pop(),0);if(E)e.preventDefault()}),addEventListener("scroll",(e)=>{if(r[0]&&(!d(e.target)||!e.target.id.startsWith("mcc:m")))m()},!0),addEventListener("resize",()=>{if(r[0])m()}),addEventListener("beforematch",(e)=>{if(d(e.target)){let n=e.target;while(n){let t=n.getAttribute("aria-labelledby");if(t){let i=document.getElementById(t);if(u(i,"mct:a")){if(i.ariaExpanded!=="true")$(i)}else if(u(i,"mct:c")){if(i.ariaExpanded!=="true")C(i)}else if(u(i,"mct:t"))S(i)}n=n.parentElement}}})}
1
+ if(typeof document<"u"){let g=null,k=null,L=null,w=null,H=[],i=[],p=null,s=null,T=null,v=null,E=null,a=null,u=(e)=>e instanceof HTMLElement,c=(e,r)=>e instanceof HTMLButtonElement&&(!r||e.id.startsWith(r)),A=(e)=>u(e)&&e.role?.startsWith("menuitem")===!0&&e.ariaDisabled!=="true",h=(e)=>document.getElementById(e.getAttribute("aria-controls")||""),P=(e,r)=>{while(e){if(e.id.startsWith(r))return e;e=e.parentElement}return null},R=(e)=>{let r=(n)=>n?e(n.nextElementSibling||n.parentElement?.firstElementChild,r):null,t=(n)=>n?e(n.previousElementSibling||n.parentElement?.lastElementChild,t):null;return[r,t]},x=(e,r)=>{if(u(e)){let t=e.firstElementChild;if(L){if(u(t)){if(t===L){for(let n of H)n.ariaChecked="false";return t}if(t.role==="menuitemradio"){if(!w)t.ariaChecked="false";else H.push(t);return r(e)}}return w=!0,H=[],r(e)}if(A(t)&&(!k||t.textContent?.toLowerCase().startsWith(k)))return t.focus(),g=!0,t;else if(p!==e){if(!p)p=e;return r(e)}else p=null}return null},F=(e,r)=>{if(u(e)){if(p===e)return null;if(!p)p=e;let t=e.firstElementChild?.firstElementChild;if(c(t,"mct:a")){if(t.ariaDisabled==="true")return r(e);return g=!0,t.focus(),t}}return r(e)},$=(e,r)=>{if(c(e,"mct:t")){if(p===e)return null;if(!p)p=e;if(e.ariaDisabled==="true")return r(e);return g=!0,e.focus(),e}else return r(e)},[y,C]=R(x),[D,B]=R(F),[N,W]=R($),M=(e)=>{let r=h(e);if(r){let t=e.ariaExpanded!=="true";e.ariaExpanded=t?"true":"false",r.ariaHidden=t?"false":"true",t?r.removeAttribute("hidden"):r.setAttribute("hidden","until-found")}},S=(e)=>{if(e.ariaDisabled==="true")return;if(e.ariaExpanded==="true")M(e);else{let r=P(e,"mcr:a");if(!r||r.getAttribute("data-mode")!=="single")M(e);else{let t=r.firstElementChild;while(t){let n=t.firstElementChild?.firstElementChild;if(u(n)&&(n===e||n.ariaExpanded==="true"))M(n);t=t.nextElementSibling}}}},I=(e)=>{if(e.ariaDisabled!=="true"&&e.ariaSelected!=="true"){let r=e.parentElement?.firstElementChild;while(u(r)){if(r===e||r.ariaSelected==="true"){let t=h(r);if(t){let n=r.ariaSelected!=="true";if(r.ariaSelected=n?"true":"false",r.tabIndex=n?0:-1,t.ariaHidden=n?"false":"true",t.hasAttribute("tabindex"))t.tabIndex=n?0:-1;n?t.removeAttribute("hidden"):t.setAttribute("hidden","until-found")}}r=r.nextElementSibling}}},d=(e,r=0)=>{if(e?.id.startsWith("mct:m")){let t=h(e);if(t)if(e.ariaExpanded==="true"){if(s)s.removeAttribute("data-safe");if(s=null,v=null,E=null,r!==3)e.focus();t.hidePopover(),e.ariaExpanded="false",t.ariaHidden="true"}else{i.push(e),t.showPopover(),e.ariaExpanded="true",t.ariaHidden="false";let n=e.getBoundingClientRect();t.style.setProperty("--top",`${n.top}px`),t.style.setProperty("--right",`${n.right}px`),t.style.setProperty("--bottom",`${n.bottom}px`),t.style.setProperty("--left",`${n.left}px`),t.style.setProperty("--pw",`${t.offsetWidth}px`),t.style.setProperty("--ph",`${t.offsetHeight}px`);let o=e.parentElement;if(o)s=o,T=n,v=t,E=null;if(r===0)e.focus();else if(r===1)x(t.firstElementChild,y);else if(r===2)x(t.lastElementChild,C)}}},m=(e=0)=>{while(i[e])d(i.pop(),3)},O=(e)=>{if(e.role==="menuitemcheckbox")e.ariaChecked=e.ariaChecked==="true"?"false":"true";else if(e.role==="menuitemradio")L=e,w=null,H=[],y(e.parentElement),L=null,e.ariaChecked="true";else m()},b=(e,r)=>{if(e.ariaExpanded==="true"===r)return;let t=h(e);if(t){if(r){if(a&&a!==e)b(a,!1);t.showPopover(),e.ariaExpanded="true",t.ariaHidden="false";let n=e.getBoundingClientRect();t.style.setProperty("--top",`${n.top}px`),t.style.setProperty("--right",`${n.right}px`),t.style.setProperty("--bottom",`${n.bottom}px`),t.style.setProperty("--left",`${n.left}px`),t.style.setProperty("--pw",`${t.offsetWidth}px`),t.style.setProperty("--ph",`${t.offsetHeight}px`),a=e}else if(t.hidePopover(),e.ariaExpanded="false",t.ariaHidden="true",a===e)a=null}};addEventListener("click",(e)=>{g=null;let r=e.detail===0,t=u(e.target)?e.target:e.target instanceof Element?e.target.parentElement:null;if(t){let n=t;while(n){let o=n.id;if(o.startsWith("mct:")){if(o.startsWith("mct:m")){if(a)b(a,!1);let l=r?1:3;if(P(n.parentElement,"mcc:m")){if(!i.includes(n))d(n,l)}else if(i[0]){let U=n!==i[0];if(m(),U)d(n,l)}else d(n,l)}else{if(i[0])m();if(o.startsWith("mct:a"))S(n);else if(o.startsWith("mct:c"))M(n);else if(o.startsWith("mct:t"))I(n);else if(o.startsWith("mct:p")&&n.ariaDisabled!=="true"){let l=n.ariaExpanded==="true";b(n,!l),l?n.focus():h(n)?.focus()}}break}else if(o.startsWith("mcc:m")&&i[0]){let l=t;while(l&&l!==n){if(A(l)&&!c(l,"mct:m")){O(l);break}l=l.parentElement}break}else if(o.startsWith("mcc:p"))break;n=n.parentElement}if(!n){if(i[0])m();if(a)b(a,!1)}}if(g)e.preventDefault()}),addEventListener("pointermove",(e)=>{if(e.pointerType==="touch")return;if(i[0]){if(i[1]&&s&&T&&v){if(e.clientX>=T.left&&e.clientX<=T.right&&e.clientY>=T.top&&e.clientY<=T.bottom){if(E=v.getBoundingClientRect(),s.style.setProperty("--left",`${E.left}px`),s.style.setProperty("--right",`${E.right}px`),s.style.setProperty("--top",`${E.top}px`),s.style.setProperty("--bottom",`${E.bottom}px`),s.style.setProperty("--x",`${e.clientX}px`),s.style.setProperty("--y",`${e.clientY}px`),!s.hasAttribute("data-safe"))s.setAttribute("data-safe","")}else if(s.hasAttribute("data-safe")&&E&&(e.target!==s||(E.left-T.right)*e.movementX<0))s.removeAttribute("data-safe")}let r=e.target;if(u(r)){let t=[],n=r,o=!1,l=!1;while(n){if(A(n))l=!0;if(!l&&n.id.startsWith("mcc:")){o=!0;break}let f=n.firstElementChild;if(c(f,"mct:m"))t.unshift(f);n=n.parentElement}if(!o&&t[0]){let f=0;while(i[f]&&i[f]===t[f])f++;if(f===0&&(t[0].role!=="menuitem"||t[0].parentElement?.parentElement!==i[0].parentElement?.parentElement))return;m(f),d(t[f],3)}}}}),addEventListener("keydown",(e)=>{g=null,k=null,p=null;let r=e.target;if(c(r,"mct:a")){let t=r.parentElement?.parentElement;if(t)switch(e.key){case"ArrowDown":D(t);break;case"ArrowUp":B(t);break;case"Home":{let n=t.parentElement;if(n)F(n.firstElementChild,D);break}case"End":{let n=t.parentElement;if(n)F(n.lastElementChild,B);break}}}else if(c(r,"mct:t")){let t=r.parentElement?.ariaOrientation==="vertical";switch(e.key){case"ArrowDown":if(t)N(r);break;case"ArrowUp":if(t)W(r);break;case"ArrowRight":if(!t)N(r);break;case"ArrowLeft":if(!t)W(r);break;case"Home":$(r.parentElement?.firstElementChild,N);break;case"End":$(r.parentElement?.lastElementChild,W);break}}else{if(c(r,"mct:m")){let t=P(r,"mcc:m")===null;switch(e.key){case"ArrowDown":if(t)if(r.ariaExpanded!=="true")d(r,1);else{let n=h(r);if(n)x(n.firstElementChild,y)}break;case"ArrowUp":if(t)if(r.ariaExpanded!=="true")d(r,2);else{let n=h(r);if(n)x(n.lastElementChild,C)}break;case"ArrowRight":if(!t)d(r,1);break}}if(!g&&u(r)&&r.role?.startsWith("menuitem")&&r.parentElement){let t=r.parentElement,n=i[0]?.parentElement||t,o=P(r.parentElement,"mcc:m");switch(e.key){case"Tab":if(i[0])i[0].focus();m();break;case"ArrowDown":if(o)y(t);break;case"ArrowUp":if(o)C(t);break;case"ArrowRight":{let l=y(n);if(l){let f=i[0];if(m(),f&&c(l,"mct:m"))d(l,3)}break}case"ArrowLeft":if(i[1])d(i.pop(),0);else{let l=C(n);if(l){let f=i[0];if(m(),f&&c(l,"mct:m"))d(l,3)}}break;case"Home":x(t.parentElement?.firstElementChild,y);break;case"End":x(t.parentElement?.lastElementChild,C);break;default:if(/^[a-zA-Z]$/.test(e.key))k=e.key.toLowerCase(),y(t);break}}}if(e.key==="Escape"){if(i[0])d(i.pop(),0);if(a){let t=a;b(t,!1),t.focus()}}if(g)e.preventDefault()}),addEventListener("scroll",(e)=>{if(i[0]&&(!u(e.target)||!e.target.id.startsWith("mcc:m")))m();if(a&&!(u(e.target)&&P(e.target,"mcc:p")))b(a,!1)},!0),addEventListener("resize",()=>{if(i[0])m();if(a)b(a,!1)}),addEventListener("focusout",(e)=>{if(a&&u(e.relatedTarget)&&a!==e.relatedTarget&&!h(a)?.contains(e.relatedTarget))b(a,!1)}),addEventListener("beforematch",(e)=>{if(u(e.target)){let r=e.target;while(r){let t=r.getAttribute("aria-labelledby");if(t){let n=document.getElementById(t);if(c(n,"mct:a")){if(n.ariaExpanded!=="true")S(n)}else if(c(n,"mct:c")){if(n.ariaExpanded!=="true")M(n)}else if(c(n,"mct:t"))I(n)}r=r.parentElement}}})}
@@ -1,4 +1,5 @@
1
1
  export { Accordion } from "./accordion.js";
2
2
  export { Collapsible } from "./collapsible.js";
3
3
  export { Menu } from "./menu.js";
4
+ export { Popover } from "./popover.js";
4
5
  export { Tabs } from "./tabs.js";
@@ -1,2 +1,2 @@
1
1
  "use client";
2
- import{createContext as w,createElement as c,useContext as M,useId as C}from"react";import{createElement as g}from"react";var m=(e,n)=>n?`${e}:${n}`:e,u=()=>g("script",{dangerouslySetInnerHTML:{__html:"document.currentScript.parentNode.setAttribute('hidden','until-found')"}});var P=w(null);function I(){let e=M(P);if(!e)throw Error("Accordion components must be used within Accordion.Item");return e}function T({children:e,type:n,...t}){let o=C();return c("div",{...t,"data-mode":n??"single",id:`mcr:accordion:${o}`},e)}function V({children:e,open:n,disabled:t,...o}){let a=C();return c(P.Provider,{value:{baseId:a,open:n??!1,disabled:t??!1}},c("div",o,e))}function A({children:e,as:n,...t}){return c(n??"h3",t,e)}function F({children:e,...n}){let t=I(),o=t.baseId,a=t.open;return c("button",{...n,type:"button",id:`mct:accordion:${o}`,"aria-expanded":a,"aria-controls":`mcc:accordion:${o}`,"aria-disabled":t.disabled||void 0},e)}function k({children:e,...n}){let t=I(),o=t.baseId,a=t.open;return c("div",{...n,id:`mcc:accordion:${o}`,role:"region","aria-labelledby":`mct:accordion:${o}`,"aria-hidden":!a,hidden:a?void 0:!0},!a&&c(u,null),e)}var O={Root:T,Item:V,Header:A,Trigger:F,Panel:k};import{createContext as z,createElement as b,useContext as H,useId as U}from"react";var R=z(null);function h(){let e=H(R);if(!e)throw Error("Collapsible components must be used within Collapsible.Root");return e}function L({children:e,open:n,...t}){let o=U();return b(R.Provider,{value:{baseId:o,open:n??!1}},b("div",t,e))}function S({children:e,...n}){let t=h(),o=t.baseId,a=t.open;return b("button",{...n,type:"button",id:`mct:collapsible:${o}`,"aria-expanded":a,"aria-controls":`mcc:collapsible:${o}`},e)}function j({children:e,...n}){let t=h(),o=t.baseId,a=t.open;return b("div",{...n,id:`mcc:collapsible:${o}`,"aria-labelledby":`mct:collapsible:${o}`,"aria-hidden":!a,hidden:a?void 0:!0},!a&&b(u,null),e)}var G={Root:L,Trigger:S,Panel:j};import{createContext as E,createElement as r,useContext as v,useId as B,useRef as q}from"react";var p=E(null),y=E(null);function f(){let e=v(p);if(!e)throw Error("Menu components must be used within Menu.Root");return e}function J(){let e=v(y);if(!e)throw Error("Menu components must be used within Menu.Popover");return e}function K({children:e,menubar:n,...t}){let o=B();return r(p.Provider,{value:{id:o,root:!0,menubar:n}},r("div",{...t,id:`mcr:menu:${o}`},e))}function N({children:e,...n}){let t=f();return r("button",{...n,type:"button",id:`mct:menu:${t.id}`,"aria-controls":`mcc:menu:${t.id}`,"aria-expanded":"false","aria-haspopup":"menu",tabIndex:t.root||t.first?0:-1,role:t.submenu?"menuitem":"button"},e)}function Q({children:e,...n}){let t=f(),o=q(!1);o.current=!1;let a=r(y.Provider,{value:{claimFirst:()=>{if(!o.current)return o.current=!0,!0;return!1}}},e);return t.menubar?r("ul",{...n,role:"menubar"},a):r("ul",{...n,role:"menu",id:`mcc:menu:${t.id}`,"aria-labelledby":`mct:menu:${t.id}`,"aria-hidden":"true",popover:"manual"},a)}function W({children:e,disabled:n,href:t,...o}){let a=n?r("span",{...o,role:"menuitem","aria-disabled":"true",tabIndex:-1},e):t?r("a",{...o,role:"menuitem",href:t,tabIndex:-1},e):r("button",{...o,type:"button",role:"menuitem",tabIndex:-1},e);return r("li",{role:"none"},a)}function X({children:e,checked:n,disabled:t,...o}){let a=t?r("span",{...o,role:"menuitemcheckbox","aria-checked":n??!1,"aria-disabled":"true",tabIndex:-1},e):r("button",{...o,type:"button",role:"menuitemcheckbox","aria-checked":n??!1,tabIndex:-1},e);return r("li",{role:"none"},a)}function Y({children:e,checked:n,disabled:t,...o}){let a=t?r("span",{...o,role:"menuitemradio","aria-checked":n??!1,"aria-disabled":"true",tabIndex:-1},e):r("button",{...o,type:"button",role:"menuitemradio","aria-checked":n??!1,tabIndex:-1},e);return r("li",{role:"none"},a)}function Z({children:e,...n}){return r("li",{...n,role:"presentation"},e)}function _(e){return r("li",{...e,role:"separator"})}function D({children:e,...n}){let t=f(),a=J().claimFirst(),i=B(),l=a&&t.menubar&&!t.submenu;return r(p.Provider,{value:{id:i,submenu:!0,first:l}},r("li",{...n,role:"none"},e))}var ee={Root:K,Trigger:N,Popover:Q,Item:W,CheckboxItem:X,RadioItem:Y,Label:Z,Separator:_,Group:D};import{createContext as te,createElement as d,useContext as ne,useId as oe}from"react";var $=te(null);function x(){let e=ne($);if(!e)throw Error("Tabs components must be used within Tabs.Root");return e}function ae({children:e,defaultValue:n,orientation:t,...o}){let a=oe(),i=t??"horizontal";return d($.Provider,{value:{baseId:a,selected:n,orientation:i}},d("div",{...o,"data-orientation":i,id:`mcr:tabs:${a}`},e))}function re({children:e,...n}){let t=x();return d("div",{...n,role:"tablist","aria-orientation":t.orientation},e)}function ie({children:e,value:n,selected:t,disabled:o,...a}){let i=x(),l=m(i.baseId,n),s=t??n===i.selected;return d("button",{...a,type:"button",role:"tab",id:`mct:tabs:${l}`,"aria-selected":s,"aria-controls":`mcc:tabs:${l}`,tabIndex:s?0:-1,"aria-disabled":o||void 0},e)}function le({children:e,value:n,selected:t,focusable:o=!0,...a}){let i=x(),l=m(i.baseId,n),s=t??n===i.selected;return d("div",{...a,role:"tabpanel",id:`mcc:tabs:${l}`,"aria-labelledby":`mct:tabs:${l}`,"aria-hidden":!s,hidden:s?void 0:!0,tabIndex:o?s?0:-1:void 0,"data-orientation":i.orientation},!s&&d(u,null),e)}var se={Root:ae,List:re,Tab:ie,Panel:le};export{se as Tabs,ee as Menu,G as Collapsible,O as Accordion};
2
+ import{createContext as V,createElement as c,useContext as A,useId as C}from"react";import{createElement as T}from"react";var b=(e,n)=>n?`${e}:${n}`:e,u=()=>T("script",{dangerouslySetInnerHTML:{__html:"document.currentScript.parentNode.setAttribute('hidden','until-found')"}});var v=V(null);function I(){let e=A(v);if(!e)throw Error("Accordion components must be used within Accordion.Item");return e}function F({children:e,type:n,...t}){let o=C();return c("div",{...t,"data-mode":n??"single",id:`mcr:accordion:${o}`},e)}function k({children:e,open:n,disabled:t,...o}){let r=C();return c(v.Provider,{value:{baseId:r,open:n??!1,disabled:t??!1}},c("div",o,e))}function O({children:e,as:n,...t}){return c(n??"h3",t,e)}function z({children:e,...n}){let t=I(),o=t.baseId,r=t.open;return c("button",{...n,type:"button",id:`mct:accordion:${o}`,"aria-expanded":r,"aria-controls":`mcc:accordion:${o}`,"aria-disabled":t.disabled||void 0},e)}function H({children:e,...n}){let t=I(),o=t.baseId,r=t.open;return c("div",{...n,id:`mcc:accordion:${o}`,role:"region","aria-labelledby":`mct:accordion:${o}`,"aria-hidden":!r,hidden:r?void 0:!0},!r&&c(u,null),e)}var U={Root:F,Item:k,Header:O,Trigger:z,Panel:H};import{createContext as j,createElement as p,useContext as L,useId as S}from"react";var R=j(null);function E(){let e=L(R);if(!e)throw Error("Collapsible components must be used within Collapsible.Root");return e}function G({children:e,open:n,...t}){let o=S();return p(R.Provider,{value:{baseId:o,open:n??!1}},p("div",t,e))}function q({children:e,...n}){let t=E(),o=t.baseId,r=t.open;return p("button",{...n,type:"button",id:`mct:collapsible:${o}`,"aria-expanded":r,"aria-controls":`mcc:collapsible:${o}`},e)}function J({children:e,...n}){let t=E(),o=t.baseId,r=t.open;return p("div",{...n,id:`mcc:collapsible:${o}`,"aria-labelledby":`mct:collapsible:${o}`,"aria-hidden":!r,hidden:r?void 0:!0},!r&&p(u,null),e)}var K={Root:G,Trigger:q,Panel:J};import{createContext as h,createElement as a,useContext as B,useId as y,useRef as N}from"react";var f=h(null),$=h(null);function x(){let e=B(f);if(!e)throw Error("Menu components must be used within Menu.Root");return e}function Q(){let e=B($);if(!e)throw Error("Menu components must be used within Menu.Popover");return e}function W({children:e,menubar:n,...t}){let o=y();return a(f.Provider,{value:{id:o,root:!0,menubar:n}},a("div",{...t,id:`mcr:menu:${o}`},e))}function X({children:e,...n}){let t=x();return a("button",{...n,type:"button",id:`mct:menu:${t.id}`,"aria-controls":`mcc:menu:${t.id}`,"aria-expanded":"false","aria-haspopup":"menu",tabIndex:t.root||t.first?0:-1,role:t.submenu?"menuitem":"button"},e)}function Y({children:e,...n}){let t=x(),o=N(!1);o.current=!1;let r=a($.Provider,{value:{claimFirst:()=>{if(!o.current)return o.current=!0,!0;return!1}}},e);return t.menubar?a("ul",{...n,role:"menubar"},r):a("ul",{...n,role:"menu",id:`mcc:menu:${t.id}`,"aria-labelledby":`mct:menu:${t.id}`,"aria-hidden":"true",popover:"manual"},r)}function Z({children:e,disabled:n,href:t,...o}){let r=n?a("span",{...o,role:"menuitem","aria-disabled":"true",tabIndex:-1},e):t?a("a",{...o,role:"menuitem",href:t,tabIndex:-1},e):a("button",{...o,type:"button",role:"menuitem",tabIndex:-1},e);return a("li",{role:"none"},r)}function _({children:e,checked:n,disabled:t,...o}){let r=t?a("span",{...o,role:"menuitemcheckbox","aria-checked":n??!1,"aria-disabled":"true",tabIndex:-1},e):a("button",{...o,type:"button",role:"menuitemcheckbox","aria-checked":n??!1,tabIndex:-1},e);return a("li",{role:"none"},r)}function D({children:e,checked:n,disabled:t,...o}){let r=t?a("span",{...o,role:"menuitemradio","aria-checked":n??!1,"aria-disabled":"true",tabIndex:-1},e):a("button",{...o,type:"button",role:"menuitemradio","aria-checked":n??!1,tabIndex:-1},e);return a("li",{role:"none"},r)}function ee({children:e,...n}){return a("li",{...n,role:"presentation"},e)}function te(e){return a("li",{...e,role:"separator"})}function ne({children:e,...n}){let t=x(),r=Q().claimFirst(),i=y(),s=r&&t.menubar&&!t.submenu;return a(f.Provider,{value:{id:i,submenu:!0,first:s}},a("li",{...n,role:"none"},e))}var oe={Root:W,Trigger:X,Popover:Y,Item:Z,CheckboxItem:_,RadioItem:D,Label:ee,Separator:te,Group:ne};import{createContext as re,createElement as m,useContext as ae,useId as ie}from"react";var g=re(null);function w(){let e=ae(g);if(!e)throw Error("Popover components must be used within Popover.Root");return e}function se({children:e,...n}){let t=ie();return m(g.Provider,{value:{id:t}},m("div",n,e))}function le({children:e,...n}){let t=w();return m("button",{...n,type:"button",id:`mct:popover:${t.id}`,"aria-controls":`mcc:popover:${t.id}`,"aria-expanded":"false"},e)}function ce({children:e,...n}){let t=w();return m("div",{...n,id:`mcc:popover:${t.id}`,"aria-labelledby":`mct:popover:${t.id}`,"aria-hidden":"true",popover:"manual",tabIndex:-1},e)}var ue={Root:se,Trigger:le,Content:ce};import{createContext as de,createElement as d,useContext as pe,useId as me}from"react";var M=de(null);function P(){let e=pe(M);if(!e)throw Error("Tabs components must be used within Tabs.Root");return e}function be({children:e,defaultValue:n,orientation:t,...o}){let r=me(),i=t??"horizontal";return d(M.Provider,{value:{baseId:r,selected:n,orientation:i}},d("div",{...o,"data-orientation":i,id:`mcr:tabs:${r}`},e))}function fe({children:e,...n}){let t=P();return d("div",{...n,role:"tablist","aria-orientation":t.orientation},e)}function xe({children:e,value:n,selected:t,disabled:o,...r}){let i=P(),s=b(i.baseId,n),l=t??n===i.selected;return d("button",{...r,type:"button",role:"tab",id:`mct:tabs:${s}`,"aria-selected":l,"aria-controls":`mcc:tabs:${s}`,tabIndex:l?0:-1,"aria-disabled":o||void 0},e)}function Pe({children:e,value:n,selected:t,focusable:o=!0,...r}){let i=P(),s=b(i.baseId,n),l=t??n===i.selected;return d("div",{...r,role:"tabpanel",id:`mcc:tabs:${s}`,"aria-labelledby":`mct:tabs:${s}`,"aria-hidden":!l,hidden:l?void 0:!0,tabIndex:o?l?0:-1:void 0,"data-orientation":i.orientation},!l&&d(u,null),e)}var Ce={Root:be,List:fe,Tab:xe,Panel:Pe};export{Ce as Tabs,ue as Popover,oe as Menu,K as Collapsible,U as Accordion};
@@ -0,0 +1,11 @@
1
+ import { type ReactElement } from "react";
2
+ import type { BaseProps } from "./shared.js";
3
+ declare function Root({ children, ...props }: BaseProps): ReactElement;
4
+ declare function Trigger({ children, ...props }: BaseProps): ReactElement;
5
+ declare function Content({ children, ...props }: BaseProps): ReactElement;
6
+ export declare const Popover: {
7
+ Root: typeof Root;
8
+ Trigger: typeof Trigger;
9
+ Content: typeof Content;
10
+ };
11
+ export {};
@@ -1,4 +1,5 @@
1
1
  export { Accordion } from "./accordion.js";
2
2
  export { Collapsible } from "./collapsible.js";
3
3
  export { Menu } from "./menu.js";
4
+ export { Popover } from "./popover.js";
4
5
  export { Tabs } from "./tabs.js";
package/dist/vue/index.js CHANGED
@@ -1 +1 @@
1
- import{defineComponent as W,h as O,provide as L,reactive as j,toRef as P,useId as F}from"vue";import{h as k,inject as K}from"vue";function z(y,w){let b=K(y);if(!b)throw Error(`${w} must be used within its parent provider`);return b}var B=(y,w)=>w?`${y}:${w}`:y,D=()=>k("script",{innerHTML:"document.currentScript.parentNode.setAttribute('hidden','until-found')"}),Y=Symbol("CollapsibleContext"),Z=Symbol("AccordionContext"),Q=Symbol("TabsContext"),J=Symbol("MenuContext"),G=Symbol("MenuPopupContext");var H=W({props:{type:{type:String,default:"single"}},setup(y,{slots:w}){let b=F();return()=>O("div",{"data-mode":y.type,id:`mcr:accordion:${b}`},w.default?.())}}),C=W({props:{open:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1}},setup(y,{slots:w}){let b=F();return L(Z,j({baseId:b,open:P(y,"open"),disabled:P(y,"disabled")})),()=>O("div",null,w.default?.())}}),q=W({props:{as:{type:String,default:"h3"}},setup(y,{slots:w}){return()=>O(y.as,null,w.default?.())}}),R=W({setup(y,{slots:w}){let b=z(Z,"Accordion.Trigger/Panel");return()=>O("button",{type:"button",id:`mct:accordion:${b.baseId}`,"aria-expanded":b.open,"aria-controls":`mcc:accordion:${b.baseId}`,"aria-disabled":b.disabled||void 0},w.default?.())}}),v=W({setup(y,{slots:w}){let b=z(Z,"Accordion.Trigger/Panel");return()=>O("div",{id:`mcc:accordion:${b.baseId}`,role:"region","aria-labelledby":`mct:accordion:${b.baseId}`,"aria-hidden":!b.open,hidden:b.open?void 0:!0},[!b.open&&O(D),w.default?.()])}}),m={Root:H,Item:C,Header:q,Trigger:R,Panel:v};import{defineComponent as S,h as _,provide as f,reactive as I,toRef as a,useId as u}from"vue";var n=S({props:{open:{type:Boolean,default:!1}},setup(y,{slots:w}){let b=u();return f(Y,I({baseId:b,open:a(y,"open")})),()=>_("div",null,w.default?.())}}),h=S({setup(y,{slots:w}){let b=z(Y,"Collapsible.Trigger/Panel");return()=>_("button",{type:"button",id:`mct:collapsible:${b.baseId}`,"aria-expanded":b.open,"aria-controls":`mcc:collapsible:${b.baseId}`},w.default?.())}}),i=S({setup(y,{slots:w}){let b=z(Y,"Collapsible.Trigger/Panel");return()=>_("div",{id:`mcc:collapsible:${b.baseId}`,"aria-labelledby":`mct:collapsible:${b.baseId}`,"aria-hidden":!b.open,hidden:b.open?void 0:!0},[!b.open&&_(D),w.default?.()])}}),c={Root:n,Trigger:h,Panel:i};import{defineComponent as N,h as $,onBeforeUpdate as l,provide as g,reactive as d,ref as r,toRef as t,useId as T}from"vue";var o=N({props:{menubar:Boolean},setup(y,{slots:w}){let b=T();return g(J,d({id:b,root:!0,menubar:t(y,"menubar")})),()=>$("div",{id:`mcr:menu:${b}`},w.default?.())}}),p=N({setup(y,{slots:w}){let b=z(J,"Menu.Trigger");return()=>$("button",{type:"button",id:`mct:menu:${b.id}`,"aria-controls":`mcc:menu:${b.id}`,"aria-expanded":"false","aria-haspopup":"menu",tabindex:b.root||b.first?0:-1,role:b.submenu?"menuitem":"button"},w.default?.())}}),e=N({setup(y,{slots:w}){let b=z(J,"Menu.Popover"),M=r(!1);return l(()=>{M.value=!1}),g(G,{claimFirst:()=>{if(!M.value)return M.value=!0,!0;return!1}}),()=>b.menubar?$("ul",{role:"menubar"},w.default?.()):$("ul",{role:"menu",id:`mcc:menu:${b.id}`,"aria-labelledby":`mct:menu:${b.id}`,"aria-hidden":"true",popover:"manual"},w.default?.())}}),s=N({inheritAttrs:!1,props:{disabled:Boolean,href:String},setup(y,{slots:w,attrs:b}){return()=>{let M=y.disabled?$("span",{...b,role:"menuitem","aria-disabled":"true",tabindex:-1},w.default?.()):y.href?$("a",{...b,role:"menuitem",href:y.href,tabindex:-1},w.default?.()):$("button",{...b,type:"button",role:"menuitem",tabindex:-1},w.default?.());return $("li",{role:"none"},[M])}}}),bb=N({inheritAttrs:!1,props:{checked:{type:Boolean,default:!1},disabled:Boolean},setup(y,{slots:w,attrs:b}){return()=>{let M=y.disabled?$("span",{...b,role:"menuitemcheckbox","aria-checked":y.checked,"aria-disabled":"true",tabindex:-1},w.default?.()):$("button",{...b,type:"button",role:"menuitemcheckbox","aria-checked":y.checked,tabindex:-1},w.default?.());return $("li",{role:"none"},[M])}}}),yb=N({inheritAttrs:!1,props:{checked:{type:Boolean,default:!1},disabled:Boolean},setup(y,{slots:w,attrs:b}){return()=>{let M=y.disabled?$("span",{...b,role:"menuitemradio","aria-checked":y.checked,"aria-disabled":"true",tabindex:-1},w.default?.()):$("button",{...b,type:"button",role:"menuitemradio","aria-checked":y.checked,tabindex:-1},w.default?.());return $("li",{role:"none"},[M])}}}),wb=N({setup(y,{slots:w}){return()=>$("li",{role:"presentation"},w.default?.())}}),$b=N({setup(){return()=>$("li",{role:"separator"})}}),Mb=N({setup(y,{slots:w}){let b=z(J,"Menu.Group"),E=z(G,"Menu.Group").claimFirst(),U=T(),V=E&&b.menubar&&!b.submenu;return g(J,{id:U,submenu:!0,first:V}),()=>$("li",{role:"none"},w.default?.())}}),zb={Root:o,Trigger:p,Popover:e,Item:s,CheckboxItem:bb,RadioItem:yb,Label:wb,Separator:$b,Group:Mb};import{computed as x,defineComponent as A,h as X,provide as Eb,reactive as Nb,toRef as Db,useId as Jb}from"vue";var Ob=A({props:{defaultValue:{type:String,required:!0},orientation:{type:String,default:"horizontal"}},setup(y,{slots:w}){let b=Jb();return Eb(Q,Nb({baseId:b,selected:y.defaultValue,orientation:Db(y,"orientation")})),()=>X("div",{"data-orientation":y.orientation,id:`mcr:tabs:${b}`},w.default?.())}}),Qb=A({setup(y,{slots:w}){let b=z(Q,"Tabs.List/Tab/Panel");return()=>X("div",{role:"tablist","aria-orientation":b.orientation},w.default?.())}}),Wb=A({props:{value:{type:String,required:!0},selected:{type:[Boolean,null],default:null},disabled:Boolean},setup(y,{slots:w}){let b=z(Q,"Tabs.List/Tab/Panel"),M=x(()=>B(b.baseId,y.value)),E=x(()=>y.selected!==null?y.selected:y.value===b.selected);return()=>X("button",{type:"button",role:"tab",id:`mct:tabs:${M.value}`,"aria-selected":E.value,"aria-controls":`mcc:tabs:${M.value}`,tabindex:E.value?0:-1,"aria-disabled":y.disabled||void 0},w.default?.())}}),Xb=A({props:{value:{type:String,required:!0},selected:{type:[Boolean,null],default:null},focusable:{type:Boolean,default:!0}},setup(y,{slots:w}){let b=z(Q,"Tabs.List/Tab/Panel"),M=x(()=>B(b.baseId,y.value)),E=x(()=>y.selected!==null?y.selected:y.value===b.selected);return()=>X("div",{role:"tabpanel",id:`mcc:tabs:${M.value}`,"aria-labelledby":`mct:tabs:${M.value}`,"aria-hidden":!E.value,hidden:E.value?void 0:!0,tabindex:y.focusable?E.value?0:-1:void 0,"data-orientation":b.orientation},[!E.value&&X(D),w.default?.()])}}),Yb={Root:Ob,List:Qb,Tab:Wb,Panel:Xb};export{Yb as Tabs,zb as Menu,c as Collapsible,m as Accordion};
1
+ import{defineComponent as P,h as J,provide as C,reactive as q,toRef as T,useId as V}from"vue";import{h as H,inject as j}from"vue";function $(y,w){let b=j(y);if(!b)throw Error(`${w} must be used within its parent provider`);return b}var B=(y,w)=>w?`${y}:${w}`:y,N=()=>H("script",{innerHTML:"document.currentScript.parentNode.setAttribute('hidden','until-found')"}),S=Symbol("CollapsibleContext"),W=Symbol("AccordionContext"),O=Symbol("TabsContext"),D=Symbol("MenuContext"),G=Symbol("MenuPopupContext"),X=Symbol("PopoverContext");var R=P({props:{type:{type:String,default:"single"}},setup(y,{slots:w}){let b=V();return()=>J("div",{"data-mode":y.type,id:`mcr:accordion:${b}`},w.default?.())}}),v=P({props:{open:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1}},setup(y,{slots:w}){let b=V();return C(W,q({baseId:b,open:T(y,"open"),disabled:T(y,"disabled")})),()=>J("div",null,w.default?.())}}),m=P({props:{as:{type:String,default:"h3"}},setup(y,{slots:w}){return()=>J(y.as,null,w.default?.())}}),f=P({setup(y,{slots:w}){let b=$(W,"Accordion.Trigger/Panel");return()=>J("button",{type:"button",id:`mct:accordion:${b.baseId}`,"aria-expanded":b.open,"aria-controls":`mcc:accordion:${b.baseId}`,"aria-disabled":b.disabled||void 0},w.default?.())}}),a=P({setup(y,{slots:w}){let b=$(W,"Accordion.Trigger/Panel");return()=>J("div",{id:`mcc:accordion:${b.baseId}`,role:"region","aria-labelledby":`mct:accordion:${b.baseId}`,"aria-hidden":!b.open,hidden:b.open?void 0:!0},[!b.open&&J(N),w.default?.()])}}),I={Root:R,Item:v,Header:m,Trigger:f,Panel:a};import{defineComponent as A,h as Y,provide as u,reactive as h,toRef as n,useId as c}from"vue";var i=A({props:{open:{type:Boolean,default:!1}},setup(y,{slots:w}){let b=c();return u(S,h({baseId:b,open:n(y,"open")})),()=>Y("div",null,w.default?.())}}),l=A({setup(y,{slots:w}){let b=$(S,"Collapsible.Trigger/Panel");return()=>Y("button",{type:"button",id:`mct:collapsible:${b.baseId}`,"aria-expanded":b.open,"aria-controls":`mcc:collapsible:${b.baseId}`},w.default?.())}}),d=A({setup(y,{slots:w}){let b=$(S,"Collapsible.Trigger/Panel");return()=>Y("div",{id:`mcc:collapsible:${b.baseId}`,"aria-labelledby":`mct:collapsible:${b.baseId}`,"aria-hidden":!b.open,hidden:b.open?void 0:!0},[!b.open&&Y(N),w.default?.()])}}),r={Root:i,Trigger:l,Panel:d};import{defineComponent as E,h as M,onBeforeUpdate as t,provide as F,reactive as p,ref as o,toRef as e,useId as k}from"vue";var s=E({props:{menubar:Boolean},setup(y,{slots:w}){let b=k();return F(D,p({id:b,root:!0,menubar:e(y,"menubar")})),()=>M("div",{id:`mcr:menu:${b}`},w.default?.())}}),bb=E({setup(y,{slots:w}){let b=$(D,"Menu.Trigger");return()=>M("button",{type:"button",id:`mct:menu:${b.id}`,"aria-controls":`mcc:menu:${b.id}`,"aria-expanded":"false","aria-haspopup":"menu",tabindex:b.root||b.first?0:-1,role:b.submenu?"menuitem":"button"},w.default?.())}}),yb=E({setup(y,{slots:w}){let b=$(D,"Menu.Popover"),x=o(!1);return t(()=>{x.value=!1}),F(G,{claimFirst:()=>{if(!x.value)return x.value=!0,!0;return!1}}),()=>b.menubar?M("ul",{role:"menubar"},w.default?.()):M("ul",{role:"menu",id:`mcc:menu:${b.id}`,"aria-labelledby":`mct:menu:${b.id}`,"aria-hidden":"true",popover:"manual"},w.default?.())}}),wb=E({inheritAttrs:!1,props:{disabled:Boolean,href:String},setup(y,{slots:w,attrs:b}){return()=>{let x=y.disabled?M("span",{...b,role:"menuitem","aria-disabled":"true",tabindex:-1},w.default?.()):y.href?M("a",{...b,role:"menuitem",href:y.href,tabindex:-1},w.default?.()):M("button",{...b,type:"button",role:"menuitem",tabindex:-1},w.default?.());return M("li",{role:"none"},[x])}}}),$b=E({inheritAttrs:!1,props:{checked:{type:Boolean,default:!1},disabled:Boolean},setup(y,{slots:w,attrs:b}){return()=>{let x=y.disabled?M("span",{...b,role:"menuitemcheckbox","aria-checked":y.checked,"aria-disabled":"true",tabindex:-1},w.default?.()):M("button",{...b,type:"button",role:"menuitemcheckbox","aria-checked":y.checked,tabindex:-1},w.default?.());return M("li",{role:"none"},[x])}}}),Mb=E({inheritAttrs:!1,props:{checked:{type:Boolean,default:!1},disabled:Boolean},setup(y,{slots:w,attrs:b}){return()=>{let x=y.disabled?M("span",{...b,role:"menuitemradio","aria-checked":y.checked,"aria-disabled":"true",tabindex:-1},w.default?.()):M("button",{...b,type:"button",role:"menuitemradio","aria-checked":y.checked,tabindex:-1},w.default?.());return M("li",{role:"none"},[x])}}}),xb=E({setup(y,{slots:w}){return()=>M("li",{role:"presentation"},w.default?.())}}),zb=E({setup(){return()=>M("li",{role:"separator"})}}),Eb=E({setup(y,{slots:w}){let b=$(D,"Menu.Group"),z=$(G,"Menu.Group").claimFirst(),K=k(),L=z&&b.menubar&&!b.submenu;return F(D,{id:K,submenu:!0,first:L}),()=>M("li",{role:"none"},w.default?.())}}),Nb={Root:s,Trigger:bb,Popover:yb,Item:wb,CheckboxItem:$b,RadioItem:Mb,Label:xb,Separator:zb,Group:Eb};import{defineComponent as U,h as g,provide as Db,useId as Jb}from"vue";var Ob=U({setup(y,{slots:w}){let b=Jb();return Db(X,{id:b}),()=>g("div",null,w.default?.())}}),Pb=U({setup(y,{slots:w}){let b=$(X,"Popover.Trigger");return()=>g("button",{type:"button",id:`mct:popover:${b.id}`,"aria-controls":`mcc:popover:${b.id}`,"aria-expanded":"false"},w.default?.())}}),Qb=U({setup(y,{slots:w}){let b=$(X,"Popover.Content");return()=>g("div",{id:`mcc:popover:${b.id}`,"aria-labelledby":`mct:popover:${b.id}`,"aria-hidden":"true",popover:"manual",tabindex:-1},w.default?.())}}),Sb={Root:Ob,Trigger:Pb,Content:Qb};import{computed as Z,defineComponent as _,h as Q,provide as Wb,reactive as Xb,toRef as Yb,useId as Zb}from"vue";var _b=_({props:{defaultValue:{type:String,required:!0},orientation:{type:String,default:"horizontal"}},setup(y,{slots:w}){let b=Zb();return Wb(O,Xb({baseId:b,selected:y.defaultValue,orientation:Yb(y,"orientation")})),()=>Q("div",{"data-orientation":y.orientation,id:`mcr:tabs:${b}`},w.default?.())}}),Bb=_({setup(y,{slots:w}){let b=$(O,"Tabs.List/Tab/Panel");return()=>Q("div",{role:"tablist","aria-orientation":b.orientation},w.default?.())}}),Gb=_({props:{value:{type:String,required:!0},selected:{type:[Boolean,null],default:null},disabled:Boolean},setup(y,{slots:w}){let b=$(O,"Tabs.List/Tab/Panel"),x=Z(()=>B(b.baseId,y.value)),z=Z(()=>y.selected!==null?y.selected:y.value===b.selected);return()=>Q("button",{type:"button",role:"tab",id:`mct:tabs:${x.value}`,"aria-selected":z.value,"aria-controls":`mcc:tabs:${x.value}`,tabindex:z.value?0:-1,"aria-disabled":y.disabled||void 0},w.default?.())}}),Ab=_({props:{value:{type:String,required:!0},selected:{type:[Boolean,null],default:null},focusable:{type:Boolean,default:!0}},setup(y,{slots:w}){let b=$(O,"Tabs.List/Tab/Panel"),x=Z(()=>B(b.baseId,y.value)),z=Z(()=>y.selected!==null?y.selected:y.value===b.selected);return()=>Q("div",{role:"tabpanel",id:`mcc:tabs:${x.value}`,"aria-labelledby":`mct:tabs:${x.value}`,"aria-hidden":!z.value,hidden:z.value?void 0:!0,tabindex:y.focusable?z.value?0:-1:void 0,"data-orientation":b.orientation},[!z.value&&Q(N),w.default?.()])}}),Fb={Root:_b,List:Bb,Tab:Gb,Panel:Ab};export{Fb as Tabs,Sb as Popover,Nb as Menu,r as Collapsible,I as Accordion};
@@ -0,0 +1,11 @@
1
+ export declare const Popover: {
2
+ Root: import("vue").DefineComponent<{}, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
3
+ [key: string]: any;
4
+ }>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
5
+ Trigger: import("vue").DefineComponent<{}, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
6
+ [key: string]: any;
7
+ }>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
8
+ Content: import("vue").DefineComponent<{}, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
9
+ [key: string]: any;
10
+ }>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
11
+ };
@@ -33,3 +33,7 @@ export type MenuPopupContext = {
33
33
  claimFirst: () => boolean;
34
34
  };
35
35
  export declare const MenuPopupKey: InjectionKey<MenuPopupContext>;
36
+ export type PopoverContext = {
37
+ id: string;
38
+ };
39
+ export declare const PopoverKey: InjectionKey<PopoverContext>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "monochrome",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "description": "Accessible UI component library. Best-in-class performance. HTML-first, React and Vue supported.",
5
5
  "author": "Colin van Eenige",
6
6
  "license": "MIT",
@@ -96,15 +96,16 @@
96
96
  "vue": "3.5.29"
97
97
  },
98
98
  "versionMeta": {
99
- "gzipSize": 2305,
99
+ "gzipSize": 2436,
100
100
  "routerGzipSize": 1052,
101
101
  "tests": {
102
- "total": 389,
102
+ "total": 414,
103
103
  "collapsible": 42,
104
104
  "router": 28,
105
105
  "accordion": 66,
106
- "menu": 183,
107
- "tabs": 70
106
+ "menu": 179,
107
+ "tabs": 70,
108
+ "popover": 29
108
109
  }
109
110
  }
110
111
  }