2 lines
5.5 KiB
JavaScript
2 lines
5.5 KiB
JavaScript
"use client";import{useFocusRing as q}from"@react-aria/focus";import{useHover as z}from"@react-aria/interactions";import y,{Fragment as Q,createContext as R,useContext as I,useEffect as N,useMemo as Y,useReducer as Z,useRef as k,useState as ee}from"react";import{useActivePress as te}from'../../hooks/use-active-press.js';import{useEvent as P}from'../../hooks/use-event.js';import{useId as w}from'../../hooks/use-id.js';import{useResolveButtonType as ne}from'../../hooks/use-resolve-button-type.js';import{useSlot as x}from'../../hooks/use-slot.js';import{optionalRef as oe,useSyncRefs as L}from'../../hooks/use-sync-refs.js';import{transitionDataAttributes as le,useTransition as re}from'../../hooks/use-transition.js';import{CloseProvider as se}from'../../internal/close-provider.js';import{OpenClosedProvider as ue,ResetOpenClosedProvider as ie,State as b,useOpenClosed as ae}from'../../internal/open-closed.js';import{isDisabledReactIssue7711 as pe}from'../../utils/bugs.js';import*as K from'../../utils/dom.js';import{match as B}from'../../utils/match.js';import{getOwnerDocument as ce}from'../../utils/owner.js';import{RenderFeatures as W,forwardRefWithAs as O,isFragment as de,mergeProps as j,useRender as v}from'../../utils/render.js';import{startTransition as Te}from'../../utils/start-transition.js';import{Keys as A}from'../keyboard.js';var me=(l=>(l[l.Open=0]="Open",l[l.Closed=1]="Closed",l))(me||{}),fe=(n=>(n[n.ToggleDisclosure=0]="ToggleDisclosure",n[n.CloseDisclosure=1]="CloseDisclosure",n[n.SetButtonId=2]="SetButtonId",n[n.SetPanelId=3]="SetPanelId",n[n.SetButtonElement=4]="SetButtonElement",n[n.SetPanelElement=5]="SetPanelElement",n))(fe||{});let De={[0]:e=>({...e,disclosureState:B(e.disclosureState,{[0]:1,[1]:0})}),[1]:e=>e.disclosureState===1?e:{...e,disclosureState:1},[2](e,t){return e.buttonId===t.buttonId?e:{...e,buttonId:t.buttonId}},[3](e,t){return e.panelId===t.panelId?e:{...e,panelId:t.panelId}},[4](e,t){return e.buttonElement===t.element?e:{...e,buttonElement:t.element}},[5](e,t){return e.panelElement===t.element?e:{...e,panelElement:t.element}}},_=R(null);_.displayName="DisclosureContext";function M(e){let t=I(_);if(t===null){let l=new Error(`<${e} /> is missing a parent <Disclosure /> component.`);throw Error.captureStackTrace&&Error.captureStackTrace(l,M),l}return t}let F=R(null);F.displayName="DisclosureAPIContext";function V(e){let t=I(F);if(t===null){let l=new Error(`<${e} /> is missing a parent <Disclosure /> component.`);throw Error.captureStackTrace&&Error.captureStackTrace(l,V),l}return t}let H=R(null);H.displayName="DisclosurePanelContext";function ye(){return I(H)}function Pe(e,t){return B(t.type,De,e,t)}let Ee=Q;function Se(e,t){let{defaultOpen:l=!1,...p}=e,a=k(null),c=L(t,oe(u=>{a.current=u},e.as===void 0||de(e.as))),n=Z(Pe,{disclosureState:l?0:1,buttonElement:null,panelElement:null,buttonId:null,panelId:null}),[{disclosureState:o,buttonId:r},f]=n,s=P(u=>{f({type:1});let m=ce(a.current);if(!m||!r)return;let d=(()=>u?K.isHTMLorSVGElement(u)?u:"current"in u&&K.isHTMLorSVGElement(u.current)?u.current:m.getElementById(r):m.getElementById(r))();d==null||d.focus()}),E=Y(()=>({close:s}),[s]),T=x({open:o===0,close:s}),D={ref:c},S=v();return y.createElement(_.Provider,{value:n},y.createElement(F.Provider,{value:E},y.createElement(se,{value:s},y.createElement(ue,{value:B(o,{[0]:b.Open,[1]:b.Closed})},S({ourProps:D,theirProps:p,slot:T,defaultTag:Ee,name:"Disclosure"})))))}let ge="button";function Ae(e,t){let l=w(),{id:p=`headlessui-disclosure-button-${l}`,disabled:a=!1,autoFocus:c=!1,...n}=e,[o,r]=M("Disclosure.Button"),f=ye(),s=f===null?!1:f===o.panelId,E=k(null),T=L(E,t,P(i=>{if(!s)return r({type:4,element:i})}));N(()=>{if(!s)return r({type:2,buttonId:p}),()=>{r({type:2,buttonId:null})}},[p,r,s]);let D=P(i=>{var g;if(s){if(o.disclosureState===1)return;switch(i.key){case A.Space:case A.Enter:i.preventDefault(),i.stopPropagation(),r({type:0}),(g=o.buttonElement)==null||g.focus();break}}else switch(i.key){case A.Space:case A.Enter:i.preventDefault(),i.stopPropagation(),r({type:0});break}}),S=P(i=>{switch(i.key){case A.Space:i.preventDefault();break}}),u=P(i=>{var g;pe(i.currentTarget)||a||(s?(r({type:0}),(g=o.buttonElement)==null||g.focus()):r({type:0}))}),{isFocusVisible:m,focusProps:d}=q({autoFocus:c}),{isHovered:C,hoverProps:h}=z({isDisabled:a}),{pressed:$,pressProps:U}=te({disabled:a}),J=x({open:o.disclosureState===0,hover:C,active:$,disabled:a,focus:m,autofocus:c}),G=ne(e,o.buttonElement),X=s?j({ref:T,type:G,disabled:a||void 0,autoFocus:c,onKeyDown:D,onClick:u},d,h,U):j({ref:T,id:p,type:G,"aria-expanded":o.disclosureState===0,"aria-controls":o.panelElement?o.panelId:void 0,disabled:a||void 0,autoFocus:c,onKeyDown:D,onKeyUp:S,onClick:u},d,h,U);return v()({ourProps:X,theirProps:n,slot:J,defaultTag:ge,name:"Disclosure.Button"})}let be="div",Ce=W.RenderStrategy|W.Static;function Re(e,t){let l=w(),{id:p=`headlessui-disclosure-panel-${l}`,transition:a=!1,...c}=e,[n,o]=M("Disclosure.Panel"),{close:r}=V("Disclosure.Panel"),[f,s]=ee(null),E=L(t,P(C=>{Te(()=>o({type:5,element:C}))}),s);N(()=>(o({type:3,panelId:p}),()=>{o({type:3,panelId:null})}),[p,o]);let T=ae(),[D,S]=re(a,f,T!==null?(T&b.Open)===b.Open:n.disclosureState===0),u=x({open:n.disclosureState===0,close:r}),m={ref:E,id:p,...le(S)},d=v();return y.createElement(ie,null,y.createElement(H.Provider,{value:n.panelId},d({ourProps:m,theirProps:c,slot:u,defaultTag:be,features:Ce,visible:D,name:"Disclosure.Panel"})))}let Ie=O(Se),xe=O(Ae),Le=O(Re),Xe=Object.assign(Ie,{Button:xe,Panel:Le});export{Xe as Disclosure,xe as DisclosureButton,Le as DisclosurePanel};
|