@aiquants/menu-bar 1.17.9 → 1.18.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/dist/MenuBar.d.ts +27 -22
- package/dist/__tests__/pinEvent.test.d.ts +1 -0
- package/dist/contents/MenuContent.d.ts +0 -9
- package/dist/events/pinEvent.d.ts +44 -0
- package/dist/hooks/useMenuPinState.d.ts +21 -0
- package/dist/index.d.ts +19 -4
- package/dist/index.es.js +530 -405
- package/dist/index.umd.js +2 -2
- package/dist/styles/menu-bar.css +1 -1
- package/dist/styles/menu-bar.standalone.css +1 -1
- package/dist/types.d.ts +20 -0
- package/package.json +1 -1
- package/src/MenuBar.tsx +101 -55
- package/src/__tests__/pinEvent.test.tsx +68 -0
- package/src/components/SessionInfo.tsx +39 -23
- package/src/contents/MenuContent.tsx +12 -19
- package/src/contents/MenuList.tsx +6 -6
- package/src/elements/MenuSwitch.tsx +1 -1
- package/src/events/pinEvent.ts +129 -0
- package/src/hooks/useMenuPinState.ts +58 -0
- package/src/index.ts +27 -4
- package/src/styles/menu-bar.css +22 -29
- package/src/types.ts +23 -0
package/dist/index.umd.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
(function(
|
|
1
|
+
(function(N,a){typeof exports=="object"&&typeof module<"u"?a(exports,require("react"),require("react-router-dom")):typeof define=="function"&&define.amd?define(["exports","react","react-router-dom"],a):(N=typeof globalThis<"u"?globalThis:N||self,a(N["@aiquants/menu-bar"]={},N.React,N.ReactRouterDOM))})(this,(function(N,a,Q){"use strict";var U={exports:{}},D={};var oe;function ge(){if(oe)return D;oe=1;var n=Symbol.for("react.transitional.element"),t=Symbol.for("react.fragment");function s(o,c,l){var u=null;if(l!==void 0&&(u=""+l),c.key!==void 0&&(u=""+c.key),"key"in c){l={};for(var m in c)m!=="key"&&(l[m]=c[m])}else l=c;return c=l.ref,{$$typeof:n,type:o,key:u,ref:c!==void 0?c:null,props:l}}return D.Fragment=t,D.jsx=s,D.jsxs=s,D}var Y={};var le;function ve(){return le||(le=1,process.env.NODE_ENV!=="production"&&(function(){function n(e){if(e==null)return null;if(typeof e=="function")return e.$$typeof===ne?null:e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case p:return"Fragment";case j:return"Profiler";case R:return"StrictMode";case H:return"Suspense";case ee:return"SuspenseList";case W:return"Activity"}if(typeof e=="object")switch(typeof e.tag=="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),e.$$typeof){case i:return"Portal";case I:return e.displayName||"Context";case _:return(e._context.displayName||"Context")+".Consumer";case L:var d=e.render;return e=e.displayName,e||(e=d.displayName||d.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case te:return d=e.displayName||null,d!==null?d:n(e.type)||"Memo";case V:d=e._payload,e=e._init;try{return n(e(d))}catch{}}return null}function t(e){return""+e}function s(e){try{t(e);var d=!1}catch{d=!0}if(d){d=console;var x=d.error,y=typeof Symbol=="function"&&Symbol.toStringTag&&e[Symbol.toStringTag]||e.constructor.name||"Object";return x.call(d,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",y),t(e)}}function o(e){if(e===p)return"<>";if(typeof e=="object"&&e!==null&&e.$$typeof===V)return"<...>";try{var d=n(e);return d?"<"+d+">":"<...>"}catch{return"<...>"}}function c(){var e=T.A;return e===null?null:e.getOwner()}function l(){return Error("react-stack-top-frame")}function u(e){if(Z.call(e,"key")){var d=Object.getOwnPropertyDescriptor(e,"key").get;if(d&&d.isReactWarning)return!1}return e.key!==void 0}function m(e,d){function x(){F||(F=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",d))}x.isReactWarning=!0,Object.defineProperty(e,"key",{get:x,configurable:!0})}function b(){var e=n(this.type);return k[e]||(k[e]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),e=this.props.ref,e!==void 0?e:null}function h(e,d,x,y,B,se){var g=x.ref;return e={$$typeof:P,type:e,key:d,props:x,_owner:y},(g!==void 0?g:null)!==null?Object.defineProperty(e,"ref",{enumerable:!1,get:b}):Object.defineProperty(e,"ref",{enumerable:!1,value:null}),e._store={},Object.defineProperty(e._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(e,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(e,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:B}),Object.defineProperty(e,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:se}),Object.freeze&&(Object.freeze(e.props),Object.freeze(e)),e}function f(e,d,x,y,B,se){var g=d.children;if(g!==void 0)if(y)if(re(g)){for(y=0;y<g.length;y++)w(g[y]);Object.freeze&&Object.freeze(g)}else console.error("React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.");else w(g);if(Z.call(d,"key")){g=n(e);var z=Object.keys(d).filter(function(Be){return Be!=="key"});y=0<z.length?"{key: someKey, "+z.join(": ..., ")+": ...}":"{key: someKey}",J[g+y]||(z=0<z.length?"{"+z.join(": ..., ")+": ...}":"{}",console.error(`A props object containing a "key" prop is being spread into JSX:
|
|
2
2
|
let props = %s;
|
|
3
3
|
<%s {...props} />
|
|
4
4
|
React keys must be passed directly to JSX without using spread:
|
|
5
5
|
let props = %s;
|
|
6
|
-
<%s key={someKey} {...props} />`,v,g,O,g),he[g+v]=!0)}if(g=null,b!==void 0&&(o(b),g=""+b),d(c)&&(o(c.key),g=""+c.key),"key"in c){b={};for(var B in c)B!=="key"&&(b[B]=c[B])}else b=c;return g&&p(b,typeof e=="function"?e.displayName||e.name||"Unknown":e),f(e,g,b,u(),z,q)}function k(e){j(e)?e._store&&(e._store.validated=1):typeof e=="object"&&e!==null&&e.$$typeof===T&&(e._payload.status==="fulfilled"?j(e._payload.value)&&e._payload.value._store&&(e._payload.value._store.validated=1):e._store&&(e._store.validated=1))}function j(e){return typeof e=="object"&&e!==null&&e.$$typeof===S}var y=s,S=Symbol.for("react.transitional.element"),a=Symbol.for("react.portal"),h=Symbol.for("react.fragment"),E=Symbol.for("react.strict_mode"),_=Symbol.for("react.profiler"),V=Symbol.for("react.consumer"),H=Symbol.for("react.context"),W=Symbol.for("react.forward_ref"),P=Symbol.for("react.suspense"),U=Symbol.for("react.suspense_list"),Z=Symbol.for("react.memo"),T=Symbol.for("react.lazy"),D=Symbol.for("react.activity"),w=Symbol.for("react.client.reference"),N=y.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,M=Object.prototype.hasOwnProperty,J=Array.isArray,G=console.createTask?console.createTask:function(){return null};y={react_stack_bottom_frame:function(e){return e()}};var ue,de={},fe=y.react_stack_bottom_frame.bind(y,i)(),me=G(l(i)),he={};I.Fragment=h,I.jsx=function(e,c,b){var v=1e4>N.recentlyCreatedOwnerStacks++;return m(e,c,b,!1,v?Error("react-stack-top-frame"):fe,v?G(l(e)):me)},I.jsxs=function(e,c,b){var v=1e4>N.recentlyCreatedOwnerStacks++;return m(e,c,b,!0,v?Error("react-stack-top-frame"):fe,v?G(l(e)):me)}})()),I}var K;function xe(){return K||(K=1,process.env.NODE_ENV==="production"?L.exports=pe():L.exports=be()),L.exports}var t=xe();const ye="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iI2NiZDVlMSI+PHBhdGggZD0iTTEyIDEyYzIuMjEgMCA0LTEuNzkgNC00cy0xLjc5LTQtNC00LTQgMS43OS00IDQgMS43OSA0IDQgNHptMCAyYy0yLjY3IDAtOCAxLjM0LTggNHYyaDE2di0yYzAtMi42Ni01LjMzLTQtOC00eiIvPjwvc3ZnPg==",$=({to:n,className:r,children:o})=>t.jsx("a",{href:n,className:r,children:o}),ve=n=>{const{user:r,LinkComponent:o=$}=n;return t.jsx("div",{className:"max-h-20 max-w-52",children:t.jsx("div",{className:"flex grow flex-col",children:r?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"flex flex-row",children:[t.jsx("div",{className:"aiquants-session-photo m-1 h-14 w-14 p-0.5",children:t.jsx("img",{className:"object-contain",src:r.photo||ye,"aria-label":"profile photo"})}),t.jsxs("div",{className:"mx-1 flex flex-col",children:[t.jsx(o,{className:"aiquants-session-link my-1 rounded-lg px-2 text-center text-xs",to:"/",children:"プロフィールを編集"}),t.jsx(o,{className:"aiquants-session-link rounded-lg px-2 text-center text-xs",to:"/",children:"プロフィール"}),t.jsx(o,{className:"aiquants-session-link my-1 rounded-lg px-2 text-center text-xs",to:"https://myaccount.google.com/",children:"Google Account"})]})]}),t.jsx("div",{className:"aiquants-session-info mb-1 min-h-[1em] w-full rounded-r-lg px-2 py-0.5 text-xs",children:r.displayName})]}):t.jsx("div",{className:"aiquants-session-info mb-1 min-h-[1em] w-9/12 rounded-r-lg py-0.5 pl-1 text-xs",children:"ログインはこちら"})})})};const ge=n=>n.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),ke=n=>n.replace(/^([A-Z])|[\s-_]+(\w)/g,(r,o,l)=>l?l.toUpperCase():o.toLowerCase()),ee=n=>{const r=ke(n);return r.charAt(0).toUpperCase()+r.slice(1)},te=(...n)=>n.filter((r,o,l)=>!!r&&r.trim()!==""&&l.indexOf(r)===o).join(" ").trim(),we=n=>{for(const r in n)if(r.startsWith("aria-")||r==="role"||r==="title")return!0};var je={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};const _e=s.forwardRef(({color:n="currentColor",size:r=24,strokeWidth:o=2,absoluteStrokeWidth:l,className:u="",children:i,iconNode:d,...p},x)=>s.createElement("svg",{ref:x,...je,width:r,height:r,stroke:n,strokeWidth:l?Number(o)*24/Number(r):o,className:te("lucide",u),...!i&&!we(p)&&{"aria-hidden":"true"},...p},[...d.map(([f,m])=>s.createElement(f,m)),...Array.isArray(i)?i:[i]]));const R=(n,r)=>{const o=s.forwardRef(({className:l,...u},i)=>s.createElement(_e,{ref:i,iconNode:r,className:te(`lucide-${ge(ee(n))}`,`lucide-${n}`,l),...u}));return o.displayName=ee(n),o};const ne=R("pin",[["path",{d:"M12 17v5",key:"bb1du9"}],["path",{d:"M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z",key:"1nkz8b"}]]);const re=R("pin-off",[["path",{d:"M12 17v5",key:"bb1du9"}],["path",{d:"M15 9.34V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H7.89",key:"znwnzq"}],["path",{d:"m2 2 20 20",key:"1ooewy"}],["path",{d:"M9 9v1.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h11",key:"c9qhm2"}]]);const Ne=R("chart-no-axes-column-increasing",[["path",{d:"M5 21v-6",key:"1hz6c0"}],["path",{d:"M12 21V9",key:"uvy0l4"}],["path",{d:"M19 21V3",key:"11j9sm"}]]);const Ee=R("download",[["path",{d:"M12 15V3",key:"m9g1x1"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["path",{d:"m7 10 5 5 5-5",key:"brsn70"}]]);const se=R("file-text",[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",key:"1oefj6"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5",key:"wfsgrz"}],["path",{d:"M10 9H8",key:"b1mrlr"}],["path",{d:"M16 13H8",key:"t4e002"}],["path",{d:"M16 17H8",key:"z1uh3a"}]]);const Ce=R("link",[["path",{d:"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71",key:"1cjeqo"}],["path",{d:"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71",key:"19qd67"}]]);const Se=R("lock",[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]]);const Re=R("table",[["path",{d:"M12 3v18",key:"108xh3"}],["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M3 9h18",key:"1pudct"}],["path",{d:"M3 15h18",key:"5xshup"}]]),Te=typeof window<"u"?s.useLayoutEffect:s.useEffect,oe="aiquants-menu-scroll",ae=new RegExp(/(^https?:\/\/)|(\.(html|htm)?$)/),Me={report:se,slip:se,table:Re,chart:Ne,download:Ee,lock:Se,href:Ce},Pe=({mark:n,children:r})=>{const o=n?Me[n]:void 0;return o?t.jsxs("div",{className:"flex flex-nowrap items-center",children:[t.jsx(o,{className:"h-4 w-4"}),t.jsx("div",{className:"aiquants-menu-link mx-1 hover:underline",children:r})]}):t.jsx("span",{className:"mx-1 text-sky-600 hover:underline dark:text-sky-400",children:r})},F=(n,r)=>r?{menu:{id:n.id,title:n.title,href:n.href},submenu:{subid:r.subid,title:r.title,href:r.href,mark:r.mark,new:r.new}}:{menu:{id:n.id,title:n.title,href:n.href}},Oe=({item:n,parentMenu:r,onMenuSelected:o})=>{if(n.href==="separator")return t.jsx("hr",{className:"aiquants-menu-separator mx-2 my-1 h-px"});const l=t.jsx(Pe,{mark:n.mark,children:n.title}),u={onClick:()=>{o&&o(F(r,n))}};return n.new?t.jsx("a",{href:n.href,rel:"noopener noreferrer",target:"_blank",...u,children:l}):ae.test(n.href)?t.jsx("a",{href:n.href,...u,children:l}):t.jsx(Y.Link,{to:n.href,...u,children:l})},le=n=>n?n.split(/[?#]/)[0].replace(/(?!^\/)\/$/,""):"",ce=(n,r)=>{const o=r!=="/"&&r.endsWith("/")?r.slice(0,-1):r;for(const l of n){if(le(l.href)===o)return l.id;if(l.submenu){for(const u of l.submenu)if(le(u.href)===o)return l.id}}return null},Ae=n=>{const{menuList:r,onMenuSelected:o,pinnedSubmenuIds:l=[],onToggleSubmenuPin:u}=n;let i="";try{i=Y.useLocation().pathname}catch{typeof window<"u"&&(i=window.location.pathname)}const d=s.useMemo(()=>ce(r,i),[r,i]),[p,x]=s.useState(d),f=s.useRef(i),m=s.useRef(d!==null);s.useEffect(()=>{if(f.current!==i&&(f.current=i,m.current=!1),!m.current){const a=ce(r,i);a!==null&&(x(a),m.current=!0)}},[i,r]);const k=s.useCallback(a=>{l.includes(a)||x(E=>E===a?null:a)},[l]),j=s.useRef(null);Te(()=>{const a=j.current;if(a)try{const h=sessionStorage.getItem(oe);if(h!==null){const E=Number.parseFloat(h);Number.isNaN(E)||(a.scrollTop=E)}}catch{}},[]);const y=s.useCallback(()=>{const a=j.current;if(a)try{sessionStorage.setItem(oe,String(a.scrollTop))}catch{}},[]),S=s.useMemo(()=>t.jsx(t.Fragment,{children:r.map(a=>t.jsx("div",{children:a.href?t.jsx("div",{className:"aiquants-menu-list-item relative mb-1 ml-1 h-full rounded-l-2xl p-2 align-middle text-sm before:-mt-1 before:mr-2 before:inline-block before:h-4 before:w-4 before:rounded-full before:align-middle before:content-['']",children:ae.test(a.href)?t.jsx("a",{href:a.href,onClick:()=>{o&&o(F(a))},children:t.jsx("span",{className:"aiquants-menu-link hover:underline",children:a.title})}):t.jsx(Y.Link,{to:a.href,onClick:()=>{o&&o(F(a))},children:t.jsx("span",{className:"aiquants-menu-link hover:underline",children:a.title})})}):t.jsxs("details",{className:"aiquants-menu-accordion-details",open:a.id===p||l.includes(a.id),children:[t.jsxs("summary",{className:"aiquants-menu-list-item aiquants-menu-accordion-summary relative mb-1 ml-1 h-full list-none rounded-l-2xl p-2 text-sm outline-none before:mr-2 before:inline-block before:h-4 before:w-4 before:rounded-full before:content-['']",onClick:h=>{h.preventDefault(),k(a.id)},onKeyDown:h=>{(h.key==="Enter"||h.key===" ")&&(h.preventDefault(),k(a.id))},children:[t.jsx("span",{children:a.title}),t.jsx("button",{type:"button",onClick:h=>{h.stopPropagation(),h.preventDefault(),u&&u(a.id)},className:`aiquants-submenu-pin-button ${l.includes(a.id)?"pinned":""}`,title:l.includes(a.id)?"ピン留め解除":"ピン留め",children:l.includes(a.id)?t.jsx(ne,{size:14}):t.jsx(re,{size:14})})]}),t.jsx("div",{className:"aiquants-menu-submenu pointer-events-auto my-1 mr-1 ml-4 rounded p-2 shadow-md",children:a.submenu.map(h=>t.jsx("div",{className:"aiquants-menu-accordion-container block w-full whitespace-nowrap text-sm",children:t.jsx(Oe,{item:h,parentMenu:a,onMenuSelected:o})},h.subid))})]})},a.id))}),[r,o,p,k,l]);return t.jsx("div",{ref:j,onScroll:y,className:"hidden-scrollbar h-0 grow overflow-y-scroll",children:S})},Ie=n=>{const{menuList:r,menuHeader:o,open:l,onMenuSelected:u,onClickSignout:i,theme:d,toggleTheme:p,isPinned:x,onTogglePin:f,pinnedSubmenuIds:m,onToggleSubmenuPin:k}=n;return t.jsxs("div",{className:`aiquants-menu-content fixed top-0 right-0 z-2147483642 flex min-h-dvh w-[250px] select-none flex-col transition-transform duration-500 ${l?"aiquants-menu-translate-x-0":"aiquants-menu-translate-x-250"}`,children:[t.jsx("div",{className:"flex h-[100px] flex-col",children:o}),t.jsx("div",{className:"flex grow flex-col",children:t.jsx(Ae,{menuList:r,onMenuSelected:u,pinnedSubmenuIds:m,onToggleSubmenuPin:k})}),t.jsx("div",{className:"px-4 pt-2 pb-4",children:t.jsxs("div",{className:"flex items-center justify-between gap-2",children:[t.jsx("button",{type:"button",onClick:f,"data-aqmb-pin-button":!0,className:`flex items-center justify-center rounded-md px-3 py-2 text-white text-xs shadow-sm transition-colors duration-300 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-amber-300/60 ${x?"bg-amber-500/90 hover:bg-amber-600":"border border-white/15 bg-white/10 hover:bg-white/20"}`,title:x?"ピン留め解除":"ピン留め","aria-label":x?"ピン留め解除":"ピン留め",children:x?t.jsx(ne,{size:14}):t.jsx(re,{size:14})}),t.jsx("button",{type:"button",onClick:p,"data-aqmb-theme-button":!0,className:"group relative flex items-center justify-center rounded-md border border-white/15 bg-white/10 px-3 py-2 text-white text-xs shadow-sm backdrop-blur-sm transition-all duration-300 hover:border-white/25 hover:bg-white/20 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/40 focus-visible:ring-offset-0 dark:border-gray-600/40 dark:bg-gray-800/80 dark:hover:border-gray-500/60 dark:hover:bg-gray-700",title:d==="dark"?"ライトモードに切り替え":"ダークモードに切り替え","aria-label":d==="dark"?"ライトモードに切り替え":"ダークモードに切り替え",children:t.jsx("span",{className:"text-sm transition-transform duration-300 group-hover:scale-110",children:d==="dark"?"🌞":"🌙"})}),t.jsx("button",{type:"button","data-aqmb-signout-button":!0,className:"aiquants-signout-button flex flex-1 items-center justify-center whitespace-nowrap rounded-md bg-red-500/90 px-3 py-2 font-medium text-white text-xs shadow-sm transition-colors duration-300 hover:bg-red-500 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-red-300/60",onClick:i,children:t.jsx("span",{children:"サインアウト"})})]})})]})},Le=n=>{const{isOverlay:r,onOverlayClick:o}=n;return t.jsx("button",{type:"button",className:`fixed inset-0 z-2147483640 cursor-default bg-black/50 transition-opacity duration-500 ${r?"opacity-100":"pointer-events-none opacity-0"}`,onClick:o})},De=n=>{const{open:r,onMenuOpen:o,onMenuClose:l,theme:u}=n,i=s.useRef(r),d=s.useRef(null),p=s.useRef(null),x=s.useRef(null),f=s.useRef(null),m=s.useRef(null),k=s.useCallback(()=>{if(d.current&&p.current&&x.current&&f.current&&m.current){const _=u==="dark"?"#fff":"#000";d.current.style.backgroundColor=_,d.current.style.width="100%",d.current.style.height="3px",d.current.style.transform="",p.current.style.opacity="1",p.current.style.backgroundColor=_,x.current.style.opacity="1",x.current.style.backgroundColor=_,f.current.style.backgroundColor=_,f.current.style.width="100%",f.current.style.height="3px",f.current.style.transform="",m.current.style.color=_,m.current.classList.remove("after:content-['close']"),m.current.classList.remove("after:ml-0.5"),m.current.classList.add("after:content-['menu']"),m.current.classList.add("after:-ml-0.5"),i.current=!0}},[u]),j=s.useCallback(()=>{d.current&&p.current&&x.current&&f.current&&m.current&&(d.current.style.backgroundColor="#fff",d.current.style.width="32px",d.current.style.height="4px",d.current.style.transform="translateY(9px) rotate(-45deg)",p.current.style.opacity="0",x.current.style.opacity="0",f.current.style.backgroundColor="#fff",f.current.style.width="32px",f.current.style.height="4px",f.current.style.transform="translateY(-9px) rotate(45deg)",m.current.style.color="#fff",m.current.classList.remove("after:content-['menu']"),m.current.classList.remove("after:-ml-0.5"),m.current.classList.add("after:content-['close']"),m.current.classList.add("after:ml-0.5"),i.current=!1)},[]),y=s.useCallback(()=>{k(),l&&l()},[k,l]),S=s.useCallback(()=>{j(),o&&o()},[j,o]),a=s.useCallback(()=>{i.current?S():y()},[y,S]),h=s.useCallback(_=>{_.currentTarget.blur()},[]),E=s.useCallback(_=>{_.preventDefault()},[]);return s.useEffect(()=>{r?k():j()},[r,k,j]),t.jsxs("button",{type:"button","data-aqmb-menu-switch":!0,className:"aiquants-menu-switch fixed z-2147483647 inline-block h-[27px] w-[27px] cursor-pointer align-middle outline-hidden",onClick:a,onFocus:h,onMouseDown:E,tabIndex:-1,children:[t.jsx("span",{className:"absolute top-0 left-0 box-border inline-block h-[3px] w-full select-none",ref:d}),t.jsx("span",{className:"absolute top-1.5 left-0 box-border inline-block h-[3px] w-full select-none",ref:p}),t.jsx("span",{className:"absolute top-3 left-0 box-border inline-block h-[3px] w-full select-none",ref:x}),t.jsx("span",{className:"absolute top-[18px] left-0 box-border inline-block h-[3px] w-full select-none",ref:f}),t.jsx("div",{className:"absolute w-full text-xs after:mt-2 after:block",ref:m})]})},ie=typeof window<"u"?s.useLayoutEffect:s.useEffect,ze=n=>{const{menuList:r,menuHeader:o,onClickSignout:l,isMenuhide:u,theme:i,toggleTheme:d,onMenuNavigate:p,onPinChange:x,pinnedSubmenuIds:f,initialPinnedSubmenuIds:m,onSubmenuPinChange:k,closeOnEscape:j="auto"}=n,[y,S]=s.useState(()=>{try{return localStorage.getItem("aiquants-menu-pinned")==="true"}catch{return!1}}),[a,h]=s.useState(y),[E,_]=s.useState(()=>{if(m)return m;try{const w=localStorage.getItem("aiquants-submenu-pinned");if(w){const N=JSON.parse(w);if(Array.isArray(N))return N.filter(M=>typeof M=="number")}}catch{}return[]}),V=f!==void 0?f:E,H=s.useCallback(w=>{const N=f!==void 0?f:E,M=N.includes(w)?N.filter(J=>J!==w):[...N,w];if(f===void 0){_(M);try{localStorage.setItem("aiquants-submenu-pinned",JSON.stringify(M))}catch{}}k&&k(M)},[f,E,k]);ie(()=>{const w=y?"250px":"0px";document.documentElement.style.setProperty("--aiquants-menu-pinned-width",w),x?.(y)},[y,x]),ie(()=>()=>{document.documentElement.style.setProperty("--aiquants-menu-pinned-width","0px")},[]);const W=s.useCallback(()=>{h(!0)},[]),P=s.useCallback(()=>{h(!1),S(!1);try{localStorage.removeItem("aiquants-menu-pinned")}catch{}},[]),U=s.useCallback(()=>{S(w=>{const N=!w;if(N)try{localStorage.setItem("aiquants-menu-pinned","true")}catch{}else try{localStorage.removeItem("aiquants-menu-pinned")}catch{}return N})},[]),Z=s.useCallback(w=>{p&&p(w),y||h(!1)},[p,y]),T=s.useCallback(w=>{w.key==="Escape"&&P()},[P]),D=j===!0||j==="auto"&&!y;return s.useEffect(()=>(a&&D?window.addEventListener("keydown",T,{passive:!0}):window.removeEventListener("keydown",T),()=>{window.removeEventListener("keydown",T)}),[a,D,T]),u?null:t.jsxs("div",{className:`aiquants-menu-bar ${i}`,children:[t.jsx(De,{onMenuClose:P,onMenuOpen:W,open:!a,theme:i}),t.jsx(Ie,{menuList:r,menuHeader:o,onClickSignout:l,onMenuSelected:Z,open:a,theme:i,toggleTheme:d,isPinned:y,onTogglePin:U,pinnedSubmenuIds:V,onToggleSubmenuPin:H}),t.jsx(Le,{isOverlay:a&&!y,onOverlayClick:P})]})};C.DefaultLink=$,C.MenuBar=ze,C.SessionInfo=ve,Object.defineProperty(C,Symbol.toStringTag,{value:"Module"})}));
|
|
6
|
+
<%s key={someKey} {...props} />`,y,g,z,g),J[g+y]=!0)}if(g=null,x!==void 0&&(s(x),g=""+x),u(d)&&(s(d.key),g=""+d.key),"key"in d){x={};for(var ae in d)ae!=="key"&&(x[ae]=d[ae])}else x=d;return g&&m(x,typeof e=="function"?e.displayName||e.name||"Unknown":e),h(e,g,x,c(),B,se)}function w(e){v(e)?e._store&&(e._store.validated=1):typeof e=="object"&&e!==null&&e.$$typeof===V&&(e._payload.status==="fulfilled"?v(e._payload.value)&&e._payload.value._store&&(e._payload.value._store.validated=1):e._store&&(e._store.validated=1))}function v(e){return typeof e=="object"&&e!==null&&e.$$typeof===P}var S=a,P=Symbol.for("react.transitional.element"),i=Symbol.for("react.portal"),p=Symbol.for("react.fragment"),R=Symbol.for("react.strict_mode"),j=Symbol.for("react.profiler"),_=Symbol.for("react.consumer"),I=Symbol.for("react.context"),L=Symbol.for("react.forward_ref"),H=Symbol.for("react.suspense"),ee=Symbol.for("react.suspense_list"),te=Symbol.for("react.memo"),V=Symbol.for("react.lazy"),W=Symbol.for("react.activity"),ne=Symbol.for("react.client.reference"),T=S.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,Z=Object.prototype.hasOwnProperty,re=Array.isArray,O=console.createTask?console.createTask:function(){return null};S={react_stack_bottom_frame:function(e){return e()}};var F,k={},C=S.react_stack_bottom_frame.bind(S,l)(),A=O(o(l)),J={};Y.Fragment=p,Y.jsx=function(e,d,x){var y=1e4>T.recentlyCreatedOwnerStacks++;return f(e,d,x,!1,y?Error("react-stack-top-frame"):C,y?O(o(e)):A)},Y.jsxs=function(e,d,x){var y=1e4>T.recentlyCreatedOwnerStacks++;return f(e,d,x,!0,y?Error("react-stack-top-frame"):C,y?O(o(e)):A)}})()),Y}var ie;function we(){return ie||(ie=1,process.env.NODE_ENV==="production"?U.exports=ge():U.exports=ve()),U.exports}var r=we();const Ne=n=>n.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),_e=n=>n.replace(/^([A-Z])|[\s-_]+(\w)/g,(t,s,o)=>o?o.toUpperCase():s.toLowerCase()),ce=n=>{const t=_e(n);return t.charAt(0).toUpperCase()+t.slice(1)},ue=(...n)=>n.filter((t,s,o)=>!!t&&t.trim()!==""&&o.indexOf(t)===s).join(" ").trim(),je=n=>{for(const t in n)if(t.startsWith("aria-")||t==="role"||t==="title")return!0};var Ee={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};const Ce=a.forwardRef(({color:n="currentColor",size:t=24,strokeWidth:s=2,absoluteStrokeWidth:o,className:c="",children:l,iconNode:u,...m},b)=>a.createElement("svg",{ref:b,...Ee,width:t,height:t,stroke:n,strokeWidth:o?Number(s)*24/Number(t):s,className:ue("lucide",c),...!l&&!je(m)&&{"aria-hidden":"true"},...m},[...u.map(([h,f])=>a.createElement(h,f)),...Array.isArray(l)?l:[l]]));const M=(n,t)=>{const s=a.forwardRef(({className:o,...c},l)=>a.createElement(Ce,{ref:l,iconNode:t,className:ue(`lucide-${Ne(ce(n))}`,`lucide-${n}`,o),...c}));return s.displayName=ce(n),s};const Se=M("external-link",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]]);const Me=M("user",[["path",{d:"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2",key:"975kel"}],["circle",{cx:"12",cy:"7",r:"4",key:"17ys0d"}]]),Pe="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iI2NiZDVlMSI+PHBhdGggZD0iTTEyIDEyYzIuMjEgMCA0LTEuNzkgNC00cy0xLjc5LTQtNC00LTQgMS43OS00IDQgMS43OSA0IDQgNHptMCAyYy0yLjY3IDAtOCAxLjM0LTggNHYyaDE2di0yYzAtMi42Ni01LjMzLTQtOC00eiIvPjwvc3ZnPg==",de=({to:n,className:t,children:s})=>r.jsx("a",{href:n,className:t,children:s}),Re=n=>{const{user:t,LinkComponent:s=de}=n;return r.jsx("div",{className:"w-full",children:t?r.jsxs("div",{className:"aiquants-session-card group relative flex flex-col gap-1.5 rounded-lg border border-white/20 bg-white/10 p-2 shadow-sm transition-all duration-200 hover:border-white/30 hover:bg-white/15 dark:border-slate-700/60 dark:bg-slate-800/60 dark:hover:border-slate-600/80 dark:hover:bg-slate-800/90",children:[r.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[r.jsxs("div",{className:"relative shrink-0",children:[r.jsx("div",{className:"h-7 w-7 overflow-hidden rounded-full border border-white/40 shadow-xs dark:border-slate-500",children:r.jsx("img",{className:"h-full w-full rounded-full object-cover",src:t.photo||Pe,alt:t.displayName||"user profile"})}),r.jsx("span",{className:"absolute -right-0.5 -bottom-0.5 h-2 w-2 rounded-full border border-slate-900 bg-emerald-400",title:"Online"})]}),r.jsxs("div",{className:"min-w-0 flex-1 leading-tight",children:[r.jsx("div",{className:"truncate font-semibold text-[11px] text-white tracking-tight dark:text-slate-100",title:t.displayName,children:t.displayName}),r.jsx("div",{className:"mt-0.5 text-[9px] text-white/70 tracking-tight dark:text-slate-400",children:"Google Account"})]})]}),r.jsxs("div",{className:"grid grid-cols-2 gap-1 border-white/15 border-t pt-1 dark:border-slate-700/50",children:[r.jsxs(s,{className:"flex items-center justify-center gap-1 rounded border border-white/15 bg-white/10 px-1.5 py-0.5 font-medium text-[10px] text-white transition-all duration-150 hover:bg-white/25 active:scale-95 dark:border-slate-600/50 dark:bg-slate-700/50 dark:text-slate-200 dark:hover:bg-slate-600/80",to:"/",children:[r.jsx(Me,{size:10,className:"shrink-0 opacity-80"}),r.jsx("span",{className:"truncate",children:"プロフィール"})]}),r.jsxs(s,{className:"flex items-center justify-center gap-1 rounded border border-white/15 bg-white/10 px-1.5 py-0.5 font-medium text-[10px] text-white transition-all duration-150 hover:bg-white/25 active:scale-95 dark:border-slate-600/50 dark:bg-slate-700/50 dark:text-slate-200 dark:hover:bg-slate-600/80",to:"https://myaccount.google.com/",children:[r.jsx(Se,{size:10,className:"shrink-0 opacity-80"}),r.jsx("span",{className:"truncate",children:"Google"})]})]})]}):r.jsx("div",{className:"aiquants-session-card flex items-center justify-between rounded-lg border border-white/20 bg-white/10 p-2 shadow-xs dark:border-slate-700/60 dark:bg-slate-800/60",children:r.jsx("span",{className:"font-medium text-white/90 text-xs dark:text-slate-200",children:"ログインしてください"})})})},G="aiquants-menu-pin-change";let E={pinned:!1,width:0};const X=(n=240)=>{if(typeof window>"u"||typeof document>"u")return{pinned:!1,width:0};try{const t=getComputedStyle(document.documentElement).getPropertyValue("--aiquants-menu-pinned-width").trim();if(t){const l=Number.parseInt(t,10);if(!Number.isNaN(l)){const u=l>0,m=u?l||n:0;return E.pinned===u&&E.width===m||(E={pinned:u,width:m}),E}}const o=localStorage.getItem("aiquants-menu-pinned")==="true",c=o?n:0;return E.pinned===o&&E.width===c||(E={pinned:o,width:c}),E}catch{return{pinned:!1,width:0}}},q=(n,t)=>{if(typeof window>"u")return;const s={pinned:n,width:t};(E.pinned!==n||E.width!==t)&&(E=s);const o=new CustomEvent(G,{detail:s,bubbles:!0,cancelable:!1});window.dispatchEvent(o)},fe=(n,t)=>{if(typeof window>"u")return()=>{};const{immediate:s=!0,defaultPinnedWidth:o=240}=t??{};if(s){const l=X(o);n(l)}const c=l=>{const u=l;u.detail&&n(u.detail)};return window.addEventListener(G,c,{passive:!0}),()=>{window.removeEventListener(G,c)}},Te=n=>{const t=n?.defaultPinnedWidth??240,s=n?.initialPinned??!1,o=a.useCallback(u=>fe(()=>{u()},{immediate:!1,defaultPinnedWidth:t}),[t]),c=a.useCallback(()=>X(t),[t]),l=a.useCallback(()=>({pinned:s,width:s?t:0}),[s,t]);return a.useSyncExternalStore(o,c,l)};const Oe=M("log-out",[["path",{d:"m16 17 5-5-5-5",key:"1bji2h"}],["path",{d:"M21 12H9",key:"dn1m92"}],["path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4",key:"1uf3rs"}]]);const he=M("pin",[["path",{d:"M12 17v5",key:"bb1du9"}],["path",{d:"M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z",key:"1nkz8b"}]]);const me=M("pin-off",[["path",{d:"M12 17v5",key:"bb1du9"}],["path",{d:"M15 9.34V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H7.89",key:"znwnzq"}],["path",{d:"m2 2 20 20",key:"1ooewy"}],["path",{d:"M9 9v1.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h11",key:"c9qhm2"}]]);const Ae=M("chart-no-axes-column-increasing",[["path",{d:"M5 21v-6",key:"1hz6c0"}],["path",{d:"M12 21V9",key:"uvy0l4"}],["path",{d:"M19 21V3",key:"11j9sm"}]]);const Ie=M("download",[["path",{d:"M12 15V3",key:"m9g1x1"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["path",{d:"m7 10 5 5 5-5",key:"brsn70"}]]);const pe=M("file-text",[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",key:"1oefj6"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5",key:"wfsgrz"}],["path",{d:"M10 9H8",key:"b1mrlr"}],["path",{d:"M16 13H8",key:"t4e002"}],["path",{d:"M16 17H8",key:"z1uh3a"}]]);const Le=M("link",[["path",{d:"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71",key:"1cjeqo"}],["path",{d:"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71",key:"19qd67"}]]);const ze=M("lock",[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]]);const De=M("table",[["path",{d:"M12 3v18",key:"108xh3"}],["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M3 9h18",key:"1pudct"}],["path",{d:"M3 15h18",key:"5xshup"}]]),Ye=typeof window<"u"?a.useLayoutEffect:a.useEffect,be="aiquants-menu-scroll",xe=new RegExp(/(^https?:\/\/)|(\.(html|htm)?$)/),He={report:pe,slip:pe,table:De,chart:Ae,download:Ie,lock:ze,href:Le},Ve=({mark:n,children:t})=>{const s=n?He[n]:void 0;return s?r.jsxs("div",{className:"flex flex-nowrap items-center",children:[r.jsx(s,{className:"h-3.5 w-3.5 shrink-0"}),r.jsx("div",{className:"aiquants-menu-link mx-1 hover:underline",children:t})]}):r.jsx("span",{className:"mx-1 text-sky-600 hover:underline dark:text-sky-400",children:t})},K=(n,t)=>t?{menu:{id:n.id,title:n.title,href:n.href},submenu:{subid:t.subid,title:t.title,href:t.href,mark:t.mark,new:t.new}}:{menu:{id:n.id,title:n.title,href:n.href}},We=({item:n,parentMenu:t,onMenuSelected:s})=>{if(n.href==="separator")return r.jsx("hr",{className:"aiquants-menu-separator mx-2 my-1 h-px"});const o=r.jsx(Ve,{mark:n.mark,children:n.title}),c={onClick:()=>{s&&s(K(t,n))}};return n.new?r.jsx("a",{href:n.href,rel:"noopener noreferrer",target:"_blank",...c,children:o}):xe.test(n.href)?r.jsx("a",{href:n.href,...c,children:o}):r.jsx(Q.Link,{to:n.href,...c,children:o})},ke=n=>n?n.split(/[?#]/)[0].replace(/(?!^\/)\/$/,""):"",ye=(n,t)=>{const s=t!=="/"&&t.endsWith("/")?t.slice(0,-1):t;for(const o of n){if(ke(o.href)===s)return o.id;if(o.submenu){for(const c of o.submenu)if(ke(c.href)===s)return o.id}}return null},Fe=n=>{const{menuList:t,onMenuSelected:s,pinnedSubmenuIds:o=[],onToggleSubmenuPin:c}=n;let l="";try{l=Q.useLocation().pathname}catch{typeof window<"u"&&(l=window.location.pathname)}const u=a.useMemo(()=>ye(t,l),[t,l]),[m,b]=a.useState(u),h=a.useRef(l),f=a.useRef(u!==null);a.useEffect(()=>{if(h.current!==l&&(h.current=l,f.current=!1),!f.current){const i=ye(t,l);i!==null&&(b(i),f.current=!0)}},[l,t]);const w=a.useCallback(i=>{o.includes(i)||b(R=>R===i?null:i)},[o]),v=a.useRef(null);Ye(()=>{const i=v.current;if(i)try{const p=sessionStorage.getItem(be);if(p!==null){const R=Number.parseFloat(p);Number.isNaN(R)||(i.scrollTop=R)}}catch{}},[]);const S=a.useCallback(()=>{const i=v.current;if(i)try{sessionStorage.setItem(be,String(i.scrollTop))}catch{}},[]),P=a.useMemo(()=>r.jsx(r.Fragment,{children:t.map(i=>r.jsx("div",{children:i.href?r.jsx("div",{className:"aiquants-menu-list-item relative mb-0.5 ml-1 flex items-center rounded-l-xl px-2.5 py-1 text-xs before:mr-2 before:inline-block before:h-2 before:w-2 before:shrink-0 before:rounded-full before:content-[''] sm:text-sm",children:xe.test(i.href)?r.jsx("a",{href:i.href,onClick:()=>{s&&s(K(i))},children:r.jsx("span",{className:"aiquants-menu-link hover:underline",children:i.title})}):r.jsx(Q.Link,{to:i.href,onClick:()=>{s&&s(K(i))},children:r.jsx("span",{className:"aiquants-menu-link hover:underline",children:i.title})})}):r.jsxs("details",{className:"aiquants-menu-accordion-details",open:i.id===m||o.includes(i.id),children:[r.jsxs("summary",{className:"aiquants-menu-list-item aiquants-menu-accordion-summary relative mb-0.5 ml-1 list-none rounded-l-xl px-2.5 py-1 text-xs outline-none before:mr-2 before:inline-block before:h-2 before:w-2 before:shrink-0 before:rounded-full before:content-[''] sm:text-sm",onClick:p=>{p.preventDefault(),w(i.id)},onKeyDown:p=>{(p.key==="Enter"||p.key===" ")&&(p.preventDefault(),w(i.id))},children:[r.jsx("span",{children:i.title}),r.jsx("button",{type:"button",onClick:p=>{p.stopPropagation(),p.preventDefault(),c&&c(i.id)},className:`aiquants-submenu-pin-button ${o.includes(i.id)?"pinned":""}`,title:o.includes(i.id)?"ピン留め解除":"ピン留め",children:o.includes(i.id)?r.jsx(he,{size:13}):r.jsx(me,{size:13})})]}),r.jsx("div",{className:"aiquants-menu-submenu pointer-events-auto my-0.5 mr-1 ml-3.5 rounded-lg px-2 py-1 shadow-sm",children:i.submenu.map(p=>r.jsx("div",{className:"aiquants-menu-accordion-container block w-full whitespace-nowrap py-0.5 text-xs",children:r.jsx(We,{item:p,parentMenu:i,onMenuSelected:s})},p.subid))})]})},i.id))}),[t,s,m,w,o]);return r.jsx("div",{ref:v,onScroll:S,className:"hidden-scrollbar h-0 grow overflow-y-scroll",children:P})},Ue=n=>{const{menuList:t,menuHeader:s,open:o,onMenuSelected:c,onClickSignout:l,theme:u,toggleTheme:m,isPinned:b,onTogglePin:h,pinnedSubmenuIds:f,onToggleSubmenuPin:w}=n;return r.jsxs("div",{className:`aiquants-menu-content fixed top-0 right-0 z-2147483642 flex min-h-dvh w-[240px] select-none flex-col transition-transform duration-500 ${o?"aiquants-menu-translate-x-0":"aiquants-menu-translate-x-250"}`,children:[r.jsx("div",{className:"flex shrink-0 flex-col justify-center border-white/15 border-b px-2.5 py-2 dark:border-slate-700/60",children:s}),r.jsx("div",{className:"flex grow flex-col overflow-y-auto",children:r.jsx(Fe,{menuList:t,onMenuSelected:c,pinnedSubmenuIds:f,onToggleSubmenuPin:w})}),r.jsx("div",{className:"border-white/15 border-t px-2.5 py-1.5 dark:border-slate-700/60",children:r.jsxs("div",{className:"flex items-center justify-between gap-1.5",children:[r.jsx("button",{type:"button",onClick:h,"data-aqmb-pin-button":!0,className:`flex h-7 items-center justify-center rounded-md px-2 text-[11px] text-white shadow-2xs transition-colors duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-amber-300/60 ${b?"bg-amber-500 hover:bg-amber-600 dark:bg-amber-600 dark:hover:bg-amber-500":"border border-white/20 bg-white/10 hover:bg-white/20 dark:border-slate-600/60 dark:bg-slate-700/60 dark:hover:bg-slate-600"}`,title:b?"ピン留め解除":"ピン留め","aria-label":b?"ピン留め解除":"ピン留め",children:b?r.jsx(he,{size:12}):r.jsx(me,{size:12})}),r.jsx("button",{type:"button",onClick:m,"data-aqmb-theme-button":!0,className:"group relative flex h-7 items-center justify-center rounded-md border border-white/20 bg-white/10 px-2 text-[11px] text-white shadow-2xs backdrop-blur-xs transition-all duration-200 hover:bg-white/20 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/40 dark:border-slate-600/60 dark:bg-slate-700/60 dark:hover:bg-slate-600",title:u==="dark"?"ライトモードに切り替え":"ダークモードに切り替え","aria-label":u==="dark"?"ライトモードに切り替え":"ダークモードに切り替え",children:r.jsx("span",{className:"text-xs transition-transform duration-200 group-hover:scale-110",children:u==="dark"?"🌞":"🌙"})}),r.jsxs("button",{type:"button","data-aqmb-signout-button":!0,className:"aiquants-signout-button flex h-7 flex-1 items-center justify-center gap-1.5 whitespace-nowrap rounded-md bg-red-500/90 px-2.5 font-medium text-[11px] text-white shadow-2xs transition-colors duration-200 hover:bg-red-600 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-red-300/60 dark:bg-red-600/90 dark:hover:bg-red-500",onClick:l,children:[r.jsx(Oe,{size:11,className:"shrink-0"}),r.jsx("span",{children:"サインアウト"})]})]})})]})},Ge=n=>{const{isOverlay:t,onOverlayClick:s}=n;return r.jsx("button",{type:"button",className:`fixed inset-0 z-2147483640 cursor-default bg-black/50 transition-opacity duration-500 ${t?"opacity-100":"pointer-events-none opacity-0"}`,onClick:s})},Ze=n=>{const{open:t,onMenuOpen:s,onMenuClose:o,theme:c}=n,l=a.useRef(t),u=a.useRef(null),m=a.useRef(null),b=a.useRef(null),h=a.useRef(null),f=a.useRef(null),w=a.useCallback(()=>{if(u.current&&m.current&&b.current&&h.current&&f.current){const j=c==="dark"?"#fff":"#000";u.current.style.backgroundColor=j,u.current.style.width="100%",u.current.style.height="3px",u.current.style.transform="",m.current.style.opacity="1",m.current.style.backgroundColor=j,b.current.style.opacity="1",b.current.style.backgroundColor=j,h.current.style.backgroundColor=j,h.current.style.width="100%",h.current.style.height="3px",h.current.style.transform="",f.current.style.color=j,f.current.classList.remove("after:content-['close']"),f.current.classList.remove("after:ml-0.5"),f.current.classList.add("after:content-['menu']"),f.current.classList.add("after:-ml-0.5"),l.current=!0}},[c]),v=a.useCallback(()=>{u.current&&m.current&&b.current&&h.current&&f.current&&(u.current.style.backgroundColor="#fff",u.current.style.width="32px",u.current.style.height="4px",u.current.style.transform="translateY(9px) rotate(-45deg)",m.current.style.opacity="0",b.current.style.opacity="0",h.current.style.backgroundColor="#fff",h.current.style.width="32px",h.current.style.height="4px",h.current.style.transform="translateY(-9px) rotate(45deg)",f.current.style.color="#fff",f.current.classList.remove("after:content-['menu']"),f.current.classList.remove("after:-ml-0.5"),f.current.classList.add("after:content-['close']"),f.current.classList.add("after:ml-0.5"),l.current=!1)},[]),S=a.useCallback(()=>{w(),o&&o()},[w,o]),P=a.useCallback(()=>{v(),s&&s()},[v,s]),i=a.useCallback(()=>{l.current?P():S()},[S,P]),p=a.useCallback(j=>{j.currentTarget.blur()},[]),R=a.useCallback(j=>{j.preventDefault()},[]);return a.useEffect(()=>{t?w():v()},[t,w,v]),r.jsxs("button",{type:"button","data-aqmb-menu-switch":!0,className:"aiquants-menu-switch inline-block h-[27px] w-[27px] cursor-pointer align-middle outline-hidden",onClick:i,onFocus:p,onMouseDown:R,tabIndex:-1,children:[r.jsx("span",{className:"absolute top-0 left-0 box-border inline-block h-[3px] w-full select-none",ref:u}),r.jsx("span",{className:"absolute top-1.5 left-0 box-border inline-block h-[3px] w-full select-none",ref:m}),r.jsx("span",{className:"absolute top-3 left-0 box-border inline-block h-[3px] w-full select-none",ref:b}),r.jsx("span",{className:"absolute top-[18px] left-0 box-border inline-block h-[3px] w-full select-none",ref:h}),r.jsx("div",{className:"absolute w-full text-xs after:mt-2 after:block",ref:f})]})},$=typeof window<"u"?a.useLayoutEffect:a.useEffect,Je=n=>{const{menuList:t,menuHeader:s,onClickSignout:o,isMenuhide:c,isMenuHide:l,theme:u,toggleTheme:m,onMenuNavigate:b,isPinned:h,pinnedWidth:f=240,onPinChange:w,pinnedSubmenuIds:v,initialPinnedSubmenuIds:S,onSubmenuPinChange:P,closeOnEscape:i="auto"}=n,p=l??c??!1,[R,j]=a.useState(()=>{try{return localStorage.getItem("aiquants-menu-pinned")==="true"}catch{return!1}}),_=h!==void 0?h:R,[I,L]=a.useState(_);a.useEffect(()=>{_&&L(!0)},[_]);const[H,ee]=a.useState(()=>{if(S)return S;try{const k=localStorage.getItem("aiquants-submenu-pinned");if(k){const C=JSON.parse(k);if(Array.isArray(C))return C.filter(A=>typeof A=="number")}}catch{}return[]}),te=v!==void 0?v:H,V=a.useCallback(k=>{const C=v!==void 0?v:H,A=C.includes(k)?C.filter(J=>J!==k):[...C,k];if(v===void 0){ee(A);try{localStorage.setItem("aiquants-submenu-pinned",JSON.stringify(A))}catch{}}P&&P(A)},[v,H,P]),W=a.useRef(w);$(()=>{W.current=w},[w]),$(()=>{const k=_?f:0,C=`${k}px`;document.documentElement.style.setProperty("--aiquants-menu-pinned-width",C),q(_,k)},[_,f]),$(()=>()=>{document.documentElement.style.setProperty("--aiquants-menu-pinned-width","0px"),q(!1,0)},[]);const ne=a.useCallback(()=>{L(!0)},[]),T=a.useCallback(()=>{if(L(!1),h===void 0){j(!1);try{localStorage.removeItem("aiquants-menu-pinned")}catch{}}W.current?.(!1,0)},[h]),Z=a.useCallback(()=>{const k=!_,C=k?f:0;if(h===void 0){j(k);try{k?localStorage.setItem("aiquants-menu-pinned","true"):localStorage.removeItem("aiquants-menu-pinned")}catch{}}W.current?.(k,C)},[_,h,f]),re=a.useCallback(k=>{b&&b(k),_||L(!1)},[b,_]),O=a.useCallback(k=>{k.key==="Escape"&&T()},[T]),F=i===!0||i==="auto"&&!_;return a.useEffect(()=>(I&&F?window.addEventListener("keydown",O):window.removeEventListener("keydown",O),()=>{window.removeEventListener("keydown",O)}),[I,F,O]),p?null:r.jsxs("div",{className:`aiquants-menu-bar ${u}`,children:[r.jsx(Ze,{onMenuClose:T,onMenuOpen:ne,open:!I,theme:u}),r.jsx(Ue,{menuList:t,menuHeader:s,onClickSignout:o,onMenuSelected:re,open:I,theme:u,toggleTheme:m,isPinned:_,onTogglePin:Z,pinnedSubmenuIds:te,onToggleSubmenuPin:V}),r.jsx(Ge,{isOverlay:I&&!_,onOverlayClick:T})]})};N.DefaultLink=de,N.MENU_PIN_CHANGE_EVENT=G,N.MenuBar=Je,N.SessionInfo=Re,N.dispatchMenuPinChange=q,N.getInitialPinState=X,N.subscribeMenuPinChange=fe,N.useMenuPinState=Te,Object.defineProperty(N,Symbol.toStringTag,{value:"Module"})}));
|
package/dist/styles/menu-bar.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */
|
|
2
|
-
@layer components{:root{--aiquants-menu-pinned-width:0px}.aiquants-menu-bar{font-size:1rem;line-height:1.5}.aiquants-menu-bar *{box-sizing:border-box}.aiquants-menu-bar a,.aiquants-menu-bar button{cursor:pointer;background:0 0;border:none;text-decoration:none}.aiquants-menu-bar.dark{color-scheme:dark}.aiquants-menu-bar.dark .aiquants-menu-content{background-color:#0f172a}.aiquants-menu-bar.light .aiquants-menu-content,.aiquants-menu-bar .aiquants-menu-content{background-color:#0369a1}.aiquants-menu-bar.dark .aiquants-signout-button{background-color:#334155}.aiquants-menu-bar.dark .aiquants-signout-button:hover{background-color:#475569}.aiquants-menu-bar.light .aiquants-signout-button,.aiquants-menu-bar .aiquants-signout-button{white-space:nowrap;background-color:#2563eb;min-width:0}.aiquants-menu-bar.light .aiquants-signout-button:hover,.aiquants-menu-bar .aiquants-signout-button:hover{background-color:#1e40af}.aiquants-menu-bar.dark .aiquants-menu-list-item{color:#d1d5db;background-color:#334155}.aiquants-menu-bar.dark .aiquants-menu-list-item:before{background-color:#94a3b8}.aiquants-menu-bar.dark .aiquants-menu-submenu{background-color:#1e293b}.aiquants-menu-bar.dark .aiquants-menu-link{color:#38bdf8}.aiquants-menu-bar.dark .aiquants-menu-separator{border-color:#4b5563}.aiquants-menu-bar.light .aiquants-menu-list-item,.aiquants-menu-bar .aiquants-menu-list-item{color:#4b5563;background-color:#bae6fd}.aiquants-menu-bar.light .aiquants-menu-list-item:before,.aiquants-menu-bar .aiquants-menu-list-item:before{background-color:#fff}.aiquants-menu-bar.light .aiquants-menu-submenu,.aiquants-menu-bar .aiquants-menu-submenu{background-color:#fafafa}.aiquants-menu-bar.light .aiquants-menu-link,.aiquants-menu-bar .aiquants-menu-link{color:#0284c7}.aiquants-menu-bar.light .aiquants-menu-separator,.aiquants-menu-bar .aiquants-menu-separator{border-color:#4b5563}.aiquants-menu-bar .aiquants-menu-separator{border-top:1px solid;height:0}.aiquants-menu-bar
|
|
2
|
+
@layer components{:root{--aiquants-menu-pinned-width:0px;--aqmb-switch-position:fixed;--aqmb-switch-top:calc(var(--spacing,.25rem) * 2);--aqmb-switch-right:calc(var(--spacing,.25rem) * 2);--aqmb-switch-left:auto;--aqmb-switch-bottom:auto;--aqmb-switch-z-index:2147480000}.aiquants-menu-bar{font-size:1rem;line-height:1.5;position:relative}.aiquants-menu-bar *{box-sizing:border-box}.aiquants-menu-bar a,.aiquants-menu-bar button{cursor:pointer;background:0 0;border:none;text-decoration:none}.aiquants-menu-bar.dark{color-scheme:dark}.aiquants-menu-bar.dark .aiquants-menu-content{background-color:#0f172a}.aiquants-menu-bar.light .aiquants-menu-content,.aiquants-menu-bar .aiquants-menu-content{background-color:#0369a1}.aiquants-menu-bar.dark .aiquants-signout-button{background-color:#334155}.aiquants-menu-bar.dark .aiquants-signout-button:hover{background-color:#475569}.aiquants-menu-bar.light .aiquants-signout-button,.aiquants-menu-bar .aiquants-signout-button{white-space:nowrap;background-color:#2563eb;min-width:0}.aiquants-menu-bar.light .aiquants-signout-button:hover,.aiquants-menu-bar .aiquants-signout-button:hover{background-color:#1e40af}.aiquants-menu-bar.dark .aiquants-menu-list-item{color:#d1d5db;background-color:#334155}.aiquants-menu-bar.dark .aiquants-menu-list-item:before{background-color:#94a3b8}.aiquants-menu-bar.dark .aiquants-menu-submenu{background-color:#1e293b}.aiquants-menu-bar.dark .aiquants-menu-link{color:#38bdf8}.aiquants-menu-bar.dark .aiquants-menu-separator{border-color:#4b5563}.aiquants-menu-bar.light .aiquants-menu-list-item,.aiquants-menu-bar .aiquants-menu-list-item{color:#4b5563;background-color:#bae6fd}.aiquants-menu-bar.light .aiquants-menu-list-item:before,.aiquants-menu-bar .aiquants-menu-list-item:before{background-color:#fff}.aiquants-menu-bar.light .aiquants-menu-submenu,.aiquants-menu-bar .aiquants-menu-submenu{background-color:#fafafa}.aiquants-menu-bar.light .aiquants-menu-link,.aiquants-menu-bar .aiquants-menu-link{color:#0284c7}.aiquants-menu-bar.light .aiquants-menu-separator,.aiquants-menu-bar .aiquants-menu-separator{border-color:#4b5563}.aiquants-menu-bar .aiquants-menu-separator{border-top:1px solid;height:0}.aiquants-menu-bar .aiquants-session-card{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.aiquants-menu-accordion-summary{cursor:pointer;justify-content:space-between;align-items:center;display:flex}.aiquants-menu-accordion-summary::-webkit-details-marker{display:none}.aiquants-menu-accordion-summary span{text-align:left;flex-grow:1}.aiquants-submenu-pin-button{border-radius:.25rem;justify-content:center;align-items:center;padding:.15rem;transition:all .3s;display:inline-flex}.aiquants-menu-bar.light .aiquants-submenu-pin-button{color:#4b556366}.aiquants-menu-bar.light .aiquants-submenu-pin-button:hover{color:#4b5563cc;background-color:#4b55631a}.aiquants-menu-bar.light .aiquants-submenu-pin-button.pinned{color:#d97706}.aiquants-menu-bar.light .aiquants-submenu-pin-button.pinned:hover{color:#b45309;background-color:#d977061a}.aiquants-menu-bar.dark .aiquants-submenu-pin-button{color:#fff6}.aiquants-menu-bar.dark .aiquants-submenu-pin-button:hover{color:#fffc;background-color:#ffffff1a}.aiquants-menu-bar.dark .aiquants-submenu-pin-button.pinned{color:#f59e0b}.aiquants-menu-bar.dark .aiquants-submenu-pin-button.pinned:hover{color:#fbbf24;background-color:#f59e0b26}.aiquants-menu-accordion-container{contain:content;transition:block-size .5s}.aiquants-menu-translate-x-0{transform:translate(0)}.aiquants-menu-translate-x-250{transform:translate(250px)}.aiquants-menu-switch{position:var(--aqmb-switch-position,fixed);top:var(--aqmb-switch-top,calc(var(--spacing,.25rem) * 2));right:var(--aqmb-switch-right,calc(var(--spacing,.25rem) * 2));left:var(--aqmb-switch-left,auto);bottom:var(--aqmb-switch-bottom,auto);z-index:var(--aqmb-switch-z-index,2147480000)}@media (min-width:40rem){.aiquants-menu-switch{top:var(--aqmb-switch-top,calc(var(--spacing,.25rem) * 3));right:var(--aqmb-switch-right,calc(var(--spacing,.25rem) * 3))}}}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
/*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */
|
|
2
2
|
/*! @aiquants/menu-bar standalone CSS — 非 Tailwind ホスト専用。ホストの Tailwind ビルドと混在させないこと (同名ユーティリティ重複でカスケード反転が起きる) */
|
|
3
|
-
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-content:""}}}@layer theme{:root,:host{--color-red-300:oklch(80.8% .114 19.571);--color-red-500:oklch(63.7% .237 25.331);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-sky-400:oklch(74.6% .16 232.661);--color-sky-600:oklch(58.8% .158 241.966);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-black:#000;--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--font-weight-medium:500;--radius-md:.375rem;--radius-lg:.5rem;--radius-2xl:1rem;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1)}}@layer base;@layer components{:root{--aiquants-menu-pinned-width:0px}.aiquants-menu-bar{font-size:1rem;line-height:1.5}.aiquants-menu-bar *{box-sizing:border-box}.aiquants-menu-bar a,.aiquants-menu-bar button{cursor:pointer;background:0 0;border:none;text-decoration:none}.aiquants-menu-bar.dark{color-scheme:dark}.aiquants-menu-bar.dark .aiquants-menu-content{background-color:#0f172a}.aiquants-menu-bar.light .aiquants-menu-content,.aiquants-menu-bar .aiquants-menu-content{background-color:#0369a1}.aiquants-menu-bar.dark .aiquants-signout-button{background-color:#334155}.aiquants-menu-bar.dark .aiquants-signout-button:hover{background-color:#475569}.aiquants-menu-bar.light .aiquants-signout-button,.aiquants-menu-bar .aiquants-signout-button{white-space:nowrap;background-color:#2563eb;min-width:0}.aiquants-menu-bar.light .aiquants-signout-button:hover,.aiquants-menu-bar .aiquants-signout-button:hover{background-color:#1e40af}.aiquants-menu-bar.dark .aiquants-menu-list-item{color:#d1d5db;background-color:#334155}.aiquants-menu-bar.dark .aiquants-menu-list-item:before{background-color:#94a3b8}.aiquants-menu-bar.dark .aiquants-menu-submenu{background-color:#1e293b}.aiquants-menu-bar.dark .aiquants-menu-link{color:#38bdf8}.aiquants-menu-bar.dark .aiquants-menu-separator{border-color:#4b5563}.aiquants-menu-bar.light .aiquants-menu-list-item,.aiquants-menu-bar .aiquants-menu-list-item{color:#4b5563;background-color:#bae6fd}.aiquants-menu-bar.light .aiquants-menu-list-item:before,.aiquants-menu-bar .aiquants-menu-list-item:before{background-color:#fff}.aiquants-menu-bar.light .aiquants-menu-submenu,.aiquants-menu-bar .aiquants-menu-submenu{background-color:#fafafa}.aiquants-menu-bar.light .aiquants-menu-link,.aiquants-menu-bar .aiquants-menu-link{color:#0284c7}.aiquants-menu-bar.light .aiquants-menu-separator,.aiquants-menu-bar .aiquants-menu-separator{border-color:#4b5563}.aiquants-menu-bar .aiquants-menu-separator{border-top:1px solid;height:0}.aiquants-menu-bar.dark .aiquants-session-photo{background-color:#27272a}.aiquants-menu-bar.dark .aiquants-session-link,.aiquants-menu-bar.dark .aiquants-session-info{color:#e2e8f0;background-color:#334155}.aiquants-menu-bar.light .aiquants-session-photo,.aiquants-menu-bar .aiquants-session-photo{background-color:#fafafa}.aiquants-menu-bar.light .aiquants-session-link,.aiquants-menu-bar .aiquants-session-link,.aiquants-menu-bar.light .aiquants-session-info,.aiquants-menu-bar .aiquants-session-info{color:#000;background-color:#dcfce7}.aiquants-menu-accordion-summary{cursor:pointer;justify-content:space-between;align-items:center;display:flex}.aiquants-menu-accordion-summary::-webkit-details-marker{display:none}.aiquants-menu-accordion-summary span{text-align:left;flex-grow:1}.aiquants-submenu-pin-button{border-radius:.375rem;justify-content:center;align-items:center;padding:.25rem;transition:all .3s;display:inline-flex}.aiquants-menu-bar.light .aiquants-submenu-pin-button{color:#4b556366}.aiquants-menu-bar.light .aiquants-submenu-pin-button:hover{color:#4b5563cc;background-color:#4b55631a}.aiquants-menu-bar.light .aiquants-submenu-pin-button.pinned{color:#d97706}.aiquants-menu-bar.light .aiquants-submenu-pin-button.pinned:hover{color:#b45309;background-color:#d977061a}.aiquants-menu-bar.dark .aiquants-submenu-pin-button{color:#fff6}.aiquants-menu-bar.dark .aiquants-submenu-pin-button:hover{color:#fffc;background-color:#ffffff1a}.aiquants-menu-bar.dark .aiquants-submenu-pin-button.pinned{color:#f59e0b}.aiquants-menu-bar.dark .aiquants-submenu-pin-button.pinned:hover{color:#fbbf24;background-color:#f59e0b26}.aiquants-menu-accordion-container{contain:content;transition:block-size .5s}.aiquants-menu-translate-x-0{transform:translate(0)}.aiquants-menu-translate-x-250{transform:translate(250px)}.aiquants-menu-switch{top:calc(var(--spacing) * 2);right:calc(var(--spacing) * 2)}@media (min-width:40rem){.aiquants-menu-switch{top:calc(var(--spacing) * 3);right:calc(var(--spacing) * 3)}}}@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:calc(var(--spacing) * 0)}.top-0{top:calc(var(--spacing) * 0)}.top-1\.5{top:calc(var(--spacing) * 1.5)}.top-3{top:calc(var(--spacing) * 3)}.top-\[18px\]{top:18px}.right-0{right:calc(var(--spacing) * 0)}.left-0{left:calc(var(--spacing) * 0)}.z-2147483640{z-index:2147483640}.z-2147483642{z-index:2147483642}.z-2147483647{z-index:2147483647}.m-1{margin:calc(var(--spacing) * 1)}.mx-1{margin-inline:calc(var(--spacing) * 1)}.mx-2{margin-inline:calc(var(--spacing) * 2)}.my-1{margin-block:calc(var(--spacing) * 1)}.mr-1{margin-right:calc(var(--spacing) * 1)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-4{margin-left:calc(var(--spacing) * 4)}.box-border{box-sizing:border-box}.block{display:block}.flex{display:flex}.inline-block{display:inline-block}.table{display:table}.h-0{height:calc(var(--spacing) * 0)}.h-4{height:calc(var(--spacing) * 4)}.h-14{height:calc(var(--spacing) * 14)}.h-\[3px\]{height:3px}.h-\[27px\]{height:27px}.h-\[100px\]{height:100px}.h-full{height:100%}.h-px{height:1px}.max-h-20{max-height:calc(var(--spacing) * 20)}.min-h-\[1em\]{min-height:1em}.min-h-dvh{min-height:100dvh}.w-4{width:calc(var(--spacing) * 4)}.w-9\/12{width:75%}.w-14{width:calc(var(--spacing) * 14)}.w-\[27px\]{width:27px}.w-\[250px\]{width:250px}.w-full{width:100%}.max-w-52{max-width:calc(var(--spacing) * 52)}.flex-1{flex:1}.grow{flex-grow:1}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.list-none{list-style-type:none}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.flex-nowrap{flex-wrap:nowrap}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-2{gap:calc(var(--spacing) * 2)}.overflow-y-scroll{overflow-y:scroll}.rounded{border-radius:.25rem}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-l-2xl{border-top-left-radius:var(--radius-2xl);border-bottom-left-radius:var(--radius-2xl)}.rounded-r-lg{border-top-right-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-white\/15{border-color:#ffffff26}@supports (color:color-mix(in lab, red, red)){.border-white\/15{border-color:color-mix(in oklab, var(--color-white) 15%, transparent)}}.bg-amber-500\/90{background-color:#f99c00e6}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\/90{background-color:color-mix(in oklab, var(--color-amber-500) 90%, transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab, red, red)){.bg-black\/50{background-color:color-mix(in oklab, var(--color-black) 50%, transparent)}}.bg-red-500\/90{background-color:#fb2c36e6}@supports (color:color-mix(in lab, red, red)){.bg-red-500\/90{background-color:color-mix(in oklab, var(--color-red-500) 90%, transparent)}}.bg-white\/10{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.bg-white\/10{background-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.object-contain{object-fit:contain}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-2{padding:calc(var(--spacing) * 2)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-2{padding-block:calc(var(--spacing) * 2)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pl-1{padding-left:calc(var(--spacing) * 1)}.text-center{text-align:center}.align-middle{vertical-align:middle}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.whitespace-nowrap{white-space:nowrap}.text-sky-600{color:var(--color-sky-600)}.text-white{color:var(--color-white)}.opacity-0{opacity:0}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.outline-hidden{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.outline-hidden{outline-offset:2px;outline:2px solid #0000}}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}@media (hover:hover){.group-hover\:scale-110:is(:where(.group):hover *){--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}}.before\:-mt-1:before{content:var(--tw-content);margin-top:calc(var(--spacing) * -1)}.before\:mr-2:before{content:var(--tw-content);margin-right:calc(var(--spacing) * 2)}.before\:inline-block:before{content:var(--tw-content);display:inline-block}.before\:h-4:before{content:var(--tw-content);height:calc(var(--spacing) * 4)}.before\:w-4:before{content:var(--tw-content);width:calc(var(--spacing) * 4)}.before\:rounded-full:before{content:var(--tw-content);border-radius:3.40282e38px}.before\:align-middle:before{content:var(--tw-content);vertical-align:middle}.before\:content-\[\'\'\]:before{--tw-content:"";content:var(--tw-content)}.after\:mt-2:after{content:var(--tw-content);margin-top:calc(var(--spacing) * 2)}.after\:-ml-0\.5:after{content:var(--tw-content);margin-left:calc(var(--spacing) * -.5)}.after\:ml-0\.5:after{content:var(--tw-content);margin-left:calc(var(--spacing) * .5)}.after\:block:after{content:var(--tw-content);display:block}.after\:content-\[\'close\'\]:after{--tw-content:"close";content:var(--tw-content)}.after\:content-\[\'menu\'\]:after{--tw-content:"menu";content:var(--tw-content)}@media (hover:hover){.hover\:border-white\/25:hover{border-color:#ffffff40}@supports (color:color-mix(in lab, red, red)){.hover\:border-white\/25:hover{border-color:color-mix(in oklab, var(--color-white) 25%, transparent)}}.hover\:bg-amber-600:hover{background-color:var(--color-amber-600)}.hover\:bg-red-500:hover{background-color:var(--color-red-500)}.hover\:bg-white\/20:hover{background-color:#fff3}@supports (color:color-mix(in lab, red, red)){.hover\:bg-white\/20:hover{background-color:color-mix(in oklab, var(--color-white) 20%, transparent)}}.hover\:underline:hover{text-decoration-line:underline}}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-amber-300\/60:focus-visible{--tw-ring-color:#ffd23699}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-amber-300\/60:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-amber-300) 60%, transparent)}}.focus-visible\:ring-red-300\/60:focus-visible{--tw-ring-color:#ffa3a399}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-red-300\/60:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-red-300) 60%, transparent)}}.focus-visible\:ring-white\/40:focus-visible{--tw-ring-color:#fff6}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-white\/40:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-white) 40%, transparent)}}.focus-visible\:ring-offset-0:focus-visible{--tw-ring-offset-width:0px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.dark\:border-gray-600\/40:where(.dark,.dark *){border-color:#4a556566}@supports (color:color-mix(in lab, red, red)){.dark\:border-gray-600\/40:where(.dark,.dark *){border-color:color-mix(in oklab, var(--color-gray-600) 40%, transparent)}}.dark\:bg-gray-800\/80:where(.dark,.dark *){background-color:#1e2939cc}@supports (color:color-mix(in lab, red, red)){.dark\:bg-gray-800\/80:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-gray-800) 80%, transparent)}}.dark\:text-sky-400:where(.dark,.dark *){color:var(--color-sky-400)}@media (hover:hover){.dark\:hover\:border-gray-500\/60:where(.dark,.dark *):hover{border-color:#6a728299}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:border-gray-500\/60:where(.dark,.dark *):hover{border-color:color-mix(in oklab, var(--color-gray-500) 60%, transparent)}}.dark\:hover\:bg-gray-700:where(.dark,.dark *):hover{background-color:var(--color-gray-700)}}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-content{syntax:"*";inherits:false;initial-value:""}
|
|
3
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-content:""}}}@layer theme{:root,:host{--color-red-300:oklch(80.8% .114 19.571);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-emerald-400:oklch(76.5% .177 163.223);--color-sky-400:oklch(74.6% .16 232.661);--color-sky-600:oklch(58.8% .158 241.966);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-800:oklch(27.9% .041 260.031);--color-slate-900:oklch(20.8% .042 265.755);--color-black:#000;--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--leading-tight:1.25;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--blur-xs:4px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1)}}@layer base;@layer components{:root{--aiquants-menu-pinned-width:0px;--aqmb-switch-position:fixed;--aqmb-switch-top:calc(var(--spacing,.25rem) * 2);--aqmb-switch-right:calc(var(--spacing,.25rem) * 2);--aqmb-switch-left:auto;--aqmb-switch-bottom:auto;--aqmb-switch-z-index:2147480000}.aiquants-menu-bar{font-size:1rem;line-height:1.5;position:relative}.aiquants-menu-bar *{box-sizing:border-box}.aiquants-menu-bar a,.aiquants-menu-bar button{cursor:pointer;background:0 0;border:none;text-decoration:none}.aiquants-menu-bar.dark{color-scheme:dark}.aiquants-menu-bar.dark .aiquants-menu-content{background-color:#0f172a}.aiquants-menu-bar.light .aiquants-menu-content,.aiquants-menu-bar .aiquants-menu-content{background-color:#0369a1}.aiquants-menu-bar.dark .aiquants-signout-button{background-color:#334155}.aiquants-menu-bar.dark .aiquants-signout-button:hover{background-color:#475569}.aiquants-menu-bar.light .aiquants-signout-button,.aiquants-menu-bar .aiquants-signout-button{white-space:nowrap;background-color:#2563eb;min-width:0}.aiquants-menu-bar.light .aiquants-signout-button:hover,.aiquants-menu-bar .aiquants-signout-button:hover{background-color:#1e40af}.aiquants-menu-bar.dark .aiquants-menu-list-item{color:#d1d5db;background-color:#334155}.aiquants-menu-bar.dark .aiquants-menu-list-item:before{background-color:#94a3b8}.aiquants-menu-bar.dark .aiquants-menu-submenu{background-color:#1e293b}.aiquants-menu-bar.dark .aiquants-menu-link{color:#38bdf8}.aiquants-menu-bar.dark .aiquants-menu-separator{border-color:#4b5563}.aiquants-menu-bar.light .aiquants-menu-list-item,.aiquants-menu-bar .aiquants-menu-list-item{color:#4b5563;background-color:#bae6fd}.aiquants-menu-bar.light .aiquants-menu-list-item:before,.aiquants-menu-bar .aiquants-menu-list-item:before{background-color:#fff}.aiquants-menu-bar.light .aiquants-menu-submenu,.aiquants-menu-bar .aiquants-menu-submenu{background-color:#fafafa}.aiquants-menu-bar.light .aiquants-menu-link,.aiquants-menu-bar .aiquants-menu-link{color:#0284c7}.aiquants-menu-bar.light .aiquants-menu-separator,.aiquants-menu-bar .aiquants-menu-separator{border-color:#4b5563}.aiquants-menu-bar .aiquants-menu-separator{border-top:1px solid;height:0}.aiquants-menu-bar .aiquants-session-card{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.aiquants-menu-accordion-summary{cursor:pointer;justify-content:space-between;align-items:center;display:flex}.aiquants-menu-accordion-summary::-webkit-details-marker{display:none}.aiquants-menu-accordion-summary span{text-align:left;flex-grow:1}.aiquants-submenu-pin-button{border-radius:.25rem;justify-content:center;align-items:center;padding:.15rem;transition:all .3s;display:inline-flex}.aiquants-menu-bar.light .aiquants-submenu-pin-button{color:#4b556366}.aiquants-menu-bar.light .aiquants-submenu-pin-button:hover{color:#4b5563cc;background-color:#4b55631a}.aiquants-menu-bar.light .aiquants-submenu-pin-button.pinned{color:#d97706}.aiquants-menu-bar.light .aiquants-submenu-pin-button.pinned:hover{color:#b45309;background-color:#d977061a}.aiquants-menu-bar.dark .aiquants-submenu-pin-button{color:#fff6}.aiquants-menu-bar.dark .aiquants-submenu-pin-button:hover{color:#fffc;background-color:#ffffff1a}.aiquants-menu-bar.dark .aiquants-submenu-pin-button.pinned{color:#f59e0b}.aiquants-menu-bar.dark .aiquants-submenu-pin-button.pinned:hover{color:#fbbf24;background-color:#f59e0b26}.aiquants-menu-accordion-container{contain:content;transition:block-size .5s}.aiquants-menu-translate-x-0{transform:translate(0)}.aiquants-menu-translate-x-250{transform:translate(250px)}.aiquants-menu-switch{position:var(--aqmb-switch-position,fixed);top:var(--aqmb-switch-top,calc(var(--spacing,.25rem) * 2));right:var(--aqmb-switch-right,calc(var(--spacing,.25rem) * 2));left:var(--aqmb-switch-left,auto);bottom:var(--aqmb-switch-bottom,auto);z-index:var(--aqmb-switch-z-index,2147480000)}@media (min-width:40rem){.aiquants-menu-switch{top:var(--aqmb-switch-top,calc(var(--spacing,.25rem) * 3));right:var(--aqmb-switch-right,calc(var(--spacing,.25rem) * 3))}}}@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:calc(var(--spacing) * 0)}.top-0{top:calc(var(--spacing) * 0)}.top-1\.5{top:calc(var(--spacing) * 1.5)}.top-3{top:calc(var(--spacing) * 3)}.top-\[18px\]{top:18px}.-right-0\.5{right:calc(var(--spacing) * -.5)}.right-0{right:calc(var(--spacing) * 0)}.-bottom-0\.5{bottom:calc(var(--spacing) * -.5)}.left-0{left:calc(var(--spacing) * 0)}.z-2147483640{z-index:2147483640}.z-2147483642{z-index:2147483642}.mx-1{margin-inline:calc(var(--spacing) * 1)}.mx-2{margin-inline:calc(var(--spacing) * 2)}.my-0\.5{margin-block:calc(var(--spacing) * .5)}.my-1{margin-block:calc(var(--spacing) * 1)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mr-1{margin-right:calc(var(--spacing) * 1)}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-3\.5{margin-left:calc(var(--spacing) * 3.5)}.box-border{box-sizing:border-box}.block{display:block}.flex{display:flex}.grid{display:grid}.inline-block{display:inline-block}.table{display:table}.h-0{height:calc(var(--spacing) * 0)}.h-2{height:calc(var(--spacing) * 2)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-7{height:calc(var(--spacing) * 7)}.h-\[3px\]{height:3px}.h-\[27px\]{height:27px}.h-full{height:100%}.h-px{height:1px}.min-h-dvh{min-height:100dvh}.w-2{width:calc(var(--spacing) * 2)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-7{width:calc(var(--spacing) * 7)}.w-\[27px\]{width:27px}.w-\[240px\]{width:240px}.w-full{width:100%}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.list-none{list-style-type:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-nowrap{flex-wrap:nowrap}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overflow-y-scroll{overflow-y:scroll}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-l-xl{border-top-left-radius:var(--radius-xl);border-bottom-left-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-slate-900{border-color:var(--color-slate-900)}.border-white\/15{border-color:#ffffff26}@supports (color:color-mix(in lab, red, red)){.border-white\/15{border-color:color-mix(in oklab, var(--color-white) 15%, transparent)}}.border-white\/20{border-color:#fff3}@supports (color:color-mix(in lab, red, red)){.border-white\/20{border-color:color-mix(in oklab, var(--color-white) 20%, transparent)}}.border-white\/40{border-color:#fff6}@supports (color:color-mix(in lab, red, red)){.border-white\/40{border-color:color-mix(in oklab, var(--color-white) 40%, transparent)}}.bg-amber-500{background-color:var(--color-amber-500)}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab, red, red)){.bg-black\/50{background-color:color-mix(in oklab, var(--color-black) 50%, transparent)}}.bg-emerald-400{background-color:var(--color-emerald-400)}.bg-red-500\/90{background-color:#fb2c36e6}@supports (color:color-mix(in lab, red, red)){.bg-red-500\/90{background-color:color-mix(in oklab, var(--color-red-500) 90%, transparent)}}.bg-white\/10{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.bg-white\/10{background-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.object-cover{object-fit:cover}.p-2{padding:calc(var(--spacing) * 2)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.pt-1{padding-top:calc(var(--spacing) * 1)}.align-middle{vertical-align:middle}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.whitespace-nowrap{white-space:nowrap}.text-sky-600{color:var(--color-sky-600)}.text-white{color:var(--color-white)}.text-white\/70{color:#ffffffb3}@supports (color:color-mix(in lab, red, red)){.text-white\/70{color:color-mix(in oklab, var(--color-white) 70%, transparent)}}.text-white\/90{color:#ffffffe6}@supports (color:color-mix(in lab, red, red)){.text-white\/90{color:color-mix(in oklab, var(--color-white) 90%, transparent)}}.opacity-0{opacity:0}.opacity-80{opacity:.8}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-2xs{--tw-shadow:0 1px var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.outline-hidden{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.outline-hidden{outline-offset:2px;outline:2px solid #0000}}.backdrop-blur-xs{--tw-backdrop-blur:blur(var(--blur-xs));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}@media (hover:hover){.group-hover\:scale-110:is(:where(.group):hover *){--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}}.before\:mr-2:before{content:var(--tw-content);margin-right:calc(var(--spacing) * 2)}.before\:inline-block:before{content:var(--tw-content);display:inline-block}.before\:h-2:before{content:var(--tw-content);height:calc(var(--spacing) * 2)}.before\:w-2:before{content:var(--tw-content);width:calc(var(--spacing) * 2)}.before\:shrink-0:before{content:var(--tw-content);flex-shrink:0}.before\:rounded-full:before{content:var(--tw-content);border-radius:3.40282e38px}.before\:content-\[\'\'\]:before{--tw-content:"";content:var(--tw-content)}.after\:mt-2:after{content:var(--tw-content);margin-top:calc(var(--spacing) * 2)}.after\:-ml-0\.5:after{content:var(--tw-content);margin-left:calc(var(--spacing) * -.5)}.after\:ml-0\.5:after{content:var(--tw-content);margin-left:calc(var(--spacing) * .5)}.after\:block:after{content:var(--tw-content);display:block}.after\:content-\[\'close\'\]:after{--tw-content:"close";content:var(--tw-content)}.after\:content-\[\'menu\'\]:after{--tw-content:"menu";content:var(--tw-content)}@media (hover:hover){.hover\:border-white\/30:hover{border-color:#ffffff4d}@supports (color:color-mix(in lab, red, red)){.hover\:border-white\/30:hover{border-color:color-mix(in oklab, var(--color-white) 30%, transparent)}}.hover\:bg-amber-600:hover{background-color:var(--color-amber-600)}.hover\:bg-red-600:hover{background-color:var(--color-red-600)}.hover\:bg-white\/15:hover{background-color:#ffffff26}@supports (color:color-mix(in lab, red, red)){.hover\:bg-white\/15:hover{background-color:color-mix(in oklab, var(--color-white) 15%, transparent)}}.hover\:bg-white\/20:hover{background-color:#fff3}@supports (color:color-mix(in lab, red, red)){.hover\:bg-white\/20:hover{background-color:color-mix(in oklab, var(--color-white) 20%, transparent)}}.hover\:bg-white\/25:hover{background-color:#ffffff40}@supports (color:color-mix(in lab, red, red)){.hover\:bg-white\/25:hover{background-color:color-mix(in oklab, var(--color-white) 25%, transparent)}}.hover\:underline:hover{text-decoration-line:underline}}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-amber-300\/60:focus-visible{--tw-ring-color:#ffd23699}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-amber-300\/60:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-amber-300) 60%, transparent)}}.focus-visible\:ring-red-300\/60:focus-visible{--tw-ring-color:#ffa3a399}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-red-300\/60:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-red-300) 60%, transparent)}}.focus-visible\:ring-white\/40:focus-visible{--tw-ring-color:#fff6}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-white\/40:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-white) 40%, transparent)}}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.active\:scale-95:active{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}@media (min-width:40rem){.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.dark\:border-slate-500:where(.dark,.dark *){border-color:var(--color-slate-500)}.dark\:border-slate-600\/50:where(.dark,.dark *){border-color:#45556c80}@supports (color:color-mix(in lab, red, red)){.dark\:border-slate-600\/50:where(.dark,.dark *){border-color:color-mix(in oklab, var(--color-slate-600) 50%, transparent)}}.dark\:border-slate-600\/60:where(.dark,.dark *){border-color:#45556c99}@supports (color:color-mix(in lab, red, red)){.dark\:border-slate-600\/60:where(.dark,.dark *){border-color:color-mix(in oklab, var(--color-slate-600) 60%, transparent)}}.dark\:border-slate-700\/50:where(.dark,.dark *){border-color:#31415880}@supports (color:color-mix(in lab, red, red)){.dark\:border-slate-700\/50:where(.dark,.dark *){border-color:color-mix(in oklab, var(--color-slate-700) 50%, transparent)}}.dark\:border-slate-700\/60:where(.dark,.dark *){border-color:#31415899}@supports (color:color-mix(in lab, red, red)){.dark\:border-slate-700\/60:where(.dark,.dark *){border-color:color-mix(in oklab, var(--color-slate-700) 60%, transparent)}}.dark\:bg-amber-600:where(.dark,.dark *){background-color:var(--color-amber-600)}.dark\:bg-red-600\/90:where(.dark,.dark *){background-color:#e40014e6}@supports (color:color-mix(in lab, red, red)){.dark\:bg-red-600\/90:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-red-600) 90%, transparent)}}.dark\:bg-slate-700\/50:where(.dark,.dark *){background-color:#31415880}@supports (color:color-mix(in lab, red, red)){.dark\:bg-slate-700\/50:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-slate-700) 50%, transparent)}}.dark\:bg-slate-700\/60:where(.dark,.dark *){background-color:#31415899}@supports (color:color-mix(in lab, red, red)){.dark\:bg-slate-700\/60:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-slate-700) 60%, transparent)}}.dark\:bg-slate-800\/60:where(.dark,.dark *){background-color:#1d293d99}@supports (color:color-mix(in lab, red, red)){.dark\:bg-slate-800\/60:where(.dark,.dark *){background-color:color-mix(in oklab, var(--color-slate-800) 60%, transparent)}}.dark\:text-sky-400:where(.dark,.dark *){color:var(--color-sky-400)}.dark\:text-slate-100:where(.dark,.dark *){color:var(--color-slate-100)}.dark\:text-slate-200:where(.dark,.dark *){color:var(--color-slate-200)}.dark\:text-slate-400:where(.dark,.dark *){color:var(--color-slate-400)}@media (hover:hover){.dark\:hover\:border-slate-600\/80:where(.dark,.dark *):hover{border-color:#45556ccc}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:border-slate-600\/80:where(.dark,.dark *):hover{border-color:color-mix(in oklab, var(--color-slate-600) 80%, transparent)}}.dark\:hover\:bg-amber-500:where(.dark,.dark *):hover{background-color:var(--color-amber-500)}.dark\:hover\:bg-red-500:where(.dark,.dark *):hover{background-color:var(--color-red-500)}.dark\:hover\:bg-slate-600:where(.dark,.dark *):hover{background-color:var(--color-slate-600)}.dark\:hover\:bg-slate-600\/80:where(.dark,.dark *):hover{background-color:#45556ccc}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-slate-600\/80:where(.dark,.dark *):hover{background-color:color-mix(in oklab, var(--color-slate-600) 80%, transparent)}}.dark\:hover\:bg-slate-800\/90:where(.dark,.dark *):hover{background-color:#1d293de6}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-slate-800\/90:where(.dark,.dark *):hover{background-color:color-mix(in oklab, var(--color-slate-800) 90%, transparent)}}}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-content{syntax:"*";inherits:false;initial-value:""}
|
package/dist/types.d.ts
CHANGED
|
@@ -1 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module types
|
|
3
|
+
* @description Common type definitions for @aiquants/menu-bar.
|
|
4
|
+
* @description @aiquants/menu-bar の共通型定義。
|
|
5
|
+
*/
|
|
1
6
|
export type Theme = "light" | "dark";
|
|
7
|
+
/**
|
|
8
|
+
* Menu pin change event payload detail interface.
|
|
9
|
+
* メニューピン留め状態変更イベントの詳細ペイロード。
|
|
10
|
+
*/
|
|
11
|
+
export interface MenuPinChangeDetail {
|
|
12
|
+
/** Whether the menu is currently pinned open. メニューが現在ピン留めされているかどうか。 */
|
|
13
|
+
pinned: boolean;
|
|
14
|
+
/** Pinned width in pixels (e.g. 240 or 0). ピン留め時の幅 (ピクセル単位)。 */
|
|
15
|
+
width: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Custom Event type for menu pin change events.
|
|
19
|
+
* メニューピン留め状態変更カスタムイベントの型。
|
|
20
|
+
*/
|
|
21
|
+
export type MenuPinCustomEvent = CustomEvent<MenuPinChangeDetail>;
|
package/package.json
CHANGED
package/src/MenuBar.tsx
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module MenuBar
|
|
3
|
-
* @description
|
|
4
|
-
* @description
|
|
3
|
+
* @description Main menu bar component for @aiquants/menu-bar.
|
|
4
|
+
* @description @aiquants/menu-bar のメインメニューバーコンポーネント。
|
|
5
5
|
*/
|
|
6
|
-
import { useCallback, useEffect, useLayoutEffect, useState } from "react"
|
|
6
|
+
import { useCallback, useEffect, useLayoutEffect, useRef, useState } from "react"
|
|
7
7
|
|
|
8
8
|
const useSafeLayoutEffect = typeof window !== "undefined" ? useLayoutEffect : useEffect
|
|
9
9
|
|
|
@@ -11,57 +11,92 @@ import { MenuContent } from "./contents/MenuContent"
|
|
|
11
11
|
import type { IMenu, MenuNavigationPayload } from "./contents/MenuList"
|
|
12
12
|
import { OverlayShadow } from "./contents/OverlayShadow"
|
|
13
13
|
import { MenuSwitch } from "./elements/MenuSwitch"
|
|
14
|
+
import { dispatchMenuPinChange } from "./events/pinEvent"
|
|
14
15
|
import type { Theme } from "./types"
|
|
15
16
|
|
|
16
17
|
/**
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* @description MenuBar コンポーネントの Props。
|
|
20
|
-
* @property {IMenu[]} menuList - The list of menu items. メニュー項目のリスト。
|
|
21
|
-
* @property {React.ReactNode} [menuHeader] - The header content of the menu. メニューのヘッダーコンテンツ。
|
|
22
|
-
* @property {() => void} onClickSignout - Function to handle sign out. サインアウトを処理する関数。
|
|
23
|
-
* @property {boolean} [isMenuhide] - Whether to hide the menu. メニューを非表示にするかどうか。
|
|
24
|
-
* @property {Theme} theme - The current theme.
|
|
25
|
-
* @property {() => void} toggleTheme - Function to toggle the theme.
|
|
26
|
-
* @property {(payload: MenuNavigationPayload) => void} [onMenuNavigate] - Function to receive menu navigation events. メニュー遷移イベントを受け取る関数。
|
|
27
|
-
* @property {boolean | "auto"} [closeOnEscape] - Controls whether the Escape key closes the menu.
|
|
28
|
-
* - "auto" (default): closes when NOT pinned, stays open when pinned. ピン留めなしでは閉じ、ピン留め中は閉じない。
|
|
29
|
-
* - true: always closes on Escape (resets pin if pinned). 常に閉じる。
|
|
30
|
-
* - false: never closes on Escape. 常に閉じない。
|
|
18
|
+
* Props interface for the MenuBar component.
|
|
19
|
+
* MenuBar コンポーネントのプロップスインターフェース。
|
|
31
20
|
*/
|
|
32
|
-
interface IMenuBarProps {
|
|
21
|
+
export interface IMenuBarProps {
|
|
22
|
+
/** List of menu items. メニュー項目のリスト。 */
|
|
33
23
|
menuList: IMenu[]
|
|
24
|
+
/** Optional header content rendered at top of menu drawer. メニューヘッダー要素。 */
|
|
34
25
|
menuHeader?: React.ReactNode
|
|
26
|
+
/** Callback handler for sign out button click. サインアウト処理ハンドラー。 */
|
|
35
27
|
onClickSignout(): void
|
|
28
|
+
/** Whether to hide the menu bar (legacy camelCase). メニュー非表示フラグ(旧表記)。 */
|
|
36
29
|
isMenuhide?: boolean
|
|
30
|
+
/** Whether to hide the menu bar. メニュー非表示フラグ。 */
|
|
31
|
+
isMenuHide?: boolean
|
|
32
|
+
/** Current active color theme. 現在のテーマ。 */
|
|
37
33
|
theme: Theme
|
|
34
|
+
/** Toggle handler for switching color theme. テーマ切り替えハンドラー。 */
|
|
38
35
|
toggleTheme: () => void
|
|
36
|
+
/** Navigation callback when a menu item is selected. メニュー遷移ハンドラー。 */
|
|
39
37
|
onMenuNavigate?(payload: MenuNavigationPayload): void
|
|
40
|
-
|
|
38
|
+
/** Controlled pinning state (optional). ピン留め状態制御プロップ。 */
|
|
39
|
+
isPinned?: boolean
|
|
40
|
+
/** Custom width in pixels when menu is pinned (default: 240). ピン留め時の幅(px)。 */
|
|
41
|
+
pinnedWidth?: number
|
|
42
|
+
/** Callback invoked when menu pin state changes. ピン留め状態変更時のコールバック。 */
|
|
43
|
+
onPinChange?(pinned: boolean, widthPx: number): void
|
|
44
|
+
/** Controlled list of pinned submenu IDs. ピン留めサブメニューIDリスト(制御)。 */
|
|
41
45
|
pinnedSubmenuIds?: number[]
|
|
46
|
+
/** Initial list of pinned submenu IDs for uncontrolled mode. ピン留めサブメニューID初期リスト。 */
|
|
42
47
|
initialPinnedSubmenuIds?: number[]
|
|
48
|
+
/** Callback invoked when submenu pin state changes. サブメニューピン留め変更時コールバック。 */
|
|
43
49
|
onSubmenuPinChange?(pinnedIds: number[]): void
|
|
50
|
+
/** Controls whether the Escape key closes the menu drawer. Escape キーによるメニュー閉鎖制御。 */
|
|
44
51
|
closeOnEscape?: boolean | "auto"
|
|
45
52
|
}
|
|
46
53
|
|
|
47
54
|
/**
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
* @param
|
|
52
|
-
* @returns
|
|
55
|
+
* Renders the primary collapsible and pinnable menu bar with drawer navigation.
|
|
56
|
+
* 折りたたみ・ピン留め対応のプライマリメニューバーコンポーネント。
|
|
57
|
+
*
|
|
58
|
+
* @param props - MenuBarProps configuration.
|
|
59
|
+
* @returns Rendered JSX element or null.
|
|
53
60
|
*/
|
|
54
61
|
export const MenuBar = (props: IMenuBarProps): React.JSX.Element | null => {
|
|
55
|
-
const {
|
|
56
|
-
|
|
62
|
+
const {
|
|
63
|
+
menuList,
|
|
64
|
+
menuHeader,
|
|
65
|
+
onClickSignout,
|
|
66
|
+
isMenuhide,
|
|
67
|
+
isMenuHide,
|
|
68
|
+
theme,
|
|
69
|
+
toggleTheme,
|
|
70
|
+
onMenuNavigate,
|
|
71
|
+
isPinned: propIsPinned,
|
|
72
|
+
pinnedWidth = 240,
|
|
73
|
+
onPinChange,
|
|
74
|
+
pinnedSubmenuIds: propPinnedSubmenuIds,
|
|
75
|
+
initialPinnedSubmenuIds,
|
|
76
|
+
onSubmenuPinChange,
|
|
77
|
+
closeOnEscape = "auto",
|
|
78
|
+
} = props
|
|
79
|
+
|
|
80
|
+
const shouldHideMenu = isMenuHide ?? isMenuhide ?? false
|
|
81
|
+
|
|
82
|
+
const [internalIsPinned, setInternalIsPinned] = useState(() => {
|
|
57
83
|
try {
|
|
58
84
|
return localStorage.getItem("aiquants-menu-pinned") === "true"
|
|
59
85
|
} catch {
|
|
60
86
|
return false
|
|
61
87
|
}
|
|
62
88
|
})
|
|
89
|
+
|
|
90
|
+
const isPinned = propIsPinned !== undefined ? propIsPinned : internalIsPinned
|
|
63
91
|
const [isMenuOpen, setIsMenuOpen] = useState(isPinned)
|
|
64
92
|
|
|
93
|
+
// isPinned が true に変化した場合は自動的にメニューを開いた状態にする
|
|
94
|
+
useEffect(() => {
|
|
95
|
+
if (isPinned) {
|
|
96
|
+
setIsMenuOpen(true)
|
|
97
|
+
}
|
|
98
|
+
}, [isPinned])
|
|
99
|
+
|
|
65
100
|
const [pinnedSubmenuIds, setPinnedSubmenuIds] = useState<number[]>(() => {
|
|
66
101
|
if (initialPinnedSubmenuIds) {
|
|
67
102
|
return initialPinnedSubmenuIds
|
|
@@ -99,17 +134,27 @@ export const MenuBar = (props: IMenuBarProps): React.JSX.Element | null => {
|
|
|
99
134
|
[propPinnedSubmenuIds, pinnedSubmenuIds, onSubmenuPinChange],
|
|
100
135
|
)
|
|
101
136
|
|
|
102
|
-
//
|
|
137
|
+
// コールバック関数参照を useRef で最新保持し、エフェクト再実行のインライン関数連鎖を遮断
|
|
138
|
+
const onPinChangeRef = useRef(onPinChange)
|
|
103
139
|
useSafeLayoutEffect(() => {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
onPinChange?.(isPinned)
|
|
107
|
-
}, [isPinned, onPinChange])
|
|
140
|
+
onPinChangeRef.current = onPinChange
|
|
141
|
+
}, [onPinChange])
|
|
108
142
|
|
|
109
|
-
//
|
|
143
|
+
// ピン状態変化時に CSS 変数をセットし、CustomEvent を自動発行
|
|
144
|
+
useSafeLayoutEffect(() => {
|
|
145
|
+
const effectiveWidth = isPinned ? pinnedWidth : 0
|
|
146
|
+
const widthCss = `${effectiveWidth}px`
|
|
147
|
+
document.documentElement.style.setProperty("--aiquants-menu-pinned-width", widthCss)
|
|
148
|
+
|
|
149
|
+
// CustomEvent 発行
|
|
150
|
+
dispatchMenuPinChange(isPinned, effectiveWidth)
|
|
151
|
+
}, [isPinned, pinnedWidth])
|
|
152
|
+
|
|
153
|
+
// アンマウント時に CSS 変数をリセットしピン解除通知を発行
|
|
110
154
|
useSafeLayoutEffect(() => {
|
|
111
155
|
return () => {
|
|
112
156
|
document.documentElement.style.setProperty("--aiquants-menu-pinned-width", "0px")
|
|
157
|
+
dispatchMenuPinChange(false, 0)
|
|
113
158
|
}
|
|
114
159
|
}, [])
|
|
115
160
|
|
|
@@ -119,27 +164,32 @@ export const MenuBar = (props: IMenuBarProps): React.JSX.Element | null => {
|
|
|
119
164
|
|
|
120
165
|
const handleMenuClose = useCallback(() => {
|
|
121
166
|
setIsMenuOpen(false)
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
167
|
+
if (propIsPinned === undefined) {
|
|
168
|
+
setInternalIsPinned(false)
|
|
169
|
+
try {
|
|
170
|
+
localStorage.removeItem("aiquants-menu-pinned")
|
|
171
|
+
} catch {}
|
|
172
|
+
}
|
|
173
|
+
onPinChangeRef.current?.(false, 0)
|
|
174
|
+
}, [propIsPinned])
|
|
127
175
|
|
|
128
176
|
const handleTogglePin = useCallback(() => {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
177
|
+
const nextPinned = !isPinned
|
|
178
|
+
const nextWidth = nextPinned ? pinnedWidth : 0
|
|
179
|
+
|
|
180
|
+
if (propIsPinned === undefined) {
|
|
181
|
+
setInternalIsPinned(nextPinned)
|
|
182
|
+
try {
|
|
183
|
+
if (nextPinned) {
|
|
133
184
|
localStorage.setItem("aiquants-menu-pinned", "true")
|
|
134
|
-
}
|
|
135
|
-
} else {
|
|
136
|
-
try {
|
|
185
|
+
} else {
|
|
137
186
|
localStorage.removeItem("aiquants-menu-pinned")
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
187
|
+
}
|
|
188
|
+
} catch {}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
onPinChangeRef.current?.(nextPinned, nextWidth)
|
|
192
|
+
}, [isPinned, propIsPinned, pinnedWidth])
|
|
143
193
|
|
|
144
194
|
const handleMenuSelected = useCallback(
|
|
145
195
|
(payload: MenuNavigationPayload) => {
|
|
@@ -162,15 +212,11 @@ export const MenuBar = (props: IMenuBarProps): React.JSX.Element | null => {
|
|
|
162
212
|
[handleMenuClose],
|
|
163
213
|
)
|
|
164
214
|
|
|
165
|
-
// Esc キーで閉じるかの実効値。
|
|
166
|
-
// "auto" (デフォルト): ピン留めなしでは閉じ、ピン留め中は閉じない。true/false で強制。
|
|
167
|
-
// 想定外の値が渡された場合は安全側 (閉じない) に倒す。
|
|
168
215
|
const escapeCloses = closeOnEscape === true || (closeOnEscape === "auto" && !isPinned)
|
|
169
216
|
|
|
170
|
-
// Escキーでメニューを閉じる処理 (escapeCloses が true のときのみリスナーを登録)
|
|
171
217
|
useEffect(() => {
|
|
172
218
|
if (isMenuOpen && escapeCloses) {
|
|
173
|
-
window.addEventListener("keydown", handleEscKey
|
|
219
|
+
window.addEventListener("keydown", handleEscKey)
|
|
174
220
|
} else {
|
|
175
221
|
window.removeEventListener("keydown", handleEscKey)
|
|
176
222
|
}
|
|
@@ -180,7 +226,7 @@ export const MenuBar = (props: IMenuBarProps): React.JSX.Element | null => {
|
|
|
180
226
|
}
|
|
181
227
|
}, [isMenuOpen, escapeCloses, handleEscKey])
|
|
182
228
|
|
|
183
|
-
return
|
|
229
|
+
return shouldHideMenu ? null : (
|
|
184
230
|
<div className={`aiquants-menu-bar ${theme}`}>
|
|
185
231
|
<MenuSwitch onMenuClose={handleMenuClose} onMenuOpen={handleMenuOpen} open={!isMenuOpen} theme={theme} />
|
|
186
232
|
<MenuContent
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { act, render, renderHook } from "@testing-library/react"
|
|
2
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"
|
|
3
|
+
import { dispatchMenuPinChange, getInitialPinState, subscribeMenuPinChange } from "../events/pinEvent"
|
|
4
|
+
import { useMenuPinState } from "../hooks/useMenuPinState"
|
|
5
|
+
import { MenuBar } from "../MenuBar"
|
|
6
|
+
|
|
7
|
+
describe("pinEvent module & useMenuPinState hook", () => {
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
localStorage.clear()
|
|
10
|
+
document.documentElement.style.removeProperty("--aiquants-menu-pinned-width")
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
afterEach(() => {
|
|
14
|
+
vi.restoreAllMocks()
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
it("getInitialPinState reads document style or localStorage safely", () => {
|
|
18
|
+
expect(getInitialPinState(240)).toEqual({ pinned: false, width: 0 })
|
|
19
|
+
|
|
20
|
+
localStorage.setItem("aiquants-menu-pinned", "true")
|
|
21
|
+
expect(getInitialPinState(240)).toEqual({ pinned: true, width: 240 })
|
|
22
|
+
|
|
23
|
+
document.documentElement.style.setProperty("--aiquants-menu-pinned-width", "280px")
|
|
24
|
+
expect(getInitialPinState(240)).toEqual({ pinned: true, width: 280 })
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
it("subscribeMenuPinChange fires immediately when immediate: true", () => {
|
|
28
|
+
localStorage.setItem("aiquants-menu-pinned", "true")
|
|
29
|
+
const listener = vi.fn()
|
|
30
|
+
|
|
31
|
+
const unsubscribe = subscribeMenuPinChange(listener, { immediate: true })
|
|
32
|
+
expect(listener).toHaveBeenCalledWith({ pinned: true, width: 240 })
|
|
33
|
+
|
|
34
|
+
dispatchMenuPinChange(false, 0)
|
|
35
|
+
expect(listener).toHaveBeenCalledWith({ pinned: false, width: 0 })
|
|
36
|
+
|
|
37
|
+
unsubscribe()
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
it("useMenuPinState hook syncs state correctly and avoids hydration mismatch", () => {
|
|
41
|
+
localStorage.setItem("aiquants-menu-pinned", "true")
|
|
42
|
+
const { result } = renderHook(() => useMenuPinState({ defaultPinnedWidth: 240 }))
|
|
43
|
+
|
|
44
|
+
expect(result.current).toEqual({ pinned: true, width: 240 })
|
|
45
|
+
|
|
46
|
+
act(() => {
|
|
47
|
+
dispatchMenuPinChange(false, 0)
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
expect(result.current).toEqual({ pinned: false, width: 0 })
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
it("MenuBar triggers onPinChange on toggle and dispatches CustomEvent", () => {
|
|
54
|
+
const onPinChange = vi.fn()
|
|
55
|
+
const eventListener = vi.fn()
|
|
56
|
+
const unsubscribe = subscribeMenuPinChange(eventListener, { immediate: false })
|
|
57
|
+
|
|
58
|
+
const { unmount } = render(<MenuBar menuList={[]} onClickSignout={() => {}} theme="light" toggleTheme={() => {}} isPinned={true} pinnedWidth={240} onPinChange={onPinChange} />)
|
|
59
|
+
|
|
60
|
+
expect(eventListener).toHaveBeenCalledWith({ pinned: true, width: 240 })
|
|
61
|
+
expect(document.documentElement.style.getPropertyValue("--aiquants-menu-pinned-width")).toBe("240px")
|
|
62
|
+
|
|
63
|
+
unmount()
|
|
64
|
+
expect(document.documentElement.style.getPropertyValue("--aiquants-menu-pinned-width")).toBe("0px")
|
|
65
|
+
|
|
66
|
+
unsubscribe()
|
|
67
|
+
})
|
|
68
|
+
})
|